From d1d3586732797d3ca2c41091328b6166b38974ba Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 31 Mar 2012 22:42:22 -0500 Subject: [PATCH 001/695] Fixed the sizing issues I was having with the still photo capture, and fixed the preview input on iOS 4.0. The still camera is now functional on every device but the iPhone 4. --- License.txt | 2 +- README.md | 43 +++++++++++++++++++ .../SimplePhotoFilter/PhotoViewController.m | 22 +++------- framework/Source/GPUImageFilter.m | 6 ++- framework/Source/GPUImageOpenGLESContext.m | 1 - framework/Source/GPUImageRotationFilter.m | 12 +++--- framework/Source/GPUImageStillCamera.m | 4 +- framework/Source/GPUImageVideoCamera.m | 7 ++- 8 files changed, 70 insertions(+), 27 deletions(-) diff --git a/License.txt b/License.txt index 881d5f263..e8062d915 100644 --- a/License.txt +++ b/License.txt @@ -1,4 +1,4 @@ -Copyright (c) 2012, Brad Larson, Ben Cochran, Hugues Lismonde, Keitaroh Kobayashi. +Copyright (c) 2012, Brad Larson, Ben Cochran, Hugues Lismonde, Keitaroh Kobayashi, Alaric Cole, Matthew Clark, Jacob Gundersen, Chris Williams. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/README.md b/README.md index 6acf89677..466d264f5 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,10 @@ For example, an application that takes in live video from the camera, converts t - **GPUImagePixellateFilter**: Applies a pixellation effect on an image or video - *fractionalWidthOfAPixel*: How large the pixels are, as a fraction of the width and height of the image (0.0 - 1.0, default 0.05) +- **GPUImagePolarPixellateFilter**: Applies a pixellation effect on an image or video, based on polar coordinates instead of Cartesian ones + - *center*: The center about which to apply the pixellation, defaulting to (0.5, 0.5) + - *pixelSize*: The fractional pixel size, split into width and height components. The default is (0.05, 0.05) + - **GPUImageSobelEdgeDetectionFilter**: Sobel edge detection, with edges highlighted in white - *intensity*: The degree to which the original image colors are replaced by the detected edges (0.0 - 1.0, with 1.0 as the default) - *imageWidthFactor*: @@ -181,6 +185,9 @@ For example, an application that takes in live video from the camera, converts t - *center*: The center of the image (in normalized coordinates from 0 - 1.0) about which to distort, with a default of (0.5, 0.5) - *scale*: The amount of distortion to apply, from -2.0 to 2.0, with a default of 1.0 +- **GPUImageStretchDistortionFilter**: Creates a stretch distortion of the image + - *center*: The center of the image (in normalized coordinates from 0 - 1.0) about which to distort, with a default of (0.5, 0.5) + - **GPUImageVignetteFilter**: Performs a vignetting effect, fading out the image at the edges - *x*: - *y*: The directional intensity of the vignetting, with a default of x = 0.5, y = 0.75 @@ -234,6 +241,41 @@ This sets up a video source coming from the iOS device's back-facing camera, usi For blending filters and others that take in more than one image, you can create multiple outputs and add a single filter as a target for both of these outputs. The order with which the outputs are added as targets will affect the order in which the input images are blended or otherwise processed. + +### Capturing and filtering a still photo ### + +To capture and filter still photos, you can use a process similar to the one for filtering video. Instead of a GPUImageVideoCamera, you use a GPUImageStillCamera: + + stillCamera = [[GPUImageStillCamera alloc] init]; + filter = [[GPUImageGammaFilter alloc] init]; + GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; + + [stillCamera addTarget:rotationFilter]; + [rotationFilter addTarget:filter]; + GPUImageView *filterView = (GPUImageView *)self.view; + [filter addTarget:filterView]; + + [stillCamera startCameraCapture]; + +This will give you a live, filtered feed of the still camera's preview video. Once you want to capture a photo, you use a callback block like the following: + + [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ + NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSError *error2 = nil; + if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) + { + return; + } + }]; + +The above code captures a full-size photo processed by the same filter chain used in the preview view and saves that photo to disk as a JPEG in the application's documents directory. + +Note that the framework currently can't handle images larger than 2048 pixels wide or high on older devices (those before the iPhone 4S, iPad 3, or Retina iPad) due to texture size limitations. This means that the iPhone 4, whose camera outputs still photos larger than this, won't be able to capture photos like this. A tiling mechanism is being implemented to work around this. All other devices should be able to capture and filter photos using this method. + ### Processing a still image ### There are a couple of ways to process a still image and create a result. The first way you can do this is by creating a still image source object and manually creating a filter chain: @@ -253,6 +295,7 @@ For single filters that you wish to apply to an image, you can simply do the fol GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; + ### Writing a custom filter ### One significant advantage of this framework over Core Image on iOS (as of iOS 5.0) is the ability to write your own custom image and video processing filters. These filters are supplied as OpenGL ES 2.0 fragment shaders, written in the C-like OpenGL Shading Language. diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 8bd664c74..a22e28a71 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -27,8 +27,8 @@ - (void)loadView [filterSettingsSlider addTarget:self action:@selector(updateSliderValue:) forControlEvents:UIControlEventValueChanged]; filterSettingsSlider.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; filterSettingsSlider.minimumValue = 0.0; - filterSettingsSlider.maximumValue = 0.3; - filterSettingsSlider.value = 0.05; + filterSettingsSlider.maximumValue = 3.0; + filterSettingsSlider.value = 1.0; [primaryView addSubview:filterSettingsSlider]; @@ -49,8 +49,7 @@ - (void)viewDidLoad // Do any additional setup after loading the view. stillCamera = [[GPUImageStillCamera alloc] init]; - filter = [[GPUImagePixellateFilter alloc] init]; -// filter = [[GPUImageSketchFilter alloc] init]; + filter = [[GPUImageGammaFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [stillCamera addTarget:rotationFilter]; @@ -74,30 +73,23 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updateSliderValue:(id)sender { - [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; - // [(GPUImageSketchFilter *)filter setIntensity:1.0]; +// [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; + [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; } - (IBAction)takePhoto:(id)sender; { - NSLog(@"Took photo"); - - [filter removeTarget:(GPUImageView *)self.view]; - [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ - NSData *dataForPNGFile = UIImagePNGRepresentation(processedImage); + NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSError *error2 = nil; - if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.png"] options:NSAtomicWrite error:&error2]) + if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) { return; } - - - [filter addTarget:(GPUImageView *)self.view]; }]; } diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index c4dc1484c..61eac28c6 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -207,7 +207,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glGenFramebuffers(1, &filterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - NSLog(@"Filter size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSLog(@"Filter size: %f, %f for filter: %@", currentFBOSize.width, currentFBOSize.height, self); glBindTexture(GL_TEXTURE_2D, outputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); @@ -418,6 +418,9 @@ - (void)recreateFilterFBO { cachedMaximumOutputSize = CGSizeZero; [self destroyFilterFBO]; + [self deleteOutputTexture]; + + [self initializeOutputTexture]; [self setFilterFBO]; } @@ -431,7 +434,6 @@ - (void)setInputSize:(CGSize)newSize; { inputTextureSize = newSize; [self recreateFilterFBO]; - NSLog(@"Recreating filter FBO"); } } diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 9d79e502e..1d1a2b3a6 100644 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -48,7 +48,6 @@ - (void)presentBufferForDisplay; + (BOOL)supportsFastTextureUpload; { return (CVOpenGLESTextureCacheCreate != NULL); -// return NO; } #pragma mark - diff --git a/framework/Source/GPUImageRotationFilter.m b/framework/Source/GPUImageRotationFilter.m index 494a6dc3e..1ba80b60f 100644 --- a/framework/Source/GPUImageRotationFilter.m +++ b/framework/Source/GPUImageRotationFilter.m @@ -35,15 +35,15 @@ - (id)initWithRotation:(GPUImageRotationMode)newRotationMode; - (void)setInputSize:(CGSize)newSize; { + CGSize processedSize = newSize; + if ( (rotationMode == kGPUImageRotateLeft) || (rotationMode == kGPUImageRotateRight) ) { - inputTextureSize.width = newSize.height; - inputTextureSize.height = newSize.width; - } - else - { - inputTextureSize = newSize; + processedSize.width = newSize.height; + processedSize.height = newSize.width; } + + [super setInputSize:processedSize]; } - (void)newFrameReady; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index f98bac82d..dc19b1486 100644 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -42,12 +42,14 @@ - (void)removeInputsAndOutputs; - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; // Will need an alternate pathway for the iOS 4.0 support here - + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; block(filteredPhoto, error); + }]; return; } diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 6b7b796ac..5c76c6e95 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -255,8 +255,13 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM CVPixelBufferLockBaseAddress(cameraFrame, 0); glBindTexture(GL_TEXTURE_2D, outputTexture); + +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); + // Using BGRA extension to pull in video frame data directly - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); + // The use of bytesPerRow / 4 accounts for a display glitch present in preview video frames when using the photo preset on the camera + size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cameraFrame); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); for (id currentTarget in targets) { From a553d17a1fc8f96c131f169fb4c9afac7cac5aec Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 2 Apr 2012 21:29:17 -0500 Subject: [PATCH 002/695] Timestamps are now passed through the filters, so movies are now filtered and recorded at the correct framerate. --- README.md | 1 - .../SimpleVideoFileFilterViewController.h | 2 +- .../SimpleVideoFileFilterViewController.m | 20 +++++++---- .../SimpleVideoFilterViewController.h | 2 +- .../SimpleVideoFilterViewController.m | 8 +++-- .../Source/GPUImageAdaptiveThresholdFilter.m | 5 ++- framework/Source/GPUImageCropFilter.m | 4 +-- framework/Source/GPUImageFilter.h | 2 +- framework/Source/GPUImageFilter.m | 17 +++++---- framework/Source/GPUImageFilterGroup.m | 4 +-- framework/Source/GPUImageMovie.h | 15 ++++---- framework/Source/GPUImageMovie.m | 35 ++++++++++++------- framework/Source/GPUImageMovieWriter.m | 34 ++++++++++++++---- framework/Source/GPUImageOpenGLESContext.h | 4 ++- framework/Source/GPUImageOutput.h | 4 +++ framework/Source/GPUImageOutput.m | 22 ++++++++++++ framework/Source/GPUImagePicture.m | 2 +- framework/Source/GPUImageRawData.m | 11 ++++-- framework/Source/GPUImageRotationFilter.m | 4 +-- framework/Source/GPUImageTextureOutput.m | 11 ++++-- framework/Source/GPUImageUnsharpMaskFilter.m | 3 ++ framework/Source/GPUImageVideoCamera.m | 8 +++-- framework/Source/GPUImageView.m | 7 +++- 23 files changed, 162 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 466d264f5..982c674f7 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,6 @@ For example, an application that takes in live video from the camera, converts t - *pixelSize*: The fractional pixel size, split into width and height components. The default is (0.05, 0.05) - **GPUImageSobelEdgeDetectionFilter**: Sobel edge detection, with edges highlighted in white - - *intensity*: The degree to which the original image colors are replaced by the detected edges (0.0 - 1.0, with 1.0 as the default) - *imageWidthFactor*: - *imageHeightFactor*: These parameters affect the visibility of the detected edges diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h index fdfb1773a..95175f880 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h @@ -4,7 +4,7 @@ @interface SimpleVideoFileFilterViewController : UIViewController { GPUImageMovie *movieFile; - GPUImagePixellateFilter *pixellateFilter; + GPUImageOutput *filter; GPUImageMovieWriter *movieWriter; } diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index 9b3fddb10..267553bbf 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -24,13 +24,14 @@ - (void)viewDidLoad NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample_iPod" withExtension:@"m4v"]; movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; - pixellateFilter = [[GPUImagePixellateFilter alloc] init]; +// filter = [[GPUImagePixellateFilter alloc] init]; + filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [movieFile addTarget:rotationFilter]; - [rotationFilter addTarget:pixellateFilter]; + [rotationFilter addTarget:filter]; GPUImageView *filterView = (GPUImageView *)self.view; - [pixellateFilter addTarget:filterView]; + [filter addTarget:filterView]; // In addition to displaying to the screen, write out a processed version of the movie to disk NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; @@ -38,18 +39,25 @@ - (void)viewDidLoad NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; - [pixellateFilter addTarget:movieWriter]; + [filter addTarget:movieWriter]; [movieWriter startRecording]; [movieFile startProcessing]; + [movieWriter setCompletionBlock:^{ + [filter removeTarget:movieWriter]; + [movieWriter finishRecording]; + }]; + + /* double delayInSeconds = 5.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ - [pixellateFilter removeTarget:movieWriter]; + [filter removeTarget:movieWriter]; [movieWriter finishRecording]; NSLog(@"Done recording"); }); + */ } - (void)viewDidUnload @@ -64,7 +72,7 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updatePixelWidth:(id)sender { - pixellateFilter.fractionalWidthOfAPixel = [(UISlider *)sender value]; +// pixellateFilter.fractionalWidthOfAPixel = [(UISlider *)sender value]; } @end diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h index f54f8cc21..0f90e5742 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h @@ -4,7 +4,7 @@ @interface SimpleVideoFilterViewController : UIViewController { GPUImageVideoCamera *videoCamera; - GPUImageFilter *filter; + GPUImageOutput *filter; GPUImageMovieWriter *movieWriter; } diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index a7afce9ab..a568c8d3f 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -24,8 +24,9 @@ - (void)viewDidLoad videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; -// filter = [[GPUImagePixellateFilter alloc] init]; - filter = [[GPUImageSketchFilter alloc] init]; + filter = [[GPUImagePixellateFilter alloc] init]; +// filter = [[GPUImageSketchFilter alloc] init]; +// filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [videoCamera addTarget:rotationFilter]; @@ -46,11 +47,12 @@ - (void)viewDidLoad [movieWriter startRecording]; [videoCamera startCameraCapture]; - double delayInSeconds = 20.0; + double delayInSeconds = 10.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [filter removeTarget:movieWriter]; [movieWriter finishRecording]; + NSLog(@"Movie completed"); }); } diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.m b/framework/Source/GPUImageAdaptiveThresholdFilter.m index a6b6f3079..df90f83e2 100644 --- a/framework/Source/GPUImageAdaptiveThresholdFilter.m +++ b/framework/Source/GPUImageAdaptiveThresholdFilter.m @@ -43,8 +43,11 @@ - (id)init; [self addFilter:adaptiveThresholdFilter]; [luminanceFilter addTarget:boxBlurFilter]; - [luminanceFilter addTarget:adaptiveThresholdFilter]; + [boxBlurFilter addTarget:adaptiveThresholdFilter]; + // To prevent double updating of this filter, disable updates from the sharp luminance image side + adaptiveThresholdFilter.shouldIgnoreUpdatesToThisTarget = YES; + [luminanceFilter addTarget:adaptiveThresholdFilter]; self.initialFilters = [NSArray arrayWithObject:luminanceFilter]; self.terminalFilter = adaptiveThresholdFilter; diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index d184443be..134590fe7 100644 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -53,7 +53,7 @@ - (id)init; // inputTextureSize = croppedSize; //} // -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; { static const GLfloat cropSquareVertices[] = { -1.0f, -1.0f, @@ -71,7 +71,7 @@ - (void)newFrameReady; [self renderToTextureWithVertices:cropSquareVertices textureCoordinates:cropTextureCoordinates sourceTexture:filterSourceTexture]; - [self informTargetsAboutNewFrame]; + [self informTargetsAboutNewFrameAtTime:frameTime]; } @end diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index b532e19c0..d8093548e 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -55,7 +55,7 @@ typedef struct GPUMatrix4x4 GPUMatrix4x4; // Rendering - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; -- (void)informTargetsAboutNewFrame; +- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; // Input parameters - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 61eac28c6..2e811f9f4 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -207,7 +207,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glGenFramebuffers(1, &filterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - NSLog(@"Filter size: %f, %f for filter: %@", currentFBOSize.width, currentFBOSize.height, self); +// NSLog(@"Filter size: %f, %f for filter: %@", currentFBOSize.width, currentFBOSize.height, self); glBindTexture(GL_TEXTURE_2D, outputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); @@ -281,12 +281,15 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -- (void)informTargetsAboutNewFrame; -{ +- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; +{ for (id currentTarget in targets) { - [currentTarget setInputSize:inputTextureSize]; - [currentTarget newFrameReady]; + if (currentTarget != targetToIgnoreForUpdates) + { + [currentTarget setInputSize:inputTextureSize]; + [currentTarget newFrameReadyAtTime:frameTime]; + } } } @@ -370,7 +373,7 @@ - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSStrin #pragma mark - #pragma mark GPUImageInput -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; { static const GLfloat squareVertices[] = { -1.0f, -1.0f, @@ -387,7 +390,7 @@ - (void)newFrameReady; }; [self renderToTextureWithVertices:squareVertices textureCoordinates:squareTextureCoordinates sourceTexture:filterSourceTexture]; - [self informTargetsAboutNewFrame]; + [self informTargetsAboutNewFrameAtTime:frameTime]; } - (NSInteger)nextAvailableTextureIndex; diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 35729d5a4..5e9f1da5b 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -76,11 +76,11 @@ - (void)removeAllTargets; #pragma mark - #pragma mark GPUImageInput protocol -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; { for (GPUImageOutput *currentFilter in _initialFilters) { - [currentFilter newFrameReady]; + [currentFilter newFrameReadyAtTime:frameTime]; } } diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index e65f2a78d..4a3f3bb90 100644 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -1,17 +1,18 @@ #import #import -#import #import "GPUImageOpenGLESContext.h" #import "GPUImageOutput.h" -@interface GPUImageMovie : GPUImageOutput { - CVPixelBufferRef _currentBuffer; -} +@interface GPUImageMovie : GPUImageOutput @property (readwrite, retain) NSURL *url; --(id)initWithURL:(NSURL *)url; --(void)startProcessing; --(void)endProcessing; +// Initialization and teardown +- (id)initWithURL:(NSURL *)url; + +// Movie processing +- (void)startProcessing; +- (void)endProcessing; +- (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; @end diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 2840aca28..6628931df 100644 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -4,7 +4,10 @@ @implementation GPUImageMovie @synthesize url = _url; -- (id)initWithURL:(NSURL *)url +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithURL:(NSURL *)url; { if (!(self = [super init])) { @@ -16,7 +19,10 @@ - (id)initWithURL:(NSURL *)url return self; } -- (void)startProcessing +#pragma mark - +#pragma mark Movie processing + +- (void)startProcessing; { // AVURLAsset to read input movie (i.e. mov recorded to local storage) NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; @@ -51,9 +57,9 @@ - (void)startProcessing CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; if (sampleBufferRef) { - CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBufferRef); - _currentBuffer = pixelBuffer; - [self performSelectorOnMainThread:@selector(processFrame) withObject:nil waitUntilDone:YES]; + runOnMainQueueWithoutDeadlocking(^{ + [self processMovieFrame:sampleBufferRef]; + }); CMSampleBufferInvalidate(sampleBufferRef); CFRelease(sampleBufferRef); @@ -65,27 +71,30 @@ - (void)startProcessing }]; } -- (void)processFrame +- (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; { + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(movieSampleBuffer); + CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(movieSampleBuffer); + // Upload to texture - CVPixelBufferLockBaseAddress(_currentBuffer, 0); - int bufferHeight = CVPixelBufferGetHeight(_currentBuffer); - int bufferWidth = CVPixelBufferGetWidth(_currentBuffer); + CVPixelBufferLockBaseAddress(movieFrame, 0); + int bufferHeight = CVPixelBufferGetHeight(movieFrame); + int bufferWidth = CVPixelBufferGetWidth(movieFrame); glBindTexture(GL_TEXTURE_2D, outputTexture); // Using BGRA extension to pull in video frame data directly - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(_currentBuffer)); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(movieFrame)); CGSize currentSize = CGSizeMake(bufferWidth, bufferHeight); for (id currentTarget in targets) { [currentTarget setInputSize:currentSize]; - [currentTarget newFrameReady]; + [currentTarget newFrameReadyAtTime:currentSampleTime]; } - CVPixelBufferUnlockBaseAddress(_currentBuffer, 0); + CVPixelBufferUnlockBaseAddress(movieFrame, 0); } -- (void)endProcessing +- (void)endProcessing; { for (id currentTarget in targets) { diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index b13de49b0..5effe6ec9 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -29,7 +29,7 @@ @interface GPUImageMovieWriter () GLubyte *frameData; - NSDate *startTime; + CMTime startTime; } // Movie recording @@ -61,6 +61,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; videoSize = newSize; movieURL = newMovieURL; + startTime = kCMTimeInvalid; [GPUImageOpenGLESContext useImageProcessingContext]; @@ -183,7 +184,7 @@ - (void)initializeMovie; - (void)startRecording; { - startTime = [NSDate date]; + startTime = kCMTimeInvalid; [assetWriter startWriting]; [assetWriter startSessionAtSourceTime:kCMTimeZero]; } @@ -313,13 +314,19 @@ - (void)renderAtInternalSize; #pragma mark - #pragma mark GPUImageInput protocol -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; { if (!assetWriterVideoInput.readyForMoreMediaData) { // NSLog(@"Had to drop a frame"); return; } + + if (CMTIME_IS_INVALID(frameTime)) + { + // Drop frames forced by images and other things with no time constants + return; + } // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames [GPUImageOpenGLESContext useImageProcessingContext]; @@ -349,15 +356,23 @@ - (void)newFrameReady; } // May need to add a check here, because if two consecutive times with the same value are added to the movie, it aborts recording - CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startTime],120); - if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:currentTime]) +// CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startTime],120); + + if (CMTIME_IS_INVALID(startTime)) { - NSLog(@"Problem appending pixel buffer at time: %lld", currentTime.value); + startTime = frameTime; + } + + if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:CMTimeSubtract(frameTime, startTime)]) + { + NSLog(@"Problem appending pixel buffer at time: %lld", frameTime.value); } else { -// NSLog(@"Recorded pixel buffer at time: %lld", currentTime.value); +// CMTime testTime = CMTimeSubtract(frameTime, startTime); +// +// NSLog(@"Recorded pixel buffer at time: %lld, %lld", frameTime.value, testTime.value); } CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); @@ -398,4 +413,9 @@ - (void)endProcessing } } +- (BOOL)shouldIgnoreUpdatesToThisTarget; +{ + return NO; +} + @end diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 658555d6d..06402d48a 100644 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -3,6 +3,7 @@ #import #import #import +#import @interface GPUImageOpenGLESContext : NSObject { @@ -24,10 +25,11 @@ @end @protocol GPUImageInput -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; - (void)setInputSize:(CGSize)newSize; - (CGSize)maximumOutputSize; - (void)endProcessing; +- (BOOL)shouldIgnoreUpdatesToThisTarget; @end \ No newline at end of file diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index e19810c7a..9efed59dd 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -3,15 +3,19 @@ #import "GPUImageOpenGLESContext.h" #import "GLProgram.h" +void runOnMainQueueWithoutDeadlocking(void (^block)(void)); + @interface GPUImageOutput : NSObject { NSMutableArray *targets, *targetTextureIndices; GLuint outputTexture; CGSize inputTextureSize, cachedMaximumOutputSize; + id targetToIgnoreForUpdates; } @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; +@property(readwrite, nonatomic) BOOL shouldIgnoreUpdatesToThisTarget; // Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index ac2b7785f..b735ac2ec 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -1,8 +1,21 @@ #import "GPUImageOutput.h" +void runOnMainQueueWithoutDeadlocking(void (^block)(void)) +{ + if ([NSThread isMainThread]) + { + block(); + } + else + { + dispatch_sync(dispatch_get_main_queue(), block); + } +} + @implementation GPUImageOutput @synthesize shouldSmoothlyScaleOutput = _shouldSmoothlyScaleOutput; +@synthesize shouldIgnoreUpdatesToThisTarget = _shouldIgnoreUpdatesToThisTarget; #pragma mark - #pragma mark Initialization and teardown @@ -40,6 +53,10 @@ - (void)addTarget:(id)newTarget; { NSInteger nextAvailableTextureIndex = [newTarget nextAvailableTextureIndex]; [self addTarget:newTarget atTextureLocation:nextAvailableTextureIndex]; + if ([newTarget shouldIgnoreUpdatesToThisTarget]) + { + targetToIgnoreForUpdates = newTarget; + } } - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; @@ -62,6 +79,11 @@ - (void)removeTarget:(id)targetToRemove; return; } + if (targetToIgnoreForUpdates == targetToRemove) + { + targetToIgnoreForUpdates = nil; + } + cachedMaximumOutputSize = CGSizeZero; [targetToRemove setInputSize:CGSizeZero]; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index a095637e2..5932c0e53 100644 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -77,7 +77,7 @@ - (void)processImage; for (id currentTarget in targets) { [currentTarget setInputSize:pixelSizeOfImage]; - [currentTarget newFrameReady]; + [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; } } diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawData.m index fa57aafb9..a4b1a4628 100644 --- a/framework/Source/GPUImageRawData.m +++ b/framework/Source/GPUImageRawData.m @@ -196,7 +196,7 @@ - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; #pragma mark - #pragma mark GPUImageInput protocol -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; { hasReadFromTheCurrentFrame = NO; @@ -222,7 +222,14 @@ - (CGSize)maximumOutputSize; return imageSize; } --(void) endProcessing{} +- (void)endProcessing; +{ +} + +- (BOOL)shouldIgnoreUpdatesToThisTarget; +{ + return NO; +} #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageRotationFilter.m b/framework/Source/GPUImageRotationFilter.m index 1ba80b60f..36863d371 100644 --- a/framework/Source/GPUImageRotationFilter.m +++ b/framework/Source/GPUImageRotationFilter.m @@ -46,7 +46,7 @@ - (void)setInputSize:(CGSize)newSize; [super setInputSize:processedSize]; } -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; { static const GLfloat rotationSquareVertices[] = { -1.0f, -1.0f, @@ -99,7 +99,7 @@ - (void)newFrameReady; case kGPUImageFlipVertical: [self renderToTextureWithVertices:rotationSquareVertices textureCoordinates:horizontalFlipTextureCoordinates sourceTexture:filterSourceTexture]; break; case kGPUImageRotateRightFlipVertical: [self renderToTextureWithVertices:rotationSquareVertices textureCoordinates:rotateRightVerticalFlipTextureCoordinates sourceTexture:filterSourceTexture]; break; } - [self informTargetsAboutNewFrame]; + [self informTargetsAboutNewFrameAtTime:frameTime]; } @end diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index 82fd0e882..665a7b853 100644 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -8,7 +8,7 @@ @implementation GPUImageTextureOutput #pragma mark - #pragma mark GPUImageInput protocol -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; { [_delegate newFrameReadyFromTextureOutput:self]; } @@ -32,6 +32,13 @@ - (CGSize)maximumOutputSize; return CGSizeZero; } --(void) endProcessing{} +- (void)endProcessing +{ +} + +- (BOOL)shouldIgnoreUpdatesToThisTarget; +{ + return NO; +} @end diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index a6a5ac70b..304e5305a 100644 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -45,6 +45,9 @@ - (id)init; // Texture location 0 needs to be the sharp image for both the blur and the second stage processing [blurFilter addTarget:unsharpMaskFilter atTextureLocation:1]; + // To prevent double updating of this filter, disable updates from the sharp image side + unsharpMaskFilter.shouldIgnoreUpdatesToThisTarget = YES; + self.initialFilters = [NSArray arrayWithObjects:blurFilter, unsharpMaskFilter, nil]; self.terminalFilter = unsharpMaskFilter; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 5c76c6e95..20a4f04a2 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -7,6 +7,7 @@ @interface GPUImageVideoCamera () { AVCaptureDeviceInput *videoInput; AVCaptureVideoDataOutput *videoOutput; + NSDate *startingCaptureTime; } @end @@ -130,6 +131,7 @@ - (void)startCameraCapture; { if (![_captureSession isRunning]) { + startingCaptureTime = [NSDate date]; [_captureSession startRunning]; }; } @@ -202,6 +204,8 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM int bufferWidth = CVPixelBufferGetWidth(cameraFrame); int bufferHeight = CVPixelBufferGetHeight(cameraFrame); + CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 120); + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { CVPixelBufferLockBaseAddress(cameraFrame, 0); @@ -230,7 +234,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM NSInteger indexOfObject = [targets indexOfObject:currentTarget]; [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - [currentTarget newFrameReady]; + [currentTarget newFrameReadyAtTime:currentTime]; } CVPixelBufferUnlockBaseAddress(cameraFrame, 0); @@ -266,7 +270,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM for (id currentTarget in targets) { [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; - [currentTarget newFrameReady]; + [currentTarget newFrameReadyAtTime:currentTime]; } CVPixelBufferUnlockBaseAddress(cameraFrame, 0); diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index a94c01398..feb3b094c 100644 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -177,7 +177,7 @@ - (void)presentFramebuffer; #pragma mark - #pragma mark GPUInput protocol -- (void)newFrameReady; +- (void)newFrameReadyAtTime:(CMTime)frameTime; { [GPUImageOpenGLESContext useImageProcessingContext]; [self setDisplayFramebuffer]; @@ -243,4 +243,9 @@ - (CGSize)maximumOutputSize; -(void) endProcessing{} +- (BOOL)shouldIgnoreUpdatesToThisTarget; +{ + return NO; +} + @end From b1ca119411629cc53686432d4781dc44d116f37f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 2 Apr 2012 22:10:15 -0500 Subject: [PATCH 003/695] Added iOS 5.0 texture cache support to GPUImageMovie, improving performance of movie playback. --- .../SimpleVideoFileFilterViewController.m | 1 + framework/Source/GPUImageMovie.h | 6 +- framework/Source/GPUImageMovie.m | 86 ++++++++++++++++--- 3 files changed, 81 insertions(+), 12 deletions(-) diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index 267553bbf..09a9a30c6 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -24,6 +24,7 @@ - (void)viewDidLoad NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample_iPod" withExtension:@"m4v"]; movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; + movieFile.runBenchmark = YES; // filter = [[GPUImagePixellateFilter alloc] init]; filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index 4a3f3bb90..0e7d5572a 100644 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -4,8 +4,12 @@ #import "GPUImageOutput.h" @interface GPUImageMovie : GPUImageOutput +{ + CVOpenGLESTextureCacheRef coreVideoTextureCache; +} -@property (readwrite, retain) NSURL *url; +@property(readwrite, retain) NSURL *url; +@property(readwrite, nonatomic) BOOL runBenchmark; // Initialization and teardown - (id)initWithURL:(NSURL *)url; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 6628931df..5e21b7f04 100644 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -3,6 +3,7 @@ @implementation GPUImageMovie @synthesize url = _url; +@synthesize runBenchmark = _runBenchmark; #pragma mark - #pragma mark Initialization and teardown @@ -14,6 +15,19 @@ - (id)initWithURL:(NSURL *)url; return nil; } + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + [GPUImageOpenGLESContext useImageProcessingContext]; + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + } + + // Need to remove the initially created texture + [self deleteOutputTexture]; + } + self.url = url; return self; @@ -76,22 +90,72 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(movieSampleBuffer); CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(movieSampleBuffer); - // Upload to texture - CVPixelBufferLockBaseAddress(movieFrame, 0); int bufferHeight = CVPixelBufferGetHeight(movieFrame); int bufferWidth = CVPixelBufferGetWidth(movieFrame); + + CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + CVPixelBufferLockBaseAddress(movieFrame, 0); + + [GPUImageOpenGLESContext useImageProcessingContext]; + CVOpenGLESTextureRef texture = NULL; + CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); + + if (!texture || err) { + NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + return; + } + + outputTexture = CVOpenGLESTextureGetName(texture); + // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + for (id currentTarget in targets) + { + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; + + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + + [currentTarget newFrameReadyAtTime:currentSampleTime]; + } + + CVPixelBufferUnlockBaseAddress(movieFrame, 0); + + // Flush the CVOpenGLESTexture cache and release the texture + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(texture); + outputTexture = 0; + } + else + { + // Upload to texture + CVPixelBufferLockBaseAddress(movieFrame, 0); + + glBindTexture(GL_TEXTURE_2D, outputTexture); + // Using BGRA extension to pull in video frame data directly + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(movieFrame)); + + CGSize currentSize = CGSizeMake(bufferWidth, bufferHeight); + for (id currentTarget in targets) + { + [currentTarget setInputSize:currentSize]; + [currentTarget newFrameReadyAtTime:currentSampleTime]; + } + CVPixelBufferUnlockBaseAddress(movieFrame, 0); + } - glBindTexture(GL_TEXTURE_2D, outputTexture); - // Using BGRA extension to pull in video frame data directly - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(movieFrame)); - - CGSize currentSize = CGSizeMake(bufferWidth, bufferHeight); - for (id currentTarget in targets) + if (_runBenchmark) { - [currentTarget setInputSize:currentSize]; - [currentTarget newFrameReadyAtTime:currentSampleTime]; + CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); + NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); } - CVPixelBufferUnlockBaseAddress(movieFrame, 0); } - (void)endProcessing; From 44ec275345702a4990327df66f722c92007007dc Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 3 Apr 2012 11:02:46 -0500 Subject: [PATCH 004/695] Added ability to override filter processing sizes for thumbnail use. Started adding hooks for audio support. --- .../MultiViewViewController.m | 9 +++++ framework/Source/GPUImageFilter.m | 19 ++++++++++ framework/Source/GPUImageFilterGroup.m | 9 +++++ framework/Source/GPUImageMovieWriter.h | 2 + framework/Source/GPUImageMovieWriter.m | 38 ++++++++++++++++--- framework/Source/GPUImageOutput.h | 3 ++ framework/Source/GPUImageOutput.m | 5 +++ framework/Source/GPUImageVideoCamera.h | 3 ++ framework/Source/GPUImageVideoCamera.m | 14 ++++++- framework/Source/GPUImageView.h | 4 ++ framework/Source/GPUImageView.m | 29 ++++++++++++-- 11 files changed, 126 insertions(+), 9 deletions(-) diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m index 906d1169a..787b26ca4 100644 --- a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m +++ b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m @@ -41,6 +41,15 @@ - (void)loadView GPUImageFilter *filter1 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader1"]; GPUImageFilter *filter2 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader2"]; GPUImageSepiaFilter *filter3 = [[GPUImageSepiaFilter alloc] init]; + + // For thumbnails smaller than the input video size, we currently need to make them render at a smaller size. + // This is to avoid wasting processing time on larger frames than will be displayed. + // You'll need to use -forceProcessingAtSize: with a zero size to re-enable full frame processing of video. + + [rotationFilter forceProcessingAtSize:view1.sizeInPixels]; + [filter1 forceProcessingAtSize:view2.sizeInPixels]; + [filter2 forceProcessingAtSize:view3.sizeInPixels]; + [filter3 forceProcessingAtSize:view4.sizeInPixels]; [videoCamera addTarget:rotationFilter]; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 2e811f9f4..46e679d32 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -429,6 +429,11 @@ - (void)recreateFilterFBO - (void)setInputSize:(CGSize)newSize; { + if (overrideInputSize) + { + return; + } + if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (CGSizeEqualToSize(newSize, CGSizeZero)) ) { inputTextureSize = newSize; @@ -440,6 +445,20 @@ - (void)setInputSize:(CGSize)newSize; } } +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + if (CGSizeEqualToSize(frameSize, CGSizeZero)) + { + overrideInputSize = NO; + } + else + { + overrideInputSize = YES; + inputTextureSize = frameSize; + } +} + + - (CGSize)maximumOutputSize; { // I'm temporarily disabling adjustments for smaller output sizes until I figure out how to make this work better diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 5e9f1da5b..4a8ae391c 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -110,6 +110,15 @@ - (void)setInputSize:(CGSize)newSize; } } +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + for (GPUImageOutput *currentFilter in filters) + { + [currentFilter forceProcessingAtSize:frameSize]; + } +} + + - (CGSize)maximumOutputSize; { // I'm temporarily disabling adjustments for smaller output sizes until I figure out how to make this work better diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 9deabed73..fb17b9609 100644 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -28,6 +28,7 @@ CGSize videoSize; } +@property (readwrite, nonatomic) BOOL hasAudioTrack; @property (nonatomic, copy) void(^CompletionBlock)(void); @property (nonatomic, copy) void(^FailureBlock)(NSError*); @property (nonatomic, assign) id delegate; @@ -38,5 +39,6 @@ // Movie recording - (void)startRecording; - (void)finishRecording; +- (void)newAudioSampleReadyAtTime:(CMTime)frameTime; @end diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 5effe6ec9..33f1d49ce 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -45,9 +45,11 @@ - (void)renderAtInternalSize; @end @implementation GPUImageMovieWriter + +@synthesize hasAudioTrack = _hasAudioTrack; @synthesize CompletionBlock; @synthesize FailureBlock; -@synthesize delegate; +@synthesize delegate = _delegate; #pragma mark - #pragma mark Initialization and teardown @@ -195,6 +197,11 @@ - (void)finishRecording; [assetWriter finishWriting]; } +- (void)newAudioSampleReadyAtTime:(CMTime)frameTime; +{ + +} + #pragma mark - #pragma mark Frame rendering @@ -403,12 +410,15 @@ - (CGSize)maximumOutputSize; - (void)endProcessing { - if (CompletionBlock) { + if (CompletionBlock) + { CompletionBlock(); } - else { - if(self.delegate&&[delegate respondsToSelector:@selector(Completed)]){ - [self.delegate Completed]; + else + { + if (_delegate && [_delegate respondsToSelector:@selector(Completed)]) + { + [_delegate Completed]; } } } @@ -418,4 +428,22 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } +#pragma mark - +#pragma mark Accessors + +- (void)setHasAudioTrack:(BOOL)newValue +{ + _hasAudioTrack = newValue; + + if (_hasAudioTrack) + { + // Add audio track + } + else + { + // Remove audio track if it exists + } +} + + @end diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 9efed59dd..241f112bd 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -12,6 +12,8 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); GLuint outputTexture; CGSize inputTextureSize, cachedMaximumOutputSize; id targetToIgnoreForUpdates; + + BOOL overrideInputSize; } @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; @@ -27,6 +29,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); // Manage the output texture - (void)initializeOutputTexture; - (void)deleteOutputTexture; +- (void)forceProcessingAtSize:(CGSize)frameSize; // Still image processing - (UIImage *)imageFromCurrentlyProcessedOutput; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index b735ac2ec..ae5b8be5c 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -134,6 +134,11 @@ - (void)deleteOutputTexture; } } +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + +} + #pragma mark - #pragma mark Still image processing diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 3031a4f4b..23430973c 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -8,6 +8,8 @@ // "In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight." // Currently, rotation is needed to handle each camera +@class GPUImageMovieWriter; + @interface GPUImageVideoCamera : GPUImageOutput { CVOpenGLESTextureCacheRef coreVideoTextureCache; @@ -21,6 +23,7 @@ @property(readonly, retain) AVCaptureSession *captureSession; @property(readwrite, nonatomic) BOOL runBenchmark; +@property(readwrite, nonatomic, retain) GPUImageMovieWriter *audioEncodingTarget; // Use this property to manage camera settings.Focus point, exposure point, etc. @property(readonly) AVCaptureDevice *inputCamera; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 20a4f04a2..80f09eed3 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -1,4 +1,5 @@ #import "GPUImageVideoCamera.h" +#import "GPUImageMovieWriter.h" #pragma mark - #pragma mark Private methods and instance variables @@ -17,7 +18,7 @@ @implementation GPUImageVideoCamera @synthesize captureSession = _captureSession; @synthesize inputCamera = _inputCamera; @synthesize runBenchmark = _runBenchmark; - +@synthesize audioEncodingTarget = _audioEncodingTarget; #pragma mark - #pragma mark Initialization and teardown @@ -151,9 +152,13 @@ - (void)rotateCamera AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; if(currentCameraPosition == AVCaptureDevicePositionBack) + { currentCameraPosition = AVCaptureDevicePositionFront; + } else + { currentCameraPosition = AVCaptureDevicePositionBack; + } AVCaptureDevice *backFacingCamera = nil; NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; @@ -289,4 +294,11 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM #pragma mark - #pragma mark Accessors +- (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; +{ + _audioEncodingTarget = newValue; + + _audioEncodingTarget.hasAudioTrack = YES; +} + @end diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index 31a9e08c6..fe1d181c5 100644 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -2,5 +2,9 @@ #import "GPUImageOpenGLESContext.h" @interface GPUImageView : UIView +{ +} + +@property(readonly, nonatomic) CGSize sizeInPixels; @end diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index feb3b094c..f3c80b255 100644 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -10,7 +10,6 @@ @interface GPUImageView () { GLuint inputTextureForDisplay; - GLint backingWidth, backingHeight; GLuint displayRenderbuffer, displayFramebuffer; GLProgram *displayProgram; @@ -29,6 +28,8 @@ - (void)destroyDisplayFramebuffer; @implementation GPUImageView +@synthesize sizeInPixels = _sizeInPixels; + #pragma mark - #pragma mark Initialization and teardown @@ -131,8 +132,13 @@ - (void)createDisplayFramebuffer; [[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; + GLint backingWidth, backingHeight; + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); + _sizeInPixels.width = (CGFloat)backingWidth; + _sizeInPixels.height = (CGFloat)backingHeight; + // NSLog(@"Backing width: %d, height: %d", backingWidth, backingHeight); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, displayRenderbuffer); @@ -165,7 +171,7 @@ - (void)setDisplayFramebuffer; glBindFramebuffer(GL_FRAMEBUFFER, displayFramebuffer); - glViewport(0, 0, backingWidth, backingHeight); + glViewport(0, 0, (GLint)_sizeInPixels.width, (GLint)_sizeInPixels.height); } - (void)presentFramebuffer; @@ -241,11 +247,28 @@ - (CGSize)maximumOutputSize; } } --(void) endProcessing{} +- (void)endProcessing +{ +} - (BOOL)shouldIgnoreUpdatesToThisTarget; { return NO; } +#pragma mark - +#pragma mark Accessors + +- (CGSize)sizeInPixels; +{ + if (CGSizeEqualToSize(_sizeInPixels, CGSizeZero)) + { + return [self maximumOutputSize]; + } + else + { + return _sizeInPixels; + } +} + @end From af0d5d9295c45e526880e5f038fd78f33e95b628 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 3 Apr 2012 15:16:25 -0500 Subject: [PATCH 005/695] Fixed the unsharp mask filter to avoid double frame updates. Added a check to prevent recording-halting frame timestamps. --- .../SimpleVideoFileFilterViewController.m | 3 ++- .../SimpleVideoFileFilterViewController.xib | 17 +++++++++++------ .../SimpleVideoFilterViewController.m | 4 ++-- framework/Source/GPUImageFilterGroup.m | 5 ++++- framework/Source/GPUImageMovieWriter.m | 14 +++++++------- framework/Source/GPUImageUnsharpMaskFilter.m | 3 ++- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index 09a9a30c6..8a78bdde8 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -26,7 +26,7 @@ - (void)viewDidLoad movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; movieFile.runBenchmark = YES; // filter = [[GPUImagePixellateFilter alloc] init]; - filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; + filter = [[GPUImageUnsharpMaskFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [movieFile addTarget:rotationFilter]; @@ -73,6 +73,7 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updatePixelWidth:(id)sender { + [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; // pixellateFilter.fractionalWidthOfAPixel = [(UISlider *)sender value]; } diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib index 43a8d520d..eb8091fdc 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib @@ -1,14 +1,14 @@ - 1280 + 1296 11D50 - 2177 + 2182 1138.32 568.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1173 + 1179 IBProxyObject @@ -41,13 +41,14 @@ {{18, 418}, {284, 23}} + _NS:623 NO IBCocoaTouchFramework 0 0 - 0.10000000149011612 - 0.30000001192092896 + 1 + 5 {{0, 20}, {320, 460}} @@ -167,8 +168,12 @@ 0 IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + YES 3 - 1173 + 1179 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index a568c8d3f..c0e6c8466 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -24,9 +24,9 @@ - (void)viewDidLoad videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; - filter = [[GPUImagePixellateFilter alloc] init]; +// filter = [[GPUImagePixellateFilter alloc] init]; // filter = [[GPUImageSketchFilter alloc] init]; -// filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; + filter = [[GPUImageUnsharpMaskFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [videoCamera addTarget:rotationFilter]; diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 4a8ae391c..c5396a2de 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -80,7 +80,10 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; { for (GPUImageOutput *currentFilter in _initialFilters) { - [currentFilter newFrameReadyAtTime:frameTime]; + if (currentFilter != targetToIgnoreForUpdates) + { + [currentFilter newFrameReadyAtTime:frameTime]; + } } } diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 33f1d49ce..dda8a2db9 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -29,7 +29,7 @@ @interface GPUImageMovieWriter () GLubyte *frameData; - CMTime startTime; + CMTime startTime, previousFrameTime; } // Movie recording @@ -64,6 +64,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; videoSize = newSize; movieURL = newMovieURL; startTime = kCMTimeInvalid; + previousFrameTime = kCMTimeNegativeInfinity; [GPUImageOpenGLESContext useImageProcessingContext]; @@ -329,9 +330,10 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; return; } - if (CMTIME_IS_INVALID(frameTime)) + // Drop frames forced by images and other things with no time constants + // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case + if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) ) { - // Drop frames forced by images and other things with no time constants return; } @@ -362,10 +364,6 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; } } - // May need to add a check here, because if two consecutive times with the same value are added to the movie, it aborts recording - -// CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startTime],120); - if (CMTIME_IS_INVALID(startTime)) { startTime = frameTime; @@ -383,6 +381,8 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; } CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); + previousFrameTime = frameTime; + if (![GPUImageOpenGLESContext supportsFastTextureUpload]) { CVPixelBufferRelease(pixel_buffer); diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index 304e5305a..d90ed8bd9 100644 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -46,7 +46,8 @@ - (id)init; [blurFilter addTarget:unsharpMaskFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - unsharpMaskFilter.shouldIgnoreUpdatesToThisTarget = YES; + targetToIgnoreForUpdates = unsharpMaskFilter; +// unsharpMaskFilter.shouldIgnoreUpdatesToThisTarget = YES; self.initialFilters = [NSArray arrayWithObjects:blurFilter, unsharpMaskFilter, nil]; self.terminalFilter = unsharpMaskFilter; From 88fa6ba934e289a4880d0a0dea119763125f35a8 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 3 Apr 2012 23:21:21 -0500 Subject: [PATCH 006/695] Started adding audio recording support, but live video has broken timestamps and prerecorded video is dropping audio samples. --- .../SimpleVideoFileFilterViewController.m | 13 ++- .../SimpleVideoFilterViewController.m | 7 +- framework/Source/GPUImageMovie.m | 56 +++++++--- framework/Source/GPUImageMovieWriter.h | 6 +- framework/Source/GPUImageMovieWriter.m | 83 +++++++++++--- framework/Source/GPUImageOutput.h | 3 + framework/Source/GPUImageOutput.m | 8 ++ framework/Source/GPUImageVideoCamera.h | 8 +- framework/Source/GPUImageVideoCamera.m | 101 +++++++++++++----- 9 files changed, 220 insertions(+), 65 deletions(-) diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index 8a78bdde8..1a7912d61 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -29,18 +29,23 @@ - (void)viewDidLoad filter = [[GPUImageUnsharpMaskFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; - [movieFile addTarget:rotationFilter]; - [rotationFilter addTarget:filter]; + [movieFile addTarget:filter]; + + // Only rotate the video for display, leave orientation the same for recording GPUImageView *filterView = (GPUImageView *)self.view; - [filter addTarget:filterView]; + [filter addTarget:rotationFilter]; + [rotationFilter addTarget:filterView]; // In addition to displaying to the screen, write out a processed version of the movie to disk NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; - movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; + movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)]; + movieWriter.shouldPassthroughAudio = YES; [filter addTarget:movieWriter]; + movieFile.audioEncodingTarget = movieWriter; + movieWriter.shouldDropFramesIfOverloaded = NO; [movieWriter startRecording]; [movieFile startProcessing]; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index c0e6c8466..2cfd3d1bd 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -24,9 +24,9 @@ - (void)viewDidLoad videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; -// filter = [[GPUImagePixellateFilter alloc] init]; + filter = [[GPUImagePixellateFilter alloc] init]; // filter = [[GPUImageSketchFilter alloc] init]; - filter = [[GPUImageUnsharpMaskFilter alloc] init]; +// filter = [[GPUImageUnsharpMaskFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [videoCamera addTarget:rotationFilter]; @@ -44,6 +44,8 @@ - (void)viewDidLoad // movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1080.0, 1920.0)]; [filter addTarget:movieWriter]; + videoCamera.audioEncodingTarget = movieWriter; + [movieWriter startRecording]; [videoCamera startCameraCapture]; @@ -51,6 +53,7 @@ - (void)viewDidLoad dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [filter removeTarget:movieWriter]; + videoCamera.audioEncodingTarget = nil; [movieWriter finishRecording]; NSLog(@"Movie completed"); }); diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 5e21b7f04..bec13c0ab 100644 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -1,4 +1,5 @@ #import "GPUImageMovie.h" +#import "GPUImageMovieWriter.h" @implementation GPUImageMovie @@ -38,36 +39,44 @@ - (id)initWithURL:(NSURL *)url; - (void)startProcessing; { - // AVURLAsset to read input movie (i.e. mov recorded to local storage) NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; - // Load the input asset tracks information [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ NSError *error = nil; - // Check status of "tracks", make sure they were loaded AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; - if (!tracksStatus == AVKeyValueStatusLoaded) { - // failed to load + if (!tracksStatus == AVKeyValueStatusLoaded) + { return; } - /* Read video samples from input asset video track */ AVAssetReader *reader = [AVAssetReader assetReaderWithAsset:inputAsset error:&error]; NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; [outputSettings setObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (NSString*)kCVPixelBufferPixelFormatTypeKey]; + // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[inputAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; - - // Assign the tracks to the reader and start to read [reader addOutput:readerVideoTrackOutput]; - if ([reader startReading] == NO) { - // Handle error - NSLog(@"Error reading"); - } + NSArray *audioTracks = [inputAsset tracksWithMediaType:AVMediaTypeAudio]; + BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (self.audioEncodingTarget != nil) ); + AVAssetReaderTrackOutput *readerAudioTrackOutput = nil; + + if (shouldRecordAudioTrack) + { + // This might need to be extended to handle movies with more than one audio track + AVAssetTrack* audioTrack = [audioTracks objectAtIndex:0]; + readerAudioTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]; + [reader addOutput:readerAudioTrackOutput]; + } + + if ([reader startReading] == NO) + { + NSLog(@"Error reading from file at URL: %@", self.url); + return; + } + while (reader.status == AVAssetReaderStatusReading) { - CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; if (sampleBufferRef) { @@ -78,7 +87,28 @@ - (void)startProcessing; CMSampleBufferInvalidate(sampleBufferRef); CFRelease(sampleBufferRef); } + + if (shouldRecordAudioTrack) + { + CMSampleBufferRef audioSampleBufferRef = [readerAudioTrackOutput copyNextSampleBuffer]; + + if (audioSampleBufferRef) + { +// runOnMainQueueWithoutDeadlocking(^{ + [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; +// }); + + CMSampleBufferInvalidate(audioSampleBufferRef); + CFRelease(audioSampleBufferRef); + } + else + { +// NSLog(@"Ran out of audio frames"); + shouldRecordAudioTrack = NO; + } + } } + if (reader.status == AVAssetWriterStatusCompleted) { [self endProcessing]; } diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index fb17b9609..26eb49269 100644 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -17,7 +17,7 @@ NSURL *movieURL; AVAssetWriter *assetWriter; -// AVAssetWriterInput *assetWriterAudioIn; + AVAssetWriterInput *assetWriterAudioInput; AVAssetWriterInput *assetWriterVideoInput; AVAssetWriterInputPixelBufferAdaptor *assetWriterPixelBufferInput; dispatch_queue_t movieWritingQueue; @@ -29,9 +29,11 @@ } @property (readwrite, nonatomic) BOOL hasAudioTrack; +@property (readwrite, nonatomic) BOOL shouldPassthroughAudio; @property (nonatomic, copy) void(^CompletionBlock)(void); @property (nonatomic, copy) void(^FailureBlock)(NSError*); @property (nonatomic, assign) id delegate; +@property (readwrite, nonatomic) BOOL shouldDropFramesIfOverloaded; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; @@ -39,6 +41,6 @@ // Movie recording - (void)startRecording; - (void)finishRecording; -- (void)newAudioSampleReadyAtTime:(CMTime)frameTime; +- (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; @end diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index dda8a2db9..be4278c58 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -47,9 +47,11 @@ - (void)renderAtInternalSize; @implementation GPUImageMovieWriter @synthesize hasAudioTrack = _hasAudioTrack; +@synthesize shouldPassthroughAudio = _shouldPassthroughAudio; @synthesize CompletionBlock; @synthesize FailureBlock; @synthesize delegate = _delegate; +@synthesize shouldDropFramesIfOverloaded = _shouldDropFramesIfOverloaded; #pragma mark - #pragma mark Initialization and teardown @@ -65,6 +67,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; movieURL = newMovieURL; startTime = kCMTimeInvalid; previousFrameTime = kCMTimeNegativeInfinity; + _shouldDropFramesIfOverloaded = YES; [GPUImageOpenGLESContext useImageProcessingContext]; @@ -129,11 +132,14 @@ - (void)initializeMovie; if (error != nil) { NSLog(@"Error: %@", error); - if (FailureBlock) { + if (FailureBlock) + { FailureBlock(error); } - else { - if(self.delegate&&[self.delegate respondsToSelector:@selector(Failed:)]){ + else + { + if(self.delegate && [self.delegate respondsToSelector:@selector(Failed:)]) + { [self.delegate Failed:error]; } } @@ -198,9 +204,31 @@ - (void)finishRecording; [assetWriter finishWriting]; } -- (void)newAudioSampleReadyAtTime:(CMTime)frameTime; +- (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; { - + if (_hasAudioTrack) + { + if (!assetWriterAudioInput.readyForMoreMediaData) + { + if (_shouldDropFramesIfOverloaded) + { + NSLog(@"Had to drop an audio frame"); + return; + } + else + { + NSLog(@"Had to drop an audio frame"); + return; +// while(!assetWriterAudioInput.readyForMoreMediaData){}; + + } + } + + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); + NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); + + [assetWriterAudioInput appendSampleBuffer:audioBuffer]; + } } #pragma mark - @@ -326,8 +354,17 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; { if (!assetWriterVideoInput.readyForMoreMediaData) { -// NSLog(@"Had to drop a frame"); - return; + if (_shouldDropFramesIfOverloaded) + { + NSLog(@"Had to drop a video frame"); + return; + } + else + { + NSLog(@"Waiting on a video frame"); + + while(!assetWriterVideoInput.readyForMoreMediaData){}; + } } // Drop frames forced by images and other things with no time constants @@ -366,18 +403,18 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; if (CMTIME_IS_INVALID(startTime)) { + [assetWriter startSessionAtSourceTime:frameTime]; startTime = frameTime; } - if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:CMTimeSubtract(frameTime, startTime)]) +// if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:CMTimeSubtract(frameTime, startTime)]) + if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) { NSLog(@"Problem appending pixel buffer at time: %lld", frameTime.value); } else { -// CMTime testTime = CMTimeSubtract(frameTime, startTime); -// -// NSLog(@"Recorded pixel buffer at time: %lld, %lld", frameTime.value, testTime.value); + NSLog(@"Recorded video sample time: %lld, %d, %lld", frameTime.value, frameTime.timescale, frameTime.epoch); } CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); @@ -437,7 +474,29 @@ - (void)setHasAudioTrack:(BOOL)newValue if (_hasAudioTrack) { - // Add audio track + NSDictionary *audioOutputSettings; + if (_shouldPassthroughAudio) + { + audioOutputSettings = nil; + } + else + { + AudioChannelLayout acl; + bzero( &acl, sizeof(acl)); + acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; + + audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys: + [ NSNumber numberWithInt: kAudioFormatMPEG4AAC ], AVFormatIDKey, + [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, + [ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey, + [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, + [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, + nil]; + } + + assetWriterAudioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings]; + [assetWriter addInput:assetWriterAudioInput]; + assetWriterAudioInput.expectsMediaDataInRealTime = YES; } else { diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 241f112bd..7f4474c8c 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -5,6 +5,8 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); +@class GPUImageMovieWriter; + @interface GPUImageOutput : NSObject { NSMutableArray *targets, *targetTextureIndices; @@ -18,6 +20,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; @property(readwrite, nonatomic) BOOL shouldIgnoreUpdatesToThisTarget; +@property(readwrite, nonatomic, retain) GPUImageMovieWriter *audioEncodingTarget; // Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index ae5b8be5c..4d8460960 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -1,4 +1,5 @@ #import "GPUImageOutput.h" +#import "GPUImageMovieWriter.h" void runOnMainQueueWithoutDeadlocking(void (^block)(void)) { @@ -16,6 +17,7 @@ @implementation GPUImageOutput @synthesize shouldSmoothlyScaleOutput = _shouldSmoothlyScaleOutput; @synthesize shouldIgnoreUpdatesToThisTarget = _shouldIgnoreUpdatesToThisTarget; +@synthesize audioEncodingTarget = _audioEncodingTarget; #pragma mark - #pragma mark Initialization and teardown @@ -155,5 +157,11 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; #pragma mark - #pragma mark Accessors +- (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; +{ + _audioEncodingTarget = newValue; + + _audioEncodingTarget.hasAudioTrack = YES; +} @end diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 23430973c..99f160956 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -8,9 +8,7 @@ // "In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight." // Currently, rotation is needed to handle each camera -@class GPUImageMovieWriter; - -@interface GPUImageVideoCamera : GPUImageOutput +@interface GPUImageVideoCamera : GPUImageOutput { CVOpenGLESTextureCacheRef coreVideoTextureCache; @@ -19,11 +17,11 @@ AVCaptureSession *_captureSession; AVCaptureDevice *_inputCamera; + AVCaptureDevice *_microphone; } @property(readonly, retain) AVCaptureSession *captureSession; @property(readwrite, nonatomic) BOOL runBenchmark; -@property(readwrite, nonatomic, retain) GPUImageMovieWriter *audioEncodingTarget; // Use this property to manage camera settings.Focus point, exposure point, etc. @property(readonly) AVCaptureDevice *inputCamera; @@ -35,6 +33,8 @@ // Manage the camera video stream - (void)startCameraCapture; - (void)stopCameraCapture; +- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; +- (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; // Rotate the camera - (void)rotateCamera; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 80f09eed3..c34ea9d0c 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -7,7 +7,9 @@ @interface GPUImageVideoCamera () { AVCaptureDeviceInput *videoInput; + AVCaptureDeviceInput *audioInput; AVCaptureVideoDataOutput *videoOutput; + AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; } @@ -18,7 +20,6 @@ @implementation GPUImageVideoCamera @synthesize captureSession = _captureSession; @synthesize inputCamera = _inputCamera; @synthesize runBenchmark = _runBenchmark; -@synthesize audioEncodingTarget = _audioEncodingTarget; #pragma mark - #pragma mark Initialization and teardown @@ -99,6 +100,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } [_captureSession setSessionPreset:sessionPreset]; + [_captureSession commitConfiguration]; // inputTextureSize @@ -123,6 +125,11 @@ - (void)removeInputsAndOutputs; { [_captureSession removeInput:videoInput]; [_captureSession removeOutput:videoOutput]; + if (_microphone != nil) + { + [_captureSession removeInput:audioInput]; + [_captureSession removeOutput:audioOutput]; + } } #pragma mark - @@ -190,60 +197,48 @@ - (void)rotateCamera } } -#pragma mark - -#pragma mark Benchmarking - -- (CGFloat)averageFrameDurationDuringCapture; -{ - NSLog(@"Number of frames: %d", numberOfFramesCaptured); - return (totalFrameTimeDuringCapture / (CGFloat)numberOfFramesCaptured) * 1000.0; -} - -#pragma mark - -#pragma mark AVCaptureVideoDataOutputSampleBufferDelegate - -- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection +- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer); int bufferWidth = CVPixelBufferGetWidth(cameraFrame); int bufferHeight = CVPixelBufferGetHeight(cameraFrame); - - CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 120); + + CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 1000000000); if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { CVPixelBufferLockBaseAddress(cameraFrame, 0); - + [GPUImageOpenGLESContext useImageProcessingContext]; CVOpenGLESTextureRef texture = NULL; CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); - + if (!texture || err) { NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); return; } outputTexture = CVOpenGLESTextureGetName(texture); -// glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); + // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + for (id currentTarget in targets) { [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; - + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - + [currentTarget newFrameReadyAtTime:currentTime]; } CVPixelBufferUnlockBaseAddress(cameraFrame, 0); - + // Flush the CVOpenGLESTexture cache and release the texture CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); CFRelease(texture); @@ -264,8 +259,8 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM CVPixelBufferLockBaseAddress(cameraFrame, 0); glBindTexture(GL_TEXTURE_2D, outputTexture); - -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); + + // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); // Using BGRA extension to pull in video frame data directly // The use of bytesPerRow / 4 accounts for a display glitch present in preview video frames when using the photo preset on the camera @@ -288,7 +283,38 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM // NSLog(@"Average frame time : %f ms", 1000.0 * (totalFrameTimeDuringCapture / numberOfFramesCaptured)); // NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); } - } + } +} + +- (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; +{ + CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 1000000000)); + + [self.audioEncodingTarget processAudioBuffer:sampleBuffer]; +} + +#pragma mark - +#pragma mark Benchmarking + +- (CGFloat)averageFrameDurationDuringCapture; +{ + NSLog(@"Number of frames: %d", numberOfFramesCaptured); + return (totalFrameTimeDuringCapture / (CGFloat)numberOfFramesCaptured) * 1000.0; +} + +#pragma mark - +#pragma mark AVCaptureVideoDataOutputSampleBufferDelegate + +- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection +{ + if (captureOutput == videoOutput) + { + [self processVideoSampleBuffer:sampleBuffer]; + } + else if (captureOutput == audioOutput) + { + [self processAudioSampleBuffer:sampleBuffer]; + } } #pragma mark - @@ -296,9 +322,28 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; { - _audioEncodingTarget = newValue; + [_captureSession beginConfiguration]; - _audioEncodingTarget.hasAudioTrack = YES; + _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; + audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; + if ([_captureSession canAddInput:audioInput]) + { + [_captureSession addInput:audioInput]; + } + audioOutput = [[AVCaptureAudioDataOutput alloc] init]; + [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; + if ([_captureSession canAddOutput:audioOutput]) + { + [_captureSession addOutput:audioOutput]; + } + else + { + NSLog(@"Couldn't add audio output"); + } + + [_captureSession commitConfiguration]; + + [super setAudioEncodingTarget:newValue]; } @end From 825ed10d7a20fb66742c7c580073f80000e0ed2b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 4 Apr 2012 13:27:59 -0500 Subject: [PATCH 007/695] Still attempting to get audio recording working right for live video. Made audio samples record on background thread so they didn't jam things up. --- framework/Source/GPUImageMovieWriter.m | 66 ++++++++++++++++++-------- framework/Source/GPUImageVideoCamera.m | 17 +++++-- 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index be4278c58..e5e506ee4 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -194,13 +194,13 @@ - (void)initializeMovie; - (void)startRecording; { startTime = kCMTimeInvalid; - [assetWriter startWriting]; - [assetWriter startSessionAtSourceTime:kCMTimeZero]; +// [assetWriter startWriting]; +// [assetWriter startSessionAtSourceTime:kCMTimeZero]; } - (void)finishRecording; { - [assetWriterVideoInput markAsFinished]; +// [assetWriterVideoInput markAsFinished]; [assetWriter finishWriting]; } @@ -208,6 +208,16 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; { if (_hasAudioTrack) { + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); + + if (CMTIME_IS_INVALID(startTime)) + { + NSLog(@"Audio was the first sample"); + [assetWriter startWriting]; + [assetWriter startSessionAtSourceTime:currentSampleTime]; + startTime = currentSampleTime; + } + if (!assetWriterAudioInput.readyForMoreMediaData) { if (_shouldDropFramesIfOverloaded) @@ -224,9 +234,7 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; } } - CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); - [assetWriterAudioInput appendSampleBuffer:audioBuffer]; } } @@ -352,6 +360,22 @@ - (void)renderAtInternalSize; - (void)newFrameReadyAtTime:(CMTime)frameTime; { + // Drop frames forced by images and other things with no time constants + // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case + if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) ) + { + return; + } + + if (CMTIME_IS_INVALID(startTime)) + { + NSLog(@"Video was the first sample"); + [assetWriter startWriting]; + + [assetWriter startSessionAtSourceTime:frameTime]; + startTime = frameTime; + } + if (!assetWriterVideoInput.readyForMoreMediaData) { if (_shouldDropFramesIfOverloaded) @@ -367,13 +391,6 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; } } - // Drop frames forced by images and other things with no time constants - // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case - if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) ) - { - return; - } - // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames [GPUImageOpenGLESContext useImageProcessingContext]; [self renderAtInternalSize]; @@ -400,13 +417,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; glReadPixels(0, 0, videoSize.width, videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufferData); } } - - if (CMTIME_IS_INVALID(startTime)) - { - [assetWriter startSessionAtSourceTime:frameTime]; - startTime = frameTime; - } - + // if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:CMTimeSubtract(frameTime, startTime)]) if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) { @@ -481,6 +492,21 @@ - (void)setHasAudioTrack:(BOOL)newValue } else { + double preferredHardwareSampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; + + AudioChannelLayout acl; + bzero( &acl, sizeof(acl)); + acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; + + audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys: + [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, + [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, + [ NSNumber numberWithFloat: preferredHardwareSampleRate ], AVSampleRateKey, + [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, + //[ NSNumber numberWithInt:AVAudioQualityLow], AVEncoderAudioQualityKey, + [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, + nil]; +/* AudioChannelLayout acl; bzero( &acl, sizeof(acl)); acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; @@ -491,7 +517,7 @@ - (void)setHasAudioTrack:(BOOL)newValue [ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey, [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, - nil]; + nil];*/ } assetWriterAudioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings]; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index c34ea9d0c..90d3d46bc 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -11,6 +11,8 @@ @interface GPUImageVideoCamera () AVCaptureVideoDataOutput *videoOutput; AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; + + dispatch_queue_t audioProcessingQueue; } @end @@ -119,6 +121,11 @@ - (void)dealloc { CFRelease(coreVideoTextureCache); } + + if (audioProcessingQueue != NULL) + { + dispatch_release(audioProcessingQueue); + } } - (void)removeInputsAndOutputs; @@ -204,7 +211,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; int bufferWidth = CVPixelBufferGetWidth(cameraFrame); int bufferHeight = CVPixelBufferGetHeight(cameraFrame); - CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 1000000000); + CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 1000); if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { @@ -288,7 +295,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; { - CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 1000000000)); + CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 1000)); [self.audioEncodingTarget processAudioBuffer:sampleBuffer]; } @@ -331,7 +338,11 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; [_captureSession addInput:audioInput]; } audioOutput = [[AVCaptureAudioDataOutput alloc] init]; - [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; + + audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); + +// [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; + [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; if ([_captureSession canAddOutput:audioOutput]) { [_captureSession addOutput:audioOutput]; From c9b2a4e625d9d197f6dec444048c99e18c684cf3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 4 Apr 2012 15:39:14 -0500 Subject: [PATCH 008/695] Live audio recording now has correct sample timings, thanks to Alaric Cole. --- framework/Source/GPUImageVideoCamera.m | 64 +++++++++++++++----------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 90d3d46bc..e9c88ca4f 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -32,7 +32,7 @@ - (id)init; { return nil; } - + return self; } @@ -43,6 +43,9 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return nil; } + audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.processingQueue", NULL); + + _runBenchmark = NO; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) @@ -57,7 +60,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // Need to remove the initially created texture [self deleteOutputTexture]; } - + // Grab the back-facing or front-facing camera _inputCamera = nil; NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; @@ -68,12 +71,12 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD _inputCamera = device; } } - + // Create the capture session _captureSession = [[AVCaptureSession alloc] init]; [_captureSession beginConfiguration]; - + // Add the video input NSError *error = nil; videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:_inputCamera error:&error]; @@ -85,13 +88,14 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // Add the video frame output videoOutput = [[AVCaptureVideoDataOutput alloc] init]; [videoOutput setAlwaysDiscardsLateVideoFrames:YES]; - + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; // dispatch_queue_t videoQueue = dispatch_queue_create("com.sunsetlakesoftware.colortracking.videoqueue", NULL); // [videoOutput setSampleBufferDelegate:self queue:videoQueue]; - - [videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; + //[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; + //this should be on the same queue as the audio + [videoOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; if ([_captureSession canAddOutput:videoOutput]) { [_captureSession addOutput:videoOutput]; @@ -104,17 +108,17 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [_captureSession setSessionPreset:sessionPreset]; [_captureSession commitConfiguration]; - -// inputTextureSize - + + // inputTextureSize + return self; } - (void)dealloc { [self stopCameraCapture]; -// [videoOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; - + // [videoOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; + [self removeInputsAndOutputs]; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) @@ -211,7 +215,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; int bufferWidth = CVPixelBufferGetWidth(cameraFrame); int bufferHeight = CVPixelBufferGetHeight(cameraFrame); - CMTime currentTime = CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 1000); + CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { @@ -295,8 +299,6 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; { - CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, CMTimeMakeWithSeconds([[NSDate date] timeIntervalSinceDate:startingCaptureTime], 1000)); - [self.audioEncodingTarget processAudioBuffer:sampleBuffer]; } @@ -314,14 +316,22 @@ - (CGFloat)averageFrameDurationDuringCapture; - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { - if (captureOutput == videoOutput) - { - [self processVideoSampleBuffer:sampleBuffer]; - } - else if (captureOutput == audioOutput) - { - [self processAudioSampleBuffer:sampleBuffer]; - } + //This may help keep memory footprint low + @autoreleasepool + { + //these need to be on the main thread for proper timing + if (captureOutput == videoOutput) + { + dispatch_sync(dispatch_get_main_queue(), ^{ [self processVideoSampleBuffer:sampleBuffer]; }); + + } + else if (captureOutput == audioOutput) + { + dispatch_sync(dispatch_get_main_queue(), ^{ [self processAudioSampleBuffer:sampleBuffer]; }); + + } + } + } #pragma mark - @@ -340,8 +350,8 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; audioOutput = [[AVCaptureAudioDataOutput alloc] init]; audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); - -// [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; + + // [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; if ([_captureSession canAddOutput:audioOutput]) { @@ -351,9 +361,9 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; { NSLog(@"Couldn't add audio output"); } - + [_captureSession commitConfiguration]; - + [super setAudioEncodingTarget:newValue]; } From afa0d26ef260653cec081be5cdff544d508f98c9 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 4 Apr 2012 18:20:21 -0500 Subject: [PATCH 009/695] Input movies can now be synchronized with output movie writers so that not a single frame or audio sample is lost. --- README.md | 10 +- .../SimpleVideoFileFilterViewController.m | 6 +- framework/Source/GPUImageMovie.h | 6 +- framework/Source/GPUImageMovie.m | 129 ++++++++++++++---- framework/Source/GPUImageMovieWriter.h | 5 +- framework/Source/GPUImageMovieWriter.m | 71 +++++----- framework/Source/GPUImageVideoCamera.m | 2 +- 7 files changed, 157 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index 982c674f7..f5e2e0196 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ BSD-style, with the full license available with the framework in License.txt. ## Technical requirements ## - OpenGL ES 2.0: Applications using this will not run on the original iPhone, iPhone 3G, and 1st and 2nd generation iPod touches -- iOS 4.0 as a deployment target +- iOS 4.1 as a deployment target (4.0 didn't have some extensions needed for movie reading) - iOS 5.0 SDK to build - Devices must have a camera to use camera-related functionality (obviously) - The framework uses automatic reference counting (ARC), but should support projects using both ARC and manual reference counting if added as a subproject as explained below. For manual reference counting applications targeting iOS 4.x, you'll need add -fobjc-arc to the Other Linker Flags for your application project. @@ -240,6 +240,10 @@ This sets up a video source coming from the iOS device's back-facing camera, usi For blending filters and others that take in more than one image, you can create multiple outputs and add a single filter as a target for both of these outputs. The order with which the outputs are added as targets will affect the order in which the input images are blended or otherwise processed. +Also, if you wish to enable microphone audio capture for recording to a movie, you'll need to set the audioEncodingTarget of the camera to be your movie writer, like for the following: + + videoCamera.audioEncodingTarget = movieWriter; + ### Capturing and filtering a still photo ### @@ -349,6 +353,10 @@ The following is an example of how you would load a sample movie, pass it throug movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; [pixellateFilter addTarget:movieWriter]; + movieWriter.shouldPassthroughAudio = YES; + movieFile.audioEncodingTarget = movieWriter; + [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter]; + [movieWriter startRecording]; [movieFile startProcessing]; diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index 1a7912d61..b3218ebd0 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -42,10 +42,12 @@ - (void)viewDidLoad NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)]; - movieWriter.shouldPassthroughAudio = YES; [filter addTarget:movieWriter]; + + // Configure this for video from the movie file, where we want to preserve all video frames and audio samples + movieWriter.shouldPassthroughAudio = YES; movieFile.audioEncodingTarget = movieWriter; - movieWriter.shouldDropFramesIfOverloaded = NO; + [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter]; [movieWriter startRecording]; [movieFile startProcessing]; diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index 0e7d5572a..b0036b113 100644 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -4,9 +4,6 @@ #import "GPUImageOutput.h" @interface GPUImageMovie : GPUImageOutput -{ - CVOpenGLESTextureCacheRef coreVideoTextureCache; -} @property(readwrite, retain) NSURL *url; @property(readwrite, nonatomic) BOOL runBenchmark; @@ -15,6 +12,9 @@ - (id)initWithURL:(NSURL *)url; // Movie processing +- (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; +- (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; +- (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; - (void)startProcessing; - (void)endProcessing; - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index bec13c0ab..918f53582 100644 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -1,6 +1,16 @@ #import "GPUImageMovie.h" #import "GPUImageMovieWriter.h" +@interface GPUImageMovie () +{ + BOOL audioEncodingIsFinished, videoEncodingIsFinished; + GPUImageMovieWriter *synchronizedMovieWriter; + CVOpenGLESTextureCacheRef coreVideoTextureCache; + AVAssetReader *reader; +} + +@end + @implementation GPUImageMovie @synthesize url = _url; @@ -37,6 +47,12 @@ - (id)initWithURL:(NSURL *)url; #pragma mark - #pragma mark Movie processing +- (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; +{ + synchronizedMovieWriter = movieWriter; + movieWriter.encodingLiveVideo = NO; +} + - (void)startProcessing; { NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; @@ -49,7 +65,7 @@ - (void)startProcessing; { return; } - AVAssetReader *reader = [AVAssetReader assetReaderWithAsset:inputAsset error:&error]; + reader = [AVAssetReader assetReaderWithAsset:inputAsset error:&error]; NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; [outputSettings setObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (NSString*)kCVPixelBufferPixelFormatTypeKey]; @@ -63,6 +79,8 @@ - (void)startProcessing; if (shouldRecordAudioTrack) { + audioEncodingIsFinished = NO; + // This might need to be extended to handle movies with more than one audio track AVAssetTrack* audioTrack = [audioTracks objectAtIndex:0]; readerAudioTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]; @@ -74,45 +92,90 @@ - (void)startProcessing; NSLog(@"Error reading from file at URL: %@", self.url); return; } + + if (synchronizedMovieWriter != nil) + { + __unsafe_unretained GPUImageMovie *weakSelf = self; + + [synchronizedMovieWriter setVideoInputReadyCallback:^{ + [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; + }]; - while (reader.status == AVAssetReaderStatusReading) + [synchronizedMovieWriter setAudioInputReadyCallback:^{ + [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; + }]; + + [synchronizedMovieWriter enableSynchronizationCallbacks]; + } + else { - CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; - if (sampleBufferRef) + while (reader.status == AVAssetReaderStatusReading) { - runOnMainQueueWithoutDeadlocking(^{ - [self processMovieFrame:sampleBufferRef]; - }); + [self readNextVideoFrameFromOutput:readerVideoTrackOutput]; - CMSampleBufferInvalidate(sampleBufferRef); - CFRelease(sampleBufferRef); - } - - if (shouldRecordAudioTrack) - { - CMSampleBufferRef audioSampleBufferRef = [readerAudioTrackOutput copyNextSampleBuffer]; - - if (audioSampleBufferRef) + if ( (shouldRecordAudioTrack) && (!audioEncodingIsFinished) ) { -// runOnMainQueueWithoutDeadlocking(^{ - [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; -// }); - - CMSampleBufferInvalidate(audioSampleBufferRef); - CFRelease(audioSampleBufferRef); - } - else - { -// NSLog(@"Ran out of audio frames"); - shouldRecordAudioTrack = NO; + [self readNextAudioSampleFromOutput:readerAudioTrackOutput]; } + + } + + if (reader.status == AVAssetWriterStatusCompleted) { + [self endProcessing]; } } - - if (reader.status == AVAssetWriterStatusCompleted) { + }]; +} + +- (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; +{ + if (reader.status == AVAssetReaderStatusReading) + { + CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; + if (sampleBufferRef) + { + runOnMainQueueWithoutDeadlocking(^{ + [self processMovieFrame:sampleBufferRef]; + }); + + CMSampleBufferInvalidate(sampleBufferRef); + CFRelease(sampleBufferRef); + } + else + { + videoEncodingIsFinished = YES; [self endProcessing]; } - }]; + } + else if (synchronizedMovieWriter != nil) + { + if (reader.status == AVAssetWriterStatusCompleted) + { + [self endProcessing]; + } + } +} + +- (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; +{ + if (audioEncodingIsFinished) + { + return; + } + + CMSampleBufferRef audioSampleBufferRef = [readerAudioTrackOutput copyNextSampleBuffer]; + + if (audioSampleBufferRef) + { + [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; + + CMSampleBufferInvalidate(audioSampleBufferRef); + CFRelease(audioSampleBufferRef); + } + else + { + audioEncodingIsFinished = YES; + } } - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; @@ -194,6 +257,12 @@ - (void)endProcessing; { [currentTarget endProcessing]; } + + if (synchronizedMovieWriter != nil) + { + [synchronizedMovieWriter setVideoInputReadyCallback:^{}]; + [synchronizedMovieWriter setAudioInputReadyCallback:^{}]; + } } @end diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 26eb49269..7e37fd2a8 100644 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -33,7 +33,9 @@ @property (nonatomic, copy) void(^CompletionBlock)(void); @property (nonatomic, copy) void(^FailureBlock)(NSError*); @property (nonatomic, assign) id delegate; -@property (readwrite, nonatomic) BOOL shouldDropFramesIfOverloaded; +@property (readwrite, nonatomic) BOOL encodingLiveVideo; +@property (nonatomic, copy) void(^videoInputReadyCallback)(void); +@property (nonatomic, copy) void(^audioInputReadyCallback)(void); // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; @@ -42,5 +44,6 @@ - (void)startRecording; - (void)finishRecording; - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; +- (void)enableSynchronizationCallbacks; @end diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index e5e506ee4..0e3fc29de 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -47,11 +47,14 @@ - (void)renderAtInternalSize; @implementation GPUImageMovieWriter @synthesize hasAudioTrack = _hasAudioTrack; +@synthesize encodingLiveVideo = _encodingLiveVideo; @synthesize shouldPassthroughAudio = _shouldPassthroughAudio; @synthesize CompletionBlock; @synthesize FailureBlock; +@synthesize videoInputReadyCallback; +@synthesize audioInputReadyCallback; + @synthesize delegate = _delegate; -@synthesize shouldDropFramesIfOverloaded = _shouldDropFramesIfOverloaded; #pragma mark - #pragma mark Initialization and teardown @@ -66,8 +69,8 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; videoSize = newSize; movieURL = newMovieURL; startTime = kCMTimeInvalid; + _encodingLiveVideo = YES; previousFrameTime = kCMTimeNegativeInfinity; - _shouldDropFramesIfOverloaded = YES; [GPUImageOpenGLESContext useImageProcessingContext]; @@ -175,8 +178,7 @@ - (void)initializeMovie; */ assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings]; - assetWriterVideoInput.expectsMediaDataInRealTime = YES; - //writerInput.expectsMediaDataInRealTime = NO; + assetWriterVideoInput.expectsMediaDataInRealTime = _encodingLiveVideo; // You need to use BGRA for the video in order to get realtime encoding. I use a color-swizzling shader to line up glReadPixels' normal RGBA output with the movie input's BGRA. NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, @@ -195,6 +197,7 @@ - (void)startRecording; { startTime = kCMTimeInvalid; // [assetWriter startWriting]; + // [assetWriter startSessionAtSourceTime:kCMTimeZero]; } @@ -212,33 +215,40 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; if (CMTIME_IS_INVALID(startTime)) { - NSLog(@"Audio was the first sample"); - [assetWriter startWriting]; + if (audioInputReadyCallback == NULL) + { + [assetWriter startWriting]; + } [assetWriter startSessionAtSourceTime:currentSampleTime]; startTime = currentSampleTime; } if (!assetWriterAudioInput.readyForMoreMediaData) { - if (_shouldDropFramesIfOverloaded) - { - NSLog(@"Had to drop an audio frame"); - return; - } - else - { - NSLog(@"Had to drop an audio frame"); - return; -// while(!assetWriterAudioInput.readyForMoreMediaData){}; - - } + NSLog(@"Had to drop an audio frame"); + return; } - NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); +// NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); [assetWriterAudioInput appendSampleBuffer:audioBuffer]; } } +- (void)enableSynchronizationCallbacks; +{ + if (videoInputReadyCallback != NULL) + { + [assetWriter startWriting]; + [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:videoInputReadyCallback]; + } + + if (audioInputReadyCallback != NULL) + { + [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:audioInputReadyCallback]; + } + +} + #pragma mark - #pragma mark Frame rendering @@ -369,8 +379,10 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; if (CMTIME_IS_INVALID(startTime)) { - NSLog(@"Video was the first sample"); - [assetWriter startWriting]; + if (videoInputReadyCallback == NULL) + { + [assetWriter startWriting]; + } [assetWriter startSessionAtSourceTime:frameTime]; startTime = frameTime; @@ -378,17 +390,8 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; if (!assetWriterVideoInput.readyForMoreMediaData) { - if (_shouldDropFramesIfOverloaded) - { - NSLog(@"Had to drop a video frame"); - return; - } - else - { - NSLog(@"Waiting on a video frame"); - - while(!assetWriterVideoInput.readyForMoreMediaData){}; - } + NSLog(@"Had to drop a video frame"); + return; } // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames @@ -425,7 +428,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; } else { - NSLog(@"Recorded video sample time: %lld, %d, %lld", frameTime.value, frameTime.timescale, frameTime.epoch); +// NSLog(@"Recorded video sample time: %lld, %d, %lld", frameTime.value, frameTime.timescale, frameTime.epoch); } CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); @@ -522,7 +525,7 @@ - (void)setHasAudioTrack:(BOOL)newValue assetWriterAudioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings]; [assetWriter addInput:assetWriterAudioInput]; - assetWriterAudioInput.expectsMediaDataInRealTime = YES; + assetWriterAudioInput.expectsMediaDataInRealTime = _encodingLiveVideo; } else { diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index e9c88ca4f..53eaefcbb 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -352,7 +352,6 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); // [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; - [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; if ([_captureSession canAddOutput:audioOutput]) { [_captureSession addOutput:audioOutput]; @@ -361,6 +360,7 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; { NSLog(@"Couldn't add audio output"); } + [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; [_captureSession commitConfiguration]; From 7f9ba8d7ab6d7d79297f8d3c2d9f9ce9bede44f4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 5 Apr 2012 15:18:18 -0500 Subject: [PATCH 010/695] Added the ability to set orientation of captured UIImages. Experimented with direct copying of bytes when setting up images, but that's slower than redrawing for some reason. --- README.md | 2 +- .../SimpleImageViewController.m | 1 + framework/Source/GPUImageFilter.m | 22 +--------- framework/Source/GPUImageFilterGroup.m | 4 +- framework/Source/GPUImageOutput.h | 1 + framework/Source/GPUImageOutput.m | 26 +++++++++++ framework/Source/GPUImagePicture.m | 44 +++++++++++++++---- 7 files changed, 68 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index f5e2e0196..a566bbd73 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ This will give you a live, filtered feed of the still camera's preview video. On The above code captures a full-size photo processed by the same filter chain used in the preview view and saves that photo to disk as a JPEG in the application's documents directory. -Note that the framework currently can't handle images larger than 2048 pixels wide or high on older devices (those before the iPhone 4S, iPad 3, or Retina iPad) due to texture size limitations. This means that the iPhone 4, whose camera outputs still photos larger than this, won't be able to capture photos like this. A tiling mechanism is being implemented to work around this. All other devices should be able to capture and filter photos using this method. +Note that the framework currently can't handle images larger than 2048 pixels wide or high on older devices (those before the iPhone 4S, iPad 2, or Retina iPad) due to texture size limitations. This means that the iPhone 4, whose camera outputs still photos larger than this, won't be able to capture photos like this. A tiling mechanism is being implemented to work around this. All other devices should be able to capture and filter photos using this method. ### Processing a still image ### diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index 29c29e9cf..b19b61a31 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -47,6 +47,7 @@ - (void)setupDisplayFiltering; sepiaFilter = [[GPUImageSepiaFilter alloc] init]; GPUImageView *imageView = (GPUImageView *)self.view; + [sepiaFilter forceProcessingAtSize:imageView.sizeInPixels]; // This is now needed to make the filter run at the smaller output size [sourcePicture addTarget:sepiaFilter]; [sepiaFilter addTarget:imageView]; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 46e679d32..42366c438 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -124,7 +124,7 @@ void dataProviderReleaseCallback (void *info, const void *data, size_t size) free((void *)data); } -- (UIImage *)imageFromCurrentlyProcessedOutput; +- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { [GPUImageOpenGLESContext useImageProcessingContext]; [self setOutputFBO]; @@ -142,26 +142,6 @@ - (UIImage *)imageFromCurrentlyProcessedOutput; CGImageRef cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * (int)currentFBOSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); // Capture image with current device orientation - UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; - UIImageOrientation imageOrientation = UIImageOrientationLeft; - switch (deviceOrientation) - { - case UIDeviceOrientationPortrait: - imageOrientation = UIImageOrientationUp; - break; - case UIDeviceOrientationPortraitUpsideDown: - imageOrientation = UIImageOrientationDown; - break; - case UIDeviceOrientationLandscapeLeft: - imageOrientation = UIImageOrientationLeft; - break; - case UIDeviceOrientationLandscapeRight: - imageOrientation = UIImageOrientationRight; - break; - default: - imageOrientation = UIImageOrientationUp; - break; - } UIImage *finalImage = [UIImage imageWithCGImage:cgImageFromBytes scale:1.0 orientation:imageOrientation]; CGImageRelease(cgImageFromBytes); diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index c5396a2de..f77e04868 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -37,9 +37,9 @@ - (void)addFilter:(GPUImageOutput *)newFilter; #pragma mark - #pragma mark Still image processing -- (UIImage *)imageFromCurrentlyProcessedOutput; +- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { - return [self.terminalFilter imageFromCurrentlyProcessedOutput]; + return [self.terminalFilter imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; } - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 7f4474c8c..abf1dbc9f 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -36,6 +36,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); // Still image processing - (UIImage *)imageFromCurrentlyProcessedOutput; +- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; @end diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 4d8460960..ae43bd78d 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -145,6 +145,32 @@ - (void)forceProcessingAtSize:(CGSize)frameSize; #pragma mark Still image processing - (UIImage *)imageFromCurrentlyProcessedOutput; +{ + UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; + UIImageOrientation imageOrientation = UIImageOrientationLeft; + switch (deviceOrientation) + { + case UIDeviceOrientationPortrait: + imageOrientation = UIImageOrientationUp; + break; + case UIDeviceOrientationPortraitUpsideDown: + imageOrientation = UIImageOrientationDown; + break; + case UIDeviceOrientationLandscapeLeft: + imageOrientation = UIImageOrientationLeft; + break; + case UIDeviceOrientationLandscapeRight: + imageOrientation = UIImageOrientationRight; + break; + default: + imageOrientation = UIImageOrientationUp; + break; + } + + return [self imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; +} + +- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { return nil; } diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 5932c0e53..cfaea1ca7 100644 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -31,6 +31,7 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly CGFloat scaleOfImage = [imageSource scale]; CGSize pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); + BOOL shouldRedrawUsingCoreGraphics = YES; if (self.shouldSmoothlyScaleOutput) { // In order to use mipmaps, you need to provide power-of-two textures, so convert to the next largest power of two and stretch to fill @@ -38,21 +39,41 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly CGFloat powerClosestToHeight = ceil(log2(pixelSizeOfImage.height)); pixelSizeOfImage = CGSizeMake(pow(2.0, powerClosestToWidth), pow(2.0, powerClosestToHeight)); + + shouldRedrawUsingCoreGraphics = YES; } - GLubyte *imageData = (GLubyte *) calloc(1, (int)pixelSizeOfImage.width * (int)pixelSizeOfImage.height * 4); - CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); - CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 8, (int)pixelSizeOfImage.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); - CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeOfImage.width, pixelSizeOfImage.height), [newImageSource CGImage]); - CGContextRelease(imageContext); - CGColorSpaceRelease(genericRGBColorspace); + GLubyte *imageData = NULL; + CFDataRef dataFromImageDataProvider; + +// CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); + + if (shouldRedrawUsingCoreGraphics) + { + // For resized image, redraw + imageData = (GLubyte *) calloc(1, (int)pixelSizeOfImage.width * (int)pixelSizeOfImage.height * 4); + + CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); + CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 8, (int)pixelSizeOfImage.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeOfImage.width, pixelSizeOfImage.height), [newImageSource CGImage]); + CGContextRelease(imageContext); + CGColorSpaceRelease(genericRGBColorspace); + } + else + { + // Access the raw image bytes directly + dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider([newImageSource CGImage])); + imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); + } + +// elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; +// NSLog(@"Core Graphics drawing time: %f", elapsedTime); glBindTexture(GL_TEXTURE_2D, outputTexture); if (self.shouldSmoothlyScaleOutput) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } - // Using BGRA extension to pull in video frame data directly glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); if (self.shouldSmoothlyScaleOutput) @@ -60,7 +81,14 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly glGenerateMipmap(GL_TEXTURE_2D); } - free(imageData); + if (shouldRedrawUsingCoreGraphics) + { + free(imageData); + } + else + { + CFRelease(dataFromImageDataProvider); + } return self; } From 10de0e53c94762731d1dc9043a880b18f3caae02 Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Sat, 14 Apr 2012 19:11:58 -0600 Subject: [PATCH 011/695] Trying to add iOS 5 Texture Pipeline --- framework/Source/GPUImageRawData.h | 6 +- framework/Source/GPUImageRawData.m | 91 +++++++++++++++++++++++--- framework/Source/GPUImageVideoCamera.h | 2 +- framework/Source/GPUImageVideoCamera.m | 5 ++ 4 files changed, 92 insertions(+), 12 deletions(-) diff --git a/framework/Source/GPUImageRawData.h b/framework/Source/GPUImageRawData.h index 920970b9b..25fa21b80 100644 --- a/framework/Source/GPUImageRawData.h +++ b/framework/Source/GPUImageRawData.h @@ -11,7 +11,11 @@ typedef struct GPUByteColorVector GPUByteColorVector; @protocol GPUImageRawDataProcessor; -@interface GPUImageRawData : NSObject +@interface GPUImageRawData : NSObject { + CGSize imageSize; + CVOpenGLESTextureCacheRef rawDataTextureCache; + CVPixelBufferRef renderTarget; +} @property(readwrite, unsafe_unretained, nonatomic) id delegate; @property(readonly) GLubyte *rawBytesForImage; diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawData.m index a4b1a4628..6d2383e57 100644 --- a/framework/Source/GPUImageRawData.m +++ b/framework/Source/GPUImageRawData.m @@ -6,7 +6,7 @@ @interface GPUImageRawData () { - CGSize imageSize; + BOOL hasReadFromTheCurrentFrame; GLuint dataFramebuffer, dataRenderbuffer; @@ -95,12 +95,71 @@ - (void)createDataFBO; glGenFramebuffers(1, &dataFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, dataFramebuffer); - glGenRenderbuffers(1, &dataRenderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, dataRenderbuffer); - - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, (int)imageSize.width, (int)imageSize.height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, dataRenderbuffer); - + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &rawDataTextureCache); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, // our empty IOSurface properties dictionary + NULL, + NULL, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, + 1, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + CFDictionarySetValue(attrs, + kCVPixelBufferIOSurfacePropertiesKey, + empty); + + //CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &renderTarget); + + CVPixelBufferCreate(kCFAllocatorDefault, + (int)imageSize.width, + (int)imageSize.height, + kCVPixelFormatType_32BGRA, + attrs, + &renderTarget); + + CVOpenGLESTextureRef renderTexture; + CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + rawDataTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)imageSize.width, + (int)imageSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + } + else + { + + glGenRenderbuffers(1, &dataRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, dataRenderbuffer); + + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, (int)imageSize.width, (int)imageSize.height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, dataRenderbuffer); + } GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); @@ -199,7 +258,6 @@ - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; - (void)newFrameReadyAtTime:(CMTime)frameTime; { hasReadFromTheCurrentFrame = NO; - [self.delegate newImageFrameAvailableFromDataSource:self]; } @@ -248,10 +306,23 @@ - (GLubyte *)rawBytesForImage; } else { + //CVPixelBufferRef pixel_buffer = NULL; + + CVPixelBufferUnlockBaseAddress(renderTarget, 0); [GPUImageOpenGLESContext useImageProcessingContext]; + CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); [self renderAtInternalSize]; - glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); - + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { + + CVPixelBufferLockBaseAddress(renderTarget, 0); + _rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); + + } else { + glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); + } + + return _rawBytesForImage; } diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 99f160956..adee2a9f8 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -35,7 +35,7 @@ - (void)stopCameraCapture; - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; - +- (AVCaptureDevicePosition)getCameraPosition; // Rotate the camera - (void)rotateCamera; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 53eaefcbb..13bdd913a 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -1,3 +1,4 @@ + #import "GPUImageVideoCamera.h" #import "GPUImageMovieWriter.h" @@ -208,6 +209,10 @@ - (void)rotateCamera } } +- (AVCaptureDevicePosition)getCameraPosition { + return [[videoInput device] position]; +} + - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); From f83aa10abd4a20edaafe08efa9fb7c49f0ab1fad Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Sun, 15 Apr 2012 12:27:56 -0600 Subject: [PATCH 012/695] Fixing a type that I added --- framework/GPUImage.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 4a0f1a2bb..97c6bf0d2 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -914,6 +914,7 @@ DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/GPUImage-Prefix.pch"; + HEADER_SEARCH_PATHS = ""; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -927,6 +928,7 @@ DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/GPUImage-Prefix.pch"; + HEADER_SEARCH_PATHS = ""; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; From aa1a254a80a918cb4daab49a6a7b23964e956869 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 16 Apr 2012 12:28:19 -0500 Subject: [PATCH 013/695] Fixed the low-res photos being captured by the GPUImageStillCamera. --- .../ColorObjectTracking.xcodeproj/project.pbxproj | 4 ++-- framework/Source/GPUImageVideoCamera.m | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj b/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj index 98581b506..4f74e0e43 100644 --- a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj +++ b/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj @@ -303,7 +303,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../framework/Source/**"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 4.1; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -323,7 +323,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../framework/Source/**"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 4.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 13bdd913a..aadd80d51 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -325,18 +325,19 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM @autoreleasepool { //these need to be on the main thread for proper timing - if (captureOutput == videoOutput) + if (captureOutput == audioOutput) { - dispatch_sync(dispatch_get_main_queue(), ^{ [self processVideoSampleBuffer:sampleBuffer]; }); - + runOnMainQueueWithoutDeadlocking(^{ + [self processAudioSampleBuffer:sampleBuffer]; + }); } - else if (captureOutput == audioOutput) + else { - dispatch_sync(dispatch_get_main_queue(), ^{ [self processAudioSampleBuffer:sampleBuffer]; }); - + runOnMainQueueWithoutDeadlocking(^{ + [self processVideoSampleBuffer:sampleBuffer]; + }); } } - } #pragma mark - From 04a4a685a0921a2a3f75723460c6e8054832beea Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 16 Apr 2012 15:33:46 -0500 Subject: [PATCH 014/695] Fixed the raw data reads using the texture caches. Added 1 s fragmenting on recorded movies to prevent against early termination. Fixed the custom filter in the showcase. --- README.md | 6 ++- .../ColorTrackingViewController.m | 24 ++++++++--- .../FilterShowcase/CustomFilter.fsh | 21 ++++++---- framework/Source/GPUImageMovieWriter.m | 2 + framework/Source/GPUImageRawData.m | 41 ++++++++++++++----- 5 files changed, 67 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index a566bbd73..c31061db3 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ BSD-style, with the full license available with the framework in License.txt. ## Technical requirements ## - OpenGL ES 2.0: Applications using this will not run on the original iPhone, iPhone 3G, and 1st and 2nd generation iPod touches -- iOS 4.1 as a deployment target (4.0 didn't have some extensions needed for movie reading) +- iOS 4.1 as a deployment target (4.0 didn't have some extensions needed for movie reading). iOS 4.3 is needed as a deployment target if you wish to show live video previews when taking a still photo. - iOS 5.0 SDK to build - Devices must have a camera to use camera-related functionality (obviously) - The framework uses automatic reference counting (ARC), but should support projects using both ARC and manual reference counting if added as a subproject as explained below. For manual reference counting applications targeting iOS 4.x, you'll need add -fobjc-arc to the Other Linker Flags for your application project. @@ -260,7 +260,9 @@ To capture and filter still photos, you can use a process similar to the one for [stillCamera startCameraCapture]; -This will give you a live, filtered feed of the still camera's preview video. Once you want to capture a photo, you use a callback block like the following: +This will give you a live, filtered feed of the still camera's preview video. Note that this preview video is only provided on iOS 4.3 and higher, so you may need to set that as your deployment target if you wish to have this functionality. + +Once you want to capture a photo, you use a callback block like the following: [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index 6e5664961..3f9f518c9 100644 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -186,12 +186,24 @@ - (CGPoint)centroidFromTexture:(GLubyte *)pixels ofSize:(CGSize)textureSize; { CGFloat currentXTotal = 0.0f, currentYTotal = 0.0f, currentPixelTotal = 0.0f; - for (NSUInteger currentPixel = 0; currentPixel < (textureSize.width * textureSize.height); currentPixel++) - { - currentXTotal += (CGFloat)pixels[currentPixel * 4] / 255.0f; - currentYTotal += (CGFloat)pixels[(currentPixel * 4) + 1] / 255.0f; - currentPixelTotal += (CGFloat)pixels[(currentPixel * 4) + 3] / 255.0f; - } + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + for (NSUInteger currentPixel = 0; currentPixel < (textureSize.width * textureSize.height); currentPixel++) + { + currentXTotal += (CGFloat)pixels[(currentPixel * 4) + 2] / 255.0f; + currentYTotal += (CGFloat)pixels[(currentPixel * 4) + 1] / 255.0f; + currentPixelTotal += (CGFloat)pixels[(currentPixel * 4) + 3] / 255.0f; + } + } + else + { + for (NSUInteger currentPixel = 0; currentPixel < (textureSize.width * textureSize.height); currentPixel++) + { + currentXTotal += (CGFloat)pixels[currentPixel * 4] / 255.0f; + currentYTotal += (CGFloat)pixels[(currentPixel * 4) + 1] / 255.0f; + currentPixelTotal += (CGFloat)pixels[(currentPixel * 4) + 3] / 255.0f; + } + } return CGPointMake(currentXTotal / currentPixelTotal, currentYTotal / currentPixelTotal); } diff --git a/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh b/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh index cd1b06a17..d4668b6c4 100644 --- a/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh +++ b/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh @@ -1,14 +1,19 @@ varying highp vec2 textureCoordinate; -uniform sampler2D inputImageTexture; -precision highp float; +uniform sampler2D inputImageTexture; -void main (void) +void main() { - highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel); - - highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor); - gl_FragColor = texture2D(inputImageTexture, samplePos ); -} + lowp vec3 tc = vec3(1.0, 0.0, 0.0); + lowp vec3 pixcol = texture2D(inputImageTexture, textureCoordinate).rgb; + lowp vec3 colors[3]; + colors[0] = vec3(0.0, 0.0, 1.0); + colors[1] = vec3(1.0, 1.0, 0.0); + colors[2] = vec3(1.0, 0.0, 0.0); + mediump float lum = (pixcol.r + pixcol.g + pixcol.b) / 3.0; + int ix = (lum < 0.5)? 0:1; + tc = mix(colors[ix], colors[ix + 1], (lum - float(ix) * 0.5) / 0.5); + gl_FragColor = vec4(tc, 1.0); +} \ No newline at end of file diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 0e3fc29de..715fa6285 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -148,6 +148,8 @@ - (void)initializeMovie; } } + // Set this to make sure that a functional movie is produced, even if the recording is cut off mid-stream. Only the last second should be lost in that case. + assetWriter.movieFragmentInterval = CMTimeMakeWithSeconds(1.0, 1000); NSMutableDictionary * outputSettings = [[NSMutableDictionary alloc] init]; [outputSettings setObject:AVVideoCodecH264 forKey:AVVideoCodecKey]; diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawData.m index 6d2383e57..d049cf88d 100644 --- a/framework/Source/GPUImageRawData.m +++ b/framework/Source/GPUImageRawData.m @@ -249,7 +249,22 @@ - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; locationToPickFrom.x = MIN(MAX(locationInImage.x, 0.0), (imageSize.width - 1.0)); locationToPickFrom.y = MIN(MAX((imageSize.height - locationInImage.y), 0.0), (imageSize.height - 1.0)); - return imageColorBytes[(int)(round((locationToPickFrom.y * imageSize.width) + locationToPickFrom.x))]; + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + // When reading directly from the texture using the fast texture cache, values are in BGRA, not RGBA + + GPUByteColorVector flippedColor = imageColorBytes[(int)(round((locationToPickFrom.y * imageSize.width) + locationToPickFrom.x))]; + GLubyte temporaryRed = flippedColor.red; + + flippedColor.red = flippedColor.blue; + flippedColor.blue = temporaryRed; + + return flippedColor; + } + else + { + return imageColorBytes[(int)(round((locationToPickFrom.y * imageSize.width) + locationToPickFrom.x))]; + } } #pragma mark - @@ -294,35 +309,39 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; - (GLubyte *)rawBytesForImage; { - if (_rawBytesForImage == NULL) + if ( (_rawBytesForImage == NULL) && (![GPUImageOpenGLESContext supportsFastTextureUpload]) ) { _rawBytesForImage = (GLubyte *) calloc(imageSize.width * imageSize.height * 4, sizeof(GLubyte)); hasReadFromTheCurrentFrame = NO; } - + if (hasReadFromTheCurrentFrame) { return _rawBytesForImage; } else { - //CVPixelBufferRef pixel_buffer = NULL; + // Note: the fast texture caches speed up 640x480 frame reads from 9.6 ms to 3.1 ms on iPhone 4S - CVPixelBufferUnlockBaseAddress(renderTarget, 0); [GPUImageOpenGLESContext useImageProcessingContext]; - CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + CVPixelBufferUnlockBaseAddress(renderTarget, 0); +// CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); + } + [self renderAtInternalSize]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { - + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { CVPixelBufferLockBaseAddress(renderTarget, 0); _rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); - - } else { + } + else + { glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); } - return _rawBytesForImage; } From 5a7872bb3503af9b24d450a739705da1220a51ab Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 16 Apr 2012 17:44:32 -0500 Subject: [PATCH 015/695] Added a GPUImageTexture class for importing OpenGL ES textures and scenes into GPUImage. Updated the CubeExample to show how this works. --- README.md | 12 + .../Classes/CubeExampleAppDelegate.h | 11 +- .../Classes/CubeExampleAppDelegate.m | 13 +- .../Classes/DisplayViewController.h | 19 ++ .../Classes/DisplayViewController.m | 94 +++++++ examples/CubeExample/Classes/EAGLView.h | 16 -- examples/CubeExample/Classes/EAGLView.m | 92 ------- examples/CubeExample/Classes/ES2Renderer.h | 10 +- examples/CubeExample/Classes/ES2Renderer.m | 169 +++---------- examples/CubeExample/Classes/ESRenderer.h | 1 - examples/CubeExample/CubeExample-Info.plist | 2 - .../CubeExample.xcodeproj/project.pbxproj | 16 +- examples/CubeExample/MainWindow.xib | 239 ------------------ examples/CubeExample/main.m | 3 +- framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 1 + framework/Source/GPUImageMovieWriter.h | 20 +- framework/Source/GPUImageMovieWriter.m | 20 +- framework/Source/GPUImageTextureInput.h | 14 + framework/Source/GPUImageTextureInput.m | 35 +++ 20 files changed, 270 insertions(+), 525 deletions(-) create mode 100644 examples/CubeExample/Classes/DisplayViewController.h create mode 100644 examples/CubeExample/Classes/DisplayViewController.m delete mode 100644 examples/CubeExample/Classes/EAGLView.h delete mode 100644 examples/CubeExample/Classes/EAGLView.m delete mode 100644 examples/CubeExample/MainWindow.xib create mode 100644 framework/Source/GPUImageTextureInput.h create mode 100644 framework/Source/GPUImageTextureInput.m diff --git a/README.md b/README.md index c31061db3..ddad35dc2 100644 --- a/README.md +++ b/README.md @@ -369,6 +369,12 @@ Once recording is finished, you need to remove the movie recorder from the filte A movie won't be usable until it has been finished off, so if this is interrupted before this point, the recording will be lost. +### Interacting with OpenGL ES ### + +GPUImage can both export and import textures from OpenGL ES through the use of its GPUImageTextureOutput and GPUImageTextureInput classes, respectively. This lets you record a movie from an OpenGL ES scene that is rendered to a framebuffer object with a bound texture, or filter video or images and then feed them into OpenGL ES as a texture to be displayed in the scene. + +The one caution with this approach is that the textures used in these processes must be shared between GPUImage's OpenGL ES context and any other context via a share group or something similar. + ## Sample applications ## Several sample applications are bundled with the framework source. Most are compatible with both iPhone and iPad-class devices. They attempt to show off various aspects of the framework and should be used as the best examples of the API while the framework is under development. These include: @@ -393,6 +399,12 @@ This demonstrates every filter supplied with GPUImage. This is used to test the performance of the overall framework by testing it against CPU-bound routines and Core Image. Benchmarks involving still images and video are run against all three, with results displayed in-application. +### CubeExample ### + +This demonstrates the ability of GPUImage to interact with OpenGL ES rendering. Frames are captured from the camera, a sepia filter applied to them, and then they are fed into a texture to be applied to the face of a cube you can rotate with your finger. This cube in turn is rendered to a texture-backed framebuffer object, and that texture is fed back into GPUImage to have a pixellation filter applied to it before rendering to screen. + +In other words, the path of this application is camera -> sepia tone filter -> cube -> pixellation filter -> display. + ### ColorObjectTracking ### A version of my ColorTracking example from http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios ported across to use GPUImage, this application uses color in a scene to track objects from a live camera feed. The four views you can switch between include the raw camera feed, the camera feed with pixels matching the color threshold in white, the processed video where positions are encoded as colors within the pixels passing the threshold test, and finally the live video feed with a dot that tracks the selected color. Tapping the screen changes the color to track to match the color of the pixels under your finger. Tapping and dragging on the screen makes the color threshold more or less forgiving. This is most obvious on the second, color thresholding view. diff --git a/examples/CubeExample/Classes/CubeExampleAppDelegate.h b/examples/CubeExample/Classes/CubeExampleAppDelegate.h index 586aa869c..e8d57d58b 100644 --- a/examples/CubeExample/Classes/CubeExampleAppDelegate.h +++ b/examples/CubeExample/Classes/CubeExampleAppDelegate.h @@ -1,14 +1,15 @@ #import -@class EAGLView; +@class DisplayViewController; + +@interface CubeExampleAppDelegate : NSObject +{ + DisplayViewController *rootViewController; -@interface CubeExampleAppDelegate : NSObject { UIWindow *window; - EAGLView *glView; } -@property (nonatomic, retain) IBOutlet UIWindow *window; -@property (nonatomic, retain) IBOutlet EAGLView *glView; +@property (strong, nonatomic) UIWindow *window; @end diff --git a/examples/CubeExample/Classes/CubeExampleAppDelegate.m b/examples/CubeExample/Classes/CubeExampleAppDelegate.m index 5aaddf45f..30d3a3b02 100644 --- a/examples/CubeExample/Classes/CubeExampleAppDelegate.m +++ b/examples/CubeExample/Classes/CubeExampleAppDelegate.m @@ -1,13 +1,21 @@ #import "CubeExampleAppDelegate.h" -#import "EAGLView.h" +#import "DisplayViewController.h" @implementation CubeExampleAppDelegate @synthesize window; -@synthesize glView; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; + // Override point for customization after application launch. + self.window.backgroundColor = [UIColor whiteColor]; + + rootViewController = [[DisplayViewController alloc] initWithNibName:nil bundle:nil]; + [self.window addSubview:rootViewController.view]; + + [self.window makeKeyAndVisible]; + return YES; } @@ -26,7 +34,6 @@ - (void)applicationWillTerminate:(UIApplication *)application - (void)dealloc { [window release]; - [glView release]; [super dealloc]; } diff --git a/examples/CubeExample/Classes/DisplayViewController.h b/examples/CubeExample/Classes/DisplayViewController.h new file mode 100644 index 000000000..d62f7b59a --- /dev/null +++ b/examples/CubeExample/Classes/DisplayViewController.h @@ -0,0 +1,19 @@ +#import +#import + +#import "ESRenderer.h" +#import "ES2Renderer.h" +#import "GPUImage.h" + +@interface DisplayViewController : UIViewController +{ + CGPoint lastMovementPosition; +@private + ES2Renderer *renderer; + GPUImageTextureInput *textureInput; + GPUImageFilter *filter; +} + +- (void)drawView:(id)sender; + +@end diff --git a/examples/CubeExample/Classes/DisplayViewController.m b/examples/CubeExample/Classes/DisplayViewController.m new file mode 100644 index 000000000..a728008ce --- /dev/null +++ b/examples/CubeExample/Classes/DisplayViewController.m @@ -0,0 +1,94 @@ +#import "DisplayViewController.h" + +@interface DisplayViewController () + +@end + +@implementation DisplayViewController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + + + return self; +} + +- (void)dealloc +{ + [renderer release]; + + [super dealloc]; +} + +- (void)loadView +{ + CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame]; + GPUImageView *primaryView = [[GPUImageView alloc] initWithFrame:mainScreenFrame]; + self.view = primaryView; + + renderer = [[ES2Renderer alloc] initWithSize:[primaryView sizeInPixels]]; + + textureInput = [[GPUImageTextureInput alloc] initWithTexture:renderer.outputTexture size:[primaryView sizeInPixels]]; + filter = [[GPUImagePixellateFilter alloc] init]; + [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:0.01]; + +// filter = [[GPUImageGaussianBlurFilter alloc] init]; +// [(GPUImageGaussianBlurFilter *)filter setBlurSize:3.0]; + + [textureInput addTarget:filter]; + [filter addTarget:primaryView]; + + [renderer setNewFrameAvailableBlock:^{ + [textureInput processTexture]; + }]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +- (void)drawView:(id)sender +{ + [renderer renderByRotatingAroundX:0 rotatingAroundY:0]; +} + +#pragma mark - +#pragma mark Touch-handling methods + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + NSMutableSet *currentTouches = [[[event touchesForView:self.view] mutableCopy] autorelease]; + [currentTouches minusSet:touches]; + + // New touches are not yet included in the current touches for the view + lastMovementPosition = [[touches anyObject] locationInView:self.view]; +} + +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; +{ + CGPoint currentMovementPosition = [[touches anyObject] locationInView:self.view]; + [renderer renderByRotatingAroundX:(currentMovementPosition.x - lastMovementPosition.x) rotatingAroundY:(lastMovementPosition.y - currentMovementPosition.y)]; + lastMovementPosition = currentMovementPosition; +} + +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +{ + NSMutableSet *remainingTouches = [[[event touchesForView:self.view] mutableCopy] autorelease]; + [remainingTouches minusSet:touches]; + + lastMovementPosition = [[remainingTouches anyObject] locationInView:self.view]; +} + +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +{ + // Handle touches canceled the same as as a touches ended event + [self touchesEnded:touches withEvent:event]; +} + + +@end diff --git a/examples/CubeExample/Classes/EAGLView.h b/examples/CubeExample/Classes/EAGLView.h deleted file mode 100644 index 2a81c5811..000000000 --- a/examples/CubeExample/Classes/EAGLView.h +++ /dev/null @@ -1,16 +0,0 @@ -#import -#import - -#import "ESRenderer.h" - -@interface EAGLView : UIView -{ - CGPoint lastMovementPosition; -@private - id renderer; - -} - -- (void)drawView:(id)sender; - -@end diff --git a/examples/CubeExample/Classes/EAGLView.m b/examples/CubeExample/Classes/EAGLView.m deleted file mode 100644 index 46e7afd6f..000000000 --- a/examples/CubeExample/Classes/EAGLView.m +++ /dev/null @@ -1,92 +0,0 @@ -#import "EAGLView.h" - -#import "ES2Renderer.h" - -@implementation EAGLView - -// You must implement this method -+ (Class)layerClass -{ - return [CAEAGLLayer class]; -} - -//The EAGL view is stored in the nib file. When it's unarchived it's sent -initWithCoder: -- (id)initWithCoder:(NSCoder*)coder -{ - if ((self = [super initWithCoder:coder])) - { - // Set scaling to account for Retina display - if ([self respondsToSelector:@selector(setContentScaleFactor:)]) - { - self.contentScaleFactor = [[UIScreen mainScreen] scale]; - } - - // Get the layer - CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; - - eaglLayer.opaque = TRUE; - eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; - - renderer = [[ES2Renderer alloc] init]; - } - - return self; -} - -- (void)dealloc -{ - [renderer release]; - - [super dealloc]; -} - -#pragma mark - -#pragma mark UIView layout methods - -- (void)drawView:(id)sender -{ - [renderer renderByRotatingAroundX:0 rotatingAroundY:0]; -} - -- (void)layoutSubviews -{ - NSLog(@"Scale factor: %f", self.contentScaleFactor); - [renderer resizeFromLayer:(CAEAGLLayer*)self.layer]; - [self drawView:nil]; -} - -#pragma mark - -#pragma mark Touch-handling methods - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event -{ - NSMutableSet *currentTouches = [[[event touchesForView:self] mutableCopy] autorelease]; - [currentTouches minusSet:touches]; - - // New touches are not yet included in the current touches for the view - lastMovementPosition = [[touches anyObject] locationInView:self]; -} - -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; -{ - CGPoint currentMovementPosition = [[touches anyObject] locationInView:self]; - [renderer renderByRotatingAroundX:(lastMovementPosition.x - currentMovementPosition.x) rotatingAroundY:(lastMovementPosition.y - currentMovementPosition.y)]; - lastMovementPosition = currentMovementPosition; -} - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event -{ - NSMutableSet *remainingTouches = [[[event touchesForView:self] mutableCopy] autorelease]; - [remainingTouches minusSet:touches]; - - lastMovementPosition = [[remainingTouches anyObject] locationInView:self]; -} - -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event -{ - // Handle touches canceled the same as as a touches ended event - [self touchesEnded:touches withEvent:event]; -} - -@end diff --git a/examples/CubeExample/Classes/ES2Renderer.h b/examples/CubeExample/Classes/ES2Renderer.h index fc0eb85a5..642b0af45 100644 --- a/examples/CubeExample/Classes/ES2Renderer.h +++ b/examples/CubeExample/Classes/ES2Renderer.h @@ -12,14 +12,14 @@ @private EAGLContext *context; - GLuint textureForCubeFace; + GLuint textureForCubeFace, outputTexture; // The pixel dimensions of the CAEAGLLayer GLint backingWidth; GLint backingHeight; // The OpenGL ES names for the framebuffer and renderbuffer used to render to this view - GLuint defaultFramebuffer, colorRenderbuffer, depthBuffer, msaaFramebuffer, msaaRenderbuffer, msaaDepthbuffer; + GLuint defaultFramebuffer, colorRenderbuffer, depthBuffer; CATransform3D currentCalculatedMatrix; @@ -31,8 +31,12 @@ } +@property(readonly) GLuint outputTexture; +@property(nonatomic, copy) void(^newFrameAvailableBlock)(void); + +- (id)initWithSize:(CGSize)newSize; + - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotation; -- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer; - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matrix; @end diff --git a/examples/CubeExample/Classes/ES2Renderer.m b/examples/CubeExample/Classes/ES2Renderer.m index aa4b518aa..e453832ba 100644 --- a/examples/CubeExample/Classes/ES2Renderer.m +++ b/examples/CubeExample/Classes/ES2Renderer.m @@ -28,8 +28,10 @@ - (BOOL)validateProgram:(GLuint)prog; @implementation ES2Renderer -// Create an OpenGL ES 2.0 context -- (id)init +@synthesize outputTexture; +@synthesize newFrameAvailableBlock; + +- (id)initWithSize:(CGSize)newSize; { if ((self = [super init])) { @@ -41,20 +43,38 @@ - (id)init [self release]; return nil; } + + backingWidth = (int)newSize.width; + backingHeight = (int)newSize.height; currentCalculatedMatrix = CATransform3DIdentity; currentCalculatedMatrix = CATransform3DScale(currentCalculatedMatrix, 0.5, 0.5 * (320.0/480.0), 0.5); - - glEnable(GL_TEXTURE_2D); - - // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer + + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + + glActiveTexture(GL_TEXTURE1); glGenFramebuffers(1, &defaultFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); - - glGenRenderbuffers(1, &colorRenderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + glBindTexture(GL_TEXTURE_2D, 0); + + + videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; // inputFilter = [[GPUImagePixellateFilter alloc] init]; inputFilter = [[GPUImageSepiaFilter alloc] init]; @@ -75,36 +95,6 @@ - (id)init - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotation; { - /* static const GLfloat cubeVertices[] = { - -1.0, -1.0, -1.0, // 0 - 1.0, -1.0, -1.0, // 1 - 1.0, 1.0, -1.0, // 2 - -1.0, 1.0, -1.0, // 3 - -1.0, -1.0, 1.0, // 4 - 1.0, -1.0, 1.0, // 5 - 1.0, 1.0, 1.0, // 6 - -1.0, 1.0, 1.0 // 7 - }; */ -/* static const GLushort cubeIndices[] = { - 0, 2, 1, - 0, 3, 2, - - 1, 2, 6, - 6, 5, 1, - - 4, 5, 6, - 6, 7, 4, - - 2, 3, 6, - 6, 3, 7, - - 0, 7, 3, - 0, 4, 7, - - 0, 1, 5, - 0, 5, 4 - };*/ - static const GLfloat cubeVertices[] = { -1.0, -1.0, -1.0, // 0 1.0, 1.0, -1.0, // 2 @@ -155,41 +145,6 @@ - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotatio -1.0, -1.0, 1.0 // 4 }; - /* - static const GLfloat cubeVertices[] = { - -1.0, -1.0, 1.0, - 1.0, -1.0, 1.0, - -1.0, 1.0, 1.0, - 1.0, 1.0, 1.0, - -1.0, -1.0, -1.0, - 1.0, -1.0, -1.0, - -1.0, 1.0, -1.0, - 1.0, 1.0, -1.0, - }; - - static const GLushort cubeIndices[] = { - 0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1 - }; - */ -#ifdef DRAWTEXTURE - /* - const GLfloat cubeTexCoords[] = { - 1.0, 0.0, - 0.0, 0.0, - 1.0, 1.0, - 0.0, 1.0, - 0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 1.0, 1.0, - 1.0, 1.0, - 0.0, 1.0, - 0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 1.0, 1.0, - }; -*/ const GLfloat cubeTexCoords[] = { 0.0, 0.0, 1.0, 1.0, @@ -241,17 +196,12 @@ - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotatio }; -#endif // This application only creates a single context which is already set current at this point. // This call is redundant, but needed if dealing with multiple contexts. [EAGLContext setCurrentContext:context]; -#ifdef MSAA - glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); -#else glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); -#endif glEnable(GL_CULL_FACE); glCullFace(GL_BACK); @@ -345,16 +295,12 @@ - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotatio // This application only creates a single color renderbuffer which is already bound at this point. // This call is redundant, but needed if dealing with multiple renderbuffers. - -#ifdef MSAA - glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, defaultFramebuffer); - - glResolveMultisampleFramebufferAPPLE(); -#endif - glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); - - [context presentRenderbuffer:GL_RENDERBUFFER]; + + newFrameAvailableBlock(); + +// glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); +// +// [context presentRenderbuffer:GL_RENDERBUFFER]; } - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file @@ -513,49 +459,6 @@ - (BOOL)loadShaders return TRUE; } -- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer -{ - [EAGLContext setCurrentContext:context]; - // Allocate color buffer backing based on the current layer size - glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); - glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); - [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]; - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); - -// glGenRenderbuffers(1, &depthBuffer); -// glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer); -// glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight); -// glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer); -// - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); - return NO; - } -#ifdef MSAA - // Multisampled antialiasing - glGenFramebuffers(1, &msaaFramebuffer); - glGenRenderbuffers(1, &msaaRenderbuffer); - - glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); - glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderbuffer); - - // 4X MSAA - glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, backingWidth, backingHeight); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, msaaRenderbuffer); - - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); - return NO; - - } -#endif - - return YES; -} - - (void)dealloc { // Tear down GL diff --git a/examples/CubeExample/Classes/ESRenderer.h b/examples/CubeExample/Classes/ESRenderer.h index 49f6f56b0..ff218a895 100644 --- a/examples/CubeExample/Classes/ESRenderer.h +++ b/examples/CubeExample/Classes/ESRenderer.h @@ -6,6 +6,5 @@ @protocol ESRenderer - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotation; -- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer; @end diff --git a/examples/CubeExample/CubeExample-Info.plist b/examples/CubeExample/CubeExample-Info.plist index 1b54a9b15..bcf7ff5db 100644 --- a/examples/CubeExample/CubeExample-Info.plist +++ b/examples/CubeExample/CubeExample-Info.plist @@ -24,8 +24,6 @@ 1.0 LSRequiresIPhoneOS - NSMainNibFile - MainWindow UIStatusBarHidden UIRequiredDeviceCapabilities diff --git a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj b/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj index 69a61a407..84466c4da 100755 --- a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj +++ b/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj @@ -14,8 +14,6 @@ 2514C27310084DB100A42282 /* ES2Renderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2514C27010084DB100A42282 /* ES2Renderer.m */; }; 2514C27B10084DCA00A42282 /* Shader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 2514C27910084DCA00A42282 /* Shader.fsh */; }; 2514C27C10084DCA00A42282 /* Shader.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 2514C27A10084DCA00A42282 /* Shader.vsh */; }; - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; - 28FD14FE0DC6FC130079059D /* EAGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 28FD14FD0DC6FC130079059D /* EAGLView.m */; }; 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD15070DC6FC5B0079059D /* QuartzCore.framework */; }; BCB6B8A41505A9840041703B /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A11505A9840041703B /* AVFoundation.framework */; }; @@ -23,6 +21,7 @@ BCB6B8A61505A9840041703B /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A31505A9840041703B /* CoreVideo.framework */; }; BCB6B8A91505A9AA0041703B /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B88C150447DF0041703B /* libGPUImage.a */; }; BCB6B8C41505C2780041703B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8C31505C2780041703B /* CoreGraphics.framework */; }; + BCF3D690153CC5E6009A1FE5 /* DisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68F153CC5E6009A1FE5 /* DisplayViewController.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -60,9 +59,6 @@ 2514C27110084DB100A42282 /* ESRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ESRenderer.h; sourceTree = ""; }; 2514C27910084DCA00A42282 /* Shader.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = Shader.fsh; path = Shaders/Shader.fsh; sourceTree = ""; }; 2514C27A10084DCA00A42282 /* Shader.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = Shader.vsh; path = Shaders/Shader.vsh; sourceTree = ""; }; - 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 28FD14FC0DC6FC130079059D /* EAGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLView.h; sourceTree = ""; }; - 28FD14FD0DC6FC130079059D /* EAGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EAGLView.m; sourceTree = ""; }; 28FD14FF0DC6FC520079059D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 28FD15070DC6FC5B0079059D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -73,6 +69,8 @@ BCB6B8A21505A9840041703B /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCB6B8A31505A9840041703B /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; BCB6B8C31505C2780041703B /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + BCF3D68E153CC5E5009A1FE5 /* DisplayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayViewController.h; sourceTree = ""; }; + BCF3D68F153CC5E6009A1FE5 /* DisplayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DisplayViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -101,8 +99,8 @@ 2514C26F10084DB100A42282 /* ES2Renderer.h */, 2514C27010084DB100A42282 /* ES2Renderer.m */, 2514C27110084DB100A42282 /* ESRenderer.h */, - 28FD14FC0DC6FC130079059D /* EAGLView.h */, - 28FD14FD0DC6FC130079059D /* EAGLView.m */, + BCF3D68E153CC5E5009A1FE5 /* DisplayViewController.h */, + BCF3D68F153CC5E6009A1FE5 /* DisplayViewController.m */, 1D3623240D0F684500981E51 /* CubeExampleAppDelegate.h */, 1D3623250D0F684500981E51 /* CubeExampleAppDelegate.m */, ); @@ -151,7 +149,6 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( - 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 8D1107310486CEB800E47090 /* CubeExample-Info.plist */, ); name = Resources; @@ -257,7 +254,6 @@ files = ( 2514C27B10084DCA00A42282 /* Shader.fsh in Resources */, 2514C27C10084DCA00A42282 /* Shader.vsh in Resources */, - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -270,8 +266,8 @@ files = ( 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 1D3623260D0F684500981E51 /* CubeExampleAppDelegate.m in Sources */, - 28FD14FE0DC6FC130079059D /* EAGLView.m in Sources */, 2514C27310084DB100A42282 /* ES2Renderer.m in Sources */, + BCF3D690153CC5E6009A1FE5 /* DisplayViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/CubeExample/MainWindow.xib b/examples/CubeExample/MainWindow.xib deleted file mode 100644 index d75ecb8fd..000000000 --- a/examples/CubeExample/MainWindow.xib +++ /dev/null @@ -1,239 +0,0 @@ - - - - 800 - 10D541 - 760 - 1038.29 - 460.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 81 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1316 - - YES - - - 1298 - {320, 480} - - - 3 - MQA - - NO - IBCocoaTouchFramework - - - - {320, 480} - - - 1 - MSAxIDEAA - - NO - IBCocoaTouchFramework - YES - YES - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - glView - - - - 9 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - - -1 - - - File's Owner - - - 3 - - - - - 8 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 8.CustomClassName - 8.IBPluginDependency - - - YES - UIApplication - UIResponder - - YES - - - YES - - - {{228, 376}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CubeExampleAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - EAGLView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 9 - - - - YES - - EAGLView - UIView - - IBProjectSource - Classes/EAGLView.h - - - - CubeExampleAppDelegate - NSObject - - YES - - YES - glView - window - - - YES - EAGLView - UIWindow - - - - IBProjectSource - Classes/CubeExampleAppDelegate.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CubeExample.xcodeproj - 3 - 81 - - diff --git a/examples/CubeExample/main.m b/examples/CubeExample/main.m index 1ccea0fe0..61b18c6a1 100644 --- a/examples/CubeExample/main.m +++ b/examples/CubeExample/main.m @@ -6,11 +6,12 @@ // #import +#import "CubeExampleAppDelegate.h" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); + int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([CubeExampleAppDelegate class])); [pool release]; return retVal; } diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 97c6bf0d2..3952eaf71 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -146,6 +146,8 @@ BCF1A34C14DDB1EC00852800 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33414DDB1EC00852800 /* libGPUImage.a */; }; BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1A35014DDB1EC00852800 /* InfoPlist.strings */; }; BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1A35414DDB1EC00852800 /* GPUImageTests.m */; }; + BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; }; + BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -301,6 +303,8 @@ BCF1A35114DDB1EC00852800 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; BCF1A35314DDB1EC00852800 /* GPUImageTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPUImageTests.h; sourceTree = ""; }; BCF1A35414DDB1EC00852800 /* GPUImageTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPUImageTests.m; sourceTree = ""; }; + BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTextureInput.h; path = Source/GPUImageTextureInput.h; sourceTree = SOURCE_ROOT; }; + BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTextureInput.m; path = Source/GPUImageTextureInput.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -467,6 +471,8 @@ BCB5E7D914E6003400701302 /* GPUImagePicture.m */, BC982C6A14F33C290001FF6F /* GPUImageMovie.h */, BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */, + BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */, + BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */, ); name = Sources; sourceTree = ""; @@ -662,6 +668,7 @@ BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */, BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */, BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */, + BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -826,6 +833,7 @@ BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */, BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */, BCABED9115263CF20098A93E /* GPUImageStretchDistortionFilter.m in Sources */, + BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index a29320428..2c5f6a1ce 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -13,6 +13,7 @@ #import "GPUImageFilterPipeline.h" #import "GPUImageTextureOutput.h" #import "GPUImageFilterGroup.h" +#import "GPUImageTextureInput.h" // Filters #import "GPUImageFilter.h" diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 7e37fd2a8..0707e5631 100644 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -5,8 +5,8 @@ @protocol GPUImageMovieWriterDelegate @optional --(void)Completed; --(void)Failed:(NSError*)error; +- (void)movieRecordingCompleted; +- (void)movieRecordingFailedWithError:(NSError*)error; @end @@ -28,14 +28,14 @@ CGSize videoSize; } -@property (readwrite, nonatomic) BOOL hasAudioTrack; -@property (readwrite, nonatomic) BOOL shouldPassthroughAudio; -@property (nonatomic, copy) void(^CompletionBlock)(void); -@property (nonatomic, copy) void(^FailureBlock)(NSError*); -@property (nonatomic, assign) id delegate; -@property (readwrite, nonatomic) BOOL encodingLiveVideo; -@property (nonatomic, copy) void(^videoInputReadyCallback)(void); -@property (nonatomic, copy) void(^audioInputReadyCallback)(void); +@property(readwrite, nonatomic) BOOL hasAudioTrack; +@property(readwrite, nonatomic) BOOL shouldPassthroughAudio; +@property(nonatomic, copy) void(^completionBlock)(void); +@property(nonatomic, copy) void(^failureBlock)(NSError*); +@property(nonatomic, assign) id delegate; +@property(readwrite, nonatomic) BOOL encodingLiveVideo; +@property(nonatomic, copy) void(^videoInputReadyCallback)(void); +@property(nonatomic, copy) void(^audioInputReadyCallback)(void); // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 715fa6285..5226f056b 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -49,8 +49,8 @@ @implementation GPUImageMovieWriter @synthesize hasAudioTrack = _hasAudioTrack; @synthesize encodingLiveVideo = _encodingLiveVideo; @synthesize shouldPassthroughAudio = _shouldPassthroughAudio; -@synthesize CompletionBlock; -@synthesize FailureBlock; +@synthesize completionBlock; +@synthesize failureBlock; @synthesize videoInputReadyCallback; @synthesize audioInputReadyCallback; @@ -135,15 +135,15 @@ - (void)initializeMovie; if (error != nil) { NSLog(@"Error: %@", error); - if (FailureBlock) + if (failureBlock) { - FailureBlock(error); + failureBlock(error); } else { - if(self.delegate && [self.delegate respondsToSelector:@selector(Failed:)]) + if(self.delegate && [self.delegate respondsToSelector:@selector(movieRecordingFailedWithError:)]) { - [self.delegate Failed:error]; + [self.delegate movieRecordingFailedWithError:error]; } } } @@ -463,15 +463,15 @@ - (CGSize)maximumOutputSize; - (void)endProcessing { - if (CompletionBlock) + if (completionBlock) { - CompletionBlock(); + completionBlock(); } else { - if (_delegate && [_delegate respondsToSelector:@selector(Completed)]) + if (_delegate && [_delegate respondsToSelector:@selector(movieRecordingCompleted)]) { - [_delegate Completed]; + [_delegate movieRecordingCompleted]; } } } diff --git a/framework/Source/GPUImageTextureInput.h b/framework/Source/GPUImageTextureInput.h new file mode 100644 index 000000000..400094bba --- /dev/null +++ b/framework/Source/GPUImageTextureInput.h @@ -0,0 +1,14 @@ +#import "GPUImageOutput.h" + +@interface GPUImageTextureInput : GPUImageOutput +{ + CGSize textureSize; +} + +// Initialization and teardown +- (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; + +// Image rendering +- (void)processTexture; + +@end diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m new file mode 100644 index 000000000..9b9134f01 --- /dev/null +++ b/framework/Source/GPUImageTextureInput.m @@ -0,0 +1,35 @@ +#import "GPUImageTextureInput.h" + +@implementation GPUImageTextureInput + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; +{ + if (!(self = [super init])) + { + return nil; + } + + [self deleteOutputTexture]; + + outputTexture = newInputTexture; + textureSize = newTextureSize; + + return self; +} + +#pragma mark - +#pragma mark Image rendering + +- (void)processTexture; +{ + for (id currentTarget in targets) + { + [currentTarget setInputSize:textureSize]; + [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; + } +} + +@end From b55ccacf8d0e026bf97058b3d85036f3ef0a4ba7 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 16 Apr 2012 22:33:06 -0500 Subject: [PATCH 016/695] Added a tilt shift lens filter. --- README.md | 6 ++ .../ColorTrackingViewController.m | 1 - .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 22 ++++- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageTiltShiftFilter.h | 23 +++++ framework/Source/GPUImageTiltShiftFilter.m | 98 +++++++++++++++++++ framework/Source/GPUImageUnsharpMaskFilter.m | 1 - 10 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 framework/Source/GPUImageTiltShiftFilter.h create mode 100644 framework/Source/GPUImageTiltShiftFilter.m diff --git a/README.md b/README.md index ddad35dc2..1df3d2f41 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,12 @@ For example, an application that takes in live video from the camera, converts t - *excludeCirclePoint*: The center of the circular area being excluded from the blur - *excludeBlurSize*: The size of the area between the blurred portion and the clear circle +- **GPUImageTiltShiftFilter**: A simulated tilt shift lens effect + - *blurSize*: A multiplier for the size of the out-of-focus blur, ranging from 0.0 on up, with a default of 2.0 + - *topFocusLevel*: The normalized location of the top of the in-focus area in the image, this value should be lower than bottomFocusLevel, default 0.4 + - *bottomFocusLevel*: The normalized location of the bottom of the in-focus area in the image, this value should be higher than topFocusLevel, default 0.6 + - *focusFallOffRate*: The rate at which the image gets blurry away from the in-focus region, default 0.2 + - **GPUImageBoxBlurFilter**: A hardware-accelerated 9-hit box blur of an image ### Blending modes ### diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index 3f9f518c9..df8abdd58 100644 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -116,7 +116,6 @@ - (void)configureTrackingDot; trackingDot.actions = newActions; - // [glView.layer addSublayer:trackingDot]; trackingDot.position = CGPointMake(100.0f, 100.0f); trackingDot.opacity = 0.0f; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index ad6328fed..d5f31a3b5 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -83,6 +83,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SOBELEDGEDETECTION: cell.textLabel.text = @"Sobel edge detection"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; + case GPUIMAGE_TILTSHIFT: cell.textLabel.text = @"Tilt shift"; break; case GPUIMAGE_CGA: cell.textLabel.text = @"CGA colorspace"; break; case GPUIMAGE_POSTERIZE: cell.textLabel.text = @"Posterize"; break; case GPUIMAGE_SWIRL: cell.textLabel.text = @"Swirl"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 0899c8a3d..4e5720046 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -24,6 +24,7 @@ typedef enum { GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, + GPUIMAGE_TILTSHIFT, GPUIMAGE_CGA, GPUIMAGE_POSTERIZE, GPUIMAGE_KUWAHARA, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index fd8f094c6..0925f2cdd 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -279,6 +279,20 @@ - (void)setupFilter; filter = [[GPUImageToonFilter alloc] init]; }; break; + case GPUIMAGE_TILTSHIFT: + { + self.title = @"Tilt Shift"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.2]; + [self.filterSettingsSlider setMaximumValue:0.8]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImageTiltShiftFilter alloc] init]; + [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:0.4]; + [(GPUImageTiltShiftFilter *)filter setBottomFocusLevel:0.6]; + [(GPUImageTiltShiftFilter *)filter setFocusFallOffRate:0.2]; + }; break; case GPUIMAGE_CGA: { self.title = @"CGA Colorspace"; @@ -547,7 +561,7 @@ - (void)setupFilter; [rotationFilter addTarget:filter]; videoCamera.runBenchmark = YES; - if (filterType != GPUIMAGE_UNSHARPMASK) + if ( (filterType != GPUIMAGE_UNSHARPMASK) && (filterType != GPUIMAGE_TILTSHIFT) ) { // The picture is only used for two-image blend filters UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; @@ -608,6 +622,12 @@ - (IBAction)updateFilterFromSlider:(id)sender; [(GPUImageTransformFilter *)filter setTransform3D:perspectiveTransform]; }; break; + case GPUIMAGE_TILTSHIFT: + { + CGFloat midpoint = [(UISlider *)sender value]; + [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:midpoint - 0.1]; + [(GPUImageTiltShiftFilter *)filter setBottomFocusLevel:midpoint + 0.1]; + }; break; default: break; } } diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 3952eaf71..3580203d0 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -148,6 +148,8 @@ BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1A35414DDB1EC00852800 /* GPUImageTests.m */; }; BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; }; BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; + BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; }; + BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -305,6 +307,8 @@ BCF1A35414DDB1EC00852800 /* GPUImageTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPUImageTests.m; sourceTree = ""; }; BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTextureInput.h; path = Source/GPUImageTextureInput.h; sourceTree = SOURCE_ROOT; }; BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTextureInput.m; path = Source/GPUImageTextureInput.m; sourceTree = SOURCE_ROOT; }; + BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTiltShiftFilter.h; path = Source/GPUImageTiltShiftFilter.h; sourceTree = SOURCE_ROOT; }; + BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTiltShiftFilter.m; path = Source/GPUImageTiltShiftFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -513,6 +517,8 @@ BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */, BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */, BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */, + BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */, + BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -669,6 +675,7 @@ BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */, BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */, BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */, + BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -834,6 +841,7 @@ BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */, BCABED9115263CF20098A93E /* GPUImageStretchDistortionFilter.m in Sources */, BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */, + BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 2c5f6a1ce..c940ca92f 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -64,3 +64,4 @@ #import "GPUImageCGAColorspaceFilter.h" #import "GPUImagePolarPixellateFilter.h" #import "GPUImageStretchDistortionFilter.h" +#import "GPUImageTiltShiftFilter.h" diff --git a/framework/Source/GPUImageTiltShiftFilter.h b/framework/Source/GPUImageTiltShiftFilter.h new file mode 100644 index 000000000..602608b43 --- /dev/null +++ b/framework/Source/GPUImageTiltShiftFilter.h @@ -0,0 +1,23 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageGaussianBlurFilter; + +@interface GPUImageTiltShiftFilter : GPUImageFilterGroup +{ + GPUImageGaussianBlurFilter *blurFilter; + GPUImageFilter *tiltShiftFilter; +} + +// A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 2.0 +@property(readwrite, nonatomic) CGFloat blurSize; + +// The normalized location of the top of the in-focus area in the image, this value should be lower than bottomFocusLevel, default 0.4 +@property(readwrite, nonatomic) CGFloat topFocusLevel; + +// The normalized location of the bottom of the in-focus area in the image, this value should be higher than topFocusLevel, default 0.6 +@property(readwrite, nonatomic) CGFloat bottomFocusLevel; + +// The rate at which the image gets blurry away from the in-focus region, default 0.2 +@property(readwrite, nonatomic) CGFloat focusFallOffRate; + +@end diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m new file mode 100644 index 000000000..43b75bf48 --- /dev/null +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -0,0 +1,98 @@ +#import "GPUImageTiltShiftFilter.h" +#import "GPUImageFilter.h" +#import "GPUImageGaussianBlurFilter.h" + +NSString *const kGPUImageTiltShiftFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform highp float topFocusLevel; + uniform highp float bottomFocusLevel; + uniform highp float focusFallOffRate; + + void main() + { + lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate); + + lowp float blurIntensity = 1.0 - smoothstep(topFocusLevel - focusFallOffRate, topFocusLevel, textureCoordinate.y); + blurIntensity += smoothstep(bottomFocusLevel, bottomFocusLevel + focusFallOffRate, textureCoordinate.y); + + gl_FragColor = mix(sharpImageColor, blurredImageColor, blurIntensity); + } +); + +@implementation GPUImageTiltShiftFilter + +@synthesize blurSize; +@synthesize topFocusLevel = _topFocusLevel; +@synthesize bottomFocusLevel = _bottomFocusLevel; +@synthesize focusFallOffRate = _focusFallOffRate; + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: apply a variable Gaussian blur + blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; + [self addFilter:blurFilter]; + + // Second pass: combine the blurred image with the original sharp one + tiltShiftFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageTiltShiftFragmentShaderString]; + [self addFilter:tiltShiftFilter]; + + // Texture location 0 needs to be the sharp image for both the blur and the second stage processing + [blurFilter addTarget:tiltShiftFilter atTextureLocation:1]; + + // To prevent double updating of this filter, disable updates from the sharp image side + targetToIgnoreForUpdates = tiltShiftFilter; + + self.initialFilters = [NSArray arrayWithObjects:blurFilter, tiltShiftFilter, nil]; + self.terminalFilter = tiltShiftFilter; + + self.topFocusLevel = 0.4; + self.bottomFocusLevel = 0.6; + self.focusFallOffRate = 0.2; + self.blurSize = 2.0; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setBlurSize:(CGFloat)newValue; +{ + blurFilter.blurSize = newValue; +} + +- (CGFloat)blurSize; +{ + return blurFilter.blurSize; +} + +- (void)setTopFocusLevel:(CGFloat)newValue; +{ + _topFocusLevel = newValue; + [tiltShiftFilter setFloat:newValue forUniform:@"topFocusLevel"]; +} + +- (void)setBottomFocusLevel:(CGFloat)newValue; +{ + _bottomFocusLevel = newValue; + [tiltShiftFilter setFloat:newValue forUniform:@"bottomFocusLevel"]; +} + +- (void)setFocusFallOffRate:(CGFloat)newValue; +{ + _focusFallOffRate = newValue; + [tiltShiftFilter setFloat:newValue forUniform:@"focusFallOffRate"]; +} + +@end \ No newline at end of file diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index d90ed8bd9..7efa482bd 100644 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -47,7 +47,6 @@ - (id)init; // To prevent double updating of this filter, disable updates from the sharp image side targetToIgnoreForUpdates = unsharpMaskFilter; -// unsharpMaskFilter.shouldIgnoreUpdatesToThisTarget = YES; self.initialFilters = [NSArray arrayWithObjects:blurFilter, unsharpMaskFilter, nil]; self.terminalFilter = unsharpMaskFilter; From 480c469592f8c2265dde2f0174ea9333b3987f5e Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 17 Apr 2012 14:58:48 -0500 Subject: [PATCH 017/695] Added a 3x3 convolution kernel filter, and an embossing one based on that. Fixed a couple of potential memory leaks with the movie writer and raw data output. --- README.md | 6 + .../ShowcaseFilterListController.m | 2 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 35 ++++- .../SimpleVideoFilterViewController.m | 7 + framework/GPUImage.xcodeproj/project.pbxproj | 16 ++ framework/Source/GPUImage.h | 2 + .../Source/GPUImage3x3ConvolutionFilter.h | 18 +++ .../Source/GPUImage3x3ConvolutionFilter.m | 138 ++++++++++++++++++ framework/Source/GPUImageEmbossFilter.h | 8 + framework/Source/GPUImageEmbossFilter.m | 52 +++++++ framework/Source/GPUImageFilter.h | 14 ++ framework/Source/GPUImageMovieWriter.m | 2 + framework/Source/GPUImageRawData.m | 2 + .../Source/GPUImageSobelEdgeDetectionFilter.h | 2 - .../Source/GPUImageSobelEdgeDetectionFilter.m | 47 +----- framework/Source/GPUImageToonFilter.m | 3 +- 17 files changed, 307 insertions(+), 49 deletions(-) create mode 100644 framework/Source/GPUImage3x3ConvolutionFilter.h create mode 100644 framework/Source/GPUImage3x3ConvolutionFilter.m create mode 100644 framework/Source/GPUImageEmbossFilter.h create mode 100644 framework/Source/GPUImageEmbossFilter.m diff --git a/README.md b/README.md index 1df3d2f41..89189e231 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,12 @@ For example, an application that takes in live video from the camera, converts t - **GPUImageBoxBlurFilter**: A hardware-accelerated 9-hit box blur of an image +- **GPUImage3x3ConvolutionFilter**: Runs a 3x3 convolution kernel against the image + - *convolutionKernel*: The convolution kernel is a 3x3 matrix of values to apply to the pixel and its 8 surrounding pixels. The matrix is specified in row-major order, with the top left pixel being one.one and the bottom right three.three. If the values in the matrix don't add up to 1.0, the image could be brightened or darkened. + +- **GPUImageEmbossFilter**: Applies an embossing effect on the image + - *intensity*: The strength of the embossing, from 0.0 to 4.0, with 1.0 as the normal level + ### Blending modes ### - **GPUImageChromaKeyBlendFilter**: Selectively replaces a color in the first image with the second image diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index d5f31a3b5..0fa5d851b 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -85,6 +85,8 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; case GPUIMAGE_TILTSHIFT: cell.textLabel.text = @"Tilt shift"; break; case GPUIMAGE_CGA: cell.textLabel.text = @"CGA colorspace"; break; + case GPUIMAGE_CONVOLUTION: cell.textLabel.text = @"3x3 convolution"; break; + case GPUIMAGE_EMBOSS: cell.textLabel.text = @"Emboss"; break; case GPUIMAGE_POSTERIZE: cell.textLabel.text = @"Posterize"; break; case GPUIMAGE_SWIRL: cell.textLabel.text = @"Swirl"; break; case GPUIMAGE_BULGE: cell.textLabel.text = @"Bulge"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 4e5720046..a3423b395 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -27,6 +27,8 @@ typedef enum { GPUIMAGE_TILTSHIFT, GPUIMAGE_CGA, GPUIMAGE_POSTERIZE, + GPUIMAGE_CONVOLUTION, + GPUIMAGE_EMBOSS, GPUIMAGE_KUWAHARA, GPUIMAGE_VIGNETTE, GPUIMAGE_GAUSSIAN, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 0925f2cdd..5ea684e43 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -300,7 +300,39 @@ - (void)setupFilter; filter = [[GPUImageCGAColorspaceFilter alloc] init]; }; break; - + case GPUIMAGE_CONVOLUTION: + { + self.title = @"3x3 Convolution"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImage3x3ConvolutionFilter alloc] init]; +// [(GPUImage3x3ConvolutionFilter *)filter setConvolutionKernel:(GPUMatrix3x3){ +// {-2.0f, -1.0f, 0.0f}, +// {-1.0f, 1.0f, 1.0f}, +// { 0.0f, 1.0f, 2.0f} +// }]; + [(GPUImage3x3ConvolutionFilter *)filter setConvolutionKernel:(GPUMatrix3x3){ + {1.0f, 1.0f, 1.0f}, + {1.0f, -8.0f, 1.0f}, + {1.0f, 1.0f, 1.0f} + }]; +// [(GPUImage3x3ConvolutionFilter *)filter setConvolutionKernel:(GPUMatrix3x3){ +// { 0.11f, 0.11f, 0.11f}, +// { 0.11f, 0.11f, 0.11f}, +// { 0.11f, 0.11f, 0.11f} +// }]; + }; break; + case GPUIMAGE_EMBOSS: + { + self.title = @"Emboss"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:5.0]; + [self.filterSettingsSlider setValue:1.0]; + + filter = [[GPUImageEmbossFilter alloc] init]; + }; break; case GPUIMAGE_POSTERIZE: { self.title = @"Posterize"; @@ -601,6 +633,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)filter setRadius:round([(UISlider *)sender value])]; break; case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)filter setAngle:[(UISlider *)sender value]]; break; + case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)filter setIntensity:[(UISlider *)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 2cfd3d1bd..02ae4800b 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -25,6 +25,13 @@ - (void)viewDidLoad // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; filter = [[GPUImagePixellateFilter alloc] init]; + +// filter = [[GPUImageTiltShiftFilter alloc] init]; +// [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:0.65]; +// [(GPUImageTiltShiftFilter *)filter setBottomFocusLevel:0.85]; +// [(GPUImageTiltShiftFilter *)filter setBlurSize:1.5]; +// [(GPUImageTiltShiftFilter *)filter setFocusFallOffRate:0.2]; + // filter = [[GPUImageSketchFilter alloc] init]; // filter = [[GPUImageUnsharpMaskFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 3580203d0..42d2f6f9b 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -150,6 +150,10 @@ BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; }; BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */; }; + BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; }; + BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */; }; + BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; }; + BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -309,6 +313,10 @@ BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTextureInput.m; path = Source/GPUImageTextureInput.m; sourceTree = SOURCE_ROOT; }; BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTiltShiftFilter.h; path = Source/GPUImageTiltShiftFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTiltShiftFilter.m; path = Source/GPUImageTiltShiftFilter.m; sourceTree = SOURCE_ROOT; }; + BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage3x3ConvolutionFilter.h; path = Source/GPUImage3x3ConvolutionFilter.h; sourceTree = SOURCE_ROOT; }; + BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3ConvolutionFilter.m; path = Source/GPUImage3x3ConvolutionFilter.m; sourceTree = SOURCE_ROOT; }; + BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageEmbossFilter.h; path = Source/GPUImageEmbossFilter.h; sourceTree = SOURCE_ROOT; }; + BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageEmbossFilter.m; path = Source/GPUImageEmbossFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -519,6 +527,10 @@ BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */, BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */, BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */, + BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */, + BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */, + BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */, + BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -676,6 +688,8 @@ BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */, BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */, BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */, + BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */, + BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -842,6 +856,8 @@ BCABED9115263CF20098A93E /* GPUImageStretchDistortionFilter.m in Sources */, BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */, BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */, + BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */, + BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index c940ca92f..7f5c2afda 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -65,3 +65,5 @@ #import "GPUImagePolarPixellateFilter.h" #import "GPUImageStretchDistortionFilter.h" #import "GPUImageTiltShiftFilter.h" +#import "GPUImage3x3ConvolutionFilter.h" +#import "GPUImageEmbossFilter.h" diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.h b/framework/Source/GPUImage3x3ConvolutionFilter.h new file mode 100644 index 000000000..cba85f949 --- /dev/null +++ b/framework/Source/GPUImage3x3ConvolutionFilter.h @@ -0,0 +1,18 @@ +#import "GPUImageFilter.h" + +extern NSString *const kGPUImageNearbyTexelSamplingVertexShaderString; + +@interface GPUImage3x3ConvolutionFilter : GPUImageFilter +{ + GLint convolutionMatrixUniform; + GLint imageWidthFactorUniform, imageHeightFactorUniform; + + CGFloat imageWidthFactor, imageHeightFactor; +} + +// The convolution kernel is a 3x3 matrix of values to apply to the pixel and its 8 surrounding pixels. The matrix is specified in row-major order, +// with the top left pixel being one.one and the bottom right three.three +// If the values in the matrix don't add up to 1.0, the image could be brightened or darkened. +@property(readwrite, nonatomic) GPUMatrix3x3 convolutionKernel; + +@end diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m new file mode 100644 index 000000000..94255af8b --- /dev/null +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -0,0 +1,138 @@ +#import "GPUImage3x3ConvolutionFilter.h" + +// Override vertex shader to remove dependent texture reads +NSString *const kGPUImageNearbyTexelSamplingVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + uniform highp float imageWidthFactor; + uniform highp float imageHeightFactor; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 widthStep = vec2(imageWidthFactor, 0.0); + vec2 heightStep = vec2(0.0, imageHeightFactor); + vec2 widthHeightStep = vec2(imageWidthFactor, imageHeightFactor); + vec2 widthNegativeHeightStep = vec2(imageWidthFactor, -imageHeightFactor); + + textureCoordinate = inputTextureCoordinate.xy; + leftTextureCoordinate = inputTextureCoordinate.xy - widthStep; + rightTextureCoordinate = inputTextureCoordinate.xy + widthStep; + + topTextureCoordinate = inputTextureCoordinate.xy - heightStep; + topLeftTextureCoordinate = inputTextureCoordinate.xy - widthHeightStep; + topRightTextureCoordinate = inputTextureCoordinate.xy + widthNegativeHeightStep; + + bottomTextureCoordinate = inputTextureCoordinate.xy + heightStep; + bottomLeftTextureCoordinate = inputTextureCoordinate.xy - widthNegativeHeightStep; + bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep; + } +); + + +NSString *const kGPUImage3x3ConvolutionFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform mediump mat3 convolutionMatrix; + + void main() + { + mediump vec4 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate); + mediump vec4 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate); + mediump vec4 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate); + mediump vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + mediump vec4 leftColor = texture2D(inputImageTexture, leftTextureCoordinate); + mediump vec4 rightColor = texture2D(inputImageTexture, rightTextureCoordinate); + mediump vec4 topColor = texture2D(inputImageTexture, topTextureCoordinate); + mediump vec4 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate); + mediump vec4 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate); + + mediump vec4 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; + resultColor += leftColor * convolutionMatrix[1][0] + centerColor * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; + resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; + + gl_FragColor = resultColor; + } +); + +@implementation GPUImage3x3ConvolutionFilter + +@synthesize convolutionKernel = _convolutionKernel; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageNearbyTexelSamplingVertexShaderString fragmentShaderFromString:kGPUImage3x3ConvolutionFragmentShaderString])) + { + return nil; + } + + convolutionMatrixUniform = [filterProgram uniformIndex:@"convolutionMatrix"]; + imageWidthFactorUniform = [filterProgram uniformIndex:@"imageWidthFactor"]; + imageHeightFactorUniform = [filterProgram uniformIndex:@"imageHeightFactor"]; + + self.convolutionKernel = (GPUMatrix3x3){ + {0.f, 0.f, 0.f}, + {0.f, 1.f, 0.f}, + {0.f, 0.f, 0.f} + }; + + return self; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + imageWidthFactor = filterFrameSize.width; + imageHeightFactor = filterFrameSize.height; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(imageWidthFactorUniform, 1.0 / imageWidthFactor); + glUniform1f(imageHeightFactorUniform, 1.0 / imageHeightFactor); +} + +#pragma mark - +#pragma mark Accessors + +- (void)setConvolutionKernel:(GPUMatrix3x3)newValue; +{ + _convolutionKernel = newValue; + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + glUniformMatrix3fv(convolutionMatrixUniform, 1, GL_FALSE, (GLfloat *)&_convolutionKernel); +} + +@end diff --git a/framework/Source/GPUImageEmbossFilter.h b/framework/Source/GPUImageEmbossFilter.h new file mode 100644 index 000000000..dbd21e82a --- /dev/null +++ b/framework/Source/GPUImageEmbossFilter.h @@ -0,0 +1,8 @@ +#import "GPUImage3x3ConvolutionFilter.h" + +@interface GPUImageEmbossFilter : GPUImage3x3ConvolutionFilter + +// The strength of the embossing, from 0.0 to 4.0, with 1.0 as the normal level +@property(readwrite, nonatomic) CGFloat intensity; + +@end diff --git a/framework/Source/GPUImageEmbossFilter.m b/framework/Source/GPUImageEmbossFilter.m new file mode 100644 index 000000000..17d1d4fd2 --- /dev/null +++ b/framework/Source/GPUImageEmbossFilter.m @@ -0,0 +1,52 @@ +#import "GPUImageEmbossFilter.h" + +@implementation GPUImageEmbossFilter + +@synthesize intensity = _intensity; + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + self.intensity = 1.0; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setIntensity:(CGFloat)newValue; +{ +// [(GPUImage3x3ConvolutionFilter *)filter setConvolutionMatrix:(GPUMatrix3x3){ +// {-2.0f, -1.0f, 0.0f}, +// {-1.0f, 1.0f, 1.0f}, +// { 0.0f, 1.0f, 2.0f} +// }]; + + _intensity = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + GPUMatrix3x3 newConvolutionMatrix; + newConvolutionMatrix.one.one = _intensity * (-2.0); + newConvolutionMatrix.one.two = -_intensity; + newConvolutionMatrix.one.three = 0.0f; + + newConvolutionMatrix.two.one = -_intensity; + newConvolutionMatrix.two.two = 1.0; + newConvolutionMatrix.two.three = _intensity; + + newConvolutionMatrix.three.one = 0.0f; + newConvolutionMatrix.three.two = _intensity; + newConvolutionMatrix.three.three = _intensity * 2.0; + + self.convolutionKernel = newConvolutionMatrix; +} + + +@end diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index d8093548e..19d9ad021 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -15,6 +15,13 @@ struct GPUVector4 { }; typedef struct GPUVector4 GPUVector4; +struct GPUVector3 { + GLfloat one; + GLfloat two; + GLfloat three; +}; +typedef struct GPUVector3 GPUVector3; + struct GPUMatrix4x4 { GPUVector4 one; GPUVector4 two; @@ -23,6 +30,13 @@ struct GPUMatrix4x4 { }; typedef struct GPUMatrix4x4 GPUMatrix4x4; +struct GPUMatrix3x3 { + GPUVector3 one; + GPUVector3 two; + GPUVector3 three; +}; +typedef struct GPUMatrix3x3 GPUMatrix3x3; + @interface GPUImageFilter : GPUImageOutput { GLuint filterSourceTexture, filterSourceTexture2; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 5226f056b..9f55d2e66 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -113,6 +113,8 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; - (void)dealloc; { + [self destroyDataFBO]; + if (frameData != NULL) { free(frameData); diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawData.m index d049cf88d..63172cd6e 100644 --- a/framework/Source/GPUImageRawData.m +++ b/framework/Source/GPUImageRawData.m @@ -79,6 +79,8 @@ - (id)initWithImageSize:(CGSize)newImageSize; - (void)dealloc { + [self destroyDataFBO]; + if (_rawBytesForImage != NULL) { free(_rawBytesForImage); diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.h b/framework/Source/GPUImageSobelEdgeDetectionFilter.h index 15113bf91..aa642d271 100644 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.h +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.h @@ -1,7 +1,5 @@ #import "GPUImageTwoPassFilter.h" -extern NSString *const kGPUImageSobelEdgeDetectionVertexShaderString; - @interface GPUImageSobelEdgeDetectionFilter : GPUImageTwoPassFilter { GLint imageWidthFactorUniform, imageHeightFactorUniform; diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 500c983d8..7badc8327 100644 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -1,49 +1,6 @@ #import "GPUImageSobelEdgeDetectionFilter.h" #import "GPUImageGrayscaleFilter.h" - -// Override vertex shader to remove dependent texture reads -NSString *const kGPUImageSobelEdgeDetectionVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec4 inputTextureCoordinate; - - uniform highp float imageWidthFactor; - uniform highp float imageHeightFactor; - - varying vec2 textureCoordinate; - varying vec2 leftTextureCoordinate; - varying vec2 rightTextureCoordinate; - - varying vec2 topTextureCoordinate; - varying vec2 topLeftTextureCoordinate; - varying vec2 topRightTextureCoordinate; - - varying vec2 bottomTextureCoordinate; - varying vec2 bottomLeftTextureCoordinate; - varying vec2 bottomRightTextureCoordinate; - - void main() - { - gl_Position = position; - - vec2 widthStep = vec2(imageWidthFactor, 0.0); - vec2 heightStep = vec2(0.0, imageHeightFactor); - vec2 widthHeightStep = vec2(imageWidthFactor, imageHeightFactor); - vec2 widthNegativeHeightStep = vec2(imageWidthFactor, -imageHeightFactor); - - textureCoordinate = inputTextureCoordinate.xy; - leftTextureCoordinate = inputTextureCoordinate.xy - widthStep; - rightTextureCoordinate = inputTextureCoordinate.xy + widthStep; - - topTextureCoordinate = inputTextureCoordinate.xy + heightStep; - topLeftTextureCoordinate = inputTextureCoordinate.xy - widthNegativeHeightStep; - topRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep; - - bottomTextureCoordinate = inputTextureCoordinate.xy - heightStep; - bottomLeftTextureCoordinate = inputTextureCoordinate.xy - widthHeightStep; - bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthNegativeHeightStep; -} -); +#import "GPUImage3x3ConvolutionFilter.h" // Code from "Graphics Shaders: Theory and Practice" by M. Bailey and S. Cunningham NSString *const kGPUImageSobelEdgeDetectionFragmentShaderString = SHADER_STRING @@ -107,7 +64,7 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; { // Do a luminance pass first to reduce the calculations performed at each fragment in the edge detection phase - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageVertexShaderString firstStageFragmentShaderFromString:kGPUImageLuminanceFragmentShaderString secondStageVertexShaderFromString:kGPUImageSobelEdgeDetectionVertexShaderString secondStageFragmentShaderFromString:fragmentShaderString])) + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageVertexShaderString firstStageFragmentShaderFromString:kGPUImageLuminanceFragmentShaderString secondStageVertexShaderFromString:kGPUImageNearbyTexelSamplingVertexShaderString secondStageFragmentShaderFromString:fragmentShaderString])) { return nil; } diff --git a/framework/Source/GPUImageToonFilter.m b/framework/Source/GPUImageToonFilter.m index 3208cd49a..dcaf54bd2 100644 --- a/framework/Source/GPUImageToonFilter.m +++ b/framework/Source/GPUImageToonFilter.m @@ -1,5 +1,6 @@ #import "GPUImageToonFilter.h" #import "GPUImageSobelEdgeDetectionFilter.h" +#import "GPUImage3x3ConvolutionFilter.h" // Code from "Graphics Shaders: Theory and Practice" by M. Bailey and S. Cunningham NSString *const kGPUImageToonFragmentShaderString = SHADER_STRING @@ -77,7 +78,7 @@ @implementation GPUImageToonFilter - (id)init; { - if (!(self = [super initWithVertexShaderFromString:kGPUImageSobelEdgeDetectionVertexShaderString fragmentShaderFromString:kGPUImageToonFragmentShaderString])) + if (!(self = [super initWithVertexShaderFromString:kGPUImageNearbyTexelSamplingVertexShaderString fragmentShaderFromString:kGPUImageToonFragmentShaderString])) { return nil; } From 5917d97259af7a02793e90dfa82d8d22a652f0c2 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 17 Apr 2012 16:59:18 -0500 Subject: [PATCH 018/695] Added a Canny edge detection filter. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 13 +++ framework/GPUImage.xcodeproj/project.pbxproj | 16 ++++ framework/Source/GPUImage.h | 2 + .../Source/GPUImageCannyEdgeDetectionFilter.h | 22 +++++ .../Source/GPUImageCannyEdgeDetectionFilter.m | 82 +++++++++++++++++++ .../Source/GPUImageThresholdEdgeDetection.h | 11 +++ .../Source/GPUImageThresholdEdgeDetection.m | 79 ++++++++++++++++++ 9 files changed, 227 insertions(+) create mode 100644 framework/Source/GPUImageCannyEdgeDetectionFilter.h create mode 100644 framework/Source/GPUImageCannyEdgeDetectionFilter.m create mode 100644 framework/Source/GPUImageThresholdEdgeDetection.h create mode 100644 framework/Source/GPUImageThresholdEdgeDetection.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 0fa5d851b..1b0392712 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -81,6 +81,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_POLARPIXELLATE: cell.textLabel.text = @"Polar pixellate"; break; case GPUIMAGE_CROSSHATCH: cell.textLabel.text = @"Crosshatch"; break; case GPUIMAGE_SOBELEDGEDETECTION: cell.textLabel.text = @"Sobel edge detection"; break; + case GPUIMAGE_CANNYEDGEDETECTION: cell.textLabel.text = @"Canny edge detection"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; case GPUIMAGE_TILTSHIFT: cell.textLabel.text = @"Tilt shift"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index a3423b395..fe1b9e430 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -22,6 +22,7 @@ typedef enum { GPUIMAGE_POLARPIXELLATE, GPUIMAGE_CROSSHATCH, GPUIMAGE_SOBELEDGEDETECTION, + GPUIMAGE_CANNYEDGEDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_TILTSHIFT, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 5ea684e43..be9c80daf 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -265,6 +265,18 @@ - (void)setupFilter; filter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; }; break; + case GPUIMAGE_CANNYEDGEDETECTION: + { + self.title = @"Canny Edge Detection"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:2.0]; + [self.filterSettingsSlider setValue:1.0]; + + filter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; + }; break; + case GPUIMAGE_SKETCH: { self.title = @"Sketch"; @@ -634,6 +646,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)filter setRadius:round([(UISlider *)sender value])]; break; case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)filter setAngle:[(UISlider *)sender value]]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)filter setIntensity:[(UISlider *)sender value]]; break; + case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 42d2f6f9b..0b81b80b5 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -154,6 +154,10 @@ BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */; }; BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; }; BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */; }; + BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; }; + BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */; }; + BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */; }; + BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -317,6 +321,10 @@ BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3ConvolutionFilter.m; path = Source/GPUImage3x3ConvolutionFilter.m; sourceTree = SOURCE_ROOT; }; BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageEmbossFilter.h; path = Source/GPUImageEmbossFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageEmbossFilter.m; path = Source/GPUImageEmbossFilter.m; sourceTree = SOURCE_ROOT; }; + BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCannyEdgeDetectionFilter.h; path = Source/GPUImageCannyEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCannyEdgeDetectionFilter.m; path = Source/GPUImageCannyEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdEdgeDetection.h; path = Source/GPUImageThresholdEdgeDetection.h; sourceTree = SOURCE_ROOT; }; + BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetection.m; path = Source/GPUImageThresholdEdgeDetection.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -431,8 +439,12 @@ BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */, BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */, BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */, + BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */, + BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */, BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */, BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */, + BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */, + BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */, BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */, BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */, BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */, @@ -690,6 +702,8 @@ BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */, BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */, BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */, + BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */, + BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -858,6 +872,8 @@ BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */, BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */, BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */, + BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */, + BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 7f5c2afda..79264a66c 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -67,3 +67,5 @@ #import "GPUImageTiltShiftFilter.h" #import "GPUImage3x3ConvolutionFilter.h" #import "GPUImageEmbossFilter.h" +#import "GPUImageCannyEdgeDetectionFilter.h" +#import "GPUImageThresholdEdgeDetection.h" diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h new file mode 100644 index 000000000..661c6870c --- /dev/null +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.h @@ -0,0 +1,22 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageGaussianBlurFilter; +@class GPUImageThresholdEdgeDetection; + +@interface GPUImageCannyEdgeDetectionFilter : GPUImageFilterGroup +{ + GPUImageGaussianBlurFilter *blurFilter; + GPUImageThresholdEdgeDetection *edgeDetectionFilter; +} + +// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels +@property(readwrite, nonatomic) CGFloat imageWidthFactor; +@property(readwrite, nonatomic) CGFloat imageHeightFactor; + +// A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 +@property (readwrite, nonatomic) CGFloat blurSize; + +// Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.5 as the default +@property(readwrite, nonatomic) CGFloat threshold; + +@end diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.m b/framework/Source/GPUImageCannyEdgeDetectionFilter.m new file mode 100644 index 000000000..9288f1a0b --- /dev/null +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.m @@ -0,0 +1,82 @@ +#import "GPUImageCannyEdgeDetectionFilter.h" +#import "GPUImageGaussianBlurFilter.h" +#import "GPUImageThresholdEdgeDetection.h" + +@implementation GPUImageCannyEdgeDetectionFilter + +@synthesize threshold; +@synthesize blurSize; +@synthesize imageWidthFactor; +@synthesize imageHeightFactor; + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: apply a variable Gaussian blur + blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; + [self addFilter:blurFilter]; + + // Second pass: run the Sobel edge detection on this blurred image + edgeDetectionFilter = [[GPUImageThresholdEdgeDetection alloc] init]; + [self addFilter:edgeDetectionFilter]; + + // Texture location 0 needs to be the sharp image for both the blur and the second stage processing + [blurFilter addTarget:edgeDetectionFilter]; + + self.initialFilters = [NSArray arrayWithObject:blurFilter]; + self.terminalFilter = edgeDetectionFilter; + + self.blurSize = 1.0; + self.threshold = 0.9; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setBlurSize:(CGFloat)newValue; +{ + blurFilter.blurSize = newValue; +} + +- (CGFloat)blurSize; +{ + return blurFilter.blurSize; +} + +- (void)setImageWidthFactor:(CGFloat)newValue; +{ + edgeDetectionFilter.imageWidthFactor = newValue; +} + +- (CGFloat)imageWidthFactor; +{ + return edgeDetectionFilter.imageWidthFactor; +} + +- (void)setImageHeightFactor:(CGFloat)newValue; +{ + edgeDetectionFilter.imageHeightFactor = newValue; +} + +- (CGFloat)imageHeightFactor; +{ + return edgeDetectionFilter.imageHeightFactor; +} + +- (void)setThreshold:(CGFloat)newValue; +{ + edgeDetectionFilter.threshold = newValue; +} + +- (CGFloat)threshold; +{ + return edgeDetectionFilter.threshold; +} + +@end diff --git a/framework/Source/GPUImageThresholdEdgeDetection.h b/framework/Source/GPUImageThresholdEdgeDetection.h new file mode 100644 index 000000000..ebadca7d9 --- /dev/null +++ b/framework/Source/GPUImageThresholdEdgeDetection.h @@ -0,0 +1,11 @@ +#import "GPUImageSobelEdgeDetectionFilter.h" + +@interface GPUImageThresholdEdgeDetection : GPUImageSobelEdgeDetectionFilter +{ + GLint thresholdUniform; +} + +// Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.8 as the default +@property(readwrite, nonatomic) CGFloat threshold; + +@end diff --git a/framework/Source/GPUImageThresholdEdgeDetection.m b/framework/Source/GPUImageThresholdEdgeDetection.m new file mode 100644 index 000000000..94596ca01 --- /dev/null +++ b/framework/Source/GPUImageThresholdEdgeDetection.m @@ -0,0 +1,79 @@ +#import "GPUImageThresholdEdgeDetection.h" + +@implementation GPUImageThresholdEdgeDetection + +// Invert the colorspace for a sketch +NSString *const kGPUImageThresholdEdgeDetectionFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + uniform lowp float threshold; + + const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + float i00 = texture2D(inputImageTexture, textureCoordinate).r; + float im1m1 = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float ip1p1 = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float im1p1 = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float ip1m1 = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float im10 = texture2D(inputImageTexture, leftTextureCoordinate).r; + float ip10 = texture2D(inputImageTexture, rightTextureCoordinate).r; + float i0m1 = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float i0p1 = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -im1p1 - 2.0 * i0p1 - ip1p1 + im1m1 + 2.0 * i0m1 + ip1m1; + float v = -im1m1 - 2.0 * im10 - im1p1 + ip1m1 + 2.0 * ip10 + ip1p1; + + float mag = 1.0 - length(vec2(h, v)); + mag = step(threshold, mag); + + gl_FragColor = vec4(vec3(mag), 1.0); + } + ); + +#pragma mark - +#pragma mark Initialization and teardown + +@synthesize threshold = _threshold; + + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImageThresholdEdgeDetectionFragmentShaderString])) + { + return nil; + } + + thresholdUniform = [secondFilterProgram uniformIndex:@"threshold"]; + self.threshold = 0.9; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setThreshold:(CGFloat)newValue; +{ + _threshold = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [secondFilterProgram use]; + glUniform1f(thresholdUniform, _threshold); +} + +@end From 48b2936ea1265aebce9283c995da53031f045e67 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 18 Apr 2012 11:18:57 -0500 Subject: [PATCH 019/695] Added a smoother toon filter. --- README.md | 15 +++ .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 +++ .../SimpleVideoFilterViewController.m | 2 +- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageSmoothToonFilter.h | 25 +++++ framework/Source/GPUImageSmoothToonFilter.m | 94 +++++++++++++++++++ framework/Source/GPUImageToonFilter.h | 7 ++ framework/Source/GPUImageToonFilter.m | 32 ++++++- 11 files changed, 193 insertions(+), 5 deletions(-) create mode 100644 framework/Source/GPUImageSmoothToonFilter.h create mode 100644 framework/Source/GPUImageSmoothToonFilter.m diff --git a/README.md b/README.md index 89189e231..a9cd61a4e 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,12 @@ For example, an application that takes in live video from the camera, converts t - *imageWidthFactor*: - *imageHeightFactor*: These parameters affect the visibility of the detected edges +- **GPUImageCannyEdgeDetectionFilter**: This uses a Gaussian blur before applying a Sobel operator to highlight edges + - *imageWidthFactor*: + - *imageHeightFactor*: These parameters affect the visibility of the detected edges + - *blurSize*: A multiplier for the prepass blur size, ranging from 0.0 on up, with a default of 1.0 + - *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.5 as the default + - **GPUImageSketchFilter**: Converts video to look like a sketch. This is just the Sobel edge detection filter with the colors inverted - *intensity*: The degree to which the original image colors are replaced by the detected edges (0.0 - 1.0, with 1.0 as the default) - *imageWidthFactor*: @@ -177,6 +183,15 @@ For example, an application that takes in live video from the camera, converts t - **GPUImageToonFilter**: This uses Sobel edge detection to place a black border around objects, and then it quantizes the colors present in the image to give a cartoon-like quality to the image. - *imageWidthFactor*: - *imageHeightFactor*: These parameters affect the visibility of the detected edges + - *threshold*: The sensitivity of the edge detection, with lower values being more sensitive. Ranges from 0.0 to 1.0, with 0.2 as the default + - *quantizationLevels*: The number of color levels to represent in the final image. Default is 10.0 + +- **GPUImageSmoothToonFilter**: This uses a similar process as the GPUImageToonFilter, only it precedes the toon effect with a Gaussian blur to smooth out noise. + - *imageWidthFactor*: + - *imageHeightFactor*: These parameters affect the visibility of the detected edges + - *blurSize*: A multiplier for the prepass blur size, ranging from 0.0 on up, with a default of 0.5 + - *threshold*: The sensitivity of the edge detection, with lower values being more sensitive. Ranges from 0.0 to 1.0, with 0.2 as the default + - *quantizationLevels*: The number of color levels to represent in the final image. Default is 10.0 - **GPUImagePosterizeFilter**: This reduces the color dynamic range into the number of steps specified, leading to a cartoon-like simple shading of the image. - *colorLevels*: The number of color levels to reduce the image space to. This ranges from 1 to 256, with a default of 10. diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 1b0392712..04ed4670c 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -84,6 +84,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_CANNYEDGEDETECTION: cell.textLabel.text = @"Canny edge detection"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; + case GPUIMAGE_SMOOTHTOON: cell.textLabel.text = @"Smooth toon"; break; case GPUIMAGE_TILTSHIFT: cell.textLabel.text = @"Tilt shift"; break; case GPUIMAGE_CGA: cell.textLabel.text = @"CGA colorspace"; break; case GPUIMAGE_CONVOLUTION: cell.textLabel.text = @"3x3 convolution"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index fe1b9e430..c52fcd188 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -25,6 +25,7 @@ typedef enum { GPUIMAGE_CANNYEDGEDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, + GPUIMAGE_SMOOTHTOON, GPUIMAGE_TILTSHIFT, GPUIMAGE_CGA, GPUIMAGE_POSTERIZE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index be9c80daf..0a8cb69f7 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -291,6 +291,17 @@ - (void)setupFilter; filter = [[GPUImageToonFilter alloc] init]; }; break; + case GPUIMAGE_SMOOTHTOON: + { + self.title = @"Smooth Toon"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImageSmoothToonFilter alloc] init]; + }; break; case GPUIMAGE_TILTSHIFT: { self.title = @"Tilt Shift"; @@ -647,6 +658,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)filter setAngle:[(UISlider *)sender value]]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 02ae4800b..a082c044b 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -33,7 +33,7 @@ - (void)viewDidLoad // [(GPUImageTiltShiftFilter *)filter setFocusFallOffRate:0.2]; // filter = [[GPUImageSketchFilter alloc] init]; -// filter = [[GPUImageUnsharpMaskFilter alloc] init]; +// filter = [[GPUImageSmoothToonFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [videoCamera addTarget:rotationFilter]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 0b81b80b5..df659dbc3 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -158,6 +158,8 @@ BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */; }; BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */; }; BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */; }; + BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; + BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -325,6 +327,8 @@ BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCannyEdgeDetectionFilter.m; path = Source/GPUImageCannyEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdEdgeDetection.h; path = Source/GPUImageThresholdEdgeDetection.h; sourceTree = SOURCE_ROOT; }; BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetection.m; path = Source/GPUImageThresholdEdgeDetection.m; sourceTree = SOURCE_ROOT; }; + BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSmoothToonFilter.h; path = Source/GPUImageSmoothToonFilter.h; sourceTree = SOURCE_ROOT; }; + BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -447,6 +451,8 @@ BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */, BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */, BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */, + BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */, + BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */, BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */, BCC1E67B152368840006EFA5 /* GPUImageCGAColorspaceFilter.m */, BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */, @@ -704,6 +710,7 @@ BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */, BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */, BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */, + BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -874,6 +881,7 @@ BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */, BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */, BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */, + BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 79264a66c..948c14e62 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -30,6 +30,7 @@ #import "GPUImageSobelEdgeDetectionFilter.h" #import "GPUImageSketchFilter.h" #import "GPUImageToonFilter.h" +#import "GPUImageSmoothToonFilter.h" #import "GPUImageMultiplyBlendFilter.h" #import "GPUImageDissolveBlendFilter.h" #import "GPUImageKuwaharaFilter.h" diff --git a/framework/Source/GPUImageSmoothToonFilter.h b/framework/Source/GPUImageSmoothToonFilter.h new file mode 100644 index 000000000..885078c01 --- /dev/null +++ b/framework/Source/GPUImageSmoothToonFilter.h @@ -0,0 +1,25 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageGaussianBlurFilter; +@class GPUImageToonFilter; + +@interface GPUImageSmoothToonFilter : GPUImageFilterGroup +{ + GPUImageGaussianBlurFilter *blurFilter; + GPUImageToonFilter *toonFilter; +} + +// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels +@property(readwrite, nonatomic) CGFloat imageWidthFactor; +@property(readwrite, nonatomic) CGFloat imageHeightFactor; + +// A multiplier for the blur size, ranging from 0.0 on up, with a default of 0.5 +@property (readwrite, nonatomic) CGFloat blurSize; + +// The threshold at which to apply the edges, default of 0.2 +@property(readwrite, nonatomic) CGFloat threshold; + +// The levels of quantization for the posterization of colors within the scene, with a default of 10.0 +@property(readwrite, nonatomic) CGFloat quantizationLevels; + +@end diff --git a/framework/Source/GPUImageSmoothToonFilter.m b/framework/Source/GPUImageSmoothToonFilter.m new file mode 100644 index 000000000..0188f40fe --- /dev/null +++ b/framework/Source/GPUImageSmoothToonFilter.m @@ -0,0 +1,94 @@ +#import "GPUImageSmoothToonFilter.h" +#import "GPUImageGaussianBlurFilter.h" +#import "GPUImageToonFilter.h" + +@implementation GPUImageSmoothToonFilter + +@synthesize threshold; +@synthesize blurSize; +@synthesize quantizationLevels; +@synthesize imageWidthFactor; +@synthesize imageHeightFactor; + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: apply a variable Gaussian blur + blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; + [self addFilter:blurFilter]; + + // Second pass: run the Sobel edge detection on this blurred image, along with a posterization effect + toonFilter = [[GPUImageToonFilter alloc] init]; + [self addFilter:toonFilter]; + + // Texture location 0 needs to be the sharp image for both the blur and the second stage processing + [blurFilter addTarget:toonFilter]; + + self.initialFilters = [NSArray arrayWithObject:blurFilter]; + self.terminalFilter = toonFilter; + + self.blurSize = 0.5; + self.threshold = 0.2; + self.quantizationLevels = 10.0; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setBlurSize:(CGFloat)newValue; +{ + blurFilter.blurSize = newValue; +} + +- (CGFloat)blurSize; +{ + return blurFilter.blurSize; +} + +- (void)setImageWidthFactor:(CGFloat)newValue; +{ + toonFilter.imageWidthFactor = newValue; +} + +- (CGFloat)imageWidthFactor; +{ + return toonFilter.imageWidthFactor; +} + +- (void)setImageHeightFactor:(CGFloat)newValue; +{ + toonFilter.imageHeightFactor = newValue; +} + +- (CGFloat)imageHeightFactor; +{ + return toonFilter.imageHeightFactor; +} + +- (void)setThreshold:(CGFloat)newValue; +{ + toonFilter.threshold = newValue; +} + +- (CGFloat)threshold; +{ + return toonFilter.threshold; +} + +- (void)setQuantizationLevels:(CGFloat)newValue; +{ + toonFilter.quantizationLevels = newValue; +} + +- (CGFloat)quantizationLevels; +{ + return toonFilter.quantizationLevels; +} + +@end diff --git a/framework/Source/GPUImageToonFilter.h b/framework/Source/GPUImageToonFilter.h index 66459863f..d9502ece4 100644 --- a/framework/Source/GPUImageToonFilter.h +++ b/framework/Source/GPUImageToonFilter.h @@ -3,6 +3,7 @@ @interface GPUImageToonFilter : GPUImageFilter { GLint imageWidthFactorUniform, imageHeightFactorUniform; + GLint thresholdUniform, quantizationLevelsUniform; BOOL hasOverriddenImageSizeFactor; } @@ -10,4 +11,10 @@ @property(readwrite, nonatomic) CGFloat imageWidthFactor; @property(readwrite, nonatomic) CGFloat imageHeightFactor; +// The threshold at which to apply the edges, default of 0.2 +@property(readwrite, nonatomic) CGFloat threshold; + +// The levels of quantization for the posterization of colors within the scene, with a default of 10.0 +@property(readwrite, nonatomic) CGFloat quantizationLevels; + @end diff --git a/framework/Source/GPUImageToonFilter.m b/framework/Source/GPUImageToonFilter.m index dcaf54bd2..eb762860c 100644 --- a/framework/Source/GPUImageToonFilter.m +++ b/framework/Source/GPUImageToonFilter.m @@ -22,12 +22,11 @@ uniform sampler2D inputImageTexture; uniform highp float intensity; + uniform highp float threshold; + uniform highp float quantizationLevels; const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); - const highp float threshold = 0.2; - const highp float quantize = 10.0; - void main() { vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); @@ -46,7 +45,7 @@ void main() float mag = length(vec2(h, v)); - vec3 posterizedImageColor = floor((textureColor.rgb * quantize) + 0.5) / quantize; + vec3 posterizedImageColor = floor((textureColor.rgb * quantizationLevels) + 0.5) / quantizationLevels; float thresholdTest = 1.0 - step(threshold, mag); @@ -72,6 +71,8 @@ @implementation GPUImageToonFilter @synthesize imageWidthFactor = _imageWidthFactor; @synthesize imageHeightFactor = _imageHeightFactor; +@synthesize threshold = _threshold; +@synthesize quantizationLevels = _quantizationLevels; #pragma mark - #pragma mark Initialization and teardown @@ -87,7 +88,12 @@ - (id)init; imageWidthFactorUniform = [filterProgram uniformIndex:@"imageWidthFactor"]; imageHeightFactorUniform = [filterProgram uniformIndex:@"imageHeightFactor"]; + thresholdUniform = [filterProgram uniformIndex:@"threshold"]; + quantizationLevelsUniform = [filterProgram uniformIndex:@"quantizationLevels"]; + self.threshold = 0.2; + self.quantizationLevels = 10.0; + return self; } @@ -128,6 +134,24 @@ - (void)setImageHeightFactor:(CGFloat)newValue; glUniform1f(imageHeightFactorUniform, 1.0 / _imageHeightFactor); } +- (void)setThreshold:(CGFloat)newValue; +{ + _threshold = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(thresholdUniform, _threshold); +} + +- (void)setQuantizationLevels:(CGFloat)newValue; +{ + _quantizationLevels = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(quantizationLevelsUniform, _quantizationLevels); +} + @end From 68967586dc3bfd9459d37853a1b7e457c86b549a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 18 Apr 2012 16:10:43 -0500 Subject: [PATCH 020/695] Updated the CubeExample to show how to use a share group to couple with GPUImage's OpenGL ES context. --- examples/CubeExample/Classes/ES2Renderer.m | 61 ++----------------- .../SimpleImageViewController.m | 7 ++- 2 files changed, 11 insertions(+), 57 deletions(-) diff --git a/examples/CubeExample/Classes/ES2Renderer.m b/examples/CubeExample/Classes/ES2Renderer.m index e453832ba..f06dd3e11 100644 --- a/examples/CubeExample/Classes/ES2Renderer.m +++ b/examples/CubeExample/Classes/ES2Renderer.m @@ -1,9 +1,5 @@ #import "ES2Renderer.h" -#define DRAWTEXTURE 1 - -//#define MSAA 1 - // uniform index enum { UNIFORM_MODELVIEWMATRIX, @@ -35,8 +31,8 @@ - (id)initWithSize:(CGSize)newSize; { if ((self = [super init])) { -// context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; - context = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context]; + // Need to use a share group based on the GPUImage context to share textures with the 3-D scene + context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:[[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context] sharegroup]]; if (!context || ![EAGLContext setCurrentContext:context] || ![self loadShaders]) { @@ -76,7 +72,6 @@ - (id)initWithSize:(CGSize)newSize; videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; -// inputFilter = [[GPUImagePixellateFilter alloc] init]; inputFilter = [[GPUImageSepiaFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; textureOutput = [[GPUImageTextureOutput alloc] init]; @@ -197,8 +192,6 @@ - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotatio }; - // This application only creates a single context which is already set current at this point. - // This call is redundant, but needed if dealing with multiple contexts. [EAGLContext setCurrentContext:context]; glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); @@ -206,22 +199,14 @@ - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotatio glEnable(GL_CULL_FACE); glCullFace(GL_BACK); - // This application only creates a single default framebuffer which is already bound at this point. - // This call is redundant, but needed if dealing with multiple framebuffers. - - - glViewport(0, 0, backingWidth, backingHeight); -// glClearColor(0.5f, 0.5f, 0.5f, 1.0f); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - // Use shader program glUseProgram(program); // Perform incremental rotation based on current angles in X and Y - if ((xRotation != 0.0) || (yRotation != 0.0)) { GLfloat totalRotation = sqrt(xRotation*xRotation + yRotation*yRotation); @@ -236,35 +221,18 @@ - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotatio else { } -// GLfloat totalRotation = sqrt(xRotation*xRotation + yRotation*yRotation); - - -// -// CATransform3D temporaryMatrix = CATransform3DRotate(currentCalculatedMatrix, totalRotation * M_PI / 180.0, -// ((xRotation/totalRotation) * currentCalculatedMatrix.m12 + (yRotation/totalRotation) * currentCalculatedMatrix.m11), -// ((xRotation/totalRotation) * currentCalculatedMatrix.m22 + (yRotation/totalRotation) * currentCalculatedMatrix.m21), -// ((xRotation/totalRotation) * currentCalculatedMatrix.m32 + (yRotation/totalRotation) * currentCalculatedMatrix.m31)); -// if ((temporaryMatrix.m11 >= -100.0) && (temporaryMatrix.m11 <= 100.0)) -// { -// currentCalculatedMatrix = temporaryMatrix; -// } GLfloat currentModelViewMatrix[16]; [self convert3DTransform:¤tCalculatedMatrix toMatrix:currentModelViewMatrix]; - -#ifdef DRAWTEXTURE - glEnable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE4); - + glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, textureForCubeFace); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -#endif // Update uniform value glUniform1i(uniforms[UNIFORM_TEXTURE], 4); @@ -276,31 +244,12 @@ - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotatio glVertexAttribPointer(ATTRIB_TEXTUREPOSITION, 2, GL_FLOAT, 0, 0, cubeTexCoords); glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITION); - // Validate program before drawing. This is a good check, but only really necessary in a debug build. - // DEBUG macro must be defined in your debug configurations if that's not already the case. -#if defined(DEBUG) - if (![self validateProgram:program]) - { - NSLog(@"Failed to validate program: %d", program); - return; - } -#endif - - glDrawArrays(GL_TRIANGLES, 0, 36); - // Draw -// glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_SHORT, cubeIndices); -// glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, cubeIndices); - - // This application only creates a single color renderbuffer which is already bound at this point. - // This call is redundant, but needed if dealing with multiple renderbuffers. + // The flush is required at the end here to make sure the FBO texture is written to before passing it back to GPUImage + glFlush(); newFrameAvailableBlock(); - -// glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); -// -// [context presentRenderbuffer:GL_RENDERBUFFER]; } - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index b19b61a31..6b7829ee2 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -62,6 +62,10 @@ - (void)setupImageFilteringToDisk; GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; + GPUImageVignetteFilter *vignetteImageFilter = [[GPUImageVignetteFilter alloc] init]; + vignetteImageFilter.x = 0.6; + vignetteImageFilter.y = 0.4; + // GPUImageSketchFilter *stillImageFilter = [[GPUImageSketchFilter alloc] init]; // There's a problem with the Kuwahara filter where it doesn't finish rendering before the image is extracted from it. @@ -70,9 +74,10 @@ - (void)setupImageFilteringToDisk; // stillImageFilter.radius = 9; [stillImageSource addTarget:stillImageFilter]; + [stillImageFilter addTarget:vignetteImageFilter]; [stillImageSource processImage]; - UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentlyProcessedOutput]; + UIImage *currentFilteredVideoFrame = [vignetteImageFilter imageFromCurrentlyProcessedOutput]; // Do a simpler image filtering // GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; From e526fe4a67e1cb82232e76c4c4bdf001d3162b85 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Thu, 19 Apr 2012 20:19:47 -0400 Subject: [PATCH 021/695] Added subtract blend filter --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 2 +- .../ShowcaseFilterViewController.m | 7 ++++ framework/GPUImage.xcodeproj/project.pbxproj | 32 ++++++++++++------- framework/Source/GPUImage.h | 1 + .../Source/GPUImageSubtractBlendFilter.h | 5 +++ .../Source/GPUImageSubtractBlendFilter.m | 32 +++++++++++++++++++ 7 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 framework/Source/GPUImageSubtractBlendFilter.h create mode 100644 framework/Source/GPUImageSubtractBlendFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index d4439624a..49f35132a 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -85,6 +85,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_DARKEN: cell.textLabel.text = @"Darken blend"; break; case GPUIMAGE_EXCLUSIONBLEND: cell.textLabel.text = @"Exclusion blend"; break; case GPUIMAGE_DIFFERENCEBLEND: cell.textLabel.text = @"Difference blend"; break; + case GPUIMAGE_SUBTRACTBLEND: cell.textLabel.text = @"Subtract blend"; break; case GPUIMAGE_HARDLIGHTBLEND: cell.textLabel.text = @"Hard light blend"; break; case GPUIMAGE_SOFTLIGHTBLEND: cell.textLabel.text = @"Soft light blend"; break; case GPUIMAGE_KUWAHARA: cell.textLabel.text = @"Kuwahara"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 0904e6355..3fca841cb 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -1,7 +1,7 @@ #import #import "GPUImage.h" -typedef enum { GPUIMAGE_SATURATION, GPUIMAGE_CONTRAST, GPUIMAGE_BRIGHTNESS, GPUIMAGE_EXPOSURE, GPUIMAGE_SHARPEN, GPUIMAGE_CROP, GPUIMAGE_GAMMA, GPUIMAGE_SEPIA, GPUIMAGE_COLORINVERT, GPUIMAGE_PIXELLATE, GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_KUWAHARA, GPUIMAGE_VIGNETTE, GPUIMAGE_GAUSSIAN, GPUIMAGE_GAUSSIAN_SELECTIVE, GPUIMAGE_FASTBLUR, GPUIMAGE_SWIRL, GPUIMAGE_DISSOLVE, GPUIMAGE_MULTIPLY, GPUIMAGE_OVERLAY, GPUIMAGE_LIGHTEN, GPUIMAGE_DARKEN, GPUIMAGE_COLORBURN, GPUIMAGE_COLORDODGE, GPUIMAGE_SCREENBLEND, GPUIMAGE_DIFFERENCEBLEND, GPUIMAGE_EXCLUSIONBLEND, GPUIMAGE_HARDLIGHTBLEND, GPUIMAGE_SOFTLIGHTBLEND, GPUIMAGE_CUSTOM, GPUIMAGE_FILECONFIG, GPUIMAGE_NUMFILTERS} GPUImageShowcaseFilterType; +typedef enum { GPUIMAGE_SATURATION, GPUIMAGE_CONTRAST, GPUIMAGE_BRIGHTNESS, GPUIMAGE_EXPOSURE, GPUIMAGE_SHARPEN, GPUIMAGE_CROP, GPUIMAGE_GAMMA, GPUIMAGE_SEPIA, GPUIMAGE_COLORINVERT, GPUIMAGE_PIXELLATE, GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_KUWAHARA, GPUIMAGE_VIGNETTE, GPUIMAGE_GAUSSIAN, GPUIMAGE_GAUSSIAN_SELECTIVE, GPUIMAGE_FASTBLUR, GPUIMAGE_SWIRL, GPUIMAGE_DISSOLVE, GPUIMAGE_MULTIPLY, GPUIMAGE_OVERLAY, GPUIMAGE_LIGHTEN, GPUIMAGE_DARKEN, GPUIMAGE_COLORBURN, GPUIMAGE_COLORDODGE, GPUIMAGE_SCREENBLEND, GPUIMAGE_DIFFERENCEBLEND, GPUIMAGE_SUBTRACTBLEND, GPUIMAGE_EXCLUSIONBLEND, GPUIMAGE_HARDLIGHTBLEND, GPUIMAGE_SOFTLIGHTBLEND, GPUIMAGE_CUSTOM, GPUIMAGE_FILECONFIG, GPUIMAGE_NUMFILTERS} GPUImageShowcaseFilterType; @interface ShowcaseFilterViewController : UIViewController { diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index b90dba579..1d400eef8 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -266,6 +266,13 @@ - (void)setupFilter; self.filterSettingsSlider.hidden = YES; filter = [[GPUImageDifferenceBlendFilter alloc] init]; + }; break; + case GPUIMAGE_SUBTRACTBLEND: + { + self.title = @"Subtract Blend"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageSubtractBlendFilter alloc] init]; }; break; case GPUIMAGE_HARDLIGHTBLEND: { diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 4a566733f..97cda78d6 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; + 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; }; + 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; @@ -133,6 +135,8 @@ 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianSelectiveBlurFilter.m; path = Source/GPUImageGaussianSelectiveBlurFilter.m; sourceTree = SOURCE_ROOT; }; 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVignetteFilter.h; path = Source/GPUImageVignetteFilter.h; sourceTree = SOURCE_ROOT; }; 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVignetteFilter.m; path = Source/GPUImageVignetteFilter.m; sourceTree = SOURCE_ROOT; }; + 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSubtractBlendFilter.h; path = Source/GPUImageSubtractBlendFilter.h; sourceTree = SOURCE_ROOT; }; + 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSubtractBlendFilter.m; path = Source/GPUImageSubtractBlendFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; BC1B715514F49DAA00ACA2AB /* GPUImageRawData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawData.h; path = Source/GPUImageRawData.h; sourceTree = SOURCE_ROOT; }; @@ -298,30 +302,32 @@ BC1B715E14F4B04800ACA2AB /* Blends */ = { isa = PBXGroup; children = ( + BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */, + BCB6B85115041A920041703B /* GPUImageColorBurnBlendFilter.m */, + BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */, + BCB6B85315041A920041703B /* GPUImageColorDodgeBlendFilter.m */, + BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */, + BC982C7E14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.m */, BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */, BCB6B8691504234A0041703B /* GPUImageDifferenceBlendFilter.m */, + BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */, + BC982BE814F1CE600001FF6F /* GPUImageDissolveBlendFilter.m */, BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */, BCB6B86B1504234A0041703B /* GPUImageExclusionBlendFilter.m */, BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */, BCB6B86D1504234A0041703B /* GPUImageHardLightBlendFilter.m */, - BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */, - BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */, - BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */, - BC982BE814F1CE600001FF6F /* GPUImageDissolveBlendFilter.m */, + BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */, + BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */, BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */, BC982BEA14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m */, BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */, BC982C6D14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m */, - BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */, - BC982C7E14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.m */, - BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */, - BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */, - BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */, - BCB6B85115041A920041703B /* GPUImageColorBurnBlendFilter.m */, - BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */, - BCB6B85315041A920041703B /* GPUImageColorDodgeBlendFilter.m */, BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */, BCB6B85515041A920041703B /* GPUImageScreenBlendFilter.m */, + BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */, + BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */, + 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */, + 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */, ); name = Blends; sourceTree = ""; @@ -543,6 +549,7 @@ BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */, BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */, BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */, + 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -690,6 +697,7 @@ BCB6B8771504234A0041703B /* GPUImageSoftLightBlendFilter.m in Sources */, BCB6B8BC1505BF940041703B /* GPUImageTextureOutput.m in Sources */, BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */, + 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 6ac1f2560..784d20929 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -43,6 +43,7 @@ #import "GPUImageScreenBlendFilter.h" #import "GPUImageExclusionBlendFilter.h" #import "GPUImageDifferenceBlendFilter.h" +#import "GPUImageSubtractBlendFilter.h" #import "GPUImageHardLightBlendFilter.h" #import "GPUImageSoftLightBlendFilter.h" #import "GPUImageCropFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageSubtractBlendFilter.h b/framework/Source/GPUImageSubtractBlendFilter.h new file mode 100644 index 000000000..8b9628bff --- /dev/null +++ b/framework/Source/GPUImageSubtractBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageFilter.h" + +@interface GPUImageSubtractBlendFilter : GPUImageFilter + +@end diff --git a/framework/Source/GPUImageSubtractBlendFilter.m b/framework/Source/GPUImageSubtractBlendFilter.m new file mode 100644 index 000000000..3f35beed2 --- /dev/null +++ b/framework/Source/GPUImageSubtractBlendFilter.m @@ -0,0 +1,32 @@ +#import "GPUImageSubtractBlendFilter.h" + +NSString *const kGPUImageSubtractBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + + gl_FragColor = textureColor - textureColor2; + } + ); + +@implementation GPUImageSubtractBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageSubtractBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end + From 19d255f64e9a0c7edfcb7c477cd4a09b7ce82a0a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 19 Apr 2012 21:52:18 -0500 Subject: [PATCH 022/695] Added the ability to preserve the aspect ratio of video displayed in a GPUImageView via the new fillMode property. --- README.md | 12 +-- .../SimplePhotoFilter/PhotoViewController.m | 1 + .../SimpleVideoFilterViewController.m | 2 + framework/Source/GPUImageMovieWriter.m | 2 - framework/Source/GPUImageView.h | 13 +++ framework/Source/GPUImageView.m | 87 ++++++++++++++++--- 6 files changed, 96 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index a9cd61a4e..917d97ef3 100644 --- a/README.md +++ b/README.md @@ -265,6 +265,8 @@ To filter live video from an iOS device's camera, you can use code like the foll This sets up a video source coming from the iOS device's back-facing camera, using a preset that tries to capture at 640x480. A custom filter, using code from the file CustomShader.fsh, is then set as the target for the video frames from the camera. These filtered video frames are finally displayed onscreen with the help of a UIView subclass that can present the filtered OpenGL ES texture that results from this pipeline. +The fill mode of the GPUImageView can be altered by setting its fillMode property, so that if the aspect ratio of the source video is different from that of the view, the video will either be stretched, centered with black bars, or zoomed to fill. + For blending filters and others that take in more than one image, you can create multiple outputs and add a single filter as a target for both of these outputs. The order with which the outputs are added as targets will affect the order in which the input images are blended or otherwise processed. Also, if you wish to enable microphone audio capture for recording to a movie, you'll need to set the audioEncodingTarget of the camera to be your movie writer, like for the following: @@ -436,12 +438,4 @@ In other words, the path of this application is camera -> sepia tone filter -> c A version of my ColorTracking example from http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios ported across to use GPUImage, this application uses color in a scene to track objects from a live camera feed. The four views you can switch between include the raw camera feed, the camera feed with pixels matching the color threshold in white, the processed video where positions are encoded as colors within the pixels passing the threshold test, and finally the live video feed with a dot that tracks the selected color. Tapping the screen changes the color to track to match the color of the pixels under your finger. Tapping and dragging on the screen makes the color threshold more or less forgiving. This is most obvious on the second, color thresholding view. -Currently, all processing for the color averaging in the last step is done on the CPU, so this is part is extremely slow. - -## Things that need work ## - -- Images that exceed 2048 pixels wide or high currently can't be processed on devices older than the iPad 2 or iPhone 4S. -- Many common filters aren't built into the framework yet. -- Video capture and processing should be done on a background GCD serial queue. -- I'm sure that there are many optimizations that can be made on the rendering pipeline. -- The aspect ratio of the input video is not maintained, but stretched to fill the final image. +Currently, all processing for the color averaging in the last step is done on the CPU, so this is part is extremely slow. \ No newline at end of file diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index a22e28a71..879c74967 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -50,6 +50,7 @@ - (void)viewDidLoad stillCamera = [[GPUImageStillCamera alloc] init]; filter = [[GPUImageGammaFilter alloc] init]; +// filter = [[GPUImageSepiaFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [stillCamera addTarget:rotationFilter]; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index a082c044b..1681566f9 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -40,6 +40,8 @@ - (void)viewDidLoad [rotationFilter addTarget:filter]; GPUImageView *filterView = (GPUImageView *)self.view; [filter addTarget:filterView]; +// filterView.fillMode = kGPUImageFillModeStretch; +// filterView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill; // Record a movie for 10 s and store it in /Documents, visible via iTunes file sharing diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 9f55d2e66..59293dca1 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -129,9 +129,7 @@ - (void)initializeMovie; frameData = (GLubyte *) malloc((int)videoSize.width * (int)videoSize.height * 4); // frameData = (GLubyte *) calloc(videoSize.width * videoSize.height * 4, sizeof(GLubyte)); - NSError *error = nil; - // assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:AVFileTypeAppleM4V error:&error]; assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:AVFileTypeQuickTimeMovie error:&error]; if (error != nil) diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index fe1d181c5..bd136fe36 100644 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -1,10 +1,23 @@ #import #import "GPUImageOpenGLESContext.h" +typedef enum { + kGPUImageFillModeStretch, // Stretch to fill the full view, which may distort the image outside of its normal aspect ratio + kGPUImageFillModePreserveAspectRatio, // Maintains the aspect ratio of the source image, adding bars of the specified background color + kGPUImageFillModePreserveAspectRatioAndFill // Maintains the aspect ratio of the source image, zooming in on its center to fill the view +} GPUImageFillModeType; + @interface GPUImageView : UIView { } +// The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio +@property(readwrite, nonatomic) GPUImageFillModeType fillMode; + +// This calculates the current display size, in pixels, taking into account Retina scaling factors @property(readonly, nonatomic) CGSize sizeInPixels; +// Handling fill mode +- (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; + @end diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index f3c80b255..5c4dd4989 100644 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -3,6 +3,7 @@ #import #import "GPUImageOpenGLESContext.h" #import "GPUImageFilter.h" +#import #pragma mark - #pragma mark Private methods and instance variables @@ -15,6 +16,10 @@ @interface GPUImageView () GLProgram *displayProgram; GLint displayPositionAttribute, displayTextureCoordinateAttribute; GLint displayInputTextureUniform; + + CGSize inputImageSize; + GLfloat imageVertices[8]; + GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; } // Initialization and teardown @@ -24,11 +29,15 @@ - (void)commonInit; - (void)createDisplayFramebuffer; - (void)destroyDisplayFramebuffer; +// Handling fill mode +- (void)recalculateViewGeometry; + @end @implementation GPUImageView @synthesize sizeInPixels = _sizeInPixels; +@synthesize fillMode = _fillMode; #pragma mark - #pragma mark Initialization and teardown @@ -70,6 +79,9 @@ - (void)commonInit; self.contentScaleFactor = [[UIScreen mainScreen] scale]; } + [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; + self.fillMode = kGPUImageFillModePreserveAspectRatio; + CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; @@ -180,6 +192,58 @@ - (void)presentFramebuffer; [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] presentBufferForDisplay]; } +#pragma mark - +#pragma mark Handling fill mode + +- (void)recalculateViewGeometry; +{ + CGFloat heightScaling, widthScaling; + + CGSize currentViewSize = self.bounds.size; + +// CGFloat imageAspectRatio = inputImageSize.width / inputImageSize.height; +// CGFloat viewAspectRatio = currentViewSize.width / currentViewSize.height; + + CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(inputImageSize, self.bounds); + + switch(_fillMode) + { + case kGPUImageFillModeStretch: + { + widthScaling = 1.0; + heightScaling = 1.0; + }; break; + case kGPUImageFillModePreserveAspectRatio: + { + widthScaling = insetRect.size.width / currentViewSize.width; + heightScaling = insetRect.size.height / currentViewSize.height; + }; break; + case kGPUImageFillModePreserveAspectRatioAndFill: + { +// CGFloat widthHolder = insetRect.size.width / currentViewSize.width; + widthScaling = currentViewSize.height / insetRect.size.height; + heightScaling = currentViewSize.width / insetRect.size.width; + }; break; + } + + imageVertices[0] = -widthScaling; + imageVertices[1] = -heightScaling; + imageVertices[2] = widthScaling; + imageVertices[3] = -heightScaling; + imageVertices[4] = -widthScaling; + imageVertices[5] = heightScaling; + imageVertices[6] = widthScaling; + imageVertices[7] = heightScaling; +} + +- (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; +{ + backgroundColorRed = redComponent; + backgroundColorGreen = greenComponent; + backgroundColorBlue = blueComponent; + backgroundColorAlpha = alphaComponent; +} + #pragma mark - #pragma mark GPUInput protocol @@ -190,16 +254,9 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; [displayProgram use]; - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - static const GLfloat squareVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - static const GLfloat textureCoordinates[] = { 0.0f, 1.0f, 1.0f, 1.0f, @@ -211,7 +268,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); glUniform1i(displayInputTextureUniform, 4); - glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); + glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -231,9 +288,13 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (void)setInputSize:(CGSize)newSize; { + if (!CGSizeEqualToSize(inputImageSize, newSize)) + { + inputImageSize = newSize; + [self recalculateViewGeometry]; + } } - - (CGSize)maximumOutputSize; { if ([self respondsToSelector:@selector(setContentScaleFactor:)]) @@ -271,4 +332,10 @@ - (CGSize)sizeInPixels; } } +- (void)setFillMode:(GPUImageFillModeType)newValue; +{ + _fillMode = newValue; + [self recalculateViewGeometry]; +} + @end From fc0b70b6f91cf186cdd324a77f436504159eed78 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Thu, 19 Apr 2012 23:04:01 -0400 Subject: [PATCH 023/695] Added Mask filter --- .../FilterShowcase.xcodeproj/project.pbxproj | 4 ++ .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 27 ++++++++++-- .../FilterShowcase/FilterShowcase/mask.png | Bin 0 -> 969387 bytes framework/GPUImage.xcodeproj/project.pbxproj | 8 ++++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageFilter.m | 3 ++ framework/Source/GPUImageMaskFilter.h | 5 +++ framework/Source/GPUImageMaskFilter.m | 40 ++++++++++++++++++ 10 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 examples/FilterShowcase/FilterShowcase/mask.png create mode 100644 framework/Source/GPUImageMaskFilter.h create mode 100644 framework/Source/GPUImageMaskFilter.m diff --git a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index a121ce1b1..7e08f1c86 100644 --- a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 0D69488E1501F71900206FF8 /* SampleConfiguration.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D69488D1501F71900206FF8 /* SampleConfiguration.plist */; }; + 83AE9FD41540F3CC00F7FC13 /* mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 83AE9FD31540F3CC00F7FC13 /* mask.png */; }; BC982B0714F046AC0001FF6F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B0614F046AC0001FF6F /* UIKit.framework */; }; BC982B0914F046AC0001FF6F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B0814F046AC0001FF6F /* Foundation.framework */; }; BC982B0B14F046AC0001FF6F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B0A14F046AC0001FF6F /* CoreGraphics.framework */; }; @@ -53,6 +54,7 @@ /* Begin PBXFileReference section */ 0D69488D1501F71900206FF8 /* SampleConfiguration.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SampleConfiguration.plist; sourceTree = ""; }; + 83AE9FD31540F3CC00F7FC13 /* mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mask.png; sourceTree = ""; }; BC982B0214F046AC0001FF6F /* FilterShowcase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FilterShowcase.app; sourceTree = BUILT_PRODUCTS_DIR; }; BC982B0614F046AC0001FF6F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BC982B0814F046AC0001FF6F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -150,6 +152,7 @@ BC982B0D14F046AC0001FF6F /* Supporting Files */ = { isa = PBXGroup; children = ( + 83AE9FD31540F3CC00F7FC13 /* mask.png */, BC982BD014F1C0F00001FF6F /* WID-small.jpg */, BC982B0E14F046AC0001FF6F /* FilterShowcase-Info.plist */, BC982B0F14F046AC0001FF6F /* InfoPlist.strings */, @@ -250,6 +253,7 @@ BC982B3714F04B3A0001FF6F /* ShowcaseFilterViewController.xib in Resources */, BC982BD114F1C0F00001FF6F /* WID-small.jpg in Resources */, 0D69488E1501F71900206FF8 /* SampleConfiguration.plist in Resources */, + 83AE9FD41540F3CC00F7FC13 /* mask.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index fe1e44a7c..fb6065de3 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -74,6 +74,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_CROP: cell.textLabel.text = @"Crop"; break; case GPUIMAGE_TRANSFORM: cell.textLabel.text = @"Transform (2-D)"; break; case GPUIMAGE_TRANSFORM3D: cell.textLabel.text = @"Transform (3-D)"; break; + case GPUIMAGE_MASK: cell.textLabel.text = @"Mask"; break; case GPUIMAGE_COLORINVERT: cell.textLabel.text = @"Color invert"; break; case GPUIMAGE_GRAYSCALE: cell.textLabel.text = @"Grayscale"; break; case GPUIMAGE_SEPIA: cell.textLabel.text = @"Sepia tone"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 73698ef89..ff17fd043 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -11,6 +11,7 @@ typedef enum { GPUIMAGE_TRANSFORM, GPUIMAGE_TRANSFORM3D, GPUIMAGE_CROP, + GPUIMAGE_MASK, GPUIMAGE_GAMMA, GPUIMAGE_HAZE, GPUIMAGE_SEPIA, @@ -61,6 +62,7 @@ typedef enum { GPUIMAGE_NUMFILTERS } GPUImageShowcaseFilterType; + @interface ShowcaseFilterViewController : UIViewController { GPUImageVideoCamera *videoCamera; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index ca628cd7e..9da823640 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -227,6 +227,16 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:0.5]; filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 0.5, 0.5)]; + }; break; + case GPUIMAGE_MASK: + { + self.title = @"Mask"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageMaskFilter alloc] init]; + + [(GPUImageFilter*)filter setBackgroundColorRed:0.0 green:1.0 blue:0.0 alpha:1.0]; + }; break; case GPUIMAGE_TRANSFORM: { @@ -257,7 +267,7 @@ - (void)setupFilter; perspectiveTransform = CATransform3DRotate(perspectiveTransform, 0.75, 0.0, 1.0, 0.0); [(GPUImageTransformFilter *)filter setTransform3D:perspectiveTransform]; - }; break; + }; break; case GPUIMAGE_SOBELEDGEDETECTION: { self.title = @"Edge Detection"; @@ -625,8 +635,19 @@ - (void)setupFilter; if ( (filterType != GPUIMAGE_UNSHARPMASK) && (filterType != GPUIMAGE_TILTSHIFT) ) { - // The picture is only used for two-image blend filters - UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; + UIImage *inputImage; + + if (filterType == GPUIMAGE_MASK) + { + inputImage = [UIImage imageNamed:@"mask"]; + } + else + { + // The picture is only used for two-image blend filters + inputImage = [UIImage imageNamed:@"WID-small.jpg"]; + } + + sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; [sourcePicture addTarget:filter]; } diff --git a/examples/FilterShowcase/FilterShowcase/mask.png b/examples/FilterShowcase/FilterShowcase/mask.png new file mode 100644 index 0000000000000000000000000000000000000000..ac52698eb7c00075e6f1588e622a84ec9c457297 GIT binary patch literal 969387 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ð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ℑ{m}5u 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

v!{YoxZyI@*y*D+wOK$(;1L}bu7Q<&<*22 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

(#w z4Q2)d97T(`WxOYf?OgL0Rh{SVYO38V)xxm$LC-2Y(L|jl!jsXl520ukAV=OxSm2A{h@fgdD9n{T_1b*r9q%T%L;zT) zA2tArZW6XE!C)CBFKCF$4As?HNBv)?q4iK-e;W9G?#)5{egJ7dIkp}Lz$Lw^LfdqW zK}NIj@_wt6Bf_RQ@$K0(U5(JPdGY|QNl6XOs`>WC1noi{Z%}r-Ft;G>7u}8SHG#$( zlfqQWn8EC3E6!ZZg-{)y=-ZcSs`KkUAlt%Q!?VDG#TqRw$`-u~9jTec&_^LY`HH7x zUA}ZRas(A>UDN3Arq_U>-U{#cXH@KW$W>@!5P10WNAl)#XDYsYCK)hD9pA#halQ&m z4~r!p4{`%$=Qo2KeRBj&Fq)k8r3iF}sM)xo@ln7k;Mw&~A#4FG28c>JjmP6X^c$C2 zRK&(xN&vAXJXG?Z1Fm%s03c;AQ}H5Tmm+%1-TeTEF`yTO!cy7jh6D)|8Y%Fpuslk? zz~GnTn|?9ghP2EEjD#c!q9u#tt#K?Q-Dbd?Cd;ojro41Rd*j!oA7qB#{9Ru};IGP! z0FTU=ZLK|TzZBLk!d^2Yw>a)Dp`5fMbkT6KweX^poz=eNY~ibjBuX>nNcY6`Aw-K+ zrHLG#1Z$2c$a*q%L>M8Jp$?~tQS9ZoV94-Mf@uh+IoX-2FAM-HglE;|FUufBc@w9D z0mNaY`2jHQ?z^!zo)2Z>=C5rQ7E5l8b`=Z`^ds3%X7;Z;t^1%$1vuGW3-5?q7wc^!IRK`s2vQN!9zvJn8! zB8%Q^zpKWc_~^0%oPpR&(7wXH_~-7+8lfH8)2vJsBN@r%e6BIt@FRUJU^7dcC=s0N zZ~@`W(u4*GS8I;AkY?yFrOtAe=K+m5Fdj5k6j^bEgNr0-trrzm7K+4l_i}2chH|Y zuTI0U7U4|V`QQ(pHpb)$NgXJ;?-&rjXjmwkA{Zr~nqB zNJo5j8!QR2zzNL60FiW_<>b3a7QL*co8NR$Ek@J?#*;3`4kAfVm7?<|#HoR_?={hw zfd?Bhoq$1c_Oj=Oamq5T4Z(YxvX%KkVmPg^XKcQS@J5C6Bc6zXSCQ)GOlj84waHl` zDWqR2Tyz#Iiy2r>#VHJnf@Y;qn^~~rPuwft`=^Rf-hBQj7!v1Pp+{D$Fek`gV8B)r{lSY@bk%$c z*Tj%_sv8bW^A`;-YZtsMNpYNcIjQ)@TVk(!*IR{B+5{*yD!=M%J&|}!t39J(F33i1 zSgaaWcf+M-VU??7ql0=iwqR3%v^yEPx9dyI=($~fdk4jpI3T>W8NSe zhSd7?6z!CX{F@bei05Ws&FhU<&%;kNEXS0-X#oDDQq^cA-Ap5kDz1K>AHVjJ9W=cK z*|(j>=3%krxB%`64q*qm_?si|=@seXE-T3##KN)A)amD(=)CD$W+lH9H$o{^p@eV> zs+QF7>{6h7uSfD8VX0-YqM$q9rdA9N$FB;3v7fL*G<{}?i}#HOKA>LlphYBR&&v)l zBDMy|xc*Pzb)yf{YeUl6V_*M7T-gvJp)r9Z;RHMsMjSH zJKZGLq5Vr}8{VP(Lf zj|1zHGPg)fikip{g#G>GvtUD@f@b-Pr#HIyz+<)ILorHwlY0-R^~7+oYmNy4Cxd&y zn*i@n(99F7XanmwX54IjVoWP4v@8ZlF!S(0y(KJK-uECzWYIqdH!riV;0v&EK0mEO z=A7U7tj%B-E;yfUPIX zit*~6aJ+K;0hzyci>YSHaM{fo@6WFWHXd%Ak;fy40E^A)JbfFWcdO^X{&tz(s19AG zN-%%v53T`W3Dy|G_oe498alDs=^Z|Cl8wvF^W1-MT&FCrbSe+#ItWz%ZhMj9mqKl< z)%M3KyFz=4-8#09{;VNrEfzO;FUvP6Gt@&OE9uY}oalccC~{Ehr`9ldZ#?h?p9uB% zO%6VrOAD&!6&%H*V9jC`5~rGF1>tHER@m5Qkr!E~5)31z>{3eGb#Q5fJ2tHuzB?Ry z_uP*XfQX4VLFD*GP6w0!fiC`64xhEYgv3sEGrskfX6EHiL54h#aCpVq#)%sogOA{d zh86LC3^F)gy5b7dLk;;vfK$S0V|Y}TAY3bL{6MqCJa9}X|4TybTpS8yjC>m~mGSm$ zpYAbMDj6RzXO<5`9%wQEqY1DGH3v%hxu@>27n0#<*V;iyc!Zz@gucz*ffgPIPR{eGYF$at-?JbqNeiW}S z;waRwidKe?#G%Q3lbjK~e>+8ZbhfC;#@Jc}pSMEhbtRw-b>Rr>W^sJcZEarP-gy>Q zyWVZi*}5!&6C-=^7p7iT;u(6d$`?HS0qli?94Xt5EhTwC9%obqK>8Mrl&T01sfT*1 zvGKDccpRUh+lEtPXt*=F!rg)ct}1I>F?!!Pnm^HxXN|rbyLoFfBK@M`1DRx$AjF(W zue4;yCK^=r3oSoVNqldBl@6V5SCjuupI@hYAK7}pyi!_{%e@8ou8NMNXTfb^+ax5U zG8LM|%j1Zai{tf}^X6I%Nt}ge4BV!f zVHPCqpbV8$=~RIlum7Y1-C}Nogws&K0O{bS_HLLCv(Mq=E-~_~gQwO;$E^u9igzBS z5$tK1>EST*R3&wH(c|3dHnAHe7&@(RW371m(XDNZ-;)%Jk^_Ho&=(7>YPLw4|E%L@ z^=#wGcu^!HvoxQ!qTMcff(h$^>7CdEvx7caFzHp;@ymNEKe?k@p@fMNnkp#A2A;=FQUBygS; z2L02AHXg*|dhHrXtXGXR;?r=2TA(oD=B0XeUpYEy6A4HgNmg}r&40Q#VAY+}PE-%2 z?}Rs1!W3GSd2sTSg&_Tf_tgpr#=5F)`|GqWbpcq_bLeRqm;><^+nXJ=zIeB;ZP;&@u}y-+)r|2vi-&Oug#AAXb?R03+`&)84FzZJyrFcRnb5k;lT#$o2L zCPzH%gl;`S4~0Y2VpHGN_7VzY1wiX*vCZ$fGsy|;ngzBs$ZyO|Fu-~w0D}_NBdD~A ztJI1SXtKtQDD=7{#4y!nIPz=b)_V?n2@?m(C)SZi0phF2O}uTmUYQgBR3|stxJz}Z zLK%-_!^Pqz06HctdHWe!vT`l(&Ur?V@K4&j;iBn;R?y(&a}cHnmj>SJCWM%BrA&7f2o)B z26E)jov`I42F`T@Czx$!WJ@bs=T3i8%JYRDMJ!7BrSTHc-2vE$4_@J50;yI+{R*)u z#t66JaD^B@^{U=&8*7Ssd^Wey{U2#ZdW4{Tw*;BA+Ogbx{X%TH>@ ziYS2DscgPfmcek&l3s00u|T$Ld+qjNPpe@MM;+VIY6AmPdV{RoGZVD{o3!}LzBB54 z4t1kmUKWnPbRkPsXF}hZxEYNur9RFX%B++Ed#fj{2Iof%*uS{FV`7{oR~pGLDGwTy zsNt;Bdqhvp%w_bnk>N5(IHeTwH4X)RrB(;vE`BIGM|j`3O09({=hP}pzsCI#qxlQnwa~)XU0)Mxwt2Oo8*@rZc844w zR-h+*v8`+mDNGrnmit0Qc3224^KSO1A%?(K7~UG#+C9LK1$`Q+$c`RH9HJAL3B4P0 zqaAKy!f^t=c9#n_8&VAQYgy4H!;7U_!Gx7#ZSE|eE_?t0rvTF*WgRkZlX2@hKD*1V zEP_m{;0tE6Hotnmvha*Xn7B+vDaZ=g6IFAwa6to-rw$G00WX{Mx154x6(=KKh~%xt z3Jr@W$GkEiG=<717>LSZX~sopKa!IBrK@BzU^Lr`&z0!~N^kYpc_;OqT}C#sP3C02 zX&uJD*=NCb)`#fPfpvT}R0&-VS`((L%FXSsMVZGYPX%+hXTDKLgap3q#4!T@=HXG&3+!C~4+Armi2pwF|NQ|CKu#o4pjtNRc{z**4L~S=p?~~%mIReFllFs|6aq@3 z`QqcM^{B!H1Q~Gj-RM5bfmBwV<9?{dwU(%7pitV-@}e*_(PSJD zYR-!yEAK{1T|3GHND6L}pE!NBxHeutdylYyi+zw5L26zqC-PvE|f`CC8WiE-z4O zdjX`hkm7E|;ZT2Ji7iSGFy6$i=d%*byT?oZje9%;p&J7ys3Fe%kLR`baHV13?*wGd zdl30|Ggh1Q+v{^@r8i|B6=aXh8~HP1n8d7&!G_^+tyHyZ{>ZO4 z!t&1Y_Fc^#gBE}JliG6)lx?NkB{UG>UBiwFM<>G<)m^{Ij4!Gq_poxb%7L7_-RFpV z{AiZ^ek+qKKR=7cxMKQj(q#0v6X%EC+twyo)>ylt*F`BvjehoemcJKHzWQfQsE=zM z^m#TLdY+{I_W$>uK4lKNnLOHWqcG4U2)^9YX%wyR3yT%}(2>Tufr@R&Aaxj=HH+%3 ztUMFq>zG8|TUN1VnDPgsSbsnn@uAYE!8p;)aK2fJKqx6=~uz`dz(b z6srxCshk*}ICKZG-uoI9#k4MdV`X&Z^$)z9E9z`-bJ9$lQ&yq6uqiMaHuo;XEhk-C7Zi(E zl%L>Q*#pb6x0-N}#xP`XujZi)tkLq>6-;5rTlk4c57waF%_v?eeR4{TD{cUC0sD>A z+9%?Tmjl58DoXBqq@z;;DKG7w{QsUUWnz;|IOi+5am}*N%Bk`?khVFiV?X)lLY~v2g z!EC+o!;b$BT`vIyw2WANV}M1=01*Ew9DiYg0yxzRHdJkFL5Sh4;D(_{R?0J~8CF8E zSj@<9yNPn*!K3R?*B)`Qj4&ixt&4?E92OQl0LgNIP#xX?e)dw0^wY0U!mRlHKsmik zkI7A{Q881|tc*^T;29CRCrG5yds-*@Q`jY89cekI3}u>rY-!8HOH4ByX>zPX-zn4U zRea+$*0LN4hzQlzS#Z~`1m6a;C?>2d!#(peENNw;A9O3d1%-Cv5D9?4fUwjvw2DYl z(`04zGe>=n;9xay` zLsd~NS^eUfN$WP?&{fB70Un>u;jGF>&^YJU-H?cZ#plWtsFe%axcaKGyAWEn(B2*1 zoQTlodj`1@zmWHSF!SXL&D2fz-TeNt6Tex8dCiy0b<#X?&QG~daF6=3x(T5jTo_hT zz_JvV8r{!ES40d9QMH?)%6yQqDQ&^Al#-|GAWh8RZ6rzgB8@&q%fMn7c;VmXgoF^f zOs+KXAb_P1M1)%5% zs~d*W^#Exm3WLL50jW%8qV!p@6^(f$>}E%4dLc;^R2s4X8WU34VIlhrh`SQgeEEJRmH^&-h# zL}bMXe!r@7ML3uY$O(xgbkRDaW(%T!)@J1N^T@U2x`)g0@dA_9Ay%qym1NIo^uyQ?Mu#3x}FCeX2bkSkN9l6uS^zghUDml8edZa%uUb0D3z|ma9OqBBd*y7u zT=l2+0Z;HyJM7RCduI$%=2{oE?5B*hXe+*m<~3iv=Z(ca`c4P0ouAgW>Nx2e6nPS2fzS8LR=)3gUBDPL{l_A% z7$u<#L%^vFiXdh*3~ZjnYAPw;intm1!OPYp)&e(~XRIP0Oiw?bRnOG7nlO+HNqlj? zPaiNxTw45t$aFbMAko3-G#&7TM#MwW5SVyfUbLF`4q}8bpjd$V=V*0-iNr7xFfs2W zDGbmjpT7TjyjbvNQWb)o{LCWfVFh?IFM;ub^bg9CwF>6h6l?**0-4nDV>bQ;a~=q$ z(NUteH|~yRxS_8WDS3h^E>Pp>@dOuW%oyZ%>oV4tp_IK=@Mox=iTkFfSyN)NY4qEF zAnGy>xnTEQ;BX%P+hB#kxFYDV~hD0!AZ4FDr+w14enS` zVPJ|LFxpl+_T^lBN+oIq(c<{MrXb_bJA>7rp5Mk*Z{54~h5yrv)}Gf@t?ysZsq4+o z{_oVcH!oUy@}8jj4yu&(Ze*Ow!rLHYA7T?kDq_+zDir2hVPcl$Gzv9-xpdR;G(s=l zdwpOF;2*hXezvv@OL>VkA4m2hx&_!87Yp)XE64E1o>6a8C6Ws}t0y0d5(OU-3)oFO z*aBlG&UfN2ZK@=wi}&@Vbai5r)VC4RZc3c_#&bhlV{Be$ikL>asRQy}&ABy(AIUb` zQZi70Z-+CB(_zdsc_ZOgn%3imrKW6XUdpQY9qs)?BD|q54XA5DoY`l736xkxcLorG zG1~Y=_j=K_YC-!I8)4!6O&|Le==IM;sbiiu$WFi$-?-tp25E~QrHzZ==60uV@|DUQOj zd69a|!|f(aO(Zl{zd(<QG8vQ+3q>ra2!*E@-xdgh_t^*si8n)qoUZDl-#DfoQC)~_z<^F*aaT4Hcqp_Q=QbbaR3f4DqN}nl09N|CH zS794D5o)PB)m~yqHzluor2H;^Qr%F=Cz1CDXzR!BHdH#u`5JwkorJtE4TEBTux4H6 zn~=Qh<+4Tyhud^%nWE(!(Y}K6f2@StZ1`GxCUI7OQ|7b|Xj-VU_>~@sU3&+rLi^gW(;-2W#RTFjsRe_Srx$#Y#?>uMWD&mmEbOLpEniBLc81IOVS z77cmkNbzaO9@CGY1!z~}A}S~w*}T%&;EfKBe&ZE|R2NJ#C638dltVic%4E$@!Kw}$ zMG~62DN8WHlqm_}m?vLdiCXoMrOi5XZ(Q>o%NJ`r*4U1J3Duv;*~p`^wzQ6I+T z?i`Ly3#;@pAr3VxoWR2FY6elC-X-5HdI>3a^E{~y>qvS<#X-i>rzHML-2FWial|OMp#U(Jl>L~b zX(&b~Ok&0f>wxHo3?wga3cp-ttL$LXW8IwD%wPQ+$GEtQX^Q!Yq@v)iZ8um&l6Njf z^L-(d3k%rMtKV@xMiH{20KWc}-gEoeiIVp94uG-M0O5%54Yx8}^NMXZu4C*OCk+9n zX;8D0k-&%Pr-gGw?7%;Dy|d~q(l{+2S}sJ)MbMY*SUmzXFG@r}CzmnIGnq+x zs02L-C6Pob1>J-=`KT~o2D*@iMVvruTK?~vJ9Mdp7DUXo91hu%t}GW!hW;V8?TYTA zr_~`mhZ~F|$&(Sd!8}Lep<@&^Xgb)Y2VbN`Dc%+Keo}d?vlvJOY|p(BLo)IBGnaRh zOB>F0e|c3>m@LlJTE1k~8`15fxN8ith)al5^p)(HnThdNA(N5wYFz3E)loC0-Gf>l zek|qDt6RbZPq4djWY|#sL4&io$CNuZ&oPhD)UU_?M*bJd7lu;S%j%j~oMz$p2buSg z@yRm-FadJoM9}6w^<^)P(9A3#3mUyt_F_=1b`d=s&LR!IT;OONhhw0Ci%EvQ$8X0- zMQDezI8{2bg$dF-g1uwS@Y#+i?MvwS>}z}HE8v+C^QYXZ@A&C8(qGKA+~4k7phx~T z4SXnrQadGCH8QHmW1XMT@#)z^9UiKFy0+nTW2{t{*@!y0adxWT=54+q<`NI;0E`Dw zEP0}N{t~<0<&j%}`-XS7iH`x{P@-}PBkWlyJG9&uOJZwZ7JNSF#>td#@Ouf=hp7jc zv^87OVMYnPUR;msqe6bB+&oj{v8cnc3ySNM&)vc7$ZffWfD6Nc<)# zvqK-pkVyF5ELy$NDoI-^D;}&Y0Apuj?6-ay+upgDEB|kA1n0bmrJke zb!=tkH8)8BUJ+$cSyxG7myS9-!|KJiyq>Exzx3`nAjgqEoi#y{W~J067I3N4*<-5n zH_KoKGBeWVi{+5C7^^MIWF`JAr&$kIVgv0IOHl{7xXc@*&E$cO3N_#_a|Vq+lwQQ|^GK&+Rt@zY~7OrD8_Q+znsV{JkXX^mMJb z+KAn=x~^hrSQ=KA6=-wQ*am%R%H3VfJKEhR&Z>wCWeeWSH3O5HbfQB9G}PT%1Sy&n zlAVJA4w6qt*mp(LykH``!8gq>C6f+lz39y@!)9kO+A%su>&kj93e-t5V07N~QvV9* zvn_Ykascf82|Ctm1mzaB^u4?PyUqQu0-?BJuGH^4dH!Fo|3L&?en(t?Uw5u%YjPZe z;f+jcL&Q zbuolJF|Wy|ktH*wU-RZ|V8Tt;CwN`wbw1TUFIT9`(8?~EbhCuv#~X%xZ_H*(CUrWE z4T$KpZTpD&15GbS%lsa_%{vnC2P}$9u>)pd=fuDf&`W6(?&DJ*%V|Ta=#EE2uvrkQ zVy3;b2z^}oaFk^H99wfR6BL@@CgE8 zQnd^>EZyq6T65aL#?|eD+pNk@K4cv8!3Nj`O!r`NCkmZXKO~8qLSDM zLEbY5SjTmZrowcm2hM^G8p*;`#E$bNj~1%jXr5>?Pf0cT8kL;5yZ#S(1c9pIdJ|#^ zTqxv=+T)WH?W_k?s>5?{jzD_0l&t=_!5Fs*RV(<;)oytMzH+Hf+y1o7nfbI=!mxj2 zxZ;XEskd&lxOCzK;p3=KNkiATvIdRnSZEcx;+HI_WZty$zzIJ!=%b z)~~b%>}!)2J%V019gn7K}1!^z!K394KU8Dt!*YMTaMiD zRnO)ZQ}tI&jetcarw+4R6;nLOn?TtzXp$F79G>URAIwc%&TOy9M`U>yu9gk7{`bsZ zBmc$dbQM005;$~!y)yAgS+fn-US@LD|gJC8VbIzercyNkCO*lN5Bp z&W$JzT!TtF7fkYGK}6Y|IkKHSc#coET0%v4w+TIE(P|>q$3KwAHSYmxhACpi_DOSJ zO9yn^9?=rC0mnhVm}w+qY|$i zzOChwGg@xKmkM^+n=n9MtxR{X549>MJdWX@A<9SjKAEP%>Hc(r+D{Ho)%;|?hY95U zwFy&pr`Nii@zUC;y*Ywfgr<=&%l4+p+ZcdYPM{FX(;~tEG&tCIJigt(M*pUOXWv<% zN@7#a%M`YOyi3Qt%i>S^vFMa2U1!-jyYE9@n;&L)8{p;Ae^@Y~lvl}_#;AWl*V)A` zc7ao|@p04Ic){Qo(o}zLez1_)&6e7ZvaIph7WcI)n9=h$>8WN#~k#eujd>v^U0o@EG7U2Px+3;AQ_VdQ&(a?c4jLhU(5*#Xr}-RmT)h)Tvfg%$jniB~RvN%FwgTQt{B+sS5WS37n6z7%NCXu&D?5Y{JiRrh27@_pmsbce_ zG9r$0(s*b#50UJzTk0yD-B*kLH4w!-vn&98^~&Tn?jo{zd?0>p>pEPSKMgflumPUw zNS5k+xW`(?j{$N@P22)B_73NzKD`8)098L|n@Rk!e24B7sell1_BluMZi`zf1t}hV z_LfCj_9y9*85aq7lC#*{jF#m--Y30^3zEykucuShP(cot-}tSJeYSjMeid@=$GUFt zl=S@7t+9Nzc=*5JXzrlpWym!+h8_q1dDHLq2iV@eNccVOZo7WpCT0Ccf9$-zHT2xR zK8z;N+~F3_z3_Eocb|V=BuX^KoQ#*4ay}Ie6V_mOvXkrNV&QHiO^_B8*KL1{@gE#6 zU-?VKHA=nz%vm<62Uy$fR&K|&5U&!WALU!*4z`K@(s0yKJE7EtBlA3ttlWa7g3{rf zzD_8_Jdun=W30CBCe6C-0x5hQJ4?K25G4n=R`{``&co_%J;a(#823AVao0(;hN{^3 zbpHw|R`!v`cZx15c2s)>#FbIuPc!v6PJxoyzqMv4)hN_n&?8|qwKm?#@H2RYqN*~r z?mBy%Ycv!c6>+#2Cn=uTm})=?Bk;*rL8k1G`dT9*Gf^c;pixN35n$=O)}m=L1)KJ? z985M7L;#2dpksMti!RcGGb`!C)FWBN5;{((#IPwDTbCAN6#p-GlI2O8n&mk0jmG)$~dRtDP&=u$8Cftx+9) z43ERi&R?*eQn~8kYP6n#if=W8=%z1C;#g{p*tnSq>ZhBvo*g}N>c7bc4-Se4vtyB< z@(C5fpG5j4UPHciC#9J)D-jEbp86@=lR1lql7|>nizpl#Nk;RZ4uA9WITzT8E%%&} zP%YQ5_mOeR@U>ef;!Hq?j!+gBQ0J=;pz#dE{~K9NOfB_b6M)nMZBbaH< zheZ8}ozw_PSCX(#CnJ$~>)+oDN4K1FB(}d}fIbw($R2evUk55*JQMn`TzwvkAx@E0N$Zj__ zVM;(}?y&j)upOMBYx&(w+7A=%ld(J4V)YHb4xB`eCy6G`YaCZ?Tfi+j&`rZ~oGPLB zn}yM-)M!WoEM$4qpb9BKSDu|zN6G4Z`tZ*+>p}zvrG0W&k$Bhu#H0t!K1%YvE+R2z zk~~Zfd*eMgS{7>x{gM4=2$al%C{Jrb3bq(mR+Jh^)M!Sn15w7=WrQr_CxPbX(1;G| z!?(tH9ESO0-rq~gLzoF@Ndhj|Lc^#CRGgY_(T`3`d$pZ1MT;LEpGLBJA!`}as8LOT z5XPrj4>`wMV>2_xAND1a(k7DMP?KK0gmn@OWOeeO6k0_B`3|5a!%6*;(p{HKqr7KI zD|AJd;X@j>O?}65jZ!Rs=xO;hB={@V4bV@P^(LnRM1J^nO8|ibD(AnAPCJDmQE3&_ z_7c}J*(MH^=P)S&(hF|;V?4JbJIwAlE z_Z7ouiNJ}z*)4vR;r*yVPpF^v%jF9TVQN;=8F`A5c%Y4j9QcNzoTs|r62;_HLA2A3 z7&3N*#2M%~4#S8C6fni8VS;07QOzhhR^Qs$g=3Ze1VbmXW{P|9I*J#xU#N~p>EU6H zbOZ^S)bc}W&Wc|B&E&1<+AcmoeEd*jlXy&z@_*PS3*0DGc@~R~sTCieVMS#kN-d?u8BMUiP5BkuCzQ(a z$k3Y62sb3}>6F9N)1p+*czR~YvhqdDdTpFlmwwf)5?P~gWrsCdep32UQvo#@UkVHzI`j_LPjkroKtUG~eLD8bJtTz%*#b-8&Ijq&fnr zT~}guz%x+?&2c-(C;mXDFKZa^c;|QwKMfoMV~vO@L6NORW-9}8Cmn%>4uJw75gHbS zFjW36=9VpHz(uXxh(Lm?BkDI*sA>CM3|~GwTzRjI#Fj^)7Wl1pX{|=H@OjeUl}KJz zDYA3g0#1MHRuh6x`$H#jbQ%$F&W`_!+@_F8$gdi=h&MvhKyzUTj%jy(b_Ls7UgLr`fieu{*w{2xRU;gd0G{XW==jw>exKF zh2`EM|4O(~_1YFUsA=IfXxpoGe3gDDh5~DxO zo&X*kqEQjo%iWxuw%cC7hVCks-KKkeH&(ZBES_b|92nIf+A{r9!xlofyIM- z%^JUB);)4)VCL%)Hl#mNs7p(;vY%jMglD3&Fho0-`HZ18hTLQYo$9@$-bpT@ULF5W z@}LR!`AC(sChyTa`pH^B>tergJBCWaVp4C>GRY6PcSdUpn=(AiE)mY2`iUyMUUP#7 zcFHosir~+0;+o*F<0!cYe2o}K+f@E*wXr-RJ{5*F2L3%MkbqZswX~lhL+Ia^aqq~2 z@y>%H18hZqrOO7?LA~jllB`aaf1>z9j5DqDIqUz&)HlXe+J#@|PMmPEZQHhO+iv1a zwrzW|YqC9YnruwAr{2@^fAyt)-F3d~eYf|u)^)A5?su(&!*i@WFvC{Ii@1u?Q?sp| z6B06Z&`BW>z&Yznsd`QxF} z=|%4CUp_do%ohO3*LMt_C{~H=EKFX9TllBKQB=RQ9SrEByYZKB-q&;J&YdnMyl8Mh zD`5|hjdTqH_73sYB7)p}dAF!Q6sujM{N9czfF`(Kz2Qur_lYw_c87Y7Kz$9L;;#(# zt)iV3JDD2ix6X}F7TQqo%C7O?1kFt8gvd9xAp$Q~Sb7S@Zvg`Pd&&hV?xf!>0YQnT z(uLf>5UhiY2O0sEgD&{;LsS3YTl>TFV|+bLjkfF6SsKY724SIpZkd;%>j5FT?@R%- zRyNmPRb7kUe{R?6JnUWNVu(ySb1O>wfVWuR9YB_moGn3Xc5FM9V9_3t0g-e>7<=F>rLs)@6L|^K-0Kh`g=bm}v1eY`&!fgb2RZG!L+ z-l-?ALhDc4I$x^3Kg9f5TLN*ElO3&!rb9dA25|ZAM@ZT>_Do}IXm@{|E4W7Pohtbm>RQ4( zJ{uhe;o-1KcpzE(%RG#nZW+OeoDdXYa*N4m=}7TwQsP#VbX-Hf3DZmOAsC~Xwn}bv zc(m^ir3y8ys{r#PW*vtNMsgdH7NJ3@SjM6L4ReaX!Z)Po5Jic$ko)kKvWkdKX<6l$ ztgPair=`1OjecwPgm{J$Db9dDh2U{dzr8xB-96=|oRd^~)k|>X>GkkYs1F}=MNRye z76Jutx}l#pNlUF_;0kcJO6R>a{~Xu)_1jD!a;-`$%o`{bi{}-wpJRVUSIl=hIEJQ! z=3hSD7(u4dkCooPmqGI{AA>~iSFJnDpnYIF#k|q{Zy(xsf7g`5ViVLDs`{)?Vyq1Y zR<`801*@WJ!b+tu!`Jp>ACGqhUbx^Q*h79XuMsw)uBjj2i*?bnweKn)Ibv`IM)a+e z=1B(Z;*W$FN+YNCOjfL6@=95zZo3rK4##xlsS>T77`lcG+PZRTp;jyHsNi&Gm13FB zAIJy(Oe6k*1FP9ITZN62lS(5e7b_S!p%TifRtf{%5(Xhjz0pX`Q0$^XJ7|0Fp0BnH^B&^%ENlcPuip3rEr(+;NU0=;Z|BdS5k`lH#V z|C#2Um4&sCos@?#f-y1W5*{IJvdaaS$nG$RyxXyuZ&0k*f2hBI6U5^UuO0|%fZa%W zMlQgEkfSkfi}Bmms!))idqQ@IGiZPY_D8BjT%r>c4P$xdq2y(Y6^dGlWd)5pvKl`_ zx3Rp=0vv&;b0$~f*Sc;(lMULo0g&9~DVXSOdl<`T{pi54dQB6)>AxwYw$H_X?Eu=4 zsDQ&WsbA6;7kVX{iNa_X5Ppl!+E7+E)wMjJ0<&2qs$XZ{NB@?t`2janozw^q?#&aL zh(e=F9FX0A!cjgZEJBe6ANAJ+pgZ2r>M=KdnU7vbOQJ#DM4ld__a@>@vkOxxjEz|u z4DRbu3l9z+%TDXiC=ZFC;+w6cfLfzlHr-`SSxS47v$Skn1J)mKdv0Sn{WqoQ_pzE715PtbPpNSEuS1Bq+Dhy`w=#)t1YRxr#g>HE=c50UkHENg%-wjT%#x z0L1u0YbdS6miBrrF55K$H>&YGSG#1zl!u~LgI}!@Xq*1?8w2a`X&*pqj%_;7CYVJ6 z&LV26TTuF7IG1sJ8S@lFES|r0p!KsJFRuCjok-XIoHo?0sRi}?zh&>HA1CqX%%e(6 zR?(#mqZ+9c^gd)xa62;o7N-N;!({AgT`fdX9TZEAF$a*$WA|mqkSvLYqaQt`lLcd( z3+3T9WW?h@qH-(ueDlS*{)1iiR?GfY2>u-qMHjUt;)fAr&FmqR!S|(W6W5SeZoDGK z5YI$^sEe+t^&uX%W&l>CUa>+s>PN3HRV)N4B9O$Y3y(6ccs|t4s8B*iw`mGvVbB$? zwumR0(_J#FcF!Fz#iU;D#JDyyBID3QYefwh+$iiU`h>6upp7AaD6eo@G%9=omB3~L zZQuabWPW^GTNL+yI->3tB5G`S!`LYLHs0|*m-IIejbsj0goXr~x02&nmBEAY4D1a1 zNU~9(E*hE%Q_2P!N))y`s3n_pNFrxhW>`=(KjF3Z#ZQOl;sdDbZpJ|l5R6IRBTg12 zimOl>qROFsdvRJJK-z%#p1e-JZO&q`hnKih&Xj`7Px%YM`};b`Afvi#3>c84^|#ia zUv%@J1m4nRvIB?JR!q(sQ~cij_(?S{Zedo94b|m`AiSM_YjrIFU4S0t0;Qg3;`B0( zq-3*6)B48B+l!OO8SyCXa;nm zmC~glfp=0d&1%xpjTAN=VEIyHvDO&Z<$j{{Qm_~{EdN*7qP0&#t)p-*2%`&S6!)+3 zw|RtMiCh&~v77SrFl(4HRNgK+O)g8jESg2jR-0@HL6h8y1xhsyFa_KG(t&nzs9%sa z-a<*V#f0>BbC8qd3V*LyU6Lh_RfZkk=^*k1Ohc3>b5cZnePTo%ObKnObV);(#~mIt z8|km(s1);%8}ok>*ZnKjs$_fgPQ$>!Pl#@|-lx%^f`lSqCmoN+Saf-`dv>e;!CLA_ z;OTH$biq31Qri;LM7_NENxr;Lo|dK?z6^p|N97zN>o*V}@7Fz_6N=;BkJsM+8FOs- zJYc$6jUhqSNC$&am8P_kx#dBXW)f1&D!%6Xjhyp&Rs8Lw|MXuCGPRbbKa>rsyd|q! zu*Q!hC#3-{9ADfYF-y&YGQC7A#K@cehHtu_vQ;WI6xN%=OsTZb=_h+g)o{R(^t2zN zEf9lp|6IbczrxN@>9&WL($ou(35W@7Krn$5j6{P^i4=@2uLOXS7m}jJ zAp7R|#2HbwAfiI!q6$gm_mr)w)43mPyv=y3L&tOdaj`zI+h$w z;l0dogt7AjJznZqs7gwF&r7@vVs=peN~Q4|G*Sw*furJNlL|VmE3-6V!Dl3Q)84iHyq983u`0K`DIKWB=4!hGG(?f3T zdx-?Rg52D|4gd9EL;2G0TdWq&s^ar)hR?%=OaJ>0(_3gc>&V-uEgA#8_Ma%#8*UtG$#8(a z3WqQlUYO4Wj!~q>!3fJysqf3qnq43g;xESuZ$N`g8vs96h=EBHa$M1X$l_43AQAPi zY7Z#E26|cTr{5~nn0@}C7gKk1{IdSC=C$z{YFAWLW8I9EeI>x1%vFBDv`B{$is{fq zuAZN$Gl-6u%zZvbxgV-cc@tutueq!K48{2P>?vKuY921;JJ2O=!!E&wq+xS<&2@^* z(Wg64#e@l{tFAA37(NNJ;_`1Aws}O=kleyiWE4!!dm%AVOL;CRLJ2=RO zu1-&A$PyS>RLcSiLAN@3^WY70I#sa zp@TS1mXDz66>X4$C%2fBgzv(_I6Z>mCQh!s-t0+?hAKKoy4{{90-L@}O5vtr`8^I^ z)LF&Z8sSu9GRQ%aBM9FD?u1+fW}&?{Bdsrgh&`JZEc6JMiKM`wRUb}nqf^A2NAa2> z00C^N5~Y0sn9=uKq3RCNunb`4P!w8xPQVpE({+)78?;C|Xm4ioDpG1>C;2WT(4;W- zhg5MF$}{Lk(XUD{`_eeLnk8I?9UVjZcgadZy3^s4@;_;*S3m=?7J@O~UjzjZ(t6#l z!G(GoDK&Ih4I`_f3y1FiywctMI7%TSikDUa2^!#b24i>TXHTgbyDopaXnO zXygoe`L#9AdDq^l-nYH~eZuIOPH$t)u8yh|UN$J@XEhH0Tv_^#E}Wjk`ia2BE(}wv zyplU_@GAnn5>rUn-M>wo0q+QnCfr^<*r_Y3 zk5F+4L^?)DOQYf!ksmOxe=V)3nf{D5d6dak7U^m5&v4T(lj;~rMIMENG+xg%Q4Nxw01y-aHT{?uix*DlxK$D3x{(6xiEA) z-sW`i>0j>nBx$dA_g@^ryi$Ga=XbrF{P=IZ%SlG27Q9q-r`WJPMO6YhuTWOc+`8m^x7L>zRd$j36t_h3@^?t;tch{NV!_S6UjcqO_+BL< zq0dJ+rMgI~Y=X9BFU!OD$X&59>7$Q@2oG_4qm=^!fXSvw5)`|#0Lg57hQ2<50|;-@ zCd3b5tpg1sgkmaY4yp*kLQy-dvqP<+HGlozNX^A)+(=c-c%8jl`ls^Iwa$V@RdK*v zd9hr83<4aCLg5TD8A{VLe{(_qt4nv8b!L@pOqX%1J5r$2tgyaIB()~_L>IYUXNwAN zQ?ybMl*3Ju#tw^MN>5A_8dwjeIML``BU>rH$ruiSukx;zXa;W$?v?tNdO0K%L)Zr66U7r(OE~!@gw%gr1_33~`64STHH#n_O!U$I z#*U8@D1|fq0?E^98RT8`2(obnb&@9k=jEpA$;eG1Xi+TWID(qQF*hlcCbYuKuq!E# zTjC{U3#QaY;&=W5e$R8;+B_kR#wtqUgyQoxbJS^=_y`ADQVh*Qv`9?`pZgR&?v?HM zv1kK|y`Abko;XQ#bM$Jro_)%a#eKic9AqNn0i0##_4j`uSRo>%sP3X+vZ4=xX#Xkw z%SY5$yPh9EpKeZc;v?W9@&;L)*CdxVl*^~lA{*u)DtOxA^v7RpD!uPhtHh_p0pT7~ z+SsWj{ZXReBJadw6g;9$U|x5R;j>h|Bn{oxkBL+s*~9BZ7mVx_&na1@b7Bf2mleHZ zDic1msj(3IVk1o*udo$a05<0cv`Lec!0=4SvH%j`AG9Ifu-P)|mnxFlXkhccacDO! zqpBJOSBb25`~kE6a~jew5-Z|bg(y=;vuUjz_sLy#F(d2DbJq4h8aURVTrQspx0?&+ z?xWK(uD(s$=M|eVEP19F zEjrFJzk{7W`cozb+*g3fVbmr$oBu{i3+IwS=m?Ek(?NK!Sn`CRBB`f}I5NWW(%4slUHn?EsB$)M~cQ zYuO80Fx&8(_(YA`qhgVp8mzf@bRiBziSum&Bnc8$a+xf80}hTAj0#^hX|^gj`GB+Ixrp}b5yO)83T7WM)miL@-ei<5nporhc9Nc zVwI^Jnvk`0nm17X^~oA6X^*z*A@THh^gJQ?!p12U^BxxmB>7>)Qr>zsKQA&NhpRTvg6CU>m%nk^dIJUh}+ z3Ir+)0MP8KHr30J2%zL*{SL3K=>Tzk~Tundy z-#U>NF#r4tSqvTKFs~^6G%H?q$V$#9hc~a&>-i+a+P1#Eb{yq_QcOWTBEts5Z_fv# zKl}fC{eOr=f5Yv)4(g1l?Itg!xo97Z(`R#?}`c|qxH2u zEG}<)(q9%<^EisMNPGALP%*^1q3YF#f?rc+SdGC^`lVF21cmn(xvzv42E~VoMz`C1 z)8jdENJTcD=*%39ecc5wCswd8eqd%nr@4}IkW6FGDJv%-{$ml7F{O7gKd$_C4QB94 zACP8q3|}?H>DQnm|Ebt=Z0cdQ{iR@LIbIDmLM+Snu$=&!#pOd-Lu>ZL$oU`3Z9k{- zXGjw45amBhQ$hAJSuwwJr#(zX74jHm`Z4u_tJI}Xft9gO@ONotW@=*;6gTE*-)I_W zd(i+2YDlxn7jF@b1YWc%$OdZZPiFAn7ca52`uLBa6PG{9$V*--A<2_|bjG2T)3mzY zxAc!2kc#&nJKx!ynLlg7c2{gwOXcgocd-9 zW1m|sj{rN9aBR7LMl6t-7@8u^Pf6lBQp#9dV(!;6k2`AzEU~YJ=0Cjf!}}6rV*AN& zi2tG05C2SagW+Z2Y7kA^O;|(QW(p7uOT$L7^)g={HK-xtL;qH}p5v3kJ}p^S z)aZO(q9dVh{}E-L=v+zrcP#8>=4(rcN?dNJ(MbtUR`Z^KovmF7P-^NDAmB>J?0bHn z@q6#&-7Cps`7>3ZW!cd8cAAT5QVkS*v^?!lUvmNa_i$AyD93~dMW8&6Z5ZHR+C&RD z2=kxi2o;G=q`MA8igZDtfSJ4D-wayD=CLP9q`8`sU&2c{8*g8bEA;f?aBnu3LP9%$ zESL@E5o8cQH1Tv&17?UB+$<_0o)|W{uQw3xWrhwxCHAut4)AM=ZO#S$o-C;PIjSUw z4L(uxJ%8MH)&fNbp=}uA+Zs!8J7>S(>K&heXPO1$ky1D`3>Fxz4SSJR#dH1A*k+jR zbVHz}=lJ|-AvmYFbCH(tzTy&miJ21Xu5QmD4f~VViSm>U}o!rIsH4drz09~`d7^=v)hjp1Knx+(;+fUuyl2ul{|Kw;Vj~lOBS$Uan@#KAt7`z ze2cRu$s5qT{dJsv5|d|xLg59Hd%3BLuMpu zTcpIB&!&1zWs7Zd}{y_rml6Z4poqMRSkzozk{a-l9U4v~qHZ~#kL_p2YHC4}a< zY_RgJQjrovvdy(obuJ@3X)DZ7panQ$^6ctT(+$pv82R|3<-9Uf?Y(Y#_hJaKJ`+?A z)FtN}Tj2^bS15|GIqXPSQHpJ3jif{abFqY~_@TRu)L-pi)Zb*?kx7Vi`j-hkiG@OA zc<^PEJjdfzRV2Os@^uMDxL?g2pWX;u+RoIoxHy0Bf~7}~P-kx5`|itpqHL_Qj~uql zaK%vL9Py7ibYOfQAi1(!sUkYdqCkiW-9A=l0GBzd=r(WHLF3E&>#QW~0`;yq*|9Sj z`GQ~h^K{?S2iZp*f{ONs^KXwVBj696$)|j}h#(W`(?iZb|6Q=1Flu42QwF~>GEk_< z=+b^g!(9lhio($kft=@{g82ywM zl9WQ?$g_>rD>4^!K-dr*FW%`7^Pel>&(4}(pwW7e@FwDC?(oUX*rZISm~`NBXB<@z zcg=LR1Mo{1{nMwgb6u}<-l`Qk`+Tk_)WfM02yUk|9C?|vC0hkbcgcF0-0fqTwE+{93mLrFK-Gfl3^l;Qbq059YFtvyFSF;d;oRIA4h`s)WN z!o}3vu;rIYGEhpLVY~;(epIin=jDX!U(G1;@cQXR%_YR@A5g4U_L}j3WqUaNm*Jrr zC%dAd2z6sz?3Hkptb3z}nMCa1Iirmf?6iJXZKY1vs}XGj!+DP_cOQi`PCO=|8@UI>;Vir1NGQA0A@G!pcx zUjV~$WCMZAgc2uVk#2>~25>EtB}OCoi}=Sty!R4QT2`AmS5KyPlLS_)BeA5B0C${$NL=4JZ2}1uEAgYNH1xy>cc2AppR&Bk6owS6rp19ultAXA zZ6b~RvjqryQkErij?T|(F*nNm)~w!a3? zsos;Otv#`HX|y}_)E>~KZOQzMof=OuO=J6ZqI6&tQSMJt0Gm#O1dY@U31|u&Q zB3@g$1mZagkHL!t0nw~D<`nfxAB5A>QL{f#xJsdo1yD$G z=^$&KzRHADU|ppfL2g2wwf~46rVc!@$<@b?<{+Z|j#0!+8JCuo&aXQP6!nCL1$}Fdhp4Rv_8K4|weq z`~r}q{9H}x51+CJNd0X&rAJ&8jbTB)lTQ~K?jYjUWq9+LqkoDd`Hd2AQL_-o6 zkUZivw0{J|f@hYvp+kE~h+L`i*+a}|VI;%HFs?c?h~mYlvRPgv$jmcA@UZ?DC$VS4 zlIFdf!R(X8xsRM{+&6Jb%m9QgM=Z)tOMoMfc1hF8jDdeitTI=F6sd5+*G@6Z^XQir zbJU?n)N(cMLX2_DjD$rQCStpj7Y$)z^;tzN&qTW{HddD(l8wXHHCr#~r8<)#qfSHX zUzBGg7@-V@t|~ggsis))zHiR`laj;#CP)9JQNg;!L`!I3n2?mNhPFvDKdI)*0LeqU zJzQIznRq5m&JpgWu(ecd5fk0oOB|eobjVc~&@b1(T~q`Hr|6reSo`MLY|2RrWdzL> zinm#J?KgG2<0u9yFthdIxikIv)CLVfnD&1M^?vqQXQeJcg-+X=alC2vi=^(Yp|1nD zC)kP;2sHOBD}mlu&qbNNlVM`N18G z=GhAznsdqG9cs?u0)aJ|hx@WC-X_bMl-xn@dZ>tplPryssz}=CxmVqO=jAwMmF6QF zrYzvZF`oOae4V)DzJ8cInFuZfRznrATLub|Hk^_lMm|qf{(*jl8TKc$M-kAgkseQV zakvkh;%!7gW?;F-k~74Oo;>7FG0%Y+b-r0${fX&~0Wo6}+V9Dle%eXzCLVh~{!JdNc1MGd?#u7f zkJpd)-cuu^Em9Yd2ud&bIqdtfP7(H)Wz?kk-+*#>{QX&kxol@V*n zyEDUGN$(4czb_7e#*IvpjH9%zEr<*;8&PZFxQ|oyAxE>N@cq|`W-67j_pa!=ITRyk z%9c2Ad2&VF?!B}rN|*)I*=de&B((64bLuS;z*%OJ@e?s>T+{sJK9tEJo9qjbEY$&K zu!ujib?$n8x`Hk2dN)<5DIF?@fQ4g=6hdVxhd25mO+zK?;K!bc+PVNlC&48m597pJFdE~6j}7R~(S`6t&4X!5J!FeEVO)IyrTrm@dviVS)6 zk1C(+onxKFv@#H)h0_|C4=G>;+zxeKA-^EW(pzK!`m@NYn|Lb70c=WAS>+Sd7+Yes zLlO&LXCcj|2H^qbq{n>tQL66NYk)9s-$n$b+KP~BNX{2pGlr< z_{5D~)A!ep>)JhBuHJo#bk}iVXRfgxcw>m{-0N&LNBS94D#)%y4=OkfxjH{JOk4jp zwsOC}{~uYw)7ibje`ztG2lO8xAN+2@$>rrn+m~sOcQWWx57#SpbyB|#6Ed)>UQ}RJ zh&;)z27JV{?SyBX-WXMBJy+l6i8La}w5l{rCgHQf$0f9q*jqbWVp+GzMZ`t02hL}` zE8ab^Ek&DY07^y8gXY)neLm#5#)VajuPgJY=j4FswDox_F(!YJsjx_a&}|9WX49Ch ziAVaDxz$+6TuG8mSo85lUztWMnsV!3Rvp_YS(z0WsdM_5x53`P1NFwDgfXCJM$H~p zdG?9pj_udI)%QW4pjteH z1)Y~P>KmOPH$)2GKP7s(s6-5WS+6mut7-zR0x?yX9~81lqJcMz#SJUmwM4(} zMW)&3nxV^~;l5HCC|#sor>scRN{VIN*6XgHI|Dn|sw|Rs>HO4#>O?kxtqSN+a&HL; zNT49ihtA0R&rlu*eI7h}&>@svd%)ZUDuLqdrgb-+{{05!+>Q!8pGW zVYnntt#-_wiTgqjOz$x5)@tAG32)NB9g>e?pH@lkJ>fmStC242kg{CRU87d6w>B7ssdVBvb}exOAu~qWD64Xhiq)hC)#gOibyVNo=U}rGt&E{i zd5(H>U&prM%0%@E^wQsBr)NFXt-XRg!m?|>-^ITt!o+<7t!qYw=1&^uzpi)uxS_9q zF*FU`jH#`#b}KH?jo_lNy!aBL$6X4xFc5q)1LWg{-^~q~o)%26XIc1OBfwe8n|Io0dh}x!muF@NEscEdjEs<1 zlRfsjs=4(V$LXBo29Zsoo_|l2{ zfFjLlBstMkQE{~-Uk2!wG1&3jb5nR2S4@*_BfR`GFfImh`tR1w!F@Xknhp57&~(Yg zF|rQDvSLVJA5#z%SK5k%QfTW!BwnRZP2+|RtI0zl;Keg4ZBK;_>Bv_k)0Z+7*$_+` zh#J;K{|$6$FQGEEQmXA_$*wGoB-fKow3XM~$;xLdPk&u9r|P51F$(ln@8+MLX3TU= z5zci@`-h;{lNfmQgJv@ep7_7+pQ}H}isQ2PdrK;P;>u|B6^J^k;;@$bi4y)UVm{tqiwpPvQkpw91Of13_eVlZ(Kx?9A| z=?%vI+TJ6w^KbMzaNE3nO5!7%l?`#di2eCqkvj*V5_{W@_(?pLFM3LW&c*6ZjJOu- z3*Y!mV~W0CD05J9;!Oyy#5`Uy^`zM8Tn+@L;t^ZKPf%Z1-Bd`GH-(rbN6m-;my)UJ9PbFuSPp|Yvs<$&kmeNd+&sj!qxM{36W6a^iUkSvLvh~+u$EK*o>TDW} zX```kkWPUV2xp+3_;$aL|9*$n`y}zU5BfT+^!;VQEDv**7IKRnKRyuPvU?8-WzgBfBNixWi!6tU4%&B#_YBXB_mf;sg9LD5%7e zOwnyE_$#m)A_?FqSY592@m~vSWToAdaXyS?!8~TD`^ih0MSim6qg{5to=LtJ&8X>6K0s+nwOr7l(@`FDnz6$jVFZXO%g;0kt^Nl z>cET8a9V)Hs{WlpO~&cK_1KDKzz`8PAHLy+6OBbv$@JJOB=MU+2SV!(gpg1z%bDY) zzKQ*a)wHWD8z{#dP=BoUuP|5P9X9F`xWAm#%B_|D9P0eLVkK`||z$Hva?k z!y2p=Xb0Z+mEQN0l>}EnM9@DF@-l4G0dXC$Ma&)YbP0HSY02@3+y+!41m-h`LEhBI zgis9T-K&{ZLOlhgB`?;27;K~sz#;aYl+4a+QM2~&Z6Z?eUDO}y=qOV06@`I?&;;x& zx<>d;&=W&s%IsWpR|%kvja) zv_71N#nmGbn@}oN1NU12CL88PU1_COC0F%s&@r?xBdQf{3yDsl)Fh^GDkL8GD@LrNqvtxR3j9ifum*XkamIxx! zTdTH5vkerR2P#G12fsgkA^QGyeG@PE{{#FPz{|V>+mtWg&0fSgPSAKEju6f zXWYv^&KO=n67H5WE!!`ElsyB2c00^q*5dR+1k$vET;7v&FV%`c$=tg)I9LSgf+1Xc zVQr+{ZtF6+rAU*0Fl`~`ZfQy%^SBZOe=w%$pJn6u!D!+tvZm`2&0uydu8JKZn5;aC zh`hDXLOu~=GS3_BvbTI@pf@rs z-K3Ibzcd)Ew%G4n1Q9zO+!k3|)j09A1fY-tE=x>V#ipIW-CEQ zj&<_2z?woq%{`oa)<7A{Vp1tzgx;JVm_T!AWVK3y&-;U4gw{dte0fWMt@PAq=~>!0dA+^$-ox*Q8WWFO`a zJUbnm;aiY9b3>uN8g#&NCW_;&7)OPPGwKV8PEom3M0`T*YQP~>{VC^UyzbU zawN2C51v{Pu@SIeN!<8NuSwho^-aM%MJj2mcK{|%JGDmuV2vsSy*j5-JX>sZkaXpA z^<&l}0kAeY3i-m8Gzfm-@ll53MfC0OajsmVqYdVb%@Rojql57kd)lPnh!nk*wduY4~;KR(upe^|)}NFd9*LeCFFN^RMW? zrj9k@AM>DBL()h2%B=hb7gEw&{6VcO54Ka(*q7Md1`z$+F8J?m;fvtYC&taYfYBRC z`J6?QVZSm|MNf#jQEQ}FtwDznsUMr`TPeuwB}ua0ZB*3s6z{TFr~L9>+v_vWuQM`L zfe;oTz;K!1+v^-wr5;E#9yDufO##*4ew0IYFT5+MTA^l!8Z_I!lB*y9n~0?&Jm_Uq z^lR2G(qbP-B@f28SOX?;!Hy&eYczFxa{}8JIb{|Nw_g5Nj)_c=4PL=ki%Ha!VT_Y~ ztcqc=WapF-;8tkNtygRVW* zp`ADX=5>FA&JOM2e0_#JTD}wUc9Dhg2_~zKm2tLX7j;f~*2F)_!!clw$?q6>ks1T28bTD7f@K9D_(h5Ly-P0(jh^3Bg`%;h2SbmJ|LuK zwG<$MokU)AISo#cwwx~3+V+N_67edBGP>9oS`9bWUB zBC3uCj{_ds!m?9x_^wbzytqmuiofGGdF?5QcaLg6CMgp#Z{?q;HXx??^`)$|1_S^O zd@s8nLFTEKVr|RC)gV^$t^0BF^=6Xkv-IS&um5br{CnK`IBWX#Pzag^43A*;^cZn) z3*8YP>o4XPI3~+49p3h0B=JiCphYjbfTWKv8Y%e+7YjM?KU^4kI#*EuB zDf7-&4#&%U&XoEQ2w8d_=^9g*Z;7e;=Dc*K14}R%l`b05M;dJ)7glJ;zif`X-T5sf z+QK(J=RS#TfjE-8=8js~%vNTcC2|J*04b2S-L8=$lO7R_rJEpYuChcbd53$_un3$% z5U70e+SYd&*OiY1h;kx784-RX<0?I13-4Prp}b(2i0+$5w#2AFFO^$_ze016Ukcl~ z$JW!=p;hfA*W|mU^?|T9{EzmWjf@^v$mo$|NGMIVuXwFk7;MAqW@hxMqd$p* z1Ut#rycqn^f^8>difPF+e7m4e zkyg)6lXtzW+c_&14D%Ww9iqV6m7{8<%<7^oy=V7oUkgO zso|JOoEEI=vdp+cOG_vEr(Yqf3E(coBpq+MU`C*XyU7im2K0p9fM0mK9SlC!!BvOP z1IbtCnFGel9-_ll6!$fBOkG9Mw2Hu$wQ5fKDBJUd$#u5M^a4O-J!lUmH@1!5Z_+^v9#6Qz*R(94zeS;O zSN{E_d}}NRWHVvBW$mx_xCJWse;hnk;K;9=b8)lXAB%8arly+Wavuko>S8Y_x+6`} zZ$;Tm`u(z%uJC-quP*rd%L?l6IGDd~7?S+L3`G+hU6A+(32x-wqJ5x_@_>#S^4(t< zH*V>|ELr4{YVHtO3Ix{?OJ@dtw;}`fv7$rlnh=9)jA(@V|Bd~3uL)i^L*uUV;wMZL2G)l?#9-Fu3_=7VZ- z&5D^$<*(+apIw#z@U429m91nGB6nDFyU`hAxIIavUL6kx%PN-7PZqrEDoY%2_q^&FwF6@S|d~)v-**r zA?iQ_cudG0NN(`L)x{SVP}T(WB5lpIa=Yg+_>5=38wavv32j>v4|bMF7m2v6v`*Bl zv3_MPHqFzjuqQwpN-Tv+zGB3q^U}}^gb!!4R_xlq%8tuM|CZO;kUE~3Qx!`sgMx_1 zQW_n>rb7?qR4% zih=dvKgq0iavk`~nlmwrNF}{|AS{~Qkw)h*X^*%yA{y%5O$5oHY)XtZmfyNinzCa( zSSoU?+vjjB;%PAmK7lY4Xh6#U?Ru2R|87pO#CK!1_H(e|KRl}>66}%@kr{}%EuA4U zPp3vz&e=_(Oo+UGU(k2G1uYT~L34LuK2i^dL}X4@pZ*PBCos^ren^8Hb)W`i^qXo?K)S~Aa$uO`J(Q_A2=dBqzBhL)z4E9@N66xU7~)iu=p`)t_dkD%@hLcfxK24fwq)r?V_~jG{1_6=?xUz|g5*m# zHdv9S_~tt=_1_V@18Drne=TpIrL^Zrxs{n7$|Jh0SQ?7_8sPzC=#~_@QpqS+2>RIm zqDWtQ2=)-YyYnrFuzY^DVC~)sO0D-6)vmK^sUpfoRuMO3 zoc!xQ&+2Zw2KZF0nfTv~QxSc8+A;GR7~TE)2ju-WdO`pH7F;((E!&mM(M_-6Gx8Hc*}xg%PPf!&~++uq2MPY#vS3J5q{LlWj|DhQ(PX zoTk^DqpjDx$XQ^|;vd*tvid04#k!7aV4r$)$V^iRDYa=cq`0lLV|)%7Tx2ZYF&sL> zEoI9Pi~yWkH(Vkt#OOz|XH^Q6`Jd1`godteiKY4+3gg1QYG&b#0rvJFTSqL3$>%>5 zGhkg5(lE;zmVXVgq8qI(AQ4_YQPOT`fnOn;)pX({TWgNyti}Y8-94S{AJ`MkIb}-y z0aC!|#M&}CD;kn8 z6RI9xV#Bryx1>76NbZLD0@PlOM|`A=4}&LJ&aX;)Bz%`D?_QW+t614jGpI_}Zzj*E z&pvq@zFH7Fb{G6b(CbX;m7oyOcO%n7%r6$iB(H9Ll9f=<83oyjhC#feiVHu?VHy3k z``}PZ|Dc&C*sUTf6Y>#yS2`(McV*ExE*V_F^JGAk${T2x>ik)hK`+BGIUv^=k>TY@ z&MHa9W{nK*S~p9eMVHgzXw(Ulg^df*794iD%qEjh75)O7ddOs+HXv6@ril&?Ohln| zUV@{mg@HODjjTF!GM#m0K||>m58SDj%mf|+gHWm)(_rJre8-2c)kh^&=n782ELm`sX4dxemFiSs{;u#w!*sA_e2CQ!Fn zZq|Mi`X-!+1r*cJ*r1o*?MGU^r5w_0YE)zRQhD@E9(Q5&H+>{)ic{gq%pR#;#!AT{ zPxiX?x!!5WW-z0!($?N5j%w5SKak1q-~Dp@zsz1aj&Z}UmK*x9pZ414pPZ$S>yHM! zp<7fhRZK%W@fdyy&~*&7l&@BQxmsrBpQz3z2g$9d?ar(G}9l@iYF#AS3XS$OSr<-w}+ zKj+7@cQ|r3!0s<#zdgbY1ctXB--SNkf4}Vc{RH}``by3}f#cIY zaIOL(d4J+7zuuw1$1>sopnV58&9)B!e-PJOhBWg56cilCpsFI*vJh1lJS}T- zX{b2`lWhB_g8Atxq2($V&JN!@BjZqX8?R7OZKs46qz<>TgCbsH$Uy7K7_%;8Ru99b zP@97{e}-DcShC=4c-MJ=kO#SO*BlEXoi%!+blRU!qv@eVM-8!jN@lQ zW_cy@5H==FsMMNcUeNFtmlIf}Uae21z@k7j#^Z5mVS^CBjXD11=^}(@t20x^m!{yT zX+e@g4ie0bV+g^w9nq#qGWd92E!yL=bgs=-2yEOl48wj_dX`HF17(--(tuehp5ZaaYIc@*OSIGJ; z4I>)k+|T~?-E^$Foa-dT*xFFZCiCrEv#4b0Gx_O1_MkXx)w5qSq+Y&n4v912>DNFj z+w)uH^;ZgiDJjr>Wo1lpLBDvF}VCLuA8M`=e(;7QXMw@l{( z=cOmGts~>&FR;>h3tIAT70re%X!)6t2*!WN_ro@H_R+-KDw*!07n^8Grm`ufp`N%wPr$$LH|&V zt_uWG?o+DAWciXVs+Xia(0;0>P%pl9G~MtNOjVFbspVT33H00NM(t9a;C>P*<~(kW zFzn}U$^fG$Z{ycM)ynttF`STIBZ+(su^0}w|S~ijg2qp1vD!Dh4g5HnwU{-*K zRBPohLZ4XP2?-B4#bZV#jefT@K6%#<4?ZFtK@l5@T%D2$DHiF4&l6-hGTNMR8zJYb;hdst*le_V|Ra{l`y607WM?p z(iw%bhISdlxbLbM)fF5rm1ZLbJ8dYETD1Mn7#_Ulx)LHYC0u~^Uz1pr7~(#PmM(mu zaHG#5{>06;2Ju4QFjU8T8>0!Kh9u;_(fU*3uCdEklJ?Z^q$cY`?xnWiht@*OEs|?! zh@d%i_*zr(-NhFU+f2N@|H=qn@fu#P&@>YR8;Yb^)rhZsJ9(8lfIv|WY1&9AY0pHS zR@@<+$*#gaMSv@f(ajuC#~ z1x?Z~|7%LT=pikC1a^hEks)Xnd|$6Z$susXF%2udia&ow%YYnyFv2fw2u9sbKZXi; zE9X-*p3hkG)KerW9(MxkjOF|D2xf(RjNqo!haTU1#LC8pKn+)t=9iKo@n}g=lny(6 zBc)X@z(@Z61E&zzYj#Zy<7M#o0!kW|Mh%JF^2}K#hRhHbx?-+B_UwS1@ZcEu3SN3~ zmsx9$!99xLnZGUZXJ7qe7N2{O{bLlu8CRj8nFY!egKlaywY@z~&ktJ+bi^{8Wf#>dsRgIK6DgnC$qDkF|x2_ywJ}=Fn zxNNfpxFXvJpi2)b@WlVr^d$PcLfVVk>dL@TXDbf{wnLK(*Og}~?5qR;np^%EI~#Z3;fcCh2e5o02I zm5Va-ZgPfD@rJC#X2oJA3o1Ce@V`{nCaJK`m6R81-sSa~@ImJ+vSzHC2$@aWLoJef z$sOhDJaS`I#_9OyZ8VZ_*r76zp(7QA)&t1GHgpph%CvMnvzvo9Fk^{;FMm}aSR)9Yt< zX&?2r^qRU^1Uj^1h^OWiSe6R^>e%>4ylZItw#I(RB% zE*uVIPb%n2N}Vbu^&9a<_v%91k}WjDoj;XKn$Ix>*-jPM@6nel^>u?TulM^~WJ7*` zd-(#Jd5yqX>f$&__`4Hx{|36=mqaBEoT%EkHiP~xeEJlH0)w@C@;}=*7?X{Pt+$H9 za%Gv7yoeMy8E(`fce*lAL(nb8bfY0F@clf(I{Q-oOlcZ4AS(Jws*2%8u&0CORD|84 z5eGi8INjhLq7>NS`Z0WE=ybXX&nQaZr77jP zgu?(n3E8HtEpo?d0Q+MqJmxAc#P%*I_BM(lC+U5c$3>W3P4C7j1H`<@J42J)o}%z& zLytOz#C7L*2TK{n8& z1+Wk2A2FwXBQq}uv{aO%*P2_KUpjqXPuvv`$>)*-{R-N9I}1`D+i8Bn zX0sH(*M0_eZv+ks>8z>!7(^i}LOfaRN9(&IKn=H#&X)3<*mteuAsTpe#N4vUrLHI> zu`7);A(F>CM>q?(TJ0gJ4HUaUI8*V5hi903S)n;W%R7hr`b`zZVXIMv?$b3$(PU`{ ztVyJAti)J{EUKxJV z{+}Cxnl#eo(_<4wYAsR$YN#eStC)=(jOWcbEthTDyPZ5c#-6wE6~vI`DG!Eh@T9S` zW1h;w?2$SlHZLSkJ)?M%!kkTdOm+~Y1j}BA_D(eOr12eDdw#p}qm6QVuziv&9rf?o zOG)$VzI-@UQ})S^pS@5a=>0Gq4}>L?HeJKxB4TcI3lsquM_i_b4z0BXh#F9-?5;O# zH6>Mv^@I-EuBKqlr3^Y&sYo_#kQMOt?g7-ue1Ak`c3kf2O_I zgL0ANx$V?Q^E+Ybx|M}~>Bj`7qZp+=Q*OcgnYZ&rFwb$7=0cp)Rys0) zyAwricSE zCU@IEA<(H#Uc~2;mpK^}OtofiENHT6KLq@_`_A(;;RQ!YKb{|(LTAWjSS2T7Ga^^Y z*n&9wccis=q>;jP;>^3VrVwbXpRF z{N@>RX$(@_n2>MRR{enS{gsC-EdAVKqy5Jy>k64LY<7E_2CbZ_*%ee>e)YYQVwjCP z38}I*>h1ma!q?37Rq~wKSM>GgONavg_ob#A z|37Sh55$tdhAm*V{03q`*vCxJpD&RL*b+iI%s{=z$A>z*tjgI$F$MzbUA#B>(!KKO z`;)Q#7>XsujHcz!q=J;5l|5V**$yxHu~?28j4jfTZ09Vu>g&jC2z3Z^yyk|sfI1Gb zu@p6nh2gBf7$3$FqKxy{i4ccHC87Raa@@PO%P;>SiK=i(nnak(`(nN>sfzYDaEfm% z9MO~aO&ofhA7*SS6dGo%+l{51h*Jm$_>OAVyIXO>5*9y=*Jah4+6^WM)NdG95Mt&XtcG1J?d2hwA(uMt!uXt5oKkdtFy_CKxM)0(u^{V{eAtxby;rN{oLcJ)kk;U3t|2j zcEj&-iEH1ca7GjC@T$PXg?CG*^Etn9RV|`4b_|J%I$X<#(AG}y(5MI>5=faXoU}Rr zP%r5R##pcFzU>8lek=(61y+Ip-QM^&3;%8w{^N*$l#dwmN|jqt1o}5y7((7x{pKO< zQJm2{*-C76+>l)5CzV;G-z+ecfzvdQy#z*OdC?k-ta7#2;2?bA?kqX`T@Qo#*0;ZedL^?~1(2zZ_U@I@&oKjkf(uNEL z%p=wbz{<6%EHj5v*0@_LOs^n0F;8qN|6oOlOaq-nmV$|%TI4|?VzC&*_Dsbq`T>SI zj6`Qy70tXoRMn9y#LBL{KuSmbXH(j11JDVp*<0iDQ&FP7t|4ur3OU( zq}7SS4hD(B-J3cBB1IRjwZ!eS5x?lLM|=WE*E?fwJ}+rW>S{t=?f5@9V6^S3;X&4e zk+Yu}z;Ew3PuIXr2zD8^P{SbdMoVxUp%SI`li9Od;uc;gD%LmKbg64-X+dz)O!CN( z!rB;2Fw;A(hjuj7t*Q3N0%$z717j>g*s!gv21d6m_2;$_lNe12bi6q=kORkwkJ0<|$R) z8yJ5twRhI{%4-UUT11<#w-n+b>a6vup{O0Ci8r~tPwX?>ilQOzdfSKdtX_0(QdY$ArP!if+f5t0WbSng)HY+;Ty==eE1k5F-N*Q3-M{w z&vVv)CBqrl*_VpmR{dID-k9)jfXIFCf2khI>%d*2r?UlaouNuC&{IEC>N?5(4RFsv zjc1-|5Rf8|_S=m*z0zDLtJWj1dO@rX>lP%lv!tw)DX8Hc;8rH+QtU`A+AQ9ZmRQyf zbt|;eK=Yjn&IT|9ph^2IdHhs)qB4fVrC|Ugvv21j5BY7IgkZ9SlgNb8O)SbN62awi z6Su80htNkMElsAB^0bI&{*w-F%9_Hx{;mD}gH=tPZ8Ma0MN0%Bq7bfGAOYD8)*6nH z%+%4sI40_qVOMe>{-P_mhN+qX)Tk|?Dg!cZ+*K061?|`TbKV_fYg+vb`DNFJhOD(2 z|5;s0Xt3oLwZ!2A&7C}GPvI+9g*7OqgBA1{eH-aG!%*g@UdH0;Fmx^u! zN$e4gJN|xonMwfyZyJUYCR_8kdoW;BZ@j{Ll2<{PY;0SK7tTRmVu-+MV;4w7W?Taw z>_4D4uP~Gzg5T$FN$Da=l93_=L-hc4_uhO| zg5p6l&)?3-%Wth;3Wpy}?vELVMhaY5O*Zc9B3i)$Vl9mun@Uc~Ya#@AoC1Rz!X(^? z1s|`hSN-8x<$T(B?K)&nWeh`oW5EOTM z%{WW(tJx3=68t^h=}|R}|5)PbOuD=;u^}BD@SG{F_uW zl1k)BB2JllMkr46Uqmtmzrc@F;Kfj$w#Il4ACx5Bb+1Uuh)0*9Bxo}tINH43Qo6_X zgGQ~%L$vu#8H6M6hA^LU^w{;>L270|P=`{Mbf-$pl&DWcV+TYQiqhe#`pWkFrCgQ! zb){@??_g2dxM>AXvfftvoQa=o{9zOBLbWu&o03O0n@HvHrVod@XpE?3=v66Cm8TXz zY4EAxt3Q+lmofcNk@PIl2U5e)LYhMLPnVMB!{4VP6S3XJVw?zUK{-?brFY}dji}g!cOkY`G?QTzly!=t9&Jf4Q>}`p6<0ZK?Zf$n6gJpo}oH4-ow`rzq zLKJ1sy~5Pm+Qeuk*PEe6&-Sy#nZAGLFctYdm3pWy(n1nhNhYE9!X_fi3Dpp7F|RVh zgr2Z&wC#>&1jh67P4=Ekh_%jATjWtE2!my{H-I3lPG;3`;8k!hGH z@b8X!Dm(644y@3{Lwq`YL^^anM|5dA6Esx?(H0afR^QU%fQxgXUg}0ZN?e(3fdSzZ zzc1P~`yrfnjq^uQIQFd#^E%iaiiRsSUq{tCCwW)9n_CAxSIBsX`72HPC`Q?+3PXug zVah`YHx6iYDkD{47KXY52F=hZRV5zzUeD4rL<&Z!U>#g;%ip+J^w6eMB?xB5KLTP7 zBBWQTn(Wb%#J6HbOT|}SguCLYdGPW}&75i6pq7+mN84Gqaw_@6(EMxRnQR-X1iJ!2 znwRc+i}A9nV0YZF{b|dpsQ>fdUn5|K;lJ0t@|r7)`|H|FHdG>qDp6`{7Ih+Vwj%^dB@1!61*J#Govj95fQAGS)FW}%qTX5lE5!tN z3n%j^yN<8CD+TFK9AyMrtYUD;5sXHbVz6>fEH)~MB{$t^FkzI|DB(0#NgfNxt}G<` z@R|gCnpFAwp9*_1?b{049<&7}{(`5vBZ^V9sjk()yaSUgN2h&d6z=ei=jcpWesgph zGuVi0mVoST@(3FDombOG<<$U_5PFHA45Q%e6+&kA>=YY>fO>`%7m3 zG_9*^-LL8OTgMg<7BaK9{$Gx~qNSHl;QaIcIwAb;D31BLW{28(;In_Iu=@!Z&iM}1 zpNfE+&V(}jcKgRr{ibwy-o%gQ1>DzRwPc>bt+XqjndO~eU3W77o*?5==vu{bF(`UQ z@+lptJ5I~~Sw1h&IFFwd*5=+ZmYmMsm%^-rnk_*X$j1Q9_h;hHTvUV?u-ssXhTTp` zm7E}7F&%0paF3HhzJf(3>Xh{w#{+G?QT6zI>D|bLwimU z*!~5E&+S=`DxPR*3sr-j(tMq>tz=S4F+MrVqt8+wLZg2B)8wxYr}az{a}>ZTQESMT zu7Ut9h~`}PTWwrqQdMS}Y$uM#!A25H29s5(ll&+NUCa?aIix|4lFr(I$?F41wq~Gw zly65Vd1xpLfL=11@U42Y0;JQK^~LDs7hu%!J8}h@tf$$!kH;9cN$EYd$q79)|IBD{ z);=*t4L+WU#MU|21Sn>cf%WW?C&hWeDSgI$0ZF`rJ^EKXq+#Ggxc6o7=X(!6Qz~#K zy2;6;eSzvdz1G-5dQ12k3{H&rn5-kzKaU8gq{-$1xB*nNBZG{2c zytFFge~suif6>IEF`@`fsM9oR2#V-?%_Xuik4xIl+Pr4lYsEsa{ ze1J_xogP)FZ5|o=v;W`|>6d*s#-nW{inr7^UV#Eg?4WY5ZS^@k_W+c5$MsPkJkhekJauVi;P;eM~8Wa#-NXiB||Xl8+kL zkM&u@-WqjPa;oTjdw3d^B)e847a6Sm7W2AOM`b8|>)g^sO{pg+!y3Zw>f~t=f!8m& zIl`sIQs*I9iliw`kW`Rk+jf|cW7@N*zvcCbO!6Hw6bx#0+KIPlfm>hwcPlFVe?
$vAf`l8bPtNR97^MR)VZ%0k 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%0DoRe>8^HBzD>fzxp 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
^nT2*NWXRb;DHQym~(gEgkK)U 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
W-Rbih!H+y_MF_8k8 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

  1. ?$Jh$yQ~L_fJ^|cYcSbS7TFHhR6X)#rQSRH1 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 eZ_8G<{%-)Fo)6_z4)uos0000 Date: Thu, 19 Apr 2012 22:24:03 -0500 Subject: [PATCH 024/695] Fixed the alpha channel calculations on the difference, exclusion, and subtract blend filters. --- .../FilterShowcase/ShowcaseFilterViewController.m | 2 +- framework/Source/GPUImageDifferenceBlendFilter.m | 3 +-- framework/Source/GPUImageExclusionBlendFilter.m | 2 +- framework/Source/GPUImageSubtractBlendFilter.m | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 9da823640..502b9851d 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -491,7 +491,7 @@ - (void)setupFilter; }; break; case GPUIMAGE_EXCLUSIONBLEND: { - self.title = @"Exlusion Blend"; + self.title = @"Exclusion Blend"; self.filterSettingsSlider.hidden = YES; filter = [[GPUImageExclusionBlendFilter alloc] init]; diff --git a/framework/Source/GPUImageDifferenceBlendFilter.m b/framework/Source/GPUImageDifferenceBlendFilter.m index 3e7146b0e..5c5bb548a 100644 --- a/framework/Source/GPUImageDifferenceBlendFilter.m +++ b/framework/Source/GPUImageDifferenceBlendFilter.m @@ -11,8 +11,7 @@ void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); - mediump vec4 whiteColor = vec4(1.0); - gl_FragColor = abs(textureColor2 - textureColor); + gl_FragColor = vec4(abs(textureColor2.rgb - textureColor.rgb), textureColor.a); } ); diff --git a/framework/Source/GPUImageExclusionBlendFilter.m b/framework/Source/GPUImageExclusionBlendFilter.m index 3abbda6d8..c2e8f9bff 100644 --- a/framework/Source/GPUImageExclusionBlendFilter.m +++ b/framework/Source/GPUImageExclusionBlendFilter.m @@ -11,7 +11,7 @@ void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); - gl_FragColor = textureColor + textureColor2 - (2.0 * textureColor * textureColor2); + gl_FragColor = vec4(textureColor.rgb + textureColor2.rgb - (2.0 * textureColor.rgb * textureColor2.rgb), textureColor.a); } ); diff --git a/framework/Source/GPUImageSubtractBlendFilter.m b/framework/Source/GPUImageSubtractBlendFilter.m index 3f35beed2..4e63f5707 100644 --- a/framework/Source/GPUImageSubtractBlendFilter.m +++ b/framework/Source/GPUImageSubtractBlendFilter.m @@ -12,7 +12,7 @@ void main() lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); - gl_FragColor = textureColor - textureColor2; + gl_FragColor = vec4(textureColor.rgb - textureColor2.rgb, textureColor.a); } ); From 35fbfa2b0b67da3b5f9e487489cca922b8d8628c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 19 Apr 2012 22:58:31 -0500 Subject: [PATCH 025/695] Fixed the CubeExample for iOS 4.x devices. --- examples/CubeExample/Classes/DisplayViewController.m | 2 +- examples/CubeExample/Classes/ES2Renderer.m | 6 +++--- examples/CubeExample/CubeExample.xcodeproj/project.pbxproj | 6 ++++-- framework/Source/GPUImageView.m | 6 +++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/CubeExample/Classes/DisplayViewController.m b/examples/CubeExample/Classes/DisplayViewController.m index a728008ce..97438fa09 100644 --- a/examples/CubeExample/Classes/DisplayViewController.m +++ b/examples/CubeExample/Classes/DisplayViewController.m @@ -31,7 +31,7 @@ - (void)loadView self.view = primaryView; renderer = [[ES2Renderer alloc] initWithSize:[primaryView sizeInPixels]]; - + textureInput = [[GPUImageTextureInput alloc] initWithTexture:renderer.outputTexture size:[primaryView sizeInPixels]]; filter = [[GPUImagePixellateFilter alloc] init]; [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:0.01]; diff --git a/examples/CubeExample/Classes/ES2Renderer.m b/examples/CubeExample/Classes/ES2Renderer.m index f06dd3e11..e07b182d6 100644 --- a/examples/CubeExample/Classes/ES2Renderer.m +++ b/examples/CubeExample/Classes/ES2Renderer.m @@ -64,9 +64,9 @@ - (id)initWithSize:(CGSize)newSize; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); +// GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); +// +// NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); glBindTexture(GL_TEXTURE_2D, 0); diff --git a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj b/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj index 84466c4da..a3244fbc7 100755 --- a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj +++ b/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj @@ -293,7 +293,6 @@ GCC_PREFIX_HEADER = CubeExample_Prefix.pch; "GCC_THUMB_SUPPORT[arch=armv6]" = ""; INFOPLIST_FILE = "CubeExample-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; PRODUCT_NAME = CubeExample; }; name = Debug; @@ -307,7 +306,6 @@ GCC_PREFIX_HEADER = CubeExample_Prefix.pch; "GCC_THUMB_SUPPORT[arch=armv6]" = ""; INFOPLIST_FILE = "CubeExample-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; PRODUCT_NAME = CubeExample; VALIDATE_PRODUCT = YES; }; @@ -324,6 +322,8 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../framework/**"; + IPHONEOS_DEPLOYMENT_TARGET = 4.1; + OTHER_LDFLAGS = "-fobjc-arc"; PREBINDING = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -340,7 +340,9 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../framework/**"; + IPHONEOS_DEPLOYMENT_TARGET = 4.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + OTHER_LDFLAGS = "-fobjc-arc"; PREBINDING = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 5c4dd4989..7ee016732 100644 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -78,10 +78,10 @@ - (void)commonInit; { self.contentScaleFactor = [[UIScreen mainScreen] scale]; } - + [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; self.fillMode = kGPUImageFillModePreserveAspectRatio; - + CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; @@ -107,7 +107,7 @@ - (void)commonInit; displayPositionAttribute = [displayProgram attributeIndex:@"position"]; displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader - + [displayProgram use]; glEnableVertexAttribArray(displayPositionAttribute); glEnableVertexAttribArray(displayTextureCoordinateAttribute); From 694d36457d4ab1637fcaa52c242fb777c85df5e4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 20 Apr 2012 13:41:42 -0500 Subject: [PATCH 026/695] Fixed the RotateRightFlipVertical rotation mode to pass in the correct image size. --- .../SimpleVideoFilter/SimpleVideoFilterViewController.m | 1 + framework/Source/GPUImageMovie.m | 2 +- framework/Source/GPUImageRotationFilter.m | 2 +- framework/Source/GPUImageVideoCamera.m | 4 +++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 1681566f9..102c552b6 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -22,6 +22,7 @@ - (void)viewDidLoad [super viewDidLoad]; videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; filter = [[GPUImagePixellateFilter alloc] init]; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 918f53582..c3fb05850 100644 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -197,7 +197,7 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); if (!texture || err) { - NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + NSLog(@"Movie CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); return; } diff --git a/framework/Source/GPUImageRotationFilter.m b/framework/Source/GPUImageRotationFilter.m index 36863d371..3fb67ab11 100644 --- a/framework/Source/GPUImageRotationFilter.m +++ b/framework/Source/GPUImageRotationFilter.m @@ -37,7 +37,7 @@ - (void)setInputSize:(CGSize)newSize; { CGSize processedSize = newSize; - if ( (rotationMode == kGPUImageRotateLeft) || (rotationMode == kGPUImageRotateRight) ) + if ( (rotationMode == kGPUImageRotateLeft) || (rotationMode == kGPUImageRotateRight) || (rotationMode == kGPUImageRotateRightFlipVertical) ) { processedSize.width = newSize.height; processedSize.height = newSize.width; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index aadd80d51..ab5ad1605 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -231,10 +231,12 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); if (!texture || err) { - NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); return; } +// NSLog(@"Good frame"); + outputTexture = CVOpenGLESTextureGetName(texture); // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); From e057b3f22b6c80cd683b9000ddb05a6abd892214 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 20 Apr 2012 14:48:38 -0500 Subject: [PATCH 027/695] The transform filter now obeys the aspect ratio of the image it's transforming. This can be disabled, but it's on by default. --- README.md | 1 + .../ShowcaseFilterViewController.m | 1 + framework/Source/GPUImageTransformFilter.h | 6 +- framework/Source/GPUImageTransformFilter.m | 107 +++++++++++++++++- 4 files changed, 113 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 917d97ef3..5bb2472fc 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ For example, an application that takes in live video from the camera, converts t - **GPUImageTransformFilter**: This applies an arbitrary 2-D or 3-D transformation to an image - *affineTransform*: This takes in a CGAffineTransform to adjust an image in 2-D - *transform3D*: This takes in a CATransform3D to manipulate an image in 3-D + - *ignoreAspectRatio*: By default, the aspect ratio of the transformed image is maintained, but this can be set to YES to make the transformation independent of aspect ratio - **GPUImageCropFilter**: This crops an image to a specific region, then passes only that region on to the next stage in the filter - *cropRegion*: A rectangular area to crop out of the image, normalized to coordinates from 0.0 - 1.0. The (0.0, 0.0) position is in the upper left of the image. diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 502b9851d..2d8b40d09 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -249,6 +249,7 @@ - (void)setupFilter; filter = [[GPUImageTransformFilter alloc] init]; [(GPUImageTransformFilter *)filter setAffineTransform:CGAffineTransformMakeRotation(2.0)]; +// [(GPUImageTransformFilter *)filter setIgnoreAspectRatio:YES]; }; break; case GPUIMAGE_TRANSFORM3D: { diff --git a/framework/Source/GPUImageTransformFilter.h b/framework/Source/GPUImageTransformFilter.h index 743664f64..ca93365fc 100644 --- a/framework/Source/GPUImageTransformFilter.h +++ b/framework/Source/GPUImageTransformFilter.h @@ -2,11 +2,15 @@ @interface GPUImageTransformFilter : GPUImageFilter { - GLint transformMatrixUniform; + GLint transformMatrixUniform, orthographicMatrixUniform; + GLfloat orthographicMatrix[16]; } // You can either set the transform to apply to be a 2-D affine transform or a 3-D transform. The default is the identity transform (the output image is identical to the input). @property(readwrite, nonatomic) CGAffineTransform affineTransform; @property(readwrite, nonatomic) CATransform3D transform3D; +// This applies the transform to the raw frame data if set to YES, the default of NO takes the aspect ratio of the image input into account when rotating +@property(readwrite, nonatomic) BOOL ignoreAspectRatio; + @end diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index 0355f0b20..5ceb1efb5 100644 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -6,12 +6,13 @@ attribute vec4 inputTextureCoordinate; uniform mat4 transformMatrix; + uniform mat4 orthographicMatrix; varying vec2 textureCoordinate; void main() { - gl_Position = transformMatrix * vec4(position.xyz, 1.0); + gl_Position = transformMatrix * vec4(position.xyz, 1.0) * orthographicMatrix; textureCoordinate = inputTextureCoordinate.xy; } ); @@ -20,6 +21,7 @@ @implementation GPUImageTransformFilter @synthesize affineTransform; @synthesize transform3D = _transform3D; +@synthesize ignoreAspectRatio = _ignoreAspectRatio; #pragma mark - #pragma mark Initialization and teardown @@ -32,6 +34,7 @@ - (id)init; } transformMatrixUniform = [filterProgram uniformIndex:@"transformMatrix"]; + orthographicMatrixUniform = [filterProgram uniformIndex:@"orthographicMatrix"]; self.transform3D = CATransform3DIdentity; @@ -41,6 +44,36 @@ - (id)init; #pragma mark - #pragma mark Conversion from matrix formats +- (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)right bottom:(GLfloat)bottom top:(GLfloat)top near:(GLfloat)near far:(GLfloat)far; +{ + GLfloat r_l = right - left; + GLfloat t_b = top - bottom; + GLfloat f_n = far - near; + GLfloat tx = - (right + left) / (right - left); + GLfloat ty = - (top + bottom) / (top - bottom); + GLfloat tz = - (far + near) / (far - near); + + matrix[0] = 2.0f / r_l; + matrix[1] = 0.0f; + matrix[2] = 0.0f; + matrix[3] = tx; + + matrix[4] = 0.0f; + matrix[5] = 2.0f / t_b; + matrix[6] = 0.0f; + matrix[7] = ty; + + matrix[8] = 0.0f; + matrix[9] = 0.0f; + matrix[10] = 2.0f / f_n; + matrix[11] = tz; + + matrix[12] = 0.0f; + matrix[13] = 0.0f; + matrix[14] = 0.0f; + matrix[15] = 1.0f; +} + - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matrix; { // struct CATransform3D @@ -69,6 +102,60 @@ - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matr matrix[15] = (GLfloat)transform3D->m44; } +#pragma mark - +#pragma mark GPUImageInput + +- (void)newFrameReadyAtTime:(CMTime)frameTime; +{ + CGSize currentFBOSize = [self sizeOfFBO]; + CGFloat normalizedHeight = currentFBOSize.height / currentFBOSize.width; + + GLfloat adjustedVertices[] = { + -1.0f, -normalizedHeight, + 1.0f, -normalizedHeight, + -1.0f, normalizedHeight, + 1.0f, normalizedHeight, + }; + static const GLfloat squareVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat squareTextureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + if (_ignoreAspectRatio) + { + [self renderToTextureWithVertices:squareVertices textureCoordinates:squareTextureCoordinates sourceTexture:filterSourceTexture]; + } + else + { + [self renderToTextureWithVertices:adjustedVertices textureCoordinates:squareTextureCoordinates sourceTexture:filterSourceTexture]; + } + + [self informTargetsAboutNewFrameAtTime:frameTime]; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + if (!_ignoreAspectRatio) + { + [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * filterFrameSize.height / filterFrameSize.width) top:(1.0 * filterFrameSize.height / filterFrameSize.width) near:-1.0 far:1.0]; + // [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * (GLfloat)backingHeight / (GLfloat)backingWidth) top:(1.0 * (GLfloat)backingHeight / (GLfloat)backingWidth) near:-2.0 far:2.0]; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + glUniformMatrix4fv(orthographicMatrixUniform, 1, GL_FALSE, orthographicMatrix); + } +} + #pragma mark - #pragma mark Accessors @@ -96,5 +183,23 @@ - (void)setTransform3D:(CATransform3D)newValue; glUniformMatrix4fv(transformMatrixUniform, 1, GL_FALSE, temporaryMatrix); } +- (void)setIgnoreAspectRatio:(BOOL)newValue; +{ + _ignoreAspectRatio = newValue; + + if (_ignoreAspectRatio) + { + [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:-1.0 top:1.0 near:-1.0 far:1.0]; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + glUniformMatrix4fv(orthographicMatrixUniform, 1, GL_FALSE, orthographicMatrix); + } + else + { + [self setupFilterForSize:[self sizeOfFBO]]; + } +} @end From ab81d729adcb6c281d30bcc852a7215e150dccb7 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 20 Apr 2012 15:29:07 -0500 Subject: [PATCH 028/695] This should fix the black video frames at the start of recorded movies. --- .../SimpleVideoFilterViewController.m | 29 +++++++++++-------- framework/Source/GPUImageMovieWriter.m | 18 ++++++++++++ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 102c552b6..d43d2442a 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -49,23 +49,28 @@ - (void)viewDidLoad NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; - movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; +// movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; // movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720.0, 1280.0)]; -// movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1080.0, 1920.0)]; + movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1080.0, 1920.0)]; [filter addTarget:movieWriter]; - videoCamera.audioEncodingTarget = movieWriter; - - [movieWriter startRecording]; [videoCamera startCameraCapture]; - double delayInSeconds = 10.0; - dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); - dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ - [filter removeTarget:movieWriter]; - videoCamera.audioEncodingTarget = nil; - [movieWriter finishRecording]; - NSLog(@"Movie completed"); + double delayToStartRecording = 0.5; + dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, delayToStartRecording * NSEC_PER_SEC); + dispatch_after(startTime, dispatch_get_main_queue(), ^(void){ + NSLog(@"Start recording"); + videoCamera.audioEncodingTarget = movieWriter; + [movieWriter startRecording]; + + double delayInSeconds = 10.0; + dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); + dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ + [filter removeTarget:movieWriter]; + videoCamera.audioEncodingTarget = nil; + [movieWriter finishRecording]; + NSLog(@"Movie completed"); + }); }); } diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 59293dca1..e38fbabd7 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -30,6 +30,8 @@ @interface GPUImageMovieWriter () GLubyte *frameData; CMTime startTime, previousFrameTime; + + BOOL isRecording; } // Movie recording @@ -126,6 +128,8 @@ - (void)dealloc; - (void)initializeMovie; { + isRecording = NO; + frameData = (GLubyte *) malloc((int)videoSize.width * (int)videoSize.height * 4); // frameData = (GLubyte *) calloc(videoSize.width * videoSize.height * 4, sizeof(GLubyte)); @@ -197,6 +201,7 @@ - (void)initializeMovie; - (void)startRecording; { + isRecording = YES; startTime = kCMTimeInvalid; // [assetWriter startWriting]; @@ -205,12 +210,18 @@ - (void)startRecording; - (void)finishRecording; { + isRecording = NO; // [assetWriterVideoInput markAsFinished]; [assetWriter finishWriting]; } - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; { + if (!isRecording) + { + return; + } + if (_hasAudioTrack) { CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); @@ -365,6 +376,8 @@ - (void)renderAtInternalSize; glVertexAttribPointer(colorSwizzlingTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + glFlush(); } #pragma mark - @@ -372,6 +385,11 @@ - (void)renderAtInternalSize; - (void)newFrameReadyAtTime:(CMTime)frameTime; { + if (!isRecording) + { + return; + } + // Drop frames forced by images and other things with no time constants // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) ) From 3a68d6516d04b11e782dba72e77e67a4c9b77065 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 20 Apr 2012 16:26:05 -0500 Subject: [PATCH 029/695] Removed the GL_BLEND enabling which slowed down the entire framework. --- framework/Source/GPUImageFilter.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index b45d90e55..f61768002 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -245,9 +245,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, sourceTexture); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - glUniform1i(filterInputTextureUniform, 2); if (filterSourceTexture2 != 0) From 9ef1e28b6bdce5599ab7dcd1d06a36ecc26cc86a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 21 Apr 2012 16:26:16 -0500 Subject: [PATCH 030/695] Added a notice about requiring the weak linking of CoreVideo.framework for iOS 4.x targets, fixed all sample code to match. --- README.md | 2 ++ .../ColorObjectTracking.xcodeproj/project.pbxproj | 2 +- .../CubeExample/CubeExample.xcodeproj/project.pbxproj | 2 +- .../FilterShowcase.xcodeproj/project.pbxproj | 2 +- .../MultiViewFilterExample.xcodeproj/project.pbxproj | 2 +- .../SimpleImageFilter.xcodeproj/project.pbxproj | 2 +- .../SimplePhotoFilter.xcodeproj/project.pbxproj | 2 +- .../SimpleVideoFileFilter.xcodeproj/project.pbxproj | 2 +- .../SimpleVideoFilter.xcodeproj/project.pbxproj | 2 +- framework/GPUImage.xcodeproj/project.pbxproj | 10 +++++----- 10 files changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 5bb2472fc..e37149cfc 100644 --- a/README.md +++ b/README.md @@ -245,6 +245,8 @@ To use the GPUImage classes within your application, simply include the core fra As a note: if you run into the error "Unknown class GPUImageView in Interface Builder" or the like when trying to build an interface with Interface Builder, you may need to add -ObjC to your Other Linker Flags in your project's build settings. +Also, if you need to deploy this to iOS 4.x, it appears that the current version of Xcode (4.3) requires that you weak-link the Core Video framework in your final application or you see crashes with the message "Symbol not found: _CVOpenGLESTextureCacheCreate" when you create an archive for upload to the App Store or for ad hoc distribution. To do this, go to your project's Build Phases tab, expand the Link Binary With Libraries group, and find CoreVideo.framework in the list. Change the setting for it in the far right of the list from Required to Optional. + Additionally, this is an ARC-enabled framework, so if you want to use this within a manual reference counted application targeting iOS 4.x, you'll need to add -fobjc-arc to your Other Linker Flags as well. ## Performing common tasks ## diff --git a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj b/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj index 4f74e0e43..2ea670121 100644 --- a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj +++ b/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj @@ -19,7 +19,7 @@ BCB5E7A314E346BE00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A214E346BE00701302 /* AVFoundation.framework */; }; BCB5E7A414E346CE00701302 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC245E1214DDCA1F009FE7EB /* libGPUImage.a */; }; BCB5E7A614E346F100701302 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A514E346F100701302 /* OpenGLES.framework */; }; - BCB5E7A814E3471100701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A714E3471100701302 /* CoreVideo.framework */; }; + BCB5E7A814E3471100701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A714E3471100701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCB5E7AA14E3472100701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A914E3472100701302 /* CoreMedia.framework */; }; BCB5E7B214E460D300701302 /* Threshold.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E7B114E460D300701302 /* Threshold.fsh */; }; /* End PBXBuildFile section */ diff --git a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj b/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj index a3244fbc7..6fdfafe55 100755 --- a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj +++ b/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj @@ -18,7 +18,7 @@ 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD15070DC6FC5B0079059D /* QuartzCore.framework */; }; BCB6B8A41505A9840041703B /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A11505A9840041703B /* AVFoundation.framework */; }; BCB6B8A51505A9840041703B /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A21505A9840041703B /* CoreMedia.framework */; }; - BCB6B8A61505A9840041703B /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A31505A9840041703B /* CoreVideo.framework */; }; + BCB6B8A61505A9840041703B /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A31505A9840041703B /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCB6B8A91505A9AA0041703B /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B88C150447DF0041703B /* libGPUImage.a */; }; BCB6B8C41505C2780041703B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8C31505C2780041703B /* CoreGraphics.framework */; }; BCF3D690153CC5E6009A1FE5 /* DisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68F153CC5E6009A1FE5 /* DisplayViewController.m */; }; diff --git a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 7e08f1c86..d16db5c4b 100644 --- a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -16,7 +16,7 @@ BC982B1314F046AC0001FF6F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B1214F046AC0001FF6F /* main.m */; }; BC982B1714F046AC0001FF6F /* ShowcaseAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B1614F046AC0001FF6F /* ShowcaseAppDelegate.m */; }; BC982B2014F048160001FF6F /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B1D14F048160001FF6F /* CoreMedia.framework */; }; - BC982B2114F048160001FF6F /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B1E14F048160001FF6F /* CoreVideo.framework */; }; + BC982B2114F048160001FF6F /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B1E14F048160001FF6F /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BC982B2214F048160001FF6F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B1F14F048160001FF6F /* QuartzCore.framework */; }; BC982B2414F0481C0001FF6F /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B2314F0481C0001FF6F /* AVFoundation.framework */; }; BC982B2614F048230001FF6F /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B2514F048230001FF6F /* OpenGLES.framework */; }; diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj index a54bcfe9f..aaa2ae92f 100644 --- a/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj +++ b/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj @@ -15,7 +15,7 @@ BC01CA9614E7620600967264 /* MultiViewAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01CA9514E7620600967264 /* MultiViewAppDelegate.m */; }; BC01CAAA14E762DE00967264 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAA514E762BF00967264 /* libGPUImage.a */; }; BC01CAAC14E762E600967264 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAAB14E762E600967264 /* CoreMedia.framework */; }; - BC01CAAE14E762EE00967264 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAAD14E762EE00967264 /* CoreVideo.framework */; }; + BC01CAAE14E762EE00967264 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAAD14E762EE00967264 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BC01CAB014E762F600967264 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAAF14E762F600967264 /* QuartzCore.framework */; }; BC01CAB214E762FD00967264 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAB114E762FD00967264 /* OpenGLES.framework */; }; BC01CAB514E763FC00967264 /* MultiViewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01CAB414E763FC00967264 /* MultiViewViewController.m */; }; diff --git a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj index 496d450d9..1e1db03ec 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj @@ -17,7 +17,7 @@ BCB5E81A14E6136B00701302 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E81514E610BE00701302 /* libGPUImage.a */; }; BCB5E82314E62A3C00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E81E14E62A3C00701302 /* AVFoundation.framework */; }; BCB5E82414E62A3C00701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E81F14E62A3C00701302 /* CoreMedia.framework */; }; - BCB5E82514E62A3C00701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E82014E62A3C00701302 /* CoreVideo.framework */; }; + BCB5E82514E62A3C00701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E82014E62A3C00701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCB5E82614E62A3C00701302 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E82114E62A3C00701302 /* OpenGLES.framework */; }; BCB5E82714E62A3C00701302 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E82214E62A3C00701302 /* QuartzCore.framework */; }; BCB5E86314E6F05A00701302 /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E86214E6F05A00701302 /* WID-small.jpg */; }; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index e39f94221..e26749bad 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -15,7 +15,7 @@ BCC1E6B11523E3630006EFA5 /* PhotoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E6B01523E3630006EFA5 /* PhotoAppDelegate.m */; }; BCC1E6C51523E3A10006EFA5 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C01523E3880006EFA5 /* libGPUImage.a */; }; BCC1E6CA1523E3C50006EFA5 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C61523E3C50006EFA5 /* CoreMedia.framework */; }; - BCC1E6CB1523E3C50006EFA5 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C71523E3C50006EFA5 /* CoreVideo.framework */; }; + BCC1E6CB1523E3C50006EFA5 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C71523E3C50006EFA5 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCC1E6CC1523E3C50006EFA5 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C81523E3C50006EFA5 /* OpenGLES.framework */; }; BCC1E6CD1523E3C50006EFA5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C91523E3C50006EFA5 /* QuartzCore.framework */; }; BCC1E6D01523E4780006EFA5 /* PhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E6CF1523E4780006EFA5 /* PhotoViewController.m */; }; diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj index ebac0d084..d8f1e29ca 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj @@ -18,7 +18,7 @@ BCB5DDE914E868C0000AF3C2 /* SimpleVideoFileFilterViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB5DDE714E868C0000AF3C2 /* SimpleVideoFileFilterViewController.xib */; }; BCB5DDF914E876DD000AF3C2 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDF814E876DD000AF3C2 /* AVFoundation.framework */; }; BCB5DDFC14E876ED000AF3C2 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFA14E876ED000AF3C2 /* CoreMedia.framework */; }; - BCB5DDFD14E876ED000AF3C2 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */; }; + BCB5DDFD14E876ED000AF3C2 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCB5DDFF14E87783000AF3C2 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFE14E87783000AF3C2 /* QuartzCore.framework */; }; BCB5DE0114E87789000AF3C2 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DE0014E87789000AF3C2 /* OpenGLES.framework */; }; BCB5DE0214E8779B000AF3C2 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDF314E8756B000AF3C2 /* libGPUImage.a */; }; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj b/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj index c74cf812c..fae63ea94 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj @@ -17,7 +17,7 @@ BCB5DDE914E868C0000AF3C2 /* SimpleVideoFilterViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB5DDE714E868C0000AF3C2 /* SimpleVideoFilterViewController.xib */; }; BCB5DDF914E876DD000AF3C2 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDF814E876DD000AF3C2 /* AVFoundation.framework */; }; BCB5DDFC14E876ED000AF3C2 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFA14E876ED000AF3C2 /* CoreMedia.framework */; }; - BCB5DDFD14E876ED000AF3C2 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */; }; + BCB5DDFD14E876ED000AF3C2 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCB5DDFF14E87783000AF3C2 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFE14E87783000AF3C2 /* QuartzCore.framework */; }; BCB5DE0114E87789000AF3C2 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DE0014E87789000AF3C2 /* OpenGLES.framework */; }; BCB5DE0214E8779B000AF3C2 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDF314E8756B000AF3C2 /* libGPUImage.a */; }; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 8d6cb1036..a9a58bedf 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -9,12 +9,12 @@ /* Begin PBXBuildFile section */ 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; - 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; }; - 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; 6EE27494150E8FC60040DDB6 /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */; }; + 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; }; + 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; }; 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; @@ -80,7 +80,7 @@ BCB5E77114E20B8A00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77014E20B8A00701302 /* AVFoundation.framework */; }; BCB5E77314E20B9100701302 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77214E20B9100701302 /* QuartzCore.framework */; }; BCB5E77514E20B9700701302 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77414E20B9700701302 /* OpenGLES.framework */; }; - BCB5E77714E20BA800701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77614E20BA800701302 /* CoreVideo.framework */; }; + BCB5E77714E20BA800701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77614E20BA800701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Required, ); }; }; BCB5E77914E20BAF00701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77814E20BAF00701302 /* CoreMedia.framework */; }; BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; }; BCB5E78014E22E4300701302 /* GPUImageOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E77E14E22E4200701302 /* GPUImageOutput.m */; }; @@ -185,12 +185,12 @@ 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianSelectiveBlurFilter.m; path = Source/GPUImageGaussianSelectiveBlurFilter.m; sourceTree = SOURCE_ROOT; }; 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVignetteFilter.h; path = Source/GPUImageVignetteFilter.h; sourceTree = SOURCE_ROOT; }; 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVignetteFilter.m; path = Source/GPUImageVignetteFilter.m; sourceTree = SOURCE_ROOT; }; - 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSubtractBlendFilter.h; path = Source/GPUImageSubtractBlendFilter.h; sourceTree = SOURCE_ROOT; }; - 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSubtractBlendFilter.m; path = Source/GPUImageSubtractBlendFilter.m; sourceTree = SOURCE_ROOT; }; 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHazeFilter.m; path = Source/GPUImageHazeFilter.m; sourceTree = SOURCE_ROOT; }; 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGrayscaleFilter.h; path = Source/GPUImageGrayscaleFilter.h; sourceTree = SOURCE_ROOT; }; 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGrayscaleFilter.m; path = Source/GPUImageGrayscaleFilter.m; sourceTree = SOURCE_ROOT; }; + 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSubtractBlendFilter.h; path = Source/GPUImageSubtractBlendFilter.h; sourceTree = SOURCE_ROOT; }; + 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSubtractBlendFilter.m; path = Source/GPUImageSubtractBlendFilter.m; sourceTree = SOURCE_ROOT; }; 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMaskFilter.h; path = Source/GPUImageMaskFilter.h; sourceTree = SOURCE_ROOT; }; 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMaskFilter.m; path = Source/GPUImageMaskFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; From 31586956699715bb4492c54891b372733ca610d8 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 21 Apr 2012 21:29:56 -0500 Subject: [PATCH 031/695] Improved still image capture speed by 10-20%, and halved memory usage, using iOS 5.0 fast texture caches. You need to call -prepareForImageCapture on last filter to enable this. --- .../ImageFilteringBenchmarkController.m | 1 + .../SimpleImageViewController.m | 1 + .../SimplePhotoFilter/PhotoViewController.m | 1 + framework/Source/GPUImageFilter.h | 7 + framework/Source/GPUImageFilter.m | 132 ++++++++++++++++-- framework/Source/GPUImageTwoPassFilter.m | 86 +++++++++++- 6 files changed, 211 insertions(+), 17 deletions(-) diff --git a/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m b/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m index ae2ae930e..43b21ca06 100644 --- a/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m +++ b/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m @@ -131,6 +131,7 @@ - (UIImage *)imageProcessedUsingGPUImage:(UIImage *)imageToProcess; GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageToProcess]; GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; + [stillImageFilter prepareForImageCapture]; [stillImageSource addTarget:stillImageFilter]; [stillImageSource processImage]; diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index 6b7829ee2..bf326741e 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -75,6 +75,7 @@ - (void)setupImageFilteringToDisk; [stillImageSource addTarget:stillImageFilter]; [stillImageFilter addTarget:vignetteImageFilter]; + [vignetteImageFilter prepareForImageCapture]; [stillImageSource processImage]; UIImage *currentFilteredVideoFrame = [vignetteImageFilter imageFromCurrentlyProcessedOutput]; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 879c74967..9c904e0fb 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -50,6 +50,7 @@ - (void)viewDidLoad stillCamera = [[GPUImageStillCamera alloc] init]; filter = [[GPUImageGammaFilter alloc] init]; + [filter prepareForImageCapture]; // filter = [[GPUImageSepiaFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 19d9ad021..b804c900d 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -48,6 +48,12 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; GLint filterInputTextureUniform, filterInputTextureUniform2; GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; + BOOL preparedToCaptureImage; + + CVOpenGLESTextureCacheRef filterTextureCache; + CVPixelBufferRef renderTarget; + CVOpenGLESTextureRef renderTexture; + CGSize currentFilterSize; } @@ -70,6 +76,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; // Rendering - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; +- (void)prepareForImageCapture; // Input parameters - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index f61768002..8ca80c576 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -42,6 +42,8 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad return nil; } + preparedToCaptureImage = NO; + backgroundColorRed = 0.0; backgroundColorGreen = 0.0; backgroundColorBlue = 0.0; @@ -130,16 +132,41 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio [self setOutputFBO]; CGSize currentFBOSize = [self sizeOfFBO]; - NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; - GLubyte *rawImagePixels = (GLubyte *)malloc(totalBytesForImage); - glReadPixels(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); - + GLubyte *rawImagePixels; + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + CVPixelBufferUnlockBaseAddress(renderTarget, 0); + } + + CGDataProviderRef dataProvider; + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + glFlush(); + CVPixelBufferLockBaseAddress(renderTarget, 0); + rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); + dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, NULL); + } + else + { + rawImagePixels = (GLubyte *)malloc(totalBytesForImage); + glReadPixels(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, dataProviderReleaseCallback); + } - CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, dataProviderReleaseCallback); + CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); - CGImageRef cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * (int)currentFBOSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); + CGImageRef cgImageFromBytes; + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * (int)currentFBOSize.width, defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); + } + else + { + cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * (int)currentFBOSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); + } // Capture image with current device orientation UIImage *finalImage = [UIImage imageWithCGImage:cgImageFromBytes scale:1.0 orientation:imageOrientation]; @@ -156,6 +183,8 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; { GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageToFilter]; + [self prepareForImageCapture]; + [stillImageSource addTarget:self]; [stillImageSource processImage]; @@ -186,12 +215,63 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glActiveTexture(GL_TEXTURE1); glGenFramebuffers(1, &filterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d"); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); + } + + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + outputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + } + else + { + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + } // NSLog(@"Filter size: %f, %f for filter: %@", currentFBOSize.width, currentFBOSize.height, self); - - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); @@ -205,6 +285,18 @@ - (void)destroyFilterFBO; { glDeleteFramebuffers(1, &filterFramebuffer); filterFramebuffer = 0; + + if (filterTextureCache != NULL) + { + CFRelease(filterTextureCache); + filterTextureCache = NULL; + + CFRelease(renderTarget); + renderTarget = NULL; + + CFRelease(renderTexture); + renderTexture = NULL; + } } } @@ -267,12 +359,31 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; { if (currentTarget != targetToIgnoreForUpdates) { + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + [self setInputTextureForTarget:currentTarget atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + } [currentTarget setInputSize:inputTextureSize]; [currentTarget newFrameReadyAtTime:frameTime]; } } } +- (void)prepareForImageCapture; +{ + preparedToCaptureImage = YES; + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } + } +} + #pragma mark - #pragma mark Input parameters @@ -438,7 +549,6 @@ - (void)forceProcessingAtSize:(CGSize)frameSize; } } - - (CGSize)maximumOutputSize; { // I'm temporarily disabling adjustments for smaller output sizes until I figure out how to make this work better diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 8cac8965d..5787b17ba 100644 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -97,14 +97,74 @@ - (void)deleteOutputTexture; - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { - [super createFilterFBOofSize:currentFBOSize]; + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } glGenFramebuffers(1, &secondFilterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d"); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); + } + + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + } + else + { + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + } GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); @@ -134,7 +194,6 @@ - (void)setSecondFilterFBO; - (void)setOutputFBO; { - // Override this for filters that have multiple framebuffers [self setSecondFilterFBO]; } @@ -173,4 +232,19 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } +- (void)prepareForImageCapture; +{ + preparedToCaptureImage = YES; + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + if (secondFilterOutputTexture) + { + glDeleteTextures(1, &secondFilterOutputTexture); + secondFilterOutputTexture = 0; + } + } +} + + @end From 4459f2778f3675ff07ed26aa10a6ec374ef9d7f1 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 21 Apr 2012 22:14:47 -0500 Subject: [PATCH 032/695] Set the default encoding size back to 640x480 for the SimpleVideoFilter. --- .../SimpleVideoFilter/SimpleVideoFilterViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index d43d2442a..35ce52057 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -49,9 +49,9 @@ - (void)viewDidLoad NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; -// movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; + movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; // movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720.0, 1280.0)]; - movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1080.0, 1920.0)]; +// movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1080.0, 1920.0)]; [filter addTarget:movieWriter]; [videoCamera startCameraCapture]; From a65f6629db953ecb11dfbb8ea6927d156c3338f8 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 23 Apr 2012 13:31:52 -0500 Subject: [PATCH 033/695] Fixed a crash when saving captured photos to the user's photo library. Added code demonstrating this process to SimplePhotoFilter. --- .../project.pbxproj | 6 ++++- .../SimplePhotoFilter/PhotoViewController.m | 20 ++++++++++++++ framework/Source/GPUImageFilter.m | 26 ++++++++++++++----- framework/Source/GPUImageStillCamera.m | 5 ++-- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index e26749bad..daa70d980 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + BC6ED8E11545B9A900966798 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC6ED8E01545B9A900966798 /* AssetsLibrary.framework */; }; BCC1E6A11523E3620006EFA5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6A01523E3620006EFA5 /* UIKit.framework */; }; BCC1E6A31523E3620006EFA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6A21523E3620006EFA5 /* Foundation.framework */; }; BCC1E6A51523E3620006EFA5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6A41523E3620006EFA5 /* CoreGraphics.framework */; }; @@ -47,6 +48,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + BC6ED8E01545B9A900966798 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; BCC1E69C1523E3620006EFA5 /* SimplePhotoFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimplePhotoFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCC1E6A01523E3620006EFA5 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCC1E6A21523E3620006EFA5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -72,6 +74,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BC6ED8E11545B9A900966798 /* AssetsLibrary.framework in Frameworks */, BCC1E6DA1523E9DC0006EFA5 /* AVFoundation.framework in Frameworks */, BCC1E6CA1523E3C50006EFA5 /* CoreMedia.framework in Frameworks */, BCC1E6CB1523E3C50006EFA5 /* CoreVideo.framework in Frameworks */, @@ -90,7 +93,6 @@ BCC1E6911523E3620006EFA5 = { isa = PBXGroup; children = ( - BCC1E6D91523E9DB0006EFA5 /* AVFoundation.framework */, BCC1E6A61523E3620006EFA5 /* SimplePhotoFilter */, BCC1E69F1523E3620006EFA5 /* Frameworks */, BCC1E69D1523E3620006EFA5 /* Products */, @@ -116,6 +118,8 @@ BCC1E6A01523E3620006EFA5 /* UIKit.framework */, BCC1E6A21523E3620006EFA5 /* Foundation.framework */, BCC1E6A41523E3620006EFA5 /* CoreGraphics.framework */, + BC6ED8E01545B9A900966798 /* AssetsLibrary.framework */, + BCC1E6D91523E9DB0006EFA5 /* AVFoundation.framework */, ); name = Frameworks; sourceTree = ""; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 9c904e0fb..f5670c1f8 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -1,4 +1,5 @@ #import "PhotoViewController.h" +#import @interface PhotoViewController () @@ -92,6 +93,25 @@ - (IBAction)takePhoto:(id)sender; { return; } + + // Save to assets library + ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; + + CGImageRef imageRef = [processedImage CGImage]; + CGImageRetain(imageRef); + + [library writeImageToSavedPhotosAlbum:imageRef metadata:nil completionBlock:^(NSURL *assetURL, NSError *error2) + { + if (error2) { + NSLog(@"ERROR: the image failed to be written"); + } + else { + NSLog(@"PHOTO SAVED - assetURL: %@", assetURL); + } + + [processedImage self]; + CGImageRelease(imageRef); + }]; }]; } diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 8ca80c576..8a6bf5d01 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -29,6 +29,7 @@ void main() ); void dataProviderReleaseCallback (void *info, const void *data, size_t size); +void dataProviderUnlockCallback (void *info, const void *data, size_t size); @implementation GPUImageFilter @@ -126,6 +127,12 @@ void dataProviderReleaseCallback (void *info, const void *data, size_t size) free((void *)data); } +void dataProviderUnlockCallback (void *info, const void *data, size_t size) +{ + CVPixelBufferUnlockBaseAddress((CVPixelBufferRef)info, 0); + CFRelease((CVPixelBufferRef)info); +} + - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { [GPUImageOpenGLESContext useImageProcessingContext]; @@ -135,18 +142,14 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; GLubyte *rawImagePixels; - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - CVPixelBufferUnlockBaseAddress(renderTarget, 0); - } - CGDataProviderRef dataProvider; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { glFlush(); + CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation CVPixelBufferLockBaseAddress(renderTarget, 0); rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); - dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, NULL); + dataProvider = CGDataProviderCreateWithData(renderTarget, rawImagePixels, totalBytesForImage, dataProviderUnlockCallback); } else { @@ -331,6 +334,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [filterProgram use]; +// if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) +// { +// CVReturn lockStatus = CVPixelBufferLockBaseAddress(renderTarget, 0); +// NSLog(@"Lock status: %d", lockStatus); +// } + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); @@ -351,6 +360,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + +// if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) +// { +// CVPixelBufferUnlockBaseAddress(renderTarget, 0); +// } } - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index dc19b1486..df67fc84e 100644 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -44,13 +44,12 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - // Will need an alternate pathway for the iOS 4.0 support here UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; - block(filteredPhoto, error); - + block(filteredPhoto, error); }]; + return; } @end From d8f8a98fd4c291add6e577857ccb5079934530a4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 24 Apr 2012 15:51:13 -0500 Subject: [PATCH 034/695] Fixed errors being dumped to the console when a recording is finished. Patched some memory leaks. --- .../ShowcaseFilterViewController.m | 2 +- .../SimplePhotoFilter/PhotoViewController.h | 2 +- .../SimplePhotoFilter/PhotoViewController.m | 5 +- .../SimpleVideoFilterViewController.m | 1 + framework/Source/GPUImageFilter.h | 1 - framework/Source/GPUImageFilter.m | 7 ++- framework/Source/GPUImageFilterGroup.m | 5 ++ framework/Source/GPUImageMovieWriter.h | 1 + framework/Source/GPUImageMovieWriter.m | 47 +++++++++++++++-- framework/Source/GPUImageOutput.h | 1 + framework/Source/GPUImageOutput.m | 5 ++ framework/Source/GPUImageVideoCamera.m | 52 ++++++++++++------- 12 files changed, 99 insertions(+), 30 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 2d8b40d09..8662a9c4d 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -657,7 +657,7 @@ - (void)setupFilter; [filter addTarget:filterView]; } - [videoCamera startCameraCapture]; + [videoCamera startCameraCapture]; } #pragma mark - diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h index 28e867206..91e05da10 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h @@ -4,7 +4,7 @@ @interface PhotoViewController : UIViewController { GPUImageStillCamera *stillCamera; - GPUImageFilter *filter; + GPUImageOutput *filter; UISlider *filterSettingsSlider; UIButton *photoCaptureButton; } diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index f5670c1f8..f71270791 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -51,8 +51,9 @@ - (void)viewDidLoad stillCamera = [[GPUImageStillCamera alloc] init]; filter = [[GPUImageGammaFilter alloc] init]; +// filter = [[GPUImageSmoothToonFilter alloc] init]; [filter prepareForImageCapture]; -// filter = [[GPUImageSepiaFilter alloc] init]; + filter = [[GPUImageSepiaFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [stillCamera addTarget:rotationFilter]; @@ -77,7 +78,7 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updateSliderValue:(id)sender { // [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; - [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; +// [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; } - (IBAction)takePhoto:(id)sender; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 35ce52057..52fba0ea2 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -36,6 +36,7 @@ - (void)viewDidLoad // filter = [[GPUImageSketchFilter alloc] init]; // filter = [[GPUImageSmoothToonFilter alloc] init]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; +// GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRightFlipVertical]; [videoCamera addTarget:rotationFilter]; [rotationFilter addTarget:filter]; diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index b804c900d..a825509e5 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -76,7 +76,6 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; // Rendering - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; -- (void)prepareForImageCapture; // Input parameters - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 8a6bf5d01..18b23f522 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -297,8 +297,11 @@ - (void)destroyFilterFBO; CFRelease(renderTarget); renderTarget = NULL; - CFRelease(renderTexture); - renderTexture = NULL; + if (renderTexture) + { + CFRelease(renderTexture); + renderTexture = NULL; + } } } } diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index f77e04868..13ebfa6f1 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -55,6 +55,11 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; return processedImage; } +- (void)prepareForImageCapture; +{ + [self.terminalFilter prepareForImageCapture]; +} + #pragma mark - #pragma mark GPUImageOutput overrides diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 0707e5631..ef3b8d3ea 100644 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -24,6 +24,7 @@ CVOpenGLESTextureCacheRef coreVideoTextureCache; CVPixelBufferRef renderTarget; + CVOpenGLESTextureRef renderTexture; CGSize videoSize; } diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index e38fbabd7..30498d02d 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -134,7 +134,6 @@ - (void)initializeMovie; // frameData = (GLubyte *) calloc(videoSize.width * videoSize.height * 4, sizeof(GLubyte)); NSError *error = nil; -// assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:AVFileTypeAppleM4V error:&error]; assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:AVFileTypeQuickTimeMovie error:&error]; if (error != nil) { @@ -210,6 +209,8 @@ - (void)startRecording; - (void)finishRecording; { + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + isRecording = NO; // [assetWriterVideoInput markAsFinished]; [assetWriter finishWriting]; @@ -284,7 +285,6 @@ - (void)createDataFBO; CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &renderTarget); - CVOpenGLESTextureRef renderTexture; CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, renderTarget, NULL, // texture attributes GL_TEXTURE_2D, @@ -329,6 +329,24 @@ - (void)destroyDataFBO; glDeleteRenderbuffers(1, &movieRenderbuffer); movieRenderbuffer = 0; } + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + if (coreVideoTextureCache) + { + CFRelease(coreVideoTextureCache); + } + + if (renderTexture) + { + CFRelease(renderTexture); + } + if (renderTarget) + { + CVPixelBufferRelease(renderTarget); + } + + } } - (void)setFilterFBO; @@ -508,10 +526,31 @@ - (void)setHasAudioTrack:(BOOL)newValue if (_hasAudioTrack) { - NSDictionary *audioOutputSettings; + NSDictionary *audioOutputSettings = nil; if (_shouldPassthroughAudio) { - audioOutputSettings = nil; +// float ver = [[[UIDevice currentDevice] systemVersion] floatValue]; +// if (ver < 4.3) // Older iOS versions complain about using nil settings for passthrough audio, so I need to check for that +// { +// double preferredHardwareSampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; +// +// AudioChannelLayout acl; +// bzero( &acl, sizeof(acl)); +// acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; +// +// audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys: +// [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, +// [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, +// [ NSNumber numberWithFloat: preferredHardwareSampleRate ], AVSampleRateKey, +// [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, +// //[ NSNumber numberWithInt:AVAudioQualityLow], AVEncoderAudioQualityKey, +// [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, +// nil]; +// } +// else +// { + audioOutputSettings = nil; +// } } else { diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index abf1dbc9f..b3f6abdb1 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -38,5 +38,6 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); - (UIImage *)imageFromCurrentlyProcessedOutput; - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; +- (void)prepareForImageCapture; @end diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index ae43bd78d..6d90915c5 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -180,6 +180,11 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; return nil; } +- (void)prepareForImageCapture; +{ + +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index ab5ad1605..3a2bce378 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -235,8 +235,6 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; return; } -// NSLog(@"Good frame"); - outputTexture = CVOpenGLESTextureGetName(texture); // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); @@ -348,27 +346,43 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; { [_captureSession beginConfiguration]; - - _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; - audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; - if ([_captureSession canAddInput:audioInput]) - { - [_captureSession addInput:audioInput]; - } - audioOutput = [[AVCaptureAudioDataOutput alloc] init]; - - audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); - - // [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; - if ([_captureSession canAddOutput:audioOutput]) + + if (newValue == nil) { - [_captureSession addOutput:audioOutput]; + if (audioOutput) + { + [_captureSession removeInput:audioInput]; + [_captureSession removeOutput:audioOutput]; + audioInput = nil; + audioOutput = nil; + _microphone = nil; + dispatch_release(audioProcessingQueue); + audioProcessingQueue = NULL; + } } else - { - NSLog(@"Couldn't add audio output"); + { + _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; + audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; + if ([_captureSession canAddInput:audioInput]) + { + [_captureSession addInput:audioInput]; + } + audioOutput = [[AVCaptureAudioDataOutput alloc] init]; + + audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); + + // [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; + if ([_captureSession canAddOutput:audioOutput]) + { + [_captureSession addOutput:audioOutput]; + } + else + { + NSLog(@"Couldn't add audio output"); + } + [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; } - [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; [_captureSession commitConfiguration]; From 40602e41e4d1c92b628866ede86af22cf25bb120 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 25 Apr 2012 08:38:42 -0500 Subject: [PATCH 035/695] Fixed a crash on iOS 4.x due to an erroneous texture cache flush instruction. --- README.md | 1 + .../SimplePhotoFilter/PhotoViewController.m | 5 ++-- .../SimpleVideoFilterViewController.m | 25 ++++++++++++++----- framework/Source/GPUImageMovieWriter.m | 2 -- framework/Source/GPUImageVideoCamera.h | 1 + framework/Source/GPUImageVideoCamera.m | 3 ++- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e37149cfc..f38cc3102 100644 --- a/README.md +++ b/README.md @@ -356,6 +356,7 @@ Fragment shaders perform their calculations for each pixel to be rendered at tha outputColor.r = (textureColor.r * 0.393) + (textureColor.g * 0.769) + (textureColor.b * 0.189); outputColor.g = (textureColor.r * 0.349) + (textureColor.g * 0.686) + (textureColor.b * 0.168); outputColor.b = (textureColor.r * 0.272) + (textureColor.g * 0.534) + (textureColor.b * 0.131); + outputColor.a = 1.0; gl_FragColor = outputColor; } diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index f71270791..c39913424 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -50,10 +50,11 @@ - (void)viewDidLoad // Do any additional setup after loading the view. stillCamera = [[GPUImageStillCamera alloc] init]; - filter = [[GPUImageGammaFilter alloc] init]; +// filter = [[GPUImageGammaFilter alloc] init]; +// filter = [[GPUImageSketchFilter alloc] init]; // filter = [[GPUImageSmoothToonFilter alloc] init]; - [filter prepareForImageCapture]; filter = [[GPUImageSepiaFilter alloc] init]; + [filter prepareForImageCapture]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [stillCamera addTarget:rotationFilter]; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 52fba0ea2..59bc95e6d 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -25,13 +25,13 @@ - (void)viewDidLoad // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; - filter = [[GPUImagePixellateFilter alloc] init]; +// filter = [[GPUImagePixellateFilter alloc] init]; -// filter = [[GPUImageTiltShiftFilter alloc] init]; -// [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:0.65]; -// [(GPUImageTiltShiftFilter *)filter setBottomFocusLevel:0.85]; -// [(GPUImageTiltShiftFilter *)filter setBlurSize:1.5]; -// [(GPUImageTiltShiftFilter *)filter setFocusFallOffRate:0.2]; + filter = [[GPUImageTiltShiftFilter alloc] init]; + [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:0.65]; + [(GPUImageTiltShiftFilter *)filter setBottomFocusLevel:0.85]; + [(GPUImageTiltShiftFilter *)filter setBlurSize:1.5]; + [(GPUImageTiltShiftFilter *)filter setFocusFallOffRate:0.2]; // filter = [[GPUImageSketchFilter alloc] init]; // filter = [[GPUImageSmoothToonFilter alloc] init]; @@ -61,9 +61,18 @@ - (void)viewDidLoad dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, delayToStartRecording * NSEC_PER_SEC); dispatch_after(startTime, dispatch_get_main_queue(), ^(void){ NSLog(@"Start recording"); + videoCamera.audioEncodingTarget = movieWriter; [movieWriter startRecording]; +// NSError *error = nil; +// if (![videoCamera.inputCamera lockForConfiguration:&error]) +// { +// NSLog(@"Error locking for configuration: %@", error); +// } +// [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOn]; +// [videoCamera.inputCamera unlockForConfiguration]; + double delayInSeconds = 10.0; dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ @@ -71,6 +80,10 @@ - (void)viewDidLoad videoCamera.audioEncodingTarget = nil; [movieWriter finishRecording]; NSLog(@"Movie completed"); + +// [videoCamera.inputCamera lockForConfiguration:nil]; +// [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOff]; +// [videoCamera.inputCamera unlockForConfiguration]; }); }); } diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 30498d02d..55932b0bc 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -209,8 +209,6 @@ - (void)startRecording; - (void)finishRecording; { - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - isRecording = NO; // [assetWriterVideoInput markAsFinished]; [assetWriter finishWriting]; diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index adee2a9f8..ec5a66ec1 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -36,6 +36,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (AVCaptureDevicePosition)getCameraPosition; + // Rotate the camera - (void)rotateCamera; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 3a2bce378..f4b79a1e8 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -209,7 +209,8 @@ - (void)rotateCamera } } -- (AVCaptureDevicePosition)getCameraPosition { +- (AVCaptureDevicePosition)getCameraPosition +{ return [[videoInput device] position]; } From 8fcea7f4385f4c41b2b2adbad5a6b2bcce97ac83 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 27 Apr 2012 12:28:00 -0500 Subject: [PATCH 036/695] Experimented with adding GPU-accelerated histogram generation. This does not work. --- .../FilterShowcase/ShowcaseAppDelegate.m | 27 -- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 + framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 1 + framework/Source/GPUImageHistogramFilter.h | 25 ++ framework/Source/GPUImageHistogramFilter.m | 248 ++++++++++++++++++ framework/Source/GPUImageVideoCamera.m | 2 +- 9 files changed, 297 insertions(+), 28 deletions(-) create mode 100644 framework/Source/GPUImageHistogramFilter.h create mode 100644 framework/Source/GPUImageHistogramFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m b/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m index 8a5e0ac18..9c43031ee 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m @@ -22,31 +22,4 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( return YES; } -- (void)applicationWillResignActive:(UIApplication *)application -{ - // 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. - // 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. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // 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. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // 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. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // 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. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - @end diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index fb6065de3..0d3ce6661 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -69,6 +69,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_UNSHARPMASK: cell.textLabel.text = @"Unsharp mask"; break; case GPUIMAGE_GAMMA: cell.textLabel.text = @"Gamma"; break; case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; + case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; case GPUIMAGE_ADAPTIVETHRESHOLD: cell.textLabel.text = @"Adaptive threshold"; break; case GPUIMAGE_CROP: cell.textLabel.text = @"Crop"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index ff17fd043..34aef1ba3 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -17,6 +17,7 @@ typedef enum { GPUIMAGE_SEPIA, GPUIMAGE_COLORINVERT, GPUIMAGE_GRAYSCALE, + GPUIMAGE_HISTOGRAM, GPUIMAGE_THRESHOLD, GPUIMAGE_ADAPTIVETHRESHOLD, GPUIMAGE_PIXELLATE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 8662a9c4d..40ba9c8a8 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -198,6 +198,17 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:0.2]; filter = [[GPUImageHazeFilter alloc] init]; + }; break; + case GPUIMAGE_HISTOGRAM: + { + self.title = @"Histogram"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:0.1]; + [self.filterSettingsSlider setValue:0.1]; + + filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRed]; }; break; case GPUIMAGE_THRESHOLD: { @@ -675,6 +686,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; + case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setScalingFactor:[(UISlider *)sender value]]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; // case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setBlurSize:[(UISlider *)sender value]]; break; case GPUIMAGE_GAMMA: [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index a9a58bedf..173fc2039 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -34,6 +34,8 @@ BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; + BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; + BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; @@ -208,6 +210,8 @@ BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFilter.m; path = Source/GPUImageFilter.m; sourceTree = SOURCE_ROOT; }; BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyBlendFilter.h; path = Source/GPUImageChromaKeyBlendFilter.h; sourceTree = SOURCE_ROOT; }; BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; + BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStillCamera.h; path = Source/GPUImageStillCamera.h; sourceTree = SOURCE_ROOT; }; BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStillCamera.m; path = Source/GPUImageStillCamera.m; sourceTree = SOURCE_ROOT; }; BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; @@ -403,6 +407,8 @@ BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */, BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */, BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */, + BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */, + BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -725,6 +731,7 @@ BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */, BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */, 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */, + BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -898,6 +905,7 @@ BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */, BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */, 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */, + BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 4ee3babaf..f553c787b 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -72,3 +72,4 @@ #import "GPUImageCannyEdgeDetectionFilter.h" #import "GPUImageThresholdEdgeDetection.h" #import "GPUImageMaskFilter.h" +#import "GPUImageHistogramFilter.h" diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h new file mode 100644 index 000000000..f140a15b3 --- /dev/null +++ b/framework/Source/GPUImageHistogramFilter.h @@ -0,0 +1,25 @@ +#import "GPUImageFilter.h" + +typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue, kGPUImageHistogramLuminance} GPUImageHistogramType; + +@interface GPUImageHistogramFilter : GPUImageFilter +{ + GPUImageHistogramType histogramType; + + GLfloat *vertexSamplingCoordinates, *textureSamplingCoordinates; + GLint scalingFactorUniform; +} + +// These properties control the density of the grid overlaid on the image which is used to sample the colors for the histogram. By default, this is set to 100 in either direction +@property(readwrite, nonatomic) NSUInteger samplingDensityInX, samplingDensityInY; + +// This dictates the scaling of the histogram heights. By default this is 0.004 (1/255) +@property(readwrite, nonatomic) CGFloat scalingFactor; + +// Initialization and teardown +- (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; + +// Rendering +- (void)generatePointCoordinates; + +@end diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m new file mode 100644 index 000000000..694cb4cb4 --- /dev/null +++ b/framework/Source/GPUImageHistogramFilter.m @@ -0,0 +1,248 @@ +#import "GPUImageHistogramFilter.h" + +// Unlike other filters, this one uses a grid of GL_POINTs to sample the incoming image in a grid. A custom vertex shader reads the color in the texture at its position +// and outputs a bin position in the final histogram as the vertex position. That point is then written into the image of the histogram using translucent pixels. +// The degree of translucency is controlled by the scalingFactor, which lets you adjust the dynamic range of the histogram. The histogram can only be generated for one +// color channel or luminance value at a time. + +NSString *const kGPUImageRedHistogramSamplingVertexShaderString = SHADER_STRING +( +// attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.xy).x; +// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); + gl_Position = vec4(colorAtThisVertex, 0.0, 0.0, 1.0); +// gl_Position = vec4(inputTextureCoordinate.x, 0.0, 0.0, 1.0); + gl_PointSize = 4.0; + } +); + +//NSString *const kGPUImageGreenHistogramSamplingVertexShaderString = SHADER_STRING +//( +// attribute vec4 position; +// attribute vec4 inputTextureCoordinate; +// +// void main() +// { +// vec4 notUsed = texture2D(inputImageTexture, vec2(0.0, 0.0)); +// highp float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.uv).g; +// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); +// } +//); +// +//NSString *const kGPUImageBlueHistogramSamplingVertexShaderString = SHADER_STRING +//( +// attribute vec4 position; +// attribute vec4 inputTextureCoordinate; +// +//// uniform sampler2D inputImageTexture; +// +// void main() +// { +// highp float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.uv).b; +// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); +// } +//); +// +//NSString *const kGPUImageLuminanceHistogramSamplingVertexShaderString = SHADER_STRING +//( +// attribute vec4 position; +// attribute vec4 inputTextureCoordinate; +// +// uniform sampler2D inputImageTexture; +// +// const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); +// +// void main() +// { +// highp float luminance = dot(texture2D(inputImageTexture, inputTextureCoordinate.uv).rgb, W); +// gl_Position = vec4(-1.0 + 2.0 * luminance, 0.0, 0.0, 1.0); +// } +//); + +NSString *const kGPUImageHistogramAccumulationFragmentShaderString = SHADER_STRING +( + uniform highp float scalingFactor; + +// uniform sampler2D inputImageTexture; + + void main() + { +// lowp vec4 notUsed = texture2D(inputImageTexture, vec2(0.0, 0.0)); + +// gl_FragColor = vec4(1.0, notUsed.r, 0.0, 1.0); + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + +@implementation GPUImageHistogramFilter + +@synthesize samplingDensityInX = _samplingDensityInX; +@synthesize samplingDensityInY = _samplingDensityInY; +@synthesize scalingFactor = _scalingFactor; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageRedHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + + /* + switch (newHistogramType) + { + case kGPUImageHistogramRed: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageRedHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + }; break; + case kGPUImageHistogramGreen: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + }; break; + case kGPUImageHistogramBlue: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + }; break; + case kGPUImageHistogramLuminance: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageLuminanceHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + }; break; + } +*/ + histogramType = newHistogramType; + + _samplingDensityInX = 3; + _samplingDensityInY = 1; + + scalingFactorUniform = [filterProgram uniformIndex:@"scalingFactor"]; + self.scalingFactor = 0.1; + + [self forceProcessingAtSize:CGSizeMake(256.0, 3.0)]; // Output just 256 pixels of color information for whatever bin + + return self; +} + +- (void)dealloc; +{ + if (vertexSamplingCoordinates != NULL) + { + free(vertexSamplingCoordinates); + free(textureSamplingCoordinates); + } +} + +#pragma mark - +#pragma mark Rendering + +//- (CGSize)sizeOfFBO; +//{ +// return CGSizeMake(256.0, 3.0); +//} + +- (void)generatePointCoordinates; +{ + vertexSamplingCoordinates = calloc(_samplingDensityInX * _samplingDensityInY * 2, sizeof(GLfloat)); + textureSamplingCoordinates = calloc(_samplingDensityInX * _samplingDensityInY * 2, sizeof(GLfloat)); + + GLfloat fractionalSpacingInX = 1.0 / (GLfloat)_samplingDensityInX; + GLfloat fractionalSpacingInY = 1.0 / (GLfloat)_samplingDensityInY; + + for (NSUInteger currentYIndex = 0; currentYIndex < _samplingDensityInY; currentYIndex++) + { + GLfloat currentYTextureLocation = (GLfloat)currentYIndex * fractionalSpacingInY; + GLfloat currentYVertexLocation = -1.0 + 2.0 * (GLfloat)currentYIndex * fractionalSpacingInY; + + for (NSUInteger currentXIndex = 0; currentXIndex < _samplingDensityInX; currentXIndex++) + { + GLfloat currentXTextureLocation = (GLfloat)currentXIndex * fractionalSpacingInX; + NSInteger basePointerPosition = currentYIndex * _samplingDensityInX + currentXIndex; + + NSLog(@"Texture coord: %f, %f", currentXTextureLocation, currentYTextureLocation); + textureSamplingCoordinates[basePointerPosition * 2] = currentXTextureLocation; + textureSamplingCoordinates[(basePointerPosition * 2) + 1] = currentYTextureLocation; + + GLfloat currentXVertexLocation = -1.0 + 2.0 * (GLfloat)currentXIndex * fractionalSpacingInX; + + textureSamplingCoordinates[basePointerPosition * 2] = currentXVertexLocation; + textureSamplingCoordinates[(basePointerPosition * 2) + 1] = currentYVertexLocation; + } + } +} + +- (void)newFrameReadyAtTime:(CMTime)frameTime; +{ + if (vertexSamplingCoordinates == NULL) + { + [self generatePointCoordinates]; + } + + [self renderToTextureWithVertices:vertexSamplingCoordinates textureCoordinates:textureSamplingCoordinates sourceTexture:filterSourceTexture]; + + [self informTargetsAboutNewFrameAtTime:frameTime]; +} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + [self setFilterFBO]; + + [filterProgram use]; + + glClearColor(0.0, 0.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + +// glBlendEquation(GL_FUNC_ADD); +// glBlendFunc(GL_ONE, GL_ONE); +// glEnable(GL_BLEND); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, sourceTexture); + + NSLog(@"Input texture uniform: %d", filterInputTextureUniform); + NSLog(@"Texture attrib: %d, position attrib: %d", filterTextureCoordinateAttribute, filterPositionAttribute); + + glUniform1i(filterInputTextureUniform, 2); + +// glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + GLenum error = glGetError(); + NSLog(@"Error before: %d", error); + glDrawArrays(GL_POINTS, 0, _samplingDensityInX * _samplingDensityInY); + + error = glGetError(); + NSLog(@"Error after: %d", error); +// glDisable(GL_BLEND); +} + +#pragma mark - +#pragma mark Accessors + +- (void)setScalingFactor:(CGFloat)newValue; +{ +// _scalingFactor = newValue; +// +// [GPUImageOpenGLESContext useImageProcessingContext]; +// [filterProgram use]; +// glUniform1f(scalingFactorUniform, _scalingFactor); +} + +@end diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index f4b79a1e8..07d172530 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -243,7 +243,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + for (id currentTarget in targets) { [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; From 85810363a193397c4b5e864e092cd1050da8ac62 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 27 Apr 2012 12:30:35 -0500 Subject: [PATCH 037/695] Removed histogram filter. iOS does not support texture reads in vertex shaders, so this won't work at all. --- .../ShowcaseFilterListController.m | 1 - .../ShowcaseFilterViewController.h | 1 - .../ShowcaseFilterViewController.m | 12 - framework/GPUImage.xcodeproj/project.pbxproj | 8 - framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageHistogramFilter.h | 25 -- framework/Source/GPUImageHistogramFilter.m | 248 ------------------ 7 files changed, 1 insertion(+), 297 deletions(-) delete mode 100644 framework/Source/GPUImageHistogramFilter.h delete mode 100644 framework/Source/GPUImageHistogramFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 0d3ce6661..fb6065de3 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -69,7 +69,6 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_UNSHARPMASK: cell.textLabel.text = @"Unsharp mask"; break; case GPUIMAGE_GAMMA: cell.textLabel.text = @"Gamma"; break; case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; - case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; case GPUIMAGE_ADAPTIVETHRESHOLD: cell.textLabel.text = @"Adaptive threshold"; break; case GPUIMAGE_CROP: cell.textLabel.text = @"Crop"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 34aef1ba3..ff17fd043 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -17,7 +17,6 @@ typedef enum { GPUIMAGE_SEPIA, GPUIMAGE_COLORINVERT, GPUIMAGE_GRAYSCALE, - GPUIMAGE_HISTOGRAM, GPUIMAGE_THRESHOLD, GPUIMAGE_ADAPTIVETHRESHOLD, GPUIMAGE_PIXELLATE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 40ba9c8a8..8662a9c4d 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -198,17 +198,6 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:0.2]; filter = [[GPUImageHazeFilter alloc] init]; - }; break; - case GPUIMAGE_HISTOGRAM: - { - self.title = @"Histogram"; - self.filterSettingsSlider.hidden = NO; - - [self.filterSettingsSlider setMinimumValue:0.0]; - [self.filterSettingsSlider setMaximumValue:0.1]; - [self.filterSettingsSlider setValue:0.1]; - - filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRed]; }; break; case GPUIMAGE_THRESHOLD: { @@ -686,7 +675,6 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; - case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setScalingFactor:[(UISlider *)sender value]]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; // case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setBlurSize:[(UISlider *)sender value]]; break; case GPUIMAGE_GAMMA: [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 173fc2039..a9a58bedf 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -34,8 +34,6 @@ BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; - BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; - BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; @@ -210,8 +208,6 @@ BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFilter.m; path = Source/GPUImageFilter.m; sourceTree = SOURCE_ROOT; }; BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyBlendFilter.h; path = Source/GPUImageChromaKeyBlendFilter.h; sourceTree = SOURCE_ROOT; }; BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; - BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; - BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStillCamera.h; path = Source/GPUImageStillCamera.h; sourceTree = SOURCE_ROOT; }; BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStillCamera.m; path = Source/GPUImageStillCamera.m; sourceTree = SOURCE_ROOT; }; BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; @@ -407,8 +403,6 @@ BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */, BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */, BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */, - BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */, - BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -731,7 +725,6 @@ BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */, BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */, 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */, - BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -905,7 +898,6 @@ BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */, BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */, 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */, - BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index f553c787b..7cce9926c 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -71,5 +71,4 @@ #import "GPUImageEmbossFilter.h" #import "GPUImageCannyEdgeDetectionFilter.h" #import "GPUImageThresholdEdgeDetection.h" -#import "GPUImageMaskFilter.h" -#import "GPUImageHistogramFilter.h" +#import "GPUImageMaskFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h deleted file mode 100644 index f140a15b3..000000000 --- a/framework/Source/GPUImageHistogramFilter.h +++ /dev/null @@ -1,25 +0,0 @@ -#import "GPUImageFilter.h" - -typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue, kGPUImageHistogramLuminance} GPUImageHistogramType; - -@interface GPUImageHistogramFilter : GPUImageFilter -{ - GPUImageHistogramType histogramType; - - GLfloat *vertexSamplingCoordinates, *textureSamplingCoordinates; - GLint scalingFactorUniform; -} - -// These properties control the density of the grid overlaid on the image which is used to sample the colors for the histogram. By default, this is set to 100 in either direction -@property(readwrite, nonatomic) NSUInteger samplingDensityInX, samplingDensityInY; - -// This dictates the scaling of the histogram heights. By default this is 0.004 (1/255) -@property(readwrite, nonatomic) CGFloat scalingFactor; - -// Initialization and teardown -- (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; - -// Rendering -- (void)generatePointCoordinates; - -@end diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m deleted file mode 100644 index 694cb4cb4..000000000 --- a/framework/Source/GPUImageHistogramFilter.m +++ /dev/null @@ -1,248 +0,0 @@ -#import "GPUImageHistogramFilter.h" - -// Unlike other filters, this one uses a grid of GL_POINTs to sample the incoming image in a grid. A custom vertex shader reads the color in the texture at its position -// and outputs a bin position in the final histogram as the vertex position. That point is then written into the image of the histogram using translucent pixels. -// The degree of translucency is controlled by the scalingFactor, which lets you adjust the dynamic range of the histogram. The histogram can only be generated for one -// color channel or luminance value at a time. - -NSString *const kGPUImageRedHistogramSamplingVertexShaderString = SHADER_STRING -( -// attribute vec4 position; - attribute vec4 inputTextureCoordinate; - - uniform sampler2D inputImageTexture; - - void main() - { - float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.xy).x; -// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); - gl_Position = vec4(colorAtThisVertex, 0.0, 0.0, 1.0); -// gl_Position = vec4(inputTextureCoordinate.x, 0.0, 0.0, 1.0); - gl_PointSize = 4.0; - } -); - -//NSString *const kGPUImageGreenHistogramSamplingVertexShaderString = SHADER_STRING -//( -// attribute vec4 position; -// attribute vec4 inputTextureCoordinate; -// -// void main() -// { -// vec4 notUsed = texture2D(inputImageTexture, vec2(0.0, 0.0)); -// highp float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.uv).g; -// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); -// } -//); -// -//NSString *const kGPUImageBlueHistogramSamplingVertexShaderString = SHADER_STRING -//( -// attribute vec4 position; -// attribute vec4 inputTextureCoordinate; -// -//// uniform sampler2D inputImageTexture; -// -// void main() -// { -// highp float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.uv).b; -// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); -// } -//); -// -//NSString *const kGPUImageLuminanceHistogramSamplingVertexShaderString = SHADER_STRING -//( -// attribute vec4 position; -// attribute vec4 inputTextureCoordinate; -// -// uniform sampler2D inputImageTexture; -// -// const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); -// -// void main() -// { -// highp float luminance = dot(texture2D(inputImageTexture, inputTextureCoordinate.uv).rgb, W); -// gl_Position = vec4(-1.0 + 2.0 * luminance, 0.0, 0.0, 1.0); -// } -//); - -NSString *const kGPUImageHistogramAccumulationFragmentShaderString = SHADER_STRING -( - uniform highp float scalingFactor; - -// uniform sampler2D inputImageTexture; - - void main() - { -// lowp vec4 notUsed = texture2D(inputImageTexture, vec2(0.0, 0.0)); - -// gl_FragColor = vec4(1.0, notUsed.r, 0.0, 1.0); - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - } - ); - -@implementation GPUImageHistogramFilter - -@synthesize samplingDensityInX = _samplingDensityInX; -@synthesize samplingDensityInY = _samplingDensityInY; -@synthesize scalingFactor = _scalingFactor; - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; -{ - if (!(self = [super initWithVertexShaderFromString:kGPUImageRedHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) - { - return nil; - } - - /* - switch (newHistogramType) - { - case kGPUImageHistogramRed: - { - if (!(self = [super initWithVertexShaderFromString:kGPUImageRedHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) - { - return nil; - } - }; break; - case kGPUImageHistogramGreen: - { - if (!(self = [super initWithVertexShaderFromString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) - { - return nil; - } - }; break; - case kGPUImageHistogramBlue: - { - if (!(self = [super initWithVertexShaderFromString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) - { - return nil; - } - }; break; - case kGPUImageHistogramLuminance: - { - if (!(self = [super initWithVertexShaderFromString:kGPUImageLuminanceHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) - { - return nil; - } - }; break; - } -*/ - histogramType = newHistogramType; - - _samplingDensityInX = 3; - _samplingDensityInY = 1; - - scalingFactorUniform = [filterProgram uniformIndex:@"scalingFactor"]; - self.scalingFactor = 0.1; - - [self forceProcessingAtSize:CGSizeMake(256.0, 3.0)]; // Output just 256 pixels of color information for whatever bin - - return self; -} - -- (void)dealloc; -{ - if (vertexSamplingCoordinates != NULL) - { - free(vertexSamplingCoordinates); - free(textureSamplingCoordinates); - } -} - -#pragma mark - -#pragma mark Rendering - -//- (CGSize)sizeOfFBO; -//{ -// return CGSizeMake(256.0, 3.0); -//} - -- (void)generatePointCoordinates; -{ - vertexSamplingCoordinates = calloc(_samplingDensityInX * _samplingDensityInY * 2, sizeof(GLfloat)); - textureSamplingCoordinates = calloc(_samplingDensityInX * _samplingDensityInY * 2, sizeof(GLfloat)); - - GLfloat fractionalSpacingInX = 1.0 / (GLfloat)_samplingDensityInX; - GLfloat fractionalSpacingInY = 1.0 / (GLfloat)_samplingDensityInY; - - for (NSUInteger currentYIndex = 0; currentYIndex < _samplingDensityInY; currentYIndex++) - { - GLfloat currentYTextureLocation = (GLfloat)currentYIndex * fractionalSpacingInY; - GLfloat currentYVertexLocation = -1.0 + 2.0 * (GLfloat)currentYIndex * fractionalSpacingInY; - - for (NSUInteger currentXIndex = 0; currentXIndex < _samplingDensityInX; currentXIndex++) - { - GLfloat currentXTextureLocation = (GLfloat)currentXIndex * fractionalSpacingInX; - NSInteger basePointerPosition = currentYIndex * _samplingDensityInX + currentXIndex; - - NSLog(@"Texture coord: %f, %f", currentXTextureLocation, currentYTextureLocation); - textureSamplingCoordinates[basePointerPosition * 2] = currentXTextureLocation; - textureSamplingCoordinates[(basePointerPosition * 2) + 1] = currentYTextureLocation; - - GLfloat currentXVertexLocation = -1.0 + 2.0 * (GLfloat)currentXIndex * fractionalSpacingInX; - - textureSamplingCoordinates[basePointerPosition * 2] = currentXVertexLocation; - textureSamplingCoordinates[(basePointerPosition * 2) + 1] = currentYVertexLocation; - } - } -} - -- (void)newFrameReadyAtTime:(CMTime)frameTime; -{ - if (vertexSamplingCoordinates == NULL) - { - [self generatePointCoordinates]; - } - - [self renderToTextureWithVertices:vertexSamplingCoordinates textureCoordinates:textureSamplingCoordinates sourceTexture:filterSourceTexture]; - - [self informTargetsAboutNewFrameAtTime:frameTime]; -} - -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; -{ - [GPUImageOpenGLESContext useImageProcessingContext]; - [self setFilterFBO]; - - [filterProgram use]; - - glClearColor(0.0, 0.0, 1.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - -// glBlendEquation(GL_FUNC_ADD); -// glBlendFunc(GL_ONE, GL_ONE); -// glEnable(GL_BLEND); - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, sourceTexture); - - NSLog(@"Input texture uniform: %d", filterInputTextureUniform); - NSLog(@"Texture attrib: %d, position attrib: %d", filterTextureCoordinateAttribute, filterPositionAttribute); - - glUniform1i(filterInputTextureUniform, 2); - -// glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - GLenum error = glGetError(); - NSLog(@"Error before: %d", error); - glDrawArrays(GL_POINTS, 0, _samplingDensityInX * _samplingDensityInY); - - error = glGetError(); - NSLog(@"Error after: %d", error); -// glDisable(GL_BLEND); -} - -#pragma mark - -#pragma mark Accessors - -- (void)setScalingFactor:(CGFloat)newValue; -{ -// _scalingFactor = newValue; -// -// [GPUImageOpenGLESContext useImageProcessingContext]; -// [filterProgram use]; -// glUniform1f(scalingFactorUniform, _scalingFactor); -} - -@end From 743dfe71ad4f0d7571ba98a39c8a1b09f13d8207 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 27 Apr 2012 14:42:32 -0500 Subject: [PATCH 038/695] Revert "Removed histogram filter. iOS does not support texture reads in vertex shaders, so this won't work at all." This reverts commit 85810363a193397c4b5e864e092cd1050da8ac62. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 + framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageHistogramFilter.h | 25 ++ framework/Source/GPUImageHistogramFilter.m | 248 ++++++++++++++++++ 7 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageHistogramFilter.h create mode 100644 framework/Source/GPUImageHistogramFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index fb6065de3..0d3ce6661 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -69,6 +69,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_UNSHARPMASK: cell.textLabel.text = @"Unsharp mask"; break; case GPUIMAGE_GAMMA: cell.textLabel.text = @"Gamma"; break; case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; + case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; case GPUIMAGE_ADAPTIVETHRESHOLD: cell.textLabel.text = @"Adaptive threshold"; break; case GPUIMAGE_CROP: cell.textLabel.text = @"Crop"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index ff17fd043..34aef1ba3 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -17,6 +17,7 @@ typedef enum { GPUIMAGE_SEPIA, GPUIMAGE_COLORINVERT, GPUIMAGE_GRAYSCALE, + GPUIMAGE_HISTOGRAM, GPUIMAGE_THRESHOLD, GPUIMAGE_ADAPTIVETHRESHOLD, GPUIMAGE_PIXELLATE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 8662a9c4d..40ba9c8a8 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -198,6 +198,17 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:0.2]; filter = [[GPUImageHazeFilter alloc] init]; + }; break; + case GPUIMAGE_HISTOGRAM: + { + self.title = @"Histogram"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:0.1]; + [self.filterSettingsSlider setValue:0.1]; + + filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRed]; }; break; case GPUIMAGE_THRESHOLD: { @@ -675,6 +686,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; + case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setScalingFactor:[(UISlider *)sender value]]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; // case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setBlurSize:[(UISlider *)sender value]]; break; case GPUIMAGE_GAMMA: [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index a9a58bedf..173fc2039 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -34,6 +34,8 @@ BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; + BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; + BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; @@ -208,6 +210,8 @@ BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFilter.m; path = Source/GPUImageFilter.m; sourceTree = SOURCE_ROOT; }; BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyBlendFilter.h; path = Source/GPUImageChromaKeyBlendFilter.h; sourceTree = SOURCE_ROOT; }; BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; + BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStillCamera.h; path = Source/GPUImageStillCamera.h; sourceTree = SOURCE_ROOT; }; BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStillCamera.m; path = Source/GPUImageStillCamera.m; sourceTree = SOURCE_ROOT; }; BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; @@ -403,6 +407,8 @@ BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */, BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */, BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */, + BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */, + BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -725,6 +731,7 @@ BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */, BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */, 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */, + BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -898,6 +905,7 @@ BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */, BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */, 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */, + BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 7cce9926c..f553c787b 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -71,4 +71,5 @@ #import "GPUImageEmbossFilter.h" #import "GPUImageCannyEdgeDetectionFilter.h" #import "GPUImageThresholdEdgeDetection.h" -#import "GPUImageMaskFilter.h" \ No newline at end of file +#import "GPUImageMaskFilter.h" +#import "GPUImageHistogramFilter.h" diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h new file mode 100644 index 000000000..f140a15b3 --- /dev/null +++ b/framework/Source/GPUImageHistogramFilter.h @@ -0,0 +1,25 @@ +#import "GPUImageFilter.h" + +typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue, kGPUImageHistogramLuminance} GPUImageHistogramType; + +@interface GPUImageHistogramFilter : GPUImageFilter +{ + GPUImageHistogramType histogramType; + + GLfloat *vertexSamplingCoordinates, *textureSamplingCoordinates; + GLint scalingFactorUniform; +} + +// These properties control the density of the grid overlaid on the image which is used to sample the colors for the histogram. By default, this is set to 100 in either direction +@property(readwrite, nonatomic) NSUInteger samplingDensityInX, samplingDensityInY; + +// This dictates the scaling of the histogram heights. By default this is 0.004 (1/255) +@property(readwrite, nonatomic) CGFloat scalingFactor; + +// Initialization and teardown +- (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; + +// Rendering +- (void)generatePointCoordinates; + +@end diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m new file mode 100644 index 000000000..694cb4cb4 --- /dev/null +++ b/framework/Source/GPUImageHistogramFilter.m @@ -0,0 +1,248 @@ +#import "GPUImageHistogramFilter.h" + +// Unlike other filters, this one uses a grid of GL_POINTs to sample the incoming image in a grid. A custom vertex shader reads the color in the texture at its position +// and outputs a bin position in the final histogram as the vertex position. That point is then written into the image of the histogram using translucent pixels. +// The degree of translucency is controlled by the scalingFactor, which lets you adjust the dynamic range of the histogram. The histogram can only be generated for one +// color channel or luminance value at a time. + +NSString *const kGPUImageRedHistogramSamplingVertexShaderString = SHADER_STRING +( +// attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.xy).x; +// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); + gl_Position = vec4(colorAtThisVertex, 0.0, 0.0, 1.0); +// gl_Position = vec4(inputTextureCoordinate.x, 0.0, 0.0, 1.0); + gl_PointSize = 4.0; + } +); + +//NSString *const kGPUImageGreenHistogramSamplingVertexShaderString = SHADER_STRING +//( +// attribute vec4 position; +// attribute vec4 inputTextureCoordinate; +// +// void main() +// { +// vec4 notUsed = texture2D(inputImageTexture, vec2(0.0, 0.0)); +// highp float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.uv).g; +// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); +// } +//); +// +//NSString *const kGPUImageBlueHistogramSamplingVertexShaderString = SHADER_STRING +//( +// attribute vec4 position; +// attribute vec4 inputTextureCoordinate; +// +//// uniform sampler2D inputImageTexture; +// +// void main() +// { +// highp float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.uv).b; +// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); +// } +//); +// +//NSString *const kGPUImageLuminanceHistogramSamplingVertexShaderString = SHADER_STRING +//( +// attribute vec4 position; +// attribute vec4 inputTextureCoordinate; +// +// uniform sampler2D inputImageTexture; +// +// const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); +// +// void main() +// { +// highp float luminance = dot(texture2D(inputImageTexture, inputTextureCoordinate.uv).rgb, W); +// gl_Position = vec4(-1.0 + 2.0 * luminance, 0.0, 0.0, 1.0); +// } +//); + +NSString *const kGPUImageHistogramAccumulationFragmentShaderString = SHADER_STRING +( + uniform highp float scalingFactor; + +// uniform sampler2D inputImageTexture; + + void main() + { +// lowp vec4 notUsed = texture2D(inputImageTexture, vec2(0.0, 0.0)); + +// gl_FragColor = vec4(1.0, notUsed.r, 0.0, 1.0); + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + +@implementation GPUImageHistogramFilter + +@synthesize samplingDensityInX = _samplingDensityInX; +@synthesize samplingDensityInY = _samplingDensityInY; +@synthesize scalingFactor = _scalingFactor; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageRedHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + + /* + switch (newHistogramType) + { + case kGPUImageHistogramRed: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageRedHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + }; break; + case kGPUImageHistogramGreen: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + }; break; + case kGPUImageHistogramBlue: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + }; break; + case kGPUImageHistogramLuminance: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageLuminanceHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + }; break; + } +*/ + histogramType = newHistogramType; + + _samplingDensityInX = 3; + _samplingDensityInY = 1; + + scalingFactorUniform = [filterProgram uniformIndex:@"scalingFactor"]; + self.scalingFactor = 0.1; + + [self forceProcessingAtSize:CGSizeMake(256.0, 3.0)]; // Output just 256 pixels of color information for whatever bin + + return self; +} + +- (void)dealloc; +{ + if (vertexSamplingCoordinates != NULL) + { + free(vertexSamplingCoordinates); + free(textureSamplingCoordinates); + } +} + +#pragma mark - +#pragma mark Rendering + +//- (CGSize)sizeOfFBO; +//{ +// return CGSizeMake(256.0, 3.0); +//} + +- (void)generatePointCoordinates; +{ + vertexSamplingCoordinates = calloc(_samplingDensityInX * _samplingDensityInY * 2, sizeof(GLfloat)); + textureSamplingCoordinates = calloc(_samplingDensityInX * _samplingDensityInY * 2, sizeof(GLfloat)); + + GLfloat fractionalSpacingInX = 1.0 / (GLfloat)_samplingDensityInX; + GLfloat fractionalSpacingInY = 1.0 / (GLfloat)_samplingDensityInY; + + for (NSUInteger currentYIndex = 0; currentYIndex < _samplingDensityInY; currentYIndex++) + { + GLfloat currentYTextureLocation = (GLfloat)currentYIndex * fractionalSpacingInY; + GLfloat currentYVertexLocation = -1.0 + 2.0 * (GLfloat)currentYIndex * fractionalSpacingInY; + + for (NSUInteger currentXIndex = 0; currentXIndex < _samplingDensityInX; currentXIndex++) + { + GLfloat currentXTextureLocation = (GLfloat)currentXIndex * fractionalSpacingInX; + NSInteger basePointerPosition = currentYIndex * _samplingDensityInX + currentXIndex; + + NSLog(@"Texture coord: %f, %f", currentXTextureLocation, currentYTextureLocation); + textureSamplingCoordinates[basePointerPosition * 2] = currentXTextureLocation; + textureSamplingCoordinates[(basePointerPosition * 2) + 1] = currentYTextureLocation; + + GLfloat currentXVertexLocation = -1.0 + 2.0 * (GLfloat)currentXIndex * fractionalSpacingInX; + + textureSamplingCoordinates[basePointerPosition * 2] = currentXVertexLocation; + textureSamplingCoordinates[(basePointerPosition * 2) + 1] = currentYVertexLocation; + } + } +} + +- (void)newFrameReadyAtTime:(CMTime)frameTime; +{ + if (vertexSamplingCoordinates == NULL) + { + [self generatePointCoordinates]; + } + + [self renderToTextureWithVertices:vertexSamplingCoordinates textureCoordinates:textureSamplingCoordinates sourceTexture:filterSourceTexture]; + + [self informTargetsAboutNewFrameAtTime:frameTime]; +} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + [self setFilterFBO]; + + [filterProgram use]; + + glClearColor(0.0, 0.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + +// glBlendEquation(GL_FUNC_ADD); +// glBlendFunc(GL_ONE, GL_ONE); +// glEnable(GL_BLEND); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, sourceTexture); + + NSLog(@"Input texture uniform: %d", filterInputTextureUniform); + NSLog(@"Texture attrib: %d, position attrib: %d", filterTextureCoordinateAttribute, filterPositionAttribute); + + glUniform1i(filterInputTextureUniform, 2); + +// glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + GLenum error = glGetError(); + NSLog(@"Error before: %d", error); + glDrawArrays(GL_POINTS, 0, _samplingDensityInX * _samplingDensityInY); + + error = glGetError(); + NSLog(@"Error after: %d", error); +// glDisable(GL_BLEND); +} + +#pragma mark - +#pragma mark Accessors + +- (void)setScalingFactor:(CGFloat)newValue; +{ +// _scalingFactor = newValue; +// +// [GPUImageOpenGLESContext useImageProcessingContext]; +// [filterProgram use]; +// glUniform1f(scalingFactorUniform, _scalingFactor); +} + +@end From ddb4a6ba97c73d7ec40ebc0a40f34d8c73bd329c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 27 Apr 2012 18:37:15 -0500 Subject: [PATCH 039/695] Got the histogram working for the red channel, and added a graph generation filter to display the results. --- .../ShowcaseFilterViewController.m | 24 +++- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 2 + framework/Source/GPUImageFilter.m | 3 +- framework/Source/GPUImageFilterGroup.m | 2 +- framework/Source/GPUImageHistogramFilter.h | 3 + framework/Source/GPUImageHistogramFilter.m | 128 ++++++++---------- framework/Source/GPUImageHistogramGenerator.h | 11 ++ framework/Source/GPUImageHistogramGenerator.m | 70 ++++++++++ framework/Source/GPUImageOutput.h | 2 +- framework/Source/GPUImageOutput.m | 7 +- framework/Source/GPUImageTiltShiftFilter.m | 2 +- framework/Source/GPUImageUnsharpMaskFilter.m | 2 +- framework/Source/GPUImageVideoCamera.m | 27 ++-- 14 files changed, 199 insertions(+), 92 deletions(-) create mode 100644 framework/Source/GPUImageHistogramGenerator.h create mode 100644 framework/Source/GPUImageHistogramGenerator.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 40ba9c8a8..f5117f45e 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -665,7 +665,29 @@ - (void)setupFilter; } GPUImageView *filterView = (GPUImageView *)self.view; - [filter addTarget:filterView]; + + if (filterType == GPUIMAGE_HISTOGRAM) + { + GPUImageHistogramGenerator *histogramGraph = [[GPUImageHistogramGenerator alloc] init]; + + [histogramGraph forceProcessingAtSize:CGSizeMake(256.0, 330.0)]; + [histogramGraph setColorForGraphRed:1.0 green:0.0 blue:0.0]; + + GPUImageDissolveBlendFilter *blendFilter = [[GPUImageDissolveBlendFilter alloc] init]; + blendFilter.mix = 0.5; + + [filter addTarget:histogramGraph]; + + [rotationFilter addTarget:blendFilter]; + [histogramGraph addTarget:blendFilter]; + rotationFilter.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend + + [blendFilter addTarget:filterView]; + } + else + { + [filter addTarget:filterView]; + } } [videoCamera startCameraCapture]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 173fc2039..8fde92770 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -116,6 +116,8 @@ BCB6B8BC1505BF940041703B /* GPUImageTextureOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */; }; BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; }; BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; + BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; }; + BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */; }; BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; }; BCC1E5A9151E74B20006EFA5 /* GPUImagePosterizeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5A7151E74B20006EFA5 /* GPUImagePosterizeFilter.m */; }; BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; }; @@ -292,6 +294,8 @@ BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTextureOutput.m; path = Source/GPUImageTextureOutput.m; sourceTree = SOURCE_ROOT; }; BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCropFilter.h; path = Source/GPUImageCropFilter.h; sourceTree = SOURCE_ROOT; }; BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCropFilter.m; path = Source/GPUImageCropFilter.m; sourceTree = SOURCE_ROOT; }; + BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramGenerator.h; path = Source/GPUImageHistogramGenerator.h; sourceTree = SOURCE_ROOT; }; + BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramGenerator.m; path = Source/GPUImageHistogramGenerator.m; sourceTree = SOURCE_ROOT; }; BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePosterizeFilter.h; path = Source/GPUImagePosterizeFilter.h; sourceTree = SOURCE_ROOT; }; BCC1E5A7151E74B20006EFA5 /* GPUImagePosterizeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePosterizeFilter.m; path = Source/GPUImagePosterizeFilter.m; sourceTree = SOURCE_ROOT; }; BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFilterGroup.h; path = Source/GPUImageFilterGroup.h; sourceTree = SOURCE_ROOT; }; @@ -409,6 +413,8 @@ BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */, BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */, BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */, + BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */, + BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */, ); name = "Color processing"; sourceTree = ""; @@ -732,6 +738,7 @@ BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */, 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */, BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */, + BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -906,6 +913,7 @@ BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */, 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */, BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */, + BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index f553c787b..0ce0dc24a 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -73,3 +73,5 @@ #import "GPUImageThresholdEdgeDetection.h" #import "GPUImageMaskFilter.h" #import "GPUImageHistogramFilter.h" +#import "GPUImageHistogramGenerator.h" + diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 18b23f522..4d6527576 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -374,13 +374,14 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; { for (id currentTarget in targets) { - if (currentTarget != targetToIgnoreForUpdates) + if (currentTarget != self.targetToIgnoreForUpdates) { if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; [self setInputTextureForTarget:currentTarget atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; } + [currentTarget setInputSize:inputTextureSize]; [currentTarget newFrameReadyAtTime:frameTime]; } diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 13ebfa6f1..da53380f2 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -85,7 +85,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; { for (GPUImageOutput *currentFilter in _initialFilters) { - if (currentFilter != targetToIgnoreForUpdates) + if (currentFilter != self.targetToIgnoreForUpdates) { [currentFilter newFrameReadyAtTime:frameTime]; } diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h index f140a15b3..eea7c0317 100644 --- a/framework/Source/GPUImageHistogramFilter.h +++ b/framework/Source/GPUImageHistogramFilter.h @@ -16,6 +16,9 @@ typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogra // This dictates the scaling of the histogram heights. By default this is 0.004 (1/255) @property(readwrite, nonatomic) CGFloat scalingFactor; +// Rather than sampling every pixel, this dictates what fraction of the image is sampled. By default, this is 8 with a minimum of 1. +@property(readwrite, nonatomic) NSUInteger downsamplingFactor; + // Initialization and teardown - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 694cb4cb4..fa8c37e42 100644 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -4,21 +4,20 @@ // and outputs a bin position in the final histogram as the vertex position. That point is then written into the image of the histogram using translucent pixels. // The degree of translucency is controlled by the scalingFactor, which lets you adjust the dynamic range of the histogram. The histogram can only be generated for one // color channel or luminance value at a time. +// +// This is based on this implementation: http://www.shaderwrangler.com/publications/histogram/histogram_cameraready.pdf +// +// Or at least that's how it would work if iOS could read from textures in a vertex shader, which it can't. Therefore, I read the texture data down from the +// incoming frame and process the texture colors as vertices. NSString *const kGPUImageRedHistogramSamplingVertexShaderString = SHADER_STRING ( -// attribute vec4 position; - attribute vec4 inputTextureCoordinate; - - uniform sampler2D inputImageTexture; + attribute vec4 position; void main() { - float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.xy).x; -// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); - gl_Position = vec4(colorAtThisVertex, 0.0, 0.0, 1.0); -// gl_Position = vec4(inputTextureCoordinate.x, 0.0, 0.0, 1.0); - gl_PointSize = 4.0; + gl_Position = vec4(-1.0 + (position.x * 0.0078125), 0.0, 0.0, 1.0); + gl_PointSize = 1.0; } ); @@ -68,23 +67,19 @@ void main() NSString *const kGPUImageHistogramAccumulationFragmentShaderString = SHADER_STRING ( uniform highp float scalingFactor; - -// uniform sampler2D inputImageTexture; void main() { -// lowp vec4 notUsed = texture2D(inputImageTexture, vec2(0.0, 0.0)); - -// gl_FragColor = vec4(1.0, notUsed.r, 0.0, 1.0); - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + gl_FragColor = vec4(scalingFactor); } - ); +); @implementation GPUImageHistogramFilter @synthesize samplingDensityInX = _samplingDensityInX; @synthesize samplingDensityInY = _samplingDensityInY; @synthesize scalingFactor = _scalingFactor; +@synthesize downsamplingFactor = _downsamplingFactor; #pragma mark - #pragma mark Initialization and teardown @@ -133,12 +128,11 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; _samplingDensityInX = 3; _samplingDensityInY = 1; + self.downsamplingFactor = 8; scalingFactorUniform = [filterProgram uniformIndex:@"scalingFactor"]; - self.scalingFactor = 0.1; + self.scalingFactor = 0.004; - [self forceProcessingAtSize:CGSizeMake(256.0, 3.0)]; // Output just 256 pixels of color information for whatever bin - return self; } @@ -154,39 +148,14 @@ - (void)dealloc; #pragma mark - #pragma mark Rendering -//- (CGSize)sizeOfFBO; -//{ -// return CGSizeMake(256.0, 3.0); -//} - - (void)generatePointCoordinates; { - vertexSamplingCoordinates = calloc(_samplingDensityInX * _samplingDensityInY * 2, sizeof(GLfloat)); - textureSamplingCoordinates = calloc(_samplingDensityInX * _samplingDensityInY * 2, sizeof(GLfloat)); - - GLfloat fractionalSpacingInX = 1.0 / (GLfloat)_samplingDensityInX; - GLfloat fractionalSpacingInY = 1.0 / (GLfloat)_samplingDensityInY; - - for (NSUInteger currentYIndex = 0; currentYIndex < _samplingDensityInY; currentYIndex++) - { - GLfloat currentYTextureLocation = (GLfloat)currentYIndex * fractionalSpacingInY; - GLfloat currentYVertexLocation = -1.0 + 2.0 * (GLfloat)currentYIndex * fractionalSpacingInY; - - for (NSUInteger currentXIndex = 0; currentXIndex < _samplingDensityInX; currentXIndex++) - { - GLfloat currentXTextureLocation = (GLfloat)currentXIndex * fractionalSpacingInX; - NSInteger basePointerPosition = currentYIndex * _samplingDensityInX + currentXIndex; - - NSLog(@"Texture coord: %f, %f", currentXTextureLocation, currentYTextureLocation); - textureSamplingCoordinates[basePointerPosition * 2] = currentXTextureLocation; - textureSamplingCoordinates[(basePointerPosition * 2) + 1] = currentYTextureLocation; - - GLfloat currentXVertexLocation = -1.0 + 2.0 * (GLfloat)currentXIndex * fractionalSpacingInX; - - textureSamplingCoordinates[basePointerPosition * 2] = currentXVertexLocation; - textureSamplingCoordinates[(basePointerPosition * 2) + 1] = currentYVertexLocation; - } - } + vertexSamplingCoordinates = calloc(inputTextureSize.width * inputTextureSize.height * 4, sizeof(GLubyte)); +} + +- (CGSize)sizeOfFBO; +{ + return CGSizeMake(256.0, 3.0); } - (void)newFrameReadyAtTime:(CMTime)frameTime; @@ -201,36 +170,45 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; [self informTargetsAboutNewFrameAtTime:frameTime]; } +- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; +{ + for (id currentTarget in targets) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + [self setInputTextureForTarget:currentTarget atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + } + + [currentTarget setInputSize:[self sizeOfFBO]]; + [currentTarget newFrameReadyAtTime:frameTime]; + } + } +} + - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { [GPUImageOpenGLESContext useImageProcessingContext]; + + glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates); + [self setFilterFBO]; [filterProgram use]; - glClearColor(0.0, 0.0, 1.0, 1.0); + glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); -// glBlendEquation(GL_FUNC_ADD); -// glBlendFunc(GL_ONE, GL_ONE); -// glEnable(GL_BLEND); - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, sourceTexture); - - NSLog(@"Input texture uniform: %d", filterInputTextureUniform); - NSLog(@"Texture attrib: %d, position attrib: %d", filterTextureCoordinateAttribute, filterPositionAttribute); - - glUniform1i(filterInputTextureUniform, 2); + glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_ONE, GL_ONE); + glEnable(GL_BLEND); -// glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - GLenum error = glGetError(); - NSLog(@"Error before: %d", error); - glDrawArrays(GL_POINTS, 0, _samplingDensityInX * _samplingDensityInY); - - error = glGetError(); - NSLog(@"Error after: %d", error); -// glDisable(GL_BLEND); + glVertexAttribPointer(filterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); + glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); + + glDisable(GL_BLEND); } #pragma mark - @@ -238,11 +216,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates - (void)setScalingFactor:(CGFloat)newValue; { -// _scalingFactor = newValue; -// -// [GPUImageOpenGLESContext useImageProcessingContext]; -// [filterProgram use]; -// glUniform1f(scalingFactorUniform, _scalingFactor); + _scalingFactor = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(scalingFactorUniform, _scalingFactor); } @end diff --git a/framework/Source/GPUImageHistogramGenerator.h b/framework/Source/GPUImageHistogramGenerator.h new file mode 100644 index 000000000..db2df8b63 --- /dev/null +++ b/framework/Source/GPUImageHistogramGenerator.h @@ -0,0 +1,11 @@ +#import "GPUImageFilter.h" + +@interface GPUImageHistogramGenerator : GPUImageFilter +{ + GLint colorForGraphUniform; +} + +// The color for the graph, in individual red, green, and blue components (normalized to 1.0). The default is white: (1.0, 1.0, 1.0). +- (void)setColorForGraphRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; + +@end diff --git a/framework/Source/GPUImageHistogramGenerator.m b/framework/Source/GPUImageHistogramGenerator.m new file mode 100644 index 000000000..601bcea64 --- /dev/null +++ b/framework/Source/GPUImageHistogramGenerator.m @@ -0,0 +1,70 @@ +#import "GPUImageHistogramGenerator.h" + +NSString *const kGPUImageHistogramGeneratorVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + varying vec2 textureCoordinate; + varying float height; + + void main() + { + gl_Position = position; + textureCoordinate = vec2(inputTextureCoordinate.x, 0.5); + height = 1.0 - inputTextureCoordinate.y; + } +); + +NSString *const kGPUImageHistogramGeneratorFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp float height; + + uniform sampler2D inputImageTexture; + uniform lowp vec3 colorForGraph; + + void main() + { + lowp float redChannel = texture2D(inputImageTexture, textureCoordinate).r; + lowp float heightTest = step(height, redChannel); + gl_FragColor = vec4(heightTest * colorForGraph, 1.0); + } +); + + +@implementation GPUImageHistogramGenerator + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageHistogramGeneratorVertexShaderString fragmentShaderFromString:kGPUImageHistogramGeneratorFragmentShaderString])) + { + return nil; + } + + colorForGraphUniform = [filterProgram uniformIndex:@"colorForGraph"]; + + [self setColorForGraphRed:1.0 green:1.0 blue:1.0]; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setColorForGraphRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +{ + GLfloat colorToReplace[3]; + colorToReplace[0] = redComponent; + colorToReplace[1] = greenComponent; + colorToReplace[2] = blueComponent; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform3fv(colorForGraphUniform, 1, colorToReplace); +} + +@end diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index b3f6abdb1..ee4d56186 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -13,7 +13,6 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); GLuint outputTexture; CGSize inputTextureSize, cachedMaximumOutputSize; - id targetToIgnoreForUpdates; BOOL overrideInputSize; } @@ -21,6 +20,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; @property(readwrite, nonatomic) BOOL shouldIgnoreUpdatesToThisTarget; @property(readwrite, nonatomic, retain) GPUImageMovieWriter *audioEncodingTarget; +@property(readwrite, nonatomic, unsafe_unretained) id targetToIgnoreForUpdates; // Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 6d90915c5..cab9026b2 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -18,6 +18,7 @@ @implementation GPUImageOutput @synthesize shouldSmoothlyScaleOutput = _shouldSmoothlyScaleOutput; @synthesize shouldIgnoreUpdatesToThisTarget = _shouldIgnoreUpdatesToThisTarget; @synthesize audioEncodingTarget = _audioEncodingTarget; +@synthesize targetToIgnoreForUpdates = _targetToIgnoreForUpdates; #pragma mark - #pragma mark Initialization and teardown @@ -57,7 +58,7 @@ - (void)addTarget:(id)newTarget; [self addTarget:newTarget atTextureLocation:nextAvailableTextureIndex]; if ([newTarget shouldIgnoreUpdatesToThisTarget]) { - targetToIgnoreForUpdates = newTarget; + _targetToIgnoreForUpdates = newTarget; } } @@ -81,9 +82,9 @@ - (void)removeTarget:(id)targetToRemove; return; } - if (targetToIgnoreForUpdates == targetToRemove) + if (_targetToIgnoreForUpdates == targetToRemove) { - targetToIgnoreForUpdates = nil; + _targetToIgnoreForUpdates = nil; } cachedMaximumOutputSize = CGSizeZero; diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index 43b75bf48..5f5241f46 100644 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -51,7 +51,7 @@ - (id)init; [blurFilter addTarget:tiltShiftFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - targetToIgnoreForUpdates = tiltShiftFilter; + self.targetToIgnoreForUpdates = tiltShiftFilter; self.initialFilters = [NSArray arrayWithObjects:blurFilter, tiltShiftFilter, nil]; self.terminalFilter = tiltShiftFilter; diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index 7efa482bd..89433b5f9 100644 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -46,7 +46,7 @@ - (id)init; [blurFilter addTarget:unsharpMaskFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - targetToIgnoreForUpdates = unsharpMaskFilter; + self.targetToIgnoreForUpdates = unsharpMaskFilter; self.initialFilters = [NSArray arrayWithObjects:blurFilter, unsharpMaskFilter, nil]; self.terminalFilter = unsharpMaskFilter; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 07d172530..84b13f088 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -246,12 +246,20 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; for (id currentTarget in targets) { - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; - - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - - [currentTarget newFrameReadyAtTime:currentTime]; + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; + + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + + [currentTarget newFrameReadyAtTime:currentTime]; + } + else + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + } } CVPixelBufferUnlockBaseAddress(cameraFrame, 0); @@ -286,8 +294,11 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; for (id currentTarget in targets) { - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; - [currentTarget newFrameReadyAtTime:currentTime]; + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; + [currentTarget newFrameReadyAtTime:currentTime]; + } } CVPixelBufferUnlockBaseAddress(cameraFrame, 0); From 3e5e517010c6d46e2b3040c2d29ca6321e9befd3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 28 Apr 2012 15:51:57 -0500 Subject: [PATCH 040/695] Completed and documented the histogram filter. It can now process RGB and luminance histograms. --- README.md | 7 +- .../ShowcaseFilterViewController.m | 11 +- framework/Source/GPUImageHistogramFilter.h | 14 +- framework/Source/GPUImageHistogramFilter.m | 198 ++++++++++++------ framework/Source/GPUImageHistogramGenerator.h | 6 - framework/Source/GPUImageHistogramGenerator.m | 26 +-- 6 files changed, 148 insertions(+), 114 deletions(-) diff --git a/README.md b/README.md index f38cc3102..0c9f52e0a 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ BSD-style, with the full license available with the framework in License.txt. GPUImage uses OpenGL ES 2.0 shaders to perform image and video manipulation much faster than could be done in CPU-bound routines. However, it hides the complexity of interacting with the OpenGL ES API in a simplified Objective-C interface. This interface lets you define input sources for images and video, attach filters in a chain, and send the resulting processed image or video to the screen, to a UIImage, or to a movie on disk. -Images or frames of video are uploaded from source objects, which are subclasses of GPUImageOutput. These include GPUImageVideoCamera (for live video from an iOS camera), GPUImagePicture (for still images), and GPUImageMovie (for movies). Source objects upload still image frames to OpenGL ES as textures, then hand those textures off to the next objects in the processing chain. +Images or frames of video are uploaded from source objects, which are subclasses of GPUImageOutput. These include GPUImageVideoCamera (for live video from an iOS camera), GPUImageStillCamera (for taking photos with the camera), GPUImagePicture (for still images), and GPUImageMovie (for movies). Source objects upload still image frames to OpenGL ES as textures, then hand those textures off to the next objects in the processing chain. Filters and other subsequent elements in the chain conform to the GPUImageInput protocol, which lets them take in the supplied or processed texture from the previous link in the chain and do something with it. Objects one step further down the chain are considered targets, and processing can be branched by adding multiple targets to a single output or filter. @@ -81,6 +81,11 @@ For example, an application that takes in live video from the camera, converts t - **GPUImageAdaptiveThresholdFilter**: Determines the local luminance around a pixel, then turns the pixel black if it is below that local luminance and white if above. This can be useful for picking out text under varying lighting conditions. +- **GPUImageHistogramFilter**: This analyzes the incoming image and creates an output histogram with the frequency at which each color value occurs. The output of this filter is a 3-pixel-high, 256-pixel-wide image with the center (vertical) pixels containing pixels that correspond to the frequency at which various color values occurred. Each color value occupies one of the 256 width positions, from 0 on the left to 255 on the right. This histogram can be generated for individual color channels (kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue), the luminance of the image (kGPUImageHistogramLuminance), or for all three color channels at once (kGPUImageHistogramRGB). +- *downsamplingFactor*: Rather than sampling every pixel, this dictates what fraction of the image is sampled. By default, this is 16 with a minimum of 1. This is needed to keep from saturating the histogram, which can only record 256 pixels for each color value before it becomes overloaded. + +- **GPUImageHistogramGenerator**: This is a special filter, in that it's primarily intended to work with the GPUImageHistogramFilter. It generates an output representation of the color histograms generated by GPUImageHistogramFilter, but it could be repurposed to display other kinds of values. It takes in an image and looks at the center (vertical) pixels. It then plots the numerical values of the RGB components in separate colored graphs in an output texture. You may need to force a size for this filter in order to make its output visible. + ### Image processing ### - **GPUImageRotationFilter**: This lets you rotate an image left or right by 90 degrees, or flip it horizontally or vertically diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index f5117f45e..3163e25f8 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -204,11 +204,11 @@ - (void)setupFilter; self.title = @"Histogram"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:0.0]; - [self.filterSettingsSlider setMaximumValue:0.1]; - [self.filterSettingsSlider setValue:0.1]; + [self.filterSettingsSlider setMinimumValue:4.0]; + [self.filterSettingsSlider setMaximumValue:32.0]; + [self.filterSettingsSlider setValue:16.0]; - filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRed]; + filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB]; }; break; case GPUIMAGE_THRESHOLD: { @@ -671,7 +671,6 @@ - (void)setupFilter; GPUImageHistogramGenerator *histogramGraph = [[GPUImageHistogramGenerator alloc] init]; [histogramGraph forceProcessingAtSize:CGSizeMake(256.0, 330.0)]; - [histogramGraph setColorForGraphRed:1.0 green:0.0 blue:0.0]; GPUImageDissolveBlendFilter *blendFilter = [[GPUImageDissolveBlendFilter alloc] init]; blendFilter.mix = 0.5; @@ -708,7 +707,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; - case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setScalingFactor:[(UISlider *)sender value]]; break; + case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setDownsamplingFactor:round([(UISlider *)sender value])]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; // case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setBlurSize:[(UISlider *)sender value]]; break; case GPUIMAGE_GAMMA: [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; break; diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h index eea7c0317..b42df8108 100644 --- a/framework/Source/GPUImageHistogramFilter.h +++ b/framework/Source/GPUImageHistogramFilter.h @@ -1,22 +1,18 @@ #import "GPUImageFilter.h" -typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue, kGPUImageHistogramLuminance} GPUImageHistogramType; +typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue, kGPUImageHistogramRGB, kGPUImageHistogramLuminance} GPUImageHistogramType; @interface GPUImageHistogramFilter : GPUImageFilter { GPUImageHistogramType histogramType; GLfloat *vertexSamplingCoordinates, *textureSamplingCoordinates; - GLint scalingFactorUniform; + + GLProgram *secondFilterProgram, *thirdFilterProgram; + GLint secondFilterPositionAttribute, thirdFilterPositionAttribute; } -// These properties control the density of the grid overlaid on the image which is used to sample the colors for the histogram. By default, this is set to 100 in either direction -@property(readwrite, nonatomic) NSUInteger samplingDensityInX, samplingDensityInY; - -// This dictates the scaling of the histogram heights. By default this is 0.004 (1/255) -@property(readwrite, nonatomic) CGFloat scalingFactor; - -// Rather than sampling every pixel, this dictates what fraction of the image is sampled. By default, this is 8 with a minimum of 1. +// Rather than sampling every pixel, this dictates what fraction of the image is sampled. By default, this is 16 with a minimum of 1. @property(readwrite, nonatomic) NSUInteger downsamplingFactor; // Initialization and teardown diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index fa8c37e42..5748fc19f 100644 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -13,72 +13,77 @@ NSString *const kGPUImageRedHistogramSamplingVertexShaderString = SHADER_STRING ( attribute vec4 position; + + varying lowp vec3 colorFactor; void main() { + colorFactor = vec3(1.0, 0.0, 0.0); gl_Position = vec4(-1.0 + (position.x * 0.0078125), 0.0, 0.0, 1.0); gl_PointSize = 1.0; } ); -//NSString *const kGPUImageGreenHistogramSamplingVertexShaderString = SHADER_STRING -//( -// attribute vec4 position; -// attribute vec4 inputTextureCoordinate; -// -// void main() -// { -// vec4 notUsed = texture2D(inputImageTexture, vec2(0.0, 0.0)); -// highp float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.uv).g; -// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); -// } -//); -// -//NSString *const kGPUImageBlueHistogramSamplingVertexShaderString = SHADER_STRING -//( -// attribute vec4 position; -// attribute vec4 inputTextureCoordinate; -// -//// uniform sampler2D inputImageTexture; -// -// void main() -// { -// highp float colorAtThisVertex = texture2D(inputImageTexture, inputTextureCoordinate.uv).b; -// gl_Position = vec4(-1.0 + 2.0 * colorAtThisVertex, 0.0, 0.0, 1.0); -// } -//); -// -//NSString *const kGPUImageLuminanceHistogramSamplingVertexShaderString = SHADER_STRING -//( -// attribute vec4 position; -// attribute vec4 inputTextureCoordinate; -// -// uniform sampler2D inputImageTexture; -// -// const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); -// -// void main() -// { -// highp float luminance = dot(texture2D(inputImageTexture, inputTextureCoordinate.uv).rgb, W); -// gl_Position = vec4(-1.0 + 2.0 * luminance, 0.0, 0.0, 1.0); -// } -//); +NSString *const kGPUImageGreenHistogramSamplingVertexShaderString = SHADER_STRING +( + attribute vec4 position; + + varying lowp vec3 colorFactor; + + void main() + { + colorFactor = vec3(0.0, 1.0, 0.0); + gl_Position = vec4(-1.0 + (position.y * 0.0078125), 0.0, 0.0, 1.0); + gl_PointSize = 1.0; + } +); -NSString *const kGPUImageHistogramAccumulationFragmentShaderString = SHADER_STRING +NSString *const kGPUImageBlueHistogramSamplingVertexShaderString = SHADER_STRING ( - uniform highp float scalingFactor; + attribute vec4 position; + + varying lowp vec3 colorFactor; void main() { - gl_FragColor = vec4(scalingFactor); + colorFactor = vec3(0.0, 0.0, 1.0); + gl_Position = vec4(-1.0 + (position.z * 0.0078125), 0.0, 0.0, 1.0); + gl_PointSize = 1.0; + } +); + +NSString *const kGPUImageLuminanceHistogramSamplingVertexShaderString = SHADER_STRING +( + attribute vec4 position; + + varying lowp vec3 colorFactor; + + const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + float luminance = dot(position.xyz, W); + + colorFactor = vec3(1.0, 1.0, 1.0); + gl_Position = vec4(-1.0 + (luminance * 0.0078125), 0.0, 0.0, 1.0); + gl_PointSize = 1.0; + } +); + +NSString *const kGPUImageHistogramAccumulationFragmentShaderString = SHADER_STRING +( + const lowp float scalingFactor = 1.0 / 256.0; + + varying lowp vec3 colorFactor; + + void main() + { + gl_FragColor = vec4(colorFactor * scalingFactor , 1.0); } ); @implementation GPUImageHistogramFilter -@synthesize samplingDensityInX = _samplingDensityInX; -@synthesize samplingDensityInY = _samplingDensityInY; -@synthesize scalingFactor = _scalingFactor; @synthesize downsamplingFactor = _downsamplingFactor; #pragma mark - @@ -86,12 +91,6 @@ @implementation GPUImageHistogramFilter - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; { - if (!(self = [super initWithVertexShaderFromString:kGPUImageRedHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) - { - return nil; - } - - /* switch (newHistogramType) { case kGPUImageHistogramRed: @@ -122,20 +121,68 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; return nil; } }; break; + case kGPUImageHistogramRGB: + { + if (!(self = [super initWithVertexShaderFromString:kGPUImageRedHistogramSamplingVertexShaderString fragmentShaderFromString:kGPUImageHistogramAccumulationFragmentShaderString])) + { + return nil; + } + + secondFilterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + thirdFilterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + + [self initializeAttributes]; + + if (![secondFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + + secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; + + [secondFilterProgram use]; + glEnableVertexAttribArray(secondFilterPositionAttribute); + + if (![thirdFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + + thirdFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; + + [thirdFilterProgram use]; + glEnableVertexAttribArray(thirdFilterPositionAttribute); + }; break; } -*/ + histogramType = newHistogramType; - _samplingDensityInX = 3; - _samplingDensityInY = 1; - self.downsamplingFactor = 8; - - scalingFactorUniform = [filterProgram uniformIndex:@"scalingFactor"]; - self.scalingFactor = 0.004; + self.downsamplingFactor = 16; return self; } +- (void)initializeAttributes; +{ + [super initializeAttributes]; + [secondFilterProgram addAttribute:@"position"]; + [thirdFilterProgram addAttribute:@"position"]; +} + - (void)dealloc; { if (vertexSamplingCoordinates != NULL) @@ -208,19 +255,32 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(filterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); + if (histogramType == kGPUImageHistogramRGB) + { + [secondFilterProgram use]; + + glVertexAttribPointer(secondFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); + glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); + + [thirdFilterProgram use]; + + glVertexAttribPointer(thirdFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); + glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); + } + glDisable(GL_BLEND); } #pragma mark - #pragma mark Accessors -- (void)setScalingFactor:(CGFloat)newValue; -{ - _scalingFactor = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(scalingFactorUniform, _scalingFactor); -} +//- (void)setScalingFactor:(CGFloat)newValue; +//{ +// _scalingFactor = newValue; +// +// [GPUImageOpenGLESContext useImageProcessingContext]; +// [filterProgram use]; +// glUniform1f(scalingFactorUniform, _scalingFactor); +//} @end diff --git a/framework/Source/GPUImageHistogramGenerator.h b/framework/Source/GPUImageHistogramGenerator.h index db2df8b63..1bc0e4d9f 100644 --- a/framework/Source/GPUImageHistogramGenerator.h +++ b/framework/Source/GPUImageHistogramGenerator.h @@ -1,11 +1,5 @@ #import "GPUImageFilter.h" @interface GPUImageHistogramGenerator : GPUImageFilter -{ - GLint colorForGraphUniform; -} - -// The color for the graph, in individual red, green, and blue components (normalized to 1.0). The default is white: (1.0, 1.0, 1.0). -- (void)setColorForGraphRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; @end diff --git a/framework/Source/GPUImageHistogramGenerator.m b/framework/Source/GPUImageHistogramGenerator.m index 601bcea64..72fe815d9 100644 --- a/framework/Source/GPUImageHistogramGenerator.m +++ b/framework/Source/GPUImageHistogramGenerator.m @@ -22,13 +22,12 @@ void main() varying highp float height; uniform sampler2D inputImageTexture; - uniform lowp vec3 colorForGraph; void main() { - lowp float redChannel = texture2D(inputImageTexture, textureCoordinate).r; - lowp float heightTest = step(height, redChannel); - gl_FragColor = vec4(heightTest * colorForGraph, 1.0); + lowp vec3 colorChannels = texture2D(inputImageTexture, textureCoordinate).rgb; + lowp vec3 heightTest = step(height, colorChannels); + gl_FragColor = vec4(heightTest, 1.0); } ); @@ -45,26 +44,7 @@ - (id)init; return nil; } - colorForGraphUniform = [filterProgram uniformIndex:@"colorForGraph"]; - - [self setColorForGraphRed:1.0 green:1.0 blue:1.0]; - return self; } -#pragma mark - -#pragma mark Accessors - -- (void)setColorForGraphRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; -{ - GLfloat colorToReplace[3]; - colorToReplace[0] = redComponent; - colorToReplace[1] = greenComponent; - colorToReplace[2] = blueComponent; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(colorForGraphUniform, 1, colorToReplace); -} - @end From b8961bf8185e712a2715ffcea9b7389a10068dfb Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 28 Apr 2012 16:21:15 -0500 Subject: [PATCH 041/695] Prevented taking multiple photos at the same time in SimplePhotoFilter. This can easily overload the memory of the iPhone 4S. --- .../SimplePhotoFilter/PhotoViewController.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index c39913424..3c01c0489 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -38,6 +38,7 @@ - (void)loadView [photoCaptureButton setTitle:@"Capture Photo" forState:UIControlStateNormal]; photoCaptureButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; [photoCaptureButton addTarget:self action:@selector(takePhoto:) forControlEvents:UIControlEventTouchUpInside]; + [photoCaptureButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled]; [primaryView addSubview:photoCaptureButton]; @@ -84,7 +85,10 @@ - (IBAction)updateSliderValue:(id)sender - (IBAction)takePhoto:(id)sender; { + [photoCaptureButton setEnabled:NO]; + [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ + NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); @@ -113,6 +117,9 @@ - (IBAction)takePhoto:(id)sender; [processedImage self]; CGImageRelease(imageRef); + runOnMainQueueWithoutDeadlocking(^{ + [photoCaptureButton setEnabled:YES]; + }); }]; }]; } From 29edf0698a23e539a23fb72955f9b5a0a04ab757 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 30 Apr 2012 16:45:32 -0500 Subject: [PATCH 042/695] Cleaned up the edge detection filters. Added Prewitt edge detection and a simple XY derivative filter. --- .../ShowcaseFilterListController.m | 2 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 23 +++++++- .../SimplePhotoFilter/PhotoViewController.m | 7 ++- framework/GPUImage.xcodeproj/project.pbxproj | 16 ++++++ framework/Source/GPUImage.h | 3 +- .../Source/GPUImageCannyEdgeDetectionFilter.h | 2 + .../Source/GPUImageCannyEdgeDetectionFilter.m | 5 +- .../GPUImagePrewittEdgeDetectionFilter.h | 5 ++ .../GPUImagePrewittEdgeDetectionFilter.m | 56 +++++++++++++++++++ framework/Source/GPUImageSketchFilter.m | 23 ++++---- .../Source/GPUImageSobelEdgeDetectionFilter.m | 21 ++++--- .../Source/GPUImageThresholdEdgeDetection.m | 21 ++++--- framework/Source/GPUImageToonFilter.m | 21 ++++--- framework/Source/GPUImageXYDerivativeFilter.h | 5 ++ framework/Source/GPUImageXYDerivativeFilter.m | 47 ++++++++++++++++ 16 files changed, 206 insertions(+), 53 deletions(-) create mode 100644 framework/Source/GPUImagePrewittEdgeDetectionFilter.h create mode 100644 framework/Source/GPUImagePrewittEdgeDetectionFilter.m create mode 100644 framework/Source/GPUImageXYDerivativeFilter.h create mode 100644 framework/Source/GPUImageXYDerivativeFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 0d3ce6661..e05bb27d5 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -83,7 +83,9 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_POLARPIXELLATE: cell.textLabel.text = @"Polar pixellate"; break; case GPUIMAGE_CROSSHATCH: cell.textLabel.text = @"Crosshatch"; break; case GPUIMAGE_SOBELEDGEDETECTION: cell.textLabel.text = @"Sobel edge detection"; break; + case GPUIMAGE_PREWITTEDGEDETECTION: cell.textLabel.text = @"Prewitt edge detection"; break; case GPUIMAGE_CANNYEDGEDETECTION: cell.textLabel.text = @"Canny edge detection"; break; + case GPUIMAGE_XYGRADIENT: cell.textLabel.text = @"XY derivative"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; case GPUIMAGE_SMOOTHTOON: cell.textLabel.text = @"Smooth toon"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 34aef1ba3..9f7a965fc 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -24,7 +24,9 @@ typedef enum { GPUIMAGE_POLARPIXELLATE, GPUIMAGE_CROSSHATCH, GPUIMAGE_SOBELEDGEDETECTION, + GPUIMAGE_PREWITTEDGEDETECTION, GPUIMAGE_CANNYEDGEDETECTION, + GPUIMAGE_XYGRADIENT, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_SMOOTHTOON, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 3163e25f8..34e365d02 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -282,11 +282,25 @@ - (void)setupFilter; }; break; case GPUIMAGE_SOBELEDGEDETECTION: { - self.title = @"Edge Detection"; + self.title = @"Sobel Edge Detection"; self.filterSettingsSlider.hidden = YES; filter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; }; break; + case GPUIMAGE_XYGRADIENT: + { + self.title = @"XY Derivative"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageXYDerivativeFilter alloc] init]; + }; break; + case GPUIMAGE_PREWITTEDGEDETECTION: + { + self.title = @"Prewitt Edge Detection"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImagePrewittEdgeDetectionFilter alloc] init]; + }; break; case GPUIMAGE_CANNYEDGEDETECTION: { self.title = @"Canny Edge Detection"; @@ -295,7 +309,11 @@ - (void)setupFilter; [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:2.0]; [self.filterSettingsSlider setValue:1.0]; - + +// [self.filterSettingsSlider setMinimumValue:0.0]; +// [self.filterSettingsSlider setMaximumValue:1.0]; +// [self.filterSettingsSlider setValue:0.9]; + filter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; }; break; @@ -720,6 +738,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)filter setAngle:[(UISlider *)sender value]]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; +// case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 3c01c0489..d07d382d4 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -48,13 +48,14 @@ - (void)loadView - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view. stillCamera = [[GPUImageStillCamera alloc] init]; // filter = [[GPUImageGammaFilter alloc] init]; -// filter = [[GPUImageSketchFilter alloc] init]; + filter = [[GPUImageSketchFilter alloc] init]; + [(GPUImageSketchFilter *)filter setImageHeightFactor:640.0]; + [(GPUImageSketchFilter *)filter setImageWidthFactor:480.0]; // filter = [[GPUImageSmoothToonFilter alloc] init]; - filter = [[GPUImageSepiaFilter alloc] init]; +// filter = [[GPUImageSepiaFilter alloc] init]; [filter prepareForImageCapture]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 8fde92770..17dd91186 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -70,6 +70,10 @@ BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */; }; BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; }; BCABED9115263CF20098A93E /* GPUImageStretchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */; }; + BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; }; + BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */; }; + BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; }; + BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */; }; BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; @@ -248,6 +252,10 @@ BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePolarPixellateFilter.m; path = Source/GPUImagePolarPixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStretchDistortionFilter.h; path = Source/GPUImageStretchDistortionFilter.h; sourceTree = SOURCE_ROOT; }; BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStretchDistortionFilter.m; path = Source/GPUImageStretchDistortionFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePrewittEdgeDetectionFilter.h; path = Source/GPUImagePrewittEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePrewittEdgeDetectionFilter.m; path = Source/GPUImagePrewittEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageXYDerivativeFilter.h; path = Source/GPUImageXYDerivativeFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageXYDerivativeFilter.m; path = Source/GPUImageXYDerivativeFilter.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; @@ -467,6 +475,10 @@ BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */, BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */, BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */, + BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */, + BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */, + BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */, + BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */, BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */, BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */, BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */, @@ -739,6 +751,8 @@ 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */, BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */, BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */, + BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */, + BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -914,6 +928,8 @@ 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */, BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */, BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */, + BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */, + BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 0ce0dc24a..b8ad9a22f 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -74,4 +74,5 @@ #import "GPUImageMaskFilter.h" #import "GPUImageHistogramFilter.h" #import "GPUImageHistogramGenerator.h" - +#import "GPUImagePrewittEdgeDetectionFilter.h" +#import "GPUImageXYDerivativeFilter.h" diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h index 661c6870c..3a454889e 100644 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.h +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.h @@ -2,11 +2,13 @@ @class GPUImageGaussianBlurFilter; @class GPUImageThresholdEdgeDetection; +@class GPUImageSketchFilter; @interface GPUImageCannyEdgeDetectionFilter : GPUImageFilterGroup { GPUImageGaussianBlurFilter *blurFilter; GPUImageThresholdEdgeDetection *edgeDetectionFilter; +// GPUImageSketchFilter *edgeDetectionFilter; } // The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.m b/framework/Source/GPUImageCannyEdgeDetectionFilter.m index 9288f1a0b..42ebb9dca 100644 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.m +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.m @@ -1,6 +1,7 @@ #import "GPUImageCannyEdgeDetectionFilter.h" #import "GPUImageGaussianBlurFilter.h" #import "GPUImageThresholdEdgeDetection.h" +#import "GPUImageSketchFilter.h" @implementation GPUImageCannyEdgeDetectionFilter @@ -22,6 +23,7 @@ - (id)init; // Second pass: run the Sobel edge detection on this blurred image edgeDetectionFilter = [[GPUImageThresholdEdgeDetection alloc] init]; +// edgeDetectionFilter = [[GPUImageSketchFilter alloc] init]; [self addFilter:edgeDetectionFilter]; // Texture location 0 needs to be the sharp image for both the blur and the second stage processing @@ -30,7 +32,7 @@ - (id)init; self.initialFilters = [NSArray arrayWithObject:blurFilter]; self.terminalFilter = edgeDetectionFilter; - self.blurSize = 1.0; + self.blurSize = 1.5; self.threshold = 0.9; return self; @@ -77,6 +79,7 @@ - (void)setThreshold:(CGFloat)newValue; - (CGFloat)threshold; { return edgeDetectionFilter.threshold; +// return 0; } @end diff --git a/framework/Source/GPUImagePrewittEdgeDetectionFilter.h b/framework/Source/GPUImagePrewittEdgeDetectionFilter.h new file mode 100644 index 000000000..141f8c5f7 --- /dev/null +++ b/framework/Source/GPUImagePrewittEdgeDetectionFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageSobelEdgeDetectionFilter.h" + +@interface GPUImagePrewittEdgeDetectionFilter : GPUImageSobelEdgeDetectionFilter + +@end diff --git a/framework/Source/GPUImagePrewittEdgeDetectionFilter.m b/framework/Source/GPUImagePrewittEdgeDetectionFilter.m new file mode 100644 index 000000000..7c0b236da --- /dev/null +++ b/framework/Source/GPUImagePrewittEdgeDetectionFilter.m @@ -0,0 +1,56 @@ +#import "GPUImagePrewittEdgeDetectionFilter.h" + +@implementation GPUImagePrewittEdgeDetectionFilter + +NSString *const kGPUImagePrewittFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity; + + float mag = length(vec2(h, v)); + + gl_FragColor = vec4(vec3(mag), 1.0); + } +); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImagePrewittFragmentShaderString])) + { + return nil; + } + + return self; +} + + +@end diff --git a/framework/Source/GPUImageSketchFilter.m b/framework/Source/GPUImageSketchFilter.m index e61e169a3..4235afc6b 100644 --- a/framework/Source/GPUImageSketchFilter.m +++ b/framework/Source/GPUImageSketchFilter.m @@ -21,21 +21,18 @@ @implementation GPUImageSketchFilter uniform sampler2D inputImageTexture; - const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); - void main() { - float i00 = texture2D(inputImageTexture, textureCoordinate).r; - float im1m1 = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; - float ip1p1 = texture2D(inputImageTexture, topRightTextureCoordinate).r; - float im1p1 = texture2D(inputImageTexture, topLeftTextureCoordinate).r; - float ip1m1 = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; - float im10 = texture2D(inputImageTexture, leftTextureCoordinate).r; - float ip10 = texture2D(inputImageTexture, rightTextureCoordinate).r; - float i0m1 = texture2D(inputImageTexture, bottomTextureCoordinate).r; - float i0p1 = texture2D(inputImageTexture, topTextureCoordinate).r; - float h = -im1p1 - 2.0 * i0p1 - ip1p1 + im1m1 + 2.0 * i0m1 + ip1m1; - float v = -im1m1 - 2.0 * im10 - im1p1 + ip1m1 + 2.0 * ip10 + ip1p1; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; float mag = 1.0 - length(vec2(h, v)); diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 7badc8327..d605fd12e 100644 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -23,17 +23,16 @@ void main() { - float i00 = texture2D(inputImageTexture, textureCoordinate).r; - float im1m1 = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; - float ip1p1 = texture2D(inputImageTexture, topRightTextureCoordinate).r; - float im1p1 = texture2D(inputImageTexture, topLeftTextureCoordinate).r; - float ip1m1 = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; - float im10 = texture2D(inputImageTexture, leftTextureCoordinate).r; - float ip10 = texture2D(inputImageTexture, rightTextureCoordinate).r; - float i0m1 = texture2D(inputImageTexture, bottomTextureCoordinate).r; - float i0p1 = texture2D(inputImageTexture, topTextureCoordinate).r; - float h = -im1p1 - 2.0 * i0p1 - ip1p1 + im1m1 + 2.0 * i0m1 + ip1m1; - float v = -im1m1 - 2.0 * im10 - im1p1 + ip1m1 + 2.0 * ip10 + ip1p1; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; float mag = length(vec2(h, v)); diff --git a/framework/Source/GPUImageThresholdEdgeDetection.m b/framework/Source/GPUImageThresholdEdgeDetection.m index 94596ca01..0de89abcd 100644 --- a/framework/Source/GPUImageThresholdEdgeDetection.m +++ b/framework/Source/GPUImageThresholdEdgeDetection.m @@ -26,17 +26,16 @@ @implementation GPUImageThresholdEdgeDetection void main() { - float i00 = texture2D(inputImageTexture, textureCoordinate).r; - float im1m1 = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; - float ip1p1 = texture2D(inputImageTexture, topRightTextureCoordinate).r; - float im1p1 = texture2D(inputImageTexture, topLeftTextureCoordinate).r; - float ip1m1 = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; - float im10 = texture2D(inputImageTexture, leftTextureCoordinate).r; - float ip10 = texture2D(inputImageTexture, rightTextureCoordinate).r; - float i0m1 = texture2D(inputImageTexture, bottomTextureCoordinate).r; - float i0p1 = texture2D(inputImageTexture, topTextureCoordinate).r; - float h = -im1p1 - 2.0 * i0p1 - ip1p1 + im1m1 + 2.0 * i0m1 + ip1m1; - float v = -im1m1 - 2.0 * im10 - im1p1 + ip1m1 + 2.0 * ip10 + ip1p1; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; float mag = 1.0 - length(vec2(h, v)); mag = step(threshold, mag); diff --git a/framework/Source/GPUImageToonFilter.m b/framework/Source/GPUImageToonFilter.m index eb762860c..77b6ed6e4 100644 --- a/framework/Source/GPUImageToonFilter.m +++ b/framework/Source/GPUImageToonFilter.m @@ -31,17 +31,16 @@ void main() { vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - float i00 = textureColor.g; - float im1m1 = texture2D(inputImageTexture, bottomLeftTextureCoordinate).g; - float ip1p1 = texture2D(inputImageTexture, topRightTextureCoordinate).g; - float im1p1 = texture2D(inputImageTexture, topLeftTextureCoordinate).g; - float ip1m1 = texture2D(inputImageTexture, bottomRightTextureCoordinate).g; - float im10 = texture2D(inputImageTexture, leftTextureCoordinate).g; - float ip10 = texture2D(inputImageTexture, rightTextureCoordinate).g; - float i0m1 = texture2D(inputImageTexture, bottomTextureCoordinate).g; - float i0p1 = texture2D(inputImageTexture, topTextureCoordinate).g; - float h = -im1p1 - 2.0 * i0p1 - ip1p1 + im1m1 + 2.0 * i0m1 + ip1m1; - float v = -im1m1 - 2.0 * im10 - im1p1 + ip1m1 + 2.0 * ip10 + ip1p1; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; float mag = length(vec2(h, v)); diff --git a/framework/Source/GPUImageXYDerivativeFilter.h b/framework/Source/GPUImageXYDerivativeFilter.h new file mode 100644 index 000000000..8db574573 --- /dev/null +++ b/framework/Source/GPUImageXYDerivativeFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageSobelEdgeDetectionFilter.h" + +@interface GPUImageXYDerivativeFilter : GPUImageSobelEdgeDetectionFilter + +@end diff --git a/framework/Source/GPUImageXYDerivativeFilter.m b/framework/Source/GPUImageXYDerivativeFilter.m new file mode 100644 index 000000000..5152acb48 --- /dev/null +++ b/framework/Source/GPUImageXYDerivativeFilter.m @@ -0,0 +1,47 @@ +#import "GPUImageXYDerivativeFilter.h" + +@implementation GPUImageXYDerivativeFilter + +NSString *const kGPUImageGradientFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + + gl_FragColor = vec4(rightIntensity - leftIntensity, bottomIntensity - topIntensity, 0.0, 1.0); + } +); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImageGradientFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end From 1154a475f78519c275953d2cea2b26c89a043be5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 30 Apr 2012 23:30:25 -0500 Subject: [PATCH 043/695] Added a Harris corner detection filter. It's crude, but functional. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 16 +++ framework/GPUImage.xcodeproj/project.pbxproj | 16 +++ framework/Source/GPUImage.h | 2 + framework/Source/GPUImageAlphaBlendFilter.h | 5 + framework/Source/GPUImageAlphaBlendFilter.m | 33 +++++ .../GPUImageHarrisCornerDetectionFilter.h | 21 +++ .../GPUImageHarrisCornerDetectionFilter.m | 125 ++++++++++++++++++ framework/Source/GPUImageXYDerivativeFilter.m | 14 +- 10 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageAlphaBlendFilter.h create mode 100644 framework/Source/GPUImageAlphaBlendFilter.m create mode 100644 framework/Source/GPUImageHarrisCornerDetectionFilter.h create mode 100644 framework/Source/GPUImageHarrisCornerDetectionFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index e05bb27d5..dfc4fce1b 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -86,6 +86,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_PREWITTEDGEDETECTION: cell.textLabel.text = @"Prewitt edge detection"; break; case GPUIMAGE_CANNYEDGEDETECTION: cell.textLabel.text = @"Canny edge detection"; break; case GPUIMAGE_XYGRADIENT: cell.textLabel.text = @"XY derivative"; break; + case GPUIMAGE_HARRISCORNERDETECTION: cell.textLabel.text = @"Harris corner detection"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; case GPUIMAGE_SMOOTHTOON: cell.textLabel.text = @"Smooth toon"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 9f7a965fc..4dc9cb78d 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -27,6 +27,7 @@ typedef enum { GPUIMAGE_PREWITTEDGEDETECTION, GPUIMAGE_CANNYEDGEDETECTION, GPUIMAGE_XYGRADIENT, + GPUIMAGE_HARRISCORNERDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_SMOOTHTOON, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 34e365d02..5765a8f4e 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -294,6 +294,13 @@ - (void)setupFilter; filter = [[GPUImageXYDerivativeFilter alloc] init]; }; break; + case GPUIMAGE_HARRISCORNERDETECTION: + { + self.title = @"Harris Corner Detection"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; + }; break; case GPUIMAGE_PREWITTEDGEDETECTION: { self.title = @"Prewitt Edge Detection"; @@ -701,6 +708,15 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } + else if (filterType == GPUIMAGE_HARRISCORNERDETECTION) + { + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [rotationFilter addTarget:blendFilter]; + [filter addTarget:blendFilter]; + rotationFilter.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend + + [blendFilter addTarget:filterView]; + } else { [filter addTarget:filterView]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 17dd91186..cc99e63d9 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -74,6 +74,10 @@ BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */; }; BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; }; BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */; }; + BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; }; + BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */; }; + BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; }; + BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; @@ -256,6 +260,10 @@ BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePrewittEdgeDetectionFilter.m; path = Source/GPUImagePrewittEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageXYDerivativeFilter.h; path = Source/GPUImageXYDerivativeFilter.h; sourceTree = SOURCE_ROOT; }; BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageXYDerivativeFilter.m; path = Source/GPUImageXYDerivativeFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHarrisCornerDetectionFilter.h; path = Source/GPUImageHarrisCornerDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHarrisCornerDetectionFilter.m; path = Source/GPUImageHarrisCornerDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAlphaBlendFilter.h; path = Source/GPUImageAlphaBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAlphaBlendFilter.m; path = Source/GPUImageAlphaBlendFilter.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; @@ -458,6 +466,8 @@ 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */, BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */, BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */, + BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */, + BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */, ); name = Blends; sourceTree = ""; @@ -479,6 +489,8 @@ BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */, BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */, BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */, + BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */, + BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */, BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */, BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */, BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */, @@ -753,6 +765,8 @@ BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */, BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */, BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */, + BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */, + BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -930,6 +944,8 @@ BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */, BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */, BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */, + BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */, + BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index b8ad9a22f..1b887c3c6 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -76,3 +76,5 @@ #import "GPUImageHistogramGenerator.h" #import "GPUImagePrewittEdgeDetectionFilter.h" #import "GPUImageXYDerivativeFilter.h" +#import "GPUImageHarrisCornerDetectionFilter.h" +#import "GPUImageAlphaBlendFilter.h" diff --git a/framework/Source/GPUImageAlphaBlendFilter.h b/framework/Source/GPUImageAlphaBlendFilter.h new file mode 100644 index 000000000..037e3c0c4 --- /dev/null +++ b/framework/Source/GPUImageAlphaBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageFilter.h" + +@interface GPUImageAlphaBlendFilter : GPUImageFilter + +@end diff --git a/framework/Source/GPUImageAlphaBlendFilter.m b/framework/Source/GPUImageAlphaBlendFilter.m new file mode 100644 index 000000000..02c145d20 --- /dev/null +++ b/framework/Source/GPUImageAlphaBlendFilter.m @@ -0,0 +1,33 @@ +#import "GPUImageAlphaBlendFilter.h" + +NSString *const kGPUImageAlphaBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + + gl_FragColor = vec4(mix(textureColor.rgb, textureColor2.rgb, textureColor2.a), textureColor.a); + } +); + + +@implementation GPUImageAlphaBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageAlphaBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + + +@end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h new file mode 100644 index 000000000..66243fbbf --- /dev/null +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -0,0 +1,21 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageGaussianBlurFilter; +@class GPUImageXYDerivativeFilter; +@class GPUImageGrayscaleFilter; +@class GPUImageFastBlurFilter; + +@interface GPUImageHarrisCornerDetectionFilter : GPUImageFilterGroup +{ + GPUImageGrayscaleFilter *luminanceFilter; + GPUImageXYDerivativeFilter *derivativeFilter; +// GPUImageGaussianBlurFilter *blurFilter; + GPUImageFastBlurFilter *blurFilter; + GPUImageFilter *harrisCornerDetectionFilter; + // Non maximum suppression filter + GPUImageFilter *simpleThresholdFilter; +} +// A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 +@property (readwrite, nonatomic) CGFloat blurSize; + +@end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m new file mode 100644 index 000000000..31a2ab8c4 --- /dev/null +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -0,0 +1,125 @@ +#import "GPUImageHarrisCornerDetectionFilter.h" +#import "GPUImageFilter.h" +#import "GPUImageGaussianBlurFilter.h" +#import "GPUImageXYDerivativeFilter.h" +#import "GPUImageGrayscaleFilter.h" +#import "GPUImageFastBlurFilter.h" + +// This is the Harris corner detector, as described in +// C. Harris and M. Stephens. A Combined Corner and Edge Detector. Proc. Alvey Vision Conf., Univ. Manchester, pp. 147-151, 1988. + +@implementation GPUImageHarrisCornerDetectionFilter + +NSString *const kGPUImageHarrisCornerDetectionFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + const mediump float harrisConstant = 0.01; + + void main() + { + mediump vec3 derivativeElements = texture2D(inputImageTexture, textureCoordinate).rgb; + + mediump float derivativeSum = derivativeElements.x + derivativeElements.y; + + // This is the Noble variant on the Harris detector, from + // Alison Noble, "Descriptions of Image Surfaces", PhD thesis, Department of Engineering Science, Oxford University 1989, p45. + mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z)) / (derivativeSum); + + // Original Harris detector +// highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; + + gl_FragColor = vec4(vec3(harrisIntensity * 8.0), 1.0); + } +); + +NSString *const kGPUImageSimpleThresholdFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + const lowp float threshold = 0.2; + + void main() + { + lowp float intensity = texture2D(inputImageTexture, textureCoordinate).r; + + lowp float thresholdValue = step(threshold, intensity); + + gl_FragColor = vec4(thresholdValue, 0.0, 0.0, thresholdValue); + } + ); + +@synthesize blurSize; +//@synthesize intensity = _intensity; + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: reduce to luminance + luminanceFilter = [[GPUImageGrayscaleFilter alloc] init]; + [self addFilter:luminanceFilter]; + + // Second pass: take the derivative of the luminance texture + derivativeFilter = [[GPUImageXYDerivativeFilter alloc] init]; + derivativeFilter.imageWidthFactor = 256.0; + derivativeFilter.imageHeightFactor = 256.0; + [self addFilter:derivativeFilter]; + + // Third pass: blur the derivative +// blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; + blurFilter = [[GPUImageFastBlurFilter alloc] init]; + [self addFilter:blurFilter]; + + // Fourth pass: apply the Harris corner detection calculation + harrisCornerDetectionFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageHarrisCornerDetectionFragmentShaderString]; + [self addFilter:harrisCornerDetectionFilter]; + + // TODO: Non-maximum suppression filter here + + // Fifth pass: threshold the result + simpleThresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageSimpleThresholdFragmentShaderString]; + [self addFilter:simpleThresholdFilter]; + + [luminanceFilter addTarget:derivativeFilter]; + [derivativeFilter addTarget:blurFilter]; + [blurFilter addTarget:harrisCornerDetectionFilter]; + [harrisCornerDetectionFilter addTarget:simpleThresholdFilter]; + + self.initialFilters = [NSArray arrayWithObjects:luminanceFilter, nil]; +// self.terminalFilter = harrisCornerDetectionFilter; + self.terminalFilter = simpleThresholdFilter; + +// self.intensity = 1.0; + self.blurSize = 1.5; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setBlurSize:(CGFloat)newValue; +{ + blurFilter.blurSize = newValue; +} + +- (CGFloat)blurSize; +{ + return blurFilter.blurSize; +} + +//- (void)setIntensity:(CGFloat)newValue; +//{ +// _intensity = newValue; +// [unsharpMaskFilter setFloat:newValue forUniform:@"intensity"]; +//} + +@end diff --git a/framework/Source/GPUImageXYDerivativeFilter.m b/framework/Source/GPUImageXYDerivativeFilter.m index 5152acb48..9b18ae344 100644 --- a/framework/Source/GPUImageXYDerivativeFilter.m +++ b/framework/Source/GPUImageXYDerivativeFilter.m @@ -1,5 +1,8 @@ #import "GPUImageXYDerivativeFilter.h" +// I'm using the Prewitt operator to obtain the derivative, then squaring the X and Y components and placing the product of the two in Z. +// This is primarily intended to be used with corner detection filters. + @implementation GPUImageXYDerivativeFilter NSString *const kGPUImageGradientFragmentShaderString = SHADER_STRING @@ -20,14 +23,23 @@ @implementation GPUImageXYDerivativeFilter uniform sampler2D inputImageTexture; + const float harrisConstant = -0.5; + void main() { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; - gl_FragColor = vec4(rightIntensity - leftIntensity, bottomIntensity - topIntensity, 0.0, 1.0); + float verticalDerivative = abs(-topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity); + float horizontalDerivative = abs(-bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity); + + gl_FragColor = vec4(verticalDerivative * verticalDerivative, horizontalDerivative * horizontalDerivative, verticalDerivative * horizontalDerivative, 1.0); } ); From c5a54a34ef5d1b82bc39e6b50c4e102d1ceaf9b7 Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Tue, 1 May 2012 01:20:29 -0600 Subject: [PATCH 044/695] Added Mosaic filter and 3 tilesets The mosaic filter replaces the input image with a tile based on the luminance of the input image. It requires a tile set that is structured by luminance in ascending order. The idea is to replicate the ASCII video images, but any tile set can be used. --- framework/GPUImage.xcodeproj/project.pbxproj | 20 +++ framework/Source/GPUImageMosaicFilter.h | 26 ++++ framework/Source/GPUImageMosaicFilter.m | 139 +++++++++++++++++++ framework/Source/tilesets/circles.png | Bin 0 -> 24328 bytes framework/Source/tilesets/photo 4.JPG | Bin 0 -> 74865 bytes framework/Source/tilesets/squares.png | Bin 0 -> 5689 bytes 6 files changed, 185 insertions(+) create mode 100644 framework/Source/GPUImageMosaicFilter.h create mode 100644 framework/Source/GPUImageMosaicFilter.m create mode 100644 framework/Source/tilesets/circles.png create mode 100644 framework/Source/tilesets/photo 4.JPG create mode 100644 framework/Source/tilesets/squares.png diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 17dd91186..a49ddf965 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -172,6 +172,11 @@ BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */; }; BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; + F2C19D6E154FC53A00857A72 /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2C19D6C154FC53A00857A72 /* GPUImageMosaicFilter.h */; }; + F2C19D6F154FC53A00857A72 /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2C19D6D154FC53A00857A72 /* GPUImageMosaicFilter.m */; }; + F2C19D74154FC55000857A72 /* squares.png in Resources */ = {isa = PBXBuildFile; fileRef = F2C19D71154FC55000857A72 /* squares.png */; }; + F2C19D75154FC55000857A72 /* circles.png in Resources */ = {isa = PBXBuildFile; fileRef = F2C19D72154FC55000857A72 /* circles.png */; }; + F2C19D76154FC55000857A72 /* photo 4.JPG in Resources */ = {isa = PBXBuildFile; fileRef = F2C19D73154FC55000857A72 /* photo 4.JPG */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -353,6 +358,11 @@ BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetection.m; path = Source/GPUImageThresholdEdgeDetection.m; sourceTree = SOURCE_ROOT; }; BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSmoothToonFilter.h; path = Source/GPUImageSmoothToonFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; + F2C19D6C154FC53A00857A72 /* GPUImageMosaicFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMosaicFilter.h; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/GPUImageMosaicFilter.h"; sourceTree = ""; }; + F2C19D6D154FC53A00857A72 /* GPUImageMosaicFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMosaicFilter.m; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/GPUImageMosaicFilter.m"; sourceTree = ""; }; + F2C19D71154FC55000857A72 /* squares.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = squares.png; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/squares.png"; sourceTree = ""; }; + F2C19D72154FC55000857A72 /* circles.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = circles.png; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/circles.png"; sourceTree = ""; }; + F2C19D73154FC55000857A72 /* photo 4.JPG */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = "photo 4.JPG"; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/photo 4.JPG"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -585,6 +595,8 @@ BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */, + F2C19D6C154FC53A00857A72 /* GPUImageMosaicFilter.h */, + F2C19D6D154FC53A00857A72 /* GPUImageMosaicFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -626,6 +638,9 @@ BCF1A33914DDB1EC00852800 /* GPUImage */ = { isa = PBXGroup; children = ( + F2C19D71154FC55000857A72 /* squares.png */, + F2C19D72154FC55000857A72 /* circles.png */, + F2C19D73154FC55000857A72 /* photo 4.JPG */, BC245DBF14DDBCF5009FE7EB /* GPUImage.h */, BCB5E79214E3275100701302 /* GLProgram.h */, BCB5E79314E3275200701302 /* GLProgram.m */, @@ -753,6 +768,7 @@ BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */, BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */, BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */, + F2C19D6E154FC53A00857A72 /* GPUImageMosaicFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -828,6 +844,9 @@ buildActionMask = 2147483647; files = ( BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */, + F2C19D74154FC55000857A72 /* squares.png in Resources */, + F2C19D75154FC55000857A72 /* circles.png in Resources */, + F2C19D76154FC55000857A72 /* photo 4.JPG in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -930,6 +949,7 @@ BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */, BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */, BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */, + F2C19D6F154FC53A00857A72 /* GPUImageMosaicFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h new file mode 100644 index 000000000..2fa7d4741 --- /dev/null +++ b/framework/Source/GPUImageMosaicFilter.h @@ -0,0 +1,26 @@ +// +// GPUImageMosaicFilter.h +// +// Created by Jacob Gundersen on 3/29/12. +// +// This filter takes an input tileset, the tiles must ascend in luminance +// It looks at the input image and replaces each display tile with an input tile +// according to the luminance of that tile. The idea was to replicate the ASCII +// video filters seen in other apps, but the tileset can be anything. + +#import "GPUImageFilter.h" + +@interface GPUImageMosaicFilter : GPUImageFilter { + GLint inputTileSizeUniform, numTilesUniform, displayTileSizeUniform; +} + +@property(readwrite, nonatomic) CGSize inputTileSize; +@property(readwrite, nonatomic) float numTiles; +@property(readwrite, nonatomic) CGSize displayTileSize; + +-(void)setNumTiles:(float)numTiles; +-(void)setDisplayTileSize:(CGSize)displayTileSize; +-(void)setInputTileSize:(CGSize)inputTileSize; +-(void)addTileSet:(NSString *)tileSet; + +@end diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m new file mode 100644 index 000000000..179f48c29 --- /dev/null +++ b/framework/Source/GPUImageMosaicFilter.m @@ -0,0 +1,139 @@ +// +// GPUImageMosaicFilter.m +// Face Esplode +// +// Created by Jacob Gundersen on 3/29/12. +// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. +// + +#import "GPUImageMosaicFilter.h" +#import "GPUImagePicture.h" + +NSString *const kGPUImageMosaicFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform vec2 inputTileSize; + uniform vec2 displayTileSize; + uniform float numTiles; + + void main() + { + vec2 xy = textureCoordinate; + xy = xy - mod(xy, displayTileSize); + + vec4 lumcoeff = vec4(0.299,0.587,0.114,0.0); + + float lum = dot(texture2D(inputImageTexture, xy),lumcoeff); + lum = 1.0 - lum; + + float stepsize = 1.0 / numTiles; + float lumStep = (lum - mod(lum, stepsize)) / stepsize; + + float rowStep = 1.0 / inputTileSize.x; + float x = mod(lumStep, rowStep); + float y = floor(lumStep / rowStep); + + vec2 startCoord = vec2(float(x) * inputTileSize.x, float(y) * inputTileSize.y); + vec2 finalCoord = startCoord + ((textureCoordinate - xy) * (inputTileSize / displayTileSize)); + + vec4 color = texture2D(inputImageTexture2, finalCoord); + gl_FragColor = color; + + } + ); + +@implementation GPUImageMosaicFilter + +@synthesize inputTileSize = _inputTileSize, numTiles = _numTiles, displayTileSize = _displayTileSize; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageMosaicFragmentShaderString])) + { + return nil; + } + + inputTileSizeUniform = [filterProgram uniformIndex:@"inputTileSize"]; + displayTileSizeUniform = [filterProgram uniformIndex:@"displayTileSize"]; + numTilesUniform = [filterProgram uniformIndex:@"numTiles"]; + + CGSize its = CGSizeMake(0.125, 0.125); + CGSize dts = CGSizeMake(0.025, 0.025); + [self setDisplayTileSize:dts]; + [self setInputTileSize:its]; + [self setNumTiles:64.0]; + //[self addTileSet:@"squares.png"]; + return self; +} + +-(void)setNumTiles:(float)numTiles { + + _numTiles = numTiles; + [self setFloat:_numTiles forUniform:@"numTiles"]; +} + +-(void)setInputTileSize:(CGSize)inputTileSize { + if (inputTileSize.width > 1.0) { + _inputTileSize.width = 1.0; + } + if (inputTileSize.height > 1.0) { + _inputTileSize.height = 1.0; + } + if (inputTileSize.width < 0.0) { + _inputTileSize.width = 0.0; + } + if (inputTileSize.height < 0.0) { + _inputTileSize.height = 0.0; + } + + + _inputTileSize = inputTileSize; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + GLfloat inputTS[2]; + inputTS[0] = _inputTileSize.width; + inputTS[1] = _inputTileSize.height; + glUniform2fv(inputTileSizeUniform, 1, inputTS); +} + +-(void)setDisplayTileSize:(CGSize)displayTileSize { + if (displayTileSize.width > 1.0) { + _displayTileSize.width = 1.0; + } + if (displayTileSize.height > 1.0) { + _displayTileSize.height = 1.0; + } + if (displayTileSize.width < 0.0) { + _displayTileSize.width = 0.0; + } + if (displayTileSize.height < 0.0) { + _displayTileSize.height = 0.0; + } + + + _displayTileSize = displayTileSize; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + GLfloat displayTS[2]; + displayTS[0] = _displayTileSize.width; + displayTS[1] = _displayTileSize.height; + glUniform2fv(displayTileSizeUniform, 1, displayTS); +} + +//I'd like to add this method, but I can't get it to work. The same set of commands works if they are called from my view controller class +-(void)addTileSet:(NSString *)tileSet { + UIImage *img = [UIImage imageNamed:tileSet]; + GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:img smoothlyScaleOutput:YES]; + [pic addTarget:self]; + +} + +@end diff --git a/framework/Source/tilesets/circles.png b/framework/Source/tilesets/circles.png new file mode 100644 index 0000000000000000000000000000000000000000..ffac135f39a7415cc82862ba7a39af2638df506d GIT binary patch literal 24328 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%0An&l-2+h8a0l1L$8 zH0wZche9PF9vwW)Kt4KrhWwrMR|?19Yp*+(5-`}qUnHOc4wYQO6`;xK<*0%y{NC|$ zJ|xK^_u+nBiSVo`jzttuktm78fyc(2@JC7M{~$2|@BDvtr~lJN0&(D-FCY{k(uYzz zI~3mf5??;1(3qG-CiZO4c{$}0fPwZnuc zx)UWd&uwch`+Iu+bG+;B_)H&1iM@~Y9@+gp0S%DF7y~W|5+6Zgy64$ke%KSg{`95P z`^Hz9RbLq6KS)Q3a!@3yxU~Pi^lR@=+yVSU1Rm8AL@T4~*z$N64i3lNUgGD_Ryh(tNxWo5dDK%{2+c+djz$crZsC_@)?V z@&1g%?4RyLlY(`OH-~X!);!H$

    s#H~bLi1pa)l_FrrJ9CT>HnerXz$%fyWq!Tnt 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 QFnGvG17rQ-WA?ZI10w-xrT_o{ diff --git a/framework/Source/tilesets/photo 4.JPG b/framework/Source/tilesets/photo 4.JPG deleted file mode 100644 index 4c43350f4a57ce51fb9019046fc9925cf2e2b947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74865 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ෑnt0E}>ibB$Tcx>Ic5%!aR(#x` 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 KoB#az)&Bv=Q^X|z diff --git a/framework/Source/tilesets/squares.png b/framework/Source/tilesets/squares.png deleted file mode 100644 index ac1a4899a15d871026ccbcca40e9415753adedfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5689 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 z Date: Thu, 3 May 2012 10:47:31 -0600 Subject: [PATCH 047/695] JFA Voroni Filter The Voroni filter needs an input set of points in image form, the point color needs to work with the function (r=x, g=y, b=quadrant). It will generate a diagram of colors that represent the center point for their quadrant. The consumer filter takes that and uses it with an image to do something very similar to the crystallize filter of Core Image (OS X only) --- framework/GPUImage.xcodeproj/project.pbxproj | 16 + framework/Source/GPUImageJFAVoroni.h | 19 + framework/Source/GPUImageJFAVoroni.m | 336 ++++++++++++++++++ .../Source/GPUImageVoroniConsumerFilter.h | 13 + .../Source/GPUImageVoroniConsumerFilter.m | 56 +++ 5 files changed, 440 insertions(+) create mode 100644 framework/Source/GPUImageJFAVoroni.h create mode 100644 framework/Source/GPUImageJFAVoroni.m create mode 100644 framework/Source/GPUImageVoroniConsumerFilter.h create mode 100644 framework/Source/GPUImageVoroniConsumerFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index b1e89a387..d2cc7039a 100755 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -178,6 +178,10 @@ BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */; }; BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; + F2C5D53D1552ED9800B963A1 /* GPUImageJFAVoroni.h in Headers */ = {isa = PBXBuildFile; fileRef = F2C5D5391552ED9800B963A1 /* GPUImageJFAVoroni.h */; }; + F2C5D53E1552ED9800B963A1 /* GPUImageJFAVoroni.m in Sources */ = {isa = PBXBuildFile; fileRef = F2C5D53A1552ED9800B963A1 /* GPUImageJFAVoroni.m */; }; + F2C5D53F1552ED9800B963A1 /* GPUImageVoroniConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2C5D53B1552ED9800B963A1 /* GPUImageVoroniConsumerFilter.h */; }; + F2C5D5401552ED9800B963A1 /* GPUImageVoroniConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2C5D53C1552ED9800B963A1 /* GPUImageVoroniConsumerFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -365,6 +369,10 @@ BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetection.m; path = Source/GPUImageThresholdEdgeDetection.m; sourceTree = SOURCE_ROOT; }; BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSmoothToonFilter.h; path = Source/GPUImageSmoothToonFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; + F2C5D5391552ED9800B963A1 /* GPUImageJFAVoroni.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageJFAVoroni.h; path = Source/GPUImageJFAVoroni.h; sourceTree = SOURCE_ROOT; }; + F2C5D53A1552ED9800B963A1 /* GPUImageJFAVoroni.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageJFAVoroni.m; path = Source/GPUImageJFAVoroni.m; sourceTree = SOURCE_ROOT; }; + F2C5D53B1552ED9800B963A1 /* GPUImageVoroniConsumerFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVoroniConsumerFilter.h; path = Source/GPUImageVoroniConsumerFilter.h; sourceTree = SOURCE_ROOT; }; + F2C5D53C1552ED9800B963A1 /* GPUImageVoroniConsumerFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVoroniConsumerFilter.m; path = Source/GPUImageVoroniConsumerFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -479,6 +487,10 @@ BC1B715F14F4B06600ACA2AB /* Effects */ = { isa = PBXGroup; children = ( + F2C5D5391552ED9800B963A1 /* GPUImageJFAVoroni.h */, + F2C5D53A1552ED9800B963A1 /* GPUImageJFAVoroni.m */, + F2C5D53B1552ED9800B963A1 /* GPUImageVoroniConsumerFilter.h */, + F2C5D53C1552ED9800B963A1 /* GPUImageVoroniConsumerFilter.m */, BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */, BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */, BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */, @@ -774,6 +786,8 @@ BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */, BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */, BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, + F2C5D53D1552ED9800B963A1 /* GPUImageJFAVoroni.h in Headers */, + F2C5D53F1552ED9800B963A1 /* GPUImageVoroniConsumerFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -954,6 +968,8 @@ BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */, BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */, BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, + F2C5D53E1552ED9800B963A1 /* GPUImageJFAVoroni.m in Sources */, + F2C5D5401552ED9800B963A1 /* GPUImageVoroniConsumerFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageJFAVoroni.h b/framework/Source/GPUImageJFAVoroni.h new file mode 100644 index 000000000..e6d82085d --- /dev/null +++ b/framework/Source/GPUImageJFAVoroni.h @@ -0,0 +1,19 @@ +// +// GPUImageJFAVoroni.h +// Face Esplode +// +// Created by Jacob Gundersen on 4/27/12. +// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. +// + +#import "GPUImageFilter.h" + +@interface GPUImageJFAVoroni : GPUImageFilter { + GLuint secondFilterOutputTexture; + GLuint secondFilterFramebuffer; + GLint sampleStepUniform; +} + +@property (nonatomic, assign) NSUInteger numPasses; + +@end diff --git a/framework/Source/GPUImageJFAVoroni.m b/framework/Source/GPUImageJFAVoroni.m new file mode 100644 index 000000000..883b3f816 --- /dev/null +++ b/framework/Source/GPUImageJFAVoroni.m @@ -0,0 +1,336 @@ +// +// GPUImageJFAVoroni.m +// Face Esplode +// +// Created by Jacob Gundersen on 4/27/12. +// +// adapted from unitzeroone - http://unitzeroone.com/labs/jfavoronoi/ + +#import "GPUImageJFAVoroni.h" + +NSString *const kGPUImageJFAVoroniFragmentShaderString = SHADER_STRING +( + + precision highp float; + + uniform sampler2D inputImageTexture; + varying vec2 textureCoordinate; + uniform float sampleStep; + + vec2 getCoordFromColor(vec4 color) +{ + float z = color.z * 256.0; + float xoff = mod(z,2.0); + float yoff = ((z - xoff)*.5); + float x = color.x*256.0 + xoff*256.0; + float y = color.y*256.0 + yoff*256.0; + //return vec2(x,y); + return vec2(x,y) / 256.0; +} + + void main(void) { + vec3 samplePos = vec3(sampleStep,0.0,-sampleStep); + //vec2 wh = vec2(512.0,512.0); + vec2 uvIn = textureCoordinate; + vec2 uv; + vec2 sub; + vec4 dst; + //vec4 local = texture2D(inputImageTexture, uvIn/wh); + vec4 local = texture2D(inputImageTexture, uvIn); + vec4 sam; + float l; + float smallestDist; + if(local.a == 0.0){ + //smallestDist = dot(wh,wh); + smallestDist = dot(1.0,1.0); + }else{ + sub = getCoordFromColor(local)-uvIn; + smallestDist = dot(sub,sub); + } + dst = local; + uv = uvIn+samplePos.xx; + //sam = texture2D(inputImageTexture, uv/wh); + sam = texture2D(inputImageTexture, uv); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + uv = uvIn+samplePos.yx; +// sam = texture2D(inputImageTexture, uv/wh); + sam = texture2D(inputImageTexture, uv); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + uv = uvIn+samplePos.zx; +// sam = texture2D(inputImageTexture, uv/wh); + sam = texture2D(inputImageTexture, uv); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + uv = uvIn+samplePos.xy; +// sam = texture2D(inputImageTexture, uv/wh); + sam = texture2D(inputImageTexture, uv); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + uv = uvIn+samplePos.zy; +// sam = texture2D(inputImageTexture, uv/wh); + sam = texture2D(inputImageTexture, uv); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + uv = uvIn+samplePos.xz; +// sam = texture2D(inputImageTexture, uv/wh); + sam = texture2D(inputImageTexture, uv); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + uv = uvIn+samplePos.yz; +// sam = texture2D(inputImageTexture, uv/wh); + sam = texture2D(inputImageTexture, uv); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + uv = uvIn+samplePos.zz; +// sam = texture2D(inputImageTexture, uv/wh); + sam = texture2D(inputImageTexture, uv); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + gl_FragColor = dst; + } + ); + +@implementation GPUImageJFAVoroni + +@synthesize numPasses; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageJFAVoroniFragmentShaderString])) + { + NSLog(@"nil returned"); + return nil; + + } + + sampleStepUniform = [filterProgram uniformIndex:@"sampleStep"]; + NSLog(@"setup filter"); + return self; +} + +#pragma mark - +#pragma mark Managing the display FBOs + + +- (void)initializeOutputTexture; +{ + [super initializeOutputTexture]; + + glGenTextures(1, &secondFilterOutputTexture); + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); +} + +- (void)createFilterFBOofSize:(CGSize)currentFBOSize; +{ + NSLog(@"log %f", log2(256)); + numPasses = (int)log2(currentFBOSize.width); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } + + glGenFramebuffers(1, &secondFilterFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d"); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); + } + + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + } + else + { + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + } + NSLog(@"doe here"); + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + + glBindTexture(GL_TEXTURE_2D, 0); +} + + + //we may not need these +- (void)setSecondFilterFBO; +{ + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + // + // CGSize currentFBOSize = [self sizeOfFBO]; + // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); +} + +- (void)setOutputFBO; +{ + if (numPasses % 2 == 1) { + [self setSecondFilterFBO]; + } else { + [self setFilterFBO]; + } + +} + + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + // Run the first stage of the two-pass filter + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(sampleStepUniform, 0.5); + + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + + for (int pass = 1; pass <= numPasses + 1; pass++) { + //NSLog(@"pass %d", pass); + if (pass % 2 == 0) { + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + float step = pow(2.0, numPasses - pass) / self.sizeOfFBO.width; + glUniform1f(sampleStepUniform, step); + + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:secondFilterOutputTexture]; + } else { + // Run the second stage of the two-pass filter + [self setSecondFilterFBO]; + + [filterProgram use]; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, outputTexture); + + glUniform1i(filterInputTextureUniform, 3); + + float step = pow(2.0, numPasses - pass) / self.sizeOfFBO.width; + glUniform1f(sampleStepUniform, step); + + if (filterSourceTexture2 != 0) + { + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + + glUniform1i(filterInputTextureUniform2, 4); + } + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + } +} + + + +@end diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoroniConsumerFilter.h new file mode 100644 index 000000000..c32b0e19a --- /dev/null +++ b/framework/Source/GPUImageVoroniConsumerFilter.h @@ -0,0 +1,13 @@ +// +// GPUVoroniConsumerFilter.h +// Face Esplode +// +// Created by Jacob Gundersen on 4/28/12. +// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. +// + +#import "GPUImageFilter.h" + +@interface GPUImageVoroniConsumerFilter : GPUImageFilter + +@end diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoroniConsumerFilter.m new file mode 100644 index 000000000..1835bb8cc --- /dev/null +++ b/framework/Source/GPUImageVoroniConsumerFilter.m @@ -0,0 +1,56 @@ +// +// GPUVoroniConsumerFilter.m +// Face Esplode +// +// Created by Jacob Gundersen on 4/28/12. +// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. +// + +#import "GPUImageVoroniConsumerFilter.h" + +NSString *const kGPUImageVoroniConsumerFragmentShaderString = SHADER_STRING +( + + precision highp float; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + varying vec2 textureCoordinate; + + vec2 getCoordFromColor(vec4 color) +{ + float z = color.z * 256.0; + float xoff = mod(z,2.0); + float yoff = ((z - xoff)*.5); + float x = color.x*256.0 + xoff*256.0; + float y = color.y*256.0 + yoff*256.0; + //return vec2(x,y); + return vec2(x,y) / 256.0; +} + + void main(void) { + vec4 colorLoc = texture2D(inputImageTexture2, textureCoordinate); + vec4 color = texture2D(inputImageTexture, getCoordFromColor(colorLoc)); + gl_FragColor = color; + } + + + ); + +@implementation GPUImageVoroniConsumerFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageVoroniConsumerFragmentShaderString])) + { + return nil; + } + + return self; +} + +-(CGSize)sizeOfFBO { + return CGSizeMake(256, 256); +} + +@end From b3ea6abb8b5050bf527163f9f15c4c323d54f51f Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Thu, 3 May 2012 13:04:28 -0600 Subject: [PATCH 048/695] adding attributions --- framework/Source/GPUImageJFAVoroni.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageJFAVoroni.h b/framework/Source/GPUImageJFAVoroni.h index e6d82085d..17d934bb6 100644 --- a/framework/Source/GPUImageJFAVoroni.h +++ b/framework/Source/GPUImageJFAVoroni.h @@ -3,8 +3,8 @@ // Face Esplode // // Created by Jacob Gundersen on 4/27/12. -// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. -// +// The shaders are mostly taken from UnitZeroOne's WebGL example here: +// http://unitzeroone.com/blog/2011/03/22/jump-flood-voronoi-for-webgl/ #import "GPUImageFilter.h" From 344b52168ee51246fef8b7863501011ed49658c7 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 3 May 2012 17:31:04 -0500 Subject: [PATCH 049/695] To fix photos getting corrupted with the iOS 5.0 texture caches, I now pause camera input while capturing a photo. --- .../SimplePhotoFilter/PhotoViewController.m | 6 ++++-- .../SimpleVideoFilterViewController.m | 12 ++++++------ framework/Source/GPUImageFilter.m | 3 ++- .../Source/GPUImageHarrisCornerDetectionFilter.m | 1 - framework/Source/GPUImageStillCamera.m | 2 ++ framework/Source/GPUImageVideoCamera.h | 2 ++ framework/Source/GPUImageVideoCamera.m | 8 ++++++++ 7 files changed, 24 insertions(+), 10 deletions(-) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index d07d382d4..af62fd082 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -52,10 +52,11 @@ - (void)viewDidLoad stillCamera = [[GPUImageStillCamera alloc] init]; // filter = [[GPUImageGammaFilter alloc] init]; filter = [[GPUImageSketchFilter alloc] init]; - [(GPUImageSketchFilter *)filter setImageHeightFactor:640.0]; - [(GPUImageSketchFilter *)filter setImageWidthFactor:480.0]; +// [(GPUImageSketchFilter *)filter setImageHeightFactor:640.0]; +// [(GPUImageSketchFilter *)filter setImageWidthFactor:480.0]; // filter = [[GPUImageSmoothToonFilter alloc] init]; // filter = [[GPUImageSepiaFilter alloc] init]; + [filter prepareForImageCapture]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; @@ -118,6 +119,7 @@ - (IBAction)takePhoto:(id)sender; [processedImage self]; CGImageRelease(imageRef); + runOnMainQueueWithoutDeadlocking(^{ [photoCaptureButton setEnabled:YES]; }); diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 59bc95e6d..1c0ab7f1e 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -25,13 +25,13 @@ - (void)viewDidLoad // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; -// filter = [[GPUImagePixellateFilter alloc] init]; + filter = [[GPUImageSepiaFilter alloc] init]; - filter = [[GPUImageTiltShiftFilter alloc] init]; - [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:0.65]; - [(GPUImageTiltShiftFilter *)filter setBottomFocusLevel:0.85]; - [(GPUImageTiltShiftFilter *)filter setBlurSize:1.5]; - [(GPUImageTiltShiftFilter *)filter setFocusFallOffRate:0.2]; +// filter = [[GPUImageTiltShiftFilter alloc] init]; +// [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:0.65]; +// [(GPUImageTiltShiftFilter *)filter setBottomFocusLevel:0.85]; +// [(GPUImageTiltShiftFilter *)filter setBlurSize:1.5]; +// [(GPUImageTiltShiftFilter *)filter setFocusFallOffRate:0.2]; // filter = [[GPUImageSketchFilter alloc] init]; // filter = [[GPUImageSmoothToonFilter alloc] init]; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 4d6527576..365fd564e 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -145,7 +145,8 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CGDataProviderRef dataProvider; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { - glFlush(); +// glFlush(); + glFinish(); CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation CVPixelBufferLockBaseAddress(renderTarget, 0); rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 7e5644040..6c15ca5a2 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -33,7 +33,6 @@ void main() // highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; gl_FragColor = vec4(vec3(harrisIntensity * 10.0), 1.0); -// gl_FragColor = vec4(derivativeElements, 1.0); } ); diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index df67fc84e..982c465ce 100644 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -42,12 +42,14 @@ - (void)removeInputsAndOutputs; - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + [self stopCameraCapture]; [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; block(filteredPhoto, error); + [self startCameraCapture]; }]; return; diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index ec5a66ec1..1644bfe99 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -18,6 +18,8 @@ AVCaptureSession *_captureSession; AVCaptureDevice *_inputCamera; AVCaptureDevice *_microphone; + + BOOL capturePaused; } @property(readonly, retain) AVCaptureSession *captureSession; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 84b13f088..383b0d0fa 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -107,6 +107,14 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } [_captureSession setSessionPreset:sessionPreset]; + +// This will let you get 60 FPS video from the 720p preset on an iPhone 4S, but only that device and that preset +// AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; +// +// if (conn.supportsVideoMinFrameDuration) +// conn.videoMinFrameDuration = CMTimeMake(1,60); +// if (conn.supportsVideoMaxFrameDuration) +// conn.videoMaxFrameDuration = CMTimeMake(1,60); [_captureSession commitConfiguration]; From 0b926389389f9fa62d721ebc8bc11fe3a7a69eea Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 4 May 2012 09:34:45 -0500 Subject: [PATCH 050/695] Trying another means of preventing photos from being overwritten in memory. The first one led to crashes. --- .../SimplePhotoFilter/PhotoViewController.m | 7 +++++-- framework/Source/GPUImageStillCamera.m | 2 -- framework/Source/GPUImageVideoCamera.h | 2 ++ framework/Source/GPUImageVideoCamera.m | 17 ++++++++++++++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index af62fd082..fd2fc6d4f 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -56,7 +56,7 @@ - (void)viewDidLoad // [(GPUImageSketchFilter *)filter setImageWidthFactor:480.0]; // filter = [[GPUImageSmoothToonFilter alloc] init]; // filter = [[GPUImageSepiaFilter alloc] init]; - + [filter prepareForImageCapture]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; @@ -90,6 +90,7 @@ - (IBAction)takePhoto:(id)sender; [photoCaptureButton setEnabled:NO]; [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ + [stillCamera pauseCameraCapture]; // This is necessary when using iOS 5.0 texture caches in order to prevent overwriting the image in memory with new frames NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); @@ -117,8 +118,10 @@ - (IBAction)takePhoto:(id)sender; NSLog(@"PHOTO SAVED - assetURL: %@", assetURL); } - [processedImage self]; +// [processedImage self]; CGImageRelease(imageRef); + + [stillCamera resumeCameraCapture]; // This is necessary when using iOS 5.0 texture caches in order to prevent overwriting the image in memory with new frames runOnMainQueueWithoutDeadlocking(^{ [photoCaptureButton setEnabled:YES]; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 982c465ce..df67fc84e 100644 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -42,14 +42,12 @@ - (void)removeInputsAndOutputs; - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { - [self stopCameraCapture]; [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; block(filteredPhoto, error); - [self startCameraCapture]; }]; return; diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 1644bfe99..037bea935 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -35,6 +35,8 @@ // Manage the camera video stream - (void)startCameraCapture; - (void)stopCameraCapture; +- (void)pauseCameraCapture; +- (void)resumeCameraCapture; - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (AVCaptureDevicePosition)getCameraPosition; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 383b0d0fa..9562e5733 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -46,8 +46,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.processingQueue", NULL); - _runBenchmark = NO; + capturePaused = NO; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { @@ -172,6 +172,16 @@ - (void)stopCameraCapture; } } +- (void)pauseCameraCapture; +{ + capturePaused = YES; +} + +- (void)resumeCameraCapture; +{ + capturePaused = NO; +} + - (void)rotateCamera { NSError *error; @@ -224,6 +234,11 @@ - (AVCaptureDevicePosition)getCameraPosition - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { + if (capturePaused) + { + return; + } + CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer); int bufferWidth = CVPixelBufferGetWidth(cameraFrame); From 9804a527f659d082a1184be82dae42dbb22d9002 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 4 May 2012 10:21:23 -0500 Subject: [PATCH 051/695] Implemented a locking at the pixel buffer level for an even more robust prevention of updates while taking a photo. --- .../SimplePhotoFilter/PhotoViewController.m | 3 --- framework/Source/GPUImageCropFilter.m | 9 -------- framework/Source/GPUImageFilter.h | 5 ++++- framework/Source/GPUImageFilter.m | 21 +++++++++++++++---- framework/Source/GPUImageHistogramFilter.m | 5 +++++ framework/Source/GPUImageTwoPassFilter.m | 5 +++++ 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index fd2fc6d4f..6856a7c02 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -90,7 +90,6 @@ - (IBAction)takePhoto:(id)sender; [photoCaptureButton setEnabled:NO]; [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ - [stillCamera pauseCameraCapture]; // This is necessary when using iOS 5.0 texture caches in order to prevent overwriting the image in memory with new frames NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); @@ -121,8 +120,6 @@ - (IBAction)takePhoto:(id)sender; // [processedImage self]; CGImageRelease(imageRef); - [stillCamera resumeCameraCapture]; // This is necessary when using iOS 5.0 texture caches in order to prevent overwriting the image in memory with new frames - runOnMainQueueWithoutDeadlocking(^{ [photoCaptureButton setEnabled:YES]; }); diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 134590fe7..96df447c7 100644 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -44,15 +44,6 @@ - (id)init; #pragma mark - #pragma mark GPUImageInput -//- (void)setInputSize:(CGSize)newSize; -//{ -// CGSize croppedSize; -// croppedSize.width = newSize.width * _cropRegion.size.width; -// croppedSize.height = newSize.height * _cropRegion.size.height; -// -// inputTextureSize = croppedSize; -//} -// - (void)newFrameReadyAtTime:(CMTime)frameTime; { static const GLfloat cropSquareVertices[] = { diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index a825509e5..4765ff97c 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -53,10 +53,13 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; CVOpenGLESTextureCacheRef filterTextureCache; CVPixelBufferRef renderTarget; CVOpenGLESTextureRef renderTexture; - + CGSize currentFilterSize; } +@property(readonly) CVPixelBufferRef renderTarget; +@property(readwrite, nonatomic) BOOL preventRendering; + // Initialization and teardown - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShaderFromString:(NSString *)fragmentShaderString; - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 365fd564e..a6bedde26 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -33,6 +33,9 @@ void main() @implementation GPUImageFilter +@synthesize renderTarget; +@synthesize preventRendering = _preventRendering; + #pragma mark - #pragma mark Initialization and teardown @@ -44,6 +47,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad } preparedToCaptureImage = NO; + _preventRendering = NO; backgroundColorRed = 0.0; backgroundColorGreen = 0.0; @@ -129,8 +133,11 @@ void dataProviderReleaseCallback (void *info, const void *data, size_t size) void dataProviderUnlockCallback (void *info, const void *data, size_t size) { - CVPixelBufferUnlockBaseAddress((CVPixelBufferRef)info, 0); - CFRelease((CVPixelBufferRef)info); + GPUImageFilter *filter = (__bridge_transfer GPUImageFilter*)info; + + CVPixelBufferUnlockBaseAddress([filter renderTarget], 0); + CFRelease([filter renderTarget]); + filter.preventRendering = NO; } - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; @@ -149,8 +156,9 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio glFinish(); CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation CVPixelBufferLockBaseAddress(renderTarget, 0); + self.preventRendering = YES; // Locks don't seem to work, so prevent any rendering to the filter which might overwrite the pixel buffer data until done processing rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); - dataProvider = CGDataProviderCreateWithData(renderTarget, rawImagePixels, totalBytesForImage, dataProviderUnlockCallback); + dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, totalBytesForImage, dataProviderUnlockCallback); } else { @@ -333,6 +341,11 @@ - (void)setOutputFBO; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { + if (self.preventRendering) + { + return; + } + [GPUImageOpenGLESContext useImageProcessingContext]; [self setFilterFBO]; @@ -539,7 +552,7 @@ - (void)recreateFilterFBO - (void)setInputSize:(CGSize)newSize; { - if (overrideInputSize) + if (overrideInputSize || self.preventRendering) { return; } diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 5748fc19f..2fef7326d 100644 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -237,6 +237,11 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { + if (self.preventRendering) + { + return; + } + [GPUImageOpenGLESContext useImageProcessingContext]; glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates); diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 5787b17ba..d02d4def9 100644 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -202,6 +202,11 @@ - (void)setOutputFBO; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { + if (self.preventRendering) + { + return; + } + // Run the first stage of the two-pass filter [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; From 6211e1f825be755abae3e0865cdbc6d90f5f14ef Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 4 May 2012 22:01:30 -0500 Subject: [PATCH 052/695] Made the histogram respect the background color setting. --- README.md | 3 +++ .../ShowcaseFilterViewController.m | 4 +-- .../SimplePhotoFilter/PhotoViewController.m | 11 ++++++-- framework/Source/GPUImageAlphaBlendFilter.h | 6 +++++ framework/Source/GPUImageAlphaBlendFilter.m | 22 +++++++++++++++- .../Source/GPUImageDissolveBlendFilter.m | 4 +-- framework/Source/GPUImageFilter.m | 11 -------- framework/Source/GPUImageHistogramGenerator.h | 3 +++ framework/Source/GPUImageHistogramGenerator.m | 25 +++++++++++++++++-- 9 files changed, 69 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 0c9f52e0a..ce9e18418 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,9 @@ For example, an application that takes in live video from the camera, converts t - **GPUImageSoftLightBlendFilter**: Applies a soft light blend of two images +- **GPUImageAlphaBlendFilter**: Blends the second image over the first, based on the second's alpha channel + - *mix*: The degree with which the second image overrides the first (0.0 - 1.0, with 1.0 as the default) + ### Visual effects ### - **GPUImagePixellateFilter**: Applies a pixellation effect on an image or video diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 5765a8f4e..678ae9bea 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -697,8 +697,8 @@ - (void)setupFilter; [histogramGraph forceProcessingAtSize:CGSizeMake(256.0, 330.0)]; - GPUImageDissolveBlendFilter *blendFilter = [[GPUImageDissolveBlendFilter alloc] init]; - blendFilter.mix = 0.5; + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + blendFilter.mix = 0.75; [filter addTarget:histogramGraph]; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 6856a7c02..a8631d0f5 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -52,8 +52,8 @@ - (void)viewDidLoad stillCamera = [[GPUImageStillCamera alloc] init]; // filter = [[GPUImageGammaFilter alloc] init]; filter = [[GPUImageSketchFilter alloc] init]; -// [(GPUImageSketchFilter *)filter setImageHeightFactor:640.0]; -// [(GPUImageSketchFilter *)filter setImageWidthFactor:480.0]; + [(GPUImageSketchFilter *)filter setImageHeightFactor:1024.0]; + [(GPUImageSketchFilter *)filter setImageWidthFactor:768.0]; // filter = [[GPUImageSmoothToonFilter alloc] init]; // filter = [[GPUImageSepiaFilter alloc] init]; @@ -65,7 +65,14 @@ - (void)viewDidLoad GPUImageView *filterView = (GPUImageView *)self.view; [filter addTarget:filterView]; +// [stillCamera.inputCamera lockForConfiguration:nil]; +// [stillCamera.inputCamera setFlashMode:AVCaptureFlashModeOn]; +// [stillCamera.inputCamera unlockForConfiguration]; + [stillCamera startCameraCapture]; + + + } - (void)viewDidUnload diff --git a/framework/Source/GPUImageAlphaBlendFilter.h b/framework/Source/GPUImageAlphaBlendFilter.h index 037e3c0c4..46e75f013 100644 --- a/framework/Source/GPUImageAlphaBlendFilter.h +++ b/framework/Source/GPUImageAlphaBlendFilter.h @@ -1,5 +1,11 @@ #import "GPUImageFilter.h" @interface GPUImageAlphaBlendFilter : GPUImageFilter +{ + GLint mixUniform; +} + +// Mix ranges from 0.0 (only image 1) to 1.0 (only image 2), with 1.0 as the normal level +@property(readwrite, nonatomic) CGFloat mix; @end diff --git a/framework/Source/GPUImageAlphaBlendFilter.m b/framework/Source/GPUImageAlphaBlendFilter.m index 02c145d20..f3a28634c 100644 --- a/framework/Source/GPUImageAlphaBlendFilter.m +++ b/framework/Source/GPUImageAlphaBlendFilter.m @@ -7,18 +7,22 @@ uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; + uniform lowp float mixturePercent; + void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); - gl_FragColor = vec4(mix(textureColor.rgb, textureColor2.rgb, textureColor2.a), textureColor.a); + gl_FragColor = vec4(mix(textureColor.rgb, textureColor2.rgb, textureColor2.a * mixturePercent), textureColor.a); } ); @implementation GPUImageAlphaBlendFilter +@synthesize mix = _mix; + - (id)init; { if (!(self = [super initWithFragmentShaderFromString:kGPUImageAlphaBlendFragmentShaderString])) @@ -26,8 +30,24 @@ - (id)init; return nil; } + mixUniform = [filterProgram uniformIndex:@"mixturePercent"]; + self.mix = 0.5; + return self; } +#pragma mark - +#pragma mark Accessors + +- (void)setMix:(CGFloat)newValue; +{ + _mix = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(mixUniform, _mix); +} + + @end diff --git a/framework/Source/GPUImageDissolveBlendFilter.m b/framework/Source/GPUImageDissolveBlendFilter.m index 1a8206286..daa5ad518 100644 --- a/framework/Source/GPUImageDissolveBlendFilter.m +++ b/framework/Source/GPUImageDissolveBlendFilter.m @@ -32,8 +32,8 @@ - (id)init; } mixUniform = [filterProgram uniformIndex:@"mixturePercent"]; - self.mix = 0.5; - + self.mix = 1.0; + return self; } diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index a6bedde26..099ec1f20 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -351,12 +351,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [filterProgram use]; -// if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) -// { -// CVReturn lockStatus = CVPixelBufferLockBaseAddress(renderTarget, 0); -// NSLog(@"Lock status: %d", lockStatus); -// } - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); @@ -377,11 +371,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - -// if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) -// { -// CVPixelBufferUnlockBaseAddress(renderTarget, 0); -// } } - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; diff --git a/framework/Source/GPUImageHistogramGenerator.h b/framework/Source/GPUImageHistogramGenerator.h index 1bc0e4d9f..f80c50f31 100644 --- a/framework/Source/GPUImageHistogramGenerator.h +++ b/framework/Source/GPUImageHistogramGenerator.h @@ -1,5 +1,8 @@ #import "GPUImageFilter.h" @interface GPUImageHistogramGenerator : GPUImageFilter +{ + GLint backgroundColorUniform; +} @end diff --git a/framework/Source/GPUImageHistogramGenerator.m b/framework/Source/GPUImageHistogramGenerator.m index 72fe815d9..50089b94b 100644 --- a/framework/Source/GPUImageHistogramGenerator.m +++ b/framework/Source/GPUImageHistogramGenerator.m @@ -22,12 +22,13 @@ void main() varying highp float height; uniform sampler2D inputImageTexture; + uniform lowp vec4 backgroundColor; void main() { lowp vec3 colorChannels = texture2D(inputImageTexture, textureCoordinate).rgb; - lowp vec3 heightTest = step(height, colorChannels); - gl_FragColor = vec4(heightTest, 1.0); + lowp vec4 heightTest = vec4(step(height, colorChannels), 1.0); + gl_FragColor = mix(backgroundColor, heightTest, heightTest.r + heightTest.g + heightTest.b); } ); @@ -44,7 +45,27 @@ - (id)init; return nil; } + backgroundColorUniform = [filterProgram uniformIndex:@"backgroundColor"]; + + [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:0.0]; + return self; } +#pragma mark - +#pragma mark Accessors + +- (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; +{ + GLfloat backgroundColor[4]; + backgroundColor[0] = redComponent; + backgroundColor[1] = greenComponent; + backgroundColor[2] = blueComponent; + backgroundColor[3] = alphaComponent; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform4fv(backgroundColorUniform, 1, backgroundColor); +} + @end From d94f871dd988e9aefac2c1168ea06d14d92584c3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 4 May 2012 22:20:10 -0500 Subject: [PATCH 053/695] Added -forceProcessingAtSizeRespectingAspectRatio per Alaric Cole's suggestion to make thumbnail generation easier while preserving image aspect ratios. --- .../ShowcaseFilterViewController.m | 2 +- framework/Source/GPUImageFilter.m | 33 +++++++++++++++++-- framework/Source/GPUImageOutput.h | 3 +- framework/Source/GPUImageOutput.m | 4 +++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 678ae9bea..7baa37f1d 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -52,7 +52,7 @@ - (void)setupFilter; { videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; - + switch (filterType) { case GPUIMAGE_SEPIA: diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 099ec1f20..ae9ba2465 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -1,5 +1,6 @@ #import "GPUImageFilter.h" #import "GPUImagePicture.h" +#import // Hardcode the vertex shader for standard filters, but this can be overridden NSString *const kGPUImageVertexShaderString = SHADER_STRING @@ -541,11 +542,25 @@ - (void)recreateFilterFBO - (void)setInputSize:(CGSize)newSize; { - if (overrideInputSize || self.preventRendering) + if (self.preventRendering) { return; } + if (overrideInputSize) + { + if (CGSizeEqualToSize(forcedMaximumSize, CGSizeZero)) + { + return; + } + else + { + CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(newSize, CGRectMake(0.0, 0.0, forcedMaximumSize.width, forcedMaximumSize.height)); + inputTextureSize = insetRect.size; + return; + } + } + if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (CGSizeEqualToSize(newSize, CGSizeZero)) ) { inputTextureSize = newSize; @@ -558,7 +573,7 @@ - (void)setInputSize:(CGSize)newSize; } - (void)forceProcessingAtSize:(CGSize)frameSize; -{ +{ if (CGSizeEqualToSize(frameSize, CGSizeZero)) { overrideInputSize = NO; @@ -567,6 +582,20 @@ - (void)forceProcessingAtSize:(CGSize)frameSize; { overrideInputSize = YES; inputTextureSize = frameSize; + forcedMaximumSize = CGSizeZero; + } +} + +- (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; +{ + if (CGSizeEqualToSize(frameSize, CGSizeZero)) + { + overrideInputSize = NO; + } + else + { + overrideInputSize = YES; + forcedMaximumSize = frameSize; } } diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index ee4d56186..4dfb59076 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -12,7 +12,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); NSMutableArray *targets, *targetTextureIndices; GLuint outputTexture; - CGSize inputTextureSize, cachedMaximumOutputSize; + CGSize inputTextureSize, cachedMaximumOutputSize, forcedMaximumSize; BOOL overrideInputSize; } @@ -33,6 +33,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); - (void)initializeOutputTexture; - (void)deleteOutputTexture; - (void)forceProcessingAtSize:(CGSize)frameSize; +- (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; // Still image processing - (UIImage *)imageFromCurrentlyProcessedOutput; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index cab9026b2..3564aeeaa 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -142,6 +142,10 @@ - (void)forceProcessingAtSize:(CGSize)frameSize; } +- (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; +{ +} + #pragma mark - #pragma mark Still image processing From 524803808b27c53eba8f5583d82032d54fa6f545 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 6 May 2012 20:43:50 -0500 Subject: [PATCH 054/695] Trying to fix some memory buildup conditions. --- .../ShowcaseFilterViewController.m | 12 +++++-- .../SimplePhotoFilter/PhotoViewController.m | 32 +++++++++---------- framework/Source/GPUImageFilter.m | 12 +++++-- framework/Source/GPUImageMovieWriter.m | 2 ++ framework/Source/GPUImageOutput.m | 2 ++ framework/Source/GPUImageRawData.m | 2 ++ framework/Source/GPUImageStillCamera.m | 1 + framework/Source/GPUImageView.m | 2 ++ 8 files changed, 42 insertions(+), 23 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 7baa37f1d..e023f3ddf 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -382,10 +382,16 @@ - (void)setupFilter; // { 0.0f, 1.0f, 2.0f} // }]; [(GPUImage3x3ConvolutionFilter *)filter setConvolutionKernel:(GPUMatrix3x3){ - {1.0f, 1.0f, 1.0f}, - {1.0f, -8.0f, 1.0f}, - {1.0f, 1.0f, 1.0f} + {-1.0f, 0.0f, 1.0f}, + {-2.0f, 0.0f, 2.0f}, + {-1.0f, 0.0f, 1.0f} }]; + +// [(GPUImage3x3ConvolutionFilter *)filter setConvolutionKernel:(GPUMatrix3x3){ +// {1.0f, 1.0f, 1.0f}, +// {1.0f, -8.0f, 1.0f}, +// {1.0f, 1.0f, 1.0f} +// }]; // [(GPUImage3x3ConvolutionFilter *)filter setConvolutionKernel:(GPUMatrix3x3){ // { 0.11f, 0.11f, 0.11f}, // { 0.11f, 0.11f, 0.11f}, diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index a8631d0f5..a4b02672f 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -56,8 +56,9 @@ - (void)viewDidLoad [(GPUImageSketchFilter *)filter setImageWidthFactor:768.0]; // filter = [[GPUImageSmoothToonFilter alloc] init]; // filter = [[GPUImageSepiaFilter alloc] init]; - - [filter prepareForImageCapture]; + + [filter prepareForImageCapture]; + GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [stillCamera addTarget:rotationFilter]; @@ -70,9 +71,6 @@ - (void)viewDidLoad // [stillCamera.inputCamera unlockForConfiguration]; [stillCamera startCameraCapture]; - - - } - (void)viewDidUnload @@ -97,17 +95,18 @@ - (IBAction)takePhoto:(id)sender; [photoCaptureButton setEnabled:NO]; [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ - - NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); - - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - - NSError *error2 = nil; - if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) - { - return; - } + + // Having both this and the asset library saving uses twice the memory sometimes +// NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); +// +// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +// NSString *documentsDirectory = [paths objectAtIndex:0]; +// +// NSError *error2 = nil; +// if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) +// { +// return; +// } // Save to assets library ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; @@ -124,7 +123,6 @@ - (IBAction)takePhoto:(id)sender; NSLog(@"PHOTO SAVED - assetURL: %@", assetURL); } -// [processedImage self]; CGImageRelease(imageRef); runOnMainQueueWithoutDeadlocking(^{ diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index ae9ba2465..3ccc40823 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -138,6 +138,7 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) CVPixelBufferUnlockBaseAddress([filter renderTarget], 0); CFRelease([filter renderTarget]); + filter.preventRendering = NO; } @@ -296,14 +297,13 @@ - (void)destroyFilterFBO; { if (filterFramebuffer) { + [GPUImageOpenGLESContext useImageProcessingContext]; + glDeleteFramebuffers(1, &filterFramebuffer); filterFramebuffer = 0; if (filterTextureCache != NULL) { - CFRelease(filterTextureCache); - filterTextureCache = NULL; - CFRelease(renderTarget); renderTarget = NULL; @@ -312,6 +312,10 @@ - (void)destroyFilterFBO; CFRelease(renderTexture); renderTexture = NULL; } + + CVOpenGLESTextureCacheFlush(filterTextureCache, 0); + CFRelease(filterTextureCache); + filterTextureCache = NULL; } } } @@ -400,6 +404,8 @@ - (void)prepareForImageCapture; { if (outputTexture) { + [GPUImageOpenGLESContext useImageProcessingContext]; + glDeleteTextures(1, &outputTexture); outputTexture = 0; } diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 55932b0bc..ab9ea6cf3 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -316,6 +316,8 @@ - (void)createDataFBO; - (void)destroyDataFBO; { + [GPUImageOpenGLESContext useImageProcessingContext]; + if (movieFramebuffer) { glDeleteFramebuffers(1, &movieFramebuffer); diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 3564aeeaa..f24daeb1b 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -130,6 +130,8 @@ - (void)initializeOutputTexture; - (void)deleteOutputTexture; { + [GPUImageOpenGLESContext useImageProcessingContext]; + if (outputTexture) { glDeleteTextures(1, &outputTexture); diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawData.m index 63172cd6e..411ae80d3 100644 --- a/framework/Source/GPUImageRawData.m +++ b/framework/Source/GPUImageRawData.m @@ -169,6 +169,8 @@ - (void)createDataFBO; - (void)destroyDataFBO; { + [GPUImageOpenGLESContext useImageProcessingContext]; + if (dataFramebuffer) { glDeleteFramebuffers(1, &dataFramebuffer); diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index df67fc84e..c123bf4ae 100644 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -34,6 +34,7 @@ - (id)init; - (void)removeInputsAndOutputs; { [self.captureSession removeOutput:photoOutput]; + [super removeInputsAndOutputs]; } #pragma mark - diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 7ee016732..70ce70d76 100644 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -161,6 +161,8 @@ - (void)createDisplayFramebuffer; - (void)destroyDisplayFramebuffer; { + [GPUImageOpenGLESContext useImageProcessingContext]; + if (displayFramebuffer) { glDeleteFramebuffers(1, &displayFramebuffer); From 5810b568ffbb585a9a350f214209883de18ced9a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 6 May 2012 21:30:57 -0500 Subject: [PATCH 055/695] Crop filter now maintains the aspect ratio of the cropped image. --- .../ShowcaseFilterViewController.m | 4 ++-- framework/Source/GPUImageCropFilter.m | 11 +++++++++++ framework/Source/GPUImageFilter.h | 1 + framework/Source/GPUImageFilter.m | 7 ++++++- framework/Source/GPUImageHistogramFilter.m | 19 +++---------------- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index e023f3ddf..1874b7c90 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -237,7 +237,7 @@ - (void)setupFilter; [self.filterSettingsSlider setMaximumValue:1.0]; [self.filterSettingsSlider setValue:0.5]; - filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 0.5, 0.5)]; + filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 0.5, 0.25)]; }; break; case GPUIMAGE_MASK: { @@ -771,7 +771,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)filter setExcludeCircleRadius:[(UISlider*)sender value]]; break; case GPUIMAGE_FILTERGROUP: [(GPUImagePixellateFilter *)[(GPUImageFilterGroup *)filter filterAtIndex:1] setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; - case GPUIMAGE_CROP: [(GPUImageCropFilter *)filter setCropRegion:CGRectMake(0.0, 0.0, [(UISlider*)sender value], [(UISlider*)sender value])]; break; + case GPUIMAGE_CROP: [(GPUImageCropFilter *)filter setCropRegion:CGRectMake(0.0, 0.0, [(UISlider*)sender value], [(UISlider*)sender value] * 0.5)]; break; case GPUIMAGE_TRANSFORM: [(GPUImageTransformFilter *)filter setAffineTransform:CGAffineTransformMakeRotation([(UISlider*)sender value])]; break; case GPUIMAGE_TRANSFORM3D: { diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 96df447c7..b6923fba1 100644 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -41,6 +41,17 @@ - (id)init; return self; } +#pragma mark - +#pragma mark Rendering + +- (CGSize)outputFrameSize; +{ + CGSize adjustedSize; + adjustedSize.width = inputTextureSize.width * _cropRegion.size.width; + adjustedSize.height = inputTextureSize.height * _cropRegion.size.height; + return adjustedSize; +} + #pragma mark - #pragma mark GPUImageInput diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 4765ff97c..9bc992040 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -79,6 +79,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; // Rendering - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; +- (CGSize)outputFrameSize; // Input parameters - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 3ccc40823..dece8259f 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -390,12 +390,17 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; [self setInputTextureForTarget:currentTarget atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; } - [currentTarget setInputSize:inputTextureSize]; + [currentTarget setInputSize:[self outputFrameSize]]; [currentTarget newFrameReadyAtTime:frameTime]; } } } +- (CGSize)outputFrameSize; +{ + return inputTextureSize; +} + - (void)prepareForImageCapture; { preparedToCaptureImage = YES; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 2fef7326d..1e67db34d 100644 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -217,22 +217,9 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; [self informTargetsAboutNewFrameAtTime:frameTime]; } -- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; -{ - for (id currentTarget in targets) - { - if (currentTarget != self.targetToIgnoreForUpdates) - { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [self setInputTextureForTarget:currentTarget atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - } - - [currentTarget setInputSize:[self sizeOfFBO]]; - [currentTarget newFrameReadyAtTime:frameTime]; - } - } +- (CGSize)outputFrameSize; +{ + return [self sizeOfFBO]; } - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; From f99095eb97620d40de3b549a59703cdabbe176b0 Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Sun, 6 May 2012 19:00:26 -0500 Subject: [PATCH 056/695] Began documenting GPUImageOutput --- framework/Source/GPUImageOutput.m | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 3564aeeaa..1697bd84d 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -52,6 +52,14 @@ - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)in [target setInputTexture:outputTexture atIndex:inputTextureIndex]; } + +/** + Adds a target to receive notifications when new frames are available. + + The target will be asked for it's next available texture. + + See [GPUImageInput newFrameReadyAtTime:] + */ - (void)addTarget:(id)newTarget; { NSInteger nextAvailableTextureIndex = [newTarget nextAvailableTextureIndex]; @@ -62,6 +70,11 @@ - (void)addTarget:(id)newTarget; } } +/** + Adds a target to receive notifications when new frames are available. + + See [GPUImageInput newFrameReadyAtTime:] + */ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; { if([targets containsObject:newTarget]) @@ -75,6 +88,9 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; } +/** + Removes a target. The target will no longer receive notifications when new frames are available. + */ - (void)removeTarget:(id)targetToRemove; { if(![targets containsObject:targetToRemove]) @@ -96,6 +112,9 @@ - (void)removeTarget:(id)targetToRemove; [targets removeObject:targetToRemove]; } +/** + Removes all targets. + */ - (void)removeAllTargets; { cachedMaximumOutputSize = CGSizeZero; @@ -149,6 +168,12 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; #pragma mark - #pragma mark Still image processing +/** + Retreive the currently processed output image as an UIImage. + + The image's orientation will be the device's current orientation. + See also: [GPUImageOutput imageFromCurrentlyProcessedOutputWithOrientation:] + */ - (UIImage *)imageFromCurrentlyProcessedOutput; { UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; @@ -175,11 +200,26 @@ - (UIImage *)imageFromCurrentlyProcessedOutput; return [self imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; } +/** + Convenience method to retreive the currently processed image with a different orientation. + + See also: [GPUImageOutput imageFromCurrentlyProcessedOutput] + See also: [GPUImageFilter imageFromCurrentlyProcessedOutputWithOrientation:] + */ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { return nil; } +/** + Convenience method to process an image with a filter. + + This method is useful for using filters on still images without building a full pipeline. + + The returned image will have device's current orientation using [[UIDevice currentDevice] orientation]. + + See also: [GPUImageFilter imageByFilteringImage:] + */ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; { return nil; From 6141eb2cbd05db671f611e34a9525185cac8b71b Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 01:12:10 -0500 Subject: [PATCH 057/695] Change user-defined build setting APPLEDOC_PATH to the path appledoc is installed (/usr/local/bin/appledoc is default for homebrew) Change user-defined build setting BUILD_DOCUMENTATION to 0 or 1 --- framework/GPUImage.xcodeproj/project.pbxproj | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index b1e89a387..a62c453b9 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -787,6 +787,7 @@ BCF1A33014DDB1EC00852800 /* Sources */, BCF1A33114DDB1EC00852800 /* Frameworks */, BCF1A33214DDB1EC00852800 /* Headers */, + 3D8916C215579745008A932A /* ShellScript */, ); buildRules = ( ); @@ -855,6 +856,19 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 3D8916C215579745008A932A /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n\n# to show missing documentation warnings, add --logformat xcode\nif [ \"${BUILD_DOCUMENTATION}\" -ge 1 ]; then\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--docsetutil-path \"/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n${SOURCE_ROOT}\nfi"; + }; BCF1A34214DDB1EC00852800 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1038,6 +1052,8 @@ BCF1A35914DDB1EC00852800 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + APPLEDOC_PATH = /usr/local/bin/appledoc; + BUILD_DOCUMENTATION = 1; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -1052,6 +1068,8 @@ BCF1A35A14DDB1EC00852800 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + APPLEDOC_PATH = /usr/local/bin/appledoc; + BUILD_DOCUMENTATION = 1; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; From 118e7a6d410261f081396ca030d666cd6f720edd Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 01:22:43 -0500 Subject: [PATCH 058/695] Mentioned documentation (and how to make it) in the README. --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ce9e18418..c381c3996 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,10 @@ For example, an application that takes in live video from the camera, converts t GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView +## Documentation ## + +It is generated as a build phase using appledoc. To disable documentation building, set the User Defined Build Setting "BUILD%5f;DOCUMENTATION" to 0. You should ensure that "APPLEDOC%5f;PATH" points to an appledoc binary, available on Github or through Homebrew. It will also build and install a .docset file, which you can view with your favorite documentation tool. + ## Built-in filters ## ### Color adjustments ### @@ -450,4 +454,4 @@ In other words, the path of this application is camera -> sepia tone filter -> c A version of my ColorTracking example from http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios ported across to use GPUImage, this application uses color in a scene to track objects from a live camera feed. The four views you can switch between include the raw camera feed, the camera feed with pixels matching the color threshold in white, the processed video where positions are encoded as colors within the pixels passing the threshold test, and finally the live video feed with a dot that tracks the selected color. Tapping the screen changes the color to track to match the color of the pixels under your finger. Tapping and dragging on the screen makes the color threshold more or less forgiving. This is most obvious on the second, color thresholding view. -Currently, all processing for the color averaging in the last step is done on the CPU, so this is part is extremely slow. \ No newline at end of file +Currently, all processing for the color averaging in the last step is done on the CPU, so this is part is extremely slow. From a46e4878ccbf0873b9e5e737ffc450c1f22e5cc3 Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 03:14:32 -0500 Subject: [PATCH 059/695] Fixed underscore issues in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c381c3996..93f495c33 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ For example, an application that takes in live video from the camera, converts t ## Documentation ## -It is generated as a build phase using appledoc. To disable documentation building, set the User Defined Build Setting "BUILD%5f;DOCUMENTATION" to 0. You should ensure that "APPLEDOC%5f;PATH" points to an appledoc binary, available on Github or through Homebrew. It will also build and install a .docset file, which you can view with your favorite documentation tool. +It is generated as a build phase using appledoc. To disable documentation building, set the User Defined Build Setting "BUILD_DOCUMENTATION" to 0. You should ensure that "APPLEDOC_PATH" points to an appledoc binary, available on Github or through Homebrew. It will also build and install a .docset file, which you can view with your favorite documentation tool. ## Built-in filters ## From b974a7f82ac5d8e5875509f7aae12855631688d3 Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 03:39:15 -0500 Subject: [PATCH 060/695] Added documentation/* to .gitignore. Ignoring .m files in appledoc (no need to document private methods) --- .gitignore | 6 +++++- framework/GPUImage.xcodeproj/project.pbxproj | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0cd6d8a17..6157e0c4a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,8 @@ build/* *.perspectivev3 *.pbxuser *.xcworkspace -xcuserdata \ No newline at end of file +xcuserdata + +# Documentation +documentation/* + diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index a62c453b9..5068b149f 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -867,7 +867,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n\n# to show missing documentation warnings, add --logformat xcode\nif [ \"${BUILD_DOCUMENTATION}\" -ge 1 ]; then\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--docsetutil-path \"/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n${SOURCE_ROOT}\nfi"; + shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n\n# to show missing documentation warnings, add --logformat xcode\nif [ \"${BUILD_DOCUMENTATION}\" -ge 1 ]; then\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--docsetutil-path \"/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n${SOURCE_ROOT}\nfi"; }; BCF1A34214DDB1EC00852800 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; From a1c9f25b6fc08e2d30e94c72d72b802d93f89bda Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 03:39:58 -0500 Subject: [PATCH 061/695] Documented GPUImageVideoCamera.h --- framework/Source/GPUImageVideoCamera.h | 65 ++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 037bea935..06f535a3e 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -4,10 +4,14 @@ #import "GPUImageOpenGLESContext.h" #import "GPUImageOutput.h" -// From the iOS 5.0 release notes: -// "In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight." -// Currently, rotation is needed to handle each camera - +/** + A GPUImageOutput that provides frames from either camera + + From the iOS 5.0 release notes: + _In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight._ + + Currently, rotation is needed to handle each camera +*/ @interface GPUImageVideoCamera : GPUImageOutput { CVOpenGLESTextureCacheRef coreVideoTextureCache; @@ -22,29 +26,70 @@ BOOL capturePaused; } +/// The AVCaptureSession used to capture from the camera @property(readonly, retain) AVCaptureSession *captureSession; + +/// Whether or not benchmarking should be running @property(readwrite, nonatomic) BOOL runBenchmark; -// Use this property to manage camera settings.Focus point, exposure point, etc. +/// Use this property to manage camera settings. Focus point, exposure point, etc. @property(readonly) AVCaptureDevice *inputCamera; -// Initialization and teardown -- (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; +/// @name Initialization and teardown + +/** Begin a capture session + + See AVCaptureSession for acceptable values + + @param sessionPreset Session preset to use + @param cameraPosition Camera to capture from + */ +- (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; + +/** Tear down the capture session + */ - (void)removeInputsAndOutputs; -// Manage the camera video stream +/// @name Manage the camera video stream + +/** Start camera capturing + */ - (void)startCameraCapture; + +/** Stop camera capturing + */ - (void)stopCameraCapture; + +/** Pause camera capturing + */ - (void)pauseCameraCapture; + +/** Resume camera capturing + */ - (void)resumeCameraCapture; + +/** Process a video sample + @param sampleBuffer Buffer to process + */ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; + +/** Process an audio sample + @param sampleBuffer Buffer to process + */ - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; + +/** Get the position of the source camera + */ - (AVCaptureDevicePosition)getCameraPosition; -// Rotate the camera +/** Rotate the camera + */ - (void)rotateCamera; -// Benchmarking +/// @name Benchmarking + +/** Average frame duration + */ - (CGFloat)averageFrameDurationDuringCapture; @end From 2dcc7d9b7ebe0f273fe3708fbe3980b1d2569842 Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 03:58:04 -0500 Subject: [PATCH 062/695] Documented BulgeDistortionFilter, FastBlurFilter, GrayscaleFilter, KuwaharaFilter, LightenBlendFilter, SepiaFilter, SketchFilter, SmoothToonFilter, SwirlFilter, TiltShiftFilter For the most part, copied filter descriptions from Brad's README and changed // comments to /// doc-comments --- framework/Source/GPUImageBulgeDistortionFilter.h | 7 ++++--- framework/Source/GPUImageFastBlurFilter.h | 5 +++-- framework/Source/GPUImageGrayscaleFilter.h | 2 ++ framework/Source/GPUImageKuwaharaFilter.h | 4 +++- framework/Source/GPUImageLightenBlendFilter.h | 1 + framework/Source/GPUImageSepiaFilter.h | 1 + framework/Source/GPUImageSketchFilter.h | 4 ++++ framework/Source/GPUImageSmoothToonFilter.h | 11 +++++++---- framework/Source/GPUImageSwirlFilter.h | 8 +++++--- framework/Source/GPUImageTiltShiftFilter.h | 9 +++++---- 10 files changed, 35 insertions(+), 17 deletions(-) diff --git a/framework/Source/GPUImageBulgeDistortionFilter.h b/framework/Source/GPUImageBulgeDistortionFilter.h index e91a3b1f8..0ba06f936 100644 --- a/framework/Source/GPUImageBulgeDistortionFilter.h +++ b/framework/Source/GPUImageBulgeDistortionFilter.h @@ -1,15 +1,16 @@ #import "GPUImageFilter.h" +/// Creates a bulge distortion on the image @interface GPUImageBulgeDistortionFilter : GPUImageFilter { GLint radiusUniform, centerUniform, scaleUniform; } -// The center about which to apply the distortion, with a default of (0.5, 0.5) +/// The center about which to apply the distortion, with a default of (0.5, 0.5) @property(readwrite, nonatomic) CGPoint center; -// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25 +/// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25 @property(readwrite, nonatomic) CGFloat radius; -// The amount of distortion to apply, from -1.0 to 1.0, with a default of 0.5 +/// The amount of distortion to apply, from -1.0 to 1.0, with a default of 0.5 @property(readwrite, nonatomic) CGFloat scale; @end diff --git a/framework/Source/GPUImageFastBlurFilter.h b/framework/Source/GPUImageFastBlurFilter.h index c351d7e45..45f395a35 100644 --- a/framework/Source/GPUImageFastBlurFilter.h +++ b/framework/Source/GPUImageFastBlurFilter.h @@ -1,14 +1,15 @@ #import "GPUImageTwoPassFilter.h" +/// A hardware-accelerated 9-hit Gaussian blur of an image @interface GPUImageFastBlurFilter : GPUImageTwoPassFilter { GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, firstBlurSizeUniform, secondBlurSizeUniform; } -// The number of times to sequentially blur the incoming image. The more passes, the slower the filter. +/// The number of times to sequentially blur the incoming image. The more passes, the slower the filter. @property(readwrite, nonatomic) NSUInteger blurPasses; -// A scaling for the size of the applied blur, default of 1.0 +/// A scaling for the size of the applied blur, default of 1.0 @property(readwrite, nonatomic) CGFloat blurSize; @end diff --git a/framework/Source/GPUImageGrayscaleFilter.h b/framework/Source/GPUImageGrayscaleFilter.h index 314ee267b..2d97f8c39 100644 --- a/framework/Source/GPUImageGrayscaleFilter.h +++ b/framework/Source/GPUImageGrayscaleFilter.h @@ -2,6 +2,8 @@ extern NSString *const kGPUImageLuminanceFragmentShaderString; +/** Converts an image to grayscale (a slightly faster implementation of the saturation filter, without the ability to vary the color contribution) + */ @interface GPUImageGrayscaleFilter : GPUImageFilter @end diff --git a/framework/Source/GPUImageKuwaharaFilter.h b/framework/Source/GPUImageKuwaharaFilter.h index a3602b4c6..ef4ff479a 100644 --- a/framework/Source/GPUImageKuwaharaFilter.h +++ b/framework/Source/GPUImageKuwaharaFilter.h @@ -1,11 +1,13 @@ #import "GPUImageFilter.h" +/** Kuwahara image abstraction, drawn from the work of Kyprianidis, et. al. in their publication "Anisotropic Kuwahara Filtering on the GPU" within the GPU Pro collection. This produces an oil-painting-like image, but it is extremely computationally expensive, so it can take seconds to render a frame on an iPad 2. This might be best used for still images. + */ @interface GPUImageKuwaharaFilter : GPUImageFilter { GLint radiusUniform; } -// The radius to sample from when creating the brush-stroke effect, with a default of 3. The larger the radius, the slower the filter. +/// The radius to sample from when creating the brush-stroke effect, with a default of 3. The larger the radius, the slower the filter. @property(readwrite, nonatomic) GLuint radius; @end diff --git a/framework/Source/GPUImageLightenBlendFilter.h b/framework/Source/GPUImageLightenBlendFilter.h index 468a7891a..60f21e234 100644 --- a/framework/Source/GPUImageLightenBlendFilter.h +++ b/framework/Source/GPUImageLightenBlendFilter.h @@ -1,5 +1,6 @@ #import "GPUImageFilter.h" +/// Blends two images by taking the maximum value of each color component between the images @interface GPUImageLightenBlendFilter : GPUImageFilter { } diff --git a/framework/Source/GPUImageSepiaFilter.h b/framework/Source/GPUImageSepiaFilter.h index 73955119f..a45164fe0 100644 --- a/framework/Source/GPUImageSepiaFilter.h +++ b/framework/Source/GPUImageSepiaFilter.h @@ -1,5 +1,6 @@ #import "GPUImageColorMatrixFilter.h" +/// Simple sepia tone filter @interface GPUImageSepiaFilter : GPUImageColorMatrixFilter @end diff --git a/framework/Source/GPUImageSketchFilter.h b/framework/Source/GPUImageSketchFilter.h index 4cc6659e8..598145aea 100644 --- a/framework/Source/GPUImageSketchFilter.h +++ b/framework/Source/GPUImageSketchFilter.h @@ -1,5 +1,9 @@ #import "GPUImageSobelEdgeDetectionFilter.h" +/** Converts video to look like a sketch. + + This is just the Sobel edge detection filter with the colors inverted. + */ @interface GPUImageSketchFilter : GPUImageSobelEdgeDetectionFilter { } diff --git a/framework/Source/GPUImageSmoothToonFilter.h b/framework/Source/GPUImageSmoothToonFilter.h index 885078c01..b9e895bff 100644 --- a/framework/Source/GPUImageSmoothToonFilter.h +++ b/framework/Source/GPUImageSmoothToonFilter.h @@ -3,23 +3,26 @@ @class GPUImageGaussianBlurFilter; @class GPUImageToonFilter; +/** This uses a similar process as the GPUImageToonFilter, only it precedes the toon effect with a Gaussian blur to smooth out noise. + */ @interface GPUImageSmoothToonFilter : GPUImageFilterGroup { GPUImageGaussianBlurFilter *blurFilter; GPUImageToonFilter *toonFilter; } -// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels +/// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels @property(readwrite, nonatomic) CGFloat imageWidthFactor; +/// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels @property(readwrite, nonatomic) CGFloat imageHeightFactor; -// A multiplier for the blur size, ranging from 0.0 on up, with a default of 0.5 +/// A multiplier for the blur size, ranging from 0.0 on up, with a default of 0.5 @property (readwrite, nonatomic) CGFloat blurSize; -// The threshold at which to apply the edges, default of 0.2 +/// The threshold at which to apply the edges, default of 0.2 @property(readwrite, nonatomic) CGFloat threshold; -// The levels of quantization for the posterization of colors within the scene, with a default of 10.0 +/// The levels of quantization for the posterization of colors within the scene, with a default of 10.0 @property(readwrite, nonatomic) CGFloat quantizationLevels; @end diff --git a/framework/Source/GPUImageSwirlFilter.h b/framework/Source/GPUImageSwirlFilter.h index 74ae1f2dc..ed7d01224 100644 --- a/framework/Source/GPUImageSwirlFilter.h +++ b/framework/Source/GPUImageSwirlFilter.h @@ -1,15 +1,17 @@ #import "GPUImageFilter.h" +/** Creates a swirl distortion on the image + */ @interface GPUImageSwirlFilter : GPUImageFilter { GLint radiusUniform, centerUniform, angleUniform; } -// The center about which to apply the distortion, with a default of (0.5, 0.5) +/// The center about which to apply the distortion, with a default of (0.5, 0.5) @property(readwrite, nonatomic) CGPoint center; -// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.5 +/// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.5 @property(readwrite, nonatomic) CGFloat radius; -// The amount of distortion to apply, with a minimum of 0.0 and a default of 1.0 +/// The amount of distortion to apply, with a minimum of 0.0 and a default of 1.0 @property(readwrite, nonatomic) CGFloat angle; @end diff --git a/framework/Source/GPUImageTiltShiftFilter.h b/framework/Source/GPUImageTiltShiftFilter.h index 602608b43..419910886 100644 --- a/framework/Source/GPUImageTiltShiftFilter.h +++ b/framework/Source/GPUImageTiltShiftFilter.h @@ -2,22 +2,23 @@ @class GPUImageGaussianBlurFilter; +/// A simulated tilt shift lens effect @interface GPUImageTiltShiftFilter : GPUImageFilterGroup { GPUImageGaussianBlurFilter *blurFilter; GPUImageFilter *tiltShiftFilter; } -// A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 2.0 +/// A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 2.0 @property(readwrite, nonatomic) CGFloat blurSize; -// The normalized location of the top of the in-focus area in the image, this value should be lower than bottomFocusLevel, default 0.4 +/// The normalized location of the top of the in-focus area in the image, this value should be lower than bottomFocusLevel, default 0.4 @property(readwrite, nonatomic) CGFloat topFocusLevel; -// The normalized location of the bottom of the in-focus area in the image, this value should be higher than topFocusLevel, default 0.6 +/// The normalized location of the bottom of the in-focus area in the image, this value should be higher than topFocusLevel, default 0.6 @property(readwrite, nonatomic) CGFloat bottomFocusLevel; -// The rate at which the image gets blurry away from the in-focus region, default 0.2 +/// The rate at which the image gets blurry away from the in-focus region, default 0.2 @property(readwrite, nonatomic) CGFloat focusFallOffRate; @end From de24b86497b1bb9341a3ed093278ea1bc6433191 Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 03:58:31 -0500 Subject: [PATCH 063/695] Documented GPUImageView --- framework/Source/GPUImageView.h | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index bd136fe36..991a905ab 100644 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -7,17 +7,28 @@ typedef enum { kGPUImageFillModePreserveAspectRatioAndFill // Maintains the aspect ratio of the source image, zooming in on its center to fill the view } GPUImageFillModeType; +/** + UIView subclass to use as an endpoint for displaying GPUImage outputs + */ @interface GPUImageView : UIView { } -// The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio +/** The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio + */ @property(readwrite, nonatomic) GPUImageFillModeType fillMode; -// This calculates the current display size, in pixels, taking into account Retina scaling factors +/** This calculates the current display size, in pixels, taking into account Retina scaling factors + */ @property(readonly, nonatomic) CGSize sizeInPixels; -// Handling fill mode +/** Handling fill mode + + @param redComponent Red component for background color + @param greenComponent Green component for background color + @param blueComponent Blue component for background color + @param alphaComponent Alpha component for background color + */ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; @end From c8fac32bf922ceb0de305cc3e9e861c36cb8942d Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 04:11:29 -0500 Subject: [PATCH 064/695] Moved documentation for GPUImageOutput into the .h file Began documenting GPUImageFilter --- framework/Source/GPUImageFilter.h | 36 ++++++++++++++++--- framework/Source/GPUImageOutput.h | 57 +++++++++++++++++++++++++++++-- framework/Source/GPUImageOutput.m | 34 ------------------ 3 files changed, 86 insertions(+), 41 deletions(-) diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 9bc992040..147a8d688 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -37,6 +37,10 @@ struct GPUMatrix3x3 { }; typedef struct GPUMatrix3x3 GPUMatrix3x3; +/** GPUImage's base filter class + + Filters and other subsequent elements in the chain conform to the GPUImageInput protocol, which lets them take in the supplied or processed texture from the previous link in the chain and do something with it. Objects one step further down the chain are considered targets, and processing can be branched by adding multiple targets to a single output or filter. + */ @interface GPUImageFilter : GPUImageOutput { GLuint filterSourceTexture, filterSourceTexture2; @@ -60,28 +64,52 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; @property(readonly) CVPixelBufferRef renderTarget; @property(readwrite, nonatomic) BOOL preventRendering; -// Initialization and teardown +/// @name Initialization and teardown + +/** + Initialize with vertex and fragment shaders + + You make take advantage of the SHADER_STRING macro to write your shaders in-line. + @param vertexShaderString Source code of the vertex shader to use + @param fragmentShaderString Source code of the fragment shader to use + */ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShaderFromString:(NSString *)fragmentShaderString; + +/** + Initialize with a fragment shader + + You may take advantage of the SHADER_STRING macro to write your shader in-line. + @param fragmentShaderString Source code of fragment shader to use + */ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +/** + Initialize with a fragment shader + @param fragmentShaderFilename Filename of fragment shader to load + */ - (id)initWithFragmentShaderFromFile:(NSString *)fragmentShaderFilename; - (void)initializeAttributes; - (void)setupFilterForSize:(CGSize)filterFrameSize; - (void)recreateFilterFBO; -// Managing the display FBOs +/// @name Managing the display FBOs +/** Size of the frame buffer object + */ - (CGSize)sizeOfFBO; - (void)createFilterFBOofSize:(CGSize)currentFBOSize; + +/** Destroy the current filter frame buffer object + */ - (void)destroyFilterFBO; - (void)setFilterFBO; - (void)setOutputFBO; -// Rendering +/// @name Rendering - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; - (CGSize)outputFrameSize; -// Input parameters +/// @name Input parameters - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; - (void)setInteger:(GLint)newInteger forUniform:(NSString *)uniformName; - (void)setFloat:(GLfloat)newFloat forUniform:(NSString *)uniformName; diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 4dfb59076..50f7d2f0b 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -7,6 +7,17 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); @class GPUImageMovieWriter; +/** GPUImage's base source object + + Images or frames of video are uploaded from source objects, which are subclasses of GPUImageOutput. These include: + + - GPUImageVideoCamera (for live video from an iOS camera) + - GPUImageStillCamera (for taking photos with the camera) + - GPUImagePicture (for still images) + - GPUImageMovie (for movies) + + Source objects upload still image frames to OpenGL ES as textures, then hand those textures off to the next objects in the processing chain. + */ @interface GPUImageOutput : NSObject { NSMutableArray *targets, *targetTextureIndices; @@ -22,23 +33,63 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); @property(readwrite, nonatomic, retain) GPUImageMovieWriter *audioEncodingTarget; @property(readwrite, nonatomic, unsafe_unretained) id targetToIgnoreForUpdates; -// Managing targets +/// @name Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; + +/** Adds a target to receive notifications when new frames are available. + + The target will be asked for it's next available texture. + + See [GPUImageInput newFrameReadyAtTime:] + + @param newTarget Target to be added + */ - (void)addTarget:(id)newTarget; + +/** Adds a target to receive notifications when new frames are available. + + See [GPUImageInput newFrameReadyAtTime:] + + @param newTarget Target to be added + */ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; + +/** Removes a target. The target will no longer receive notifications when new frames are available. + + @param targetToRemove Target to be removed + */ - (void)removeTarget:(id)targetToRemove; + +/** Removes all targets. + */ - (void)removeAllTargets; -// Manage the output texture +/// @name Manage the output texture + - (void)initializeOutputTexture; - (void)deleteOutputTexture; - (void)forceProcessingAtSize:(CGSize)frameSize; - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; -// Still image processing +/// @name Still image processing + +/** Retreives the currently processed image as a UIImage. + */ - (UIImage *)imageFromCurrentlyProcessedOutput; + +/** Convenience method to retreive the currently processed image with a different orientation. + @param imageOrientation Orientation for image + */ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; + +/** Convenience method to process an image with a filter. + + This method is useful for using filters on still images without building a full pipeline. + + @param imageToFilter Image to be filtered + */ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; + - (void)prepareForImageCapture; @end diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index c0602dc6d..d726ac9d5 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -52,14 +52,6 @@ - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)in [target setInputTexture:outputTexture atIndex:inputTextureIndex]; } - -/** - Adds a target to receive notifications when new frames are available. - - The target will be asked for it's next available texture. - - See [GPUImageInput newFrameReadyAtTime:] - */ - (void)addTarget:(id)newTarget; { NSInteger nextAvailableTextureIndex = [newTarget nextAvailableTextureIndex]; @@ -70,11 +62,6 @@ - (void)addTarget:(id)newTarget; } } -/** - Adds a target to receive notifications when new frames are available. - - See [GPUImageInput newFrameReadyAtTime:] - */ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; { if([targets containsObject:newTarget]) @@ -88,9 +75,6 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; } -/** - Removes a target. The target will no longer receive notifications when new frames are available. - */ - (void)removeTarget:(id)targetToRemove; { if(![targets containsObject:targetToRemove]) @@ -112,9 +96,6 @@ - (void)removeTarget:(id)targetToRemove; [targets removeObject:targetToRemove]; } -/** - Removes all targets. - */ - (void)removeAllTargets; { cachedMaximumOutputSize = CGSizeZero; @@ -202,26 +183,11 @@ - (UIImage *)imageFromCurrentlyProcessedOutput; return [self imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; } -/** - Convenience method to retreive the currently processed image with a different orientation. - - See also: [GPUImageOutput imageFromCurrentlyProcessedOutput] - See also: [GPUImageFilter imageFromCurrentlyProcessedOutputWithOrientation:] - */ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { return nil; } -/** - Convenience method to process an image with a filter. - - This method is useful for using filters on still images without building a full pipeline. - - The returned image will have device's current orientation using [[UIDevice currentDevice] orientation]. - - See also: [GPUImageFilter imageByFilteringImage:] - */ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; { return nil; From ecbcb1a9b406f33006529b57a07630793eb7479e Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 7 May 2012 14:43:02 -0500 Subject: [PATCH 065/695] Reducing memory spikes with new JPEG and PNG photo capture routines. Fixed a texture leak with -prepareForImageCapture. --- .../SimplePhotoFilter/PhotoViewController.m | 26 +++------- framework/Source/GPUImageFilter.m | 9 ++-- framework/Source/GPUImageOutput.h | 1 + framework/Source/GPUImageOutput.m | 24 +++++++++ framework/Source/GPUImagePicture.m | 11 ++-- framework/Source/GPUImageStillCamera.h | 4 +- framework/Source/GPUImageStillCamera.m | 51 ++++++++++++++++++- 7 files changed, 96 insertions(+), 30 deletions(-) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index a4b02672f..3bd675307 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -94,28 +94,15 @@ - (IBAction)takePhoto:(id)sender; { [photoCaptureButton setEnabled:NO]; - [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ - - // Having both this and the asset library saving uses twice the memory sometimes -// NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); -// -// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -// NSString *documentsDirectory = [paths objectAtIndex:0]; -// -// NSError *error2 = nil; -// if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) -// { -// return; -// } + [stillCamera capturePhotoAsJPEGProcessedUpToFilter:filter withCompletionHandler:^(NSData *processedJPEG, NSError *error){ // Save to assets library ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; - - CGImageRef imageRef = [processedImage CGImage]; - CGImageRetain(imageRef); - - [library writeImageToSavedPhotosAlbum:imageRef metadata:nil completionBlock:^(NSURL *assetURL, NSError *error2) +// report_memory(@"After asset library creation"); + + [library writeImageDataToSavedPhotosAlbum:processedJPEG metadata:nil completionBlock:^(NSURL *assetURL, NSError *error2) { +// report_memory(@"After writing to library"); if (error2) { NSLog(@"ERROR: the image failed to be written"); } @@ -123,9 +110,8 @@ - (IBAction)takePhoto:(id)sender; NSLog(@"PHOTO SAVED - assetURL: %@", assetURL); } - CGImageRelease(imageRef); - runOnMainQueueWithoutDeadlocking(^{ +// report_memory(@"Operation completed"); [photoCaptureButton setEnabled:YES]; }); }]; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index dece8259f..31694fbe6 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -188,7 +188,6 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CGImageRelease(cgImageFromBytes); CGDataProviderRelease(dataProvider); CGColorSpaceRelease(defaultRGBColorSpace); -// free(rawImagePixels); return finalImage; } @@ -545,9 +544,13 @@ - (void)recreateFilterFBO { cachedMaximumOutputSize = CGSizeZero; [self destroyFilterFBO]; - [self deleteOutputTexture]; - [self initializeOutputTexture]; + if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) + { + [self deleteOutputTexture]; + [self initializeOutputTexture]; + } + [self setFilterFBO]; } diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 4dfb59076..8407ccde2 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -4,6 +4,7 @@ #import "GLProgram.h" void runOnMainQueueWithoutDeadlocking(void (^block)(void)); +void report_memory(NSString *tag); @class GPUImageMovieWriter; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index f24daeb1b..cd04d07a6 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -1,5 +1,6 @@ #import "GPUImageOutput.h" #import "GPUImageMovieWriter.h" +#import void runOnMainQueueWithoutDeadlocking(void (^block)(void)) { @@ -13,6 +14,29 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)) } } +void report_memory(NSString *tag) +{ + if (!tag) + tag = @"Default"; + + struct task_basic_info info; + + mach_msg_type_number_t size = sizeof(info); + + kern_return_t kerr = task_info(mach_task_self(), + + TASK_BASIC_INFO, + + (task_info_t)&info, + + &size); + if( kerr == KERN_SUCCESS ) { + NSLog(@"%@ - Memory used: %u", tag, info.resident_size); //in bytes + } else { + NSLog(@"%@ - Error: %s", tag, mach_error_string(kerr)); + } +} + @implementation GPUImageOutput @synthesize shouldSmoothlyScaleOutput = _shouldSmoothlyScaleOutput; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index cfaea1ca7..43626646a 100644 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -46,7 +46,7 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly GLubyte *imageData = NULL; CFDataRef dataFromImageDataProvider; -// CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); + CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); if (shouldRedrawUsingCoreGraphics) { @@ -55,19 +55,20 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 8, (int)pixelSizeOfImage.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); - CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeOfImage.width, pixelSizeOfImage.height), [newImageSource CGImage]); +// CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html + CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeOfImage.width, pixelSizeOfImage.height), [imageSource CGImage]); CGContextRelease(imageContext); CGColorSpaceRelease(genericRGBColorspace); } else { // Access the raw image bytes directly - dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider([newImageSource CGImage])); + dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider([imageSource CGImage])); imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); } -// elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; -// NSLog(@"Core Graphics drawing time: %f", elapsedTime); + elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; + NSLog(@"Core Graphics drawing time: %f", elapsedTime); glBindTexture(GL_TEXTURE_2D, outputTexture); if (self.shouldSmoothlyScaleOutput) diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index 33a905c3c..518339862 100644 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -3,6 +3,8 @@ @interface GPUImageStillCamera : GPUImageVideoCamera // Photography controls -- (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; +- (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; +- (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; +- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; @end diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index c123bf4ae..36568f563 100644 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -1,3 +1,5 @@ +// 2448x3264 pixel image = 31,961,088 bytes for uncompressed RGBA + #import "GPUImageStillCamera.h" @interface GPUImageStillCamera () @@ -40,7 +42,7 @@ - (void)removeInputsAndOutputs; #pragma mark - #pragma mark Photography controls -- (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; +- (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { @@ -53,4 +55,51 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi return; } + +- (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; +{ +// report_memory(@"Before still image capture"); + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { +// report_memory(@"Before filter processing"); + + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; +// report_memory(@"After filter processing"); + + NSData *dataForJPEGFile = nil; + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + +// report_memory(@"After UIImage generation"); + + dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, 0.8); +// report_memory(@"After JPEG generation"); + } + +// report_memory(@"After autorelease pool"); + + block(dataForJPEGFile, error); + }]; + + return; +} + +- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; +{ + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + + NSData *dataForPNGFile = nil; + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); + } + + block(dataForPNGFile, error); + }]; + + return; +} + + @end From 1a74fda6a680a5bc4e2d095716e9dd9591ccc187 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 7 May 2012 22:00:41 -0500 Subject: [PATCH 066/695] Doing some work on camera rotation. --- framework/Source/GPUImageVideoCamera.h | 9 ++++++++- framework/Source/GPUImageVideoCamera.m | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 037bea935..35b6222c1 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -28,6 +28,13 @@ // Use this property to manage camera settings.Focus point, exposure point, etc. @property(readonly) AVCaptureDevice *inputCamera; +//typedef enum { +// UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait, +// UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, +// UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight, +// UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft +//} UIInterfaceOrientation; + // Initialization and teardown - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; - (void)removeInputsAndOutputs; @@ -39,7 +46,7 @@ - (void)resumeCameraCapture; - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; -- (AVCaptureDevicePosition)getCameraPosition; +- (AVCaptureDevicePosition)cameraPosition; // Rotate the camera - (void)rotateCamera; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 9562e5733..f45a8f6ab 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -227,7 +227,7 @@ - (void)rotateCamera } } -- (AVCaptureDevicePosition)getCameraPosition +- (AVCaptureDevicePosition)cameraPosition { return [[videoInput device] position]; } From 9d2a94a4183b33e4c83dee9923a858ea8e19b368 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 7 May 2012 22:22:39 -0500 Subject: [PATCH 067/695] Moved the documentation into its own target, so it doesn't break the build. The documentation target doesn't work, though. --- framework/GPUImage.xcodeproj/project.pbxproj | 44 ++++++++++++++++++-- framework/Source/GPUImageOutput.h | 2 +- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 5068b149f..c14f89177 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -6,6 +6,20 @@ objectVersion = 46; objects = { +/* Begin PBXAggregateTarget section */ + BC552B361558C6F4001F3FFA /* Documentation */ = { + isa = PBXAggregateTarget; + buildConfigurationList = BC552B371558C6F4001F3FFA /* Build configuration list for PBXAggregateTarget "Documentation" */; + buildPhases = ( + BC552B3A1558C6FC001F3FFA /* ShellScript */, + ); + dependencies = ( + ); + name = Documentation; + productName = Documentation; + }; +/* End PBXAggregateTarget section */ + /* Begin PBXBuildFile section */ 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; @@ -787,7 +801,6 @@ BCF1A33014DDB1EC00852800 /* Sources */, BCF1A33114DDB1EC00852800 /* Frameworks */, BCF1A33214DDB1EC00852800 /* Headers */, - 3D8916C215579745008A932A /* ShellScript */, ); buildRules = ( ); @@ -840,6 +853,7 @@ targets = ( BCF1A33314DDB1EC00852800 /* GPUImage */, BCF1A34314DDB1EC00852800 /* GPUImageTests */, + BC552B361558C6F4001F3FFA /* Documentation */, ); }; /* End PBXProject section */ @@ -856,7 +870,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3D8916C215579745008A932A /* ShellScript */ = { + BC552B3A1558C6FC001F3FFA /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1001,6 +1015,22 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + BC552B381558C6F4001F3FFA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLEDOC_PATH = /usr/local/bin/appledoc; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + BC552B391558C6F4001F3FFA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLEDOC_PATH = /usr/local/bin/appledoc; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; BCF1A35614DDB1EC00852800 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1052,7 +1082,6 @@ BCF1A35914DDB1EC00852800 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - APPLEDOC_PATH = /usr/local/bin/appledoc; BUILD_DOCUMENTATION = 1; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; @@ -1068,7 +1097,6 @@ BCF1A35A14DDB1EC00852800 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - APPLEDOC_PATH = /usr/local/bin/appledoc; BUILD_DOCUMENTATION = 1; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; @@ -1116,6 +1144,14 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + BC552B371558C6F4001F3FFA /* Build configuration list for PBXAggregateTarget "Documentation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC552B381558C6F4001F3FFA /* Debug */, + BC552B391558C6F4001F3FFA /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; BCF1A32E14DDB1EC00852800 /* Build configuration list for PBXProject "GPUImage" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 89e42dc7e..fba16eda0 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -39,7 +39,7 @@ void report_memory(NSString *tag); /** Adds a target to receive notifications when new frames are available. - The target will be asked for it's next available texture. + The target will be asked for its next available texture. See [GPUImageInput newFrameReadyAtTime:] From e91e912baf985b0dec5b852af0681167aede3660 Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 23:12:18 -0500 Subject: [PATCH 068/695] Removed if-check for building documentation now that its in its own target. Also, removed leftover BUILD_DOCUMENTATION setting on GPUImage's main target. --- framework/GPUImage.xcodeproj/project.pbxproj | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index c14f89177..5741183c9 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -881,7 +881,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n\n# to show missing documentation warnings, add --logformat xcode\nif [ \"${BUILD_DOCUMENTATION}\" -ge 1 ]; then\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--docsetutil-path \"/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n${SOURCE_ROOT}\nfi"; + shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n\n# to show missing documentation warnings, add --logformat xcode\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--docsetutil-path \"/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n${SOURCE_ROOT}"; }; BCF1A34214DDB1EC00852800 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -1082,7 +1082,6 @@ BCF1A35914DDB1EC00852800 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - BUILD_DOCUMENTATION = 1; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -1097,7 +1096,6 @@ BCF1A35A14DDB1EC00852800 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - BUILD_DOCUMENTATION = 1; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -1151,6 +1149,7 @@ BC552B391558C6F4001F3FFA /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; BCF1A32E14DDB1EC00852800 /* Build configuration list for PBXProject "GPUImage" */ = { isa = XCConfigurationList; From 56a7de4929a139960680f4116b73b1bd3ede0d0b Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 7 May 2012 23:15:39 -0500 Subject: [PATCH 069/695] Updated README to indicate that Documentation is now it's own target --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 93f495c33..942b34147 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ For example, an application that takes in live video from the camera, converts t ## Documentation ## -It is generated as a build phase using appledoc. To disable documentation building, set the User Defined Build Setting "BUILD_DOCUMENTATION" to 0. You should ensure that "APPLEDOC_PATH" points to an appledoc binary, available on Github or through Homebrew. It will also build and install a .docset file, which you can view with your favorite documentation tool. +Documentation is generated from header comments using appledoc. To build the documentation, switch to the "Documentation" scheme in Xcode. You should ensure that "APPLEDOC_PATH" (a User-Defined build setting) points to an appledoc binary, available on Github or through Homebrew. It will also build and install a .docset file, which you can view with your favorite documentation tool. ## Built-in filters ## From cc651435e3219e21db2026cd8911747d41383d4d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 9 May 2012 13:57:05 -0500 Subject: [PATCH 070/695] Removed need for rotation filter by handling rotation internally in filters. This leads to significant performance and memory improvements, but requires some rearchitecting of filters. --- README.md | 23 +-- .../VideoFilteringDisplayController.m | 5 +- .../ColorTrackingViewController.m | 7 +- examples/CubeExample/Classes/ES2Renderer.m | 5 +- .../ShowcaseFilterViewController.m | 40 +++-- .../MultiViewViewController.m | 15 +- .../SimpleImageViewController.m | 13 +- .../SimplePhotoFilter/PhotoViewController.m | 6 +- .../SimpleVideoFileFilterViewController.m | 4 +- .../SimpleVideoFilterViewController.m | 5 +- framework/GPUImage.xcodeproj/project.pbxproj | 9 +- framework/Source/GPUImage.h | 1 - framework/Source/GPUImageBoxBlurFilter.m | 12 +- framework/Source/GPUImageCropFilter.h | 1 + framework/Source/GPUImageCropFilter.m | 138 ++++++++++++++++-- framework/Source/GPUImageFastBlurFilter.m | 12 +- framework/Source/GPUImageFilter.h | 5 +- framework/Source/GPUImageFilter.m | 132 +++++++++++++++-- framework/Source/GPUImageFilterGroup.m | 8 + framework/Source/GPUImageGaussianBlurFilter.m | 15 +- framework/Source/GPUImageMovieWriter.h | 1 + framework/Source/GPUImageMovieWriter.m | 8 +- .../GPUImageNonMaximumSuppressionFilter.m | 12 +- framework/Source/GPUImageOpenGLESContext.h | 5 + framework/Source/GPUImageRawData.h | 1 + framework/Source/GPUImageRawData.m | 6 + framework/Source/GPUImageRotationFilter.h | 13 -- framework/Source/GPUImageRotationFilter.m | 105 ------------- framework/Source/GPUImageTextureOutput.m | 4 + framework/Source/GPUImageTransformFilter.m | 11 +- framework/Source/GPUImageTwoPassFilter.m | 2 +- framework/Source/GPUImageVideoCamera.h | 15 +- framework/Source/GPUImageVideoCamera.m | 51 ++++++- framework/Source/GPUImageView.h | 1 + framework/Source/GPUImageView.m | 7 + 35 files changed, 459 insertions(+), 239 deletions(-) delete mode 100644 framework/Source/GPUImageRotationFilter.h delete mode 100644 framework/Source/GPUImageRotationFilter.m diff --git a/README.md b/README.md index 93f495c33..fc37ece06 100644 --- a/README.md +++ b/README.md @@ -92,8 +92,6 @@ It is generated as a build phase using appledoc. To disable documentation buildi ### Image processing ### -- **GPUImageRotationFilter**: This lets you rotate an image left or right by 90 degrees, or flip it horizontally or vertically - - **GPUImageTransformFilter**: This applies an arbitrary 2-D or 3-D transformation to an image - *affineTransform*: This takes in a CGAffineTransform to adjust an image in 2-D - *transform3D*: This takes in a CATransform3D to manipulate an image in 3-D @@ -268,6 +266,8 @@ Additionally, this is an ARC-enabled framework, so if you want to use this withi To filter live video from an iOS device's camera, you can use code like the following: GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"]; GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)]; @@ -278,7 +278,7 @@ To filter live video from an iOS device's camera, you can use code like the foll [videoCamera startCameraCapture]; -This sets up a video source coming from the iOS device's back-facing camera, using a preset that tries to capture at 640x480. A custom filter, using code from the file CustomShader.fsh, is then set as the target for the video frames from the camera. These filtered video frames are finally displayed onscreen with the help of a UIView subclass that can present the filtered OpenGL ES texture that results from this pipeline. +This sets up a video source coming from the iOS device's back-facing camera, using a preset that tries to capture at 640x480. This video is captured with the interface being in portrait mode, where the landscape-left-mounted camera needs to have its video frames rotated before display. A custom filter, using code from the file CustomShader.fsh, is then set as the target for the video frames from the camera. These filtered video frames are finally displayed onscreen with the help of a UIView subclass that can present the filtered OpenGL ES texture that results from this pipeline. The fill mode of the GPUImageView can be altered by setting its fillMode property, so that if the aspect ratio of the source video is different from that of the view, the video will either be stretched, centered with black bars, or zoomed to fill. @@ -294,11 +294,10 @@ Also, if you wish to enable microphone audio capture for recording to a movie, y To capture and filter still photos, you can use a process similar to the one for filtering video. Instead of a GPUImageVideoCamera, you use a GPUImageStillCamera: stillCamera = [[GPUImageStillCamera alloc] init]; + stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + filter = [[GPUImageGammaFilter alloc] init]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; - - [stillCamera addTarget:rotationFilter]; - [rotationFilter addTarget:filter]; + [stillCamera addTarget:filter]; GPUImageView *filterView = (GPUImageView *)self.view; [filter addTarget:filterView]; @@ -384,14 +383,12 @@ One thing to note when adding fragment shaders to your Xcode project is that Xco Movies can be loaded into the framework via the GPUImageMovie class, filtered, and then written out using a GPUImageMovieWriter. GPUImageMovieWriter is also fast enough to record video in realtime from an iPhone 4's camera at 640x480, so a direct filtered video source can be fed into it. -The following is an example of how you would load a sample movie, pass it through a pixellation and rotation filter, then record the result to disk as a 480 x 640 h.264 movie: +The following is an example of how you would load a sample movie, pass it through a pixellation filter, then record the result to disk as a 480 x 640 h.264 movie: movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; pixellateFilter = [[GPUImagePixellateFilter alloc] init]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; - [movieFile addTarget:rotationFilter]; - [rotationFilter addTarget:pixellateFilter]; + [movieFile addTarget:pixellateFilter]; NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; unlink([pathToMovie UTF8String]); @@ -432,6 +429,10 @@ A bundled JPEG image is loaded into the application at launch, a filter is appli A pixellate filter is applied to a live video stream, with a UISlider control that lets you adjust the pixel size on the live video. +### SimpleVideoFileFilter ### + +A movie file is loaded from disk, an unsharp mask filter is applied to it, and the filtered result is re-encoded as another movie. + ### MultiViewFilterExample ### From a single camera feed, four views are populated with realtime filters applied to camera. One is just the straight camera video, one is a preprogrammed sepia tone, and two are custom filters based on shader programs. diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m b/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m index b393cd0e0..82f583e42 100644 --- a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m +++ b/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m @@ -170,12 +170,11 @@ - (void)displayVideoForGPUImage; NSLog(@"Start GPU Image"); videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; videoCamera.runBenchmark = YES; + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; sepiaFilter = [[GPUImageSepiaFilter alloc] init]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; - [videoCamera addTarget:rotationFilter]; - [rotationFilter addTarget:sepiaFilter]; + [videoCamera addTarget:sepiaFilter]; filterView = [[GPUImageView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:filterView]; [sepiaFilter addTarget:filterView]; diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index df8abdd58..192223589 100644 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -49,6 +49,7 @@ - (void)configureVideoFiltering; { CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame]; videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, mainScreenFrame.size.width, mainScreenFrame.size.height)]; [self.view addSubview:filteredVideoView]; @@ -58,7 +59,6 @@ - (void)configureVideoFiltering; positionFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"PositionColor"]; [positionFilter setFloat:thresholdSensitivity forUniform:@"threshold"]; [positionFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; - rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; // CGSize videoPixelSize = filteredVideoView.bounds.size; // videoPixelSize.width *= [filteredVideoView contentScaleFactor]; @@ -72,9 +72,8 @@ - (void)configureVideoFiltering; videoRawData = [[GPUImageRawData alloc] initWithImageSize:videoPixelSize]; videoRawData.delegate = self; - [videoCamera addTarget:rotationFilter]; - [rotationFilter addTarget:filteredVideoView]; - [rotationFilter addTarget:videoRawData]; + [videoCamera addTarget:filteredVideoView]; + [videoCamera addTarget:videoRawData]; // [rotationFilter addTarget:positionFilter]; // [positionFilter addTarget:filteredVideoView]; // [positionFilter addTarget:videoRawData]; diff --git a/examples/CubeExample/Classes/ES2Renderer.m b/examples/CubeExample/Classes/ES2Renderer.m index e07b182d6..f3a0d9445 100644 --- a/examples/CubeExample/Classes/ES2Renderer.m +++ b/examples/CubeExample/Classes/ES2Renderer.m @@ -72,13 +72,12 @@ - (id)initWithSize:(CGSize)newSize; videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; inputFilter = [[GPUImageSepiaFilter alloc] init]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; textureOutput = [[GPUImageTextureOutput alloc] init]; textureOutput.delegate = self; - [videoCamera addTarget:rotationFilter]; - [rotationFilter addTarget:inputFilter]; + [videoCamera addTarget:inputFilter]; [inputFilter addTarget:textureOutput]; [videoCamera startCameraCapture]; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 1874b7c90..20e7a3693 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -51,7 +51,10 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (void)setupFilter; { videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; +// GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + + BOOL needsSecondImage = NO; switch (filterType) { @@ -243,11 +246,11 @@ - (void)setupFilter; { self.title = @"Mask"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageMaskFilter alloc] init]; [(GPUImageFilter*)filter setBackgroundColorRed:0.0 green:1.0 blue:0.0 alpha:1.0]; - }; break; case GPUIMAGE_TRANSFORM: { @@ -464,6 +467,7 @@ - (void)setupFilter; { self.title = @"Chroma Key (Green)"; self.filterSettingsSlider.hidden = NO; + needsSecondImage = YES; [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:1.0]; @@ -476,6 +480,7 @@ - (void)setupFilter; { self.title = @"Multiply Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageMultiplyBlendFilter alloc] init]; }; break; @@ -483,6 +488,7 @@ - (void)setupFilter; { self.title = @"Overlay Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageOverlayBlendFilter alloc] init]; }; break; @@ -490,6 +496,7 @@ - (void)setupFilter; { self.title = @"Lighten Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageLightenBlendFilter alloc] init]; }; break; @@ -498,12 +505,14 @@ - (void)setupFilter; self.title = @"Darken Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageDarkenBlendFilter alloc] init]; }; break; case GPUIMAGE_DISSOLVE: { self.title = @"Dissolve Blend"; self.filterSettingsSlider.hidden = NO; + needsSecondImage = YES; [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:1.0]; @@ -515,6 +524,7 @@ - (void)setupFilter; { self.title = @"Screen Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageScreenBlendFilter alloc] init]; }; break; @@ -522,6 +532,7 @@ - (void)setupFilter; { self.title = @"Color Burn Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageColorBurnBlendFilter alloc] init]; }; break; @@ -529,6 +540,7 @@ - (void)setupFilter; { self.title = @"Color Dodge Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageColorDodgeBlendFilter alloc] init]; }; break; @@ -536,6 +548,7 @@ - (void)setupFilter; { self.title = @"Exclusion Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageExclusionBlendFilter alloc] init]; }; break; @@ -543,6 +556,7 @@ - (void)setupFilter; { self.title = @"Difference Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageDifferenceBlendFilter alloc] init]; }; break; @@ -550,6 +564,7 @@ - (void)setupFilter; { self.title = @"Subtract Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageSubtractBlendFilter alloc] init]; }; break; @@ -557,6 +572,7 @@ - (void)setupFilter; { self.title = @"Hard Light Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageHardLightBlendFilter alloc] init]; }; break; @@ -564,6 +580,7 @@ - (void)setupFilter; { self.title = @"Soft Light Blend"; self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; filter = [[GPUImageSoftLightBlendFilter alloc] init]; }; break; @@ -668,15 +685,14 @@ - (void)setupFilter; pipeline = [[GPUImageFilterPipeline alloc] initWithConfigurationFile:[[NSBundle mainBundle] URLForResource:@"SampleConfiguration" withExtension:@"plist"] input:videoCamera output:(GPUImageView*)self.view]; - [pipeline addFilter:rotationFilter atIndex:0]; +// [pipeline addFilter:rotationFilter atIndex:0]; } else { - [videoCamera addTarget:rotationFilter]; - [rotationFilter addTarget:filter]; + [videoCamera addTarget:filter]; videoCamera.runBenchmark = YES; - if ( (filterType != GPUIMAGE_UNSHARPMASK) && (filterType != GPUIMAGE_TILTSHIFT) ) + if (needsSecondImage) { UIImage *inputImage; @@ -693,6 +709,7 @@ - (void)setupFilter; sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; [sourcePicture addTarget:filter]; + [sourcePicture processImage]; } GPUImageView *filterView = (GPUImageView *)self.view; @@ -708,18 +725,19 @@ - (void)setupFilter; [filter addTarget:histogramGraph]; - [rotationFilter addTarget:blendFilter]; + [videoCamera addTarget:blendFilter]; [histogramGraph addTarget:blendFilter]; - rotationFilter.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend - + videoCamera.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend + [blendFilter addTarget:filterView]; } else if (filterType == GPUIMAGE_HARRISCORNERDETECTION) { GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; - [rotationFilter addTarget:blendFilter]; + + [videoCamera addTarget:blendFilter]; [filter addTarget:blendFilter]; - rotationFilter.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend + videoCamera.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend [blendFilter addTarget:filterView]; } diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m index 787b26ca4..1bc497e56 100644 --- a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m +++ b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m @@ -25,7 +25,8 @@ - (void)loadView self.view = primaryView; videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; - + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + CGFloat halfWidth = round(mainScreenFrame.size.width / 2.0); CGFloat halfHeight = round(mainScreenFrame.size.height / 2.0); view1 = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, halfWidth, halfHeight)]; @@ -37,7 +38,6 @@ - (void)loadView [self.view addSubview:view3]; [self.view addSubview:view4]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; GPUImageFilter *filter1 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader1"]; GPUImageFilter *filter2 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader2"]; GPUImageSepiaFilter *filter3 = [[GPUImageSepiaFilter alloc] init]; @@ -46,19 +46,16 @@ - (void)loadView // This is to avoid wasting processing time on larger frames than will be displayed. // You'll need to use -forceProcessingAtSize: with a zero size to re-enable full frame processing of video. - [rotationFilter forceProcessingAtSize:view1.sizeInPixels]; [filter1 forceProcessingAtSize:view2.sizeInPixels]; [filter2 forceProcessingAtSize:view3.sizeInPixels]; [filter3 forceProcessingAtSize:view4.sizeInPixels]; - [videoCamera addTarget:rotationFilter]; - - [rotationFilter addTarget:view1]; - [rotationFilter addTarget:filter1]; + [videoCamera addTarget:view1]; + [videoCamera addTarget:filter1]; [filter1 addTarget:view2]; - [rotationFilter addTarget:filter2]; + [videoCamera addTarget:filter2]; [filter2 addTarget:view3]; - [rotationFilter addTarget:filter3]; + [videoCamera addTarget:filter3]; [filter3 addTarget:view4]; [videoCamera startCameraCapture]; diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index bf326741e..d678f0d44 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -45,6 +45,7 @@ - (void)setupDisplayFiltering; sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; sepiaFilter = [[GPUImageSepiaFilter alloc] init]; + GPUImageView *imageView = (GPUImageView *)self.view; [sepiaFilter forceProcessingAtSize:imageView.sizeInPixels]; // This is now needed to make the filter run at the smaller output size @@ -59,15 +60,13 @@ - (void)setupImageFilteringToDisk; { // Set up a manual image filtering chain UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; - + GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; GPUImageVignetteFilter *vignetteImageFilter = [[GPUImageVignetteFilter alloc] init]; vignetteImageFilter.x = 0.6; vignetteImageFilter.y = 0.4; -// GPUImageSketchFilter *stillImageFilter = [[GPUImageSketchFilter alloc] init]; - // There's a problem with the Kuwahara filter where it doesn't finish rendering before the image is extracted from it. // It looks like it only gets through certain tiles before glReadPixels() is called. Odd. // GPUImageKuwaharaFilter *stillImageFilter = [[GPUImageKuwaharaFilter alloc] init]; @@ -76,18 +75,18 @@ - (void)setupImageFilteringToDisk; [stillImageSource addTarget:stillImageFilter]; [stillImageFilter addTarget:vignetteImageFilter]; [vignetteImageFilter prepareForImageCapture]; - [stillImageSource processImage]; - UIImage *currentFilteredVideoFrame = [vignetteImageFilter imageFromCurrentlyProcessedOutput]; + [stillImageSource processImage]; + UIImage *currentFilteredImage = [vignetteImageFilter imageFromCurrentlyProcessedOutput]; + // Do a simpler image filtering -// GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init]; UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; // Write images to disk, as proof - NSData *dataForPNGFile = UIImagePNGRepresentation(currentFilteredVideoFrame); + NSData *dataForPNGFile = UIImagePNGRepresentation(currentFilteredImage); NSData *dataForPNGFile2 = UIImagePNGRepresentation(quickFilteredImage); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 3bd675307..b81f887a1 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -50,6 +50,7 @@ - (void)viewDidLoad [super viewDidLoad]; stillCamera = [[GPUImageStillCamera alloc] init]; + stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; // filter = [[GPUImageGammaFilter alloc] init]; filter = [[GPUImageSketchFilter alloc] init]; [(GPUImageSketchFilter *)filter setImageHeightFactor:1024.0]; @@ -59,10 +60,7 @@ - (void)viewDidLoad [filter prepareForImageCapture]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; - - [stillCamera addTarget:rotationFilter]; - [rotationFilter addTarget:filter]; + [stillCamera addTarget:filter]; GPUImageView *filterView = (GPUImageView *)self.view; [filter addTarget:filterView]; diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index b3218ebd0..44e02df8f 100644 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -27,14 +27,12 @@ - (void)viewDidLoad movieFile.runBenchmark = YES; // filter = [[GPUImagePixellateFilter alloc] init]; filter = [[GPUImageUnsharpMaskFilter alloc] init]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; [movieFile addTarget:filter]; // Only rotate the video for display, leave orientation the same for recording GPUImageView *filterView = (GPUImageView *)self.view; - [filter addTarget:rotationFilter]; - [rotationFilter addTarget:filterView]; + [filter addTarget:filterView]; // In addition to displaying to the screen, write out a processed version of the movie to disk NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 1c0ab7f1e..10e4f4e83 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -22,6 +22,7 @@ - (void)viewDidLoad [super viewDidLoad]; videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; @@ -35,11 +36,9 @@ - (void)viewDidLoad // filter = [[GPUImageSketchFilter alloc] init]; // filter = [[GPUImageSmoothToonFilter alloc] init]; - GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; // GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRightFlipVertical]; - [videoCamera addTarget:rotationFilter]; - [rotationFilter addTarget:filter]; + [videoCamera addTarget:filter]; GPUImageView *filterView = (GPUImageView *)self.view; [filter addTarget:filterView]; // filterView.fillMode = kGPUImageFillModeStretch; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index c14f89177..5f264abdd 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -116,8 +116,6 @@ BCB5E7C314E4B6D400701302 /* GPUImageSepiaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7C114E4B6D400701302 /* GPUImageSepiaFilter.m */; }; BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; }; BCB5E7DB14E6003400701302 /* GPUImagePicture.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7D914E6003400701302 /* GPUImagePicture.m */; }; - BCB5E85514E63BBB00701302 /* GPUImageRotationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E85314E63BBB00701302 /* GPUImageRotationFilter.h */; }; - BCB5E85614E63BBB00701302 /* GPUImageRotationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E85414E63BBB00701302 /* GPUImageRotationFilter.m */; }; BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; }; BCB6B838150400030041703B /* GPUImageExposureFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B834150400030041703B /* GPUImageExposureFilter.m */; }; BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; }; @@ -304,8 +302,6 @@ BCB5E7C114E4B6D400701302 /* GPUImageSepiaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSepiaFilter.m; path = Source/GPUImageSepiaFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E7D814E6003400701302 /* GPUImagePicture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePicture.h; path = Source/GPUImagePicture.h; sourceTree = SOURCE_ROOT; }; BCB5E7D914E6003400701302 /* GPUImagePicture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePicture.m; path = Source/GPUImagePicture.m; sourceTree = SOURCE_ROOT; }; - BCB5E85314E63BBB00701302 /* GPUImageRotationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRotationFilter.h; path = Source/GPUImageRotationFilter.h; sourceTree = SOURCE_ROOT; }; - BCB5E85414E63BBB00701302 /* GPUImageRotationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRotationFilter.m; path = Source/GPUImageRotationFilter.m; sourceTree = SOURCE_ROOT; }; BCB6B833150400030041703B /* GPUImageExposureFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageExposureFilter.h; path = Source/GPUImageExposureFilter.h; sourceTree = SOURCE_ROOT; }; BCB6B834150400030041703B /* GPUImageExposureFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageExposureFilter.m; path = Source/GPUImageExposureFilter.m; sourceTree = SOURCE_ROOT; }; BCB6B835150400030041703B /* GPUImageSharpenFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSharpenFilter.h; path = Source/GPUImageSharpenFilter.h; sourceTree = SOURCE_ROOT; }; @@ -589,8 +585,6 @@ BCC93A5215031B1700958B26 /* Image processing */ = { isa = PBXGroup; children = ( - BCB5E85314E63BBB00701302 /* GPUImageRotationFilter.h */, - BCB5E85414E63BBB00701302 /* GPUImageRotationFilter.m */, BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */, BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */, BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */, @@ -717,7 +711,6 @@ BCB5E79414E3275200701302 /* GLProgram.h in Headers */, BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */, BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */, - BCB5E85514E63BBB00701302 /* GPUImageRotationFilter.h in Headers */, BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */, BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */, BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */, @@ -911,7 +904,6 @@ BCB5E79514E3275200701302 /* GLProgram.m in Sources */, BCB5E7C314E4B6D400701302 /* GPUImageSepiaFilter.m in Sources */, BCB5E7DB14E6003400701302 /* GPUImagePicture.m in Sources */, - BCB5E85614E63BBB00701302 /* GPUImageRotationFilter.m in Sources */, BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */, BC982B5414F07F790001FF6F /* GPUImageColorInvertFilter.m in Sources */, BC982B5614F07F790001FF6F /* GPUImageSaturationFilter.m in Sources */, @@ -1151,6 +1143,7 @@ BC552B391558C6F4001F3FFA /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; BCF1A32E14DDB1EC00852800 /* Build configuration list for PBXProject "GPUImage" */ = { isa = XCConfigurationList; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 30a7a3a8c..6e975eaf3 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -17,7 +17,6 @@ // Filters #import "GPUImageFilter.h" -#import "GPUImageRotationFilter.h" #import "GPUImagePixellateFilter.h" #import "GPUImageSepiaFilter.h" #import "GPUImageColorInvertFilter.h" diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index 36b930673..a6f1c68f3 100644 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -96,8 +96,16 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); + glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); + } + else + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + } [secondFilterProgram use]; glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); diff --git a/framework/Source/GPUImageCropFilter.h b/framework/Source/GPUImageCropFilter.h index 42265841c..641fb7bfa 100644 --- a/framework/Source/GPUImageCropFilter.h +++ b/framework/Source/GPUImageCropFilter.h @@ -2,6 +2,7 @@ @interface GPUImageCropFilter : GPUImageFilter { + GLfloat cropTextureCoordinates[8]; } // The crop region is the rectangle within the image to crop. It is normalized to a coordinate space from 0.0 to 1.0, with 0.0, 0.0 being the upper left corner of the image diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index b6923fba1..5ec44f17e 100644 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -12,6 +12,12 @@ void main() } ); +@interface GPUImageCropFilter () + +- (void)calculateCropTextureCoordinates; + +@end + @implementation GPUImageCropFilter @synthesize cropRegion = _cropRegion; @@ -47,14 +53,120 @@ - (id)init; - (CGSize)outputFrameSize; { CGSize adjustedSize; - adjustedSize.width = inputTextureSize.width * _cropRegion.size.width; - adjustedSize.height = inputTextureSize.height * _cropRegion.size.height; + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + adjustedSize.width = inputTextureSize.height * _cropRegion.size.width; + adjustedSize.height = inputTextureSize.width * _cropRegion.size.height; + } + else + { + adjustedSize.width = inputTextureSize.width * _cropRegion.size.width; + adjustedSize.height = inputTextureSize.height * _cropRegion.size.height; + } + return adjustedSize; } #pragma mark - #pragma mark GPUImageInput +- (void)calculateCropTextureCoordinates; +{ + CGFloat minX = _cropRegion.origin.x; + CGFloat minY = _cropRegion.origin.y; + CGFloat maxX = CGRectGetMaxX(_cropRegion); + CGFloat maxY = CGRectGetMaxY(_cropRegion); + + switch(inputRotation) + { + case kGPUImageNoRotation: + { + cropTextureCoordinates[0] = minX; // 0,0 + cropTextureCoordinates[1] = minY; + + cropTextureCoordinates[2] = maxX; // 1,0 + cropTextureCoordinates[3] = minY; + + cropTextureCoordinates[4] = minX; // 0,1 + cropTextureCoordinates[5] = maxY; + + cropTextureCoordinates[4] = maxX; // 1,1 + cropTextureCoordinates[5] = maxY; + }; break; + case kGPUImageRotateLeft: + { + cropTextureCoordinates[0] = maxX; // 1,0 + cropTextureCoordinates[1] = minY; + + cropTextureCoordinates[2] = maxX; // 1,1 + cropTextureCoordinates[3] = maxY; + + cropTextureCoordinates[4] = minX; // 0,0 + cropTextureCoordinates[5] = minY; + + cropTextureCoordinates[6] = minX; // 0,1 + cropTextureCoordinates[7] = maxY; + }; break; + case kGPUImageRotateRight: + { + cropTextureCoordinates[0] = minX; // 0,1 + cropTextureCoordinates[1] = maxY; + + cropTextureCoordinates[2] = minX; // 0,0 + cropTextureCoordinates[3] = minY; + + cropTextureCoordinates[4] = maxX; // 1,1 + cropTextureCoordinates[5] = maxY; + + cropTextureCoordinates[6] = maxX; // 1,0 + cropTextureCoordinates[7] = minY; + }; break; + case kGPUImageFlipVertical: + { + cropTextureCoordinates[0] = minX; // 0,1 + cropTextureCoordinates[1] = maxY; + + cropTextureCoordinates[2] = maxX; // 1,1 + cropTextureCoordinates[3] = maxY; + + cropTextureCoordinates[4] = minX; // 0,0 + cropTextureCoordinates[5] = minY; + + cropTextureCoordinates[6] = maxX; // 1,0 + cropTextureCoordinates[7] = minY; + }; break; + case kGPUImageFlipHorizonal: + { + cropTextureCoordinates[0] = maxX; // 1,0 + cropTextureCoordinates[1] = minY; + + cropTextureCoordinates[2] = minX; // 0,0 + cropTextureCoordinates[3] = minY; + + cropTextureCoordinates[4] = maxX; // 1,1 + cropTextureCoordinates[5] = maxY; + + cropTextureCoordinates[6] = minX; // 0,1 + cropTextureCoordinates[7] = maxY; + }; break; + case kGPUImageRotateRightFlipVertical: + { + cropTextureCoordinates[0] = minX; // 0,0 + cropTextureCoordinates[1] = minY; + + cropTextureCoordinates[2] = minX; // 0,1 + cropTextureCoordinates[3] = maxY; + + cropTextureCoordinates[4] = maxX; // 1,0 + cropTextureCoordinates[5] = minY; + + cropTextureCoordinates[6] = maxX; // 1,1 + cropTextureCoordinates[7] = maxY; + }; break; + } +} + - (void)newFrameReadyAtTime:(CMTime)frameTime; { static const GLfloat cropSquareVertices[] = { @@ -64,16 +176,24 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; 1.0f, 1.0f, }; - GLfloat cropTextureCoordinates[] = { - _cropRegion.origin.x, _cropRegion.origin.y, - CGRectGetMaxX(_cropRegion), _cropRegion.origin.y, - _cropRegion.origin.x, CGRectGetMaxY(_cropRegion), - CGRectGetMaxX(_cropRegion), CGRectGetMaxY(_cropRegion), - }; - [self renderToTextureWithVertices:cropSquareVertices textureCoordinates:cropTextureCoordinates sourceTexture:filterSourceTexture]; [self informTargetsAboutNewFrameAtTime:frameTime]; } +#pragma mark - +#pragma mark Accessors + +- (void)setCropRegion:(CGRect)newValue; +{ + _cropRegion = newValue; + [self calculateCropTextureCoordinates]; +} + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self calculateCropTextureCoordinates]; +} + @end diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index c7d00925b..804fda41f 100644 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -93,8 +93,16 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); + glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); + } + else + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + } [secondFilterProgram use]; glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 147a8d688..e15bf2f48 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -5,6 +5,7 @@ #define SHADER_STRING(text) @ STRINGIZE2(text) extern NSString *const kGPUImageVertexShaderString; +extern NSString *const kGPUImageTwoInputTextureVertexShaderString; extern NSString *const kGPUImagePassthroughFragmentShaderString; struct GPUVector4 { @@ -48,7 +49,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; GLuint filterFramebuffer; GLProgram *filterProgram; - GLint filterPositionAttribute, filterTextureCoordinateAttribute; + GLint filterPositionAttribute, filterTextureCoordinateAttribute, filterSecondTextureCoordinateAttribute; GLint filterInputTextureUniform, filterInputTextureUniform2; GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; @@ -59,6 +60,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; CVOpenGLESTextureRef renderTexture; CGSize currentFilterSize; + GPUImageRotationMode inputRotation, inputRotation2; } @property(readonly) CVPixelBufferRef renderTarget; @@ -105,6 +107,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)setOutputFBO; /// @name Rendering ++ (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; - (CGSize)outputFrameSize; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 31694fbe6..743e7f468 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -17,6 +17,23 @@ void main() } ); +NSString *const kGPUImageTwoInputTextureVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + attribute vec4 inputTextureCoordinate2; + + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + void main() + { + gl_Position = position; + textureCoordinate = inputTextureCoordinate.xy; + textureCoordinate2 = inputTextureCoordinate2.xy; + } +); + NSString *const kGPUImagePassthroughFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -49,7 +66,8 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad preparedToCaptureImage = NO; _preventRendering = NO; - + inputRotation = kGPUImageNoRotation; + inputRotation2 = kGPUImageNoRotation; backgroundColorRed = 0.0; backgroundColorGreen = 0.0; backgroundColorBlue = 0.0; @@ -74,13 +92,19 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad filterPositionAttribute = [filterProgram attributeIndex:@"position"]; filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; + filterSecondTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate2"]; filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader filterInputTextureUniform2 = [filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader [filterProgram use]; + + NSLog(@"Attributes: %d, %d, %d", filterPositionAttribute, filterTextureCoordinateAttribute, filterSecondTextureCoordinateAttribute); glEnableVertexAttribArray(filterPositionAttribute); glEnableVertexAttribArray(filterTextureCoordinateAttribute); + // TODO: Check for validity f + glEnableVertexAttribArray(filterSecondTextureCoordinateAttribute); + return self; } @@ -111,6 +135,8 @@ - (void)initializeAttributes; { [filterProgram addAttribute:@"position"]; [filterProgram addAttribute:@"inputTextureCoordinate"]; + [filterProgram addAttribute:@"inputTextureCoordinate2"]; + // Override this, calling back to this super method, in order to add new attributes to your vertex shader } @@ -343,6 +369,61 @@ - (void)setOutputFBO; #pragma mark - #pragma mark Rendering ++ (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; +{ + static const GLfloat noRotationTextureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat rotateLeftTextureCoordinates[] = { + 1.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 0.0f, + 0.0f, 1.0f, + }; + + static const GLfloat rotateRightTextureCoordinates[] = { + 0.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 1.0f, + 1.0f, 0.0f, + }; + + static const GLfloat verticalFlipTextureCoordinates[] = { + 0.0f, 1.0f, + 1.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 0.0f, + }; + + static const GLfloat horizontalFlipTextureCoordinates[] = { + 1.0f, 0.0f, + 0.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 1.0f, + }; + + static const GLfloat rotateRightVerticalFlipTextureCoordinates[] = { + 0.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 0.0f, + 1.0f, 1.0f, + }; + + switch(rotationMode) + { + case kGPUImageNoRotation: return noRotationTextureCoordinates; + case kGPUImageRotateLeft: return rotateLeftTextureCoordinates; + case kGPUImageRotateRight: return rotateRightTextureCoordinates; + case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; + case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; + case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; + } +} + - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { if (self.preventRendering) @@ -366,9 +447,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (filterSourceTexture2 != 0) { glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); - + glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); glUniform1i(filterInputTextureUniform2, 3); + + glVertexAttribPointer(filterSecondTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation2]); } glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); @@ -498,21 +580,15 @@ - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSStrin - (void)newFrameReadyAtTime:(CMTime)frameTime; { - static const GLfloat squareVertices[] = { + static const GLfloat imageVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, }; - static const GLfloat squareTextureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - - [self renderToTextureWithVertices:squareVertices textureCoordinates:squareTextureCoordinates sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + [self informTargetsAboutNewFrameAtTime:frameTime]; } @@ -575,17 +651,41 @@ - (void)setInputSize:(CGSize)newSize; } } - if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (CGSizeEqualToSize(newSize, CGSizeZero)) ) + CGSize rotatedSize = newSize; + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + rotatedSize.width = newSize.height; + rotatedSize.height = newSize.width; + } + + if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (CGSizeEqualToSize(rotatedSize, CGSizeZero)) ) { - inputTextureSize = newSize; + inputTextureSize = rotatedSize; } - else if (!CGSizeEqualToSize(inputTextureSize, newSize)) + else if (!CGSizeEqualToSize(inputTextureSize, rotatedSize)) { - inputTextureSize = newSize; + inputTextureSize = rotatedSize; [self recreateFilterFBO]; } } +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + if (textureIndex == 0) + { + NSLog(@"First input rotation: %d", inputRotation); + + inputRotation = newInputRotation; + } + else + { + NSLog(@"Second input rotation: %d", inputRotation2); + + inputRotation2 = newInputRotation; + } +} + - (void)forceProcessingAtSize:(CGSize)frameSize; { if (CGSizeEqualToSize(frameSize, CGSizeZero)) diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index da53380f2..5410368af 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -118,6 +118,14 @@ - (void)setInputSize:(CGSize)newSize; } } +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + for (GPUImageOutput *currentFilter in _initialFilters) + { + [currentFilter setInputRotation:newInputRotation atIndex:(NSInteger)textureIndex]; + } +} + - (void)forceProcessingAtSize:(CGSize)frameSize; { for (GPUImageOutput *currentFilter in filters) diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index b7be34987..66bd6bd52 100644 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -102,10 +102,21 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); - glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); + + // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(horizontalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(horizontalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.width); + } + else + { + glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); + glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); + } [secondFilterProgram use]; + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); } diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index ef3b8d3ea..34c63bedb 100644 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -27,6 +27,7 @@ CVOpenGLESTextureRef renderTexture; CGSize videoSize; + GPUImageRotationMode inputRotation; } @property(readwrite, nonatomic) BOOL hasAudioTrack; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index ab9ea6cf3..7636765fa 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -73,7 +73,8 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; startTime = kCMTimeInvalid; _encodingLiveVideo = YES; previousFrameTime = kCMTimeNegativeInfinity; - + inputRotation = kGPUImageNoRotation; + [GPUImageOpenGLESContext useImageProcessingContext]; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) @@ -488,6 +489,11 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; inputTextureForMovieRendering = newInputTexture; } +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + inputRotation = newInputRotation; +} + - (void)setInputSize:(CGSize)newSize; { } diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m index 2c7ab6fc7..2685af192 100644 --- a/framework/Source/GPUImageNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.m @@ -83,8 +83,16 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); + glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); + } + else + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + } [secondFilterProgram use]; glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 06402d48a..10c328792 100644 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -5,6 +5,10 @@ #import #import +#define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical) + +typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical} GPUImageRotationMode; + @interface GPUImageOpenGLESContext : NSObject { EAGLContext *_context; @@ -29,6 +33,7 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; - (void)setInputSize:(CGSize)newSize; +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; - (CGSize)maximumOutputSize; - (void)endProcessing; - (BOOL)shouldIgnoreUpdatesToThisTarget; diff --git a/framework/Source/GPUImageRawData.h b/framework/Source/GPUImageRawData.h index 25fa21b80..d8eb8ca66 100644 --- a/framework/Source/GPUImageRawData.h +++ b/framework/Source/GPUImageRawData.h @@ -15,6 +15,7 @@ typedef struct GPUByteColorVector GPUByteColorVector; CGSize imageSize; CVOpenGLESTextureCacheRef rawDataTextureCache; CVPixelBufferRef renderTarget; + GPUImageRotationMode inputRotation; } @property(readwrite, unsafe_unretained, nonatomic) id delegate; diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawData.m index 411ae80d3..e21e7c92b 100644 --- a/framework/Source/GPUImageRawData.m +++ b/framework/Source/GPUImageRawData.m @@ -47,6 +47,7 @@ - (id)initWithImageSize:(CGSize)newImageSize; imageSize = newImageSize; hasReadFromTheCurrentFrame = NO; _rawBytesForImage = NULL; + inputRotation = kGPUImageNoRotation; [GPUImageOpenGLESContext useImageProcessingContext]; dataProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; @@ -290,6 +291,11 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; inputTextureForDisplay = newInputTexture; } +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + inputRotation = newInputRotation; +} + - (void)setInputSize:(CGSize)newSize; { } diff --git a/framework/Source/GPUImageRotationFilter.h b/framework/Source/GPUImageRotationFilter.h deleted file mode 100644 index d5175b017..000000000 --- a/framework/Source/GPUImageRotationFilter.h +++ /dev/null @@ -1,13 +0,0 @@ -#import "GPUImageFilter.h" - -typedef enum { kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical} GPUImageRotationMode; - -@interface GPUImageRotationFilter : GPUImageFilter -{ - GPUImageRotationMode rotationMode; -} - -// Initialization and teardown -- (id)initWithRotation:(GPUImageRotationMode)newRotationMode; - -@end diff --git a/framework/Source/GPUImageRotationFilter.m b/framework/Source/GPUImageRotationFilter.m deleted file mode 100644 index 3fb67ab11..000000000 --- a/framework/Source/GPUImageRotationFilter.m +++ /dev/null @@ -1,105 +0,0 @@ -#import "GPUImageRotationFilter.h" - -NSString *const kGPUImageRotationFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - - uniform sampler2D inputImageTexture; - - void main() - { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate); - } -); - -@implementation GPUImageRotationFilter - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)initWithRotation:(GPUImageRotationMode)newRotationMode; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageRotationFragmentShaderString])) - { - return nil; - } - - rotationMode = newRotationMode; - - return self; -} - - -#pragma mark - -#pragma mark GPUImageInput - -- (void)setInputSize:(CGSize)newSize; -{ - CGSize processedSize = newSize; - - if ( (rotationMode == kGPUImageRotateLeft) || (rotationMode == kGPUImageRotateRight) || (rotationMode == kGPUImageRotateRightFlipVertical) ) - { - processedSize.width = newSize.height; - processedSize.height = newSize.width; - } - - [super setInputSize:processedSize]; -} - -- (void)newFrameReadyAtTime:(CMTime)frameTime; -{ - static const GLfloat rotationSquareVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - - static const GLfloat rotateLeftTextureCoordinates[] = { - 1.0f, 0.0f, - 1.0f, 1.0f, - 0.0f, 0.0f, - 0.0f, 1.0f, - }; - - static const GLfloat rotateRightTextureCoordinates[] = { - 0.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 1.0f, - 1.0f, 0.0f, - }; - - static const GLfloat verticalFlipTextureCoordinates[] = { - 0.0f, 1.0f, - 1.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 0.0f, - }; - - static const GLfloat horizontalFlipTextureCoordinates[] = { - 1.0f, 0.0f, - 0.0f, 0.0f, - 1.0f, 1.0f, - 0.0f, 1.0f, - }; - - static const GLfloat rotateRightVerticalFlipTextureCoordinates[] = { - 0.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 0.0f, - 1.0f, 1.0f, - }; - - - switch (rotationMode) - { - case kGPUImageRotateLeft: [self renderToTextureWithVertices:rotationSquareVertices textureCoordinates:rotateLeftTextureCoordinates sourceTexture:filterSourceTexture]; break; - case kGPUImageRotateRight: [self renderToTextureWithVertices:rotationSquareVertices textureCoordinates:rotateRightTextureCoordinates sourceTexture:filterSourceTexture]; break; - case kGPUImageFlipHorizonal: [self renderToTextureWithVertices:rotationSquareVertices textureCoordinates:verticalFlipTextureCoordinates sourceTexture:filterSourceTexture]; break; - case kGPUImageFlipVertical: [self renderToTextureWithVertices:rotationSquareVertices textureCoordinates:horizontalFlipTextureCoordinates sourceTexture:filterSourceTexture]; break; - case kGPUImageRotateRightFlipVertical: [self renderToTextureWithVertices:rotationSquareVertices textureCoordinates:rotateRightVerticalFlipTextureCoordinates sourceTexture:filterSourceTexture]; break; - } - [self informTargetsAboutNewFrameAtTime:frameTime]; -} - -@end diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index 665a7b853..d8c729d87 100644 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -23,6 +23,10 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; _texture = newInputTexture; } +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ +} + - (void)setInputSize:(CGSize)newSize; { } diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index 5ceb1efb5..3f2e5951e 100644 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -123,20 +123,13 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; 1.0f, 1.0f, }; - static const GLfloat squareTextureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - if (_ignoreAspectRatio) { - [self renderToTextureWithVertices:squareVertices textureCoordinates:squareTextureCoordinates sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; } else { - [self renderToTextureWithVertices:adjustedVertices textureCoordinates:squareTextureCoordinates sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; } [self informTargetsAboutNewFrameAtTime:frameTime]; diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index d02d4def9..1acc57252 100644 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -232,7 +232,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 5d5a858bb..488e51826 100644 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -6,11 +6,6 @@ /** A GPUImageOutput that provides frames from either camera - - From the iOS 5.0 release notes: - _In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight._ - - Currently, rotation is needed to handle each camera */ @interface GPUImageVideoCamera : GPUImageOutput { @@ -24,17 +19,21 @@ AVCaptureDevice *_microphone; BOOL capturePaused; + GPUImageRotationMode outputRotation; } /// The AVCaptureSession used to capture from the camera @property(readonly, retain) AVCaptureSession *captureSession; -/// Whether or not benchmarking should be running +/// This enables the benchmarking mode, which logs out instantaneous and average frame times to the console @property(readwrite, nonatomic) BOOL runBenchmark; /// Use this property to manage camera settings. Focus point, exposure point, etc. @property(readonly) AVCaptureDevice *inputCamera; +/// This determines the rotation applied to the output image, based on the source material +@property(readwrite, nonatomic) UIInterfaceOrientation outputImageOrientation; + /// @name Initialization and teardown /** Begin a capture session @@ -82,13 +81,13 @@ */ - (AVCaptureDevicePosition)cameraPosition; -/** Rotate the camera +/** This flips between the front and rear cameras */ - (void)rotateCamera; /// @name Benchmarking -/** Average frame duration +/** When benchmarking is enabled, this will keep a running average of the time from uploading, processing, and final recording or display */ - (CGFloat)averageFrameDurationDuringCapture; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index f45a8f6ab..aeb82f370 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -23,6 +23,7 @@ @implementation GPUImageVideoCamera @synthesize captureSession = _captureSession; @synthesize inputCamera = _inputCamera; @synthesize runBenchmark = _runBenchmark; +@synthesize outputImageOrientation = _outputImageOrientation; #pragma mark - #pragma mark Initialization and teardown @@ -48,6 +49,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD _runBenchmark = NO; capturePaused = NO; + outputRotation = kGPUImageNoRotation; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { @@ -152,6 +154,16 @@ - (void)removeInputsAndOutputs; } } +#pragma mark - +#pragma mark Managing targets + +- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; +{ + [super addTarget:newTarget atTextureLocation:textureLocation]; + + [newTarget setInputRotation:outputRotation atIndex:textureLocation]; +} + #pragma mark - #pragma mark Manage the camera video stream @@ -188,7 +200,7 @@ - (void)rotateCamera AVCaptureDeviceInput *newVideoInput; AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - if(currentCameraPosition == AVCaptureDevicePositionBack) + if (currentCameraPosition == AVCaptureDevicePositionBack) { currentCameraPosition = AVCaptureDevicePositionFront; } @@ -275,6 +287,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; NSInteger indexOfObject = [targets indexOfObject:currentTarget]; [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; [currentTarget newFrameReadyAtTime:currentTime]; } @@ -282,6 +295,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; } } @@ -424,4 +438,39 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; [super setAudioEncodingTarget:newValue]; } +- (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; +{ + _outputImageOrientation = newValue; + +// From the iOS 5.0 release notes: +// In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight. + + if ([self cameraPosition] == AVCaptureDevicePositionBack) + { + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; + } + } + else + { + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipVertical; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; + } + } + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + } +} + @end diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index 991a905ab..c5c8a8267 100644 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -12,6 +12,7 @@ typedef enum { */ @interface GPUImageView : UIView { + GPUImageRotationMode inputRotation; } /** The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 70ce70d76..e5c7fc558 100644 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -78,6 +78,8 @@ - (void)commonInit; { self.contentScaleFactor = [[UIScreen mainScreen] scale]; } + + inputRotation = kGPUImageNoRotation; [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; self.fillMode = kGPUImageFillModePreserveAspectRatio; @@ -288,6 +290,11 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; inputTextureForDisplay = newInputTexture; } +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + inputRotation = newInputRotation; +} + - (void)setInputSize:(CGSize)newSize; { if (!CGSizeEqualToSize(inputImageSize, newSize)) From 4991ac8b33759d407f2fc085597e3ab49a099b25 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 9 May 2012 15:16:04 -0500 Subject: [PATCH 071/695] Migrated blend filters to the new rotation architecture. This required a new filter subclass and slight modifications to vertex and fragment shaders to support independent rotation. --- .../ShowcaseFilterViewController.m | 2 +- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImageAlphaBlendFilter.h | 4 +- framework/Source/GPUImageAlphaBlendFilter.m | 5 +- .../Source/GPUImageChromaKeyBlendFilter.h | 4 +- .../Source/GPUImageChromaKeyBlendFilter.m | 5 +- .../Source/GPUImageColorBurnBlendFilter.h | 4 +- .../Source/GPUImageColorBurnBlendFilter.m | 5 +- .../Source/GPUImageColorDodgeBlendFilter.h | 4 +- .../Source/GPUImageColorDodgeBlendFilter.m | 3 +- framework/Source/GPUImageDarkenBlendFilter.h | 4 +- framework/Source/GPUImageDarkenBlendFilter.m | 5 +- .../Source/GPUImageDifferenceBlendFilter.h | 4 +- .../Source/GPUImageDifferenceBlendFilter.m | 5 +- .../Source/GPUImageDissolveBlendFilter.h | 4 +- .../Source/GPUImageDissolveBlendFilter.m | 7 +- .../Source/GPUImageExclusionBlendFilter.h | 4 +- .../Source/GPUImageExclusionBlendFilter.m | 5 +- framework/Source/GPUImageFastBlurFilter.m | 2 +- framework/Source/GPUImageFilter.h | 9 +- framework/Source/GPUImageFilter.m | 67 +-------- .../Source/GPUImageHardLightBlendFilter.h | 4 +- .../Source/GPUImageHardLightBlendFilter.m | 5 +- framework/Source/GPUImageLightenBlendFilter.h | 4 +- framework/Source/GPUImageLightenBlendFilter.m | 5 +- .../Source/GPUImageMultiplyBlendFilter.h | 4 +- .../Source/GPUImageMultiplyBlendFilter.m | 5 +- framework/Source/GPUImageOverlayBlendFilter.h | 4 +- framework/Source/GPUImageOverlayBlendFilter.m | 5 +- framework/Source/GPUImageScreenBlendFilter.h | 4 +- framework/Source/GPUImageScreenBlendFilter.m | 5 +- .../Source/GPUImageSoftLightBlendFilter.h | 4 +- .../Source/GPUImageSoftLightBlendFilter.m | 5 +- .../Source/GPUImageSubtractBlendFilter.h | 4 +- .../Source/GPUImageSubtractBlendFilter.m | 5 +- framework/Source/GPUImageTwoInputFilter.h | 15 ++ framework/Source/GPUImageTwoInputFilter.m | 136 ++++++++++++++++++ framework/Source/GPUImageTwoPassFilter.m | 8 -- framework/Source/GPUImageVideoCamera.m | 25 ++-- 39 files changed, 259 insertions(+), 148 deletions(-) create mode 100644 framework/Source/GPUImageTwoInputFilter.h create mode 100644 framework/Source/GPUImageTwoInputFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 20e7a3693..61cbabda9 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -709,7 +709,7 @@ - (void)setupFilter; sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; [sourcePicture addTarget:filter]; - [sourcePicture processImage]; + [sourcePicture processImage]; } GPUImageView *filterView = (GPUImageView *)self.view; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 5f264abdd..739680dd5 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -33,6 +33,8 @@ 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; + BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; }; + BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; }; BC1B715714F49DAA00ACA2AB /* GPUImageRawData.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawData.h */; }; @@ -221,6 +223,8 @@ 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMaskFilter.m; path = Source/GPUImageMaskFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; + BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputFilter.h; path = Source/GPUImageTwoInputFilter.h; sourceTree = SOURCE_ROOT; }; + BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputFilter.m; path = Source/GPUImageTwoInputFilter.m; sourceTree = SOURCE_ROOT; }; BC1B715514F49DAA00ACA2AB /* GPUImageRawData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawData.h; path = Source/GPUImageRawData.h; sourceTree = SOURCE_ROOT; }; BC1B715614F49DAA00ACA2AB /* GPUImageRawData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRawData.m; path = Source/GPUImageRawData.m; sourceTree = SOURCE_ROOT; }; BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSketchFilter.h; path = Source/GPUImageSketchFilter.h; sourceTree = SOURCE_ROOT; }; @@ -538,6 +542,8 @@ children = ( BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */, BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */, + BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */, + BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */, BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */, BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */, BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */, @@ -781,6 +787,7 @@ BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */, BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */, BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, + BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -974,6 +981,7 @@ BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */, BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */, BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, + BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageAlphaBlendFilter.h b/framework/Source/GPUImageAlphaBlendFilter.h index 46e75f013..c4d75759c 100644 --- a/framework/Source/GPUImageAlphaBlendFilter.h +++ b/framework/Source/GPUImageAlphaBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageAlphaBlendFilter : GPUImageFilter +@interface GPUImageAlphaBlendFilter : GPUImageTwoInputFilter { GLint mixUniform; } diff --git a/framework/Source/GPUImageAlphaBlendFilter.m b/framework/Source/GPUImageAlphaBlendFilter.m index f3a28634c..270bd5721 100644 --- a/framework/Source/GPUImageAlphaBlendFilter.m +++ b/framework/Source/GPUImageAlphaBlendFilter.m @@ -3,7 +3,8 @@ NSString *const kGPUImageAlphaBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; @@ -12,7 +13,7 @@ void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = vec4(mix(textureColor.rgb, textureColor2.rgb, textureColor2.a * mixturePercent), textureColor.a); } diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.h b/framework/Source/GPUImageChromaKeyBlendFilter.h index f90ce6d08..a030cf3c7 100644 --- a/framework/Source/GPUImageChromaKeyBlendFilter.h +++ b/framework/Source/GPUImageChromaKeyBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageChromaKeyBlendFilter : GPUImageFilter +@interface GPUImageChromaKeyBlendFilter : GPUImageTwoInputFilter { GLint colorToReplaceUniform, thresholdSensitivityUniform, smoothingUniform; } diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m index 9ac85b71f..9bff2b490 100644 --- a/framework/Source/GPUImageChromaKeyBlendFilter.m +++ b/framework/Source/GPUImageChromaKeyBlendFilter.m @@ -7,7 +7,8 @@ precision highp float; varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform float thresholdSensitivity; uniform float smoothing; uniform vec3 colorToReplace; @@ -17,7 +18,7 @@ void main() { vec3 textureColor = texture2D(inputImageTexture, textureCoordinate).rgb; - vec3 textureColor2 = texture2D(inputImageTexture2, textureCoordinate).rgb; + vec3 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2).rgb; float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b; float maskCr = 0.7132 * (colorToReplace.r - maskY); diff --git a/framework/Source/GPUImageColorBurnBlendFilter.h b/framework/Source/GPUImageColorBurnBlendFilter.h index 5a435a184..0e4d30ebe 100644 --- a/framework/Source/GPUImageColorBurnBlendFilter.h +++ b/framework/Source/GPUImageColorBurnBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageColorBurnBlendFilter : GPUImageFilter +@interface GPUImageColorBurnBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageColorBurnBlendFilter.m b/framework/Source/GPUImageColorBurnBlendFilter.m index 65e4d0de1..b0dcdf5e7 100644 --- a/framework/Source/GPUImageColorBurnBlendFilter.m +++ b/framework/Source/GPUImageColorBurnBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageColorBurnBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); mediump vec4 whiteColor = vec4(1.0); gl_FragColor = whiteColor - (whiteColor - textureColor) / textureColor2; } diff --git a/framework/Source/GPUImageColorDodgeBlendFilter.h b/framework/Source/GPUImageColorDodgeBlendFilter.h index 438f5fad8..b7d0db7fd 100644 --- a/framework/Source/GPUImageColorDodgeBlendFilter.h +++ b/framework/Source/GPUImageColorDodgeBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageColorDodgeBlendFilter : GPUImageFilter +@interface GPUImageColorDodgeBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageColorDodgeBlendFilter.m b/framework/Source/GPUImageColorDodgeBlendFilter.m index 135465c31..5c61a9970 100644 --- a/framework/Source/GPUImageColorDodgeBlendFilter.m +++ b/framework/Source/GPUImageColorDodgeBlendFilter.m @@ -3,6 +3,7 @@ NSString *const kGPUImageColorDodgeBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; @@ -10,7 +11,7 @@ void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); mediump vec4 whiteColor = vec4(1.0); gl_FragColor = textureColor / (whiteColor - textureColor2); } diff --git a/framework/Source/GPUImageDarkenBlendFilter.h b/framework/Source/GPUImageDarkenBlendFilter.h index ef2d655a4..5dfe34053 100644 --- a/framework/Source/GPUImageDarkenBlendFilter.h +++ b/framework/Source/GPUImageDarkenBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageDarkenBlendFilter : GPUImageFilter +@interface GPUImageDarkenBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageDarkenBlendFilter.m b/framework/Source/GPUImageDarkenBlendFilter.m index 63c500292..eb83c6559 100644 --- a/framework/Source/GPUImageDarkenBlendFilter.m +++ b/framework/Source/GPUImageDarkenBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageDarkenBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = min(textureColor, textureColor2); } diff --git a/framework/Source/GPUImageDifferenceBlendFilter.h b/framework/Source/GPUImageDifferenceBlendFilter.h index e389d553a..7c7dfc230 100644 --- a/framework/Source/GPUImageDifferenceBlendFilter.h +++ b/framework/Source/GPUImageDifferenceBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageDifferenceBlendFilter : GPUImageFilter +@interface GPUImageDifferenceBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageDifferenceBlendFilter.m b/framework/Source/GPUImageDifferenceBlendFilter.m index 5c5bb548a..bf5b5d749 100644 --- a/framework/Source/GPUImageDifferenceBlendFilter.m +++ b/framework/Source/GPUImageDifferenceBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageDifferenceBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = vec4(abs(textureColor2.rgb - textureColor.rgb), textureColor.a); } ); diff --git a/framework/Source/GPUImageDissolveBlendFilter.h b/framework/Source/GPUImageDissolveBlendFilter.h index a5b8b281f..b4e5720a7 100644 --- a/framework/Source/GPUImageDissolveBlendFilter.h +++ b/framework/Source/GPUImageDissolveBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageDissolveBlendFilter : GPUImageFilter +@interface GPUImageDissolveBlendFilter : GPUImageTwoInputFilter { GLint mixUniform; } diff --git a/framework/Source/GPUImageDissolveBlendFilter.m b/framework/Source/GPUImageDissolveBlendFilter.m index daa5ad518..1e2ee6c45 100644 --- a/framework/Source/GPUImageDissolveBlendFilter.m +++ b/framework/Source/GPUImageDissolveBlendFilter.m @@ -3,7 +3,8 @@ NSString *const kGPUImageDissolveBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; uniform lowp float mixturePercent; @@ -11,7 +12,7 @@ void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = mix(textureColor, textureColor2, mixturePercent); } @@ -32,7 +33,7 @@ - (id)init; } mixUniform = [filterProgram uniformIndex:@"mixturePercent"]; - self.mix = 1.0; + self.mix = 0.5; return self; } diff --git a/framework/Source/GPUImageExclusionBlendFilter.h b/framework/Source/GPUImageExclusionBlendFilter.h index 17ae53c90..f7c83f579 100644 --- a/framework/Source/GPUImageExclusionBlendFilter.h +++ b/framework/Source/GPUImageExclusionBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageExclusionBlendFilter : GPUImageFilter +@interface GPUImageExclusionBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageExclusionBlendFilter.m b/framework/Source/GPUImageExclusionBlendFilter.m index c2e8f9bff..3ea4629e5 100644 --- a/framework/Source/GPUImageExclusionBlendFilter.m +++ b/framework/Source/GPUImageExclusionBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageExclusionBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = vec4(textureColor.rgb + textureColor2.rgb - (2.0 * textureColor.rgb * textureColor2.rgb), textureColor.a); } ); diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index 804fda41f..6110ccae1 100644 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -118,7 +118,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates for (NSUInteger currentAdditionalBlurPass = 1; currentAdditionalBlurPass < _blurPasses; currentAdditionalBlurPass++) { - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:secondFilterOutputTexture]; + [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation] sourceTexture:secondFilterOutputTexture]; } } diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index e15bf2f48..85872fb62 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -5,7 +5,6 @@ #define SHADER_STRING(text) @ STRINGIZE2(text) extern NSString *const kGPUImageVertexShaderString; -extern NSString *const kGPUImageTwoInputTextureVertexShaderString; extern NSString *const kGPUImagePassthroughFragmentShaderString; struct GPUVector4 { @@ -44,13 +43,13 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; */ @interface GPUImageFilter : GPUImageOutput { - GLuint filterSourceTexture, filterSourceTexture2; + GLuint filterSourceTexture; GLuint filterFramebuffer; GLProgram *filterProgram; - GLint filterPositionAttribute, filterTextureCoordinateAttribute, filterSecondTextureCoordinateAttribute; - GLint filterInputTextureUniform, filterInputTextureUniform2; + GLint filterPositionAttribute, filterTextureCoordinateAttribute; + GLint filterInputTextureUniform; GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; BOOL preparedToCaptureImage; @@ -60,7 +59,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; CVOpenGLESTextureRef renderTexture; CGSize currentFilterSize; - GPUImageRotationMode inputRotation, inputRotation2; + GPUImageRotationMode inputRotation; } @property(readonly) CVPixelBufferRef renderTarget; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 743e7f468..924dcc54e 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -17,23 +17,6 @@ void main() } ); -NSString *const kGPUImageTwoInputTextureVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec4 inputTextureCoordinate; - attribute vec4 inputTextureCoordinate2; - - varying vec2 textureCoordinate; - varying vec2 textureCoordinate2; - - void main() - { - gl_Position = position; - textureCoordinate = inputTextureCoordinate.xy; - textureCoordinate2 = inputTextureCoordinate2.xy; - } -); - NSString *const kGPUImagePassthroughFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -67,7 +50,6 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad preparedToCaptureImage = NO; _preventRendering = NO; inputRotation = kGPUImageNoRotation; - inputRotation2 = kGPUImageNoRotation; backgroundColorRed = 0.0; backgroundColorGreen = 0.0; backgroundColorBlue = 0.0; @@ -92,18 +74,12 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad filterPositionAttribute = [filterProgram attributeIndex:@"position"]; filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; - filterSecondTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate2"]; filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - filterInputTextureUniform2 = [filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader [filterProgram use]; - NSLog(@"Attributes: %d, %d, %d", filterPositionAttribute, filterTextureCoordinateAttribute, filterSecondTextureCoordinateAttribute); glEnableVertexAttribArray(filterPositionAttribute); - glEnableVertexAttribArray(filterTextureCoordinateAttribute); - - // TODO: Check for validity f - glEnableVertexAttribArray(filterSecondTextureCoordinateAttribute); + glEnableVertexAttribArray(filterTextureCoordinateAttribute); return self; } @@ -135,7 +111,6 @@ - (void)initializeAttributes; { [filterProgram addAttribute:@"position"]; [filterProgram addAttribute:@"inputTextureCoordinate"]; - [filterProgram addAttribute:@"inputTextureCoordinate2"]; // Override this, calling back to this super method, in order to add new attributes to your vertex shader } @@ -444,15 +419,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glUniform1i(filterInputTextureUniform, 2); - if (filterSourceTexture2 != 0) - { - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); - glUniform1i(filterInputTextureUniform2, 3); - - glVertexAttribPointer(filterSecondTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation2]); - } - glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); @@ -594,26 +560,12 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; - (NSInteger)nextAvailableTextureIndex; { - if (filterSourceTexture == 0) - { - return 0; - } - else - { - return 1; - } + return 0; } - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; { - if (textureIndex == 0) - { - filterSourceTexture = newInputTexture; - } - else - { - filterSourceTexture2 = newInputTexture; - } + filterSourceTexture = newInputTexture; } - (void)recreateFilterFBO @@ -672,18 +624,7 @@ - (void)setInputSize:(CGSize)newSize; - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; { - if (textureIndex == 0) - { - NSLog(@"First input rotation: %d", inputRotation); - - inputRotation = newInputRotation; - } - else - { - NSLog(@"Second input rotation: %d", inputRotation2); - - inputRotation2 = newInputRotation; - } + inputRotation = newInputRotation; } - (void)forceProcessingAtSize:(CGSize)frameSize; diff --git a/framework/Source/GPUImageHardLightBlendFilter.h b/framework/Source/GPUImageHardLightBlendFilter.h index 4a2cb2c36..47d62609b 100644 --- a/framework/Source/GPUImageHardLightBlendFilter.h +++ b/framework/Source/GPUImageHardLightBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageHardLightBlendFilter : GPUImageFilter +@interface GPUImageHardLightBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageHardLightBlendFilter.m b/framework/Source/GPUImageHardLightBlendFilter.m index a6aed7862..daa4cfaf5 100644 --- a/framework/Source/GPUImageHardLightBlendFilter.m +++ b/framework/Source/GPUImageHardLightBlendFilter.m @@ -3,7 +3,8 @@ NSString *const kGPUImageHardLightBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; @@ -12,7 +13,7 @@ void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); mediump float luminance = dot(textureColor.rgb, W); mediump vec4 whiteColor = vec4(1.0); diff --git a/framework/Source/GPUImageLightenBlendFilter.h b/framework/Source/GPUImageLightenBlendFilter.h index 60f21e234..b0287c132 100644 --- a/framework/Source/GPUImageLightenBlendFilter.h +++ b/framework/Source/GPUImageLightenBlendFilter.h @@ -1,7 +1,7 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" /// Blends two images by taking the maximum value of each color component between the images -@interface GPUImageLightenBlendFilter : GPUImageFilter +@interface GPUImageLightenBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageLightenBlendFilter.m b/framework/Source/GPUImageLightenBlendFilter.m index 725210684..3d632b532 100644 --- a/framework/Source/GPUImageLightenBlendFilter.m +++ b/framework/Source/GPUImageLightenBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageLightenBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = max(textureColor, textureColor2); } diff --git a/framework/Source/GPUImageMultiplyBlendFilter.h b/framework/Source/GPUImageMultiplyBlendFilter.h index 53b3f7227..5ebc28bbe 100644 --- a/framework/Source/GPUImageMultiplyBlendFilter.h +++ b/framework/Source/GPUImageMultiplyBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageMultiplyBlendFilter : GPUImageFilter +@interface GPUImageMultiplyBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageMultiplyBlendFilter.m b/framework/Source/GPUImageMultiplyBlendFilter.m index 17dd78a97..68d9a125c 100644 --- a/framework/Source/GPUImageMultiplyBlendFilter.m +++ b/framework/Source/GPUImageMultiplyBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageMultiplyBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = textureColor * textureColor2; } diff --git a/framework/Source/GPUImageOverlayBlendFilter.h b/framework/Source/GPUImageOverlayBlendFilter.h index e778b6d78..57eb84026 100644 --- a/framework/Source/GPUImageOverlayBlendFilter.h +++ b/framework/Source/GPUImageOverlayBlendFilter.h @@ -1,5 +1,5 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageOverlayBlendFilter : GPUImageFilter +@interface GPUImageOverlayBlendFilter : GPUImageTwoInputFilter @end diff --git a/framework/Source/GPUImageOverlayBlendFilter.m b/framework/Source/GPUImageOverlayBlendFilter.m index 35c90224d..3d9aa04d7 100644 --- a/framework/Source/GPUImageOverlayBlendFilter.m +++ b/framework/Source/GPUImageOverlayBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageOverlayBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { lowp vec4 base = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 overlay = texture2D(inputImageTexture2, textureCoordinate); + lowp vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = vec4( (base.r < 0.5 ? (2.0 * base.r * overlay.r) : (1.0 - 2.0 * (1.0 - base.r) * (1.0 - overlay.r))), (base.g < 0.5 ? (2.0 * base.g * overlay.g) : (1.0 - 2.0 * (1.0 - base.g) * (1.0 - overlay.g))), diff --git a/framework/Source/GPUImageScreenBlendFilter.h b/framework/Source/GPUImageScreenBlendFilter.h index 9ef8d1c9e..2df3abf30 100644 --- a/framework/Source/GPUImageScreenBlendFilter.h +++ b/framework/Source/GPUImageScreenBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageScreenBlendFilter : GPUImageFilter +@interface GPUImageScreenBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageScreenBlendFilter.m b/framework/Source/GPUImageScreenBlendFilter.m index a22114cbf..4db0b987d 100644 --- a/framework/Source/GPUImageScreenBlendFilter.m +++ b/framework/Source/GPUImageScreenBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageScreenBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); mediump vec4 whiteColor = vec4(1.0); gl_FragColor = whiteColor - ((whiteColor - textureColor2) * (whiteColor - textureColor)); } diff --git a/framework/Source/GPUImageSoftLightBlendFilter.h b/framework/Source/GPUImageSoftLightBlendFilter.h index 2b4ae0f5c..13fc877cc 100644 --- a/framework/Source/GPUImageSoftLightBlendFilter.h +++ b/framework/Source/GPUImageSoftLightBlendFilter.h @@ -1,6 +1,6 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageSoftLightBlendFilter : GPUImageFilter +@interface GPUImageSoftLightBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageSoftLightBlendFilter.m b/framework/Source/GPUImageSoftLightBlendFilter.m index 61c4a6ddc..697ba74ba 100644 --- a/framework/Source/GPUImageSoftLightBlendFilter.m +++ b/framework/Source/GPUImageSoftLightBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageSoftLightBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = 2.0 * textureColor2 * textureColor + textureColor * textureColor - 2.0 * textureColor * textureColor *textureColor2; } ); diff --git a/framework/Source/GPUImageSubtractBlendFilter.h b/framework/Source/GPUImageSubtractBlendFilter.h index 8b9628bff..8dee82150 100644 --- a/framework/Source/GPUImageSubtractBlendFilter.h +++ b/framework/Source/GPUImageSubtractBlendFilter.h @@ -1,5 +1,5 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageSubtractBlendFilter : GPUImageFilter +@interface GPUImageSubtractBlendFilter : GPUImageTwoInputFilter @end diff --git a/framework/Source/GPUImageSubtractBlendFilter.m b/framework/Source/GPUImageSubtractBlendFilter.m index 4e63f5707..b03726ae9 100644 --- a/framework/Source/GPUImageSubtractBlendFilter.m +++ b/framework/Source/GPUImageSubtractBlendFilter.m @@ -3,14 +3,15 @@ NSString *const kGPUImageSubtractBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate2; + uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); gl_FragColor = vec4(textureColor.rgb - textureColor2.rgb, textureColor.a); } diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h new file mode 100644 index 000000000..79976586a --- /dev/null +++ b/framework/Source/GPUImageTwoInputFilter.h @@ -0,0 +1,15 @@ +#import "GPUImageFilter.h" + +extern NSString *const kGPUImageTwoInputTextureVertexShaderString; + +@interface GPUImageTwoInputFilter : GPUImageFilter +{ + GLint filterSecondTextureCoordinateAttribute; + GLint filterInputTextureUniform2; + GPUImageRotationMode inputRotation2; + GLuint filterSourceTexture2; + + BOOL hasSetFirstTexture; +} + +@end diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m new file mode 100644 index 000000000..287fd7c07 --- /dev/null +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -0,0 +1,136 @@ +#import "GPUImageTwoInputFilter.h" + +NSString *const kGPUImageTwoInputTextureVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + attribute vec4 inputTextureCoordinate2; + + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + void main() + { + gl_Position = position; + textureCoordinate = inputTextureCoordinate.xy; + textureCoordinate2 = inputTextureCoordinate2.xy; + } + ); + + +@implementation GPUImageTwoInputFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [self initWithVertexShaderFromString:kGPUImageTwoInputTextureVertexShaderString fragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + return self; +} + +- (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithVertexShaderFromString:vertexShaderString fragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + inputRotation2 = kGPUImageNoRotation; + filterSecondTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate2"]; + filterInputTextureUniform2 = [filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + + hasSetFirstTexture = NO; + + glEnableVertexAttribArray(filterSecondTextureCoordinateAttribute); + + return self; +} + +- (void)initializeAttributes; +{ + [super initializeAttributes]; + + [filterProgram addAttribute:@"inputTextureCoordinate2"]; +} + +#pragma mark - +#pragma mark Rendering + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + if (self.preventRendering) + { + return; + } + + [GPUImageOpenGLESContext useImageProcessingContext]; + [self setFilterFBO]; + + [filterProgram use]; + + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, sourceTexture); + glUniform1i(filterInputTextureUniform, 2); + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + glUniform1i(filterInputTextureUniform2, 3); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + glVertexAttribPointer(filterSecondTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation2]); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +#pragma mark - +#pragma mark GPUImageInput + +- (NSInteger)nextAvailableTextureIndex; +{ + if (hasSetFirstTexture) + { + return 1; + } + else + { + return 0; + } +} + +- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +{ + if (textureIndex == 0) + { + filterSourceTexture = newInputTexture; + hasSetFirstTexture = YES; + } + else + { + filterSourceTexture2 = newInputTexture; + } +} + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + if (textureIndex == 0) + { + inputRotation = newInputRotation; + } + else + { + inputRotation2 = newInputRotation; + } +} + + + +@end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 1acc57252..ff5e4c3ee 100644 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -223,14 +223,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glUniform1i(secondFilterInputTextureUniform, 3); - if (filterSourceTexture2 != 0) - { - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); - - glUniform1i(secondFilterInputTextureUniform2, 4); - } - glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index aeb82f370..42a4c7784 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -244,6 +244,8 @@ - (AVCaptureDevicePosition)cameraPosition return [[videoInput device] position]; } +#define INITIALFRAMESTOIGNOREFORBENCHMARK 5 + - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { if (capturePaused) @@ -308,11 +310,14 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; if (_runBenchmark) { - CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); - totalFrameTimeDuringCapture += currentFrameTime; numberOfFramesCaptured++; - NSLog(@"Average frame time : %f ms", 1000.0 * (totalFrameTimeDuringCapture / numberOfFramesCaptured)); - NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); + if (numberOfFramesCaptured > INITIALFRAMESTOIGNOREFORBENCHMARK) + { + CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); + totalFrameTimeDuringCapture += currentFrameTime; + NSLog(@"Average frame time : %f ms", [self averageFrameDurationDuringCapture]); + NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); + } } } else @@ -342,11 +347,12 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; if (_runBenchmark) { - CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); - totalFrameTimeDuringCapture += currentFrameTime; numberOfFramesCaptured++; - // NSLog(@"Average frame time : %f ms", 1000.0 * (totalFrameTimeDuringCapture / numberOfFramesCaptured)); - // NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); + if (numberOfFramesCaptured > INITIALFRAMESTOIGNOREFORBENCHMARK) + { + CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); + totalFrameTimeDuringCapture += currentFrameTime; + } } } } @@ -361,8 +367,7 @@ - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (CGFloat)averageFrameDurationDuringCapture; { - NSLog(@"Number of frames: %d", numberOfFramesCaptured); - return (totalFrameTimeDuringCapture / (CGFloat)numberOfFramesCaptured) * 1000.0; + return (totalFrameTimeDuringCapture / (CGFloat)(numberOfFramesCaptured - INITIALFRAMESTOIGNOREFORBENCHMARK)) * 1000.0; } #pragma mark - From 38c31fe473602bc0ef9d42d9733266d88487b800 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 9 May 2012 18:01:03 -0500 Subject: [PATCH 072/695] Fixed all of the filters except tilt shift, which is focused sideways, and the crop filter, which isn't picking from the right region. --- .../ColorTrackingViewController.h | 2 +- .../ColorTrackingViewController.m | 17 +-- framework/Source/GPUImage.h | 1 + .../Source/GPUImageAdaptiveThresholdFilter.m | 13 +- framework/Source/GPUImageFilter.h | 1 + framework/Source/GPUImageFilter.m | 31 +++-- framework/Source/GPUImageFilterGroup.m | 4 +- .../GPUImageGaussianSelectiveBlurFilter.h | 16 +-- .../GPUImageGaussianSelectiveBlurFilter.m | 122 ++++++++---------- framework/Source/GPUImageMovie.m | 14 +- framework/Source/GPUImageMovieWriter.m | 2 +- framework/Source/GPUImageOpenGLESContext.h | 2 +- framework/Source/GPUImageOutput.m | 12 +- framework/Source/GPUImagePicture.m | 11 +- framework/Source/GPUImageRawData.m | 2 +- framework/Source/GPUImageTextureInput.m | 5 +- framework/Source/GPUImageTextureOutput.m | 2 +- framework/Source/GPUImageTiltShiftFilter.m | 6 +- framework/Source/GPUImageTwoInputFilter.m | 22 ++++ framework/Source/GPUImageUnsharpMaskFilter.m | 6 +- framework/Source/GPUImageVideoCamera.m | 20 +-- framework/Source/GPUImageView.m | 92 +++++++++++-- 22 files changed, 257 insertions(+), 146 deletions(-) diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h index ca66ede1f..51712b23e 100644 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h @@ -8,7 +8,7 @@ typedef enum { PASSTHROUGH_VIDEO, SIMPLE_THRESHOLDING, POSITION_THRESHOLDING, OB CALayer *trackingDot; GPUImageVideoCamera *videoCamera; - GPUImageFilter *rotationFilter, *thresholdFilter, *positionFilter; + GPUImageFilter *thresholdFilter, *positionFilter; GPUImageRawData *positionRawData, *videoRawData; GPUImageView *filteredVideoView; diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index 192223589..e0a0dcec4 100644 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -74,9 +74,6 @@ - (void)configureVideoFiltering; [videoCamera addTarget:filteredVideoView]; [videoCamera addTarget:videoRawData]; -// [rotationFilter addTarget:positionFilter]; -// [positionFilter addTarget:filteredVideoView]; -// [positionFilter addTarget:videoRawData]; [videoCamera startCameraCapture]; } @@ -146,31 +143,31 @@ - (void)handleSwitchOfDisplayMode:(id)sender; trackingDot.opacity = 0.0f; } - [rotationFilter removeAllTargets]; + [videoCamera removeAllTargets]; [positionFilter removeAllTargets]; [thresholdFilter removeAllTargets]; - [rotationFilter addTarget:videoRawData]; + [videoCamera addTarget:videoRawData]; switch(displayMode) { case PASSTHROUGH_VIDEO: { - [rotationFilter addTarget:filteredVideoView]; + [videoCamera addTarget:filteredVideoView]; }; break; case SIMPLE_THRESHOLDING: { - [rotationFilter addTarget:thresholdFilter]; + [videoCamera addTarget:thresholdFilter]; [thresholdFilter addTarget:filteredVideoView]; }; break; case POSITION_THRESHOLDING: { - [rotationFilter addTarget:positionFilter]; + [videoCamera addTarget:positionFilter]; [positionFilter addTarget:filteredVideoView]; }; break; case OBJECT_TRACKING: { - [rotationFilter addTarget:filteredVideoView]; - [rotationFilter addTarget:positionFilter]; + [videoCamera addTarget:filteredVideoView]; + [videoCamera addTarget:positionFilter]; [positionFilter addTarget:positionRawData]; }; break; } diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 6e975eaf3..0e57b2201 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -17,6 +17,7 @@ // Filters #import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" #import "GPUImagePixellateFilter.h" #import "GPUImageSepiaFilter.h" #import "GPUImageColorInvertFilter.h" diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.m b/framework/Source/GPUImageAdaptiveThresholdFilter.m index df90f83e2..b3f533249 100644 --- a/framework/Source/GPUImageAdaptiveThresholdFilter.m +++ b/framework/Source/GPUImageAdaptiveThresholdFilter.m @@ -1,23 +1,26 @@ #import "GPUImageAdaptiveThresholdFilter.h" #import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" #import "GPUImageGrayscaleFilter.h" #import "GPUImageBoxBlurFilter.h" NSString *const kGPUImageAdaptiveThresholdFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; void main() { - highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - highp float localLuminance = texture2D(inputImageTexture2, textureCoordinate).r; - highp float thresholdResult = step(localLuminance - 0.05, textureColor.r); + highp float blurredInput = texture2D(inputImageTexture, textureCoordinate).r; + highp float localLuminance = texture2D(inputImageTexture2, textureCoordinate2).r; + highp float thresholdResult = step(blurredInput - 0.05, localLuminance); - gl_FragColor = vec4(vec3(thresholdResult), textureColor.w); + gl_FragColor = vec4(vec3(thresholdResult), 1.0); // gl_FragColor = vec4(localLuminance, textureColor.r, 0.0, textureColor.w); +// gl_FragColor = vec4(localLuminance, localLuminance, localLuminance, 1.0); } ); @@ -39,7 +42,7 @@ - (id)init; [self addFilter:boxBlurFilter]; // Third pass: compare the blurred background luminance to the local value - GPUImageFilter *adaptiveThresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageAdaptiveThresholdFragmentShaderString]; + GPUImageFilter *adaptiveThresholdFilter = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kGPUImageAdaptiveThresholdFragmentShaderString]; [self addFilter:adaptiveThresholdFilter]; [luminanceFilter addTarget:boxBlurFilter]; diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 85872fb62..efc66cdd1 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -90,6 +90,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (id)initWithFragmentShaderFromFile:(NSString *)fragmentShaderFilename; - (void)initializeAttributes; - (void)setupFilterForSize:(CGSize)filterFrameSize; +- (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; - (void)recreateFilterFBO; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 924dcc54e..e1187435e 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -431,13 +431,15 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; { if (currentTarget != self.targetToIgnoreForUpdates) { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [self setInputTextureForTarget:currentTarget atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; } - [currentTarget setInputSize:[self outputFrameSize]]; + [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; [currentTarget newFrameReadyAtTime:frameTime]; } } @@ -582,7 +584,20 @@ - (void)recreateFilterFBO [self setFilterFBO]; } -- (void)setInputSize:(CGSize)newSize; +- (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; +{ + CGSize rotatedSize = sizeToRotate; + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + rotatedSize.width = sizeToRotate.height; + rotatedSize.height = sizeToRotate.width; + } + + return rotatedSize; +} + +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { if (self.preventRendering) { @@ -603,13 +618,7 @@ - (void)setInputSize:(CGSize)newSize; } } - CGSize rotatedSize = newSize; - - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - rotatedSize.width = newSize.height; - rotatedSize.height = newSize.width; - } + CGSize rotatedSize = [self rotatedSize:newSize forIndex:textureIndex]; if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (CGSizeEqualToSize(rotatedSize, CGSizeZero)) ) { diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 5410368af..f53bcf3cf 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -110,11 +110,11 @@ - (NSInteger)nextAvailableTextureIndex; return 0; } -- (void)setInputSize:(CGSize)newSize; +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { for (GPUImageOutput *currentFilter in _initialFilters) { - [currentFilter setInputSize:newSize]; + [currentFilter setInputSize:newSize atIndex:textureIndex]; } } diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h index 1800d2507..919c40a70 100644 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h @@ -1,11 +1,11 @@ -#import "GPUImageGaussianBlurFilter.h" - -@interface GPUImageGaussianSelectiveBlurFilter : GPUImageGaussianBlurFilter { - GLint verticalExcludeCircleRadiusUniform, - verticalExcludeCirclePointUniform, - verticalExcludeCircleBlurSizeUniform; - - GLuint originalInputImageTexture; +#import "GPUImageFilterGroup.h" + +@class GPUImageGaussianBlurFilter; + +@interface GPUImageGaussianSelectiveBlurFilter : GPUImageFilterGroup +{ + GPUImageGaussianBlurFilter *blurFilter; + GPUImageFilter *selectiveFocusFilter; } @property (readwrite, nonatomic) CGFloat excludeCircleRadius; diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index 339acfec4..eaa692e60 100644 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -1,41 +1,27 @@ #import "GPUImageGaussianSelectiveBlurFilter.h" +#import "GPUImageGaussianBlurFilter.h" +#import "GPUImageTwoInputFilter.h" -NSString *const kGPUImageGaussianSelectiveBlurVerticalFragmentShaderString = SHADER_STRING -( - uniform sampler2D inputImageTexture; - uniform sampler2D inputImageTexture2; // The un-blurred image +NSString *const kGPUImageGaussianSelectiveBlurFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; - const lowp int GAUSSIAN_SAMPLES = 9; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; uniform lowp float excludeCircleRadius; uniform lowp vec2 excludeCirclePoint; uniform lowp float excludeBlurSize; - uniform mediump float gaussianValues[9]; - - varying highp vec2 textureCoordinate; - varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - - void main() { + void main() + { + lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); - lowp vec4 sum = vec4(0.0); - - sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; - sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; - sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; - - lowp vec4 overlay = texture2D(inputImageTexture2, textureCoordinate); lowp float d = distance(textureCoordinate, excludeCirclePoint); - sum = mix(overlay, sum, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, d)); - - gl_FragColor = sum; + gl_FragColor = mix(sharpImageColor, blurredImageColor, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, d)); } ); @@ -45,21 +31,30 @@ @implementation GPUImageGaussianSelectiveBlurFilter - (id)init; { - if (!(self = [super initWithFirstStageVertexShaderFromString:nil - firstStageFragmentShaderFromString:nil - secondStageVertexShaderFromString:nil - secondStageFragmentShaderFromString:kGPUImageGaussianSelectiveBlurVerticalFragmentShaderString])) { - return nil; + if (!(self = [super init])) + { + return nil; } - verticalExcludeCircleBlurSizeUniform = [secondFilterProgram uniformIndex:@"excludeBlurSize"]; - verticalExcludeCirclePointUniform = [secondFilterProgram uniformIndex:@"excludeCirclePoint"]; - verticalExcludeCircleRadiusUniform = [secondFilterProgram uniformIndex:@"excludeCircleRadius"]; + // First pass: apply a variable Gaussian blur + blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; + [self addFilter:blurFilter]; + + // Second pass: combine the blurred image with the original sharp one + selectiveFocusFilter = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kGPUImageGaussianSelectiveBlurFragmentShaderString]; + [self addFilter:selectiveFocusFilter]; + + // Texture location 0 needs to be the sharp image for both the blur and the second stage processing + [blurFilter addTarget:selectiveFocusFilter atTextureLocation:1]; + + // To prevent double updating of this filter, disable updates from the sharp image side + self.targetToIgnoreForUpdates = selectiveFocusFilter; - // Set up defaults + self.initialFilters = [NSArray arrayWithObjects:blurFilter, selectiveFocusFilter, nil]; + self.terminalFilter = selectiveFocusFilter; self.blurSize = 2.0; - + self.excludeCircleRadius = 60.0/320.0; self.excludeCirclePoint = CGPointMake(0.5f, 0.5f); self.excludeBlurSize = 30.0/320.0; @@ -67,44 +62,35 @@ - (id)init; return self; } -- (void) setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex { - if (textureIndex == 0) { - [super setInputTexture:newInputTexture atIndex:0]; - [super setInputTexture:newInputTexture atIndex:1]; - } +#pragma mark - +#pragma mark Accessors + +- (void)setBlurSize:(CGFloat)newValue; +{ + blurFilter.blurSize = newValue; } -#pragma mark Getters and Setters +- (CGFloat)blurSize; +{ + return blurFilter.blurSize; +} -- (void) setExcludeCirclePoint:(CGPoint)excludeCirclePoint { - _excludeCirclePoint = excludeCirclePoint; - - GLfloat excludeCirclePosition[2]; - excludeCirclePosition[0] = _excludeCirclePoint.x; - excludeCirclePosition[1] = _excludeCirclePoint.y; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - - glUniform2fv(verticalExcludeCirclePointUniform, 1, excludeCirclePosition); +- (void)setExcludeCirclePoint:(CGPoint)newValue; +{ + _excludeCirclePoint = newValue; + [selectiveFocusFilter setPoint:newValue forUniform:@"excludeCirclePoint"]; } -- (void) setExcludeCircleRadius:(CGFloat)excludeCircleRadius { - _excludeCircleRadius = excludeCircleRadius; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - - glUniform1f(verticalExcludeCircleRadiusUniform, _excludeCircleRadius); +- (void)setExcludeCircleRadius:(CGFloat)newValue; +{ + _excludeCircleRadius = newValue; + [selectiveFocusFilter setFloat:newValue forUniform:@"excludeCircleRadius"]; } -- (void) setExcludeBlurSize:(CGFloat)excludeBlurSize { - _excludeBlurSize = excludeBlurSize; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - - glUniform1f(verticalExcludeCircleBlurSizeUniform, _excludeBlurSize); +- (void)setExcludeBlurSize:(CGFloat)newValue; +{ + _excludeBlurSize = newValue; + [selectiveFocusFilter setFloat:newValue forUniform:@"excludeBlurSize"]; } @end diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index c3fb05850..a6fe2fc99 100644 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -210,11 +210,12 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); for (id currentTarget in targets) - { - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; - + { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; + [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; [currentTarget newFrameReadyAtTime:currentSampleTime]; } @@ -238,7 +239,10 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; CGSize currentSize = CGSizeMake(bufferWidth, bufferHeight); for (id currentTarget in targets) { - [currentTarget setInputSize:currentSize]; + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:currentSize atIndex:targetTextureIndex]; [currentTarget newFrameReadyAtTime:currentSampleTime]; } CVPixelBufferUnlockBaseAddress(movieFrame, 0); diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 7636765fa..a2639a091 100644 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -494,7 +494,7 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg inputRotation = newInputRotation; } -- (void)setInputSize:(CGSize)newSize; +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { } diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 10c328792..f7c270e20 100644 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -32,7 +32,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (void)newFrameReadyAtTime:(CMTime)frameTime; - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; -- (void)setInputSize:(CGSize)newSize; +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; - (CGSize)maximumOutputSize; - (void)endProcessing; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 5cab68480..9ad7fdb1d 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -112,10 +112,12 @@ - (void)removeTarget:(id)targetToRemove; } cachedMaximumOutputSize = CGSizeZero; - [targetToRemove setInputSize:CGSizeZero]; NSInteger indexOfObject = [targets indexOfObject:targetToRemove]; - [targetToRemove setInputTexture:0 atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; + [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; + [targetTextureIndices removeObjectAtIndex:indexOfObject]; [targets removeObject:targetToRemove]; } @@ -125,10 +127,12 @@ - (void)removeAllTargets; cachedMaximumOutputSize = CGSizeZero; for (id targetToRemove in targets) { - [targetToRemove setInputSize:CGSizeZero]; - NSInteger indexOfObject = [targets indexOfObject:targetToRemove]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputTexture:0 atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; } [targets removeAllObjects]; [targetTextureIndices removeAllObjects]; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 43626646a..e62db3c5d 100644 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -46,7 +46,7 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly GLubyte *imageData = NULL; CFDataRef dataFromImageDataProvider; - CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); +// CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); if (shouldRedrawUsingCoreGraphics) { @@ -67,8 +67,8 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); } - elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; - NSLog(@"Core Graphics drawing time: %f", elapsedTime); +// elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; +// NSLog(@"Core Graphics drawing time: %f", elapsedTime); glBindTexture(GL_TEXTURE_2D, outputTexture); if (self.shouldSmoothlyScaleOutput) @@ -105,7 +105,10 @@ - (void)processImage; for (id currentTarget in targets) { - [currentTarget setInputSize:pixelSizeOfImage]; + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; } } diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawData.m index e21e7c92b..6e38a4429 100644 --- a/framework/Source/GPUImageRawData.m +++ b/framework/Source/GPUImageRawData.m @@ -296,7 +296,7 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg inputRotation = newInputRotation; } -- (void)setInputSize:(CGSize)newSize; +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { } diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index 9b9134f01..a50fbe332 100644 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -27,7 +27,10 @@ - (void)processTexture; { for (id currentTarget in targets) { - [currentTarget setInputSize:textureSize]; + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:textureSize atIndex:targetTextureIndex]; [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; } } diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index d8c729d87..354979b9d 100644 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -27,7 +27,7 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg { } -- (void)setInputSize:(CGSize)newSize; +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { } diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index 5f5241f46..fab51f594 100644 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -1,10 +1,12 @@ #import "GPUImageTiltShiftFilter.h" #import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" #import "GPUImageGaussianBlurFilter.h" NSString *const kGPUImageTiltShiftFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; @@ -16,7 +18,7 @@ void main() { lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate); + lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); lowp float blurIntensity = 1.0 - smoothstep(topFocusLevel - focusFallOffRate, topFocusLevel, textureCoordinate.y); blurIntensity += smoothstep(bottomFocusLevel, bottomFocusLevel + focusFallOffRate, textureCoordinate.y); @@ -44,7 +46,7 @@ - (id)init; [self addFilter:blurFilter]; // Second pass: combine the blurred image with the original sharp one - tiltShiftFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageTiltShiftFragmentShaderString]; + tiltShiftFilter = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kGPUImageTiltShiftFragmentShaderString]; [self addFilter:tiltShiftFilter]; // Texture location 0 needs to be the sharp image for both the blur and the second stage processing diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 287fd7c07..8ddabaca5 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -131,6 +131,28 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg } } +- (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; +{ + CGSize rotatedSize = sizeToRotate; + + GPUImageRotationMode rotationToCheck; + if (textureIndex == 0) + { + rotationToCheck = inputRotation; + } + else + { + rotationToCheck = inputRotation2; + } + + if (GPUImageRotationSwapsWidthAndHeight(rotationToCheck)) + { + rotatedSize.width = sizeToRotate.height; + rotatedSize.height = sizeToRotate.width; + } + + return rotatedSize; +} @end diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index 89433b5f9..8a557709a 100644 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -1,10 +1,12 @@ #import "GPUImageUnsharpMaskFilter.h" #import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" #import "GPUImageGaussianBlurFilter.h" NSString *const kGPUImageUnsharpMaskFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; @@ -14,7 +16,7 @@ void main() { lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec3 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate).rgb; + lowp vec3 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2).rgb; gl_FragColor = vec4(sharpImageColor.rgb * intensity + blurredImageColor * (1.0 - intensity), sharpImageColor.a); // gl_FragColor = mix(blurredImageColor, sharpImageColor, intensity); @@ -39,7 +41,7 @@ - (id)init; [self addFilter:blurFilter]; // Second pass: combine the blurred image with the original sharp one - unsharpMaskFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageUnsharpMaskFragmentShaderString]; + unsharpMaskFilter = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kGPUImageUnsharpMaskFragmentShaderString]; [self addFilter:unsharpMaskFilter]; // Texture location 0 needs to be the sharp image for both the blur and the second stage processing diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 42a4c7784..452775903 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -283,21 +283,22 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; for (id currentTarget in targets) { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + if (currentTarget != self.targetToIgnoreForUpdates) { - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:currentTime]; } else { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [currentTarget setInputTexture:outputTexture atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; } } @@ -338,7 +339,10 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { if (currentTarget != self.targetToIgnoreForUpdates) { - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight)]; + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:currentTime]; } } diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index e5c7fc558..ed9e590f5 100644 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -238,6 +238,13 @@ - (void)recalculateViewGeometry; imageVertices[5] = heightScaling; imageVertices[6] = widthScaling; imageVertices[7] = heightScaling; + +// static const GLfloat imageVertices[] = { +// -1.0f, -1.0f, +// 1.0f, -1.0f, +// -1.0f, 1.0f, +// 1.0f, 1.0f, +// }; } - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; @@ -248,6 +255,68 @@ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponen backgroundColorAlpha = alphaComponent; } ++ (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; +{ +// static const GLfloat noRotationTextureCoordinates[] = { +// 0.0f, 0.0f, +// 1.0f, 0.0f, +// 0.0f, 1.0f, +// 1.0f, 1.0f, +// }; + + static const GLfloat noRotationTextureCoordinates[] = { + 0.0f, 1.0f, + 1.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 0.0f, + }; + + static const GLfloat rotateRightTextureCoordinates[] = { + 1.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 0.0f, 0.0f, + }; + + static const GLfloat rotateLeftTextureCoordinates[] = { + 0.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 0.0f, + 1.0f, 1.0f, + }; + + static const GLfloat verticalFlipTextureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat horizontalFlipTextureCoordinates[] = { + 1.0f, 1.0f, + 0.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 0.0f, + }; + + static const GLfloat rotateRightVerticalFlipTextureCoordinates[] = { + 1.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 0.0f, + 0.0f, 1.0f, + }; + + switch(rotationMode) + { + case kGPUImageNoRotation: return noRotationTextureCoordinates; + case kGPUImageRotateLeft: return rotateLeftTextureCoordinates; + case kGPUImageRotateRight: return rotateRightTextureCoordinates; + case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; + case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; + case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; + } +} + #pragma mark - #pragma mark GPUInput protocol @@ -261,19 +330,12 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - static const GLfloat textureCoordinates[] = { - 0.0f, 1.0f, - 1.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 0.0f, - }; - glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); glUniform1i(displayInputTextureUniform, 4); glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); - glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -295,11 +357,19 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg inputRotation = newInputRotation; } -- (void)setInputSize:(CGSize)newSize; +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { - if (!CGSizeEqualToSize(inputImageSize, newSize)) + CGSize rotatedSize = newSize; + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + rotatedSize.width = newSize.height; + rotatedSize.height = newSize.width; + } + + if (!CGSizeEqualToSize(inputImageSize, rotatedSize)) { - inputImageSize = newSize; + inputImageSize = rotatedSize; [self recalculateViewGeometry]; } } From 26fa4ca1a9e9bb1764b69b4fb7af3d62d4640c9d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 9 May 2012 18:35:21 -0500 Subject: [PATCH 073/695] Fixed the tilt shift filter and the two most important orientations of the crop filter. The new rotation implementation should now be usable. --- .../ShowcaseFilterViewController.m | 6 +- framework/Source/GPUImageCropFilter.m | 58 ++++++++----------- framework/Source/GPUImageTiltShiftFilter.m | 4 +- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 61cbabda9..7945be9cc 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -236,11 +236,11 @@ - (void)setupFilter; self.title = @"Crop"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:0.3]; + [self.filterSettingsSlider setMinimumValue:0.2]; [self.filterSettingsSlider setMaximumValue:1.0]; [self.filterSettingsSlider setValue:0.5]; - filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 0.5, 0.25)]; + filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 1.0, 0.25)]; }; break; case GPUIMAGE_MASK: { @@ -789,7 +789,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)filter setExcludeCircleRadius:[(UISlider*)sender value]]; break; case GPUIMAGE_FILTERGROUP: [(GPUImagePixellateFilter *)[(GPUImageFilterGroup *)filter filterAtIndex:1] setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; - case GPUIMAGE_CROP: [(GPUImageCropFilter *)filter setCropRegion:CGRectMake(0.0, 0.0, [(UISlider*)sender value], [(UISlider*)sender value] * 0.5)]; break; + case GPUIMAGE_CROP: [(GPUImageCropFilter *)filter setCropRegion:CGRectMake(0.0, 0.0, 1.0, [(UISlider*)sender value])]; break; case GPUIMAGE_TRANSFORM: [(GPUImageTransformFilter *)filter setAffineTransform:CGAffineTransformMakeRotation([(UISlider*)sender value])]; break; case GPUIMAGE_TRANSFORM3D: { diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 5ec44f17e..c384a4352 100644 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -53,17 +53,9 @@ - (id)init; - (CGSize)outputFrameSize; { CGSize adjustedSize; - - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - adjustedSize.width = inputTextureSize.height * _cropRegion.size.width; - adjustedSize.height = inputTextureSize.width * _cropRegion.size.height; - } - else - { - adjustedSize.width = inputTextureSize.width * _cropRegion.size.width; - adjustedSize.height = inputTextureSize.height * _cropRegion.size.height; - } + + adjustedSize.width = inputTextureSize.width * _cropRegion.size.width; + adjustedSize.height = inputTextureSize.height * _cropRegion.size.height; return adjustedSize; } @@ -80,7 +72,7 @@ - (void)calculateCropTextureCoordinates; switch(inputRotation) { - case kGPUImageNoRotation: + case kGPUImageNoRotation: // Works { cropTextureCoordinates[0] = minX; // 0,0 cropTextureCoordinates[1] = minY; @@ -94,7 +86,7 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[4] = maxX; // 1,1 cropTextureCoordinates[5] = maxY; }; break; - case kGPUImageRotateLeft: + case kGPUImageRotateLeft: // Broken { cropTextureCoordinates[0] = maxX; // 1,0 cropTextureCoordinates[1] = minY; @@ -108,21 +100,21 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = minX; // 0,1 cropTextureCoordinates[7] = maxY; }; break; - case kGPUImageRotateRight: + case kGPUImageRotateRight: // Fixed { - cropTextureCoordinates[0] = minX; // 0,1 - cropTextureCoordinates[1] = maxY; + cropTextureCoordinates[0] = minY; // 0,1 + cropTextureCoordinates[1] = 1.0 - minX; - cropTextureCoordinates[2] = minX; // 0,0 - cropTextureCoordinates[3] = minY; + cropTextureCoordinates[2] = minY; // 0,0 + cropTextureCoordinates[3] = 1.0 - maxX; - cropTextureCoordinates[4] = maxX; // 1,1 - cropTextureCoordinates[5] = maxY; + cropTextureCoordinates[4] = maxY; // 1,1 + cropTextureCoordinates[5] = 1.0 - minX; - cropTextureCoordinates[6] = maxX; // 1,0 - cropTextureCoordinates[7] = minY; + cropTextureCoordinates[6] = maxY; // 1,0 + cropTextureCoordinates[7] = 1.0 - maxX; }; break; - case kGPUImageFlipVertical: + case kGPUImageFlipVertical: // Broken { cropTextureCoordinates[0] = minX; // 0,1 cropTextureCoordinates[1] = maxY; @@ -136,7 +128,7 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = maxX; // 1,0 cropTextureCoordinates[7] = minY; }; break; - case kGPUImageFlipHorizonal: + case kGPUImageFlipHorizonal: // Broken { cropTextureCoordinates[0] = maxX; // 1,0 cropTextureCoordinates[1] = minY; @@ -150,19 +142,19 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = minX; // 0,1 cropTextureCoordinates[7] = maxY; }; break; - case kGPUImageRotateRightFlipVertical: + case kGPUImageRotateRightFlipVertical: // Fixed { - cropTextureCoordinates[0] = minX; // 0,0 - cropTextureCoordinates[1] = minY; + cropTextureCoordinates[0] = minY; // 0,0 + cropTextureCoordinates[1] = 1.0 - maxX; - cropTextureCoordinates[2] = minX; // 0,1 - cropTextureCoordinates[3] = maxY; + cropTextureCoordinates[2] = minY; // 0,1 + cropTextureCoordinates[3] = 1.0 - minX; - cropTextureCoordinates[4] = maxX; // 1,0 - cropTextureCoordinates[5] = minY; + cropTextureCoordinates[4] = maxY; // 1,0 + cropTextureCoordinates[5] = 1.0 - maxX; - cropTextureCoordinates[6] = maxX; // 1,1 - cropTextureCoordinates[7] = maxY; + cropTextureCoordinates[6] = maxY; // 1,1 + cropTextureCoordinates[7] = 1.0 - minX; }; break; } } diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index fab51f594..b3b583a1a 100644 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -20,8 +20,8 @@ void main() lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); - lowp float blurIntensity = 1.0 - smoothstep(topFocusLevel - focusFallOffRate, topFocusLevel, textureCoordinate.y); - blurIntensity += smoothstep(bottomFocusLevel, bottomFocusLevel + focusFallOffRate, textureCoordinate.y); + lowp float blurIntensity = 1.0 - smoothstep(topFocusLevel - focusFallOffRate, topFocusLevel, textureCoordinate2.y); + blurIntensity += smoothstep(bottomFocusLevel, bottomFocusLevel + focusFallOffRate, textureCoordinate2.y); gl_FragColor = mix(sharpImageColor, blurredImageColor, blurIntensity); } From 069accd75f2d29a99d74f131f4172e3a5ae95e6e Mon Sep 17 00:00:00 2001 From: Josh Holat Date: Thu, 10 May 2012 09:40:51 -0500 Subject: [PATCH 074/695] Add RGB filter that allows settings of R, G, and B values seperately, add example of it to filter showcase --- README.md | 2 +- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 13 + .../Contents/Info.plist | 20 + .../Contents/Resources/DWARF/FilterShowcase | Bin 0 -> 626035 bytes .../FilterShowcase.app/CustomFilter.fsh | 19 + .../FilterShowcase.app/FilterShowcase | Bin 0 -> 495712 bytes .../FilterShowcase.app/Info.plist | Bin 0 -> 1210 bytes .../Debug-iphoneos/FilterShowcase.app/PkgInfo | 1 + .../FilterShowcase.app/ResourceRules.plist | 25 + .../SampleConfiguration.plist | Bin 0 -> 245 bytes .../ShowcaseFilterViewController.nib | Bin 0 -> 1142 bytes .../FilterShowcase.app/WID-small.jpg | Bin 0 -> 1155252 bytes .../_CodeSignature/CodeResources | 60 ++ .../embedded.mobileprovision | Bin 0 -> 9946 bytes .../en.lproj/InfoPlist.strings | Bin 0 -> 42 bytes .../FilterShowcase.app/mask.png | Bin 0 -> 960433 bytes .../FilterShowcase-all-target-headers.hmap | Bin 0 -> 793 bytes .../FilterShowcase-generated-files.hmap | Bin 0 -> 121 bytes .../FilterShowcase-own-target-headers.hmap | Bin 0 -> 793 bytes .../FilterShowcase-project-headers.hmap | Bin 0 -> 967 bytes .../FilterShowcase.build/FilterShowcase.dep | 19 + .../FilterShowcase.build/FilterShowcase.hmap | Bin 0 -> 1735 bytes .../FilterShowcase.build/FilterShowcase.xcent | 14 + .../FilterShowcase.build/FilterShowcase~.dep | 19 + .../armv7/FilterShowcase.LinkFileList | 4 + .../armv7/ShowcaseAppDelegate.d | 4 + .../armv7/ShowcaseAppDelegate.dia | Bin 0 -> 220 bytes .../armv7/ShowcaseAppDelegate.o | Bin 0 -> 62240 bytes .../armv7/ShowcaseFilterListController.d | 83 ++ .../armv7/ShowcaseFilterListController.dia | Bin 0 -> 220 bytes .../armv7/ShowcaseFilterListController.o | Bin 0 -> 71460 bytes .../armv7/ShowcaseFilterViewController.d | 83 ++ .../armv7/ShowcaseFilterViewController.dia | Bin 0 -> 220 bytes .../armv7/ShowcaseFilterViewController.o | Bin 0 -> 122256 bytes .../Objects-normal/armv7/main.d | 3 + .../Objects-normal/armv7/main.dia | Bin 0 -> 220 bytes .../Objects-normal/armv7/main.o | Bin 0 -> 3468 bytes .../FilterShowcase.build/build-state.dat | 859 ++++++++++++++++++ .../FilterShowcase.build/build-state~.dat | 359 ++++++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImageRGBFilter.h | 14 + framework/Source/GPUImageRGBFilter.m | 77 ++ 44 files changed, 1687 insertions(+), 1 deletion(-) create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Info.plist create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Resources/DWARF/FilterShowcase create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh create mode 100755 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/_CodeSignature/CodeResources create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings create mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.dep create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.hmap create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase~.dep create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.dia create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.d create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.dia create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state.dat create mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state~.dat create mode 100755 framework/Source/GPUImageRGBFilter.h create mode 100755 framework/Source/GPUImageRGBFilter.m diff --git a/README.md b/README.md index fc37ece06..caa7eda02 100644 --- a/README.md +++ b/README.md @@ -227,7 +227,7 @@ It is generated as a build phase using appledoc. To disable documentation buildi - **GPUImageVignetteFilter**: Performs a vignetting effect, fading out the image at the edges - *x*: - - *y*: The directional intensity of the vignetting, with a default of x = 0.5, y = 0.75 + - *y*: The directional intensity of the vignetting, with a default of x = 0.75, y = 0.5 - **GPUImageKuwaharaFilter**: Kuwahara image abstraction, drawn from the work of Kyprianidis, et. al. in their publication "Anisotropic Kuwahara Filtering on the GPU" within the GPU Pro collection. This produces an oil-painting-like image, but it is extremely computationally expensive, so it can take seconds to render a frame on an iPad 2. This might be best used for still images. - *radius*: In integer specifying the number of pixels out from the center pixel to test when applying the filter, with a default of 4. A higher value creates a more abstracted image, but at the cost of much greater processing time. diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index dfc4fce1b..1f9e3eff2 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -65,6 +65,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_CONTRAST: cell.textLabel.text = @"Contrast"; break; case GPUIMAGE_BRIGHTNESS: cell.textLabel.text = @"Brightness"; break; case GPUIMAGE_EXPOSURE: cell.textLabel.text = @"Exposure"; break; + case GPUIMAGE_RGB: cell.textLabel.text = @"RGB"; break; case GPUIMAGE_SHARPEN: cell.textLabel.text = @"Sharpen"; break; case GPUIMAGE_UNSHARPMASK: cell.textLabel.text = @"Unsharp mask"; break; case GPUIMAGE_GAMMA: cell.textLabel.text = @"Gamma"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 4dc9cb78d..293ca77e0 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -6,6 +6,7 @@ typedef enum { GPUIMAGE_CONTRAST, GPUIMAGE_BRIGHTNESS, GPUIMAGE_EXPOSURE, + GPUIMAGE_RGB, GPUIMAGE_SHARPEN, GPUIMAGE_UNSHARPMASK, GPUIMAGE_TRANSFORM, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 7945be9cc..068ef7122 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1,4 +1,5 @@ #import "ShowcaseFilterViewController.h" +#import "GPUImageRGBFilter.h" @implementation ShowcaseFilterViewController @@ -145,6 +146,17 @@ - (void)setupFilter; filter = [[GPUImageBrightnessFilter alloc] init]; }; break; + case GPUIMAGE_RGB: + { + self.title = @"RGB"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:2.0]; + [self.filterSettingsSlider setValue:1.0]; + + filter = [[GPUImageRGBFilter alloc] init]; + }; break; case GPUIMAGE_EXPOSURE: { self.title = @"Exposure"; @@ -764,6 +776,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_CONTRAST: [(GPUImageContrastFilter *)filter setContrast:[(UISlider *)sender value]]; break; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; + case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setDownsamplingFactor:round([(UISlider *)sender value])]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Info.plist b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Info.plist new file mode 100644 index 000000000..321084e9b --- /dev/null +++ b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.com.sunsetlakesoftware.FilterShowcase + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + + diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Resources/DWARF/FilterShowcase b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Resources/DWARF/FilterShowcase new file mode 100644 index 0000000000000000000000000000000000000000..581f8730370563e5acfe79d5c6d204f69e2fc98f GIT binary patch literal 626035 zcmeF44|G(;`S<58L8AnS5)~n8#Hgq-28bFlY61a*21!X2R5V$#n?JhAZg)2j6l-j; zO)FYjv86S()E}*B8#S$IOIuWG(WaIvDk@sqQpNsK8!feHsipdUXXcsRnY;Ji-B{mq z-uE1H4(w;{JkK+K?%er5_dfmJoA2i^#*VLsQ5fi*@+hgLWHxZt}6;sYpvxDfSu~gpKxK zyp@|siN{aY`q<b8UZmoHQHp)sa*i(;o4${)sjNaGExnV)1BOM+=GB)AIBVAG_k| zv^K&WvE+@h+bFze3`26npB}bu758Oz`-*Ug-<=uou-oXncZ?`ATt~N&P4^bXQj|wt zU>X{#D(fq`B>indncAcrjPVl2{~b-28X7|W8&^{VaLq}dmskF$hs}%0SHxAW6N!df zqW<=VmHucf)kfoeV^|)^^0+$vH8gaDC>9Nocr+y*aoEV>4-fwIcpL_I5nZP;AV<9-oedpwqn&te7R zg_n^Qc}4!;(2!7fw9!2!i`7#+R5{W0Ijeh%r^V66uBllp-yu(RI}Hs@&3ff!Ps{!S zR1S0p^!sA7p^AoMJR&o2Ur5zk#OOXeryzy?smH6m0L zs@S#JqOZW85!Ixi90XT%wlw%xtcV6zI_tm0@1ZJ`Ny`aJ*ogW&T7t2ZIK1?u!`XV2 z$Cu94W1LVIplmdw`VHcWJsmB-Je-xB&REOb^fq`s!;RW)eD#gP*_QYi_SNe%u@P$P z2nJGYEN&Rbo`dbhe{?HJJY1Ql+=5d)PHr5>u0ejDyf*_I;U;b(B_3F}5a` zw;axYDjt!}6}*4K>no#dymC(t`^9bO4^GX<2JfGw*tqB9@oeQU8N26O>1|N)NJ-04 zua9TBc&LsF^48e-Po)KQg%Gf(<>dbz&(>8SPg}ff_#=@}ut8)7tk`WlaQZ}+*T&cb z_p7HgH7*Se(uT+k2OGawKaqVp#Mm!#dGFl$PuURhi1?fA@tFIciL4N+b8k*>gZDsr zD0Ukyu#tnhqQ%38bL>98`f(0?oCE(a=K$}2Ot7-qK8%%*CC({k>@?yH=P*`7yaU`! z++D)h&BW_5K-)mv2Oc0E1P>AK0PiE-2R;nVCJ#4fCSzw47lN-Qt^xND2f&+&d%?dV z9t8iDcHCyBexXY76AKJc07)Nnh);A@F%(2=^G zcn$b@;$H9v#9e6r#-SPJy1T*05$AjsZ9H+$U5u?I-VA<(csuy7#O27$DPyIbLGXOy zL*O`Z(cO$~C9VPgi#QIRjpmcbp$~i$anJpXJxW~Bhxr~fZCs|YpRtRG4}inO>_LoW zl?-?*aRmG#@$`ofPc(1bPS+37#t>IOj5dV$060!uG051x#B3{L+lb2^VeF5@g^%K1 z5LbcEL9@l}_k(XC?%u}O!^8(3XY2*y$-jgy@pf<-CbYP2&34B8#5=$}#LJ&x>_OtJ zCt-)UAI#7n;<^RDV(cv94Pf3+;@9(s7`u&lKllg4S-)m%4{;%wG}Y84e?I!w~4!c%h+qghroxU|109~G-IbLeg@@)xB}cpyd2E?%Ur%2JV4wB z{tfX?@EgSIccN@ekn-ivGFC|3{UT!l;=Gp-PvSWE+r+zGX6zZ_HLo!C4sp)!FpoG< z+KhlJh}Zp|u`c4gKQMMb@fz?B;;nlzhex~gIibvPWD3zLI#0&tg5q zk+Bwgka!dLS>m1GcZf&8Cmbtn=Au!!jJOCKAT1m8!TdxFIViMN8EAl?i9H*x=oh}((M{vq)B#5E@& zEaF~pkT}1a4ab+W~NK)n1Ei#<;~3|7z4rs-CqP2UAR;v^Yv=@}L~gLuPP z7Q2*qEBJcieoVZ6i+Bhfn_a{s;CG38iY<0rfwUPv$6|AcvoVfuBQ65>5Ko?Av4@EJ z!Os!z1pkA0%S?-%c(SxvGs|N0h$CP>@$yoXL*o75ZxZL7Yq25Xjo=B>D4)->*nHyr zGK<|pychga;>{OW>@DIUaN#LZcLY42cwM>0K1p0~k;T42JajScwUP(FMI5-qVn-KB zJGB^xUqHMMyqq|@(qi4jo59~CUN^^L+lg~9zwsi#Z(A@FSCT~}GGop=xUe~9;iw-D!{v;8b_BlvH` zYrscMmo_(nONiMu7ONxf1$PpcEw|W4;$7f}i3hH;*zbvVHdrkC3~6&iqs2;zm-$go z5|4myBko>dv3}ys;9bN+-~&n?e8QR1W^NPeOyZIji(N;&1$+x}s2$HHabAbTenGq$ z{1@W-h{eXAC2j7FqCO|Ck6CO5aVz*v;vVqNiTl9&h_``{C?Y%HGl@sQ*Alb1#cm~z zue8{`#OuM25D$R=K)f6LZ{p>vP=}l??T>Wfxg#!EjpvSd5ZppseWS%bPn>;|#qKAb z4t|2T2K*{<1Z)*c`+aLL7e-uuv&AZjcY?1aJ^)@#Jo!^d?>SO8a;wD_5pMOBTC_IP1$6dz`o${3h|xT^2iK z2Bl?##j1&Sea&JW#0B@@86+M6KS~_9*J5uF$G?SVZKkx-1HO#754?tW2>e~*z2N7F z*?o9^iTlCDv!tDE;HAXb-+>+CLh!eVE5OeY2f(aU>UM)?5^n}yMZ62Vmbl=4)K|o{ z;GM+1;17s*fM=d7ZBFh(y+>RP-axzoJV-nM-c7s{{2$`o-?do&dD2dPKiWs)kq6M$ z6YqKu{V3vrhfwDe?*JcnzSJE7&nC_tKwpda;KQgh%cRV{lo*? zlh5Y59Tq$3LW(o^I^yBqTI_b>`lr#aBi;i3D{;Xy7MoHob>rZ9#M{A9;_{t{Kk@o! zE%qDY{opr=3!bysq>H4T5O@}GFL){OFu03&^7E*Rhy&m!h_{1Pom2Lr#r{s$L*P>{ zmiGI>R}c?_?;@^w31wKxfX81V<#TqUpGjN<{xoqd_@~5i@LR-N!Q(5W?&g=#ju4l< zg0v7X2X_(={SIZ1xMvT_9&!HfEjB`20Y0iy+S~&^pSbG}c&3Q+{)oDZcmTYaxMnYG z5)XslB3}C^JPUKA&0XNd#KYiQiL+nDGetZZ{2Flyc*0z%TMIsycsaO(I09ZzybkpQ@6h|6C`86fU`1APYKs=uOtNW2Mrka!q;{5)wt zZ^U935f6Z`C9ZiB&nfY?zrhZ1;O`bDETnGP+vsB`K7cU`apWDev&4PxqC60<`6t?0 z;_`oC{Ix*Z>3Pp$<;3jY=t~plgYP6BIApPBh-?3YK1sFI-3LC8xa)n3-9X$6zMFU( zc!2oO2N*jLugA*xKZpx0A3J)Xv{?-oh)=a2KTcH-(BANvMzV7!m*AnuyrWA6}e1W#E+>6!>T!~@{# ziT8ll6CVWsjJOaBdw(Qe3;qvr#nC=?=H=36Zk~@VAuc-B$Ku4BCnIje`@q|Y3y$}( zzY%wXk6kS7Yz9{nkAPLZw`MBxoURXm?;@_s_pwKbcZ1&`-gpAaL#?#A1w5O057VzQj1F5&SgCYywZKlQKhR_}CYSOU^>L#OuM2 z5bp%%)=T+=MX*U+U+iOFBpw8RkN5!i8RGnNe2KBox{_qRZ37=r^5AJ#Nc)2`d~6YM zd?v~R@dofWlnhwi->tKdKXiRR_yF-hsgIp_rL?&dTtnP{u8+lt*PV~@KwLK4$9_)S z1^y%PAUJ2Kw3BzCkChY0!6D*Z;Jb+rf`37rU+!aX5?6qaT_)}HfG;HOz1YXX#G5bi zv2PO(R-kSnW|c@6@ka2JtE8RKT*QZXJvd0bWuA|Hh4>)&m&B#mTX~2$4xVwfv@-y{ zfp|aoTf{{ReC&DR5ZJm#%J+e15$^|IO*~YMvP8Ump^yETxEuTu@wUr+j4hXTSdEXJ zN?Z=Ul6VdHGsIiKKO#N|evP>?`Bv~{#693I za6S@Szp&r*OW+gpuwNVd0>4ij0{@!J9K#sj>-RFhek@~r&)&Pld%-8&Ag{ChEVhWa z3cQlI8vI@28u07Hwcsfssap?TK)ejxNxU3C7lMmEDRqm$^~B}i4a61T7l>=XhexG+ zE%-v>W#BgAM)2Ll0q~Q=t>AwVhrm-~(oO_?IdL3(D{&Y2d&FzNPZ4hbA0pleJ|`~i z^n$M@-UPmrxDWg!aX8F4GPfj9!* zNZbW}ints6Z{oG!qHbwtGx$2jw@Tfe;H!vtfo~_?4Stk( z5BRUd!{CBXOWhIh65<2k&k<)8WU-$UXM^7+&H@ZUs0@Tm^oJxCZ=Z;$`4tZ|gzK{N#192^QHE{&I zfw%{(>}&+9u=>Fdk<3=G3O6zfWr?n@2k#>u0Kd<93Z{v%iFalvGiPvX{Naj!owWp*E*#cGKwa6PWBPt0QX5O2ZtUlEsJ6V%^{ zBd}TU1!<@2m@IY~@y1E$0}yWm-$&dCn@3&h)y_Cv(ek;b#WOg53{R}wEn+`5SSz~3Qei04k?Y~qB%zAEMW!OMv^qJ8-y@dohA#OuM+HcI(*;OmKdz&{`^K%DYH%g-WN;^O z5#;-c>v4TAaW<~!^-A4A^jj7YZv}58-U5D=cpEtXUMW8S4ifi+A0W=dz4!xhE_lK> zqXZ#PP5qvZ80q{?W4}w1+-hi@k;btkn9(*(LM(|U_o506?Tgq$(UrF2xzL$78 z()e5AM(}&YYany>ccg9{93c*Yze~Ip{1@Ub@LBgu`3Sg)xEp*Q@jCFIh?gTjC-q7B z5W-zTyc}t~g*XoWF>x#SAH)IhnctPV-C#d)1$aGi3HWEkec(5V*Mg^hPwMu7FD2dt zzKOU9{2k)W;Ae@qA^vB4U+QiJcN1>`zeqd?KC55KY(rVPig*|J4&q_(&x!YehlzK9 zkA6Vvj({tOhrpjC-VVN-I173BDDe*D;XjoOxa2`;X9(O%oDKPY;(fTjk9aTmq=%$@ z9K4ixFVga9;yvI8iFbo{6K{si4~PfAXAV%f;A@C?fNvwt1wTSO8Dag4I1gO<1F4$} zZY8coSYIQq2R}tz0z1e2P|BBqmlKzQ?<3w1JHIF1i|gYamh$_+vx)bB+lUWB{;R~* z2x}MdAzaTIl)4PpFCgxQ?n>ew@I%CF!T(FV9(?kTr0zQK65?{$`~q<)_}9cG;ITiJ z@;eY#74Z=Gi^RLYL&Q759}sT`&-@9c5#_d>csF=}cn|mh@m}zZEmD3bI7++&{9WQ* z;C~SJB5tStRLXAxUq`$VW%7%}8^DhcZw9|X+yg%TXHs`PxR!Vj+(Wz$yoGoR_#NU3 z@CiScx(ASlml7WYuOi-q`uqXn-Qd3{8SoifrS1s$YT|w1FB0zuKTdoA{2uWzxa1M& z=3#CS{h1o#QuLi}B3^_3&jZ9G=-ccjuE%xusMH-npYSZ=9k_lCaTWSqpC?`mn_G$3 zq2Kja;(qiMr#wb+0AETRhs~A50rVB`Bi@edzabt$e{Vl=KEj&1P1>nPA8!G1A!Jq& zuY;X$6E8=6b`aM<=HKc%;!yYtX=f|?b&H5|kUt&7MM&cYbsh4L5a+@EYs4Yw<~}a% zltN}caXHc+A&w*5ZxU}u-o8LQ2$}bY3vs>hm(orR_!Go?5Y~;vYmnai)ph8;LVO5m z{D3$MGAC`9b~Yex^N0swCq|ryKJa&m*CM^o6ZeA;5EsGD$xlc-g}4`Ui4P!8V#GDL zelPI`+?O51S&(^`xDjbN>q%)RfN&QR?|}VJ68FMRFYzJd;gDj)=Ply3xPI)fq@BIc zy@+@h(%wp3jx^pw+>1Paia3P0?I+#}o;D=yl7 z7*jkzybrvGcq@3^Z(!$m9P=(ke+fLs$`xnL&*ImyM|}Y8WHs>+I6(46kZMifcS!kK@MXj`;4tyX45XcSIj%oR+zNi1xEy@aZ>61Fa1C)D z_(tM`u(O%?z)bXEh=+0gAaN1or#>z11i)3qyCB~|oR90h#D}0eL|lOD?+|B!^PiD+ z4ncP=@j-Aa@qXy8Q;h3BAszwmC1$Xbw^Q25LcU!{JdEod#D(B{h_fN{3~>dnzfF7q zeA=@VAMjG*gW%5+??rsRPn?A~JV(46{2$^{$e;S0w6h<)oVW^n2k~BTA2EaOF5+Fd zp7p%cos4*v5$A!gC*BG9yNTn7&tt@m(0!A553V1#OWGO2^(x|OaEO?}=9h^Jz=Op5 zAoIFn*qQJG#Ru2Rh;zW#5od!xt**n)0P$YL^9AAquyfdp(#~|q&m!IdZXzxLf01|} zbRQ<(gX_b@JHfdxNjrNWGmE$k*RLYZM;vY=UWV%r5%YIi>>wV7?msx=Io&-I=L(7I zaV}=+ZhoCH{$3@Vio2$vp>oOGnzlGzcvKJy`vcdq27e&XAl}c?&>9ZkfRp46{%BK( zi{Nm1uqoaU3&t1X-9Y}1rr?$SXq$gUh`*=ENs7M-B-N)W99eC<+|&>a#{F#_E|=$o z!cF#=aFtNdAG3$u)Zp)ohu!>SFqIw>n)Z@lyffNyr9ae}8c2$vQ3(gUq+>k#b@6Bz zZ*Vem&q!NsI2@`CN79OP##-6g*VMI!S2ZEGDkG69j-X68IE#A5~!aZZNuXVAos;wgsUghSCg0fTyxat=-b#>wG7a zdZ|C!fyAW^YbAoNY75keXCj$>j$v@wrEQ^5Ra*>M8uUlgM~lo~(IFqYGy%j~!=0gk zD7E1@?p%F%VF$9O+20gg9Bm7B;2OV&X%mGT(ixFSz=J+_0dgk3$bSP$_uK__Z8ru5 zr-@5v1aAroN+a{5;r6;vTOgQ0ikrn9tqaEE$o`nr$|S-vBvUVaO4Agq8oWl!pstLNmZE@)cj3*(n}k~0@u;MD@IvTfYW_!}gZRlp zY}SR1Ijdz(l+J3H0b>{z%n+7u*Vr@Z6usfxDO`=c$vc&u_oxHEova21MRJIY6WTf5_J zhY;?d5aJo;Se6%U|@DjG#Kod zy#igJ+5S+Z)$bH>X!7=`1ZtKXvmNW59cF@gS67&aFyWi0cl%~p+{aX>SRmYZv-m@J;GFSOSoO$LGh49-ZcfOVnPK| zDUCZs(ot|pFc#rW9TWvD;o&(&z1`o{*527J>j9T129I?zA`UU2=UzOg4&Hd+R-&3+ zB5DW3$Uy`dQ)`oQima^@ldQ3LJ6;g-uMS4%@)y?XAqcNTN10b1hGoNhZdmo)RLv&5 z<(m%|qO+Z1IJ_bjjIPA65B0(PaP+d^YSEyFn-`0r;q0bX{>s1Ecr_=l08>MDXr*M3 zq7^{@If7J)+H6HI-s zjjm3K8UoC${Q5%J0h#nRU;&nK_wz2)idfKENoQ`7Y0-G(~!#!x?^PC!IvHwnesaI7scs!KkfNoB`pDd`=> zaCaqAjCwj&*+E@BTgsEtnDmkPhB}&xLQR;a2HawgDWGUvrqZETq2~c+G$I)ZM*N+z zU`CS2s?PQdMMbkFt-7V9$;fjzDZKiacbrAi>iq3^dE^{XP1(v!GFwTZvNO;Y&Pc(( z5@iNM8eVZ%bw)+AiC;7$X|lLU_UmNB#%FV=iPK}*%m)GCjt)5}M5NJ0Kflzu*nSv$ z4J-IOT|-;P%J2=rh7xX`&-Kxp*~yn*rCL1IhHd~=4Q_VZ`19>uw4%TN& zFQV?|P!ZW8M6taV)8?u^w#Bi48a1jxc>{=E5^t2Mf-5mD%v=?Ns5l>g>bl8-Xb+Zp zF|sm(7Il2Qg2NlfBjG5*@W)hze?>%1M!F@B`gQvKwnxQw&$T#OBt5;GIEiU-q4HK!dbQNWIZ>BmYc+G29eW8%mm0d47Y#HxaA&N@-tsEBYIo|8=!K@|Hm zQyV0hL1nEZMX$21Jsgg=hE~_1=TCRTA+4~ARTWIkJBS-Ks9`&!9;?z&A-F0zh2!VF z4YOTxh<#iwds{a z3_IoAnUfdZ9xt2kq;O15<0USH!Y#OuvPPx>IiFLUi<#jSnAw}n{js=bix7I8XoO{w zYQl25B4N_Zl@xFEZ~1*qxxNz9+I*SF%oV+oPlS+KT4-9oE*NR^oE2Y(_ZENCV z=0tfCEwxM+X*)~AQXgzbE$X)mv-$&}thz>8j4%0AfosGu{?z>OXrZq!7HRyUrEP(D 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ΠG>rv<>nrFG)4vF3&fWT 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∾U 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 mOO{pU=LYDv{x(Kwvn9**} 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�lb(;4f5vIY~6|5`@VgB$fDcgd&u91 z`1)@#70J z1+HxNIpDNS_EV+McQf=oRkOo&pnVQnmPRWBjs2NUD+ldc@agl)O7d;PyK1$#6`-93 zn$A}Rn!S&MIR1H&8vkgAF#z^MQ=tRup}$~>g^086t+?CkWjgqrE{++jRi&@%JXlAe z&2pb;@DIj*cf0(5>_dLaq~tdi z1?IckGfbJ8dM)I$@0-?vX5Tm62AX}}v>r73zNrssmH;XMyeMCfCI1kYSsv2u<+!_# za_Ptqwe)mh@YM*^$PGJB2bKvS6!g;wkI|y6jyI21Mb) zpd*Ia^|ZbZJ?Z^fbY8JyYKe`*iQIf{vQCw z3iKU-lK^~A`3OKPAQ3PHa1G!_z}*18^PBJb=KH((en7tKoA09Ldj=l|>;N1o^js6Ga($?cs_t<0l41hI-l!%u1EQt`xgMuWb%0x-)oix;IkY)=eZqlH-P7E z`J4H@0KTJ$?@Ra{*TZ z_#QjH2bS-D<$GUu5o)j>dq2t!_%q;sz+-@Fz}tX!z^{N~|B5mLMglGZTn0!4%mVNo zjeKV#-{H6!@D_mYbmRLSN0+h;(JB-F1Ts9^ZjtMaOb=I_&z|sn~(2I;BSV01|0hc(f~vQ#sjVg z+zeO&C<8nJcnR<|fbWhw`cc?4fWHaidmH#0ApVx>X}}i1UI5?Wz~5R818^O~-!=1h z&ip+w&tV;pJAc#6_m=VZjeIvD-&Mxn@}08|dIMYySOO>o>;QZMIBz}521o)d1pEoG z8t^jU9l(!(^=`!g)5IXYzSon`g6mzMN;k&j9cYdO9Ev@CaZt z;5|S$z}Sdy^8ii&TnI=2%m6F|+yuA{@Bo14!=D21dFYF{HvB_h-<{z%YWV#aexHWl$x+{q;df;CjTwFqhu_BGcV_tg8Ge^W zeS?PIu;I6I)OTz6of`R#8|<{H_kaufy-|@EbYmdpZ104!@VfZ{w)%~J}w;+w*DNbot*J0y}c{-G@5^)EhZdrfoDt^Y~tJY{?)ou~1`K2t+hNhQZ;}-Mm>Aet|UP~?Z z18nIP)`h0mjkvlTQpT4;`6>~&#g<;twoty|h}#Q3ekV&^ofcoZMym!b3Vn^Pmy+$F z

    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

    sPvP-^Ss4RT=5?&{dDkjSp38l z|7cC03a36Rz{8KHP@lvV|Dn>a1Z(eN|E%(j;C?$iFZ)(ROmflm2}GYQ&5HGnwvuW+aIYY{gce7ugr zM`PHQ_4JD_5aMyrnLcrqehqZ2(pNb38G8}Fe{S&;SN!~Li{e)}`IEuJZwoPf;);Ky z#;S~Kt z7j2Ly8Xp>BS%@pyDv&O5)`h}ZmconCb}WA4iXUB$pI_nRuL93Q7C&*tAE)svocx{O zdClS{uJ~C7;*>|>*h7W5IXZi{!fAM`nJYew?SNzJh{}+4bA7|y5|NncYK}!gOmchYbkV@rKo0dr< zVT{=t3DHc=shLbOV}4|^tsN`Gh7cRFTH7+qV3wBH5Mo0Jtqmc>whUrhV#D|KI@jyn zd3QR~@O|v(@%aAnJ&(uLJiE^Ge&6rwy081kIp_XC-m0{dI)1|O2FHhXOHMn+@odMOZ#nbYFVHs4rQGEZaXS=t&! zU&<$&k42PVw#%6QdN_xp&5TbrzZ-x|-)dnJ%AfK2qG| z8`H0abEkZ=`T5Q_rr!oGyaN+e-Ol^IM&7On(WSgR(>akjeSZ2m0g8`B^2 z6rL|DpKN}M^Ns0eJ&pa2d~#=gE1Zq;$>uk>_{NMM`zwxlb`SkS?#!PJXM}vR`PPR; zs4!;yoTX88iF~s8D_lOt^w+^@l}|Q5+xf=yv!226kbJWFG3Oi8&xO-vkI-JS`SYD` zOn)hyL*$dqw`E#{3S;`CpN*nZ<&(|d03g#hreC})iq4l$rjv_OiekPo{Wdrk%O{&3 zbG|YC<#6tmPd2~B`Ns5{o=1PmC!0Ur`Ns4&!r5cb(4S=UEr%jh7}L*rA&LgcC!0?o z(>G4|FGkUs=7Y^=ADM4VKOfFi`DF9$*p=~(>5qXkS3cQ%i%H*@elwgW<&(|NbNP_p zgLCk9nD%BoI~O}lasl|4;&Si{;_2Xh@qkx4^TD;^CE(}8YruR+cMP%l+Q;!Rj?Z&^ ztK(-JZ*Y9*-pQC}IKIO10>^6|AB2vKC9;X4vm8%%e4pcY9PfY!+}gB9JFawmsbltY zy5qezIOWP=EjaafuLaAf-@ajdk{O4~Gj(~fp38SRoFe&T^B3cNGRK24{aMSSXtI2= z`K``3ra$Zpg+Bbo(6c>PB6PJSzIWRcW!RL$T zgO`J2h{xAQjdy_(jKGI?g>f8E2&9iyXH( zX1|s5AH4kc3Gcuu57klZkS+HwGuA{=9qPHhkQoBaiDsgZxx9?Iyt3bqqO0VS&CkQK zG2fW};PxnbPCnWEHW%NRemk5G<&(`PkeQEh!v7ebsW3p8e><3OGk@Er(Kn`F@(Dg8 z$tRmXJ%mlfH>ST5&J_7%^NXEtOh50_D7sZX+5DLEjp+}E^Nf6QXMP2o_43K)=X42N zgbHKEpZ+=e=g`nUWb;d0KF0J{!Z}7h+5Dy-CF2{@FW!jnkmZxjw`~IRF;3(I=jWD> z^9x))#`KrMX_Zg5_!Z7Krr+lq{N5p-YVOqvFreC{FM)ZJuviW^n{}|Js2WORha%cW>IN!-9 zn{RDoKE{mS4(Gt0>QCo$OmJHI#`L>yn-QHXpG=4ETg=q>J>g81Pd0z0i%JpF7^KcQQ_iTc`!aV zHXoT4?IoTEW z`I_W-w&N$j948AgHeMGm1%FP)=l}k=%fSFNjyw>|d8HdabK#UH=7i%+FvriO?)Q`u zEhD;IKH2>4F1|7S z!Eo-APwvbwgtJaQ+59#a-+fwM+F+5C>SAxq$N9~jz8HlJgHT!ep&8GkLDeEDSaJBpvR zdqz|zpKQLxOpTuhr$s*5{Ep%mz2`Ns6;?wt{3{xsxIHh(FmAv3-){c@c2xQ~3Y`NhsRroRBrAo*nT$2i}Z ze)oMcqSNG)&2M$SG5tkwCdwz9-_g3W8cvgZviZwgd}GFM-8Un;M?TqnYhw{AjOlNL z^PGHgXMW*+8PSLG$({Lg;bb18<>mZlm%lOd$%$n|J>-)u{ygU!(_aMV2>E35hdZA< z98L^>`6_ih&GBy?KkE2R$KN^Tywa_M`yZQJ2TQ@J$3I#7V}FNw9@CO7=h1E*B)x_&dJKl|{EsJDEw z`FWUz%=qMDI5GU?tJ?7_#~FAp-LifNPI+QVtV`h3K3|0SjyNvlOlBPBybguT9E_QB zYftQ3<&(|Frf8FIOn>PS8POl*lg&TC#V4aJ{a@z$>yi_|GvYbD25n(9q+i-af{>E9W!RS zws$!p+4keXscr9xd~QNL+fKIJti7pi?{Q>C^pJeA`PN?g#%y~loYnHl=BKv33pT(p zHXN@!$3Js?iR1enGiJKBzYeE75iyGPJu$TXGWQvCIr3>lJ=;#U+}2_mGTUOzwk+(M z5#1o4Y`(QOwe5xdux*r2Hb1rPYvII{=guc3d645e$MYRCX1caN569Zx?c^=nUWI^>o8M8}*TK12KH2=#wl9QZZGYV{zYwzeUXDjOX3TVLzW|Q4 z{b?}AykG9wM`c6@of6tkw%n#89+}J0n9F?*oFe&T^Eq!aePj9?aZ$`{`D8k|C@}z; zzA^orf!LnNC)1(71jT$~`m5n=Qxx(icjnLkNk(+6e6snRhs8H${H1Ujw&`KDXGH^3>E{{}d9`L-kHem@KSL$>_q zWhUEe%=XS4jN^0pWb->3+p(W!M9uQa=C=UIMfk@!(Vxd;M0d+y3O3*RoW3#rb~r06 zf9E$LHm9Xe{svAAfB8CSM3R5z_}7k~bo_6}hmK56%lPT~d?Xy}^P9k_eO`WSMzkLF zxd=dJ9JZ+)h0L6d*~a309K)9cpKN|deZB_HvGU30r;f>SaAKGrUo#y)?D!MMIj1Fk z#!T1t;c%?&SA$dA-gQVu^iR~Y?PSX>^%!QyQOS7?a2$8sQ4ZI@u^e6jGlv;&Up61} z%{x8hK(-ug|Hb|{X8+GTE+aZYKH2JPredP41f8$&+!|M zcO0E`e&U!h)AfHT9BccH;MBI~A)ohA&;BQG%FV6s{#>1c>YZ zU%|mP zl}|Q5b=k3=@tfiNT|U`-%b^Gr#`Ig@{8K);Gk-aqGeiF;SpCycKJD;x@S~eejn!>(=Uf}s(iBf*cBugRgp3Md8cMX7s@A_Z+$}FnEp~YkIN@_=C6bE zx_q+v9raJQV*C~$pKSgz*Ir}hvl7n1XNCSJn_s$Jvc1Oi2ae8&PLfYHzrTxbOuq`w zDEVabD*)so{9{ai#Thsbmrtg{^`)zeZ%ls`oEG`y&iplS-jYu?-^Kv*F=qViGc%%p z$tRm%=<+e9Ukaz&n9!eO^E+Bz)8HH?pKLzcOlCgDj6V-fp?tFWrOqdx3nzxZd|l@F z4#z7U?{Id~Kf-aTdE#2|Q1J}#IpR6sDdJY} zHR45JwlUqlpcPJeqJ=m=5S+R%h|a?A{$s8H!# zQ#h7G|I#gUn2Y(&L_POMWX9q0OwHjQI5E`o^=fI7Gs}|9Y18G<6OQFj2TtvWfn)HU zE$W#A8Gq8|@Clq4-s5Y}aY-(4%xTl*Py@$uxEq|B!wSszThucLGUKoxRsqOd7RDUs zZRg;3`SHOg)1e;&km(!KUp_V?8Y-VmhyD^2^Ns1xF3pJWB=tl-(zaCR*Z`I9^Im%4(CkyWb+Sj z`H(M$6T@G=<~x4I@wV}#bByEj9k)1s*KziQ5&DNrCl_UA zX3{sNzq&3XI!->>{05hgaUy!U2k@St}H%!4fe)7rY=eT@~>Cb}mvV5}n)<(uRrr!qVbNOWR^IUxLZj*4# zupPGBI1l_J@fz?YV8-L?_l}=(-0nE{+@wF!@r91>aQwRCJ*tw^p6s~E@gE((;y7b+ za@wODv%TrIOJm^Jc4;n{`%S-HT8X~;6!qLLk*(jRBOaOkOzu{loNqtJqa4#um&4ED zSPl<^Q*#(|K8|T?LJnlhVHSYQ9E`cF+nezHgM2cbT$KJO<{Q(GP0fgol20~&w)2hY zFMxBpd~#?0@C&f5mQOZ+v5Rla_+5XFeZ73L`7!4k)6avmP(ImwwwYXne~jrD!g*Cb z+5FUf>%ZV|K78$7o8+S%PjWoR@n0RUbKK*+WSk+6nM1m<5r<=A;|_4@*r-MR8&S{k zNw&5O1d!QwW466z8qPng3qF|+`^J_pePjBAe~}R#EuY+(zZ}k4^2z2~|1-WZ7cJ~5`h2+o1>$>y&Bkm(!KpLH?5GnY@M!#-YvV!ko` zhUvIphJ3R5tDJ94zxa}js7*fE{M2RicQ}dbk8bG_?J^~bVu;7rAjcCO|IzU}$H$zX zoc2n`&pY0=De0W!_%6q9I^KP1(m%#A+mdb!RKl?_&;sTdxWXN;HlQEAMtv>uKrm~TwK{FaR9 zLHT6!yJsbRWBLuh%ZT2SPc}c>#TP z@r@aOHJsbzlg+mricn!pKe`RyfygJD-|FHU({F{dPCnUu>l4N|roR}@A-@RyLpFc7 z+a?>+?|OSiR4kutevZq>n0_vtM)~B<{CqgSl}|RGV~))HjTyfj&U5m~=35T*jp;YT z`AR<7e2bYHe?FYUFAV)dHouR{$C&X~z!@Q*Y`*QM7~hzF?2e4+7xKyGTTJ@K^o!yA zPCnUuiBjKH2<^;?IV2 zrF^pawoIA7G5e^Spq|GnWX8!wDacHY4P%a_oK}3dIV1RF^Opn2981RZ+waD2vhvAv z7=JB_`Ns5D+=Fw@<&(`{<$PoMZTDtGkI5&SZ|h4DDvaqbgR@3H+5DJ`Z%n@(&W@Ld z_L9v%!1?4pa5x=br#ZgR@zaiXz9Q)lcYLkmHy!W!>!g2z<3`6fIcA>e#>3-qY&>Mn z-168Jx9*Ncp`PP`Z0%j!#Vs!}`)9-bI4Atd;FHZ?iuse-|HkwenA}a{Q*_{jW*-=Qw5# z>DGlC;glybh@v;Zsh{K8k$<0SL)*#Lmel)H18PvUcye6snA@IJW+{}|J6TY}Hd z^2u+5*_V9Tw5zsDPHW6*XD-8anAe5e$maLgw49eQ{l##ulTS834?w1GOn>e3_zqb< znNBWBm5XmozvKm6CoZ3CKKqwkgnx|bFNBjjJLFF`zry*(^kXmLJ9hbG^Glp>Ouqrn zRr1N^7dzjW{t`G3$tRnSuL%-dgbHK&gRztQKt9?05&)ULG5uLD;X1zSLwm_|*q@~+ z<{Q&r2j^J%Wb^wt-vWt__-pKN}i^Ns0O!MRL6*?fyxgbHK&bK%?}pKQLxq;E`r zEu81%lg+o7squTfk`cAbC!23EQ{$Jz+2w}NpJel`59yPC0w;#Qe4XR?GRF%XzwMYY z(``3)_)T)VaV9u*yRiiMEJA%Q0+1Pp%i4a^VQ$8~zyn{+h}Oy{o8KSPkm(!KuY&V$ z`DF9+oo`IP70#h^LOx{k2Rq-G{#rO^$S0d`>o4;$reFAX{N5*@Y<{VWZ=A>n&a0Ns z_wc)|#In9IO_<=TiCP&in>AkH{yRKitJ9e-0;x zzkKE1l;krV-{5$a!5oy92T8`GbG6J=)0C!25m z!}!MZbKb;vr}D|>r}oubaAKGzUzxWi`7p=lIKI*G-yC2A z)c(vz&g)Rmu|&4~v1k*__L6u1U2?wpj%yr4O`F49IF`fv;M5#eVZK9d3ptP(hs!86 zhly}vsORfC$4@%uwCVccGdPyR|NMT-9Gc$3@doPI59E$=XoC}D0(h--oHajL-%$>| z;8+glgH!t<`|XVA71T2aaz{CQ1t*rs0M{e@A<3sX?kI)>{ zD2J2bSPoMh|G{xbIlK(Va@gyRki$&3ju)=R_pzvFKae}h;U+ki!&8peJMJil{acbb zRD#(LK8LlK?-JBA2XaR_{1cAlkp0Ib4|Uv84z+NsAN~YR&0+dG_-uP;$boD*6l2+w zxo#SBTeJdBKlx2De=VE|^2z42J!Hl=rr-5le77T?OeYtmI|`Y;G5sEJo|8{D zzlZaU>Gy&2wS2PqG3Oi8FNSl_U7>%-=67?xG5s-c3gwf{w>~LCg)#kFIG4yLo1f$2 z8`GZ&=MMQ~^DSq_H>TeT=Xv>L^Y?Y}$)CXCbbRg6n&d%_Cpu=Fa{hx?CKiZ|vFqR% zzXVPlZ_ALw0e6S~BwIe~5r@qDjhX-A_t2m6$>t;UCf}HT)f()J<&(`Xb-pqEWpL^( zALrLP-s3+Gh%Wb=DEpUme#@O%CWe7AoOIEFgDUUa3FXuma z`Ehaq92+N(gHy*zc00~9X$$QlTb^?fhg^hz$j8Eo;V)m6j(_8re!3i2) zXv2KRpgtD?$c&SVlA6ObI5E`ob(`a5jyuX>Jsitnz2g^A`ii^o{8c z{tCaFF9_`=(_ub^05W}J`ZK=9z02g2>CkUNG2fVe^dDS{C!cJ7j`PVk!r}Tj1MA~T za13>Ped{>y&&m37$G>;{hU48HNczV+zQ8f_Dd#_U`So`mobpf|tp%s9zd2~j&<8`m zk*!^`0c7@@G5euyBksW^pG=4SHV?&oWBSG4;651g$>z^?zA^nZaNdlN?{+_*uu_Ip%!REw7#r zCzsbGaO(0}jGX_1`dkDcTmFLqWVY9s?cMktzMqj#ro;ZQKBsR?e-<_hU&$wT=I3T) zMnC>b$cJpc^*Q4kGyZTm1Lc#=PwoE_I5FhOSEJ*b96#&$OUL^!N=`f6G3S-8&(DQZ zo|sbR$AeF%!?9oBd}I1c;7pKDHouSajp?t4GgCg<{1WFI z(;vQVX7o4tWb;=$-hc9~I^Cqn*Y^Yfi=Ouquok@CsrTN{f|VNAajPFz0O{J}21 zG5xi0u8>bQKlK=x_4Kp5W=8kPC!1ddATu9h`prMejNXz@rjv`310d5krayQ4%xI@4 zL;sNJ&~HXD-R4%iOJC!60BV7@W^;oUN$D*0sdEr-;6%6H6+ZjnzmKN~=%Z_M~j zJ7q@C$tTlc{xK9XePjA_;H;NVrbB-t3Yoq!{n+gLABWviTh? z-&Jrb<&({~n9RqR@i)M^T0YtQj^gKb&x{_DPd2~Q*tQ|cHB`8Z^E%04tRFU9D44N8C`(-Tm&Fn4o#RZnK>A<|L6C}jONNG zo1YKYd}I1+;5;p#Z2n;98`F>dI5TROPd2~Q`Ns5{;q3Wb$e(OJ`;lCPe~jtRhjWa4 zviZZEPp*U$!(YCxar}tmPaWqiOZsOzzQQr*m2R9YfMd((8*u74X-A%CJRjOfwwz}H z$ZVrA+c<6S%;=Z$$#mEU{ZY&}rr!o2DzW@Vtp?q>@{z^FS$tRn?*u^(y z{5kt%MmxU{+DkS+=6qxN3*iiqPd49{dl4#(>92w_RzBJM16+LarEoYOzV37UuH(I5 zOgbYS&vg8lg#kqkUcqKG}R55A==cFM)HIe6smA9_Sm>A05k#M#(34=C{MSNIu#8#b^$h@r@b3 zb^pxhZuw;MW6n3GzYNab9bfJE3CGMK-Pl+M$Hqqg6;p2RU!$I5gKTY?i+E(Vo!km1hQEBh;`m#~ z^wZ^V$lsDVRD)B;XB+0b6!px3%sA}t)EwI3#8A)I9tNt^oDEobIqOn*a9 z9P`L0n?D9Xrf*EYq*rG2j(jqmt>wP}&R6ou=3CB;Z_N1X;bgxa+DkS+5Az|@C;tRa z41f7L%kf2y?*a2(I<@_>qNl~Pz^lb=V8%?hE`JTDJP|#Lj(cOv^(dz|K9`}M>oS>f z*blV;GV?TMyJq&ujGmBBrbE9!iuuO$7sGi$KDjf0J)Ae>lg(f3;u|ymf+MjWtqS>* zJM$a*W=8$xlg*F0_{NMs8_rqs$sPHZz~OX!wK;y<@m_Bxoe_>NbNrBF&MVzA{Q!y!C4}oZ2n?QM`nCu z#&7GN8GSCFY<|r7HWV)D~m5rS+)H=uP=#^H&4NY&$vYohXXo|9lCZnlGb)o$HorT7Oy8LP zg8a!`Q&Hd#PFA|^^OnxN3wo`;}*vsIX-x8(jVveR>v_vcJiddKPc}av z^Cz>7#`HJ9sg+MQ-?m-!jp_FvhGQZ5Wb-X%YWxN`ugWKzZ!uHjx53$=J+zl>en;`w z!8u+&+5C>;_dFpp`ni0v`5nctf^)ZgviTjwZ-MiMe6sn&qh$Y+cl1@g(}cNBjiob%+9&F?7w1~|W$Pd2}!`2A1Gj9!vYHov3z4RHP=pKN|d z@!R0+|1WJToZnIWb#O}LlRJywvnVsVSU%bO)OGo8II$?aRyh97ai8@`r_Av+ju$)r z%5k56C#Pi&>Be>i99yq%2d9qh2IT)G>N&Q_)|R=5N9I@}@A^e@Ui}=8c1%BA4)t&> zhX=r^Idnf2-*0>wav)m{3%5(=V9fPp=_veWA)jo1Gv-fb&c^hIpPm_2%O{&(>wIJS z3*lTNpKQJzGcdj}{o>JB-{q6d&vEgM=~uz|P(IoG{?0e1KM&3q^2z3}aK179hBGpw zgEwfIg3Zr&zA^m;aDFDAY<@@AkIy|jGrChg*?enb5h{!se<7Te^2z4MTt3G1SHju; ztB^n0{M7ZU9~@4{*BOp4cD%^(ddCC4PEI@3ajWBx93TFlq+jm%ddEv0f9?3ljmc@* zmUQb#9FDCccY#yak=QwzQPwx1Psr9MSpYKo+?aisI~Lyo$|uvwMQKAZpF9~(41f8$ z!SR!hGrvtbM>=MlbZr?2$J){cPHoEy;_>eA1XT0M!$6q=wz~GG~BH|v%jvsOSnPcWw&VTUo=fUo`O|s9& zgH!u_OguAs81=cBmdp@b?l?5x)Q86Gli?F^+%BJN{%q$P(_aPWJNabuQ;%c!+cw$W zVUEvpe4FFv9W!RSwtoS~#{BWyZQ1r{VrFy)>e+U(ujP}? zU*bMT7}Ia9!FdAm$>#TW@r~)PhO=k4kU!b{V&@yv?^Bx@og|-ZzHJkVP+?5J3eJV{ z$>v)h(kI^oCx*X#z2bPI*wD9Ith}YxkscjN?kjS317m@k+CGpz^lY- zz~73y^~JTfyN3DZf=7r8!Oh}w@Lcg+@MGcy;P=GS`ytM5Ax{7QiK3z6VsKnM4Sa=o z75Gtc(*WG_P22)L04IL3Pu7A@6BiD|K2$sn{G50$_)BrqB~jF6_b}~B@Xq3HmqyVE z;u+WB+$r&V@Snv?!0(9%V};*!j}T`8_!#jjFq{8sS!;^xIsbeDMj6H)ZMxW|*2 zR=fnO97l2O}mx3F` zGr-q~v+>*13*y1;QS`C69lZB}A$~i)S3Xr-@<|j;74v)I+r)XF;(RjkaPXJn3h>_8 z$#T0i{d4>TBVGxv6Blocq6^Id-z#1UUMuc{&!GJd3UNk%i~CrLo53yO7VzWZCEx=O zR{r3@;%s~t94+nxzD&F@6Zel2*KUJ*d5PzNGY<)ImV*x#w}Xqs-M7t%ripuke<#k` zE+cwJTns)cFT|M#o+Qrcni2g$%;V*E#O2`ZLxVpDe4=;(xJuj;$FtXqTfnX2g*Z-p zTHF=KSzn6_!FwJSVlDs=6EDHB)dX=Z_S=_>S7Kjxzd6`ny(aF7eNN`#AcEt51l}XTc8=&%@Xm zCSCy^A?EYh>%@Ha`gLMH1O0w6pKt!5n9nZX=g1JB&k8?Q%x89&iupY5UyJ#y?fb-h zw)IP5KDT;@ z=LMfG=CgpW7V|m3OU0|fnV6nFpU*o$%xCXT7V|l_SBv?K+K0t_{_H=@KL#-{KgQuR zWCw`(Jl30IvsozSGc+$3^ZA%} ziuvrzx5a#}l=5rEj#C!(gbz(l>@K!OOUHGV&&n5g!%x4ZBg5|;Ze4gN7 zF`pH9nwZZ4tQYecf7gro{JsTZKA-OIVm>GCD>0wfmNO{C=X28ri1|#kGBKZbHdD-J znJpCaIc2NFdJ_F?sVm{yGDKVd2@{X9#CHY3o=Y8CR zb(QntvpilB^En+|hJ<=PgQK6A&(}Cd%x7m@V)fwr#e5#b%VIw3;VUtp2!KFZ!;-LLA;_zNeV?kS`JQ{_q!zdGGfJ#JsQj`(oa+y~hb54)4c4P|SO+ zj}h}e>KBQ5-|Tr}-V^%;G4FSM@bD0a_p&}k%==W=iI;(I7W4knkBWKk&3hmZr{Q%E$?&NAm%-6e=p`eY1_oS-|VMi-b*$I`vxv+-Y0g5nD>C4Cg%NJ z?-KLgt*?rCU)C-~VOrjE^$0QVr#eQ=d!=3|=6z7-i+PXJC1T#cbgh{8CjHT=AtvuT z+DpuPijETV9-hAv^ZuMyi+S(OC&j$4=D)*;_|AwKWpbc&ewXsQ$Q{!6!sd2gjB#k_yfKg7I`&~~SXIJ}?FA!6REr%ufK@Z2fp zJ$7C9&0^lW;2v?_cA3#C zG4DCh{p>I;?|aTrTD{{tt+* zy3x6$?cu)TLrh**c)Xa` zeA?EdEhn6e1Lo%aljq@_27BR2+dR)xwxpt2SpVw;rLfq%@ z%;?$&M8vCa)72Am()$aWSvCm?`G953OQe z*RVp&YZf+$c|F2Gl_6#}&h0-<%d&E5d|8+6X?ca7%n3m`5_ZIWK_YyJB zX`dnH`Rb2~c`o`oG0)%L@!SxH=Vtd4^StZR#617`LNU*6zE{limRE^+PV(+mAr8+s zK1s}TiKmNsp76tBo&(%2=J~yQO%BuY+}%Pk&x5TO^BmXTi+TR)i(;NHx=ze#e1%yT9Wu2EaSg<_uf_)9U*W4uSqa}-ya5B`^! z=h_`q8{+Uhy3@owN3KcC^WR#8E0zvvjeT=Lp>+=D9jAiFwY^r2$@Hhs33zcpVV=I_WiiuoJygJS;vyIjoQc0UyJciU~w$M>Yz#I%8T z1Mh_MD06S_5|xPy!1s#F!QYCfgNvGiKOa0#yafCo@fvWSslmy@bA+dfbHUGu3&6Wy z5S()Gc=2@b{o?uHZa)vs67W#*8t{eUEZkdfp_tFN`j?o`x9U4BOw0RW){1#AzI(~r z<67F=x!?eZVW5p%lD)DIWP2w@&C&Z=TkHqERoqrkPRDcJFtH9;rTJUw^ z2JqwJCh$7(H1Ph-Ax<;+bn$fXrQ*5Z`^59WZ;M;NJ6sf|Z3Pb$w}B^%7lCgVF9)v@ zuLSS-t1#^JVm?` ze2aK3_-S!F_!IFu@Sc~4I2*yoh@*Y8qPRF0{2Ot9@Dt*J;4j33!G~TE;uL^O#lykB z6BmL%5*LGe{W|z1;4{Rd!Iz3l!3)Gy;5Fh}@IEucv`yeq;%VR+;+f#Th-ZPn7S9GB zer1?;4tSJ!F8FHk67XZ^u7lU6A*Mk2k zo&nCfDa>mQI7i$H9w1%>9wFwv7bb~$?}h1N-h1J<ILd;Uk_XKep`gW>#9-N!R-BG_-JP`a(@lwodr{9G*6=?4O z@ls4XLA(}iyiB|f{_n-j$n7cdJk)yTTKxB+eXrMMXLy;Zyr@gEV-K%6z=wdlic^Fy4q$fuXM z7WE^<>oIMkcrn^OSDc47J|~`mKL0{I8oBlOLx|Y|9wv^EXRWv^`s!NoayWk$FF~Bw z#I2auwzr2k8{qU5&q6+@h>H=kUYv*a&Jiz1{6*%Y57&r?qmA3%5n{%``-}U)A10oQ zKCBVX#`wHOyd1np+yedw8OP-7aNPK#mcS8?Ne&lpK>bPL_25b3jo_K$Y-|r-6z76> z_+yBZ11=KBz?X}AfS(h$f;WoiVE@wl&M@t4@Ko_E@Dt*h;O*}U&J6I+#4+T2xp)D6 zaVz*g;x=%<)-Y`!%(qJ1AAFCv7|ti+Lhzw?2Y)!YMqGe-{n6^d?}&SVcfTk2J>eIM zOHkh|?uz;a;srQv`B=ONJn-Hy?LzRc#EZd;#BJbh+Je&xK1H03WpSanJNO=PH}Koy zuHc>i6s8>v9xUz&o+Qo%&lBf>SBQInzZDMz_qs2{=>tAn90T7Z&H^tHZ^Y-jFU5JN zkKG@p?GHXlJPmzPFU~_>{mvL|d`+AM-g`lqwkvp?xI6ey;%?yY#M$6u{~Y`tVE+Ec zaUKJ|B+dcv^FXLy4?aV@0eq`?Hpa#q;#uH*9t{2*@Fej(@Pp#{;4j2;!9QIX{4r?b zWN|6@Ch;^l&x;$t-5&~m75GH)bnxZkCh&9OT5y+#gWn83PCOHQk$4RH^L}v^=KHzT zqmBFhB~04@9wn{-UnedHKPzqqXDkYSKDdv#5BN-R3;0U$bnsuqGr%8;=YjWrB*f_n z9wwd-K2N+D`9C9G1dcr#{Dt5t;sxO6#EUVOz7nqhAMsf5*MiRyuK~{xF9Y8vZU?Ux zF9q+iI83_)e3Uo~eRz&|8T#-y=75)rmx8-K9;WRIzfime_0z?x!Hz+YND+H$}X zVcJ#TBJoOalXyO2-YRYbKPz4e{*QPW_@F04obKSW#XT^u8^zh+73P4uE(v}y=JgYC z33!sY590h;JP^E5+#h`0Q(@Y5i1Q2aYSiB)UITtzybAoIr-Q!%{s8fC%&S4X5%u%M z5$azPH)Gm8{u-v80X|hc9ekO17Wi@TOz`L8!H9X-(lBj*aHY5p_z&V`nAaNdQgH8Q zg1-V>Azlu?RlEfJvUm-~?T*g|eC*!lm3LMY0i~Hl) zY47Esej1K{P7$}`*rrKbg8F$@k7L5;#LH0sA8`SWyAFLR#F>tmW5hFY-1Td5D~=T( z7Owz*C~iQ^Jzfsemg89QIPntHpDS+1@!l+P4(9b2aS4v`{vpnVv*#-z&P>EPUOWc* zREZ1W+-&v8f#+4QPZr_0?qhK`^v_N!LVZuPvA?(*{IkW`h<~xT3e&cU`@{J_JQ!{7 z{+2!T zV6^dQ@m%!zBykmTnc!K)dHy&-3eW4bfWhQgGH=!S4xwM>4)|S=lcu8YC_OPZD>B zbDg*y^-qb5!5@hW!8^Yl;gR}i!vBl79K1%n0{%|#gg7~o0xvQL)4nI(0OmPE?4Na* zwx==bPZzg?o5d00ED&d*-`)_fMg30ig*dt3qs3j})QIy@f30{u_-XM*@R#BZ;DgtM zIIEG*$>J>JP$ymqzD3+0{!`+0;Emz}@DcAT4tTgY!n6(I6{w#t?twg4inGDne-Nf! z4*w`|1M(RwF2%H0idUijLGe=5uMrOicl$?(6Cq|_aSU7{UIXV6W5l^f+ynJ1#ofT) zio1djSQ}z?L!4sqYUJ4{UXM7pi}T>WB3=gW^3O1BA8>E+8caJhZuOnkUU5V=}Zxokok7p+(7}xFLTG7YBI9nCJ zh~gS)$KN>K<)fr?u;YBkr#fzMe5vC(j_-B6*zw1XzjNHZJ(c&+1a9q;m4B8SBKa)jd& z$F+{Hal9nKVO@L2ao5iieVB-Ou;UXQS2&*K_(8|Z11Hvn4+CS>#(w!qO;|CqT?D$j1yR1*lH!-igz=<4=b@gSAn;c&qcw6TG2gi#XzwG!+ z$GiMHG2g_rd5(uUp5*wKj(_X;&w<1C!PS4_c#kiV^Xlz*gyXp5X2&-L{t?@FhvP>a zuW;P%xXYKxWqMHHM4SPR&kWp+@h3aJ$T>3{&vJZ&^Y3=N)bX2+KM$P9A!9=#w*>ca ze3;{(I6l_#@qrWLc9i1@j;A@k+VSrl-{<&A$IBgm==fibGrmgXpU7cX#|Jv@=lDd& zXF5L5@kNfWbNpM!t&SgX{F3809ItWwo#Q>fPUe4@<6|73;&`m%YR4BlzRvNV96#lF zh2sw$f8}_)|0HwU*Kse$gB_pZ_#DUQI-ctIQpd9$-{!c@@e;=?9e?2XE63e8CiBk; zoLIjOb37<;V!Lsw<7&rO2TtraZ*{yd!C@cwlH)HO|M(l`5S$|u%tJWbi@@TnWl5+{@LP`8IsVr1uHPp5B;g;N;1H+3;~|dA9nWxlQ-Y&JoK{!= zsH=a`@!NqD?ONmbBgg-8{K2lc{{qTdlz*api1HCiJIco>pP+n-vJT}ll+RKAg|Z&y z-zZ<8e2KCFU!%-Kxf10nl&eu@p8l)fna zQ2L`Bh4Mcr15gH{`~+nX%F!r;QGSYY3`z~+)S{e+QioEH(ty&4^8d%x{~uTX8{_IY zj61yYIX2J4I6D^wuVyQUq5g1`o+wM6|2UL5icQ16ui*dtW12h^{{L5c ze+>SfjdBjkSd{T7P!9f)#>oJ%krowM*acPrDS z#)(C}N7gjfjgJp48($IcT~;@~siXWJ$Jdm{dzIDJ_8wYO-4L&CsPA16pAxUCsg2k5E~%-h8edUXX` z>}YIRdHLAN$z>DcV=HQE&W*;79cw{q#!ZTkZx~x2Z#c2KzM-soe0)?{U1iz0s(1(1 zl(M=s?~Jdho%%zXU0hYxFrlVya((a0Vz%Pck-chFJjmV#=7cJWmSz^&SZ-~KS(a$nqANIM>f>eR8QQZ zKU{Xj7=OhzwVf)B_2}(Wk2`7T*rA0(Mvfeti_x`d0P3AnjxQOK_T90k#Oo%;%TK7P z8COKrdMTsS=76xwxKtcR9RK;^UpuO_X)+PoyZ~GJKj__xwa}^-+NeP z6^6&iikkDsW4U3){ecstOg|X|hAZ{f;t{sqrgu(FtdR9b zRAcQxOUvpePZ`iVkxET8mVbY6LMhF%{=qh?03&>2SwsB)kyfV5tR_0*tTgp8Y))+p zJE**}d{||5Wqn0qS!4D13TyyQuWYC|wKlQ&9dvdF5zeoyF0VPiqj#}EJUt851DFg=&JwLzzgGXRAv19WD@_6jli@i`k|Okh+zz3&@@zpH%q40#y1;0 zX{W*19T6WNubdJ;B|f>PZtCe}b=4TaepsfRZVI}upt8I$v42mlA|1M?S5{ROU@KZ% z8!xNtJS~MktvVb)bTWhbikil%^2A=RrUBcNlA6ShdP3Rw_^EZ3IO0hR)XwLMm9DWi zGyyBr&=b%z4X2cy8~<3IWA<@@AV1nAp+IUrE^$*D`e1Isf9FOC{ zA2Qw8klf}A^uN2A-h5y2|Kw&mCB-c_)0+#MHq#>;rdFlfLZ|3k-O{FaJKAif*#Fm? z&6GIRjg!a4>rS085}QkY;ykgsgdgCzGNxI(QzmZMq*|B}HRmIQg8h&HIA9_=YV)Z2kdb^Nr5t4eE5GlcINYc%R(Lcep|&mGB+H zrjI0H^RtzeCGE!ne6+XEH26qws95-9f5cgv*KHceqvCZ9@ura#+!-ZyBZ&{egOJ|D z$=LaB@dkGl9fTV8Uzr9uhZQT$Tq?_|uy-8NfE>p)HpJ`GB;yVPFr2tEO$?%xVCC_$ zDtsEmfdY1-WyN(h+`iY12p`&q;=OTY{7~=TQ)?!4+%x!4Qlk_SGuWb~n+^s#d^GJJQ? zP(Nf`O=Ck*{Ctev$rxBAm6Ows7f4uw35gw-X57`*#cRvz;%G}^p$#poWh>K&=)L1G zxF*)sG**`nt*OE`FJ3-qVqH95J!l-h%^6fyRa;S(E^$oBL*t1!%0mlItFB}_IuM89 z*t?-~Eino@4OU!JS^YhNCFVIQKE7Y)^EI{q_f&_})s;;hR28qDh@HaL^R3px9D(EO zsU0uTYK*2KQ_3ovHWdNm4!W2x~{K_r>tpd!qp`{=agIDC+3u{rRBebX&OS$MJD(q_D9W5@wVp;k4q2czrF888Bf2 zMsR-VnlZVosd94T~W96HIP40-qmI4{2QP7#iDOS2< zQ$DZ!(5+Xm>Kf~L4HmbZ!`JI6o3@6nZwq^cky03+U_<5`Mq?{#>MAe5_fh}7h@txu4Gw#Z4nuFTZlv9c^h)fXZRewdMf)(j`Jzp8B$-yw z2iDEs>!qDZc?mvpCiWwVeahyaBU2_Bo4O8c)vn~`%tq=~O&$nszOVWr`U%{v{g4Tc zOZ=YUzluz0XG%UpxU<~q3??K#gJbJ55xe;BW7gDHa?82tDD!(vv&HcLArt#ui+1W; zou%IvZdD8|PaL$2Yn(74^*i2_jt#c8guiHRHMp_}8?ddKA#nJVqwrhx@nal<+xJa8 znjL$t<;r!>KCR$aC~WH8o5f}I^$is`u9{e}`9~3%oqt+O`6$K@!T+5PVu?tJA6PfF z1hHdPWmDsIL#vRt-(ykU^!Y5Y_%_>9ZT9w1{5%}K^xG`(_?pR+YpPGgcgkA?t{GP! zubYBjYO$sbtEoFVJ~i=4yJkZ8@n{f!P_CXBA2gmnH#aqGIp<9uos!$kL`LDb2VWE8 zx7ev}&~1@G;%ASVso%rIKKpxE*znbJyzmGg@+k_ zzhm>{o;=ZZ_SEpvoPsrG%TbMuRN|d2LUwpSm`Jdb1^;~y2ftS=cQm6Vo&IR>2L$W%$ntx|`rZeE z-z(Y=I1Kz=@m#lcauB%r_k@0!YJcT_piT33%CQ`?>-9Yjv=Ux<*luq1Fl96G`yHkD zNwyd?ogAe2X}|X|il4}Bk<;(+y&OKfZS6QEVUMkMtN2!;Ci*>b)XYuTRz&^`l34S% z;-ow5Pq(mBj!p5s&Q^k^$Xhv5PBc74@Ax=5oxPQ#1Q{dpXLuaHocKJRN8#Iz4?3m#&9IQh{ZuYz5>8*V9@x)4|&B}hf?+i$%)e* z>LlN;!;kJ$u)o1asrn(+`j$6kzmv3a8eQ0HVXv#MF2wmri7#n7${r`x)is1)9n*ZF z=z2Sb^RjBcmsnfYSdSAH`9o$WA<b8dWWABN|dlw&L6RX90R z@3K}0+*`i!znIODeLG0#$iDqL%<0I!{X1C2vC<}%>haY$9~O&8Yf?v}2zpo`i9J9^ zKf3t!M+-okiH_nXwv$^Q=5>wL$Hj3X+2pdib2|!y^hP+X!|hK^;#Y^%Hgps<NP49S9?Wh<2&DXdlk$On27o=fiY7hUK{1!I9$ ze8)i3v7Y7#I@byRX(nE>+6FO$b&Whp7s3mK3R>ms}cpHLuy9CZD{Ty#k=5CY1 z%t1*c%Li*|{8ma*`V5{$;Es>Y?=Y>X1zrM$iju+YM9cE`wg%wIs1yAxK$Q4I0+A{R zSHrBui^b3x2fjGSuS~8Hk~a4xFdZe(A_J->)KZ1e-XlC)^qSGqz`a7)gz;UfCm{aA zl7Z=kOgY-L#CWqr+f8kirLBx5li3QcXt2YjQm|XX3js!ZKkTgqr55=H{K>V?Vnghd z=1=P&7aczEN7sUrEjgto^Cfp`INCDeV8-%5Z$Trx!>*hI93>|qg*XD2XVAqY@DPQi zTgVAkP3u5GOfnsI8CN%}hFRjrC`*Ey5X6RJgVV&N()tifw1Q+J3LZVcM*f|qn{GKu zhkJcOfnc;)eNmer?qU{8zEvE_U}Qw2#qqrZe3QXnSSTN>wpcmn<(~g)~#@ znV)?@v!z85W+7;EE7NK9go$jCqn0B>L4`ogM-krVAia+3H=Be2z`*rob>2x{S-wu`3dY zi$DVd;}*Wc6O7G`hCzppRA7+M&pcb0tTGztWNg0`eH(>bwSB^6r0N?Egf2(QN&~hI z&;}H~dqR-MU zT=UJP$I6lpJ-ZCrc_VW71#CiQt}w8?bUCt-rog0_-+99Esc1iii)i2PX?&zN+(L_MF!x*`Dy!(MF%jP=`oU+m(KDh zT8!AVaH~-b)?=(=<#V1YxpUp9LOJ?W3q*=7WCV0ntSHc+v5|X)4Vq-azpQrj^A~rA8h*uR@GyGjhgt?$X``Uu(deD}^ zViz{zxKU9zkd~pjdu1gyk#@Q%3*>0CZDT{?IvH@%Rvx8vM zTa-_s;AG2514pt$3^)-mbI}FpI9$-`;^wRr%6xPI!|i6ml$~D;In@b5=(09xDAkm5 z5NYO;3M-6!2Mkm|s~p;4>ZG(Pnj;-J8PXP#4`^pjpmJJ;WX3QH%*)^fSLJjf)?rkF z^&0}Y<1j@$RUTq``5hZ%;Sw5M>XKR}r&-C{j^~*b}Y;k5BAy3|pRd99@VUk3;K0=Hn)ajiaZLG?lYn zr6uZ8mX@fCSz+J0Ksz$4oMI8_p%AVkt`({a7xvI}&>+nq+z^Fomz9V-d5ol*Ig;=f z5lA_*sTivsl8+#wno}{!SZ2N3rDVzr0EDrpqcIHC2sJickYzXtG)d2H?}Q-D%xwIH zOlDdJX&z`uszMJCrkwA}Ot2uLaJ(une?o#i<4w`xjl{!+1HwB1J&k6U%!6C?eG(QD zGK$G%Dw@&~brQKGL-+|ksEU#y-*PL7Cn+5}G4~@+v_FT7{CQWgBz(D5#+j~Fu$*ws ze2{@H^@>Z(%W_-|SAdLo-doVgmTN#qvbOykXif7;uvY7_X?bb9T4XExFSMS7FV}p| zbZz@N;hF}Nfvpzg67$l8@H|93pIc&vAJ=5|ciL3;^2{W`QmHe$@G(EEGya;0psK7z!8d5k#I)rx= z3Z~li*qLhvqXQ(Y-gf#nm}?ngv6ZwNCXtS9Hm`(MJ9;H>Hmp}lkM>@sRx%5(?5ZS7 zVpWLtrn;j7&Z;n*P0TYdlBF@&Sq*Vh^W(B+GUH?l{fGq$+HPWj;5e%>QLL9G^@}i* zXjmdBtq`r$1kmjms*eHzl8cB@MLG$Eg~ArYz7`&sLB(X}u$dD!iB@E!xBg9xTWBB~ z=OH?f35E)=H)Nz2V??ZZch(aacZ@93q{&qh6v$pAOc1||WA?))fcUH{ozG=$o(gtW zc99sfcnHZb=uQoK$wZb0O=muI!mSx*k%WDkvr^K*;Y-6rg{>DjjN$7BUdg~|S%@=5 zMS|$4M~kNs|2#qvDKwEfO~P=NOCA#j$9X8)D%$opwHY-2G2Ywj>A)Vw_l_Qp?+=*c zQV#`3Y!ua59rDjCItF@+rNffYTMTvpCd>8Ryjfa-hf z76D8<2(OGU`?we0Jxq_u7xxw|2As3QF#rk-r_TY*X=EzqzF+k(FyJb1KGj{0BeyuQ zDctUW^VK&U^q7Lt+KaQ5<;Seo^mATTY=37o70YYuFbw&|u@lU;sj9&dr0J_Brg@Jk z5^`UbnEC}oMZ8rA4KDzyAPk^jS!NL-oXkpjHq|^xuw^lu3NaC5ut3O9c^Du?NC$%5 zF!EWzu<>%Zz`}9yw8Df%lZNmNw~j4jiYm)DfQ#W?xd15uJJfO8I*!%@y@3?cECb14D=&7MZ%eWq%Iu}h3x?<&~~ZDCy&z%Q7KT+4S0-Ce?BaLyR>6Y z00-a{SvKNC7_2Fl5yeW&%TTI;Xfx?(5KMU4R6b>=gfBOwoaxp+XnHi2&iFGBvzFVIB^P!eDhliZfw`cw2uYX%h4~f7ujTI2n<;j0 zp=AaAa_k!=&=!hwFSAKZO8{P;WR#d!>crLE#M|Z4%s?ern1xQ9&kmev)>%8-v>ePt z{O-cGvq2G=K?O9-8%Yu9kUVfBR-yXHwy=X^4cK!9W82zBCjFmkA(Kfy+Q-4`&$JF4 zdXecO7rkbs?V;>539N3lWHAe#!w4&S%gPqoERYvB+j=33IhxFmjf!Q+iE1XnlF|4Z z@{dTv&Y4@xS+vAv#U|S!LGV{rEU_@`4FOLb;>UEjcQ05}1Rtro!syXFKFPPjF52n_ z%TaXnz~*xE)-@-VSt_M5js>X=ax4lYiPR{^Vx+bgMt@?lZiY7=>%sWO5pgVfpVUJamhxhrh!4@Le|1t zsMudd1%#e3-3BbIGHX&b=2-z;5DjZTj`kuFDEXt%3J}f*?x9wqa7Y@)RXkG3F#-=7 zK_GfJcGDS{l9wHQ5E=Kn%*m}OC2n~<&^Zca4ngEHnmAUsw6b=QbUg8dhjRHKHjy*%&!K{>XM>DK#0hJROjxj(K zBHU>1!~t&Aa>pwqp$9^{-E7(DPNtCU?u6}VzT-KjJB(mQOs+nLWDxj>K-C>fu$fRa zk(nNA(TEQ|yjBAX3p!iiI0I)+IG`woQbQG6Kw+tOC$Nt~TzLoNdWw41a;S;fDMl&<1)NUOeR*MQIKbvPWBbq{9mD>q>bM9H)OtxFKCa zWt`^WbPUSQPozLWi{UXohiwGAlzA{5x$*IAV-Xl(>ns|ks717ku0UuT_fU(&!0>KU zbLX_JwIOEWZK)2nGm)_)mpVeB8M~AvMNEj+wq%0xBV?L76R6PnJPY7iaw3LHvaC!0 zJ5K=I%F4ID{4hd^VRvuNjC7BJ^Ju{g1IswkFQn!bp42wSk&7)mI6?#|yi1`N2F#qFGvGIALYs zAU-1bNSkVRf*LY!J3%!AIs`rM1l628?*wyVF;*_w)jYVFl`Am_5A*p)rRosUZi$ zGlu{K$%aRvxZMAz9(3?`r87o*ac#6E6-;#%<8DM)d#tEk)ny~Q{e1o&`1Gk&n*POZ3#o^QX%AJgW2Ul06}E(STIDrRFLm* z*jQBFiGthU-qm$D2{=!1CZ#qf*ozquf1Xfqhcog**;rjM0x2VcZY;R7&1xkD3dIh+IncE_6TO&OmJJ(K(NrjA;4*s7O{A8%UwX?t=Xx5BLVK+-M@b5tBdJ+fuVkJk zuBM$dv)G+Vn9>>o?1e#Qv3%OJ1HP1A_SO0E1@#h@o?HT zGGm<-C=6&G<1_Qtn#BYf7&+Dgo* zqwKZDNV5oe8JPGGr81k!e}DlgXKt9v5T>$(Pmo0)SQ&w4^vL0sxgiTMa6v=cQ5cjtQN1=eZ>{*PJqhwmD@4n&yzSx^U|FDL?rXyX-+9; zt~q50ZF9;9G|ef8Tg@pX=cPI62??>!wMh zPNDTGmy;;{%6Yifvz&)2eam@R4&LQFq0IA_M?eEgeSdjWhWM13`ytt0mm{DvKvaNb z7-2ueL3}R$UjjHoJ>PPEajgoTfzRjOmf^=u4*NTnDafS>eQGpXVJ+r1qyiEezN!Ws zNi)LjaRx?g(D+n=I2zej5C#QzzCu~_+!p#qo6kNwfDg)(+PmTHJWhL-u zTj1HD5E$h_?&Nd4%NTP5Ujopts?L&XdPc&XX+J(SFAZ6f3U;MoD&^J8DKh06P)O7^ zo`BUfoC9eoBDLA}XgmnJE)Xcp{poEr3&Z86csc^l*X486iA=c$6B22I*)mZ~k0pZP z`V>6OPM$U>j~S6nIez}Ayd{yzB-+a}iDY@)2&T#-@Q0N{A}hF8j$AIws;vZ|rEGO{ zQX$4%)U();MnsORI@6~FUJ-#ikcO3@twoT>>Ix18v3QnMYq=uHk6+TRNGD-AYeb$6 zT7rx@a>}Z8MSyS@5XF~assl?KTD+ztUn#75l0MMPEjdzH2LzDMsx28VT63&On?R$t zH5E*@MMK*_9&j|FeCcw})*D^Gs%u%bHws}yG9un8lf>|xyD|tt+uMV)jQmIat&(x( zq?Qcf5M5FbOe}0+ZAvr}pPEJ^T;7TdkL7Tr&R@V*F|Y!I`td_B(GJH8Gm;7*F+?6v zhdU13RF-CAg>hu^VCSloh&;gy{LKxBxUrB?Y38N|E=*7v(kH8fcB)FbSe441G=!d& zv3fdp`hctk@<}KydcZ0>GYJJ`Ui5|;L3j`gpT+0LaKZ57=AHfBG256V80iqeErZk| zZlLoJe=Gs7!?RAYnk;={~b8+VR8SapAmz115L*uwvK- zFkfaM;k3LAA4`k1BwIcQlaf0(v{Wd^KvM!?*jeT0#+8!7n%=6Rq@vUeEEf`Cn5odV z?9>hOA<2~PVqx03o;tAj zI2fiYIw0H#dKZe;4*R;R3TP0J^avgR@bUMSGmVvQ-{t zupkhq$g)J;@Kt$2m6|x9a+J|4X(S6}=i(-UTi9m4y!RJdK2N@`41q>SI#GgvWB|U1 zyK6d;O#!|I^CKI1mYj6tk{t4pPlaxETEOIn8;(%Z zX)>J9Z5(9VZ&$mp@q8Vb=kq77NV_uH#v+0Jfxqc(S(#~$6040J7tbtJUKaU^a4?DP zSy=jXJ_ogmIXAo&AUe?HV^=|=8O2HptLdGHyfkog9J__i4yG66vuT}dxkhy)JLHBF z0kXq%jpr5@C(<0h>|*6a;Uz})EVC18y(6sW=xHf(aMz3q6;_aM4w&o33MWNY90&4s z%1P+<$g-2d>>g%oz=HBJtShszRs-37z{n0q_4ypya@O4NmO@O4A-|R-CxJ04x#6V5 z`q2?5H#wA0Nzi#Y)){_Yj!V%OZS4~~ISwDgsy4Jz63qnB;e|;eg?b5CFDJy+(C&)m zbRL4(%L%pN>=h)qkn)MFpm2n^7jb!+oefcVY4^V~JLRmo*(rtSXQ!M*K0B3I=j>EM zC9_kGb2*(oQ~&Q1l1W_Btl9J5oz z3?7gcb zjQPfM0`%?Y#Os<+hPJjPeBtuakp4_G7OR3_3#mLk)yFdA8jeYz4Q6XEY#Om!Vhdur zB2JC4ob8H5hhWPJH)AUu2lNm#@x^Elma<1)I zFSX5$ucyk6gSbYD%8n~jRMyjemT4W05OJae1%Ltgl4$0TlMefFaOkH{Dw>21T_Dq* zRDB<(e9?T|_}mSt4T)GVg~R9~5A1wyBBh);*(5`lQoX7M9ROh0az&I6DK+S;xH68@ z0~K1PhDw^GNTP+xV96-Ne?*z9wtup6XaBGt_<9erOdezuK?MDUKY+qMFeAAGI~{La{$ZDxe6-H$kbB^ zovr};JPa}wsdLCUk$D+4*4bz>o5_#1%W>q!2b+Qi1v&<&ADxfZaOfmCKd0YR;)f;C zbgl#@^eBt)WymEbB=>S(ftuiy(cc!0(7<7NYGQ#Y-^zTVLoXIeq>Roi;!LYAYeE+> zFln3MViyYNgS|&MQ>Fx5i5>mD<4LHXU@Qi)l);moHXZmK}*$Hs9wJQqJ6zmmwVUUJ8N<>pai5cQ`5`+0x}!rIhmfd* zxQv>1vg{VD1}+G784_INtYUe%!XagWowRU-cMl*6~0nU0$Z;wDuM-hURnU$8qGQA)Dfueq16< zyP5E2G`xS2>Efmihhk2x<$5iP)=UuzOqd!h!p9s4=YEwZ7>{>NgJ?$85QQ89Z07gm zwo1jF>jo9d(IrYCbWbI9q2YQ*NnkE7tTvzoqt0)Kmvoug>Ma*h(BzaGJHd0vjwSP& zpXKZ0Eg!~r-d=f>t>;OpQc-Iri3^D^VN_^WeM?DbI46x<4l6lW?U*B-Ie2p<6G!8= zkh7y}8}?RhC=PTY7Ul#_p0-$W-khMZ#yOY2L(C{(AO@@yZlYLUdA1p|M5f{-(}v`< zv}?pWd|I$D;N@74mrE4H(yJwMY<@1qlUtKbiTtig4zAoF5mOz*!vRpOJ`SKcaaprd^Uc`P!(K%kxkGClo(;w`(c|&O3v$Ip<j) z2zYIYJ*`h-x#$Fy&1eNwn4TiabscgLWUN^s7vxR?v%x*$&C%)+?re6CgyQ(kg^V4S zxvxk0_Q7TNaU#Y3PKAklcVNS46Uc@a3$lCy&_@Uw3r|*n)fskexi`fO1feG+NXU}vt6 z;J1+AY!F$Ug%DICf!jSQ5wD3`B|`J|=#t1doal_FsZD@bO<18SqCsj`I|#IW=}8I; z*=S~o94W|P0p$I$CXq1H7ERG;QQ(V#W|3TmiFDlSP~M(-5?QcWZySd;bLOkx>l8CZ zv3ra~riqA|Cf=%Tp3l(Xlrw$6IT#ru7DV;1%4-%;YsIQTAwY5?sf2hTxlvdbuyZ4` z&=sLjwjG6~Ll&C67}_k>HALnmQu*14N%+d;zLl>-!*;U3hhD+Zf>yYE91ml!KOuTc zFqUi!f{2kXtxk?!gojl^mvL?3d@Xz#Ek6fqrFIrXJ2sv0{B(Xp%IJ({GTeqWpEg$w ze{L|Sah#?kQ-su{iZP%gu=^v zfle^GQi&Rtn!pE}6>e%MWUPh*Y8fK5a;I%m^Ua-EItqtn;*Htd*~Am^*}+B8_H4U9 zn@obK6vdz4)(QgspJ^X+)G>;ce2~g?5&LSgUuYQ_I_ER13bfScJwmI4D<=WORL8V; z0ALR^JGzM5^f)l>(M2kaMa0tKBwGm;P+=~LC?8~Q=_mNshZ{ivD46lUFw9H0)~Sbo zel$~E23%)rfR29GVPOb3oi*eNs)miG=iRAz@eW zkRw}ZaV>pE%1o=!ODXcBF2RGz_`*y+^>~3NH%s_5JTZ{{j;{>!f;+3gC}`QHV<;n> zd|?t?Sn7;}LJ9I_I1~7Kifbg$z|3%sounYq1~?LEQV9rVWrUHzvK-@Acc60FB%75X0zn#*TC7q9RaULFm~e?>%m_M-Tt!8NEI0{g12NdhFk>`awn|V z2B%`lTS?l2X+L^pIF*KYOt>I9jiOb{>i)!W(3J-CI<%84CI)L+bMWI}o;fm-v8BGW2sG|dcipHwiXvPQxickP~ zXlaOJ7rIkMJDWOENOZXgu zx@UsXxZ-nVED;h*f=FUUFfHaC3IwxoCr*(@vZ>G@80tpQ4^#0uLEM;JGnnON807>G z>(D4hivc~9fP+H5^|`t=BoeWP1itvkbdVF0O}D{yMt@tPGX$+wkxZJez;6oZB z5fj5vI3bBg(`~iEEX1OKLrSD9)I+SPM4ZH$lX2*b#=+Q+=Cmvo2FhFvz`{a?5R4%< z8zKtlM2${xjfSR(!Bt>eg~6+fb^d5FmeN4I;MExeEPS(#_C%^{ZZH*x%CSY3(se-A z)zNS*o)a$RLfE-*MH{Y)L6f2f7QC`=j+05}l0mvHk&T7%V8cp56KImKzDD3)y%_aU z+ZfOx=7t9*I`bY6e=w@$kxhoJtDjiai$%dyI7Y!H0H-P}xjtx0h)zJcan>$+I6VJA{7^(UQXkd5(&x|)AF^%Sv zr0oRaj0H8>G$uOJGvkz5E(}6OEH*un0(u(awIP^k%Y^|Jv!wwP+genq?Lo$M(^(y(}QM3!d`X+gRBS?>MW$ljEqgGf3paxXi#j{+P zBdCL5!OOVA@F;L)hVMVSGsAh#F+yeDq2oM4D^l=~7Cf~SZw0xgFRz%$76*BMgG~T;QV@y|Hjp8mRVb7+rX4|7R%l00(VdH=z(xZ< z%mi8n^O%xsGW|^`!%r2JA(t45_6=1>up2q$gl9m`#H|gTkV@u!N?{ zwtIx)4L0G*_o3ZdA+F6;C>mk|R}DKl8kJa%!I)8vV>=51I24(V9IKceTrBI z6<0x4+KXg;(umj8PV*z%4JZ{wC{()<#%#f}8@&hvEh>QUXq`~@Cz*&tRLu^Al29O8 z+IaoFh*whBePz(bm8G>MhR`%cROKOp38<)+q{}W1 zzE2QCJUu;Vov1Y@O)I839>sj963F(q2od_6DRVXhdkx3ZNM=QmWMQKzFf`fC5o!~x zrb~Aol*V4!xT2C0*oi^&EK&Nv59OtN+lNb+KkGvw^xYE}4deqI9+I+!!AO>IMMYdU zRy1QN(0yZN7Te9@B&k5ujRqe_D4uv?^VM3ZC=iCdi%o}*q6bgFM)Fsl;iD5do?M{9F#<|e1b^Z;MXNd=|Pc$%`O~4;0KFgT2X~s0)>i_ zIp;*n@^^}WT6$kcYTPAD!ClZ-9Zejx!tH;Z& zUnV!I&*SXaiDITJD}(o-cCb}Rg&-OblMYi3_5k?QCm6#KQR*WVn2AtJo(#H6M#B~r z-|Cr(ABI;nu0IHEORhl4Ti*ddlF%aJ3TS_(nWZfpUnn>o22Dg!BBXgS$&j7-h0DzR zNVyh?ZJ9V|n2M|%0LaY##${)Jro37#=4_TV!S;65IA+rzBm9%gg9WrA zMl5H4qQ!_wE*CjQmljB^immNnG$T?#aYCl#0wp)kqe1>)8PC1n)pCro~x%87~CyjUtcpGb@}#gK9$P{m>A$L>GJ+413|*`+?cnSSFf`v5(t3a+{Uy48qn>HG70) zD2L=xApzukFl2V3BWkZC&5gBOBa>9nCg9xN-v!%f@aF+VK5Xh&&1kENL32~!Ttz%6 z%>5G~#x^s1UyC=gWlX$uIZE8Ag6*OO`A-E}V~LhvEcZC~A_E*z+-VM(sE!^#akAWk zG8tP|q(+^|rHuWAR20qy!ga7g#?};A4s{Tm54lfjHH@5lJMp%QjTmY#tH%Q z5vEdeijQ7N5>&<{i%e-oA_%2|R1az>9299~4;ZkFxDHW^7I!_wj&kIXHcS%KU$>(1 zNbMRXfwC(JCu?}DJirf+aS7VPfOQL>2xAM#jtvGU4J*W?JHynlj2eTT)xk^<_W)8q za0@#01{1|@8>n_~CXvH%#7poMF#+b`q8b5RO;%3@2jU)r{GLF%!+XJ~n6kRyMYSR$ zH6@v)aXaXwvaM`k|RDRh?ix|s$g;7q&8r0=qz6>wL5Om_&7vjpo=vu`>G-QEPpox=&v+t*j^|XU2yjccxx%P& zhjl^g_}3nfZ1Kdc0yd??9 z*TqYQ*Dhc(0_7scg0%}73sf#Sz=m~RAYhjgHld3gCvM9Ztf)`2pV<(lEAP zn!`vX$4D>=LJDjfu!YvJo6f+LygHDp4<5FSu$S#JC%1+zZh0q#GKU~K!g1m?Ip7X( zQYdqfsYSvll&VH7MyVd5LuF*-8Gza)RSa9W*T$$2QFH~qJc0c{_-W~Z8k*hk%pm}d z3Erl9490Bi9x?|U|4P{d>)TssyjgRcpngT~~ zp>zykD$>g63W!IhCLdFV>3EQFt!F}Jx{ix-hMD_5a*+?zNyiGWFmvb#p=auAQx(hmBt%+&h<1Lg=YI!mnla{3Y;UUSy-=R%26|I zQ8JMR#hc6lY7et_&O$QoDnh_@kN`6%Q?_()be#gXQbj&|DrBS6I2~a80XYqDg%V&W ze}rKRg^y?}A^L#s)B=O56Y$W94&?`JL4UMS9YyzRV8f^7gQo%td8f;4Mlcn|hbcOc zKM~2ef~dwsUyX?g8%Mf|+9i{LgSnPNcOpkMkbnIlj;o*1Sfiz8btf3^jDmqM^O!jRw^ z%a)xG2DU2=l~&1CupY(J5pX9|(2MEF`@24sX-g2-5V#H-$&_Q4rgHKqWjVZOSsq7$ zF(NcLhUw@avVyG#aw{yWwi1ArvSq7jCDS6hb%uzC#?}dP3A`c#CSSu!-~_t$m6j&R zV|4|Gf>_jL)mpA-fMB0n)xB1W5iLf>?8mZdT@m0o1_I77Oj&RhnCaSsaJf@Aprjxu zE?%IT5{+aVAY3PR%>^}$`6h}V`#eQE#P|JFITO!n%fFT$-$~Kdi8Pakd)cr*sBk_o zBM8?vY)Qs4VUnO);N_GF!g9-XHxKd065{h3Huo^4SLJ|c*)%Jp(O8n87d9XceNrrXaF>Im*x^cT)EQmPUD<#R-C~HDS*!oh;5xT(ejh1Fo7G zi_al|0_id{1Ep5RayP-+RhlJ$b<|TZ15y^P%Ez)*Dts&m=309cTu;b1)wF;rHE}?0 zg0uXnRg-*Db}nurxQ=Y*%Wr;Ie#*^XWnvN9ND{1L-twuCoo*?w2*U+eFgm!2zUFuu zZN%*Nn;h9X5s^G2~)RlHU^K%qPJyI=(LP$ zX@xnaQc414mRL5FSbQ^zYb+&H;*%oBI=xfmIH#YA9EWvdwp|;d;J=$&W64S6jitmo z8%qh5G?pCeY%Dp>*;sO%qp@I%l7^|Ic5|w#slbY1I%(O49dpf}fjA1}da^dnJ#Ycb ziC&FvXiH=g6>04GMcu0*_GhvwL1qEAP}|4DGlKCjL?47P3$C`4m|O4p<1BH|b^0MI z@0v6IP3j^Y)-bIm*SeP3TgJRG_Egm}wJUkqWKY#?sLQ#wjAOmJwz={3RM~M5SXdF+ zU|gA^vP!Yukcb6S@;hU!Pq{+EOQ}I-VTM>e;-sQ1FF?ygkqj!4L^4=1ir%{ytT%A? z6FE}mCX-b}@-nN?&SFy)8f&RoTA_1y`qAmJ#-XWy82!e!ZWC-b{B6+)Jp^({K`|XF zA=O1hoJXV`Gf7q=B#TW zVr%k-ji9wDuNQt2y1zE;yG61(sht<4{tiRQ0~PV?--~s-dkUkd1LA7*$QU+{cYaB_ZCS zE3O18iOk&Cs}eb6$C9x0h`BOr6RMD!X^PQ>W=%S5COubjQiLuT^B6$b!{D_$&jV1!%c@`s<~`RTBbwNA4Gr$oF>U}Oh& z(pB9WVu!baR^`^ajVyJdOejG-Mq0TR+z9f=tr1=E&Idc>p8&6>#HPoh5@(Uz zD{DWNmoJW_`EZ4iaL^Ri9=Eigr3Z69td|m220J)#Y~4H!4Ntt7nrXW-2WGCL%o8uq zgTfQH9EOA^eoV7@9uVeLW+LR#u{U##-IoT{JcVz=LUhVBW2MxSImZe^YC5JOO@j_c zkd)?EdiB)TO0Vg%nX-3_axAYqskY3FKbCyzATKSysWg5 zq!WDsa8BT&;LFiyB>TX#1%-WwlL{0b&I6DJzP5tqxsx~qM-H^CilKegjjarJKO_O= z-AmU92m40K6&*-}LEMZ`uHhO*7gw-(3t7-Lz(9lsF4tiAWq>@CD?F!%>y2Utwt~k^ zJdDrzK-bYQ6~I{c@eW72kaslR1Zd#6wdnW&{RU1K&|p*%SRt2v_|_#oT?3!6!?T9E zR5n$Bjfvx)iG6w0BbK;MyMygJqaLwd8RMJu&>mGJ#5j7x#yy7s@!7>=mI-$)CnP2D z1u}}5q{71PA!H{^abqriE;`! zTL6DiGm@eY;+>P8 zTt3LzbhhzKfxQt46FCjY7BOa?k38Tmd+VK#Mdu3;=L|V#tkL)&dAJRs(Sk%yaNg^fP&67wHa0PULv}WsHcNb#YaWb!y!y> zP^+hz<-tI2dKyb&4%`F|!~&se1@iCpzG7VNI4ndn@U3X=vNx*)-)fI88ec}ht&(UQo%w4aJh|- zX5!8s?OLJ<@De~X$6Gd7>O-3!e>~hJZ`Do?wsZoSx2d9Lkn6-zbMicmSQenCz!Nke z9Ne2Y3WAEpS#k%nfmqzp0WQdmJKk1;xzH@`gtl6qBVjuVQ0gjk*p|frsJr{hlGBDmP11&B5+hW3%?!G}K~Qi4QD@s3yTfQg~PjH3XmHa_`%p%CUmw4wOdm5}ijn=8m2>3gK>{ zoJe-j4R*<$>PT;tk;kvDKQs{Lf>177JeyAY9KK=4)C@6F~qx9Z@ zzFZ0tO}P{lx^gjI-o7Nd5B}VbYlaaFv1L?yZNVcK1~BU~ zD=(UZM)aQbNG3YcdLz>hWSJu?Hc0WFtn#c_hg8=orgCfaS)x*&iIPrVF(nzcth<`F z^yD7w52pO*d?#I{spx0t);JElzEK=-ul5cHp|@6)lexE^<=;it3RvS3o$+)K;!T1o zJsmcRUjH@J1 zQaW~`stl^{=3BZtrXs1nQ2cNVSIO-yL*xnJ3iN z(_rFv8k<2T^c7IWm0lG(mTU_$(JK@%?ozP|W4+TvWPl1LyC|!`N-jgHkimGoi<8{i zLddoND$Ynd7J^Obpkl}=9hQACOow9+T$DKWgh~a1jhnt*gzKpaKGouzAu60Kc9s(B zIP*~;StUjVK|$Vxa9m0#*?nuo}}K0i@4FDpMul z36xmw;YSrpauHVv=#8<2xPM~gGj0{ z%-b(22)3}<=fo zP^xHJf{D|mR19HFV{T!qPzf`FiV9#xV$%vk{;q+F6&vMUfpJ(46*&C50Ex1pL>QgQ zB=#8}1;}|vNdQWmN)-swbhWVfVOOO@41#iKp~x4}0X6*<&1ZytLGxK<@wmZ4z=38f z98ox3T`WXW>aJ=f)5n>W86f9zX$G3D5jgl*7rTk>to28g?XHMhzq{eX8|^k`?`rf? z=gyF7Gj~`~;Odu_fZGaMCYl^bZ2x_9MhSAuh>>Q7cn9Fp{^vO1YUj+zyrA%B3*_MA zxj4e!*=IWp>f1xMnf4KL_%;v{&$(?N#Agp$I;D9Q8TmNDZwetZETv*+?=v8@b2U5* zfuH8qa*#yn1PKA#dMo;-zUVUgw0Yc@JE>(pXHFXRTu@nA8vrT22gz3DptQU-U2uvgurzK}9sPd6DPoS>Tr=-T4(TX=72 z1?+<4uBMq8GwmT^=T%}!xS7&#TieK_H(75}3zjZ*xOD&{>T}v|=8t839`>zDcS&nErp=J`%|`E3X1J3TVV)_#71r~k@`0!z z!*?CY^T@1q*IS<0i0P3m*IRL<349)OEw*Ou$g>|_t9EY#j6|7$3z6p5Fw5LsHItxq z`WXwyml>+zo^BioT7{nGAW-iF98k54(j36~B#MmZJzS1_y{Z5@whp}_FNJk*^;%Tn zpb~phA}K5%p46{Cgmy1sy7-cB>Taeq_^AVv#ubex72PYjf)n@{m7=u;hgTy(0SQBJ z1c-d#%9maoC-Y-wJdC56NR2qOj)XulGw3lbF|3nqqr9wgZ)FcgO*x^5#X(N!ZqyX7 zp~GPawnheHbof(>>vZ$O2T26eOm53hRT%| zk3`~un*%BGX~frz^fbbWyzBnX;a;2(4~GS{Mj7w`ZZOspVHP&x*k*&onaHvr=RmH^JqS)ZU+{9`%h1h>a$Z{7L(aLt z_L$dJM7)#Xwp$hP;JYDlRuG1p?OcKa1>`uu7~4_v4(SRWq={+NAF(4$rUYvr=oMqpgJdHHI&#dT#qQAb_!BSV=D{n zokh+yAj+v*izy1=(Tt*Q1Z|)LHCe7>%;DAKx)wVrvf?XW^4?+`qhPy4!dLl;_0ai*%VkoXl|-jh7f_=Tvy>(*EFBr+eZj#B0sc|xT#Tb zD|JYt{jH{|3wA_X@zI^iL(QZm@{0FmGb0p$s6>{dv_A$L-W1;!T6(flRDx05wPr3{wE=M}J`i_#cKnSk5r=-M7?kXv< ztgn)`*sPb44rsX+=|SAndK#$e{*tUh)tWm@a=hvulMF4n%Or)V?=#8a$wWGvq7Mmc z8iM!X(E-`xR#}!r@UZur)F|POlMKkXJ7`K}9v7oicTxZkV9D9Cj!JsxNmgVys#V>4 zQovn~g5^}^;i;y~!l|Gaq;(9Z0rQ7$8ldt%l&nUogESUwpcvV}j11xKlhS z7v&u(8CrAhp(%-Q1ffH+_oZY7Ko$$>ohccZS0v;J_1!5sUUq*RYzy7c?50qUoyPC=+`x3Fr-xbl zJZ~`Vz$aTXJtJ;o<{j#iF9~eH@84XQqccnxVJ_nX-v!A{kO;dyeK7zm+3UH{fVS%b zF+Eo+LZNJXHik{6UTLfyU(N*DUZQ3qeZj4rq#nlYBVC|oWDS?vSi8;KdfOtij<8+w zL0eREYuO>zW^-FgeYNV0V5+4HbV_*So%#f8TVK8bb;(2KMy}0;+hyvRBTWxHY!lhm zHkTF?eXv~kqS%t22E5>3<-*q5XS(3XF4Lt-Xj`f019!@D8;HyvQ_tDY>@Z!Bbm!;^ zr5zW3;SzugN3s)j0Xa99ZUo%c(gp1B!g0ZK8%7r_-Y)7fmNemZcP?Ybc5HEBj(j{^ zAm;8)+pVVi0^QnbvFxTzpSPBcwH1@{Xb(nVF9Hul)x!mtXdL^7qlaSQh_xEFI%w~L zHX!&3gn~fD9C~a@vd1pfOI#+57@H>pIG+<-#f;>0$%e{RHTgI&OVmH}@yRLsE- zuo$VzXr>Wf-k=|02WOxoz{9iA&;oR1OAU|}bKtS8_F!gaH3iNNE-)ane+HGfBAtYP z0hcJee4B=S8A?D|%r?T&AYz9v4RBxZUKf3-qbJc-q=;$CA1@RJQ!;S2uRvE8pyClD z1^*94)964Ms|ywJFccP=i&B%FbRukoW{jOM4rOD1VIjm{j{SnYmhgwF3d`-Mth&a? zR74_h&}n@u2ylRz;J}xOW}s!c�O7g!n8S&QCcqKRiB)zD=)afhUAu_lvp$%0ORw zK`H3@1^80gl`$GJa4-yCqQq@C)l~)0_GB=<_-%GJ6Ko-@?Ibv3#!oLICUi$l{+Yo; z6gG2w)p6fj*HWu$U}?ea9_;2B$2QVTSXu%Zz_Qv$DJpZ~UDh!vXq_ zGEy+Rs%p@12O99CKZ5^xB>IUwIw^8C8P(((3{YUMP{G#sy^5^{)1*>7dZP%} zQ^jjK#5in|BtrYtVIz>E2#{jlTdtbJTr9Fn#e4*CC76gR!eMl`5alBz!URe;fGH^f zQINz$A|IUJv6K)#*Mh)S=hTo$#7Oy=>;(??_+raQ%vc=fI)7CR`ME*Unu>XyzcvBZ zsyaW}SSC_@B7vcAn39?WP3MV>+$v#Su)-vY6gZN5>@PhA1q6?e6QZ&(C@f_qt3vqm|Z#fRDGD2k< zjaINzq#%F`y|3&bG^eFNh*agE>1Jm(PV-E>QVKkpXG%w9^GqsCInK>9HQr`+K8;2? znLv-vI`SeLEyw33q%2?qJ?v98sVK6JELvOhOhoJ;6ixm@UFJsP5O|$Zu?Girey&5< zq~@7o<@i*)CSqB698+Fr0-8!@J)393nMe#CUPqG!DewgW+Bb(aOaqkw4GmBU>1d@% z4Rwx`Kqb=j;rWsz=#KP90uQ?YhJ%Kh;=X%Y73yfNnj!R(iICswE0%B(HW^gBpVL} z;0je_?57T@Zw6byX}$muF(?iEZA4)_h0rP%Xaz+G z7b|3t%Y2T{bAqWTQCsaKcp;l?XBajRLBL312%H3&b%7>=x>-LLqL+K&@gJfgTc4>& zV}R(j%mO%libAm?DFb-4#wu{=2CCWM4;g6THZ!tcYpfE6E(uWs>HzI~@)b6*?S}d2 zGx^lWJp@g@F}!g=^J#D=f`os8^cWCKhdw|#SG5_T1q@T@>P!~&8%TjOF__`>A5^x$ zFVOU0cW0NCsw3w8ctGGru>t7BFT=iHhS`&^mP2@JjC^1#!{9`2w0;Bu?~min2=D-v zAIol>FfDF=C;uY5Y|^e&!nelAOQWcsRD*`FdvUr^#jRe1}!bMQ^ z*bhR7Jr))A|5pGhy%+1d>Qyg7XPfS*S}0EChJv zPG_<$ffiVkV9cBU{qpV(4;K{d-5Y-Qpx;Kr-`xrd`izCYdlnS*U0hIzQu<8?Ec)K7 zpd0>xKHdv|O5hLR3OWn6OPsfBVZjdYZ~PxTCh1GV1so$214BYO5y^CdaluFYLQG$h zf=~Cq@~Kb94tsBG$;M65$cP*2(#uXWIk0~}dhM$7Z=OH&hOX-_@ejYcc&D0vp8b6J(Z@dCZ}7*TZdu;E zZr}3zzTNHG+d9Wz6`6RQZ^Wh(uK#}Ho-0q->#g#4miT&n@<@2`p?^Qsi1)nU{6lW* zU-8OmUyfM!*V85^Zhddr(bqlN|Gu}rdi<_^-cF8L(*465Prj*d!JC^0|Mg!x4J=p^ z8`^tg$GN55d(VGv@aDZ%Kd@-esi%D25k4dH(A@CAl5W=)eVl&3$MD|<&sp`wne!g( zIq~49-@N99#a(~zcEH#rr~kTn{QQwi@9+7|%6(5e=YfL;UiHj@|Ngu&@%C?Djq(rJ z8b9FY*{@uCd}6~hTi@J!%1w8^x8bj`L75BIhI+-{oj3Wli$|nh{NcGxt*19ke0jvl zU%s(w;lN*~OyB>gg7?}AdW{@9=Hz$Jh~M+}s1s`uIO z<2?tqUwcOIu96QIuiq5=^xqB3Uf3h~^pPJgoi;x5&|&+(|MiiF-1hYecbxcrcDtq1 zs#bT_K6-rF6Zb#(+kW>q-T&H|^G9<$;_|4^XrXs%X=3*eZcw$ww~VE{7u`yCtm-$;G1jj zT>o*Xf7t;C?fCxLJ0*u~G)^D?Wbw3L&)%)3Tc4Be``eD)wyvzdVAajvd{k|`zjBB9 z2Ygoa&Z^xjziypA>4EbK`kZmu8H?Qt~&k0Yh?pL?$iaF05wPEjX?jE`(cIc=7JZ$SFL#N+x-1nF4v*(#V zKXt|n@634lvrTst?|b*ir&G^A(0=@iv$}70-mHF=^KLF{-Y)gWQx7hBAo<*utG2wh z-+=Y!>^J$@ioqY<_TaMD*S-ACNw++-`RK^p88dJFSKl)a-t^ElKNZZmYS6?1uN~Iy zZ(pt&@x|5!!y0x?gx5_DPF_53^&ZRmKV4CN%8RGGo%yD%=7^ilEqb?c?Z^99e0Ec} zO|2u}4_x!YWu<3!PY-zal?z5pef`xj_pPmb@SC6Jjvo6#zc&94OS5x^%$<4sy%WxT z>E+uV`{~x}?++@5TMk>?xa7h`13vp`%hv;c{jG29 zzD-AWKc}fG82Mm?vH7pPuKwqQ7k7T;!Yj}AwS4!%IsNZGBQ^1s`ZpFWp3;5Au8D&l z?>g~`^4)88?Xl_k_r4n7zwU2OpSI@XssV>&{}@>?`-?%hTzA45EB1P>^OS^f)EB=R zJ^DWVL2%96=UuyQ$^#wu9G9uM?w-wOpICR$rAx*Y_u28iB0%Y zqCSgn9(M5y!_Is0`j-y+V!)~w7L6WWFmJCLM%V1Iwf`{#zdP^Ny}vzU*rxZM`l;si z%Q~vFk9O5=Ja+WqJ61e4o_YS>vkrLW{Lmrq ze^vJ6-Xm+fw;p?NW#F{~Pa1l}gKv!4bJN9NWk26x^X?-T_8xxw(ygy;-FMVQKMy_R zrm2f>UETG@!iD#&T{3s`P3J!RaQT>ZzmB-$!~Umk-7sjol8>XIEnhx$cl|Pd(?9R| z;fEJq{PMT|%sc7RYyYx$O;u^A^76HP{HKK$B)!Z zd{cQ)zms3>yujD*X;}t)?AE~`)*zZ%$i0}5r#ff=EeOq67@3G^` zl9Tpc_|ms`t$KV^;lQU49CQ0Cy*KZ%*soVexf>YM+){KMpNYwx;j>M=`i8aT1(?1%4c zJM*Qcf6c$@!O9ob?{V`BuYVrjadN*=NB{oT_Ji+T^Y6#6IDbIJhnW+v{rtNnCofod z*04t>Z?}9^>x+wepSI-Y)z1zsJ#4!}2CpjVJ9($M)296Gs-Z`xuP9k^)!5GJnZ40H$9cz)SAss{pyL% zxo6#f>8)41bo6T@KRWcKYkv(*+WgCwNB1wB)%D7Oe-A8Q^y6>MXS{Lw8J~qF)!*6l zPWTUSIk@r7yS`cS>#@(By>{xdm%87%U-S0c*FTbZz2&1xcb&5O`ppN{7>~{PeZ{K3 z%zyjpzRM?n*Z9SrEx~KfK4(yDaQk(G7JeS-sK4TY-5)L7;g8IO)rEcL9{l1Z7gwGA z_8%*5sl06dfo(tU^jP)vFMj`g_4tX0J)F4k&EKZ1pRoMs!#4I>esQ8M^yIB?jr(Ka z3FC(sJ+OA(_m7Mic<8##Pn~Cc`b_7Q3n#zTc){nf+mlDszk5jgvK3!fK6c4_&yG9b z(H(=2tpE7=ThrTL@y^;$E?9rr_TTJRI&;SA(SddEJ{O;yIBvx1tDgV8?HHqe@>|WH z+_Ye>|CTK~-#+fnclWyU)k(v@udJHA`}8>@r%Zn0pv&Jpcl?|;uX*c@g=cMe>&!Vn zZ{2sN;iv5TMAw(MU9)&Y?0~c4pS^bDW5+i2d$s)3s@n?u7i_$!*V-PV3#uP_=(YDg z@B7VHPi~$cYnsyUV55JJb^D%n&A(PZJ7MwS_|NeVFW&G@udYW{kG}HxQ|?|ec4hIw zJ#IVggFZbsezT(Sm(ZFGpKnPFdtk<-uh!hK{K{U#hF-hwwiPEowC?RgdhP^TAgF(Z zwV<0JH4tfyyTUj0a}xcw9sI5O(+ko-i!2y~w8J16%?w|#BZ8DwqP{~?L3j9L;&!od zRiFgpLu3)NtBpB48%$-6M@WGWgPG3e#^%*G7H#o&fpM$dS1IP9OWWPfALXp%-y8TN zeco4rxI;aEd3WJLXt$@Q9I~iAR@7mnP!zUNE%ZrOUJ3DE6LunB(U2N`{fd$+=F-3s?8>1XjM>= ztKX?2IMl?`JY8B{Qi+SQ!$BUe#`G4=Rbb^iJ>LI&hY$ewi|KReS+|-~G$rRdb)Y^@QF3IPRB$JI@@r{T?^p_}0j=UtSbyYaDp+S%3TDp#{5N_+Iy$ z3s1VZXY2a@r(QVmxG#I(bxZ3Dhll_EfwWCoOSKyVe@`F?zsD|8#MmdS3X|*-Sh*W z`Sh_fKkItxp1kL|{mzANpb6 z?zjH3^P`{i8+OmDOJ2PBfa3LIZm+xbv^{z}`B}p|wFlPhIAUw;z9E+^m~qDYM_>8w z^tZ;JI{vGvFMV*ttV!R0nLTRgG0DB=Ox}6(`~7zM=!|`PJ@D!s1J9ZN(vcUR_t~ta zA8gwF*6PgOd#o(4d4Bm`{XW^@Z4dC z{?(|;zVlr9z9XKvYVJ?I^{?EpVt(3Jyl-|Oh>80^Ost_|qMOi0|6^ieLdm$X<3UoC zluZCJQ8vD0Y{_K$^M9laZZrO)?e_xOO>>vxU5{LCJyALjLc_2j_i-|pM}-sW>>&+GS1c>IWgvj!fy*Xc&M~-M{J$L&%ihg|V=Fvrov~T{moyFZ1e@es8r5x@pbA6*d0mM{X^yxc#SJKTN*x@tWFci-*=O zXt=22jK?!AeRn*i;`Fk=EnQb~#1}{P7<*RR?dR_Gu95zub-r=`%-1{qUbd^Ts`G+p z#*i7mtnhe{fgQq}@1>jb(kbma=a&_t9?J^1ha7vrp8~pmg~B}xOO}2MtHSo9 zdcjh*UAMwPdn1XEc4#A}NGMtQm<8@uvh=ROOK*o2BZ{7vEK0_6oDj;!CjPy0F8nE#EVcKup)w`x(J^5gf0y13^4o z6oQj*{G>!05ka(_(OgE!1kj?)0BPk9x>`{ZhsT8C0Z-5yK@&>*gsF+e*D(_=tsS%I z?k~@}{O#{LFaNgVmClm-M~0qy%Be#xJ-BA#w>MmV=sBY|t~+n%*B|^oefhs%2@iO# ztA5<;tEc|F=#K?YZ}-JXlTSI*U$kM;Lxn zBMz!r^J-$B54OB~cXHE!Y47j<>^JR;zWn6Q-FCbF?Zv~#KfCX%Zwz>C!N%45jM(YN zRX3lTUV7}4LyqoUyyCW>s%LzC?4+v({&4Vqtwnz;JMPDR%U*nU%bMb!{l^_0emGRt z`D6KZqvvdSbHK3vZ{C~UqyEk}CY=1p>CJCkcj-UJR{r|>s|&AMysGi;ArG8ixzElc zpBk{&U9+#4A9{M$lHD3^{M)NadGWLeKBh_J(n_}adA-Qf$X$24+_ zH&S-~*D4yIA(fWGo8qOVlgCdinS?Z?vGB8m{w$eSI=E!_UVVD6*zb(I{s1n?`h|(>wN3C_WkGY zKIpw0_FDNt|Lsrt+hgB7bZzC&6+Jhde(!tdKJ|}^P1hV&9UlC_W4AuI{*pC;fA3i~ z{iBa&EE;snisO1D`wZUg?XJ@oj~+Mk+7+G2j^y;EohzoDwCSksFD^RgxkW$DcyQ(& zdyfd7*ggJ6;W4*lPk(OS;mdcQw{y+ICw%hBkcOsMaP88OQ_rtD;f(Xo8+6GIp`v}R zJZWaH$_ed7(`O8;nY2rvxBGwnk1sZMRowC2;cK%;?!0P9_{WM~8@GQub>B`eRo{7j zuTzS@{&~WJgHC*JPnj_||sg3>c_<>V@E7<`_EUfr+D=FaA8mZm`3Z*IHdI5Wo zOMh?@?i*2R?ePCisdbObs zc;F>(oxXPcc@Hj~H~ykQGyk>Qn`%Rk|Ho%M-&%k5xR>US`D)9U?9i%#kFR-V`ED;CebMCZ ze>=6`qyMSArFU}rF>9(;Z<;Zxt^KvONjpAMFlNm?%YSfU2EUNL;nf+Id!JnOaoA5Pq~{pPRwPk(>o4hQ}*ex&cC7jL_3 zkLybJ`hM!@DHEfUZy0{bQHOu?>5+e=hHaf5+4YDwOP6&US+cC#e$YlGOV|9b6{_9r zWx(Dcubc;R)Z9e(?q1s0`mtSM$)47a-aShPAQ@aTzO)W)-J9P?bDwqSny6%*c_c5rIL z@5$fZ?KSwC)%`E2e(#`DV_U9F4B2PNriTV^DgSHy^1Ei-@OFU!M>g+e*DO7E#F7`Cjar+^6ws7eeJx|vCBqPJ$_vIKiAATdB*x(;*S+I z4$XX4x96$P4u0o>*G5ll3)Ju3W9}YHJ~b|0U0z%^z4yQNTzLL&w`U%iKkz|r_(!id_>^7vdA^Vem-pGN6$3OYY2Ui|G?WDw` z4XIO3e(urzUh6z|_~EmD-Q)Y7yPmn}p_lgBHF8yb?TyR+cy-)MeO~YN(7nB8Mmi6; d@Uk8kuU&c0yoIOvh%M^>{{Me1@c)Ar_cMz2@nAR^6TNDT2NOMbbK35L5F&G#+4=wPpYQ*^e-}-HZATQp@GUIh z0{iwKsHi-6=x|ka4PRRqtUuClw6UqVrM0d7SVw19cV|!UiIb<#oDGEsB7;N2=SI$7 znj4=SbM*{CQ&27{a^yBOE8C0 z1#=t3HBAaa8NZ~h@NGUMs%H%es}7|Ct->a$)^s$9Zn@Y(8QKI^(Ks~WA|}|uh{Ef9 z_{43bx(-|N&f+3? zlUowmhHI%vHjzqWY6+_FwOitNeCIqrJpJopvPa&ICh|s6RfX@^i_$+jO4v3DER?0M z^?Q|ZPKSLVGzm3K3e@Kh^-x;#a=V=kRYy|N<&Lq9-iM`SK+%< zLldBB5+u-5$q!o~WLXnb0`;5_Qp6{HLcgf+?dj-l-X!R(SP(l3fAaqcY176TBpEAo zth;wljX^zQtI$L-l%)lG_Q*=&T%M-&7F)1g-9`?9OLPdb&I+`Uu(Q>mKOjk$AX_N? z;xg58CNdEg#c<{0zJ76sKB+5o$q_+(bm1b;@}Mj`Q^AZfQ_Kvrz$`KMnTN~^<~8$) z`N>wZ0vl%+S&dy~*V%XMXZAZ_KsOixaj*aka2GrPt6&X01?%8BcnMyCH{dOJ4?chm z@DY6Fs<=9CfSc#;anHC7?i=@m`^Ej{{sbxlRe{<-eV`%G$dndf%R6(~+r2H&{ue}l BkdXiY literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo new file mode 100644 index 000000000..bd04210fb --- /dev/null +++ b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist new file mode 100644 index 000000000..e7ec329dc --- /dev/null +++ b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist @@ -0,0 +1,25 @@ + + + + + rules + + .* + + Info.plist + + omit + + weight + 10 + + ResourceRules.plist + + omit + + weight + 100 + + + + diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist new file mode 100644 index 0000000000000000000000000000000000000000..e5939d9b47a7d63db821933974e3ba06ea6e5010 GIT binary patch literal 245 zcmYc)$jK}&F)+Bu$Q16DnNyNlRJ@3p?IH_n6oluOn420eAnYCx>Y1CEo*JB5keLXP zxx~WG!5QUPQc{$eR9cc+950{@Q{|pmT3no&m=~OylbT$TS(fUQQ(6So#l_9T8!sSU zoLb^qk(^VSlIomUl$?_ql$erPT5J_BAcigzke``XVilE^lb=|kVW4NE880B{><$(M ma!qvsq;E0f_)U=gFNh*xX*-5^JrH&oec1t*ATc?Rz+B9it zXekJZ0~anx2qC!e6FBm7nBBfWBG!J6*E932XJ-rcXkM0|h&ejO7(0V;4dXV(b&O{i zcQI}rXN=?i`vhZ)%_W7ay{MK|x{|7{YOgERQ>w2PHqva+QoE}CR<+(`osX^bQ)}t- zV)M&F`ZZ0zEA>Myx%Q}^&|1N<178GGnfCCw;o3zhsv_`w%lD$F;MJ(>+67T6mYz~M zj_y-q#kCLLwO!lrJ{U~CT&5@zCE<&>VTHkrs3y{jMHpz_D}%uw!Tv@|^qP=FK?nUQh)E6%>QPvqq&f1B76{;^S0Wz` zto0%ZN-1c;wS#5mdr? z?LiMruRL3onr@cd|H~B-R5cg!PMF9tz2qkmfkl21b%PJ1Zu2XsOQyC>?dM+FqvOJ- zs5l>xT;*2**yX2C2V5tppIg@e8O0ANf;;e84P^$9@pAxV{JepsdP90#r?Q_LB=w3H z6NF*^xD0EKFTlLh&mm6J0Iu@W0PdO=1Eco(7`wEU>*>z>zcq`oZ~2v6hPfLS`}x!A z4838zr6D6&_{5ZJ*Ssoey&gx>*}wev;Qz7?`E1Hs=a+%n;TKT5Lt1S(i@nuGpk?aL!cg5roGTuZJoaB1DbK1M$}7YuAkeSF}64qW9zHY zo;BTO!FiCx9`-vgrPp8?CY)FT!M2;o4-zSAWD;@|E`!>OBI|&#N9_V{PM$OG)$1hL g&XGVdiG4!A58}zz@J?sCaVWEY8la6NnSEn_08*1}YybcN literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e030cb189bf02f0f83d47da885a279e92b73b7cb GIT binary patch literal 1155252 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ⅇl2-s69C~+!^#1^a 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

    PnGkES-)ffy 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 szY=fev)R{L820Ij!TI!7{(mm>j) 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%0A~sBa@F_*z~Au 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�x^ zbiH0HyJl=F4eB`SOX609U5mXXfydunxW~Wan$aZRD%t*Ka$QMv5@VMHJGmtMgN7Y3 z_M}mfBMx<`sIYh(CpYi&u*T-l}kR*{$;sfgaAe{kAKFP$j>OrP_m9r zdY;@@Oj1tliE4*Kc+!F=5;1S$BN;Td`V`M^B(~cmjRsrPAEiYdmiK5KiZo{cgOGln znf0sMcB1+v!==&0Qw@%Ohp6pNT6`ugcQINPx42e2cATllV^&%uzAEjMA>`bF!`Z66(Veg3V&2?mXc1Iq6y6C$ng8nrsX)+SnZr(z+oe=Hh1J zyA(ATmgRUkz{=yGsy48nGYCdUK!1zaR@Rp3I+bP4N7Dz^s_L3)w2-zK2G3FYeQTx_ zEcqFQYARmxK7{>=J~UrJEFKHFz55oWX>uuH=;?JA z1_@M#M;}9jpIZC#_A~vbp_=79TRf)H%T<;gE5z2QGA%DcjhDzeo!=qJ>{xXeuF6$Z zv}eiZ8DApy^z~2hJ@4V)j;y{j{5!YSbXd%HYD(Nhpl*q>HzbNP&U4ooIjsqH$!-{9 zpY>|vEV%3c0N1V;;%=P3voFT`Ul;gYBmV$|Bgc0>R;-Ygjx9e>Y%q{u5K>SJ_WANT zFUNnXY4F?KMRTPxt)#>`WhIa^WA10M89w!^N6hRNQ-7oc!h+dRv!OltKJ{W55jOpi zLnhDw0~zi>_5O8J}qC9mVYp?i3JTWFbC8TUlDi* zN;*}xk7FRr)^@PLy-v~!B7(pkI)ZuitSW4G;q*t+f3h8i+Pqof8@Zi~ntqzL$Rx^! z^JE7n`={h19kGh~6LELMY!HwLJ8}jG@~e%bGLq7zEP9>c*i(3v=_Q^Rn|?KJ{#2*!u4XfGbOFa3IHc5Ct?XW3!Xl;zkh3| z+?mMzN3>4mjh3ZQ89X)xkC-}SY*}O}pyxMvQbxTz* z2b8(o4n`HaoQ&j*ky=JpG_q*<&-Re`V{!XA`1ttGz?M@>;hk<~i&n5mzFSAgAe?^* zB*+h`BhXQE7N4(MS?c;TK_oXT<}A@1DFgx-4x>JYo;?kFPlI*4KZu?gyYRP;?cVk& zE!y7V3BFgJ9AoAkT17nP&~>k#@BAx&`!D=cm&0B%ji>O|sHW#g)f+n*dS!{~+4)M2 zRFT-$`>UMu(VeG z#Hx*gF|hT{ah`yYQ|fl(PWi5|suy=S41IYV5z?`B8`nM{u}KJyJ7sAdQ|1l3jQrl7 zgRXPdxhGETnnrf9)?Iu_)$OHQ+r39k^DbAIr_$q+73ud7@H&0r*P1Jhzmv$D4prdi z%g!^`)cSBJu2hbWboD=KpivR)DCi1CzkHF2P&84=obKQfyq{6W;hNcs-QrO8{{S;! zfEW%v>kCcApNg=;@Oo-O;tViyG zNjv-gA5N8zyaa8D}&e$q*8ko2=g;%!yX{8_zC+yU3jC!mq`r5542nig36(OL4*06bu`b} z^3G4$-}Zg+7sdYojTUoD;-49^-^prMZNxD#G1*waKZTi|He~M4UU;4&v;C=mXdN5D z`o+pk;O_#<7PYV8f%|0Y-{|&%fCJ`m9fvss9qNDEzxKt@{u+39U-9pY2)gjM!R9v> zRv`&pf5i6#%CxmnoDmN2NbJm{<85=)lRYdoJx_rD0N}H~wAP_({gv=lFQe2o$?ns} zzY=aDa8gZC)lH_HN&XmDWSHuvIP>?p_=CZcz0~@Ru!+oaY4f5govo4qpX zi4cN>kDGGm%f}r1k8ah^NU{gqn*%Q#jF#sgFQ@|CP~Qv zklltoKf;|fQL04I!r6@OQh6gi57wcw%q&Lz`2?xyk(}V3-u|^__j1Oeq*c$%2p^7p zGguuP6$}c|e&{o^u~G+9&tLw%X+dPtTa^(Q$pkTc9xyxq0FzWL*Uo*izRkzxZZh4o zp5B$Uqs8XN7JZDvAYk&`^}(mqOu6A749(&T`0RAcX{Wonkz+_A0ode^nEEK>=b#n# zcf*f`HeU&R9J+mzF`73rTueqq!(e3b(;3G;mFHivkHfg&@T|Tg)M1I`o`161NgyG% zuij)~*q@Z=y4Si(Y-NU70N5mBw`%nrdSkKe>&dS>6;|(&5YuLLqnQT#wH$%8GT>zJ z1Als_fm@Z3kWga>xgAOVUxh_8vcMI%8@S2I1fTM1R#HwFZBV6m9-!oMKMLYAu;}0@ zr6D78F4h4~KqDZJUiqnfIV^WF>Ty{K$Xlgml=g2eK|!2wJ-XCM7oBh#ZH7~l26zL3 z&OV~2(d3iunv%zcaM3nIo7W@}yVsm!@TXuc+#$ZPBHYV~dD_X1&@y4o_{{YzD7>ePVYo=itm?n56e8d8OI`$8M znoo&-7<@Szzs2cZ*To+i^%*t2SI%O$aayckLuC^G0Lw73c~M}08?$vJpRR&YjgjM8 z`n}HQ;w}FG{3l*MD`ymOSw^K{QNpc~97dQNF7t;6`=M&&It)=ZWBu+F0_ubW;{as! z`qx9@Uk=IkX)iVVbT>B+CYm_YF~Xw?k%Q0$P^<5QiqOB&-Z_}Wia{I4`v4x8^*ODO zwnsIj>25qt5MAb3EMy~a!OF6n^Y!mtJ+_G?5I>x|8F>VrSB&TD>rU|HkpBRL-phX6 zy|u07t%uWGQ6Jj{ORat2Qwd*`MoxVJL?AEuq*Zyah~F!7A928-bB zGEGY5*nFO1F6A9C#{r2RxTNtnj&6Tu@7af5@!!PQ$NVOL6XyQczO|J8^4i&$MW@&g zMIfik?;-W9-;26E_liCt_*dbkpK4!2v9>-i@u5O_wu#4)1gAeL%OaDs^;np6HQ;}@ zx9ue-$DfLJHWEwr+dUN`ywn;7#kyX)VklG|Jh&ppKp5XC#~{}(F1n#f%=B{nJFi(I z$}D_5hfbd7#2fB!ucnggQMe_GPjMrck(Zt@#Nc)q8LQ2t+v!&Fn2K)N7)ZbeQ;;yH zrU~TK2UnK*PbfTT<&CQfscpxSM;*Fx>?zTLki{}guB-_tsl9gf82TQ+TKLJ$&P}uJ z)Oi;wGN;lbx7LBLxAeUhe8$$&v;?7NO`BQ!jt{3DI_8A*5m&;|T7Pv3 zpXk01)qG*%doK<64mP^hb^C<3w^c&z4(1BZcs;X|&~@!!u-~#5?AN7!%KrcbYMY$@4+}$M7Kvhy1(PM0l^jF_jDR;0 z_fU)}_vbxo=+U)#Wn%WN0wV$mnPUtxe(4#(>A?U8LHNEL*7midSlwyYHr6)@Zr77$ zX9{0=CnPtgx27wezOzj}s;-fanWjJUVXpDIwbab&9sKb`F2YOn9BC*!wa#Ljf@UB^y9sF^nVQX+g*L+)wEqp zQ<}<2E#!@*X;i8X3p9;^xp2#a!N);gL0YHwM6$7(!aI4FcFAQ6=04u63He4i`~`S# z?Kk^C_;SlpjdXop+IeP;ZRd`{;h3z8ovtzc+!f&EvISi=&D2wBJr5fFqkbl98X!w0 zg{&@~Rg&J_BL+yqf%50rXQy16vHL%KHoe!i*yh)C`6Fw*NhFLKStep~6&Ik!K;pQc z0B9E<75sH^dvzu3#^OTp3xGgH8Oa5@f_fZ`8v8@xUw~}<1EfV9QAjQ&3dtLeBLHV| zXRikw9=WaC%`m>q2;;xV*gCXMr4%N+EuK=cdv7!N$-%D^tVq_$C;Ot%|jW?_(5Bev3VGtFVn&1DPdWNN-1)pZ?0cJRfXyq0meXs6U=@x6-9c#PN?KJNb=rP@B zlYOeoQBgMFONrF_Zs<58=~ZO#1(L9P3m62ftr`$WjaMMH;yRu`r8mxF&j)Lm8h4FS z($-s)wv8H5fLn7g1E_p(dFlGrXNrC%>sFS+YYjyrgZP5MhIq*U$e{9ebHMzKbo$qZ zX19v%?JliKvEgIDa548(XBlsPmFIfifpw~0#T@qfYZ!wDXhDuZ7+{b|;B^PrHJ?1< z_cw%T&1jDp_^I%J;*XEKU8uH^@c3r#k! z;pU4@k>Qt3zP*~z>Q>IX0>|YM6Ed?5@5va*=Dbk;*cxAgd7f_IV}yW3v?> z^3`xkspn}N;Ma=ykX)vfDABGh+QZKKDqgj?7cU}#xRf92!ND2#ty|9%>mL>MsjsY$ zhxEv;Eo4TD=KIN9zDqE6#^wYPFgn*cbFba%9u|*FR<>O|97@j|Z5v%SK2qm6IpmSt z^G&i^u~0H4xL9tkWJ&P8bh3Quo~lMVXV$A~7k0XCtkP+>2IeIB7tCGE;{zb4QI0@9 z+*2p8g5LA(1wzSmolaGwU~z->9s2aA$)f#@9KV$By96rjQR$J?_p4e6NiU4^18)?n zWL1qr0}*sN!Q1 z`FkJfx4*7_m9ssfSzALaF}12HV3{2NZrhXtlfmoiD-w5kRij5TL%c5O1`DUVcOR8S z$Ld$Pv65A0Q9Myel@cor%DK)@sn2uPq|pRcH?T5@CU!WESz^jAPBQ-hPPJcANo}o+ z65K0CC(XVz`H=@a<368_dl$iPgZ8=wqH7-*Y_3*Gpeq)hiRT-IZdOw0#d;BiBRun0 zaX2Tj;odmV;P7?iQR#Yxj-?*cAuubi*`NM-g*o5HA%_^^vNW5`Mk!P~UR%IMPWbkR zTxTIqeorR8q4AH0v?rKD;VnMq(qAlpqD=^i;8V~xM{|yq^Y@MC^L0UQZT5NQjf)(} z0R)^D9r8W+#RE}1JNCoz3tD^!memE-q`Ky#4V%dGs|jOQF6y!M$yEE@hc)u8rG%5W z?!b8DZd`P4Q~vi!YYuRMp_YjLT{pl$M5q*$XZ?pMsfJ$bHM;lIH~ z*E9swuh2q^8&5Mkld%HiaoF_j-nNZJO?$^x3J#*YQQ&h#(lrZuBChxHS77x;lzwyHR?WWkPqO0I*QNXo$bZ(NrMJf#scNN zaB=I;(-qOr8*XT+$?0PP>rI-=OpV$(6DEg3P%4=pYDdoEzPRn0l~ymQbEPQmjv{zn zun>%sjt^?7a~mQAd~$Jv`PQzh43Rp=By51O$SaKF*V?o7Gl>wkcOFhh@~*0W@;K+A zK@pU{JPtZ^uUP$`F5$NDe!Cs~ts1@bWpN(;zq|R5@)-B8DOVUJe~928L0+Tqa{aXb z00QbJGK{laJdC7en`B^d*mUBmdsvjr?*}_AhPQWWx!-drNe2gR;&Mk$MR}y`9$6gZ zhGKgAp0(HRKBJoQ`4|GsfllIZ0LLA;s)mh<_aAQ#+g@@R zy$7#Kt}~KPZuNZRDvWXlc=}ZxoAS-vWM-~CMItxcpq__0>61ue^D&=Zxz0UmO{b=K zZ+^5Q0{A%h_N^{MR~a!Y3EFu)Wc_Luk0<6lo}Tq~<$Rd%dVlq*v0a1^PhKI()jOziDq_8p|~D2+>`F2VhLk4MoOKycIULuj>bHbQfu1S%l6lAsxxmNenj10L;t#{^dRKA%fqHh0#4E&j z_50qUs_H%l)?&7l&7j{#7v(I-qh<$Qy)j+j)>$Gd{%J$}Abru1f-_L+w+}vrGf4Af z2Pft^#t%dND80!{@q4xoGMHe)gVQ}Ku?1KW^{Z2^(bQmIbmxIpwqw3mxBFGBG)GDt zxdd&>-Q%K6VUg)(o_&7`iM@?h#R%VXjMCi9rWMHK zV2;$%Hw^xmq>?6Nz~`Qz?_E6wab3s*_;>@@)Yi_v zYB3qf=h~uo0A%pQp0u#%c*z)~(NWydi9)#APD$(Dud)FW9(@LXTBNEBn}*yIfC;OS zlPn|59Ot!hRNU%{xud19$w>hrfjoK+Kgp|4b}Th(YlFhWJaRLhHYjjOCaBo{{GeRq zgMdB%0Q&Vlxfyr@u^>7!5snyFFWc0q#_?$TZ%5JXCAWqTd34FV#n{V0x;$gRjZQaIt4keUuyO-N>Nbp=4CA5aj8-n2r^bx8H`#(JE0 zC$&kSk@$5(ZPkpiK*Mgk&JM+hE^rja$ z>2+8%m}Pr3S%i31P=Qo-!3V1K_wP_#_`S`!TRlF&JhCcCvb!_{5OTxuIp?4ib@WBk zwP?Sw=Dm2KLnocH40?)%~l$cPOR3RY$86SWpH|cN#KleigMaD+@+zgxSYVdS;SaT zp1A&Wscj|QzQEDSF_-g5J4SiH_2#h{uwNLajV>XOth{H-%EmFCe_wjOVA*D;PmWiO zfZ83GY@bp;oo7gwEeDkdY2bXcWC6WfoC3XjRm&5oTWPl<7$=Gd!Dooay$J_`2i^ld zpN|!!7^HAt8-5H)@iReqpHsJnNF*;ZM!suCyK}K~+>k#C@{21gjXO$;JNTp$EDFjt zgdk&rGuMoBUh#g`@21?_-a^w)eyq5SiUe(>cIa|J@l0=wI$KVwBsaS@@tDmE)`>RrXJ? z=Zn_noUwVRMYv%e;jvhZ0n;2+ON}v1UoZ&cINCwm?e**WRU`33MA~uohD6H+csXyb z4gt+0{6Wzqh$*>c+Qq_{O78XNwKYPm{uVo~Hto(-NB8olpX>fjW8Y|DaaSL9)V>NC@yTB~v5Z8l+_w#Hl>kCA~rvzpQ{sTZ>o5@Hyw{PY~reE@iQFIcc_$(CDG0wA>m$DVxkCmwuEAz}F@@6B~)xKm+F|p1rU!n%?+%thRyUYe}zUbhmqf1em}qj5xy{KK2i{ zKGlV181f_=-5NoF2T(^()34!DB%37g<_2?!W$06NfPbi-hfPETs~Pb*Xw0j{JmoHpJu zkenj}A)lU1mLm z5wY?z$3NuPhh8o^^+(pxpS6OL83ll{iLJpUMp$PVBiA)aEhL6H6Xboosm~|h9<|c= zgG!G~l_a&s$q8KKc>)uc@vHCN-*D1_;tl+YGByhI!w#G7~r2y#Cuf!8zNcEUSlM%fK_wD4`KZN zwP(eec+?~NK#VMre3D?`W2j<1KmAn=uW7GSCmSOI8?Wrk&~}0wpvFRqgI}{Y_e&+Y z#8Zs%_d)CYs#~zEiY=EVeqX!6&uo6bN}CI*X+}AR8R_VKYpFg~q|EQo#`D0qR$ZU% z4E`Md09w+xMY%wDB#uCAexK(xK_CsiSu)7PHaPzPIHp_3V30;iA#b|Rz^&yTZC2(> zeM@o0C{-)cKBOMMTG;UJpQh_}*AQOYM%O_@MJ`BX0G`8xjNsNoF))BYRv1zM{{TGH zNvNGF;u-9vKf7!nQV&|r(v|G>H04a8b!|42eHawjjF(@}ln)}JukX+?+U?kp(}98bS8w}1d}5E__rw&RTv;dZ?y8?;)-BVPcn?Vc z{`_R_1oqqqCb*4y!Hk}GKo!qU*!uUX*6)Fym^tU4*1D<7MI>_7qwOh5li8oGf3x1b zYw>5{uC?&1;*_nZTD7421;~Ff^&K^rFBO#@jrxF@4P=Ggr7d& z1j%IiIbaDSFG9G-O8Y0{28@4bFN6Lc_>=HrCy&J*6;`{qwvBN-$hj9bE)Vf2+{(W| zI3~Rsb9E8<-a8E}HCG07#>naSO&*}Evd6;b3?=k%dK~(W^>0ba>z1L6tP#U9<8yuB zPfpxcFT>9qS^RGJX=CCK4NOGFG+AXFf5P17w;)x^4O-tsx465WTw7UL&oj12 za-kUHd!8^oX}Fw`(Vk8Hw6=fnPoLU9#4$}Fy74{jmxs~V>~A9XS@I^p$Ncjjj?tR= zcft0vCcY(j*%3D~z5w$$I0v3Ry=&gSGF=}F{{X=>d@E;TD?9kp#+rS#%QJFX*4A6r zVh2XvQ$B{gE5Z>xQeR1A>>Qy&Snx5AI2 zsa;$Xw{Sv^BVI`7h2#%f^(f{)Y6w-62js>`8RIAXPqlGB0JOjCkAof+w1m0x^u%Mq zR@_eE*N*3r?Onx}m=%=n0# zE!lU*+sSaD%jL^zF!=08*UQ|+Ct?%8h)ih;R1epDc23?6ywQoIZx zjLSCir*kptK^ztzrfH;fMtsMMd}#1lFz{xP z`%ior70aFUNMbrJlGq<0?Oe+uzE zcE*2%J~W2<$r<$d@`Q%vfzC~aQ3$GvDzQn=ep-TS3gdDtJ8mJzk-9~7lv#+N$~mi zc)vr0-dQpYk9iQohzn;7>PJ)evA2LpuPgX(;{)*zL%6)#9loJ-c1;LXNg|NsGP3Y_ zAmm_R(K|KfWbT<_TTd~3y-qi|3H%XbulK($D5)m0^BtAqNmQ{RR1o7FWP!)E6~NQK zLGz!q9#n}kB$zy_3yJqJnR47T5^aV@Vugx0m`@^0?mJh_OopyZ6Z_fcPbf5BFNYYRUH z{5RHoeD^SFBTTxN!ha6!Bqf(o)*VXTYOXgAGAnftw2ppBFnJaDp)*Nu1ZynqG>g1T zEbY2!oRV4HkKSe^l6_5aRhEabLL9meieqvS;0=O)^L05qWFCj!wmu%*n;#h1PGe6t zId)|98@R#8*Y&Ju%RSPlLAkcSOdS1BPfFMDqGMgQm4lN6$twu@;aCy}bJ%<4u#ElX zb7@0IVcLqk6Scd(5HRaFYFqMij{);GB#gJniS7{=I6agky;LV=i(R0OSvDoxiPKJ{E{7FlWeY zmfCQ~_(At0y>q#pJclD`0{pwuKvZsS;eB!V^{$t}noQcRrR7+{CYJ;}eKHRLvHpA2 zh%^Y*VL=?8Wy=WED&?0ah4&=(udDtEddi>mG zv#DM*)#PU=o_Fx~;|96m9}C&(mil$Xuv*5xS|G`9y}&rzjQji6h&mQIIX~UwB}X;Tcz@#!>RPMn zcCsL3-?gJBD0}Cq|EezZ?Ou`+wM{ zhSu#2O0N;ZnA@nwLGvHe71%$4Qt1JUMuK0P%R?Q|j04c^EI9`!gU3qI)V?0uA+)x? z(-=ecR|?R~rK2InK+XWrnJ_LcGC$HX2Xjx>N~ZVBZ=us!`T{nPcX^25g( zT-Fmw2Ct!MsF+a=)xrBj&Cd~{kC^rTb&cWQgBlJcx{}9H^LUI%)_Ylj#(2(g&{fHP z7ihMztf?LF1&Jz_%!dOb0gqBh#zzBlQW7@&G4TS&#d_6-lWg+4!R81S{P zf;>NWs6hd1op6FCC{Vm1NEip9C$aXe&xAI19uGRlk9=@MT1SK|Wu7@F!fulri*dtY zcnAB&y}TX~Qc1nfGQD4ED|9^zP55tX@i*dMg1!;X$$O-DP8d8{;^_osRs5MZK@$*h ziDptr?y)dDabBC^TNL=U`$a?IEk%CY290V~+7}yA&NAP-+7BD#=1lfbm4W*`_-gCn zm%%Il01$ZTZzJ(f#XIKl4zMM1C9tyEt8ZvBeoe51O``+Mk&ZG+uBYI%Q{P+a)9XOJ z?d{}}%^nZP0{p4;RSLgBUZi8Gi;rWk(``!Hg;|&ua{EH(c+VNfeze<*c;MXDMnjSV ze8hL~u)=e-!w+(k&ChcCUSK`#|4>Cnr6)#yXNmO5<-wmwTl> znm?NNK3XcCtm?sW>GNZr)zkRf!BF_?;+KT}4<8`uT678HKOat{kZhrF(7@nyGt8LU zcw~w}in}D(;*K}PekZ^9LHj58%f;S5Q*Yxxi|pE++D7Z%(XaQ@1lJKc$Gc{Cp~ zNUwHoPV=jeNFi2o~;fF!k<2B?b%+Fh4Ehf6Nc$zC)TqtH@ zgs@-seR^|`YPbIY2}!Wg#D-Gq7v=2^PJWl*FO^AXoP zclz_1_Al69_HaM6{{Y6guC*xSlf!-;#J7%EA-LPhqJ|g%pX*ve9L$-^l^;@n!7%>- zW=rn`=&$h?$J&LYTJEg_CX>Dp&2I+WmOF?F#BtA2UrSqf?(T0C+TUus<+h44Tq0${ z5%V!8j42AhRCk(npNOoaTU}P(J41zv(g>14Ap>bpqZl~=1JF}!wHUN#Z9BxbdVP?F zC6ZKoq-KvJYKIHeh#fojsi{@T>9L0*v%cqRCy$_>>ST{h)&rIVvnYvV2e>)tax;p9 zQi6SYD5SHJdoybz?()f!X+arPIUMBkoc63g3~Kg%AzPSJR=By2)wcPPx0dAq4H=9P zlYx=Ab;WDj`0CqO)uWF`Tj}lNh@^pl^4M{SHy+@goj)pvE@BjUPJ+iv6G9tMd&#AN zL*y`wp8Hz^2b}#YpYfztvOsNYtu2x}wnUlSv1}fw*x^a%pL(x%s;7yWo(n6>sO|F; zItE;?IgoMz9q@aKr60r{J3`W~;gVL-;$gU6OYHNLCAf8IWJcSU87ucm zEO-EC(>3TnwGYPYeOFazJT-rFcrP6-rDR zWRB-NiuS!8{@(qdv+*pp&eaI>wvx#vjb~#VF&CTna)oIm z0{~#~qaz@Ua%vw6cmb_7nWfck?yTjxj4Ujz=5BW7mn3nH{<$?0lenFlxpU%2hO{%b zU@vYhrv}bvx4QEF$I*nFi62i)n&74IysxHBB$isUyXB;HOsfXyHjqK!a7TV?yVpD$ z1lIA~YI=p$*-E0D1dCe@LFCq44K z{VE>gr`qP1!VP~=@YR%-X3|*nraon^=|enZU>Ma;ICIDyx%IA>R<*tHGp)Y1BuH2@ zG*Qd@!v6rm0OK5UjQweJIHT3x+8b+|Stmlw@nd>>(aVCKE_Ct{j+qk zw^EqIUrzq@qP&renv2-;`1}cFt6J(-z8_fawRpi;uB0YY3*c>H0mt44LSM`C82f?7PBLrc zFWUipaq!p1J{$OpuUqO`ErsN-X?tU#&1*b1bFcv=xRzARg@WL1UJYC*DvcEy{JI_& z`*G_YEcl;3d_Uocv=0jSTJk9EqtrG>c{Jo?$PwE+c?75gj04)dJH*gyn&zz&Yd5j# z7ikKimF|SHNHTsyv;nbmz&$fvuZjFf-Z>XDYuCDtuRX29ymwMu4=hAmqsDT@hyZ6f z{41K8-B`4P%Y!YrVQ@glBObNZp=Gh3Hl{RQ7H^TYQySp0ZLo%KYzEK&0Ib$k+Fjb; zT*V#L#J1Lo8W~b$hs{IN01m2nIq6-trQp3@!M;mxwA)OpwqR9)hU`FWgXleLKUeT{ z*Ry#V<+-$b1LnHlD2H&zAxipz?lJ{2a~!3FmbdnDnQr8TqZ@ZzOc=j>FBxJu(kSBSO z;Z=p!rX!jWKh2p9<-;s)qqavGsQ`{N0DBw<<@?_-3#! zbsJNr6RRcElb}9Z$rDQ(so-!3+SwS-H56LK#+xm-k$T6;RtTvM<{;;Tf!8OewKlFL zD;S!Tnq8K@^XS)7+@-r8vb?q+85C!M7xe5!Wu!M=Ax4_g-+OKIUoz!UMsjv~`**Ig z-Urm~i_2$yJeLduz0_!;CII}(g9T4P_)&9r_E*L0J*CZ|%qs*TOo!2%r*Zn4mma2y zX|jjIodVwE%XQ+5cY{cg7CF`{vu`L&^@=bFke}{=E7)}14@B@4j-6%TOR4SJDYx3& zT`P;9o04Q{I8lR+n6D_e)bIRB;w>W6S8YxSW}j{1+Qy|sah$6HM&L$yU`9dBdrydb zS77=p+v;|93^xFmf+aUD2i*ok)OyrNtDbT3gU1u5yQ;prbq3WgNRC;hmwUq+5%P__ zK=kw#&8PGhdsWJVlC8>{53%?)-JOP}0k| zbyV6_fj!UO1aa$JJZLPg1oukLE!Cxya%D=!h4M)4f%;Nfjwi-nw9V|F5gz@;x#^mjP+O@N|+dFJB5uD(jG1DCLSzbHTEOjkfOL*>MnrOhtN67;i7z6oN z6(ufY+1Xje#iV%e#63QHO(iotPa?+oexH-l_>5op;$;jK2_vjlS4c?Wx;|nh* zT%I?QDB}zQA2i5E_~i99lXA&5%QHG*4;TdCWBS+BVcv-OEN+dmlg6>I45J5taexo4 zdJlo)TR(-DuBB1-O^h68oMZ8>0j2r!Fc|e8cna!tt#Z=K;hS4eaTs@5w?gsr)vsH^bo#3NT|?Qmb9$Y1GRVH&U5#`Ro~Gm*)zuTt@vp9_7G4>ZWpG-?kD zxgB_}SzPT^J%?VsDx$lSDP8D4Kf7+Z10KSv{n+sQws61WRwm-#KF7XsRRia#0~})= zX|<^0+_Vxw{oWKFhn!JvrKJUUBa@!Lg)&e>@_G7nr`rDZMpqnk*}iC;l30Plp4EwOtXkj6AhEcLatP_y z_3QXng!f@|Io0u+r9~fmkaNHXwR4iW>ZB2lb6q#Wh|IdY%8WN1gc1S32PYp|%2IAR znO?`Gd>0ZYj&%rTStFK9wq{)Y-n~y={XVtgSGLbIcpalVSd}|if9 zIpZBG&z|RUS63`)$_$Isxg7rhUe%$k!cx%-GZ4+k(;v?@M$ZvAEsnS#_x7zVS|^`M za!5N!a60YB2l`htc9I*5vGkwpM!+Z7a<2iU;Cq;^`mKdE8GRt;bQHD z*|!}J1Rk8!7FNYA$+wymiy)O!G6^~7x#K4Xj@5c7+Vb(60_ab-a6m!8Cj@_Xvv;`C zxpGeowAWv0wTQq^3R)HgPzCA@xG7K}1rFV)Y}IULg(k8>kY@VwecwPv~VSfb75V{-<{ z`A#_G{u!+KwE1srL`k+KM%)zgB7Abed*mEvwQ3T6%_Mgc!z8ers6Q!Ec^h%}m(r!t zJS``PFRo#h;uwrDhG|^&1pL?;&*edFA(|eibEcOz_l0iQijxhHv)y`=bDL^{W~W zg(lYY**~?Kz(Ffxbfm^n$2s6evn^${+^4iHIta2U}GnE{A_s6fHtjPf@ zl3m=4DJ}O%=uh~X=)6PV3*QT@Oy(=7XC;zURw%%A1a%nCdc#U;X$Rus5#|2NW-@_F}G&R%~MAD1PyCzR13cN}OB$3nWLUt3>q45h+&%@boEH!AY zWYVq{Swbje1Uc@?Y&C@t(Zk9{A_CO6`6< zU+O*)_z$k#X)6QG6T-4fBr7SF29OCO+Iy7FJCj~h{{RR*z1^fTTE%xP5+NbN;mf1HZJZ%^(YF3$G7HYIn@H5R||t$=YAn@vk{oo$Q(P zKURb2I!}cD9}M`8Wmf1u(i=ao>)xr&@S{Z78bok}oq#vY2e8klH2Jg$*+5yOR^^Fk z@&W7ji1#&8Z7E1%*N)q|5}ckm&+@HSBByeGt55kx&+xZJMcfiug5z<)=coAol~VWN zo{?$uF>XijsXSxb*Vd<#N#2GvzLY!ss+&#@KOfGj&0{VXZRU0_%%Gpd1JKrs6E*gS z^;&&~x5Et>D;9TdxBxIG*c!9p&kR{;&v2S?#B=p7OAb8&=zZ%xOL^ds`By|ZY=taO zJ%u{j8_Q`Ul_w9ixdpOco4>O$s-M_vjFJBlOIl})3zzQ%oDNO7CP-K)7w2e{{Tvr9ek0P zU7jP(ALR?!W1#w05=A9*(Z6TidON*d??>?=5?kul+mU7EM5-{&fIebZ2OWM~*9rSq z_!LQ_Lw;jpd85c}rsp|@m;`Wti{`+|r}$e~xbXh~iLGz6$5s10>2RvR{DpaC9-Ehs z#=U#u$A>MvW#Oql#~g2Kui88Ws9pRXxvL} zkH59E-<~V#?|9t#or_ag77ZMXzG4HlkD>JTrdeB^Le=fA3Y2v!>eYL{wsVV(fn7aG96P)kvu)Cvo=}X zR2ylW`Z^K#kSmGN)=N9bTa_gb1ct!w4i9?jzh@_g?^?ak^{JwdNAau&PBTi`j?Vc( zdubUDAA2dDxn&ifHk~oOdwod+7k08Wyy(MgB$1L2%6^&rYm*wBee|?vr<2yY_A+{- zUM)Q}4IWrbi02#7G4G6JzQ3j`k=5<|i-z+utj+UnJdA%@=rlb~>>8YDGXCyU<(<#+ zjGh7gcFZQPh6zf=xDKQS z=N-Qq(v`l=B#}vj)DQ>qHJdzA+Bk3tT=9XD4h{hyjdjv(t23TT#Vh$mzNB9yqc(7P zImUWZb$e4FTZohrq;u3YXiKO60BS_d7*NvyeH-=4vA1LQIh?cpV8G=wgU3@ghmPsoBM?X*#m5AD){_IN zS+Yv%+ehBdIQ7LgojF}S2DURVCwI3I#zLUU0lE%qI}3u+pD>P3*N`b?U5&L{=E=y% z0Q!DZ*5{ZP?-7y*e$~>gYZA>YM+wOUkf(UY2>d9y+mvDz)b$|q?T_)OBX*W27bBCy zWMiLGR_&k8h{Z4EkUetUcuG(r|8@igp z`qE)>Z#-uP83#rmhC%E>AnjtX?ZG_PEL{OoK9TB$m z#t2|*^QOk>FD-+}xfc0uJ2%q1U)h`E8hk(Toz<_3rUS!1Bm&n|R~$kA06gv#j#Z;# zGJm>GdRJB+qrI8nXINit2RN-!`YG`bNpIOlNZHEPHS`%bqYl55m@jjK(c?9YJjPhbtU=$U=JoU$=HPS+=V=7&~P@@BO zf2A~JN3qWKBoVul!Q@lCsLX&y_*QM%#tP%1$EG--cD}<|0YcIRk%=LTV+c=D2jD8@ zt<;SIB;%2|ESo?qJMQ{qRZ!~y-!dvI5%cvco&W%K&-hXVSnk!=Bg^@-o-la8_rRxP zNG6L~kj=r87BP{9VVn%(0~qK?=QYiEv%ZcduQL6p{toIN2fSE5BYZoumP;Aje{Nd9LE5at4}p`h zzq~n8I|6IyuZ#Zx2&C~2jJFGK5xR+kLeY!_#bDnz~ zds0TS9#ja*@Gx_`+w=Wu!o*krt{ad@LFwO~^%;?8ivf@@Z@O6Ip1pflXEDgpnc_B7 z7Ox{6iFXq=)5rwvVt+oB(7~t8scMGHOhu8dr3$DVApmuJo;|>;QPp$8|9 zcqKvakSo(Z9_cpz7SJd0FNkEoo-*+hkCG(^CnJoxACRi%1s2Xn_NVdP-+}xar1%%% zoN(Ouo5eFGkETG3L+^Gum7H)?F6V6Xg|3Um`ZQm&U%?Lxd@cAhs7Duyd`Y`cj`4fKi*{>>z)0MJTBiEekAMP8vJurQR>jTOQ^3y6 zp!ESbJlD%V@Kul7itoUG2Q@uw!#6i}-Z1#d1L$594D07;z8{PJK5y5$nRh4$2QMsO zjAtD6XVCPp(9-rk1OEVml77wR zcv5>NbB3>+?ja)XIQA*|2qi{$fyv4Ct5Dnhks^Y@V-UcBVTf=NFgPH3dwWz$yUQz# zaB+@7J;3)IR|MyC)r3j(xKis;#l)+%uoH}uaC!VIs_^EU9-DC+syoP4U=-s*e#%q>ScRC{*EsNUW zCtSP7${p4A?IA$gI_ITlOCnhBSi#`u%VEzWk?-qT+U@Za zup<@C-gt&dF5?z)$YLX6nLrpk<$xTX4^vrI)4gHAwA`cAs88oegB#O6=La+2|j$AHsLJoxD@xXhF4zy4gm{!?8FmobUkW*YmHS^u%Fo z^2)p2(UBT#sFOX8-$8>(WuT^$;pl8MXt=eAM;KV~y!Yd|r6bd+K0#f6Ic-@&|F7d;5iTE6|b~p4{g?^?K#lTPsH?kODTS#=vpM zILZQGu@M;>py|8w8?}I#K1GSnpBoosa9ZB@7mbw)0EB&%mQvU!TR5{w*_4?x@ z=xZmb8)#k7Nw>M$BVf7mnTg>rGl7%q_|}}R6=af7NE{yLo|qi~{&fw#tTvYL#CN;K zqDJ60Pkz4VuUaoPWk^rhMp1YGj$8Y{dXjj@^dE=RM{e6=kTH!X%aBpl#_=~Q*;B$hiX zko!qziS|3+#M@iUB~}RF zoGX05ft>p8AJUztYBMZ8SDx;wTjVK|(~<6KYcDSP>K)RN4&f|?8;zr?jCDWZ&2uaB z9g=*pv42C6G`|nQ0zh6*Bp34~Ad-2(Kab~Hme#E-PLC>rP69B?76XED*Xvnfm2aLu zHsO+2CN2DyL(u2n)3z(1()8tD`1!kpGaaXLm13Z90q=vyYTZcVb})Qv8L{yS19b8U zY@y1aC6n)r40X>P^GRo?3%G6U)=`j(szn{R zK5xr!3}Q{#bA?sfeeuZcT~PROZSgnacZB{EL;LLqL<7YBERd78%8AxkV1HjWUNRYxm89EaC7zG6YpCkV3V=Ea3nKrl0+`wHx2T);p>A@ z4Z=2Aen(M&q-W*&{{WLxPGa&4NbWYAE^s4vq{IN$KWR`E;#MnP89yuNP zIQ;73jG8a#7aC`UG|7Bp<9Q;7MDVxzWXxYUWG8SV)BrF#55P0k2 zDoqcJzAn!mxv5#a!_Ts`KPI22ciWU`)T;DmbMIT95xfZ>#Se)-0QfUx1bSRZJXzz3 z<4wqxmhuLQ7h}`ToDL3hu{g(i`SmAKZz&!{0M6rE+6&3WX;l(aZ48y+n^3)2&_p(>I7`j_UUEXSlhVT(Nmv<%ss` zGsXa|J2r_?S|yEDh&(0%8UFwbjQ6GsMr(EqWCv(fQokzWw;i#bYRpi?s-{O(+@yc3 z8;(7{UwZh7)N_2#srJx{in7?}WYVCt)Y{Sf$jpDdLaY^hmd-HQ&j<0Uur;-`r2%$O zpg)+bMtWrD*Vi@B_>WJvy|GD@DJbSQBL`?aj1$)cXB~MppL!&*x4V;2xQaV?!n)4?K`CJ5(#Zih3)tG_4Nb#9F?cq*&TdcXe|rM260D8C}`?E z!XL9|!W}2W{tozisNY;brd!*Kq;*@V&r%)uKFizj&2nGxN^jX`SA#^C$DTFO>}}fe z7LQ7Mi*Q=jFn(!c2a?A)2e&vi^~#q={eM7*RJ*d7ZNK|hM?yPdxo(-F_jWvoM*XdPJ>h*?JBT#7-Xvy% zNG5UTZD2?v8C-5XvPODWLH_^^pQamVV$}4xV1nTe+gPH+p>xVG10eN2{rcCd$ENsg zV~QwzIj0r4c3Fg0!vv}MNaOC~Ime|_o5Q*l#o1TVw9A-Tju-6VH|`+r9l=~+W}2}r zx4Gw$e%d-b+G()4(luKvS4SId$Ie?A3I|MMuVG#h@xS(o(;~XKwYIX>B{tzroR<iLzA=Gx zL>glOn8R4anP{Zgct9 z*WUzwIrv9K@U^+t^;zsGVkrV4 zb&0-0!`A7k=$1zE#4K{WXheX4{nNn6 z{#8d&{hho4J4zDtGLpQj5!boSC{E7E8jO|Mw+HQO z;hj&z&on+Kv1_uzJBW!X8~_{^4S-Y?=eW*miTK^|*Wuoxle^C>*FIO-qPmLh!GQ|o zGTV|-q&eZr_pX$0Vfc$CWSr@~tbEIjc1WQdi z-^viU1T(hm1|^1ZTe`pOrn*mpR&N9NgH6>%+=6XN>%mvO z`!@c|T33$sNRsYVh-}|1aJVhG56$y8UN|`KUqs*jz&-%+uZPZ?uIaCJr$~p+GR)>% zl1_eM!m4-Mj!#NQMu37jm!*@O$jy)#V#gBP<{&d=1-}ZEOKz+pvDJ-xO z56nhS9<{>wrsmtmKM^$zQ{m;djp2V3ybfx-w?;${~RhK-pB$j2Bt{{TJe@YJ4bn})I%Hw@cZOEwrCyyW_N0adjqu31gi z@X;~ba#@ucJPe1=u)sdF$lR%^TD8@jAT)4KY~E}#?;ybV=L4n~91?nGHJb*d95OjHv z%{y4uIEpBF3$Pdg0OWP&y&y+h z@O#6Tx-OM>t3z>dYbD$HD5e$JBxBGX_~=D-I_HY7G{y3z`vkUfrxIP-0(WDa5znXA ztXODwKiO7Eqt1@7qKR$GfMb57u6f!=AXa|8Yk%R(R+ms)U6L@D%#ewmB6HAoBOjF( zxu-HbhvH9*1@!VI#k?;w%EvKAN`Mz59DKb$O7TzH2gP?@8Tb?8d;KkLVV3VrZ9dlJ zmkAWpxQ$OIo*41(Ue)m%Rn>e+t4uAP53?(5K_a4L;2q81lbn5P!v6qjt6SSo40wM{ z*CmcSYNcBsi9u@i$v1&`+L|e^!+j9xJev0?kZO)!F5 zNp2@4xdV*gd*>NB_r-Zn#T`~XbK;MPrL|Q1JQIjvC=N=-0`L!Ba!E|R|8?H zPX);~w0Q^4JT<4;-N|*~s6VqU0&IyJE%t+-oU0yrIQe}5t^-ih z+RsmtOVX;-0u@_1bK8#mS6&{{TAUb-BvrVY*HgNhYmq(t)19b3=Hvd((cAT`d&?sN z1)W4fK3Fm5=~wNn^(ZVPXp-$<95F@Uspsl4ansVOU;LJiX57so+m__#9sTRjr7ly? zt4U5elo3+qWmxtXY$#k~pK7-L9=cr?OUrmwtzzNi+&yq`I-Yo{nq`{3^{@`0D{eVB zKmNM(-vU|qHMD!VJ}TbpR?H^}1Xfn%;W6M6Sm2HM&N&0tx|EMK(npotD#sbgjGXgT zg{hiSvF&Vg?~2^@|7uGa~Zw{Yxs<39C6N48Tg8z(J*ao--abK6jj z6)vSKyMHb-la4S!HC>@s$5Gz2_3L7Z8To@ZQb+QtO9s_ZC(Ngkf2ADv)YVetD%?V< zI-DsachAzFr$i3�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

    JW|e2i8WZ2V0YY@ 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 literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/_CodeSignature/CodeResources b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/_CodeSignature/CodeResources new file mode 100644 index 000000000..61aeea3b2 --- /dev/null +++ b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/_CodeSignature/CodeResources @@ -0,0 +1,60 @@ + + + + + files + + CustomFilter.fsh + + BaK6hzPyd5sBXbpJUwqtVqLWsiM= + + PkgInfo + + n57qDP4tZfLD1rCS43W0B4LQjzE= + + SampleConfiguration.plist + + H4Sl1fg0ytiRknS2JndsrKHDCG4= + + ShowcaseFilterViewController.nib + + KQXqgSOWZ4mevNN2GOMWzdIJczk= + + WID-small.jpg + + 6uLxBGrj5l66HApYsc05BDvVhJY= + + embedded.mobileprovision + + c4+b5m9qfc5SGGG27ld8I8UwfGo= + + en.lproj/InfoPlist.strings + + zmV6UqBSo6r1NOz798vd5O4zTBA= + + mask.png + + w4VTDfKC3VyUc2c1lD0vyChKjh0= + + + rules + + .* + + Info.plist + + omit + + weight + 10 + + ResourceRules.plist + + omit + + weight + 100 + + + + diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..f23dfe0236b484298d2fc2abf95ffdd6d340de70 GIT binary patch literal 9946 zcmd5?33yXg+9quQTQ;@qPzeZ#l#+AzdlAulvnNg3q)nSdVZ3XSCTT*NHf>#iid9r( zbZ}JMir_YijDVo1EaD8fj1Hs7D2jvNhUmD9+xUOCrL;J4=AY;JpJ#qbA@|<%o%5aV zeDC|c=iH!<>8}kcp4sW>{AQS8a6wnc^xddq`mO?l0ULsf2MsJAURW@G-~iMy`i{P4 zhOUm$%ZoZjFPnQoYcgSMQ8P`kRO9(mu-RyeQEik{N~|$*{**wit%99$!Mu{WlPy)| z+EBICm`=o+vc~FwQ0X)qr&O3sd^(*_O(sjN#aLbGtf@6ZA10I4JHs*uG0NRO}jHrJop4*hoz(nQ|l#dBp8Oln}HJ!Kx%}l-R zx;r*!)b3s_VpcublL8m>aD-tM@E50QacmBS&B3YgTvPX>6HZyw7B!*I$PAMLkH9~* z>0~Fp!xYa28&UVm<8<1@TC-WO*&}?;Dew`e(;T4ua=@1j#GE;cFXVEk!p>-m?B#t{ zo8aSfk#MNh+|IkeT!?t<1U^*DC+ccFeoxNo3t8%XKDUKW3$jCK3fBlODd}nU)Z}vR zNcXc!i`m=#49wwiP$FDSVTY0q+XE55y$%o8x3oWB)gvw>-`C*)t^w3bxjf>B;=S-16@TGd!j{Z^hA7kT^oE( ziuK;^d%Af{5R{-l1scwbf(sw0dgen75rL>$~qc^?SLK_ZkER%su{8 z&d!J2=CCsv3s<*Q+I<4=%eiaX{nom8T~(kV)K+J)ws|akuj6U4PDn{Ol>qZooNY)& zYLZ;LXcn9j4o;i-l-Cxn^jchYugysY%<=As_l6tHyCd#&3eE=JD@5W8qw$!X%OUW< zYUBATGw)-0SX{vzal>aTPqe1m+ZuwTwOz1)xf*1t>MD1e*_QLwIkFigBY2p2eN|IX zlT7ufF&K^1lkT{Zs&ZDDomK9fsmhd&S5iJ-Py_QQlZiC2YR;#WCu-vUxV^d3l3|#t zq}!`8(OkQ~xi((oh}37&u7!ewciW?ytcH~GN{e4ln{?Vm$c}K%pRy70cpXPzDN8#M zt7;<}h?+{ul@-W_P%vkavT-5krm!fRRRUpaDCl=Nz&z(@X{1`SzB+qrG!wEetWJ9^ zDw(W}3u4G(_e5MSjH~g5&E6!6_~VhNzdcfG&gQDvN=p-%V~&K7t@ipe!Md<@p;Zc3 zD}s>qISGfGu_}T!8}`^EZKhm#Z8%d!v`13zW+qzatV#xQDwqqlKtsH(8n-Ih>ISRR zR4aMpM$ugp=j|Bpb6R*GFQiDPzyhpz73CZ{Cj6*M5JFZkw>jKVEtpBC?OA6)tP2H2 zuScp5THUn_=iwovuz+ICSp`$hXZG-X&XMajZxDotp7XX8ABdUdpjk}fcDuQfscNRV zxDsxya|Ke2oQp)P)q0vZYIrMrw(B{-H<+QjkRJISEGrFRJ|K9Uj#l`!2$4uei0Igs z&3e;pq)lkTbo3>nQqr4n+PP+@!=D0kG3beePC-&25^9V`LiH5obO=$o(N8(;wsx7Q z%ZBx~_1=bXP(bj!0n7pKE#a7eL;$X0k0tffK32Sv_&y}?ux^otBSEL3ZW2{Nn1{~wz+gyCQ;cg02(3se%9)55P-DY5uckc2lHq{YpS=4a6g{=SyvD)7kJg@X((9N z?Yy09gSk_cFnZYGY6#U(4RSJIQjnlRfW88>@k6qw_x!xo6y+@4y}*(le<+uM>M zoK&;zX>)m`4q=IC*oC!fVkRszB96CVAzpBWT3b@C#t4`z?goF_T2rskb?L0j>T?rr ze}Ybn&V`<4)ssv$F?M^C9IB#Hjh-+nk9)m>TB({cmBD~cR=(DtHN__VHqIs`8se5% zD&Wnvgw2^qBIi%EHTdXCt;U>9NlG|XC0Ja%8EsKIv6I_4Drs?NdOe{u;~LnvP|DSq$ObVu<`DG2|7K zeFEx)+KN@x7;9BAX$0Zd64SLN$TIyxizU=K#{Qw`7Go!ysS0ST7|gRb8viWrI7OmJ zNs|d#Q$(DUMG4n9nk6L~<48nuNR()nz_3%oeZntQMhLMuEfS(C(G;uD5`wyjQ6$Z< zB10>hD&nd}=CkEwjnOnwlqH-MC6y3yicu+5!xfH0Dvcvqp;=K=^4YQkJmv^OlyOqS zWfEs;iQq(y!b!wXEF~#8DJe|eaao!oI7CU5h%+)SQy9x)IHh7DOaUhe3b8cO6phI@ zt|TLlV-<~NFqNQ45#f+S6h|v0iBy85HC$s=gh}~qaT;dFDJsD!vV=*psNoXO2B|5W zhzMCyki=2UFT|O~D1x9dNg_m26iHdZX~ZF1BsCFcPOGde%A(5U8&_czj?rWoM`0+5 zkr)P-a1Lh5X&AvVh>rsWL@N8l(vVKvNQ{swBtI znwD=|1!p;qMwBWOq=F$;WMR={RbxaF@Qgu%$w*QpF`q4t18xw4C4qINIh?|95iuON zFUpK20e3)Vuxx%?1y?YUz!-{#7P5v^05KqdP%(~!^#*Vf+Q(2 z3p7J1keo6hk(@{~5CBRM^I~7)5RJ=>q$!L>us}^TVlfev0e}L2G=|X>V6?pB;=oRt z%u+~JISN-;7AcY@;Sz>35(bMPD;z|b%bSxjL&0<)$iOdv2};Ivz*7l`3Y>v+s+xDc2%giVBr2Q+xdC}k08ND-!T~UZ24$z&VKlorx0UBcVtH1>7phB*iisP06G}VszedC9uJu zh$)Jw5G;_6CaDa<6kKKz)D(#naYX(?ZZL!bIYi?slq6auRHOlVAzC=g5(-opq!TZs zUA{O|8UnN;@Dt$@Bmyh58iwN-hXB~5qLD1rQkrD*+0u#xc$HK|h82}Hg3t#B8eus_ zWF!I;ISf*i&RYjDMpmFyAw+3Fi-aTsW+|G$amaEg4;mm0$|OzX8y8b3N>&j8%R$pB zR6&V`?0|HX8Bzp%$`X_`0_BY}4x!)x{W5SOETxFSJQYdiXh{VdNGTSR0sMLMSyWg; zB2-F*+@cs65*fz{no|`<)iez1jK~lwKrx@sA|x}1z%d+&D#pO_KyH$(UW_0@3ZoMO zrippSL zNfJxRAX7*c>M2dgFr>mkHN_B6tO_y+)I`2D;y{{cI0p4YuOT9VC{EKr?EpoKiXyA9 zg0cuCpU)P=m<;5MbHK2K4hRV&fe$!{6VL}KvY1A|Wcp*_XFCmDCHEa{{<7+=_HlyU zY^|-X?&rtP`-&yi+Eit%rB9E?8nbFd&CDZc;I7__6Q`JgfYWkvz!L(QN2GORz+YwAAoombM; zF>C|sDEt<66ddX*EHD%l7$%`%Cr_*m1K|j}t@}i~Fi;G}m7+5S!9_`FN%tAF z5jMHAvFT{4esf4^Ss>WYvj?Nl0 zOos~&k^)2u6&^DTq(k2&3jHr!qY%+E)F`pl1U?$t|Pe91fK4PLlw`N{{!Mmnz@{h962 ziLq(Bw|}wmnz#1c``~l;UMFxtZqu~~F8nUL_TlFG$;%JC{=0ihwjEhD^U48lOk&R1 z@%;0rw|xIz_0CZfhD7dIvHFXP_uScf-@1W|AK72BY3ZuJ-tg+C#xI?>naXas?DWHD zJabca#)iwvZymLJSYW{KBC9{CtiA89(j$vahj!8SGgtpqxAxAJf4{f-9c99R)7HMT z;psbCzIf#5(xyMJ*!mN(|JU!0e{9mWD+e51^!3#HFFe%wPU$V@44HrVABL<*-S_N# z8BJb(^G(Ob?+vV6B(KmeSQ;5xmLBueZ4aDTcKhJ7MzqWsdSPn)jPnW#4Fe2omOO-( zJb;EkfXhY{6%`f?UW|t77o`TnPelc20OZP$?w2I8G6-_3r~vY*Om8r}XmruY*A7p2 z4U29Ze)`kL-<~%4@SCY@oJsUwPe^Q7Ps4z--+p4(^6%#U z{yg@U#e2y=mG0S*{Hk-;#0Bp^8>k%`+%jT*4gc+%kL7OJl>5z6?pJSLDxKT>^s(a` zF8%d4N5?z1CkD>M{8eKm0LpEjTI`%jO(8fw@+!Smg{N1i@t+VI4RA(-Whnti}^oa9Vz`=Vg_kf-*Y8T|dm=c%y*-l0es^a zLlQWvqg;o3@8y4!fc_l|tT}7jr}iD2?mGP<+uFw`KVH>2IX%OA$;A_Q?I}^@Yrg*> z_Q~c=$UR=EC>aQ=_^rQ0D#?0SJH~u*0^{3u{;Nxem7oVB= z?Xj2cUGQ4$BW1|)(^fp*Rc$MNbKH@4f4?&MfM zZ=4?JTzhWNIrOM~|0t69dPkSVmEJb%v6+aue)g!3_8v*x!UpOdrOJaxEo-J<^~oO1 zb>!t`pPnzTJNMwat>KMt-n(Yi{l(tJqbYUmRm0><=gHT;ak$n`D10RUM z(1}Lq*WE-g5Ea7he!$O*>;Awm|8vZ~vZeSRU&fcuzVNGeynFWbBC(zmkS{bPRUs2FOzt#FlEZ`?F*+Kg#;ZG6Vp`9sya>(Be$la^Tq=R4Vr`w%JFLC>tc5?%T zKmZ`v%3`F>4gD|C{~JgD9a9{+@xkIrHy$|4Uj5O)j~BEpt@wz(r@k_9?7DHw4u0!S zd^Px?DX8FsvGa~s7r(NIf8f?{_dc)PF*Sb1pVvHjWWvl{lWxANedt>Ibr-!lnjv0z zc7*4pk+HqcjmvyBfB3#dzqX#rox$qJ ziqke3zj@)|S;ka)^92TU{TB1fBknx^i*o0T@q7O9(qm5ye|^Ek*IqdPu{rC$95H;r zO+y}?JbHF^-`rsbq|pzpS$LDZCa`n8iQjnq`@`u!y|<>)dc~y5c=d1jWzS}%A*Wx- zUrk)QfFlbDtefrqre2!ru=7IG3Z}$ zMP4fSw_MR-I9F#2V^N2}2%2po{Ej^#Yh`7i0WOOXKj^gbK_GDl7Z^rUI+Zm2)7K{C zzN8d;MXU+(KG`%onoTCql3geJC_qa#k6*IUuO?z*qpTW1_hzH9CS$)Yj8dCXY-}^8 zMfehiQEX~zPO42t{e?n0+he1FjjI1P8g=~wuQsHFYHWh1ikMN1-6KO6icwBADlz@* z7){2MW^8U!XPq)oIt8}+V9@g96m%(`&WLgrPWJUavpsKCW+O`vv7V34LtGcrMRgMY zK{QU%Y@jz321Ah(*^#yP8WnVM|3Qbc*aR9Jb~8O8K6N+JE!ysUqhdzTba_kB6GgAg zdufX%dsmoV{fB#9=IJ%uAN`(zxB9jmR>`+}j<{}7-&e?-^a78$v_c+yt;?l%m@S5Fmge!BFMaV390x@dUgpLSZz zb6oolV;uz{fKdRxZG^7)FUli*v)K1tr!L@tUW^Sh6c=JcPVOTI8_>j)7sUgy5o3m7 z@CS#j9Gw4BVRUxi(;^IZ2C1(enzHx9A2$p?{`t5YmJP}rEI9TG^7l0wfmx9ml?*zq z=NnjsgMm?cKNl1f3|I^Wt?$}!AsXECm8`+1-k;IG?!guh*kVBW%jIp4o_&Yg5dVVO z@$r%wBVIF%eEbFDp}o6H@BU3y*}grKZ`e96+P?PXB5&z;U00mdc;wlVg9nbi5uf<@ zQ1QmC&)(aP-to!z24&-|!ZY*dyBAM$p1ES(%qi&upIlLRjk)0T+ZUd3Xwg!mr+Vrp z^zu(#mhU$_xn=D3?}{wpONv$mF1VN+*uF9M$wS^3@89vFcYor!_Wf;tcz%L=8nx5- z*xzQ|bIxSla@*_6)@&1pLPeEoyk+SPN4 zl67VKuMb>1nflG?ruM0A+o#slwx_mjOzrm6wr#w*>%Mi@z3<(uwX>6~ z@ROOfxCDPd$mcgjH&xcu` zUXS{_^)rb7?eTuAYlp(0RmWcf`f00g{7$Bja4H@l$Z+i-M&hj*>GO?f?%RNrVJq-E z)~@0ghv*;ak+-ac-@--XX$L81KaF=b>0hA)H#q<`mVyvoaSSCoMo^2ttDLeLE`yH)5gv$=`lFD z8Pkpp_yUofd56>G=4dN1f?|J}dya77*aobb8Hf5sYq{wW5{$-bzf~ZY58>CSRY0|e z-y2QUxl{ZtRQe9Km{rGQGZJ)k#3-B!+0LR zHDqN81xnJBFMf%^WJ31}6C2>7_!2J0O5GX@DOLMNW%kRg_^hoG`7wQI2D>CadBVtw zu~i)$Pa-`j-Ei<;)?WV}+aAFl*^L%rmZ7l2pC{!V8l_RoUwHfI`|SI$CaJ6m_+A7#uO0qLq0~O4W*?C7A3k={ysGI8xGumHA0?_~u{DA1$hnoZB$glZfR~rqyT1 zjwOy#j-c+`kWoUg1OJAZ(cop^!r_|Xx#3o)$`s+vMd1BaVdi2vO+8FQOS4l2esB8j zjU6|NnDi@&Dv97blS*k>QQ1ZrlIpGMm`Y5kuCh;+xGJ0SZYjcia=B_*mcpqrfwEaC zUrA`0S&5yB&>xV-dpN8{zf8Zp*dN8*TD{$lAyOnGyn1(fGAoqw5Ep-r0jk=GWpCH- z?WylX?GXZHrFlGJY`@sl>y>U3O@-igQyrc%o#hY?X^K;BLBBV!E@^jY35wWdT3JlA zt;&*9l7Z!t<%;DJr=6Tt=fzn?oj=<(Uj0!;{{EuYrj{^^nS{wYR9;qIFGeiJkrm** zuVO5-DkR8j|KZkcTYQn4-KFc7En`=_;n8{cLg>TvuJUg4QhYCg41}#mrhr{Vp2X!J zTSEARZ--7HKi0y-TrcGh{PVKm|)hMkOtK zB72dpB->gHQ6-z z7?>G;HESNM>c2?nOz>&*iFy}+LkV3*Eho|>0y#A}V)3f+Zlq6UUI_UN-X$M1nE|KJ zr{2Q0FbGv*}BzM8c<1>S~5gi8mEF{TJIW)KXm4|neUa=v%a+4h{h&&sIJ z=sPc2t-j#Au($|a%Nb|Sq0QD{bDHiS7TZ$XpAkaJNn*CztN_W2$@`l%9+EQ|F~zA@ zf@_)!-O3&fF24#s2s-BM3hwfAZLn@==#6vrG!HkA$@kl3>jiI$`I3Jce|mn-0E+!6 zAAYY$6y~(1TZwB%pmYGZE`8e%ln7+(Np0i~>^33(X5S8>`}cWu6%--hmF?I7)XeNAN=*0J}< zo9w#_F2*Tk{6f#0EG!cy$DMd3g8sb(CzA38(~UA3(W8&3&+Hr14ChSPl9={)V!0d1 z@3NlpXK@`I9u$LYh4lNaLDZ$O9Wp2~>lwV+IO(pWHmm}?oh*Uzaj_1fWn{7mO=c%% z2d1uL6(+%TAA`0L%}m5ea3faru@x{H42VslMMo-{G~n-Wb!H~&rri_aqddvw*>n@< z~I>dFuEbJXR5Rv0>;!)L<+4TYfivw^@)c zKUYtw0(DY(%3AsB_KpVhHbPjPBB>(o2m73^fzNg1flL~kjRr3vSp;mJhTVPnph|9v^HlWNV=&m!%w}pxUA=uQZ@+sx_S7Km1%} zN|~TpZ4Yb`Yc1&JZ|N{89+{lr6H@u3a;Ng5!g(>f-e>@RvYojg@alMAKU-MU>Uew? z9O+tBg;14UFkLWtm3pmz6sig@JAO)jwb7}RvvD~83pES%4o8mK1a6&QAet3WQHoil zJC#8FOVag`b?L@{!il09l{vISZvVq$@Awg6^N|>Zcf~c*t702&j>MJ7jEKonH2o%B zJVQDCRm)JTO@3T(X7Oah^G#xv1TB-DU&G_qt;&eS%5lJ4g4xYfWL8p^4~X%3O@B4N z$?MQ)a?=vc?y?Qtd3*NfXT%|22j8UjO^fqQ-ReH3dW(8`HLsq{iSr5nN5Y)^-}cP* z^r}{EtJVw8&PFfO$76zQuF3VgPLFGx&&7po9)b1FTTi>k!N>beoOO^R_50*l`?4GL zMP-M4hu)p=xyZ8Edgy|X*2mh?<(jW$k6Z5T%$md_Y;fSzN8Ei3nixz>TFh7oO2}z8 zw;&JCj*#Q~@msOjl<^c*_ScX6kFlz+I830Yg;Vh4OzKQt%1uf_w~cq<`$^9!UiIow z-w<)vh&vmL?w#7}d9T}=8_{LKCYt=7H>oepr}=a3z4CPNYXV+E!YA}H$pz6rY)NV) zsU!;kcv1oYet`hM^FN^JcMJfyFarQ5`TziLDgf}+E?#d?{9j)Ldr1u^000T|KLi4h zo{9UfkU>N+D921VMj@I;mMuD&ypRH(l_+5I>xPj^BA`5?9lR~ z&if%I=M?f}_j69`%IiMnv%=flB=p&##OBkNs6J~+l(gZ6Z)J=3GtoV(Y5 z|Et2+{KEq@NAkC3qiaS;u;cFGq}H{dY+7j2ifAn6v)Y4XsBuW|vq`XgMhBeZ+j0FD zZ?0BsGxsU|)Wzm5ru&7v$;Ix&6RC|DoH32zGRLNPM8b8rd)ytZXPYem2R?ki$MYrP zB$0pT4oEhuIo}3?r7w;Aa{@mce9n73*ZtZUjjFxG!0Mpp+A`#5y(=)GbKYrw{9D3l7gjt)E16A&|fxJ_=)D3m%_)5DM zrMjqzHjN%Hz>i)1Q!8-QmjMD?OQ2!*$-d~K&!G3h)y~Z?f@jscorP=CiVVa?>-)DSU~!IzLb*$`kiWC`Sxe;!Z=^+=+?)R5=<}yO3GO9GADjeZ;M<*65Ms@eRpMHOHLCeVA|00ZMg?_#3V>zz* zJH#3F1xKfVL*)suTz+)hdx-GPs6I!o0^ZujhtbyeoQnI^_=f6k4~bq=-d(v#qPLxA zCG`kF2!le-TY<_R*{cVY+D)w2nM@MMOO#o`WP8o~#u6)1`IvWTTI zrwm^N;hZVOgfw4Yc`iDuLW#Y*x=tr{TLqasu5M$W?dCuKhXw!3pdZzp(7@06Q&rQ~ zuN^)i!Ft?bl2VUTK;iLo4Ad1i671T^QWW(S0gfXmmCei?wrSrtCboVZ|LJ{ecf!q- z+DbC&76q5R-f(Sy62EOU=RbIAX94=*B%cRtQ1lNke?>St58a93uYSAj!x@o4Z;X*& zL-ihi*=SrpAOW`=Th@Qy{`-n08(qZ%Ap7y&n_Eqy9?~<2R>WPu1!D{scq_DY@ilj1 z%X1YlV%Oly03UhQb~PFyE4$~SMn=!s4KYLll@PP~*N-QR0Zl*;;+wRP6$&KI)d%?S z5z_bmccmWow9j`~;}QjtHrA!((b&gb;A46Y0zM%|>KjBRD`0BNv>B?(Wj*6gpab;q z*QFDS%{$mqfG^e`VXxbYMicj%qSJp&!*kv39UJmi%YHr=cgL#_N!~zi^T(?FI?~X( zNum0gCN|9A=5>^C0PzebrQgo+Pws~{bk_Er?t)8lz1@4?M%;HkPN78v-sDN6(9;f$ z*0~$#k*eW>sBG+z*)#Ho%!mBk(LV2FI&>W-fj}+vP`Qc`j+JE^RGiRI&gZv#v=y}3`!X1w7lv(2G z8cDWW0omE8w&|YD7f@l6%o}v~?$YK=+@~L$MPB=CAWY+5ZS7^q8gTk2Lu3$5oF|z` zt}%*XZw1P#CScI9Iz}FB_Slx+Sk?RYh5hJ}`4FwfGoQ*|L$KJoXzLe5qq&j^5*|S# zL_u4hZvPjMQhJR4n?G!MS_qmdJMmL*fVvALqpIu+s3zav|1HKJsk(LF+!as$%}~8s zwxCy7NK&Ae%cAz0KvqqF;Wjct5w%fxhi}7hvp`7i&&!hj*iaCoqU7*b0g)V%$FUH7 zaBKw8;!<(=JWd4%-Y8lY(4giHj-WGSVfJOQGQkuZ@zc$8ZjQR{_pWF1cvq?BJT5M< zss8qmL#IEnb44HU#ur0~;q;>)A5R9QsgsVMnEB@LO(XBKy;b7+Me5gAb&@l2l>@PBOd7K zs^Y7<-LF7?ysJi1P^Wf-wO{BgJL1kwL;u6sA}p*CqN-DKmZJ%w2$`2v`2lglD(oq6 z&d&V|XcU4)8KW}M3~Q14qSaT?tJYqQF{@zgH_{=dyZH_S02c~sKuN*GyG)Z3AZ5k) zRn>8^;l4V2PB0!0?Y-j*z~=ZUy5~a8t7o`EAoyneDD$=pXtb7)WO+h2!RINteD;~W8I2uG3WZ5-ZP#D7$r(0Vu0o*iV^v2I^h zGJFHqjCj2sA3X(-K9^m)1%_XTlfe+lNu%1k!j!O~{Vd^WIm1={G`(#~uzp{tLJCyz zhCY|9+q3)EVG!M_PF$&+7+*6n6rPFm^TlBTZtJjgnQ@3Axyq;?aiY`jj+KD=gBZ7d z)0i5P&lg!;^IUH+hfJi6w29v<<`&SGwH8r_Ecj4Sx3(`wS_Xqyy^Wy(F@yC3U|LJ@ z?H;O>_zAc)8(I&WT#2c{JR{ae50dr+TB2#4h@*&z(ILpeE;hd6&MVYCC>bP%yfi_+ zm5=9jL~s`V2G&x{r$|SmC3n?5&zJ}cX6cbUov{ZgO4EGmnG2{^Tqp!5g9gHHFT|iH zw2v@V&Yi;RDxwYkG$25A)nD`yhsq~yE|whyBRVaXgDP_-@UzSLgcP%U5dY30&coMGJ3?OI#sJpCB?%#t=t(jwAdNjC8uZzXnJ8l!mOb0GxF!;g->O8v6I zDF38s2?zO{R62>HeaA#(ZT56J3?G$ZsAGwIdmN`bpbO62++vy2GA zAot33%VnjdUg{>%g+kx&;PX%_7YEPD+hj#1ZMF2%@ zdi!b6&U35%DrwDdAIT(6c@Bp$aQq6R1=+;pD;;-w$Y`n&L&HS|hjpYRL*J&~*0!%e z3Yc@jl7Qkv;N`haCrvYNu((Tw%=iTEDh9o$;@0KGixiAC=z{o14KKINZkKgWL7GbS zd&N(=8;lybBbYMk0}!?-jwn=-wF-bp0(++qEIp4Sjd5(U*x~>(IP;*ZAL~>4auhS= zXgbe&%Y(nu5VhZp?ZjR1z%?qZ=yqdwN5N|S>-bssR%9YE{HmEc=u-h$L7ts^`Cu?Em!wY0vbs2m3)vlTY&=>XY-J)s8~m# zpV4UND`^6pBl`7G%WS8jY!pJ`2Ht{zJWP3;d^)U29AUeaODs{NF1w3n*vf03ReAK2 zeJU2;`KIj-q4N~q!%I+S(%kEnEM|(==WTIL8hTH*|0eANCKTG^qm;_nj^Avb@N=C1 z2ei61Q+eT}vZW$ZlN_A}C0uPa(o^kUh095&+}I;h1!aZ6 zQ|Nuh!{=`k!CZ9-gLUb*?8pJpdrEL=v-~(aUEoVq7|EVq$DC0$HSfT>mws z%&A30NTMG#)@RBjVchOBGnB@4h9A&ujbQ_&f;28pT@x<_vy^~Vl?RK7HVWzE zVa92Z4SCn)R(~&tAUP=}yH10Jdw3tp)HmvL4qt-f1J-0>j9V`S`ui`DOwr30|GuOP zn7zXAUs<}pc>lcaH1rb!uDJti=IuXN#Fvh04B8RdY`g!E>MsmYu$?hD{eZGe$X6Mo z#f`G=3ck|neylQn( zT88=qkUIKB|E2Nn1o@NEen}%}p41VSC=h?pAac(^8y7EvWZ~M-{wv4ez;u=MLd{tq zN-i0vmtI%XfUR|Ng@)e^jCe!s-ngMSccf7bfb=N_hvQb3o?ughe}3KI?TnKkfgH?BVP2wpsNihpELPv17`c5C;P8YH;5by?zi z`CyWhWDAaNdyH`Q3Dk`CvU~e$_pn!AT$fAUDx~=G-nMuR`~vnCz9X^9SZ*8dFY4Vs zz9YZF>(P$-5{$-Tj+f>U*|7$bLe-?{@OIA)f${X)Ud*~9LG$_+O}Il53XtqDu#MNz z{=S=?&Jk0d8^YVOxc3X9mzetu5~Dp=i3|SP{XF#N=>p`%g5VD}0Q}lzD>9vQi$(6_ zC^G7?EFvmCB6EojZ(9i6^RHf^&MpqIBnU*bkeUVTGp-?b&%1y^#8vj=SV^CN72&7B zUuNP>1k#FG>MEyFR}LecIQk^U1ozjO4#dF~(6C))X!C?a;L(Jm4e0Z>PCdv(mdBYv z33} z#q@;B(I7pmRXFXe2~bV2THJ_9;mY>hb_4MpUGR+E2E6c6=JY#Bp;jx-hbu^cRqK;H)2 zy!VJovHD}ezYnhr*TL}r;4-{A8QVl2KopiEeqMq&a-&7_e)s4$yYx2Xd1Pko&ibYu zNN_a$W~8ss@TtdxFvQy>YG&{q?pis&M>$qN661&w$9-U}$?H8%r$+;Yq3T{1N+(Dp zViAG#(jC2IY>~$A0MfhW)?~_>>U%7tDGdOH*=~?|^$W6lH*O=^aMuvF72)*w_&fUV zjDS=!kx4{XJwQE-#gwNpiu9f@-}xgU*7!11VWV3A8PYa64}QZlb1sJjB>Es4CbdFQ zTTp2Tf3=}8p1}s4L@u5G36>*a9n?3FcQjYcC^YZ5#RO+8u3tmeYwoa>M)@i*${u>7>q8}*LU7neHKd=w2W2gqYr}ToAcsHsrL_3* zztLWgr@q+0&k{eOB@{>Fghee*($Q}Z_?jn+$2>tbz?DHSGrzk(7)Tv8&#vt~9aTTy_2L2}%T`H%6J%e~E z8q|Ek1}x6_o)L4~S3mlng(!MeMyywTK6kAcI-u$@@0Jfx2NP909q{zuB^YPzDj9Dp zd2h(Z(ozH!E>$ zwzFjv-iPS%Sb>b{Ubq&5YQq*Cl1RPQCL^k8$louJGex}d(zrv-KOdy6fF>^}YWGR! z*3sn@_{Q%TIm^DTg1Jy;t$h20 z5b5Y=Kf~uDLHCo?9-1+Ngg57Vsn4$v&C0w*PT^ExzI_6Bo#F3t=C=NCAf7biIOk~M zcYBAJ>;ge)V;@`wOSxhGhHr^0NnGrWKSj$7B(jSB6lnL&AFM#hDX*x0p+)C1GaBR} z6i~W5cMg_^{}+7NURgsz>~fvP`VHytO_R9sU$rX>}e_Y6&D!-Vcj#N{L_M?ekBOeA2_z!BoXMi+@%d+b#^|M zDi^`v??x#*?uEWYb0*x(jV`VkGxXG!?e`SQE2;Z6qa1Qz7IqJR8o_Yh>tTsw<9tx7NlqOcXA|YbkUt>WyREsFq(x#o)?}an-bi-)* z0NnlYyBA`sHV=e9YOR%00p#WoQthvMx|?Ii$`J9a^(sSrd>`@H@B>I_6?OaiT}^fH zLTc)abV6;&tW^^a@-qZY9S!t z2}34j_W7*TjZosEB<&eYG?{8b8Yprn#=f{;GHdMhrtkFvzY2st)a=JWC66_)l~mH(4XEU0-p1guK%--wR)a=-h}w?m<_7L-DF}Y=I)`8V(&*m+Gy{{l8tf*ANP@h6(v33b^Yp68#H%0-l|2 z2;2;je8kiZT#BZe_Q8|0?*_>RUM#DN4UR%mj-GABzbdL(uoPi24K{vm@xcWqt)S7v zYGQ`q_w_8vg+bsD?*VC+Zv1R4`zp6W;z7I|mJ@jmcUam{HOnm8hh$k~9HDQ6h@_?> z%Nmq&wa#*99GW68kr@0>y{yV;zApzjW4p>QIp@JmnZ;$?!h9ZXWt%1NEe?Opl*T*^ z(H;_Wi-*t&W^=XC_GpFCgUQ7o7L6?q%6t4sABenVx;RKymOZ+RvprXl$cJm@Ts&x5 zs!&gm_#Lrc;09r;cUN}nRMkNbu6QO-RoKSKTeR8I|D}2m(nhX7A z7a^7ZkVSXE9P^Bm_R-hAexXl-3~lS{Q&dM`Q`Wtm)_-Jk8is(P7wTC`3n%?cv&c?1 z-@0xuZzJuj*G!K)vc<9kwVoo`P#sSgbe^jxE}NSCL-hC6BP~pR8g~z;A32+$|NHqf zyPvjJ=}(_6c4C!mGp3!;aujj3i1SBQaJM7`ZtjQo_Z7kBMqN@DLyXjQ6|<^-%iSy) zPJtf(0qY4#59o@TM$#+kB!%qo*redu-G+T=lzj>YV%x7HR{c-5iKdyUQN}6Pa|kwe zsNkf-<_Wv(^AN&6L;OIa)M7GW%CQpk8-mvN9incyEQ#y|+dwOPluU&Ug@VN8u0lj$ zPWYm}S#4+E74{12seH*@IYoq9S*HU-KF+uKo%R6hc;lA^Bi=;cOTAF_P}2YAgp~S3 z-`iX?eE#N#`rb@0I=ZI<+bc{Jdsd!6l@mX}j9=+FgN;`2NBqZ*w|kmJT5UVB+gu+j z3U{>Kmu1x9G{E){(kN5$*k3u+ZCn^f>X{TAYI}n`iZspYG7xT7zS+BGR@L_8W;cI9 zrn={0DH>0>g%nTI`6;498`*T6u68{WzRS$PM9C}&^sRwOL z^rqZBi=aV>8E|XE{zkkG#S~aGFd_{&o2<2^_Z2nHWFfMxF0s_a1yFZ_Cxg?n{QX$H z@gSGVwu()wclj*bxE|@6;jvr(57G$nucqQZG83>LH3a6lg?qKW4)-zar7!*DNf;isZY0Y+ui68!pVfY}{f3K47vi=$0d@`iY z$x)5>C#Q-zrv0?n)K_>J(^Y_@h=4yE=>sA^LjEN2ookfPm0KldY0P*vp0V1#E5s(I zeqF6c4dIp0zz-tfcfDR0Yxx4C`EwCYeI_NoU0w=9q#k63tQ>tL{&@Cv9WsV+`k%&q z7(>q$Q%ooSwX-CoTk>Wn!a-Zba%thi!9PsHkG&bt7R3JBnC-YWHU5bq>$FJG{%}@r zvN$?t|JW}s|6?YILXPeL@`h@Z6||80QU2K~Jz>Q-8LQCR0K=pYUjZ=mM#=p&z0*GD zL&ag%pelqr5z3)?ALeE#RHk%5E`by*k&H}S+B=UV7~=Ae*%UIPfrl;Sazbs<EVB)EZ0aWs$V!w0@L<>?XU-cD?RRa_8$`Zwz0{&qvy( z *{N#V>|{%iFg#I)TMMseZon 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%0AiC2>hXn4DERAC3N!XHn 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%0AwpIV|vL;b15 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�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 Vkkc%~Y|BnRc1(4Pvfm zYA_dZJ3BH0ciR;`98>wz)Se@Oldms6Ry&jzryzWEiZY{<<+Vpi;XRR(;@b5urhsP&w7s2^6VlVPnyW0}!|pKja&rNO3Yxuz5 zR+vu?Yun~jh3nE%Opx1(YbV_vw!p#kV#B2WHxy1C9&T{C+JfBbtE3uEBqhaAq+lx{cG=(2gh#^oP8iB~ZnzUe>o zw`ozCYIIC}4WPM{g!MLIY@3&4-jmACppJyjWiiTNkRu`@du5<~;d2xcrP$Ke@*?9U zn`{KLM@0`|#{-Ipu%Q&jSspQ3EkSpoDX5U_-Tq;UyxzzIuPs?nOvj*>4qUifB$oCr zt+?%uS~Ls66=~;jnPP>bHiUurLq{4fLN#*Ka%V2O)7%FmDTTNy@^jZlV9Ny`7xO

    )-xXd2hk7ZqS)8y=yfd!UnkCG9r3@ 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 z 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 W&iQ#IMfo{7sYMvlVVSArDAE8nT}LAT literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent new file mode 100644 index 000000000..52aab0ba2 --- /dev/null +++ b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent @@ -0,0 +1,14 @@ + + + + + application-identifier + 35Q7ZE75E6.com.sunsetlakesoftware.FilterShowcase + get-task-allow + + keychain-access-groups + + 35Q7ZE75E6.com.sunsetlakesoftware.FilterShowcase + + + diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase~.dep b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase~.dep new file mode 100644 index 000000000..0ef338e10 --- /dev/null +++ b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase~.dep @@ -0,0 +1,19 @@ +ffffffffffffffffffffffffffffffff 1562519dd6cff0741a72e1f4c590fe68 ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o +ffffffffffffffffffffffffffffffff 630a4a73360ce38fc13f9cf624f11b64 ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o +ffffffffffffffffffffffffffffffff 4b5479563b91ee6080f61d980cc5c06b ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o +000000004fabd14b000000000000014b 490dbb6b0ddf5b438b11d282840c04ad ffffffffffffffffffffffffffffffff 0 /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth +00000000000000000000000000000000 e29dcb4086444ee8382f232f1686d64c ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +00000000000000000000000000000000 2c3fda907177f892cb404c6525a69cff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist +00000000000000000000000000000000 2c3fda907177f892cb404c6525a69cff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase +ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList new file mode 100644 index 000000000..55914baf9 --- /dev/null +++ b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList @@ -0,0 +1,4 @@ +/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o +/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o +/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o +/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d new file mode 100644 index 000000000..04662c0eb --- /dev/null +++ b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d @@ -0,0 +1,4 @@ +dependencies: \ + /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m \ + /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h \ + /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia new file mode 100644 index 0000000000000000000000000000000000000000..bb0ec51b2047b4a032afb5d9dd79a4d1afd74885 GIT binary patch literal 220 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 literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d new file mode 100644 index 000000000..fb9d48efb --- /dev/null +++ b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d @@ -0,0 +1,83 @@ +dependencies: \ + /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m \ + /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h \ + /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h \ + ../../framework/Source/GPUImage.h ../../framework/Source/GLProgram.h \ + ../../framework/Source/GPUImageOpenGLESContext.h \ + ../../framework/Source/GPUImageOutput.h \ + ../../framework/Source/GPUImageView.h \ + ../../framework/Source/GPUImageVideoCamera.h \ + ../../framework/Source/GPUImageStillCamera.h \ + ../../framework/Source/GPUImageMovie.h \ + ../../framework/Source/GPUImagePicture.h \ + ../../framework/Source/GPUImageRawData.h \ + ../../framework/Source/GPUImageMovieWriter.h \ + ../../framework/Source/GPUImageFilterPipeline.h \ + ../../framework/Source/GPUImageFilter.h \ + ../../framework/Source/GPUImageTextureOutput.h \ + ../../framework/Source/GPUImageFilterGroup.h \ + ../../framework/Source/GPUImageTextureInput.h \ + ../../framework/Source/GPUImageTwoInputFilter.h \ + ../../framework/Source/GPUImagePixellateFilter.h \ + ../../framework/Source/GPUImageSepiaFilter.h \ + ../../framework/Source/GPUImageColorMatrixFilter.h \ + ../../framework/Source/GPUImageColorInvertFilter.h \ + ../../framework/Source/GPUImageSaturationFilter.h \ + ../../framework/Source/GPUImageContrastFilter.h \ + ../../framework/Source/GPUImageExposureFilter.h \ + ../../framework/Source/GPUImageBrightnessFilter.h \ + ../../framework/Source/GPUImageSharpenFilter.h \ + ../../framework/Source/GPUImageGammaFilter.h \ + ../../framework/Source/GPUImageSobelEdgeDetectionFilter.h \ + ../../framework/Source/GPUImageTwoPassFilter.h \ + ../../framework/Source/GPUImageSketchFilter.h \ + ../../framework/Source/GPUImageToonFilter.h \ + ../../framework/Source/GPUImageSmoothToonFilter.h \ + ../../framework/Source/GPUImageMultiplyBlendFilter.h \ + ../../framework/Source/GPUImageDissolveBlendFilter.h \ + ../../framework/Source/GPUImageKuwaharaFilter.h \ + ../../framework/Source/GPUImageVignetteFilter.h \ + ../../framework/Source/GPUImageGaussianBlurFilter.h \ + ../../framework/Source/GPUImageGaussianSelectiveBlurFilter.h \ + ../../framework/Source/GPUImageOverlayBlendFilter.h \ + ../../framework/Source/GPUImageDarkenBlendFilter.h \ + ../../framework/Source/GPUImageLightenBlendFilter.h \ + ../../framework/Source/GPUImageSwirlFilter.h \ + ../../framework/Source/GPUImageFastBlurFilter.h \ + ../../framework/Source/GPUImageColorBurnBlendFilter.h \ + ../../framework/Source/GPUImageColorDodgeBlendFilter.h \ + ../../framework/Source/GPUImageScreenBlendFilter.h \ + ../../framework/Source/GPUImageExclusionBlendFilter.h \ + ../../framework/Source/GPUImageDifferenceBlendFilter.h \ + ../../framework/Source/GPUImageSubtractBlendFilter.h \ + ../../framework/Source/GPUImageHardLightBlendFilter.h \ + ../../framework/Source/GPUImageSoftLightBlendFilter.h \ + ../../framework/Source/GPUImageCropFilter.h \ + ../../framework/Source/GPUImageGrayscaleFilter.h \ + ../../framework/Source/GPUImageTransformFilter.h \ + ../../framework/Source/GPUImageChromaKeyBlendFilter.h \ + ../../framework/Source/GPUImageHazeFilter.h \ + ../../framework/Source/GPUImageLuminanceThresholdFilter.h \ + ../../framework/Source/GPUImagePosterizeFilter.h \ + ../../framework/Source/GPUImageBoxBlurFilter.h \ + ../../framework/Source/GPUImageAdaptiveThresholdFilter.h \ + ../../framework/Source/GPUImageUnsharpMaskFilter.h \ + ../../framework/Source/GPUImageBulgeDistortionFilter.h \ + ../../framework/Source/GPUImagePinchDistortionFilter.h \ + ../../framework/Source/GPUImageCrosshatchFilter.h \ + ../../framework/Source/GPUImageCGAColorspaceFilter.h \ + ../../framework/Source/GPUImagePolarPixellateFilter.h \ + ../../framework/Source/GPUImageStretchDistortionFilter.h \ + ../../framework/Source/GPUImageTiltShiftFilter.h \ + ../../framework/Source/GPUImage3x3ConvolutionFilter.h \ + ../../framework/Source/GPUImageEmbossFilter.h \ + ../../framework/Source/GPUImageCannyEdgeDetectionFilter.h \ + ../../framework/Source/GPUImageThresholdEdgeDetection.h \ + ../../framework/Source/GPUImageMaskFilter.h \ + ../../framework/Source/GPUImageHistogramFilter.h \ + ../../framework/Source/GPUImageHistogramGenerator.h \ + ../../framework/Source/GPUImagePrewittEdgeDetectionFilter.h \ + ../../framework/Source/GPUImageXYDerivativeFilter.h \ + ../../framework/Source/GPUImageHarrisCornerDetectionFilter.h \ + ../../framework/Source/GPUImageAlphaBlendFilter.h \ + ../../framework/Source/GPUImageNonMaximumSuppressionFilter.h diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.dia b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.dia new file mode 100644 index 0000000000000000000000000000000000000000..bb0ec51b2047b4a032afb5d9dd79a4d1afd74885 GIT binary patch literal 220 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 literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d new file mode 100644 index 000000000..4a05b2310 --- /dev/null +++ b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d @@ -0,0 +1,83 @@ +dependencies: \ + /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m \ + /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h \ + ../../framework/Source/GPUImage.h ../../framework/Source/GLProgram.h \ + ../../framework/Source/GPUImageOpenGLESContext.h \ + ../../framework/Source/GPUImageOutput.h \ + ../../framework/Source/GPUImageView.h \ + ../../framework/Source/GPUImageVideoCamera.h \ + ../../framework/Source/GPUImageStillCamera.h \ + ../../framework/Source/GPUImageMovie.h \ + ../../framework/Source/GPUImagePicture.h \ + ../../framework/Source/GPUImageRawData.h \ + ../../framework/Source/GPUImageMovieWriter.h \ + ../../framework/Source/GPUImageFilterPipeline.h \ + ../../framework/Source/GPUImageFilter.h \ + ../../framework/Source/GPUImageTextureOutput.h \ + ../../framework/Source/GPUImageFilterGroup.h \ + ../../framework/Source/GPUImageTextureInput.h \ + ../../framework/Source/GPUImageTwoInputFilter.h \ + ../../framework/Source/GPUImagePixellateFilter.h \ + ../../framework/Source/GPUImageSepiaFilter.h \ + ../../framework/Source/GPUImageColorMatrixFilter.h \ + ../../framework/Source/GPUImageColorInvertFilter.h \ + ../../framework/Source/GPUImageSaturationFilter.h \ + ../../framework/Source/GPUImageContrastFilter.h \ + ../../framework/Source/GPUImageExposureFilter.h \ + ../../framework/Source/GPUImageBrightnessFilter.h \ + ../../framework/Source/GPUImageSharpenFilter.h \ + ../../framework/Source/GPUImageGammaFilter.h \ + ../../framework/Source/GPUImageSobelEdgeDetectionFilter.h \ + ../../framework/Source/GPUImageTwoPassFilter.h \ + ../../framework/Source/GPUImageSketchFilter.h \ + ../../framework/Source/GPUImageToonFilter.h \ + ../../framework/Source/GPUImageSmoothToonFilter.h \ + ../../framework/Source/GPUImageMultiplyBlendFilter.h \ + ../../framework/Source/GPUImageDissolveBlendFilter.h \ + ../../framework/Source/GPUImageKuwaharaFilter.h \ + ../../framework/Source/GPUImageVignetteFilter.h \ + ../../framework/Source/GPUImageGaussianBlurFilter.h \ + ../../framework/Source/GPUImageGaussianSelectiveBlurFilter.h \ + ../../framework/Source/GPUImageOverlayBlendFilter.h \ + ../../framework/Source/GPUImageDarkenBlendFilter.h \ + ../../framework/Source/GPUImageLightenBlendFilter.h \ + ../../framework/Source/GPUImageSwirlFilter.h \ + ../../framework/Source/GPUImageFastBlurFilter.h \ + ../../framework/Source/GPUImageColorBurnBlendFilter.h \ + ../../framework/Source/GPUImageColorDodgeBlendFilter.h \ + ../../framework/Source/GPUImageScreenBlendFilter.h \ + ../../framework/Source/GPUImageExclusionBlendFilter.h \ + ../../framework/Source/GPUImageDifferenceBlendFilter.h \ + ../../framework/Source/GPUImageSubtractBlendFilter.h \ + ../../framework/Source/GPUImageHardLightBlendFilter.h \ + ../../framework/Source/GPUImageSoftLightBlendFilter.h \ + ../../framework/Source/GPUImageCropFilter.h \ + ../../framework/Source/GPUImageGrayscaleFilter.h \ + ../../framework/Source/GPUImageTransformFilter.h \ + ../../framework/Source/GPUImageChromaKeyBlendFilter.h \ + ../../framework/Source/GPUImageHazeFilter.h \ + ../../framework/Source/GPUImageLuminanceThresholdFilter.h \ + ../../framework/Source/GPUImagePosterizeFilter.h \ + ../../framework/Source/GPUImageBoxBlurFilter.h \ + ../../framework/Source/GPUImageAdaptiveThresholdFilter.h \ + ../../framework/Source/GPUImageUnsharpMaskFilter.h \ + ../../framework/Source/GPUImageBulgeDistortionFilter.h \ + ../../framework/Source/GPUImagePinchDistortionFilter.h \ + ../../framework/Source/GPUImageCrosshatchFilter.h \ + ../../framework/Source/GPUImageCGAColorspaceFilter.h \ + ../../framework/Source/GPUImagePolarPixellateFilter.h \ + ../../framework/Source/GPUImageStretchDistortionFilter.h \ + ../../framework/Source/GPUImageTiltShiftFilter.h \ + ../../framework/Source/GPUImage3x3ConvolutionFilter.h \ + ../../framework/Source/GPUImageEmbossFilter.h \ + ../../framework/Source/GPUImageCannyEdgeDetectionFilter.h \ + ../../framework/Source/GPUImageThresholdEdgeDetection.h \ + ../../framework/Source/GPUImageMaskFilter.h \ + ../../framework/Source/GPUImageHistogramFilter.h \ + ../../framework/Source/GPUImageHistogramGenerator.h \ + ../../framework/Source/GPUImagePrewittEdgeDetectionFilter.h \ + ../../framework/Source/GPUImageXYDerivativeFilter.h \ + ../../framework/Source/GPUImageHarrisCornerDetectionFilter.h \ + ../../framework/Source/GPUImageAlphaBlendFilter.h \ + ../../framework/Source/GPUImageNonMaximumSuppressionFilter.h \ + ../../framework/Source/GPUImageRGBFilter.h diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia new file mode 100644 index 0000000000000000000000000000000000000000..bb0ec51b2047b4a032afb5d9dd79a4d1afd74885 GIT binary patch literal 220 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�lb(;4f5vIY~6|5`@VgB$fDcgd&u91 z`1)@#70J z1+HxNIpDNS_EV+McQf=oRkOo&pnVQnmPRWBjs2NUD+ldc@agl)O7d;PyK1$#6`-93 zn$A}Rn!S&MIR1H&8vkgAF#z^MQ=tRup}$~>g^086t+?CkWjgqrE{++jRi&@%JXlAe z&2pb;@DIj*cf0(5>_dLaq~tdi z1?IckGfbJ8dM)I$@0-?vX5Tm62AX}}v>r73zNrssmH;XMyeMCfCI1kYSsv2u<+!_# za_Ptqwe)mh@YM*^$PGJB2bKvS6!g;wkI|y6jyI21Mb) zpd*Ia^|ZbZJ?Z^fbY8JyYKe`*iQIf{vQCw z3iKU-lK^~A`3OKPAQ3PHa1G!_z}*18^PBJb=KH((en7tKoA09Ldj=l|>;N1o^js6Ga($?cs_t<0l41hI-l!%u1EQt`xgMuWb%0x-)oix;IkY)=eZqlH-P7E z`J4H@0KTJ$?@Ra{*TZ z_#QjH2bS-D<$GUu5o)j>dq2t!_%q;sz+-@Fz}tX!z^{N~|B5mLMglGZTn0!4%mVNo zjeKV#-{H6!@D_mYbmRLSN0+h;(JB-F1Ts9^ZjtMaOb=I_&z|sn~(2I;BSV01|0hc(f~vQ#sjVg z+zeO&C<8nJcnR<|fbWhw`cc?4fWHaidmH#0ApVx>X}}i1UI5?Wz~5R818^O~-!=1h z&ip+w&tV;pJAc#6_m=VZjeIvD-&Mxn@}08|dIMYySOO>o>;QZMIBz}521o)d1pEoG z8t^jU9l(!(^=`!g)5IXYzSon`g6mzMN;k&j9cYdO9Ev@CaZt z;5|S$z}Sdy^8ii&TnI=2%m6F|+yuA{@Bo14!=D21dFYF{HvB_h-<{z%YWV#aexHWl$x+{q;df;CjTwFqhu_BGcV_tg8Ge^W zeS?PIu;I6I)OTz6of`R#8|<{H_kaufy-|@EbYmdpZ104!@VfZ{w)%~J}w;+w*DNbot*J0y}c{-G@5^)EhZdrfoDt^Y~tJY{?)ou~1`K2t+hNhQZ;}-Mm>Aet|UP~?Z z18nIP)`h0mjkvlTQpT4;`6>~&#g<;twoty|h}#Q3ekV&^ofcoZMym!b3Vn^Pmy+$F z

    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

    sPvP-^Ss4RT=5?&{dDkjSp38l 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�O7g!n8S&QCcqKRiB)zD=)afhUAu_lvp$%0ORw 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 BkdXiY diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo deleted file mode 100644 index bd04210fb..000000000 --- a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo +++ /dev/null @@ -1 +0,0 @@ -APPL???? \ No newline at end of file diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist deleted file mode 100644 index e7ec329dc..000000000 --- a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +++ /dev/null @@ -1,25 +0,0 @@ - - - - - rules - - .* - - Info.plist - - omit - - weight - 10 - - ResourceRules.plist - - omit - - weight - 100 - - - - diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist deleted file mode 100644 index e5939d9b47a7d63db821933974e3ba06ea6e5010..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmYc)$jK}&F)+Bu$Q16DnNyNlRJ@3p?IH_n6oluOn420eAnYCx>Y1CEo*JB5keLXP zxx~WG!5QUPQc{$eR9cc+950{@Q{|pmT3no&m=~OylbT$TS(fUQQ(6So#l_9T8!sSU zoLb^qk(^VSlIomUl$?_ql$erPT5J_BAcigzke``XVilE^lb=|kVW4NE880B{><$(M ma!qvsq;E0f_)U=gFNh*xX*-5^JrH&oec1t*ATc?Rz+B9it zXekJZ0~anx2qC!e6FBm7nBBfWBG!J6*E932XJ-rcXkM0|h&ejO7(0V;4dXV(b&O{i zcQI}rXN=?i`vhZ)%_W7ay{MK|x{|7{YOgERQ>w2PHqva+QoE}CR<+(`osX^bQ)}t- zV)M&F`ZZ0zEA>Myx%Q}^&|1N<178GGnfCCw;o3zhsv_`w%lD$F;MJ(>+67T6mYz~M zj_y-q#kCLLwO!lrJ{U~CT&5@zCE<&>VTHkrs3y{jMHpz_D}%uw!Tv@|^qP=FK?nUQh)E6%>QPvqq&f1B76{;^S0Wz` zto0%ZN-1c;wS#5mdr? z?LiMruRL3onr@cd|H~B-R5cg!PMF9tz2qkmfkl21b%PJ1Zu2XsOQyC>?dM+FqvOJ- zs5l>xT;*2**yX2C2V5tppIg@e8O0ANf;;e84P^$9@pAxV{JepsdP90#r?Q_LB=w3H z6NF*^xD0EKFTlLh&mm6J0Iu@W0PdO=1Eco(7`wEU>*>z>zcq`oZ~2v6hPfLS`}x!A z4838zr6D6&_{5ZJ*Ssoey&gx>*}wev;Qz7?`E1Hs=a+%n;TKT5Lt1S(i@nuGpk?aL!cg5roGTuZJoaB1DbK1M$}7YuAkeSF}64qW9zHY zo;BTO!FiCx9`-vgrPp8?CY)FT!M2;o4-zSAWD;@|E`!>OBI|&#N9_V{PM$OG)$1hL g&XGVdiG4!A58}zz@J?sCaVWEY8la6NnSEn_08*1}YybcN diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg deleted file mode 100644 index e030cb189bf02f0f83d47da885a279e92b73b7cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155252 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ⅇl2-s69C~+!^#1^a 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

    PnGkES-)ffy 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 szY=fev)R{L820Ij!TI!7{(mm>j) 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%0A~sBa@F_*z~Au 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�x^ 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�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

    JW|e2i8WZ2V0YY@ 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 diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/_CodeSignature/CodeResources b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/_CodeSignature/CodeResources deleted file mode 100644 index 61aeea3b2..000000000 --- a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/_CodeSignature/CodeResources +++ /dev/null @@ -1,60 +0,0 @@ - - - - - files - - CustomFilter.fsh - - BaK6hzPyd5sBXbpJUwqtVqLWsiM= - - PkgInfo - - n57qDP4tZfLD1rCS43W0B4LQjzE= - - SampleConfiguration.plist - - H4Sl1fg0ytiRknS2JndsrKHDCG4= - - ShowcaseFilterViewController.nib - - KQXqgSOWZ4mevNN2GOMWzdIJczk= - - WID-small.jpg - - 6uLxBGrj5l66HApYsc05BDvVhJY= - - embedded.mobileprovision - - c4+b5m9qfc5SGGG27ld8I8UwfGo= - - en.lproj/InfoPlist.strings - - zmV6UqBSo6r1NOz798vd5O4zTBA= - - mask.png - - w4VTDfKC3VyUc2c1lD0vyChKjh0= - - - rules - - .* - - Info.plist - - omit - - weight - 10 - - ResourceRules.plist - - omit - - weight - 100 - - - - diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision deleted file mode 100644 index f23dfe0236b484298d2fc2abf95ffdd6d340de70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9946 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 z *{N#V>|{%iFg#I)TMMseZon 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%0AiC2>hXn4DERAC3N!XHn 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%0AwpIV|vL;b15 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�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 Vkkc%~Y|BnRc1(4Pvfm zYA_dZJ3BH0ciR;`98>wz)Se@Oldms6Ry&jzryzWEiZY{<<+Vpi;XRR(;@b5urhsP&w7s2^6VlVPnyW0}!|pKja&rNO3Yxuz5 zR+vu?Yun~jh3nE%Opx1(YbV_vw!p#kV#B2WHxy1C9&T{C+JfBbtE3uEBqhaAq+lx{cG=(2gh#^oP8iB~ZnzUe>o zw`ozCYIIC}4WPM{g!MLIY@3&4-jmACppJyjWiiTNkRu`@du5<~;d2xcrP$Ke@*?9U zn`{KLM@0`|#{-Ipu%Q&jSspQ3EkSpoDX5U_-Tq;UyxzzIuPs?nOvj*>4qUifB$oCr zt+?%uS~Ls66=~;jnPP>bHiUurLq{4fLN#*Ka%V2O)7%FmDTTNy@^jZlV9Ny`7xO

    )-xXd2hk7ZqS)8y=yfd!UnkCG9r3@ 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 z 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 W&iQ#IMfo{7sYMvlVVSArDAE8nT}LAT diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent deleted file mode 100644 index 52aab0ba2..000000000 --- a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent +++ /dev/null @@ -1,14 +0,0 @@ - - - - - application-identifier - 35Q7ZE75E6.com.sunsetlakesoftware.FilterShowcase - get-task-allow - - keychain-access-groups - - 35Q7ZE75E6.com.sunsetlakesoftware.FilterShowcase - - - diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase~.dep b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase~.dep deleted file mode 100644 index 0ef338e10..000000000 --- a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase~.dep +++ /dev/null @@ -1,19 +0,0 @@ -ffffffffffffffffffffffffffffffff 1562519dd6cff0741a72e1f4c590fe68 ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o -ffffffffffffffffffffffffffffffff 630a4a73360ce38fc13f9cf624f11b64 ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o -ffffffffffffffffffffffffffffffff 4b5479563b91ee6080f61d980cc5c06b ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o -000000004fabd14b000000000000014b 490dbb6b0ddf5b438b11d282840c04ad ffffffffffffffffffffffffffffffff 0 /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -00000000000000000000000000000000 e29dcb4086444ee8382f232f1686d64c ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -00000000000000000000000000000000 2c3fda907177f892cb404c6525a69cff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist -00000000000000000000000000000000 2c3fda907177f892cb404c6525a69cff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 0 /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList deleted file mode 100644 index 55914baf9..000000000 --- a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList +++ /dev/null @@ -1,4 +0,0 @@ -/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o -/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o -/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o -/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d deleted file mode 100644 index 04662c0eb..000000000 --- a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d +++ /dev/null @@ -1,4 +0,0 @@ -dependencies: \ - /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m \ - /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h \ - /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia deleted file mode 100644 index bb0ec51b2047b4a032afb5d9dd79a4d1afd74885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 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 diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d deleted file mode 100644 index fb9d48efb..000000000 --- a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d +++ /dev/null @@ -1,83 +0,0 @@ -dependencies: \ - /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m \ - /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h \ - /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h \ - ../../framework/Source/GPUImage.h ../../framework/Source/GLProgram.h \ - ../../framework/Source/GPUImageOpenGLESContext.h \ - ../../framework/Source/GPUImageOutput.h \ - ../../framework/Source/GPUImageView.h \ - ../../framework/Source/GPUImageVideoCamera.h \ - ../../framework/Source/GPUImageStillCamera.h \ - ../../framework/Source/GPUImageMovie.h \ - ../../framework/Source/GPUImagePicture.h \ - ../../framework/Source/GPUImageRawData.h \ - ../../framework/Source/GPUImageMovieWriter.h \ - ../../framework/Source/GPUImageFilterPipeline.h \ - ../../framework/Source/GPUImageFilter.h \ - ../../framework/Source/GPUImageTextureOutput.h \ - ../../framework/Source/GPUImageFilterGroup.h \ - ../../framework/Source/GPUImageTextureInput.h \ - ../../framework/Source/GPUImageTwoInputFilter.h \ - ../../framework/Source/GPUImagePixellateFilter.h \ - ../../framework/Source/GPUImageSepiaFilter.h \ - ../../framework/Source/GPUImageColorMatrixFilter.h \ - ../../framework/Source/GPUImageColorInvertFilter.h \ - ../../framework/Source/GPUImageSaturationFilter.h \ - ../../framework/Source/GPUImageContrastFilter.h \ - ../../framework/Source/GPUImageExposureFilter.h \ - ../../framework/Source/GPUImageBrightnessFilter.h \ - ../../framework/Source/GPUImageSharpenFilter.h \ - ../../framework/Source/GPUImageGammaFilter.h \ - ../../framework/Source/GPUImageSobelEdgeDetectionFilter.h \ - ../../framework/Source/GPUImageTwoPassFilter.h \ - ../../framework/Source/GPUImageSketchFilter.h \ - ../../framework/Source/GPUImageToonFilter.h \ - ../../framework/Source/GPUImageSmoothToonFilter.h \ - ../../framework/Source/GPUImageMultiplyBlendFilter.h \ - ../../framework/Source/GPUImageDissolveBlendFilter.h \ - ../../framework/Source/GPUImageKuwaharaFilter.h \ - ../../framework/Source/GPUImageVignetteFilter.h \ - ../../framework/Source/GPUImageGaussianBlurFilter.h \ - ../../framework/Source/GPUImageGaussianSelectiveBlurFilter.h \ - ../../framework/Source/GPUImageOverlayBlendFilter.h \ - ../../framework/Source/GPUImageDarkenBlendFilter.h \ - ../../framework/Source/GPUImageLightenBlendFilter.h \ - ../../framework/Source/GPUImageSwirlFilter.h \ - ../../framework/Source/GPUImageFastBlurFilter.h \ - ../../framework/Source/GPUImageColorBurnBlendFilter.h \ - ../../framework/Source/GPUImageColorDodgeBlendFilter.h \ - ../../framework/Source/GPUImageScreenBlendFilter.h \ - ../../framework/Source/GPUImageExclusionBlendFilter.h \ - ../../framework/Source/GPUImageDifferenceBlendFilter.h \ - ../../framework/Source/GPUImageSubtractBlendFilter.h \ - ../../framework/Source/GPUImageHardLightBlendFilter.h \ - ../../framework/Source/GPUImageSoftLightBlendFilter.h \ - ../../framework/Source/GPUImageCropFilter.h \ - ../../framework/Source/GPUImageGrayscaleFilter.h \ - ../../framework/Source/GPUImageTransformFilter.h \ - ../../framework/Source/GPUImageChromaKeyBlendFilter.h \ - ../../framework/Source/GPUImageHazeFilter.h \ - ../../framework/Source/GPUImageLuminanceThresholdFilter.h \ - ../../framework/Source/GPUImagePosterizeFilter.h \ - ../../framework/Source/GPUImageBoxBlurFilter.h \ - ../../framework/Source/GPUImageAdaptiveThresholdFilter.h \ - ../../framework/Source/GPUImageUnsharpMaskFilter.h \ - ../../framework/Source/GPUImageBulgeDistortionFilter.h \ - ../../framework/Source/GPUImagePinchDistortionFilter.h \ - ../../framework/Source/GPUImageCrosshatchFilter.h \ - ../../framework/Source/GPUImageCGAColorspaceFilter.h \ - ../../framework/Source/GPUImagePolarPixellateFilter.h \ - ../../framework/Source/GPUImageStretchDistortionFilter.h \ - ../../framework/Source/GPUImageTiltShiftFilter.h \ - ../../framework/Source/GPUImage3x3ConvolutionFilter.h \ - ../../framework/Source/GPUImageEmbossFilter.h \ - ../../framework/Source/GPUImageCannyEdgeDetectionFilter.h \ - ../../framework/Source/GPUImageThresholdEdgeDetection.h \ - ../../framework/Source/GPUImageMaskFilter.h \ - ../../framework/Source/GPUImageHistogramFilter.h \ - ../../framework/Source/GPUImageHistogramGenerator.h \ - ../../framework/Source/GPUImagePrewittEdgeDetectionFilter.h \ - ../../framework/Source/GPUImageXYDerivativeFilter.h \ - ../../framework/Source/GPUImageHarrisCornerDetectionFilter.h \ - ../../framework/Source/GPUImageAlphaBlendFilter.h \ - ../../framework/Source/GPUImageNonMaximumSuppressionFilter.h diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.dia b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.dia deleted file mode 100644 index bb0ec51b2047b4a032afb5d9dd79a4d1afd74885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 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 diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d deleted file mode 100644 index 4a05b2310..000000000 --- a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d +++ /dev/null @@ -1,83 +0,0 @@ -dependencies: \ - /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m \ - /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h \ - ../../framework/Source/GPUImage.h ../../framework/Source/GLProgram.h \ - ../../framework/Source/GPUImageOpenGLESContext.h \ - ../../framework/Source/GPUImageOutput.h \ - ../../framework/Source/GPUImageView.h \ - ../../framework/Source/GPUImageVideoCamera.h \ - ../../framework/Source/GPUImageStillCamera.h \ - ../../framework/Source/GPUImageMovie.h \ - ../../framework/Source/GPUImagePicture.h \ - ../../framework/Source/GPUImageRawData.h \ - ../../framework/Source/GPUImageMovieWriter.h \ - ../../framework/Source/GPUImageFilterPipeline.h \ - ../../framework/Source/GPUImageFilter.h \ - ../../framework/Source/GPUImageTextureOutput.h \ - ../../framework/Source/GPUImageFilterGroup.h \ - ../../framework/Source/GPUImageTextureInput.h \ - ../../framework/Source/GPUImageTwoInputFilter.h \ - ../../framework/Source/GPUImagePixellateFilter.h \ - ../../framework/Source/GPUImageSepiaFilter.h \ - ../../framework/Source/GPUImageColorMatrixFilter.h \ - ../../framework/Source/GPUImageColorInvertFilter.h \ - ../../framework/Source/GPUImageSaturationFilter.h \ - ../../framework/Source/GPUImageContrastFilter.h \ - ../../framework/Source/GPUImageExposureFilter.h \ - ../../framework/Source/GPUImageBrightnessFilter.h \ - ../../framework/Source/GPUImageSharpenFilter.h \ - ../../framework/Source/GPUImageGammaFilter.h \ - ../../framework/Source/GPUImageSobelEdgeDetectionFilter.h \ - ../../framework/Source/GPUImageTwoPassFilter.h \ - ../../framework/Source/GPUImageSketchFilter.h \ - ../../framework/Source/GPUImageToonFilter.h \ - ../../framework/Source/GPUImageSmoothToonFilter.h \ - ../../framework/Source/GPUImageMultiplyBlendFilter.h \ - ../../framework/Source/GPUImageDissolveBlendFilter.h \ - ../../framework/Source/GPUImageKuwaharaFilter.h \ - ../../framework/Source/GPUImageVignetteFilter.h \ - ../../framework/Source/GPUImageGaussianBlurFilter.h \ - ../../framework/Source/GPUImageGaussianSelectiveBlurFilter.h \ - ../../framework/Source/GPUImageOverlayBlendFilter.h \ - ../../framework/Source/GPUImageDarkenBlendFilter.h \ - ../../framework/Source/GPUImageLightenBlendFilter.h \ - ../../framework/Source/GPUImageSwirlFilter.h \ - ../../framework/Source/GPUImageFastBlurFilter.h \ - ../../framework/Source/GPUImageColorBurnBlendFilter.h \ - ../../framework/Source/GPUImageColorDodgeBlendFilter.h \ - ../../framework/Source/GPUImageScreenBlendFilter.h \ - ../../framework/Source/GPUImageExclusionBlendFilter.h \ - ../../framework/Source/GPUImageDifferenceBlendFilter.h \ - ../../framework/Source/GPUImageSubtractBlendFilter.h \ - ../../framework/Source/GPUImageHardLightBlendFilter.h \ - ../../framework/Source/GPUImageSoftLightBlendFilter.h \ - ../../framework/Source/GPUImageCropFilter.h \ - ../../framework/Source/GPUImageGrayscaleFilter.h \ - ../../framework/Source/GPUImageTransformFilter.h \ - ../../framework/Source/GPUImageChromaKeyBlendFilter.h \ - ../../framework/Source/GPUImageHazeFilter.h \ - ../../framework/Source/GPUImageLuminanceThresholdFilter.h \ - ../../framework/Source/GPUImagePosterizeFilter.h \ - ../../framework/Source/GPUImageBoxBlurFilter.h \ - ../../framework/Source/GPUImageAdaptiveThresholdFilter.h \ - ../../framework/Source/GPUImageUnsharpMaskFilter.h \ - ../../framework/Source/GPUImageBulgeDistortionFilter.h \ - ../../framework/Source/GPUImagePinchDistortionFilter.h \ - ../../framework/Source/GPUImageCrosshatchFilter.h \ - ../../framework/Source/GPUImageCGAColorspaceFilter.h \ - ../../framework/Source/GPUImagePolarPixellateFilter.h \ - ../../framework/Source/GPUImageStretchDistortionFilter.h \ - ../../framework/Source/GPUImageTiltShiftFilter.h \ - ../../framework/Source/GPUImage3x3ConvolutionFilter.h \ - ../../framework/Source/GPUImageEmbossFilter.h \ - ../../framework/Source/GPUImageCannyEdgeDetectionFilter.h \ - ../../framework/Source/GPUImageThresholdEdgeDetection.h \ - ../../framework/Source/GPUImageMaskFilter.h \ - ../../framework/Source/GPUImageHistogramFilter.h \ - ../../framework/Source/GPUImageHistogramGenerator.h \ - ../../framework/Source/GPUImagePrewittEdgeDetectionFilter.h \ - ../../framework/Source/GPUImageXYDerivativeFilter.h \ - ../../framework/Source/GPUImageHarrisCornerDetectionFilter.h \ - ../../framework/Source/GPUImageAlphaBlendFilter.h \ - ../../framework/Source/GPUImageNonMaximumSuppressionFilter.h \ - ../../framework/Source/GPUImageRGBFilter.h diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia deleted file mode 100644 index bb0ec51b2047b4a032afb5d9dd79a4d1afd74885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 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 G$MA2&wkP-i diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state.dat b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state.dat deleted file mode 100644 index 7337d9782..000000000 --- a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state.dat +++ /dev/null @@ -1,859 +0,0 @@ -TFilterShowcase -v5 -r1 -cCheck dependencies -cCpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -cProcessInfoPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist -cProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -cLd /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase normal armv7 -cGenerateDSYMFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -cCpResource FilterShowcase/CustomFilter.fsh build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh -cCopyStringsFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings FilterShowcase/en.lproj/InfoPlist.strings -cCompileXIB /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib -cCpResource FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg -cCopyPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist FilterShowcase/SampleConfiguration.plist -cCopyPNGFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png -cProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision -cProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision -cTouch /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -cProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent -cCodeSign /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -c000000004F453DF20000000000000110 -t1329937906 -s272 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist -c000000004F9F3E6200000000000001A7 -t1335836258 -s423 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist -c000000004F9F3E6200000000000001E5 -t1335836258 -s485 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AVFoundation.framework/AVFoundation -c000000004F9F3E66000000000015B230 -t1335836262 -s1421872 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics -c000000004F9F3E6700000000003AE430 -t1335836263 -s3859504 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreMedia.framework/CoreMedia -c000000004F9F3E670000000000075200 -t1335836263 -s479744 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreVideo.framework/CoreVideo -c000000004F9F3E67000000000001BD60 -t1335836263 -s114016 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/Foundation.framework/Foundation -c000000004F9F3E69000000000052C940 -t1335836265 -s5425472 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/OpenGLES.framework/OpenGLES -c000000004F9F3E690000000000018700 -t1335836265 -s100096 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/QuartzCore.framework/QuartzCore -c000000004F9F3E690000000000175AA0 -t1335836265 -s1530528 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/UIKit.framework/UIKit -c000000004F9F3E6B0000000000798EA0 -t1335836267 -s7966368 - -N/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision -c000000004ED00DDE00000000000026DA -t1322257886 -s9946 - -N/opt/local/www/GPUImage/build/Debug-iphoneos/libGPUImage.a -c000000004FABD2920000000000167830 -t1336660626 -s1472560 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GLProgram.h -c000000004FABD14B00000000000004F0 -t1336660299 -s1264 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImage.h -c000000004FABD14B0000000000000B2E -t1336660299 -s2862 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImage3x3ConvolutionFilter.h -c000000004FABD14B00000000000002BD -t1336660299 -s701 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageAdaptiveThresholdFilter.h -c000000004FABD14B0000000000000068 -t1336660299 -s104 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageAlphaBlendFilter.h -c000000004FABD14B000000000000010A -t1336660299 -s266 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageBoxBlurFilter.h -c000000004FABD14B000000000000011B -t1336660299 -s283 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageBrightnessFilter.h -c000000004FABD14B00000000000000F2 -t1336660299 -s242 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageBulgeDistortionFilter.h -c000000004FABD14B0000000000000244 -t1336660299 -s580 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageCGAColorspaceFilter.h -c000000004FABD14B000000000000005A -t1336660299 -s90 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageCannyEdgeDetectionFilter.h -c000000004FABD14B0000000000000391 -t1336660299 -s913 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageChromaKeyBlendFilter.h -c000000004FABD14B000000000000030D -t1336660299 -s781 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageColorBurnBlendFilter.h -c000000004FABD14B000000000000006F -t1336660299 -s111 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageColorDodgeBlendFilter.h -c000000004FABD14B0000000000000070 -t1336660299 -s112 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageColorInvertFilter.h -c000000004FABD14B000000000000005C -t1336660299 -s92 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageColorMatrixFilter.h -c000000004FABD14B0000000000000104 -t1336660299 -s260 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageContrastFilter.h -c000000004FABD14B00000000000000F8 -t1336660299 -s248 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageCropFilter.h -c000000004FABD14B00000000000001AD -t1336660299 -s429 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageCrosshatchFilter.h -c000000004FABD14B0000000000000057 -t1336660299 -s87 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageDarkenBlendFilter.h -c000000004FABD14B000000000000006C -t1336660299 -s108 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageDifferenceBlendFilter.h -c000000004FABD14B0000000000000070 -t1336660299 -s112 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageDissolveBlendFilter.h -c000000004FABD14B000000000000011E -t1336660299 -s286 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageEmbossFilter.h -c000000004FABD14B00000000000000F5 -t1336660299 -s245 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageExclusionBlendFilter.h -c000000004FABD14B000000000000006F -t1336660299 -s111 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageExposureFilter.h -c000000004FABD14B00000000000000EC -t1336660299 -s236 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageFastBlurFilter.h -c000000004FABD14B0000000000000286 -t1336660299 -s646 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageFilter.h -c000000004FABD14B00000000000010D0 -t1336660299 -s4304 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageFilterGroup.h -c000000004FABD14B00000000000001D2 -t1336660299 -s466 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageFilterPipeline.h -c000000004FABD14B00000000000003CB -t1336660299 -s971 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageGammaFilter.h -c000000004FABD14B00000000000000DD -t1336660299 -s221 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageGaussianBlurFilter.h -c000000004FABD14B000000000000023E -t1336660299 -s574 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageGaussianSelectiveBlurFilter.h -c000000004FABD14B00000000000001A1 -t1336660299 -s417 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageGrayscaleFilter.h -c000000004FABD14B000000000000012D -t1336660299 -s301 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHardLightBlendFilter.h -c000000004FABD14B000000000000006F -t1336660299 -s111 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHarrisCornerDetectionFilter.h -c000000004FABD14B00000000000002EB -t1336660299 -s747 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHazeFilter.h -c000000004FABD14B000000000000021E -t1336660299 -s542 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHistogramFilter.h -c000000004FABD14B0000000000000350 -t1336660299 -s848 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHistogramGenerator.h -c000000004FABD14B000000000000007F -t1336660299 -s127 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageKuwaharaFilter.h -c000000004FABD14B0000000000000294 -t1336660299 -s660 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageLightenBlendFilter.h -c000000004FABD14B00000000000000CA -t1336660299 -s202 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageLuminanceThresholdFilter.h -c000000004FABD14B000000000000012E -t1336660299 -s302 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageMaskFilter.h -c000000004FABD14B0000000000000051 -t1336660299 -s81 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageMovie.h -c000000004FABD14B00000000000002E5 -t1336660299 -s741 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageMovieWriter.h -c000000004FABD14B000000000000063B -t1336660299 -s1595 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageMultiplyBlendFilter.h -c000000004FABD14B000000000000006E -t1336660299 -s110 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageNonMaximumSuppressionFilter.h -c000000004FABD14B0000000000000118 -t1336660299 -s280 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageOpenGLESContext.h -c000000004FABD14B0000000000000593 -t1336660299 -s1427 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageOutput.h -c000000004FABD14B0000000000000BFA -t1336660299 -s3066 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageOverlayBlendFilter.h -c000000004FABD14B0000000000000069 -t1336660299 -s105 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePicture.h -c000000004FABD14B000000000000015F -t1336660299 -s351 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePinchDistortionFilter.h -c000000004FABD14B0000000000000214 -t1336660299 -s532 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePixellateFilter.h -c000000004FABD14B0000000000000161 -t1336660299 -s353 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePolarPixellateFilter.h -c000000004FABD14B00000000000001A4 -t1336660299 -s420 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePosterizeFilter.h -c000000004FABD14B000000000000011F -t1336660299 -s287 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePrewittEdgeDetectionFilter.h -c000000004FABD14B0000000000000085 -t1336660299 -s133 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageRGBFilter.h -c000000004FABCC640000000000000129 -t1336659044 -s297 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageRawData.h -c000000004FABD14B000000000000037E -t1336660299 -s894 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSaturationFilter.h -c000000004FABD14B0000000000000116 -t1336660299 -s278 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageScreenBlendFilter.h -c000000004FABD14B000000000000006C -t1336660299 -s108 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSepiaFilter.h -c000000004FABD14B0000000000000085 -t1336660299 -s133 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSharpenFilter.h -c000000004FABD14B0000000000000129 -t1336660299 -s297 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSketchFilter.h -c000000004FABD14B00000000000000F3 -t1336660299 -s243 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSmoothToonFilter.h -c000000004FABD14B000000000000048B -t1336660299 -s1163 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSobelEdgeDetectionFilter.h -c000000004FABD14B00000000000001C7 -t1336660299 -s455 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSoftLightBlendFilter.h -c000000004FABD14B000000000000006F -t1336660299 -s111 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageStillCamera.h -c000000004FABD14B0000000000000286 -t1336660299 -s646 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageStretchDistortionFilter.h -c000000004FABD14B00000000000000FC -t1336660299 -s252 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSubtractBlendFilter.h -c000000004FABD14B000000000000006A -t1336660299 -s106 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSwirlFilter.h -c000000004FABD14B0000000000000240 -t1336660299 -s576 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTextureInput.h -c000000004FABD14B0000000000000106 -t1336660299 -s262 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTextureOutput.h -c000000004FABD14B00000000000001BA -t1336660299 -s442 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageThresholdEdgeDetection.h -c000000004FABD14B0000000000000150 -t1336660299 -s336 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTiltShiftFilter.h -c000000004FABD14B00000000000003A8 -t1336660299 -s936 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageToonFilter.h -c000000004FABD14B00000000000002F9 -t1336660299 -s761 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTransformFilter.h -c000000004FABD14B00000000000002BF -t1336660299 -s703 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTwoInputFilter.h -c000000004FABD14B0000000000000161 -t1336660299 -s353 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTwoPassFilter.h -c000000004FABD14B000000000000037A -t1336660299 -s890 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageUnsharpMaskFilter.h -c000000004FABD14B00000000000001E9 -t1336660299 -s489 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageVideoCamera.h -c000000004FABD14B0000000000000A48 -t1336660299 -s2632 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageView.h -c000000004FABD14B00000000000005C0 -t1336660299 -s1472 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageVignetteFilter.h -c000000004FABD14B000000000000012A -t1336660299 -s298 - -N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageXYDerivativeFilter.h -c000000004FABD14B000000000000007D -t1336660299 -s125 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg -c000000004FABD14B000000000011A0B4 -t1336660299 -s1155252 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh -c000000004FABD14B0000000000000224 -t1336660299 -s548 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch -c000000004FABD14B000000000000014B -t1336660299 -s331 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist -c000000004FABD14B000000000000025D -t1336660299 -s605 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h -c000000004FABD14B0000000000000130 -t1336660299 -s304 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -c000000004FABD14B0000000000000351 -t1336660299 -s849 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h -c000000004FABD14B000000000000005F -t1336660299 -s95 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m -c000000004FABD20C0000000000001E99 -t1336660492 -s7833 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h -c000000004FABD1F700000000000008C3 -t1336660471 -s2243 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -c000000004FABD2B100000000000081B3 -t1336660657 -s33203 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib -c000000004FABD14B00000000000021C5 -t1336660299 -s8645 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings -c000000004FABD14B000000000000002D -t1336660299 -s45 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -c000000004FABD14B00000000000000DF -t1336660299 -s223 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/mask.png -c000000004FABD14B00000000000ECAAB -t1336660299 -s969387 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -t1336660681 -s476 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM -t1336660659 -s102 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh -t1336660659 -s548 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -t1336660681 -s495712 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist -t1336660577 -s1210 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo -t1336660577 -s8 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -t1336660577 -s485 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist -t1336660659 -s245 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib -t1336660668 -s1142 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg -t1336660659 -s1155252 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision -t1336660679 -s9946 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings -t1336660659 -s42 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png -t1336660679 -s960433 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent -t1336660679 -s448 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList -c000000004FABD261000000000000026B -t1336660577 -s619 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o -t1336660584 -s62240 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o -t1336660644 -s71460 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o -t1336660658 -s122256 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o -t1336660584 -s3468 - -N/var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -t1336660581 -s3990036 - -NFilterShowcase/FilterShowcase-Info.plist -c000000004FABD14B00000000000005BD -t1336660299 -s1469 - -CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -r0 - -CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m -r0 - -CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -r0 - -CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -r0 - -CCheck dependencies -r0 -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection18"Check dependenciesb64901510a5cb541^14ed0a510a5cb541^---0#1#0#--18"Check dependencies36"B911DC1C-5D61-4B67-902D-7D6CA67C38E9- - -CCodeSign /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -s358353479.785338 -e358353481.333716 -r1 -xCodeSign -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection48"CodeSign build/Debug-iphoneos/FilterShowcase.appa62ac9470a5cb541^ad6e55490a5cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/0000000000000000^866"CodeSign build/Debug-iphoneos/FilterShowcase.app cd /opt/local/www/GPUImage/examples/FilterShowcase setenv CODESIGN_ALLOCATE /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /usr/bin/codesign --force --sign 7612befb7fc46acfe69fae65084063ebb853d1da --resource-rules=/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist --entitlements /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"AB38A294-89A8-48AF-9648-E705636F0CE3- - -CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353383.975208 -e358353384.488423 -r1 -xCompileC -xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o -x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection92"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m76c4f9e7095cb541^f2097de8095cb541^---0#0#0#-19%DVTDocumentLocation2@100"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m0000000000000000^3471"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o 36"80B6440A-7AC4-475C-9241-5F6C1791B557- - -CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353444.136153 -e358353444.813345 -r0 -xCompileC -xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o -x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection101"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m040023240a5cb541^f019d1240a5cb541^---0#0#0#-19%DVTDocumentLocation2@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m0000000000000000^3525"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o FilterShowcase/ShowcaseFilterListController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o 36"05CAEC69-9763-4A48-BC86-6071B1750167- - -CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353458.008880 -e358353458.539303 -r1 -xCompileC -xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o -x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection101"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m596902320a5cb541^46248a320a5cb541^---0#0#0#-19%DVTDocumentLocation2@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^3525"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o 36"46C4516F-432A-4D7D-8A9D-E729E8098F9A- - -CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353383.974678 -e358353384.487504 -r1 -xCompileC -xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o -x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection77"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m73b9f9e7095cb541^cdcc7ce8095cb541^---0#0#0#-19%DVTDocumentLocation2@85"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m0000000000000000^3381"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o 36"56719BD8-4671-4DB2-8298-CBA0ED3843FA- - -CCompileXIB /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib -s358353459.751006 -e358353468.673350 -r1 -xCompileXIB -x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection105"Compiling /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib6c5bc0330a5cb541^5261ac3c0a5cb541^---0#0#0#-19%DVTDocumentLocation2@111"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib0000000000000000^904"CompileXIB FilterShowcase/ShowcaseFilterViewController.xib cd /opt/local/www/GPUImage/examples/FilterShowcase setenv IBC_MINIMUM_COMPATIBILITY_VERSION 4.0 setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" setenv XCODE_DEVELOPER_USR_PATH /Applications/Xcode.app/Contents/Developer/usr/bin/.. /Applications/Xcode.app/Contents/Developer/usr/bin/ibtool --errors --warnings --notices --output-format human-readable-text --compile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib --sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk 36"3E602699-E5C3-4075-9A6E-4AC73B758168- - -CCopyPNGFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png -s358353459.943100 -e358353479.575105 -r1 -xCopyPNGFile -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png -xFilterShowcase/mask.png -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection84"CopyPNGFile build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png9982f1330a5cb541^473a93470a5cb541^---0#0#0#-19%DVTDocumentLocation2@87"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/mask.png0000000000000000^692"CopyPNGFile build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS Build System Support.xcplugin/Contents/Resources/copypng" -compress "" /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/mask.png /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png 36"35B61E75-ADE1-403E-AF5B-A3695BD35AB9- - -CCopyPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist FilterShowcase/SampleConfiguration.plist -s358353459.907965 -e358353459.941878 -r1 -xCopyPlistFile -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist -xFilterShowcase/SampleConfiguration.plist -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection45"Copy FilterShowcase/SampleConfiguration.plist5d89e8330a5cb541^a62af1330a5cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist0000000000000000^545"CopyPlistFile build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist FilterShowcase/SampleConfiguration.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copyPlist --convert binary1 --outdir /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -- FilterShowcase/SampleConfiguration.plist 36"5AA6F012-9BB6-487F-A3FC-88B47549348F- - -CCopyStringsFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings FilterShowcase/en.lproj/InfoPlist.strings -s358353459.682688 -e358353459.752203 -r1 -xCopyStringsFile -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings -xFilterShowcase/en.lproj/InfoPlist.strings -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection46"Copy FilterShowcase/en.lproj/InfoPlist.strings5ef3ae330a5cb541^dd96c0330a5cb541^---0#0#0#-19%DVTDocumentLocation2@105"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings0000000000000000^600"CopyStringsFile build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings FilterShowcase/en.lproj/InfoPlist.strings cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copyStrings --validate --inputencoding utf-8 --outputencoding binary --outdir /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj -- FilterShowcase/en.lproj/InfoPlist.strings 36"AA990587-0458-4F4D-9A47-6BB13240A149- - -CCpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -s358353377.466728 -e358353377.617278 -r1 -xCpResource -x/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist -xbuild/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection64"Copy build/Debug-iphoneos/FilterShowcase.app/ResourceRules.pliste5b477e1095cb541^753cdae1095cb541^---0#0#0#-19%DVTDocumentLocation2@123"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist000000000080d041^863"CpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"F3590EDA-2A7B-4C6B-86DE-496A321AA51C- - -CCpResource FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg -s358353459.753367 -e358353459.906699 -r1 -xCpResource -xFilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg -xbuild/Debug-iphoneos/FilterShowcase.app/WID-small.jpg -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection58"Copy build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg78efc0330a5cb541^6075e8330a5cb541^---0#0#0#-19%DVTDocumentLocation2@117"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg000000000080d041^803"CpResource FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"7B9E690E-51B7-4D6A-B9FF-73A99C1884FA- - -CCpResource FilterShowcase/CustomFilter.fsh build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh -s358353459.677652 -e358353459.735320 -r1 -xCpResource -xFilterShowcase/CustomFilter.fsh -xbuild/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection61"Copy build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh5396ad330a5cb541^31d3ba330a5cb541^---0#0#0#-19%DVTDocumentLocation2@120"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh000000000080d041^728"CpResource FilterShowcase/CustomFilter.fsh build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"5222E42D-D139-42B0-B9E1-17228CD22B80- - -CGenerateDSYMFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -s358353489.171592 -e358353489.383623 -r1 -xGenerateDSYMFile -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection103"Generating /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYMbf0e2c510a5cb541^b1fc61510a5cb541^---0#0#0#-19%DVTDocumentLocation2@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/0000000000000000^623"GenerateDSYMFile build/Debug-iphoneos/FilterShowcase.app.dSYM build/Debug-iphoneos/FilterShowcase.app/FilterShowcase cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/usr/bin/dsymutil /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM 36"7ADDD2E7-98D4-4134-9E2F-7432C9A1342A- - -CLd /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase normal armv7 -s358353458.547062 -e358353459.358679 -r1 -xLd -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -xnormal -xarmv7 -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection107"Link /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase4d1293320a5cb541^a2d35b330a5cb541^---0#0#0#--1286"Ld build/Debug-iphoneos/FilterShowcase.app/FilterShowcase normal armv7 cd /opt/local/www/GPUImage/examples/FilterShowcase setenv IPHONEOS_DEPLOYMENT_TARGET 4.0 setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -L/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -filelist /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList -dead_strip -ObjC -fobjc-arc -miphoneos-version-min=4.0 /opt/local/www/GPUImage/build/Debug-iphoneos/libGPUImage.a -framework OpenGLES -framework AVFoundation -framework CoreMedia -weak_framework CoreVideo -framework QuartzCore -framework UIKit -framework Foundation -framework CoreGraphics -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase 36"BDD81F0C-F317-4BDE-96C2-72BBD5A3BFE7- - -CProcessInfoPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist -s358353377.467336 -e358353377.613451 -r1 -xProcessInfoPlistFile -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist -xFilterShowcase/FilterShowcase-Info.plist -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection48"Process FilterShowcase/FilterShowcase-Info.plistf0c177e1095cb541^821b9de1095cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist0000000000000000^818"ProcessInfoPlistFile build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-infoPlistUtility FilterShowcase/FilterShowcase-Info.plist -genpkginfo /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo -expandbuildsettings -format binary -platform iphoneos -resourcerulesfile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist 36"0F526A05-DC0D-4D20-80CF-4101680418DC- - -CProcessPCH /Users/joshholat/Library/Developer/Xcode/DerivedData/FilterShowcase-bzoblmlqdijohfcemawsbqkwxemg/Index/PrecompiledHeaders/FilterShowcase-Prefix-gstgaoufxyyhstbhqthwswltjgkg_ast/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.astbuilder -r0 - -CProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353377.694117 -e358353383.967825 -r1 -xProcessPCH -x/var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -xFilterShowcase/FilterShowcase-Prefix.pch -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection51"Precompile FilterShowcase/FilterShowcase-Prefix.pch77d7b1e1095cb541^4ddbf7e7095cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch0000000000000000^3436"ProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c-header -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos --serialize-diagnostics /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch -o /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -MMD -MT dependencies -MF /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.d 36"94A2285D-03EC-4A51-8BF9-DF2BF231CD25- - -CProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision -s358353479.642766 -e358353479.646843 -r1 -xProcessProductPackaging -x/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection203"ProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovisioneca6a4470a5cb541^e597a5470a5cb541^---0#0#0#-19%DVTDocumentLocation2@128"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision0000000000000000^714"ProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-productPackagingUtility "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision 36"4EE674B3-2986-4299-AFF0-9ED4D65E3D41- - -CProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent -s358353479.743313 -e358353479.776485 -r1 -xProcessProductPackaging -x/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist -x/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection228"ProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent8463be470a5cb541^86c7c6470a5cb541^---0#0#0#-19%DVTDocumentLocation2@147"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent000000000080d041^790"ProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-productPackagingUtility /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist -entitlements -format xml -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent 36"AE4EA234-1160-488E-B005-4DC711F0C11B- - -CTouch /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -s358353479.655601 -e358353479.735226 -r1 -xTouch -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection93"Touch /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app5feea7470a5cb541^4c38bc470a5cb541^---0#0#0#--399"Touch build/Debug-iphoneos/FilterShowcase.app cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /usr/bin/touch -c /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"95508D9E-5F93-4F33-8717-A6E584E738DD- - diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state~.dat b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state~.dat deleted file mode 100644 index 4bfb63dea..000000000 --- a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state~.dat +++ /dev/null @@ -1,359 +0,0 @@ -TFilterShowcase -v5 -r1 -cCheck dependencies -cCpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -cProcessInfoPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist -cProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -c000000004F453DF20000000000000110 -t1329937906 -s272 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist -c000000004F9F3E6200000000000001A7 -t1335836258 -s423 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist -c000000004F9F3E6200000000000001E5 -t1335836258 -s485 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AVFoundation.framework/AVFoundation -c000000004F9F3E66000000000015B230 -t1335836262 -s1421872 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics -c000000004F9F3E6700000000003AE430 -t1335836263 -s3859504 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreMedia.framework/CoreMedia -c000000004F9F3E670000000000075200 -t1335836263 -s479744 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreVideo.framework/CoreVideo -c000000004F9F3E67000000000001BD60 -t1335836263 -s114016 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/Foundation.framework/Foundation -c000000004F9F3E69000000000052C940 -t1335836265 -s5425472 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/OpenGLES.framework/OpenGLES -c000000004F9F3E690000000000018700 -t1335836265 -s100096 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/QuartzCore.framework/QuartzCore -c000000004F9F3E690000000000175AA0 -t1335836265 -s1530528 - -N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/UIKit.framework/UIKit -c000000004F9F3E6B0000000000798EA0 -t1335836267 -s7966368 - -N/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision -c000000004ED00DDE00000000000026DA -t1322257886 -s9946 - -N/opt/local/www/GPUImage/build/Debug-iphoneos/libGPUImage.a -c00000000000000000000000000000000 -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg -c000000004FABD14B000000000011A0B4 -t1336660299 -s1155252 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh -c000000004FABD14B0000000000000224 -t1336660299 -s548 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch -c000000004FABD14B000000000000014B -t1336660299 -s331 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist -c000000004FABD14B000000000000025D -t1336660299 -s605 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -c000000004FABD14B0000000000000351 -t1336660299 -s849 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m -c000000004FABD20C0000000000001E99 -t1336660492 -s7833 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -c000000004FABD25F0000000000008195 -t1336660575 -s33173 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib -c000000004FABD14B00000000000021C5 -t1336660299 -s8645 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings -c000000004FABD14B000000000000002D -t1336660299 -s45 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -c000000004FABD14B00000000000000DF -t1336660299 -s223 - -N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/mask.png -c000000004FABD14B00000000000ECAAB -t1336660299 -s969387 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList -c000000004FABD261000000000000026B -t1336660577 -s619 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o -t2 -s0 - -N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o -t2 -s0 - -N/var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -t2 -s0 - -NFilterShowcase/FilterShowcase-Info.plist -c000000004FABD14B00000000000005BD -t1336660299 -s1469 - -CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -r0 - -CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m -r0 - -CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -r0 - -CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -r0 - -CCheck dependencies -r0 -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection18"Check dependenciesbbf2dde0095cb541^5b0c76e1095cb541^---0#1#0#--18"Check dependencies36"4CE14751-1480-41EA-A7AB-C6489532CBBF- - -CCodeSign /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -r0 - -CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353383.975208 -e358353384.488423 -r1 -xCompileC -xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o -x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection92"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m76c4f9e7095cb541^f2097de8095cb541^---0#0#0#-19%DVTDocumentLocation2@100"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m0000000000000000^3471"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o 36"80B6440A-7AC4-475C-9241-5F6C1791B557- - -CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -r0 - -CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353384.488660 -e358353384.733770 -r0 -xCompileC -xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o -x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -o/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:157:24: error: unknown receiver 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'? -o filter = [[GPUImageRGBFilter alloc] init]; -o ^~~~~~~~~~~~~~~~~ -o GPUImageFilter -o../../framework/Source/GPUImageFilter.h:44:12: note: 'GPUImageFilter' declared here -o@interface GPUImageFilter : GPUImageOutput -o ^ -o/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:778:30: error: use of undeclared identifier 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'? -o case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; -o ^ -o/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:778:49: error: expected expression -o case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; -o ^ -o3 errors generated. -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection101"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m823a7de8095cb541^f7c7bbe8095cb541^-1090"/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:157:24: error: unknown receiver 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'? filter = [[GPUImageRGBFilter alloc] init]; ^~~~~~~~~~~~~~~~~ GPUImageFilter ../../framework/Source/GPUImageFilter.h:44:12: note: 'GPUImageFilter' declared here @interface GPUImageFilter : GPUImageOutput ^ /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:778:30: error: use of undeclared identifier 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'? case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; ^ /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:778:49: error: expected expression case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; ^ 3 errors generated. 3(36%IDEClangDiagnosticActivityLogMessage2@68"Unknown receiver 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'?-358353384#18446744073709551615#0#1(2@30"'GPUImageFilter' declared here-358353384#18446744073709551615#0#-0#27"com.apple.dt.IDE.diagnostic23%DVTTextDocumentLocation3@73"file://localhost/opt/local/www/GPUImage/framework/Source/GPUImageFilter.h0000000000000000^43#11#43#11#1195#0#14"Semantic Issue--2#27"com.apple.dt.IDE.diagnostic3@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^156#23#156#23#5002#0#14"Semantic Issue1(3@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^156#23#156#40#5002#0#-2@80"Use of undeclared identifier 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'?-358353384#18446744073709551615#0#-2#27"com.apple.dt.IDE.diagnostic3@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^777#29#777#29#28820#0#14"Semantic Issue--2@19"Expected expression-358353384#18446744073709551615#0#-2#27"com.apple.dt.IDE.diagnostic3@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^777#48#777#48#28839#0#11"Parse Issue--0#0#0#-19%DVTDocumentLocation4@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^3525"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o 36"E320BDB8-41E0-46FE-B835-0072D8D2A2B6- - -CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353383.974678 -e358353384.487504 -r1 -xCompileC -xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o -x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection77"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m73b9f9e7095cb541^cdcc7ce8095cb541^---0#0#0#-19%DVTDocumentLocation2@85"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m0000000000000000^3381"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o 36"56719BD8-4671-4DB2-8298-CBA0ED3843FA- - -CCompileXIB /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib -r0 - -CCopyPNGFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png -r0 - -CCopyPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist FilterShowcase/SampleConfiguration.plist -r0 - -CCopyStringsFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings FilterShowcase/en.lproj/InfoPlist.strings -r0 - -CCpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -s358353377.466728 -e358353377.617278 -r1 -xCpResource -x/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist -xbuild/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection64"Copy build/Debug-iphoneos/FilterShowcase.app/ResourceRules.pliste5b477e1095cb541^753cdae1095cb541^---0#0#0#-19%DVTDocumentLocation2@123"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist000000000080d041^863"CpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"F3590EDA-2A7B-4C6B-86DE-496A321AA51C- - -CCpResource FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg -r0 - -CCpResource FilterShowcase/CustomFilter.fsh build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh -r0 - -CGenerateDSYMFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -r0 - -CLd /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase normal armv7 -r0 - -CProcessInfoPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist -s358353377.467336 -e358353377.613451 -r1 -xProcessInfoPlistFile -x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist -xFilterShowcase/FilterShowcase-Info.plist -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection48"Process FilterShowcase/FilterShowcase-Info.plistf0c177e1095cb541^821b9de1095cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist0000000000000000^818"ProcessInfoPlistFile build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-infoPlistUtility FilterShowcase/FilterShowcase-Info.plist -genpkginfo /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo -expandbuildsettings -format binary -platform iphoneos -resourcerulesfile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist 36"0F526A05-DC0D-4D20-80CF-4101680418DC- - -CProcessPCH /Users/joshholat/Library/Developer/Xcode/DerivedData/FilterShowcase-bzoblmlqdijohfcemawsbqkwxemg/Index/PrecompiledHeaders/FilterShowcase-Prefix-gstgaoufxyyhstbhqthwswltjgkg_ast/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.astbuilder -r0 - -CProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler -s358353377.694117 -e358353383.967825 -r1 -xProcessPCH -x/var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -xFilterShowcase/FilterShowcase-Prefix.pch -xnormal -xarmv7 -xobjective-c -xcom.apple.compilers.llvm.clang.1_0.compiler -lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection51"Precompile FilterShowcase/FilterShowcase-Prefix.pch77d7b1e1095cb541^4ddbf7e7095cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch0000000000000000^3436"ProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c-header -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos --serialize-diagnostics /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch -o /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -MMD -MT dependencies -MF /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.d 36"94A2285D-03EC-4A51-8BF9-DF2BF231CD25- - -CProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision -r0 - -CProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent -r0 - -CTouch /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -r0 - From 8fb09eb9a92888ba46147bbf13c4095327070843 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 10 May 2012 09:59:19 -0500 Subject: [PATCH 076/695] Moved RGB filter to the shared header. --- .../FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m | 1 - framework/Source/GPUImage.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 068ef7122..f87865f38 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1,5 +1,4 @@ #import "ShowcaseFilterViewController.h" -#import "GPUImageRGBFilter.h" @implementation ShowcaseFilterViewController diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 0e57b2201..76adef7f8 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -79,3 +79,4 @@ #import "GPUImageHarrisCornerDetectionFilter.h" #import "GPUImageAlphaBlendFilter.h" #import "GPUImageNonMaximumSuppressionFilter.h" +#import "GPUImageRGBFilter.h" From 9a702c3012fd14f5586e218f0c56348589544395 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 10 May 2012 14:11:53 -0500 Subject: [PATCH 077/695] Corrected the center coordinates to account for rotation on a few filters. --- .../ShowcaseFilterViewController.m | 2 +- .../Source/GPUImageBulgeDistortionFilter.m | 12 +++++- framework/Source/GPUImageFilter.h | 1 + framework/Source/GPUImageFilter.m | 36 ++++++++++++++++++ .../GPUImageGaussianSelectiveBlurFilter.m | 2 +- .../Source/GPUImagePinchDistortionFilter.m | 14 +++++-- .../Source/GPUImagePolarPixellateFilter.m | 11 +++++- .../Source/GPUImageStretchDistortionFilter.m | 13 +++++-- framework/Source/GPUImageSwirlFilter.m | 14 +++++-- framework/Source/GPUImageVignetteFilter.m | 37 +++++++++++++++++-- 10 files changed, 122 insertions(+), 20 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index f87865f38..c9c1d873a 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -51,7 +51,7 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (void)setupFilter; { videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; -// GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; BOOL needsSecondImage = NO; diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index fe79543ab..f6724806a 100644 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -59,6 +59,12 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setCenter:self.center]; +} + - (void)setRadius:(CGFloat)newValue; { _radius = newValue; @@ -84,9 +90,11 @@ - (void)setCenter:(CGPoint)newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; + CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; + GLfloat centerPosition[2]; - centerPosition[0] = _center.x; - centerPosition[1] = _center.y; + centerPosition[0] = rotatedPoint.x; + centerPosition[1] = rotatedPoint.y; glUniform2fv(centerUniform, 1, centerPosition); } diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index efc66cdd1..5ec212c15 100644 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -91,6 +91,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)initializeAttributes; - (void)setupFilterForSize:(CGSize)filterFrameSize; - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; +- (CGPoint)rotatedPoint:(CGPoint)pointToRotate forRotation:(GPUImageRotationMode)rotation; - (void)recreateFilterFBO; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index e1187435e..01f6f100c 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -597,6 +597,42 @@ - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; return rotatedSize; } +- (CGPoint)rotatedPoint:(CGPoint)pointToRotate forRotation:(GPUImageRotationMode)rotation; +{ + CGPoint rotatedPoint; + switch(rotation) + { + case kGPUImageNoRotation: return pointToRotate; break; + case kGPUImageFlipHorizonal: + { + rotatedPoint.x = 1.0 - pointToRotate.x; + rotatedPoint.y = pointToRotate.y; + }; break; + case kGPUImageFlipVertical: + { + rotatedPoint.x = pointToRotate.x; + rotatedPoint.y = 1.0 - pointToRotate.y; + }; break; + case kGPUImageRotateLeft: + { + rotatedPoint.x = 1.0 - pointToRotate.y; + rotatedPoint.y = pointToRotate.x; + }; break; + case kGPUImageRotateRight: + { + rotatedPoint.x = pointToRotate.y; + rotatedPoint.y = 1.0 - pointToRotate.x; + }; break; + case kGPUImageRotateRightFlipVertical: + { + rotatedPoint.x = pointToRotate.y; + rotatedPoint.y = pointToRotate.x; + }; break; + } + + return rotatedPoint; +} + - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { if (self.preventRendering) diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index eaa692e60..d0dd7ef7b 100644 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -19,7 +19,7 @@ void main() lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); - lowp float d = distance(textureCoordinate, excludeCirclePoint); + lowp float d = distance(textureCoordinate2, excludeCirclePoint); gl_FragColor = mix(sharpImageColor, blurredImageColor, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, d)); } diff --git a/framework/Source/GPUImagePinchDistortionFilter.m b/framework/Source/GPUImagePinchDistortionFilter.m index 8f8584e76..fcbd1b556 100644 --- a/framework/Source/GPUImagePinchDistortionFilter.m +++ b/framework/Source/GPUImagePinchDistortionFilter.m @@ -51,13 +51,19 @@ - (id)init; self.radius = 1.0; self.scale = 0.5; self.center = CGPointMake(0.5, 0.5); - + return self; } #pragma mark - #pragma mark Accessors +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setCenter:self.center]; +} + - (void)setRadius:(CGFloat)newValue; { _radius = newValue; @@ -83,9 +89,11 @@ - (void)setCenter:(CGPoint)newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; + CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; + GLfloat centerPosition[2]; - centerPosition[0] = _center.x; - centerPosition[1] = _center.y; + centerPosition[0] = rotatedPoint.x; + centerPosition[1] = rotatedPoint.y; glUniform2fv(centerUniform, 1, centerPosition); } diff --git a/framework/Source/GPUImagePolarPixellateFilter.m b/framework/Source/GPUImagePolarPixellateFilter.m index c8781bbda..1a64a8d34 100644 --- a/framework/Source/GPUImagePolarPixellateFilter.m +++ b/framework/Source/GPUImagePolarPixellateFilter.m @@ -67,6 +67,11 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setCenter:self.center]; +} - (void)setPixelSize:(CGSize)pixelSize { @@ -87,9 +92,11 @@ - (void)setCenter:(CGPoint)newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; + CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; + GLfloat centerPosition[2]; - centerPosition[0] = _center.x; - centerPosition[1] = _center.y; + centerPosition[0] = rotatedPoint.x; + centerPosition[1] = rotatedPoint.y; glUniform2fv(centerUniform, 1, centerPosition); } diff --git a/framework/Source/GPUImageStretchDistortionFilter.m b/framework/Source/GPUImageStretchDistortionFilter.m index bf2285741..ef96f0130 100644 --- a/framework/Source/GPUImageStretchDistortionFilter.m +++ b/framework/Source/GPUImageStretchDistortionFilter.m @@ -46,8 +46,6 @@ - (id)init; centerUniform = [filterProgram uniformIndex:@"center"]; - - self.center = CGPointMake(0.5, 0.5); return self; @@ -56,6 +54,11 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setCenter:self.center]; +} - (void)setCenter:(CGPoint)newValue; { @@ -63,10 +66,12 @@ - (void)setCenter:(CGPoint)newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; + + CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; GLfloat centerPosition[2]; - centerPosition[0] = _center.x; - centerPosition[1] = _center.y; + centerPosition[0] = rotatedPoint.x; + centerPosition[1] = rotatedPoint.y; glUniform2fv(centerUniform, 1, centerPosition); } diff --git a/framework/Source/GPUImageSwirlFilter.m b/framework/Source/GPUImageSwirlFilter.m index b300ff1a3..1c1dce63f 100644 --- a/framework/Source/GPUImageSwirlFilter.m +++ b/framework/Source/GPUImageSwirlFilter.m @@ -55,13 +55,19 @@ - (id)init; self.radius = 0.5; self.angle = 1.0; self.center = CGPointMake(0.5, 0.5); - + return self; } #pragma mark - #pragma mark Accessors +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setCenter:self.center]; +} + - (void)setRadius:(CGFloat)newValue; { _radius = newValue; @@ -87,9 +93,11 @@ - (void)setCenter:(CGPoint)newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; + CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; + GLfloat centerPosition[2]; - centerPosition[0] = _center.x; - centerPosition[1] = _center.y; + centerPosition[0] = rotatedPoint.x; + centerPosition[1] = rotatedPoint.y; glUniform2fv(centerUniform, 1, centerPosition); } diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m index 025a5d3a7..a34b9f5b0 100644 --- a/framework/Source/GPUImageVignetteFilter.m +++ b/framework/Source/GPUImageVignetteFilter.m @@ -22,6 +22,9 @@ @implementation GPUImageVignetteFilter @synthesize x=_x, y=_y; +#pragma mark - +#pragma mark Initialization and teardown + - (id)init; { if (!(self = [super initWithFragmentShaderFromString:kGPUImageVignetteFragmentShaderString])) @@ -38,20 +41,46 @@ - (id)init; return self; } -- (void) setX:(CGFloat)x { +#pragma mark - +#pragma mark Accessors + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setX:self.x]; + [self setY:self.y]; +} + +- (void)setX:(CGFloat)x; +{ _x = x; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(xUniform, _x); + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(yUniform, _x); + } + else + { + glUniform1f(xUniform, _x); + } } -- (void) setY:(CGFloat)y { +- (void)setY:(CGFloat)y; +{ _y = y; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(yUniform, _y); + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(xUniform, _y); + } + else + { + glUniform1f(yUniform, _y); + } } @end From 4e9ac1d3c5eb646612ee2a5733bab4e588782278 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 10 May 2012 20:16:20 -0500 Subject: [PATCH 078/695] Improved the crosshatch filter, and added some parameters for it. --- README.md | 4 + .../ShowcaseFilterViewController.m | 7 +- framework/Source/GPUImageCrosshatchFilter.h | 8 ++ framework/Source/GPUImageCrosshatchFilter.m | 117 +++++++++++++----- 4 files changed, 106 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 980860ed3..08d346a1d 100644 --- a/README.md +++ b/README.md @@ -176,6 +176,10 @@ Documentation is generated from header comments using appledoc. To build the doc - *center*: The center about which to apply the pixellation, defaulting to (0.5, 0.5) - *pixelSize*: The fractional pixel size, split into width and height components. The default is (0.05, 0.05) +- **GPUImageCrosshatchFilter**: This converts an image into a black-and-white crosshatch pattern + - *crossHatchSpacing*: The fractional width of the image to use as the spacing for the crosshatch. The default is 0.03. + - *lineWidth*: A relative width for the crosshatch lines. The default is 0.003. + - **GPUImageSobelEdgeDetectionFilter**: Sobel edge detection, with edges highlighted in white - *imageWidthFactor*: - *imageHeightFactor*: These parameters affect the visibility of the detected edges diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index c9c1d873a..bb16ee076 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -94,7 +94,11 @@ - (void)setupFilter; case GPUIMAGE_CROSSHATCH: { self.title = @"Crosshatch"; - self.filterSettingsSlider.hidden = YES; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setValue:0.03]; + [self.filterSettingsSlider setMinimumValue:0.01]; + [self.filterSettingsSlider setMaximumValue:0.06]; filter = [[GPUImageCrosshatchFilter alloc] init]; }; break; @@ -781,6 +785,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; // case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setBlurSize:[(UISlider *)sender value]]; break; case GPUIMAGE_GAMMA: [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; break; + case GPUIMAGE_CROSSHATCH: [(GPUImageCrosshatchFilter *)filter setCrossHatchSpacing:[(UISlider *)sender value]]; break; case GPUIMAGE_POSTERIZE: [(GPUImagePosterizeFilter *)filter setColorLevels:round([(UISlider*)sender value])]; break; case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)filter setDistance:[(UISlider *)sender value]]; break; case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)filter setThreshold:[(UISlider *)sender value]]; break; diff --git a/framework/Source/GPUImageCrosshatchFilter.h b/framework/Source/GPUImageCrosshatchFilter.h index 63b63f305..dab189672 100644 --- a/framework/Source/GPUImageCrosshatchFilter.h +++ b/framework/Source/GPUImageCrosshatchFilter.h @@ -1,5 +1,13 @@ #import "GPUImageFilter.h" @interface GPUImageCrosshatchFilter : GPUImageFilter +{ + GLint crossHatchSpacingUniform, lineWidthUniform; +} +// The fractional width of the image to use as the spacing for the crosshatch. The default is 0.03. +@property(readwrite, nonatomic) CGFloat crossHatchSpacing; + +// A relative width for the crosshatch lines. The default is 0.003. +@property(readwrite, nonatomic) CGFloat lineWidth; @end diff --git a/framework/Source/GPUImageCrosshatchFilter.m b/framework/Source/GPUImageCrosshatchFilter.m index 7e975fb3c..077404240 100644 --- a/framework/Source/GPUImageCrosshatchFilter.m +++ b/framework/Source/GPUImageCrosshatchFilter.m @@ -7,44 +7,59 @@ varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; + + uniform highp float crossHatchSpacing; + uniform highp float lineWidth; + const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); + void main() { - mediump float lum = length(texture2D(inputImageTexture, textureCoordinate).rgb); - - gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); - - mediump vec4 color = texture2D(inputImageTexture, textureCoordinate); + highp float luminance = dot(texture2D(inputImageTexture, textureCoordinate).rgb, W); - if (lum < 1.00) { - if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) { - gl_FragColor = color; - } - } - - if (lum < 0.75) { - if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) { - gl_FragColor = color; - } - } - - if (lum < 0.50) { - if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) { - gl_FragColor = color; - } - } - - if (lum < 0.3) { - if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) { - gl_FragColor = color; - } - } + lowp vec4 colorToDisplay = vec4(1.0, 1.0, 1.0, 1.0); + if (luminance < 1.00) + { + if (mod(textureCoordinate.x + textureCoordinate.y, crossHatchSpacing) <= lineWidth) + { + colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0); + } + } + if (luminance < 0.75) + { + if (mod(textureCoordinate.x - textureCoordinate.y, crossHatchSpacing) <= lineWidth) + { + colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0); + } + } + if (luminance < 0.50) + { + if (mod(textureCoordinate.x + textureCoordinate.y - (crossHatchSpacing / 2.0), crossHatchSpacing) <= lineWidth) + { + colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0); + } + } + if (luminance < 0.3) + { + if (mod(textureCoordinate.x - textureCoordinate.y - (crossHatchSpacing / 2.0), crossHatchSpacing) <= lineWidth) + { + colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0); + } + } + + gl_FragColor = colorToDisplay; } - ); +); @implementation GPUImageCrosshatchFilter +@synthesize crossHatchSpacing = _crossHatchSpacing; +@synthesize lineWidth = _lineWidth; + +#pragma mark - +#pragma mark Initialization and teardown + - (id)init; { if (!(self = [super initWithFragmentShaderFromString:kGPUImageCrosshatchFragmentShaderString])) @@ -52,7 +67,51 @@ - (id)init; return nil; } + crossHatchSpacingUniform = [filterProgram uniformIndex:@"crossHatchSpacing"]; + lineWidthUniform = [filterProgram uniformIndex:@"lineWidth"]; + + self.crossHatchSpacing = 0.03; + self.lineWidth = 0.003; + return self; } +#pragma mark - +#pragma mark Accessors + +- (void)setCrossHatchSpacing:(CGFloat)newValue; +{ + CGFloat singlePixelSpacing; + if (inputTextureSize.width != 0.0) + { + singlePixelSpacing = 1.0 / inputTextureSize.width; + } + else + { + singlePixelSpacing = 1.0 / 2048.0; + } + + if (newValue < singlePixelSpacing) + { + _crossHatchSpacing = singlePixelSpacing; + } + else + { + _crossHatchSpacing = newValue; + } + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(crossHatchSpacingUniform, _crossHatchSpacing); +} + +- (void)setLineWidth:(CGFloat)newValue; +{ + _lineWidth = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(lineWidthUniform, _lineWidth); +} + @end From 2007215ab96e62fcd91a879806734d96a20c7436 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 10 May 2012 23:22:41 -0500 Subject: [PATCH 079/695] Added a median filter and abstracted out some of the shared texel sampling code. Renamed the texel sampling distance properties to be more accurate. --- README.md | 20 +-- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 7 ++ .../SimplePhotoFilter/PhotoViewController.m | 4 +- framework/GPUImage.xcodeproj/project.pbxproj | 16 +++ framework/Source/GPUImage.h | 1 + .../Source/GPUImage3x3ConvolutionFilter.h | 9 +- .../Source/GPUImage3x3ConvolutionFilter.m | 60 +-------- .../Source/GPUImage3x3TextureSamplingFilter.h | 18 +++ .../Source/GPUImage3x3TextureSamplingFilter.m | 107 ++++++++++++++++ .../Source/GPUImageCannyEdgeDetectionFilter.h | 6 +- .../Source/GPUImageCannyEdgeDetectionFilter.m | 20 +-- framework/Source/GPUImageMedianFilter.h | 5 + framework/Source/GPUImageMedianFilter.m | 118 ++++++++++++++++++ framework/Source/GPUImageSmoothToonFilter.h | 4 +- framework/Source/GPUImageSmoothToonFilter.m | 20 +-- .../Source/GPUImageSobelEdgeDetectionFilter.h | 8 +- .../Source/GPUImageSobelEdgeDetectionFilter.m | 28 ++--- framework/Source/GPUImageToonFilter.h | 10 +- framework/Source/GPUImageToonFilter.m | 54 +------- 21 files changed, 335 insertions(+), 182 deletions(-) create mode 100644 framework/Source/GPUImage3x3TextureSamplingFilter.h create mode 100644 framework/Source/GPUImage3x3TextureSamplingFilter.m create mode 100644 framework/Source/GPUImageMedianFilter.h create mode 100644 framework/Source/GPUImageMedianFilter.m diff --git a/README.md b/README.md index 08d346a1d..d5bf56b61 100644 --- a/README.md +++ b/README.md @@ -181,29 +181,29 @@ Documentation is generated from header comments using appledoc. To build the doc - *lineWidth*: A relative width for the crosshatch lines. The default is 0.003. - **GPUImageSobelEdgeDetectionFilter**: Sobel edge detection, with edges highlighted in white - - *imageWidthFactor*: - - *imageHeightFactor*: These parameters affect the visibility of the detected edges + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges - **GPUImageCannyEdgeDetectionFilter**: This uses a Gaussian blur before applying a Sobel operator to highlight edges - - *imageWidthFactor*: - - *imageHeightFactor*: These parameters affect the visibility of the detected edges + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges - *blurSize*: A multiplier for the prepass blur size, ranging from 0.0 on up, with a default of 1.0 - *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.5 as the default - **GPUImageSketchFilter**: Converts video to look like a sketch. This is just the Sobel edge detection filter with the colors inverted - *intensity*: The degree to which the original image colors are replaced by the detected edges (0.0 - 1.0, with 1.0 as the default) - - *imageWidthFactor*: - - *imageHeightFactor*: These parameters affect the visibility of the detected edges + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges - **GPUImageToonFilter**: This uses Sobel edge detection to place a black border around objects, and then it quantizes the colors present in the image to give a cartoon-like quality to the image. - - *imageWidthFactor*: - - *imageHeightFactor*: These parameters affect the visibility of the detected edges + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges - *threshold*: The sensitivity of the edge detection, with lower values being more sensitive. Ranges from 0.0 to 1.0, with 0.2 as the default - *quantizationLevels*: The number of color levels to represent in the final image. Default is 10.0 - **GPUImageSmoothToonFilter**: This uses a similar process as the GPUImageToonFilter, only it precedes the toon effect with a Gaussian blur to smooth out noise. - - *imageWidthFactor*: - - *imageHeightFactor*: These parameters affect the visibility of the detected edges + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges - *blurSize*: A multiplier for the prepass blur size, ranging from 0.0 on up, with a default of 0.5 - *threshold*: The sensitivity of the edge detection, with lower values being more sensitive. Ranges from 0.0 to 1.0, with 0.2 as the default - *quantizationLevels*: The number of color levels to represent in the final image. Default is 10.0 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 1f9e3eff2..b35525087 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -118,6 +118,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_VIGNETTE: cell.textLabel.text = @"Vignette"; break; case GPUIMAGE_GAUSSIAN: cell.textLabel.text = @"Gaussian Blur"; break; case GPUIMAGE_FASTBLUR: cell.textLabel.text = @"Fast Blur"; break; + case GPUIMAGE_MEDIAN: cell.textLabel.text = @"Median (3x3)"; break; case GPUIMAGE_BOXBLUR: cell.textLabel.text = @"Box Blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: cell.textLabel.text = @"Gaussian Selective Blur"; break; case GPUIMAGE_CUSTOM: cell.textLabel.text = @"Custom"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 293ca77e0..7698955ea 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -43,6 +43,7 @@ typedef enum { GPUIMAGE_GAUSSIAN_SELECTIVE, GPUIMAGE_FASTBLUR, GPUIMAGE_BOXBLUR, + GPUIMAGE_MEDIAN, GPUIMAGE_SWIRL, GPUIMAGE_BULGE, GPUIMAGE_PINCH, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index bb16ee076..5b55682d5 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -657,6 +657,13 @@ - (void)setupFilter; filter = [[GPUImageBoxBlurFilter alloc] init]; }; break; + case GPUIMAGE_MEDIAN: + { + self.title = @"Median"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageMedianFilter alloc] init]; + }; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: { self.title = @"Selective Blur"; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index b81f887a1..c74fdb3e0 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -53,8 +53,8 @@ - (void)viewDidLoad stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; // filter = [[GPUImageGammaFilter alloc] init]; filter = [[GPUImageSketchFilter alloc] init]; - [(GPUImageSketchFilter *)filter setImageHeightFactor:1024.0]; - [(GPUImageSketchFilter *)filter setImageWidthFactor:768.0]; + [(GPUImageSketchFilter *)filter setTexelHeight:(1.0 / 1024.0)]; + [(GPUImageSketchFilter *)filter setTexelWidth:(1.0 / 768.0)]; // filter = [[GPUImageSmoothToonFilter alloc] init]; // filter = [[GPUImageSepiaFilter alloc] init]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 63d631bcb..7f250ebc8 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -33,6 +33,10 @@ 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; + BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; }; + BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */; }; + BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; }; + BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */; }; BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; }; BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; @@ -225,6 +229,10 @@ 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMaskFilter.m; path = Source/GPUImageMaskFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; + BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMedianFilter.h; path = Source/GPUImageMedianFilter.h; sourceTree = SOURCE_ROOT; }; + BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMedianFilter.m; path = Source/GPUImageMedianFilter.m; sourceTree = SOURCE_ROOT; }; + BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage3x3TextureSamplingFilter.h; path = Source/GPUImage3x3TextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; + BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3TextureSamplingFilter.m; path = Source/GPUImage3x3TextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputFilter.h; path = Source/GPUImageTwoInputFilter.h; sourceTree = SOURCE_ROOT; }; BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputFilter.m; path = Source/GPUImageTwoInputFilter.m; sourceTree = SOURCE_ROOT; }; BC1B715514F49DAA00ACA2AB /* GPUImageRawData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawData.h; path = Source/GPUImageRawData.h; sourceTree = SOURCE_ROOT; }; @@ -554,6 +562,8 @@ BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */, BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */, BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */, + BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */, + BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */, BC1B715D14F4AFFF00ACA2AB /* Color processing */, BCC93A5215031B1700958B26 /* Image processing */, BC1B715E14F4B04800ACA2AB /* Blends */, @@ -609,6 +619,8 @@ 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */, 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */, 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */, + BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */, + BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */, BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */, BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */, BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */, @@ -795,6 +807,8 @@ BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */, BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */, + BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */, + BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -990,6 +1004,8 @@ BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */, BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */, + BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */, + BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 76adef7f8..8a3a9e4a6 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -80,3 +80,4 @@ #import "GPUImageAlphaBlendFilter.h" #import "GPUImageNonMaximumSuppressionFilter.h" #import "GPUImageRGBFilter.h" +#import "GPUImageMedianFilter.h" diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.h b/framework/Source/GPUImage3x3ConvolutionFilter.h index cba85f949..b113e0602 100644 --- a/framework/Source/GPUImage3x3ConvolutionFilter.h +++ b/framework/Source/GPUImage3x3ConvolutionFilter.h @@ -1,13 +1,8 @@ -#import "GPUImageFilter.h" +#import "GPUImage3x3TextureSamplingFilter.h" -extern NSString *const kGPUImageNearbyTexelSamplingVertexShaderString; - -@interface GPUImage3x3ConvolutionFilter : GPUImageFilter +@interface GPUImage3x3ConvolutionFilter : GPUImage3x3TextureSamplingFilter { GLint convolutionMatrixUniform; - GLint imageWidthFactorUniform, imageHeightFactorUniform; - - CGFloat imageWidthFactor, imageHeightFactor; } // The convolution kernel is a 3x3 matrix of values to apply to the pixel and its 8 surrounding pixels. The matrix is specified in row-major order, diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m index 94255af8b..4183c7643 100644 --- a/framework/Source/GPUImage3x3ConvolutionFilter.m +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -1,50 +1,5 @@ #import "GPUImage3x3ConvolutionFilter.h" -// Override vertex shader to remove dependent texture reads -NSString *const kGPUImageNearbyTexelSamplingVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec4 inputTextureCoordinate; - - uniform highp float imageWidthFactor; - uniform highp float imageHeightFactor; - - varying vec2 textureCoordinate; - varying vec2 leftTextureCoordinate; - varying vec2 rightTextureCoordinate; - - varying vec2 topTextureCoordinate; - varying vec2 topLeftTextureCoordinate; - varying vec2 topRightTextureCoordinate; - - varying vec2 bottomTextureCoordinate; - varying vec2 bottomLeftTextureCoordinate; - varying vec2 bottomRightTextureCoordinate; - - void main() - { - gl_Position = position; - - vec2 widthStep = vec2(imageWidthFactor, 0.0); - vec2 heightStep = vec2(0.0, imageHeightFactor); - vec2 widthHeightStep = vec2(imageWidthFactor, imageHeightFactor); - vec2 widthNegativeHeightStep = vec2(imageWidthFactor, -imageHeightFactor); - - textureCoordinate = inputTextureCoordinate.xy; - leftTextureCoordinate = inputTextureCoordinate.xy - widthStep; - rightTextureCoordinate = inputTextureCoordinate.xy + widthStep; - - topTextureCoordinate = inputTextureCoordinate.xy - heightStep; - topLeftTextureCoordinate = inputTextureCoordinate.xy - widthHeightStep; - topRightTextureCoordinate = inputTextureCoordinate.xy + widthNegativeHeightStep; - - bottomTextureCoordinate = inputTextureCoordinate.xy + heightStep; - bottomLeftTextureCoordinate = inputTextureCoordinate.xy - widthNegativeHeightStep; - bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep; - } -); - - NSString *const kGPUImage3x3ConvolutionFragmentShaderString = SHADER_STRING ( precision highp float; @@ -94,14 +49,12 @@ @implementation GPUImage3x3ConvolutionFilter - (id)init; { - if (!(self = [super initWithVertexShaderFromString:kGPUImageNearbyTexelSamplingVertexShaderString fragmentShaderFromString:kGPUImage3x3ConvolutionFragmentShaderString])) + if (!(self = [super initWithFragmentShaderFromString:kGPUImage3x3ConvolutionFragmentShaderString])) { return nil; } convolutionMatrixUniform = [filterProgram uniformIndex:@"convolutionMatrix"]; - imageWidthFactorUniform = [filterProgram uniformIndex:@"imageWidthFactor"]; - imageHeightFactorUniform = [filterProgram uniformIndex:@"imageHeightFactor"]; self.convolutionKernel = (GPUMatrix3x3){ {0.f, 0.f, 0.f}, @@ -112,17 +65,6 @@ - (id)init; return self; } -- (void)setupFilterForSize:(CGSize)filterFrameSize; -{ - imageWidthFactor = filterFrameSize.width; - imageHeightFactor = filterFrameSize.height; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(imageWidthFactorUniform, 1.0 / imageWidthFactor); - glUniform1f(imageHeightFactorUniform, 1.0 / imageHeightFactor); -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.h b/framework/Source/GPUImage3x3TextureSamplingFilter.h new file mode 100644 index 000000000..5599e156d --- /dev/null +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.h @@ -0,0 +1,18 @@ +#import "GPUImageFilter.h" + +extern NSString *const kGPUImageNearbyTexelSamplingVertexShaderString; + +@interface GPUImage3x3TextureSamplingFilter : GPUImageFilter +{ + GLint texelWidthUniform, texelHeightUniform; + + CGFloat texelWidth, texelHeight; + BOOL hasOverriddenImageSizeFactor; +} + +// The texel width and height determines how far out to sample from this texel. By default, this is the normalized width of a pixel, but this can be overridden for different effects. +@property(readwrite, nonatomic) CGFloat texelWidth; +@property(readwrite, nonatomic) CGFloat texelHeight; + + +@end diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m new file mode 100644 index 000000000..457e6a570 --- /dev/null +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -0,0 +1,107 @@ +#import "GPUImage3x3TextureSamplingFilter.h" + +// Override vertex shader to remove dependent texture reads +NSString *const kGPUImageNearbyTexelSamplingVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + uniform highp float texelWidth; + uniform highp float texelHeight; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 widthStep = vec2(texelWidth, 0.0); + vec2 heightStep = vec2(0.0, texelHeight); + vec2 widthHeightStep = vec2(texelWidth, texelHeight); + vec2 widthNegativeHeightStep = vec2(texelWidth, -texelHeight); + + textureCoordinate = inputTextureCoordinate.xy; + leftTextureCoordinate = inputTextureCoordinate.xy - widthStep; + rightTextureCoordinate = inputTextureCoordinate.xy + widthStep; + + topTextureCoordinate = inputTextureCoordinate.xy - heightStep; + topLeftTextureCoordinate = inputTextureCoordinate.xy - widthHeightStep; + topRightTextureCoordinate = inputTextureCoordinate.xy + widthNegativeHeightStep; + + bottomTextureCoordinate = inputTextureCoordinate.xy + heightStep; + bottomLeftTextureCoordinate = inputTextureCoordinate.xy - widthNegativeHeightStep; + bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep; + } +); + + +@implementation GPUImage3x3TextureSamplingFilter + +@synthesize texelWidth = _texelWidth; +@synthesize texelHeight = _texelHeight; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageNearbyTexelSamplingVertexShaderString fragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + texelWidthUniform = [filterProgram uniformIndex:@"texelWidth"]; + texelHeightUniform = [filterProgram uniformIndex:@"texelHeight"]; + + return self; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + if (!hasOverriddenImageSizeFactor) + { + _texelWidth = 1.0 / filterFrameSize.width; + _texelHeight = 1.0 / filterFrameSize.height; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + } +} + +#pragma mark - +#pragma mark Accessors + +- (void)setTexelWidth:(CGFloat)newValue; +{ + hasOverriddenImageSizeFactor = YES; + _texelWidth = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(texelWidthUniform, _texelWidth); +} + +- (void)setTexelHeight:(CGFloat)newValue; +{ + hasOverriddenImageSizeFactor = YES; + _texelHeight = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(texelHeightUniform, _texelHeight); +} + + +@end diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h index 3a454889e..766238425 100644 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.h +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.h @@ -11,9 +11,9 @@ // GPUImageSketchFilter *edgeDetectionFilter; } -// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels -@property(readwrite, nonatomic) CGFloat imageWidthFactor; -@property(readwrite, nonatomic) CGFloat imageHeightFactor; +// The image width and height factors tweak the appearance of the edges. By default, they match the inverse of the filter size in pixels +@property(readwrite, nonatomic) CGFloat texelWidth; +@property(readwrite, nonatomic) CGFloat texelHeight; // A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 @property (readwrite, nonatomic) CGFloat blurSize; diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.m b/framework/Source/GPUImageCannyEdgeDetectionFilter.m index 42ebb9dca..0009a83fb 100644 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.m +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.m @@ -7,8 +7,8 @@ @implementation GPUImageCannyEdgeDetectionFilter @synthesize threshold; @synthesize blurSize; -@synthesize imageWidthFactor; -@synthesize imageHeightFactor; +@synthesize texelWidth; +@synthesize texelHeight; - (id)init; { @@ -51,24 +51,24 @@ - (CGFloat)blurSize; return blurFilter.blurSize; } -- (void)setImageWidthFactor:(CGFloat)newValue; +- (void)setTexelWidth:(CGFloat)newValue; { - edgeDetectionFilter.imageWidthFactor = newValue; + edgeDetectionFilter.texelWidth = newValue; } -- (CGFloat)imageWidthFactor; +- (CGFloat)texelWidth; { - return edgeDetectionFilter.imageWidthFactor; + return edgeDetectionFilter.texelWidth; } -- (void)setImageHeightFactor:(CGFloat)newValue; +- (void)setTexelHeight:(CGFloat)newValue; { - edgeDetectionFilter.imageHeightFactor = newValue; + edgeDetectionFilter.texelHeight = newValue; } -- (CGFloat)imageHeightFactor; +- (CGFloat)texelHeight; { - return edgeDetectionFilter.imageHeightFactor; + return edgeDetectionFilter.texelHeight; } - (void)setThreshold:(CGFloat)newValue; diff --git a/framework/Source/GPUImageMedianFilter.h b/framework/Source/GPUImageMedianFilter.h new file mode 100644 index 000000000..802257899 --- /dev/null +++ b/framework/Source/GPUImageMedianFilter.h @@ -0,0 +1,5 @@ +#import "GPUImage3x3TextureSamplingFilter.h" + +@interface GPUImageMedianFilter : GPUImage3x3TextureSamplingFilter + +@end diff --git a/framework/Source/GPUImageMedianFilter.m b/framework/Source/GPUImageMedianFilter.m new file mode 100644 index 000000000..6c86cb676 --- /dev/null +++ b/framework/Source/GPUImageMedianFilter.m @@ -0,0 +1,118 @@ +#import "GPUImageMedianFilter.h" + +/* + 3x3 Median optimized for GeForce 8800 + + Morgan McGuire and Kyle Whitson + Williams College + + Register allocation tips by Victor Huang Xiaohuang + University of Illinois at Urbana-Champaign + + http://graphics.cs.williams.edu + + + Copyright (c) Morgan McGuire and Williams College, 2006 + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 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. + + 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. + */ + +NSString *const kGPUImageMedianFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + +#define s2(a, b) temp = a; a = min(a, b); b = max(temp, b); +#define mn3(a, b, c) s2(a, b); s2(a, c); +#define mx3(a, b, c) s2(b, c); s2(a, c); + +#define mnmx3(a, b, c) mx3(a, b, c); s2(a, b); // 3 exchanges +#define mnmx4(a, b, c, d) s2(a, b); s2(c, d); s2(a, c); s2(b, d); // 4 exchanges +#define mnmx5(a, b, c, d, e) s2(a, b); s2(c, d); mn3(a, c, e); mx3(b, d, e); // 6 exchanges +#define mnmx6(a, b, c, d, e, f) s2(a, d); s2(b, e); s2(c, f); mn3(a, b, c); mx3(d, e, f); // 7 exchanges + + void main() + { + vec3 v[6]; + + v[0] = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb; + v[1] = texture2D(inputImageTexture, topRightTextureCoordinate).rgb; + v[2] = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb; + v[3] = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb; + v[4] = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + v[5] = texture2D(inputImageTexture, rightTextureCoordinate).rgb; +// v[6] = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; +// v[7] = texture2D(inputImageTexture, topTextureCoordinate).rgb; + vec3 temp; + + mnmx6(v[0], v[1], v[2], v[3], v[4], v[5]); + + v[5] = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + + mnmx5(v[1], v[2], v[3], v[4], v[5]); + + v[5] = texture2D(inputImageTexture, topTextureCoordinate).rgb; + + mnmx4(v[2], v[3], v[4], v[5]); + + v[5] = texture2D(inputImageTexture, textureCoordinate).rgb; + + mnmx3(v[3], v[4], v[5]); + + gl_FragColor = vec4(v[4], 1.0); + } +); + +@implementation GPUImageMedianFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageMedianFragmentShaderString])) + { + return nil; + } + + hasOverriddenImageSizeFactor = NO; + + return self; +} + +@end diff --git a/framework/Source/GPUImageSmoothToonFilter.h b/framework/Source/GPUImageSmoothToonFilter.h index b9e895bff..353f2926f 100644 --- a/framework/Source/GPUImageSmoothToonFilter.h +++ b/framework/Source/GPUImageSmoothToonFilter.h @@ -12,9 +12,9 @@ } /// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels -@property(readwrite, nonatomic) CGFloat imageWidthFactor; +@property(readwrite, nonatomic) CGFloat texelWidth; /// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels -@property(readwrite, nonatomic) CGFloat imageHeightFactor; +@property(readwrite, nonatomic) CGFloat texelHeight; /// A multiplier for the blur size, ranging from 0.0 on up, with a default of 0.5 @property (readwrite, nonatomic) CGFloat blurSize; diff --git a/framework/Source/GPUImageSmoothToonFilter.m b/framework/Source/GPUImageSmoothToonFilter.m index 0188f40fe..7addb12ed 100644 --- a/framework/Source/GPUImageSmoothToonFilter.m +++ b/framework/Source/GPUImageSmoothToonFilter.m @@ -7,8 +7,8 @@ @implementation GPUImageSmoothToonFilter @synthesize threshold; @synthesize blurSize; @synthesize quantizationLevels; -@synthesize imageWidthFactor; -@synthesize imageHeightFactor; +@synthesize texelWidth; +@synthesize texelHeight; - (id)init; { @@ -51,24 +51,24 @@ - (CGFloat)blurSize; return blurFilter.blurSize; } -- (void)setImageWidthFactor:(CGFloat)newValue; +- (void)setTexelWidth:(CGFloat)newValue; { - toonFilter.imageWidthFactor = newValue; + toonFilter.texelWidth = newValue; } -- (CGFloat)imageWidthFactor; +- (CGFloat)texelWidth; { - return toonFilter.imageWidthFactor; + return toonFilter.texelWidth; } -- (void)setImageHeightFactor:(CGFloat)newValue; +- (void)setTexelHeight:(CGFloat)newValue; { - toonFilter.imageHeightFactor = newValue; + toonFilter.texelHeight = newValue; } -- (CGFloat)imageHeightFactor; +- (CGFloat)texelHeight; { - return toonFilter.imageHeightFactor; + return toonFilter.texelHeight; } - (void)setThreshold:(CGFloat)newValue; diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.h b/framework/Source/GPUImageSobelEdgeDetectionFilter.h index aa642d271..de57476bd 100644 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.h +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.h @@ -2,12 +2,12 @@ @interface GPUImageSobelEdgeDetectionFilter : GPUImageTwoPassFilter { - GLint imageWidthFactorUniform, imageHeightFactorUniform; + GLint texelWidthUniform, texelHeightUniform; BOOL hasOverriddenImageSizeFactor; } -// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels -@property(readwrite, nonatomic) CGFloat imageWidthFactor; -@property(readwrite, nonatomic) CGFloat imageHeightFactor; +// The texel width and height factors tweak the appearance of the edges. By default, they match the inverse of the filter size in pixels +@property(readwrite, nonatomic) CGFloat texelWidth; +@property(readwrite, nonatomic) CGFloat texelHeight; @end diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index d605fd12e..247e295e8 100644 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -42,8 +42,8 @@ void main() @implementation GPUImageSobelEdgeDetectionFilter -@synthesize imageWidthFactor = _imageWidthFactor; -@synthesize imageHeightFactor = _imageHeightFactor; +@synthesize texelWidth = _texelWidth; +@synthesize texelHeight = _texelHeight; #pragma mark - #pragma mark Initialization and teardown @@ -70,8 +70,8 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; hasOverriddenImageSizeFactor = NO; - imageWidthFactorUniform = [secondFilterProgram uniformIndex:@"imageWidthFactor"]; - imageHeightFactorUniform = [secondFilterProgram uniformIndex:@"imageHeightFactor"]; + texelWidthUniform = [secondFilterProgram uniformIndex:@"texelWidth"]; + texelHeightUniform = [secondFilterProgram uniformIndex:@"texelHeight"]; return self; } @@ -80,37 +80,37 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { if (!hasOverriddenImageSizeFactor) { - _imageWidthFactor = filterFrameSize.width; - _imageHeightFactor = filterFrameSize.height; + _texelWidth = 1.0 / filterFrameSize.width; + _texelHeight = 1.0 / filterFrameSize.height; [GPUImageOpenGLESContext useImageProcessingContext]; [secondFilterProgram use]; - glUniform1f(imageWidthFactorUniform, 1.0 / _imageWidthFactor); - glUniform1f(imageHeightFactorUniform, 1.0 / _imageHeightFactor); + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); } } #pragma mark - #pragma mark Accessors -- (void)setImageWidthFactor:(CGFloat)newValue; +- (void)setTexelWidth:(CGFloat)newValue; { hasOverriddenImageSizeFactor = YES; - _imageWidthFactor = newValue; + _texelWidth = newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [secondFilterProgram use]; - glUniform1f(imageWidthFactorUniform, 1.0 / _imageWidthFactor); + glUniform1f(texelWidthUniform, _texelWidth); } -- (void)setImageHeightFactor:(CGFloat)newValue; +- (void)setTexelHeight:(CGFloat)newValue; { hasOverriddenImageSizeFactor = YES; - _imageHeightFactor = newValue; + _texelHeight = newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [secondFilterProgram use]; - glUniform1f(imageHeightFactorUniform, 1.0 / _imageHeightFactor); + glUniform1f(texelHeightUniform, _texelHeight); } @end diff --git a/framework/Source/GPUImageToonFilter.h b/framework/Source/GPUImageToonFilter.h index d9502ece4..cc9d556ed 100644 --- a/framework/Source/GPUImageToonFilter.h +++ b/framework/Source/GPUImageToonFilter.h @@ -1,16 +1,10 @@ -#import "GPUImageFilter.h" +#import "GPUImage3x3TextureSamplingFilter.h" -@interface GPUImageToonFilter : GPUImageFilter +@interface GPUImageToonFilter : GPUImage3x3TextureSamplingFilter { - GLint imageWidthFactorUniform, imageHeightFactorUniform; GLint thresholdUniform, quantizationLevelsUniform; - BOOL hasOverriddenImageSizeFactor; } -// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels -@property(readwrite, nonatomic) CGFloat imageWidthFactor; -@property(readwrite, nonatomic) CGFloat imageHeightFactor; - // The threshold at which to apply the edges, default of 0.2 @property(readwrite, nonatomic) CGFloat threshold; diff --git a/framework/Source/GPUImageToonFilter.m b/framework/Source/GPUImageToonFilter.m index 77b6ed6e4..1e34db745 100644 --- a/framework/Source/GPUImageToonFilter.m +++ b/framework/Source/GPUImageToonFilter.m @@ -49,27 +49,11 @@ void main() float thresholdTest = 1.0 - step(threshold, mag); gl_FragColor = vec4(posterizedImageColor * thresholdTest, textureColor.a); - - /* - if (mag > threshold) - { - gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); - } - else - { - textureColor *= vec3(quantize); - textureColor += vec3(0.5); - textureColor = floor(textureColor) / quantize; - gl_FragColor = vec4(textureColor, texture2D(inputImageTexture, topTextureCoordinate).w); - } - */ } ); @implementation GPUImageToonFilter -@synthesize imageWidthFactor = _imageWidthFactor; -@synthesize imageHeightFactor = _imageHeightFactor; @synthesize threshold = _threshold; @synthesize quantizationLevels = _quantizationLevels; @@ -78,15 +62,13 @@ @implementation GPUImageToonFilter - (id)init; { - if (!(self = [super initWithVertexShaderFromString:kGPUImageNearbyTexelSamplingVertexShaderString fragmentShaderFromString:kGPUImageToonFragmentShaderString])) + if (!(self = [super initWithFragmentShaderFromString:kGPUImageToonFragmentShaderString])) { return nil; } hasOverriddenImageSizeFactor = NO; - imageWidthFactorUniform = [filterProgram uniformIndex:@"imageWidthFactor"]; - imageHeightFactorUniform = [filterProgram uniformIndex:@"imageHeightFactor"]; thresholdUniform = [filterProgram uniformIndex:@"threshold"]; quantizationLevelsUniform = [filterProgram uniformIndex:@"quantizationLevels"]; @@ -96,43 +78,9 @@ - (id)init; return self; } -- (void)setupFilterForSize:(CGSize)filterFrameSize; -{ - if (!hasOverriddenImageSizeFactor) - { - _imageWidthFactor = filterFrameSize.width; - _imageHeightFactor = filterFrameSize.height; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(imageWidthFactorUniform, 1.0 / _imageWidthFactor); - glUniform1f(imageHeightFactorUniform, 1.0 / _imageHeightFactor); - } -} - #pragma mark - #pragma mark Accessors -- (void)setImageWidthFactor:(CGFloat)newValue; -{ - hasOverriddenImageSizeFactor = YES; - _imageWidthFactor = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(imageWidthFactorUniform, 1.0 / _imageWidthFactor); -} - -- (void)setImageHeightFactor:(CGFloat)newValue; -{ - hasOverriddenImageSizeFactor = YES; - _imageHeightFactor = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(imageHeightFactorUniform, 1.0 / _imageHeightFactor); -} - - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; From 29d446fdac1e6ea1f6f227a9ad8c767eaf77ae68 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 11 May 2012 08:45:31 -0500 Subject: [PATCH 080/695] Fixed a compilation error with the Gaussian selective blur. --- framework/Source/GPUImageGaussianSelectiveBlurFilter.h | 1 + framework/Source/GPUImageGaussianSelectiveBlurFilter.m | 1 + framework/Source/GPUImageMedianFilter.m | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h index 919c40a70..99e96ca14 100644 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h @@ -11,5 +11,6 @@ @property (readwrite, nonatomic) CGFloat excludeCircleRadius; @property (readwrite, nonatomic) CGPoint excludeCirclePoint; @property (readwrite, nonatomic) CGFloat excludeBlurSize; +@property (readwrite, nonatomic) CGFloat blurSize; @end diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index d0dd7ef7b..a2b3aa52b 100644 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -28,6 +28,7 @@ void main() @implementation GPUImageGaussianSelectiveBlurFilter @synthesize excludeCirclePoint = _excludeCirclePoint, excludeCircleRadius = _excludeCircleRadius, excludeBlurSize = _excludeBlurSize; +@synthesize blurSize = _blurSize; - (id)init; { diff --git a/framework/Source/GPUImageMedianFilter.m b/framework/Source/GPUImageMedianFilter.m index 6c86cb676..9e65ba8bc 100644 --- a/framework/Source/GPUImageMedianFilter.m +++ b/framework/Source/GPUImageMedianFilter.m @@ -1,7 +1,7 @@ #import "GPUImageMedianFilter.h" /* - 3x3 Median optimized for GeForce 8800 + 3x3 Median optimized for GeForce 8800, from "A Fast, Small-Radius GPU Median Filter" by Morgan McGuire in ShaderX6 Morgan McGuire and Kyle Whitson Williams College From f78e2c015e1cfbc191141a9418c8830f78e215fa Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 11 May 2012 08:55:23 -0500 Subject: [PATCH 081/695] Fixed the slider in the SimpleVideoFilter example. --- .../SimpleVideoFilterViewController.m | 3 +-- .../SimpleVideoFilterViewController.xib | 16 ++++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 10e4f4e83..e907aa516 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -99,8 +99,7 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updateSliderValue:(id)sender { - [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; -// [(GPUImageSketchFilter *)filter setIntensity:1.0]; + [(GPUImageSepiaFilter *)filter setIntensity:[(UISlider *)sender value]]; } @end diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib index d2785904e..1213d5a75 100644 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib @@ -3,12 +3,12 @@ 1280 11D50 - 2177 + 2182 1138.32 568.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1173 + 1179 IBProxyObject @@ -41,13 +41,13 @@ {{18, 418}, {284, 23}} + _NS:623 NO IBCocoaTouchFramework 0 0 - 0.10000000149011612 - 0.30000001192092896 + 1

    bENm=Z9l!bd6Rf^4a1MxHGAU<=wE`K;2(6O>Plk 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 G$MA2&wkP-i literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state.dat b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state.dat new file mode 100644 index 000000000..7337d9782 --- /dev/null +++ b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state.dat @@ -0,0 +1,859 @@ +TFilterShowcase +v5 +r1 +cCheck dependencies +cCpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +cProcessInfoPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist +cProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +cLd /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase normal armv7 +cGenerateDSYMFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase +cCpResource FilterShowcase/CustomFilter.fsh build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh +cCopyStringsFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings FilterShowcase/en.lproj/InfoPlist.strings +cCompileXIB /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib +cCpResource FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg +cCopyPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist FilterShowcase/SampleConfiguration.plist +cCopyPNGFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png +cProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision +cProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision +cTouch /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +cProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent +cCodeSign /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk +c000000004F453DF20000000000000110 +t1329937906 +s272 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist +c000000004F9F3E6200000000000001A7 +t1335836258 +s423 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist +c000000004F9F3E6200000000000001E5 +t1335836258 +s485 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AVFoundation.framework/AVFoundation +c000000004F9F3E66000000000015B230 +t1335836262 +s1421872 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics +c000000004F9F3E6700000000003AE430 +t1335836263 +s3859504 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreMedia.framework/CoreMedia +c000000004F9F3E670000000000075200 +t1335836263 +s479744 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreVideo.framework/CoreVideo +c000000004F9F3E67000000000001BD60 +t1335836263 +s114016 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/Foundation.framework/Foundation +c000000004F9F3E69000000000052C940 +t1335836265 +s5425472 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/OpenGLES.framework/OpenGLES +c000000004F9F3E690000000000018700 +t1335836265 +s100096 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/QuartzCore.framework/QuartzCore +c000000004F9F3E690000000000175AA0 +t1335836265 +s1530528 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/UIKit.framework/UIKit +c000000004F9F3E6B0000000000798EA0 +t1335836267 +s7966368 + +N/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision +c000000004ED00DDE00000000000026DA +t1322257886 +s9946 + +N/opt/local/www/GPUImage/build/Debug-iphoneos/libGPUImage.a +c000000004FABD2920000000000167830 +t1336660626 +s1472560 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GLProgram.h +c000000004FABD14B00000000000004F0 +t1336660299 +s1264 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImage.h +c000000004FABD14B0000000000000B2E +t1336660299 +s2862 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImage3x3ConvolutionFilter.h +c000000004FABD14B00000000000002BD +t1336660299 +s701 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageAdaptiveThresholdFilter.h +c000000004FABD14B0000000000000068 +t1336660299 +s104 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageAlphaBlendFilter.h +c000000004FABD14B000000000000010A +t1336660299 +s266 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageBoxBlurFilter.h +c000000004FABD14B000000000000011B +t1336660299 +s283 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageBrightnessFilter.h +c000000004FABD14B00000000000000F2 +t1336660299 +s242 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageBulgeDistortionFilter.h +c000000004FABD14B0000000000000244 +t1336660299 +s580 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageCGAColorspaceFilter.h +c000000004FABD14B000000000000005A +t1336660299 +s90 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageCannyEdgeDetectionFilter.h +c000000004FABD14B0000000000000391 +t1336660299 +s913 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageChromaKeyBlendFilter.h +c000000004FABD14B000000000000030D +t1336660299 +s781 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageColorBurnBlendFilter.h +c000000004FABD14B000000000000006F +t1336660299 +s111 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageColorDodgeBlendFilter.h +c000000004FABD14B0000000000000070 +t1336660299 +s112 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageColorInvertFilter.h +c000000004FABD14B000000000000005C +t1336660299 +s92 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageColorMatrixFilter.h +c000000004FABD14B0000000000000104 +t1336660299 +s260 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageContrastFilter.h +c000000004FABD14B00000000000000F8 +t1336660299 +s248 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageCropFilter.h +c000000004FABD14B00000000000001AD +t1336660299 +s429 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageCrosshatchFilter.h +c000000004FABD14B0000000000000057 +t1336660299 +s87 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageDarkenBlendFilter.h +c000000004FABD14B000000000000006C +t1336660299 +s108 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageDifferenceBlendFilter.h +c000000004FABD14B0000000000000070 +t1336660299 +s112 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageDissolveBlendFilter.h +c000000004FABD14B000000000000011E +t1336660299 +s286 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageEmbossFilter.h +c000000004FABD14B00000000000000F5 +t1336660299 +s245 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageExclusionBlendFilter.h +c000000004FABD14B000000000000006F +t1336660299 +s111 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageExposureFilter.h +c000000004FABD14B00000000000000EC +t1336660299 +s236 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageFastBlurFilter.h +c000000004FABD14B0000000000000286 +t1336660299 +s646 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageFilter.h +c000000004FABD14B00000000000010D0 +t1336660299 +s4304 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageFilterGroup.h +c000000004FABD14B00000000000001D2 +t1336660299 +s466 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageFilterPipeline.h +c000000004FABD14B00000000000003CB +t1336660299 +s971 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageGammaFilter.h +c000000004FABD14B00000000000000DD +t1336660299 +s221 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageGaussianBlurFilter.h +c000000004FABD14B000000000000023E +t1336660299 +s574 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageGaussianSelectiveBlurFilter.h +c000000004FABD14B00000000000001A1 +t1336660299 +s417 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageGrayscaleFilter.h +c000000004FABD14B000000000000012D +t1336660299 +s301 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHardLightBlendFilter.h +c000000004FABD14B000000000000006F +t1336660299 +s111 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHarrisCornerDetectionFilter.h +c000000004FABD14B00000000000002EB +t1336660299 +s747 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHazeFilter.h +c000000004FABD14B000000000000021E +t1336660299 +s542 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHistogramFilter.h +c000000004FABD14B0000000000000350 +t1336660299 +s848 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageHistogramGenerator.h +c000000004FABD14B000000000000007F +t1336660299 +s127 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageKuwaharaFilter.h +c000000004FABD14B0000000000000294 +t1336660299 +s660 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageLightenBlendFilter.h +c000000004FABD14B00000000000000CA +t1336660299 +s202 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageLuminanceThresholdFilter.h +c000000004FABD14B000000000000012E +t1336660299 +s302 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageMaskFilter.h +c000000004FABD14B0000000000000051 +t1336660299 +s81 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageMovie.h +c000000004FABD14B00000000000002E5 +t1336660299 +s741 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageMovieWriter.h +c000000004FABD14B000000000000063B +t1336660299 +s1595 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageMultiplyBlendFilter.h +c000000004FABD14B000000000000006E +t1336660299 +s110 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageNonMaximumSuppressionFilter.h +c000000004FABD14B0000000000000118 +t1336660299 +s280 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageOpenGLESContext.h +c000000004FABD14B0000000000000593 +t1336660299 +s1427 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageOutput.h +c000000004FABD14B0000000000000BFA +t1336660299 +s3066 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageOverlayBlendFilter.h +c000000004FABD14B0000000000000069 +t1336660299 +s105 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePicture.h +c000000004FABD14B000000000000015F +t1336660299 +s351 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePinchDistortionFilter.h +c000000004FABD14B0000000000000214 +t1336660299 +s532 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePixellateFilter.h +c000000004FABD14B0000000000000161 +t1336660299 +s353 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePolarPixellateFilter.h +c000000004FABD14B00000000000001A4 +t1336660299 +s420 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePosterizeFilter.h +c000000004FABD14B000000000000011F +t1336660299 +s287 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImagePrewittEdgeDetectionFilter.h +c000000004FABD14B0000000000000085 +t1336660299 +s133 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageRGBFilter.h +c000000004FABCC640000000000000129 +t1336659044 +s297 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageRawData.h +c000000004FABD14B000000000000037E +t1336660299 +s894 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSaturationFilter.h +c000000004FABD14B0000000000000116 +t1336660299 +s278 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageScreenBlendFilter.h +c000000004FABD14B000000000000006C +t1336660299 +s108 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSepiaFilter.h +c000000004FABD14B0000000000000085 +t1336660299 +s133 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSharpenFilter.h +c000000004FABD14B0000000000000129 +t1336660299 +s297 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSketchFilter.h +c000000004FABD14B00000000000000F3 +t1336660299 +s243 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSmoothToonFilter.h +c000000004FABD14B000000000000048B +t1336660299 +s1163 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSobelEdgeDetectionFilter.h +c000000004FABD14B00000000000001C7 +t1336660299 +s455 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSoftLightBlendFilter.h +c000000004FABD14B000000000000006F +t1336660299 +s111 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageStillCamera.h +c000000004FABD14B0000000000000286 +t1336660299 +s646 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageStretchDistortionFilter.h +c000000004FABD14B00000000000000FC +t1336660299 +s252 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSubtractBlendFilter.h +c000000004FABD14B000000000000006A +t1336660299 +s106 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageSwirlFilter.h +c000000004FABD14B0000000000000240 +t1336660299 +s576 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTextureInput.h +c000000004FABD14B0000000000000106 +t1336660299 +s262 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTextureOutput.h +c000000004FABD14B00000000000001BA +t1336660299 +s442 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageThresholdEdgeDetection.h +c000000004FABD14B0000000000000150 +t1336660299 +s336 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTiltShiftFilter.h +c000000004FABD14B00000000000003A8 +t1336660299 +s936 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageToonFilter.h +c000000004FABD14B00000000000002F9 +t1336660299 +s761 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTransformFilter.h +c000000004FABD14B00000000000002BF +t1336660299 +s703 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTwoInputFilter.h +c000000004FABD14B0000000000000161 +t1336660299 +s353 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageTwoPassFilter.h +c000000004FABD14B000000000000037A +t1336660299 +s890 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageUnsharpMaskFilter.h +c000000004FABD14B00000000000001E9 +t1336660299 +s489 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageVideoCamera.h +c000000004FABD14B0000000000000A48 +t1336660299 +s2632 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageView.h +c000000004FABD14B00000000000005C0 +t1336660299 +s1472 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageVignetteFilter.h +c000000004FABD14B000000000000012A +t1336660299 +s298 + +N/opt/local/www/GPUImage/examples/FilterShowcase/../../framework/Source/GPUImageXYDerivativeFilter.h +c000000004FABD14B000000000000007D +t1336660299 +s125 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg +c000000004FABD14B000000000011A0B4 +t1336660299 +s1155252 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh +c000000004FABD14B0000000000000224 +t1336660299 +s548 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch +c000000004FABD14B000000000000014B +t1336660299 +s331 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist +c000000004FABD14B000000000000025D +t1336660299 +s605 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h +c000000004FABD14B0000000000000130 +t1336660299 +s304 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m +c000000004FABD14B0000000000000351 +t1336660299 +s849 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h +c000000004FABD14B000000000000005F +t1336660299 +s95 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +c000000004FABD20C0000000000001E99 +t1336660492 +s7833 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +c000000004FABD1F700000000000008C3 +t1336660471 +s2243 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +c000000004FABD2B100000000000081B3 +t1336660657 +s33203 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib +c000000004FABD14B00000000000021C5 +t1336660299 +s8645 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings +c000000004FABD14B000000000000002D +t1336660299 +s45 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m +c000000004FABD14B00000000000000DF +t1336660299 +s223 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/mask.png +c000000004FABD14B00000000000ECAAB +t1336660299 +s969387 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +t1336660681 +s476 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM +t1336660659 +s102 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh +t1336660659 +s548 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase +t1336660681 +s495712 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist +t1336660577 +s1210 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo +t1336660577 +s8 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +t1336660577 +s485 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist +t1336660659 +s245 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib +t1336660668 +s1142 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg +t1336660659 +s1155252 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision +t1336660679 +s9946 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings +t1336660659 +s42 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png +t1336660679 +s960433 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent +t1336660679 +s448 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList +c000000004FABD261000000000000026B +t1336660577 +s619 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o +t1336660584 +s62240 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o +t1336660644 +s71460 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o +t1336660658 +s122256 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o +t1336660584 +s3468 + +N/var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth +t1336660581 +s3990036 + +NFilterShowcase/FilterShowcase-Info.plist +c000000004FABD14B00000000000005BD +t1336660299 +s1469 + +CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m +r0 + +CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +r0 + +CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +r0 + +CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m +r0 + +CCheck dependencies +r0 +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection18"Check dependenciesb64901510a5cb541^14ed0a510a5cb541^---0#1#0#--18"Check dependencies36"B911DC1C-5D61-4B67-902D-7D6CA67C38E9- + +CCodeSign /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +s358353479.785338 +e358353481.333716 +r1 +xCodeSign +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection48"CodeSign build/Debug-iphoneos/FilterShowcase.appa62ac9470a5cb541^ad6e55490a5cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/0000000000000000^866"CodeSign build/Debug-iphoneos/FilterShowcase.app cd /opt/local/www/GPUImage/examples/FilterShowcase setenv CODESIGN_ALLOCATE /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /usr/bin/codesign --force --sign 7612befb7fc46acfe69fae65084063ebb853d1da --resource-rules=/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist --entitlements /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"AB38A294-89A8-48AF-9648-E705636F0CE3- + +CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353383.975208 +e358353384.488423 +r1 +xCompileC +xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o +x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection92"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m76c4f9e7095cb541^f2097de8095cb541^---0#0#0#-19%DVTDocumentLocation2@100"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m0000000000000000^3471"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o 36"80B6440A-7AC4-475C-9241-5F6C1791B557- + +CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353444.136153 +e358353444.813345 +r0 +xCompileC +xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o +x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection101"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m040023240a5cb541^f019d1240a5cb541^---0#0#0#-19%DVTDocumentLocation2@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m0000000000000000^3525"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o FilterShowcase/ShowcaseFilterListController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o 36"05CAEC69-9763-4A48-BC86-6071B1750167- + +CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353458.008880 +e358353458.539303 +r1 +xCompileC +xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o +x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection101"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m596902320a5cb541^46248a320a5cb541^---0#0#0#-19%DVTDocumentLocation2@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^3525"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o 36"46C4516F-432A-4D7D-8A9D-E729E8098F9A- + +CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353383.974678 +e358353384.487504 +r1 +xCompileC +xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o +x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection77"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m73b9f9e7095cb541^cdcc7ce8095cb541^---0#0#0#-19%DVTDocumentLocation2@85"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m0000000000000000^3381"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o 36"56719BD8-4671-4DB2-8298-CBA0ED3843FA- + +CCompileXIB /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib +s358353459.751006 +e358353468.673350 +r1 +xCompileXIB +x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection105"Compiling /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib6c5bc0330a5cb541^5261ac3c0a5cb541^---0#0#0#-19%DVTDocumentLocation2@111"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib0000000000000000^904"CompileXIB FilterShowcase/ShowcaseFilterViewController.xib cd /opt/local/www/GPUImage/examples/FilterShowcase setenv IBC_MINIMUM_COMPATIBILITY_VERSION 4.0 setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" setenv XCODE_DEVELOPER_USR_PATH /Applications/Xcode.app/Contents/Developer/usr/bin/.. /Applications/Xcode.app/Contents/Developer/usr/bin/ibtool --errors --warnings --notices --output-format human-readable-text --compile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib --sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk 36"3E602699-E5C3-4075-9A6E-4AC73B758168- + +CCopyPNGFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png +s358353459.943100 +e358353479.575105 +r1 +xCopyPNGFile +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png +xFilterShowcase/mask.png +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection84"CopyPNGFile build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png9982f1330a5cb541^473a93470a5cb541^---0#0#0#-19%DVTDocumentLocation2@87"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/mask.png0000000000000000^692"CopyPNGFile build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS Build System Support.xcplugin/Contents/Resources/copypng" -compress "" /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/mask.png /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png 36"35B61E75-ADE1-403E-AF5B-A3695BD35AB9- + +CCopyPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist FilterShowcase/SampleConfiguration.plist +s358353459.907965 +e358353459.941878 +r1 +xCopyPlistFile +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist +xFilterShowcase/SampleConfiguration.plist +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection45"Copy FilterShowcase/SampleConfiguration.plist5d89e8330a5cb541^a62af1330a5cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist0000000000000000^545"CopyPlistFile build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist FilterShowcase/SampleConfiguration.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copyPlist --convert binary1 --outdir /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app -- FilterShowcase/SampleConfiguration.plist 36"5AA6F012-9BB6-487F-A3FC-88B47549348F- + +CCopyStringsFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings FilterShowcase/en.lproj/InfoPlist.strings +s358353459.682688 +e358353459.752203 +r1 +xCopyStringsFile +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings +xFilterShowcase/en.lproj/InfoPlist.strings +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection46"Copy FilterShowcase/en.lproj/InfoPlist.strings5ef3ae330a5cb541^dd96c0330a5cb541^---0#0#0#-19%DVTDocumentLocation2@105"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings0000000000000000^600"CopyStringsFile build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings FilterShowcase/en.lproj/InfoPlist.strings cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copyStrings --validate --inputencoding utf-8 --outputencoding binary --outdir /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj -- FilterShowcase/en.lproj/InfoPlist.strings 36"AA990587-0458-4F4D-9A47-6BB13240A149- + +CCpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +s358353377.466728 +e358353377.617278 +r1 +xCpResource +x/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist +xbuild/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection64"Copy build/Debug-iphoneos/FilterShowcase.app/ResourceRules.pliste5b477e1095cb541^753cdae1095cb541^---0#0#0#-19%DVTDocumentLocation2@123"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist000000000080d041^863"CpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"F3590EDA-2A7B-4C6B-86DE-496A321AA51C- + +CCpResource FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg +s358353459.753367 +e358353459.906699 +r1 +xCpResource +xFilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg +xbuild/Debug-iphoneos/FilterShowcase.app/WID-small.jpg +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection58"Copy build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg78efc0330a5cb541^6075e8330a5cb541^---0#0#0#-19%DVTDocumentLocation2@117"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg000000000080d041^803"CpResource FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"7B9E690E-51B7-4D6A-B9FF-73A99C1884FA- + +CCpResource FilterShowcase/CustomFilter.fsh build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh +s358353459.677652 +e358353459.735320 +r1 +xCpResource +xFilterShowcase/CustomFilter.fsh +xbuild/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection61"Copy build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh5396ad330a5cb541^31d3ba330a5cb541^---0#0#0#-19%DVTDocumentLocation2@120"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh000000000080d041^728"CpResource FilterShowcase/CustomFilter.fsh build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"5222E42D-D139-42B0-B9E1-17228CD22B80- + +CGenerateDSYMFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase +s358353489.171592 +e358353489.383623 +r1 +xGenerateDSYMFile +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection103"Generating /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYMbf0e2c510a5cb541^b1fc61510a5cb541^---0#0#0#-19%DVTDocumentLocation2@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/0000000000000000^623"GenerateDSYMFile build/Debug-iphoneos/FilterShowcase.app.dSYM build/Debug-iphoneos/FilterShowcase.app/FilterShowcase cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/usr/bin/dsymutil /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM 36"7ADDD2E7-98D4-4134-9E2F-7432C9A1342A- + +CLd /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase normal armv7 +s358353458.547062 +e358353459.358679 +r1 +xLd +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase +xnormal +xarmv7 +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection107"Link /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase4d1293320a5cb541^a2d35b330a5cb541^---0#0#0#--1286"Ld build/Debug-iphoneos/FilterShowcase.app/FilterShowcase normal armv7 cd /opt/local/www/GPUImage/examples/FilterShowcase setenv IPHONEOS_DEPLOYMENT_TARGET 4.0 setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -L/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -filelist /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList -dead_strip -ObjC -fobjc-arc -miphoneos-version-min=4.0 /opt/local/www/GPUImage/build/Debug-iphoneos/libGPUImage.a -framework OpenGLES -framework AVFoundation -framework CoreMedia -weak_framework CoreVideo -framework QuartzCore -framework UIKit -framework Foundation -framework CoreGraphics -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase 36"BDD81F0C-F317-4BDE-96C2-72BBD5A3BFE7- + +CProcessInfoPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist +s358353377.467336 +e358353377.613451 +r1 +xProcessInfoPlistFile +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist +xFilterShowcase/FilterShowcase-Info.plist +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection48"Process FilterShowcase/FilterShowcase-Info.plistf0c177e1095cb541^821b9de1095cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist0000000000000000^818"ProcessInfoPlistFile build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-infoPlistUtility FilterShowcase/FilterShowcase-Info.plist -genpkginfo /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo -expandbuildsettings -format binary -platform iphoneos -resourcerulesfile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist 36"0F526A05-DC0D-4D20-80CF-4101680418DC- + +CProcessPCH /Users/joshholat/Library/Developer/Xcode/DerivedData/FilterShowcase-bzoblmlqdijohfcemawsbqkwxemg/Index/PrecompiledHeaders/FilterShowcase-Prefix-gstgaoufxyyhstbhqthwswltjgkg_ast/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.astbuilder +r0 + +CProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353377.694117 +e358353383.967825 +r1 +xProcessPCH +x/var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth +xFilterShowcase/FilterShowcase-Prefix.pch +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection51"Precompile FilterShowcase/FilterShowcase-Prefix.pch77d7b1e1095cb541^4ddbf7e7095cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch0000000000000000^3436"ProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c-header -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos --serialize-diagnostics /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch -o /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -MMD -MT dependencies -MF /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.d 36"94A2285D-03EC-4A51-8BF9-DF2BF231CD25- + +CProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision +s358353479.642766 +e358353479.646843 +r1 +xProcessProductPackaging +x/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection203"ProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovisioneca6a4470a5cb541^e597a5470a5cb541^---0#0#0#-19%DVTDocumentLocation2@128"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision0000000000000000^714"ProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-productPackagingUtility "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision 36"4EE674B3-2986-4299-AFF0-9ED4D65E3D41- + +CProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent +s358353479.743313 +e358353479.776485 +r1 +xProcessProductPackaging +x/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist +x/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection228"ProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent8463be470a5cb541^86c7c6470a5cb541^---0#0#0#-19%DVTDocumentLocation2@147"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent000000000080d041^790"ProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-productPackagingUtility /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist -entitlements -format xml -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent 36"AE4EA234-1160-488E-B005-4DC711F0C11B- + +CTouch /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +s358353479.655601 +e358353479.735226 +r1 +xTouch +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection93"Touch /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app5feea7470a5cb541^4c38bc470a5cb541^---0#0#0#--399"Touch build/Debug-iphoneos/FilterShowcase.app cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /usr/bin/touch -c /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"95508D9E-5F93-4F33-8717-A6E584E738DD- + diff --git a/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state~.dat b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state~.dat new file mode 100644 index 000000000..4bfb63dea --- /dev/null +++ b/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state~.dat @@ -0,0 +1,359 @@ +TFilterShowcase +v5 +r1 +cCheck dependencies +cCpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +cProcessInfoPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist +cProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +cCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk +c000000004F453DF20000000000000110 +t1329937906 +s272 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist +c000000004F9F3E6200000000000001A7 +t1335836258 +s423 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist +c000000004F9F3E6200000000000001E5 +t1335836258 +s485 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AVFoundation.framework/AVFoundation +c000000004F9F3E66000000000015B230 +t1335836262 +s1421872 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics +c000000004F9F3E6700000000003AE430 +t1335836263 +s3859504 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreMedia.framework/CoreMedia +c000000004F9F3E670000000000075200 +t1335836263 +s479744 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreVideo.framework/CoreVideo +c000000004F9F3E67000000000001BD60 +t1335836263 +s114016 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/Foundation.framework/Foundation +c000000004F9F3E69000000000052C940 +t1335836265 +s5425472 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/OpenGLES.framework/OpenGLES +c000000004F9F3E690000000000018700 +t1335836265 +s100096 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/QuartzCore.framework/QuartzCore +c000000004F9F3E690000000000175AA0 +t1335836265 +s1530528 + +N/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/UIKit.framework/UIKit +c000000004F9F3E6B0000000000798EA0 +t1335836267 +s7966368 + +N/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision +c000000004ED00DDE00000000000026DA +t1322257886 +s9946 + +N/opt/local/www/GPUImage/build/Debug-iphoneos/libGPUImage.a +c00000000000000000000000000000000 +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg +c000000004FABD14B000000000011A0B4 +t1336660299 +s1155252 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh +c000000004FABD14B0000000000000224 +t1336660299 +s548 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch +c000000004FABD14B000000000000014B +t1336660299 +s331 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist +c000000004FABD14B000000000000025D +t1336660299 +s605 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m +c000000004FABD14B0000000000000351 +t1336660299 +s849 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +c000000004FABD20C0000000000001E99 +t1336660492 +s7833 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +c000000004FABD25F0000000000008195 +t1336660575 +s33173 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib +c000000004FABD14B00000000000021C5 +t1336660299 +s8645 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings +c000000004FABD14B000000000000002D +t1336660299 +s45 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m +c000000004FABD14B00000000000000DF +t1336660299 +s223 + +N/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/mask.png +c000000004FABD14B00000000000ECAAB +t1336660299 +s969387 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList +c000000004FABD261000000000000026B +t1336660577 +s619 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o +t2 +s0 + +N/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o +t2 +s0 + +N/var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth +t2 +s0 + +NFilterShowcase/FilterShowcase-Info.plist +c000000004FABD14B00000000000005BD +t1336660299 +s1469 + +CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m +r0 + +CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +r0 + +CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +r0 + +CBuild AST from /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m +r0 + +CCheck dependencies +r0 +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection18"Check dependenciesbbf2dde0095cb541^5b0c76e1095cb541^---0#1#0#--18"Check dependencies36"4CE14751-1480-41EA-A7AB-C6489532CBBF- + +CCodeSign /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +r0 + +CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353383.975208 +e358353384.488423 +r1 +xCompileC +xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o +x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection92"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m76c4f9e7095cb541^f2097de8095cb541^---0#0#0#-19%DVTDocumentLocation2@100"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m0000000000000000^3471"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o FilterShowcase/ShowcaseAppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o 36"80B6440A-7AC4-475C-9241-5F6C1791B557- + +CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +r0 + +CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353384.488660 +e358353384.733770 +r0 +xCompileC +xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o +x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +o/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:157:24: error: unknown receiver 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'? +o filter = [[GPUImageRGBFilter alloc] init]; +o ^~~~~~~~~~~~~~~~~ +o GPUImageFilter +o../../framework/Source/GPUImageFilter.h:44:12: note: 'GPUImageFilter' declared here +o@interface GPUImageFilter : GPUImageOutput +o ^ +o/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:778:30: error: use of undeclared identifier 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'? +o case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; +o ^ +o/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:778:49: error: expected expression +o case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; +o ^ +o3 errors generated. +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection101"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m823a7de8095cb541^f7c7bbe8095cb541^-1090"/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:157:24: error: unknown receiver 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'? filter = [[GPUImageRGBFilter alloc] init]; ^~~~~~~~~~~~~~~~~ GPUImageFilter ../../framework/Source/GPUImageFilter.h:44:12: note: 'GPUImageFilter' declared here @interface GPUImageFilter : GPUImageOutput ^ /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:778:30: error: use of undeclared identifier 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'? case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; ^ /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m:778:49: error: expected expression case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; ^ 3 errors generated. 3(36%IDEClangDiagnosticActivityLogMessage2@68"Unknown receiver 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'?-358353384#18446744073709551615#0#1(2@30"'GPUImageFilter' declared here-358353384#18446744073709551615#0#-0#27"com.apple.dt.IDE.diagnostic23%DVTTextDocumentLocation3@73"file://localhost/opt/local/www/GPUImage/framework/Source/GPUImageFilter.h0000000000000000^43#11#43#11#1195#0#14"Semantic Issue--2#27"com.apple.dt.IDE.diagnostic3@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^156#23#156#23#5002#0#14"Semantic Issue1(3@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^156#23#156#40#5002#0#-2@80"Use of undeclared identifier 'GPUImageRGBFilter'; did you mean 'GPUImageFilter'?-358353384#18446744073709551615#0#-2#27"com.apple.dt.IDE.diagnostic3@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^777#29#777#29#28820#0#14"Semantic Issue--2@19"Expected expression-358353384#18446744073709551615#0#-2#27"com.apple.dt.IDE.diagnostic3@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^777#48#777#48#28839#0#11"Parse Issue--0#0#0#-19%DVTDocumentLocation4@109"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m0000000000000000^3525"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o FilterShowcase/ShowcaseFilterViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o 36"E320BDB8-41E0-46FE-B835-0072D8D2A2B6- + +CCompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353383.974678 +e358353384.487504 +r1 +xCompileC +xbuild/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o +x/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection77"Compile /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m73b9f9e7095cb541^cdcc7ce8095cb541^---0#0#0#-19%DVTDocumentLocation2@85"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m0000000000000000^3381"CompileC build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o FilterShowcase/main.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos -include /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch -MMD -MT dependencies -MF /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.d --serialize-diagnostics /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/main.m -o /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o 36"56719BD8-4671-4DB2-8298-CBA0ED3843FA- + +CCompileXIB /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib +r0 + +CCopyPNGFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png FilterShowcase/mask.png +r0 + +CCopyPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist FilterShowcase/SampleConfiguration.plist +r0 + +CCopyStringsFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings FilterShowcase/en.lproj/InfoPlist.strings +r0 + +CCpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +s358353377.466728 +e358353377.617278 +r1 +xCpResource +x/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist +xbuild/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection64"Copy build/Debug-iphoneos/FilterShowcase.app/ResourceRules.pliste5b477e1095cb541^753cdae1095cb541^---0#0#0#-19%DVTDocumentLocation2@123"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist000000000080d041^863"CpResource /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ResourceRules.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app 36"F3590EDA-2A7B-4C6B-86DE-496A321AA51C- + +CCpResource FilterShowcase/../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg +r0 + +CCpResource FilterShowcase/CustomFilter.fsh build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh +r0 + +CGenerateDSYMFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase +r0 + +CLd /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase normal armv7 +r0 + +CProcessInfoPlistFile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist +s358353377.467336 +e358353377.613451 +r1 +xProcessInfoPlistFile +x/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist +xFilterShowcase/FilterShowcase-Info.plist +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection48"Process FilterShowcase/FilterShowcase-Info.plistf0c177e1095cb541^821b9de1095cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist0000000000000000^818"ProcessInfoPlistFile build/Debug-iphoneos/FilterShowcase.app/Info.plist FilterShowcase/FilterShowcase-Info.plist cd /opt/local/www/GPUImage/examples/FilterShowcase setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" builtin-infoPlistUtility FilterShowcase/FilterShowcase-Info.plist -genpkginfo /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo -expandbuildsettings -format binary -platform iphoneos -resourcerulesfile /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist -o /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist 36"0F526A05-DC0D-4D20-80CF-4101680418DC- + +CProcessPCH /Users/joshholat/Library/Developer/Xcode/DerivedData/FilterShowcase-bzoblmlqdijohfcemawsbqkwxemg/Index/PrecompiledHeaders/FilterShowcase-Prefix-gstgaoufxyyhstbhqthwswltjgkg_ast/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.astbuilder +r0 + +CProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler +s358353377.694117 +e358353383.967825 +r1 +xProcessPCH +x/var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth +xFilterShowcase/FilterShowcase-Prefix.pch +xnormal +xarmv7 +xobjective-c +xcom.apple.compilers.llvm.clang.1_0.compiler +lSLF05#21%IDEActivityLogSection1@2#32"com.apple.dt.IDE.BuildLogSection51"Precompile FilterShowcase/FilterShowcase-Prefix.pch77d7b1e1095cb541^4ddbf7e7095cb541^---0#0#0#-19%DVTDocumentLocation2@104"file://localhost/opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch0000000000000000^3436"ProcessPCH /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth FilterShowcase/FilterShowcase-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /opt/local/www/GPUImage/examples/FilterShowcase setenv LANG en_US.US-ASCII setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c-header -arch armv7 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wprotocol -Wdeprecated-declarations -g -Wno-conversion -Wno-sign-conversion -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=4.0 -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap -iquote /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap -I/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/include -I../../framework -I../../framework/GPUImageTests -I../../framework/Source -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources/armv7 -I/opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/DerivedSources -F/opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos --serialize-diagnostics /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.dia -c /opt/local/www/GPUImage/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch -o /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.pth -MMD -MT dependencies -MF /var/folders/fd/1km0337116s3hlk601ldj69h0000gn/C/com.apple.Xcode.501/SharedPrecompiledHeaders/FilterShowcase-Prefix-hbsyvzlnlhvfajfxwqmarbgkxows/FilterShowcase-Prefix.pch.d 36"94A2285D-03EC-4A51-8BF9-DF2BF231CD25- + +CProcessProductPackaging "/Users/joshholat/Library/MobileDevice/Provisioning Profiles/A04D9FE1-D2B0-4F66-AD0E-53927DF76312.mobileprovision" /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision +r0 + +CProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/Entitlements.plist /opt/local/www/GPUImage/examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent +r0 + +CTouch /opt/local/www/GPUImage/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app +r0 + diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 739680dd5..fc9c2fa7c 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -192,6 +192,8 @@ BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */; }; BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; + BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; + BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -379,6 +381,8 @@ BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetection.m; path = Source/GPUImageThresholdEdgeDetection.m; sourceTree = SOURCE_ROOT; }; BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSmoothToonFilter.h; path = Source/GPUImageSmoothToonFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; + BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; + BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -421,6 +425,8 @@ BC1B715D14F4AFFF00ACA2AB /* Color processing */ = { isa = PBXGroup; children = ( + BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */, + BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */, BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */, BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */, BCB6B833150400030041703B /* GPUImageExposureFilter.h */, @@ -788,6 +794,7 @@ BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */, BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */, + BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -982,6 +989,7 @@ BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */, BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */, + BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageRGBFilter.h b/framework/Source/GPUImageRGBFilter.h new file mode 100755 index 000000000..f047761db --- /dev/null +++ b/framework/Source/GPUImageRGBFilter.h @@ -0,0 +1,14 @@ +#import "GPUImageFilter.h" + +@interface GPUImageRGBFilter : GPUImageFilter +{ + GLint redUniform; + GLint greenUniform; + GLint blueUniform; +} + +@property (readwrite, nonatomic) CGFloat red; +@property (readwrite, nonatomic) CGFloat green; +@property (readwrite, nonatomic) CGFloat blue; + +@end \ No newline at end of file diff --git a/framework/Source/GPUImageRGBFilter.m b/framework/Source/GPUImageRGBFilter.m new file mode 100755 index 000000000..e71bb4aae --- /dev/null +++ b/framework/Source/GPUImageRGBFilter.m @@ -0,0 +1,77 @@ +#import "GPUImageRGBFilter.h" + +NSString *const kGPUImageRGBFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform highp float red; + uniform highp float green; + uniform highp float blue; + + void main() + { + highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, 1.0); + } + ); + +@implementation GPUImageRGBFilter + +@synthesize red = _red, blue = _blue, green = _green; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageRGBFragmentShaderString])) + { + return nil; + } + + redUniform = [filterProgram uniformIndex:@"red"]; + self.red = 1.0; + + greenUniform = [filterProgram uniformIndex:@"green"]; + self.green = 1.0; + + blueUniform = [filterProgram uniformIndex:@"blue"]; + self.blue = 1.0; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setRed:(CGFloat)newValue; +{ + _red = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(redUniform, _red); +} + +- (void)setGreen:(CGFloat)newValue; +{ + _green = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(greenUniform, _green); +} + + +- (void)setBlue:(CGFloat)newValue; +{ + _blue = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(blueUniform, _blue); +} + +@end \ No newline at end of file From 6c47121a93431b64136cb62be82fbb32b57a4ea9 Mon Sep 17 00:00:00 2001 From: Josh Holat Date: Thu, 10 May 2012 09:42:51 -0500 Subject: [PATCH 075/695] add build directory of filtershowcase to .gitignore as well --- .gitignore | 1 + .../Contents/Info.plist | 20 - .../Contents/Resources/DWARF/FilterShowcase | Bin 626035 -> 0 bytes .../FilterShowcase.app/CustomFilter.fsh | 19 - .../FilterShowcase.app/FilterShowcase | Bin 495712 -> 0 bytes .../FilterShowcase.app/Info.plist | Bin 1210 -> 0 bytes .../Debug-iphoneos/FilterShowcase.app/PkgInfo | 1 - .../FilterShowcase.app/ResourceRules.plist | 25 - .../SampleConfiguration.plist | Bin 245 -> 0 bytes .../ShowcaseFilterViewController.nib | Bin 1142 -> 0 bytes .../FilterShowcase.app/WID-small.jpg | Bin 1155252 -> 0 bytes .../_CodeSignature/CodeResources | 60 -- .../embedded.mobileprovision | Bin 9946 -> 0 bytes .../en.lproj/InfoPlist.strings | Bin 42 -> 0 bytes .../FilterShowcase.app/mask.png | Bin 960433 -> 0 bytes .../FilterShowcase-all-target-headers.hmap | Bin 793 -> 0 bytes .../FilterShowcase-generated-files.hmap | Bin 121 -> 0 bytes .../FilterShowcase-own-target-headers.hmap | Bin 793 -> 0 bytes .../FilterShowcase-project-headers.hmap | Bin 967 -> 0 bytes .../FilterShowcase.build/FilterShowcase.dep | 19 - .../FilterShowcase.build/FilterShowcase.hmap | Bin 1735 -> 0 bytes .../FilterShowcase.build/FilterShowcase.xcent | 14 - .../FilterShowcase.build/FilterShowcase~.dep | 19 - .../armv7/FilterShowcase.LinkFileList | 4 - .../armv7/ShowcaseAppDelegate.d | 4 - .../armv7/ShowcaseAppDelegate.dia | Bin 220 -> 0 bytes .../armv7/ShowcaseAppDelegate.o | Bin 62240 -> 0 bytes .../armv7/ShowcaseFilterListController.d | 83 -- .../armv7/ShowcaseFilterListController.dia | Bin 220 -> 0 bytes .../armv7/ShowcaseFilterListController.o | Bin 71460 -> 0 bytes .../armv7/ShowcaseFilterViewController.d | 83 -- .../armv7/ShowcaseFilterViewController.dia | Bin 220 -> 0 bytes .../armv7/ShowcaseFilterViewController.o | Bin 122256 -> 0 bytes .../Objects-normal/armv7/main.d | 3 - .../Objects-normal/armv7/main.dia | Bin 220 -> 0 bytes .../Objects-normal/armv7/main.o | Bin 3468 -> 0 bytes .../FilterShowcase.build/build-state.dat | 859 ------------------ .../FilterShowcase.build/build-state~.dat | 359 -------- 38 files changed, 1 insertion(+), 1572 deletions(-) delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Info.plist delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Resources/DWARF/FilterShowcase delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/CustomFilter.fsh delete mode 100755 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/FilterShowcase delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/Info.plist delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/PkgInfo delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ResourceRules.plist delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/SampleConfiguration.plist delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/ShowcaseFilterViewController.nib delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/WID-small.jpg delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/_CodeSignature/CodeResources delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/embedded.mobileprovision delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/en.lproj/InfoPlist.strings delete mode 100644 examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app/mask.png delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-all-target-headers.hmap delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-generated-files.hmap delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-own-target-headers.hmap delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase-project-headers.hmap delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.dep delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.hmap delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase.xcent delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/FilterShowcase~.dep delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/FilterShowcase.LinkFileList delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.d delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.dia delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseAppDelegate.o delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.d delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.dia delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterListController.o delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.d delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.dia delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/ShowcaseFilterViewController.o delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.d delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.dia delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/Objects-normal/armv7/main.o delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state.dat delete mode 100644 examples/FilterShowcase/build/FilterShowcase.build/Debug-iphoneos/FilterShowcase.build/build-state~.dat diff --git a/.gitignore b/.gitignore index 6157e0c4a..f57d52bb7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Exclude the build directory build/* +examples/FilterShowcase/build* # Exclude temp nibs and swap files *~.nib diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Info.plist b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Info.plist deleted file mode 100644 index 321084e9b..000000000 --- a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.com.sunsetlakesoftware.FilterShowcase - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1.0 - - diff --git a/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Resources/DWARF/FilterShowcase b/examples/FilterShowcase/build/Debug-iphoneos/FilterShowcase.app.dSYM/Contents/Resources/DWARF/FilterShowcase deleted file mode 100644 index 581f8730370563e5acfe79d5c6d204f69e2fc98f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626035 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%0AfosGu{?z>OXrZq!7HRyUrEP(D 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ΠG>rv<>nrFG)4vF3&fWT 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∾U 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 mOO{pU=LYDv{x(Kwvn9**} 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

    bENm=Z9l!bd6Rf^4a1MxHGAU<=wE`K;2(6O>Plk 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

    s#H~bLi1pa)l_FrrJ9CT>HnerXz$%fyWq!Tnt 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 QFnGvG17rQ-WA?ZI10w-xrT_o{ literal 0 HcmV?d00001 diff --git a/framework/Source/tilesets/photo 4.JPG b/framework/Source/tilesets/photo 4.JPG new file mode 100644 index 0000000000000000000000000000000000000000..4c43350f4a57ce51fb9019046fc9925cf2e2b947 GIT binary patch literal 74865 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ෑnt0E}>ibB$Tcx>Ic5%!aR(#x` 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 KoB#az)&Bv=Q^X|z literal 0 HcmV?d00001 diff --git a/framework/Source/tilesets/squares.png b/framework/Source/tilesets/squares.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1a4899a15d871026ccbcca40e9415753adedfa GIT binary patch literal 5689 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 z Date: Tue, 1 May 2012 15:13:26 -0500 Subject: [PATCH 045/695] Fixed a serious bug with the fast blur filter where it was only blurring vertically. Started adding non-maximum suppression to the Harris corner detector. --- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageFastBlurFilter.h | 2 +- framework/Source/GPUImageFastBlurFilter.m | 9 +- .../GPUImageHarrisCornerDetectionFilter.h | 6 +- .../GPUImageHarrisCornerDetectionFilter.m | 42 ++++---- .../GPUImageNonMaximumSuppressionFilter.h | 8 ++ .../GPUImageNonMaximumSuppressionFilter.m | 95 +++++++++++++++++++ framework/Source/GPUImageXYDerivativeFilter.m | 16 ++-- 9 files changed, 155 insertions(+), 32 deletions(-) create mode 100644 framework/Source/GPUImageNonMaximumSuppressionFilter.h create mode 100644 framework/Source/GPUImageNonMaximumSuppressionFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index cc99e63d9..b1e89a387 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -78,6 +78,8 @@ BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */; }; BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; }; BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; + BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; }; + BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */; }; BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; @@ -264,6 +266,8 @@ BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHarrisCornerDetectionFilter.m; path = Source/GPUImageHarrisCornerDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAlphaBlendFilter.h; path = Source/GPUImageAlphaBlendFilter.h; sourceTree = SOURCE_ROOT; }; BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAlphaBlendFilter.m; path = Source/GPUImageAlphaBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNonMaximumSuppressionFilter.h; path = Source/GPUImageNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNonMaximumSuppressionFilter.m; path = Source/GPUImageNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; @@ -597,6 +601,8 @@ BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */, + BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */, + BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -767,6 +773,7 @@ BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */, BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */, BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */, + BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -946,6 +953,7 @@ BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */, BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */, BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */, + BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 1b887c3c6..30a7a3a8c 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -78,3 +78,4 @@ #import "GPUImageXYDerivativeFilter.h" #import "GPUImageHarrisCornerDetectionFilter.h" #import "GPUImageAlphaBlendFilter.h" +#import "GPUImageNonMaximumSuppressionFilter.h" diff --git a/framework/Source/GPUImageFastBlurFilter.h b/framework/Source/GPUImageFastBlurFilter.h index 85b5e88b7..c351d7e45 100644 --- a/framework/Source/GPUImageFastBlurFilter.h +++ b/framework/Source/GPUImageFastBlurFilter.h @@ -2,7 +2,7 @@ @interface GPUImageFastBlurFilter : GPUImageTwoPassFilter { - GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, blurSizeUniform; + GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, firstBlurSizeUniform, secondBlurSizeUniform; } // The number of times to sequentially blur the incoming image. The more passes, the slower the filter. diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index dca0fceab..c7d00925b 100644 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -78,12 +78,12 @@ - (id)init; verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + firstBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; - + secondBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; - blurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; self.blurSize = 1.0; return self; @@ -123,7 +123,10 @@ - (void)setBlurSize:(CGFloat)newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(blurSizeUniform, _blurSize); + glUniform1f(firstBlurSizeUniform, _blurSize); + + [secondFilterProgram use]; + glUniform1f(secondBlurSizeUniform, _blurSize); } @end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index 66243fbbf..2435b4c57 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -4,15 +4,15 @@ @class GPUImageXYDerivativeFilter; @class GPUImageGrayscaleFilter; @class GPUImageFastBlurFilter; +@class GPUImageNonMaximumSuppressionFilter; @interface GPUImageHarrisCornerDetectionFilter : GPUImageFilterGroup { - GPUImageGrayscaleFilter *luminanceFilter; GPUImageXYDerivativeFilter *derivativeFilter; // GPUImageGaussianBlurFilter *blurFilter; - GPUImageFastBlurFilter *blurFilter; + GPUImageFastBlurFilter *preblurFilter, *blurFilter; GPUImageFilter *harrisCornerDetectionFilter; - // Non maximum suppression filter + GPUImageNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; GPUImageFilter *simpleThresholdFilter; } // A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 31a2ab8c4..7e5644040 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -4,6 +4,7 @@ #import "GPUImageXYDerivativeFilter.h" #import "GPUImageGrayscaleFilter.h" #import "GPUImageFastBlurFilter.h" +#import "GPUImageNonMaximumSuppressionFilter.h" // This is the Harris corner detector, as described in // C. Harris and M. Stephens. A Combined Corner and Edge Detector. Proc. Alvey Vision Conf., Univ. Manchester, pp. 147-151, 1988. @@ -16,7 +17,7 @@ @implementation GPUImageHarrisCornerDetectionFilter uniform sampler2D inputImageTexture; - const mediump float harrisConstant = 0.01; + const mediump float harrisConstant = 0.04; void main() { @@ -31,7 +32,8 @@ void main() // Original Harris detector // highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; - gl_FragColor = vec4(vec3(harrisIntensity * 8.0), 1.0); + gl_FragColor = vec4(vec3(harrisIntensity * 10.0), 1.0); +// gl_FragColor = vec4(derivativeElements, 1.0); } ); @@ -41,7 +43,7 @@ void main() uniform sampler2D inputImageTexture; - const lowp float threshold = 0.2; + const lowp float threshold = 0.10; void main() { @@ -50,6 +52,8 @@ void main() lowp float thresholdValue = step(threshold, intensity); gl_FragColor = vec4(thresholdValue, 0.0, 0.0, thresholdValue); +// gl_FragColor = vec4(intensity, intensity, intensity, 1.0); +// gl_FragColor = vec4(intensity, 0.0, 0.0, intensity); } ); @@ -62,43 +66,47 @@ - (id)init; { return nil; } - - // First pass: reduce to luminance - luminanceFilter = [[GPUImageGrayscaleFilter alloc] init]; - [self addFilter:luminanceFilter]; - - // Second pass: take the derivative of the luminance texture + +// preblurFilter = [[GPUImageFastBlurFilter alloc] init]; +// [self addFilter:preblurFilter]; + + // First pass: reduce to luminance and take the derivative of the luminance texture derivativeFilter = [[GPUImageXYDerivativeFilter alloc] init]; - derivativeFilter.imageWidthFactor = 256.0; - derivativeFilter.imageHeightFactor = 256.0; +// derivativeFilter.imageWidthFactor = 256.0; +// derivativeFilter.imageHeightFactor = 256.0; [self addFilter:derivativeFilter]; - // Third pass: blur the derivative + // Second pass: blur the derivative // blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; blurFilter = [[GPUImageFastBlurFilter alloc] init]; [self addFilter:blurFilter]; - // Fourth pass: apply the Harris corner detection calculation + // Third pass: apply the Harris corner detection calculation harrisCornerDetectionFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageHarrisCornerDetectionFragmentShaderString]; [self addFilter:harrisCornerDetectionFilter]; - // TODO: Non-maximum suppression filter here + // Fourth pass: apply non-maximum suppression to find the local maxima +// nonMaximumSuppressionFilter = [[GPUImageNonMaximumSuppressionFilter alloc] init]; +// [self addFilter:nonMaximumSuppressionFilter]; // Fifth pass: threshold the result simpleThresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageSimpleThresholdFragmentShaderString]; [self addFilter:simpleThresholdFilter]; - [luminanceFilter addTarget:derivativeFilter]; +// [preblurFilter addTarget:luminanceFilter]; [derivativeFilter addTarget:blurFilter]; [blurFilter addTarget:harrisCornerDetectionFilter]; +// [harrisCornerDetectionFilter addTarget:nonMaximumSuppressionFilter]; +// [nonMaximumSuppressionFilter addTarget:simpleThresholdFilter]; [harrisCornerDetectionFilter addTarget:simpleThresholdFilter]; - self.initialFilters = [NSArray arrayWithObjects:luminanceFilter, nil]; +// self.initialFilters = [NSArray arrayWithObjects:preblurFilter, nil]; + self.initialFilters = [NSArray arrayWithObjects:derivativeFilter, nil]; // self.terminalFilter = harrisCornerDetectionFilter; self.terminalFilter = simpleThresholdFilter; // self.intensity = 1.0; - self.blurSize = 1.5; + self.blurSize = 1.0; return self; } diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.h b/framework/Source/GPUImageNonMaximumSuppressionFilter.h new file mode 100644 index 000000000..1c586dcc1 --- /dev/null +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.h @@ -0,0 +1,8 @@ +#import "GPUImageTwoPassFilter.h" + +@interface GPUImageNonMaximumSuppressionFilter : GPUImageTwoPassFilter +{ + GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform; +} + +@end diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m new file mode 100644 index 000000000..2c7ab6fc7 --- /dev/null +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.m @@ -0,0 +1,95 @@ +#import "GPUImageNonMaximumSuppressionFilter.h" + +NSString *const kGPUImageNonMaximumSuppressionVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform highp float texelWidthOffset; + uniform highp float texelHeightOffset; + uniform highp float blurSize; + + varying highp vec2 centerTextureCoordinate; + varying highp vec2 oneStepNegativeTextureCoordinate; + varying highp vec2 twoStepsNegativeTextureCoordinate; + varying highp vec2 oneStepPositiveTextureCoordinate; + varying highp vec2 twoStepsPositiveTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 firstOffset = vec2(texelWidthOffset, texelHeightOffset) * 1.0; + vec2 secondOffset = vec2(texelWidthOffset, texelHeightOffset) * 2.0; + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - firstOffset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - secondOffset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + firstOffset; + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + secondOffset; + } +); + + +NSString *const kGPUImageNonMaximumSuppressionFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying highp vec2 centerTextureCoordinate; + varying highp vec2 oneStepNegativeTextureCoordinate; + varying highp vec2 twoStepsNegativeTextureCoordinate; + varying highp vec2 oneStepPositiveTextureCoordinate; + varying highp vec2 twoStepsPositiveTextureCoordinate; + + void main() + { + lowp float fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).r; + lowp float oneStepNegativeFragmentColor = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + lowp float twoStepsNegativeFragmentColor = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + lowp float oneStepPositiveFragmentColor = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + lowp float twoStepsPositiveFragmentColor = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + + lowp float maxValue = max(fragmentColor, oneStepNegativeFragmentColor); + maxValue = max(maxValue, twoStepsNegativeFragmentColor); + maxValue = max(maxValue, oneStepPositiveFragmentColor); + maxValue = max(maxValue, twoStepsPositiveFragmentColor); + + gl_FragColor = vec4(fragmentColor * step(maxValue, fragmentColor)); + } +); + +@implementation GPUImageNonMaximumSuppressionFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageNonMaximumSuppressionVertexShaderString firstStageFragmentShaderFromString:kGPUImageNonMaximumSuppressionFragmentShaderString secondStageVertexShaderFromString:kGPUImageNonMaximumSuppressionVertexShaderString secondStageFragmentShaderFromString:kGPUImageNonMaximumSuppressionFragmentShaderString])) + { + return nil; + } + + verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; + verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + + horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; + horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + + return self; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + + [secondFilterProgram use]; + glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); + glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); +} + +@end + diff --git a/framework/Source/GPUImageXYDerivativeFilter.m b/framework/Source/GPUImageXYDerivativeFilter.m index 9b18ae344..fdbcae913 100644 --- a/framework/Source/GPUImageXYDerivativeFilter.m +++ b/framework/Source/GPUImageXYDerivativeFilter.m @@ -23,23 +23,23 @@ @implementation GPUImageXYDerivativeFilter uniform sampler2D inputImageTexture; - const float harrisConstant = -0.5; - void main() { - float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; - float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; - float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; - float verticalDerivative = abs(-topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity); - float horizontalDerivative = abs(-bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity); +// float verticalDerivative = abs(-topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity); +// float horizontalDerivative = abs(-bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity); + float verticalDerivative = abs(-topIntensity + bottomIntensity); + float horizontalDerivative = abs(-leftIntensity + rightIntensity); - gl_FragColor = vec4(verticalDerivative * verticalDerivative, horizontalDerivative * horizontalDerivative, verticalDerivative * horizontalDerivative, 1.0); + gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, verticalDerivative * horizontalDerivative, 1.0); } ); From 84061527fd590d35cd3e7d2e6c4d65b7e35fe74a Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Wed, 2 May 2012 16:04:59 -0600 Subject: [PATCH 046/695] Replaced everything with a copy from the parent project Had some corruption I couldn't track down --- License.txt | 0 README.md | 0 .../BenchmarkSuite.xcodeproj/project.pbxproj | 0 .../BenchmarkSuite/41-picture-frame.png | Bin .../BenchmarkSuite/41-picture-frame@2x.png | Bin .../BenchmarkSuite/46-movie-2.png | Bin .../BenchmarkSuite/46-movie-2@2x.png | Bin .../BenchmarkSuite/86-camera.png | Bin .../BenchmarkSuite/86-camera@2x.png | Bin .../BenchmarkSuite/BenchmarkAppDelegate.h | 0 .../BenchmarkSuite/BenchmarkAppDelegate.m | 0 .../BenchmarkSuite/BenchmarkSuite-Info.plist | 0 .../BenchmarkSuite/BenchmarkSuite-Prefix.pch | 0 .../BenchmarkTableViewController.h | 0 .../BenchmarkTableViewController.m | 0 .../BenchmarkTableViewController.xib | 0 .../ImageFilteringBenchmarkController.h | 0 .../ImageFilteringBenchmarkController.m | 0 .../VideoFilteringBenchmarkController.h | 0 .../VideoFilteringBenchmarkController.m | 0 .../VideoFilteringDisplayController.h | 0 .../VideoFilteringDisplayController.m | 0 .../VideoFilteringDisplayController.xib | 0 .../BenchmarkSuite/en.lproj/InfoPlist.strings | 0 examples/BenchmarkSuite/BenchmarkSuite/main.m | 0 .../BenchmarkSuite/GlyphishIconLicense.txt | 0 .../project.pbxproj | 0 .../ColorObjectTracking-Info.plist | 0 .../ColorObjectTracking-Prefix.pch | 0 .../ColorTrackingAppDelegate.h | 0 .../ColorTrackingAppDelegate.m | 0 .../ColorTrackingViewController.h | 0 .../ColorTrackingViewController.m | 0 .../ColorObjectTracking/PositionColor.fsh | 0 .../ColorObjectTracking/Threshold.fsh | 0 .../en.lproj/InfoPlist.strings | 0 .../ColorObjectTracking/main.m | 0 .../Classes/CubeExampleAppDelegate.h | 0 .../Classes/CubeExampleAppDelegate.m | 0 .../Classes/DisplayViewController.h | 0 .../Classes/DisplayViewController.m | 0 examples/CubeExample/Classes/ES2Renderer.h | 0 examples/CubeExample/Classes/ES2Renderer.m | 0 examples/CubeExample/Classes/ESRenderer.h | 0 examples/CubeExample/CubeExample-Info.plist | 0 examples/CubeExample/CubeExample_Prefix.pch | 0 examples/CubeExample/Shaders/Shader.fsh | 0 examples/CubeExample/Shaders/Shader.vsh | 0 examples/CubeExample/main.m | 0 .../FilterShowcase.xcodeproj/project.pbxproj | 0 .../FilterShowcase/CustomFilter.fsh | 0 .../FilterShowcase/FilterShowcase-Info.plist | 0 .../FilterShowcase/FilterShowcase-Prefix.pch | 0 .../FilterShowcase/SampleConfiguration.plist | 0 .../FilterShowcase/ShowcaseAppDelegate.h | 0 .../FilterShowcase/ShowcaseAppDelegate.m | 0 .../ShowcaseFilterListController.h | 0 .../ShowcaseFilterListController.m | 0 .../ShowcaseFilterViewController.h | 0 .../ShowcaseFilterViewController.m | 0 .../ShowcaseFilterViewController.xib | 0 .../FilterShowcase/en.lproj/InfoPlist.strings | 0 examples/FilterShowcase/FilterShowcase/main.m | 0 .../FilterShowcase/FilterShowcase/mask.png | Bin .../project.pbxproj | 0 .../MultiViewAppDelegate.h | 0 .../MultiViewAppDelegate.m | 0 .../MultiViewFilterExample-Info.plist | 0 .../MultiViewFilterExample-Prefix.pch | 0 .../MultiViewViewController.h | 0 .../MultiViewViewController.m | 0 .../MultiViewFilterExample/Shader1.fsh | 0 .../MultiViewFilterExample/Shader2.fsh | 0 .../en.lproj/InfoPlist.strings | 0 .../MultiViewFilterExample/main.m | 0 .../project.pbxproj | 0 .../SimpleImageFilter/Lambeau.jpg | Bin .../SimpleImageAppDelegate.h | 0 .../SimpleImageAppDelegate.m | 0 .../SimpleImageFilter-Info.plist | 0 .../SimpleImageFilter-Prefix.pch | 0 .../SimpleImageViewController.h | 0 .../SimpleImageViewController.m | 0 .../SimpleImageFilter/WID-small.jpg | Bin .../en.lproj/InfoPlist.strings | 0 .../SimpleImageFilter/main.m | 0 .../project.pbxproj | 0 .../SimplePhotoFilter/PhotoAppDelegate.h | 0 .../SimplePhotoFilter/PhotoAppDelegate.m | 0 .../SimplePhotoFilter/PhotoViewController.h | 0 .../SimplePhotoFilter/PhotoViewController.m | 0 .../SimplePhotoFilter-Info.plist | 0 .../SimplePhotoFilter-Prefix.pch | 0 .../en.lproj/InfoPlist.strings | 0 .../SimplePhotoFilter/main.m | 0 .../project.pbxproj | 0 .../SimpleVideoFileFilter-Info.plist | 0 .../SimpleVideoFileFilter-Prefix.pch | 0 .../SimpleVideoFileFilterAppDelegate.h | 0 .../SimpleVideoFileFilterAppDelegate.m | 0 .../SimpleVideoFileFilterViewController.h | 0 .../SimpleVideoFileFilterViewController.m | 0 .../SimpleVideoFileFilterViewController.xib | 0 .../en.lproj/InfoPlist.strings | 0 .../SimpleVideoFileFilter/main.m | 0 .../project.pbxproj | 0 .../SimpleVideoFilter-Info.plist | 0 .../SimpleVideoFilter-Prefix.pch | 0 .../SimpleVideoFilterAppDelegate.h | 0 .../SimpleVideoFilterAppDelegate.m | 0 .../SimpleVideoFilterViewController.h | 0 .../SimpleVideoFilterViewController.m | 0 .../SimpleVideoFilterViewController.xib | 0 .../en.lproj/InfoPlist.strings | 0 .../SimpleVideoFilter/main.m | 0 framework/GPUImage.xcodeproj/project.pbxproj | 34 +---- .../GPUImageTests/GPUImageTests-Info.plist | 0 framework/GPUImageTests/GPUImageTests.h | 0 framework/GPUImageTests/GPUImageTests.m | 0 .../GPUImageTests/en.lproj/InfoPlist.strings | 0 framework/Source/GLProgram.h | 0 framework/Source/GLProgram.m | 0 framework/Source/GPUImage-Prefix.pch | 0 framework/Source/GPUImage.h | 1 + .../Source/GPUImage3x3ConvolutionFilter.h | 0 .../Source/GPUImage3x3ConvolutionFilter.m | 0 .../Source/GPUImageAdaptiveThresholdFilter.h | 0 .../Source/GPUImageAdaptiveThresholdFilter.m | 0 framework/Source/GPUImageAlphaBlendFilter.h | 0 framework/Source/GPUImageAlphaBlendFilter.m | 0 framework/Source/GPUImageBoxBlurFilter.h | 0 framework/Source/GPUImageBoxBlurFilter.m | 0 framework/Source/GPUImageBrightnessFilter.h | 0 framework/Source/GPUImageBrightnessFilter.m | 0 .../Source/GPUImageBulgeDistortionFilter.h | 0 .../Source/GPUImageBulgeDistortionFilter.m | 0 .../Source/GPUImageCGAColorspaceFilter.h | 0 .../Source/GPUImageCGAColorspaceFilter.m | 0 .../Source/GPUImageCannyEdgeDetectionFilter.h | 0 .../Source/GPUImageCannyEdgeDetectionFilter.m | 0 .../Source/GPUImageChromaKeyBlendFilter.h | 0 .../Source/GPUImageChromaKeyBlendFilter.m | 0 .../Source/GPUImageColorBurnBlendFilter.h | 0 .../Source/GPUImageColorBurnBlendFilter.m | 0 .../Source/GPUImageColorDodgeBlendFilter.h | 0 .../Source/GPUImageColorDodgeBlendFilter.m | 0 framework/Source/GPUImageColorInvertFilter.h | 0 framework/Source/GPUImageColorInvertFilter.m | 0 framework/Source/GPUImageColorMatrixFilter.h | 0 framework/Source/GPUImageColorMatrixFilter.m | 0 framework/Source/GPUImageContrastFilter.h | 0 framework/Source/GPUImageContrastFilter.m | 0 framework/Source/GPUImageCropFilter.h | 0 framework/Source/GPUImageCropFilter.m | 0 framework/Source/GPUImageCrosshatchFilter.h | 0 framework/Source/GPUImageCrosshatchFilter.m | 0 framework/Source/GPUImageDarkenBlendFilter.h | 0 framework/Source/GPUImageDarkenBlendFilter.m | 0 .../Source/GPUImageDifferenceBlendFilter.h | 0 .../Source/GPUImageDifferenceBlendFilter.m | 0 .../Source/GPUImageDissolveBlendFilter.h | 0 .../Source/GPUImageDissolveBlendFilter.m | 0 framework/Source/GPUImageEmbossFilter.h | 0 framework/Source/GPUImageEmbossFilter.m | 0 .../Source/GPUImageExclusionBlendFilter.h | 0 .../Source/GPUImageExclusionBlendFilter.m | 0 framework/Source/GPUImageExposureFilter.h | 0 framework/Source/GPUImageExposureFilter.m | 0 framework/Source/GPUImageFastBlurFilter.h | 2 +- framework/Source/GPUImageFastBlurFilter.m | 9 +- framework/Source/GPUImageFilter.h | 0 framework/Source/GPUImageFilter.m | 0 framework/Source/GPUImageFilterGroup.h | 0 framework/Source/GPUImageFilterGroup.m | 0 framework/Source/GPUImageFilterPipeline.h | 0 framework/Source/GPUImageFilterPipeline.m | 0 framework/Source/GPUImageGammaFilter.h | 0 framework/Source/GPUImageGammaFilter.m | 0 framework/Source/GPUImageGaussianBlurFilter.h | 0 framework/Source/GPUImageGaussianBlurFilter.m | 0 .../GPUImageGaussianSelectiveBlurFilter.h | 0 .../GPUImageGaussianSelectiveBlurFilter.m | 0 framework/Source/GPUImageGrayscaleFilter.h | 0 framework/Source/GPUImageGrayscaleFilter.m | 0 .../Source/GPUImageHardLightBlendFilter.h | 0 .../Source/GPUImageHardLightBlendFilter.m | 0 .../GPUImageHarrisCornerDetectionFilter.h | 6 +- .../GPUImageHarrisCornerDetectionFilter.m | 42 +++--- framework/Source/GPUImageHazeFilter.h | 0 framework/Source/GPUImageHazeFilter.m | 0 framework/Source/GPUImageHistogramFilter.h | 0 framework/Source/GPUImageHistogramFilter.m | 0 framework/Source/GPUImageHistogramGenerator.h | 0 framework/Source/GPUImageHistogramGenerator.m | 0 framework/Source/GPUImageKuwaharaFilter.h | 0 framework/Source/GPUImageKuwaharaFilter.m | 0 framework/Source/GPUImageLightenBlendFilter.h | 0 framework/Source/GPUImageLightenBlendFilter.m | 0 .../Source/GPUImageLuminanceThresholdFilter.h | 0 .../Source/GPUImageLuminanceThresholdFilter.m | 0 framework/Source/GPUImageMaskFilter.h | 0 framework/Source/GPUImageMaskFilter.m | 0 framework/Source/GPUImageMosaicFilter.h | 26 ---- framework/Source/GPUImageMosaicFilter.m | 139 ------------------ framework/Source/GPUImageMovie.h | 0 framework/Source/GPUImageMovie.m | 0 framework/Source/GPUImageMovieWriter.h | 0 framework/Source/GPUImageMovieWriter.m | 0 .../Source/GPUImageMultiplyBlendFilter.h | 0 .../Source/GPUImageMultiplyBlendFilter.m | 0 .../GPUImageNonMaximumSuppressionFilter.h | 8 + .../GPUImageNonMaximumSuppressionFilter.m | 95 ++++++++++++ framework/Source/GPUImageOpenGLESContext.h | 0 framework/Source/GPUImageOpenGLESContext.m | 0 framework/Source/GPUImageOutput.h | 0 framework/Source/GPUImageOutput.m | 0 framework/Source/GPUImageOverlayBlendFilter.h | 0 framework/Source/GPUImageOverlayBlendFilter.m | 0 framework/Source/GPUImagePicture.h | 0 framework/Source/GPUImagePicture.m | 0 .../Source/GPUImagePinchDistortionFilter.h | 0 .../Source/GPUImagePinchDistortionFilter.m | 0 framework/Source/GPUImagePixellateFilter.h | 0 framework/Source/GPUImagePixellateFilter.m | 0 .../Source/GPUImagePolarPixellateFilter.h | 0 .../Source/GPUImagePolarPixellateFilter.m | 0 framework/Source/GPUImagePosterizeFilter.h | 0 framework/Source/GPUImagePosterizeFilter.m | 0 .../GPUImagePrewittEdgeDetectionFilter.h | 0 .../GPUImagePrewittEdgeDetectionFilter.m | 0 framework/Source/GPUImageRawData.h | 0 framework/Source/GPUImageRawData.m | 0 framework/Source/GPUImageRotationFilter.h | 0 framework/Source/GPUImageRotationFilter.m | 0 framework/Source/GPUImageSaturationFilter.h | 0 framework/Source/GPUImageSaturationFilter.m | 0 framework/Source/GPUImageScreenBlendFilter.h | 0 framework/Source/GPUImageScreenBlendFilter.m | 0 framework/Source/GPUImageSepiaFilter.h | 0 framework/Source/GPUImageSepiaFilter.m | 0 framework/Source/GPUImageSharpenFilter.h | 0 framework/Source/GPUImageSharpenFilter.m | 0 framework/Source/GPUImageSketchFilter.h | 0 framework/Source/GPUImageSketchFilter.m | 0 framework/Source/GPUImageSmoothToonFilter.h | 0 framework/Source/GPUImageSmoothToonFilter.m | 0 .../Source/GPUImageSobelEdgeDetectionFilter.h | 0 .../Source/GPUImageSobelEdgeDetectionFilter.m | 0 .../Source/GPUImageSoftLightBlendFilter.h | 0 .../Source/GPUImageSoftLightBlendFilter.m | 0 framework/Source/GPUImageStillCamera.h | 0 framework/Source/GPUImageStillCamera.m | 0 .../Source/GPUImageStretchDistortionFilter.h | 0 .../Source/GPUImageStretchDistortionFilter.m | 0 .../Source/GPUImageSubtractBlendFilter.h | 0 .../Source/GPUImageSubtractBlendFilter.m | 0 framework/Source/GPUImageSwirlFilter.h | 0 framework/Source/GPUImageSwirlFilter.m | 0 framework/Source/GPUImageTextureInput.h | 0 framework/Source/GPUImageTextureInput.m | 0 framework/Source/GPUImageTextureOutput.h | 0 framework/Source/GPUImageTextureOutput.m | 0 .../Source/GPUImageThresholdEdgeDetection.h | 0 .../Source/GPUImageThresholdEdgeDetection.m | 0 framework/Source/GPUImageTiltShiftFilter.h | 0 framework/Source/GPUImageTiltShiftFilter.m | 0 framework/Source/GPUImageToonFilter.h | 0 framework/Source/GPUImageToonFilter.m | 0 framework/Source/GPUImageTransformFilter.h | 0 framework/Source/GPUImageTransformFilter.m | 0 framework/Source/GPUImageTwoPassFilter.h | 0 framework/Source/GPUImageTwoPassFilter.m | 0 framework/Source/GPUImageUnsharpMaskFilter.h | 0 framework/Source/GPUImageUnsharpMaskFilter.m | 0 framework/Source/GPUImageVideoCamera.h | 0 framework/Source/GPUImageVideoCamera.m | 0 framework/Source/GPUImageView.h | 0 framework/Source/GPUImageView.m | 0 framework/Source/GPUImageVignetteFilter.h | 0 framework/Source/GPUImageVignetteFilter.m | 0 framework/Source/GPUImageXYDerivativeFilter.h | 0 framework/Source/GPUImageXYDerivativeFilter.m | 16 +- framework/Source/tilesets/circles.png | Bin 24328 -> 0 bytes framework/Source/tilesets/photo 4.JPG | Bin 74865 -> 0 bytes framework/Source/tilesets/squares.png | Bin 5689 -> 0 bytes 285 files changed, 155 insertions(+), 223 deletions(-) mode change 100644 => 100755 License.txt mode change 100644 => 100755 README.md mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame@2x.png mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/46-movie-2.png mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/46-movie-2@2x.png mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/86-camera.png mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/86-camera@2x.png mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings mode change 100644 => 100755 examples/BenchmarkSuite/BenchmarkSuite/main.m mode change 100644 => 100755 examples/BenchmarkSuite/GlyphishIconLicense.txt mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Prefix.pch mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.h mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.m mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/PositionColor.fsh mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/Threshold.fsh mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings mode change 100644 => 100755 examples/ColorObjectTracking/ColorObjectTracking/main.m mode change 100644 => 100755 examples/CubeExample/Classes/CubeExampleAppDelegate.h mode change 100644 => 100755 examples/CubeExample/Classes/CubeExampleAppDelegate.m mode change 100644 => 100755 examples/CubeExample/Classes/DisplayViewController.h mode change 100644 => 100755 examples/CubeExample/Classes/DisplayViewController.m mode change 100644 => 100755 examples/CubeExample/Classes/ES2Renderer.h mode change 100644 => 100755 examples/CubeExample/Classes/ES2Renderer.m mode change 100644 => 100755 examples/CubeExample/Classes/ESRenderer.h mode change 100644 => 100755 examples/CubeExample/CubeExample-Info.plist mode change 100644 => 100755 examples/CubeExample/CubeExample_Prefix.pch mode change 100644 => 100755 examples/CubeExample/Shaders/Shader.fsh mode change 100644 => 100755 examples/CubeExample/Shaders/Shader.vsh mode change 100644 => 100755 examples/CubeExample/main.m mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/CustomFilter.fsh mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/main.m mode change 100644 => 100755 examples/FilterShowcase/FilterShowcase/mask.png mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.h mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.h mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings mode change 100644 => 100755 examples/MultiViewFilterExample/MultiViewFilterExample/main.m mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.h mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.m mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Prefix.pch mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/WID-small.jpg mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/en.lproj/InfoPlist.strings mode change 100644 => 100755 examples/SimpleImageFilter/SimpleImageFilter/main.m mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.h mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.m mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings mode change 100644 => 100755 examples/SimplePhotoFilter/SimplePhotoFilter/main.m mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Prefix.pch mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.h mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.m mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/en.lproj/InfoPlist.strings mode change 100644 => 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/main.m mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Prefix.pch mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.h mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings mode change 100644 => 100755 examples/SimpleVideoFilter/SimpleVideoFilter/main.m mode change 100644 => 100755 framework/GPUImage.xcodeproj/project.pbxproj mode change 100644 => 100755 framework/GPUImageTests/GPUImageTests-Info.plist mode change 100644 => 100755 framework/GPUImageTests/GPUImageTests.h mode change 100644 => 100755 framework/GPUImageTests/GPUImageTests.m mode change 100644 => 100755 framework/GPUImageTests/en.lproj/InfoPlist.strings mode change 100644 => 100755 framework/Source/GLProgram.h mode change 100644 => 100755 framework/Source/GLProgram.m mode change 100644 => 100755 framework/Source/GPUImage-Prefix.pch mode change 100644 => 100755 framework/Source/GPUImage.h mode change 100644 => 100755 framework/Source/GPUImage3x3ConvolutionFilter.h mode change 100644 => 100755 framework/Source/GPUImage3x3ConvolutionFilter.m mode change 100644 => 100755 framework/Source/GPUImageAdaptiveThresholdFilter.h mode change 100644 => 100755 framework/Source/GPUImageAdaptiveThresholdFilter.m mode change 100644 => 100755 framework/Source/GPUImageAlphaBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageAlphaBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageBoxBlurFilter.h mode change 100644 => 100755 framework/Source/GPUImageBoxBlurFilter.m mode change 100644 => 100755 framework/Source/GPUImageBrightnessFilter.h mode change 100644 => 100755 framework/Source/GPUImageBrightnessFilter.m mode change 100644 => 100755 framework/Source/GPUImageBulgeDistortionFilter.h mode change 100644 => 100755 framework/Source/GPUImageBulgeDistortionFilter.m mode change 100644 => 100755 framework/Source/GPUImageCGAColorspaceFilter.h mode change 100644 => 100755 framework/Source/GPUImageCGAColorspaceFilter.m mode change 100644 => 100755 framework/Source/GPUImageCannyEdgeDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUImageCannyEdgeDetectionFilter.m mode change 100644 => 100755 framework/Source/GPUImageChromaKeyBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageChromaKeyBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageColorBurnBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageColorBurnBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageColorDodgeBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageColorDodgeBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageColorInvertFilter.h mode change 100644 => 100755 framework/Source/GPUImageColorInvertFilter.m mode change 100644 => 100755 framework/Source/GPUImageColorMatrixFilter.h mode change 100644 => 100755 framework/Source/GPUImageColorMatrixFilter.m mode change 100644 => 100755 framework/Source/GPUImageContrastFilter.h mode change 100644 => 100755 framework/Source/GPUImageContrastFilter.m mode change 100644 => 100755 framework/Source/GPUImageCropFilter.h mode change 100644 => 100755 framework/Source/GPUImageCropFilter.m mode change 100644 => 100755 framework/Source/GPUImageCrosshatchFilter.h mode change 100644 => 100755 framework/Source/GPUImageCrosshatchFilter.m mode change 100644 => 100755 framework/Source/GPUImageDarkenBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageDarkenBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageDifferenceBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageDifferenceBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageDissolveBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageDissolveBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageEmbossFilter.h mode change 100644 => 100755 framework/Source/GPUImageEmbossFilter.m mode change 100644 => 100755 framework/Source/GPUImageExclusionBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageExclusionBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageExposureFilter.h mode change 100644 => 100755 framework/Source/GPUImageExposureFilter.m mode change 100644 => 100755 framework/Source/GPUImageFastBlurFilter.h mode change 100644 => 100755 framework/Source/GPUImageFastBlurFilter.m mode change 100644 => 100755 framework/Source/GPUImageFilter.h mode change 100644 => 100755 framework/Source/GPUImageFilter.m mode change 100644 => 100755 framework/Source/GPUImageFilterGroup.h mode change 100644 => 100755 framework/Source/GPUImageFilterGroup.m mode change 100644 => 100755 framework/Source/GPUImageFilterPipeline.h mode change 100644 => 100755 framework/Source/GPUImageFilterPipeline.m mode change 100644 => 100755 framework/Source/GPUImageGammaFilter.h mode change 100644 => 100755 framework/Source/GPUImageGammaFilter.m mode change 100644 => 100755 framework/Source/GPUImageGaussianBlurFilter.h mode change 100644 => 100755 framework/Source/GPUImageGaussianBlurFilter.m mode change 100644 => 100755 framework/Source/GPUImageGaussianSelectiveBlurFilter.h mode change 100644 => 100755 framework/Source/GPUImageGaussianSelectiveBlurFilter.m mode change 100644 => 100755 framework/Source/GPUImageGrayscaleFilter.h mode change 100644 => 100755 framework/Source/GPUImageGrayscaleFilter.m mode change 100644 => 100755 framework/Source/GPUImageHardLightBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageHardLightBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageHarrisCornerDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUImageHarrisCornerDetectionFilter.m mode change 100644 => 100755 framework/Source/GPUImageHazeFilter.h mode change 100644 => 100755 framework/Source/GPUImageHazeFilter.m mode change 100644 => 100755 framework/Source/GPUImageHistogramFilter.h mode change 100644 => 100755 framework/Source/GPUImageHistogramFilter.m mode change 100644 => 100755 framework/Source/GPUImageHistogramGenerator.h mode change 100644 => 100755 framework/Source/GPUImageHistogramGenerator.m mode change 100644 => 100755 framework/Source/GPUImageKuwaharaFilter.h mode change 100644 => 100755 framework/Source/GPUImageKuwaharaFilter.m mode change 100644 => 100755 framework/Source/GPUImageLightenBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageLightenBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageLuminanceThresholdFilter.h mode change 100644 => 100755 framework/Source/GPUImageLuminanceThresholdFilter.m mode change 100644 => 100755 framework/Source/GPUImageMaskFilter.h mode change 100644 => 100755 framework/Source/GPUImageMaskFilter.m delete mode 100644 framework/Source/GPUImageMosaicFilter.h delete mode 100644 framework/Source/GPUImageMosaicFilter.m mode change 100644 => 100755 framework/Source/GPUImageMovie.h mode change 100644 => 100755 framework/Source/GPUImageMovie.m mode change 100644 => 100755 framework/Source/GPUImageMovieWriter.h mode change 100644 => 100755 framework/Source/GPUImageMovieWriter.m mode change 100644 => 100755 framework/Source/GPUImageMultiplyBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageMultiplyBlendFilter.m create mode 100755 framework/Source/GPUImageNonMaximumSuppressionFilter.h create mode 100755 framework/Source/GPUImageNonMaximumSuppressionFilter.m mode change 100644 => 100755 framework/Source/GPUImageOpenGLESContext.h mode change 100644 => 100755 framework/Source/GPUImageOpenGLESContext.m mode change 100644 => 100755 framework/Source/GPUImageOutput.h mode change 100644 => 100755 framework/Source/GPUImageOutput.m mode change 100644 => 100755 framework/Source/GPUImageOverlayBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageOverlayBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImagePicture.h mode change 100644 => 100755 framework/Source/GPUImagePicture.m mode change 100644 => 100755 framework/Source/GPUImagePinchDistortionFilter.h mode change 100644 => 100755 framework/Source/GPUImagePinchDistortionFilter.m mode change 100644 => 100755 framework/Source/GPUImagePixellateFilter.h mode change 100644 => 100755 framework/Source/GPUImagePixellateFilter.m mode change 100644 => 100755 framework/Source/GPUImagePolarPixellateFilter.h mode change 100644 => 100755 framework/Source/GPUImagePolarPixellateFilter.m mode change 100644 => 100755 framework/Source/GPUImagePosterizeFilter.h mode change 100644 => 100755 framework/Source/GPUImagePosterizeFilter.m mode change 100644 => 100755 framework/Source/GPUImagePrewittEdgeDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUImagePrewittEdgeDetectionFilter.m mode change 100644 => 100755 framework/Source/GPUImageRawData.h mode change 100644 => 100755 framework/Source/GPUImageRawData.m mode change 100644 => 100755 framework/Source/GPUImageRotationFilter.h mode change 100644 => 100755 framework/Source/GPUImageRotationFilter.m mode change 100644 => 100755 framework/Source/GPUImageSaturationFilter.h mode change 100644 => 100755 framework/Source/GPUImageSaturationFilter.m mode change 100644 => 100755 framework/Source/GPUImageScreenBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageScreenBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageSepiaFilter.h mode change 100644 => 100755 framework/Source/GPUImageSepiaFilter.m mode change 100644 => 100755 framework/Source/GPUImageSharpenFilter.h mode change 100644 => 100755 framework/Source/GPUImageSharpenFilter.m mode change 100644 => 100755 framework/Source/GPUImageSketchFilter.h mode change 100644 => 100755 framework/Source/GPUImageSketchFilter.m mode change 100644 => 100755 framework/Source/GPUImageSmoothToonFilter.h mode change 100644 => 100755 framework/Source/GPUImageSmoothToonFilter.m mode change 100644 => 100755 framework/Source/GPUImageSobelEdgeDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUImageSobelEdgeDetectionFilter.m mode change 100644 => 100755 framework/Source/GPUImageSoftLightBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageSoftLightBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageStillCamera.h mode change 100644 => 100755 framework/Source/GPUImageStillCamera.m mode change 100644 => 100755 framework/Source/GPUImageStretchDistortionFilter.h mode change 100644 => 100755 framework/Source/GPUImageStretchDistortionFilter.m mode change 100644 => 100755 framework/Source/GPUImageSubtractBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageSubtractBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageSwirlFilter.h mode change 100644 => 100755 framework/Source/GPUImageSwirlFilter.m mode change 100644 => 100755 framework/Source/GPUImageTextureInput.h mode change 100644 => 100755 framework/Source/GPUImageTextureInput.m mode change 100644 => 100755 framework/Source/GPUImageTextureOutput.h mode change 100644 => 100755 framework/Source/GPUImageTextureOutput.m mode change 100644 => 100755 framework/Source/GPUImageThresholdEdgeDetection.h mode change 100644 => 100755 framework/Source/GPUImageThresholdEdgeDetection.m mode change 100644 => 100755 framework/Source/GPUImageTiltShiftFilter.h mode change 100644 => 100755 framework/Source/GPUImageTiltShiftFilter.m mode change 100644 => 100755 framework/Source/GPUImageToonFilter.h mode change 100644 => 100755 framework/Source/GPUImageToonFilter.m mode change 100644 => 100755 framework/Source/GPUImageTransformFilter.h mode change 100644 => 100755 framework/Source/GPUImageTransformFilter.m mode change 100644 => 100755 framework/Source/GPUImageTwoPassFilter.h mode change 100644 => 100755 framework/Source/GPUImageTwoPassFilter.m mode change 100644 => 100755 framework/Source/GPUImageUnsharpMaskFilter.h mode change 100644 => 100755 framework/Source/GPUImageUnsharpMaskFilter.m mode change 100644 => 100755 framework/Source/GPUImageVideoCamera.h mode change 100644 => 100755 framework/Source/GPUImageVideoCamera.m mode change 100644 => 100755 framework/Source/GPUImageView.h mode change 100644 => 100755 framework/Source/GPUImageView.m mode change 100644 => 100755 framework/Source/GPUImageVignetteFilter.h mode change 100644 => 100755 framework/Source/GPUImageVignetteFilter.m mode change 100644 => 100755 framework/Source/GPUImageXYDerivativeFilter.h mode change 100644 => 100755 framework/Source/GPUImageXYDerivativeFilter.m delete mode 100644 framework/Source/tilesets/circles.png delete mode 100644 framework/Source/tilesets/photo 4.JPG delete mode 100644 framework/Source/tilesets/squares.png diff --git a/License.txt b/License.txt old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj b/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png b/examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame@2x.png b/examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame@2x.png old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/46-movie-2.png b/examples/BenchmarkSuite/BenchmarkSuite/46-movie-2.png old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/46-movie-2@2x.png b/examples/BenchmarkSuite/BenchmarkSuite/46-movie-2@2x.png old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/86-camera.png b/examples/BenchmarkSuite/BenchmarkSuite/86-camera.png old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/86-camera@2x.png b/examples/BenchmarkSuite/BenchmarkSuite/86-camera@2x.png old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h b/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m b/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h b/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m b/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h b/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m b/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib b/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings b/examples/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/BenchmarkSuite/main.m b/examples/BenchmarkSuite/BenchmarkSuite/main.m old mode 100644 new mode 100755 diff --git a/examples/BenchmarkSuite/GlyphishIconLicense.txt b/examples/BenchmarkSuite/GlyphishIconLicense.txt old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj b/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist b/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Prefix.pch b/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.h b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/PositionColor.fsh b/examples/ColorObjectTracking/ColorObjectTracking/PositionColor.fsh old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/Threshold.fsh b/examples/ColorObjectTracking/ColorObjectTracking/Threshold.fsh old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings b/examples/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/examples/ColorObjectTracking/ColorObjectTracking/main.m b/examples/ColorObjectTracking/ColorObjectTracking/main.m old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Classes/CubeExampleAppDelegate.h b/examples/CubeExample/Classes/CubeExampleAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Classes/CubeExampleAppDelegate.m b/examples/CubeExample/Classes/CubeExampleAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Classes/DisplayViewController.h b/examples/CubeExample/Classes/DisplayViewController.h old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Classes/DisplayViewController.m b/examples/CubeExample/Classes/DisplayViewController.m old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Classes/ES2Renderer.h b/examples/CubeExample/Classes/ES2Renderer.h old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Classes/ES2Renderer.m b/examples/CubeExample/Classes/ES2Renderer.m old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Classes/ESRenderer.h b/examples/CubeExample/Classes/ESRenderer.h old mode 100644 new mode 100755 diff --git a/examples/CubeExample/CubeExample-Info.plist b/examples/CubeExample/CubeExample-Info.plist old mode 100644 new mode 100755 diff --git a/examples/CubeExample/CubeExample_Prefix.pch b/examples/CubeExample/CubeExample_Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Shaders/Shader.fsh b/examples/CubeExample/Shaders/Shader.fsh old mode 100644 new mode 100755 diff --git a/examples/CubeExample/Shaders/Shader.vsh b/examples/CubeExample/Shaders/Shader.vsh old mode 100644 new mode 100755 diff --git a/examples/CubeExample/main.m b/examples/CubeExample/main.m old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh b/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist b/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch b/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist b/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h b/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m b/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings b/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/main.m b/examples/FilterShowcase/FilterShowcase/main.m old mode 100644 new mode 100755 diff --git a/examples/FilterShowcase/FilterShowcase/mask.png b/examples/FilterShowcase/FilterShowcase/mask.png old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.h b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.h b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.h old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh b/examples/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh b/examples/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings b/examples/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/main.m b/examples/MultiViewFilterExample/MultiViewFilterExample/main.m old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg b/examples/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.h b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Prefix.pch b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/WID-small.jpg b/examples/SimpleImageFilter/SimpleImageFilter/WID-small.jpg old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/en.lproj/InfoPlist.strings b/examples/SimpleImageFilter/SimpleImageFilter/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/examples/SimpleImageFilter/SimpleImageFilter/main.m b/examples/SimpleImageFilter/SimpleImageFilter/main.m old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.h b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist b/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch b/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings b/examples/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/main.m b/examples/SimplePhotoFilter/SimplePhotoFilter/main.m old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Prefix.pch b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.h b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/en.lproj/InfoPlist.strings b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/main.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/main.m old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj b/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Prefix.pch b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Prefix.pch old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.h b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.h old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings b/examples/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/main.m b/examples/SimpleVideoFilter/SimpleVideoFilter/main.m old mode 100644 new mode 100755 diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj old mode 100644 new mode 100755 index ac57eced0..b1e89a387 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -78,6 +78,8 @@ BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */; }; BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; }; BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; + BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; }; + BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */; }; BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; @@ -176,11 +178,6 @@ BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */; }; BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; - F2C19D6E154FC53A00857A72 /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2C19D6C154FC53A00857A72 /* GPUImageMosaicFilter.h */; }; - F2C19D6F154FC53A00857A72 /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2C19D6D154FC53A00857A72 /* GPUImageMosaicFilter.m */; }; - F2C19D74154FC55000857A72 /* squares.png in Resources */ = {isa = PBXBuildFile; fileRef = F2C19D71154FC55000857A72 /* squares.png */; }; - F2C19D75154FC55000857A72 /* circles.png in Resources */ = {isa = PBXBuildFile; fileRef = F2C19D72154FC55000857A72 /* circles.png */; }; - F2C19D76154FC55000857A72 /* photo 4.JPG in Resources */ = {isa = PBXBuildFile; fileRef = F2C19D73154FC55000857A72 /* photo 4.JPG */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -269,6 +266,8 @@ BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHarrisCornerDetectionFilter.m; path = Source/GPUImageHarrisCornerDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAlphaBlendFilter.h; path = Source/GPUImageAlphaBlendFilter.h; sourceTree = SOURCE_ROOT; }; BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAlphaBlendFilter.m; path = Source/GPUImageAlphaBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNonMaximumSuppressionFilter.h; path = Source/GPUImageNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNonMaximumSuppressionFilter.m; path = Source/GPUImageNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; @@ -366,11 +365,6 @@ BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetection.m; path = Source/GPUImageThresholdEdgeDetection.m; sourceTree = SOURCE_ROOT; }; BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSmoothToonFilter.h; path = Source/GPUImageSmoothToonFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; - F2C19D6C154FC53A00857A72 /* GPUImageMosaicFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMosaicFilter.h; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/GPUImageMosaicFilter.h"; sourceTree = ""; }; - F2C19D6D154FC53A00857A72 /* GPUImageMosaicFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMosaicFilter.m; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/GPUImageMosaicFilter.m"; sourceTree = ""; }; - F2C19D71154FC55000857A72 /* squares.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = squares.png; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/squares.png"; sourceTree = ""; }; - F2C19D72154FC55000857A72 /* circles.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = circles.png; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/circles.png"; sourceTree = ""; }; - F2C19D73154FC55000857A72 /* photo 4.JPG */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = "photo 4.JPG"; path = "../../../../../Programming/iPhone/Face Esplode/Face Esplode/photo 4.JPG"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -607,8 +601,8 @@ BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */, - F2C19D6C154FC53A00857A72 /* GPUImageMosaicFilter.h */, - F2C19D6D154FC53A00857A72 /* GPUImageMosaicFilter.m */, + BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */, + BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -650,9 +644,6 @@ BCF1A33914DDB1EC00852800 /* GPUImage */ = { isa = PBXGroup; children = ( - F2C19D71154FC55000857A72 /* squares.png */, - F2C19D72154FC55000857A72 /* circles.png */, - F2C19D73154FC55000857A72 /* photo 4.JPG */, BC245DBF14DDBCF5009FE7EB /* GPUImage.h */, BCB5E79214E3275100701302 /* GLProgram.h */, BCB5E79314E3275200701302 /* GLProgram.m */, @@ -780,12 +771,9 @@ BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */, BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */, BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */, -<<<<<<< HEAD - F2C19D6E154FC53A00857A72 /* GPUImageMosaicFilter.h in Headers */, -======= BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */, BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */, ->>>>>>> upstream/master + BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -861,9 +849,6 @@ buildActionMask = 2147483647; files = ( BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */, - F2C19D74154FC55000857A72 /* squares.png in Resources */, - F2C19D75154FC55000857A72 /* circles.png in Resources */, - F2C19D76154FC55000857A72 /* photo 4.JPG in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -966,12 +951,9 @@ BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */, BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */, BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */, -<<<<<<< HEAD - F2C19D6F154FC53A00857A72 /* GPUImageMosaicFilter.m in Sources */, -======= BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */, BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */, ->>>>>>> upstream/master + BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/GPUImageTests/GPUImageTests-Info.plist b/framework/GPUImageTests/GPUImageTests-Info.plist old mode 100644 new mode 100755 diff --git a/framework/GPUImageTests/GPUImageTests.h b/framework/GPUImageTests/GPUImageTests.h old mode 100644 new mode 100755 diff --git a/framework/GPUImageTests/GPUImageTests.m b/framework/GPUImageTests/GPUImageTests.m old mode 100644 new mode 100755 diff --git a/framework/GPUImageTests/en.lproj/InfoPlist.strings b/framework/GPUImageTests/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/framework/Source/GLProgram.h b/framework/Source/GLProgram.h old mode 100644 new mode 100755 diff --git a/framework/Source/GLProgram.m b/framework/Source/GLProgram.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImage-Prefix.pch b/framework/Source/GPUImage-Prefix.pch old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h old mode 100644 new mode 100755 index 1b887c3c6..30a7a3a8c --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -78,3 +78,4 @@ #import "GPUImageXYDerivativeFilter.h" #import "GPUImageHarrisCornerDetectionFilter.h" #import "GPUImageAlphaBlendFilter.h" +#import "GPUImageNonMaximumSuppressionFilter.h" diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.h b/framework/Source/GPUImage3x3ConvolutionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.h b/framework/Source/GPUImageAdaptiveThresholdFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.m b/framework/Source/GPUImageAdaptiveThresholdFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAlphaBlendFilter.h b/framework/Source/GPUImageAlphaBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAlphaBlendFilter.m b/framework/Source/GPUImageAlphaBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBoxBlurFilter.h b/framework/Source/GPUImageBoxBlurFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBrightnessFilter.h b/framework/Source/GPUImageBrightnessFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBrightnessFilter.m b/framework/Source/GPUImageBrightnessFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBulgeDistortionFilter.h b/framework/Source/GPUImageBulgeDistortionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCGAColorspaceFilter.h b/framework/Source/GPUImageCGAColorspaceFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCGAColorspaceFilter.m b/framework/Source/GPUImageCGAColorspaceFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.m b/framework/Source/GPUImageCannyEdgeDetectionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.h b/framework/Source/GPUImageChromaKeyBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorBurnBlendFilter.h b/framework/Source/GPUImageColorBurnBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorBurnBlendFilter.m b/framework/Source/GPUImageColorBurnBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorDodgeBlendFilter.h b/framework/Source/GPUImageColorDodgeBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorDodgeBlendFilter.m b/framework/Source/GPUImageColorDodgeBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorInvertFilter.h b/framework/Source/GPUImageColorInvertFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorInvertFilter.m b/framework/Source/GPUImageColorInvertFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorMatrixFilter.h b/framework/Source/GPUImageColorMatrixFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorMatrixFilter.m b/framework/Source/GPUImageColorMatrixFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageContrastFilter.h b/framework/Source/GPUImageContrastFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageContrastFilter.m b/framework/Source/GPUImageContrastFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCropFilter.h b/framework/Source/GPUImageCropFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCrosshatchFilter.h b/framework/Source/GPUImageCrosshatchFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCrosshatchFilter.m b/framework/Source/GPUImageCrosshatchFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDarkenBlendFilter.h b/framework/Source/GPUImageDarkenBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDarkenBlendFilter.m b/framework/Source/GPUImageDarkenBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDifferenceBlendFilter.h b/framework/Source/GPUImageDifferenceBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDifferenceBlendFilter.m b/framework/Source/GPUImageDifferenceBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDissolveBlendFilter.h b/framework/Source/GPUImageDissolveBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDissolveBlendFilter.m b/framework/Source/GPUImageDissolveBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageEmbossFilter.h b/framework/Source/GPUImageEmbossFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageEmbossFilter.m b/framework/Source/GPUImageEmbossFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageExclusionBlendFilter.h b/framework/Source/GPUImageExclusionBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageExclusionBlendFilter.m b/framework/Source/GPUImageExclusionBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageExposureFilter.h b/framework/Source/GPUImageExposureFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageExposureFilter.m b/framework/Source/GPUImageExposureFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFastBlurFilter.h b/framework/Source/GPUImageFastBlurFilter.h old mode 100644 new mode 100755 index 85b5e88b7..c351d7e45 --- a/framework/Source/GPUImageFastBlurFilter.h +++ b/framework/Source/GPUImageFastBlurFilter.h @@ -2,7 +2,7 @@ @interface GPUImageFastBlurFilter : GPUImageTwoPassFilter { - GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, blurSizeUniform; + GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, firstBlurSizeUniform, secondBlurSizeUniform; } // The number of times to sequentially blur the incoming image. The more passes, the slower the filter. diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m old mode 100644 new mode 100755 index dca0fceab..c7d00925b --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -78,12 +78,12 @@ - (id)init; verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + firstBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; - + secondBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; - blurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; self.blurSize = 1.0; return self; @@ -123,7 +123,10 @@ - (void)setBlurSize:(CGFloat)newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(blurSizeUniform, _blurSize); + glUniform1f(firstBlurSizeUniform, _blurSize); + + [secondFilterProgram use]; + glUniform1f(secondBlurSizeUniform, _blurSize); } @end diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFilterGroup.h b/framework/Source/GPUImageFilterGroup.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGammaFilter.h b/framework/Source/GPUImageGammaFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGammaFilter.m b/framework/Source/GPUImageGammaFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGrayscaleFilter.h b/framework/Source/GPUImageGrayscaleFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHardLightBlendFilter.h b/framework/Source/GPUImageHardLightBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHardLightBlendFilter.m b/framework/Source/GPUImageHardLightBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h old mode 100644 new mode 100755 index 66243fbbf..2435b4c57 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -4,15 +4,15 @@ @class GPUImageXYDerivativeFilter; @class GPUImageGrayscaleFilter; @class GPUImageFastBlurFilter; +@class GPUImageNonMaximumSuppressionFilter; @interface GPUImageHarrisCornerDetectionFilter : GPUImageFilterGroup { - GPUImageGrayscaleFilter *luminanceFilter; GPUImageXYDerivativeFilter *derivativeFilter; // GPUImageGaussianBlurFilter *blurFilter; - GPUImageFastBlurFilter *blurFilter; + GPUImageFastBlurFilter *preblurFilter, *blurFilter; GPUImageFilter *harrisCornerDetectionFilter; - // Non maximum suppression filter + GPUImageNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; GPUImageFilter *simpleThresholdFilter; } // A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m old mode 100644 new mode 100755 index 31a2ab8c4..7e5644040 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -4,6 +4,7 @@ #import "GPUImageXYDerivativeFilter.h" #import "GPUImageGrayscaleFilter.h" #import "GPUImageFastBlurFilter.h" +#import "GPUImageNonMaximumSuppressionFilter.h" // This is the Harris corner detector, as described in // C. Harris and M. Stephens. A Combined Corner and Edge Detector. Proc. Alvey Vision Conf., Univ. Manchester, pp. 147-151, 1988. @@ -16,7 +17,7 @@ @implementation GPUImageHarrisCornerDetectionFilter uniform sampler2D inputImageTexture; - const mediump float harrisConstant = 0.01; + const mediump float harrisConstant = 0.04; void main() { @@ -31,7 +32,8 @@ void main() // Original Harris detector // highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; - gl_FragColor = vec4(vec3(harrisIntensity * 8.0), 1.0); + gl_FragColor = vec4(vec3(harrisIntensity * 10.0), 1.0); +// gl_FragColor = vec4(derivativeElements, 1.0); } ); @@ -41,7 +43,7 @@ void main() uniform sampler2D inputImageTexture; - const lowp float threshold = 0.2; + const lowp float threshold = 0.10; void main() { @@ -50,6 +52,8 @@ void main() lowp float thresholdValue = step(threshold, intensity); gl_FragColor = vec4(thresholdValue, 0.0, 0.0, thresholdValue); +// gl_FragColor = vec4(intensity, intensity, intensity, 1.0); +// gl_FragColor = vec4(intensity, 0.0, 0.0, intensity); } ); @@ -62,43 +66,47 @@ - (id)init; { return nil; } - - // First pass: reduce to luminance - luminanceFilter = [[GPUImageGrayscaleFilter alloc] init]; - [self addFilter:luminanceFilter]; - - // Second pass: take the derivative of the luminance texture + +// preblurFilter = [[GPUImageFastBlurFilter alloc] init]; +// [self addFilter:preblurFilter]; + + // First pass: reduce to luminance and take the derivative of the luminance texture derivativeFilter = [[GPUImageXYDerivativeFilter alloc] init]; - derivativeFilter.imageWidthFactor = 256.0; - derivativeFilter.imageHeightFactor = 256.0; +// derivativeFilter.imageWidthFactor = 256.0; +// derivativeFilter.imageHeightFactor = 256.0; [self addFilter:derivativeFilter]; - // Third pass: blur the derivative + // Second pass: blur the derivative // blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; blurFilter = [[GPUImageFastBlurFilter alloc] init]; [self addFilter:blurFilter]; - // Fourth pass: apply the Harris corner detection calculation + // Third pass: apply the Harris corner detection calculation harrisCornerDetectionFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageHarrisCornerDetectionFragmentShaderString]; [self addFilter:harrisCornerDetectionFilter]; - // TODO: Non-maximum suppression filter here + // Fourth pass: apply non-maximum suppression to find the local maxima +// nonMaximumSuppressionFilter = [[GPUImageNonMaximumSuppressionFilter alloc] init]; +// [self addFilter:nonMaximumSuppressionFilter]; // Fifth pass: threshold the result simpleThresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageSimpleThresholdFragmentShaderString]; [self addFilter:simpleThresholdFilter]; - [luminanceFilter addTarget:derivativeFilter]; +// [preblurFilter addTarget:luminanceFilter]; [derivativeFilter addTarget:blurFilter]; [blurFilter addTarget:harrisCornerDetectionFilter]; +// [harrisCornerDetectionFilter addTarget:nonMaximumSuppressionFilter]; +// [nonMaximumSuppressionFilter addTarget:simpleThresholdFilter]; [harrisCornerDetectionFilter addTarget:simpleThresholdFilter]; - self.initialFilters = [NSArray arrayWithObjects:luminanceFilter, nil]; +// self.initialFilters = [NSArray arrayWithObjects:preblurFilter, nil]; + self.initialFilters = [NSArray arrayWithObjects:derivativeFilter, nil]; // self.terminalFilter = harrisCornerDetectionFilter; self.terminalFilter = simpleThresholdFilter; // self.intensity = 1.0; - self.blurSize = 1.5; + self.blurSize = 1.0; return self; } diff --git a/framework/Source/GPUImageHazeFilter.h b/framework/Source/GPUImageHazeFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHazeFilter.m b/framework/Source/GPUImageHazeFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHistogramGenerator.h b/framework/Source/GPUImageHistogramGenerator.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHistogramGenerator.m b/framework/Source/GPUImageHistogramGenerator.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageKuwaharaFilter.h b/framework/Source/GPUImageKuwaharaFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLightenBlendFilter.h b/framework/Source/GPUImageLightenBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLightenBlendFilter.m b/framework/Source/GPUImageLightenBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLuminanceThresholdFilter.h b/framework/Source/GPUImageLuminanceThresholdFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLuminanceThresholdFilter.m b/framework/Source/GPUImageLuminanceThresholdFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMaskFilter.h b/framework/Source/GPUImageMaskFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMaskFilter.m b/framework/Source/GPUImageMaskFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h deleted file mode 100644 index 2fa7d4741..000000000 --- a/framework/Source/GPUImageMosaicFilter.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// GPUImageMosaicFilter.h -// -// Created by Jacob Gundersen on 3/29/12. -// -// This filter takes an input tileset, the tiles must ascend in luminance -// It looks at the input image and replaces each display tile with an input tile -// according to the luminance of that tile. The idea was to replicate the ASCII -// video filters seen in other apps, but the tileset can be anything. - -#import "GPUImageFilter.h" - -@interface GPUImageMosaicFilter : GPUImageFilter { - GLint inputTileSizeUniform, numTilesUniform, displayTileSizeUniform; -} - -@property(readwrite, nonatomic) CGSize inputTileSize; -@property(readwrite, nonatomic) float numTiles; -@property(readwrite, nonatomic) CGSize displayTileSize; - --(void)setNumTiles:(float)numTiles; --(void)setDisplayTileSize:(CGSize)displayTileSize; --(void)setInputTileSize:(CGSize)inputTileSize; --(void)addTileSet:(NSString *)tileSet; - -@end diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m deleted file mode 100644 index 179f48c29..000000000 --- a/framework/Source/GPUImageMosaicFilter.m +++ /dev/null @@ -1,139 +0,0 @@ -// -// GPUImageMosaicFilter.m -// Face Esplode -// -// Created by Jacob Gundersen on 3/29/12. -// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. -// - -#import "GPUImageMosaicFilter.h" -#import "GPUImagePicture.h" - -NSString *const kGPUImageMosaicFragmentShaderString = SHADER_STRING -( - precision highp float; - - varying vec2 textureCoordinate; - - uniform sampler2D inputImageTexture; - uniform sampler2D inputImageTexture2; - - uniform vec2 inputTileSize; - uniform vec2 displayTileSize; - uniform float numTiles; - - void main() - { - vec2 xy = textureCoordinate; - xy = xy - mod(xy, displayTileSize); - - vec4 lumcoeff = vec4(0.299,0.587,0.114,0.0); - - float lum = dot(texture2D(inputImageTexture, xy),lumcoeff); - lum = 1.0 - lum; - - float stepsize = 1.0 / numTiles; - float lumStep = (lum - mod(lum, stepsize)) / stepsize; - - float rowStep = 1.0 / inputTileSize.x; - float x = mod(lumStep, rowStep); - float y = floor(lumStep / rowStep); - - vec2 startCoord = vec2(float(x) * inputTileSize.x, float(y) * inputTileSize.y); - vec2 finalCoord = startCoord + ((textureCoordinate - xy) * (inputTileSize / displayTileSize)); - - vec4 color = texture2D(inputImageTexture2, finalCoord); - gl_FragColor = color; - - } - ); - -@implementation GPUImageMosaicFilter - -@synthesize inputTileSize = _inputTileSize, numTiles = _numTiles, displayTileSize = _displayTileSize; - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageMosaicFragmentShaderString])) - { - return nil; - } - - inputTileSizeUniform = [filterProgram uniformIndex:@"inputTileSize"]; - displayTileSizeUniform = [filterProgram uniformIndex:@"displayTileSize"]; - numTilesUniform = [filterProgram uniformIndex:@"numTiles"]; - - CGSize its = CGSizeMake(0.125, 0.125); - CGSize dts = CGSizeMake(0.025, 0.025); - [self setDisplayTileSize:dts]; - [self setInputTileSize:its]; - [self setNumTiles:64.0]; - //[self addTileSet:@"squares.png"]; - return self; -} - --(void)setNumTiles:(float)numTiles { - - _numTiles = numTiles; - [self setFloat:_numTiles forUniform:@"numTiles"]; -} - --(void)setInputTileSize:(CGSize)inputTileSize { - if (inputTileSize.width > 1.0) { - _inputTileSize.width = 1.0; - } - if (inputTileSize.height > 1.0) { - _inputTileSize.height = 1.0; - } - if (inputTileSize.width < 0.0) { - _inputTileSize.width = 0.0; - } - if (inputTileSize.height < 0.0) { - _inputTileSize.height = 0.0; - } - - - _inputTileSize = inputTileSize; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GLfloat inputTS[2]; - inputTS[0] = _inputTileSize.width; - inputTS[1] = _inputTileSize.height; - glUniform2fv(inputTileSizeUniform, 1, inputTS); -} - --(void)setDisplayTileSize:(CGSize)displayTileSize { - if (displayTileSize.width > 1.0) { - _displayTileSize.width = 1.0; - } - if (displayTileSize.height > 1.0) { - _displayTileSize.height = 1.0; - } - if (displayTileSize.width < 0.0) { - _displayTileSize.width = 0.0; - } - if (displayTileSize.height < 0.0) { - _displayTileSize.height = 0.0; - } - - - _displayTileSize = displayTileSize; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GLfloat displayTS[2]; - displayTS[0] = _displayTileSize.width; - displayTS[1] = _displayTileSize.height; - glUniform2fv(displayTileSizeUniform, 1, displayTS); -} - -//I'd like to add this method, but I can't get it to work. The same set of commands works if they are called from my view controller class --(void)addTileSet:(NSString *)tileSet { - UIImage *img = [UIImage imageNamed:tileSet]; - GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:img smoothlyScaleOutput:YES]; - [pic addTarget:self]; - -} - -@end diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMultiplyBlendFilter.h b/framework/Source/GPUImageMultiplyBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMultiplyBlendFilter.m b/framework/Source/GPUImageMultiplyBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.h b/framework/Source/GPUImageNonMaximumSuppressionFilter.h new file mode 100755 index 000000000..1c586dcc1 --- /dev/null +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.h @@ -0,0 +1,8 @@ +#import "GPUImageTwoPassFilter.h" + +@interface GPUImageNonMaximumSuppressionFilter : GPUImageTwoPassFilter +{ + GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform; +} + +@end diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m new file mode 100755 index 000000000..2c7ab6fc7 --- /dev/null +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.m @@ -0,0 +1,95 @@ +#import "GPUImageNonMaximumSuppressionFilter.h" + +NSString *const kGPUImageNonMaximumSuppressionVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform highp float texelWidthOffset; + uniform highp float texelHeightOffset; + uniform highp float blurSize; + + varying highp vec2 centerTextureCoordinate; + varying highp vec2 oneStepNegativeTextureCoordinate; + varying highp vec2 twoStepsNegativeTextureCoordinate; + varying highp vec2 oneStepPositiveTextureCoordinate; + varying highp vec2 twoStepsPositiveTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 firstOffset = vec2(texelWidthOffset, texelHeightOffset) * 1.0; + vec2 secondOffset = vec2(texelWidthOffset, texelHeightOffset) * 2.0; + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - firstOffset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - secondOffset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + firstOffset; + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + secondOffset; + } +); + + +NSString *const kGPUImageNonMaximumSuppressionFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying highp vec2 centerTextureCoordinate; + varying highp vec2 oneStepNegativeTextureCoordinate; + varying highp vec2 twoStepsNegativeTextureCoordinate; + varying highp vec2 oneStepPositiveTextureCoordinate; + varying highp vec2 twoStepsPositiveTextureCoordinate; + + void main() + { + lowp float fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).r; + lowp float oneStepNegativeFragmentColor = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + lowp float twoStepsNegativeFragmentColor = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + lowp float oneStepPositiveFragmentColor = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + lowp float twoStepsPositiveFragmentColor = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + + lowp float maxValue = max(fragmentColor, oneStepNegativeFragmentColor); + maxValue = max(maxValue, twoStepsNegativeFragmentColor); + maxValue = max(maxValue, oneStepPositiveFragmentColor); + maxValue = max(maxValue, twoStepsPositiveFragmentColor); + + gl_FragColor = vec4(fragmentColor * step(maxValue, fragmentColor)); + } +); + +@implementation GPUImageNonMaximumSuppressionFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageNonMaximumSuppressionVertexShaderString firstStageFragmentShaderFromString:kGPUImageNonMaximumSuppressionFragmentShaderString secondStageVertexShaderFromString:kGPUImageNonMaximumSuppressionVertexShaderString secondStageFragmentShaderFromString:kGPUImageNonMaximumSuppressionFragmentShaderString])) + { + return nil; + } + + verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; + verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + + horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; + horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + + return self; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + + [secondFilterProgram use]; + glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); + glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); +} + +@end + diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOverlayBlendFilter.h b/framework/Source/GPUImageOverlayBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOverlayBlendFilter.m b/framework/Source/GPUImageOverlayBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePinchDistortionFilter.h b/framework/Source/GPUImagePinchDistortionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePinchDistortionFilter.m b/framework/Source/GPUImagePinchDistortionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePixellateFilter.h b/framework/Source/GPUImagePixellateFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePolarPixellateFilter.h b/framework/Source/GPUImagePolarPixellateFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePolarPixellateFilter.m b/framework/Source/GPUImagePolarPixellateFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePosterizeFilter.h b/framework/Source/GPUImagePosterizeFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePosterizeFilter.m b/framework/Source/GPUImagePosterizeFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePrewittEdgeDetectionFilter.h b/framework/Source/GPUImagePrewittEdgeDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePrewittEdgeDetectionFilter.m b/framework/Source/GPUImagePrewittEdgeDetectionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRawData.h b/framework/Source/GPUImageRawData.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawData.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRotationFilter.h b/framework/Source/GPUImageRotationFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRotationFilter.m b/framework/Source/GPUImageRotationFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSaturationFilter.h b/framework/Source/GPUImageSaturationFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSaturationFilter.m b/framework/Source/GPUImageSaturationFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageScreenBlendFilter.h b/framework/Source/GPUImageScreenBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageScreenBlendFilter.m b/framework/Source/GPUImageScreenBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSepiaFilter.h b/framework/Source/GPUImageSepiaFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSepiaFilter.m b/framework/Source/GPUImageSepiaFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSharpenFilter.h b/framework/Source/GPUImageSharpenFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSharpenFilter.m b/framework/Source/GPUImageSharpenFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSketchFilter.h b/framework/Source/GPUImageSketchFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSketchFilter.m b/framework/Source/GPUImageSketchFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSmoothToonFilter.h b/framework/Source/GPUImageSmoothToonFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSmoothToonFilter.m b/framework/Source/GPUImageSmoothToonFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.h b/framework/Source/GPUImageSobelEdgeDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSoftLightBlendFilter.h b/framework/Source/GPUImageSoftLightBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSoftLightBlendFilter.m b/framework/Source/GPUImageSoftLightBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageStretchDistortionFilter.h b/framework/Source/GPUImageStretchDistortionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageStretchDistortionFilter.m b/framework/Source/GPUImageStretchDistortionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSubtractBlendFilter.h b/framework/Source/GPUImageSubtractBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSubtractBlendFilter.m b/framework/Source/GPUImageSubtractBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSwirlFilter.h b/framework/Source/GPUImageSwirlFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSwirlFilter.m b/framework/Source/GPUImageSwirlFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTextureInput.h b/framework/Source/GPUImageTextureInput.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTextureOutput.h b/framework/Source/GPUImageTextureOutput.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdEdgeDetection.h b/framework/Source/GPUImageThresholdEdgeDetection.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdEdgeDetection.m b/framework/Source/GPUImageThresholdEdgeDetection.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTiltShiftFilter.h b/framework/Source/GPUImageTiltShiftFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageToonFilter.h b/framework/Source/GPUImageToonFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageToonFilter.m b/framework/Source/GPUImageToonFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTransformFilter.h b/framework/Source/GPUImageTransformFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTwoPassFilter.h b/framework/Source/GPUImageTwoPassFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageUnsharpMaskFilter.h b/framework/Source/GPUImageUnsharpMaskFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageVignetteFilter.h b/framework/Source/GPUImageVignetteFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageXYDerivativeFilter.h b/framework/Source/GPUImageXYDerivativeFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageXYDerivativeFilter.m b/framework/Source/GPUImageXYDerivativeFilter.m old mode 100644 new mode 100755 index 9b18ae344..fdbcae913 --- a/framework/Source/GPUImageXYDerivativeFilter.m +++ b/framework/Source/GPUImageXYDerivativeFilter.m @@ -23,23 +23,23 @@ @implementation GPUImageXYDerivativeFilter uniform sampler2D inputImageTexture; - const float harrisConstant = -0.5; - void main() { - float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; - float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; - float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; - float verticalDerivative = abs(-topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity); - float horizontalDerivative = abs(-bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity); +// float verticalDerivative = abs(-topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity); +// float horizontalDerivative = abs(-bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity); + float verticalDerivative = abs(-topIntensity + bottomIntensity); + float horizontalDerivative = abs(-leftIntensity + rightIntensity); - gl_FragColor = vec4(verticalDerivative * verticalDerivative, horizontalDerivative * horizontalDerivative, verticalDerivative * horizontalDerivative, 1.0); + gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, verticalDerivative * horizontalDerivative, 1.0); } ); diff --git a/framework/Source/tilesets/circles.png b/framework/Source/tilesets/circles.png deleted file mode 100644 index ffac135f39a7415cc82862ba7a39af2638df506d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24328 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%0An&l-2+h8a0l1L$8 zH0wZche9PF9vwW)Kt4KrhWwrMR|?19Yp*+(5-`}qUnHOc4wYQO6`;xK<*0%y{NC|$ zJ|xK^_u+nBiSVo`jzttuktm78fyc(2@JC7M{~$2|@BDvtr~lJN0&(D-FCY{k(uYzz zI~3mf5??;1(3qG-CiZO4c{$}0fPwZnuc zx)UWd&uwch`+Iu+bG+;B_)H&1iM@~Y9@+gp0S%DF7y~W|5+6Zgy64$ke%KSg{`95P z`^Hz9RbLq6KS)Q3a!@3yxU~Pi^lR@=+yVSU1Rm8AL@T4~*z$N64i3lNUgGD_Ryh(tNxWo5dDK%{2+c+djz$crZsC_@)?V z@&1g%?4RyLlY(`OH-~X!);!H$

Rad|6=WgG7ueJ7C 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

{{0, 20}, {320, 460}} @@ -148,13 +148,13 @@ SimpleVideoFilterViewController UIViewController - updatePixelWidth: + updateSliderValue: id - updatePixelWidth: + updateSliderValue: - updatePixelWidth: + updateSliderValue: id @@ -169,6 +169,6 @@ IBCocoaTouchFramework YES 3 - 1173 + 1179
From bbecfe877bd4bd229d417b54c9264621ed2f40ea Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 11 May 2012 14:30:28 -0500 Subject: [PATCH 082/695] Fixed an issue with certain sizes of images being corrupted when retrieved from a filter. Fixed the stuttery updates on the FilterShowcase histogram. --- .../FilterShowcase/ShowcaseFilterViewController.m | 11 ++++++++--- framework/Source/GPUImageFilter.m | 8 ++++++-- framework/Source/GPUImageHistogramFilter.m | 15 +++++++++++++++ framework/Source/GPUImageMedianFilter.m | 3 ++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 5b55682d5..2aa5605fb 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -738,14 +738,19 @@ - (void)setupFilter; if (filterType == GPUIMAGE_HISTOGRAM) { + // I'm adding an intermediary filter because glReadPixels() requires something to be rendered for its glReadPixels() operation to work + [videoCamera removeTarget:filter]; + GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; + [videoCamera addTarget:gammaFilter]; + [gammaFilter addTarget:filter]; + GPUImageHistogramGenerator *histogramGraph = [[GPUImageHistogramGenerator alloc] init]; [histogramGraph forceProcessingAtSize:CGSizeMake(256.0, 330.0)]; + [filter addTarget:histogramGraph]; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; - blendFilter.mix = 0.75; - - [filter addTarget:histogramGraph]; + blendFilter.mix = 0.75; [videoCamera addTarget:blendFilter]; [histogramGraph addTarget:blendFilter]; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 01f6f100c..d5e4cdd97 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -150,6 +150,10 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CGSize currentFBOSize = [self sizeOfFBO]; NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; + // It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache + NSUInteger paddedWidthOfImage = (NSUInteger)ceil(currentFBOSize.width / 8.0) * 8.0; + NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)currentFBOSize.height * 4; + GLubyte *rawImagePixels; CGDataProviderRef dataProvider; @@ -161,7 +165,7 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CVPixelBufferLockBaseAddress(renderTarget, 0); self.preventRendering = YES; // Locks don't seem to work, so prevent any rendering to the filter which might overwrite the pixel buffer data until done processing rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); - dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, totalBytesForImage, dataProviderUnlockCallback); + dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, paddedBytesForImage, dataProviderUnlockCallback); } else { @@ -176,7 +180,7 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CGImageRef cgImageFromBytes; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { - cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * (int)currentFBOSize.width, defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); + cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * paddedWidthOfImage, defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); } else { diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 1e67db34d..a13551041 100644 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -222,6 +222,21 @@ - (CGSize)outputFrameSize; return [self sizeOfFBO]; } +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + if (self.preventRendering) + { + return; + } + + inputTextureSize = newSize; +} + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + inputRotation = kGPUImageNoRotation; +} + - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { if (self.preventRendering) diff --git a/framework/Source/GPUImageMedianFilter.m b/framework/Source/GPUImageMedianFilter.m index 9e65ba8bc..efcab7248 100644 --- a/framework/Source/GPUImageMedianFilter.m +++ b/framework/Source/GPUImageMedianFilter.m @@ -1,7 +1,8 @@ #import "GPUImageMedianFilter.h" /* - 3x3 Median optimized for GeForce 8800, from "A Fast, Small-Radius GPU Median Filter" by Morgan McGuire in ShaderX6 + 3x3 median filter, adapted from "A Fast, Small-Radius GPU Median Filter" by Morgan McGuire in ShaderX6 + http://graphics.cs.williams.edu/papers/MedianShaderX6/ Morgan McGuire and Kyle Whitson Williams College From 57262f49dc7c5b5a09a06ed4c5c24e7f7c171f75 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 12 May 2012 20:40:20 -0500 Subject: [PATCH 083/695] Added a scaling mechanism to resize photos and images that are too large for the iPhone 4 and older devices. Fixed a couple of image generation issues caused by my earlier fix. --- .../SimplePhotoFilter/PhotoViewController.m | 1 + framework/Source/GPUImageFilter.m | 4 +- framework/Source/GPUImageOpenGLESContext.h | 1 + framework/Source/GPUImageOpenGLESContext.m | 23 ++++ framework/Source/GPUImagePicture.m | 10 ++ framework/Source/GPUImageStillCamera.h | 2 + framework/Source/GPUImageStillCamera.m | 113 ++++++++++++++++-- 7 files changed, 145 insertions(+), 9 deletions(-) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index c74fdb3e0..f410fde90 100644 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -50,6 +50,7 @@ - (void)viewDidLoad [super viewDidLoad]; stillCamera = [[GPUImageStillCamera alloc] init]; +// stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; // filter = [[GPUImageGammaFilter alloc] init]; filter = [[GPUImageSketchFilter alloc] init]; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index d5e4cdd97..9c63b7075 100644 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -151,7 +151,7 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CGSize currentFBOSize = [self sizeOfFBO]; NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; // It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache - NSUInteger paddedWidthOfImage = (NSUInteger)ceil(currentFBOSize.width / 8.0) * 8.0; + NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)currentFBOSize.height * 4; GLubyte *rawImagePixels; @@ -180,7 +180,7 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CGImageRef cgImageFromBytes; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { - cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * paddedWidthOfImage, defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); + cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); } else { diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index f7c270e20..b02215bd0 100644 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -20,6 +20,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (void)useImageProcessingContext; + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; ++ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - (void)presentBufferForDisplay; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 1d1a2b3a6..22c35aa76 100644 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -37,6 +37,29 @@ + (GLint)maximumTextureUnitsForThisDevice; return maxTextureUnits; } ++ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; +{ + GLint maxTextureSize = [self maximumTextureSizeForThisDevice]; + if ( (inputSize.width < maxTextureSize) && (inputSize.height < maxTextureSize) ) + { + return inputSize; + } + + CGSize adjustedSize; + if (inputSize.width > inputSize.height) + { + adjustedSize.width = (CGFloat)maxTextureSize; + adjustedSize.height = ((CGFloat)maxTextureSize / inputSize.width) * inputSize.height; + } + else + { + adjustedSize.height = (CGFloat)maxTextureSize; + adjustedSize.width = ((CGFloat)maxTextureSize / inputSize.height) * inputSize.width; + } + + return adjustedSize; +} + - (void)presentBufferForDisplay; { [_context presentRenderbuffer:GL_RENDERBUFFER]; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index e62db3c5d..9c8817b9c 100644 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -32,6 +32,15 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly CGSize pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); BOOL shouldRedrawUsingCoreGraphics = YES; + + // For now, deal with images larger than the maximum texture size by resizing to be within that limit + CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; + if (!CGSizeEqualToSize(scaledImageSizeToFitOnGPU, pixelSizeOfImage)) + { + pixelSizeOfImage = scaledImageSizeToFitOnGPU; + shouldRedrawUsingCoreGraphics = YES; + } + if (self.shouldSmoothlyScaleOutput) { // In order to use mipmaps, you need to provide power-of-two textures, so convert to the next largest power of two and stretch to fill @@ -102,6 +111,7 @@ - (void)processImage; CGSize pointSizeOfImage = [imageSource size]; CGFloat scaleOfImage = [imageSource scale]; CGSize pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); + pixelSizeOfImage = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; for (id currentTarget in targets) { diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index 518339862..3bb88b971 100644 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -1,5 +1,7 @@ #import "GPUImageVideoCamera.h" +void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer, GLubyte **imageData); + @interface GPUImageStillCamera : GPUImageVideoCamera // Photography controls diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 36568f563..403215bfa 100644 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -2,6 +2,38 @@ #import "GPUImageStillCamera.h" +void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer, GLubyte **imageData) +{ + CGSize originalSize = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); + + CVPixelBufferLockBaseAddress(cameraFrame, 0); + GLubyte *sourceImageBytes = CVPixelBufferGetBaseAddress(cameraFrame); + CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, sourceImageBytes, CVPixelBufferGetBytesPerRow(cameraFrame) * originalSize.height, NULL); + CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); + CGImageRef cgImageFromBytes = CGImageCreate((int)originalSize.width, (int)originalSize.height, 8, 32, CVPixelBufferGetBytesPerRow(cameraFrame), genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); + + *imageData = (GLubyte *) calloc(1, (int)finalSize.width * (int)finalSize.height * 4); + + CGContextRef imageContext = CGBitmapContextCreate(*imageData, (int)finalSize.width, (int)finalSize.height, 8, (int)finalSize.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, finalSize.width, finalSize.height), cgImageFromBytes); + CGImageRelease(cgImageFromBytes); + CGContextRelease(imageContext); + CGColorSpaceRelease(genericRGBColorspace); + CGDataProviderRelease(dataProvider); + + CVPixelBufferRef pixel_buffer = NULL; + CVPixelBufferCreateWithBytes(kCFAllocatorDefault, finalSize.width, finalSize.height, kCVPixelFormatType_32BGRA, *imageData, finalSize.width * 4, NULL, NULL, NULL, &pixel_buffer); + CMVideoFormatDescriptionRef videoInfo = NULL; + CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixel_buffer, &videoInfo); + + CMTime frameTime = CMTimeMake(1, 30); + CMSampleTimingInfo timing = {frameTime, frameTime, kCMTimeInvalid}; + + CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixel_buffer, YES, NULL, NULL, videoInfo, &timing, sampleBuffer); + // CFRelease(videoInfo); + CVPixelBufferRelease(pixel_buffer); +} + @interface GPUImageStillCamera () { AVCaptureStillImageOutput *photoOutput; @@ -14,22 +46,31 @@ @implementation GPUImageStillCamera #pragma mark - #pragma mark Initialization and teardown -- (id)init; +- (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; { - if (!(self = [self initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionBack])) + if (!(self = [super initWithSessionPreset:sessionPreset cameraPosition:cameraPosition])) { return nil; } [self.captureSession beginConfiguration]; - + photoOutput = [[AVCaptureStillImageOutput alloc] init]; [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; [self.captureSession addOutput:photoOutput]; [self.captureSession commitConfiguration]; + + return self; +} +- (id)init; +{ + if (!(self = [self initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionBack])) + { + return nil; + } return self; } @@ -46,7 +87,26 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) { [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + // For now, resize photos to fix within the max texture size of the GPU + CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); + + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); + CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; + if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) + { + CMSampleBufferRef sampleBuffer; + GLubyte *imageData; + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer, &imageData); + + [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + CFRelease(sampleBuffer); + + free(imageData); + } + else + { + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + } UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; @@ -61,8 +121,28 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f // report_memory(@"Before still image capture"); [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { // report_memory(@"Before filter processing"); - - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + + // For now, resize photos to fix within the max texture size of the GPU + CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); + + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); + CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; + if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) + { + CMSampleBufferRef sampleBuffer; + GLubyte *imageData; + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer, &imageData); + + [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + CFRelease(sampleBuffer); + + free(imageData); + } + else + { + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + } + // report_memory(@"After filter processing"); NSData *dataForJPEGFile = nil; @@ -87,7 +167,26 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi { [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + // For now, resize photos to fix within the max texture size of the GPU + CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); + + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); + CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; + if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) + { + CMSampleBufferRef sampleBuffer; + GLubyte *imageData; + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer, &imageData); + + [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + CFRelease(sampleBuffer); + + free(imageData); + } + else + { + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + } NSData *dataForPNGFile = nil; @autoreleasepool { From d3770a2ef123b9fb36571e165af4441fb8e1e28d Mon Sep 17 00:00:00 2001 From: Yann Biancheri Date: Sun, 13 May 2012 21:34:07 +0300 Subject: [PATCH 084/695] Fix crop filter Correct cropTextureCoordinates when input rotation is set to kGPUImageNoRotation --- framework/Source/GPUImageCropFilter.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index c384a4352..4ab32b1d3 100644 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -83,8 +83,8 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[4] = minX; // 0,1 cropTextureCoordinates[5] = maxY; - cropTextureCoordinates[4] = maxX; // 1,1 - cropTextureCoordinates[5] = maxY; + cropTextureCoordinates[6] = maxX; // 1,1 + cropTextureCoordinates[7] = maxY; }; break; case kGPUImageRotateLeft: // Broken { From fa31df54d78a2c78615d8b7b166a2e290fba496e Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 13 May 2012 16:49:20 -0500 Subject: [PATCH 085/695] Added a bilateral blur filter. --- .../ShowcaseFilterListController.m | 9 +- .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 +++ framework/GPUImage.xcodeproj/project.pbxproj | 12 ++- framework/Source/GPUImage.h | 1 + framework/Source/GPUImageBilateralFilter.h | 5 ++ framework/Source/GPUImageBilateralFilter.m | 87 +++++++++++++++++++ framework/Source/GPUImageGaussianBlurFilter.h | 4 +- framework/Source/GPUImageGaussianBlurFilter.m | 15 ---- 9 files changed, 122 insertions(+), 24 deletions(-) create mode 100644 framework/Source/GPUImageBilateralFilter.h create mode 100644 framework/Source/GPUImageBilateralFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index b35525087..28a4db00a 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -116,11 +116,12 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SOFTLIGHTBLEND: cell.textLabel.text = @"Soft light blend"; break; case GPUIMAGE_KUWAHARA: cell.textLabel.text = @"Kuwahara"; break; case GPUIMAGE_VIGNETTE: cell.textLabel.text = @"Vignette"; break; - case GPUIMAGE_GAUSSIAN: cell.textLabel.text = @"Gaussian Blur"; break; - case GPUIMAGE_FASTBLUR: cell.textLabel.text = @"Fast Blur"; break; + case GPUIMAGE_GAUSSIAN: cell.textLabel.text = @"Gaussian blur"; break; + case GPUIMAGE_FASTBLUR: cell.textLabel.text = @"Fast blur"; break; case GPUIMAGE_MEDIAN: cell.textLabel.text = @"Median (3x3)"; break; - case GPUIMAGE_BOXBLUR: cell.textLabel.text = @"Box Blur"; break; - case GPUIMAGE_GAUSSIAN_SELECTIVE: cell.textLabel.text = @"Gaussian Selective Blur"; break; + case GPUIMAGE_BILATERAL: cell.textLabel.text = @"Bilateral blur"; break; + case GPUIMAGE_BOXBLUR: cell.textLabel.text = @"Box blur"; break; + case GPUIMAGE_GAUSSIAN_SELECTIVE: cell.textLabel.text = @"Gaussian selective blur"; break; case GPUIMAGE_CUSTOM: cell.textLabel.text = @"Custom"; break; case GPUIMAGE_FILECONFIG: cell.textLabel.text = @"Filter Chain"; break; case GPUIMAGE_FILTERGROUP: cell.textLabel.text = @"Filter Group"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 7698955ea..1489709c8 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -44,6 +44,7 @@ typedef enum { GPUIMAGE_FASTBLUR, GPUIMAGE_BOXBLUR, GPUIMAGE_MEDIAN, + GPUIMAGE_BILATERAL, GPUIMAGE_SWIRL, GPUIMAGE_BULGE, GPUIMAGE_PINCH, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 2aa5605fb..dbb913c3b 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -676,6 +676,17 @@ - (void)setupFilter; filter = [[GPUImageGaussianSelectiveBlurFilter alloc] init]; [(GPUImageGaussianSelectiveBlurFilter*)filter setExcludeCircleRadius:40.0/320.0]; }; break; + case GPUIMAGE_BILATERAL: + { + self.title = @"Bilateral Blur"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:10.0]; + [self.filterSettingsSlider setValue:1.0]; + + filter = [[GPUImageBilateralFilter alloc] init]; + }; break; case GPUIMAGE_FILTERGROUP: { self.title = @"Filter Group"; @@ -814,6 +825,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setY:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)filter setExcludeCircleRadius:[(UISlider*)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 7f250ebc8..6164a20f7 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -56,6 +56,8 @@ BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; + BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; }; + BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */; }; BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; @@ -250,6 +252,8 @@ BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; + BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBilateralFilter.h; path = Source/GPUImageBilateralFilter.h; sourceTree = SOURCE_ROOT; }; + BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBilateralFilter.m; path = Source/GPUImageBilateralFilter.m; sourceTree = SOURCE_ROOT; }; BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStillCamera.h; path = Source/GPUImageStillCamera.h; sourceTree = SOURCE_ROOT; }; BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStillCamera.m; path = Source/GPUImageStillCamera.m; sourceTree = SOURCE_ROOT; }; BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; @@ -613,6 +617,8 @@ BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */, BCB6B835150400030041703B /* GPUImageSharpenFilter.h */, BCB6B836150400030041703B /* GPUImageSharpenFilter.m */, + BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */, + BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */, BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */, BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */, 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */, @@ -621,8 +627,8 @@ 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */, BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */, BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */, - BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */, - BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */, + BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */, + BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */, BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */, BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */, BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */, @@ -809,6 +815,7 @@ BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */, BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */, BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */, + BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1006,6 +1013,7 @@ BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */, BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */, BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */, + BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 8a3a9e4a6..ca9c6dafc 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -81,3 +81,4 @@ #import "GPUImageNonMaximumSuppressionFilter.h" #import "GPUImageRGBFilter.h" #import "GPUImageMedianFilter.h" +#import "GPUImageBilateralFilter.h" diff --git a/framework/Source/GPUImageBilateralFilter.h b/framework/Source/GPUImageBilateralFilter.h new file mode 100644 index 000000000..617312b21 --- /dev/null +++ b/framework/Source/GPUImageBilateralFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageGaussianBlurFilter.h" + +@interface GPUImageBilateralFilter : GPUImageGaussianBlurFilter + +@end diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m new file mode 100644 index 000000000..e1de167aa --- /dev/null +++ b/framework/Source/GPUImageBilateralFilter.m @@ -0,0 +1,87 @@ +#import "GPUImageBilateralFilter.h" + +NSString *const kGPUImageBilateralFilterFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + const lowp int GAUSSIAN_SAMPLES = 9; + + varying highp vec2 textureCoordinate; + varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + const mediump float distanceNormalizationFactor = 0.6933613; + + void main() { + lowp vec4 centralColor = texture2D(inputImageTexture, blurCoordinates[4]); + lowp float gaussianWeightTotal = 0.18; + lowp vec4 sum = centralColor * 0.18; + + lowp vec4 sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); + mediump float distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; + lowp float gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[1]); + distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; + gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[2]); + distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; + gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[3]); + distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; + gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[5]); + distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; + gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[6]); + distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; + gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[7]); + distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; + gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[8]); + distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; + gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + gl_FragColor = sum / gaussianWeightTotal; + } +); + +@implementation GPUImageBilateralFilter + +- (id)init; +{ + + if (!(self = [super initWithFirstStageVertexShaderFromString:nil + firstStageFragmentShaderFromString:kGPUImageBilateralFilterFragmentShaderString + secondStageVertexShaderFromString:nil + secondStageFragmentShaderFromString:kGPUImageBilateralFilterFragmentShaderString])) { + return nil; + } + + + return self; +} + +@end diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index 6cdfbf94e..4570b6e5f 100644 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -2,13 +2,11 @@ @interface GPUImageGaussianBlurFilter : GPUImageTwoPassFilter { - GLint horizontalGaussianArrayUniform, horizontalBlurSizeUniform, verticalGaussianArrayUniform, verticalBlurSizeUniform; + GLint horizontalBlurSizeUniform, verticalBlurSizeUniform; GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, blurSizeUniform; } // A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 @property (readwrite, nonatomic) CGFloat blurSize; -- (void)setGaussianValues; - @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index 66bd6bd52..bbc1c7ec1 100644 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -75,17 +75,14 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad } horizontalBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; - horizontalGaussianArrayUniform = [filterProgram uniformIndex:@"gaussianValues"]; horizontalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; horizontalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; verticalBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; - verticalGaussianArrayUniform = [secondFilterProgram uniformIndex:@"gaussianValues"]; verticalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; verticalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; self.blurSize = 1.0; - [self setGaussianValues]; return self; } @@ -124,18 +121,6 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; #pragma mark Getters and Setters -- (void) setGaussianValues { - GLsizei gaussianLength = 9; - GLfloat gaussians[] = { 0.05, 0.09, 0.12, 0.15, 0.18, 0.15, 0.12, 0.09, 0.05 }; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1fv(horizontalGaussianArrayUniform, gaussianLength, gaussians); - - [secondFilterProgram use]; - glUniform1fv(verticalGaussianArrayUniform, gaussianLength, gaussians); -} - - (void) setBlurSize:(CGFloat)blurSize { _blurSize = blurSize; From 41e4f645670aa90ad0975cdda47b1dc5f73a5d39 Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 14 May 2012 04:49:08 -0500 Subject: [PATCH 086/695] Enabling Xcode style warnings in appledoc. This will generate tons of warnings in Xcode for undocumented stuff, but only in the Documentation target. --- framework/GPUImage.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 6164a20f7..20b676ea3 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -909,7 +909,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n\n# to show missing documentation warnings, add --logformat xcode\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--docsetutil-path \"/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n${SOURCE_ROOT}"; + shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--docsetutil-path \"/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n--logformat xcode \\\n${SOURCE_ROOT}"; }; BCF1A34214DDB1EC00852800 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; From fb497ca8dd7ecc408e79130023b1b97cd70a8ed5 Mon Sep 17 00:00:00 2001 From: William LaFrance Date: Mon, 14 May 2012 05:13:40 -0500 Subject: [PATCH 087/695] Added a ton of appledoc comments --- .../Source/GPUImage3x3ConvolutionFilter.h | 11 +++++++--- framework/Source/GPUImageBoxBlurFilter.h | 2 ++ .../Source/GPUImageCannyEdgeDetectionFilter.h | 21 ++++++++++++++++--- .../Source/GPUImageChromaKeyBlendFilter.h | 21 ++++++++++++++++--- .../Source/GPUImageColorBurnBlendFilter.h | 2 ++ .../Source/GPUImageColorDodgeBlendFilter.h | 2 ++ framework/Source/GPUImageColorMatrixFilter.h | 7 +++++++ framework/Source/GPUImageContrastFilter.h | 5 ++++- framework/Source/GPUImageGaussianBlurFilter.h | 5 ++++- .../GPUImageGaussianSelectiveBlurFilter.h | 10 +++++++++ .../GPUImageHarrisCornerDetectionFilter.h | 15 ++++++++++++- framework/Source/GPUImageHazeFilter.h | 10 +++++---- .../Source/GPUImageLuminanceThresholdFilter.h | 5 ++++- framework/Source/GPUImageMovie.h | 9 ++++++-- .../Source/GPUImagePinchDistortionFilter.h | 11 +++++++--- framework/Source/GPUImagePosterizeFilter.h | 5 ++++- framework/Source/GPUImageSaturationFilter.h | 5 ++++- .../Source/GPUImageStretchDistortionFilter.h | 5 ++++- .../Source/GPUImageThresholdEdgeDetection.h | 3 ++- framework/Source/GPUImageToonFilter.h | 9 ++++++-- framework/Source/GPUImageVignetteFilter.h | 7 ++++++- 21 files changed, 141 insertions(+), 29 deletions(-) diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.h b/framework/Source/GPUImage3x3ConvolutionFilter.h index b113e0602..67e68def1 100644 --- a/framework/Source/GPUImage3x3ConvolutionFilter.h +++ b/framework/Source/GPUImage3x3ConvolutionFilter.h @@ -1,13 +1,18 @@ #import "GPUImage3x3TextureSamplingFilter.h" +/** Runs a 3x3 convolution kernel against the image + */ @interface GPUImage3x3ConvolutionFilter : GPUImage3x3TextureSamplingFilter { GLint convolutionMatrixUniform; } -// The convolution kernel is a 3x3 matrix of values to apply to the pixel and its 8 surrounding pixels. The matrix is specified in row-major order, -// with the top left pixel being one.one and the bottom right three.three -// If the values in the matrix don't add up to 1.0, the image could be brightened or darkened. +/** Convolution kernel to run against the image + + The convolution kernel is a 3x3 matrix of values to apply to the pixel and its 8 surrounding pixels. + The matrix is specified in row-major order, with the top left pixel being one.one and the bottom right three.three + If the values in the matrix don't add up to 1.0, the image could be brightened or darkened. + */ @property(readwrite, nonatomic) GPUMatrix3x3 convolutionKernel; @end diff --git a/framework/Source/GPUImageBoxBlurFilter.h b/framework/Source/GPUImageBoxBlurFilter.h index c4c9d5bb5..9dc6268df 100644 --- a/framework/Source/GPUImageBoxBlurFilter.h +++ b/framework/Source/GPUImageBoxBlurFilter.h @@ -1,5 +1,7 @@ #import "GPUImageTwoPassFilter.h" +/** A hardware-accelerated 9-hit box blur of an image + */ @interface GPUImageBoxBlurFilter : GPUImageTwoPassFilter { GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, blurSizeUniform; diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h index 766238425..f14dd2f42 100644 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.h +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.h @@ -4,6 +4,8 @@ @class GPUImageThresholdEdgeDetection; @class GPUImageSketchFilter; +/** This uses a Gaussian blur before applying a Sobel operator to highlight edges + */ @interface GPUImageCannyEdgeDetectionFilter : GPUImageFilterGroup { GPUImageGaussianBlurFilter *blurFilter; @@ -11,14 +13,27 @@ // GPUImageSketchFilter *edgeDetectionFilter; } -// The image width and height factors tweak the appearance of the edges. By default, they match the inverse of the filter size in pixels +/** The image width and height factors tweak the appearance of the edges. + + These parameters affect the visibility of the detected edges + + By default, they match the inverse of the filter size in pixels + */ @property(readwrite, nonatomic) CGFloat texelWidth; +/** The image width and height factors tweak the appearance of the edges. + + These parameters affect the visibility of the detected edges + + By default, they match the inverse of the filter size in pixels + */ @property(readwrite, nonatomic) CGFloat texelHeight; -// A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 +/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 + */ @property (readwrite, nonatomic) CGFloat blurSize; -// Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.5 as the default +/** Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.5 as the default + */ @property(readwrite, nonatomic) CGFloat threshold; @end diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.h b/framework/Source/GPUImageChromaKeyBlendFilter.h index a030cf3c7..47f5acbc2 100644 --- a/framework/Source/GPUImageChromaKeyBlendFilter.h +++ b/framework/Source/GPUImageChromaKeyBlendFilter.h @@ -1,17 +1,32 @@ #import "GPUImageTwoInputFilter.h" +/** Selectively replaces a color in the first image with the second image + */ @interface GPUImageChromaKeyBlendFilter : GPUImageTwoInputFilter { GLint colorToReplaceUniform, thresholdSensitivityUniform, smoothingUniform; } -// The threshold sensitivity controls how similar pixels need to be colored to be replaced, default of 0.3 +/** The threshold sensitivity controls how similar pixels need to be colored to be replaced + + The default value is 0.3 + */ @property(readwrite, nonatomic) GLfloat thresholdSensitivity; -// The degree of smoothing controls how gradually similar colors are replaced in the image, default of 0.1 +/** The degree of smoothing controls how gradually similar colors are replaced in the image + + The default value is 0.1 + */ @property(readwrite, nonatomic) GLfloat smoothing; -// The color to be replaced is specified using individual red, green, and blue components (normalized to 1.0). The default is green: (0.0, 1.0, 0.0). +/** The color to be replaced is specified using individual red, green, and blue components (normalized to 1.0). + + The default is green: (0.0, 1.0, 0.0). + + @param redComponent Red component of color to be replaced + @param greenComponent Green component of color to be replaced + @param blueComponent Blue component of color to be replaced + */ - (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; @end diff --git a/framework/Source/GPUImageColorBurnBlendFilter.h b/framework/Source/GPUImageColorBurnBlendFilter.h index 0e4d30ebe..50ebb3f48 100644 --- a/framework/Source/GPUImageColorBurnBlendFilter.h +++ b/framework/Source/GPUImageColorBurnBlendFilter.h @@ -1,5 +1,7 @@ #import "GPUImageTwoInputFilter.h" +/** Applies a color burn blend of two images + */ @interface GPUImageColorBurnBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageColorDodgeBlendFilter.h b/framework/Source/GPUImageColorDodgeBlendFilter.h index b7d0db7fd..0f541c42f 100644 --- a/framework/Source/GPUImageColorDodgeBlendFilter.h +++ b/framework/Source/GPUImageColorDodgeBlendFilter.h @@ -1,5 +1,7 @@ #import "GPUImageTwoInputFilter.h" +/** Applies a color dodge blend of two images + */ @interface GPUImageColorDodgeBlendFilter : GPUImageTwoInputFilter { } diff --git a/framework/Source/GPUImageColorMatrixFilter.h b/framework/Source/GPUImageColorMatrixFilter.h index 33d72c26c..758872764 100644 --- a/framework/Source/GPUImageColorMatrixFilter.h +++ b/framework/Source/GPUImageColorMatrixFilter.h @@ -1,12 +1,19 @@ #import "GPUImageFilter.h" +/** Transforms the colors of an image by applying a matrix to them + */ @interface GPUImageColorMatrixFilter : GPUImageFilter { GLint colorMatrixUniform; GLint intensityUniform; } +/** A 4x4 matrix used to transform each color in an image + */ @property(readwrite, nonatomic) GPUMatrix4x4 colorMatrix; + +/** The degree to which the new transformed color replaces the original color for each pixel + */ @property(readwrite, nonatomic) CGFloat intensity; @end diff --git a/framework/Source/GPUImageContrastFilter.h b/framework/Source/GPUImageContrastFilter.h index 3b1c07a9e..e09e6dc49 100644 --- a/framework/Source/GPUImageContrastFilter.h +++ b/framework/Source/GPUImageContrastFilter.h @@ -1,11 +1,14 @@ #import "GPUImageFilter.h" +/** Adjusts the contrast of the image + */ @interface GPUImageContrastFilter : GPUImageFilter { GLint contrastUniform; } -// Contrast ranges from 0.0 to 4.0 (max contrast), with 1.0 as the normal level +/** Contrast ranges from 0.0 to 4.0 (max contrast), with 1.0 as the normal level + */ @property(readwrite, nonatomic) CGFloat contrast; @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index 4570b6e5f..5e36fb749 100644 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -1,12 +1,15 @@ #import "GPUImageTwoPassFilter.h" +/** A more generalized 9x9 Gaussian blur filter + */ @interface GPUImageGaussianBlurFilter : GPUImageTwoPassFilter { GLint horizontalBlurSizeUniform, verticalBlurSizeUniform; GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, blurSizeUniform; } -// A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 +/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 + */ @property (readwrite, nonatomic) CGFloat blurSize; @end diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h index 99e96ca14..99adc6fd2 100644 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h @@ -2,15 +2,25 @@ @class GPUImageGaussianBlurFilter; +/** A Gaussian blur that preserves focus within a circular region + */ @interface GPUImageGaussianSelectiveBlurFilter : GPUImageFilterGroup { GPUImageGaussianBlurFilter *blurFilter; GPUImageFilter *selectiveFocusFilter; } +/** The radius of the circular area being excluded from the blur + */ @property (readwrite, nonatomic) CGFloat excludeCircleRadius; +/** The center of the circular area being excluded from the blur + */ @property (readwrite, nonatomic) CGPoint excludeCirclePoint; +/** The size of the area between the blurred portion and the clear circle + */ @property (readwrite, nonatomic) CGFloat excludeBlurSize; +/** A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 + */ @property (readwrite, nonatomic) CGFloat blurSize; @end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index 2435b4c57..60758e239 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -6,6 +6,17 @@ @class GPUImageFastBlurFilter; @class GPUImageNonMaximumSuppressionFilter; +/** Harris corner detector + + First pass: reduce to luminance and take the derivative of the luminance texture (GPUImageXYDerivativeFilter) + + Second pass: blur the derivative (GPUImageFastBlurFilter) + + Third pass: apply the Harris corner detection calculation + + This is the Harris corner detector, as described in + C. Harris and M. Stephens. A Combined Corner and Edge Detector. Proc. Alvey Vision Conf., Univ. Manchester, pp. 147-151, 1988. + */ @interface GPUImageHarrisCornerDetectionFilter : GPUImageFilterGroup { GPUImageXYDerivativeFilter *derivativeFilter; @@ -15,7 +26,9 @@ GPUImageNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; GPUImageFilter *simpleThresholdFilter; } -// A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 + +/** A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 + */ @property (readwrite, nonatomic) CGFloat blurSize; @end diff --git a/framework/Source/GPUImageHazeFilter.h b/framework/Source/GPUImageHazeFilter.h index ac85445e8..eb3fbca62 100644 --- a/framework/Source/GPUImageHazeFilter.h +++ b/framework/Source/GPUImageHazeFilter.h @@ -8,19 +8,21 @@ * */ +/** The haze filter can be used to add or remove haze + + This is similar to a UV filter + */ @interface GPUImageHazeFilter : GPUImageFilter { GLint distanceUniform; GLint slopeUniform; } -/* - * Strength of the color applied. Default 0. Values between -.3 and .3 are best +/** Strength of the color applied. Default 0. Values between -.3 and .3 are best */ @property(readwrite, nonatomic) CGFloat distance; -/* - * Amount of color change. Default 0. Values between -.3 and .3 are best +/** Amount of color change. Default 0. Values between -.3 and .3 are best */ @property(readwrite, nonatomic) CGFloat slope; diff --git a/framework/Source/GPUImageLuminanceThresholdFilter.h b/framework/Source/GPUImageLuminanceThresholdFilter.h index 34cbba9e5..0abb9a1ec 100644 --- a/framework/Source/GPUImageLuminanceThresholdFilter.h +++ b/framework/Source/GPUImageLuminanceThresholdFilter.h @@ -1,11 +1,14 @@ #import "GPUImageFilter.h" +/** Pixels with a luminance above the threshold will appear white, and those below will be black + */ @interface GPUImageLuminanceThresholdFilter : GPUImageFilter { GLint thresholdUniform; } -// Anything above this luminance will be white, and anything below black. Ranges from 0.0 to 1.0, with 0.5 as the default +/** Anything above this luminance will be white, and anything below black. Ranges from 0.0 to 1.0, with 0.5 as the default + */ @property(readwrite, nonatomic) CGFloat threshold; @end diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index b0036b113..6056be860 100644 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -3,15 +3,20 @@ #import "GPUImageOpenGLESContext.h" #import "GPUImageOutput.h" +/** Source object for filtering movies + */ @interface GPUImageMovie : GPUImageOutput @property(readwrite, retain) NSURL *url; + +/** This enables the benchmarking mode, which logs out instantaneous and average frame times to the console + */ @property(readwrite, nonatomic) BOOL runBenchmark; -// Initialization and teardown +/// @name Initialization and teardown - (id)initWithURL:(NSURL *)url; -// Movie processing +/// @name Movie processing - (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; - (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; diff --git a/framework/Source/GPUImagePinchDistortionFilter.h b/framework/Source/GPUImagePinchDistortionFilter.h index c4bd24721..15bdd8b7c 100644 --- a/framework/Source/GPUImagePinchDistortionFilter.h +++ b/framework/Source/GPUImagePinchDistortionFilter.h @@ -1,15 +1,20 @@ #import "GPUImageFilter.h" +/** Creates a pinch distortion of the image + */ @interface GPUImagePinchDistortionFilter : GPUImageFilter { GLint radiusUniform, centerUniform, scaleUniform; } -// The center about which to apply the distortion, with a default of (0.5, 0.5) +/** The center about which to apply the distortion, with a default of (0.5, 0.5) + */ @property(readwrite, nonatomic) CGPoint center; -// The radius of the distortion, ranging from 0.0 to 2.0, with a default of 1.0 +/** The radius of the distortion, ranging from 0.0 to 2.0, with a default of 1.0 + */ @property(readwrite, nonatomic) CGFloat radius; -// The amount of distortion to apply, from -2.0 to 2.0, with a default of 0.5 +/** The amount of distortion to apply, from -2.0 to 2.0, with a default of 0.5 + */ @property(readwrite, nonatomic) CGFloat scale; @end diff --git a/framework/Source/GPUImagePosterizeFilter.h b/framework/Source/GPUImagePosterizeFilter.h index a0f809eec..6f655b3ea 100644 --- a/framework/Source/GPUImagePosterizeFilter.h +++ b/framework/Source/GPUImagePosterizeFilter.h @@ -1,11 +1,14 @@ #import "GPUImageFilter.h" +/** This reduces the color dynamic range into the number of steps specified, leading to a cartoon-like simple shading of the image. + */ @interface GPUImagePosterizeFilter : GPUImageFilter { GLint colorLevelsUniform; } -// The number of color levels to reduce the image space to. This ranges from 1 to 256, with a default of 10. +/** The number of color levels to reduce the image space to. This ranges from 1 to 256, with a default of 10. + */ @property(readwrite, nonatomic) NSUInteger colorLevels; @end diff --git a/framework/Source/GPUImageSaturationFilter.h b/framework/Source/GPUImageSaturationFilter.h index ac834afd0..1c6ff5bd6 100644 --- a/framework/Source/GPUImageSaturationFilter.h +++ b/framework/Source/GPUImageSaturationFilter.h @@ -1,11 +1,14 @@ #import "GPUImageFilter.h" +/** Adjusts the saturation of an image + */ @interface GPUImageSaturationFilter : GPUImageFilter { GLint saturationUniform; } -// Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 1.0 as the normal level +/** Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 1.0 as the normal level + */ @property(readwrite, nonatomic) CGFloat saturation; @end diff --git a/framework/Source/GPUImageStretchDistortionFilter.h b/framework/Source/GPUImageStretchDistortionFilter.h index 3bde0b12f..07803095b 100644 --- a/framework/Source/GPUImageStretchDistortionFilter.h +++ b/framework/Source/GPUImageStretchDistortionFilter.h @@ -1,10 +1,13 @@ #import "GPUImageFilter.h" +/** Creates a stretch distortion of the image + */ @interface GPUImageStretchDistortionFilter : GPUImageFilter { GLint centerUniform; } -// The center about which to apply the distortion, with a default of (0.5, 0.5) +/** The center about which to apply the distortion, with a default of (0.5, 0.5) + */ @property(readwrite, nonatomic) CGPoint center; @end diff --git a/framework/Source/GPUImageThresholdEdgeDetection.h b/framework/Source/GPUImageThresholdEdgeDetection.h index ebadca7d9..a00b0409b 100644 --- a/framework/Source/GPUImageThresholdEdgeDetection.h +++ b/framework/Source/GPUImageThresholdEdgeDetection.h @@ -5,7 +5,8 @@ GLint thresholdUniform; } -// Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.8 as the default +/** Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.8 as the default + */ @property(readwrite, nonatomic) CGFloat threshold; @end diff --git a/framework/Source/GPUImageToonFilter.h b/framework/Source/GPUImageToonFilter.h index cc9d556ed..ef8e17c3f 100644 --- a/framework/Source/GPUImageToonFilter.h +++ b/framework/Source/GPUImageToonFilter.h @@ -1,14 +1,19 @@ #import "GPUImage3x3TextureSamplingFilter.h" +/** This uses Sobel edge detection to place a black border around objects, + and then it quantizes the colors present in the image to give a cartoon-like quality to the image. + */ @interface GPUImageToonFilter : GPUImage3x3TextureSamplingFilter { GLint thresholdUniform, quantizationLevelsUniform; } -// The threshold at which to apply the edges, default of 0.2 +/** The threshold at which to apply the edges, default of 0.2 + */ @property(readwrite, nonatomic) CGFloat threshold; -// The levels of quantization for the posterization of colors within the scene, with a default of 10.0 +/** The levels of quantization for the posterization of colors within the scene, with a default of 10.0 + */ @property(readwrite, nonatomic) CGFloat quantizationLevels; @end diff --git a/framework/Source/GPUImageVignetteFilter.h b/framework/Source/GPUImageVignetteFilter.h index dff1bfcd7..4f6621987 100644 --- a/framework/Source/GPUImageVignetteFilter.h +++ b/framework/Source/GPUImageVignetteFilter.h @@ -1,12 +1,17 @@ #import "GPUImageFilter.h" +/** Performs a vignetting effect, fading out the image at the edges + */ @interface GPUImageVignetteFilter : GPUImageFilter { GLint xUniform, yUniform; } -// The directional intensity of the vignette effect, with a default of x = 0.75, y = 0.5 +/** The directional intensity of the vignette effect, with a default of x = 0.75, y = 0.5 + */ @property (nonatomic, readwrite) CGFloat x; +/** The directional intensity of the vignette effect, with a default of x = 0.75, y = 0.5 + */ @property (nonatomic, readwrite) CGFloat y; @end From ff825d505682e190b58c2e56a9a71e45a1e85db4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 14 May 2012 23:24:35 -0500 Subject: [PATCH 088/695] Fixed the vignette filter and renamed its properties to make more sense. Sped up the bilateral filter. Significantly improved the Harris corner detector. --- .../ShowcaseFilterViewController.m | 8 +- .../project.pbxproj | 4 + .../SimpleImageFilter/71yih.png | Bin 0 -> 3132 bytes .../SimpleImageViewController.m | 31 ++++-- .../Source/GPUImage3x3ConvolutionFilter.m | 8 +- framework/Source/GPUImageBilateralFilter.m | 24 ++-- framework/Source/GPUImageFilter.m | 7 +- .../GPUImageHarrisCornerDetectionFilter.h | 3 + .../GPUImageHarrisCornerDetectionFilter.m | 73 ++++++++++-- .../GPUImageNonMaximumSuppressionFilter.h | 7 +- .../GPUImageNonMaximumSuppressionFilter.m | 105 ++++++------------ framework/Source/GPUImageOutput.h | 1 + framework/Source/GPUImageOutput.m | 1 + framework/Source/GPUImageVignetteFilter.h | 10 +- framework/Source/GPUImageVignetteFilter.m | 58 ++++------ 15 files changed, 185 insertions(+), 155 deletions(-) create mode 100644 examples/SimpleImageFilter/SimpleImageFilter/71yih.png diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index dbb913c3b..abbbf2fbc 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -623,9 +623,9 @@ - (void)setupFilter; self.title = @"Vignette"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:-1.0]; - [self.filterSettingsSlider setMaximumValue:0.74]; - [self.filterSettingsSlider setValue:0.5]; + [self.filterSettingsSlider setMinimumValue:0.5]; + [self.filterSettingsSlider setMaximumValue:0.9]; + [self.filterSettingsSlider setValue:0.75]; filter = [[GPUImageVignetteFilter alloc] init]; }; break; @@ -823,7 +823,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; - case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setY:[(UISlider *)sender value]]; break; + case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setVignetteEnd:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; diff --git a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj index 1e1db03ec..90b394882 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + BC7CC64F1560909000468085 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC7CC64E1560909000468085 /* 71yih.png */; }; BCB5E7ED14E605A900701302 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7EC14E605A900701302 /* UIKit.framework */; }; BCB5E7EF14E605A900701302 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7EE14E605A900701302 /* Foundation.framework */; }; BCB5E7F114E605A900701302 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7F014E605A900701302 /* CoreGraphics.framework */; }; @@ -49,6 +50,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + BC7CC64E1560909000468085 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; BCB5E7E814E605A900701302 /* SimpleImageFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleImageFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCB5E7EC14E605A900701302 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCB5E7EE14E605A900701302 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -139,6 +141,7 @@ BCB5E7F314E605A900701302 /* Supporting Files */ = { isa = PBXGroup; children = ( + BC7CC64E1560909000468085 /* 71yih.png */, BCB5E86414E6F1D700701302 /* Lambeau.jpg */, BCB5E86214E6F05A00701302 /* WID-small.jpg */, BCB5E7F414E605A900701302 /* SimpleImageFilter-Info.plist */, @@ -236,6 +239,7 @@ BCB5E7F714E605A900701302 /* InfoPlist.strings in Resources */, BCB5E86314E6F05A00701302 /* WID-small.jpg in Resources */, BCB5E86514E6F1D700701302 /* Lambeau.jpg in Resources */, + BC7CC64F1560909000468085 /* 71yih.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/SimpleImageFilter/SimpleImageFilter/71yih.png b/examples/SimpleImageFilter/SimpleImageFilter/71yih.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c5603d4b469b553272b0e274624ac497688424 GIT binary patch literal 3132 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 WISvB(6mYx%0000 currentTarget in targets) { if (currentTarget != self.targetToIgnoreForUpdates) diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index 2435b4c57..d0c6689a8 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -18,4 +18,7 @@ // A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 @property (readwrite, nonatomic) CGFloat blurSize; +// This block is called on the detection of new corner points, usually on every processed frame +@property(nonatomic, copy) void(^cornersDetectedBlock)(GLfloat* cornerArray, NSUInteger cornersDetected); + @end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 6c15ca5a2..2d74d6d2d 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -6,6 +6,12 @@ #import "GPUImageFastBlurFilter.h" #import "GPUImageNonMaximumSuppressionFilter.h" +@interface GPUImageHarrisCornerDetectionFilter() + +- (void)extractCornerLocationsFromImage; + +@end + // This is the Harris corner detector, as described in // C. Harris and M. Stephens. A Combined Corner and Edge Detector. Proc. Alvey Vision Conf., Univ. Manchester, pp. 147-151, 1988. @@ -32,7 +38,7 @@ void main() // Original Harris detector // highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; - gl_FragColor = vec4(vec3(harrisIntensity * 10.0), 1.0); + gl_FragColor = vec4(vec3(harrisIntensity * 7.0), 1.0); } ); @@ -42,7 +48,7 @@ void main() uniform sampler2D inputImageTexture; - const lowp float threshold = 0.10; + const lowp float threshold = 0.50; void main() { @@ -57,6 +63,8 @@ void main() ); @synthesize blurSize; +@synthesize cornersDetectedBlock; + //@synthesize intensity = _intensity; - (id)init; @@ -85,22 +93,30 @@ - (id)init; [self addFilter:harrisCornerDetectionFilter]; // Fourth pass: apply non-maximum suppression to find the local maxima -// nonMaximumSuppressionFilter = [[GPUImageNonMaximumSuppressionFilter alloc] init]; -// [self addFilter:nonMaximumSuppressionFilter]; + nonMaximumSuppressionFilter = [[GPUImageNonMaximumSuppressionFilter alloc] init]; + [self addFilter:nonMaximumSuppressionFilter]; // Fifth pass: threshold the result simpleThresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageSimpleThresholdFragmentShaderString]; [self addFilter:simpleThresholdFilter]; + __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; + + [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter) { + NSLog(@"Frame processing completed for filter: %@", filter); + [weakSelf extractCornerLocationsFromImage]; + }]; + // [preblurFilter addTarget:luminanceFilter]; [derivativeFilter addTarget:blurFilter]; [blurFilter addTarget:harrisCornerDetectionFilter]; -// [harrisCornerDetectionFilter addTarget:nonMaximumSuppressionFilter]; -// [nonMaximumSuppressionFilter addTarget:simpleThresholdFilter]; - [harrisCornerDetectionFilter addTarget:simpleThresholdFilter]; + [harrisCornerDetectionFilter addTarget:nonMaximumSuppressionFilter]; + [nonMaximumSuppressionFilter addTarget:simpleThresholdFilter]; +// [harrisCornerDetectionFilter addTarget:simpleThresholdFilter]; // self.initialFilters = [NSArray arrayWithObjects:preblurFilter, nil]; self.initialFilters = [NSArray arrayWithObjects:derivativeFilter, nil]; +// self.terminalFilter = nonMaximumSuppressionFilter; // self.terminalFilter = harrisCornerDetectionFilter; self.terminalFilter = simpleThresholdFilter; @@ -109,6 +125,49 @@ - (id)init; return self; } + +#pragma mark - +#pragma mark Corner extraction + +- (void)extractCornerLocationsFromImage; +{ + CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + + GLfloat *cornersArray; + NSUInteger numberOfCorners = 0; + CGSize imageSize = simpleThresholdFilter.outputFrameSize; + + GLubyte *rawImagePixels = (GLubyte *)malloc(imageSize.width * imageSize.height * 4); + cornersArray = calloc(256 * 2, sizeof(GLfloat)); + + glReadPixels(0, 0, (int)imageSize.width, (int)imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + + for (unsigned int yCoordinate = 0; yCoordinate < imageSize.height; yCoordinate++) + { + for (unsigned int xCoordinate = 0; xCoordinate < imageSize.width; xCoordinate++) + { + GLubyte redByte = rawImagePixels[(yCoordinate * (int)imageSize.width + xCoordinate) * 4]; + if (redByte > 100) + { + cornersArray[numberOfCorners * 2] = (CGFloat)xCoordinate / imageSize.width; + cornersArray[numberOfCorners * 2 + 1] = (CGFloat)yCoordinate / imageSize.height; + numberOfCorners++; + } + } + } + + free(rawImagePixels); + + CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); + NSLog(@"Processing time : %f ms", 1000.0 * currentFrameTime); + + if (cornersDetectedBlock != NULL) + { + cornersDetectedBlock(cornersArray, numberOfCorners); + } + + free(cornersArray); +} #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.h b/framework/Source/GPUImageNonMaximumSuppressionFilter.h index 1c586dcc1..fd8fe6d68 100644 --- a/framework/Source/GPUImageNonMaximumSuppressionFilter.h +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.h @@ -1,8 +1,5 @@ -#import "GPUImageTwoPassFilter.h" +#import "GPUImage3x3TextureSamplingFilter.h" -@interface GPUImageNonMaximumSuppressionFilter : GPUImageTwoPassFilter -{ - GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform; -} +@interface GPUImageNonMaximumSuppressionFilter : GPUImage3x3TextureSamplingFilter @end diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m index 2685af192..44ff55bf2 100644 --- a/framework/Source/GPUImageNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.m @@ -1,60 +1,43 @@ #import "GPUImageNonMaximumSuppressionFilter.h" -NSString *const kGPUImageNonMaximumSuppressionVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; - - uniform highp float texelWidthOffset; - uniform highp float texelHeightOffset; - uniform highp float blurSize; - - varying highp vec2 centerTextureCoordinate; - varying highp vec2 oneStepNegativeTextureCoordinate; - varying highp vec2 twoStepsNegativeTextureCoordinate; - varying highp vec2 oneStepPositiveTextureCoordinate; - varying highp vec2 twoStepsPositiveTextureCoordinate; - - void main() - { - gl_Position = position; - - vec2 firstOffset = vec2(texelWidthOffset, texelHeightOffset) * 1.0; - vec2 secondOffset = vec2(texelWidthOffset, texelHeightOffset) * 2.0; - - centerTextureCoordinate = inputTextureCoordinate; - oneStepNegativeTextureCoordinate = inputTextureCoordinate - firstOffset; - twoStepsNegativeTextureCoordinate = inputTextureCoordinate - secondOffset; - oneStepPositiveTextureCoordinate = inputTextureCoordinate + firstOffset; - twoStepsPositiveTextureCoordinate = inputTextureCoordinate + secondOffset; - } -); - - NSString *const kGPUImageNonMaximumSuppressionFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; - varying highp vec2 centerTextureCoordinate; - varying highp vec2 oneStepNegativeTextureCoordinate; - varying highp vec2 twoStepsNegativeTextureCoordinate; - varying highp vec2 oneStepPositiveTextureCoordinate; - varying highp vec2 twoStepsPositiveTextureCoordinate; + varying highp vec2 textureCoordinate; + varying highp vec2 leftTextureCoordinate; + varying highp vec2 rightTextureCoordinate; + + varying highp vec2 topTextureCoordinate; + varying highp vec2 topLeftTextureCoordinate; + varying highp vec2 topRightTextureCoordinate; + + varying highp vec2 bottomTextureCoordinate; + varying highp vec2 bottomLeftTextureCoordinate; + varying highp vec2 bottomRightTextureCoordinate; void main() { - lowp float fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).r; - lowp float oneStepNegativeFragmentColor = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; - lowp float twoStepsNegativeFragmentColor = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; - lowp float oneStepPositiveFragmentColor = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; - lowp float twoStepsPositiveFragmentColor = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + lowp float bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).r; + lowp float bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + lowp float bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + lowp vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + lowp float leftColor = texture2D(inputImageTexture, leftTextureCoordinate).r; + lowp float rightColor = texture2D(inputImageTexture, rightTextureCoordinate).r; + lowp float topColor = texture2D(inputImageTexture, topTextureCoordinate).r; + lowp float topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).r; + lowp float topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).r; - lowp float maxValue = max(fragmentColor, oneStepNegativeFragmentColor); - maxValue = max(maxValue, twoStepsNegativeFragmentColor); - maxValue = max(maxValue, oneStepPositiveFragmentColor); - maxValue = max(maxValue, twoStepsPositiveFragmentColor); + lowp float maxValue = max(centerColor.r, bottomColor); + maxValue = max(maxValue, bottomLeftColor); + maxValue = max(maxValue, bottomRightColor); + maxValue = max(maxValue, leftColor); + maxValue = max(maxValue, rightColor); + maxValue = max(maxValue, topColor); + maxValue = max(maxValue, topRightColor); + maxValue = max(maxValue, topLeftColor); - gl_FragColor = vec4(fragmentColor * step(maxValue, fragmentColor)); + gl_FragColor = vec4((centerColor.rgb * step(maxValue, centerColor.r)), 1.0); } ); @@ -65,39 +48,13 @@ @implementation GPUImageNonMaximumSuppressionFilter - (id)init; { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageNonMaximumSuppressionVertexShaderString firstStageFragmentShaderFromString:kGPUImageNonMaximumSuppressionFragmentShaderString secondStageVertexShaderFromString:kGPUImageNonMaximumSuppressionVertexShaderString secondStageFragmentShaderFromString:kGPUImageNonMaximumSuppressionFragmentShaderString])) + if (!(self = [super initWithFragmentShaderFromString:kGPUImageNonMaximumSuppressionFragmentShaderString])) { - return nil; + return nil; } - verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; - - horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; - return self; } -- (void)setupFilterForSize:(CGSize)filterFrameSize; -{ - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); - glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); - } - else - { - glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); - } - - [secondFilterProgram use]; - glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); - glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); -} - @end diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index fba16eda0..060858857 100644 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -33,6 +33,7 @@ void report_memory(NSString *tag); @property(readwrite, nonatomic) BOOL shouldIgnoreUpdatesToThisTarget; @property(readwrite, nonatomic, retain) GPUImageMovieWriter *audioEncodingTarget; @property(readwrite, nonatomic, unsafe_unretained) id targetToIgnoreForUpdates; +@property(nonatomic, copy) void(^frameProcessingCompletionBlock)(GPUImageOutput*); /// @name Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 9ad7fdb1d..f763f6a44 100644 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -43,6 +43,7 @@ @implementation GPUImageOutput @synthesize shouldIgnoreUpdatesToThisTarget = _shouldIgnoreUpdatesToThisTarget; @synthesize audioEncodingTarget = _audioEncodingTarget; @synthesize targetToIgnoreForUpdates = _targetToIgnoreForUpdates; +@synthesize frameProcessingCompletionBlock = _frameProcessingCompletionBlock; #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageVignetteFilter.h b/framework/Source/GPUImageVignetteFilter.h index dff1bfcd7..ebfbca02a 100644 --- a/framework/Source/GPUImageVignetteFilter.h +++ b/framework/Source/GPUImageVignetteFilter.h @@ -2,11 +2,13 @@ @interface GPUImageVignetteFilter : GPUImageFilter { - GLint xUniform, yUniform; + GLint vignetteStartUniform, vignetteEndUniform; } -// The directional intensity of the vignette effect, with a default of x = 0.75, y = 0.5 -@property (nonatomic, readwrite) CGFloat x; -@property (nonatomic, readwrite) CGFloat y; +// The normalized distance from the center where the vignette effect starts. Default of 0.5. +@property (nonatomic, readwrite) CGFloat vignetteStart; + +// The normalized distance from the center where the vignette effect ends. Default of 0.75. +@property (nonatomic, readwrite) CGFloat vignetteEnd; @end diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m index a34b9f5b0..1b2a03680 100644 --- a/framework/Source/GPUImageVignetteFilter.m +++ b/framework/Source/GPUImageVignetteFilter.m @@ -5,22 +5,23 @@ uniform sampler2D inputImageTexture; varying highp vec2 textureCoordinate; - uniform highp float vignetteX; - uniform highp float vignetteY; + uniform highp float vignetteStart; + uniform highp float vignetteEnd; void main() -{ - lowp vec3 rgb = texture2D(inputImageTexture, textureCoordinate).xyz; + { + lowp vec3 rgb = texture2D(inputImageTexture, textureCoordinate).rgb; lowp float d = distance(textureCoordinate, vec2(0.5,0.5)); - rgb *= smoothstep(vignetteX, vignetteY, d); + rgb *= smoothstep(vignetteEnd, vignetteStart, d); gl_FragColor = vec4(vec3(rgb),1.0); -} - ); + } +); @implementation GPUImageVignetteFilter -@synthesize x=_x, y=_y; +@synthesize vignetteStart =_vignetteStart; +@synthesize vignetteEnd = _vignetteEnd; #pragma mark - #pragma mark Initialization and teardown @@ -32,11 +33,11 @@ - (id)init; return nil; } - xUniform = [filterProgram uniformIndex:@"vignetteX"]; - yUniform = [filterProgram uniformIndex:@"vignetteY"]; + vignetteStartUniform = [filterProgram uniformIndex:@"vignetteStart"]; + vignetteEndUniform = [filterProgram uniformIndex:@"vignetteEnd"]; - self.x = 0.75; - self.y = 0.50; + self.vignetteStart = 0.3; + self.vignetteEnd = 0.75; return self; } @@ -44,43 +45,22 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +- (void)setVignetteStart:(CGFloat)newValue; { - [super setInputRotation:newInputRotation atIndex:textureIndex]; - [self setX:self.x]; - [self setY:self.y]; -} - -- (void)setX:(CGFloat)x; -{ - _x = x; + _vignetteStart = newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(yUniform, _x); - } - else - { - glUniform1f(xUniform, _x); - } + glUniform1f(vignetteStartUniform, _vignetteStart); } -- (void)setY:(CGFloat)y; +- (void)setVignetteEnd:(CGFloat)newValue; { - _y = y; + _vignetteEnd = newValue; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(xUniform, _y); - } - else - { - glUniform1f(yUniform, _y); - } + glUniform1f(vignetteEndUniform, _vignetteEnd); } @end From 485181dcec4d0212fc62092d335f28e51cb36999 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 15 May 2012 09:39:09 -0500 Subject: [PATCH 089/695] Fixed the orientation of the front camera when switching between the two using -rotateCamera. --- README.md | 2 +- framework/Source/GPUImageVideoCamera.m | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d5bf56b61..432bee36a 100644 --- a/README.md +++ b/README.md @@ -385,7 +385,7 @@ One thing to note when adding fragment shaders to your Xcode project is that Xco ### Filtering and re-encoding a movie ### -Movies can be loaded into the framework via the GPUImageMovie class, filtered, and then written out using a GPUImageMovieWriter. GPUImageMovieWriter is also fast enough to record video in realtime from an iPhone 4's camera at 640x480, so a direct filtered video source can be fed into it. +Movies can be loaded into the framework via the GPUImageMovie class, filtered, and then written out using a GPUImageMovieWriter. GPUImageMovieWriter is also fast enough to record video in realtime from an iPhone 4's camera at 640x480, so a direct filtered video source can be fed into it. Currently, GPUImageMovieWriter is fast enough to record live 720p video at up to 20 FPS on the iPhone 4, and both 720p and 1080p video at 30 FPS on the iPhone 4S (as well as on the new iPad). The following is an example of how you would load a sample movie, pass it through a pixellation filter, then record the result to disk as a 480 x 640 h.264 movie: diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 452775903..b1c6c3bd3 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -237,6 +237,8 @@ - (void)rotateCamera //captureSession.sessionPreset = oriPreset; [_captureSession commitConfiguration]; } + + [self setOutputImageOrientation:_outputImageOrientation]; } - (AVCaptureDevicePosition)cameraPosition From 7ae0d3f264a49cc3d174686ecdfa2ca9f14f2e0c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 15 May 2012 11:41:35 -0500 Subject: [PATCH 090/695] Improved the speed of the box blur. --- framework/Source/GPUImageBoxBlurFilter.m | 43 ++++++------------- .../GPUImageHarrisCornerDetectionFilter.m | 3 +- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index a6f1c68f3..a8de30f43 100644 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -5,18 +5,14 @@ attribute vec4 position; attribute vec2 inputTextureCoordinate; - uniform mediump float texelWidthOffset; - uniform mediump float texelHeightOffset; + uniform float texelWidthOffset; + uniform float texelHeightOffset; - varying mediump vec2 centerTextureCoordinate; - varying mediump vec2 oneStepLeftTextureCoordinate; - varying mediump vec2 twoStepsLeftTextureCoordinate; -// varying mediump vec2 threeStepsLeftTextureCoordinate; - varying mediump vec2 oneStepRightTextureCoordinate; - varying mediump vec2 twoStepsRightTextureCoordinate; -// varying mediump vec2 threeStepsRightTextureCoordinate; - -// const float offset[3] = float[]( 0.0, 1.3846153846, 3.2307692308 ); + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; void main() { @@ -24,15 +20,12 @@ void main() vec2 firstOffset = vec2(1.5 * texelWidthOffset, 1.5 * texelHeightOffset); vec2 secondOffset = vec2(3.5 * texelWidthOffset, 3.5 * texelHeightOffset); -// vec2 thirdOffset = vec2(5.5 * texelWidthOffset, 5.5 * texelHeightOffset); centerTextureCoordinate = inputTextureCoordinate; oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset; twoStepsLeftTextureCoordinate = inputTextureCoordinate - secondOffset; -// threeStepsLeftTextureCoordinate = inputTextureCoordinate - thirdOffset; oneStepRightTextureCoordinate = inputTextureCoordinate + firstOffset; twoStepsRightTextureCoordinate = inputTextureCoordinate + secondOffset; -// threeStepsRightTextureCoordinate = inputTextureCoordinate + thirdOffset; } ); @@ -43,29 +36,19 @@ void main() uniform sampler2D inputImageTexture; - varying mediump vec2 centerTextureCoordinate; - varying mediump vec2 oneStepLeftTextureCoordinate; - varying mediump vec2 twoStepsLeftTextureCoordinate; -// varying mediump vec2 threeStepsLeftTextureCoordinate; - varying mediump vec2 oneStepRightTextureCoordinate; - varying mediump vec2 twoStepsRightTextureCoordinate; -// varying mediump vec2 threeStepsRightTextureCoordinate; + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; void main() { - mediump vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2; + lowp vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2; fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.2; fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.2; fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.2; fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.2; -// mediump vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.1428; -// fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.1428; -// fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.1428; -// fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.1428; -// fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.1428; - -// fragmentColor += texture2D(inputImageTexture, threeStepsLeftTextureCoordinate) * 0.1428; -// fragmentColor += texture2D(inputImageTexture, threeStepsRightTextureCoordinate) * 0.1428; gl_FragColor = fragmentColor; } diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 2d74d6d2d..a457ebca1 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -133,12 +133,11 @@ - (void)extractCornerLocationsFromImage; { CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); - GLfloat *cornersArray; NSUInteger numberOfCorners = 0; CGSize imageSize = simpleThresholdFilter.outputFrameSize; GLubyte *rawImagePixels = (GLubyte *)malloc(imageSize.width * imageSize.height * 4); - cornersArray = calloc(256 * 2, sizeof(GLfloat)); + GLfloat *cornersArray = calloc(256 * 2, sizeof(GLfloat)); glReadPixels(0, 0, (int)imageSize.width, (int)imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); From f96f568e194de608f9677aa825d34320731c560c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 15 May 2012 23:07:56 -0500 Subject: [PATCH 091/695] Added a crosshair overlay generator for visualizing image features. Completed my Harris corner detector, which now returns corner points from an image. --- .../SimpleImageViewController.h | 2 + .../SimpleImageViewController.m | 24 +++- framework/GPUImage.xcodeproj/project.pbxproj | 16 ++- framework/Source/GPUImage.h | 1 + framework/Source/GPUImageCrosshairGenerator.h | 17 +++ framework/Source/GPUImageCrosshairGenerator.m | 118 ++++++++++++++++++ framework/Source/GPUImageFilterGroup.h | 1 + framework/Source/GPUImageFilterGroup.m | 8 +- .../GPUImageGaussianSelectiveBlurFilter.m | 2 +- .../GPUImageHarrisCornerDetectionFilter.h | 2 +- .../GPUImageHarrisCornerDetectionFilter.m | 19 ++- .../GPUImageNonMaximumSuppressionFilter.m | 12 +- framework/Source/GPUImagePicture.h | 1 + framework/Source/GPUImagePicture.m | 14 ++- framework/Source/GPUImageTiltShiftFilter.m | 2 +- framework/Source/GPUImageUnsharpMaskFilter.m | 2 +- 16 files changed, 207 insertions(+), 34 deletions(-) create mode 100644 framework/Source/GPUImageCrosshairGenerator.h create mode 100644 framework/Source/GPUImageCrosshairGenerator.m diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h index c44325852..cc61ee34f 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h @@ -5,6 +5,8 @@ { GPUImagePicture *sourcePicture; GPUImageFilter *sepiaFilter, *sepiaFilter2; + GPUImageCrosshairGenerator *crosshairGenerator; + GPUImageAlphaBlendFilter *blendFilter; } // Image filtering diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index f0bfd87bf..e66995a0a 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -78,20 +78,32 @@ - (void)setupImageFilteringToDisk; // [vignetteImageFilter prepareForImageCapture]; GPUImageHarrisCornerDetectionFilter *stillImageFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; + crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; + [crosshairGenerator forceProcessingAtSize:[stillImageSource outputImageSize]]; + [stillImageFilter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected) { - for (unsigned int currentPointIndex = 0; currentPointIndex < cornersDetected; currentPointIndex++) - { - NSLog(@"Current point: %f, %f", cornerArray[currentPointIndex * 2], cornerArray[(currentPointIndex * 2) + 1]); - } + [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected]; }]; - [stillImageFilter prepareForImageCapture]; +// [stillImageFilter prepareForImageCapture]; [stillImageSource addTarget:stillImageFilter]; + + blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + blendFilter.mix = 0.75; + [stillImageSource addTarget:blendFilter]; +// [stillImageFilter addTarget:blendFilter]; +// stillImageFilter.targetToIgnoreForUpdates = blendFilter; + + [crosshairGenerator addTarget:blendFilter]; + stillImageSource.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend + [blendFilter prepareForImageCapture]; [stillImageSource processImage]; // UIImage *currentFilteredImage = [vignetteImageFilter imageFromCurrentlyProcessedOutput]; - UIImage *currentFilteredImage = [stillImageFilter imageFromCurrentlyProcessedOutput]; +// UIImage *currentFilteredImage = [stillImageFilter imageFromCurrentlyProcessedOutput]; +// UIImage *currentFilteredImage = [crosshairGenerator imageFromCurrentlyProcessedOutput]; + UIImage *currentFilteredImage = [blendFilter imageFromCurrentlyProcessedOutput]; // Do a simpler image filtering GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 6164a20f7..2ab6680d4 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -58,6 +58,8 @@ BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; }; BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */; }; + BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; }; + BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */; }; BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; @@ -254,6 +256,8 @@ BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBilateralFilter.h; path = Source/GPUImageBilateralFilter.h; sourceTree = SOURCE_ROOT; }; BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBilateralFilter.m; path = Source/GPUImageBilateralFilter.m; sourceTree = SOURCE_ROOT; }; + BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCrosshairGenerator.h; path = Source/GPUImageCrosshairGenerator.h; sourceTree = SOURCE_ROOT; }; + BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCrosshairGenerator.m; path = Source/GPUImageCrosshairGenerator.m; sourceTree = SOURCE_ROOT; }; BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStillCamera.h; path = Source/GPUImageStillCamera.h; sourceTree = SOURCE_ROOT; }; BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStillCamera.m; path = Source/GPUImageStillCamera.m; sourceTree = SOURCE_ROOT; }; BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; @@ -523,10 +527,6 @@ BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */, BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */, BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */, - BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */, - BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */, - BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */, - BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */, BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */, BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */, BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */, @@ -639,8 +639,14 @@ BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */, + BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */, + BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */, + BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */, + BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */, BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */, BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */, + BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */, + BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */, ); name = "Image processing"; sourceTree = ""; @@ -816,6 +822,7 @@ BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */, BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */, BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */, + BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1014,6 +1021,7 @@ BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */, BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */, BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */, + BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index ca9c6dafc..32e9a76f3 100644 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -82,3 +82,4 @@ #import "GPUImageRGBFilter.h" #import "GPUImageMedianFilter.h" #import "GPUImageBilateralFilter.h" +#import "GPUImageCrosshairGenerator.h" diff --git a/framework/Source/GPUImageCrosshairGenerator.h b/framework/Source/GPUImageCrosshairGenerator.h new file mode 100644 index 000000000..0c3200c63 --- /dev/null +++ b/framework/Source/GPUImageCrosshairGenerator.h @@ -0,0 +1,17 @@ +#import "GPUImageFilter.h" + +@interface GPUImageCrosshairGenerator : GPUImageFilter +{ + GLint crosshairWidthUniform, crosshairColorUniform; +} + +// The width of the displayed crosshairs, in pixels. Currently this only works well for odd widths. The default is 5. +@property(readwrite, nonatomic) CGFloat crosshairWidth; + +// The color of the crosshairs is specified using individual red, green, and blue components (normalized to 1.0). The default is green: (0.0, 1.0, 0.0). +- (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; + +// Rendering +- (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInteger)numberOfCrosshairs; + +@end diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m new file mode 100644 index 000000000..23d738a45 --- /dev/null +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -0,0 +1,118 @@ +#import "GPUImageCrosshairGenerator.h" + +NSString *const kGPUImageCrosshairVertexShaderString = SHADER_STRING +( + attribute vec4 position; + + uniform float crosshairWidth; + + varying lowp vec2 centerLocation; + varying lowp float pointSpacing; + + void main() + { + gl_Position = vec4(((position.xy * 2.0) - 1.0), 0.0, 1.0); + gl_PointSize = crosshairWidth + 1.0; + pointSpacing = 1.0 / crosshairWidth; + centerLocation = vec2(pointSpacing * ceil(crosshairWidth / 2.0), pointSpacing * ceil(crosshairWidth / 2.0)); + } +); + +NSString *const kGPUImageCrosshairFragmentShaderString = SHADER_STRING +( + + uniform lowp vec3 crosshairColor; + + varying lowp vec2 centerLocation; + varying lowp float pointSpacing; + + void main() + { + lowp vec2 distanceFromCenter = abs(centerLocation - gl_PointCoord.xy); + lowp float axisTest = step(pointSpacing, gl_PointCoord.y) * step(distanceFromCenter.x, 0.09) + step(pointSpacing, gl_PointCoord.x) * step(distanceFromCenter.y, 0.09); + + gl_FragColor = vec4(crosshairColor * axisTest, axisTest); +// gl_FragColor = vec4(distanceFromCenterInX, distanceFromCenterInY, 0.0, 1.0); + } +); + + +@implementation GPUImageCrosshairGenerator + +@synthesize crosshairWidth = _crosshairWidth; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageCrosshairVertexShaderString fragmentShaderFromString:kGPUImageCrosshairFragmentShaderString])) + { + return nil; + } + + crosshairWidthUniform = [filterProgram uniformIndex:@"crosshairWidth"]; + crosshairColorUniform = [filterProgram uniformIndex:@"crosshairColor"]; + + self.crosshairWidth = 5.0; + [self setCrosshairColorRed:1.0 green:0.0 blue:0.0]; + + return self; +} + +#pragma mark - +#pragma mark Rendering + +- (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInteger)numberOfCrosshairs; +{ + if (self.preventRendering) + { + return; + } + + [GPUImageOpenGLESContext useImageProcessingContext]; + + [self setFilterFBO]; + + [filterProgram use]; + + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, crosshairCoordinates); + + glDrawArrays(GL_POINTS, 0, numberOfCrosshairs); + + [self informTargetsAboutNewFrameAtTime:kCMTimeInvalid]; +} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + // Prevent rendering of the frame by normal means +} + +#pragma mark - +#pragma mark Accessors + +- (void)setCrosshairWidth:(CGFloat)newValue; +{ + _crosshairWidth = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(crosshairWidthUniform, _crosshairWidth); +} + +- (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +{ + GLfloat colorToReplace[3]; + colorToReplace[0] = redComponent; + colorToReplace[1] = greenComponent; + colorToReplace[2] = blueComponent; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform3fv(crosshairColorUniform, 1, colorToReplace); +} + +@end diff --git a/framework/Source/GPUImageFilterGroup.h b/framework/Source/GPUImageFilterGroup.h index e3b53e8ef..4a3c00fd4 100644 --- a/framework/Source/GPUImageFilterGroup.h +++ b/framework/Source/GPUImageFilterGroup.h @@ -9,6 +9,7 @@ @property(readwrite, nonatomic, strong) GPUImageOutput *terminalFilter; @property(readwrite, nonatomic, strong) NSArray *initialFilters; +@property(readwrite, nonatomic, strong) GPUImageOutput *inputFilterToIgnoreForUpdates; // Filter management - (void)addFilter:(GPUImageOutput *)newFilter; diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index f53bcf3cf..99fc69e9e 100644 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -6,6 +6,7 @@ @implementation GPUImageFilterGroup @synthesize terminalFilter = _terminalFilter; @synthesize initialFilters = _initialFilters; +@synthesize inputFilterToIgnoreForUpdates = _inputFilterToIgnoreForUpdates; - (id)init; { @@ -63,6 +64,11 @@ - (void)prepareForImageCapture; #pragma mark - #pragma mark GPUImageOutput overrides +- (void)setTargetToIgnoreForUpdates:(id)targetToIgnoreForUpdates; +{ + [_terminalFilter setTargetToIgnoreForUpdates:targetToIgnoreForUpdates]; +} + - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; { [_terminalFilter addTarget:newTarget atTextureLocation:textureLocation]; @@ -85,7 +91,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; { for (GPUImageOutput *currentFilter in _initialFilters) { - if (currentFilter != self.targetToIgnoreForUpdates) + if (currentFilter != self.inputFilterToIgnoreForUpdates) { [currentFilter newFrameReadyAtTime:frameTime]; } diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index a2b3aa52b..ffbeecca7 100644 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -49,7 +49,7 @@ - (id)init; [blurFilter addTarget:selectiveFocusFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - self.targetToIgnoreForUpdates = selectiveFocusFilter; + self.inputFilterToIgnoreForUpdates = selectiveFocusFilter; self.initialFilters = [NSArray arrayWithObjects:blurFilter, selectiveFocusFilter, nil]; self.terminalFilter = selectiveFocusFilter; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index d0c6689a8..a3c555e7a 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -18,7 +18,7 @@ // A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 @property (readwrite, nonatomic) CGFloat blurSize; -// This block is called on the detection of new corner points, usually on every processed frame +// This block is called on the detection of new corner points, usually on every processed frame. A C array containing normalized coordinates in X, Y pairs is passed in, along with a count of the number of corners detected @property(nonatomic, copy) void(^cornersDetectedBlock)(GLfloat* cornerArray, NSUInteger cornersDetected); @end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index a457ebca1..83bee1cad 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -56,7 +56,8 @@ void main() lowp float thresholdValue = step(threshold, intensity); - gl_FragColor = vec4(thresholdValue, 0.0, 0.0, thresholdValue); +// gl_FragColor = vec4(thresholdValue, 0.0, 0.0, thresholdValue); + gl_FragColor = vec4(thresholdValue, 0.0, 0.0, 1.0); // gl_FragColor = vec4(intensity, intensity, intensity, 1.0); // gl_FragColor = vec4(intensity, 0.0, 0.0, intensity); } @@ -74,9 +75,6 @@ - (id)init; return nil; } -// preblurFilter = [[GPUImageFastBlurFilter alloc] init]; -// [self addFilter:preblurFilter]; - // First pass: reduce to luminance and take the derivative of the luminance texture derivativeFilter = [[GPUImageXYDerivativeFilter alloc] init]; // derivativeFilter.imageWidthFactor = 256.0; @@ -103,21 +101,18 @@ - (id)init; __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter) { - NSLog(@"Frame processing completed for filter: %@", filter); [weakSelf extractCornerLocationsFromImage]; }]; -// [preblurFilter addTarget:luminanceFilter]; [derivativeFilter addTarget:blurFilter]; [blurFilter addTarget:harrisCornerDetectionFilter]; [harrisCornerDetectionFilter addTarget:nonMaximumSuppressionFilter]; [nonMaximumSuppressionFilter addTarget:simpleThresholdFilter]; -// [harrisCornerDetectionFilter addTarget:simpleThresholdFilter]; // self.initialFilters = [NSArray arrayWithObjects:preblurFilter, nil]; self.initialFilters = [NSArray arrayWithObjects:derivativeFilter, nil]; -// self.terminalFilter = nonMaximumSuppressionFilter; // self.terminalFilter = harrisCornerDetectionFilter; +// self.terminalFilter = nonMaximumSuppressionFilter; self.terminalFilter = simpleThresholdFilter; // self.intensity = 1.0; @@ -144,13 +139,17 @@ - (void)extractCornerLocationsFromImage; for (unsigned int yCoordinate = 0; yCoordinate < imageSize.height; yCoordinate++) { for (unsigned int xCoordinate = 0; xCoordinate < imageSize.width; xCoordinate++) - { + { GLubyte redByte = rawImagePixels[(yCoordinate * (int)imageSize.width + xCoordinate) * 4]; if (redByte > 100) { cornersArray[numberOfCorners * 2] = (CGFloat)xCoordinate / imageSize.width; - cornersArray[numberOfCorners * 2 + 1] = (CGFloat)yCoordinate / imageSize.height; + cornersArray[numberOfCorners * 2 + 1] = (CGFloat)(yCoordinate + 1) / imageSize.height; numberOfCorners++; + if (numberOfCorners > 255) + { + numberOfCorners = 255; + } } } } diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m index 44ff55bf2..f65b9c10f 100644 --- a/framework/Source/GPUImageNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.m @@ -28,16 +28,18 @@ void main() lowp float topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).r; lowp float topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + // Use a tiebreaker for pixels to the left and immediately above this one + lowp float multiplier = 1.0 - step(centerColor.r, topColor); + multiplier = multiplier * 1.0 - step(centerColor.r, topLeftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, leftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, bottomLeftColor); + lowp float maxValue = max(centerColor.r, bottomColor); - maxValue = max(maxValue, bottomLeftColor); maxValue = max(maxValue, bottomRightColor); - maxValue = max(maxValue, leftColor); maxValue = max(maxValue, rightColor); - maxValue = max(maxValue, topColor); maxValue = max(maxValue, topRightColor); - maxValue = max(maxValue, topLeftColor); - gl_FragColor = vec4((centerColor.rgb * step(maxValue, centerColor.r)), 1.0); + gl_FragColor = vec4((centerColor.rgb * step(maxValue, centerColor.r) * multiplier), 1.0); } ); diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 6bb79ba1f..20adeec64 100644 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -13,5 +13,6 @@ // Image rendering - (void)processImage; +- (CGSize)outputImageSize; @end diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 9c8817b9c..85f4231c9 100644 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -108,10 +108,7 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly - (void)processImage; { - CGSize pointSizeOfImage = [imageSource size]; - CGFloat scaleOfImage = [imageSource scale]; - CGSize pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); - pixelSizeOfImage = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; + CGSize pixelSizeOfImage = [self outputImageSize]; for (id currentTarget in targets) { @@ -123,4 +120,13 @@ - (void)processImage; } } +- (CGSize)outputImageSize; +{ + CGSize pointSizeOfImage = [imageSource size]; + CGFloat scaleOfImage = [imageSource scale]; + CGSize pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); + pixelSizeOfImage = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; + return pixelSizeOfImage; +} + @end diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index b3b583a1a..5e70d6c67 100644 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -53,7 +53,7 @@ - (id)init; [blurFilter addTarget:tiltShiftFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - self.targetToIgnoreForUpdates = tiltShiftFilter; + self.inputFilterToIgnoreForUpdates = tiltShiftFilter; self.initialFilters = [NSArray arrayWithObjects:blurFilter, tiltShiftFilter, nil]; self.terminalFilter = tiltShiftFilter; diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index 8a557709a..1a7eac19e 100644 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -48,7 +48,7 @@ - (id)init; [blurFilter addTarget:unsharpMaskFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - self.targetToIgnoreForUpdates = unsharpMaskFilter; + self.inputFilterToIgnoreForUpdates = unsharpMaskFilter; self.initialFilters = [NSArray arrayWithObjects:blurFilter, unsharpMaskFilter, nil]; self.terminalFilter = unsharpMaskFilter; From ff212dcd13183a65f1fd28fbec549f40ef599a30 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 15 May 2012 23:44:28 -0500 Subject: [PATCH 092/695] Returned the SimpleImageFilter back to its normal operation and integrated the new Harris filter into the showcase. --- .../ShowcaseFilterViewController.m | 26 +++++++++-- .../project.pbxproj | 4 -- .../SimpleImageFilter/71yih.png | Bin 3132 -> 0 bytes .../SimpleImageViewController.h | 2 - .../SimpleImageViewController.m | 42 ++++-------------- framework/Source/GPUImageCrosshairGenerator.m | 2 +- .../GPUImageHarrisCornerDetectionFilter.h | 8 +++- .../GPUImageHarrisCornerDetectionFilter.m | 40 ++++++++++------- 8 files changed, 61 insertions(+), 63 deletions(-) delete mode 100644 examples/SimpleImageFilter/SimpleImageFilter/71yih.png diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index abbbf2fbc..e727daf49 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -315,8 +315,12 @@ - (void)setupFilter; case GPUIMAGE_HARRISCORNERDETECTION: { self.title = @"Harris Corner Detection"; - self.filterSettingsSlider.hidden = YES; + self.filterSettingsSlider.hidden = NO; + [self.filterSettingsSlider setMinimumValue:0.1]; + [self.filterSettingsSlider setMaximumValue:0.9]; + [self.filterSettingsSlider setValue:0.2]; + filter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; }; break; case GPUIMAGE_PREWITTEDGEDETECTION: @@ -771,12 +775,25 @@ - (void)setupFilter; } else if (filterType == GPUIMAGE_HARRISCORNERDETECTION) { + GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; + crosshairGenerator.crosshairWidth = 15.0; + [crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; + + [(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected) { + [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected]; + }]; + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; +// [videoCamera addTarget:blendFilter]; + GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; + [videoCamera addTarget:gammaFilter]; + [gammaFilter addTarget:blendFilter]; + gammaFilter.targetToIgnoreForUpdates = blendFilter; - [videoCamera addTarget:blendFilter]; - [filter addTarget:blendFilter]; - videoCamera.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend + [crosshairGenerator addTarget:blendFilter]; +// videoCamera.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend +// [crosshairGenerator addTarget:filterView]; [blendFilter addTarget:filterView]; } else @@ -819,6 +836,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; + case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj index 90b394882..1e1db03ec 100644 --- a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - BC7CC64F1560909000468085 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC7CC64E1560909000468085 /* 71yih.png */; }; BCB5E7ED14E605A900701302 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7EC14E605A900701302 /* UIKit.framework */; }; BCB5E7EF14E605A900701302 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7EE14E605A900701302 /* Foundation.framework */; }; BCB5E7F114E605A900701302 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7F014E605A900701302 /* CoreGraphics.framework */; }; @@ -50,7 +49,6 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - BC7CC64E1560909000468085 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; BCB5E7E814E605A900701302 /* SimpleImageFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleImageFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCB5E7EC14E605A900701302 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCB5E7EE14E605A900701302 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -141,7 +139,6 @@ BCB5E7F314E605A900701302 /* Supporting Files */ = { isa = PBXGroup; children = ( - BC7CC64E1560909000468085 /* 71yih.png */, BCB5E86414E6F1D700701302 /* Lambeau.jpg */, BCB5E86214E6F05A00701302 /* WID-small.jpg */, BCB5E7F414E605A900701302 /* SimpleImageFilter-Info.plist */, @@ -239,7 +236,6 @@ BCB5E7F714E605A900701302 /* InfoPlist.strings in Resources */, BCB5E86314E6F05A00701302 /* WID-small.jpg in Resources */, BCB5E86514E6F1D700701302 /* Lambeau.jpg in Resources */, - BC7CC64F1560909000468085 /* 71yih.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/SimpleImageFilter/SimpleImageFilter/71yih.png b/examples/SimpleImageFilter/SimpleImageFilter/71yih.png deleted file mode 100644 index f7c5603d4b469b553272b0e274624ac497688424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3132 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 WISvB(6mYx%0000 255) + if (numberOfCorners > 511) { - numberOfCorners = 255; + numberOfCorners = 511; } } } @@ -180,10 +180,16 @@ - (CGFloat)blurSize; return blurFilter.blurSize; } -//- (void)setIntensity:(CGFloat)newValue; -//{ -// _intensity = newValue; -// [unsharpMaskFilter setFloat:newValue forUniform:@"intensity"]; -//} +- (void)setSensitivity:(CGFloat)newValue; +{ + _sensitivity = newValue; + [harrisCornerDetectionFilter setFloat:newValue forUniform:@"sensitivity"]; +} + +- (void)setThreshold:(CGFloat)newValue; +{ + _threshold = newValue; + [simpleThresholdFilter setFloat:newValue forUniform:@"threshold"]; +} @end From d25b072a0ff067d9fb685274a35145caa184c235 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 16 May 2012 10:29:34 -0500 Subject: [PATCH 093/695] Documented the Harris corner detection filter, and tweaked the FilterShowcase defaults to better show it off on iPhone 4. --- README.md | 12 ++++++++++++ .../FilterShowcase/ShowcaseFilterViewController.m | 13 ++++++------- .../Source/GPUImageHarrisCornerDetectionFilter.h | 2 +- .../Source/GPUImageHarrisCornerDetectionFilter.m | 2 +- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 432bee36a..dedd98b7f 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,18 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageEmbossFilter**: Applies an embossing effect on the image - *intensity*: The strength of the embossing, from 0.0 to 4.0, with 1.0 as the normal level +- **GPUImageHarrisCornerDetectionFilter**: Runs the Harris corner detection algorithm on an input image, and produces an image with those corner points as white pixels and everything else black. The cornersDetectedBlock can be set, and you will be provided with a list of corners (in normalized 0..1 X, Y coordinates) within that callback for whatever additional operations you want to perform. + - *blurSize*: The relative size of the blur applied as part of the corner detection implementation. The default is 1.0. + - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 10.0. + - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.05. + +- *GPUImageNonMaximumSuppressionFilter*: Currently used only as part of the Harris corner detection filter, this will sample a 1-pixel box around each pixel and determine if the center pixel's red channel is the maximum in that area. If it is, it stays. If not, it is set to 0 for all color components. + +- *GPUImageXYDerivativeFilter*: An internal component within the Harris corner detection filter, this calculates the squared difference between the pixels to the left and right of this one, the squared difference of the pixels above and below this one, and the product of those two differences. + +- *GPUImageCrosshairGenerator*: This draws a series of crosshairs on an image, most often used for identifying machine vision features. It does not take in a standard image like other filters, but a series of points in its -renderCrosshairsFromArray:count: method, which does the actual drawing. You will need to force this filter to render at the particular output size you need. + - *crosshairWidth*: The width, in pixels, of the crosshairs to be drawn onscreen. + ### Blending modes ### - **GPUImageChromaKeyBlendFilter**: Selectively replaces a color in the first image with the second image diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index e727daf49..b526ce7ca 100644 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -317,11 +317,12 @@ - (void)setupFilter; self.title = @"Harris Corner Detection"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:0.1]; - [self.filterSettingsSlider setMaximumValue:0.9]; - [self.filterSettingsSlider setValue:0.2]; + [self.filterSettingsSlider setMinimumValue:0.01]; + [self.filterSettingsSlider setMaximumValue:0.20]; + [self.filterSettingsSlider setValue:0.05]; filter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; + [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:0.05]; }; break; case GPUIMAGE_PREWITTEDGEDETECTION: { @@ -784,16 +785,13 @@ - (void)setupFilter; }]; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; -// [videoCamera addTarget:blendFilter]; GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; [videoCamera addTarget:gammaFilter]; [gammaFilter addTarget:blendFilter]; gammaFilter.targetToIgnoreForUpdates = blendFilter; [crosshairGenerator addTarget:blendFilter]; -// videoCamera.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend - -// [crosshairGenerator addTarget:filterView]; + [blendFilter addTarget:filterView]; } else @@ -837,6 +835,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; +// case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setSensitivity:[(UISlider*)sender value]]; break; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index d4f9aaf8e..8045c26ea 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -21,7 +21,7 @@ // This changes the dynamic range of the Harris corner detector by amplifying small cornerness values. Default is 10.0. @property(readwrite, nonatomic) CGFloat sensitivity; -// A threshold value at which a point is recognized as being a corner after the non-maximum suppression. Default is 0.2. +// A threshold value at which a point is recognized as being a corner after the non-maximum suppression. Default is 0.05. @property(readwrite, nonatomic) CGFloat threshold; // This block is called on the detection of new corner points, usually on every processed frame. A C array containing normalized coordinates in X, Y pairs is passed in, along with a count of the number of corners detected diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index ccf702aff..1b5503bc3 100644 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -116,7 +116,7 @@ - (id)init; self.blurSize = 1.0; self.sensitivity = 10.0; - self.threshold = 0.2; + self.threshold = 0.05; return self; } From 1aeb725ab895f2c6a42c99db35c1e08450ba4fd9 Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Thu, 17 May 2012 00:54:48 -0600 Subject: [PATCH 094/695] Added Perlin Noise Filter --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 14 + framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/GPUImagePerlinNoiseFilter.h | 20 ++ framework/GPUImagePerlinNoiseFilter.m | 152 ++++++++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageJFAVoroni.h | 19 - framework/Source/GPUImageJFAVoroni.m | 336 ------------------ .../Source/GPUImageVoroniConsumerFilter.h | 13 - .../Source/GPUImageVoroniConsumerFilter.m | 56 --- 11 files changed, 197 insertions(+), 424 deletions(-) create mode 100644 framework/GPUImagePerlinNoiseFilter.h create mode 100644 framework/GPUImagePerlinNoiseFilter.m delete mode 100644 framework/Source/GPUImageJFAVoroni.h delete mode 100644 framework/Source/GPUImageJFAVoroni.m delete mode 100644 framework/Source/GPUImageVoroniConsumerFilter.h delete mode 100644 framework/Source/GPUImageVoroniConsumerFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 28a4db00a..18b72101f 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -100,6 +100,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_BULGE: cell.textLabel.text = @"Bulge"; break; case GPUIMAGE_PINCH: cell.textLabel.text = @"Pinch"; break; case GPUIMAGE_STRETCH: cell.textLabel.text = @"Stretch"; break; + case GPUIMAGE_PERLINNOISE: cell.textLabel.text = @"Perlin Noise"; break; case GPUIMAGE_CHROMAKEY: cell.textLabel.text = @"Chroma key (green)"; break; case GPUIMAGE_DISSOLVE: cell.textLabel.text = @"Dissolve blend"; break; case GPUIMAGE_SCREENBLEND: cell.textLabel.text = @"Screen blend"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 1489709c8..d683b7f06 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -49,6 +49,7 @@ typedef enum { GPUIMAGE_BULGE, GPUIMAGE_PINCH, GPUIMAGE_STRETCH, + GPUIMAGE_PERLINNOISE, GPUIMAGE_DISSOLVE, GPUIMAGE_CHROMAKEY, GPUIMAGE_MULTIPLY, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index b526ce7ca..b8dc62099 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -482,6 +482,19 @@ - (void)setupFilter; self.filterSettingsSlider.hidden = YES; filter = [[GPUImageStretchDistortionFilter alloc] init]; + }; break; + case GPUIMAGE_PERLINNOISE: + { + self.title = @"Perlin Noise"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:1.0]; + [self.filterSettingsSlider setMaximumValue:30.0]; + [self.filterSettingsSlider setValue:8.0]; + + filter = [[GPUImagePerlinNoiseFilter alloc] init]; + + }; break; case GPUIMAGE_CHROMAKEY: { @@ -840,6 +853,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; + case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setVignetteEnd:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 2ab6680d4..898acfba6 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -202,6 +202,8 @@ BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; + F2D6D0171564D44500A1289F /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */; }; + F2D6D0181564D44500A1289F /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -399,6 +401,8 @@ BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; + F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPUImagePerlinNoiseFilter.h; sourceTree = SOURCE_ROOT; }; + F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -515,6 +519,8 @@ BC1B715F14F4B06600ACA2AB /* Effects */ = { isa = PBXGroup; children = ( + F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */, + F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */, BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */, BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */, BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */, @@ -823,6 +829,7 @@ BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */, BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */, BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */, + F2D6D0171564D44500A1289F /* GPUImagePerlinNoiseFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1022,6 +1029,7 @@ BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */, BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */, BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */, + F2D6D0181564D44500A1289F /* GPUImagePerlinNoiseFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/GPUImagePerlinNoiseFilter.h b/framework/GPUImagePerlinNoiseFilter.h new file mode 100644 index 000000000..2b4adcc81 --- /dev/null +++ b/framework/GPUImagePerlinNoiseFilter.h @@ -0,0 +1,20 @@ +// +// GPUImagePerlinNoiseFilter.h +// Face Esplode +// +// Created by Jacob Gundersen on 5/15/12. +// +// + +#import "GPUImageFilter.h" + +@interface GPUImagePerlinNoiseFilter : GPUImageFilter { + GLint scaleUniform, colorStartUniform, colorFinishUniform; +} + +@property (readwrite, nonatomic) GPUVector4 colorStart; +@property (readwrite, nonatomic) GPUVector4 colorFinish; + +@property (readwrite, nonatomic) float scale; + +@end diff --git a/framework/GPUImagePerlinNoiseFilter.m b/framework/GPUImagePerlinNoiseFilter.m new file mode 100644 index 000000000..731f5eda0 --- /dev/null +++ b/framework/GPUImagePerlinNoiseFilter.m @@ -0,0 +1,152 @@ +// +// GPUImagePerlinNoiseFilter.m +// Face Esplode +// +// Created by Jacob Gundersen on 5/15/12. +// +// + +#import "GPUImagePerlinNoiseFilter.h" + +NSString *const kGPUImagePerlinNoiseFragmentShaderString = SHADER_STRING +( + precision highp float; + varying highp vec2 textureCoordinate; + uniform float scale; + + uniform vec4 colorStart; + uniform vec4 colorFinish; + + // + // Description : Array and textureless GLSL 2D/3D/4D simplex + // noise functions. + // Author : Ian McEwan, Ashima Arts. + // Maintainer : ijm + // Lastmod : 20110822 (ijm) + // License : Copyright (C) 2011 Ashima Arts. All rights reserved. + // Distributed under the MIT License. See LICENSE file. + // https://github.com/ashima/webgl-noise + // + + vec4 mod289(vec4 x) +{ + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + + vec4 permute(vec4 x) +{ + return mod289(((x*34.0)+1.0)*x); +} + + vec4 taylorInvSqrt(vec4 r) +{ + return 1.79284291400159 - 0.85373472095314 * r; +} + + vec2 fade(vec2 t) { + return t*t*t*(t*(t*6.0-15.0)+10.0); + } + + // Classic Perlin noise + float cnoise(vec2 P) +{ + vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0); + vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0); + Pi = mod289(Pi); // To avoid truncation effects in permutation + vec4 ix = Pi.xzxz; + vec4 iy = Pi.yyww; + vec4 fx = Pf.xzxz; + vec4 fy = Pf.yyww; + + vec4 i = permute(permute(ix) + iy); + + vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ; + vec4 gy = abs(gx) - 0.5 ; + vec4 tx = floor(gx + 0.5); + gx = gx - tx; + + vec2 g00 = vec2(gx.x,gy.x); + vec2 g10 = vec2(gx.y,gy.y); + vec2 g01 = vec2(gx.z,gy.z); + vec2 g11 = vec2(gx.w,gy.w); + + vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + g00 *= norm.x; + g01 *= norm.y; + g10 *= norm.z; + g11 *= norm.w; + + float n00 = dot(g00, vec2(fx.x, fy.x)); + float n10 = dot(g10, vec2(fx.y, fy.y)); + float n01 = dot(g01, vec2(fx.z, fy.z)); + float n11 = dot(g11, vec2(fx.w, fy.w)); + + vec2 fade_xy = fade(Pf.xy); + vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x); + float n_xy = mix(n_x.x, n_x.y, fade_xy.y); + return 2.3 * n_xy; +} + + + void main() + { + + float n1 = (cnoise(textureCoordinate * scale) + 1.0) / 2.0; + + vec4 colorDiff = colorFinish - colorStart; + vec4 color = colorStart + colorDiff * n1; + + gl_FragColor = color; + } + ); + + +@implementation GPUImagePerlinNoiseFilter + +@synthesize scale = _scale, colorStart = _colorStart, colorFinish = _colorFinish; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImagePerlinNoiseFragmentShaderString])) + { + return nil; + } + + scaleUniform = [filterProgram uniformIndex:@"scale"]; + + colorStartUniform = [filterProgram uniformIndex:@"colorStart"]; + colorFinishUniform = [filterProgram uniformIndex:@"colorFinish"]; + + [self setScale:8.0]; + + [self setColorStart:(GPUVector4){0.0, 0.0, 0.0, 1.0}]; + [self setColorFinish:(GPUVector4){1.0, 1.0, 1.0, 1.0}]; + + return self; +} + +-(void)setScale:(float)scale { + _scale = scale; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(scaleUniform, _scale); +} + +-(void)setColorStart:(GPUVector4)colorStart { + _colorStart = colorStart; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform4f(colorStartUniform, _colorStart.one, _colorStart.two, _colorStart.three, _colorStart.four); +} + +-(void)setColorFinish:(GPUVector4)colorFinish { + _colorFinish = colorFinish; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform4f(colorFinishUniform, _colorFinish.one, _colorFinish.two, _colorFinish.three, _colorFinish.four); +} + +@end diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 32e9a76f3..b634039aa 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -66,6 +66,7 @@ #import "GPUImageCGAColorspaceFilter.h" #import "GPUImagePolarPixellateFilter.h" #import "GPUImageStretchDistortionFilter.h" +#import "GPUImagePerlinNoiseFilter.h" #import "GPUImageTiltShiftFilter.h" #import "GPUImage3x3ConvolutionFilter.h" #import "GPUImageEmbossFilter.h" diff --git a/framework/Source/GPUImageJFAVoroni.h b/framework/Source/GPUImageJFAVoroni.h deleted file mode 100644 index 17d934bb6..000000000 --- a/framework/Source/GPUImageJFAVoroni.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// GPUImageJFAVoroni.h -// Face Esplode -// -// Created by Jacob Gundersen on 4/27/12. -// The shaders are mostly taken from UnitZeroOne's WebGL example here: -// http://unitzeroone.com/blog/2011/03/22/jump-flood-voronoi-for-webgl/ - -#import "GPUImageFilter.h" - -@interface GPUImageJFAVoroni : GPUImageFilter { - GLuint secondFilterOutputTexture; - GLuint secondFilterFramebuffer; - GLint sampleStepUniform; -} - -@property (nonatomic, assign) NSUInteger numPasses; - -@end diff --git a/framework/Source/GPUImageJFAVoroni.m b/framework/Source/GPUImageJFAVoroni.m deleted file mode 100644 index 883b3f816..000000000 --- a/framework/Source/GPUImageJFAVoroni.m +++ /dev/null @@ -1,336 +0,0 @@ -// -// GPUImageJFAVoroni.m -// Face Esplode -// -// Created by Jacob Gundersen on 4/27/12. -// -// adapted from unitzeroone - http://unitzeroone.com/labs/jfavoronoi/ - -#import "GPUImageJFAVoroni.h" - -NSString *const kGPUImageJFAVoroniFragmentShaderString = SHADER_STRING -( - - precision highp float; - - uniform sampler2D inputImageTexture; - varying vec2 textureCoordinate; - uniform float sampleStep; - - vec2 getCoordFromColor(vec4 color) -{ - float z = color.z * 256.0; - float xoff = mod(z,2.0); - float yoff = ((z - xoff)*.5); - float x = color.x*256.0 + xoff*256.0; - float y = color.y*256.0 + yoff*256.0; - //return vec2(x,y); - return vec2(x,y) / 256.0; -} - - void main(void) { - vec3 samplePos = vec3(sampleStep,0.0,-sampleStep); - //vec2 wh = vec2(512.0,512.0); - vec2 uvIn = textureCoordinate; - vec2 uv; - vec2 sub; - vec4 dst; - //vec4 local = texture2D(inputImageTexture, uvIn/wh); - vec4 local = texture2D(inputImageTexture, uvIn); - vec4 sam; - float l; - float smallestDist; - if(local.a == 0.0){ - //smallestDist = dot(wh,wh); - smallestDist = dot(1.0,1.0); - }else{ - sub = getCoordFromColor(local)-uvIn; - smallestDist = dot(sub,sub); - } - dst = local; - uv = uvIn+samplePos.xx; - //sam = texture2D(inputImageTexture, uv/wh); - sam = texture2D(inputImageTexture, uv); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - uv = uvIn+samplePos.yx; -// sam = texture2D(inputImageTexture, uv/wh); - sam = texture2D(inputImageTexture, uv); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - uv = uvIn+samplePos.zx; -// sam = texture2D(inputImageTexture, uv/wh); - sam = texture2D(inputImageTexture, uv); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - uv = uvIn+samplePos.xy; -// sam = texture2D(inputImageTexture, uv/wh); - sam = texture2D(inputImageTexture, uv); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - - uv = uvIn+samplePos.zy; -// sam = texture2D(inputImageTexture, uv/wh); - sam = texture2D(inputImageTexture, uv); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - uv = uvIn+samplePos.xz; -// sam = texture2D(inputImageTexture, uv/wh); - sam = texture2D(inputImageTexture, uv); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - uv = uvIn+samplePos.yz; -// sam = texture2D(inputImageTexture, uv/wh); - sam = texture2D(inputImageTexture, uv); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - uv = uvIn+samplePos.zz; -// sam = texture2D(inputImageTexture, uv/wh); - sam = texture2D(inputImageTexture, uv); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - gl_FragColor = dst; - } - ); - -@implementation GPUImageJFAVoroni - -@synthesize numPasses; - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageJFAVoroniFragmentShaderString])) - { - NSLog(@"nil returned"); - return nil; - - } - - sampleStepUniform = [filterProgram uniformIndex:@"sampleStep"]; - NSLog(@"setup filter"); - return self; -} - -#pragma mark - -#pragma mark Managing the display FBOs - - -- (void)initializeOutputTexture; -{ - [super initializeOutputTexture]; - - glGenTextures(1, &secondFilterOutputTexture); - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); -} - -- (void)createFilterFBOofSize:(CGSize)currentFBOSize; -{ - NSLog(@"log %f", log2(256)); - numPasses = (int)log2(currentFBOSize.width); - - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - } - - glGenFramebuffers(1, &secondFilterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) - { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d"); - } - - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - GL_RGBA, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, - 0, - &renderTexture); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); - } - - CFRelease(attrs); - CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); - } - else - { - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); - } - NSLog(@"doe here"); - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - - glBindTexture(GL_TEXTURE_2D, 0); -} - - - //we may not need these -- (void)setSecondFilterFBO; -{ - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - // - // CGSize currentFBOSize = [self sizeOfFBO]; - // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); -} - -- (void)setOutputFBO; -{ - if (numPasses % 2 == 1) { - [self setSecondFilterFBO]; - } else { - [self setFilterFBO]; - } - -} - - -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; -{ - // Run the first stage of the two-pass filter - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(sampleStepUniform, 0.5); - - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; - - for (int pass = 1; pass <= numPasses + 1; pass++) { - //NSLog(@"pass %d", pass); - if (pass % 2 == 0) { - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - - float step = pow(2.0, numPasses - pass) / self.sizeOfFBO.width; - glUniform1f(sampleStepUniform, step); - - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:secondFilterOutputTexture]; - } else { - // Run the second stage of the two-pass filter - [self setSecondFilterFBO]; - - [filterProgram use]; - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, outputTexture); - - glUniform1i(filterInputTextureUniform, 3); - - float step = pow(2.0, numPasses - pass) / self.sizeOfFBO.width; - glUniform1f(sampleStepUniform, step); - - if (filterSourceTexture2 != 0) - { - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); - - glUniform1i(filterInputTextureUniform2, 4); - } - - glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } - } -} - - - -@end diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoroniConsumerFilter.h deleted file mode 100644 index c32b0e19a..000000000 --- a/framework/Source/GPUImageVoroniConsumerFilter.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// GPUVoroniConsumerFilter.h -// Face Esplode -// -// Created by Jacob Gundersen on 4/28/12. -// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. -// - -#import "GPUImageFilter.h" - -@interface GPUImageVoroniConsumerFilter : GPUImageFilter - -@end diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoroniConsumerFilter.m deleted file mode 100644 index 1835bb8cc..000000000 --- a/framework/Source/GPUImageVoroniConsumerFilter.m +++ /dev/null @@ -1,56 +0,0 @@ -// -// GPUVoroniConsumerFilter.m -// Face Esplode -// -// Created by Jacob Gundersen on 4/28/12. -// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. -// - -#import "GPUImageVoroniConsumerFilter.h" - -NSString *const kGPUImageVoroniConsumerFragmentShaderString = SHADER_STRING -( - - precision highp float; - - uniform sampler2D inputImageTexture; - uniform sampler2D inputImageTexture2; - varying vec2 textureCoordinate; - - vec2 getCoordFromColor(vec4 color) -{ - float z = color.z * 256.0; - float xoff = mod(z,2.0); - float yoff = ((z - xoff)*.5); - float x = color.x*256.0 + xoff*256.0; - float y = color.y*256.0 + yoff*256.0; - //return vec2(x,y); - return vec2(x,y) / 256.0; -} - - void main(void) { - vec4 colorLoc = texture2D(inputImageTexture2, textureCoordinate); - vec4 color = texture2D(inputImageTexture, getCoordFromColor(colorLoc)); - gl_FragColor = color; - } - - - ); - -@implementation GPUImageVoroniConsumerFilter - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageVoroniConsumerFragmentShaderString])) - { - return nil; - } - - return self; -} - --(CGSize)sizeOfFBO { - return CGSizeMake(256, 256); -} - -@end From 8824abdc3618ed9d3933c4a79a7ff0945d6c35f4 Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Thu, 17 May 2012 00:58:38 -0600 Subject: [PATCH 095/695] Removed unnecessary comments --- framework/GPUImagePerlinNoiseFilter.h | 6 +----- framework/GPUImagePerlinNoiseFilter.m | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/framework/GPUImagePerlinNoiseFilter.h b/framework/GPUImagePerlinNoiseFilter.h index 2b4adcc81..d8632c2d0 100644 --- a/framework/GPUImagePerlinNoiseFilter.h +++ b/framework/GPUImagePerlinNoiseFilter.h @@ -1,10 +1,6 @@ // // GPUImagePerlinNoiseFilter.h -// Face Esplode -// -// Created by Jacob Gundersen on 5/15/12. -// -// + #import "GPUImageFilter.h" diff --git a/framework/GPUImagePerlinNoiseFilter.m b/framework/GPUImagePerlinNoiseFilter.m index 731f5eda0..3e189f9cb 100644 --- a/framework/GPUImagePerlinNoiseFilter.m +++ b/framework/GPUImagePerlinNoiseFilter.m @@ -1,10 +1,6 @@ // // GPUImagePerlinNoiseFilter.m -// Face Esplode -// -// Created by Jacob Gundersen on 5/15/12. -// -// + #import "GPUImagePerlinNoiseFilter.h" From e8897d5feed02ebb1bdc415a080147a442a93017 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 17 May 2012 09:22:18 -0500 Subject: [PATCH 096/695] Minor documentation corrections. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dedd98b7f..21e161072 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageAdaptiveThresholdFilter**: Determines the local luminance around a pixel, then turns the pixel black if it is below that local luminance and white if above. This can be useful for picking out text under varying lighting conditions. - **GPUImageHistogramFilter**: This analyzes the incoming image and creates an output histogram with the frequency at which each color value occurs. The output of this filter is a 3-pixel-high, 256-pixel-wide image with the center (vertical) pixels containing pixels that correspond to the frequency at which various color values occurred. Each color value occupies one of the 256 width positions, from 0 on the left to 255 on the right. This histogram can be generated for individual color channels (kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue), the luminance of the image (kGPUImageHistogramLuminance), or for all three color channels at once (kGPUImageHistogramRGB). -- *downsamplingFactor*: Rather than sampling every pixel, this dictates what fraction of the image is sampled. By default, this is 16 with a minimum of 1. This is needed to keep from saturating the histogram, which can only record 256 pixels for each color value before it becomes overloaded. + - *downsamplingFactor*: Rather than sampling every pixel, this dictates what fraction of the image is sampled. By default, this is 16 with a minimum of 1. This is needed to keep from saturating the histogram, which can only record 256 pixels for each color value before it becomes overloaded. - **GPUImageHistogramGenerator**: This is a special filter, in that it's primarily intended to work with the GPUImageHistogramFilter. It generates an output representation of the color histograms generated by GPUImageHistogramFilter, but it could be repurposed to display other kinds of values. It takes in an image and looks at the center (vertical) pixels. It then plots the numerical values of the RGB components in separate colored graphs in an output texture. You may need to force a size for this filter in order to make its output visible. @@ -138,11 +138,11 @@ Documentation is generated from header comments using appledoc. To build the doc - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 10.0. - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.05. -- *GPUImageNonMaximumSuppressionFilter*: Currently used only as part of the Harris corner detection filter, this will sample a 1-pixel box around each pixel and determine if the center pixel's red channel is the maximum in that area. If it is, it stays. If not, it is set to 0 for all color components. +- **GPUImageNonMaximumSuppressionFilter**: Currently used only as part of the Harris corner detection filter, this will sample a 1-pixel box around each pixel and determine if the center pixel's red channel is the maximum in that area. If it is, it stays. If not, it is set to 0 for all color components. -- *GPUImageXYDerivativeFilter*: An internal component within the Harris corner detection filter, this calculates the squared difference between the pixels to the left and right of this one, the squared difference of the pixels above and below this one, and the product of those two differences. +- **GPUImageXYDerivativeFilter**: An internal component within the Harris corner detection filter, this calculates the squared difference between the pixels to the left and right of this one, the squared difference of the pixels above and below this one, and the product of those two differences. -- *GPUImageCrosshairGenerator*: This draws a series of crosshairs on an image, most often used for identifying machine vision features. It does not take in a standard image like other filters, but a series of points in its -renderCrosshairsFromArray:count: method, which does the actual drawing. You will need to force this filter to render at the particular output size you need. +- **GPUImageCrosshairGenerator**: This draws a series of crosshairs on an image, most often used for identifying machine vision features. It does not take in a standard image like other filters, but a series of points in its -renderCrosshairsFromArray:count: method, which does the actual drawing. You will need to force this filter to render at the particular output size you need. - *crosshairWidth*: The width, in pixels, of the crosshairs to be drawn onscreen. ### Blending modes ### From f86f9b91f64c994bd910684a73aa55a26d12fa5d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 17 May 2012 09:38:22 -0500 Subject: [PATCH 097/695] Minor formatting tweaks for the merge. --- .../ShowcaseFilterListController.m | 2 +- .../ShowcaseFilterViewController.m | 2 -- framework/GPUImagePerlinNoiseFilter.h | 7 ++----- framework/GPUImagePerlinNoiseFilter.m | 19 ++++++++++++------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 18b72101f..2e97fe1db 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -100,7 +100,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_BULGE: cell.textLabel.text = @"Bulge"; break; case GPUIMAGE_PINCH: cell.textLabel.text = @"Pinch"; break; case GPUIMAGE_STRETCH: cell.textLabel.text = @"Stretch"; break; - case GPUIMAGE_PERLINNOISE: cell.textLabel.text = @"Perlin Noise"; break; + case GPUIMAGE_PERLINNOISE: cell.textLabel.text = @"Perlin noise"; break; case GPUIMAGE_CHROMAKEY: cell.textLabel.text = @"Chroma key (green)"; break; case GPUIMAGE_DISSOLVE: cell.textLabel.text = @"Dissolve blend"; break; case GPUIMAGE_SCREENBLEND: cell.textLabel.text = @"Screen blend"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index b8dc62099..5de4b413c 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -493,8 +493,6 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:8.0]; filter = [[GPUImagePerlinNoiseFilter alloc] init]; - - }; break; case GPUIMAGE_CHROMAKEY: { diff --git a/framework/GPUImagePerlinNoiseFilter.h b/framework/GPUImagePerlinNoiseFilter.h index d8632c2d0..922f4d303 100644 --- a/framework/GPUImagePerlinNoiseFilter.h +++ b/framework/GPUImagePerlinNoiseFilter.h @@ -1,10 +1,7 @@ -// -// GPUImagePerlinNoiseFilter.h - - #import "GPUImageFilter.h" -@interface GPUImagePerlinNoiseFilter : GPUImageFilter { +@interface GPUImagePerlinNoiseFilter : GPUImageFilter +{ GLint scaleUniform, colorStartUniform, colorFinishUniform; } diff --git a/framework/GPUImagePerlinNoiseFilter.m b/framework/GPUImagePerlinNoiseFilter.m index 3e189f9cb..02a35b756 100644 --- a/framework/GPUImagePerlinNoiseFilter.m +++ b/framework/GPUImagePerlinNoiseFilter.m @@ -1,7 +1,3 @@ -// -// GPUImagePerlinNoiseFilter.m - - #import "GPUImagePerlinNoiseFilter.h" NSString *const kGPUImagePerlinNoiseFragmentShaderString = SHADER_STRING @@ -101,6 +97,9 @@ @implementation GPUImagePerlinNoiseFilter @synthesize scale = _scale, colorStart = _colorStart, colorFinish = _colorFinish; +#pragma mark - +#pragma mark Initialization and teardown + - (id)init; { if (!(self = [super initWithFragmentShaderFromString:kGPUImagePerlinNoiseFragmentShaderString])) @@ -121,7 +120,11 @@ - (id)init; return self; } --(void)setScale:(float)scale { +#pragma mark - +#pragma mark Accessors + +- (void)setScale:(float)scale +{ _scale = scale; [GPUImageOpenGLESContext useImageProcessingContext]; @@ -129,7 +132,8 @@ -(void)setScale:(float)scale { glUniform1f(scaleUniform, _scale); } --(void)setColorStart:(GPUVector4)colorStart { +- (void)setColorStart:(GPUVector4)colorStart +{ _colorStart = colorStart; [GPUImageOpenGLESContext useImageProcessingContext]; @@ -137,7 +141,8 @@ -(void)setColorStart:(GPUVector4)colorStart { glUniform4f(colorStartUniform, _colorStart.one, _colorStart.two, _colorStart.three, _colorStart.four); } --(void)setColorFinish:(GPUVector4)colorFinish { +- (void)setColorFinish:(GPUVector4)colorFinish +{ _colorFinish = colorFinish; [GPUImageOpenGLESContext useImageProcessingContext]; From c841b33cf4f29d3d4909269ac88481418d527e44 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 17 May 2012 10:25:09 -0500 Subject: [PATCH 098/695] Moved the Perlin noise filter into the Source directory. --- framework/GPUImage.xcodeproj/project.pbxproj | 16 ++++++++-------- .../{ => Source}/GPUImagePerlinNoiseFilter.h | 0 .../{ => Source}/GPUImagePerlinNoiseFilter.m | 0 3 files changed, 8 insertions(+), 8 deletions(-) rename framework/{ => Source}/GPUImagePerlinNoiseFilter.h (100%) rename framework/{ => Source}/GPUImagePerlinNoiseFilter.m (100%) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 898acfba6..fc44c8e11 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -52,6 +52,8 @@ BC245DC114DDBCF5009FE7EB /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; }; BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; }; BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; + BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; }; + BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */; }; BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; @@ -202,8 +204,6 @@ BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; - F2D6D0171564D44500A1289F /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */; }; - F2D6D0181564D44500A1289F /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -252,6 +252,8 @@ BC245DBF14DDBCF5009FE7EB /* GPUImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage.h; path = Source/GPUImage.h; sourceTree = SOURCE_ROOT; }; BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFilter.h; path = Source/GPUImageFilter.h; sourceTree = SOURCE_ROOT; }; BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFilter.m; path = Source/GPUImageFilter.m; sourceTree = SOURCE_ROOT; }; + BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePerlinNoiseFilter.h; path = Source/GPUImagePerlinNoiseFilter.h; sourceTree = SOURCE_ROOT; }; + BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePerlinNoiseFilter.m; path = Source/GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyBlendFilter.h; path = Source/GPUImageChromaKeyBlendFilter.h; sourceTree = SOURCE_ROOT; }; BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; @@ -401,8 +403,6 @@ BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; - F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPUImagePerlinNoiseFilter.h; sourceTree = SOURCE_ROOT; }; - F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -519,8 +519,8 @@ BC1B715F14F4B06600ACA2AB /* Effects */ = { isa = PBXGroup; children = ( - F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */, - F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */, + BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */, + BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */, BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */, BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */, BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */, @@ -829,7 +829,7 @@ BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */, BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */, BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */, - F2D6D0171564D44500A1289F /* GPUImagePerlinNoiseFilter.h in Headers */, + BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1029,7 +1029,7 @@ BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */, BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */, BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */, - F2D6D0181564D44500A1289F /* GPUImagePerlinNoiseFilter.m in Sources */, + BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/GPUImagePerlinNoiseFilter.h b/framework/Source/GPUImagePerlinNoiseFilter.h similarity index 100% rename from framework/GPUImagePerlinNoiseFilter.h rename to framework/Source/GPUImagePerlinNoiseFilter.h diff --git a/framework/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m similarity index 100% rename from framework/GPUImagePerlinNoiseFilter.m rename to framework/Source/GPUImagePerlinNoiseFilter.m From 7611d123ff4fe972044a8c258564bc504da556a2 Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Thu, 17 May 2012 14:55:33 -0600 Subject: [PATCH 099/695] Added Voroni and Mosaic filters to the set and the Filter Showcase --- .../FilterShowcase.xcodeproj/project.pbxproj | 16 + .../ShowcaseFilterListController.m | 2 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 59 ++- .../FilterShowcase/FilterShowcase/curvies.png | Bin 0 -> 69921 bytes .../FilterShowcase/dotletterstiles.png | Bin 0 -> 38216 bytes .../FilterShowcase/FilterShowcase/squares.png | Bin 0 -> 5689 bytes .../FilterShowcase/voroni_points2.png | Bin 0 -> 59707 bytes framework/GPUImage.xcodeproj/project.pbxproj | 40 +- framework/GPUImageJFAVoroniFilter.h | 19 + framework/GPUImageJFAVoroniFilter.m | 338 +++++++++++++ framework/GPUImageMosaicFilter.h | 30 ++ framework/GPUImageMosaicFilter.m | 148 ++++++ framework/GPUImageVoroniConsumerFilter.h | 13 + framework/GPUImageVoroniConsumerFilter.m | 55 +++ framework/Source/GPUImage.h | 3 + framework/Source/GPUImageJFAVoroniFilter.h | 20 + framework/Source/GPUImageJFAVoroniFilter.m | 450 ++++++++++++++++++ .../Source/GPUImageVoroniConsumerFilter.h | 13 + .../Source/GPUImageVoroniConsumerFilter.m | 71 +++ 20 files changed, 1267 insertions(+), 12 deletions(-) create mode 100644 examples/FilterShowcase/FilterShowcase/curvies.png create mode 100644 examples/FilterShowcase/FilterShowcase/dotletterstiles.png create mode 100644 examples/FilterShowcase/FilterShowcase/squares.png create mode 100644 examples/FilterShowcase/FilterShowcase/voroni_points2.png create mode 100644 framework/GPUImageJFAVoroniFilter.h create mode 100644 framework/GPUImageJFAVoroniFilter.m create mode 100644 framework/GPUImageMosaicFilter.h create mode 100644 framework/GPUImageMosaicFilter.m create mode 100644 framework/GPUImageVoroniConsumerFilter.h create mode 100644 framework/GPUImageVoroniConsumerFilter.m create mode 100644 framework/Source/GPUImageJFAVoroniFilter.h create mode 100644 framework/Source/GPUImageJFAVoroniFilter.m create mode 100644 framework/Source/GPUImageVoroniConsumerFilter.h create mode 100644 framework/Source/GPUImageVoroniConsumerFilter.m diff --git a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index d16db5c4b..d52196fb7 100755 --- a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -26,6 +26,10 @@ BC982B4214F06BF70001FF6F /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B3014F049950001FF6F /* libGPUImage.a */; }; BC982BD114F1C0F00001FF6F /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BC982BD014F1C0F00001FF6F /* WID-small.jpg */; }; BC982C4114F1F6C80001FF6F /* CustomFilter.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BC982C4014F1F6C80001FF6F /* CustomFilter.fsh */; }; + F2F3361E156585C400B0FBB8 /* voroni_points2.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F3361D156585C400B0FBB8 /* voroni_points2.png */; }; + F2F336271565906000B0FBB8 /* dotletterstiles.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F336261565906000B0FBB8 /* dotletterstiles.png */; }; + F2F33629156591CA00B0FBB8 /* curvies.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F33628156591CA00B0FBB8 /* curvies.png */; }; + F2F3362B156591DB00B0FBB8 /* squares.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F3362A156591DB00B0FBB8 /* squares.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -78,6 +82,10 @@ BC982B3E14F05DC10001FF6F /* ShowcaseFilterListController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShowcaseFilterListController.m; sourceTree = ""; }; BC982BD014F1C0F00001FF6F /* WID-small.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = "WID-small.jpg"; path = "../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg"; sourceTree = ""; }; BC982C4014F1F6C80001FF6F /* CustomFilter.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = CustomFilter.fsh; sourceTree = ""; }; + F2F3361D156585C400B0FBB8 /* voroni_points2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voroni_points2.png; sourceTree = ""; }; + F2F336261565906000B0FBB8 /* dotletterstiles.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dotletterstiles.png; sourceTree = ""; }; + F2F33628156591CA00B0FBB8 /* curvies.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = curvies.png; sourceTree = ""; }; + F2F3362A156591DB00B0FBB8 /* squares.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = squares.png; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -152,6 +160,10 @@ BC982B0D14F046AC0001FF6F /* Supporting Files */ = { isa = PBXGroup; children = ( + F2F3362A156591DB00B0FBB8 /* squares.png */, + F2F33628156591CA00B0FBB8 /* curvies.png */, + F2F336261565906000B0FBB8 /* dotletterstiles.png */, + F2F3361D156585C400B0FBB8 /* voroni_points2.png */, 83AE9FD31540F3CC00F7FC13 /* mask.png */, BC982BD014F1C0F00001FF6F /* WID-small.jpg */, BC982B0E14F046AC0001FF6F /* FilterShowcase-Info.plist */, @@ -254,6 +266,10 @@ BC982BD114F1C0F00001FF6F /* WID-small.jpg in Resources */, 0D69488E1501F71900206FF8 /* SampleConfiguration.plist in Resources */, 83AE9FD41540F3CC00F7FC13 /* mask.png in Resources */, + F2F3361E156585C400B0FBB8 /* voroni_points2.png in Resources */, + F2F336271565906000B0FBB8 /* dotletterstiles.png in Resources */, + F2F33629156591CA00B0FBB8 /* curvies.png in Resources */, + F2F3362B156591DB00B0FBB8 /* squares.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 18b72101f..401464bc7 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -101,6 +101,8 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_PINCH: cell.textLabel.text = @"Pinch"; break; case GPUIMAGE_STRETCH: cell.textLabel.text = @"Stretch"; break; case GPUIMAGE_PERLINNOISE: cell.textLabel.text = @"Perlin Noise"; break; + case GPUIMAGE_VORONI: cell.textLabel.text = @"Voroni"; break; + case GPUIMAGE_MOSAIC: cell.textLabel.text = @"Mosaic"; break; case GPUIMAGE_CHROMAKEY: cell.textLabel.text = @"Chroma key (green)"; break; case GPUIMAGE_DISSOLVE: cell.textLabel.text = @"Dissolve blend"; break; case GPUIMAGE_SCREENBLEND: cell.textLabel.text = @"Screen blend"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index d683b7f06..d8d574945 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -50,6 +50,8 @@ typedef enum { GPUIMAGE_PINCH, GPUIMAGE_STRETCH, GPUIMAGE_PERLINNOISE, + GPUIMAGE_VORONI, + GPUIMAGE_MOSAIC, GPUIMAGE_DISSOLVE, GPUIMAGE_CHROMAKEY, GPUIMAGE_MULTIPLY, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index b8dc62099..8d6c303cb 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -495,6 +495,45 @@ - (void)setupFilter; filter = [[GPUImagePerlinNoiseFilter alloc] init]; + }; break; + case GPUIMAGE_VORONI: + { + self.title = @"Voroni"; + self.filterSettingsSlider.hidden = YES; + + GPUImageJFAVoroniFilter *jfa = [[GPUImageJFAVoroniFilter alloc] init]; + [jfa setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; + + sourcePicture = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"voroni_points2.png"]]; + + [sourcePicture addTarget:jfa]; + + filter = [[GPUImageVoroniConsumerFilter alloc] init]; + + [jfa setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; + [(GPUImageVoroniConsumerFilter *)filter setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; + + [videoCamera addTarget:filter]; + [jfa addTarget:filter]; + [sourcePicture processImage]; + }; break; + case GPUIMAGE_MOSAIC: + { + self.title = @"Mosaic"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.002]; + [self.filterSettingsSlider setMaximumValue:0.05]; + [self.filterSettingsSlider setValue:0.025]; + + filter = [[GPUImageMosaicFilter alloc] init]; + [(GPUImageMosaicFilter *)filter setTileSet:@"squares.png"]; + [(GPUImageMosaicFilter *)filter setColorOn:NO]; + //[(GPUImageMosaicFilter *)filter setTileSet:@"dotletterstiles.png"]; + //[(GPUImageMosaicFilter *)filter setTileSet:@"curvies.png"]; + + [filter setInputRotation:kGPUImageRotateRight atIndex:0]; + }; break; case GPUIMAGE_CHROMAKEY: { @@ -740,7 +779,11 @@ - (void)setupFilter; } else { - [videoCamera addTarget:filter]; + + if (filterType != GPUIMAGE_VORONI) { + [videoCamera addTarget:filter]; + } + videoCamera.runBenchmark = YES; if (needsSecondImage) @@ -751,8 +794,11 @@ - (void)setupFilter; { inputImage = [UIImage imageNamed:@"mask"]; } - else - { + /* + else if (filterType == GPUIMAGE_VORONI) { + inputImage = [UIImage imageNamed:@"voroni_points.png"]; + }*/ + else { // The picture is only used for two-image blend filters inputImage = [UIImage imageNamed:@"WID-small.jpg"]; } @@ -760,7 +806,9 @@ - (void)setupFilter; sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; [sourcePicture addTarget:filter]; + [sourcePicture processImage]; + } GPUImageView *filterView = (GPUImageView *)self.view; @@ -807,9 +855,11 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } - else + + else { [filter addTarget:filterView]; + } } @@ -854,6 +904,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)filter setScale:[(UISlider *)sender value]]; break; + case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)filter setDisplayTileSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setVignetteEnd:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; diff --git a/examples/FilterShowcase/FilterShowcase/curvies.png b/examples/FilterShowcase/FilterShowcase/curvies.png new file mode 100644 index 0000000000000000000000000000000000000000..c0dde60ba9a1fa38615f4692ae76d24c57097263 GIT binary patch literal 69921 zcmb@tV{~0%*Dkzcv$3tlPGdWb-PmdDq_J(IjcwbuZ8uHQ#?D!J-uL;=pYP{cW9+d< zu-9Ig_nenjxT1n25ZxAO($$>XGdnqj^5D4MZ#|sRU zk%a>S!GEKr`eDRV(UHQT%7l^Tu3{?nqKS(`;*b0agNTXoi^5c*M~r}9fjJ<}iwVpR zix_*}^~$$i>bO6ed}~}5IIg(PuAheKfkjM_VpHPqLo5{`LfZ)(9vIp^U=;F)r?3a1 z!q%IRI=zyEfgXJL_&$^Mz;uDY+~*NsK|S)BJUI+x*b@rKkqi3qe z^W%l~vw6#-ynwXOL-^%#A8A&HBGd@_b-Jc;ZU1p?#B<|XS62@Y4pw9aM05UcW#3@V(sM?sV-@__KcVmxO%S>6^HbDK&fMdfatoBTSOL*t=AIKA7`B1$%#1_*BDLJ~aEZp_wPY2DJ<>} z;kU-qwQi8;{^C7woRDrJB!)!7Qkrs_3M*12Bm@-fXlrm>a1cRCebi)$C9(}vZD@}J zI7X~2p_)?k1KM95m`#FCaRtjtTE$Fsn;xVNl6ac)D~OeRuDoza*Z zKb1U5J%PA!LqrO}3>*$Kr@_s{fx$7yb;GGnlPkiVkHj5TW#(czOFK?SNw-teq-&!4 zff+vrpDdG1m5fivq*_{5RJK)ypmwb`t{Pjar{Y~Dp~j}NUkbO7Qm$5(t$3z_uVP-x zTM}AkUSg*zSm2}e8V;@1FW3K7v_R=st^R(;5D9`YZoNA_sWno0h>JhR09Ebe>JL}C z_Ow^R_DKG+(p(-3;QX9c)pn&Q-JpNK7tOWHkJ{33R_Ru)rT z>#~&86wPv}a;0*~vrf*c^WyBHPVsiFXMbejVHs*&YDx3hDX8pYl~t9^V)$Y#dHyfA zRg7iUh4{JcVs72G#TRKgU3z{wa(2aA9-YTe1l~-qs;@Rr#kZ1(n$Y!#6wvF4Q#gEs z91eDTgiOQh|CB_(^$Up>8YUa2?gquT&hq6iN<>SbL|G2$?o;gB4A~6jQ$bUaQpw8y zmcPhQmTxVhE#j5ql^dR%n9Q48O6SPrXIW-F&OFXs&fIP`(013RZz^eOF_o@6&@R%t zXzH*H*5=VF)Kt^{RxeSRT}iprUfEuZR@|zPs8F7>WZqx%uW7WYv>CVNa0Pn3s>!Cw z+tAzy+q`+Os{bOfGts-vJNlI$1}StExtvg&(8sC45#x*cm#vJctP4T!!JCv*CUebc z)aezr{iaXjv;&seDw*?==Gf+~PJ!29k>Rod+=z2POcz@32O&wYV?KCUg+EiL^CuAb(R=JBunb~*aN+oHbY?sF|%P{au!Thmo#|)AoDU_RINo=w9|7!oC-F8q>%( zdym|yzMJ4;tWrjF`Y$O$a$ySGNq>b==}NGoD6c-bQO3Y~^bz)%lQGS5&W5ds>e3M@ zTuIT%dnWve@8IyD7-TD?KWq)6E{*GuLz3If{E~x};Ywn|%KxR4B`_gA&OxM%R6eoE z{I~g$nd^9kX>i@!plxI`6HzkEsC9i@1(X&8e3MAgiK;fuG965vxv7R(_hk4OPfB^t z=gISl`myymuB^+S@8{@!=(`C`g(0#U41}6TofTF*b$kvU>+t)SP@hB8p)2@WBAV!I z7QdFCYou2BbW(ZBTl?$vjs^5Kf?1y-sKFlwd!KDApMU$R$)vU2X!sP8jW2*19#Ms{ zj-86>yF#TwI)_}CF-f(_< zC%(>n%~XW(qURWIyK2Fs9K)yXt?}fJ9~le)p5uEXK`Jp zt`nmpIuqwRl^daTh=3AwLjl=mc#2myc3^{Vsa_hn(;T*rJ za_rLQGfCuO;;y&sOE(52P9(MHtf4(}dohoL(|fq>dm^MSYpzjV6}vF=#IA(qgiKZ< z8CMw+nJO92Iz~EeUnc}+mws<~zDTYUqhzu3X?e(8tBzW(od(P&nqN&vWhZBQ`!GIk z7_8?tc^w;1ZCjz(UACb*@6L(8M;`Nb@J{JowK!kZtsj2UXwk^1{-SU5+xa)&TjKoJ z;r6WdjH*^$>(&d;&PFe@`&0ZJuBpwNPLF?B?@Nn0Jp7xT*PeFwgZH=FSerhM)UQ+H z?W=Co7nL1fJM?da&V^S+H$xW%b>22sE;oFwdfa|p&u&QGLk9;=zs29iqKHDprpJzl zAcdUea0~G8>X zhFiTp)Hg)bHR{gBqIaYIeBSG};YN6wzm4+s;0K8>&AY{8?XAj8@pB?>V&Xd_MB4R> zF&o1=fHz5urIh7CAWupV$S)8CdVB}oPeC9TW)SGN0SNRZ4FtlrOVA&b0D(cvNs9@q zy086t^>xO-Po{?V>Ge~eEz0l1Ut@GW5uoSr&XFn7`=o2B{_BAMt36xz*to~%k>Alh z>i2Xtd<^}L68?ug@C7A0fhXrBhK-U)w6;*ntTKT)%Ue(YbRIvZu zgs*=E%l-EUFcuIT?Eh|IU{XT=-4KPq|GOE1&{6-pLB#p}cf;|6{O>jZq9FP222Jw+ zzw4Eb72_=@7*a@B(zFMIsGDmY%9Ec9f+AX??uk)eS&5>3zVlm%Vu)kD z3KS*2!lyF;$G*tZ6MIUG+rS4oUATH|5cT zUfqFM{JeE?pOtOz4O9e7jiZFsC{2bhLmr?Vn#ZMU4}4pLMw+ zQAI5F0$EHp46QPFk9oHRkYiL7fG?fpby&Dx2uTSMJO=ZNf+lo^sYeE=52&^jCyqxe z-EhOu6G9o?WT)!{EFzEH#CD|Q5LO`s1nS}1qxMRVYQxX@tapfr0SWdXd|g?zp8rYM z6gi4lUeMy^n3Qw}I)wZ4M(lPpc@U~myHlP>g^`n`C?Y8ZU%cV z3ES>BQhy>)p|vqhhQE6sB@TqybG@+{Rj9@^EpZ~PPu^wTX9(JlHTbfI1DBgdukDXF z?Nj|o|^BXPun%gMd$GfY(z(c{Px(4Jiop234kf;ope;HtL{t+>l!F4~ zHOaf7N{G*TDb^X-nfG=L_5crDN&qv1-+KsgRxyFWnq`}WB^sPQ77k*6MKf`u=#B)4 zqV%Ri285ac8?c`Sp&4>&G4#0SmTvo0^(2HYUIICn1qX6qVvZ7rxUG{ z3BN`5F^t@$2cs7WCnhalYyzZzElBfT$ESRWM_60NnBSn2I17=nwQ4{M>?Pl)hNxz% z*s`s0<~bc&&SzVVDa@&Gxq>EQ=gU51S+=cZh!+JXLsF-2v<_l*i3hQ=c0ui*<{wzv zMw8M`WGl$)29%d7O_ArWIre^+ZNx9j-oOXJZONNE&7RA*sJ0vWABvbW+j+=USpLR7 z^ax^s;MQA|;r)nrwyjeT0`h30uY>C8^Q#MlxjzRyXW_3zZ>T%|1K;yR>~LE_P%dkG zOrn6(HP;n#V?I;uhHgw6@)?{7)qtf?nV^ZMXmYv zy?O1x(*bY3gQ-fPGV|MD1%bGQ@&dN;O%F?ey?w8VW~^y@pPMyIgf$-8Jd|H>OICYRHON%jl0#n+538z?-8fjt?;NA zIAwzL05hTpY;LN)Czwbx`SA=Ny33c%)LTMlrssvC(AH@B-@ZcyKZs*w1qmdE_3P&+ zMNW@{_=s$*9dcaxf%}~&=PsI~h0%p6F2Wb{uxYtDJ^=G+#AWFg!MpekrKMQY1aAlJ zO^YN*(Z~$?ycY45h8b(6eCY8v*WJ&Kn|@i}UYBEm`vDkZi|;?cgQ)`I?b)A(`@WHq zNuxJdvg0i%Sl_VULe3AqJofaPJu|#Qh$0`JI9vDt1UzZ?O!tM2BP@&i5{dWT56=vo)4;mr8SiDW$0Urlw^84QK4upQ5`3``b>=PnahCO+~OTE)C?B-3FjGu9_K5jEahpY;sdTPIC7B}MM+m~Gi|z8~;#Tyk!sT^HchT7qR! z6Ua&gRKQeTKfF9jyzn5peAfnvRvVVYABUbBwL^XPA)AH8aZB5x89?1LPi7|U|AQ(i zf0wf#^a+7Y)D(-jr4o4hd%V=B08dVq`9z(2$35N+xEua5( zi*g3wISPC$&W>zISPEQvbZoR<@=n>NK^_Wkh&SG_d;+VI$2=YgS%QADgLLd$$B?&1 z$O#U$(SrC>!*Gr>LfJQy%+Xj$aeG>z}`|$qXHX z{ANXg9%9j{5bLABUHg622<`aVJrNwAzv!6d7_eVLh?=Jz@vWzmWzrq}C(}KTo3xn^PdALYuE=g&8Pr2- zNC;b~$1mPAm!j+nQVODS_B*!P$qt=gTZ zif0SOwULBro7#icN^UD!#S0|jp|Nzg%vABbofw1M`-Jq9o9v{RH;yK-5uhabYV#BJ zA}*Y4504MVwOvvJO}h`-4zDJSb4^ebq?1NpdCISxK90H2C-jdrO@Ml%UIURDlI;^pq*{=~wK1_@Nu3d(wq%Mw&xS~lA{sgCG0ZXS(%2w1!+ zQ*t$V6dLBS*bZmi`YEz!_E}W@uMz=nBG9oVwdTE+Pe004^LLm^l)oO>;<=>RXv?@7 zQ%-BKs@SYatH%L|Y~o58JMJXZB8wxd_jksF{ViAgZ6`bo&l5js%->k2=*MlZ-xU#W z&w?-U)BT}9pkp}6eSE(bG>uYmYkm`*k-6I63t(d~p1p&kw|F^BN00lvvg2T9$2DT5 zP`Yg7^AlzBn!AXJb_2~6iQtA(*e9R zF?a-0LkvT9dr|p#%SJ3kV-90*!P!D*=C!4oTB~8vdVA7(#!%U7by`ev*x7cdY>4$+ zE=y`Yr+G<`R{|FFdnDPE+V!Ze5{a}^5q?)wU>SyM4h(krF0j3a=7VGgsyR-viF9=Y z5-~JtUw`fV(a-HB_suzc?sh;D0!qmo*^8DEY<;jM`K2SPrKUilJRYVyvbz+=W7#R1 zuk}r14WB#F%VPw5wyqz$WoFrBsI;y1=G#43m-INtgnhbjE20ME=WnFGKGCI-y(0K^ zxy=uCgDd;m{GW-?k)mLPDu;**#WUnAlx3uQW^P1l#5TpJF)#Db`2v7eo8%N9(x@bP z_gGMe&UuyHgg8zOJIJ90EMFVo4uTsGTKhm#2OzCpL;{e{JzG?3yrn~twP_k*lltKm z?RyP>BwLy;%6+oP(9ekx+HmH_?fi;XXEJNdLXVbe8go5=i%&q=fXbtF6~xLekc6lu zl$Z)@11Nu+c`%l<>53^OL7P`qz*O90M!bJd;U7E$pCz35LfOwjnOrEI$dNSGTTDle zH-3aEUYiFAK~43`RiDN#dKX%bL9>>lJM}M(D zS1KIEcjn#fbFJO9S`gU37qKVPj5kA~hT1UQqQwxmMC9Kf0WP%VmQ9!O+TeRZJlm{; zytVEHtbY;P;$RWYOM8YomB;>tc=6(fL#54=SHC!6 z&uy%*_x8br12~X7SqV4wV#U$%8ZPI#s;qjN&bKSDs@uPMw`Fsn36x{AG@wC`#-6FR z5M6u*j)DG}{^uT|Fy)uBC@ePh!n-0{@k1OJJARXIB};6HM+0@Nm8RsKd9o!J1hEaA zter%2*Uc-IQf%suEsWrwO(A#soLokED-f*gF|7D4GHeI4^@LG-Jcgi_AeNq+`kN9m z%r*>lsz|z(T&6US6y*^r_V49MD`|5STaqq1a-bR4M=P3lOzf4y%cQs=<*2XSg(Yzk zEmZpl%r9tYDG#~l{xia5fC}v%SFJCZ%UHr3pG#j<8gg_esXT4_t#S)y1>kP|GJ7uy zJpY$!7-~@=4HCU6cl*V;m0MfB@f_X5T*Zo`g6b%GSuLm4nK?*2Hjt<|q7WbNjE+cm zWP@c$VZtB7*1-Ncf#x>zHs&JD$@7geBS|mBb_a6QP}KmNJ0pp(wa<9;gKwi1%I5-! z03c?~u#ir`!u4p$+2*sbEvYztQRd+}lc!Rap#KL|@A5SW(O2B;^)4-~1= zwdu1pIHuYsmn+I|gQW4D6diP2AU3Upt~Qab)(!Fh2EJ4(7s{$8w+u3$@oRK|N;j?jNFV@^rb#^~%-yPs(qGEZK5zYJb8uENq&`m$|qQJt3hQeczEFbhn} zR9ml8FH%k|LcZN-$TC}eAK?;1b(&eVdq}3+3JZZ@21f(yzxmi}c#r^NakWb@^D8Hs_8G$JIDZ-Q9W^(E>~={TWk}$`A0&Pl@LG5axy_s%Xu7XiSO#PmDpHI$ zYeQqA-0!9;1~;`pR1XC$at+`IKHyI$?IrIM8iP< z1v|<{?W|6v-+3tJ*{T&Hk_c=cbskwZo*VKRlD^L{JosX@lS z`*Y--qF=qjUnP!rjJr%`##v8<-%2jEIGdo#dHsWDb|$Me3p0g&cL^1mq@Vfh17DTZ zG9e^DwzO<}jIF9dlj!B;uN>-BDaB}XXnabHu&dCqV*7=)L z@i<{G5kZ2_6sdJ6+7wJbj}p0t$6(oGyi3(enEgBLMI_aN0uSt-hf5Ph^D@&lqspN( z9%U%Y*a9UbR?UUOwmQq z!-1y?92{c`HYMIs%T-Y+(>`?oD?O{QjxUgvDI}LG|A$-kXMm)jme>ijbxJN+Wy5O( z184-fhLOACRhj3eU($!uk)I5KqT#%;4=e&p+;$y-1`rRdVU(yq#we&jvB_t}k<}Fm zXwL%0@%B<`hKUnxiS?~k)FBrfh?v)FpgFCzXxkUsa3Ws$WqV_C3}km z(DJmSc%$rEnB1|FQ+jK$Y&12Z&c{GjoJ@n&h;sg``wv4Mv5+E6 zUYrCy8biMBAE!MVSjYXdqjhWs%p=Nc{@Y-DdlF>sIvSu7ahQZAVP<+&Ea2$fjkgT` zjX0}72s+gSt1N)r8Yk*GC*8(dVAV^%g4R@zB!T5wBPLGS(v_Bk*33Kl)Kx03^u0tR zDY+hIRkTXcl?wE$C%PvAyTNy%daVY{XLL<xy2YOYk!L=cXxqhqu2$DA&IpMFHN`d#sX`IOaO`H>bMF>7wY{@r&PSr$|UPAO|6? zM^zt&dYrnJ1rxI~$w<+w?zFH>@n$-1@swA*htkOGkAD_ahVLDXE4y5+E2JB)i-(_v z;^O|={!8=nqDK=%4^#1T-VrK%!?o#RhzkU8a2+_5!UFNW%QSkrYVlgb4lbf)Yxk|l z+s_!s6pLo$!K_bZ=(n?f?>J;_5B~l7%?jsKS0J5o5D~%*=nH3`|MC8%s5ZiUz*o2r z%~rCFV))=kxqO=i%!ClbwA47BNTQEJB#R2oA1!1*s>`zYUuDt4D`Cynv|$m8k~hz4 zjXNQyTOi&nccQAzan=hROuPjoU+O&NDj*G@;vmpRkT4wImzwUlN(zVfszMS_6F_Af zwYK@^Y1z0#pmw`o*F&2|YptQ{f1D`d#g_9sDobx(y^;4ftT``<+V+W9(lw*_wj1PyNkv z$8WK$@u#edwJCx(vDF-UXAtMBOcbUgBD1)}l<@AgG0law1z1ZS{=|J9uN0kOF?i6LM=hl^UX-irpL5r^7X6kWf z{nqDH+g#w{SxME<{t%dD00yW>$AyVPn43D}z4&xOJVI7)wfg688qmL*#T-_2+v?fn zquCG#qgtYVv39HYW6%3P*gdGZFptSeX-V8DgX_;D?`Ll9Zpb|MRs4cSDul>C{Gdyy z`ISu&%Ma>v4n=rK#qVuj+Fo{sWJ;N{b3^fOlIH)x%&m4`I5ApC_;-CTFyS~nHM--u zk1Ce_-M{x-h{u4twKS_z6f)yF^8~t#JNR-A9GqLsk$eKhU;X>!>`lFUX$c)fCQl|W z_{+&8$SySE4;doDrA*5NWMm_HZau?cC7$m8;>z4&PGyZXR<^57!<#H3mG}rtrqU{h z0|0+WW0*w@aQ1U%+9jLH2z`8@h8}(l?twECPLLy2f(;}_Bd;BW&#LeLt?1A@2&}my zHS5UEkzvnrR||4XF#hN&d?UUmeCLqcYQ&I3fv6dXBEY@vGGtnbUCV5`L1>O&kJ0bL z-A4h%{kSZM&PCH#!SQn(CIyvLeUen5vW9XpBRUYIFAwr4tG%xU#>7^Tip7@Gk)2i4V zlagO4tmMAE;`fux)KapRtex$olxhTHMQf#4N)s16$F$UnYje9gA3{25z7)DRtO6t{ zGZu)n_)j?G3*(zv{wBG5?EZIfIn)nUouw&g=Y=`A^0;|)qHRU1k(7d>5aNi1wzXcb znMu?JG##$y{4i+L>gywhx%-*W<{?~m-;xOCIkXOLTN{45qC{_zS?D5liS@<|)mP=S zz^LDnLqg?6w@N&o^ua*WE!(T__aY1JD^R?=az4`XkhEZJpm~v>M=abBmNx<&u}vHa zckMk-r4$!qn2G<@z45z^v-!YW{{oM6ngW+#0BG043wihwMRM?iC@E!*`>T04ajUn< z=5(P$^Y;TQHEs`T#bqq4r!8mnVV;)vaTrWH7(yDc3T-X1`3pl zikUzOSz`hxio&HieIKIB#VNUd4A@%fT2u0>iR8(7G$I^uOztqLjrQv560tMZ?nKk9 zn3QlGsh#O_OeBS%6@@$54GCK>s%N?cjV20og+U1gJW7}%mRXJ| zk-k+c;+R>m95=h+%j(umLw`Tpg2rOBD@A)kh-{giUc>TQ$l$03K&q0Csk$&t1{9*C zBoeRkY|C=g&yWRmquA{I4I1UuH@bHi6&Sf2r}bp+Rqo038uzPn{AvH%DsI;nLr+b9 z!X5@Uye_|rlN&mQ=iX>nup<1NQ_hG&(~6vPPex|Y1{3ScCAL}XI4$pL?(m(y#X*%< z8gcB&`;k3IhLIVw$#8d_+T{k<`7)`|O)?pdFxVxzoO?Fbp)dsx)eWPJ9@W7gFcD}b z);J$_X7-FG!lguREbv?>AGx&nbZ-1_C3}FHE$qS|E;rQXq!iEF90S)A36?bIp)-Y9 zL@E&03fzH+6q-~_NmYLP{=stjc7j*$>B56zN*bXot=enP`Ka-YWiw&Bdj3>JyR=NFgyW_x6}q*`RO zq7@kv$9C{XOa$`f(ZCb>9v-$@O?61IJANW9u(V#Z034ar*5Z}xFWT=EBCv39EK~#e zzPRv`Z;>wDP+IrJ$ND`->A9ylFZWSC81G&|sIjObaxkyKo|)}P8%347|9X7Q+veQ# z$l`^nyNsSUoCcqzzQ-|jVBMqer+A!q9=%eJ`^XMnVdxgLDSc3`ymAScEv(-(^gZ#B1n| zR3Yk%T9BCmo9EQDmDSXMri}Bo*+DCmCZg=OJQ4^t*6%=82N3breHOsp(Dd7;w$a1n z2YUbp_t8b_E38{z)3P2kbnzon*&VpF+%WdB_PH=8Gbk#xQ@HhfmphiP#zo-Bt<%r7 z6CRDzZh7YF*W)RVqfZTpM&aJA%B$VN+}L%_BPiD}IT%&YNrH$ZU`aQP+g$oo`J`vr zWvI|c9=VRuGCnE&kVr%L8sa8?IS?3^(BnFyzT~BH?z|MC5aA@=Nft%8FyFRq?aajF z!{vibx)6>kLeS2Nn5~d`mdpNIH<(HkyT7^5*ZPEm#FadhzWq_3H0UO%yBsW^GGf(x zQJCK!6+PwJ$0oL^5vby0ws+SYS273nmg*uN1bIj_!4Yzq$T&+sl;%b&L{XRu+I86` zrh&cMh^@$Tv-ryO2%w9;{`)D39YQaf=eF`JSn4r(4%o)&eJ#4TWPrQUd%53sqpvn4 zD{N8bjhls-L)gms(&kYOrGyd8m&&hVgC`#eS(A6nz1(klSyEcV|9<8@^d>*H>`U}2 z&Oe!cKUN6&nay`s$IxWW(o+g!P*s}h>DMh0<#uA1wH`%b+0X6T`(Yx@JFPB1R1tsy z*{TuyF!1eYn;?Iwk*iTY_c3u*oAVh9boID|1%c0y@Mx(X|~a z#*45_#Utt}(cl9C-SA0)+y^{P26iso4C|vZ9$%`o0Ht~#c*B06V zDHzu9Z?vUVZBDy{s*t%IQ-&Dghe@S<^#SEi9e|?{X{y9!f-a>5p;(2=xG2OO6Do3u zQfqJJmA<{KcsuYH&ys_a{opCevbIg8twgNG1ob{R840d-^Ur*GzwjiX)L-w$4Y_X{ z(uvB--^}3{&wdr3hDNxc{*8U=t($(4ro3I316au(?))h~zGC4&M9c-Hf%T+X{MO1z zn%SPSUscX~P(Ik$)(UZtM1b1-ZIia;Q;L3b%gL(SNSk5|MlP8&k~(SdwrN|b3gOzKDxN{Y||K_bVTY=8Fl9Y@;rXTMfJo}5FiQ~ z;XLPTUo=^T;*DFzol%xggAfh2emkP@ucqnDmG?yQjNRtqZU2&HqkuQ=voW#m1K)G` zRG3td@dys0z&D29SGJB#yD(VVbzy`O289$6E8FmMM$C=KA%@j21~brmO^PTm&3-Y4 zv0^}=Sy1ZnY2Zw)`!E_hf>M4j>9i5dB+Oy!UhQ`7*;qlKk~Fhn3$^vDR3fru6zMo9 zOJ3Y8#!&_nm{Jw(n66l9O@$Yos!PMI%l6#b>nml0o%F4=99pq`3`CjA9QY# z()~gHR(601Af_zpEI$}ge(Z(p%5Zb(h`clv%wCT*H8r$Vaddp)DOQE<$|sy2)--;; zmvNK~yZESAJ}T5Xy!pc>ll`{VE>!h)E_CF@3cQ}OO&E>3dw+si&AhUpf0Tt%t}obf z0j8PggO|8%sGqVl*wzLlcEKnYxbZy8N9I6M4JTlTAw=TqePc`V78_x!jsYtc zOkPFy_won7KET#d%dd}j(y}#aHt*X|hVN;ZJdt6WQJ#9^xN+1kew0wFILtwJO<3p39rfdWDAK?WHZ2o`DD*vO;7ZBwINq8 z^xgCBkKR~XK5h}=GD4MDDt%kF)hNYSmHJfQZ#)K%RmO2seR~O(Zc=VWIZQ~f6IX2) z=xB$`e?G8Mqn{zmV`u^I|UC7LK}N73t1)RrNZ(-t?h5p(wVt>+(P5YScqwz=T{_0+UU#KI;U zfh;p}?Ta~>iF9klKI`_8OjZ66*~lom;!UMZFmGS6eIY}Mf$H(@MQSOgDYT+qs91&! zMf_BT(=pFtpW_M+oLj76+HLxvOtT6DU~^#pC*l%@LNW~tZ{VG|DA1zUf9>8vLktME zfE*J!EQAV4lhzr|gVWT{xoD=(*a+irheNX2zs|K6*rO@5WX+JnyX~@_x0PW<`0zI2 zhWg5z?sZtl=%qPI%J~o+3s*1&@k@ zLQhwm@5&?0K=IkXcF$a&CyoM+V3@!UujP-T!sP*(r&3kub3_G?TH0aq($IcLDG4mc z{KIlEn8k(}U%Fvd76+=g&b^KxlPgE06Z+r4j^8dM!1uK=wK%19WKCuuAz+HpGy0iU zAMTs+BX(+dQzCT)NEN34C*Z@etoL~w_RkR~wviaNKHh1?^5N2?6-_?nxnd#GKKd7v zalLv)M`V@L@edVkL>2KW`a)*#4^q3n8_qWUV*Zl%lK7Xmq%+8S9Cv{E>}YotqGm<_ zM%1S?8_!khnS7=7jAADY!4UTNE}ozBwcw2xpksEdfcC zZ5-CiN9gYLDArB5G2sVw975moMZb56o!A9|V$V*W*YWC(tR1%u)JbNVbg5qk+(C@r zxZk69Oil<^qt%>!=g!ujkuu*tx6jT@|Go{&vn-e=qo7Kp`4{d-rt+`#@4&!211n~G zVbQVAZec1mANGdqoh*@u7v$>OLYo5W;CAKM@xL_N%@y8!>Hd`O&6%^!l5y8jXM#|} zf$vpj$F7On&%ZZk0NhoBkK|kBE5{|~cEZ(cIs1i$RDl{j+}?!lt&W-SIc)+Rtat3P zf9CuFqA5|>i(a(*>f5bPDY|H}ueER7=7^2a&joVAd`Wh3(t<+8D?M;HAgSib8!wc3YGVmvmv+8c!ukyU%cX z^952bP}{_!#-BdTjp%GiQj|WqR{l@+Q*$)1qf%bfZ6+3OzOQ=pJ1XkJF%ic(yEibc zUNJ;y1jr|XhpFFOD2SdtzTuRZ>n*cnM zwua>wi*2^ouw2U|IjUJFh@x)5X?@T7zyE8+1xvix`0J5^p87@h|I4ffP>CU=|2Mu0 z{{JSw`u{W<`~Na@Tf*=B<=Yv8zVB|=+bGi4xK$Do8bl;eoYsF5xr#_3zTAi@uUPC( zZqN?U5R_B!_oEf4s0RVe|C8VS4K7X!BtyU8I=?h(B$|l8!eRyf@1M#r4Xef4;l~ zyMe#V8h5Q-l2yRiGwi%T30;YXg)J~3QJDSd?nI^5{f`3A<-V62A}+AnL||`i&Yuy2 zX7m$QDM?8FCrB)uy?dCd2kr1Bh9*PrhGX0ZLF9O5;bcAkWYMnkX>sIy#Fyb#uP^%q zQ6x+lmNdn5^Z*_8z(2_EKdI&=g6+rhHf*1CF}YwBho<;~3eVBnE3V2vaA_nxZNQZoXm^*h{|A4_67efkz09h>H$5CNu z63daY^6F5=1V)k8G7sE}t*sNO#4G@COk$Q@xfQs3ycS^q5x}1Obu%aO^p$=p0yPWP z|11jOL(oTqs3AfzjBxibQ5ERu-^!Da0tP$anur{gh71wQ3u1&z)Foym0QqQ$XEfde zU#t*@5N!PO$EbBgYN)71M0sd9h{l1QWe5OxRR2MEs*`-=d3PZOf$D%PEDiKS1qe}I zQ0&MZ=^ijhKBrIjyG(5=DiB^w9E#CU1&|10vw%|BP5{xgZu+VeI3~W-&K-ecXdvi@ z4whK)Vuoy|EqC!;(}sd#yR z5Jx3c`>j$Qzr9S79QA+;QCa!(P^w0L&@>>*3=7rJ`yhZ41=H&~(pIBBWbiFy)A3je z{90hVTDFecQk!QIhoC_~FAciz4Lp{g8?D{ zF6om}mhn{mHSUaFivKx1g2cpTEmoR!jd4X>TOF70(OAF^L5fE@O@!G zjQXg7|D?+_zJ*qPfM=r|c`M$+K-lvm8~5#4H?G@9TuJjlh-q!UE}o%~VlgZDgUSx@ zu$U7w&BYBH@3jAh0$}?`HqdkCiyaW=Smxmp>xq$?0%@$306T1;cxUsDf(?VhDThvj>nwdEw@l`GV{lWPeZOoOfC3?ekHEjZHR7B3Y zk(H>Pn;O%!1XwTfFMS&Q_1H#fb8zsMleC+?6@lPdb5rxJ6}~hCbR&>t422E^PC^2S z#bx%*f=NyAgx_o-F#D{0yrBv_10+tT6~g|&or46Kl*#jQIX=0_@92xaM_FCBfj zs>_zx_CO_%&%%2#dO70!0UX>CwFtb*RwWgg0$I`mIKwqafI9hEH`r@yp^6*e7Kwht zwF1e?V|7kZl6*Y6|=$ zTyj4K2e=;X=W#B*POA{W%=p4Xis!#$f(lgQNA78!Gd~h|5~A*1d5$bJ4xrM#9d)8z z&CxJatIB;gh}RVMd!MfKFElvOlsDKHAU$Fs+i_+FRwyBc{) zq^1=&Gs_Q-H3=YfM@)nI8&wQVw>TR>MPHw)%$QKNU3_DX{qcYG{(E8rwMK8;MIBR2 zhWFg!Jk*JgUYR9khc(1IuB7Zgrg{n2ZEl#o7)1{n|7sHXNX5m<0o^QGRqYopiuIBC zD;@N!sa*_J2oT3vu%CTmAtWg%h-eh}2XQy|+z=qLC8}M5&q}NUX@?XSYa9P^V zwp1L0Gf6Wu40#I1A>i~(U7&#nSppH>OeX=oU&ht*(96YR+LZVEv|$ZFv17Ur_7RAo zQ2>AJ0YMVJZgz00nezS-c^_XZn!RF-u#R(=Bw}u$$cQI24|rnbPpD1L<(?f71pA5y z#M7Bku88-v0)tTrP|6hUHE5JV&UU+$&z}KgAUuu9B-CXFJx?!{014PoaaP6JI3aI& zfL)4AG*z+uU5*b-3L~fv+4be`wcf42OZQ>32bn2s6wLV5!3nbGH^k@FnR8fXVCXhh zig%n;nf^SSmqC#Y4$h&Q;N<6CH6b=48=BV{%%-<0XyHhVM(RP|N# zgQE=HhxwQF&N2a~r=SekHN_Us4}^Pk6I>kUvNW65=Eu-q;-Hy~h%*qut8k~M;j5%F zl44922bimMAeifG$!2j>BX`^Z9gU$|)oEoSveqeiL7aYSujb1!?QvcVwk)YLFSv7d zNW>KvdBL0npG|ACEc87o$J2tng5&r%=7Yj=Zp?`_St*w-}=U95zXiZfH{`!K|?mb z*2HP6ax#jO=fdIBD`c9tuvRbar{4tI_02hMebl!|U=Pwh?PHa=(#KCJ^W<5PwbN$>jBS)h2hTI58l}PBvh^ z4kmVq?7O^#NHWujqckndDfUMRw>d|Ih8ZXcT|!k)4EXmE_-^fHgo#CQi z!7`}+DM%y|R0*p<@&g*LfG*i1ts@>0AkwxTE^D_~5|?x$XMr<Rq*24O;Dy2uDsT;-Txyj34S*Mlb#`SUxE8 zGkB~OQ-21u`L=W(Jnu*OeDDz{N_d`jM zz#G6{mOsaF#kTUWj9$uysia7-6mDt{n~qls%$qLE(s626?P2Vr^eg<$WK_gsIjT0@ zQnU*Gp#286WWM8HN~r>ThkG2km0V61@n^J3Iwm!AK%xM?y6TTJd?)H2EJX}Oq+e2@iW#F=VoX-1nUy0_jOJssV*?eYKjY0 zzdWnVucjSGOsfmvuQ(h-Op1?ojNK?4iyw83NoAC|rCiLok%x@o<7AA=HO5MQ4(?JHx|gTAv^N1BXd?XveOvM~`!e ze-v_@3>8+m=XY2K8?*RSvO?M0lyKb;NQkwjKAftdsW^*(l5 z4bgyzKZyFNIa;YBdtO%0L<-u?!XdRhR(79U1~DA_p!Tg3*Jn_A>SqnHX3sy9!)0!U zb*4oNip4J;p3eb`&H{PA5?5{Q_Co=uku#S`QTCVyZ(znZ?clM0@I<@;D*dl?mUoZ# zv_A*D0n=D5@JMbV??0r{J4A=)AawwzS`}Nu>fcz;%=!^qPEATPsm%K^=H-b}4PSpL zfux~xX3n~z(FuzqzqB~WpZ#t4%@!^3DuF7m_H#a8ZlMX=v5%??b25RuLttQDE;!B( zT_-VpembXT7DiGCX5!kq{~8b4-3mITl0BzfkgP{VRg1M*-#iOTakqVp1o<3sw$MP( z;mfh=wc7@2j~?Hi=qNi=RW=B}57Cob%Y% zEcs?XQGXCaDMJ&R{Pk9EBP+KtcdUQ2ntyl2+;r7$G(CwbaQr0_*>q=pW%f;jS>v4n z9#uOec#T*hfb_9o{w6pl77i(U4@0yly7Y^m{W_OjbP?YVOSDO;hXoeNlJcXjq1W4^^XhY`E$=2~S zS{3Y4v+D`|WD8Ss1(At?HKcrlw%jguSG>s#U*F> zXO5q$`J6zxp{XXA>JK-}*%0*)yC{B&A?$hj-}yF%@)f_UNUBY|*<&WQ=^*+TsD>@R z`YWTMDyOcIoEM%c*^)CSQyeR)6XJi2*5CUfR@&%>N)j2EehGZtTph4`9{X&oB zr;32(kClc4kNHbaDDICR?ToNZnq=;o-Wvw6yWBSX#MHNnFTtKg3GOlFV-DvGr|jy` z@$O*iDJSPK-kTS~$!Ip>r@gVCV+^SCVFu{v-gxm52ER3bUrCTP@yr;4>H9d^*m;o~ zu*MO6VgXTJ?O3X7j^;ky#1KUqS&q!TSiA9sB@4v7iCeg{D|{~8c|87Oz?Nm(R)4h} zOr2gh=^U`#PRVxaw{i3126MrXQN0zt3Qea!)O%36eKb_D(8i3-V|Q#zIxdfszm#py zTKih0o^x|`_vLNtciB@+2>)}9FBQ{wEqu|!=Tf;<<>A3>0@ogKHl-m1)MJuK+b_R+>XGRLtemvIj9TqX2Zpp67f_!yx#FX?<@OeFYAVRF8RjrN zjGq)-{Ql7D_Y>kYjCd!(EBqrl)Pm%J^(iwa*q~JMqC1>)mFP^SvPnya86f}e#g`oIo3yC_|DtVqAoRbny(Cg1_s znw?hR{u7!>@$PF`J71dl($TWxFW-90GWDTQ%%QQH1~YP*@{4Sw<418M*4IxAAOdFX zqvrF8uaz}c`lmF{W$qVq7z-3i8C^>o8=Hf*#ZF+T{JCkn|1;Ey93-Y+<5-dm8NGZQ zqcmq*=qc$6roOtLchyc{V`u*+=_jxpsuXKBsc3;a-QGJnd?hzqEblq{(0;+2E%2_v z_s7M)e!ZXY)Cc7hLJ?_7^eGXSQ@+D{{s`KP*zNlFSr!M)&D68zsE4j^UK!uFZ+Zl^ z==XDE=vfSk8{0t=ugj(Zxx;tW@a&O!7&mHM;2(0q3)Fe+zhSRrMtvAi&=wn>RuWS?ML+3fe@U?j zo;WF_?7YN3x|zK5ru*JPx6hhUXCdgKQ4ajXlfYFVqc3E$)L!C1$>5?7jGm@m<2-GA zrn^{tc#n~8ff;1jy$?^F5i-hv<{0pqKpz; z8f>?UqkdiE>8lIf44#+f@5G~s+J&`JEz7OSQq^Y3Zt7!3>JolEM8~(1X&0^~vZtafU5k z&!T5F&e)+LZKa&Y&|~ZU+8o;egih7Nb~}TWQodh^sjrOkA7TC^@(Jro7Jbqbb>zhz zkAe4{o@NpY5DJ@1s!*zr0haS@$s?M>x-~Z%y-7MME=3FSKeqNoi* zb|txF!J-xAF16b*^@PXsy@0dtp(pan2R~LKG-|xy58&O*ae0L+bfbSQAg?iQZ0qUV zlf?6_Ys~#GM5%I)A}j~ktH>Kk%30Nr`u*~M2IXev#^qH9#R@*L#jb4oy&rpMocUFp z-&CVK1PveFy0+!9pDnMF1)W{^LMEAqzkL~F-+{A>&LVCuJm_O$}Kd^4YAL@hqEN!PWX2^5G^%u ztZgEl-1t$r079WIZ1Z}ZcXj$aqtol%dpXO>xQm1OhQaY0^?v16Nm>*=bnIuNqJQX(PMk zHJ!QEyD>Q&U}{8nW*;mKh<^d3MVO`E?%cZ9%o;xzKoM;*4nKBlVR%JlEc_{pIw|a+*gE5R#^SP(?BM9?YPz0{r=$uLv1i@gFqzJx5z5fTT%C) z-ii%43o3F1igD zbJ!+oH;l&Q;$9W%;o&}F_k6j?VM(0@3Jgrt+o*!HEqR|oXPpNa7-t|YhqjoM0H-Hv zS<(yWChGq&PhQVR<|A<+rU4N3a$U&qLb0;@96@bBU)3x>Gc&8*NAq6&=it z*!AhWO0=cGj*Ktk4{pqGNq5v}_b}_L+?;j2n*33ZS4&=7V5L#p|BJb`pB;xWM))S! zy3qd&=`_Jp9B*vKW+1Xjw z=&=Ff)MT1Y#d)xFT_qMBX}PR0@I4=IA&;;b>_P6`Km>};t_LiIVreL89o7prv$qcL z&qYdl96ek;1{O8wVp}H7eD6QpMjn>Q)gI6`?A-d@Ms*`;Uu%u$8?A|g;kS72j>Uer z!b1P!qpelkpee`WH|GKcL^-RdjsZLQ!}D(8H@K!vO(W^u^HL57r9vbRSqA`OC25oM z%&84c`2K^_nsvK;s(u&LF;>MpBJh6i2hH=vKmH+Oi2HSC+F&2r+Us0R4z>lP2e-?9 zim$_mWDKf4oImFd=a$e+eJwCEIz69Di6e!}(_p+DCd#|ICvVC*&l-~YT<8|l zI;-+i=N;XA)cnpCQTA44dsrr?;7w3|jlKfE!kQ9Oo=3m0GK21pz{a@1!_J;>d`$SP z_H}CPaZzqXq>Z~t7A7PrP)yDXqwnh;@hD%ti9}?BLfXUHA72Bb+%iAi4x*o^xof;*5d(#u!*^;%VP%lSy>newNPyzB!<^L&bX~gK6g6;GE~e%Ix-*< zAx*J<7pGWnUPpuqvy(S*OH`Y1TM;rf3 zL^)nEuIF#U04`4Z8_`sGLONOmpbXnk1aXF!i%ls`)oW+i0RNGReJ&=>|G<>kp-8+_ zRne^D(QE+An)Tn^OBfd0?dPJ{G2ywCBcfDL5!KU}94GaYYc{Bu_3Ji#(j5ju)l)KD zyuv3$0I>q}7&jlSX;ZRHw+{stdpW%55~z-`IUfitZ8dBLvXs zPgQtZzwG#u0JhFxn)T?c7aFqTld-^IxMFxl%J)8ppu``157;wJu9Rs?}dD7 zSg6cvmuYHFKf(osO7&k2Lm__m1{9N>jUf=Q$R}i%%!1wDVZ9Hq()?=+bGhn%}A50c&5sF?|g; zyuYT;bMd=FlVAkS=am3~%MWEoa@+1jITtzlFHhPM4&ejsE%u<$D@?emzgj-0}0Dudp5ar@R@hMmO6DL;Se4BMT z+^Ya)H?P__2jb7uk~gIv&A#N~B<(vNR?nCX91~^AXm-SkGy-S{g<>)`eFxIAg&uZ@ zp2iAot2Qy5G+=e*@yay&C#51oB4HY`4no2QP4cirvR$eLwt^>-j7?^=Mg}#RYUci( z#_m<$yLfb7)t0fowVH2_1by4@)wi+5cvUD<%Bow@AWZG9k&YeCRu{=M7c&dy=y*dSJFl+rCA%a2wiKt{{Fy)>%+8)PQe?o48}o&RPm^->MhLiZemBLAMF$%jw@J9F zH}%wDO|?vam!RM@(mo`|S{@W&GPE_f<=L{wd}XoL53RTa^B_BoIDg$n1DuxH zLv>A!Ta4(afj)(vQ#0@q#y(vJ$U&Yc-jYmeC^;$9F(B|@QsM(mDTU%z(8RG)RB+O< zX=i*at#onUfnmd6BZKt23;i=D?ZBo+>QG~?g-@$Pndw#41USS@RP{$(kZ5BR8qgcn zvZ|JO#I!8X@NVk+<6FjsP_-kvXocv-r;#wBnuKUbwNxh$7XvIYBxHnzXhty|Dhs%w z!@B31+^K~~t0z02I_V#h;He<9jb0eS`nHAgg2@7y%}mqeZC0xzYh96P#@a2CQ^ubw zJ*{ghX~X^i$tX#tjGm$j7-w^)yKP`Hi68k_n-Q@J05?sSNHC-v__hP?QD#A3`S;y` zU&fXaJV}nas-c`%4eq{O2Q>!o3N;+U3R<9|$`a68<*G37(^neB3A3DeGSZI^r3nf) zqLw)n2Y(**EQ?c1F?T-5^FP{s6M>L89mdi9UBRr!P#*VTTg4e+xd|;uZ0PTP>|MI( z#JyhDEq+i4WC7$jZs!89%U%iy9Cn_-0UHgve^KH;1;g|I`g|7E0B)n3xae2jl z$R^*)ku=1xm694;JYO>}%)fd}O{DT$Xmp_vL@6?yc33=aGu;d>{Q-4@;h{VWK$cFE z!6I)5ypS7&H`|2KFfcikU$=_H+%D=g*%I_{0cMbmqI@6ztOTaov&^)(uz(Y0r%FOg zOBCv9f7e<8p)#-qVF8!|5JqML;W6lo@9Dc>KjEuorH^`C0#j9ql8mF8&5GPoFOZ<= zsC*p(&I+FafZ3@&INJFu!#)|A0UvO%-1eTs0tk>iCr?b=OG@UC*jvTEJMf^kT^fs* z5+-6vp6t@xmxJ*Wzo0$N_K*CF$jxFy&?TTOMbj~1+$Nup?$KNHl|Ll{Nohdsc$}-n zt&ER@mIg|&r%ZtLq3%r#ss!GZp0Ea;34o#KnBl^$aQPj4oxUU%>5=Q6Fygk+VL3?7 z8Cv2fzc3>bbs3yw`VcLy6Gd(53g`$3vY5468yQY!eB?c(nD91xvtHYW})Tev&h?D(12LJ1VLCq{r@CLmi-MI`~qatRl-fUm-rqU+KBu09&=5RU1 z9dAu-_TEjH#_65bPoUtvmIEDQ1(T~5_0Ay|(U>ncCyUO?1WhT^D0yQ1$zB`(RH9d>;_0EkDkPi{~)MmI~ zgG0cH(&3d#uH~nqa2p9~J7fCd9+Y=&xQrY0A5&v2qaIYcWL`qS`xVQf#xl5CVf^3Wd?znay~zkSZy znY$}~cvkMD^Wxz8W5|#1V;Cwl2NO9JYb23}2DFP1Pc7}MPP zo(DS!H(E)-IW#+v-@;+J6CV9g7-XpUrU#aUV4j~!G>RbNbmvsy{`Juf6^7^@#!uv<)dsHBV1NJqkWi;$V|d#cH{HlG_J? zV*6Oi8cAqGSc3q30Cd2K^gf$hONZ$6aG6L5b6*8BXc_xNw2D=GyP)(5RgIyw8-B zLMeB`Ky&pYC*$~Umi_;eWT&wtQ~h67Gl;eQKNoiY|HDB4U&rWwqK(g%OrSg+j9d7m zJ-Gi^_-`N_7WTv2U%tcD>+PF99IpHv=l2HfXr_|?%dS?s89#6>2f{@6d}}TXR1|ao z736`k_~_o@;Q(V4;`&^L8=jo6^@uhl-j22MmjdHO zgCS4Nc;n|O(v*~QKwrM=jxihSq&#^Kj3uo%+7m;}?NuV?1+0HW8+5cf7Jx(BF8IHW6INC7@uQ&tp7QZD8*uyLO)b zd29?+w8??AxJ0}C?o4PUxYQzC=yE?x-O*@%AA634CV5eaJ@8`u7SC(&oUXeTR zq%mDJd&W;mn2b?@dBz}Vw6cNV0ue$rB3W*&^U}kP08^3~ceGOo5+p9_E`)}X-5}-G z%cMyKO~zlW3BG|A*Z+PN8hoiBq9g{D;t4PBqZHD(ee%o8BXvdL%}fBJmBdW{2LE9o zFy01fG!)r;*qb=DnNSLe%ygggXExj{CAhMCW8Nca?t+U}y{AW=3g%{?K?a@#IC(Kw zKe4rLj%6?abX=r-RbMASr-ZTIa{v5oN;M&w9;BtR*~d6)Bn zQjRL`#rK?KAh4W1GF>|YiQZt+#L5eyTLeNJbkWE9PsKZ_!;Hg*HLvD>*)9I5 zzUSUYbFYmOjYhi3^OG4Kerz02>!p%M?py_+b86yf2y72axNqX|G{v-{6}l*Did8W!cP!n<;b?sD6DO4rljMhUA3YJGp7$xC8s`WN#1yW&r#ZZyWtD2f%&DzZ5kL2 zSf;oMBA@X^_u&H3H(M@ESqJyl#>tkR1mUQ91%Br=d=4Z(<00_2z{-F;zn4wNKE-{| zGSc`*8kh;boz#*w3td$>rK!b&jg|#p``QgUXnBDv0}XVu<75IUl|?4_&kO>4HY)po zH$KvV=LR(?uiprQ1TBSfJh}w7p1OeulAS10h7?jpRx>}e^MOV5CI_tPnc>T5k#XgE z-A(p0mbWX3tzr+?kNOaHDy(qH^UfXC&nCjc7cwvIB)>Gxg-8Npy=#yZ^W^nrZ*OmB zVi-}=RfI+7WBQuY^eA$Urn3xrUinqSldMRU`@&%4_$H`nq zf)>}r-D&2Vd#R@-m)(=MWMz-JK6j&1K%O)5M)lTgf0lNoyEnF_yEdX2*>QPv;m$qt z6js<9MF1wpl;T^cBshqx|7GLrUQS^ZDrfWwt@r1SC`J(&%^7G(q-N<+xb2eUxFhYK%2~$EAFCbs%*@cpDxwmu^382yK?mDHJw$}kLw$!-} z+k1t8AAVZZ__zN3Na#8!Wr#7~)SK%HgSrFY5QmL^WFUaGr}%Vu;t>Ze;Kn2@AE@Hw*XI=wIh`*;StH=(${8h8Gbes+V4=-U!~dT8Yn3~t|Dj7OWH zoNfX$Cg{|Xr*_hegZD00P14X>Yp z%01YpI~QM#0B+_Z5W0?kUI7>(9B9KqvxEK0{F-Q*!qER+UQu7NDoIDM3MPC{w!{Sm z(hI;R_sGryjCcCAJ)T{EYhfvfr4ig8pDxuo$)8Sz2QT9&6U=^nuYHkxqwSjlA*vwrb=cgP1)JV%kv2>=f)?X%oDEg~h>NQ*c>oZ-Fe_E90`S z@h?E|{sn-tD_`b(^d2|}zYl~nR*faRBxDD8@cBD$onBVijnWu zXYPqt9&Sdl9$>cO0CP#&Wv6-(^o#wb-xOr@HU3R({=3l;KuE1yx$!wj@9$0rPS@=B zVMj)mr*+U5k>v8M2cT`r*o7N@-)(A&}+ zTr&h?_s-e`49JN7XGiqpxV6lD-uw~qtQLv#E`Dc4323L_R1lT-J? zKoATEH*5bZsoC0rDnafSyqSu%C?tJVuLGL4f6DAVTh3Xg?7C1l9PHLHoJibYA@%_2y1s?L%gddKNW@-#}iTl5podvr@VPqa{O7SZo6wa63tZGm0|_PBs$Q zp8*@LHI=aAQumTU4q1c@pcd=l3>gyrrVTEuEVnm!Hh%4npwc@Xv;t%&8^wgQYEU3_ z)rv=UQKUN@2RB7~_7^7HnyheJj(qN8@v3Z1kwc*&hkrfZ3uW-41W<%ukR~iq_8=+L z1pss~f505%fG)gfI!@pEKvM)DBm#gALEb199`VbI3+9~^vJ^FxD?tVq1p4a;5x-;S z%zpd9ose!JQh|Fa;;X?yP@T3Im;BUNXV2|!9OBl-a#bN9EA~f9e?mp!df6AI-V;&o zemmz>R#TJ=4Vd3~*Tj9U1@Yb{4aMZBuVp?q^Zc+LOi)(*`;-<}#Qd-W1UB*9p(W90icF9l^mAAO1z&c76Wys%ApPl?fpN6(vYagtI8h zjyJX3`8~q!$}a!HKL`6;+O1|87!mH6??iJPf09H;(nan>wTLwMkIVMa*#SkqODv^+ zwwu8N54?JYskDEG`95O|w?f$iV$nt(C~^YM21TO_JsByYDCDDmW^)TLlhor&&k}D8 z_`1yL5Xp}4ZGMYvASOOOyKy?)e%^jpA@I4!W#R{gA1(LmUeHtOiR=UkcFSNZhf99g zq;BZyZ1DF1j=KgNayb4a+`dqUO};a}6J2i6JS;iZaxM;>E{6e9)1In>t9v#h|APfK5E#6S}*9+<(O!+g+T+x8iC zC!Q(F*DqKyhPS|g)?fQ-Dyb0W#O1_w5hCf%51Ng@gn8EOXp zE@Y1uL5a)Q+cmYyL48mBocX${?f3nlJ^UDmuEnpn1Ukzn(O8KM-L=N*5jcSyL4Q4h z{|DLWGm3B$ZjTgkkIQS2L-V3@%Jp4kmgdoF0gddp+U2jxoz}^nMBnbEXUP&Ntp=ZH zM|Y_jWHeuB)W=SV$}@G$nhnbM0P{GA&Kr;3;7fwhti`@1ErOYMR3ytk1^l$Io$1TB z5*W~|$By}jEt&Vf1B*R*KE&k(gGjdmCW^hQnkkE$OPU<^ZXf=VB>pV|W_W+19%MKw z^wKQSsB7$(Z*S&c0TVKK^MmTl53eL#D0cH@-?#AY)w^M8y>H0VK@!NO3iCOq%C0g8 zwKYrt)Mc9WeWyGKEC)wYllk2d{PGUTpfGzZ^=`fMWXwpnW@BwJ$tW%|y)J&&JQHV!!mvf$FCVWfq@ zER6{1VaUbIy66Ay{uE}RyctpQ85a_5Z4P@jeVFf1yb1Pgd^_k{xEnBcPxCKSV2iBK>NB#AX^?k8qWhw}jgKu5s{3vGC%0^xicO#Z2Veavfo%@A!q<0d3d(zwy)2JLC< zCxw}pV(bop^0QS{ul8`66sQtH?Up7H{n?|L=^|@*#H#5v1H~d7W~U%wYVcK+vxL(Y zo2tL6M+L8`#=Wpcnp!#}QAN{=bjnm?3e`xlX9wk!sLo)vz(ocY#>sW!kJzJvf`_lnH@%G1;6Ltgyh^ zhz6{a^1OMz&LyG|d5d;;B~4XC7AAIoP8OK6@$`0Sh+%Vsp}I;)uvV$IEUmlVA&VV* zxka01^G(T{e>D=3i@VOh_fSeDRqVpGbu9?eHHoachKAHiSs6I$iV#^&+0IhtR!fCU zLD-`daA5vrp^N%`M;Cq4;myMVd38c|)N#Ik#$9LB7ONZ%-c}L-U^VFKAyS-uncX_azP=dU9McOYa~B ziLHVFO!VXFt*~LMW?&uC!keX-;}}k-1Mj5qyYM}Toh6$q1}7P%a=H{!5Zx26VEIxE z6v!wJ-)uQ03mA|^ca);q)>^0aRu@zmH3ojf&l1_EAVHku%bF$L6}k>7`BR@7NBTJR z3b1*^ZK=OqdOdl4K=)M*zd2c3Y*cQx=+5R%3!B^h7cJ#?dewS{Q1C+{aYaD(MA6_F zr0Zj@4mGsV;cLEL#A5k{qkD0*7nd%LsqsI>)Fke~2gZE3OFfxrz%kO0_d{c62e6Gc zrP|JRsybF2Up@L*cSXHMM4R90)}Ab^F(NqDE6v6z zu)n~hQ~biJ;p?%n`j+mcpoxlpNPqvc<9olkJC};J366|w_%-4WIWz^S!N+lwjzqOK z^Mzcjm5`Z38YkvhGYN0rZ4k}tb`@Z~KcPX<3Kp^hS{?daW3p7bu9Co#8Jn&(d_rjJ zFm>XSzC3kq8;(#IgyhbE8}*+Dd)6;N11ia!^AyNwGtV+UuJ`;1(!bV=iRLDo9yv5P z(JRUi_ie6sld89!QhovfV5Rn|aTyY+XH|ba@#pYvxoB|cB||h_)(G}#l=gG;5EsmX z;%v+-lR#e_gQ?~$8A^8766@Kw)P%L6AI+8I(S@`^*PzGgr9;v#fGCo1dP>RnJhGKB z(&QI(Fy9Z@_mR)6K11VK9W30}CwM9ixrw5WFwt#2`WYq+TUXGUOAId zO*pW=jFlhA>B&sISvX&lg(T}Q)CLhX?70gT27Yg!dxGfCAg-_A%cLZsJ>`PWHl?V_ z;nEq|#y%@9r0ed~0R-t>)2YM|>yP}evo*|4_G%%1ZyT*zoh(w}2_6h{cHx(5P(_|p zj|jtHxv;gi)YGDVOwp0OgL*G&-uFhEB;^s;IgpfRZqc_UfKjbwHWXvFk6V2(&z$y| zLM{$|l|GX>6;VD_!RyJS()U6g>-iw?+zp(#2gEF_P^lCB`_<3m!p$46oFDUJlS3gl z!#2T21A*Hl*Z7H~w2Tk!t{GNvEV0rI9TAI*9A6}RIN87DK(mu2T-rhyScsy9m8eGb z7N?oQ18v0K-jw4ghf_YIoDxRbTtoWoAKmRzZX|6Igp2Ztl}BGjz}9t|Lr5>~AMq_l zP|M5+{W&C_GP^Us#Az;ls~0>zqEgG@FXX#~Xs0X@ggLl*`8*7PG^gPvNjIn!`}S1* zE@HuCemof817Robg+E%o;DE3>t)xEi7Yn_1i)Z&B_KA6}U08=zLtK}Adptf2kX9(B z4d`Kt$o*I^W65H3e-rZiG>2Ub`IX8CBqyWe`a}X@D}TrG`za$y9E@7K(A%51KL~?$ z%vlJQHdFPU)elDkxG{DWS8E+d42C6oH%;du)N`}vIc9&E??U~RytfWv4&3Y1 zd6(mM2(Afk?mqC zhZ`c_WwQtlwgb9@5D(B#zZ>C+PjEPAxd8J}(rBQqP$E9BfDbo~T3 zy@;&&Gu`~uZ#x+}lShX8#qkcoFc;s0Kl#Ey=q&cK&*ya_BD)k2MXIkqOnma)T`4fI z*cR^~c~Ih2$0ERQY2Z?zAvhR&^geoG1@KW(4vB1FW~`9~em`j*Cr%%;&Q!K>`>;+a z+BwAMb^zh)G|L)1I^8PFsD+sn1#|nL_h#h;o9a&+Sl(k2vOuLr09R@u@H48fKk$n0 zIo7}1Aips?4RGtsPnQVkCXpw-`7P%Hy@e5}#Z0-Ad={jUp+!63h}F3k|v2_7uYI<`lW%3fpk0v(N|#z-`u9ODW!ip=CyGk2i#TmJgr8V14c;4M4a+UC^&G)0xQ>lZM&n zM&N#Q;Q}JZKyYV~Co%9G#<k3nR?wPKavJY!?FgVOBhkD zvr$mRH}FuH_#Etr?{a@;&NN`LKP&RH|1sEnG}6%4`d^@MKJ)tiSS}3@#-kkPnBLlK z2d>!LuFDJ|_HX)6*G^C$<-aIo<5o>mK&X37CeHCLoN1<)dZ@lA@AHBFZhZwR*&Kog zPpw~c=k?#{7bf%+!g>veO6l0oif4SSvlTG4*>gYRrBjfk)SV7wY1P!pgRc@kK`ubr zo5t6pU>qUvK9e>3R_!sQ`e3*0@7+;S)vQ~?(E?y1jL!}4CEfPcc_I&l3{YfM~#EaG7C z@)YAkpQX*n$?4AfuatYN6feD*6~NuL183DhcQ%O9a+z33d#NK6h^4;cT#WP}*N|nV zpVjFpGjmY@9xvVdll;yRype{vsIk!6O`kw?KEJ-Z#*|aS>76X;o-OU)yL{Vx4|!()e9uBM8Meoizxk zV<#UOw?fa&3eaR#ZDXbZ#BFoh`9V9=#;wCV-S0U_(1TkF-w}YkMtm{DNrplHZSvd>1!koGLm4tu48HsDj05J{dQj&DL6{GQ3@|Eml@tTV(psZIk6QVy zjVR|NTwB?epqZe{Dyqm4jZu>x2APSF-^+}#g;7DWB3EVo?P+9rpIyLO(K=6k=2E_R zQ%y2*-RYL)@@+9PX}FqZR0e@RW8f)w>d=-={Q8_6Ga}pC>EoV9b{xO|&lYZ&jKUhi zJ`cemHGFT>S@c<|3Uv4n(zW!U**wz;5x>6SSKmJSlg4_y5j|JYo&hi=u-x|GSQmBn zuTZSbzY*+LA-@3Q%x(}lsDK27yTuCJKHbM)bpa#Byt(}AGVZd%XTv`iY1d)QEra>7 z3sV5D^QVLGjL}=)_$+yI7?8P$1_)Nc=`5B^Td5PwH{?*NzgcG?rFx@pZk_bEwXthg z*w!15j?`o1Rh^k$6q`u3me-xp$(}V?iCcT7qom%1=)`df$=Zf%su@a!g*)M%f zTUWRN53$%0h3xI9F0)K!2h&ow~3Mjz(e&$AS6frje0^0Mu3VJ|*vvc7Hlk z0dT_QeQ%M1=zCEFix5ZOrdObgY*9^Q+7;%Of~`lwKXr(;cg^8YH8C; zboy8OS(_5D$!Ao(xR-@)zS3W*nKVrTmmvey06q!(#64q>IJx>ja}Zf0?p+27`;@Cu zEI4A&xj6#iJM4E>`TBI+6j~VC_htkWa4`Oib^{zKP71e0*@|LOABULP*I}dOf z>UL_TK-|S=lZ?x&$zz0-U!06MES-+Ye<5M!`2Mu$!?V~UapL5?>a-G~AuHLJZFl%0 z%vlD&PBy?9(oB>krcg1&SD@jE?S9&><7Q*bIT^Ex*wg=Dx`G5k<6(MOSinj zn{yp9nig66b5*+!ex3GLw?;%)_%L~28#$uWh`}UyVCa)N`Lif@+#x=0+c8E zIANR=ewNA5hQCN)G}v*B7i`JFMaf*S7A{eYrsPTSk<{8!xmd$!ioH78MwZ~b2%)B# zAzugrC>P*3l}XZ+AJC=ZM_X8M9h)uZxhSbMQdbUYd)_BLC61jtpaDH%ut3*k(N?1_ z9ZB^=kbjvIMe%Y|*Vuz>eH>H7!8xk;U`OBRW5kmR6TTTZ@r~Jtp-fjI-`ry+72m%m zQ@%j#uI4}qda_rO1?Fq1Ft)Fm$O}Pu;KX6Zn$SZhPuAlUsM=2dUVeB~=x}4Op60w5P<6a*JiqrtVQK^fh@56`5c_P# zeu5*RF-*&2zHDqKer-PKVcQ*6NMQ{jr0OUQr1d9PM>ak4P#ArwjFqIW@Bupla(uM% zA&D2)`MQ++lM;Q3zi?rET#0#@S$R{L0xmrlx%%NH+a)ght6~@!Q2|8oE?_xk>9CqN z_M8B`yndGnIL|zGoanE*Qs}Rys!P(7TG(OE?%e`N)zTyTpa8LCLVsHfQ>bi{z!*l3 z*NCUDe34TF9Fo#5DyZYp^P;5qmNxT1V<@Mo=_Pfg2XE`*CGm+7cPeuM{o z@_W`Bwa$LxM(WA>p{b=g)rgcyze+UXQ$Qz0rjnhFA_61gD{q00SKcwBCV}&Y%zB0mn>H?m;mXrEX)DVXyoaU7;FXM>^id#w)-Da64n|CX4#~4~aCgc1uMoj!a zw0&h*lwI2{Eh3H5ARW@(Atl}2-Q7qd64KouDcvn8EhQ}tQqtYE*F5j{zTffv*!#!c z$DSWEG7PtK*IL&)uQNtgq-}Jz;0jzd2r{1>%mdkhp-Wg=i=>pCMocBWC_LRfnZ|pX zXA1>WEjvltG3`5BWG;_>j+KTVT*{exKyicp5PzkwwCX1wX6=;e2<7)__KXKI)2`dj zS-VzR7IXt`coR|mKlX?l#jp@xB6=!~grV}xFbh$F04Qe`%MnC4DVS@XCd_lj!WvfK zP}1cxfufuZjf?v#vEooM%JQMqV}{+VSy->5KsAmiETWB+GH@fC zf*`Qy5E>auk`ci`E!k)acZj{Bk8h;;Ck-DYEi;gyWuH5rw3mvAGKFY{BniXgdcJr8yW8VyZq&(s|y_KRCC~17*xz7;^X0pRZ5dKL!Ot8-r(?h`pWSO>_}W+uw?@%SMyBLKi{3bEu)DMn^Yl{I$G z#3fBY7;Tsl$NW!m&@%+Rb!dwspx{6TG*Zq{c$ujR=`?I9nDioT4R@ASs7~4GNwfqJ zNfSQP;gY6cYP#F1`$^Ox3<3zOuLC%(4Im{B687e`@Dd!cVEa&{Mz%;Kh?l`#iV5b&KDA>5A>3e~>%1gFqbL;M|> zomj_1ZRyvCr3#f09tm*fhT(!CL2SuTj;9D)iVgtKB=C&n!Fq4yf=8(Ix|_Z0K4VL< z2a6rjZz!)1dByaV9%Oa>WGn!lbs%)I_Ycf8%rL{ %(U4%0~GSYdwpNH=ss=daHy zlJ~mS`t$boY)@W5eQyZt1g99Es6kvw5m5GU$*8x2IwsKsZo6W9%e;HG?tm=ogbMTn zEYxHQww_S{38QD%{}j^&es0XQe4A(h7(9l{QW$cu1NcL z%`Wf~7{*`gT?XxEdaFrCKuqIrpi9-=hXLbd(rw}86M-L%yV08b2f&r^bh2-uu|5xB z0T&rif1xa9tWyuc(RZh_vwdaAXR2oz z%=Uf^W?X8sjmJLKT{S!trpCw}??J_V*TC4+t_(U!4h;XxCN z!q@DDvVoCm?nuA^>oyMBNgWD!_d+hobHI$hoUM#4+MSgp5`2lBQfZ89?z^2<@OnCN zzSo6flee}PN_SElf)2tK7eSOGAq=w?(>BF$->YF(KOSqF=8M(O5yd_M!a zl?6x|6&oc=7%XNx`6#vL(%i2Oe*Zh-iHKy{T+-U z8F~y0AZBp;1X+IQ>S6$cmvx{$xK|3r+)kL98#1TNx6X>#L9%j^Kma6irM>7YRByKS z-{9j!bI0@rWwxFq4m6T^dbv^;jf6tNUPgVlfBE(2C0 zoh941=y|lu^JJ9_09;4NdmGJ6VJ?3}Dpoox)bgFO-I##8Y2x#B*7FI`CinWU@-3GH zdd+_k*@KG24f$_&umJJ}kRm?3O`J7DZ&0P?O7L&)b)+ILT!&-5`-v_g76GC!e{ksAJ+G=H(w z>2;KRTzZVg#_<^|91b`J<(;pdCnw?Nfm|$LbvodEg|a*HT^7-*u8)jLFjaU~bhb*u z{=<_^J3rHZd%1&#P?3c{GwZ=4TgXuI6X2Y(a}rCe`y=N4RlV>q7Ri**E|r^GneBG1 zMXRCzbk}%A-XmeJWNr75k9U!!GT`sA8>)|_e5n=`{hxhAhU%&Ls; zmiP1t*V+Gha%oVfXTMO@7hn5dmgNw~^}$ad&a21!O2?m%eURMVMksGF0{7E7qBu}f zoNU73dkftd9uTc2)K~#e(H-*tko4cbtZ%Spx8<6vI{tdC!n@4L9^;oGOXW|Ac*+GN z2rsSVwJqx{$o~8D34w`$r2lxlgQx$z4GsO@2LmF4`2QtPz+Z&2^;Z3Wto&bRFvy$* zYGCCptki4bHZZ8X+BEt1chlstgfbj`4r^@WjAEx|AYl*zHZb78KTFXNp2f$62K?*s z^{V(4f?_-c_jCLCuD>PiCcoRm@!$u@eF=F~vw~lvlLos2p?vSR&o9{J^1&E(2i)Gn z^HRy)VgT+xSP-2L=fC3$qHs`xk zG%z^u@BiVeGc2>(qN?gIRLhO3^&7orAlMe=C2eHZ{zha?~T3n(G}PI9c~=aDRlB9ev} zg|M!YFUiC!{Acf#kh>si`?$qiG{6U3o7+W2IQ_)`=Y`iM{{~>daR%vr%iMm-D(W2c ziQy)q&OwES4z$h%(*HWWgHF)}PCa9ZX3R$#;*dnRe+C|PSPmxGd~omNH;Hzd@J{s` zI17dYJE9~V>2GxX)v?x8oe)wa{FVASSG^TGeh=z~ zK}O``s-?GVjM#hO{Nrdp4rjhIgP{-d;C#$_UN&fSyY+{o=OsR;w514}Y`oumTq%5Z zxjCF*G)7i;x@u~$8u@+`b3xFusz7BbaHREVIKR02a+xXmSF+!x8qQ!JfC~z-47$3p;$u$#u5^Ln1ZWSJoVX^wH$* z!`%znQ$hPF6JYwWP;V#MMh(E<*YMOq{up3tp-iI;zC-rq>3{o=+u0wF)3DXP=cm&g zah&XpoL9=PFX6t&-NRn75J_9pCdyJMn!Xd{0z(K+Ms%FAmKO-~1u;L`Z-QV+FDw9t zF64cc_VllmjgenS`0Tt{>gjKINC+t(r>&l^YhoriuQ4+bRBiT!*D zlB5k7E1F1vzXW(AU{i%9bC}{*5Of#?gahD#1v|@e!^0#mq}q5hQbY7}9_B83lX{;n9dOe#3Z`FX!4X>= zgCt3)6ROh1zSe_fXYL=OhFymVsD;twLYyty2p1FWMDc^W=7YLyO#zGOPu#2SoFi94O$^apD~U*lF_mP&A@yEZVZH=z5pBv zkf!Eg6{BR|0b(4W%YCzI<#@J%u(h2Dn?P`GnII%j>!*92f<-DU&@Hk6mQr?veJr!O zb~;u!NW4$DOdtERC)F`*FKRy0P;ODFO zV|%wj~Lv695h(73eT|Y>)sCoa|V9mtCx{4Agiw) zVAMbLx)AcEh6T^5pZMFsK%^eaVv1|tzLQ5#F#V^R@@W2LQ1#y(kPYw~bup1Skp@v% zX)nLXD&4v-Emb5%eCX3!n7{`*lfPRX5{%IYCnoYB#EEb;j^7X!xq?iO0Nk(om2*s? z40LRaP6LPTl1cZq@zrKjx)g{(KfVs`Xh~V51B!KT8UoN!n~pQi9+_vp@yb@}MpTl9 zfkdIpQSxvnMcLj|Vq&+H-Zy1gzcj>Tmy`lo6YpqsR4Skmp$5TSRV`Uo3uiY1aIqA2 z`tS4l$8Q{z}kNF9#{8B}2N$b+UwTPY z7+|Mg-fXC?kZ6X2;OVa(Th+nC1{t#eDgm|v2IX%#on0O7S#BETx4AUZSmEZPl#M;3 zW$zn|CZoj1GJIB&v<+&VQnNqgZ84O~<@~JVNc3P?L|t?tqaNkt>ULCb>;o8g!lm*& zPY8iO7%H7YON=n<)Y&OoRIg+x2w@;0igcJ+9(4-$m3Qy3s>hHbQVBR1x{&W7uFE5G zTgReP+Pc4FYG2{ln3cbvm(u+kQRM)FR#i;fZ!2-+gHKmaV8wI4;3`7e63y-&CAOjs zsK-g==i)%Y^V*!$u9)UrhrPF@??igm>lHd|b=P1lv@#O*%Ogk(dfIJ5kEa|57o=Y! z{>eZ6Z&#TBnh6l#?{;ZC;G_bYT|LOt+yRut9(_jx$4`gVL_juV=vLz{jn&Kg9pEvD zpUL6tHb6xI6i{g*q-M{RmUx}BwnFrP;Mt|`wCrvV&5cc4h(s;U{A z)%!QFZgIi&Qg~y7km5ABK0?I~RfkLrv4g&ScBYNG=<_MP=qtzNb}^ox!AUm*R_~^> z73DnR9ABp*#y9**Nl%hle6G4#aa-wM4;7&F>0EByd3rVA% zLx#7d;|{trW$=diOT|+cW6bCa{RhO9kE(oENWweqdkBUS1jG0VGT`L=H zi_Ezy5Htf{AX(8n*(=Pq9K=;=xtTY|5H)Sy?>&ERk+$u|)Oqzz3?!0ewD%#48yyxL zQ6?|rTLX5*mfN%X5y2>blkK;san>p@!4KBXm9r}lc5p`Cp=5M`Fu)^r@dz&9akrRc zKZE;dg&wZlsBn1Oc_%OPknj01`y)#6_%ANiqk9QJ^8(dB2xi)!<=W!KviN-eVE-fp zz=O?)XFxcJ_P^(L&UU1qSB^OPTH_-8TJoIXb_I}MG_Ng^O)ycOJqxIxz3)&m&v*%= zj%@n9q$#lG8^pFQX($E*&vmK<4ZlxTn1AqtkhAy=Y^NATQrZMi zhgFgIH&7P0144pH&UF3`!u11FP065LFuJs1N=Qe31G;bMtMFC*Y&i zxkNk#%rNU%yqLoOu!SoOab$%6Hyi`pkhrWx<}V;hdE_};(8PZMu{A}k#?rKwHXP1w zcH8@Lsci;z;Fe&@Aczg-k1+%va5Sav_hT zpaA%Uo`Ef#`Q~e?6|g7?Jiz4)7k%HfnW$@`NyGxBQ8QQrlK5!RxFDTF<;$+NlsdOw zvL^E3ahSxq4A!)&QdUzSpE-0|j+G0S>KtWrqk^NytjqPFVzOQVWg?_hFCL{7H_H;0!c@~cD^->-Fltc7 zd~I_c!p3WDhn22CwdO|6)-PLh_lcQ~zVrz=h4q7gh}yR`(E33Ys>V_Hp|XO7`F7-c z)#7{i=u3lkYT7qp#-g+HB~m3g^fDESh5jJ^3x??rVZ-moh544+5upo^B0A}C$(F@W z#V&NOHZ=|C4?TOy--3qw(JSKEtRI=Rn$C@MFCUc?se;{_9J3h(nMlh~&DfThJR7T+ z>4G4=2{3#OFV#Jg~$+U!oa424(Qnld|RP4mX5R+W=u|VGF-G9VN&p5GlfVV}011tM-&PVhie63;>rUr8t+h zjMnAV?vAXQ_1UxlT>pHF2{%(EU{ckc&hZ2X(REneB0L+B`rax_a1wi2hhXv|4aLVB zmhkof2gkP_B1i)Zl%SNTvRWRyYcIIg796wxqo`tlTw_%prSx*W0>p+D4jxWMj5P$4 zk~1BYGP-btM6kIi*~OU6)J&vSTF1R-Wl+_{!KmWX8fmdYN_#Oo#=zil`UxaD1%g6q z6JYib=NM21qSJMu&WhZZ^bR9kA)6O+fSvgLGt!gIL=B75@t01HKoL-{l~D# zyxV)`6^P0}H;0F$t$Qq^LG*z#4dL;0>EA@1H8Q>vWiGAfAN-Q6Lxx06Rl>(_ivf>M zVbUo4L@i4`)|sU{Azjg3Z8AJ)i{{rBcJ#k4kiSBxDsv4(?L`s(&qg{fpP573Q)PQj zjGqVx4XXH;1o7x;P?ToULMdN?(Y|Fp3J;0`qL;M_JsllskEl-!0TN;lLYGakZ3?LB z12%sV(4^h$SSw*SEzxIT+xEKA$W_Q+isA6Z;J95Pw`&Zw+~kx}q}j~;Cm-x8yRVKt zL*RifbY&99DKPsd&?Ny+?}QBak;Z!F5@es56b!M#^BW3tZFY9wOx zQ6D;FdGjq5RHg5{{3h$MxqgaE!GJ~A?`edupjx3YY>hPE-PLgwbWit-ZO2s?L=L~E zWJq+Jv=xojagD>IY~ZR)>WxdBu79cT`Ga6ZMGGAck{<5glVkMc(sQWt&oU3vdDi{3 z+cNoE8NNWToPmyt%MnP6fZXA*D{|-I#9Yb>g|jNDb}ot==%d#~3JnT)oaVQ5Pr?H5 zWqQ^|^mA>UfF~G6O-n@qHE(tjQKqimyxOvz-%?Lf9dpKAUN0U`8lD~pv>V%u=eu;u zu!;}q<}}7_Gc>v$U@@&VCuWdlhOS)r>P#9mOvam?>(wC%%6>H&pw`YG3#4PhkU)n6 zM*F1fcrZ0$w?&a56-&G|fObwXl4?t(6#;~cz>W#XDo*r)M=TK3$h`a{`q{{Ei8f9u zO?>_yNlC>>G~{9B2e{8VX;Fl!8^hGem*&wC4AUi&QM!`QhRm_^;Dl?DpktqTlMAYU zUbI<@4gl>nElXxT_@OU$l)Wc*0NNd!xY$w~yf>IMuiwBNpt2wTH1{3T{WbNqV@R1l$eo&?TvN1AFFa zAnA$JMH%+Pu`39-7v(GbXj(=vq1C;`*p2xHQ5LqXQxoS^CXZ{D8_ps|JulHC(VVAmm8Gebh>j?6l+#!pL60+!*%OHs5;O%>K4ZA1pz1+7> zAR1!BclaKK*s^?u?Z(A>zjx;!FP2$YZxKnM_r1qh z@1E&^V@Ixo&1yt+J|}?q+1~a|l&!k^Mo*A~iVlPqOU09{cD$5_69SXR)5@vJ01ndX`5%#s z+2A&Jt9l6Pr?J(&7lhHZw+&k6YUUU-!AUynva0j@@>5IjtcU4NYYV79UegQNXpR*n zf1cdd8NGOTny{TM1m0N1m-hr9IZWk;qy_;K@&~Z!z?}78^e2Y`ly+b#3(_~Cl=V?K z04EG}F$jIec)`eL%4J?fl?gW;888*F94owP;3$HNu|Ztn+I*k&P_6z;J0o+!8BHN| z#?i!;@4L3EnN=I%+Uz~`J3E}F3o#+m)9n3hK^ijtomUHi&IJe@_=mZgL95 zQ&glnMW$rLU2>Q{oyR+Z=u%VtOhe@?GZUTIwY-Ywv&EpkN! z=$2%Vwn_jTSUdg@4z%|&l(UfZH|MT99uUqs4(S+!^-S_%7{h=h97*4rOvo_^xE|zv zyI1x$LIy$C0vih&n4{#?Vgu<5UhjsMzCYl8hj?qH1Cs<0jfV|^7k`au1;3l`)=n!| zN%OMwM5(&`YNtOabA~RC(MB!^F=?f93j&SqCZbwE%B(J6(L@F|0!Gi$lq`g`CA_aR zXQ#2AHG_b7mnEM)CiLi z0r(&Tk~t+Kny&X6nO0f^BXS=Up-soiAVl>ZOu1J@D=}bd8Rrhq zEt_>r06AOuvPY zPb1P_sgYHE?w8Aa6L9o(E>0$|8XA|-p>iP+qUoIjdKuUqD{6?LS_2>(9Pw_@|1SIi zPPXfdcGS6gz|Tqc>HeIw9NuSAiuC>E)O>^yt!VSRD9Y`@p%AY59+_!Z8-!6WbF`}I z+s{~tV^e!cXzR`-O0NTRcSFDMctf)9AlY1tq&o6|&afkA4nvTSN;1q$1UN(y5?vro z2A~mq;#1lH6J6(YUaYuh=)8=+fkFz71Mmq60U2GX0V_m9|0?Wf9{~a5E85qUa-7V7 z;SktV75BMvGoA$5Fg>cLboIXKKHx{I!X{xPD86qi@1R!aJ)60)aei`o(tMd*OP_Q8 z*vdKLW31<{%h5qIFE3HWj0jcG?4FjsXa4Kb440M`z6-3Xrq9~99!qe=tsR!Xa3K_{ z>FI+K&l6?b`TP9zXXvo~DVY4Hc!HmRCaB07%#N*j`kM>nSJHmb$`1uGQIm+TAi`D5 z{(kN+iocR9<4@?DBv?ZTfZ)SS_X_`Is39Cv#0HM$H1Gfax%~A zjoGW=5#QwZ#YWFsnV(6s7^KmxunnPdlcg|PY)z%PFD}()>lwaK&1PR55V*!H9TOhl(c+{&xhuTd(_#ig+e?yM?vLIz&gqTn{BkRWG9a&YC zEOM4Uy6>gAKn@5|uQrb!2$Un-P6A9h(_`%6{vw?dmnyvMH1M-$NrSd&YB~UF!+z^K z6k+n*UY|JIB0>_{l29#ap&+na*+(jd#f+a9Wv^eo%9sab8UJ^9DB-am$|8cGQ7HbI zPh1HujitQ3T3~s&s)+r_8f9tf1r%_#)R?ZD1C0(m{TO=IH{|PNG*yggx<3nOvoj#O zQ#bd;N)$3^yALKWW^hmjUR&GGR&!G)kD{;1rY$gHLl$oQN@L*We_cAZ@eO@)ZOaXR zG*^#6B4<%I+$2AFy_Z4^NQxVNeoq3Ya)qwNBNk}U6%&#Ms|_owmOheyOrsqGb8j%D8dh~4Dx_&XzN%D^jT^9i-AuZ*OsTE zUnkyet7uDa^syGRrD*^{oFQOGM%ZZsX#7!8-)IU1%ZjI|b0D|zeSt8brs{xEh9o-- zMDq{%?hq9=a60bT_lrG??=+qWn-mWLhn#yO2{r%zJtw0KH;*8_%+!^zo4k1T#C9h} zar1Qx1nw)Bg69Ys){q@sHTk_Zg6bW( zY8Q869GD;c+T7#H5|QGL9(*JOaS#0b+no03G(GIF)29 zoNf}^c?MY+1S|TGKm7^GA)y&Dq&&6(Z~?c0B5~RmXrV49?}@FsKu z{C_gx0KiU(hs$b;K+jm-656;eaRNylbgN*MkO74dII*7#ubLq1Hc58%lbvN8fi;3F zktaV5Z|`N%$xTAbdf7GDen~Qn zthbuu@HirP~~y6+=xz@^7gW z^)dV6tU9B^5sHT24B?r_@o|6CC3$Q#QtFD@tw)=#8{M6mYEI7|MTJnFUN*)RUhik_ zY%X+gUkzLj>GX`OvM7K{uM`tC>R5Uf~%MII5UDO_jBtjC!HgA-j&P@z~U#$z@7qsX0Tp* zjZ*54oWVH6><;FhbKtpAYq*oDydk#whp_5M9A|kP{qXA+^t`UywW`Ns_lh{RB#aTs zMS_Zv);@WnZ;Qp-^SpY319`T-^IRh~Bcp^4H%KVM{*lO%OyM}9C}**}oKwfSOq09( zFKqhva!M%uTAa>^K5&#i>yvxs3_qssUw+KGSDNFv7K|CI?PksQ&({rCy8rHH%{PCs zapV%%IgrL1;mI_GQ(Ws4g~X#=*$ciijpF%5x@KdM=_eNrx517X3A1EpR(VJH{z{tH zsPKc&N?{Mj_5Re3f}SuRCN^z#Y=w%Kte>O%tjXV_4^}UU@qZ|=#Ft7DLy{2N^Xfc5 zzhcvCqaP-3y5GsFgL4#2DyP+1bsV|x%;d|$<9eCb*u+=7t0^kC=CgJqo6uRwMwISW zmlPI;Z(v=J{)vN^uo3E&7Z&I1X5z}bA1!4c!+lkFocI;ei{d=B$e!=@rXQqj%$m7= zCpkE=RJ>~$uy4>spG_wCtR^vuvmY)IZYoDfiJf0fQyQn}=!;bwss1J;DoB_-&{Dgyh`E>94cUHVhB73!=l`e| zSjw6iT21nEHqo|N=l}(N>~2lO&8S-e10oFQy5oFi8|U)tj7zGZoe!{tl09zhgh_r;Sk_AB3#}np5QWLp zxUk~DyIY2?PB7FuFTH}(ZXy;;0S+P67T@w|Q1zr_(ToVEEFb24F<=#z=Z*1 zYv>0kq1@5r<5XTJQJ^zpCJSnvk|J*fHw#(!aDt74BKnNW4_#j@p8w7+!zE^8@!}>A zoZWY;{BZS9a(W+iFnEox^|}2II~iPT7w+)SZJ*}5Yx?ecU83RH92b^GF@BXiUnO&W zizfu*Pnbj*x9$6`KzMr$W(tJYIf;6K91V&==nn_))>YcanzWuuhB zbUAj5Ao*xKcwgRU_=MUga{sa zDG`M$+*W!|l)0#Ve_9h*umopHislWCBj?Gu+5RwHPkVP|n_p7>h@#<&qMt5$WDK6? z6l-Oy^a1*VhueO}I5jgvFv0R9aSBXVerJ72dZQhMMh`b|K*u7RX_X=v8` zm^J2o&LK!CB4sr-l-#j)yM|)GcJ|O5<1L7)WbuKIwg>;Tk1$O=ZLo1jA~`Dg=1GFQ zA=6fC@=k)lMMyjAx;-#Af=r7uwPeZq8>|AcAw$(Y)zWy&loW@8Cvzj=TB888Lv`~~ zOluVrL>}8jMHnQj0O3?eX837%xqoEY0ZKMUh1-6ecJziLK`x_cA)gkcSFtS-i zbCkR!HANdJe_65$KHuj>vh;6~a=49YbLr$L^jGaB6}26XHkGp-H+Ot^=O~zZP-7g) zQWS0Kqok&FnSV51^(?sE@WZ#GX<@)OCj{%3V9wNrdoSyxb;qw>o2`mtHKjSG;7|1V z8-~@zpr`R>M|QpSPVBsTtKSsd+?Kk%cus*4gB%G*Z=g4&JxCHjw< z(4@U4MvwibeL0-!vf}Lhxi*?lopulQWLG8s;7mMl-|)z5T-y?5$UP`a;GQ?!raHBp zGU`fBGNemF&3NWvDL@@JJ(DCsZ9C<~-+ttBWb7K*r$_C_ZJ-_#N@CewT7T$mDZAsc zK1(H3N;9jwOnW*0_?TTYvY+i%_DFr}bAYFTbZzPmRs7B**=?Js5^%asb@5<=;ChgVN zv*}zf%c6pO%N|{)!V!w13z#D3R)eF4Z~3-Jd7LIx)8clH2X8a_tc}!8d<-8%Khf7D zs|ap`<5*|kD9BWfEgePo*?Yuh^qR+=n~|OHvepz$<8F0uq-N#`m60kOj``G)+JYkB z>b^oqMBz=osWaxm%L3vbgnWcJ@ikUF^FLVM9!w4yUl*{P6WickJEj~D80c-^Y-1#G zWZ4=WEzjgYHhjan@{V%FXDw4)6o&hFXjT1QVLJCz!5mzPsV3jp$jV=LNcX0Ma#DZkeZ0C&$RaYoz?Rvj-zT`^6~+U>=ZTQk!~Q6`PC_M^e(lVQndj)E*<~jGV ztT8`b#YusHcnZ1Su&D|HBUnUSa@6UmPKAyNXD)|$Rn7?lK_zp$aThGS6TSHTxTl2Q zWIEK<@rENpn`p7RzU>zs5-NVcl|hyf#taC7bJRDuKl3p%A2(>~^q!2Ew;e!s3NJkH z%%+p>&=1d9O3oB)Ve?kqBuxYN>9e_nKuA@AH*%GNX8E;_3YV2Z29t%uB;h!Yd2|x; z6~Z?GV(JG$!f(R|N|68KLGO$YS~hb({6#ZC^js^>ITv(hF(u}flR(kXtSkSc;`Z;O z8^_w?IBtWD`#$g2=bYKgJCp5qSnW>np{DAO)#pgj0_^qhsqhCYYHl;l$|PiD&o2a2 zZ-vbQd0E|9rtWasnJAic6dL`8>sHy;{oa|#R?Y46u3q~a&70O?UD71r%&W$&lZVi8+?}D^4tM98~5HZ9Ge%@Pw^a-*An0oB*MlwRw0MFg-NcI)M;;D5z%~nB~p;~oX-_{X~q}SzJ7yZtVudoS<1nc@K9*}Yaqr< zZ~TQHxVz;g^5fb*v>R-?dA(%xJAo7FR&BwoRFpB}3{*S`Z9XWX?Loqeh%(i*B5Rlb zrh+G<_g1dR^_EUti7Y|?#fRw;y1RIvD6?&Ak~kSMFl=H>2vOlfEjeQ8bfq~=CE?cC z)(d9ikF!#+88s;K&H%e^*V>W5$riz*8jz(t?l{a78YpwH%Deu zs&(fFZU!b;(`K?!(EKy;E;tI&8?HkXa!FfSL`>0#S7^X_T>SpW$a!$6oCns}PB^M% z9pU)*(UmkFzRKMsDs}J+c<(8+v8k+>aMMth{#3JkGlPzP*3-2&Z*BY-16D78I!W&rkUcHkWn}j(w`Ub%T`IBU zxCBbnxKI`HsShmu#oOVoanoWxF1CLn+qcYRgxRxf@o)yhsfG|C2hlC_gVXu@jN8a3 zEV%^1axlC_8rbXd&UbD_w7~GNd>5*_aqpOgmhHq4fe8z7U&Imy6K`csRAK39t3Q|Q z_}h4`KW}z6xy}xw4X6?b+$7Dzv&-5JSR`LNW*1C{J31^+ag>AIopme^R6DMGnlf$I zCyZlErLoD2E~dwsvz5D8>ciTR`glr3lwRHa2g#u6r}QXXRV2bM&B(P) z8v_F!AH)IKw}^|YXImaHxSjS}7tGk~_2L>Y6g6#DULT>zYo!c%{2ahE;ih^7llAt! za#i?;v${=C+45Q`%J(tUO+L!S(2e|6x@=#GPrw-)VTtA9lYhq+o@kcl)c4Trl$a*& z_02o>z3BIKW8J}B$P}c-sgsj7gbrVs$`p$*DP_`81^46BhZIwoy`EkMDglRUN8ZAJ zYKUs~R-W&?eP%2jOz(T4WzWnB#MIzGvF=uO&^TtYVz_Nj#n`l02S-@ibylc(k|Lze4$M^e&S9llSN z{83bNI33QB(PDVZIrmQ*)l?d6C+yBASxs6Wx5m|hnjSABpO{iM3vbo-aWCpjJ1;sD zW`P$2oe1*fo3Xgf$2};BcEoRCZ2F@PM|aY8(&XgZh@{FTKbgRz*nLs2#+9BS^n8GF zIdbmb=hKUf-C^-~ub*;+rE*tj0 z+`)__-HA4ouX~E_nOu`s8hq%p6e1I)pgZLa_^2Oa2qjCtk5$6zGVePSk;PiBG&3e0 zQ7*41%ge;*`sqwrtl`hgi=#RL2F3xDb@N76+} z-Xviq1M>i64P)of$Z|Y!bEz01M5yBZ!J9S@>zi(PUsY(IClqX|dZU7;76dr*^jOv1MoOh0L06!0mz$Jt0!9sng$)Gail?HfMRB?zLvvlpaUUs7uqh zU6BnERsM(O`gBVvAK@R=`SjoCj%q<_N}MrnzZnc!_Vi-6jugf+Pv07Ec5ubBBQU#c zQ}wILu>j*1dXSG&J+f&!i8ojJ6H*X|Lr;0V`PO@|>Ip+HVIi>I*E)aabGAxt-=E+o zz#{y1fO?_gZPWKs|9tbr(Rc(i^Hpo1sNYM!eelX24RtB-7s%wG7zh~d;{~)Qh1ng{ z?^4yOgiETs=e9En{??5I2?RPd^s#;hBU|07K(c~Bz$tOt#b%l#4fjSy@PuU>-$Ke! zl)IqrUMOA)!LfAtG=@Ur3(D=4W4sL{YK7n|zO2Wz%ULSAF1-|WPkm_)`HPYP;zX7ukst{JklFuIvm5@0Sh{9 zeJkTrjsT0RLe#uwsbK&D_CsPId&^|BP3=VOm7%7hJ z@k}wz!#3!k7qoW}PM?xufz-S7EZK_j1#MZ5Jx-bOnhc5BoSM4e++N%@_Yf2i(FU-v7LUPs*LD1%Y)6)NWWBJ4 z@3iVLCFj#?op+7^nwcAcVeMb$`{s$?X-j>PZQIS9jO;AuQf0?`*`H(XIi^4V1O1TQ z9JxK5FZPncw64rby|2*agf7)itig@3pNq3j8yPuCoheO0;gFq|q_{8?wkV9|x$I~s zRm!+E_g-HTljscRy%1#+pS;J&@H6=mPCJPoK7iMTdD-xg5%`71H$&-UCc(5XPdrV?KT1Xg7*KEDXxj3+AuabfJ@O+jG@!l=_d~ou`q*x6|&j z;iCpYxwIv6U^4x%`E9$jvQ;??xA7|t5)qGT9gI?-&dgI0lOHNJW<%!Lqk7fUE_%{# zQrhrQoqYoqMw};)#DwGxe;!Qi*2}N^H5aLMjR_TWrxq=YOayWc=Y0<$w|CDcRHO|R zy5Wx+Vt&qB$<7-4`yHwZZiflk_PQ zE!y$#w6QA?5_!7*UVK{EPx-HNqK2ma$lbEMG7;W6D2CIRojvW!Ic{>~7)$gwm!3|yx?)8rUs)9Fh6@##;A){NzRLgq@);EY{@L3eY1|(!t z5nm?!TuQVoR=0nZi0?fP>!?d0WkWmEmY z7N4HdjcI-Ybz95~zfQ`X?!HZh>aC#~^hbQdj<2t=pf+t`EEi3$C^eoCgJF7c?TZpl zi7)p6>WiV|6+MzKD1eFP?w)uG0CI7mBbg_2?19td-n>&J;0X%DNmCCR=qD z_{HF6{7!4XY!s|GO|~x>N`23urX<3{A2H0e&F)yqSnuy`#y<#@UpAN*(fyp1rVV7cKc+hB(rUS*)IBhdOnNR*a}f)To#tb56v>gc z?z2&!uzw0dxA9q)@oxNWfCA05&#`F(+{!D4qk1gbok|Mxdw1ARZTZ_&FuM{AkS+Ld zS&{f6^Lp^!Vo*%-W6<*m7J1!*OJSu*Di{{?zU^3w1UN0xbeSnc*2Th<-j_AI@fiCLd)-!QVYkA zpROp*EZFzQVS@*$$xdl6EY%t9ymhdIqq&L{e#>B@R^y!!+x<#YPdzFXP!&2@(G!0- z^CXNagLkgP4s+*C_`brk%Y_#;er4xZQuF=1eXKJcp`a}+i?iI9wEs1xIzIJnt4OYb zI8x?$!n5s~#*@c)`n|B9OZNiYCx(HQ5eO#zr_#9!ea|7qvMzNT=^e>F#ZzIDZMa@2 zN-cfC+HzHe^j9IBQN<%yVw?q>YFdX9FrGx>QuH(2rAh@%XV=`u=JNQ7g5+dbm6BC1 zwl$9$_oxG?V1Q22vfWTem0FgR;J_4$QlxpEE36Q(FkZh3PJgF|ZPSk066oH2Z13o5 z8*7`Zj$D*3U{Y1P%wsM0p)iOOil^9(nT^7(wXatk?ZzjxtUlRk#3d>g(p6B4mbMn0 zzk@eVQ($^0aqm5LH`F>KPvlS^A9>o+w1_BvWTC)Zblh{^8Z^i7 zi^ctZ46D6cQL}E2ZPJCsweow}`STA_wh#W(WbFW`_$c6jZmId0#a{kMdU}ToMPh+> z@sTKAsQGXpw_A~7=nRLjPveXgU=w?Y!>t=i*5Om3<1UHDxdaZHfS0!@33K#R|Jat$UZ1S&c669#l(#kIHSw zc1ngnJ*woUU$0th1&2x8KW&>$yfzrXtoncH+x#E8GygYjp#Q_>{zr%Ce{_{%Wsv?? zX>S=7)ffJc4xk{RFm%TNigXGRQbTulr*wB2;2_;8C?G8?c0)3=}nFdTi%Z5bz%`s0}CSN1V>Nqs2gco%Y$L8RbelJ$JVh(AFcKIXaO=Sx3Ry5*L9Bgha#_ZE)Krk77= zgYmV~k{^9V#e6F!QIs}L=bJO%jO6!*39@L=haTRcjJyl@YJu~K6vCr+Db~pm;9R4_ z;5`1V{6&I)vrNi?D;Mh+iR`;0zUUPMLY6|ir*WA6dL|$^EZ5o(q{P&~3=8f1r=uL| zb#-}SRILvi9F%&)TugX*XM+o#V`1(Lp39<*9=H;s0xmE0cUJeAp`+lm8%E0J!OrF9 z51I9u4GeO@a1R7?t>$;$#>wRulDXb!knpjW2nkVSRXCsc0lZ^KKSs`OsypJ|EiHkdD39}t4>NMp}_-XZW6*)hPy zJ1E(lDY_u2imiZW^=|qRAP9pwCidJSu*+XO`%>%>iSWS4Dg^=nas&d<&}dr1s?*cA z#x{&F4|=n&TeH26Tw#|y{474NeBu$xLzauFIUdjvY&g8ljk@(+Lnt>VB%#8QIk@Un zb0;OCH+$zxp9%eChB1Kdjc)&5U0{U5n>4;XX~$|;hp$VcCu~)&*5XId(PE1yXz+xb z_TwNhz+D~^Nm1RZx+*k(+P>NmhIV}xFtRYB_pxUn@?5ICY(WOZ zl-81~n#DD{R-zhS)qP{Cv`6&ZjKvgBfg2s1!cXzg+@q9<`jT)26QHo7+@ z-}r88aY83(&YHptBW-$o9zMq{2^NE|XX_W5#9x^b9wJF!G59Z7W7(EZd-BDgIQ>-6 z@O>1KsFN|MNgh`A!=TWY-U5Y|O1+H;d2*dhb|Z=QK5%Q?pXBB5`!nN7jMM@M5%u+APtgDX|h(pnc;puGPaOAm^<2=H!`fr8p3Gqy+sYly_H5g7*4G77lz zqb8frvIQkVnm^uyJu$J_^EbVmmib57ZNWG1*SUu;Y0G5h^QN{`efWI`h<13~pk%#= zs7qKy0(GB+*-^mtuX1${ZTGirU&s?T@dpr6#j2({J^{OI!-$OMEnCL756~n_?)adG zrM4%Suqr(94Gmnc8P5OCJoen~yk3Jptczff$x!&i%&^DTg&Hjp-Ahzhe2)}&H^dH$ zT7Z~gYqBX3>!lxrF2)RB7y?ZyWxllYpp}QiMQBb{fqEgdaDeJQZHNfYs|dH8wUZH3 z@0IPksv*C90@Xu&J`RqX)BM1Nj(0@j2SGvfTvi;rxz#rgeh3-hdaZiJdi44|0#QoA zmS>XRUGo8Pa&PL$4*hsQWZHarj<2=1vLKrjBt@@wWn(G z2p91v${&N?{=Hxb_8Xo6z9h&KmjCX{o>}TQ$XY%5!oF8F_&o!cU`XLWqbyVG4EwC+ zLI?tnF@>A~wk*vzo?!?PmMN-i;@*aU&=PW^)x|WJv|`Z}PT%tu z?$6#!=*DyMMagEI)&JgM>mGb>I&S>7d^nUfH>y2v(T zLT~JGbM>HI?pgF%xzv@E*V3VgMMNMg558EBKj=_2W?PS2o#|o6i4f!DpihSWTDqYR z{`p}^RB+09b9u`!qfkyZiNUS?8^4Pz0C*073D?3ZJ_vjd1o@5P-qQ5gyk?fkw< zJqus1xjLXW%O?sG0vVT8Vx4cxl3|p_mjIeZ;{dnfVw8r%pXOqs(7~7~`O)zXbs+)L z!Em^B{;1mJm;2J}hr<}@B{XIEs}*U#yG1lXu=)W+AuqF45)Jz6=s)Z{_hP*J z*~P&he_khukC8X5Z{lbj;rPv+Atd%(@#|qtutg;)NK##9gY=j30Ru$C$B)pVu8GQ5 zyvum8p%tvR#p)V~uO3*sU4bg)^iS3>J;{G_MJ;9vi4y0mr!T(ad$5Z^{E zV?sRi;9~1(IZQ>^`Nrkl@Yn%rF$vtIx0%Oj5#^C~STJt!NSv^oD;v8s0ov$GW9N~K zsWgH^n4N!aQXi{T@ZO*O-=5d?-fI>CpsZsn=Oudd)%w%Umtx)FZjtcgv_ijv1XPhX zBz~{{RmJ69dsV{_>xR6~I=OckzRnFS1nTpUb42nl-k;ns?) z>}@teR=>A6zWhbg_yAn(rp>?fO{BENcI#fxIYp5}(rc;HTqmQS{5Kp3?aYI3UJ0JL zS~k@>HwCNd8*upK_1^gONYe|_@aR2XhhZ%v;#dEy15s^3H{*5*_#=SGO`KHcH2ZS5&>kOdZ1G$SmpAw=k*6s{O4kpdbj&{z>t}*yy4uW7 z+y=!}>=4qd#JS*;k;8j01R9DFDaI|V9KOns=4)pvA!@d0`>ZmaIk*l1jaP2f% z$Wo26MAUFt5nXap_`=!~RkteNq4CeNJN7>mK?Ojq!4xm3uwbENF>mzA0JZV2H!`Es z!U!09uf~fZy=2Cm*<_~HN4YYnsV@(6@&4+@x@S@FqyLitdb8y>ABW1$Z&^vP?n?c< z{mf-n&EFfw?5TxnNxV7NeW#qf2Bmz-LlFI5)Z?IRGHo)EjH20_fp0gIpS<@vCk2K! zIc#|JK0XWwd7tCW)iDTrgU*}7jCdPn<{Nvhv=nZ!0wTj7Zo_td=AxDz?q_9&Av4E|{NsB-`O7gcnmf64tj>S8xd^ue70!Nnam z?_zppL1U+QUc6hQ!D>%%r@ofkCa~ z_6f2pjc2EIoeKI zf76XyQNa{-seGB7#;>c6O9z5fVL-y5Me|~@{lWH)w}9+=v~XTDAEo{8wD(nSMPhc< zBuNPB6zOCp>N5!iXl{_3JjuXum=Ku{~v$R*Yc=0wn98;9V&&;d>%s=G69>1~U zNh*I{Dd7Fmv-S9mj*G_t&5N9>WDPcN{mC@XBwX#g;tdDCX|-!@p}NeZ`|rO+HMAFx zwsHM^t#mb3&7wdcVY3w+d7o<=2KF3y{cT^}*kOv%ftOJiX|x;~Uu+W^1zwD=wPI5+ z#e^)CneV;d>p6AH&^i1zzn0_0%2>lX^F&0^<>^Nal`S=rQKHa}S8*MwH_a}ZtgKwH zSH!y{_Y=RQ6rye$sk9(fzc2uFDLP46I^vsMGG@lwwhN$_rqj)d^;+65y>YITz4NFA-zR~pXhCc=#0R;L z^}>6PNnFR>{XO1c3M23F>t{=ccrLbOM|O7%H6usR^%fzcjM zUz>6g9)&NEY~g=&>gH+jh>6th`Rmt!cj2SboU^ug(T@}%jxn3vxLFIUc&bdP`iPM` zfPe*vY40W4G$CZ=)2BDFc&vtaIOG`&IHa^I{mm6TEvDKRN&A8E%CwgTUm%$Q|E~wZc*9u&(rQj=l47;HB4Xq%4H4 zythg?eixIolo&78mm!r+RGx9+b`ymGHp*>-;*Q?%Hp2#F0(QQ2`Thg4KW^qPtMT1^ z#gnSHr$9l%fD3nX@K*iNe4X(nMzXYc=JeXZc!+fezZpQEGEM&PrO@*#^9huS>?qTv z$FKBR0LpkUoNRRhN~!o3c;Hj|;e=Mx7J*V<^(NyBc{ibPic3^zU62*wo&qR3mwoo5 zJ&wN7(h_EWnpqezwwrgD0GWhDaA99I5QxMi_8gmt{=V7N-Alko4N60K+0KB}PTB^2 zOOiv&(LOh%B1<`j!}AQoN8%2s=)^ha_7-*~L+StGR=gC|qya#OUVF}o-p_@Ul!&TWl@KF>bg#8LTF6`SRuoxlh@ zp2=9~s8QOQJ8fV3`?7-pbI|WYFAVH6DaouxCwX>bXdS~S2nw-soE$~|waU-r+$M>r zKr)hraD=JPt|cE$LF4KQSVnhtCyy>La>=D$MVY>qfT@pKF@b`rUlj7|TD z3{ivu1VZFmL@>crUXe7sGiGE>7|5|CmqQ9Wo<$}G(wkTiX8##!N8R|4;AE zZEr}$Zn@jRnfWS1>O4>jKV!J)AAJs}*_SF;)@3BzMRvHWW2^6>?61ri2=6wcd5l<1 zCex>OPJfBS(2x>{MpayNJh5N?l3WOSlIhw%LAKKl6E)2fP4ZULCL6pZ1TB3S%t2pp zSXkY-I&hw9a4C0BSL*d=pJ$&|NAu670<`NnjJr}bCfI=4+Mr_nq=7QRU{6%h={$1} zE*8)K=Zgmi;qZtZ+;V}SWpo@v_u3!m60Lwp3Tx1Q@K-SgOZy!zK7lk=c%~5LcwpJA zQE=g_4f|7c$=1qbopg`3nbnRb$dHyFe`;moz3;M#x`BFMks6d;sthsm7a{GCH>gC?kkKkHVUa&mrN5|fJjLwS1-%U9?_O%lv zn@c(vegV_g+CPDX_iy)(6-{J|T$9Pm5d2?}TED$>1JAV#hb(ZFvI>MeQyb!BY?7`y zVXH}`6T#p9jUTlVfI^L^i8vKMM(1@52fG{-9uCH!-7MeKsD33xg$KXJY4N z+y0ow0IO%AZ}xMniEp8r**IEl$?#m1mf5umR)7Ud_j%$8*+|pRQ(4sdjpn29b_1q}3!~b_< zLLxJ+IavUsbpP+JRq^rghb3n&ly* zIqCW<3ITNEUTQ$=g`$>bI8|?S&aj9H8pB7YW$Vg=ue|N*K?`j{4|_fOIgwo0S^rIE z;l}MR*(*)dLKy+tVXHl*ArPt4@QJ>MBRUo;FoMgbUH6M8$xeW@-V3Anr;23qT3juU z5n!{4j#vGDVugO(5Cb~t_SKLrP|N_N{2n_eJ`Pm-H%0bYP?nK_`jN;Pj!@a3D43?& zZX(-vFkioqw^04vgBfQ7^W0(_wbZmpos8hDxia5kYs_TPU!JENle6)&gNvf0QHZ&V zr8vVl3C_Pn{{qIOYsOO*o?Oy^?5>e6aHe5WG5SME@Q1>= zhGM&^gKrcoo>eyo*FY+`-z=f&L?~Ap!J3$Z;R5b@v%Lfl)E;`;kO!O;0K#?wS!xtS zxi9M}(Wb)0tca`j1rx>}6w!VG`K#5LZj?7uNC)x;3di7x5zg9 zEE}<97~jb>IjWe<7L?}NAdiJuZ-omo8J!BNwxZSv(IiwAz3b$dZM`AAM+cPqe? z6{pBT-~869)mBW5wtS0Ja0=q2h)N^c0wNj=2D8$o@7A96M%{S#3@`2Va;@`lO;`fk zLrUoLj}jof@~Lsn#Ple#xzTkDP_Tl3r9p_5b*izc5oamKAeC#+TRi`pfJ%U7j%@$2 z*P8nrfb7an6P*Vdq-pggW$R#Zc|CbX;c*NldCx1ke06WZ?5tqg=v$UY_NY5fV6Rxh`zkffqMXGG$g&BCdUtDwGrG!&-yZ!>)Zjnz>abGDAE7HH< zv5(%1#wF93b|@?!xLE4~U;e~@t$qF4D`8bU{O=#h{*5pl9!P@Ao{%asoj{?7ox(NE zQ${0Kc04?#oMxYc!kBHeg8v1$l&){3`@|IGsIArZO^T^3(Lg_?0ZnT|dGU-0>6JjD zzJaG7rE6&7RHq^cakzZVGxFxa@4xG@?z0%<7ZuOUhtlI7kr|_)DdwI|Sg$W+mr3pi zH%IKwsv2e>3Qwc7*MoQ)M`Zw!R`y8?7u~smOdaEfDHyi(4KL`Jv%)8cqkmgJi=cN;GXg5)8 zew1AM_Wd(y7zWpK%#cDnI!J0dKreOHO1GT_7H;^=YT|fHX=7ofkyB-3yiw#PPEQa1 zUZE0ob~}d`S8>6%m3UJh>Ltq{HYIYtV33<)ZK6C#r3;KxwwZPaeD20|VsNHqZN1Z-(wBbLgH=Dtr*^$ugIggiJ%PZqKqTjO|T%4 zr5Dc)O!kqC8i)Moc)7gsY#3@!+_JZvXzkt$q% z(>HW$p}W`+XGgc@+|g zV(1_}F|ukse@=e?1f}lQ@LI&8t*=Al5Fl}ox=x1|_XVq7oG=)zEM$YE3!*&W{VP|1 zI06cdyA5Ii;OaESuBb%RW35-br2qyu7rFPsu$SO#CTe~v& zBC{J3ks0XDe4h(8jRE2je#@nj2Pe9VIzZ4#I@r7YQNCq-(_AavmC+>5>NWkD`y%&z z*#9RrN!Nq!vkUj|K#VLE2yt!|A0q`bRT9mw;*zpNgS|tc%KSJFy#R_4aa4hFaJY}F zx>|Yw-{nvb?;Z&&--_@^^{HsF!<{f$^95WppapVGnKmUg%ieLtK_aBU&bO$d9C-f0Yi@6yRi0IyWL5%Y-7%0KhFV-}M zkNC=YG};f*vChJ}RY}P)momZavNb_{bjMt`Ct_GWMuGElj~(wo&6%dVlSV1s%q1GL$HlYL#I=ta2EVKVdlr3sz^=K zi2TQ#4uV$oH#ZxoG{8=E$qcJ|#MM<*1zMN8Oh(>Mwx-ip?hE^qfn`EuK*u;9A;2aE zr0T-ik#!)JuDIPPcUT2PJb{y0L`rosMfZ}uK$5Tks-%GtySv=~0b+3AXF#&RNJSyt zQv&{D!DD_+J>_{x!FoYwgpL5dH82|#Gt)UT< zzi#LjUP^{NAc)jGWtBeV0_E*8Y3Anou~5{9zo!nzCVesmqJek8P+D_6W(PWz4e|v@TJ@~zEB#RlcuANH z$}?h22;Bj(Jkg_jCiwvC;6VavyWnznq`)SmXTbQD2ZOgvAaKfM-$nH@|0obK;KO%4 zZ?Rqj1T)({_3yT`zSWsY$bdiH$46RT{BqaRTC42RN!Os!dC7c_sb*xziOxx)yecUZ zIpY#gn&h66;BfXao0j?5MUkC{keAxgF!|&4U;1Lfyl6UZ{v+Y_CsVI96i!tpVB%RQ zzN$@ji|Z#0{X#EmUorvf-!}&(y_Y#W?)gOd^>f$u%eb~WiQ^lMAGU)dHzPNKgsGo7 zCKjF*&F~TISs2^jS#Q&QJ?J751M)Wj;fBJwF=ZjnWZRITOeA!(q7YRSV-Uk1V4(AU z>(YI(TGf9rRTquNgAUkhzAuCpDwZN^Y>H^U%~d)w%p)9tmKt*zux8%hmaPt^pnhp- z))vtX$CT#L^e^-h(5vdG9zNa4idi8b1xjYi>co2Jm!I)`Ry%`V57$^EX)d2LOFt`R zwC~d$kO>dZHo5m?TUj5lz=Gko)V&o9sUC9~H;6Ta4K=h%WXTv6w!BCoQT&qk9i-%w zsP&?m?2^bYDdg*k!c0crTr`PzgAQbG^7RK24n7T4(JzX${Zr-Vd)KSEJG~<(`nhrM zo_|5|biT;_Ov)KMhtP&tk>e}1aK7%W4sheV=%(0jxZ5fFU|5tj(bD+{HR6GblPS&; zt1~5#BjQdNDg_w^j~j$=!QH$4S&h!V?kHj)5mGv4PMSZ6KD(@MV_Gjug1+H&(**Bi zmE`W1opFf_ZOKiDY6&G$UT*}BT-$ezR{{_0J@biL0|}l5%Gh^_{pj&qPmd#hhqyag zJH@&UE`BoY)MR`p831SL7r)u`elS-WE8Mdj)4`kW^s3Z*P#u!NiS1)u{R``*5hvk5 z>O^Q2r#ttUU-c>3i+J!ISMO`ql@Qo7Zxgq4?VC8}NR&Q}?aR#TKvO6(kY*dbs9~MQ zAPgCu19f7NALFM~Xr^FUJeS-Y&(pb>6#*k&u3S;y+XRO2uVo*4SKNMFyLS*-nW|#^ zd+}fSl&nVF^;7*PhHG7C6-QbP@ge8i+TT`6K21I6$uYg}@Z}v9N5SUG8&U&u;(N`n z8Gs5=fmuf~aNU~5{d88;&ygJ}BubSdPkb85PmV7(j?$pSrgr`jh{g|2i97a*^_Q24 zIj&gyBR4K#9S|H8W;ik*^}VlRqBG=(xVKP~<<4|FIFtOs_98ybdf)P0v& zM~%ybOKMS2vF#f4rSLY5%O<8icF?oQ2TrYrRSb4tu<0gm+~`aE3hi3HFL!ZsR`i(R znC{o6UkKKOS8|z2hmw|ajU}gwQ<9Yr@Z@Ba3ly#rzc#&%{l@)~vmXHtRnyJI#Z~zPk0VWnIHU$*AvsT$ zUS9Zg$1+W>b&+=6OfRs<>)*o4i)QeR1^+D?okZc1P0|-Q=0>F0@b0vRTnK>6;zA9ZyJWz(^ zbfshztz+U&wl>HSMfaI_d3!q1!PLu`7)qi0u~xnh;_B48XQ>8&X%G${EU%5XX{P9= z5+mkHQ}m9=DRiNfiBqB1tZixti5hTvtKCUF8}n=U;axNWxM$e`0JwVUYh0UOI_FTC z$;HMWAVo1z77jgpb{B){|16@U*Ya2WrDe(T++Rend16m(&GLsg?(_GtI^D}yV@73- z`)1X&c&>h<1aX4$@Laoq?c#hW5x#3jT$8R!*P1Y9vRjT>l7j(Dj9OmIaF-;zK`lG5_7)FA70D(=ePaJbQyLUIHWJ0jGGq6(`62PUSdhGEy!n*WP zyc{_~`P%Qt+Ubc)T2XRh|3q@CtcOOi_e;hG)GpGNP&ub%08*Fky!mu|Nh6X`4;0+kp2&_sd5O*EqmWu;vS>-^FQNwI=F>z z!FlY~W@sLH0o4B7_P{^Jgx$4bfn)lLQQ#mCcd}z94blH#jm}c9Yxe~(H_%+CY%-)) ze|QDZSz`u{$-&7Dp6-9WZo+h~`z`_I)3(z(js4H1FmlKU{sw3)un1p^6b0@a?e5|0 z43PW*Zk3Fw^aBDQX6Tw|V+MvE=EU?V42-qpMCy%%A@qnDxD{e3>IXSe5xJjaYw`W+(h+w ztWpX*q?Cg>k#%Efw1&vjDDS0BAOm9n-hGR3o$twPFPM2!=J=42ia=vva|>Xc!2kY57}#eem#OF7y?baXlkrWm+1^S2?6Zn4Y3t?zlHXhPaY7A< z)@qt2DTDuUtQOwR@8k9jSP?vZlYE+dpFa1*=;vWg8L-3y$YH?l$t0edx#HgyjD4B+ zagZTQ(6^Y(Z=eR#TorymAR?vdUwYTS>MvMa1lrI&WgJAlT2#6UZ+WX4Xch%Hm;<;UCXgyyA?7!f@x#4Qcfv}uY@ zn|2gaz|Ny919B1q>LcO5muWsP&#Hf4Lc&uR-1c4a@1gudlHm6)3BI7X=T4?o>2subd=C)G?+kx5Lxs;5!O>^ zV;(aCJM!0-e6N@nXz_%n{Q6SZaT-gQIf87?*=>qX6znOUenSy!@+SHpBzFAW$1(dMVX%<->zmIxcHjePux3>+PEsZAv9^OL2w zTY?Gu538N4n`8T%?WeD*oJpe&?JnZ5=@joEkRH?O#DZFXKY9Rv%R)#fLCZwBXke7Y zOCCJPeiq@zeqZLMcqcZp+-$#Nuy?V72C?LHuE2xF0XGvb{;L=SEsCKFI6;>-;M}iL zsx>0=nhidyxx8ad3DyD9n1R}+0rf*MDV^ifq)`lBXz&mc+u9&~q2?y^hb5lK-hY)h^1t~O%TZnB&wg|^;i0~L z@b9dJR19EDp=0i~-INi}2_rfSSB&lfxiXhrQyu~;5(vcfFB~JMd4yyOi+33j^_c*C zCXOJ_0Wb$!fyzww=I8-Xrh(r8YW##04LMaK)&`UIf1X>_Lj_j$t(lx%l^J^TkiQq z$mQFX0eQ(D*`dVdbye~5Rvj^3B9W<g*6(d#P3%vN}^r*)NM4S|j+(Lq^lOdGRWDb>pXbSqsof5^rL1B5~%9*H=$VdDB7b`LS z6uVBz3SGf$UBSwtKdYH;Vma6<><6+tQ@_2PM%S7kK_ z@dvDpfhYjRJ;w8mbME;Q*=$!ZwIe^yEUih5N<1evf)g7EsVSTqO62#80*jL$4t?lm z4DPFteo^B1IKDZ}-NEyQhB>mk;?zTk?lR*g0Mr_GkfKR&nB>8;6g(mzlUid2d?n!} zZ(D~7ed%4j%+o+~p??=yl|2PeV(@G+buqcvD#QsFNOoJZWDK(}hp*BY0KDH#(Nonb z>_pR)O23%V)PzI^@hZulj(u%QNtpeTmBoP>rdW?#GM|K9 zMcE&YJHM*izDZJz*}qK{7;$JnMSx?S2kxz0lTsQ+dY_MRmscV-{) zM&+Swog*m4lIKHY!p(Ke#}BP%=fhDhl6uRxPW(PueXG;g$-}LNj-zHG@FN1n;of-A zLzagprh{k3Rf^d&$z`&V|8v^bt%QrD6JXd8`qLSiW<`_FPl^r+uE!o7Qm{Uv6q~dP zq2&8y`#Id&q{;`ymgX(*%fqS*Y?vD!s4t;-v3mHEUxf$&8zBy7;5WmUWf!So^n-Nv zV-+Qo;+q2Vm*ao9q@s2bQ%g75Z{| zka*}a5}LIb&lysL@UPz{h)#dwD#$-kxP?9d!yz|41&wwxUd4mT7tu8shyHcgyi!*< zO^+oOG|3X0);=71W>X}R%4QlIC=!p zlV({hy!2VQMRa__48zB53#CjdX9*^Pru}WSOxVlT;M&Ec1<*O&ET;8e=Y&~v6WgQP zNz2H+P3-13Jt&qWU_K6EV3X$;?5&;8)8=0EFdhp%`-S*9U>*B>j*Cfa8HmdCNFjbU zE@(?9Vb8|+6Ez;yE{Q$#C8S5Hb>W|B*C`YwZL5)?I^i?F4?a{J^^qRC-k&st>@K#F z{;UdTH^=+F3W+L)$MkNH*oZ`wO8PoSeIT6b!d#MuqKDQe?PbR+BIvP-IoC(+3SiWsOi%-_k2a0tK-kIao zEZ27fYi6hN*9J}Hus%q|AG!7!4#egG0ufKJYU-ESnmD6Pbczpq`@p3&Nv|*JKUH$! z-_-LRUh$fn0L^2MsKKU*S8K0;L~x5q?SUsZs7vg88?EMERqF1tAUGkba2QXq(cqns z(HWP^3iksz`vARd?xppPws%C_mIa1)Ta)>YJFe%qiLz8We45+AdwTL`2I zOhf|xI=mX6IF}&MH!bJ23FYNJ)NR-0>#ONw@!?@;T^ih7kzDpI|OE+*od+WTw}RCz97cGsa(&J2&`5JqMV_;E*0b zM=0E(il9j8id>c&XRQ?O*PY}ENU8M%v;V`(;pe&Ip&}Mszymf<;lF9?uLjk?K|NOe zWpwAOJ!Mfr69GMe45iXqCWnMKaBg+-s4dEk@FJZ&2+D!0^?yzz1d}NQQN{33ztNcD zJmT$*)fM_~a=m^QB_^eZ33kGhsq%Ln3NSuu`#dBC)K}rw`cvNLmtFnJ?0zHl@}-Bf z*0KG!4(W=_X+MwAfX}w?%<;@e zyhSa_!C-e0E9~tn=U+Cb?yyn5rnv#Ttbcgju9l1D*NF&41U2XvKTx-%EecE}LZNDk zYO>Uc&kV(yEVX)da?uXCc%W)9Aa?$VY0d!WE$$p1mPjAF?=r`l%nu`5Bq@w#`SsV# zM@i3jCu6T@H3re+KW_h@A6%r$?ez%Dp{YG+o{GXSSM3X63$8RiCf zy_;u}xJ#=@6O5J??Bn?^8NWXGA|w#+9JkcpBPbtH52U;6oHm?})-)`=$l0kaBfD@vu(y`_oXwEv0rNLYizqVTm5{Xs&W3~25 zbQsJ{WS5)Pk7s3O=edFtfAhFvS)&v11>#Sp7Xbths@8dWpMQBB1xy7DaOXI)NH$yS zv#{v^pc)HfJ2|LU9c&sL>0OWWFZbuwvG@Q$5h3K@G@vw1EiUFa?9LMp2V$^pFqp*^ zOe@-_@8_1>wVoWOdr7Sz2iPiZFy~-u?;z`66CH9SQk`IjS6uDG1C&+i8sF;$^0j@x zn4{0*(#IDI$sFs4=~R#^rb{51hhOY;G!4!deGf7J1_UlCK-${4$rzdU>5gS5C9bumM>%QBf zSSA_zJ-6MzdKb)lrbQ>yw2sz?b-q1FX&!#-fE9_xa(>Jkv~n?qEWA`CnU@Ek!jn& zEMW$44N=pJ#YpsJY7qRA6(Jyi>xB8g^ZoRh!TNlG6S5dQIUJAqd824X2#o2f3!?d? zY_bHV))0#pNfoDkw(|!v7Xb2QOiQAm!7q=F7;xD z<8yw@`3>)-fyPzDH$SV3RDnmvsxs5MxM-xC*jpVESqbDshD*C2y6)HyaxEI{71E=- zhpmjZzx}E9`1zm*CXd=SwYiuH4Svfkx+kRI>(q|twrazJ$cxwSSu?&RFor*ipIt71 zjlAf1;uH-AVy5vAs66g1s}7=v;kbuyAl>34LonDFLrB#b7xb193T>t=pvP}vy+Fn; zF888;H1Vz<5zBd)pX)ST^6|yg;7d#S&vOs0zARhF)YRQ_2-=!PC#7jP^UD2VHHO3U zpLXTZ;KvD33pG5KK=r9dN(Y~|-pr4O&x-n*KP%-bnA8E~4<@afOEq9$ehtV}*WEbh z0Q@zRvy_u9i6B7?*kgYM5n=y~8>gu&v?V{Jlv$5@(T2rb$L3FBEQ7oBec)@G$&>Zx?m7cr8OAoISUf!7%d?HgQUKbdZ*@I?fFaLs+0JkYFh)b`7)cW(r%I}DeIRLNld>4wG zg@Qcghm0SWNq~vAaOakNln@h5pbQ9aJlB&Bsl_TqxwnGa$p3yQN>#3;fryn=IJ@WV zlYyKGiq;Bf(nI_eNKtH0ZP86LEi=GNG?5|!Fn>d^`^5+L$}@V)r(P^d!E&MD%R_+) z=eubNgGH}yWNF$SLF$HUJCkSj1t~6wVBA7qvOFpuA!&3d6tqTCZGj`$geK(50Fy4t zaA?j4Qp(<2@@QXA1SMouFoMyjRQS)z4?0+NL$hJ@*JAlcPg#c&N-F+JsXpMg9Fk~7q?3_EVUn}*YP!Ef*uHTSS3IaM6+P z+>kELB4sBAe!>X1S}*p>!xr=Y^mw<8dA<&_JOl;o>5GMv$3R*aGsyL0$DDm78p68v^NVRm6`R$ zYC^=Av=B%OOaXN&(c#}GCtOC8*UDed(){{P%`bs^kOx>xU!U7wzow|8b|n{OY$7d!Z4lHG_J4#Y~Ys|zo+vm6pSAYH@AjPeLOO^HjzkU`StKs(Wn}!;6Bvx^>Ep1WQ{5c2k;PR>9OSKj##ZYtQDnLT z<_d?^*pFHr-apR7omms#VvfdV2m$yMBsLeUG4cWO3IJsE|89sZY@A;*s>;hV zzI1iAvURWofnHB$>RIdSZBWS|W{>35Ljw}jopo;!GwRAk1l){e=Vl_IPzz=HIB`p- zg;G)R(%tS4p%9jDK@`N5FPPjgECe8=zqB+Db2CvBh~V`Q z88N6?Grd`mHUvk$DVO?$ARvgK***5YI&r{F&;##ixqQ$AC4zv=6m~t(hfAPmy%y$6 zphtY5XB^PgAy7ajGS!CwWSYQqi{L{ni1CJHr~=4F3iJj3I9w5ABnY}`rQR+98s`HE zsv26UfWFp%n)@lpDnP_nK!Q4maEG(}Gu)Hx`O+?y8>Akaa*bIUL%@x=g}zy-J`ZWoME z{=fzbuu_e40fC+>u=4Bws04QrgFp%&-f(|?c=xE~Hg7W_ZOi597BciRu^>6t_EtFx zInoyaw64#%zPy#=eAoAtj{BLw@B=!LW*wV%@h`9Ow;FuECi9Z~^f_@>3unU{l1mS} ziElh-nhYf{4>w|oCZX*qS|kp3*8GbQsHG8y&iKz zfWjwKzFnO4dYHTrNA3Fys^z)*gVzU@2Ay8G=Jcdi_}}>)cs+nc4viRMP!B0GDYa2!KXCcnZl3yl%g>vawQ+D zb<1=@3U7$KN|Wddq*7JSE6GV5qOqa2LD-h9yVp_9B+_do|1uox-B4anUcY$cdFAT6 zTY+7n)|_|JZxh|NzT1sC9)^p zHOwm(4zfvUwVZEgylHsIcgU^|dw)F1mSr@v_VT_7Uk~p36bxN`gv{rn zj}r32YQlzzzbdJ}px1*8R3nlh5drTm}m^X`7E zSMY>673`#BH9ZZ;(r_-A^=e!@rS%iQ=wlpD3yzhq7!g)pVI`cp(tlgJL)67tnogi= zYF|g*tnGn(-t)xg$qPZTwFAhG4S70V|1#yiywPQfM; z#(72tCT5jNC7C5`qxB{A1(XG~TJc)NS)6PiN+l5nQ zJ7PPwJ0a8AKSi>+vW$h@ezkSW&+DuVfXT8G1?}g)_-o5+zp<`bV-c_rh&3!3`&yId z`5Ezims<8j)-`)cc1c=%R%q53@>9IIrn{zByUjTZ56`dE*8^1p#aX))&Lx zJbYt%;SA~R%LI!COHNsyR7`9?jQmjh@Ychaw^vCwwUJHKY zzdrhl==tjNh&KN#9Kj*MhVQ`9FGG!J2JR(`dJas>yUi(_DkLe)rd!|BmMG&>6Xllu z%x@<>DPAX12kzvzGX6PYlxd{upiV2n&s{3!Z}@}W)<=r()l^|8P8 zD7b*Ci2pjTWYPnTP_6q3dk-nN3#lU64sLj|MU#59(zRMM3k--2gpSKU;ilI*P~q0} zj{6V#ZWENGL2cx5qjAY}zz_{4=E^?olG~=tSH?3E# zJbJ%a23KG^oFZxj=o5*0>?_}YxopfwS}m8qu5ZFQ#!XaVZE0u)>kIoKkyM<;)3^Pz z^2gMB@r>PU-1ha>>kDz!dGFK>`RI&R8^72|R7kscO_46$y3F(LG2s{K@8Q+ljw9N| z+lI-d{*CP3n)Yv=w)}Y8Qbl0DMP@*{6707%J+^J8Z6shkSM~h#UFKccTVdg)H>aqR zZ$Za7r(dt!4RQVfOPx;mR#e((E$MUeYVtLws}qyouFgIFwtak} zI3n?k8>W>>LL4{UH>I)hL)u;S z8TDzUwNLD8cf1>`e5?=~ceBL%XO0@Z_Nj2ABUutMGmVGd&WH}g@f_8Rzbgl(zqfwE zlVhi(LAwER^kDnpg#1j%2-p-mJ-#~)wQKhLa5ylnj35jSgkximW60$%$E3#ezPtKv zE9<_jgv27)6|;dZkcYp3vu9CbbFjUo)Kmig$dRqF{(+Q%kI4tg@i0fZr_nsa-KHF~boc5&K{WM3ez3j^f<;2;b%8&Ja6`aN2iI2x!x|ni^wh-o< z0^&_Z3l&{W5XhSi1PTZQflxT$a{~l=B?tm-J_CUyQ$QeU=Qv1*5(pITrmFBz|MleW zM(E2Mh)f*rsRhR*6~8WAWKz2iVbt}LiQ3cX>JB48_T7lVC+#RJ!HIxOeFLQI}ojgi&LzRSFbVOV`JIJ464-LOFS*=DY-6X z#^y23Cgu;t35toC7!zV98Q@(%ect_+vbSY8^Tz$!@qzR{QX>Ig0t6By7kza8mjDvR z^Uvl>6z8AME&zcI@JEo~()ni!=)(D@28aOv`9QR2WH8yKMv`HbuAg3rOs?vcz;6TvcX^rAd7+dnG#xs-sb$M1^#zCEtr)g|gom3>kQhRxer@o)TY#bBW-h zJ}KVU$nVxi`=YbjQSD`Y%hXs3sM5)rgRPS%@!M>+7skJR5AK$~{z(p9-4DT*HS8NY zeZCG&82n7#>uTTk=ym8*?cD_yeX_Z->5kdvxvcvPrmy$ng|@LCPVvMR}oaPxA(7Q?p^$JkGS!*awH?y$WOq;LgT*Zw*BA~xgn8K(+g6%`>ia+@3j z@meaI&P&@b2)ps?P@lX{xvMmq@{{(XVJ$3gE8)W3M)>h+3Buv<5*cdC|Aq6c_Z+5) z>(f~`>$84(K0=yaf3zsO4{eeM^M1nP^FPu0Wu9h5Dd(lMt+gCL2<4oUp zm(>S=OM7Br{^{1KJ(#pvhDGf;>`imyFZ9?eJLh)9P`G~onGO450vJQ`VI~bmP;s2G zFqY5fjpmVPHJ)fV9`*Kl2+iQbVX2B|_WT#f_pM(*ALlI3&2_e9w_rZvc%0D&$A`VN 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 IWc0oMALp5-#{d8T literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/FilterShowcase/squares.png b/examples/FilterShowcase/FilterShowcase/squares.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1a4899a15d871026ccbcca40e9415753adedfa GIT binary patch literal 5689 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 literal 0 HcmV?d00001 diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 898acfba6..9b37e7d53 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -202,8 +202,14 @@ BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; - F2D6D0171564D44500A1289F /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */; }; - F2D6D0181564D44500A1289F /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */; }; + F2D6D0341564E4FD00A1289F /* GPUImageJFAVoroniFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2D6D02E1564E4FD00A1289F /* GPUImageJFAVoroniFilter.h */; }; + F2D6D0351564E4FD00A1289F /* GPUImageJFAVoroniFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6D02F1564E4FD00A1289F /* GPUImageJFAVoroniFilter.m */; }; + F2D6D0361564E4FD00A1289F /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2D6D0301564E4FD00A1289F /* GPUImagePerlinNoiseFilter.h */; }; + F2D6D0371564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6D0311564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m */; }; + F2D6D0381564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2D6D0321564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h */; }; + F2D6D0391564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6D0331564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m */; }; + F2F3362315658F3D00B0FBB8 /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2F3362115658F3D00B0FBB8 /* GPUImageMosaicFilter.h */; }; + F2F3362415658F3D00B0FBB8 /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2F3362215658F3D00B0FBB8 /* GPUImageMosaicFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -401,8 +407,14 @@ BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; - F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPUImagePerlinNoiseFilter.h; sourceTree = SOURCE_ROOT; }; - F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; + F2D6D02E1564E4FD00A1289F /* GPUImageJFAVoroniFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageJFAVoroniFilter.h; path = Source/GPUImageJFAVoroniFilter.h; sourceTree = SOURCE_ROOT; }; + F2D6D02F1564E4FD00A1289F /* GPUImageJFAVoroniFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageJFAVoroniFilter.m; path = Source/GPUImageJFAVoroniFilter.m; sourceTree = SOURCE_ROOT; }; + F2D6D0301564E4FD00A1289F /* GPUImagePerlinNoiseFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePerlinNoiseFilter.h; path = Source/GPUImagePerlinNoiseFilter.h; sourceTree = SOURCE_ROOT; }; + F2D6D0311564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePerlinNoiseFilter.m; path = Source/GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; + F2D6D0321564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVoroniConsumerFilter.h; path = Source/GPUImageVoroniConsumerFilter.h; sourceTree = SOURCE_ROOT; }; + F2D6D0331564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVoroniConsumerFilter.m; path = Source/GPUImageVoroniConsumerFilter.m; sourceTree = SOURCE_ROOT; }; + F2F3362115658F3D00B0FBB8 /* GPUImageMosaicFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPUImageMosaicFilter.h; sourceTree = SOURCE_ROOT; }; + F2F3362215658F3D00B0FBB8 /* GPUImageMosaicFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPUImageMosaicFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -519,8 +531,14 @@ BC1B715F14F4B06600ACA2AB /* Effects */ = { isa = PBXGroup; children = ( - F2D6D0151564D44500A1289F /* GPUImagePerlinNoiseFilter.h */, - F2D6D0161564D44500A1289F /* GPUImagePerlinNoiseFilter.m */, + F2F3362115658F3D00B0FBB8 /* GPUImageMosaicFilter.h */, + F2F3362215658F3D00B0FBB8 /* GPUImageMosaicFilter.m */, + F2D6D02E1564E4FD00A1289F /* GPUImageJFAVoroniFilter.h */, + F2D6D02F1564E4FD00A1289F /* GPUImageJFAVoroniFilter.m */, + F2D6D0301564E4FD00A1289F /* GPUImagePerlinNoiseFilter.h */, + F2D6D0311564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m */, + F2D6D0321564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h */, + F2D6D0331564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m */, BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */, BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */, BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */, @@ -829,7 +847,10 @@ BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */, BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */, BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */, - F2D6D0171564D44500A1289F /* GPUImagePerlinNoiseFilter.h in Headers */, + F2D6D0341564E4FD00A1289F /* GPUImageJFAVoroniFilter.h in Headers */, + F2D6D0361564E4FD00A1289F /* GPUImagePerlinNoiseFilter.h in Headers */, + F2D6D0381564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h in Headers */, + F2F3362315658F3D00B0FBB8 /* GPUImageMosaicFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1029,7 +1050,10 @@ BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */, BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */, BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */, - F2D6D0181564D44500A1289F /* GPUImagePerlinNoiseFilter.m in Sources */, + F2D6D0351564E4FD00A1289F /* GPUImageJFAVoroniFilter.m in Sources */, + F2D6D0371564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m in Sources */, + F2D6D0391564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m in Sources */, + F2F3362415658F3D00B0FBB8 /* GPUImageMosaicFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/GPUImageJFAVoroniFilter.h b/framework/GPUImageJFAVoroniFilter.h new file mode 100644 index 000000000..17d934bb6 --- /dev/null +++ b/framework/GPUImageJFAVoroniFilter.h @@ -0,0 +1,19 @@ +// +// GPUImageJFAVoroni.h +// Face Esplode +// +// Created by Jacob Gundersen on 4/27/12. +// The shaders are mostly taken from UnitZeroOne's WebGL example here: +// http://unitzeroone.com/blog/2011/03/22/jump-flood-voronoi-for-webgl/ + +#import "GPUImageFilter.h" + +@interface GPUImageJFAVoroni : GPUImageFilter { + GLuint secondFilterOutputTexture; + GLuint secondFilterFramebuffer; + GLint sampleStepUniform; +} + +@property (nonatomic, assign) NSUInteger numPasses; + +@end diff --git a/framework/GPUImageJFAVoroniFilter.m b/framework/GPUImageJFAVoroniFilter.m new file mode 100644 index 000000000..3be661182 --- /dev/null +++ b/framework/GPUImageJFAVoroniFilter.m @@ -0,0 +1,338 @@ +// +// GPUImageJFAVoroni.m +// Face Esplode +// +// Created by Jacob Gundersen on 4/27/12. +// +// adapted from unitzeroone - http://unitzeroone.com/labs/jfavoronoi/ + +#import "GPUImageJFAVoroni.h" +#import "GPUImage3x3TextureSamplingFilter.h" + +NSString *const kGPUImageJFAVoroniFragmentShaderString = SHADER_STRING +( + + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + //varying vec2 textureCoordinate; + //uniform float sampleStep; + + vec2 getCoordFromColor(vec4 color, vec2 size) +{ + float z = color.z * 256.0; + float yoff = floor(z / 8.0); + float xoff = mod(z, 8.0); + float x = color.x*256.0 + xoff*256.0; + float y = color.y*256.0 + yoff*256.0; + return vec2(x,y) / size; +} + + void main(void) { + + vec2 sub; + vec4 dst; + vec4 local = texture2D(inputImageTexture, textureCoordinate); + vec4 sam; + float l; + float smallestDist; + if(local.a == 0.0){ + + smallestDist = dot(1.0,1.0); + }else{ + sub = getCoordFromColor(local)-textureCoordinate; + smallestDist = dot(sub,sub); + } + dst = local; + + + sam = texture2D(inputImageTexture, topRightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, topTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, topLeftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomRightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomLeftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, leftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, rightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-uvIn); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + gl_FragColor = dst; + } + ); + +@implementation GPUImageJFAVoroni + +@synthesize numPasses; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageJFAVoroniFragmentShaderString])) + { + + NSLog(@"nil returned"); + return nil; + + } + + sampleStepUniform = [filterProgram uniformIndex:@"sampleStep"]; + NSLog(@"setup filter"); + return self; +} + +#pragma mark - +#pragma mark Managing the display FBOs + + +- (void)initializeOutputTexture; +{ + [super initializeOutputTexture]; + + glGenTextures(1, &secondFilterOutputTexture); + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); +} + +- (void)createFilterFBOofSize:(CGSize)currentFBOSize; +{ + NSLog(@"log %f", log2(256)); + numPasses = (int)log2(currentFBOSize.width); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } + + glGenFramebuffers(1, &secondFilterFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d"); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); + } + + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + } + else + { + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + } + NSLog(@"doe here"); + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + + glBindTexture(GL_TEXTURE_2D, 0); +} + + + //we may not need these +- (void)setSecondFilterFBO; +{ + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + // + // CGSize currentFBOSize = [self sizeOfFBO]; + // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); +} + +- (void)setOutputFBO; +{ + if (numPasses % 2 == 1) { + [self setSecondFilterFBO]; + } else { + [self setFilterFBO]; + } + +} + + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + // Run the first stage of the two-pass filter + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(sampleStepUniform, 0.5); + + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + + for (int pass = 1; pass <= numPasses + 1; pass++) { + //NSLog(@"pass %d", pass); + if (pass % 2 == 0) { + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + float step = pow(2.0, numPasses - pass) / self.sizeOfFBO.width; + glUniform1f(sampleStepUniform, step); + + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:secondFilterOutputTexture]; + } else { + // Run the second stage of the two-pass filter + [self setSecondFilterFBO]; + + [filterProgram use]; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, outputTexture); + + glUniform1i(filterInputTextureUniform, 3); + + float step = pow(2.0, numPasses - pass) / self.sizeOfFBO.width; + glUniform1f(sampleStepUniform, step); + + if (filterSourceTexture2 != 0) + { + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + + glUniform1i(filterInputTextureUniform2, 4); + } + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + } +} + + + +@end diff --git a/framework/GPUImageMosaicFilter.h b/framework/GPUImageMosaicFilter.h new file mode 100644 index 000000000..aa7a72fb9 --- /dev/null +++ b/framework/GPUImageMosaicFilter.h @@ -0,0 +1,30 @@ +// +// GPUImageMosaicFilter.h + +// This filter takes an input tileset, the tiles must ascend in luminance +// It looks at the input image and replaces each display tile with an input tile +// according to the luminance of that tile. The idea was to replicate the ASCII +// video filters seen in other apps, but the tileset can be anything. + +// This needs a little more work, it's rotating the input tileset and there are some artifacts (I think from GL_LINEAR interpolation), but it's working + +#import "GPUImageTwoInputFilter.h" +#import "GPUImagePicture.h" + +@interface GPUImageMosaicFilter : GPUImageTwoInputFilter { + GLint inputTileSizeUniform, numTilesUniform, displayTileSizeUniform, colorOnUniform; + GPUImagePicture *pic; +} + +@property(readwrite, nonatomic) CGSize inputTileSize; +@property(readwrite, nonatomic) float numTiles; +@property(readwrite, nonatomic) CGSize displayTileSize; +@property(readwrite, nonatomic) BOOL colorOn; + +-(void)setNumTiles:(float)numTiles; +-(void)setDisplayTileSize:(CGSize)displayTileSize; +-(void)setInputTileSize:(CGSize)inputTileSize; +-(void)setTileSet:(NSString *)tileSet; +-(void)setColorOn:(BOOL)yes; + +@end diff --git a/framework/GPUImageMosaicFilter.m b/framework/GPUImageMosaicFilter.m new file mode 100644 index 000000000..3101a3cf2 --- /dev/null +++ b/framework/GPUImageMosaicFilter.m @@ -0,0 +1,148 @@ +// +// GPUImageMosaicFilter.m + + +#import "GPUImageMosaicFilter.h" +#import "GPUImagePicture.h" + +NSString *const kGPUImageMosaicFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform vec2 inputTileSize; + uniform vec2 displayTileSize; + uniform float numTiles; + uniform int colorOn; + + void main() + { + vec2 xy = textureCoordinate; + xy = xy - mod(xy, displayTileSize); + + vec4 lumcoeff = vec4(0.299,0.587,0.114,0.0); + + vec4 inputColor = texture2D(inputImageTexture2, xy); + float lum = dot(inputColor,lumcoeff); + lum = 1.0 - lum; + + float stepsize = 1.0 / numTiles; + float lumStep = (lum - mod(lum, stepsize)) / stepsize; + + float rowStep = 1.0 / inputTileSize.x; + float x = mod(lumStep, rowStep); + float y = floor(lumStep / rowStep); + + vec2 startCoord = vec2(float(x) * inputTileSize.x, float(y) * inputTileSize.y); + vec2 finalCoord = startCoord + ((textureCoordinate - xy) * (inputTileSize / displayTileSize)); + + vec4 color = texture2D(inputImageTexture, finalCoord); + if (colorOn == 1) { + color = color * inputColor; + } + gl_FragColor = color; + + } + ); + +@implementation GPUImageMosaicFilter + +@synthesize inputTileSize = _inputTileSize, numTiles = _numTiles, displayTileSize = _displayTileSize, colorOn = _colorOn; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageMosaicFragmentShaderString])) + { + return nil; + } + + inputTileSizeUniform = [filterProgram uniformIndex:@"inputTileSize"]; + displayTileSizeUniform = [filterProgram uniformIndex:@"displayTileSize"]; + numTilesUniform = [filterProgram uniformIndex:@"numTiles"]; + colorOnUniform = [filterProgram uniformIndex:@"colorOn"]; + + CGSize its = CGSizeMake(0.125, 0.125); + CGSize dts = CGSizeMake(0.025, 0.025); + [self setDisplayTileSize:dts]; + [self setInputTileSize:its]; + [self setNumTiles:64.0]; + [self setColorOn:YES]; + //[self setTileSet:@"squares.png"]; + return self; +} + +-(void)setColorOn:(BOOL)yes { + glUniform1i(colorOnUniform, yes); +} + +-(void)setNumTiles:(float)numTiles { + + _numTiles = numTiles; + [self setFloat:_numTiles forUniform:@"numTiles"]; +} + +-(void)setInputTileSize:(CGSize)inputTileSize { + if (inputTileSize.width > 1.0) { + _inputTileSize.width = 1.0; + } + if (inputTileSize.height > 1.0) { + _inputTileSize.height = 1.0; + } + if (inputTileSize.width < 0.0) { + _inputTileSize.width = 0.0; + } + if (inputTileSize.height < 0.0) { + _inputTileSize.height = 0.0; + } + + + _inputTileSize = inputTileSize; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + GLfloat inputTS[2]; + inputTS[0] = _inputTileSize.width; + inputTS[1] = _inputTileSize.height; + glUniform2fv(inputTileSizeUniform, 1, inputTS); +} + +-(void)setDisplayTileSize:(CGSize)displayTileSize { + if (displayTileSize.width > 1.0) { + _displayTileSize.width = 1.0; + } + if (displayTileSize.height > 1.0) { + _displayTileSize.height = 1.0; + } + if (displayTileSize.width < 0.0) { + _displayTileSize.width = 0.0; + } + if (displayTileSize.height < 0.0) { + _displayTileSize.height = 0.0; + } + + + _displayTileSize = displayTileSize; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + GLfloat displayTS[2]; + displayTS[0] = _displayTileSize.width; + displayTS[1] = _displayTileSize.height; + glUniform2fv(displayTileSizeUniform, 1, displayTS); +} + + + +-(void)setTileSet:(NSString *)tileSet { + + UIImage *img = [UIImage imageNamed:tileSet]; + pic = [[GPUImagePicture alloc] initWithImage:img smoothlyScaleOutput:YES]; + [pic addTarget:self]; + [pic processImage]; +} + +@end diff --git a/framework/GPUImageVoroniConsumerFilter.h b/framework/GPUImageVoroniConsumerFilter.h new file mode 100644 index 000000000..c32b0e19a --- /dev/null +++ b/framework/GPUImageVoroniConsumerFilter.h @@ -0,0 +1,13 @@ +// +// GPUVoroniConsumerFilter.h +// Face Esplode +// +// Created by Jacob Gundersen on 4/28/12. +// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. +// + +#import "GPUImageFilter.h" + +@interface GPUImageVoroniConsumerFilter : GPUImageFilter + +@end diff --git a/framework/GPUImageVoroniConsumerFilter.m b/framework/GPUImageVoroniConsumerFilter.m new file mode 100644 index 000000000..18739afc4 --- /dev/null +++ b/framework/GPUImageVoroniConsumerFilter.m @@ -0,0 +1,55 @@ +// +// GPUVoroniConsumerFilter.m +// Face Esplode +// +// Created by Jacob Gundersen on 4/28/12. +// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. +// + +#import "GPUImageVoroniConsumerFilter.h" + +NSString *const kGPUImageVoroniConsumerFragmentShaderString = SHADER_STRING +( + + precision highp float; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + varying vec2 textureCoordinate; + + vec2 getCoordFromColor(vec4 color, vec2 size) +{ + float z = color.z * 256.0; + float yoff = floor(z / 8.0); + float xoff = mod(z, 8.0); + float x = color.x*256.0 + xoff*256.0; + float y = color.y*256.0 + yoff*256.0; + return vec2(x,y) / size; +} + + void main(void) { + vec4 colorLoc = texture2D(inputImageTexture2, textureCoordinate); + vec4 color = texture2D(inputImageTexture, getCoordFromColor(colorLoc)); + gl_FragColor = color; + } + + + ); + +@implementation GPUImageVoroniConsumerFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageVoroniConsumerFragmentShaderString])) + { + return nil; + } + + return self; +} + +-(CGSize)sizeOfFBO { + return CGSizeMake(256, 256); +} + +@end diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index b634039aa..f245c59c8 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -67,6 +67,9 @@ #import "GPUImagePolarPixellateFilter.h" #import "GPUImageStretchDistortionFilter.h" #import "GPUImagePerlinNoiseFilter.h" +#import "GPUImageJFAVoroniFilter.h" +#import "GPUImageVoroniConsumerFilter.h" +#import "GPUImageMosaicFilter.h" #import "GPUImageTiltShiftFilter.h" #import "GPUImage3x3ConvolutionFilter.h" #import "GPUImageEmbossFilter.h" diff --git a/framework/Source/GPUImageJFAVoroniFilter.h b/framework/Source/GPUImageJFAVoroniFilter.h new file mode 100644 index 000000000..c51fcf266 --- /dev/null +++ b/framework/Source/GPUImageJFAVoroniFilter.h @@ -0,0 +1,20 @@ +// +// GPUImageJFAVoroni.h + +// The shaders are mostly taken from UnitZeroOne's WebGL example here: +// http://unitzeroone.com/blog/2011/03/22/jump-flood-voronoi-for-webgl/ + +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageJFAVoroniFilter : GPUImageTwoInputFilter { + GLuint secondFilterOutputTexture; + GLuint secondFilterFramebuffer; + GLint sampleStepUniform; + GLint sizeUniform; + NSUInteger numPasses; + +} + +@property (nonatomic, readwrite) CGSize sizeInPixels; + +@end diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m new file mode 100644 index 000000000..b33dc09b2 --- /dev/null +++ b/framework/Source/GPUImageJFAVoroniFilter.m @@ -0,0 +1,450 @@ +// +// GPUImageJFAVoroni.m +// +// adapted from unitzeroone - http://unitzeroone.com/labs/jfavoronoi/ + +#import "GPUImageJFAVoroniFilter.h" + +NSString *const kGPUImageJFAVoroniVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + uniform highp float sampleStep; + + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 widthStep = vec2(sampleStep, 0.0); + vec2 heightStep = vec2(0.0, sampleStep); + vec2 widthHeightStep = vec2(sampleStep); + vec2 widthNegativeHeightStep = vec2(sampleStep, -sampleStep); + + textureCoordinate = inputTextureCoordinate.xy; + leftTextureCoordinate = inputTextureCoordinate.xy - widthStep; + rightTextureCoordinate = inputTextureCoordinate.xy + widthStep; + + topTextureCoordinate = inputTextureCoordinate.xy - heightStep; + topLeftTextureCoordinate = inputTextureCoordinate.xy - widthHeightStep; + topRightTextureCoordinate = inputTextureCoordinate.xy + widthNegativeHeightStep; + + bottomTextureCoordinate = inputTextureCoordinate.xy + heightStep; + bottomLeftTextureCoordinate = inputTextureCoordinate.xy - widthNegativeHeightStep; + bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep; + } + ); + +NSString *const kGPUImageJFAVoroniFragmentShaderString = SHADER_STRING +( + + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + uniform vec2 size; + //varying vec2 textureCoordinate; + //uniform float sampleStep; + + vec2 getCoordFromColor(vec4 color) +{ + float z = color.z * 256.0; + float yoff = floor(z / 8.0); + float xoff = mod(z, 8.0); + float x = color.x*256.0 + xoff*256.0; + float y = color.y*256.0 + yoff*256.0; + return vec2(x,y) / size; +} + + void main(void) { + + vec2 sub; + vec4 dst; + vec4 local = texture2D(inputImageTexture, textureCoordinate); + vec4 sam; + float l; + float smallestDist; + if(local.a == 0.0){ + + smallestDist = dot(1.0,1.0); + }else{ + sub = getCoordFromColor(local)-textureCoordinate; + smallestDist = dot(sub,sub); + } + dst = local; + + + sam = texture2D(inputImageTexture, topRightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, topTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, topLeftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomRightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomLeftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, leftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, rightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + gl_FragColor = dst; + } + ); + +@implementation GPUImageJFAVoroniFilter + +@synthesize sizeInPixels = _sizeInPixels; + +- (id)init; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageJFAVoroniVertexShaderString fragmentShaderFromString:kGPUImageJFAVoroniFragmentShaderString])) + { + + NSLog(@"nil returned"); + return nil; + + } + + sampleStepUniform = [filterProgram uniformIndex:@"sampleStep"]; + sizeUniform = [filterProgram uniformIndex:@"size"]; + + return self; +} + +-(void)setSizeInPixels:(CGSize)sizeInPixels { + _sizeInPixels = sizeInPixels; + + //validate that it's a power of 2 + + float width = log2(sizeInPixels.width); + float height = log2(sizeInPixels.height); + + if (width != height) { + NSLog(@"Voroni point texture must be square"); + return; + } + if (width != floor(width) || height != floor(height)) { + NSLog(@"Voroni point texture must be a power of 2. Texture size: %f, %f", sizeInPixels.width, sizeInPixels.height); + return; + } + glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); +} + +#pragma mark - +#pragma mark Managing the display FBOs + + +- (void)initializeOutputTexture; +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + + glGenTextures(1, &secondFilterOutputTexture); + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); +} + +-(NSUInteger)nextPowerOfTwo:(CGPoint)input { + NSUInteger val; + if (input.x > input.y) { + val = (NSUInteger)input.x; + } else { + val = (NSUInteger)input.y; + } + + val--; + val = (val >> 1) | val; + val = (val >> 2) | val; + val = (val >> 4) | val; + val = (val >> 8) | val; + val = (val >> 16) | val; + val++; + return val; +} + +- (void)createFilterFBOofSize:(CGSize)currentFBOSize +{ + + numPasses = (int)log2([self nextPowerOfTwo:CGPointMake(currentFBOSize.width, currentFBOSize.height)]); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + + } + + glGenFramebuffers(1, &secondFilterFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d"); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); + } + + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + } + else + { + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + } + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + + glBindTexture(GL_TEXTURE_2D, 0); +} + + + //we may not need these +- (void)setSecondFilterFBO; +{ + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + // + // CGSize currentFBOSize = [self sizeOfFBO]; + // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); +} + +- (void)setOutputFBO; +{ + if (numPasses % 2 == 1) { + [self setSecondFilterFBO]; + } else { + [self setFilterFBO]; + } + +} + + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + // Run the first stage of the two-pass filter + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(sampleStepUniform, 0.5); + + glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); + + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + + for (int pass = 1; pass <= numPasses + 1; pass++) { + + if (pass % 2 == 0) { + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + float step = pow(2.0, numPasses - pass) / pow(2.0, numPasses); + glUniform1f(sampleStepUniform, step); + glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); + + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:secondFilterOutputTexture]; + } else { + // Run the second stage of the two-pass filter + [self setSecondFilterFBO]; + + [filterProgram use]; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, outputTexture); + + glUniform1i(filterInputTextureUniform, 3); + + float step = pow(2.0, numPasses - pass) / pow(2.0, numPasses); + glUniform1f(sampleStepUniform, step); + glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); + + if (filterSourceTexture2 != 0) + { + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + + glUniform1i(filterInputTextureUniform2, 4); + } + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + } +} + +/* +- (CGSize)maximumOutputSize; +{ + // I'm temporarily disabling adjustments for smaller output sizes until I figure out how to make this work better + + + if (CGSizeEqualToSize(cachedMaximumOutputSize, CGSizeZero)) + { + for (id currentTarget in targets) + { + if ([currentTarget maximumOutputSize].width > cachedMaximumOutputSize.width) + { + cachedMaximumOutputSize = [currentTarget maximumOutputSize]; + } + } + } + + return cachedMaximumOutputSize; + +}*/ + +@end diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoroniConsumerFilter.h new file mode 100644 index 000000000..aad4890a4 --- /dev/null +++ b/framework/Source/GPUImageVoroniConsumerFilter.h @@ -0,0 +1,13 @@ +// +// GPUVoroniConsumerFilter.h +// + +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageVoroniConsumerFilter : GPUImageTwoInputFilter { + GLint sizeUniform; +} + +@property (nonatomic, readwrite) CGSize sizeInPixels; + +@end diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoroniConsumerFilter.m new file mode 100644 index 000000000..1a377c37e --- /dev/null +++ b/framework/Source/GPUImageVoroniConsumerFilter.m @@ -0,0 +1,71 @@ +// +// GPUVoroniConsumerFilter.m +// + +#import "GPUImageVoroniConsumerFilter.h" + +NSString *const kGPUImageVoroniConsumerFragmentShaderString = SHADER_STRING +( + + precision highp float; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + uniform vec2 size; + varying vec2 textureCoordinate; + + vec2 getCoordFromColor(vec4 color) +{ + float z = color.z * 256.0; + float yoff = floor(z / 8.0); + float xoff = mod(z, 8.0); + float x = color.x*256.0 + xoff*256.0; + float y = color.y*256.0 + yoff*256.0; + return vec2(x,y) / size; +} + + void main(void) { + vec4 colorLoc = texture2D(inputImageTexture2, textureCoordinate); + vec4 color = texture2D(inputImageTexture, getCoordFromColor(colorLoc)); + gl_FragColor = color; + } + + + ); + +@implementation GPUImageVoroniConsumerFilter + +@synthesize sizeInPixels = _sizeInPixels; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageVoroniConsumerFragmentShaderString])) + { + return nil; + } + + sizeUniform = [filterProgram uniformIndex:@"size"]; + + return self; +} + +-(void)setSizeInPixels:(CGSize)sizeInPixels { + _sizeInPixels = sizeInPixels; + + //validate that it's a power of 2 and square + + float width = log2(sizeInPixels.width); + float height = log2(sizeInPixels.height); + + if (width != height) { + NSLog(@"Voroni point texture must be square"); + return; + } + if (width != floor(width) || height != floor(height)) { + NSLog(@"Voroni point texture must be a power of 2. Texture size %f, %f", sizeInPixels.width, sizeInPixels.height); + return; + } + glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); +} + +@end From 3dbd20a7a2f3d05d450e2dc08e7a2dae236486dd Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Thu, 17 May 2012 14:56:32 -0600 Subject: [PATCH 100/695] Moved some thing around --- framework/GPUImageJFAVoroniFilter.h | 19 - framework/GPUImageJFAVoroniFilter.m | 338 ------------------ framework/GPUImageVoroniConsumerFilter.h | 13 - framework/GPUImageVoroniConsumerFilter.m | 55 --- .../{ => Source}/GPUImagePerlinNoiseFilter.h | 0 .../{ => Source}/GPUImagePerlinNoiseFilter.m | 0 6 files changed, 425 deletions(-) delete mode 100644 framework/GPUImageJFAVoroniFilter.h delete mode 100644 framework/GPUImageJFAVoroniFilter.m delete mode 100644 framework/GPUImageVoroniConsumerFilter.h delete mode 100644 framework/GPUImageVoroniConsumerFilter.m rename framework/{ => Source}/GPUImagePerlinNoiseFilter.h (100%) rename framework/{ => Source}/GPUImagePerlinNoiseFilter.m (100%) diff --git a/framework/GPUImageJFAVoroniFilter.h b/framework/GPUImageJFAVoroniFilter.h deleted file mode 100644 index 17d934bb6..000000000 --- a/framework/GPUImageJFAVoroniFilter.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// GPUImageJFAVoroni.h -// Face Esplode -// -// Created by Jacob Gundersen on 4/27/12. -// The shaders are mostly taken from UnitZeroOne's WebGL example here: -// http://unitzeroone.com/blog/2011/03/22/jump-flood-voronoi-for-webgl/ - -#import "GPUImageFilter.h" - -@interface GPUImageJFAVoroni : GPUImageFilter { - GLuint secondFilterOutputTexture; - GLuint secondFilterFramebuffer; - GLint sampleStepUniform; -} - -@property (nonatomic, assign) NSUInteger numPasses; - -@end diff --git a/framework/GPUImageJFAVoroniFilter.m b/framework/GPUImageJFAVoroniFilter.m deleted file mode 100644 index 3be661182..000000000 --- a/framework/GPUImageJFAVoroniFilter.m +++ /dev/null @@ -1,338 +0,0 @@ -// -// GPUImageJFAVoroni.m -// Face Esplode -// -// Created by Jacob Gundersen on 4/27/12. -// -// adapted from unitzeroone - http://unitzeroone.com/labs/jfavoronoi/ - -#import "GPUImageJFAVoroni.h" -#import "GPUImage3x3TextureSamplingFilter.h" - -NSString *const kGPUImageJFAVoroniFragmentShaderString = SHADER_STRING -( - - precision highp float; - - varying vec2 textureCoordinate; - varying vec2 leftTextureCoordinate; - varying vec2 rightTextureCoordinate; - - varying vec2 topTextureCoordinate; - varying vec2 topLeftTextureCoordinate; - varying vec2 topRightTextureCoordinate; - - varying vec2 bottomTextureCoordinate; - varying vec2 bottomLeftTextureCoordinate; - varying vec2 bottomRightTextureCoordinate; - - uniform sampler2D inputImageTexture; - - //varying vec2 textureCoordinate; - //uniform float sampleStep; - - vec2 getCoordFromColor(vec4 color, vec2 size) -{ - float z = color.z * 256.0; - float yoff = floor(z / 8.0); - float xoff = mod(z, 8.0); - float x = color.x*256.0 + xoff*256.0; - float y = color.y*256.0 + yoff*256.0; - return vec2(x,y) / size; -} - - void main(void) { - - vec2 sub; - vec4 dst; - vec4 local = texture2D(inputImageTexture, textureCoordinate); - vec4 sam; - float l; - float smallestDist; - if(local.a == 0.0){ - - smallestDist = dot(1.0,1.0); - }else{ - sub = getCoordFromColor(local)-textureCoordinate; - smallestDist = dot(sub,sub); - } - dst = local; - - - sam = texture2D(inputImageTexture, topRightTextureCoordinate); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - - sam = texture2D(inputImageTexture, topTextureCoordinate); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - - sam = texture2D(inputImageTexture, topLeftTextureCoordinate); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - - sam = texture2D(inputImageTexture, bottomRightTextureCoordinate); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - - sam = texture2D(inputImageTexture, bottomTextureCoordinate); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - - sam = texture2D(inputImageTexture, bottomLeftTextureCoordinate); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - - sam = texture2D(inputImageTexture, leftTextureCoordinate); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - - sam = texture2D(inputImageTexture, rightTextureCoordinate); - if(sam.a == 1.0){ - sub = (getCoordFromColor(sam)-uvIn); - l = dot(sub,sub); - if(l < smallestDist){ - smallestDist = l; - dst = sam; - } - } - gl_FragColor = dst; - } - ); - -@implementation GPUImageJFAVoroni - -@synthesize numPasses; - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageJFAVoroniFragmentShaderString])) - { - - NSLog(@"nil returned"); - return nil; - - } - - sampleStepUniform = [filterProgram uniformIndex:@"sampleStep"]; - NSLog(@"setup filter"); - return self; -} - -#pragma mark - -#pragma mark Managing the display FBOs - - -- (void)initializeOutputTexture; -{ - [super initializeOutputTexture]; - - glGenTextures(1, &secondFilterOutputTexture); - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); -} - -- (void)createFilterFBOofSize:(CGSize)currentFBOSize; -{ - NSLog(@"log %f", log2(256)); - numPasses = (int)log2(currentFBOSize.width); - - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - } - - glGenFramebuffers(1, &secondFilterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) - { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d"); - } - - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - GL_RGBA, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, - 0, - &renderTexture); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); - } - - CFRelease(attrs); - CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); - } - else - { - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); - } - NSLog(@"doe here"); - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - - glBindTexture(GL_TEXTURE_2D, 0); -} - - - //we may not need these -- (void)setSecondFilterFBO; -{ - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - // - // CGSize currentFBOSize = [self sizeOfFBO]; - // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); -} - -- (void)setOutputFBO; -{ - if (numPasses % 2 == 1) { - [self setSecondFilterFBO]; - } else { - [self setFilterFBO]; - } - -} - - -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; -{ - // Run the first stage of the two-pass filter - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(sampleStepUniform, 0.5); - - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; - - for (int pass = 1; pass <= numPasses + 1; pass++) { - //NSLog(@"pass %d", pass); - if (pass % 2 == 0) { - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - - float step = pow(2.0, numPasses - pass) / self.sizeOfFBO.width; - glUniform1f(sampleStepUniform, step); - - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:secondFilterOutputTexture]; - } else { - // Run the second stage of the two-pass filter - [self setSecondFilterFBO]; - - [filterProgram use]; - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, outputTexture); - - glUniform1i(filterInputTextureUniform, 3); - - float step = pow(2.0, numPasses - pass) / self.sizeOfFBO.width; - glUniform1f(sampleStepUniform, step); - - if (filterSourceTexture2 != 0) - { - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); - - glUniform1i(filterInputTextureUniform2, 4); - } - - glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } - } -} - - - -@end diff --git a/framework/GPUImageVoroniConsumerFilter.h b/framework/GPUImageVoroniConsumerFilter.h deleted file mode 100644 index c32b0e19a..000000000 --- a/framework/GPUImageVoroniConsumerFilter.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// GPUVoroniConsumerFilter.h -// Face Esplode -// -// Created by Jacob Gundersen on 4/28/12. -// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. -// - -#import "GPUImageFilter.h" - -@interface GPUImageVoroniConsumerFilter : GPUImageFilter - -@end diff --git a/framework/GPUImageVoroniConsumerFilter.m b/framework/GPUImageVoroniConsumerFilter.m deleted file mode 100644 index 18739afc4..000000000 --- a/framework/GPUImageVoroniConsumerFilter.m +++ /dev/null @@ -1,55 +0,0 @@ -// -// GPUVoroniConsumerFilter.m -// Face Esplode -// -// Created by Jacob Gundersen on 4/28/12. -// Copyright (c) 2012 Interrobang Software LLC. All rights reserved. -// - -#import "GPUImageVoroniConsumerFilter.h" - -NSString *const kGPUImageVoroniConsumerFragmentShaderString = SHADER_STRING -( - - precision highp float; - - uniform sampler2D inputImageTexture; - uniform sampler2D inputImageTexture2; - varying vec2 textureCoordinate; - - vec2 getCoordFromColor(vec4 color, vec2 size) -{ - float z = color.z * 256.0; - float yoff = floor(z / 8.0); - float xoff = mod(z, 8.0); - float x = color.x*256.0 + xoff*256.0; - float y = color.y*256.0 + yoff*256.0; - return vec2(x,y) / size; -} - - void main(void) { - vec4 colorLoc = texture2D(inputImageTexture2, textureCoordinate); - vec4 color = texture2D(inputImageTexture, getCoordFromColor(colorLoc)); - gl_FragColor = color; - } - - - ); - -@implementation GPUImageVoroniConsumerFilter - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageVoroniConsumerFragmentShaderString])) - { - return nil; - } - - return self; -} - --(CGSize)sizeOfFBO { - return CGSizeMake(256, 256); -} - -@end diff --git a/framework/GPUImagePerlinNoiseFilter.h b/framework/Source/GPUImagePerlinNoiseFilter.h similarity index 100% rename from framework/GPUImagePerlinNoiseFilter.h rename to framework/Source/GPUImagePerlinNoiseFilter.h diff --git a/framework/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m similarity index 100% rename from framework/GPUImagePerlinNoiseFilter.m rename to framework/Source/GPUImagePerlinNoiseFilter.m From 0161299f7eb0e727afa4f703e236435d875a9ba1 Mon Sep 17 00:00:00 2001 From: Jake Gundersen Date: Thu, 17 May 2012 14:58:14 -0600 Subject: [PATCH 101/695] More moving --- framework/GPUImage.xcodeproj/project.pbxproj | 16 ++++++++-------- framework/{ => Source}/GPUImageMosaicFilter.h | 0 framework/{ => Source}/GPUImageMosaicFilter.m | 0 3 files changed, 8 insertions(+), 8 deletions(-) rename framework/{ => Source}/GPUImageMosaicFilter.h (100%) rename framework/{ => Source}/GPUImageMosaicFilter.m (100%) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 9b37e7d53..8fa0cb000 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -208,8 +208,8 @@ F2D6D0371564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6D0311564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m */; }; F2D6D0381564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2D6D0321564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h */; }; F2D6D0391564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6D0331564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m */; }; - F2F3362315658F3D00B0FBB8 /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2F3362115658F3D00B0FBB8 /* GPUImageMosaicFilter.h */; }; - F2F3362415658F3D00B0FBB8 /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2F3362215658F3D00B0FBB8 /* GPUImageMosaicFilter.m */; }; + F2F3362E15659DDA00B0FBB8 /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2F3362C15659DDA00B0FBB8 /* GPUImageMosaicFilter.h */; }; + F2F3362F15659DDA00B0FBB8 /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2F3362D15659DDA00B0FBB8 /* GPUImageMosaicFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -413,8 +413,8 @@ F2D6D0311564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePerlinNoiseFilter.m; path = Source/GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; F2D6D0321564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVoroniConsumerFilter.h; path = Source/GPUImageVoroniConsumerFilter.h; sourceTree = SOURCE_ROOT; }; F2D6D0331564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVoroniConsumerFilter.m; path = Source/GPUImageVoroniConsumerFilter.m; sourceTree = SOURCE_ROOT; }; - F2F3362115658F3D00B0FBB8 /* GPUImageMosaicFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPUImageMosaicFilter.h; sourceTree = SOURCE_ROOT; }; - F2F3362215658F3D00B0FBB8 /* GPUImageMosaicFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPUImageMosaicFilter.m; sourceTree = SOURCE_ROOT; }; + F2F3362C15659DDA00B0FBB8 /* GPUImageMosaicFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMosaicFilter.h; path = Source/GPUImageMosaicFilter.h; sourceTree = SOURCE_ROOT; }; + F2F3362D15659DDA00B0FBB8 /* GPUImageMosaicFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMosaicFilter.m; path = Source/GPUImageMosaicFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -531,9 +531,9 @@ BC1B715F14F4B06600ACA2AB /* Effects */ = { isa = PBXGroup; children = ( - F2F3362115658F3D00B0FBB8 /* GPUImageMosaicFilter.h */, - F2F3362215658F3D00B0FBB8 /* GPUImageMosaicFilter.m */, F2D6D02E1564E4FD00A1289F /* GPUImageJFAVoroniFilter.h */, + F2F3362C15659DDA00B0FBB8 /* GPUImageMosaicFilter.h */, + F2F3362D15659DDA00B0FBB8 /* GPUImageMosaicFilter.m */, F2D6D02F1564E4FD00A1289F /* GPUImageJFAVoroniFilter.m */, F2D6D0301564E4FD00A1289F /* GPUImagePerlinNoiseFilter.h */, F2D6D0311564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m */, @@ -850,7 +850,7 @@ F2D6D0341564E4FD00A1289F /* GPUImageJFAVoroniFilter.h in Headers */, F2D6D0361564E4FD00A1289F /* GPUImagePerlinNoiseFilter.h in Headers */, F2D6D0381564E4FD00A1289F /* GPUImageVoroniConsumerFilter.h in Headers */, - F2F3362315658F3D00B0FBB8 /* GPUImageMosaicFilter.h in Headers */, + F2F3362E15659DDA00B0FBB8 /* GPUImageMosaicFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1053,7 +1053,7 @@ F2D6D0351564E4FD00A1289F /* GPUImageJFAVoroniFilter.m in Sources */, F2D6D0371564E4FD00A1289F /* GPUImagePerlinNoiseFilter.m in Sources */, F2D6D0391564E4FD00A1289F /* GPUImageVoroniConsumerFilter.m in Sources */, - F2F3362415658F3D00B0FBB8 /* GPUImageMosaicFilter.m in Sources */, + F2F3362F15659DDA00B0FBB8 /* GPUImageMosaicFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h similarity index 100% rename from framework/GPUImageMosaicFilter.h rename to framework/Source/GPUImageMosaicFilter.h diff --git a/framework/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m similarity index 100% rename from framework/GPUImageMosaicFilter.m rename to framework/Source/GPUImageMosaicFilter.m From f133ac47bd30ed8b0e86dee49b761ffe9fc4114b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 18 May 2012 09:16:01 -0500 Subject: [PATCH 102/695] Incorporated a workaround for the corrupt images that were being returned by photo capture from the front camera with the texture caches. --- .../SimplePhotoFilter/PhotoViewController.m | 2 +- .../GPUImageHarrisCornerDetectionFilter.h | 2 ++ .../GPUImageHarrisCornerDetectionFilter.m | 18 +++++++++++++----- framework/Source/GPUImageStillCamera.m | 7 ++++++- framework/Source/GPUImageVideoCamera.h | 3 ++- framework/Source/GPUImageVideoCamera.m | 1 - 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index f410fde90..60143d444 100755 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -50,7 +50,7 @@ - (void)viewDidLoad [super viewDidLoad]; stillCamera = [[GPUImageStillCamera alloc] init]; -// stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; +// stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionFront]; stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; // filter = [[GPUImageGammaFilter alloc] init]; filter = [[GPUImageSketchFilter alloc] init]; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index 8045c26ea..633317c05 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -14,6 +14,8 @@ GPUImageFilter *harrisCornerDetectionFilter; GPUImageNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; GPUImageFilter *simpleThresholdFilter; + GLfloat *cornersArray; + GLubyte *rawImagePixels; } // A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 @property(readwrite, nonatomic) CGFloat blurSize; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 1b5503bc3..99dd81f03 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -121,21 +121,31 @@ - (id)init; return self; } +- (void)dealloc; +{ + free(rawImagePixels); +} + #pragma mark - #pragma mark Corner extraction - (void)extractCornerLocationsFromImage; { - CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); NSUInteger numberOfCorners = 0; CGSize imageSize = simpleThresholdFilter.outputFrameSize; - GLubyte *rawImagePixels = (GLubyte *)malloc(imageSize.width * imageSize.height * 4); - GLfloat *cornersArray = calloc(512 * 2, sizeof(GLfloat)); + if (rawImagePixels == NULL) + { + rawImagePixels = (GLubyte *)malloc(imageSize.width * imageSize.height * 4); + } + + cornersArray = calloc(512 * 2, sizeof(GLfloat)); glReadPixels(0, 0, (int)imageSize.width, (int)imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + for (unsigned int yCoordinate = 0; yCoordinate < imageSize.height; yCoordinate++) { for (unsigned int xCoordinate = 0; xCoordinate < imageSize.width; xCoordinate++) @@ -154,8 +164,6 @@ - (void)extractCornerLocationsFromImage; } } - free(rawImagePixels); - CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); NSLog(@"Processing time : %f ms", 1000.0 * currentFrameTime); diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 403215bfa..79c721b16 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -140,7 +140,12 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f } else { - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches + AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; + if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) + { + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + } } // report_memory(@"After filter processing"); diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 488e51826..c9847dede 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -17,7 +17,8 @@ AVCaptureSession *_captureSession; AVCaptureDevice *_inputCamera; AVCaptureDevice *_microphone; - + AVCaptureDeviceInput *videoInput; + BOOL capturePaused; GPUImageRotationMode outputRotation; } diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index b1c6c3bd3..9ff61d2b7 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -7,7 +7,6 @@ @interface GPUImageVideoCamera () { - AVCaptureDeviceInput *videoInput; AVCaptureDeviceInput *audioInput; AVCaptureVideoDataOutput *videoOutput; AVCaptureAudioDataOutput *audioOutput; From fcb8bb00c3eac8e7b4e9cb646e4be807beaca1e5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 19 May 2012 18:16:18 -0500 Subject: [PATCH 103/695] Added a tone curve filter, submitted by Marcelo Barbudas. --- README.md | 5 + .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 13 + framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 2 + framework/Source/GPUImageJFAVoroniFilter.h | 9 +- framework/Source/GPUImageJFAVoroniFilter.m | 6 +- framework/Source/GPUImageMosaicFilter.h | 21 +- framework/Source/GPUImageToneCurveFilter.h | 20 ++ framework/Source/GPUImageToneCurveFilter.m | 314 ++++++++++++++++++ .../Source/GPUImageVoroniConsumerFilter.h | 7 +- .../Source/GPUImageVoroniConsumerFilter.m | 4 - 13 files changed, 380 insertions(+), 31 deletions(-) create mode 100644 framework/Source/GPUImageToneCurveFilter.h create mode 100644 framework/Source/GPUImageToneCurveFilter.m diff --git a/README.md b/README.md index 21e161072..51e29bbaf 100755 --- a/README.md +++ b/README.md @@ -73,6 +73,11 @@ Documentation is generated from header comments using appledoc. To build the doc - *colorMatrix*: A 4x4 matrix used to transform each color in an image - *intensity*: The degree to which the new transformed color replaces the original color for each pixel +- **GPUImageToneCurveFilter**: Adjusts the colors of an image based on spline curves for each color channel. + - *redControlPoints*: + - *greenControlPoints*: + - *blueControlPoints*: The tone curve takes in a series of control points that define the spline curve for each color component. These are stored as NSValue-wrapped CGPoints in an NSArray, with normalized X and Y coordinates from 0 - 1. The defaults are (0,0), (0.5,0.5), (1,1). + - **GPUImageColorInvertFilter**: Inverts the colors of an image - **GPUImageGrayscaleFilter**: Converts an image to grayscale (a slightly faster implementation of the saturation filter, without the ability to vary the color contribution) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 6a7ad7262..bb1dc77ea 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -69,6 +69,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SHARPEN: cell.textLabel.text = @"Sharpen"; break; case GPUIMAGE_UNSHARPMASK: cell.textLabel.text = @"Unsharp mask"; break; case GPUIMAGE_GAMMA: cell.textLabel.text = @"Gamma"; break; + case GPUIMAGE_TONECURVE: cell.textLabel.text = @"Tone curve"; break; case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index d8d574945..8ee40c216 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -14,6 +14,7 @@ typedef enum { GPUIMAGE_CROP, GPUIMAGE_MASK, GPUIMAGE_GAMMA, + GPUIMAGE_TONECURVE, GPUIMAGE_HAZE, GPUIMAGE_SEPIA, GPUIMAGE_COLORINVERT, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index e38251f3b..1399aa207 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -205,6 +205,18 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:1.0]; filter = [[GPUImageGammaFilter alloc] init]; + }; break; + case GPUIMAGE_TONECURVE: + { + self.title = @"Tone curve"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImageToneCurveFilter alloc] init]; + [(GPUImageToneCurveFilter *)filter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, 0.5)], [NSValue valueWithCGPoint:CGPointMake(1.0, 0.75)], nil]]; }; break; case GPUIMAGE_HAZE: { @@ -900,6 +912,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; + case GPUIMAGE_TONECURVE: [(GPUImageToneCurveFilter *)filter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, [(UISlider *)sender value])], [NSValue valueWithCGPoint:CGPointMake(1.0, 0.75)], nil]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)filter setDisplayTileSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 1b4a3a176..15975a081 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -194,6 +194,8 @@ BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */; }; BCF1E54415669907006B155F /* GPUImageVoroniConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoroniConsumerFilter.h */; }; BCF1E54515669907006B155F /* GPUImageVoroniConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */; }; + BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; }; + BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */; }; BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; }; BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; }; @@ -399,6 +401,8 @@ BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMosaicFilter.m; path = Source/GPUImageMosaicFilter.m; sourceTree = SOURCE_ROOT; }; BCF1E53E15669907006B155F /* GPUImageVoroniConsumerFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVoroniConsumerFilter.h; path = Source/GPUImageVoroniConsumerFilter.h; sourceTree = SOURCE_ROOT; }; BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVoroniConsumerFilter.m; path = Source/GPUImageVoroniConsumerFilter.m; sourceTree = SOURCE_ROOT; }; + BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageToneCurveFilter.h; path = Source/GPUImageToneCurveFilter.h; sourceTree = SOURCE_ROOT; }; + BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageToneCurveFilter.m; path = Source/GPUImageToneCurveFilter.m; sourceTree = SOURCE_ROOT; }; BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTextureInput.h; path = Source/GPUImageTextureInput.h; sourceTree = SOURCE_ROOT; }; BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTextureInput.m; path = Source/GPUImageTextureInput.m; sourceTree = SOURCE_ROOT; }; BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTiltShiftFilter.h; path = Source/GPUImageTiltShiftFilter.h; sourceTree = SOURCE_ROOT; }; @@ -487,6 +491,8 @@ BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */, BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */, BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */, + BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */, + BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -851,6 +857,7 @@ BCF1E54015669907006B155F /* GPUImageJFAVoroniFilter.h in Headers */, BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */, BCF1E54415669907006B155F /* GPUImageVoroniConsumerFilter.h in Headers */, + BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1054,6 +1061,7 @@ BCF1E54115669907006B155F /* GPUImageJFAVoroniFilter.m in Sources */, BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */, BCF1E54515669907006B155F /* GPUImageVoroniConsumerFilter.m in Sources */, + BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index f245c59c8..ec4d44a6a 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -87,3 +87,5 @@ #import "GPUImageMedianFilter.h" #import "GPUImageBilateralFilter.h" #import "GPUImageCrosshairGenerator.h" +#import "GPUImageToneCurveFilter.h" + diff --git a/framework/Source/GPUImageJFAVoroniFilter.h b/framework/Source/GPUImageJFAVoroniFilter.h index c51fcf266..de5c650f2 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.h +++ b/framework/Source/GPUImageJFAVoroniFilter.h @@ -1,12 +1,7 @@ -// -// GPUImageJFAVoroni.h - -// The shaders are mostly taken from UnitZeroOne's WebGL example here: -// http://unitzeroone.com/blog/2011/03/22/jump-flood-voronoi-for-webgl/ - #import "GPUImageTwoInputFilter.h" -@interface GPUImageJFAVoroniFilter : GPUImageTwoInputFilter { +@interface GPUImageJFAVoroniFilter : GPUImageTwoInputFilter +{ GLuint secondFilterOutputTexture; GLuint secondFilterFramebuffer; GLint sampleStepUniform; diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m index b33dc09b2..c07c92f4f 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.m +++ b/framework/Source/GPUImageJFAVoroniFilter.m @@ -1,10 +1,10 @@ -// -// GPUImageJFAVoroni.m -// // adapted from unitzeroone - http://unitzeroone.com/labs/jfavoronoi/ #import "GPUImageJFAVoroniFilter.h" +// The shaders are mostly taken from UnitZeroOne's WebGL example here: +// http://unitzeroone.com/blog/2011/03/22/jump-flood-voronoi-for-webgl/ + NSString *const kGPUImageJFAVoroniVertexShaderString = SHADER_STRING ( attribute vec4 position; diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h index aa7a72fb9..ae829ec44 100644 --- a/framework/Source/GPUImageMosaicFilter.h +++ b/framework/Source/GPUImageMosaicFilter.h @@ -1,10 +1,3 @@ -// -// GPUImageMosaicFilter.h - -// This filter takes an input tileset, the tiles must ascend in luminance -// It looks at the input image and replaces each display tile with an input tile -// according to the luminance of that tile. The idea was to replicate the ASCII -// video filters seen in other apps, but the tileset can be anything. // This needs a little more work, it's rotating the input tileset and there are some artifacts (I think from GL_LINEAR interpolation), but it's working @@ -16,15 +9,19 @@ GPUImagePicture *pic; } +// This filter takes an input tileset, the tiles must ascend in luminance +// It looks at the input image and replaces each display tile with an input tile +// according to the luminance of that tile. The idea was to replicate the ASCII +// video filters seen in other apps, but the tileset can be anything. @property(readwrite, nonatomic) CGSize inputTileSize; @property(readwrite, nonatomic) float numTiles; @property(readwrite, nonatomic) CGSize displayTileSize; @property(readwrite, nonatomic) BOOL colorOn; --(void)setNumTiles:(float)numTiles; --(void)setDisplayTileSize:(CGSize)displayTileSize; --(void)setInputTileSize:(CGSize)inputTileSize; --(void)setTileSet:(NSString *)tileSet; --(void)setColorOn:(BOOL)yes; +- (void)setNumTiles:(float)numTiles; +- (void)setDisplayTileSize:(CGSize)displayTileSize; +- (void)setInputTileSize:(CGSize)inputTileSize; +- (void)setTileSet:(NSString *)tileSet; +- (void)setColorOn:(BOOL)yes; @end diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h new file mode 100644 index 000000000..c6259aed1 --- /dev/null +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -0,0 +1,20 @@ +#import "GPUImageFilter.h" + +@interface GPUImageToneCurveFilter : GPUImageFilter + +// The tone curve takes in a series of control points that define the spline curve for each color component. +// These are stored as NSValue-wrapped CGPoints in an NSArray, with normalized X and Y coordinates from 0 - 1. The defaults are (0,0), (0.5,0.5), (1,1). +@property(readwrite, nonatomic) NSArray *redControlPoints; +@property(readwrite, nonatomic) NSArray *greenControlPoints; +@property(readwrite, nonatomic) NSArray *blueControlPoints; + +// This lets you set all three red, green, and blue tone curves at once. +- (void)setRGBControlPoints:(NSArray *)points; + +// Curve calculation +- (NSArray *)getPreparedSplineCurve:(NSArray *)points; +- (NSArray *)splineCurve:(NSArray *)points; +- (NSArray *)secondDerivative:(NSArray *)cgPoints; +- (void)updateToneCurveTexture; + +@end diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m new file mode 100644 index 000000000..5696898d3 --- /dev/null +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -0,0 +1,314 @@ +#import "GPUImageToneCurveFilter.h" + +NSString *const kGPUImageToneCurveFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D toneCurveTexture; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp float redCurveValue = texture2D(toneCurveTexture, vec2(textureColor.r, 0.0)).r; + lowp float greenCurveValue = texture2D(toneCurveTexture, vec2(textureColor.g, 0.0)).g; + lowp float blueCurveValue = texture2D(toneCurveTexture, vec2(textureColor.b, 0.0)).b; + + gl_FragColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, textureColor.a); + } +); + + +@interface GPUImageToneCurveFilter() +{ + GLint toneCurveTextureUniform; + GLuint toneCurveTexture; + GLubyte *toneCurveByteArray; + + NSArray *_redCurve, *_greenCurve, *_blueCurve; +} + +@end + +@implementation GPUImageToneCurveFilter + +@synthesize redControlPoints = _redControlPoints; +@synthesize greenControlPoints = _greenControlPoints; +@synthesize blueControlPoints = _blueControlPoints; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageToneCurveFragmentShaderString])) + { + return nil; + } + + toneCurveTextureUniform = [filterProgram uniformIndex:@"toneCurveTexture"]; + + [self setRGBControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, 0.5)], [NSValue valueWithCGPoint:CGPointMake(1.0, 1.0)], nil]]; + + return self; +} + +- (void)dealloc +{ + if (toneCurveTexture) + { + glDeleteTextures(1, &toneCurveTexture); + toneCurveTexture = 0; + free(toneCurveByteArray); + } +} + +#pragma mark - +#pragma mark Curve calculation + +- (NSArray *)getPreparedSplineCurve:(NSArray *)points +{ + if (points && [points count] > 0) + { + // Sort the array. + NSArray *sortedPoints = [points sortedArrayUsingComparator:^(id a, id b) { + float x1 = [(NSValue *)a CGPointValue].x; + float x2 = [(NSValue *)b CGPointValue].x; + return x1 > x2; + }]; + + // Convert from (0, 1) to (0, 255). + NSMutableArray *convertedPoints = [NSMutableArray arrayWithCapacity:[sortedPoints count]]; + for (int i=0; i<[points count]; i++){ + CGPoint point = [[sortedPoints objectAtIndex:i] CGPointValue]; + point.x = point.x * 255; + point.y = point.y * 255; + + [convertedPoints addObject:[NSValue valueWithCGPoint:point]]; + } + + NSArray *splinePoints = [self splineCurve:convertedPoints]; + + NSMutableArray *preparedSplinePoints = [NSMutableArray arrayWithCapacity:[splinePoints count]]; + for (int i=0; i<[splinePoints count]; i++) + { + CGPoint newPoint = [[splinePoints objectAtIndex:i] CGPointValue]; + CGPoint origPoint = CGPointMake(newPoint.x, newPoint.x); + + float distance = sqrt(pow((origPoint.x - newPoint.x), 2.0) + pow((origPoint.y - newPoint.y), 2.0)); + + if (origPoint.y > newPoint.y) + { + distance = -distance; + } + + [preparedSplinePoints addObject:[NSNumber numberWithFloat:distance]]; + } + + return preparedSplinePoints; + } + + return nil; +} + + +- (NSArray *)splineCurve:(NSArray *)points +{ + NSArray *sdA = [self secondDerivative:points]; + + int n = [points count]; + double sd[n]; + + // From NSMutableArray to sd[n]; + for (int i=0; i<[sdA count]; i++) + { + sd[i] = [[sdA objectAtIndex:i] doubleValue]; + } + + + NSMutableArray *output = [NSMutableArray arrayWithCapacity:(n+1)]; + + for(int i=0; idown) + for(int i=1;iup) + for(int i=n-2;i>=0;i--) + { + double k = matrix[i][2]/matrix[i+1][1]; + matrix[i][1] -= k*matrix[i+1][0]; + matrix[i][2] = 0; + result[i] -= k*result[i+1]; + } + + double y2[n]; + for(int i=0;i= 256) && ([_greenCurve count] >= 256) && ([_blueCurve count] >= 256) ) + { + for (unsigned int currentCurveIndex = 0; currentCurveIndex < 256; currentCurveIndex++) + { + // BGRA for upload to texture + toneCurveByteArray[currentCurveIndex * 4] = currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue]; + toneCurveByteArray[currentCurveIndex * 4 + 1] = currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue]; + toneCurveByteArray[currentCurveIndex * 4 + 2] = currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue]; + toneCurveByteArray[currentCurveIndex * 4 + 3] = 255; + } + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256 /*width*/, 1 /*height*/, 0, GL_BGRA, GL_UNSIGNED_BYTE, toneCurveByteArray); + } +} + +#pragma mark - +#pragma mark Rendering + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + if (self.preventRendering) + { + return; + } + + [GPUImageOpenGLESContext useImageProcessingContext]; + [self setFilterFBO]; + + [filterProgram use]; + + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, sourceTexture); + glUniform1i(filterInputTextureUniform, 2); + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, toneCurveTexture); + glUniform1i(toneCurveTextureUniform, 3); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +#pragma mark - +#pragma mark Accessors + +- (void)setRGBControlPoints:(NSArray *)points +{ + _redControlPoints = _greenControlPoints = _blueControlPoints = points; + _redCurve = _greenCurve = _blueCurve = [self getPreparedSplineCurve:points]; + + [self updateToneCurveTexture]; +} + + +- (void)setRedControlPoints:(NSArray *)newValue; +{ + _redControlPoints = newValue; + _redCurve = [self getPreparedSplineCurve:_redControlPoints]; + + [self updateToneCurveTexture]; +} + + +- (void)setGreenControlPoints:(NSArray *)newValue +{ + _greenControlPoints = newValue; + _greenCurve = [self getPreparedSplineCurve:_greenControlPoints]; + + [self updateToneCurveTexture]; +} + + +- (void)setBlueControlPoints:(NSArray *)newValue +{ + _blueControlPoints = newValue; + _blueCurve = [self getPreparedSplineCurve:_blueControlPoints]; + + [self updateToneCurveTexture]; +} + +@end diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoroniConsumerFilter.h index aad4890a4..69a9fcdcc 100644 --- a/framework/Source/GPUImageVoroniConsumerFilter.h +++ b/framework/Source/GPUImageVoroniConsumerFilter.h @@ -1,10 +1,7 @@ -// -// GPUVoroniConsumerFilter.h -// - #import "GPUImageTwoInputFilter.h" -@interface GPUImageVoroniConsumerFilter : GPUImageTwoInputFilter { +@interface GPUImageVoroniConsumerFilter : GPUImageTwoInputFilter +{ GLint sizeUniform; } diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoroniConsumerFilter.m index 1a377c37e..8574c00e3 100644 --- a/framework/Source/GPUImageVoroniConsumerFilter.m +++ b/framework/Source/GPUImageVoroniConsumerFilter.m @@ -1,7 +1,3 @@ -// -// GPUVoroniConsumerFilter.m -// - #import "GPUImageVoroniConsumerFilter.h" NSString *const kGPUImageVoroniConsumerFragmentShaderString = SHADER_STRING From f409dbd10edb640afb9a2966bbec6111b782f1f9 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 20 May 2012 18:56:21 -0500 Subject: [PATCH 104/695] Fixed issues with the crop filter not properly recreating FBO sizes after filter removal and replacement. --- .../SimpleVideoFilterViewController.m | 3 +- framework/Source/GPUImageCropFilter.m | 47 +++++++++++++++++-- framework/Source/GPUImageFilter.m | 2 +- framework/Source/GPUImageToneCurveFilter.h | 6 +-- framework/Source/GPUImageView.m | 2 +- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index e907aa516..b8df88d54 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -60,7 +60,7 @@ - (void)viewDidLoad dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, delayToStartRecording * NSEC_PER_SEC); dispatch_after(startTime, dispatch_get_main_queue(), ^(void){ NSLog(@"Start recording"); - + videoCamera.audioEncodingTarget = movieWriter; [movieWriter startRecording]; @@ -75,6 +75,7 @@ - (void)viewDidLoad double delayInSeconds = 10.0; dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ + [filter removeTarget:movieWriter]; videoCamera.audioEncodingTarget = nil; [movieWriter finishRecording]; diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 4ab32b1d3..02b051df0 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -18,6 +18,13 @@ - (void)calculateCropTextureCoordinates; @end +@interface GPUImageCropFilter() +{ + CGSize originallySuppliedInputSize; +} + +@end + @implementation GPUImageCropFilter @synthesize cropRegion = _cropRegion; @@ -50,14 +57,44 @@ - (id)init; #pragma mark - #pragma mark Rendering -- (CGSize)outputFrameSize; +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { - CGSize adjustedSize; + if (self.preventRendering) + { + return; + } + +// if (overrideInputSize) +// { +// if (CGSizeEqualToSize(forcedMaximumSize, CGSizeZero)) +// { +// return; +// } +// else +// { +// CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(newSize, CGRectMake(0.0, 0.0, forcedMaximumSize.width, forcedMaximumSize.height)); +// inputTextureSize = insetRect.size; +// return; +// } +// } + + CGSize rotatedSize = [self rotatedSize:newSize forIndex:textureIndex]; + originallySuppliedInputSize = rotatedSize; + + CGSize scaledSize; + scaledSize.width = rotatedSize.width * _cropRegion.size.width; + scaledSize.height = rotatedSize.height * _cropRegion.size.height; - adjustedSize.width = inputTextureSize.width * _cropRegion.size.width; - adjustedSize.height = inputTextureSize.height * _cropRegion.size.height; - return adjustedSize; + if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (CGSizeEqualToSize(scaledSize, CGSizeZero)) ) + { + inputTextureSize = scaledSize; + } + else if (!CGSizeEqualToSize(inputTextureSize, scaledSize)) + { + inputTextureSize = scaledSize; + [self recreateFilterFBO]; + } } #pragma mark - diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 2dc0513d6..0cf342832 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -665,7 +665,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; CGSize rotatedSize = [self rotatedSize:newSize forIndex:textureIndex]; - if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (CGSizeEqualToSize(rotatedSize, CGSizeZero)) ) + if (CGSizeEqualToSize(rotatedSize, CGSizeZero)) { inputTextureSize = rotatedSize; } diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h index c6259aed1..2c2f2e24a 100644 --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -4,9 +4,9 @@ // The tone curve takes in a series of control points that define the spline curve for each color component. // These are stored as NSValue-wrapped CGPoints in an NSArray, with normalized X and Y coordinates from 0 - 1. The defaults are (0,0), (0.5,0.5), (1,1). -@property(readwrite, nonatomic) NSArray *redControlPoints; -@property(readwrite, nonatomic) NSArray *greenControlPoints; -@property(readwrite, nonatomic) NSArray *blueControlPoints; +@property(readwrite, nonatomic, strong) NSArray *redControlPoints; +@property(readwrite, nonatomic, strong) NSArray *greenControlPoints; +@property(readwrite, nonatomic, strong) NSArray *blueControlPoints; // This lets you set all three red, green, and blue tone curves at once. - (void)setRGBControlPoints:(NSArray *)points; diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index ed9e590f5..7b28b3a65 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -371,7 +371,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { inputImageSize = rotatedSize; [self recalculateViewGeometry]; - } + } } - (CGSize)maximumOutputSize; From 1adb2cb41a5188b9eb26939d955998279cf62dfc Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 21 May 2012 22:15:49 -0500 Subject: [PATCH 105/695] Added a new raw data input class. Fixed download issues with the raw data output. Fixed the ColorObjectTracking example. --- .../RawDataTest.xcodeproj/project.pbxproj | 267 ++++++++++++++++++ .../RawDataTest/CalculationShader.fsh | 0 .../RawDataTest/RawDataTest-Info.plist | 45 +++ .../RawDataTest/RawDataTest-Prefix.pch | 14 + .../RawDataTest/RawDataTestAppDelegate.h | 15 + .../RawDataTest/RawDataTestAppDelegate.m | 51 ++++ .../RawDataTest/en.lproj/InfoPlist.strings | 2 + examples/RawDataTest/RawDataTest/main.m | 18 ++ framework/Source/GPUImageRawDataInput.h | 13 + framework/Source/GPUImageRawDataInput.m | 13 + ...ImageRawData.h => GPUImageRawDataOutput.h} | 0 ...ImageRawData.m => GPUImageRawDataOutput.m} | 0 12 files changed, 438 insertions(+) create mode 100644 examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj create mode 100644 examples/RawDataTest/RawDataTest/CalculationShader.fsh create mode 100644 examples/RawDataTest/RawDataTest/RawDataTest-Info.plist create mode 100644 examples/RawDataTest/RawDataTest/RawDataTest-Prefix.pch create mode 100644 examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h create mode 100644 examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m create mode 100644 examples/RawDataTest/RawDataTest/en.lproj/InfoPlist.strings create mode 100644 examples/RawDataTest/RawDataTest/main.m create mode 100644 framework/Source/GPUImageRawDataInput.h create mode 100644 framework/Source/GPUImageRawDataInput.m rename framework/Source/{GPUImageRawData.h => GPUImageRawDataOutput.h} (100%) rename framework/Source/{GPUImageRawData.m => GPUImageRawDataOutput.m} (100%) diff --git a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj b/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj new file mode 100644 index 000000000..177072ce3 --- /dev/null +++ b/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj @@ -0,0 +1,267 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BCF1E6071569D372006B155F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6061569D372006B155F /* UIKit.framework */; }; + BCF1E6091569D372006B155F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6081569D372006B155F /* Foundation.framework */; }; + BCF1E60B1569D372006B155F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E60A1569D372006B155F /* CoreGraphics.framework */; }; + BCF1E6111569D372006B155F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1E60F1569D372006B155F /* InfoPlist.strings */; }; + BCF1E6131569D372006B155F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E6121569D372006B155F /* main.m */; }; + BCF1E6171569D372006B155F /* RawDataTestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E6161569D372006B155F /* RawDataTestAppDelegate.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + BCF1E6021569D372006B155F /* RawDataTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RawDataTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BCF1E6061569D372006B155F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + BCF1E6081569D372006B155F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + BCF1E60A1569D372006B155F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + BCF1E60E1569D372006B155F /* RawDataTest-Info.plist */ = {isa = PBXFileReference; path = "RawDataTest-Info.plist"; sourceTree = ""; }; + BCF1E6101569D372006B155F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + BCF1E6121569D372006B155F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + BCF1E6141569D372006B155F /* RawDataTest-Prefix.pch */ = {isa = PBXFileReference; path = "RawDataTest-Prefix.pch"; sourceTree = ""; }; + BCF1E6151569D372006B155F /* RawDataTestAppDelegate.h */ = {isa = PBXFileReference; path = RawDataTestAppDelegate.h; sourceTree = ""; }; + BCF1E6161569D372006B155F /* RawDataTestAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RawDataTestAppDelegate.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BCF1E5FF1569D372006B155F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF1E6071569D372006B155F /* UIKit.framework in Frameworks */, + BCF1E6091569D372006B155F /* Foundation.framework in Frameworks */, + BCF1E60B1569D372006B155F /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BCF1E5F71569D372006B155F = { + isa = PBXGroup; + children = ( + BCF1E60C1569D372006B155F /* RawDataTest */, + BCF1E6051569D372006B155F /* Frameworks */, + BCF1E6031569D372006B155F /* Products */, + ); + sourceTree = ""; + }; + BCF1E6031569D372006B155F /* Products */ = { + isa = PBXGroup; + children = ( + BCF1E6021569D372006B155F /* RawDataTest.app */, + ); + name = Products; + sourceTree = ""; + }; + BCF1E6051569D372006B155F /* Frameworks */ = { + isa = PBXGroup; + children = ( + BCF1E6061569D372006B155F /* UIKit.framework */, + BCF1E6081569D372006B155F /* Foundation.framework */, + BCF1E60A1569D372006B155F /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + BCF1E60C1569D372006B155F /* RawDataTest */ = { + isa = PBXGroup; + children = ( + BCF1E6151569D372006B155F /* RawDataTestAppDelegate.h */, + BCF1E6161569D372006B155F /* RawDataTestAppDelegate.m */, + BCF1E60D1569D372006B155F /* Supporting Files */, + ); + path = RawDataTest; + sourceTree = ""; + }; + BCF1E60D1569D372006B155F /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BCF1E60E1569D372006B155F /* RawDataTest-Info.plist */, + BCF1E60F1569D372006B155F /* InfoPlist.strings */, + BCF1E6121569D372006B155F /* main.m */, + BCF1E6141569D372006B155F /* RawDataTest-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BCF1E6011569D372006B155F /* RawDataTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = BCF1E61A1569D372006B155F /* Build configuration list for PBXNativeTarget "RawDataTest" */; + buildPhases = ( + BCF1E5FE1569D372006B155F /* Sources */, + BCF1E5FF1569D372006B155F /* Frameworks */, + BCF1E6001569D372006B155F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RawDataTest; + productName = RawDataTest; + productReference = BCF1E6021569D372006B155F /* RawDataTest.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BCF1E5F91569D372006B155F /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = RawDataTest; + LastUpgradeCheck = 0430; + ORGANIZATIONNAME = "Cell Phone"; + }; + buildConfigurationList = BCF1E5FC1569D372006B155F /* Build configuration list for PBXProject "RawDataTest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = BCF1E5F71569D372006B155F; + productRefGroup = BCF1E6031569D372006B155F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + BCF1E6011569D372006B155F /* RawDataTest */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + BCF1E6001569D372006B155F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF1E6111569D372006B155F /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BCF1E5FE1569D372006B155F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF1E6131569D372006B155F /* main.m in Sources */, + BCF1E6171569D372006B155F /* RawDataTestAppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + BCF1E60F1569D372006B155F /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + BCF1E6101569D372006B155F /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BCF1E6181569D372006B155F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 5.1; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + BCF1E6191569D372006B155F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 5.1; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + BCF1E61B1569D372006B155F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "RawDataTest/RawDataTest-Prefix.pch"; + INFOPLIST_FILE = "RawDataTest/RawDataTest-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + BCF1E61C1569D372006B155F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "RawDataTest/RawDataTest-Prefix.pch"; + INFOPLIST_FILE = "RawDataTest/RawDataTest-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BCF1E5FC1569D372006B155F /* Build configuration list for PBXProject "RawDataTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCF1E6181569D372006B155F /* Debug */, + BCF1E6191569D372006B155F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BCF1E61A1569D372006B155F /* Build configuration list for PBXNativeTarget "RawDataTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCF1E61B1569D372006B155F /* Debug */, + BCF1E61C1569D372006B155F /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = BCF1E5F91569D372006B155F /* Project object */; +} diff --git a/examples/RawDataTest/RawDataTest/CalculationShader.fsh b/examples/RawDataTest/RawDataTest/CalculationShader.fsh new file mode 100644 index 000000000..e69de29bb diff --git a/examples/RawDataTest/RawDataTest/RawDataTest-Info.plist b/examples/RawDataTest/RawDataTest/RawDataTest-Info.plist new file mode 100644 index 000000000..94fae500b --- /dev/null +++ b/examples/RawDataTest/RawDataTest/RawDataTest-Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/examples/RawDataTest/RawDataTest/RawDataTest-Prefix.pch b/examples/RawDataTest/RawDataTest/RawDataTest-Prefix.pch new file mode 100644 index 000000000..84a73b501 --- /dev/null +++ b/examples/RawDataTest/RawDataTest/RawDataTest-Prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'RawDataTest' target in the 'RawDataTest' project +// + +#import + +#ifndef __IPHONE_3_0 +#warning "This project uses features only available in iOS SDK 3.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h new file mode 100644 index 000000000..5cdc818ed --- /dev/null +++ b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h @@ -0,0 +1,15 @@ +// +// RawDataTestAppDelegate.h +// RawDataTest +// +// Created by Brad Larson on 5/20/2012. +// Copyright (c) 2012 Cell Phone. All rights reserved. +// + +#import + +@interface RawDataTestAppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m new file mode 100644 index 000000000..1194faf6b --- /dev/null +++ b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m @@ -0,0 +1,51 @@ +// +// RawDataTestAppDelegate.m +// RawDataTest +// +// Created by Brad Larson on 5/20/2012. +// Copyright (c) 2012 Cell Phone. All rights reserved. +// + +#import "RawDataTestAppDelegate.h" + +@implementation RawDataTestAppDelegate + +@synthesize window = _window; + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + // Override point for customization after application launch. + self.window.backgroundColor = [UIColor whiteColor]; + [self.window makeKeyAndVisible]; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + // 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. + // 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. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + // 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. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + // 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. +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/examples/RawDataTest/RawDataTest/en.lproj/InfoPlist.strings b/examples/RawDataTest/RawDataTest/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/examples/RawDataTest/RawDataTest/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/examples/RawDataTest/RawDataTest/main.m b/examples/RawDataTest/RawDataTest/main.m new file mode 100644 index 000000000..9ee49214f --- /dev/null +++ b/examples/RawDataTest/RawDataTest/main.m @@ -0,0 +1,18 @@ +// +// main.m +// RawDataTest +// +// Created by Brad Larson on 5/20/2012. +// Copyright (c) 2012 Cell Phone. All rights reserved. +// + +#import + +#import "RawDataTestAppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([RawDataTestAppDelegate class])); + } +} diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h new file mode 100644 index 000000000..ced4b4df7 --- /dev/null +++ b/framework/Source/GPUImageRawDataInput.h @@ -0,0 +1,13 @@ +// +// GPUImageRawDataInput.h +// GPUImage +// +// Created by Brad Larson on 5/21/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageOutput.h" + +@interface GPUImageRawDataInput : GPUImageOutput + +@end diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m new file mode 100644 index 000000000..9c56a0b52 --- /dev/null +++ b/framework/Source/GPUImageRawDataInput.m @@ -0,0 +1,13 @@ +// +// GPUImageRawDataInput.m +// GPUImage +// +// Created by Brad Larson on 5/21/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageRawDataInput.h" + +@implementation GPUImageRawDataInput + +@end diff --git a/framework/Source/GPUImageRawData.h b/framework/Source/GPUImageRawDataOutput.h similarity index 100% rename from framework/Source/GPUImageRawData.h rename to framework/Source/GPUImageRawDataOutput.h diff --git a/framework/Source/GPUImageRawData.m b/framework/Source/GPUImageRawDataOutput.m similarity index 100% rename from framework/Source/GPUImageRawData.m rename to framework/Source/GPUImageRawDataOutput.m From 180f148483e36dc303d9c1e0c71bf4a2e417cd08 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 21 May 2012 22:16:52 -0500 Subject: [PATCH 106/695] Trying again to commit raw data fixes. --- README.md | 1 - .../ColorTrackingViewController.h | 4 +- .../ColorTrackingViewController.m | 89 +++++++-------- .../RawDataTest.xcodeproj/project.pbxproj | 104 +++++++++++++++++- .../RawDataTest/CalculationShader.fsh | 11 ++ .../RawDataTest/RawDataTestAppDelegate.h | 9 +- .../RawDataTest/RawDataTestAppDelegate.m | 70 ++++++------ examples/RawDataTest/RawDataTest/main.m | 8 -- framework/GPUImage.xcodeproj/project.pbxproj | 24 ++-- framework/Source/GPUImage.h | 3 +- .../GPUImageHarrisCornerDetectionFilter.h | 3 + .../GPUImageHarrisCornerDetectionFilter.m | 19 +++- framework/Source/GPUImageRawDataInput.h | 22 ++-- framework/Source/GPUImageRawDataInput.m | 66 +++++++++-- framework/Source/GPUImageRawDataOutput.h | 9 +- framework/Source/GPUImageRawDataOutput.m | 34 ++++-- framework/Source/GPUImageXYDerivativeFilter.m | 4 +- 17 files changed, 328 insertions(+), 152 deletions(-) diff --git a/README.md b/README.md index 51e29bbaf..488401aa6 100755 --- a/README.md +++ b/README.md @@ -208,7 +208,6 @@ Documentation is generated from header comments using appledoc. To build the doc - *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.5 as the default - **GPUImageSketchFilter**: Converts video to look like a sketch. This is just the Sobel edge detection filter with the colors inverted - - *intensity*: The degree to which the original image colors are replaced by the detected edges (0.0 - 1.0, with 1.0 as the default) - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h index 51712b23e..db25b6aaa 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h @@ -3,13 +3,13 @@ typedef enum { PASSTHROUGH_VIDEO, SIMPLE_THRESHOLDING, POSITION_THRESHOLDING, OBJECT_TRACKING} ColorTrackingDisplayMode; -@interface ColorTrackingViewController : UIViewController +@interface ColorTrackingViewController : UIViewController { CALayer *trackingDot; GPUImageVideoCamera *videoCamera; GPUImageFilter *thresholdFilter, *positionFilter; - GPUImageRawData *positionRawData, *videoRawData; + GPUImageRawDataOutput *positionRawData, *videoRawData; GPUImageView *filteredVideoView; ColorTrackingDisplayMode displayMode; diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index e0a0dcec4..2c5f87bb8 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -66,11 +66,45 @@ - (void)configureVideoFiltering; CGSize videoPixelSize = CGSizeMake(480.0, 640.0); - positionRawData = [[GPUImageRawData alloc] initWithImageSize:videoPixelSize]; - positionRawData.delegate = self; + positionRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize]; + __unsafe_unretained ColorTrackingViewController *weakSelf = self; + [positionRawData setNewFrameAvailableBlock:^{ + GLubyte *bytesForPositionData = positionRawData.rawBytesForImage; + CGPoint currentTrackingLocation = [weakSelf centroidFromTexture:bytesForPositionData ofSize:[positionRawData maximumOutputSize]]; + CGSize currentViewSize = weakSelf.view.bounds.size; + trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); + }]; - videoRawData = [[GPUImageRawData alloc] initWithImageSize:videoPixelSize]; - videoRawData.delegate = self; + videoRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize]; + [videoRawData setNewFrameAvailableBlock:^{ + if (shouldReplaceThresholdColor) + { + CGSize currentViewSize = self.view.bounds.size; + CGSize rawPixelsSize = [videoRawData maximumOutputSize]; + + + CGPoint scaledTouchPoint; + scaledTouchPoint.x = (currentTouchPoint.x / currentViewSize.width) * rawPixelsSize.width; + scaledTouchPoint.y = (currentTouchPoint.y / currentViewSize.height) * rawPixelsSize.height; + + GPUByteColorVector colorAtTouchPoint = [videoRawData colorAtLocation:scaledTouchPoint]; + + thresholdColor[0] = (float)colorAtTouchPoint.red / 255.0; + thresholdColor[1] = (float)colorAtTouchPoint.green / 255.0; + thresholdColor[2] = (float)colorAtTouchPoint.blue / 255.0; + + // NSLog(@"Color at touch point: %d, %d, %d, %d", colorAtTouchPoint.red, colorAtTouchPoint.green, colorAtTouchPoint.blue, colorAtTouchPoint.alpha); + + [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[0] forKey:@"thresholdColorR"]; + [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[1] forKey:@"thresholdColorG"]; + [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[2] forKey:@"thresholdColorB"]; + + [thresholdFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; + [positionFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; + + shouldReplaceThresholdColor = NO; + } + }]; [videoCamera addTarget:filteredVideoView]; [videoCamera addTarget:videoRawData]; @@ -200,52 +234,7 @@ - (CGPoint)centroidFromTexture:(GLubyte *)pixels ofSize:(CGSize)textureSize; } } - return CGPointMake(currentXTotal / currentPixelTotal, currentYTotal / currentPixelTotal); -} - -#pragma mark - -#pragma mark GPUImageRawDataProcessor protocol - -- (void)newImageFrameAvailableFromDataSource:(GPUImageRawData *)rawDataSource; -{ - if (rawDataSource == positionRawData) - { - GLubyte *bytesForPositionData = rawDataSource.rawBytesForImage; - CGPoint currentTrackingLocation = [self centroidFromTexture:bytesForPositionData ofSize:[rawDataSource maximumOutputSize]]; - CGSize currentViewSize = self.view.bounds.size; - trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); - } - else - { - if (shouldReplaceThresholdColor) - { - CGSize currentViewSize = self.view.bounds.size; - CGSize rawPixelsSize = [rawDataSource maximumOutputSize]; - - - CGPoint scaledTouchPoint; - scaledTouchPoint.x = (currentTouchPoint.x / currentViewSize.width) * rawPixelsSize.width; - scaledTouchPoint.y = (currentTouchPoint.y / currentViewSize.height) * rawPixelsSize.height; - - GPUByteColorVector colorAtTouchPoint = [rawDataSource colorAtLocation:scaledTouchPoint]; - - thresholdColor[0] = (float)colorAtTouchPoint.red / 255.0; - thresholdColor[1] = (float)colorAtTouchPoint.green / 255.0; - thresholdColor[2] = (float)colorAtTouchPoint.blue / 255.0; - -// NSLog(@"Color at touch point: %d, %d, %d, %d", colorAtTouchPoint.red, colorAtTouchPoint.green, colorAtTouchPoint.blue, colorAtTouchPoint.alpha); - - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[0] forKey:@"thresholdColorR"]; - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[1] forKey:@"thresholdColorG"]; - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[2] forKey:@"thresholdColorB"]; - - [thresholdFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; - [positionFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; - - shouldReplaceThresholdColor = NO; - } - } - + return CGPointMake((1.0 - currentYTotal / currentPixelTotal), currentXTotal / currentPixelTotal); } #pragma mark - diff --git a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj b/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj index 177072ce3..f75b7a294 100644 --- a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj +++ b/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj @@ -7,25 +7,63 @@ objects = { /* Begin PBXBuildFile section */ + BC18E03D156B352E00AB8026 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E62F1569D454006B155F /* libGPUImage.a */; }; + BC18E03F156B354000AB8026 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E03E156B354000AB8026 /* CoreMedia.framework */; }; BCF1E6071569D372006B155F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6061569D372006B155F /* UIKit.framework */; }; BCF1E6091569D372006B155F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6081569D372006B155F /* Foundation.framework */; }; BCF1E60B1569D372006B155F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E60A1569D372006B155F /* CoreGraphics.framework */; }; BCF1E6111569D372006B155F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1E60F1569D372006B155F /* InfoPlist.strings */; }; BCF1E6131569D372006B155F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E6121569D372006B155F /* main.m */; }; BCF1E6171569D372006B155F /* RawDataTestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E6161569D372006B155F /* RawDataTestAppDelegate.m */; }; + BCF1E61E1569D3F8006B155F /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E61D1569D3F8006B155F /* CoreVideo.framework */; }; + BCF1E6201569D408006B155F /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E61F1569D408006B155F /* AVFoundation.framework */; }; + BCF1E6231569D42A006B155F /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6211569D42A006B155F /* OpenGLES.framework */; }; + BCF1E6241569D42A006B155F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6221569D42A006B155F /* QuartzCore.framework */; }; + BCF1E63F156AAB4E006B155F /* CalculationShader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCF1E63E156AAB4E006B155F /* CalculationShader.fsh */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + BCF1E62E1569D454006B155F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF1E6251569D453006B155F /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCF1A33414DDB1EC00852800; + remoteInfo = GPUImage; + }; + BCF1E6301569D454006B155F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF1E6251569D453006B155F /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCF1A34414DDB1EC00852800; + remoteInfo = GPUImageTests; + }; + BCF1E6371569D565006B155F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF1E6251569D453006B155F /* GPUImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BCF1A33314DDB1EC00852800; + remoteInfo = GPUImage; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ + BC18E03E156B354000AB8026 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCF1E6021569D372006B155F /* RawDataTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RawDataTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCF1E6061569D372006B155F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCF1E6081569D372006B155F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; BCF1E60A1569D372006B155F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - BCF1E60E1569D372006B155F /* RawDataTest-Info.plist */ = {isa = PBXFileReference; path = "RawDataTest-Info.plist"; sourceTree = ""; }; + BCF1E60E1569D372006B155F /* RawDataTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RawDataTest-Info.plist"; sourceTree = ""; }; BCF1E6101569D372006B155F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; BCF1E6121569D372006B155F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - BCF1E6141569D372006B155F /* RawDataTest-Prefix.pch */ = {isa = PBXFileReference; path = "RawDataTest-Prefix.pch"; sourceTree = ""; }; - BCF1E6151569D372006B155F /* RawDataTestAppDelegate.h */ = {isa = PBXFileReference; path = RawDataTestAppDelegate.h; sourceTree = ""; }; + BCF1E6141569D372006B155F /* RawDataTest-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RawDataTest-Prefix.pch"; sourceTree = ""; }; + BCF1E6151569D372006B155F /* RawDataTestAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RawDataTestAppDelegate.h; sourceTree = ""; }; BCF1E6161569D372006B155F /* RawDataTestAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RawDataTestAppDelegate.m; sourceTree = ""; }; + BCF1E61D1569D3F8006B155F /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; + BCF1E61F1569D408006B155F /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + BCF1E6211569D42A006B155F /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + BCF1E6221569D42A006B155F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + BCF1E6251569D453006B155F /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCF1E63E156AAB4E006B155F /* CalculationShader.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = CalculationShader.fsh; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -33,6 +71,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BC18E03F156B354000AB8026 /* CoreMedia.framework in Frameworks */, + BC18E03D156B352E00AB8026 /* libGPUImage.a in Frameworks */, + BCF1E6231569D42A006B155F /* OpenGLES.framework in Frameworks */, + BCF1E6241569D42A006B155F /* QuartzCore.framework in Frameworks */, + BCF1E6201569D408006B155F /* AVFoundation.framework in Frameworks */, + BCF1E61E1569D3F8006B155F /* CoreVideo.framework in Frameworks */, BCF1E6071569D372006B155F /* UIKit.framework in Frameworks */, BCF1E6091569D372006B155F /* Foundation.framework in Frameworks */, BCF1E60B1569D372006B155F /* CoreGraphics.framework in Frameworks */, @@ -45,6 +89,7 @@ BCF1E5F71569D372006B155F = { isa = PBXGroup; children = ( + BC18E03E156B354000AB8026 /* CoreMedia.framework */, BCF1E60C1569D372006B155F /* RawDataTest */, BCF1E6051569D372006B155F /* Frameworks */, BCF1E6031569D372006B155F /* Products */, @@ -62,6 +107,11 @@ BCF1E6051569D372006B155F /* Frameworks */ = { isa = PBXGroup; children = ( + BCF1E6251569D453006B155F /* GPUImage.xcodeproj */, + BCF1E6211569D42A006B155F /* OpenGLES.framework */, + BCF1E6221569D42A006B155F /* QuartzCore.framework */, + BCF1E61F1569D408006B155F /* AVFoundation.framework */, + BCF1E61D1569D3F8006B155F /* CoreVideo.framework */, BCF1E6061569D372006B155F /* UIKit.framework */, BCF1E6081569D372006B155F /* Foundation.framework */, BCF1E60A1569D372006B155F /* CoreGraphics.framework */, @@ -74,6 +124,7 @@ children = ( BCF1E6151569D372006B155F /* RawDataTestAppDelegate.h */, BCF1E6161569D372006B155F /* RawDataTestAppDelegate.m */, + BCF1E63E156AAB4E006B155F /* CalculationShader.fsh */, BCF1E60D1569D372006B155F /* Supporting Files */, ); path = RawDataTest; @@ -90,6 +141,15 @@ name = "Supporting Files"; sourceTree = ""; }; + BCF1E6261569D453006B155F /* Products */ = { + isa = PBXGroup; + children = ( + BCF1E62F1569D454006B155F /* libGPUImage.a */, + BCF1E6311569D454006B155F /* GPUImageTests.octest */, + ); + name = Products; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -104,6 +164,7 @@ buildRules = ( ); dependencies = ( + BCF1E6381569D565006B155F /* PBXTargetDependency */, ); name = RawDataTest; productName = RawDataTest; @@ -130,6 +191,12 @@ mainGroup = BCF1E5F71569D372006B155F; productRefGroup = BCF1E6031569D372006B155F /* Products */; projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BCF1E6261569D453006B155F /* Products */; + ProjectRef = BCF1E6251569D453006B155F /* GPUImage.xcodeproj */; + }, + ); projectRoot = ""; targets = ( BCF1E6011569D372006B155F /* RawDataTest */, @@ -137,12 +204,30 @@ }; /* End PBXProject section */ +/* Begin PBXReferenceProxy section */ + BCF1E62F1569D454006B155F /* libGPUImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libGPUImage.a; + remoteRef = BCF1E62E1569D454006B155F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BCF1E6311569D454006B155F /* GPUImageTests.octest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = GPUImageTests.octest; + remoteRef = BCF1E6301569D454006B155F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + /* Begin PBXResourcesBuildPhase section */ BCF1E6001569D372006B155F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( BCF1E6111569D372006B155F /* InfoPlist.strings in Resources */, + BCF1E63F156AAB4E006B155F /* CalculationShader.fsh in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -160,6 +245,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + BCF1E6381569D565006B155F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GPUImage; + targetProxy = BCF1E6371569D565006B155F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ BCF1E60F1569D372006B155F /* InfoPlist.strings */ = { isa = PBXVariantGroup; @@ -180,6 +273,7 @@ CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = "../../framework/**"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -192,6 +286,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 5.1; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -206,11 +301,13 @@ CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + FRAMEWORK_SEARCH_PATHS = "../../framework/**"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 5.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; @@ -260,6 +357,7 @@ BCF1E61C1569D372006B155F /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/examples/RawDataTest/RawDataTest/CalculationShader.fsh b/examples/RawDataTest/RawDataTest/CalculationShader.fsh index e69de29bb..35855c289 100644 --- a/examples/RawDataTest/RawDataTest/CalculationShader.fsh +++ b/examples/RawDataTest/RawDataTest/CalculationShader.fsh @@ -0,0 +1,11 @@ +varying highp vec2 textureCoordinate; + +uniform sampler2D inputImageTexture; +uniform lowp float gamma; + +void main() +{ + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = textureColor; +} diff --git a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h index 5cdc818ed..37497e5ff 100644 --- a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h +++ b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h @@ -1,11 +1,4 @@ -// -// RawDataTestAppDelegate.h -// RawDataTest -// -// Created by Brad Larson on 5/20/2012. -// Copyright (c) 2012 Cell Phone. All rights reserved. -// - +#import "GPUImage.h" #import @interface RawDataTestAppDelegate : UIResponder diff --git a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m index 1194faf6b..1e9b6bcd2 100644 --- a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m +++ b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m @@ -1,11 +1,3 @@ -// -// RawDataTestAppDelegate.m -// RawDataTest -// -// Created by Brad Larson on 5/20/2012. -// Copyright (c) 2012 Cell Phone. All rights reserved. -// - #import "RawDataTestAppDelegate.h" @implementation RawDataTestAppDelegate @@ -18,34 +10,42 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // 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. - // 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. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // 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. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} + + GLubyte *rawDataBytes = calloc(10 * 10 * 4, sizeof(GLubyte)); + for (unsigned int yIndex = 0; yIndex < 10; yIndex++) + { + for (unsigned int xIndex = 0; xIndex < 10; xIndex++) + { + rawDataBytes[yIndex * 10 * 4 + xIndex * 4] = xIndex; + rawDataBytes[yIndex * 10 * 4 + xIndex * 4 + 1] = yIndex; + rawDataBytes[yIndex * 10 * 4 + xIndex * 4 + 2] = 255; + rawDataBytes[yIndex * 10 * 4 + xIndex * 4 + 3] = 0; + } + } + + GPUImageRawDataInput *rawDataInput = [[GPUImageRawDataInput alloc] initWithBytes:rawDataBytes size:CGSizeMake(10.0, 10.0)]; + GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CalculationShader"]; + GPUImageRawDataOutput *rawDataOutput = [[GPUImageRawDataOutput alloc] initWithImageSize:CGSizeMake(10.0, 10.0)]; + + [rawDataInput addTarget:customFilter]; + [customFilter addTarget:rawDataOutput]; + + [rawDataOutput setNewFrameAvailableBlock:^{ + GLubyte *outputBytes = [rawDataOutput rawBytesForImage]; + NSInteger bytesPerRow = [rawDataOutput bytesPerRowInOutput]; + NSLog(@"Bytes per row: %d", bytesPerRow); + for (unsigned int yIndex = 0; yIndex < 10; yIndex++) + { + for (unsigned int xIndex = 0; xIndex < 10; xIndex++) + { + NSLog(@"Byte at (%d, %d): %d, %d, %d, %d", xIndex, yIndex, outputBytes[yIndex * bytesPerRow + xIndex * 4], outputBytes[yIndex * bytesPerRow + xIndex * 4 + 1], outputBytes[yIndex * bytesPerRow + xIndex * 4 + 2], outputBytes[yIndex * bytesPerRow + xIndex * 4 + 3]); + } + } + }]; + + [rawDataInput processData]; -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // 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. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // 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. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + return YES; } @end diff --git a/examples/RawDataTest/RawDataTest/main.m b/examples/RawDataTest/RawDataTest/main.m index 9ee49214f..f42977efc 100644 --- a/examples/RawDataTest/RawDataTest/main.m +++ b/examples/RawDataTest/RawDataTest/main.m @@ -1,11 +1,3 @@ -// -// main.m -// RawDataTest -// -// Created by Brad Larson on 5/20/2012. -// Copyright (c) 2012 Cell Phone. All rights reserved. -// - #import #import "RawDataTestAppDelegate.h" diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 51857e38d..b7217cecf 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -41,8 +41,8 @@ BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; }; - BC1B715714F49DAA00ACA2AB /* GPUImageRawData.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawData.h */; }; - BC1B715814F49DAA00ACA2AB /* GPUImageRawData.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B715614F49DAA00ACA2AB /* GPUImageRawData.m */; }; + BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; }; + BC1B715814F49DAA00ACA2AB /* GPUImageRawDataOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B715614F49DAA00ACA2AB /* GPUImageRawDataOutput.m */; }; BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; }; BC1B717D14F566E200ACA2AB /* GPUImageSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */; }; BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; }; @@ -196,6 +196,8 @@ BCF1E54515669907006B155F /* GPUImageVoroniConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */; }; BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; }; BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */; }; + BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; }; + BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */; }; BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; }; BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; }; @@ -249,8 +251,8 @@ BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3TextureSamplingFilter.m; path = Source/GPUImage3x3TextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputFilter.h; path = Source/GPUImageTwoInputFilter.h; sourceTree = SOURCE_ROOT; }; BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputFilter.m; path = Source/GPUImageTwoInputFilter.m; sourceTree = SOURCE_ROOT; }; - BC1B715514F49DAA00ACA2AB /* GPUImageRawData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawData.h; path = Source/GPUImageRawData.h; sourceTree = SOURCE_ROOT; }; - BC1B715614F49DAA00ACA2AB /* GPUImageRawData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRawData.m; path = Source/GPUImageRawData.m; sourceTree = SOURCE_ROOT; }; + BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataOutput.h; path = Source/GPUImageRawDataOutput.h; sourceTree = SOURCE_ROOT; }; + BC1B715614F49DAA00ACA2AB /* GPUImageRawDataOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRawDataOutput.m; path = Source/GPUImageRawDataOutput.m; sourceTree = SOURCE_ROOT; }; BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSketchFilter.h; path = Source/GPUImageSketchFilter.h; sourceTree = SOURCE_ROOT; }; BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSketchFilter.m; path = Source/GPUImageSketchFilter.m; sourceTree = SOURCE_ROOT; }; BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSwirlFilter.h; path = Source/GPUImageSwirlFilter.h; sourceTree = SOURCE_ROOT; }; @@ -403,6 +405,8 @@ BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVoroniConsumerFilter.m; path = Source/GPUImageVoroniConsumerFilter.m; sourceTree = SOURCE_ROOT; }; BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageToneCurveFilter.h; path = Source/GPUImageToneCurveFilter.h; sourceTree = SOURCE_ROOT; }; BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageToneCurveFilter.m; path = Source/GPUImageToneCurveFilter.m; sourceTree = SOURCE_ROOT; }; + BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataInput.h; path = Source/GPUImageRawDataInput.h; sourceTree = SOURCE_ROOT; }; + BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRawDataInput.m; path = Source/GPUImageRawDataInput.m; sourceTree = SOURCE_ROOT; }; BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTextureInput.h; path = Source/GPUImageTextureInput.h; sourceTree = SOURCE_ROOT; }; BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTextureInput.m; path = Source/GPUImageTextureInput.m; sourceTree = SOURCE_ROOT; }; BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTiltShiftFilter.h; path = Source/GPUImageTiltShiftFilter.h; sourceTree = SOURCE_ROOT; }; @@ -619,6 +623,8 @@ BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */, BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */, BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */, + BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */, + BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */, ); name = Sources; sourceTree = ""; @@ -628,12 +634,12 @@ children = ( BCB5E75A14E2086300701302 /* GPUImageView.h */, BCB5E75B14E2086300701302 /* GPUImageView.m */, - BC1B715514F49DAA00ACA2AB /* GPUImageRawData.h */, - BC1B715614F49DAA00ACA2AB /* GPUImageRawData.m */, BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */, BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */, BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */, BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */, + BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */, + BC1B715614F49DAA00ACA2AB /* GPUImageRawDataOutput.m */, ); name = Outputs; sourceTree = ""; @@ -793,7 +799,7 @@ BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */, BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */, BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */, - BC1B715714F49DAA00ACA2AB /* GPUImageRawData.h in Headers */, + BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */, BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */, BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */, 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */, @@ -858,6 +864,7 @@ BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */, BCF1E54415669907006B155F /* GPUImageVoroniConsumerFilter.h in Headers */, BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */, + BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -997,7 +1004,7 @@ BC982C8214F34F0C0001FF6F /* GPUImageDarkenBlendFilter.m in Sources */, BC982C8414F34F0C0001FF6F /* GPUImageLightenBlendFilter.m in Sources */, BC982CA014F35C2D0001FF6F /* GPUImageToonFilter.m in Sources */, - BC1B715814F49DAA00ACA2AB /* GPUImageRawData.m in Sources */, + BC1B715814F49DAA00ACA2AB /* GPUImageRawDataOutput.m in Sources */, BC1B717D14F566E200ACA2AB /* GPUImageSketchFilter.m in Sources */, BC1B718F14F56C1D00ACA2AB /* GPUImageSwirlFilter.m in Sources */, 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */, @@ -1062,6 +1069,7 @@ BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */, BCF1E54515669907006B155F /* GPUImageVoroniConsumerFilter.m in Sources */, BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */, + BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index ec4d44a6a..f448efa04 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -8,7 +8,8 @@ #import "GPUImageStillCamera.h" #import "GPUImageMovie.h" #import "GPUImagePicture.h" -#import "GPUImageRawData.h" +#import "GPUImageRawDataInput.h" +#import "GPUImageRawDataOutput.h" #import "GPUImageMovieWriter.h" #import "GPUImageFilterPipeline.h" #import "GPUImageTextureOutput.h" diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index 3b3616089..e2d7e37f4 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -42,4 +42,7 @@ // This block is called on the detection of new corner points, usually on every processed frame. A C array containing normalized coordinates in X, Y pairs is passed in, along with a count of the number of corners detected @property(nonatomic, copy) void(^cornersDetectedBlock)(GLfloat* cornerArray, NSUInteger cornersDetected); +// Initialization and teardown +- (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentShader; + @end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 99dd81f03..716826de9 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -33,10 +33,12 @@ void main() mediump float derivativeSum = derivativeElements.x + derivativeElements.y; // This is the Noble variant on the Harris detector, from - // Alison Noble, "Descriptions of Image Surfaces", PhD thesis, Department of Engineering Science, Oxford University 1989, p45. + // Alison Noble, "Descriptions of Image Surfaces", PhD thesis, Department of Engineering Science, Oxford University 1989, p45. + // R = (Ix^2 * Iy^2 - Ixy * Ixy) / (Ix^2 + Iy^2) mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z)) / (derivativeSum); // Original Harris detector + // R = Ix^2 * Iy^2 - Ixy * Ixy - k * (Ix^2 + Iy^2)^2 // highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; // gl_FragColor = vec4(vec3(harrisIntensity * 7.0), 1.0); @@ -66,9 +68,20 @@ void main() @synthesize sensitivity = _sensitivity; @synthesize threshold = _threshold; -//@synthesize intensity = _intensity; +#pragma mark - +#pragma mark Initialization and teardown - (id)init; +{ + if (!(self = [self initWithCornerDetectionFragmentShader:kGPUImageHarrisCornerDetectionFragmentShaderString])) + { + return nil; + } + + return self; +} + +- (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentShader; { if (!(self = [super init])) { @@ -87,7 +100,7 @@ - (id)init; [self addFilter:blurFilter]; // Third pass: apply the Harris corner detection calculation - harrisCornerDetectionFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageHarrisCornerDetectionFragmentShaderString]; + harrisCornerDetectionFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:cornerDetectionFragmentShader]; [self addFilter:harrisCornerDetectionFilter]; // Fourth pass: apply non-maximum suppression to find the local maxima diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h index ced4b4df7..e97c70a1e 100644 --- a/framework/Source/GPUImageRawDataInput.h +++ b/framework/Source/GPUImageRawDataInput.h @@ -1,13 +1,19 @@ -// -// GPUImageRawDataInput.h -// GPUImage -// -// Created by Brad Larson on 5/21/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImageOutput.h" +// The bytes passed into this input are not copied or retained, but you are free to deallocate them after they are used by this filter. +// The bytes are uploaded and stored within a texture, so nothing is kept locally. +// Input bytes are assumed to be in BGRA format. + @interface GPUImageRawDataInput : GPUImageOutput +{ + CGSize uploadedImageSize; +} + +// Initialization and teardown +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; + +// Image rendering +- (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; +- (void)processData; @end diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 9c56a0b52..fd257aa03 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -1,13 +1,63 @@ -// -// GPUImageRawDataInput.m -// GPUImage -// -// Created by Brad Larson on 5/21/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImageRawDataInput.h" +@interface GPUImageRawDataInput() +- (void)uploadBytes:(GLubyte *)bytesToUpload; +@end + @implementation GPUImageRawDataInput +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; +{ + if (!(self = [super init])) + { + return nil; + } + + uploadedImageSize = imageSize; + + [self uploadBytes:bytesToUpload]; + + return self; +} + +#pragma mark - +#pragma mark Image rendering + +- (void)uploadBytes:(GLubyte *)bytesToUpload; +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, bytesToUpload); +} + +- (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; +{ + uploadedImageSize = imageSize; + + [self uploadBytes:bytesToUpload]; +} + +- (void)processData; +{ + CGSize pixelSizeOfImage = [self outputImageSize]; + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; + } +} + +- (CGSize)outputImageSize; +{ + return uploadedImageSize; +} + @end diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index d8eb8ca66..8f492c3be 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -11,24 +11,21 @@ typedef struct GPUByteColorVector GPUByteColorVector; @protocol GPUImageRawDataProcessor; -@interface GPUImageRawData : NSObject { +@interface GPUImageRawDataOutput : NSObject { CGSize imageSize; CVOpenGLESTextureCacheRef rawDataTextureCache; CVPixelBufferRef renderTarget; GPUImageRotationMode inputRotation; } -@property(readwrite, unsafe_unretained, nonatomic) id delegate; @property(readonly) GLubyte *rawBytesForImage; +@property(nonatomic, copy) void(^newFrameAvailableBlock)(void); // Initialization and teardown - (id)initWithImageSize:(CGSize)newImageSize; // Data access - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; +- (NSUInteger)bytesPerRowInOutput; -@end - -@protocol GPUImageRawDataProcessor -- (void)newImageFrameAvailableFromDataSource:(GPUImageRawData *)rawDataSource; @end \ No newline at end of file diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 6e38a4429..93cf916ed 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -1,10 +1,10 @@ -#import "GPUImageRawData.h" +#import "GPUImageRawDataOutput.h" #import "GPUImageOpenGLESContext.h" #import "GLProgram.h" #import "GPUImageFilter.h" -@interface GPUImageRawData () +@interface GPUImageRawDataOutput () { BOOL hasReadFromTheCurrentFrame; @@ -29,10 +29,10 @@ - (void)renderAtInternalSize; @end -@implementation GPUImageRawData +@implementation GPUImageRawDataOutput @synthesize rawBytesForImage = _rawBytesForImage; -@synthesize delegate = _delegate; +@synthesize newFrameAvailableBlock = _newFrameAvailableBlock; #pragma mark - #pragma mark Initialization and teardown @@ -82,7 +82,7 @@ - (void)dealloc { [self destroyDataFBO]; - if (_rawBytesForImage != NULL) + if (_rawBytesForImage != NULL && (![GPUImageOpenGLESContext supportsFastTextureUpload])) { free(_rawBytesForImage); _rawBytesForImage = NULL; @@ -218,10 +218,10 @@ - (void)renderAtInternalSize; }; static const GLfloat textureCoordinates[] = { - 0.0f, 1.0f, - 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, }; glActiveTexture(GL_TEXTURE4); @@ -278,7 +278,11 @@ - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; - (void)newFrameReadyAtTime:(CMTime)frameTime; { hasReadFromTheCurrentFrame = NO; - [self.delegate newImageFrameAvailableFromDataSource:self]; + + if (_newFrameAvailableBlock != NULL) + { + _newFrameAvailableBlock(); + } } - (NSInteger)nextAvailableTextureIndex; @@ -344,6 +348,7 @@ - (GLubyte *)rawBytesForImage; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { + glFinish(); CVPixelBufferLockBaseAddress(renderTarget, 0); _rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); } @@ -354,7 +359,18 @@ - (GLubyte *)rawBytesForImage; return _rawBytesForImage; } - +} + +- (NSUInteger)bytesPerRowInOutput; +{ + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + return CVPixelBufferGetBytesPerRow(renderTarget); + } + else + { + return imageSize.width; + } } @end diff --git a/framework/Source/GPUImageXYDerivativeFilter.m b/framework/Source/GPUImageXYDerivativeFilter.m index fdbcae913..3ff679b1a 100755 --- a/framework/Source/GPUImageXYDerivativeFilter.m +++ b/framework/Source/GPUImageXYDerivativeFilter.m @@ -36,8 +36,8 @@ void main() // float verticalDerivative = abs(-topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity); // float horizontalDerivative = abs(-bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity); - float verticalDerivative = abs(-topIntensity + bottomIntensity); - float horizontalDerivative = abs(-leftIntensity + rightIntensity); + float verticalDerivative = -topIntensity + bottomIntensity; + float horizontalDerivative = -leftIntensity + rightIntensity; gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, verticalDerivative * horizontalDerivative, 1.0); } From a764390eb68053f135bdd679f1f4dec7b85f7351 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 22 May 2012 10:38:33 -0500 Subject: [PATCH 107/695] Added a blur size property to the box blur, and modified the adaptive threshold to use it. --- .../ShowcaseFilterViewController.m | 7 ++++- .../Source/GPUImageAdaptiveThresholdFilter.h | 4 +++ .../Source/GPUImageAdaptiveThresholdFilter.m | 24 +++++++++++++++- framework/Source/GPUImageBoxBlurFilter.h | 5 +++- framework/Source/GPUImageBoxBlurFilter.m | 28 +++++++++++++++++-- 5 files changed, 62 insertions(+), 6 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 1399aa207..fa4588d05 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -254,7 +254,11 @@ - (void)setupFilter; case GPUIMAGE_ADAPTIVETHRESHOLD: { self.title = @"Adaptive Threshold"; - self.filterSettingsSlider.hidden = YES; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:1.0]; + [self.filterSettingsSlider setMaximumValue:20.0]; + [self.filterSettingsSlider setValue:1.0]; filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; }; break; @@ -900,6 +904,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_POSTERIZE: [(GPUImagePosterizeFilter *)filter setColorLevels:round([(UISlider*)sender value])]; break; case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)filter setDistance:[(UISlider *)sender value]]; break; case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)filter setThreshold:[(UISlider *)sender value]]; break; + case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)filter setRadius:round([(UISlider *)sender value])]; break; diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.h b/framework/Source/GPUImageAdaptiveThresholdFilter.h index f78e0af3c..7d9f031f8 100755 --- a/framework/Source/GPUImageAdaptiveThresholdFilter.h +++ b/framework/Source/GPUImageAdaptiveThresholdFilter.h @@ -2,4 +2,8 @@ @interface GPUImageAdaptiveThresholdFilter : GPUImageFilterGroup +/** A multiplier for the background averaging blur size, ranging from 0.0 on up, with a default of 1.0 + */ +@property(readwrite, nonatomic) CGFloat blurSize; + @end diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.m b/framework/Source/GPUImageAdaptiveThresholdFilter.m index b3f533249..ace335b3f 100755 --- a/framework/Source/GPUImageAdaptiveThresholdFilter.m +++ b/framework/Source/GPUImageAdaptiveThresholdFilter.m @@ -24,8 +24,17 @@ void main() } ); +@interface GPUImageAdaptiveThresholdFilter() +{ + GPUImageBoxBlurFilter *boxBlurFilter; +} +@end + @implementation GPUImageAdaptiveThresholdFilter +#pragma mark - +#pragma mark Initialization and teardown + - (id)init; { if (!(self = [super init])) @@ -38,7 +47,7 @@ - (id)init; [self addFilter:luminanceFilter]; // Second pass: perform a box blur - GPUImageBoxBlurFilter *boxBlurFilter = [[GPUImageBoxBlurFilter alloc] init]; + boxBlurFilter = [[GPUImageBoxBlurFilter alloc] init]; [self addFilter:boxBlurFilter]; // Third pass: compare the blurred background luminance to the local value @@ -58,4 +67,17 @@ - (id)init; return self; } +#pragma mark - +#pragma mark Accessors + +- (void)setBlurSize:(CGFloat)newValue; +{ + boxBlurFilter.blurSize = newValue; +} + +- (CGFloat)blurSize; +{ + return boxBlurFilter.blurSize; +} + @end diff --git a/framework/Source/GPUImageBoxBlurFilter.h b/framework/Source/GPUImageBoxBlurFilter.h index 9dc6268df..ecf0df37c 100755 --- a/framework/Source/GPUImageBoxBlurFilter.h +++ b/framework/Source/GPUImageBoxBlurFilter.h @@ -4,7 +4,10 @@ */ @interface GPUImageBoxBlurFilter : GPUImageTwoPassFilter { - GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, blurSizeUniform; + GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, firstBlurSizeUniform, secondBlurSizeUniform; } +/// A scaling for the size of the applied blur, default of 1.0 +@property(readwrite, nonatomic) CGFloat blurSize; + @end diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index a8de30f43..72175f66f 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -7,7 +7,8 @@ uniform float texelWidthOffset; uniform float texelHeightOffset; - + uniform highp float blurSize; + varying vec2 centerTextureCoordinate; varying vec2 oneStepLeftTextureCoordinate; varying vec2 twoStepsLeftTextureCoordinate; @@ -18,8 +19,8 @@ void main() { gl_Position = position; - vec2 firstOffset = vec2(1.5 * texelWidthOffset, 1.5 * texelHeightOffset); - vec2 secondOffset = vec2(3.5 * texelWidthOffset, 3.5 * texelHeightOffset); + vec2 firstOffset = vec2(1.5 * texelWidthOffset, 1.5 * texelHeightOffset) * blurSize; + vec2 secondOffset = vec2(3.5 * texelWidthOffset, 3.5 * texelHeightOffset) * blurSize; centerTextureCoordinate = inputTextureCoordinate; oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset; @@ -56,6 +57,8 @@ void main() @implementation GPUImageBoxBlurFilter +@synthesize blurSize = _blurSize; + #pragma mark - #pragma mark Initialization and teardown @@ -68,10 +71,14 @@ - (id)init; verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + firstBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + secondBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; + self.blurSize = 1.0; + return self; } @@ -95,5 +102,20 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); } +#pragma mark - +#pragma mark Accessors + +- (void)setBlurSize:(CGFloat)newValue; +{ + _blurSize = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(firstBlurSizeUniform, _blurSize); + + [secondFilterProgram use]; + glUniform1f(secondBlurSizeUniform, _blurSize); +} + @end From d84a7020c7344de872056ea4e158101db11f91ae Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 22 May 2012 21:19:32 -0500 Subject: [PATCH 108/695] Added ability to control whether raw bytes are read out as BGRA or RGBA, made that consistent across iOS versions. --- .../ColorTrackingViewController.m | 4 ++-- .../RawDataTest.xcodeproj/project.pbxproj | 4 ++-- .../RawDataTest/RawDataTestAppDelegate.m | 2 +- framework/Source/GPUImageMovieWriter.h | 2 ++ framework/Source/GPUImageRawDataOutput.h | 3 ++- framework/Source/GPUImageRawDataOutput.m | 21 +++++++++++++------ 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index 2c5f87bb8..1e5a837e6 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -66,7 +66,7 @@ - (void)configureVideoFiltering; CGSize videoPixelSize = CGSizeMake(480.0, 640.0); - positionRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize]; + positionRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize resultsInBGRAFormat:YES]; __unsafe_unretained ColorTrackingViewController *weakSelf = self; [positionRawData setNewFrameAvailableBlock:^{ GLubyte *bytesForPositionData = positionRawData.rawBytesForImage; @@ -75,7 +75,7 @@ - (void)configureVideoFiltering; trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); }]; - videoRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize]; + videoRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize resultsInBGRAFormat:YES]; [videoRawData setNewFrameAvailableBlock:^{ if (shouldReplaceThresholdColor) { diff --git a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj b/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj index f75b7a294..886dfaeb5 100644 --- a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj +++ b/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj @@ -287,7 +287,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../framework/**"; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 4.1; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -308,7 +308,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../framework/**"; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 4.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m index 1e9b6bcd2..476f4a651 100644 --- a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m +++ b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m @@ -25,7 +25,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( GPUImageRawDataInput *rawDataInput = [[GPUImageRawDataInput alloc] initWithBytes:rawDataBytes size:CGSizeMake(10.0, 10.0)]; GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CalculationShader"]; - GPUImageRawDataOutput *rawDataOutput = [[GPUImageRawDataOutput alloc] initWithImageSize:CGSizeMake(10.0, 10.0)]; + GPUImageRawDataOutput *rawDataOutput = [[GPUImageRawDataOutput alloc] initWithImageSize:CGSizeMake(10.0, 10.0) resultsInBGRAFormat:YES]; [rawDataInput addTarget:customFilter]; [customFilter addTarget:rawDataOutput]; diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 34c63bedb..4e2891191 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -2,6 +2,8 @@ #import #import "GPUImageOpenGLESContext.h" +extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; + @protocol GPUImageMovieWriterDelegate @optional diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index 8f492c3be..6cd1c2a3a 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -16,13 +16,14 @@ typedef struct GPUByteColorVector GPUByteColorVector; CVOpenGLESTextureCacheRef rawDataTextureCache; CVPixelBufferRef renderTarget; GPUImageRotationMode inputRotation; + BOOL outputBGRA; } @property(readonly) GLubyte *rawBytesForImage; @property(nonatomic, copy) void(^newFrameAvailableBlock)(void); // Initialization and teardown -- (id)initWithImageSize:(CGSize)newImageSize; +- (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsInBGRAFormat; // Data access - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 93cf916ed..5b69e11ae 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -3,6 +3,7 @@ #import "GPUImageOpenGLESContext.h" #import "GLProgram.h" #import "GPUImageFilter.h" +#import "GPUImageMovieWriter.h" @interface GPUImageRawDataOutput () { @@ -37,20 +38,28 @@ @implementation GPUImageRawDataOutput #pragma mark - #pragma mark Initialization and teardown -- (id)initWithImageSize:(CGSize)newImageSize; +- (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsInBGRAFormat; { if (!(self = [super init])) { return nil; } + outputBGRA = resultsInBGRAFormat; imageSize = newImageSize; hasReadFromTheCurrentFrame = NO; _rawBytesForImage = NULL; inputRotation = kGPUImageNoRotation; [GPUImageOpenGLESContext useImageProcessingContext]; - dataProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + if ( (outputBGRA && ![GPUImageOpenGLESContext supportsFastTextureUpload]) || (!outputBGRA && [GPUImageOpenGLESContext supportsFastTextureUpload]) ) + { + dataProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + } + else + { + dataProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + } [dataProgram addAttribute:@"position"]; [dataProgram addAttribute:@"inputTextureCoordinate"]; @@ -254,10 +263,8 @@ - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; locationToPickFrom.x = MIN(MAX(locationInImage.x, 0.0), (imageSize.width - 1.0)); locationToPickFrom.y = MIN(MAX((imageSize.height - locationInImage.y), 0.0), (imageSize.height - 1.0)); - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if (outputBGRA) { - // When reading directly from the texture using the fast texture cache, values are in BGRA, not RGBA - GPUByteColorVector flippedColor = imageColorBytes[(int)(round((locationToPickFrom.y * imageSize.width) + locationToPickFrom.x))]; GLubyte temporaryRed = flippedColor.red; @@ -355,6 +362,8 @@ - (GLubyte *)rawBytesForImage; else { glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); + // GL_EXT_read_format_bgra +// glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); } return _rawBytesForImage; @@ -369,7 +378,7 @@ - (NSUInteger)bytesPerRowInOutput; } else { - return imageSize.width; + return imageSize.width * 4; } } From d8829a36b0731316319e45ca6b131484f5950ec2 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 23 May 2012 23:16:37 -0500 Subject: [PATCH 109/695] Added a test application for feature extraction operations. Improved the sensitivity of the Harris corner detector. --- .../project.pbxproj | 363 ++++++++++++++++++ .../FeatureExtractionTest/71yih.png | Bin 0 -> 3132 bytes .../FeatureExtractionAppDelegate.h | 11 + .../FeatureExtractionAppDelegate.m | 73 ++++ .../FeatureExtractionTest-Info.plist | 47 +++ .../FeatureExtractionTest-Prefix.pch | 14 + .../en.lproj/InfoPlist.strings | 2 + .../FeatureExtractionTest/main.m | 10 + .../ShowcaseFilterViewController.m | 6 +- .../GPUImageHarrisCornerDetectionFilter.h | 9 +- .../GPUImageHarrisCornerDetectionFilter.m | 63 ++- framework/Source/GPUImageRGBFilter.h | 2 +- framework/Source/GPUImageXYDerivativeFilter.m | 12 +- 13 files changed, 593 insertions(+), 19 deletions(-) create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/71yih.png create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/en.lproj/InfoPlist.strings create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/main.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj new file mode 100644 index 000000000..894ea2799 --- /dev/null +++ b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -0,0 +1,363 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BC18E09B156C822E00AB8026 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E09A156C822E00AB8026 /* UIKit.framework */; }; + BC18E09D156C822E00AB8026 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E09C156C822E00AB8026 /* Foundation.framework */; }; + BC18E09F156C822E00AB8026 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E09E156C822E00AB8026 /* CoreGraphics.framework */; }; + BC18E0A5156C822E00AB8026 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0A3156C822E00AB8026 /* InfoPlist.strings */; }; + BC18E0A7156C822E00AB8026 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BC18E0A6156C822E00AB8026 /* main.m */; }; + BC18E0AB156C822E00AB8026 /* FeatureExtractionAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BC18E0AA156C822E00AB8026 /* FeatureExtractionAppDelegate.m */; }; + BC18E0C0156C833800AB8026 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0BB156C830F00AB8026 /* libGPUImage.a */; }; + BC18E0C4156C835500AB8026 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C1156C835500AB8026 /* CoreMedia.framework */; }; + BC18E0C5156C835500AB8026 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C2156C835500AB8026 /* CoreVideo.framework */; }; + BC18E0C6156C835500AB8026 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C3156C835500AB8026 /* QuartzCore.framework */; }; + BC18E0C8156C835E00AB8026 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C7156C835E00AB8026 /* OpenGLES.framework */; }; + BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C9156C836400AB8026 /* AVFoundation.framework */; }; + BC18E0CC156C881700AB8026 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0CB156C881700AB8026 /* 71yih.png */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BC18E0BA156C830F00AB8026 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCF1A33414DDB1EC00852800; + remoteInfo = GPUImage; + }; + BC18E0BC156C830F00AB8026 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCF1A34414DDB1EC00852800; + remoteInfo = GPUImageTests; + }; + BC18E0BE156C832900AB8026 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BCF1A33314DDB1EC00852800; + remoteInfo = GPUImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + BC18E096156C822E00AB8026 /* FeatureExtractionTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FeatureExtractionTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BC18E09A156C822E00AB8026 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + BC18E09C156C822E00AB8026 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + BC18E09E156C822E00AB8026 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + BC18E0A2156C822E00AB8026 /* FeatureExtractionTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "FeatureExtractionTest-Info.plist"; sourceTree = ""; }; + BC18E0A4156C822E00AB8026 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + BC18E0A6156C822E00AB8026 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + BC18E0A8156C822E00AB8026 /* FeatureExtractionTest-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FeatureExtractionTest-Prefix.pch"; sourceTree = ""; }; + BC18E0A9156C822E00AB8026 /* FeatureExtractionAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FeatureExtractionAppDelegate.h; sourceTree = ""; }; + BC18E0AA156C822E00AB8026 /* FeatureExtractionAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FeatureExtractionAppDelegate.m; sourceTree = ""; }; + BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BC18E0C1156C835500AB8026 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + BC18E0C2156C835500AB8026 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; + BC18E0C3156C835500AB8026 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + BC18E0C7156C835E00AB8026 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + BC18E0C9156C836400AB8026 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + BC18E0CB156C881700AB8026 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BC18E093156C822E00AB8026 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */, + BC18E0C8156C835E00AB8026 /* OpenGLES.framework in Frameworks */, + BC18E0C4156C835500AB8026 /* CoreMedia.framework in Frameworks */, + BC18E0C5156C835500AB8026 /* CoreVideo.framework in Frameworks */, + BC18E0C6156C835500AB8026 /* QuartzCore.framework in Frameworks */, + BC18E0C0156C833800AB8026 /* libGPUImage.a in Frameworks */, + BC18E09B156C822E00AB8026 /* UIKit.framework in Frameworks */, + BC18E09D156C822E00AB8026 /* Foundation.framework in Frameworks */, + BC18E09F156C822E00AB8026 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BC18E08B156C822E00AB8026 = { + isa = PBXGroup; + children = ( + BC18E0A0156C822E00AB8026 /* FeatureExtractionTest */, + BC18E099156C822E00AB8026 /* Frameworks */, + BC18E097156C822E00AB8026 /* Products */, + ); + sourceTree = ""; + }; + BC18E097156C822E00AB8026 /* Products */ = { + isa = PBXGroup; + children = ( + BC18E096156C822E00AB8026 /* FeatureExtractionTest.app */, + ); + name = Products; + sourceTree = ""; + }; + BC18E099156C822E00AB8026 /* Frameworks */ = { + isa = PBXGroup; + children = ( + BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */, + BC18E09A156C822E00AB8026 /* UIKit.framework */, + BC18E09C156C822E00AB8026 /* Foundation.framework */, + BC18E09E156C822E00AB8026 /* CoreGraphics.framework */, + BC18E0C9156C836400AB8026 /* AVFoundation.framework */, + BC18E0C7156C835E00AB8026 /* OpenGLES.framework */, + BC18E0C1156C835500AB8026 /* CoreMedia.framework */, + BC18E0C2156C835500AB8026 /* CoreVideo.framework */, + BC18E0C3156C835500AB8026 /* QuartzCore.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + BC18E0A0156C822E00AB8026 /* FeatureExtractionTest */ = { + isa = PBXGroup; + children = ( + BC18E0A9156C822E00AB8026 /* FeatureExtractionAppDelegate.h */, + BC18E0AA156C822E00AB8026 /* FeatureExtractionAppDelegate.m */, + BC18E0A1156C822E00AB8026 /* Supporting Files */, + ); + path = FeatureExtractionTest; + sourceTree = ""; + }; + BC18E0A1156C822E00AB8026 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BC18E0CB156C881700AB8026 /* 71yih.png */, + BC18E0A2156C822E00AB8026 /* FeatureExtractionTest-Info.plist */, + BC18E0A3156C822E00AB8026 /* InfoPlist.strings */, + BC18E0A6156C822E00AB8026 /* main.m */, + BC18E0A8156C822E00AB8026 /* FeatureExtractionTest-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BC18E0B2156C830F00AB8026 /* Products */ = { + isa = PBXGroup; + children = ( + BC18E0BB156C830F00AB8026 /* libGPUImage.a */, + BC18E0BD156C830F00AB8026 /* GPUImageTests.octest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BC18E095156C822E00AB8026 /* FeatureExtractionTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = BC18E0AE156C822E00AB8026 /* Build configuration list for PBXNativeTarget "FeatureExtractionTest" */; + buildPhases = ( + BC18E092156C822E00AB8026 /* Sources */, + BC18E093156C822E00AB8026 /* Frameworks */, + BC18E094156C822E00AB8026 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BC18E0BF156C832900AB8026 /* PBXTargetDependency */, + ); + name = FeatureExtractionTest; + productName = FeatureExtractionTest; + productReference = BC18E096156C822E00AB8026 /* FeatureExtractionTest.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BC18E08D156C822E00AB8026 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = FeatureExtraction; + LastUpgradeCheck = 0430; + ORGANIZATIONNAME = "Cell Phone"; + }; + buildConfigurationList = BC18E090156C822E00AB8026 /* Build configuration list for PBXProject "FeatureExtractionTest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = BC18E08B156C822E00AB8026; + productRefGroup = BC18E097156C822E00AB8026 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BC18E0B2156C830F00AB8026 /* Products */; + ProjectRef = BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + BC18E095156C822E00AB8026 /* FeatureExtractionTest */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + BC18E0BB156C830F00AB8026 /* libGPUImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libGPUImage.a; + remoteRef = BC18E0BA156C830F00AB8026 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BC18E0BD156C830F00AB8026 /* GPUImageTests.octest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = GPUImageTests.octest; + remoteRef = BC18E0BC156C830F00AB8026 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + BC18E094156C822E00AB8026 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC18E0A5156C822E00AB8026 /* InfoPlist.strings in Resources */, + BC18E0CC156C881700AB8026 /* 71yih.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BC18E092156C822E00AB8026 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC18E0A7156C822E00AB8026 /* main.m in Sources */, + BC18E0AB156C822E00AB8026 /* FeatureExtractionAppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BC18E0BF156C832900AB8026 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GPUImage; + targetProxy = BC18E0BE156C832900AB8026 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + BC18E0A3156C822E00AB8026 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + BC18E0A4156C822E00AB8026 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BC18E0AC156C822E00AB8026 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "../../framework/**"; + IPHONEOS_DEPLOYMENT_TARGET = 4.0; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + BC18E0AD156C822E00AB8026 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "../../framework/**"; + IPHONEOS_DEPLOYMENT_TARGET = 4.0; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + BC18E0AF156C822E00AB8026 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "FeatureExtractionTest/FeatureExtractionTest-Prefix.pch"; + INFOPLIST_FILE = "FeatureExtractionTest/FeatureExtractionTest-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + BC18E0B0156C822E00AB8026 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "FeatureExtractionTest/FeatureExtractionTest-Prefix.pch"; + INFOPLIST_FILE = "FeatureExtractionTest/FeatureExtractionTest-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BC18E090156C822E00AB8026 /* Build configuration list for PBXProject "FeatureExtractionTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC18E0AC156C822E00AB8026 /* Debug */, + BC18E0AD156C822E00AB8026 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BC18E0AE156C822E00AB8026 /* Build configuration list for PBXNativeTarget "FeatureExtractionTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC18E0AF156C822E00AB8026 /* Debug */, + BC18E0B0156C822E00AB8026 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BC18E08D156C822E00AB8026 /* Project object */; +} diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/71yih.png b/examples/FeatureExtractionTest/FeatureExtractionTest/71yih.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c5603d4b469b553272b0e274624ac497688424 GIT binary patch literal 3132 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 WISvB(6mYx%0000 +#import "GPUImage.h" + +@interface FeatureExtractionAppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +- (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput; +- (void)saveImage:(UIImage *)imageToSave fileName:(NSString *)imageName; + +@end diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m new file mode 100644 index 000000000..6ae880630 --- /dev/null +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -0,0 +1,73 @@ +#import "FeatureExtractionAppDelegate.h" + +@implementation FeatureExtractionAppDelegate + +@synthesize window = _window; + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + // Override point for customization after application launch. + self.window.backgroundColor = [UIColor whiteColor]; + [self.window makeKeyAndVisible]; + + UIImage *inputImage = [UIImage imageNamed:@"71yih.png"]; + GPUImagePicture *blackAndWhiteBoxImage = [[GPUImagePicture alloc] initWithImage:inputImage]; + + [self testHarrisCornerDetectorAgainstPicture:blackAndWhiteBoxImage]; + + return YES; +} + +- (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput; +{ + [pictureInput removeAllTargets]; + + GPUImageHarrisCornerDetectionFilter *harrisCornerFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; + [pictureInput addTarget:harrisCornerFilter]; + + GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; + crosshairGenerator.crosshairWidth = 5.0; + [crosshairGenerator forceProcessingAtSize:[pictureInput outputImageSize]]; + + [harrisCornerFilter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected) { + [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected]; + }]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [pictureInput addTarget:blendFilter]; + pictureInput.targetToIgnoreForUpdates = blendFilter; + + [crosshairGenerator addTarget:blendFilter]; + + [blendFilter prepareForImageCapture]; + [pictureInput processImage]; + + NSUInteger currentImageIndex = 0; + for (UIImage *currentImage in harrisCornerFilter.intermediateImages) + { + [self saveImage:currentImage fileName:[NSString stringWithFormat:@"Harris-%d.png", currentImageIndex]]; + + currentImageIndex++; + } + + UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput]; + + [self saveImage:crosshairResult fileName:@"Harris-Crosshairs.png"]; +} + +- (void)saveImage:(UIImage *)imageToSave fileName:(NSString *)imageName; +{ + NSData *dataForPNGFile = UIImagePNGRepresentation(imageToSave); + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSError *error = nil; + if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:imageName] options:NSAtomicWrite error:&error]) + { + return; + } +} + +@end diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist new file mode 100644 index 000000000..3559393ab --- /dev/null +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + UIFileSharingEnabled + + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch new file mode 100644 index 000000000..00b7b2293 --- /dev/null +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'FeatureExtractionTest' target in the 'FeatureExtractionTest' project +// + +#import + +#ifndef __IPHONE_3_0 +#warning "This project uses features only available in iOS SDK 3.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/en.lproj/InfoPlist.strings b/examples/FeatureExtractionTest/FeatureExtractionTest/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/main.m b/examples/FeatureExtractionTest/FeatureExtractionTest/main.m new file mode 100644 index 000000000..b513ae53f --- /dev/null +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/main.m @@ -0,0 +1,10 @@ +#import + +#import "FeatureExtractionAppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([FeatureExtractionAppDelegate class])); + } +} diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index fa4588d05..4c7fd33f9 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -334,11 +334,11 @@ - (void)setupFilter; self.filterSettingsSlider.hidden = NO; [self.filterSettingsSlider setMinimumValue:0.01]; - [self.filterSettingsSlider setMaximumValue:0.20]; - [self.filterSettingsSlider setValue:0.05]; + [self.filterSettingsSlider setMaximumValue:0.70]; + [self.filterSettingsSlider setValue:0.20]; filter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; - [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:0.05]; + [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:0.20]; }; break; case GPUIMAGE_PREWITTEDGEDETECTION: { diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index e2d7e37f4..d3bf81154 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -6,6 +6,8 @@ @class GPUImageFastBlurFilter; @class GPUImageNonMaximumSuppressionFilter; +//#define DEBUGFEATUREDETECTION + /** Harris corner detector First pass: reduce to luminance and take the derivative of the luminance texture (GPUImageXYDerivativeFilter) @@ -33,15 +35,18 @@ */ @property(readwrite, nonatomic) CGFloat blurSize; -// This changes the dynamic range of the Harris corner detector by amplifying small cornerness values. Default is 10.0. +// This changes the dynamic range of the Harris corner detector by amplifying small cornerness values. Default is 5.0. @property(readwrite, nonatomic) CGFloat sensitivity; -// A threshold value at which a point is recognized as being a corner after the non-maximum suppression. Default is 0.05. +// A threshold value at which a point is recognized as being a corner after the non-maximum suppression. Default is 0.20. @property(readwrite, nonatomic) CGFloat threshold; // This block is called on the detection of new corner points, usually on every processed frame. A C array containing normalized coordinates in X, Y pairs is passed in, along with a count of the number of corners detected @property(nonatomic, copy) void(^cornersDetectedBlock)(GLfloat* cornerArray, NSUInteger cornersDetected); +// These images are only enabled when built with DEBUGFEATUREDETECTION defined, and are used to examine the intermediate states of the feature detector +@property(nonatomic, readonly, strong) NSMutableArray *intermediateImages; + // Initialization and teardown - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentShader; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 716826de9..0ca346e11 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -35,7 +35,9 @@ void main() // This is the Noble variant on the Harris detector, from // Alison Noble, "Descriptions of Image Surfaces", PhD thesis, Department of Engineering Science, Oxford University 1989, p45. // R = (Ix^2 * Iy^2 - Ixy * Ixy) / (Ix^2 + Iy^2) - mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z)) / (derivativeSum); + mediump float zElement = (derivativeElements.z * 2.0) - 1.0; +// mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z)) / (derivativeSum); + mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (zElement * zElement)) / (derivativeSum); // Original Harris detector // R = Ix^2 * Iy^2 - Ixy * Ixy - k * (Ix^2 + Iy^2)^2 @@ -67,6 +69,7 @@ void main() @synthesize cornersDetectedBlock; @synthesize sensitivity = _sensitivity; @synthesize threshold = _threshold; +@synthesize intermediateImages = _intermediateImages; #pragma mark - #pragma mark Initialization and teardown @@ -88,31 +91,75 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS return nil; } +#ifdef DEBUGFEATUREDETECTION + _intermediateImages = [[NSMutableArray alloc] init]; +#endif + // First pass: reduce to luminance and take the derivative of the luminance texture derivativeFilter = [[GPUImageXYDerivativeFilter alloc] init]; // derivativeFilter.imageWidthFactor = 256.0; // derivativeFilter.imageHeightFactor = 256.0; [self addFilter:derivativeFilter]; - + +#ifdef DEBUGFEATUREDETECTION + __unsafe_unretained NSMutableArray *weakIntermediateImages = _intermediateImages; + __unsafe_unretained GPUImageFilter *weakFilter = derivativeFilter; + [derivativeFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter){ + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + }]; +#endif + // Second pass: blur the derivative // blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; blurFilter = [[GPUImageFastBlurFilter alloc] init]; [self addFilter:blurFilter]; +#ifdef DEBUGFEATUREDETECTION + weakFilter = blurFilter; + [blurFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter){ + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + }]; +#endif + // Third pass: apply the Harris corner detection calculation harrisCornerDetectionFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:cornerDetectionFragmentShader]; [self addFilter:harrisCornerDetectionFilter]; - + +#ifdef DEBUGFEATUREDETECTION + weakFilter = harrisCornerDetectionFilter; + [harrisCornerDetectionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter){ + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + }]; +#endif + // Fourth pass: apply non-maximum suppression to find the local maxima nonMaximumSuppressionFilter = [[GPUImageNonMaximumSuppressionFilter alloc] init]; [self addFilter:nonMaximumSuppressionFilter]; - + +#ifdef DEBUGFEATUREDETECTION + weakFilter = nonMaximumSuppressionFilter; + [nonMaximumSuppressionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter){ + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + }]; +#endif + // Fifth pass: threshold the result simpleThresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageSimpleThresholdFragmentShaderString]; [self addFilter:simpleThresholdFilter]; - + +#ifdef DEBUGFEATUREDETECTION + weakFilter = simpleThresholdFilter; + [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter){ + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + }]; +#endif + __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; - [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter) { [weakSelf extractCornerLocationsFromImage]; }]; @@ -128,8 +175,8 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS self.terminalFilter = simpleThresholdFilter; self.blurSize = 1.0; - self.sensitivity = 10.0; - self.threshold = 0.05; + self.sensitivity = 5.0; + self.threshold = 0.20; return self; } diff --git a/framework/Source/GPUImageRGBFilter.h b/framework/Source/GPUImageRGBFilter.h index f047761db..4d64ef503 100755 --- a/framework/Source/GPUImageRGBFilter.h +++ b/framework/Source/GPUImageRGBFilter.h @@ -9,6 +9,6 @@ @property (readwrite, nonatomic) CGFloat red; @property (readwrite, nonatomic) CGFloat green; -@property (readwrite, nonatomic) CGFloat blue; +@property (readwrite, nonatomic) CGFloat blue; @end \ No newline at end of file diff --git a/framework/Source/GPUImageXYDerivativeFilter.m b/framework/Source/GPUImageXYDerivativeFilter.m index 3ff679b1a..aaecaab1a 100755 --- a/framework/Source/GPUImageXYDerivativeFilter.m +++ b/framework/Source/GPUImageXYDerivativeFilter.m @@ -1,6 +1,7 @@ #import "GPUImageXYDerivativeFilter.h" // I'm using the Prewitt operator to obtain the derivative, then squaring the X and Y components and placing the product of the two in Z. +// In tests, Prewitt seemed to be tied with Sobel for the best, and it's just a little cheaper to compute. // This is primarily intended to be used with corner detection filters. @implementation GPUImageXYDerivativeFilter @@ -34,12 +35,13 @@ void main() float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; -// float verticalDerivative = abs(-topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity); -// float horizontalDerivative = abs(-bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity); - float verticalDerivative = -topIntensity + bottomIntensity; - float horizontalDerivative = -leftIntensity + rightIntensity; + float verticalDerivative = -topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity; + float horizontalDerivative = -bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity; +// float verticalDerivative = -topIntensity + bottomIntensity; +// float horizontalDerivative = -leftIntensity + rightIntensity; - gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, verticalDerivative * horizontalDerivative, 1.0); + // Scaling the X * Y operation so that negative numbers are not clipped in the 0..1 range. This will be expanded in the corner detection filter + gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, ((verticalDerivative * horizontalDerivative) + 1.0) / 2.0, 1.0); } ); From bc0a7d1d1aaa61c4c5b26ee1e80e606cc36f71b4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 24 May 2012 22:42:50 -0500 Subject: [PATCH 110/695] Split out the Noble variant of the Harris corner detector and added the Shi-Tomasi feature detector. --- .../FeatureExtractionAppDelegate.h | 5 +- .../FeatureExtractionAppDelegate.m | 37 +++++++++++---- .../ShowcaseFilterListController.m | 2 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 28 ++++++++++- framework/GPUImage.xcodeproj/project.pbxproj | 16 +++++++ framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageFilterGroup.h | 3 +- framework/Source/GPUImageFilterGroup.m | 1 - .../GPUImageHarrisCornerDetectionFilter.m | 12 +---- .../GPUImageNobleCornerDetectionFilter.h | 12 +++++ .../GPUImageNobleCornerDetectionFilter.m | 46 +++++++++++++++++++ .../GPUImageShiTomasiFeatureDetectionFilter.h | 13 ++++++ .../GPUImageShiTomasiFeatureDetectionFilter.m | 42 +++++++++++++++++ 14 files changed, 197 insertions(+), 25 deletions(-) create mode 100644 framework/Source/GPUImageNobleCornerDetectionFilter.h create mode 100644 framework/Source/GPUImageNobleCornerDetectionFilter.m create mode 100644 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h create mode 100644 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h index 62189ad11..349d68ba2 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h @@ -5,7 +5,10 @@ @property (strong, nonatomic) UIWindow *window; -- (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput; +- (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector ofName:(NSString *)detectorName againstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; +- (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; +- (void)testNobleCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; +- (void)testShiTomasiCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; - (void)saveImage:(UIImage *)imageToSave fileName:(NSString *)imageName; @end diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index 6ae880630..405e24128 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -14,23 +14,24 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( UIImage *inputImage = [UIImage imageNamed:@"71yih.png"]; GPUImagePicture *blackAndWhiteBoxImage = [[GPUImagePicture alloc] initWithImage:inputImage]; - [self testHarrisCornerDetectorAgainstPicture:blackAndWhiteBoxImage]; + [self testHarrisCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; + [self testNobleCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; + [self testShiTomasiCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; return YES; } -- (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput; +- (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector ofName:(NSString *)detectorName againstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; { [pictureInput removeAllTargets]; - GPUImageHarrisCornerDetectionFilter *harrisCornerFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; - [pictureInput addTarget:harrisCornerFilter]; + [pictureInput addTarget:cornerDetector]; GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; crosshairGenerator.crosshairWidth = 5.0; [crosshairGenerator forceProcessingAtSize:[pictureInput outputImageSize]]; - [harrisCornerFilter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected) { + [cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected) { [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected]; }]; @@ -39,21 +40,39 @@ - (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput; pictureInput.targetToIgnoreForUpdates = blendFilter; [crosshairGenerator addTarget:blendFilter]; - + [blendFilter prepareForImageCapture]; [pictureInput processImage]; NSUInteger currentImageIndex = 0; - for (UIImage *currentImage in harrisCornerFilter.intermediateImages) + for (UIImage *currentImage in cornerDetector.intermediateImages) { - [self saveImage:currentImage fileName:[NSString stringWithFormat:@"Harris-%d.png", currentImageIndex]]; + [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%d.png", detectorName, pictureName, currentImageIndex]]; currentImageIndex++; } UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput]; - [self saveImage:crosshairResult fileName:@"Harris-Crosshairs.png"]; + [self saveImage:crosshairResult fileName:[NSString stringWithFormat:@"%@-%@-Crosshairs.png", detectorName, pictureName]]; +} + +- (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; +{ + GPUImageHarrisCornerDetectionFilter *harrisCornerFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; + [self testCornerDetector:harrisCornerFilter ofName:@"Harris" againstPicture:pictureInput withName:pictureName]; +} + +- (void)testNobleCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; +{ + GPUImageNobleCornerDetectionFilter *nobleCornerFilter = [[GPUImageNobleCornerDetectionFilter alloc] init]; + [self testCornerDetector:nobleCornerFilter ofName:@"Noble" againstPicture:pictureInput withName:pictureName]; +} + +- (void)testShiTomasiCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; +{ + GPUImageShiTomasiFeatureDetectionFilter *nobleCornerFilter = [[GPUImageShiTomasiFeatureDetectionFilter alloc] init]; + [self testCornerDetector:nobleCornerFilter ofName:@"ShiTomasi" againstPicture:pictureInput withName:pictureName]; } - (void)saveImage:(UIImage *)imageToSave fileName:(NSString *)imageName; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index bb1dc77ea..40a66762e 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -89,6 +89,8 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_CANNYEDGEDETECTION: cell.textLabel.text = @"Canny edge detection"; break; case GPUIMAGE_XYGRADIENT: cell.textLabel.text = @"XY derivative"; break; case GPUIMAGE_HARRISCORNERDETECTION: cell.textLabel.text = @"Harris corner detection"; break; + case GPUIMAGE_NOBLECORNERDETECTION: cell.textLabel.text = @"Noble corner detection"; break; + case GPUIMAGE_SHITOMASIFEATUREDETECTION: cell.textLabel.text = @"Shi-Tomasi feature detection"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; case GPUIMAGE_SMOOTHTOON: cell.textLabel.text = @"Smooth toon"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 8ee40c216..6353bb466 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -30,6 +30,8 @@ typedef enum { GPUIMAGE_CANNYEDGEDETECTION, GPUIMAGE_XYGRADIENT, GPUIMAGE_HARRISCORNERDETECTION, + GPUIMAGE_NOBLECORNERDETECTION, + GPUIMAGE_SHITOMASIFEATUREDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_SMOOTHTOON, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 4c7fd33f9..e3dff1b1b 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -340,6 +340,30 @@ - (void)setupFilter; filter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:0.20]; }; break; + case GPUIMAGE_NOBLECORNERDETECTION: + { + self.title = @"Noble Corner Detection"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.01]; + [self.filterSettingsSlider setMaximumValue:0.70]; + [self.filterSettingsSlider setValue:0.20]; + + filter = [[GPUImageNobleCornerDetectionFilter alloc] init]; + [(GPUImageNobleCornerDetectionFilter *)filter setThreshold:0.20]; + }; break; + case GPUIMAGE_SHITOMASIFEATUREDETECTION: + { + self.title = @"Shi-Tomasi Feature Detection"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.01]; + [self.filterSettingsSlider setMaximumValue:0.70]; + [self.filterSettingsSlider setValue:0.20]; + + filter = [[GPUImageShiTomasiFeatureDetectionFilter alloc] init]; + [(GPUImageShiTomasiFeatureDetectionFilter *)filter setThreshold:0.20]; + }; break; case GPUIMAGE_PREWITTEDGEDETECTION: { self.title = @"Prewitt Edge Detection"; @@ -849,7 +873,7 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } - else if (filterType == GPUIMAGE_HARRISCORNERDETECTION) + else if ( (filterType == GPUIMAGE_HARRISCORNERDETECTION) || (filterType == GPUIMAGE_NOBLECORNERDETECTION) || (filterType == GPUIMAGE_SHITOMASIFEATUREDETECTION) ) { GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; crosshairGenerator.crosshairWidth = 15.0; @@ -913,6 +937,8 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; + case GPUIMAGE_NOBLECORNERDETECTION: [(GPUImageNobleCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; + case GPUIMAGE_SHITOMASIFEATUREDETECTION: [(GPUImageShiTomasiFeatureDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; // case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setSensitivity:[(UISlider*)sender value]]; break; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index b7217cecf..51dfab81a 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -106,6 +106,10 @@ BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; }; BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */; }; + BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; }; + BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */; }; + BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; }; + BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */; }; BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; @@ -316,6 +320,10 @@ BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAlphaBlendFilter.m; path = Source/GPUImageAlphaBlendFilter.m; sourceTree = SOURCE_ROOT; }; BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNonMaximumSuppressionFilter.h; path = Source/GPUImageNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNonMaximumSuppressionFilter.m; path = Source/GPUImageNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageShiTomasiFeatureDetectionFilter.h; path = Source/GPUImageShiTomasiFeatureDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageShiTomasiFeatureDetectionFilter.m; path = Source/GPUImageShiTomasiFeatureDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNobleCornerDetectionFilter.h; path = Source/GPUImageNobleCornerDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNobleCornerDetectionFilter.m; path = Source/GPUImageNobleCornerDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; @@ -679,6 +687,10 @@ BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */, BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */, BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */, + BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */, + BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */, + BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */, + BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */, BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */, BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */, BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */, @@ -865,6 +877,8 @@ BCF1E54415669907006B155F /* GPUImageVoroniConsumerFilter.h in Headers */, BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */, BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */, + BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */, + BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1070,6 +1084,8 @@ BCF1E54515669907006B155F /* GPUImageVoroniConsumerFilter.m in Sources */, BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */, BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */, + BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */, + BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index f448efa04..1ba488e67 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -89,4 +89,5 @@ #import "GPUImageBilateralFilter.h" #import "GPUImageCrosshairGenerator.h" #import "GPUImageToneCurveFilter.h" - +#import "GPUImageNobleCornerDetectionFilter.h" +#import "GPUImageShiTomasiFeatureDetectionFilter.h" diff --git a/framework/Source/GPUImageFilterGroup.h b/framework/Source/GPUImageFilterGroup.h index 4a3c00fd4..e61736b96 100755 --- a/framework/Source/GPUImageFilterGroup.h +++ b/framework/Source/GPUImageFilterGroup.h @@ -1,6 +1,5 @@ #import "GPUImageOutput.h" - -@class GPUImageFilter; +#import "GPUImageFilter.h" @interface GPUImageFilterGroup : GPUImageOutput { diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 99fc69e9e..c8741e2f1 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -1,5 +1,4 @@ #import "GPUImageFilterGroup.h" -#import "GPUImageFilter.h" #import "GPUImagePicture.h" @implementation GPUImageFilterGroup diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 0ca346e11..6c34a5b57 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -1,5 +1,4 @@ #import "GPUImageHarrisCornerDetectionFilter.h" -#import "GPUImageFilter.h" #import "GPUImageGaussianBlurFilter.h" #import "GPUImageXYDerivativeFilter.h" #import "GPUImageGrayscaleFilter.h" @@ -32,19 +31,12 @@ void main() mediump float derivativeSum = derivativeElements.x + derivativeElements.y; - // This is the Noble variant on the Harris detector, from - // Alison Noble, "Descriptions of Image Surfaces", PhD thesis, Department of Engineering Science, Oxford University 1989, p45. - // R = (Ix^2 * Iy^2 - Ixy * Ixy) / (Ix^2 + Iy^2) mediump float zElement = (derivativeElements.z * 2.0) - 1.0; -// mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z)) / (derivativeSum); - mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (zElement * zElement)) / (derivativeSum); - // Original Harris detector // R = Ix^2 * Iy^2 - Ixy * Ixy - k * (Ix^2 + Iy^2)^2 -// highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; + mediump float cornerness = derivativeElements.x * derivativeElements.y - (zElement * zElement) - harrisConstant * derivativeSum * derivativeSum; -// gl_FragColor = vec4(vec3(harrisIntensity * 7.0), 1.0); - gl_FragColor = vec4(vec3(harrisIntensity * sensitivity), 1.0); + gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); } ); diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.h b/framework/Source/GPUImageNobleCornerDetectionFilter.h new file mode 100644 index 000000000..963fd66af --- /dev/null +++ b/framework/Source/GPUImageNobleCornerDetectionFilter.h @@ -0,0 +1,12 @@ +#import "GPUImageHarrisCornerDetectionFilter.h" + +/** Noble corner detector + + This is the Noble variant on the Harris detector, from + Alison Noble, "Descriptions of Image Surfaces", PhD thesis, Department of Engineering Science, Oxford University 1989, p45. +*/ + + +@interface GPUImageNobleCornerDetectionFilter : GPUImageHarrisCornerDetectionFilter + +@end diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.m b/framework/Source/GPUImageNobleCornerDetectionFilter.m new file mode 100644 index 000000000..fa2934f92 --- /dev/null +++ b/framework/Source/GPUImageNobleCornerDetectionFilter.m @@ -0,0 +1,46 @@ +#import "GPUImageNobleCornerDetectionFilter.h" + +@implementation GPUImageNobleCornerDetectionFilter + +NSString *const kGPUImageNobleCornerDetectionFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform lowp float sensitivity; + + void main() + { + mediump vec3 derivativeElements = texture2D(inputImageTexture, textureCoordinate).rgb; + + mediump float derivativeSum = derivativeElements.x + derivativeElements.y; + + // R = (Ix^2 * Iy^2 - Ixy * Ixy) / (Ix^2 + Iy^2) + mediump float zElement = (derivativeElements.z * 2.0) - 1.0; + // mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z)) / (derivativeSum); + mediump float cornerness = (derivativeElements.x * derivativeElements.y - (zElement * zElement)) / (derivativeSum); + + // Original Harris detector + // R = Ix^2 * Iy^2 - Ixy * Ixy - k * (Ix^2 + Iy^2)^2 + // highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; + + // gl_FragColor = vec4(vec3(harrisIntensity * 7.0), 1.0); + gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); + } +); + + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithCornerDetectionFragmentShader:kGPUImageNobleCornerDetectionFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h new file mode 100644 index 000000000..b16ebc011 --- /dev/null +++ b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h @@ -0,0 +1,13 @@ +#import "GPUImageHarrisCornerDetectionFilter.h" + +/** Shi-Tomasi feature detector + + This is the Shi-Tomasi feature detector, as described in + J. Shi and C. Tomasi. Good features to track. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 593-600, June 1994. + */ + +@interface GPUImageShiTomasiFeatureDetectionFilter : GPUImageHarrisCornerDetectionFilter + +// Compared to the Harris corner detector, the default sensitivity value for this detector is set to 1.5 + +@end diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m new file mode 100644 index 000000000..f47ec6bfa --- /dev/null +++ b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m @@ -0,0 +1,42 @@ +#import "GPUImageShiTomasiFeatureDetectionFilter.h" + +@implementation GPUImageShiTomasiFeatureDetectionFilter + +NSString *const kGPUImageShiTomasiCornerDetectionFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform lowp float sensitivity; + + void main() + { + mediump vec3 derivativeElements = texture2D(inputImageTexture, textureCoordinate).rgb; + + mediump float derivativeDifference = derivativeElements.x - derivativeElements.y; + mediump float zElement = (derivativeElements.z * 2.0) - 1.0; + + // R = Ix^2 + Iy^2 - sqrt( (Ix^2 - Iy^2)^2 + 4 * Ixy * Ixy) + mediump float cornerness = derivativeElements.x + derivativeElements.y - sqrt(derivativeDifference * derivativeDifference + 4.0 * zElement * zElement); + + gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); + } +); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithCornerDetectionFragmentShader:kGPUImageShiTomasiCornerDetectionFragmentShaderString])) + { + return nil; + } + + self.sensitivity = 1.5; + + return self; +} + + +@end From 38c43c55de52b7e7d84b8c28871c2e31524f95bf Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 25 May 2012 11:13:25 -0500 Subject: [PATCH 111/695] Added timestamps for feature detection. --- .../FeatureExtractionAppDelegate.m | 4 ++-- .../FilterShowcase/ShowcaseFilterViewController.m | 4 ++-- framework/Source/GPUImageCrosshairGenerator.h | 2 +- framework/Source/GPUImageCrosshairGenerator.m | 4 ++-- framework/Source/GPUImageFilter.m | 2 +- framework/Source/GPUImageHarrisCornerDetectionFilter.h | 4 ++-- framework/Source/GPUImageHarrisCornerDetectionFilter.m | 10 +++++----- framework/Source/GPUImageOutput.h | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index 405e24128..6518a6378 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -31,8 +31,8 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector crosshairGenerator.crosshairWidth = 5.0; [crosshairGenerator forceProcessingAtSize:[pictureInput outputImageSize]]; - [cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected) { - [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected]; + [cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) { + [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime]; }]; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index e3dff1b1b..4aee06812 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -879,8 +879,8 @@ - (void)setupFilter; crosshairGenerator.crosshairWidth = 15.0; [crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; - [(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected) { - [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected]; + [(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) { + [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime]; }]; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; diff --git a/framework/Source/GPUImageCrosshairGenerator.h b/framework/Source/GPUImageCrosshairGenerator.h index 0c3200c63..569774f57 100644 --- a/framework/Source/GPUImageCrosshairGenerator.h +++ b/framework/Source/GPUImageCrosshairGenerator.h @@ -12,6 +12,6 @@ - (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; // Rendering -- (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInteger)numberOfCrosshairs; +- (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInteger)numberOfCrosshairs frameTime:(CMTime)frameTime; @end diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index 9c21413fd..eaee1c161 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -63,7 +63,7 @@ - (id)init; #pragma mark - #pragma mark Rendering -- (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInteger)numberOfCrosshairs; +- (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInteger)numberOfCrosshairs frameTime:(CMTime)frameTime; { if (self.preventRendering) { @@ -83,7 +83,7 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte glDrawArrays(GL_POINTS, 0, numberOfCrosshairs); - [self informTargetsAboutNewFrameAtTime:kCMTimeInvalid]; + [self informTargetsAboutNewFrameAtTime:frameTime]; } - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 0cf342832..d2cf7ef6d 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -433,7 +433,7 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; { if (self.frameProcessingCompletionBlock != NULL) { - self.frameProcessingCompletionBlock(self); + self.frameProcessingCompletionBlock(self, frameTime); } for (id currentTarget in targets) diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index d3bf81154..0ae89fa07 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -41,8 +41,8 @@ // A threshold value at which a point is recognized as being a corner after the non-maximum suppression. Default is 0.20. @property(readwrite, nonatomic) CGFloat threshold; -// This block is called on the detection of new corner points, usually on every processed frame. A C array containing normalized coordinates in X, Y pairs is passed in, along with a count of the number of corners detected -@property(nonatomic, copy) void(^cornersDetectedBlock)(GLfloat* cornerArray, NSUInteger cornersDetected); +// This block is called on the detection of new corner points, usually on every processed frame. A C array containing normalized coordinates in X, Y pairs is passed in, along with a count of the number of corners detected and the current timestamp of the video frame +@property(nonatomic, copy) void(^cornersDetectedBlock)(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime); // These images are only enabled when built with DEBUGFEATUREDETECTION defined, and are used to examine the intermediate states of the feature detector @property(nonatomic, readonly, strong) NSMutableArray *intermediateImages; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 6c34a5b57..320fee81b 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -7,7 +7,7 @@ @interface GPUImageHarrisCornerDetectionFilter() -- (void)extractCornerLocationsFromImage; +- (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; @end @@ -152,8 +152,8 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS #endif __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; - [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter) { - [weakSelf extractCornerLocationsFromImage]; + [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { + [weakSelf extractCornerLocationsFromImageAtFrameTime:frameTime]; }]; [derivativeFilter addTarget:blurFilter]; @@ -181,7 +181,7 @@ - (void)dealloc; #pragma mark - #pragma mark Corner extraction -- (void)extractCornerLocationsFromImage; +- (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; { NSUInteger numberOfCorners = 0; @@ -221,7 +221,7 @@ - (void)extractCornerLocationsFromImage; if (cornersDetectedBlock != NULL) { - cornersDetectedBlock(cornersArray, numberOfCorners); + cornersDetectedBlock(cornersArray, numberOfCorners, frameTime); } free(cornersArray); diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 060858857..b1fb75bbb 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -33,7 +33,7 @@ void report_memory(NSString *tag); @property(readwrite, nonatomic) BOOL shouldIgnoreUpdatesToThisTarget; @property(readwrite, nonatomic, retain) GPUImageMovieWriter *audioEncodingTarget; @property(readwrite, nonatomic, unsafe_unretained) id targetToIgnoreForUpdates; -@property(nonatomic, copy) void(^frameProcessingCompletionBlock)(GPUImageOutput*); +@property(nonatomic, copy) void(^frameProcessingCompletionBlock)(GPUImageOutput*, CMTime); /// @name Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; From 837b942b83be21a85cb850ef5dccbcb6403564f6 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 25 May 2012 12:29:51 -0500 Subject: [PATCH 112/695] Integrating Marcelo Barbudas' alpha channel fixes for the color dodge, exclusion, hard light, soft light, multiply, and overlay blends. Tried to vectorize the color dodge blend. --- .../Source/GPUImageColorDodgeBlendFilter.m | 23 ++++++++--- .../Source/GPUImageExclusionBlendFilter.m | 9 +++-- .../Source/GPUImageHardLightBlendFilter.m | 40 ++++++++++--------- .../Source/GPUImageMultiplyBlendFilter.m | 8 ++-- framework/Source/GPUImageOverlayBlendFilter.m | 33 +++++++++++---- .../Source/GPUImageSoftLightBlendFilter.m | 7 ++-- 6 files changed, 78 insertions(+), 42 deletions(-) diff --git a/framework/Source/GPUImageColorDodgeBlendFilter.m b/framework/Source/GPUImageColorDodgeBlendFilter.m index 5c61a9970..baf7b351e 100755 --- a/framework/Source/GPUImageColorDodgeBlendFilter.m +++ b/framework/Source/GPUImageColorDodgeBlendFilter.m @@ -1,7 +1,10 @@ #import "GPUImageColorDodgeBlendFilter.h" NSString *const kGPUImageColorDodgeBlendFragmentShaderString = SHADER_STRING -( +( + + precision lowp float; + varying highp vec2 textureCoordinate; varying highp vec2 textureCoordinate2; @@ -10,10 +13,20 @@ void main() { - mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); - mediump vec4 whiteColor = vec4(1.0); - gl_FragColor = textureColor / (whiteColor - textureColor2); + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + vec3 baseOverlayAlphaProduct = vec3(overlay.a * base.a); + vec3 rightHandProduct = overlay.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlay.a); + + vec3 firstBlendColor = baseOverlayAlphaProduct + rightHandProduct; + vec3 overlayRGB = (overlay.rgb / overlay.a) * step(0.0, overlay.a); + + vec3 secondBlendColor = (base.rgb * overlay.a) / (1.0 - overlayRGB) + rightHandProduct; + + vec3 colorChoice = step((overlay.rgb * base.a + base.rgb * overlay.a), baseOverlayAlphaProduct); + + gl_FragColor = vec4(mix(firstBlendColor, secondBlendColor, colorChoice), 1.0); } ); diff --git a/framework/Source/GPUImageExclusionBlendFilter.m b/framework/Source/GPUImageExclusionBlendFilter.m index 3ea4629e5..4ac63ade6 100755 --- a/framework/Source/GPUImageExclusionBlendFilter.m +++ b/framework/Source/GPUImageExclusionBlendFilter.m @@ -10,9 +10,12 @@ void main() { - mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); - gl_FragColor = vec4(textureColor.rgb + textureColor2.rgb - (2.0 * textureColor.rgb * textureColor2.rgb), textureColor.a); + mediump vec4 base = texture2D(inputImageTexture, textureCoordinate); + mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + // Dca = (Sca.Da + Dca.Sa - 2.Sca.Dca) + Sca.(1 - Da) + Dca.(1 - Sa) + + gl_FragColor = vec4((overlay.rgb * base.a + base.rgb * overlay.a - 2.0 * overlay.rgb * base.rgb) + overlay.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlay.a), base.a); } ); diff --git a/framework/Source/GPUImageHardLightBlendFilter.m b/framework/Source/GPUImageHardLightBlendFilter.m index daa4cfaf5..eb6576e32 100755 --- a/framework/Source/GPUImageHardLightBlendFilter.m +++ b/framework/Source/GPUImageHardLightBlendFilter.m @@ -12,29 +12,31 @@ void main() { - mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); - mediump float luminance = dot(textureColor.rgb, W); - - mediump vec4 whiteColor = vec4(1.0); - - mediump vec4 result; - if (luminance < 0.45) - { - result = 2.0 * textureColor * textureColor2; + mediump vec4 base = texture2D(inputImageTexture, textureCoordinate); + mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + highp float ra; + if (2.0 * overlay.r < overlay.a) { + ra = 2.0 * overlay.r * base.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } else { + ra = overlay.a * base.a - 2.0 * (base.a - base.r) * (overlay.a - overlay.r) + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); } - else if (luminance > 0.55) - { - result = whiteColor - 2.0 * (whiteColor - textureColor2) * (whiteColor - textureColor); + + highp float ga; + if (2.0 * overlay.g < overlay.a) { + ga = 2.0 * overlay.g * base.g + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } else { + ga = overlay.a * base.a - 2.0 * (base.a - base.g) * (overlay.a - overlay.g) + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); } - else - { - mediump vec4 result1 = 2.0 * textureColor * textureColor2; - mediump vec4 result2 = whiteColor - 2.0 * (whiteColor - textureColor2) * (whiteColor - textureColor); - result = mix(result1, result2, (luminance - 0.45) * 10.0); + + highp float ba; + if (2.0 * overlay.b < overlay.a) { + ba = 2.0 * overlay.b * base.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } else { + ba = overlay.a * base.a - 2.0 * (base.a - base.b) * (overlay.a - overlay.b) + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); } - gl_FragColor = result; + gl_FragColor = vec4(ra, ga, ba, 1.0); } ); diff --git a/framework/Source/GPUImageMultiplyBlendFilter.m b/framework/Source/GPUImageMultiplyBlendFilter.m index 68d9a125c..5842056f8 100755 --- a/framework/Source/GPUImageMultiplyBlendFilter.m +++ b/framework/Source/GPUImageMultiplyBlendFilter.m @@ -10,10 +10,10 @@ void main() { - lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); - - gl_FragColor = textureColor * textureColor2; + lowp vec4 base = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 overlayer = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = overlayer * base + overlayer * (1.0 - base.a) + base * (1.0 - overlayer.a); } ); diff --git a/framework/Source/GPUImageOverlayBlendFilter.m b/framework/Source/GPUImageOverlayBlendFilter.m index 3d9aa04d7..8ab728fbb 100755 --- a/framework/Source/GPUImageOverlayBlendFilter.m +++ b/framework/Source/GPUImageOverlayBlendFilter.m @@ -10,14 +10,31 @@ void main() { - lowp vec4 base = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); - gl_FragColor = vec4( - (base.r < 0.5 ? (2.0 * base.r * overlay.r) : (1.0 - 2.0 * (1.0 - base.r) * (1.0 - overlay.r))), - (base.g < 0.5 ? (2.0 * base.g * overlay.g) : (1.0 - 2.0 * (1.0 - base.g) * (1.0 - overlay.g))), - (base.b < 0.5 ? (2.0 * base.b * overlay.b) : (1.0 - 2.0 * (1.0 - base.b) * (1.0 - overlay.b))), - 1.0 - ); + mediump vec4 base = texture2D(inputImageTexture, textureCoordinate); + mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + mediump float ra; + if (2.0 * base.r < base.a) { + ra = 2.0 * overlay.r * base.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } else { + ra = overlay.a * base.a - 2.0 * (base.a - base.r) * (overlay.a - overlay.r) + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } + + mediump float ga; + if (2.0 * base.g < base.a) { + ga = 2.0 * overlay.g * base.g + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } else { + ga = overlay.a * base.a - 2.0 * (base.a - base.g) * (overlay.a - overlay.g) + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } + + mediump float ba; + if (2.0 * base.b < base.a) { + ba = 2.0 * overlay.b * base.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } else { + ba = overlay.a * base.a - 2.0 * (base.a - base.b) * (overlay.a - overlay.b) + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } + + gl_FragColor = vec4(ra, ga, ba, 1.0); } ); diff --git a/framework/Source/GPUImageSoftLightBlendFilter.m b/framework/Source/GPUImageSoftLightBlendFilter.m index 697ba74ba..c67d461c5 100755 --- a/framework/Source/GPUImageSoftLightBlendFilter.m +++ b/framework/Source/GPUImageSoftLightBlendFilter.m @@ -10,9 +10,10 @@ void main() { - mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); - gl_FragColor = 2.0 * textureColor2 * textureColor + textureColor * textureColor - 2.0 * textureColor * textureColor *textureColor2; + mediump vec4 base = texture2D(inputImageTexture, textureCoordinate); + mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = base * (overlay.a * (base / base.a) + (2.0 * overlay * (1.0 - (base / base.a)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a); } ); From 6361d93af20f4ae39044101baa8a5b71d1e1975b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 25 May 2012 14:13:57 -0500 Subject: [PATCH 113/695] Fixed a precision issue and some divide-by-zero problems with the color dodge blend. --- framework/Source/GPUImageColorDodgeBlendFilter.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageColorDodgeBlendFilter.m b/framework/Source/GPUImageColorDodgeBlendFilter.m index baf7b351e..5898c23af 100755 --- a/framework/Source/GPUImageColorDodgeBlendFilter.m +++ b/framework/Source/GPUImageColorDodgeBlendFilter.m @@ -3,7 +3,7 @@ NSString *const kGPUImageColorDodgeBlendFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision mediump float; varying highp vec2 textureCoordinate; varying highp vec2 textureCoordinate2; @@ -20,7 +20,7 @@ void main() vec3 rightHandProduct = overlay.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlay.a); vec3 firstBlendColor = baseOverlayAlphaProduct + rightHandProduct; - vec3 overlayRGB = (overlay.rgb / overlay.a) * step(0.0, overlay.a); + vec3 overlayRGB = clamp((overlay.rgb / clamp(overlay.a, 0.01, 1.0)) * step(0.0, overlay.a), 0.0, 0.99); vec3 secondBlendColor = (base.rgb * overlay.a) / (1.0 - overlayRGB) + rightHandProduct; From 0afae26936250589c100bf3495e7adc102e2f665 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 26 May 2012 22:28:12 -0500 Subject: [PATCH 114/695] The Canny edge detection now actually follows the specification, so it finally works right. Fixed a double-free error with shader programs. --- .../ShowcaseFilterViewController.m | 8 +- framework/GPUImage.xcodeproj/project.pbxproj | 64 ++++++++-- framework/Source/GLProgram.m | 6 + .../Source/GPUImageCannyEdgeDetectionFilter.h | 26 ++-- .../Source/GPUImageCannyEdgeDetectionFilter.m | 66 +++++++--- ...geDirectionalNonMaximumSuppressionFilter.h | 19 +++ ...geDirectionalNonMaximumSuppressionFilter.m | 119 ++++++++++++++++++ framework/Source/GPUImageFastBlurFilter.h | 3 + framework/Source/GPUImageFastBlurFilter.m | 12 +- .../GPUImageSingleComponentFastBlurFilter.h | 5 + .../GPUImageSingleComponentFastBlurFilter.m | 44 +++++++ ...PUImageSingleComponentGaussianBlurFilter.h | 7 ++ ...PUImageSingleComponentGaussianBlurFilter.m | 46 +++++++ framework/Source/GPUImageSketchFilter.m | 2 +- .../Source/GPUImageSobelEdgeDetectionFilter.m | 2 +- .../Source/GPUImageWeakPixelInclusionFilter.h | 5 + .../Source/GPUImageWeakPixelInclusionFilter.m | 56 +++++++++ ...imageDirectionalSobelEdgeDetectionFilter.h | 5 + ...imageDirectionalSobelEdgeDetectionFilter.m | 61 +++++++++ 19 files changed, 509 insertions(+), 47 deletions(-) create mode 100644 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h create mode 100644 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m create mode 100644 framework/Source/GPUImageSingleComponentFastBlurFilter.h create mode 100644 framework/Source/GPUImageSingleComponentFastBlurFilter.m create mode 100644 framework/Source/GPUImageSingleComponentGaussianBlurFilter.h create mode 100644 framework/Source/GPUImageSingleComponentGaussianBlurFilter.m create mode 100644 framework/Source/GPUImageWeakPixelInclusionFilter.h create mode 100644 framework/Source/GPUImageWeakPixelInclusionFilter.m create mode 100644 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h create mode 100644 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 4aee06812..21941bc93 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -377,12 +377,12 @@ - (void)setupFilter; self.filterSettingsSlider.hidden = NO; [self.filterSettingsSlider setMinimumValue:0.0]; - [self.filterSettingsSlider setMaximumValue:2.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; [self.filterSettingsSlider setValue:1.0]; // [self.filterSettingsSlider setMinimumValue:0.0]; -// [self.filterSettingsSlider setMaximumValue:1.0]; -// [self.filterSettingsSlider setValue:0.9]; +// [self.filterSettingsSlider setMaximumValue:0.5]; +// [self.filterSettingsSlider setValue:0.1]; filter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; }; break; @@ -935,7 +935,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)filter setAngle:[(UISlider *)sender value]]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; -// case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; +// case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setLowerThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_NOBLECORNERDETECTION: [(GPUImageNobleCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: [(GPUImageShiTomasiFeatureDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 51dfab81a..5cfaab836 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -110,6 +110,16 @@ BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */; }; BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; }; BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */; }; + BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; }; + BCAD4D1015718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */; }; + BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; }; + BCAD4D1515718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */; }; + BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; }; + BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */; }; + BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; }; + BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; + BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; }; + BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */; }; BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; @@ -324,6 +334,16 @@ BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageShiTomasiFeatureDetectionFilter.m; path = Source/GPUImageShiTomasiFeatureDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNobleCornerDetectionFilter.h; path = Source/GPUImageNobleCornerDetectionFilter.h; sourceTree = SOURCE_ROOT; }; BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNobleCornerDetectionFilter.m; path = Source/GPUImageNobleCornerDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSingleComponentGaussianBlurFilter.h; path = Source/GPUImageSingleComponentGaussianBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSingleComponentGaussianBlurFilter.m; path = Source/GPUImageSingleComponentGaussianBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUimageDirectionalSobelEdgeDetectionFilter.h; path = Source/GPUimageDirectionalSobelEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUimageDirectionalSobelEdgeDetectionFilter.m; path = Source/GPUimageDirectionalSobelEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSingleComponentFastBlurFilter.h; path = Source/GPUImageSingleComponentFastBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSingleComponentFastBlurFilter.m; path = Source/GPUImageSingleComponentFastBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDirectionalNonMaximumSuppressionFilter.h; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDirectionalNonMaximumSuppressionFilter.m; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; + BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageWeakPixelInclusionFilter.h; path = Source/GPUImageWeakPixelInclusionFilter.h; sourceTree = SOURCE_ROOT; }; + BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageWeakPixelInclusionFilter.m; path = Source/GPUImageWeakPixelInclusionFilter.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; @@ -557,16 +577,12 @@ BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */, BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */, BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */, - BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */, - BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */, - BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */, - BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */, - BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */, - BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */, BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */, BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */, - BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */, - BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */, + BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */, + BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, + 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, + 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */, BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */, BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */, BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */, @@ -665,10 +681,14 @@ BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */, BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */, BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */, + BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */, + BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */, 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */, 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */, 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */, 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */, + BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */, + BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */, BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */, BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */, BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */, @@ -679,10 +699,20 @@ BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */, BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */, BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */, - BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */, - BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, - 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, - 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */, + BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */, + BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */, + BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */, + BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */, + BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */, + BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */, + BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */, + BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */, + BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */, + BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */, + BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */, + BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */, + BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */, + BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */, BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */, BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */, BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */, @@ -879,6 +909,11 @@ BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */, BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */, BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */, + BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */, + BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */, + BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */, + BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */, + BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1086,6 +1121,11 @@ BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */, BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */, BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */, + BCAD4D1015718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */, + BCAD4D1515718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */, + BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */, + BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */, + BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GLProgram.m b/framework/Source/GLProgram.m index 4f4a2ffd2..e17a5ddf6 100755 --- a/framework/Source/GLProgram.m +++ b/framework/Source/GLProgram.m @@ -162,9 +162,15 @@ - (BOOL)link return NO; if (vertShader) + { glDeleteShader(vertShader); + vertShader = 0; + } if (fragShader) + { glDeleteShader(fragShader); + fragShader = 0; + } return YES; } diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h index f14dd2f42..6adbd93cb 100755 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.h +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.h @@ -1,16 +1,20 @@ #import "GPUImageFilterGroup.h" -@class GPUImageGaussianBlurFilter; -@class GPUImageThresholdEdgeDetection; -@class GPUImageSketchFilter; +@class GPUImageGrayscaleFilter; +@class GPUImageSingleComponentFastBlurFilter; +@class GPUimageDirectionalSobelEdgeDetectionFilter; +@class GPUImageDirectionalNonMaximumSuppressionFilter; +@class GPUImageWeakPixelInclusionFilter; -/** This uses a Gaussian blur before applying a Sobel operator to highlight edges +/** This uses a Gaussian blur, followed by applying a Sobel operator, then a thresholding operation, in order to highlight edges */ @interface GPUImageCannyEdgeDetectionFilter : GPUImageFilterGroup { - GPUImageGaussianBlurFilter *blurFilter; - GPUImageThresholdEdgeDetection *edgeDetectionFilter; -// GPUImageSketchFilter *edgeDetectionFilter; + GPUImageGrayscaleFilter *luminanceFilter; + GPUImageSingleComponentFastBlurFilter *blurFilter; + GPUimageDirectionalSobelEdgeDetectionFilter *edgeDetectionFilter; + GPUImageDirectionalNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; + GPUImageWeakPixelInclusionFilter *weakPixelInclusionFilter; } /** The image width and height factors tweak the appearance of the edges. @@ -32,8 +36,12 @@ */ @property (readwrite, nonatomic) CGFloat blurSize; -/** Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.5 as the default +/** Any edge with a gradient magnitude above this threshold will pass and show up in the final result. */ -@property(readwrite, nonatomic) CGFloat threshold; +@property(readwrite, nonatomic) CGFloat upperThreshold; + +/** Any edge with a gradient magnitude below this threshold will fail and be removed from the final result. + */ +@property(readwrite, nonatomic) CGFloat lowerThreshold; @end diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.m b/framework/Source/GPUImageCannyEdgeDetectionFilter.m index 0009a83fb..bfb52143b 100755 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.m +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.m @@ -1,11 +1,15 @@ #import "GPUImageCannyEdgeDetectionFilter.h" -#import "GPUImageGaussianBlurFilter.h" -#import "GPUImageThresholdEdgeDetection.h" -#import "GPUImageSketchFilter.h" + +#import "GPUImageGrayscaleFilter.h" +#import "GPUImageSingleComponentFastBlurFilter.h" +#import "GPUImageDirectionalSobelEdgeDetectionFilter.h" +#import "GPUImageDirectionalNonMaximumSuppressionFilter.h" +#import "GPUImageWeakPixelInclusionFilter.h" @implementation GPUImageCannyEdgeDetectionFilter -@synthesize threshold; +@synthesize upperThreshold; +@synthesize lowerThreshold; @synthesize blurSize; @synthesize texelWidth; @synthesize texelHeight; @@ -17,23 +21,38 @@ - (id)init; return nil; } - // First pass: apply a variable Gaussian blur - blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; + // First pass: convert image to luminance + luminanceFilter = [[GPUImageGrayscaleFilter alloc] init]; + [self addFilter:luminanceFilter]; + + // Second pass: apply a variable Gaussian blur + blurFilter = [[GPUImageSingleComponentFastBlurFilter alloc] init]; [self addFilter:blurFilter]; - // Second pass: run the Sobel edge detection on this blurred image - edgeDetectionFilter = [[GPUImageThresholdEdgeDetection alloc] init]; -// edgeDetectionFilter = [[GPUImageSketchFilter alloc] init]; + // Third pass: run the Sobel edge detection, with calculated gradient directions, on this blurred image + edgeDetectionFilter = [[GPUimageDirectionalSobelEdgeDetectionFilter alloc] init]; [self addFilter:edgeDetectionFilter]; - // Texture location 0 needs to be the sharp image for both the blur and the second stage processing + // Fourth pass: apply non-maximum suppression + nonMaximumSuppressionFilter = [[GPUImageDirectionalNonMaximumSuppressionFilter alloc] init]; + [self addFilter:nonMaximumSuppressionFilter]; + + // Fifth pass: include weak pixels to complete edges + weakPixelInclusionFilter = [[GPUImageWeakPixelInclusionFilter alloc] init]; + [self addFilter:weakPixelInclusionFilter]; + + [luminanceFilter addTarget:blurFilter]; [blurFilter addTarget:edgeDetectionFilter]; + [edgeDetectionFilter addTarget:nonMaximumSuppressionFilter]; + [nonMaximumSuppressionFilter addTarget:weakPixelInclusionFilter]; - self.initialFilters = [NSArray arrayWithObject:blurFilter]; - self.terminalFilter = edgeDetectionFilter; + self.initialFilters = [NSArray arrayWithObject:luminanceFilter]; +// self.terminalFilter = nonMaximumSuppressionFilter; + self.terminalFilter = weakPixelInclusionFilter; - self.blurSize = 1.5; - self.threshold = 0.9; + self.blurSize = 1.0; + self.upperThreshold = 0.4; + self.lowerThreshold = 0.1; return self; } @@ -71,15 +90,24 @@ - (CGFloat)texelHeight; return edgeDetectionFilter.texelHeight; } -- (void)setThreshold:(CGFloat)newValue; +- (void)setUpperThreshold:(CGFloat)newValue; +{ + nonMaximumSuppressionFilter.upperThreshold = newValue; +} + +- (CGFloat)upperThreshold; +{ + return nonMaximumSuppressionFilter.upperThreshold; +} + +- (void)setLowerThreshold:(CGFloat)newValue; { - edgeDetectionFilter.threshold = newValue; + nonMaximumSuppressionFilter.lowerThreshold = newValue; } -- (CGFloat)threshold; +- (CGFloat)lowerThreshold; { - return edgeDetectionFilter.threshold; -// return 0; + return nonMaximumSuppressionFilter.lowerThreshold; } @end diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h new file mode 100644 index 000000000..fdffb9fb3 --- /dev/null +++ b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h @@ -0,0 +1,19 @@ +#import "GPUImageFilter.h" + +@interface GPUImageDirectionalNonMaximumSuppressionFilter : GPUImageFilter +{ + GLint texelWidthUniform, texelHeightUniform; + GLint upperThresholdUniform, lowerThresholdUniform; + + BOOL hasOverriddenImageSizeFactor; +} + +// The texel width and height determines how far out to sample from this texel. By default, this is the normalized width of a pixel, but this can be overridden for different effects. +@property(readwrite, nonatomic) CGFloat texelWidth; +@property(readwrite, nonatomic) CGFloat texelHeight; + +// These thresholds set cutoffs for the intensities that definitely get registered (upper threshold) and those that definitely don't (lower threshold) +@property(readwrite, nonatomic) CGFloat upperThreshold; +@property(readwrite, nonatomic) CGFloat lowerThreshold; + +@end diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m new file mode 100644 index 000000000..6328a24fa --- /dev/null +++ b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m @@ -0,0 +1,119 @@ +#import "GPUImageDirectionalNonMaximumSuppressionFilter.h" + +@implementation GPUImageDirectionalNonMaximumSuppressionFilter + +NSString *const kGPUImageDirectionalNonmaximumSuppressionFragmentShaderString = SHADER_STRING +( + precision mediump float; + + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform highp float texelWidth; + uniform highp float texelHeight; + uniform mediump float upperThreshold; + uniform mediump float lowerThreshold; + + void main() + { + vec3 currentGradientAndDirection = texture2D(inputImageTexture, textureCoordinate).rgb; + vec2 gradientDirection = ((currentGradientAndDirection.gb * 2.0) - 1.0) * vec2(texelWidth, texelHeight); + + float firstSampledGradientMagnitude = texture2D(inputImageTexture, textureCoordinate + gradientDirection).r; + float secondSampledGradientMagnitude = texture2D(inputImageTexture, textureCoordinate - gradientDirection).r; + + float multiplier = step(firstSampledGradientMagnitude, currentGradientAndDirection.r); + multiplier = multiplier * step(secondSampledGradientMagnitude, currentGradientAndDirection.r); + + float thresholdCompliance = smoothstep(lowerThreshold, upperThreshold, currentGradientAndDirection.r); + multiplier = multiplier * thresholdCompliance; + + gl_FragColor = vec4(multiplier, multiplier, multiplier, 1.0); + } +); + + +@synthesize texelWidth = _texelWidth; +@synthesize texelHeight = _texelHeight; +@synthesize upperThreshold = _upperThreshold; +@synthesize lowerThreshold = _lowerThreshold; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageDirectionalNonmaximumSuppressionFragmentShaderString])) + { + return nil; + } + + texelWidthUniform = [filterProgram uniformIndex:@"texelWidth"]; + texelHeightUniform = [filterProgram uniformIndex:@"texelHeight"]; + upperThresholdUniform = [filterProgram uniformIndex:@"upperThreshold"]; + lowerThresholdUniform = [filterProgram uniformIndex:@"lowerThreshold"]; + + self.upperThreshold = 0.5; + self.lowerThreshold = 0.1; + + return self; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + if (!hasOverriddenImageSizeFactor) + { + _texelWidth = 1.0 / filterFrameSize.width; + _texelHeight = 1.0 / filterFrameSize.height; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + } +} + +#pragma mark - +#pragma mark Accessors + +- (void)setTexelWidth:(CGFloat)newValue; +{ + hasOverriddenImageSizeFactor = YES; + _texelWidth = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(texelWidthUniform, _texelWidth); +} + +- (void)setTexelHeight:(CGFloat)newValue; +{ + hasOverriddenImageSizeFactor = YES; + _texelHeight = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(texelHeightUniform, _texelHeight); +} + +- (void)setLowerThreshold:(CGFloat)newValue; +{ + _lowerThreshold = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(lowerThresholdUniform, _lowerThreshold); +} + +- (void)setUpperThreshold:(CGFloat)newValue; +{ + _upperThreshold = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(upperThresholdUniform, _upperThreshold); +} + + + +@end diff --git a/framework/Source/GPUImageFastBlurFilter.h b/framework/Source/GPUImageFastBlurFilter.h index 45f395a35..bffb4a9ce 100755 --- a/framework/Source/GPUImageFastBlurFilter.h +++ b/framework/Source/GPUImageFastBlurFilter.h @@ -12,4 +12,7 @@ /// A scaling for the size of the applied blur, default of 1.0 @property(readwrite, nonatomic) CGFloat blurSize; +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; + + @end diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index 6110ccae1..535f5a0af 100755 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -71,7 +71,17 @@ @implementation GPUImageFastBlurFilter - (id)init; { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageFastBlurVertexShaderString firstStageFragmentShaderFromString:kGPUImageFastBlurFragmentShaderString secondStageVertexShaderFromString:kGPUImageFastBlurVertexShaderString secondStageFragmentShaderFromString:kGPUImageFastBlurFragmentShaderString])) + if (!(self = [self initWithFragmentShaderFromString:kGPUImageFastBlurFragmentShaderString])) + { + return nil; + } + + return self; +} + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageFastBlurVertexShaderString firstStageFragmentShaderFromString:fragmentShaderString secondStageVertexShaderFromString:kGPUImageFastBlurVertexShaderString secondStageFragmentShaderFromString:fragmentShaderString])) { return nil; } diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.h b/framework/Source/GPUImageSingleComponentFastBlurFilter.h new file mode 100644 index 000000000..152d01966 --- /dev/null +++ b/framework/Source/GPUImageSingleComponentFastBlurFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageFastBlurFilter.h" + +@interface GPUImageSingleComponentFastBlurFilter : GPUImageFastBlurFilter + +@end diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.m b/framework/Source/GPUImageSingleComponentFastBlurFilter.m new file mode 100644 index 000000000..d31313731 --- /dev/null +++ b/framework/Source/GPUImageSingleComponentFastBlurFilter.m @@ -0,0 +1,44 @@ +#import "GPUImageSingleComponentFastBlurFilter.h" + +NSString *const kGPUImageSingleComponentFastBlurFragmentShaderString = SHADER_STRING +( + precision highp float; + + uniform sampler2D inputImageTexture; + + varying highp vec2 centerTextureCoordinate; + varying highp vec2 oneStepLeftTextureCoordinate; + varying highp vec2 twoStepsLeftTextureCoordinate; + varying highp vec2 oneStepRightTextureCoordinate; + varying highp vec2 twoStepsRightTextureCoordinate; + + // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); + + void main() + { + lowp float fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).r * 0.2270270270; + fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate).r * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate).r * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate).r * 0.0702702703; + fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate).r * 0.0702702703; + + gl_FragColor = vec4(vec3(fragmentColor), 1.0); + } +); + +@implementation GPUImageSingleComponentFastBlurFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageSingleComponentFastBlurFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h new file mode 100644 index 000000000..934b1e3a9 --- /dev/null +++ b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h @@ -0,0 +1,7 @@ +#import "GPUImageGaussianBlurFilter.h" + +// This filter merely performs the standard Gaussian blur on the red color channel (assuming a luminance image) + +@interface GPUImageSingleComponentGaussianBlurFilter : GPUImageGaussianBlurFilter + +@end diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m new file mode 100644 index 000000000..2690aabe7 --- /dev/null +++ b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m @@ -0,0 +1,46 @@ +#import "GPUImageSingleComponentGaussianBlurFilter.h" + +@implementation GPUImageSingleComponentGaussianBlurFilter + +NSString *const kGPUImageSingleComponentGaussianBlurFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + const lowp int GAUSSIAN_SAMPLES = 9; + + varying highp vec2 textureCoordinate; + varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + void main() { + lowp float sum = 0.0; + + sum += texture2D(inputImageTexture, blurCoordinates[0]).r * 0.05; + sum += texture2D(inputImageTexture, blurCoordinates[1]).r * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[2]).r * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[3]).r * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[4]).r * 0.18; + sum += texture2D(inputImageTexture, blurCoordinates[5]).r * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[6]).r * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[7]).r * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[8]).r * 0.05; + + gl_FragColor = vec4(sum, sum, sum, 1.0); + } +); + +- (id)init; +{ + + if (!(self = [super initWithFirstStageVertexShaderFromString:nil + firstStageFragmentShaderFromString:kGPUImageSingleComponentGaussianBlurFragmentShaderString + secondStageVertexShaderFromString:nil + secondStageFragmentShaderFromString:kGPUImageSingleComponentGaussianBlurFragmentShaderString])) + { + return nil; + } + + + return self; +} + +@end diff --git a/framework/Source/GPUImageSketchFilter.m b/framework/Source/GPUImageSketchFilter.m index 4235afc6b..09c262368 100755 --- a/framework/Source/GPUImageSketchFilter.m +++ b/framework/Source/GPUImageSketchFilter.m @@ -5,7 +5,7 @@ @implementation GPUImageSketchFilter // Invert the colorspace for a sketch NSString *const kGPUImageSketchFragmentShaderString = SHADER_STRING ( - precision highp float; + precision mediump float; varying vec2 textureCoordinate; varying vec2 leftTextureCoordinate; diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 247e295e8..f0d906555 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -5,7 +5,7 @@ // Code from "Graphics Shaders: Theory and Practice" by M. Bailey and S. Cunningham NSString *const kGPUImageSobelEdgeDetectionFragmentShaderString = SHADER_STRING ( - precision highp float; + precision mediump float; varying vec2 textureCoordinate; varying vec2 leftTextureCoordinate; diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.h b/framework/Source/GPUImageWeakPixelInclusionFilter.h new file mode 100644 index 000000000..44b76c6ae --- /dev/null +++ b/framework/Source/GPUImageWeakPixelInclusionFilter.h @@ -0,0 +1,5 @@ +#import "GPUImage3x3TextureSamplingFilter.h" + +@interface GPUImageWeakPixelInclusionFilter : GPUImage3x3TextureSamplingFilter + +@end diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.m b/framework/Source/GPUImageWeakPixelInclusionFilter.m new file mode 100644 index 000000000..93fac458e --- /dev/null +++ b/framework/Source/GPUImageWeakPixelInclusionFilter.m @@ -0,0 +1,56 @@ +#import "GPUImageWeakPixelInclusionFilter.h" + +@implementation GPUImageWeakPixelInclusionFilter + +NSString *const kGPUImageWeakPixelInclusionFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; + + float pixelIntensitySum = bottomLeftIntensity + topRightIntensity + topLeftIntensity + bottomRightIntensity + leftIntensity + rightIntensity + bottomIntensity + topIntensity + centerIntensity; + float sumTest = step(1.5, pixelIntensitySum); + float pixelTest = step(0.01, centerIntensity); + + gl_FragColor = vec4(vec3(sumTest * pixelTest), 1.0); + } +); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImageWeakPixelInclusionFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h new file mode 100644 index 000000000..3aca74633 --- /dev/null +++ b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h @@ -0,0 +1,5 @@ +#import "GPUImage3x3TextureSamplingFilter.h" + +@interface GPUimageDirectionalSobelEdgeDetectionFilter : GPUImage3x3TextureSamplingFilter + +@end diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m new file mode 100644 index 000000000..00627b81c --- /dev/null +++ b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m @@ -0,0 +1,61 @@ +#import "GPUimageDirectionalSobelEdgeDetectionFilter.h" + +@implementation GPUimageDirectionalSobelEdgeDetectionFilter + +NSString *const kGPUImageDirectionalSobelEdgeDetectionFragmentShaderString = SHADER_STRING +( + precision mediump float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + + vec2 gradientDirection; + gradientDirection.x = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + gradientDirection.y = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + + float gradientMagnitude = length(gradientDirection); + vec2 normalizedDirection = normalize(gradientDirection); + normalizedDirection = sign(normalizedDirection) * floor(abs(normalizedDirection) + 0.617316); // Offset by 1-sin(pi/8) to set to 0 if near axis, 1 if away + normalizedDirection = (normalizedDirection + 1.0) * 0.5; // Place -1.0 - 1.0 within 0 - 1.0 + + gl_FragColor = vec4(gradientMagnitude, normalizedDirection.x, normalizedDirection.y, 1.0); + } +); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageDirectionalSobelEdgeDetectionFragmentShaderString])) + { + return nil; + } + + return self; +} + + +@end From 68cf7450d284015a4e15c37d6da15dcedef190c9 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 26 May 2012 23:20:21 -0500 Subject: [PATCH 115/695] Updated some documentation around the new Canny filter. --- README.md | 39 ++++++++++++------- .../Source/GPUImageCannyEdgeDetectionFilter.h | 13 ++++++- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 488401aa6..5b7c5e600 100755 --- a/README.md +++ b/README.md @@ -135,13 +135,31 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImage3x3ConvolutionFilter**: Runs a 3x3 convolution kernel against the image - *convolutionKernel*: The convolution kernel is a 3x3 matrix of values to apply to the pixel and its 8 surrounding pixels. The matrix is specified in row-major order, with the top left pixel being one.one and the bottom right three.three. If the values in the matrix don't add up to 1.0, the image could be brightened or darkened. -- **GPUImageEmbossFilter**: Applies an embossing effect on the image - - *intensity*: The strength of the embossing, from 0.0 to 4.0, with 1.0 as the normal level +- **GPUImageSobelEdgeDetectionFilter**: Sobel edge detection, with edges highlighted in white + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges + +- **GPUImageCannyEdgeDetectionFilter**: This uses the full Canny process to highlight one-pixel-wide edges + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges + - *blurSize*: A multiplier for the prepass blur size, ranging from 0.0 on up, with a default of 1.0 + - *upperThreshold*: Any edge with a gradient magnitude above this threshold will pass and show up in the final result. Default is 0.4. + - *lowerThreshold*: Any edge with a gradient magnitude below this threshold will fail and be removed from the final result. Default is 0.1. - **GPUImageHarrisCornerDetectionFilter**: Runs the Harris corner detection algorithm on an input image, and produces an image with those corner points as white pixels and everything else black. The cornersDetectedBlock can be set, and you will be provided with a list of corners (in normalized 0..1 X, Y coordinates) within that callback for whatever additional operations you want to perform. - *blurSize*: The relative size of the blur applied as part of the corner detection implementation. The default is 1.0. - - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 10.0. - - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.05. + - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 5.0. + - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.20. + +- **GPUImageNobleCornerDetectionFilter**: Runs the Noble variant on the Harris corner detector. It behaves as described above for the Harris detector. + - *blurSize*: The relative size of the blur applied as part of the corner detection implementation. The default is 1.0. + - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 5.0. + - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.2. + +- **GPUImageShiTomasiCornerDetectionFilter**: Runs the Shi-Tomasi feature detector. It behaves as described above for the Harris detector. + - *blurSize*: The relative size of the blur applied as part of the corner detection implementation. The default is 1.0. + - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 1.5. + - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.2. - **GPUImageNonMaximumSuppressionFilter**: Currently used only as part of the Harris corner detection filter, this will sample a 1-pixel box around each pixel and determine if the center pixel's red channel is the maximum in that area. If it is, it stays. If not, it is set to 0 for all color components. @@ -197,16 +215,6 @@ Documentation is generated from header comments using appledoc. To build the doc - *crossHatchSpacing*: The fractional width of the image to use as the spacing for the crosshatch. The default is 0.03. - *lineWidth*: A relative width for the crosshatch lines. The default is 0.003. -- **GPUImageSobelEdgeDetectionFilter**: Sobel edge detection, with edges highlighted in white - - *texelWidth*: - - *texelHeight*: These parameters affect the visibility of the detected edges - -- **GPUImageCannyEdgeDetectionFilter**: This uses a Gaussian blur before applying a Sobel operator to highlight edges - - *texelWidth*: - - *texelHeight*: These parameters affect the visibility of the detected edges - - *blurSize*: A multiplier for the prepass blur size, ranging from 0.0 on up, with a default of 1.0 - - *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.5 as the default - - **GPUImageSketchFilter**: Converts video to look like a sketch. This is just the Sobel edge detection filter with the colors inverted - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges @@ -224,6 +232,9 @@ Documentation is generated from header comments using appledoc. To build the doc - *threshold*: The sensitivity of the edge detection, with lower values being more sensitive. Ranges from 0.0 to 1.0, with 0.2 as the default - *quantizationLevels*: The number of color levels to represent in the final image. Default is 10.0 +- **GPUImageEmbossFilter**: Applies an embossing effect on the image + - *intensity*: The strength of the embossing, from 0.0 to 4.0, with 1.0 as the normal level + - **GPUImagePosterizeFilter**: This reduces the color dynamic range into the number of steps specified, leading to a cartoon-like simple shading of the image. - *colorLevels*: The number of color levels to reduce the image space to. This ranges from 1 to 256, with a default of 10. diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h index 6adbd93cb..5df34c501 100755 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.h +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.h @@ -6,7 +6,18 @@ @class GPUImageDirectionalNonMaximumSuppressionFilter; @class GPUImageWeakPixelInclusionFilter; -/** This uses a Gaussian blur, followed by applying a Sobel operator, then a thresholding operation, in order to highlight edges +/** This applies the edge detection process described by John Canny in + + Canny, J., A Computational Approach To Edge Detection, IEEE Trans. Pattern Analysis and Machine Intelligence, 8(6):679–698, 1986. + + and implemented in OpenGL ES by + + A. Ensor, S. Hall. GPU-based Image Analysis on Mobile Devices. Proceedings of Image and Vision Computing New Zealand 2011. + + It starts with a conversion to luminance, followed by an accelerated 9-hit Gaussian blur. A Sobel operator is applied to obtain the overall + gradient strength in the blurred image, as well as the direction (in texture sampling steps) of the gradient. A non-maximum suppression filter + acts along the direction of the gradient, highlighting strong edges that pass the threshold and completely removing those that fail the lower + threshold. Finally, pixels from in-between these thresholds are either included in edges or rejected based on neighboring pixels. */ @interface GPUImageCannyEdgeDetectionFilter : GPUImageFilterGroup { From 615dc5dc9f3223e23073b23f4d94ad827cc4394c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 28 May 2012 12:16:41 -0500 Subject: [PATCH 116/695] Added a fix for a compilation error and a quick check to reduce redundant context setting calls. --- .../RawDataTest/RawDataTest/RawDataTestAppDelegate.m | 2 ++ .../Source/GPUImageHarrisCornerDetectionFilter.m | 11 +++-------- framework/Source/GPUImageOpenGLESContext.m | 6 +++++- framework/Source/GPUImageRawDataInput.h | 1 + 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m index 476f4a651..68a99d555 100644 --- a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m +++ b/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m @@ -44,6 +44,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( }]; [rawDataInput processData]; + + free(rawDataBytes); return YES; } diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 320fee81b..7dee8f26a 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -89,8 +89,6 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS // First pass: reduce to luminance and take the derivative of the luminance texture derivativeFilter = [[GPUImageXYDerivativeFilter alloc] init]; -// derivativeFilter.imageWidthFactor = 256.0; -// derivativeFilter.imageHeightFactor = 256.0; [self addFilter:derivativeFilter]; #ifdef DEBUGFEATUREDETECTION @@ -103,7 +101,6 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS #endif // Second pass: blur the derivative -// blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; blurFilter = [[GPUImageFastBlurFilter alloc] init]; [self addFilter:blurFilter]; @@ -162,8 +159,6 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS [nonMaximumSuppressionFilter addTarget:simpleThresholdFilter]; self.initialFilters = [NSArray arrayWithObjects:derivativeFilter, nil]; -// self.terminalFilter = harrisCornerDetectionFilter; -// self.terminalFilter = nonMaximumSuppressionFilter; self.terminalFilter = simpleThresholdFilter; self.blurSize = 1.0; @@ -196,7 +191,7 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; glReadPixels(0, 0, (int)imageSize.width, (int)imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); - CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); +// CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); for (unsigned int yCoordinate = 0; yCoordinate < imageSize.height; yCoordinate++) { @@ -216,8 +211,8 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; } } - CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); - NSLog(@"Processing time : %f ms", 1000.0 * currentFrameTime); +// CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); +// NSLog(@"Processing time : %f ms", 1000.0 * currentFrameTime); if (cornersDetectedBlock != NULL) { diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 22c35aa76..400eccb65 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -20,7 +20,11 @@ + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; + (void)useImageProcessingContext; { - [EAGLContext setCurrentContext:[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context]]; + EAGLContext *imageProcessingContext = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context]; + if ([EAGLContext currentContext] != imageProcessingContext) + { + [EAGLContext setCurrentContext:imageProcessingContext]; + } } + (GLint)maximumTextureSizeForThisDevice; diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h index e97c70a1e..02f59808e 100644 --- a/framework/Source/GPUImageRawDataInput.h +++ b/framework/Source/GPUImageRawDataInput.h @@ -15,5 +15,6 @@ // Image rendering - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; - (void)processData; +- (CGSize)outputImageSize; @end From 7a83129167c7971b07f481de4d0bd56ebfe2d9da Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 28 May 2012 19:47:55 -0500 Subject: [PATCH 117/695] Tried to fix a calculation issue with the tone curve filter. Tried to fix a problem with the second texture on blend filters. --- .../ShowcaseFilterViewController.m | 7 ++-- framework/Source/GPUImageToneCurveFilter.h | 6 ++-- framework/Source/GPUImageToneCurveFilter.m | 33 +++++++++++++++---- framework/Source/GPUImageTwoInputFilter.m | 10 ++++++ 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 21941bc93..810df6375 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -823,6 +823,7 @@ - (void)setupFilter; } videoCamera.runBenchmark = YES; + GPUImageView *filterView = (GPUImageView *)self.view; if (needsSecondImage) { @@ -841,15 +842,11 @@ - (void)setupFilter; inputImage = [UIImage imageNamed:@"WID-small.jpg"]; } - sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; - [sourcePicture addTarget:filter]; - [sourcePicture processImage]; - + [sourcePicture addTarget:filter]; } - GPUImageView *filterView = (GPUImageView *)self.view; if (filterType == GPUIMAGE_HISTOGRAM) { diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h index 2c2f2e24a..ef2cc8e59 100644 --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -4,9 +4,9 @@ // The tone curve takes in a series of control points that define the spline curve for each color component. // These are stored as NSValue-wrapped CGPoints in an NSArray, with normalized X and Y coordinates from 0 - 1. The defaults are (0,0), (0.5,0.5), (1,1). -@property(readwrite, nonatomic, strong) NSArray *redControlPoints; -@property(readwrite, nonatomic, strong) NSArray *greenControlPoints; -@property(readwrite, nonatomic, strong) NSArray *blueControlPoints; +@property(readwrite, nonatomic, copy) NSArray *redControlPoints; +@property(readwrite, nonatomic, copy) NSArray *greenControlPoints; +@property(readwrite, nonatomic, copy) NSArray *blueControlPoints; // This lets you set all three red, green, and blue tone curves at once. - (void)setRGBControlPoints:(NSArray *)points; diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 5696898d3..30d08e28f 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -115,11 +115,13 @@ - (NSArray *)splineCurve:(NSArray *)points { NSArray *sdA = [self secondDerivative:points]; - int n = [points count]; + // Is [points count] equal to [sdA count]? +// int n = [points count]; + int n = [sdA count]; double sd[n]; // From NSMutableArray to sd[n]; - for (int i=0; i<[sdA count]; i++) + for (int i=0; idown) for(int i=1;i Date: Tue, 29 May 2012 21:24:32 -0500 Subject: [PATCH 118/695] Added a check to remove the one analyzer warning. --- framework/Source/GPUImageToneCurveFilter.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 30d08e28f..f85d4eb50 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -155,10 +155,13 @@ - (NSArray *)splineCurve:(NSArray *)points return output; } - - (NSArray *)secondDerivative:(NSArray *)points { int n = [points count]; + if ((n <= 0) || (n == 1)) + { + return nil; + } double matrix[n][3]; double result[n]; @@ -217,7 +220,6 @@ - (NSArray *)secondDerivative:(NSArray *)points return output; } - - (void)updateToneCurveTexture; { [GPUImageOpenGLESContext useImageProcessingContext]; From a38508d5c92c210161beb7fc67ebead9efc86257 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 29 May 2012 21:28:48 -0500 Subject: [PATCH 119/695] Added range checking to the tone curve, per Cameron Perry's suggestion. --- framework/Source/GPUImageToneCurveFilter.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index f85d4eb50..ffbcab8d7 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -143,6 +143,15 @@ - (NSArray *)splineCurve:(NSArray *)points double h = next.x-cur.x; double y= a*cur.y + b*next.y + (h*h/6)*( (a*a*a-a)*sd[i]+ (b*b*b-b)*sd[i+1] ); + + if (y > 255.0) + { + y = 255.0; + } + else if (y < 0.0) + { + y = 0.0; + } [output addObject:[NSValue valueWithCGPoint:CGPointMake(x, y)]]; } From 98f329ed5f43fbc8247865a88c7c587c8980057f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 30 May 2012 11:43:46 -0500 Subject: [PATCH 120/695] Added a frame time for the texture input to support movie recording. --- examples/CubeExample/Classes/DisplayViewController.h | 2 ++ examples/CubeExample/Classes/DisplayViewController.m | 4 +++- framework/Source/GPUImageTextureInput.h | 2 +- framework/Source/GPUImageTextureInput.m | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/examples/CubeExample/Classes/DisplayViewController.h b/examples/CubeExample/Classes/DisplayViewController.h index d62f7b59a..dfbe70834 100755 --- a/examples/CubeExample/Classes/DisplayViewController.h +++ b/examples/CubeExample/Classes/DisplayViewController.h @@ -12,6 +12,8 @@ ES2Renderer *renderer; GPUImageTextureInput *textureInput; GPUImageFilter *filter; + + NSDate *startTime; } - (void)drawView:(id)sender; diff --git a/examples/CubeExample/Classes/DisplayViewController.m b/examples/CubeExample/Classes/DisplayViewController.m index 97438fa09..0639ff673 100755 --- a/examples/CubeExample/Classes/DisplayViewController.m +++ b/examples/CubeExample/Classes/DisplayViewController.m @@ -43,7 +43,9 @@ - (void)loadView [filter addTarget:primaryView]; [renderer setNewFrameAvailableBlock:^{ - [textureInput processTexture]; + float currentTimeInMilliseconds = [[NSDate date] timeIntervalSinceDate:startTime] * 1000.0; + + [textureInput processTextureWithFrameTime:CMTimeMake((int)currentTimeInMilliseconds, 1000)]; }]; } diff --git a/framework/Source/GPUImageTextureInput.h b/framework/Source/GPUImageTextureInput.h index 400094bba..8190305dc 100755 --- a/framework/Source/GPUImageTextureInput.h +++ b/framework/Source/GPUImageTextureInput.h @@ -9,6 +9,6 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; // Image rendering -- (void)processTexture; +- (void)processTextureWithFrameTime:(CMTime)frameTime; @end diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index a50fbe332..6eca8653b 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -23,7 +23,7 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; #pragma mark - #pragma mark Image rendering -- (void)processTexture; +- (void)processTextureWithFrameTime:(CMTime)frameTime; { for (id currentTarget in targets) { @@ -31,7 +31,7 @@ - (void)processTexture; NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:textureSize atIndex:targetTextureIndex]; - [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; + [currentTarget newFrameReadyAtTime:frameTime]; } } From f7f395b81a94f7209fb46fbc1186412b0094d49f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 2 Jun 2012 16:38:25 -0500 Subject: [PATCH 121/695] Added a UI element input for injecting UIViews and CALayers into the processing pipeline. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 41 +++++++- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageStillCamera.m | 2 +- framework/Source/GPUImageTwoInputFilter.m | 11 ++- framework/Source/GPUImageUIElement.h | 13 +++ framework/Source/GPUImageUIElement.m | 98 +++++++++++++++++++ framework/Source/GPUImageView.m | 2 +- 10 files changed, 171 insertions(+), 8 deletions(-) create mode 100644 framework/Source/GPUImageUIElement.h create mode 100644 framework/Source/GPUImageUIElement.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 40a66762e..949374842 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -128,6 +128,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_BILATERAL: cell.textLabel.text = @"Bilateral blur"; break; case GPUIMAGE_BOXBLUR: cell.textLabel.text = @"Box blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: cell.textLabel.text = @"Gaussian selective blur"; break; + case GPUIMAGE_UIELEMENT: cell.textLabel.text = @"UI element"; break; case GPUIMAGE_CUSTOM: cell.textLabel.text = @"Custom"; break; case GPUIMAGE_FILECONFIG: cell.textLabel.text = @"Filter Chain"; break; case GPUIMAGE_FILTERGROUP: cell.textLabel.text = @"Filter Group"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 6353bb466..dfd8db1a5 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -70,6 +70,7 @@ typedef enum { GPUIMAGE_HARDLIGHTBLEND, GPUIMAGE_SOFTLIGHTBLEND, GPUIMAGE_CUSTOM, + GPUIMAGE_UIELEMENT, GPUIMAGE_FILECONFIG, GPUIMAGE_FILTERGROUP, GPUIMAGE_NUMFILTERS @@ -82,6 +83,7 @@ typedef enum { GPUImageOutput *filter; GPUImagePicture *sourcePicture; GPUImageShowcaseFilterType filterType; + GPUImageUIElement *uiElementInput; GPUImageFilterPipeline *pipeline; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 810df6375..127015a6f 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -759,6 +759,13 @@ - (void)setupFilter; filter = [[GPUImageMedianFilter alloc] init]; }; break; + case GPUIMAGE_UIELEMENT: + { + self.title = @"UI Element"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageSepiaFilter alloc] init]; + }; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: { self.title = @"Selective Blur"; @@ -818,7 +825,8 @@ - (void)setupFilter; else { - if (filterType != GPUIMAGE_VORONI) { + if (filterType != GPUIMAGE_VORONI) + { [videoCamera addTarget:filter]; } @@ -890,7 +898,36 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } - + else if (filterType == GPUIMAGE_UIELEMENT) + { + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + blendFilter.mix = 1.0; + + NSDate *startTime = [NSDate date]; + + UILabel *timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 240.0f, 320.0f)]; + timeLabel.font = [UIFont systemFontOfSize:17.0f]; + timeLabel.text = @"Time: 0.0 s"; + timeLabel.textAlignment = UITextAlignmentCenter; + timeLabel.backgroundColor = [UIColor clearColor]; + timeLabel.textColor = [UIColor whiteColor]; + + uiElementInput = [[GPUImageUIElement alloc] initWithView:timeLabel]; + + [filter addTarget:blendFilter]; + [uiElementInput addTarget:blendFilter]; + + [blendFilter addTarget:filterView]; + + uiElementInput.targetToIgnoreForUpdates = blendFilter; + + __unsafe_unretained GPUImageUIElement *weakUIElementInput = uiElementInput; + + [filter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){ + timeLabel.text = [NSString stringWithFormat:@"Time: %f s", -[startTime timeIntervalSinceNow]]; + [weakUIElementInput update]; + }]; + } else { [filter addTarget:filterView]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 5cfaab836..7b9f74c4e 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -56,6 +56,8 @@ BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */; }; BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; + BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; }; + BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D8291579779700CC9C1E /* GPUImageUIElement.m */; }; BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; }; @@ -280,6 +282,8 @@ BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePerlinNoiseFilter.m; path = Source/GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyBlendFilter.h; path = Source/GPUImageChromaKeyBlendFilter.h; sourceTree = SOURCE_ROOT; }; BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BC56D8281579779700CC9C1E /* GPUImageUIElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageUIElement.h; path = Source/GPUImageUIElement.h; sourceTree = SOURCE_ROOT; }; + BC56D8291579779700CC9C1E /* GPUImageUIElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageUIElement.m; path = Source/GPUImageUIElement.m; sourceTree = SOURCE_ROOT; }; BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBilateralFilter.h; path = Source/GPUImageBilateralFilter.h; sourceTree = SOURCE_ROOT; }; @@ -649,6 +653,8 @@ BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */, BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */, BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */, + BC56D8281579779700CC9C1E /* GPUImageUIElement.h */, + BC56D8291579779700CC9C1E /* GPUImageUIElement.m */, ); name = Sources; sourceTree = ""; @@ -914,6 +920,7 @@ BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */, BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */, BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */, + BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1126,6 +1133,7 @@ BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */, BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */, BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */, + BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 1ba488e67..4de91f628 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -15,6 +15,7 @@ #import "GPUImageTextureOutput.h" #import "GPUImageFilterGroup.h" #import "GPUImageTextureInput.h" +#import "GPUImageUIElement.h" // Filters #import "GPUImageFilter.h" diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 79c721b16..af27bd448 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -150,7 +150,7 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f // report_memory(@"After filter processing"); - NSData *dataForJPEGFile = nil; + __strong NSData *dataForJPEGFile = nil; @autoreleasepool { UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index bfa331ea6..8ee89dbf2 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -121,11 +121,14 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { - [super setInputSize:newSize atIndex:textureIndex]; - - if ((textureIndex == 0) && (CGSizeEqualToSize(newSize, CGSizeZero))) + if (textureIndex == 0) { - hasSetFirstTexture = NO; + [super setInputSize:newSize atIndex:textureIndex]; + + if (CGSizeEqualToSize(newSize, CGSizeZero)) + { + hasSetFirstTexture = NO; + } } } diff --git a/framework/Source/GPUImageUIElement.h b/framework/Source/GPUImageUIElement.h new file mode 100644 index 000000000..09fe9324e --- /dev/null +++ b/framework/Source/GPUImageUIElement.h @@ -0,0 +1,13 @@ +#import "GPUImageOutput.h" + +@interface GPUImageUIElement : GPUImageOutput + +// Initialization and teardown +- (id)initWithView:(UIView *)inputView; +- (id)initWithLayer:(CALayer *)inputLayer; + +// Layer management +- (CGSize)layerSizeInPixels; +- (void)update; + +@end diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m new file mode 100644 index 000000000..e9e8ea121 --- /dev/null +++ b/framework/Source/GPUImageUIElement.m @@ -0,0 +1,98 @@ +#import "GPUImageUIElement.h" + +@interface GPUImageUIElement () +{ + UIView *view; + CALayer *layer; + + CGSize previousLayerSizeInPixels; +} + +@end + +@implementation GPUImageUIElement + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithView:(UIView *)inputView; +{ + if (!(self = [super init])) + { + return nil; + } + + view = inputView; + layer = inputView.layer; + + previousLayerSizeInPixels = CGSizeZero; + [self update]; + + return self; +} + +- (id)initWithLayer:(CALayer *)inputLayer; +{ + if (!(self = [super init])) + { + return nil; + } + + view = nil; + layer = inputLayer; + + previousLayerSizeInPixels = CGSizeZero; + [self update]; + + return self; +} + +#pragma mark - +#pragma mark Layer management + +- (CGSize)layerSizeInPixels; +{ + CGSize pointSize = layer.bounds.size; + return CGSizeMake(layer.contentsScale * pointSize.width, layer.contentsScale * pointSize.height); +} + +- (void)update; +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + CGSize layerPixelSize = [self layerSizeInPixels]; + + GLubyte *imageData = (GLubyte *) calloc(1, (int)layerPixelSize.width * (int)layerPixelSize.height * 4); + + CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); + CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)layerPixelSize.width, (int)layerPixelSize.height, 8, (int)layerPixelSize.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); +// CGContextRotateCTM(imageContext, M_PI_2); + CGContextTranslateCTM(imageContext, 0.0f, layerPixelSize.height); + CGContextScaleCTM(imageContext, layer.contentsScale, -layer.contentsScale); + // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html + + [layer renderInContext:imageContext]; + + CGContextRelease(imageContext); + CGColorSpaceRelease(genericRGBColorspace); + + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)layerPixelSize.width, (int)layerPixelSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); + + free(imageData); + + + for (id currentTarget in targets) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:layerPixelSize atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; + } + } +} + +@end diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 7b28b3a65..9b8a75dde 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -119,7 +119,7 @@ - (void)commonInit; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - if (object == self && [keyPath isEqualToString:@"frame"]) + if (object == self && [keyPath isEqualToString:@"frame"] && (!CGSizeEqualToSize(self.bounds.size, CGSizeZero))) { [self destroyDisplayFramebuffer]; [self createDisplayFramebuffer]; From 752dea0f55d4c5f11c5735a4b18f828065c255d7 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 3 Jun 2012 16:09:28 -0500 Subject: [PATCH 122/695] Added binary erosion and dilation filters. --- .../FeatureExtractionAppDelegate.m | 17 +++++ .../ShowcaseFilterViewController.m | 1 + framework/GPUImage.xcodeproj/project.pbxproj | 16 +++++ framework/Source/GPUImage.h | 2 + framework/Source/GPUImageDilationFilter.h | 5 ++ framework/Source/GPUImageDilationFilter.m | 61 ++++++++++++++++++ framework/Source/GPUImageErosionFilter.h | 5 ++ framework/Source/GPUImageErosionFilter.m | 62 +++++++++++++++++++ framework/Source/GPUImageFastBlurFilter.m | 26 ++++++++ framework/Source/GPUImageView.m | 2 +- 10 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageDilationFilter.h create mode 100644 framework/Source/GPUImageDilationFilter.m create mode 100644 framework/Source/GPUImageErosionFilter.h create mode 100644 framework/Source/GPUImageErosionFilter.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index 6518a6378..73c1b6607 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -18,6 +18,22 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [self testNobleCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; [self testShiTomasiCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; + + // Testing erosion and dilation + GPUImageErosionFilter *erosionFilter = [[GPUImageErosionFilter alloc] init]; + [blackAndWhiteBoxImage removeAllTargets]; + [blackAndWhiteBoxImage addTarget:erosionFilter]; + [blackAndWhiteBoxImage processImage]; + UIImage *erosionImage = [erosionFilter imageFromCurrentlyProcessedOutput]; + [self saveImage:erosionImage fileName:@"Erosion.png"]; + + GPUImageDilationFilter *dilationFilter = [[GPUImageDilationFilter alloc] init]; + [blackAndWhiteBoxImage removeAllTargets]; + [blackAndWhiteBoxImage addTarget:dilationFilter]; + [blackAndWhiteBoxImage processImage]; + UIImage *dilationImage = [dilationFilter imageFromCurrentlyProcessedOutput]; + [self saveImage:dilationImage fileName:@"Dilation.png"]; + return YES; } @@ -36,6 +52,7 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector }]; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [blendFilter forceProcessingAtSize:[pictureInput outputImageSize]]; [pictureInput addTarget:blendFilter]; pictureInput.targetToIgnoreForUpdates = blendFilter; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 127015a6f..e65ee05b4 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -889,6 +889,7 @@ - (void)setupFilter; }]; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; [videoCamera addTarget:gammaFilter]; [gammaFilter addTarget:blendFilter]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 7b9f74c4e..a1c1a43d4 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -58,6 +58,10 @@ BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; }; BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D8291579779700CC9C1E /* GPUImageUIElement.m */; }; + BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; }; + BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */; }; + BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; }; + BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; }; @@ -284,6 +288,10 @@ BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; BC56D8281579779700CC9C1E /* GPUImageUIElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageUIElement.h; path = Source/GPUImageUIElement.h; sourceTree = SOURCE_ROOT; }; BC56D8291579779700CC9C1E /* GPUImageUIElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageUIElement.m; path = Source/GPUImageUIElement.m; sourceTree = SOURCE_ROOT; }; + BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDilationFilter.h; path = Source/GPUImageDilationFilter.h; sourceTree = SOURCE_ROOT; }; + BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDilationFilter.m; path = Source/GPUImageDilationFilter.m; sourceTree = SOURCE_ROOT; }; + BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageErosionFilter.h; path = Source/GPUImageErosionFilter.h; sourceTree = SOURCE_ROOT; }; + BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageErosionFilter.m; path = Source/GPUImageErosionFilter.m; sourceTree = SOURCE_ROOT; }; BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBilateralFilter.h; path = Source/GPUImageBilateralFilter.h; sourceTree = SOURCE_ROOT; }; @@ -731,6 +739,10 @@ BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */, BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */, BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */, + BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */, + BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */, + BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */, + BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -921,6 +933,8 @@ BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */, BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */, BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */, + BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */, + BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1134,6 +1148,8 @@ BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */, BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */, BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */, + BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */, + BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 4de91f628..183b54646 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -92,3 +92,5 @@ #import "GPUImageToneCurveFilter.h" #import "GPUImageNobleCornerDetectionFilter.h" #import "GPUImageShiTomasiFeatureDetectionFilter.h" +#import "GPUImageErosionFilter.h" +#import "GPUImageDilationFilter.h" diff --git a/framework/Source/GPUImageDilationFilter.h b/framework/Source/GPUImageDilationFilter.h new file mode 100644 index 000000000..6506f5355 --- /dev/null +++ b/framework/Source/GPUImageDilationFilter.h @@ -0,0 +1,5 @@ +#import "GPUImage3x3TextureSamplingFilter.h" + +@interface GPUImageDilationFilter : GPUImage3x3TextureSamplingFilter + +@end diff --git a/framework/Source/GPUImageDilationFilter.m b/framework/Source/GPUImageDilationFilter.m new file mode 100644 index 000000000..334fc474e --- /dev/null +++ b/framework/Source/GPUImageDilationFilter.m @@ -0,0 +1,61 @@ +#import "GPUImageDilationFilter.h" + +@implementation GPUImageDilationFilter + +NSString *const kGPUImageDilationFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + + lowp float maxValue = max(centerIntensity, bottomLeftIntensity); + maxValue = max(maxValue, topRightIntensity); + maxValue = max(maxValue, topLeftIntensity); + maxValue = max(maxValue, bottomRightIntensity); + maxValue = max(maxValue, leftIntensity); + maxValue = max(maxValue, rightIntensity); + maxValue = max(maxValue, bottomIntensity); + maxValue = max(maxValue, topIntensity); + + gl_FragColor = vec4(vec3(maxValue), 1.0); + } +); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImageDilationFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageErosionFilter.h b/framework/Source/GPUImageErosionFilter.h new file mode 100644 index 000000000..8c0d569d6 --- /dev/null +++ b/framework/Source/GPUImageErosionFilter.h @@ -0,0 +1,5 @@ +#import "GPUImage3x3TextureSamplingFilter.h" + +@interface GPUImageErosionFilter : GPUImage3x3TextureSamplingFilter + +@end diff --git a/framework/Source/GPUImageErosionFilter.m b/framework/Source/GPUImageErosionFilter.m new file mode 100644 index 000000000..9d4300d58 --- /dev/null +++ b/framework/Source/GPUImageErosionFilter.m @@ -0,0 +1,62 @@ +#import "GPUImageErosionFilter.h" + +@implementation GPUImageErosionFilter + +NSString *const kGPUImageErosionFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + + lowp float minValue = min(centerIntensity, bottomLeftIntensity); + minValue = min(minValue, topRightIntensity); + minValue = min(minValue, topLeftIntensity); + minValue = min(minValue, bottomRightIntensity); + minValue = min(minValue, leftIntensity); + minValue = min(minValue, rightIntensity); + minValue = min(minValue, bottomIntensity); + minValue = min(minValue, topIntensity); + + gl_FragColor = vec4(vec3(minValue), 1.0); + } + ); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImageErosionFragmentShaderString])) + { + return nil; + } + + return self; +} + + +@end diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index 535f5a0af..f98a0e8ab 100755 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -61,6 +61,32 @@ void main() } ); +NSString *const kGPUImageFastBlurIgnoringAlphaFragmentShaderString = SHADER_STRING +( + precision highp float; + + uniform sampler2D inputImageTexture; + + varying highp vec2 centerTextureCoordinate; + varying highp vec2 oneStepLeftTextureCoordinate; + varying highp vec2 twoStepsLeftTextureCoordinate; + varying highp vec2 oneStepRightTextureCoordinate; + varying highp vec2 twoStepsRightTextureCoordinate; + + // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); + + void main() + { + lowp vec3 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).rgb * 0.2270270270; + fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate).rgb * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate).rgb * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate).rgb * 0.0702702703; + fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate).rgb * 0.0702702703; + + gl_FragColor = vec4(fragmentColor, 1.0); + } +); + @implementation GPUImageFastBlurFilter @synthesize blurPasses = _blurPasses; diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 9b8a75dde..74aba2973 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -158,7 +158,7 @@ - (void)createDisplayFramebuffer; glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, displayRenderbuffer); GLuint framebufferCreationStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); - NSAssert(framebufferCreationStatus == GL_FRAMEBUFFER_COMPLETE, @"Failure with display framebuffer generation"); + NSAssert(framebufferCreationStatus == GL_FRAMEBUFFER_COMPLETE, @"Failure with display framebuffer generation for display of size: %f, %f", self.bounds.size.width, self.bounds.size.height); } - (void)destroyDisplayFramebuffer; From d183c280c351180ebd77a77dd65b813d1e94545e Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 3 Jun 2012 17:20:20 -0500 Subject: [PATCH 123/695] Made the erosion and dilation filters use separable kernels, and added four different radii for them. --- .../FeatureExtractionAppDelegate.m | 8 +- framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImageBoxBlurFilter.h | 6 +- framework/Source/GPUImageBoxBlurFilter.m | 25 -- framework/Source/GPUImageDilationFilter.h | 10 +- framework/Source/GPUImageDilationFilter.m | 314 ++++++++++++++++-- framework/Source/GPUImageErosionFilter.h | 10 +- framework/Source/GPUImageErosionFilter.m | 313 +++++++++++++++-- framework/Source/GPUImageFastBlurFilter.h | 6 +- framework/Source/GPUImageFastBlurFilter.m | 27 +- framework/Source/GPUImageGaussianBlurFilter.h | 5 +- framework/Source/GPUImageGaussianBlurFilter.m | 29 -- .../GPUImageTwoPassTextureSamplingFilter.h | 7 + .../GPUImageTwoPassTextureSamplingFilter.m | 46 +++ 14 files changed, 657 insertions(+), 157 deletions(-) create mode 100644 framework/Source/GPUImageTwoPassTextureSamplingFilter.h create mode 100644 framework/Source/GPUImageTwoPassTextureSamplingFilter.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index 73c1b6607..b2f6b14f5 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -20,19 +20,19 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( // Testing erosion and dilation - GPUImageErosionFilter *erosionFilter = [[GPUImageErosionFilter alloc] init]; + GPUImageErosionFilter *erosionFilter = [[GPUImageErosionFilter alloc] initWithRadius:4]; [blackAndWhiteBoxImage removeAllTargets]; [blackAndWhiteBoxImage addTarget:erosionFilter]; [blackAndWhiteBoxImage processImage]; UIImage *erosionImage = [erosionFilter imageFromCurrentlyProcessedOutput]; - [self saveImage:erosionImage fileName:@"Erosion.png"]; + [self saveImage:erosionImage fileName:@"Erosion4.png"]; - GPUImageDilationFilter *dilationFilter = [[GPUImageDilationFilter alloc] init]; + GPUImageDilationFilter *dilationFilter = [[GPUImageDilationFilter alloc] initWithRadius:4]; [blackAndWhiteBoxImage removeAllTargets]; [blackAndWhiteBoxImage addTarget:dilationFilter]; [blackAndWhiteBoxImage processImage]; UIImage *dilationImage = [dilationFilter imageFromCurrentlyProcessedOutput]; - [self saveImage:dilationImage fileName:@"Dilation.png"]; + [self saveImage:dilationImage fileName:@"Dilation4.png"]; return YES; } diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index a1c1a43d4..32066bbc7 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -37,6 +37,8 @@ BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */; }; BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; }; BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */; }; + BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; }; + BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */; }; BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; }; BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; @@ -269,6 +271,8 @@ BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMedianFilter.m; path = Source/GPUImageMedianFilter.m; sourceTree = SOURCE_ROOT; }; BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage3x3TextureSamplingFilter.h; path = Source/GPUImage3x3TextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3TextureSamplingFilter.m; path = Source/GPUImage3x3TextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; + BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoPassTextureSamplingFilter.h; path = Source/GPUImageTwoPassTextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; + BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoPassTextureSamplingFilter.m; path = Source/GPUImageTwoPassTextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputFilter.h; path = Source/GPUImageTwoInputFilter.h; sourceTree = SOURCE_ROOT; }; BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputFilter.m; path = Source/GPUImageTwoInputFilter.m; sourceTree = SOURCE_ROOT; }; BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataOutput.h; path = Source/GPUImageRawDataOutput.h; sourceTree = SOURCE_ROOT; }; @@ -634,6 +638,8 @@ BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */, BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */, BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */, + BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */, + BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */, BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */, BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */, BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */, @@ -935,6 +941,7 @@ BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */, BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */, BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */, + BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1150,6 +1157,7 @@ BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */, BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */, BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */, + BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageBoxBlurFilter.h b/framework/Source/GPUImageBoxBlurFilter.h index ecf0df37c..b3fc81297 100755 --- a/framework/Source/GPUImageBoxBlurFilter.h +++ b/framework/Source/GPUImageBoxBlurFilter.h @@ -1,10 +1,10 @@ -#import "GPUImageTwoPassFilter.h" +#import "GPUImageTwoPassTextureSamplingFilter.h" /** A hardware-accelerated 9-hit box blur of an image */ -@interface GPUImageBoxBlurFilter : GPUImageTwoPassFilter +@interface GPUImageBoxBlurFilter : GPUImageTwoPassTextureSamplingFilter { - GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, firstBlurSizeUniform, secondBlurSizeUniform; + GLint firstBlurSizeUniform, secondBlurSizeUniform; } /// A scaling for the size of the applied blur, default of 1.0 diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index 72175f66f..dc8b7a1ab 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -69,12 +69,7 @@ - (id)init; return nil; } - verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; firstBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; - - horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; secondBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; self.blurSize = 1.0; @@ -82,26 +77,6 @@ - (id)init; return self; } -- (void)setupFilterForSize:(CGSize)filterFrameSize; -{ - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); - glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); - } - else - { - glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); - } - - [secondFilterProgram use]; - glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); - glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageDilationFilter.h b/framework/Source/GPUImageDilationFilter.h index 6506f5355..9d38c96cd 100644 --- a/framework/Source/GPUImageDilationFilter.h +++ b/framework/Source/GPUImageDilationFilter.h @@ -1,5 +1,11 @@ -#import "GPUImage3x3TextureSamplingFilter.h" +#import "GPUImageTwoPassTextureSamplingFilter.h" -@interface GPUImageDilationFilter : GPUImage3x3TextureSamplingFilter +// For each pixel, this sets it to the maximum value of the red channel in a rectangular neighborhood extending out dilationRadius pixels from the center. +// This extends out bright features, and is most commonly used with black-and-white thresholded images. + +@interface GPUImageDilationFilter : GPUImageTwoPassTextureSamplingFilter + +// Acceptable values for dilationRadius, which sets the distance in pixels to sample out from the center, are 1, 2, 3, and 4. +- (id)initWithRadius:(NSUInteger)dilationRadius; @end diff --git a/framework/Source/GPUImageDilationFilter.m b/framework/Source/GPUImageDilationFilter.m index 334fc474e..2b9b55899 100644 --- a/framework/Source/GPUImageDilationFilter.m +++ b/framework/Source/GPUImageDilationFilter.m @@ -2,57 +2,311 @@ @implementation GPUImageDilationFilter -NSString *const kGPUImageDilationFragmentShaderString = SHADER_STRING +// Radius: 1 +NSString *const kGPUImageDilationRadiusOneVertexShaderString = SHADER_STRING ( - precision lowp float; + attribute vec4 position; + attribute vec2 inputTextureCoordinate; - varying vec2 textureCoordinate; - varying vec2 leftTextureCoordinate; - varying vec2 rightTextureCoordinate; + uniform float texelWidthOffset; + uniform float texelHeightOffset; - varying vec2 topTextureCoordinate; - varying vec2 topLeftTextureCoordinate; - varying vec2 topRightTextureCoordinate; + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; - varying vec2 bottomTextureCoordinate; - varying vec2 bottomLeftTextureCoordinate; - varying vec2 bottomRightTextureCoordinate; + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + } +); + +NSString *const kGPUImageDilationRadiusOneFragmentShaderString = SHADER_STRING +( + precision lowp float; + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + uniform sampler2D inputImageTexture; void main() { - float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; - float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; - float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; - float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; - float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; - float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; - float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; - float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; - float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; - lowp float maxValue = max(centerIntensity, bottomLeftIntensity); - maxValue = max(maxValue, topRightIntensity); - maxValue = max(maxValue, topLeftIntensity); - maxValue = max(maxValue, bottomRightIntensity); - maxValue = max(maxValue, leftIntensity); - maxValue = max(maxValue, rightIntensity); - maxValue = max(maxValue, bottomIntensity); - maxValue = max(maxValue, topIntensity); + lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); gl_FragColor = vec4(vec3(maxValue), 1.0); } ); +// Radius: 2 +NSString *const kGPUImageDilationRadiusTwoVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + } +); + +NSString *const kGPUImageDilationRadiusTwoFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + + lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(maxValue), 1.0); + } +); + +// Radius: 3 +NSString *const kGPUImageDilationRadiusThreeVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); + threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); + } +); + +NSString *const kGPUImageDilationRadiusThreeFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; + float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; + + lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + maxValue = max(maxValue, threeStepsPositiveIntensity); + maxValue = max(maxValue, threeStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(maxValue), 1.0); + } +); + +// Radius: 4 +NSString *const kGPUImageDilationRadiusFourVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); + threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); + fourStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 4.0); + fourStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 4.0); + } +); + +NSString *const kGPUImageDilationRadiusFourFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; + float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; + float fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).r; + float fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).r; + + lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + maxValue = max(maxValue, threeStepsPositiveIntensity); + maxValue = max(maxValue, threeStepsNegativeIntensity); + maxValue = max(maxValue, fourStepsPositiveIntensity); + maxValue = max(maxValue, fourStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(maxValue), 1.0); + } +); + #pragma mark - #pragma mark Initialization and teardown +- (id)initWithRadius:(NSUInteger)dilationRadius; +{ + switch (dilationRadius) + { + case 0: + case 1: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusOneVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusOneFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusOneVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusOneFragmentShaderString])) + { + return nil; + } + }; break; + case 2: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusTwoVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusTwoFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusTwoVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusTwoFragmentShaderString])) + { + return nil; + } + }; break; + case 3: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusThreeVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusThreeFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusThreeVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusThreeFragmentShaderString])) + { + return nil; + } + }; break; + case 4: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusFourVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusFourFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusFourVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusFourFragmentShaderString])) + { + return nil; + } + }; break; + default: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusFourVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusFourFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusFourVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusFourFragmentShaderString])) + { + return nil; + } + }; break; + } + + return self; +} + - (id)init; { - if (!(self = [self initWithFragmentShaderFromString:kGPUImageDilationFragmentShaderString])) + if (!(self = [self initWithRadius:1])) { - return nil; + return nil; } return self; diff --git a/framework/Source/GPUImageErosionFilter.h b/framework/Source/GPUImageErosionFilter.h index 8c0d569d6..b8fffbaf4 100644 --- a/framework/Source/GPUImageErosionFilter.h +++ b/framework/Source/GPUImageErosionFilter.h @@ -1,5 +1,11 @@ -#import "GPUImage3x3TextureSamplingFilter.h" +#import "GPUImageTwoPassTextureSamplingFilter.h" -@interface GPUImageErosionFilter : GPUImage3x3TextureSamplingFilter +// For each pixel, this sets it to the minimum value of the red channel in a rectangular neighborhood extending out dilationRadius pixels from the center. +// This extends out dark features, and is most commonly used with black-and-white thresholded images. + +@interface GPUImageErosionFilter : GPUImageTwoPassTextureSamplingFilter + +// Acceptable values for dilationRadius, which sets the distance in pixels to sample out from the center, are 1, 2, 3, and 4. +- (id)initWithRadius:(NSUInteger)erosionRadius; @end diff --git a/framework/Source/GPUImageErosionFilter.m b/framework/Source/GPUImageErosionFilter.m index 9d4300d58..9b5e86a9c 100644 --- a/framework/Source/GPUImageErosionFilter.m +++ b/framework/Source/GPUImageErosionFilter.m @@ -2,44 +2,253 @@ @implementation GPUImageErosionFilter -NSString *const kGPUImageErosionFragmentShaderString = SHADER_STRING +// Radius: 1 +NSString *const kGPUImageErosionRadiusOneVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + } + ); + +NSString *const kGPUImageErosionRadiusOneFragmentShaderString = SHADER_STRING ( precision lowp float; - varying vec2 textureCoordinate; - varying vec2 leftTextureCoordinate; - varying vec2 rightTextureCoordinate; + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + + lowp float minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + + gl_FragColor = vec4(vec3(minValue), 1.0); + } + ); + +// Radius: 2 +NSString *const kGPUImageErosionRadiusTwoVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; - varying vec2 topTextureCoordinate; - varying vec2 topLeftTextureCoordinate; - varying vec2 topRightTextureCoordinate; + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + } + ); + +NSString *const kGPUImageErosionRadiusTwoFragmentShaderString = SHADER_STRING +( + precision lowp float; - varying vec2 bottomTextureCoordinate; - varying vec2 bottomLeftTextureCoordinate; - varying vec2 bottomRightTextureCoordinate; + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; uniform sampler2D inputImageTexture; void main() { - float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; - float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; - float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; - float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; - float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; - float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; - float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; - float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; - float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; - lowp float minValue = min(centerIntensity, bottomLeftIntensity); - minValue = min(minValue, topRightIntensity); - minValue = min(minValue, topLeftIntensity); - minValue = min(minValue, bottomRightIntensity); - minValue = min(minValue, leftIntensity); - minValue = min(minValue, rightIntensity); - minValue = min(minValue, bottomIntensity); - minValue = min(minValue, topIntensity); + lowp float minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(minValue), 1.0); + } + ); + +// Radius: 3 +NSString *const kGPUImageErosionRadiusThreeVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); + threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); + } + ); + +NSString *const kGPUImageErosionRadiusThreeFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; + float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; + + lowp float minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + minValue = min(minValue, threeStepsPositiveIntensity); + minValue = min(minValue, threeStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(minValue), 1.0); + } + ); + +// Radius: 4 +NSString *const kGPUImageErosionRadiusFourVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); + threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); + fourStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 4.0); + fourStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 4.0); + } + ); + +NSString *const kGPUImageErosionRadiusFourFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; + float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; + float fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).r; + float fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).r; + + lowp float minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + minValue = min(minValue, threeStepsPositiveIntensity); + minValue = min(minValue, threeStepsNegativeIntensity); + minValue = min(minValue, fourStepsPositiveIntensity); + minValue = min(minValue, fourStepsNegativeIntensity); gl_FragColor = vec4(vec3(minValue), 1.0); } @@ -48,15 +257,59 @@ void main() #pragma mark - #pragma mark Initialization and teardown +- (id)initWithRadius:(NSUInteger)erosionRadius; +{ + switch (erosionRadius) + { + case 0: + case 1: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusOneVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusOneFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusOneVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusOneFragmentShaderString])) + { + return nil; + } + }; break; + case 2: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusTwoVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusTwoFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusTwoVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusTwoFragmentShaderString])) + { + return nil; + } + }; break; + case 3: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusThreeVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusThreeFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusThreeVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusThreeFragmentShaderString])) + { + return nil; + } + }; break; + case 4: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusFourVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusFourFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusFourVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusFourFragmentShaderString])) + { + return nil; + } + }; break; + default: + { + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusFourVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusFourFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusFourVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusFourFragmentShaderString])) + { + return nil; + } + }; break; + } + + return self; +} + - (id)init; { - if (!(self = [self initWithFragmentShaderFromString:kGPUImageErosionFragmentShaderString])) + if (!(self = [self initWithRadius:1])) { - return nil; + return nil; } return self; } - @end diff --git a/framework/Source/GPUImageFastBlurFilter.h b/framework/Source/GPUImageFastBlurFilter.h index bffb4a9ce..0e094af72 100755 --- a/framework/Source/GPUImageFastBlurFilter.h +++ b/framework/Source/GPUImageFastBlurFilter.h @@ -1,9 +1,9 @@ -#import "GPUImageTwoPassFilter.h" +#import "GPUImageTwoPassTextureSamplingFilter.h" /// A hardware-accelerated 9-hit Gaussian blur of an image -@interface GPUImageFastBlurFilter : GPUImageTwoPassFilter +@interface GPUImageFastBlurFilter : GPUImageTwoPassTextureSamplingFilter { - GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, firstBlurSizeUniform, secondBlurSizeUniform; + GLint firstBlurSizeUniform, secondBlurSizeUniform; } /// The number of times to sequentially blur the incoming image. The more passes, the slower the filter. diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index f98a0e8ab..7d0653ea7 100755 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -112,12 +112,7 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; return nil; } - verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; - firstBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; - - horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + firstBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; secondBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; self.blurSize = 1.0; @@ -125,26 +120,6 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; return self; } -- (void)setupFilterForSize:(CGSize)filterFrameSize; -{ - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); - glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); - } - else - { - glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); - } - - [secondFilterProgram use]; - glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); - glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); -} - #pragma mark - #pragma mark Rendering diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index 5e36fb749..bf920ca7c 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -1,11 +1,10 @@ -#import "GPUImageTwoPassFilter.h" +#import "GPUImageTwoPassTextureSamplingFilter.h" /** A more generalized 9x9 Gaussian blur filter */ -@interface GPUImageGaussianBlurFilter : GPUImageTwoPassFilter +@interface GPUImageGaussianBlurFilter : GPUImageTwoPassTextureSamplingFilter { GLint horizontalBlurSizeUniform, verticalBlurSizeUniform; - GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform, blurSizeUniform; } /** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index bbc1c7ec1..f941b5bab 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -75,12 +75,7 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad } horizontalBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; - horizontalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; - verticalBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; - verticalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; self.blurSize = 1.0; @@ -95,30 +90,6 @@ - (id)init; secondStageFragmentShaderFromString:nil]; } -- (void)setupFilterForSize:(CGSize)filterFrameSize; -{ - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - - // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(horizontalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(horizontalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.width); - } - else - { - glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); - glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); - } - - [secondFilterProgram use]; - - glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); -} - - #pragma mark Getters and Setters - (void) setBlurSize:(CGFloat)blurSize { diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.h b/framework/Source/GPUImageTwoPassTextureSamplingFilter.h new file mode 100644 index 000000000..fedc34d37 --- /dev/null +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.h @@ -0,0 +1,7 @@ +#import "GPUImageTwoPassFilter.h" + +@interface GPUImageTwoPassTextureSamplingFilter : GPUImageTwoPassFilter +{ + GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform; +} +@end diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m new file mode 100644 index 000000000..a81befbe3 --- /dev/null +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -0,0 +1,46 @@ +#import "GPUImageTwoPassTextureSamplingFilter.h" + +@implementation GPUImageTwoPassTextureSamplingFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString +{ + if (!(self = [super initWithFirstStageVertexShaderFromString:firstStageVertexShaderString firstStageFragmentShaderFromString:firstStageFragmentShaderString secondStageVertexShaderFromString:secondStageVertexShaderString secondStageFragmentShaderFromString:secondStageFragmentShaderString])) + { + return nil; + } + + verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; + verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + + horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; + horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + + return self; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); + glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); + } + else + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + } + + [secondFilterProgram use]; + glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); + glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); +} + +@end From ba24e689aa7ee65363090068430f83d8a42555cf Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 3 Jun 2012 18:19:14 -0500 Subject: [PATCH 124/695] Added binary opening and closing filters. --- README.md | 8 ++++ .../FeatureExtractionAppDelegate.m | 16 +++++++- framework/GPUImage.xcodeproj/project.pbxproj | 16 ++++++++ framework/Source/GPUImage.h | 2 + framework/Source/GPUImageClosingFilter.h | 17 ++++++++ framework/Source/GPUImageClosingFilter.m | 41 +++++++++++++++++++ framework/Source/GPUImageOpeningFilter.h | 17 ++++++++ framework/Source/GPUImageOpeningFilter.m | 40 ++++++++++++++++++ 8 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageClosingFilter.h create mode 100644 framework/Source/GPUImageClosingFilter.m create mode 100644 framework/Source/GPUImageOpeningFilter.h create mode 100644 framework/Source/GPUImageOpeningFilter.m diff --git a/README.md b/README.md index 5b7c5e600..5c096169f 100755 --- a/README.md +++ b/README.md @@ -168,6 +168,14 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageCrosshairGenerator**: This draws a series of crosshairs on an image, most often used for identifying machine vision features. It does not take in a standard image like other filters, but a series of points in its -renderCrosshairsFromArray:count: method, which does the actual drawing. You will need to force this filter to render at the particular output size you need. - *crosshairWidth*: The width, in pixels, of the crosshairs to be drawn onscreen. +- **GPUImageDilationFilter**: This performs an image dilation operation, where the maximum intensity of the red channel in a rectangular neighborhood is used for the intensity of this pixel. The radius of the rectangular area to sample over is specified on initialization, with a range of 1-4 pixels. This is intended for use with grayscale images, and it expands bright regions. + +- **GPUImageErosionFilter**: This performs an image erosion operation, where the minimum intensity of the red channel in a rectangular neighborhood is used for the intensity of this pixel. The radius of the rectangular area to sample over is specified on initialization, with a range of 1-4 pixels. This is intended for use with grayscale images, and it expands dark regions. + +- **GPUImageOpeningFilter**: This performs an erosion on the red channel of an image, followed by a dilation of the same radius. The radius is set on initialization, with a range of 1-4 pixels. This filters out smaller bright regions. + +- **GPUImageClosingFilter**: This performs a dilation on the red channel of an image, followed by an erosion of the same radius. The radius is set on initialization, with a range of 1-4 pixels. This filters out smaller dark regions. + ### Blending modes ### - **GPUImageChromaKeyBlendFilter**: Selectively replaces a color in the first image with the second image diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index b2f6b14f5..e2519db77 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -33,7 +33,21 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [blackAndWhiteBoxImage processImage]; UIImage *dilationImage = [dilationFilter imageFromCurrentlyProcessedOutput]; [self saveImage:dilationImage fileName:@"Dilation4.png"]; - + + GPUImageOpeningFilter *openingFilter = [[GPUImageOpeningFilter alloc] initWithRadius:4]; + [blackAndWhiteBoxImage removeAllTargets]; + [blackAndWhiteBoxImage addTarget:openingFilter]; + [blackAndWhiteBoxImage processImage]; + UIImage *openingImage = [openingFilter imageFromCurrentlyProcessedOutput]; + [self saveImage:openingImage fileName:@"Opening4.png"]; + + GPUImageClosingFilter *closingFilter = [[GPUImageClosingFilter alloc] initWithRadius:4]; + [blackAndWhiteBoxImage removeAllTargets]; + [blackAndWhiteBoxImage addTarget:closingFilter]; + [blackAndWhiteBoxImage processImage]; + UIImage *closingImage = [closingFilter imageFromCurrentlyProcessedOutput]; + [self saveImage:closingImage fileName:@"Closing4.png"]; + return YES; } diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 32066bbc7..e928531cd 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -39,6 +39,10 @@ BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */; }; BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; }; BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */; }; + BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; }; + BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */; }; + BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; }; + BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */; }; BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; }; BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; @@ -273,6 +277,10 @@ BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3TextureSamplingFilter.m; path = Source/GPUImage3x3TextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoPassTextureSamplingFilter.h; path = Source/GPUImageTwoPassTextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoPassTextureSamplingFilter.m; path = Source/GPUImageTwoPassTextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; + BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOpeningFilter.h; path = Source/GPUImageOpeningFilter.h; sourceTree = SOURCE_ROOT; }; + BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpeningFilter.m; path = Source/GPUImageOpeningFilter.m; sourceTree = SOURCE_ROOT; }; + BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageClosingFilter.h; path = Source/GPUImageClosingFilter.h; sourceTree = SOURCE_ROOT; }; + BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageClosingFilter.m; path = Source/GPUImageClosingFilter.m; sourceTree = SOURCE_ROOT; }; BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputFilter.h; path = Source/GPUImageTwoInputFilter.h; sourceTree = SOURCE_ROOT; }; BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputFilter.m; path = Source/GPUImageTwoInputFilter.m; sourceTree = SOURCE_ROOT; }; BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataOutput.h; path = Source/GPUImageRawDataOutput.h; sourceTree = SOURCE_ROOT; }; @@ -749,6 +757,10 @@ BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */, BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */, BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */, + BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */, + BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */, + BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */, + BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -942,6 +954,8 @@ BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */, BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */, BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */, + BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */, + BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1158,6 +1172,8 @@ BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */, BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */, BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */, + BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */, + BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 183b54646..6b18188fa 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -94,3 +94,5 @@ #import "GPUImageShiTomasiFeatureDetectionFilter.h" #import "GPUImageErosionFilter.h" #import "GPUImageDilationFilter.h" +#import "GPUImageOpeningFilter.h" +#import "GPUImageClosingFilter.h" diff --git a/framework/Source/GPUImageClosingFilter.h b/framework/Source/GPUImageClosingFilter.h new file mode 100644 index 000000000..691d9d883 --- /dev/null +++ b/framework/Source/GPUImageClosingFilter.h @@ -0,0 +1,17 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageErosionFilter; +@class GPUImageDilationFilter; + +// A filter that first performs a dilation on the red channel of an image, followed by an erosion of the same radius. +// This helps to filter out smaller dark elements. + +@interface GPUImageClosingFilter : GPUImageFilterGroup +{ + GPUImageErosionFilter *erosionFilter; + GPUImageDilationFilter *dilationFilter; +} + +- (id)initWithRadius:(NSUInteger)radius; + +@end diff --git a/framework/Source/GPUImageClosingFilter.m b/framework/Source/GPUImageClosingFilter.m new file mode 100644 index 000000000..87e825fa1 --- /dev/null +++ b/framework/Source/GPUImageClosingFilter.m @@ -0,0 +1,41 @@ +#import "GPUImageClosingFilter.h" +#import "GPUImageErosionFilter.h" +#import "GPUImageDilationFilter.h" + +@implementation GPUImageClosingFilter + +- (id)init; +{ + if (!(self = [self initWithRadius:1])) + { + return nil; + } + + return self; +} + +- (id)initWithRadius:(NSUInteger)radius; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: dilation + dilationFilter = [[GPUImageDilationFilter alloc] initWithRadius:radius]; + [self addFilter:dilationFilter]; + + // Second pass: erosion + erosionFilter = [[GPUImageErosionFilter alloc] initWithRadius:radius]; + [self addFilter:erosionFilter]; + + [dilationFilter addTarget:erosionFilter]; + + self.initialFilters = [NSArray arrayWithObjects:dilationFilter, nil]; + self.terminalFilter = erosionFilter; + + return self; +} + + +@end diff --git a/framework/Source/GPUImageOpeningFilter.h b/framework/Source/GPUImageOpeningFilter.h new file mode 100644 index 000000000..d3d833563 --- /dev/null +++ b/framework/Source/GPUImageOpeningFilter.h @@ -0,0 +1,17 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageErosionFilter; +@class GPUImageDilationFilter; + +// A filter that first performs an erosion on the red channel of an image, followed by a dilation of the same radius. +// This helps to filter out smaller bright elements. + +@interface GPUImageOpeningFilter : GPUImageFilterGroup +{ + GPUImageErosionFilter *erosionFilter; + GPUImageDilationFilter *dilationFilter; +} + +- (id)initWithRadius:(NSUInteger)radius; + +@end diff --git a/framework/Source/GPUImageOpeningFilter.m b/framework/Source/GPUImageOpeningFilter.m new file mode 100644 index 000000000..9b81dd613 --- /dev/null +++ b/framework/Source/GPUImageOpeningFilter.m @@ -0,0 +1,40 @@ +#import "GPUImageOpeningFilter.h" +#import "GPUImageErosionFilter.h" +#import "GPUImageDilationFilter.h" + +@implementation GPUImageOpeningFilter + +- (id)init; +{ + if (!(self = [self initWithRadius:1])) + { + return nil; + } + + return self; +} + +- (id)initWithRadius:(NSUInteger)radius; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: erosion + erosionFilter = [[GPUImageErosionFilter alloc] initWithRadius:radius]; + [self addFilter:erosionFilter]; + + // Second pass: dilation + dilationFilter = [[GPUImageDilationFilter alloc] initWithRadius:radius]; + [self addFilter:dilationFilter]; + + [erosionFilter addTarget:dilationFilter]; + + self.initialFilters = [NSArray arrayWithObjects:erosionFilter, nil]; + self.terminalFilter = dilationFilter; + + return self; +} + +@end From 7755e0055c6e689f2d077f776ccbf364bf46b4b7 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 3 Jun 2012 19:22:26 -0500 Subject: [PATCH 125/695] Added RGB variants of the opening, closing, erosion, and dilation filters. Added these to the FilterShowcase, along with some documentation. --- README.md | 8 + .../ShowcaseFilterListController.m | 4 + .../ShowcaseFilterViewController.h | 4 + .../ShowcaseFilterViewController.m | 29 +++ framework/GPUImage.xcodeproj/project.pbxproj | 32 +++ framework/Source/GPUImage.h | 4 + framework/Source/GPUImageClosingFilter.m | 1 - framework/Source/GPUImageDilationFilter.h | 5 + framework/Source/GPUImageDilationFilter.m | 38 ++-- framework/Source/GPUImageErosionFilter.h | 2 +- framework/Source/GPUImageErosionFilter.m | 171 +++------------ framework/Source/GPUImageRGBClosingFilter.h | 18 ++ framework/Source/GPUImageRGBClosingFilter.m | 41 ++++ framework/Source/GPUImageRGBDilationFilter.h | 11 + framework/Source/GPUImageRGBDilationFilter.m | 195 ++++++++++++++++++ framework/Source/GPUImageRGBErosionFilter.h | 11 + framework/Source/GPUImageRGBErosionFilter.m | 194 +++++++++++++++++ framework/Source/GPUImageRGBOpeningFilter.h | 17 ++ framework/Source/GPUImageRGBOpeningFilter.m | 41 ++++ 19 files changed, 658 insertions(+), 168 deletions(-) create mode 100644 framework/Source/GPUImageRGBClosingFilter.h create mode 100644 framework/Source/GPUImageRGBClosingFilter.m create mode 100644 framework/Source/GPUImageRGBDilationFilter.h create mode 100644 framework/Source/GPUImageRGBDilationFilter.m create mode 100644 framework/Source/GPUImageRGBErosionFilter.h create mode 100644 framework/Source/GPUImageRGBErosionFilter.m create mode 100644 framework/Source/GPUImageRGBOpeningFilter.h create mode 100644 framework/Source/GPUImageRGBOpeningFilter.m diff --git a/README.md b/README.md index 5c096169f..f54f5e497 100755 --- a/README.md +++ b/README.md @@ -170,12 +170,20 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageDilationFilter**: This performs an image dilation operation, where the maximum intensity of the red channel in a rectangular neighborhood is used for the intensity of this pixel. The radius of the rectangular area to sample over is specified on initialization, with a range of 1-4 pixels. This is intended for use with grayscale images, and it expands bright regions. +- **GPUImageRGBDilationFilter**: This is the same as the GPUImageDilationFilter, except that this acts on all color channels, not just the red channel. + - **GPUImageErosionFilter**: This performs an image erosion operation, where the minimum intensity of the red channel in a rectangular neighborhood is used for the intensity of this pixel. The radius of the rectangular area to sample over is specified on initialization, with a range of 1-4 pixels. This is intended for use with grayscale images, and it expands dark regions. +- **GPUImageRGBErosionFilter**: This is the same as the GPUImageErosionFilter, except that this acts on all color channels, not just the red channel. + - **GPUImageOpeningFilter**: This performs an erosion on the red channel of an image, followed by a dilation of the same radius. The radius is set on initialization, with a range of 1-4 pixels. This filters out smaller bright regions. +- **GPUImageRGBOpeningFilter**: This is the same as the GPUImageOpeningFilter, except that this acts on all color channels, not just the red channel. + - **GPUImageClosingFilter**: This performs a dilation on the red channel of an image, followed by an erosion of the same radius. The radius is set on initialization, with a range of 1-4 pixels. This filters out smaller dark regions. +- **GPUImageRGBClosingFilter**: This is the same as the GPUImageClosingFilter, except that this acts on all color channels, not just the red channel. + ### Blending modes ### - **GPUImageChromaKeyBlendFilter**: Selectively replaces a color in the first image with the second image diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 949374842..36522a04e 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -103,6 +103,10 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_BULGE: cell.textLabel.text = @"Bulge"; break; case GPUIMAGE_PINCH: cell.textLabel.text = @"Pinch"; break; case GPUIMAGE_STRETCH: cell.textLabel.text = @"Stretch"; break; + case GPUIMAGE_DILATION: cell.textLabel.text = @"Dilation"; break; + case GPUIMAGE_EROSION: cell.textLabel.text = @"Erosion"; break; + case GPUIMAGE_OPENING: cell.textLabel.text = @"Opening"; break; + case GPUIMAGE_CLOSING: cell.textLabel.text = @"Closing"; break; case GPUIMAGE_PERLINNOISE: cell.textLabel.text = @"Perlin noise"; break; case GPUIMAGE_VORONI: cell.textLabel.text = @"Voroni"; break; case GPUIMAGE_MOSAIC: cell.textLabel.text = @"Mosaic"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index dfd8db1a5..12185beb9 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -52,6 +52,10 @@ typedef enum { GPUIMAGE_BULGE, GPUIMAGE_PINCH, GPUIMAGE_STRETCH, + GPUIMAGE_DILATION, + GPUIMAGE_EROSION, + GPUIMAGE_OPENING, + GPUIMAGE_CLOSING, GPUIMAGE_PERLINNOISE, GPUIMAGE_VORONI, GPUIMAGE_MOSAIC, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index e65ee05b4..3d558fc20 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -523,6 +523,35 @@ - (void)setupFilter; filter = [[GPUImageStretchDistortionFilter alloc] init]; }; break; + case GPUIMAGE_DILATION: + { + self.title = @"Dilation"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageRGBDilationFilter alloc] initWithRadius:4]; + }; break; + case GPUIMAGE_EROSION: + { + self.title = @"Erosion"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageRGBErosionFilter alloc] initWithRadius:4]; + }; break; + case GPUIMAGE_OPENING: + { + self.title = @"Opening"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageRGBOpeningFilter alloc] initWithRadius:4]; + }; break; + case GPUIMAGE_CLOSING: + { + self.title = @"Closing"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageRGBClosingFilter alloc] initWithRadius:4]; + }; break; + case GPUIMAGE_PERLINNOISE: { self.title = @"Perlin Noise"; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index e928531cd..a8354e8a5 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -43,6 +43,14 @@ BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */; }; BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; }; BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */; }; + BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; }; + BC0690D1157C2EBA009274F9 /* GPUImageRGBDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690CF157C2EBA009274F9 /* GPUImageRGBDilationFilter.m */; }; + BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; }; + BC0690D6157C31C9009274F9 /* GPUImageRGBErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D4157C31C9009274F9 /* GPUImageRGBErosionFilter.m */; }; + BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; }; + BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D8157C33B8009274F9 /* GPUImageRGBOpeningFilter.m */; }; + BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; }; + BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */; }; BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; }; BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; @@ -281,6 +289,14 @@ BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpeningFilter.m; path = Source/GPUImageOpeningFilter.m; sourceTree = SOURCE_ROOT; }; BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageClosingFilter.h; path = Source/GPUImageClosingFilter.h; sourceTree = SOURCE_ROOT; }; BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageClosingFilter.m; path = Source/GPUImageClosingFilter.m; sourceTree = SOURCE_ROOT; }; + BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBDilationFilter.h; path = Source/GPUImageRGBDilationFilter.h; sourceTree = SOURCE_ROOT; }; + BC0690CF157C2EBA009274F9 /* GPUImageRGBDilationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBDilationFilter.m; path = Source/GPUImageRGBDilationFilter.m; sourceTree = SOURCE_ROOT; }; + BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBErosionFilter.h; path = Source/GPUImageRGBErosionFilter.h; sourceTree = SOURCE_ROOT; }; + BC0690D4157C31C9009274F9 /* GPUImageRGBErosionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBErosionFilter.m; path = Source/GPUImageRGBErosionFilter.m; sourceTree = SOURCE_ROOT; }; + BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBOpeningFilter.h; path = Source/GPUImageRGBOpeningFilter.h; sourceTree = SOURCE_ROOT; }; + BC0690D8157C33B8009274F9 /* GPUImageRGBOpeningFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBOpeningFilter.m; path = Source/GPUImageRGBOpeningFilter.m; sourceTree = SOURCE_ROOT; }; + BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBClosingFilter.h; path = Source/GPUImageRGBClosingFilter.h; sourceTree = SOURCE_ROOT; }; + BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBClosingFilter.m; path = Source/GPUImageRGBClosingFilter.m; sourceTree = SOURCE_ROOT; }; BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputFilter.h; path = Source/GPUImageTwoInputFilter.h; sourceTree = SOURCE_ROOT; }; BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputFilter.m; path = Source/GPUImageTwoInputFilter.m; sourceTree = SOURCE_ROOT; }; BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataOutput.h; path = Source/GPUImageRawDataOutput.h; sourceTree = SOURCE_ROOT; }; @@ -755,12 +771,20 @@ BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */, BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */, BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */, + BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */, + BC0690CF157C2EBA009274F9 /* GPUImageRGBDilationFilter.m */, BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */, BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */, + BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */, + BC0690D4157C31C9009274F9 /* GPUImageRGBErosionFilter.m */, BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */, BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */, + BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */, + BC0690D8157C33B8009274F9 /* GPUImageRGBOpeningFilter.m */, BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */, BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */, + BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */, + BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -956,6 +980,10 @@ BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */, BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */, BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */, + BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */, + BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */, + BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */, + BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1174,6 +1202,10 @@ BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */, BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */, BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */, + BC0690D1157C2EBA009274F9 /* GPUImageRGBDilationFilter.m in Sources */, + BC0690D6157C31C9009274F9 /* GPUImageRGBErosionFilter.m in Sources */, + BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */, + BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 6b18188fa..83da1a9e2 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -93,6 +93,10 @@ #import "GPUImageNobleCornerDetectionFilter.h" #import "GPUImageShiTomasiFeatureDetectionFilter.h" #import "GPUImageErosionFilter.h" +#import "GPUImageRGBErosionFilter.h" #import "GPUImageDilationFilter.h" +#import "GPUImageRGBDilationFilter.h" #import "GPUImageOpeningFilter.h" +#import "GPUImageRGBOpeningFilter.h" #import "GPUImageClosingFilter.h" +#import "GPUImageRGBClosingFilter.h" diff --git a/framework/Source/GPUImageClosingFilter.m b/framework/Source/GPUImageClosingFilter.m index 87e825fa1..b47b2b0c8 100644 --- a/framework/Source/GPUImageClosingFilter.m +++ b/framework/Source/GPUImageClosingFilter.m @@ -37,5 +37,4 @@ - (id)initWithRadius:(NSUInteger)radius; return self; } - @end diff --git a/framework/Source/GPUImageDilationFilter.h b/framework/Source/GPUImageDilationFilter.h index 9d38c96cd..59423a37a 100644 --- a/framework/Source/GPUImageDilationFilter.h +++ b/framework/Source/GPUImageDilationFilter.h @@ -3,6 +3,11 @@ // For each pixel, this sets it to the maximum value of the red channel in a rectangular neighborhood extending out dilationRadius pixels from the center. // This extends out bright features, and is most commonly used with black-and-white thresholded images. +extern NSString *const kGPUImageDilationRadiusOneVertexShaderString; +extern NSString *const kGPUImageDilationRadiusTwoVertexShaderString; +extern NSString *const kGPUImageDilationRadiusThreeVertexShaderString; +extern NSString *const kGPUImageDilationRadiusFourVertexShaderString; + @interface GPUImageDilationFilter : GPUImageTwoPassTextureSamplingFilter // Acceptable values for dilationRadius, which sets the distance in pixels to sample out from the center, are 1, 2, 3, and 4. diff --git a/framework/Source/GPUImageDilationFilter.m b/framework/Source/GPUImageDilationFilter.m index 2b9b55899..b64374473 100644 --- a/framework/Source/GPUImageDilationFilter.m +++ b/framework/Source/GPUImageDilationFilter.m @@ -259,46 +259,44 @@ void main() - (id)initWithRadius:(NSUInteger)dilationRadius; { + NSString *fragmentShaderForThisRadius = nil; + NSString *vertexShaderForThisRadius = nil; + switch (dilationRadius) { case 0: case 1: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusOneVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusOneFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusOneVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusOneFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusOneVertexShaderString; + fragmentShaderForThisRadius = kGPUImageDilationRadiusOneFragmentShaderString; }; break; case 2: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusTwoVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusTwoFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusTwoVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusTwoFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusTwoVertexShaderString; + fragmentShaderForThisRadius = kGPUImageDilationRadiusTwoFragmentShaderString; }; break; case 3: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusThreeVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusThreeFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusThreeVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusThreeFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusThreeVertexShaderString; + fragmentShaderForThisRadius = kGPUImageDilationRadiusThreeFragmentShaderString; }; break; case 4: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusFourVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusFourFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusFourVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusFourFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusFourVertexShaderString; + fragmentShaderForThisRadius = kGPUImageDilationRadiusFourFragmentShaderString; }; break; default: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageDilationRadiusFourVertexShaderString firstStageFragmentShaderFromString:kGPUImageDilationRadiusFourFragmentShaderString secondStageVertexShaderFromString:kGPUImageDilationRadiusFourVertexShaderString secondStageFragmentShaderFromString:kGPUImageDilationRadiusFourFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusFourVertexShaderString; + fragmentShaderForThisRadius = kGPUImageDilationRadiusFourFragmentShaderString; }; break; } + if (!(self = [super initWithFirstStageVertexShaderFromString:vertexShaderForThisRadius firstStageFragmentShaderFromString:fragmentShaderForThisRadius secondStageVertexShaderFromString:vertexShaderForThisRadius secondStageFragmentShaderFromString:fragmentShaderForThisRadius])) + { + return nil; + } + return self; } diff --git a/framework/Source/GPUImageErosionFilter.h b/framework/Source/GPUImageErosionFilter.h index b8fffbaf4..b311a265f 100644 --- a/framework/Source/GPUImageErosionFilter.h +++ b/framework/Source/GPUImageErosionFilter.h @@ -5,7 +5,7 @@ @interface GPUImageErosionFilter : GPUImageTwoPassTextureSamplingFilter -// Acceptable values for dilationRadius, which sets the distance in pixels to sample out from the center, are 1, 2, 3, and 4. +// Acceptable values for erosionRadius, which sets the distance in pixels to sample out from the center, are 1, 2, 3, and 4. - (id)initWithRadius:(NSUInteger)erosionRadius; @end diff --git a/framework/Source/GPUImageErosionFilter.m b/framework/Source/GPUImageErosionFilter.m index 9b5e86a9c..3453297d3 100644 --- a/framework/Source/GPUImageErosionFilter.m +++ b/framework/Source/GPUImageErosionFilter.m @@ -1,32 +1,9 @@ #import "GPUImageErosionFilter.h" +#import "GPUImageDilationFilter.h" @implementation GPUImageErosionFilter // Radius: 1 -NSString *const kGPUImageErosionRadiusOneVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; - - uniform float texelWidthOffset; - uniform float texelHeightOffset; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepPositiveTextureCoordinate; - varying vec2 oneStepNegativeTextureCoordinate; - - void main() - { - gl_Position = position; - - vec2 offset = vec2(texelWidthOffset, texelHeightOffset); - - centerTextureCoordinate = inputTextureCoordinate; - oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; - oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; - } - ); - NSString *const kGPUImageErosionRadiusOneFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -48,37 +25,9 @@ void main() gl_FragColor = vec4(vec3(minValue), 1.0); } - ); +); // Radius: 2 -NSString *const kGPUImageErosionRadiusTwoVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; - - uniform float texelWidthOffset; - uniform float texelHeightOffset; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepPositiveTextureCoordinate; - varying vec2 oneStepNegativeTextureCoordinate; - varying vec2 twoStepsPositiveTextureCoordinate; - varying vec2 twoStepsNegativeTextureCoordinate; - - void main() - { - gl_Position = position; - - vec2 offset = vec2(texelWidthOffset, texelHeightOffset); - - centerTextureCoordinate = inputTextureCoordinate; - oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; - oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; - twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); - twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); - } - ); - NSString *const kGPUImageErosionRadiusTwoFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -106,41 +55,9 @@ void main() gl_FragColor = vec4(vec3(minValue), 1.0); } - ); +); // Radius: 3 -NSString *const kGPUImageErosionRadiusThreeVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; - - uniform float texelWidthOffset; - uniform float texelHeightOffset; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepPositiveTextureCoordinate; - varying vec2 oneStepNegativeTextureCoordinate; - varying vec2 twoStepsPositiveTextureCoordinate; - varying vec2 twoStepsNegativeTextureCoordinate; - varying vec2 threeStepsPositiveTextureCoordinate; - varying vec2 threeStepsNegativeTextureCoordinate; - - void main() - { - gl_Position = position; - - vec2 offset = vec2(texelWidthOffset, texelHeightOffset); - - centerTextureCoordinate = inputTextureCoordinate; - oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; - oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; - twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); - twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); - threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); - threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); - } - ); - NSString *const kGPUImageErosionRadiusThreeFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -174,45 +91,9 @@ void main() gl_FragColor = vec4(vec3(minValue), 1.0); } - ); +); // Radius: 4 -NSString *const kGPUImageErosionRadiusFourVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; - - uniform float texelWidthOffset; - uniform float texelHeightOffset; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepPositiveTextureCoordinate; - varying vec2 oneStepNegativeTextureCoordinate; - varying vec2 twoStepsPositiveTextureCoordinate; - varying vec2 twoStepsNegativeTextureCoordinate; - varying vec2 threeStepsPositiveTextureCoordinate; - varying vec2 threeStepsNegativeTextureCoordinate; - varying vec2 fourStepsPositiveTextureCoordinate; - varying vec2 fourStepsNegativeTextureCoordinate; - - void main() - { - gl_Position = position; - - vec2 offset = vec2(texelWidthOffset, texelHeightOffset); - - centerTextureCoordinate = inputTextureCoordinate; - oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; - oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; - twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); - twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); - threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); - threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); - fourStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 4.0); - fourStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 4.0); - } - ); - NSString *const kGPUImageErosionRadiusFourFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -252,53 +133,51 @@ void main() gl_FragColor = vec4(vec3(minValue), 1.0); } - ); +); #pragma mark - #pragma mark Initialization and teardown -- (id)initWithRadius:(NSUInteger)erosionRadius; +- (id)initWithRadius:(NSUInteger)dilationRadius; { - switch (erosionRadius) + NSString *fragmentShaderForThisRadius = nil; + NSString *vertexShaderForThisRadius = nil; + + switch (dilationRadius) { case 0: case 1: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusOneVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusOneFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusOneVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusOneFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusOneVertexShaderString; + fragmentShaderForThisRadius = kGPUImageErosionRadiusOneFragmentShaderString; }; break; case 2: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusTwoVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusTwoFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusTwoVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusTwoFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusTwoVertexShaderString; + fragmentShaderForThisRadius = kGPUImageErosionRadiusTwoFragmentShaderString; }; break; case 3: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusThreeVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusThreeFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusThreeVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusThreeFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusThreeVertexShaderString; + fragmentShaderForThisRadius = kGPUImageErosionRadiusThreeFragmentShaderString; }; break; case 4: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusFourVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusFourFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusFourVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusFourFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusFourVertexShaderString; + fragmentShaderForThisRadius = kGPUImageErosionRadiusFourFragmentShaderString; }; break; default: { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageErosionRadiusFourVertexShaderString firstStageFragmentShaderFromString:kGPUImageErosionRadiusFourFragmentShaderString secondStageVertexShaderFromString:kGPUImageErosionRadiusFourVertexShaderString secondStageFragmentShaderFromString:kGPUImageErosionRadiusFourFragmentShaderString])) - { - return nil; - } + vertexShaderForThisRadius = kGPUImageDilationRadiusFourVertexShaderString; + fragmentShaderForThisRadius = kGPUImageErosionRadiusFourFragmentShaderString; }; break; } + if (!(self = [super initWithFirstStageVertexShaderFromString:vertexShaderForThisRadius firstStageFragmentShaderFromString:fragmentShaderForThisRadius secondStageVertexShaderFromString:vertexShaderForThisRadius secondStageFragmentShaderFromString:fragmentShaderForThisRadius])) + { + return nil; + } + return self; } diff --git a/framework/Source/GPUImageRGBClosingFilter.h b/framework/Source/GPUImageRGBClosingFilter.h new file mode 100644 index 000000000..08d13f883 --- /dev/null +++ b/framework/Source/GPUImageRGBClosingFilter.h @@ -0,0 +1,18 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageRGBErosionFilter; +@class GPUImageRGBDilationFilter; + +// A filter that first performs a dilation on each color channel of an image, followed by an erosion of the same radius. +// This helps to filter out smaller dark elements. + +@interface GPUImageRGBClosingFilter : GPUImageFilterGroup +{ + GPUImageRGBErosionFilter *erosionFilter; + GPUImageRGBDilationFilter *dilationFilter; +} + +- (id)initWithRadius:(NSUInteger)radius; + + +@end diff --git a/framework/Source/GPUImageRGBClosingFilter.m b/framework/Source/GPUImageRGBClosingFilter.m new file mode 100644 index 000000000..c5bb1c8d9 --- /dev/null +++ b/framework/Source/GPUImageRGBClosingFilter.m @@ -0,0 +1,41 @@ +#import "GPUImageRGBClosingFilter.h" +#import "GPUImageRGBErosionFilter.h" +#import "GPUImageRGBDilationFilter.h" + +@implementation GPUImageRGBClosingFilter + +- (id)init; +{ + if (!(self = [self initWithRadius:1])) + { + return nil; + } + + return self; +} + +- (id)initWithRadius:(NSUInteger)radius; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: dilation + dilationFilter = [[GPUImageRGBDilationFilter alloc] initWithRadius:radius]; + [self addFilter:dilationFilter]; + + // Second pass: erosion + erosionFilter = [[GPUImageRGBErosionFilter alloc] initWithRadius:radius]; + [self addFilter:erosionFilter]; + + [dilationFilter addTarget:erosionFilter]; + + self.initialFilters = [NSArray arrayWithObjects:dilationFilter, nil]; + self.terminalFilter = erosionFilter; + + return self; +} + + +@end diff --git a/framework/Source/GPUImageRGBDilationFilter.h b/framework/Source/GPUImageRGBDilationFilter.h new file mode 100644 index 000000000..68276f849 --- /dev/null +++ b/framework/Source/GPUImageRGBDilationFilter.h @@ -0,0 +1,11 @@ +#import "GPUImageTwoPassTextureSamplingFilter.h" + +// For each pixel, this sets it to the maximum value of each color channel in a rectangular neighborhood extending out dilationRadius pixels from the center. +// This extends out brighter colors, and can be used for abstraction of color images. + +@interface GPUImageRGBDilationFilter : GPUImageTwoPassTextureSamplingFilter + +// Acceptable values for dilationRadius, which sets the distance in pixels to sample out from the center, are 1, 2, 3, and 4. +- (id)initWithRadius:(NSUInteger)dilationRadius; + +@end diff --git a/framework/Source/GPUImageRGBDilationFilter.m b/framework/Source/GPUImageRGBDilationFilter.m new file mode 100644 index 000000000..217f64d88 --- /dev/null +++ b/framework/Source/GPUImageRGBDilationFilter.m @@ -0,0 +1,195 @@ +#import "GPUImageRGBDilationFilter.h" +#import "GPUImageDilationFilter.h" + +// Radius 1 +NSString *const kGPUImageRGBDilationRadiusOneFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; + vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + + lowp vec3 maxValue = max(centerIntensity.rgb, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + + gl_FragColor = vec4(maxValue, centerIntensity.a); + } +); + +// Radius 2 +NSString *const kGPUImageRGBDilationRadiusTwoFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; + vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; + vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; + + vec3 maxValue = max(centerIntensity.rgb, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + + gl_FragColor = vec4(maxValue, centerIntensity.a); + } +); + +// Radius 3 +NSString *const kGPUImageRGBDilationRadiusThreeFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; + vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; + vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; + vec3 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).rgb; + vec3 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).rgb; + + vec3 maxValue = max(centerIntensity.rgb, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + maxValue = max(maxValue, threeStepsPositiveIntensity); + maxValue = max(maxValue, threeStepsNegativeIntensity); + + gl_FragColor = vec4(maxValue, centerIntensity.a); + } +); + +// Radius 4 +NSString *const kGPUImageRGBDilationRadiusFourFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; + vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; + vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; + vec3 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).rgb; + vec3 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).rgb; + vec3 fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).rgb; + vec3 fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).rgb; + + vec3 maxValue = max(centerIntensity.rgb, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + maxValue = max(maxValue, threeStepsPositiveIntensity); + maxValue = max(maxValue, threeStepsNegativeIntensity); + maxValue = max(maxValue, fourStepsPositiveIntensity); + maxValue = max(maxValue, fourStepsNegativeIntensity); + + gl_FragColor = vec4(maxValue, 1.0); + } +); + + +@implementation GPUImageRGBDilationFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithRadius:(NSUInteger)dilationRadius; +{ + NSString *fragmentShaderForThisRadius = nil; + NSString *vertexShaderForThisRadius = nil; + + switch (dilationRadius) + { + case 0: + case 1: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusOneVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBDilationRadiusOneFragmentShaderString; + }; break; + case 2: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusTwoVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBDilationRadiusTwoFragmentShaderString; + }; break; + case 3: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusThreeVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBDilationRadiusThreeFragmentShaderString; + }; break; + case 4: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusFourVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBDilationRadiusFourFragmentShaderString; + }; break; + default: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusFourVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBDilationRadiusFourFragmentShaderString; + }; break; + } + + if (!(self = [super initWithFirstStageVertexShaderFromString:vertexShaderForThisRadius firstStageFragmentShaderFromString:fragmentShaderForThisRadius secondStageVertexShaderFromString:vertexShaderForThisRadius secondStageFragmentShaderFromString:fragmentShaderForThisRadius])) + { + return nil; + } + + return self; +} + +- (id)init; +{ + if (!(self = [self initWithRadius:1])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageRGBErosionFilter.h b/framework/Source/GPUImageRGBErosionFilter.h new file mode 100644 index 000000000..5979cb7e3 --- /dev/null +++ b/framework/Source/GPUImageRGBErosionFilter.h @@ -0,0 +1,11 @@ +#import "GPUImageTwoPassTextureSamplingFilter.h" + +// For each pixel, this sets it to the minimum value of each color channel in a rectangular neighborhood extending out dilationRadius pixels from the center. +// This extends out dark features, and can be used for abstraction of color images. + +@interface GPUImageRGBErosionFilter : GPUImageTwoPassTextureSamplingFilter + +// Acceptable values for erosionRadius, which sets the distance in pixels to sample out from the center, are 1, 2, 3, and 4. +- (id)initWithRadius:(NSUInteger)erosionRadius; + +@end diff --git a/framework/Source/GPUImageRGBErosionFilter.m b/framework/Source/GPUImageRGBErosionFilter.m new file mode 100644 index 000000000..0d42720c5 --- /dev/null +++ b/framework/Source/GPUImageRGBErosionFilter.m @@ -0,0 +1,194 @@ +#import "GPUImageRGBErosionFilter.h" +#import "GPUImageDilationFilter.h" + +// Radius 1 +NSString *const kGPUImageRGBErosionRadiusOneFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; + vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + + lowp vec3 minValue = min(centerIntensity.rgb, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + + gl_FragColor = vec4(minValue, centerIntensity.a); + } +); + +// Radius 2 +NSString *const kGPUImageRGBErosionRadiusTwoFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; + vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; + vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; + + vec3 minValue = min(centerIntensity.rgb, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + + gl_FragColor = vec4(minValue, centerIntensity.a); + } + ); + +// Radius 3 +NSString *const kGPUImageRGBErosionRadiusThreeFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; + vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; + vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; + vec3 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).rgb; + vec3 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).rgb; + + vec3 minValue = min(centerIntensity.rgb, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + minValue = min(minValue, threeStepsPositiveIntensity); + minValue = min(minValue, threeStepsNegativeIntensity); + + gl_FragColor = vec4(minValue, centerIntensity.a); + } + ); + +// Radius 4 +NSString *const kGPUImageRGBErosionRadiusFourFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; + vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; + vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; + vec3 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).rgb; + vec3 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).rgb; + vec3 fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).rgb; + vec3 fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).rgb; + + vec3 minValue = min(centerIntensity.rgb, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + minValue = min(minValue, threeStepsPositiveIntensity); + minValue = min(minValue, threeStepsNegativeIntensity); + minValue = min(minValue, fourStepsPositiveIntensity); + minValue = min(minValue, fourStepsNegativeIntensity); + + gl_FragColor = vec4(minValue, 1.0); + } +); + +@implementation GPUImageRGBErosionFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithRadius:(NSUInteger)erosionRadius; +{ + NSString *fragmentShaderForThisRadius = nil; + NSString *vertexShaderForThisRadius = nil; + + switch (erosionRadius) + { + case 0: + case 1: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusOneVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBErosionRadiusOneFragmentShaderString; + }; break; + case 2: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusTwoVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBErosionRadiusTwoFragmentShaderString; + }; break; + case 3: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusThreeVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBErosionRadiusThreeFragmentShaderString; + }; break; + case 4: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusFourVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBErosionRadiusFourFragmentShaderString; + }; break; + default: + { + vertexShaderForThisRadius = kGPUImageDilationRadiusFourVertexShaderString; + fragmentShaderForThisRadius = kGPUImageRGBErosionRadiusFourFragmentShaderString; + }; break; + } + + if (!(self = [super initWithFirstStageVertexShaderFromString:vertexShaderForThisRadius firstStageFragmentShaderFromString:fragmentShaderForThisRadius secondStageVertexShaderFromString:vertexShaderForThisRadius secondStageFragmentShaderFromString:fragmentShaderForThisRadius])) + { + return nil; + } + + return self; +} + +- (id)init; +{ + if (!(self = [self initWithRadius:1])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageRGBOpeningFilter.h b/framework/Source/GPUImageRGBOpeningFilter.h new file mode 100644 index 000000000..dbec75fb8 --- /dev/null +++ b/framework/Source/GPUImageRGBOpeningFilter.h @@ -0,0 +1,17 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageRGBErosionFilter; +@class GPUImageRGBDilationFilter; + +// A filter that first performs an erosion on each color channel of an image, followed by a dilation of the same radius. +// This helps to filter out smaller bright elements. + +@interface GPUImageRGBOpeningFilter : GPUImageFilterGroup +{ + GPUImageRGBErosionFilter *erosionFilter; + GPUImageRGBDilationFilter *dilationFilter; +} + +- (id)initWithRadius:(NSUInteger)radius; + +@end diff --git a/framework/Source/GPUImageRGBOpeningFilter.m b/framework/Source/GPUImageRGBOpeningFilter.m new file mode 100644 index 000000000..9d53021e5 --- /dev/null +++ b/framework/Source/GPUImageRGBOpeningFilter.m @@ -0,0 +1,41 @@ +#import "GPUImageRGBOpeningFilter.h" +#import "GPUImageRGBErosionFilter.h" +#import "GPUImageRGBDilationFilter.h" + +@implementation GPUImageRGBOpeningFilter + +- (id)init; +{ + if (!(self = [self initWithRadius:1])) + { + return nil; + } + + return self; +} + +- (id)initWithRadius:(NSUInteger)radius; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: erosion + erosionFilter = [[GPUImageRGBErosionFilter alloc] initWithRadius:radius]; + [self addFilter:erosionFilter]; + + // Second pass: dilation + dilationFilter = [[GPUImageRGBDilationFilter alloc] initWithRadius:radius]; + [self addFilter:dilationFilter]; + + [erosionFilter addTarget:dilationFilter]; + + self.initialFilters = [NSArray arrayWithObjects:erosionFilter, nil]; + self.terminalFilter = dilationFilter; + + return self; +} + + +@end From 94c3ceff81bf289a71d1d423d9832bcf2143a7e8 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 6 Jun 2012 22:41:20 -0500 Subject: [PATCH 126/695] Experimenting with packing feature points into RGBA color channels. No real performance increase. --- .../project.pbxproj | 4 + .../FeatureExtractionTest/8pixeltest.png | Bin 0 -> 1513 bytes .../FeatureExtractionAppDelegate.m | 8 ++ .../SimplePhotoFilter/PhotoViewController.m | 6 +- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageColorPackingFilter.h | 10 ++ framework/Source/GPUImageColorPackingFilter.m | 114 ++++++++++++++++++ .../GPUImageHarrisCornerDetectionFilter.h | 2 + .../GPUImageHarrisCornerDetectionFilter.m | 79 ++++++++---- 10 files changed, 204 insertions(+), 28 deletions(-) create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/8pixeltest.png create mode 100644 framework/Source/GPUImageColorPackingFilter.h create mode 100644 framework/Source/GPUImageColorPackingFilter.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index 894ea2799..2d106c3cb 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ BC18E0C8156C835E00AB8026 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C7156C835E00AB8026 /* OpenGLES.framework */; }; BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C9156C836400AB8026 /* AVFoundation.framework */; }; BC18E0CC156C881700AB8026 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0CB156C881700AB8026 /* 71yih.png */; }; + BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCD9A355157EC35E00C41504 /* 8pixeltest.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -64,6 +65,7 @@ BC18E0C7156C835E00AB8026 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; BC18E0C9156C836400AB8026 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BC18E0CB156C881700AB8026 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; + BCD9A355157EC35E00C41504 /* 8pixeltest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 8pixeltest.png; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -132,6 +134,7 @@ BC18E0A1156C822E00AB8026 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCD9A355157EC35E00C41504 /* 8pixeltest.png */, BC18E0CB156C881700AB8026 /* 71yih.png */, BC18E0A2156C822E00AB8026 /* FeatureExtractionTest-Info.plist */, BC18E0A3156C822E00AB8026 /* InfoPlist.strings */, @@ -228,6 +231,7 @@ files = ( BC18E0A5156C822E00AB8026 /* InfoPlist.strings in Resources */, BC18E0CC156C881700AB8026 /* 71yih.png in Resources */, + BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/8pixeltest.png b/examples/FeatureExtractionTest/FeatureExtractionTest/8pixeltest.png new file mode 100644 index 0000000000000000000000000000000000000000..64ad4e0143b52905ab0938cf289c6306834b7e86 GIT binary patch literal 1513 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSaJmFn`E&b`J1#c2)=|%1_J8No8Qr znAjV7H~)5sh<#^%%n~vC1snVLM7!6A21oCdmRfs^&2#e7mrhbU&)(2laHE&z~{PI!uxCyrcRThvmzv{dUFZG3gy^ zb-#8vUh&{PbM{-W{}-2rtz6EmGS4X|+_qNkV`jsYmDcO{74EtH{GfT?@y@YR0cujmq_3Pe^7xo*x)Ae~4RVVg(vFbbbg8P?`o$ja>sDE+m70da^h-GPU zPye-Q_r>!S3tZFP9P-4j(`E01V-D}GFF&?J*Yd$*#iD4VSmQnsr+<@@**16VocKA< zd2P!a=~=T+7u!Fv+p4wj{FQa9rlszcb*Yi)Q#DzTaG2+vRm28HqZJd{dG^T`1O_uR z`%DSA5;R4kb9o|P>f6ev4TlSl%-~&feWs~f=J|($?^9V zwdYr`A2`gnWd`%dU+eY$ZqWX;(MfMl_2$>FgnVpP?q7L(<<~1*?^dte+A;B$?bf#a zp&rS3X%jBm*ttz;7eB2KcR01C=0d@L=E}03?W##isG9 zQ$?S0KiyMQ9zFebndgs?A7MWNfB5}~`yrX~a8g0!56>M+HOetPbFV&rp8WYub5-4nJa0`PlBg3pY5)2HCd6^**B@w}FfdWk9d zNvV1jxdlMg3=B3ERzPNMYDuC(MQ%=Bu~mhw5?F;5kPQ;nS5g2gDap1~itr6kaLzAE zRWQ*r(KAr8<5EyiuqjGOvkG!?gK7uzY?U%fN(!v>^~=l4^~#O)@{7{-4J|D#^$m>l zjf`}GDs+o0^GXscbn}XpA%?)raY-#sF3Kz@$;{7F0GXSZlwVq6tE2?72o50bOi6~@ zQ&3uz1GXh4SwA%=H8(Y{q*&ij&rlz3I8d)mO0rdPX;M~datYYoaO1!pa7s+qM-sNt z$5d^j4{{Nb3nAVIivs;`$7Q1r4@*0)r}n&#z~EK&ba4#fn3 100) - { - cornersArray[numberOfCorners * 2] = (CGFloat)xCoordinate / imageSize.width; - cornersArray[numberOfCorners * 2 + 1] = (CGFloat)(yCoordinate + 1) / imageSize.height; - numberOfCorners++; - if (numberOfCorners > 511) - { - numberOfCorners = 511; - } - } + GLubyte colorByte = rawImagePixels[currentByte]; + + // Red: -, - + // Green: +, - + // Blue: -, + + // Alpha: +. + + + if (colorByte > 0) + { +// NSLog(@"(%d, %d): R: %d", scaledXCoordinate, scaledYCoordinate, redByte); + unsigned int xCoordinate = currentByte % imageWidth; + unsigned int yCoordinate = currentByte / imageWidth; + + cornersArray[numberOfCorners * 2] = (CGFloat)(xCoordinate / 2) / imageSize.width; + cornersArray[numberOfCorners * 2 + 1] = (CGFloat)(yCoordinate * 2) / imageSize.height; + numberOfCorners++; + + numberOfCorners = MIN(numberOfCorners, 511); } } -// CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); -// NSLog(@"Processing time : %f ms", 1000.0 * currentFrameTime); + CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); + NSLog(@"Processing time : %f ms", 1000.0 * currentFrameTime); if (cornersDetectedBlock != NULL) { From ba70b43d8488f7b78b1723a895aa2a314e3ec75b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 7 Jun 2012 14:05:27 -0500 Subject: [PATCH 127/695] Fixed a bunch of bad NSAsserts that I'd copied and pasted. --- framework/Source/GPUImageFilter.m | 6 +++--- framework/Source/GPUImageJFAVoroniFilter.m | 6 +++--- framework/Source/GPUImageMovie.m | 2 +- framework/Source/GPUImageMovieWriter.m | 2 +- framework/Source/GPUImageTwoPassFilter.m | 6 +++--- framework/Source/GPUImageVideoCamera.m | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index d2cf7ef6d..d1e774dcd 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -239,7 +239,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ @@ -254,7 +254,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; if (err) { NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d"); + NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); } err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, @@ -270,7 +270,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; &renderTexture); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); } CFRelease(attrs); diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m index c07c92f4f..aa2d5cbb7 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.m +++ b/framework/Source/GPUImageJFAVoroniFilter.m @@ -291,7 +291,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ @@ -306,7 +306,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize if (err) { NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d"); + NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); } err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, @@ -322,7 +322,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize &renderTexture); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); } CFRelease(attrs); diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index a6fe2fc99..cd0af7f51 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -32,7 +32,7 @@ - (id)initWithURL:(NSURL *)url; CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } // Need to remove the initially created texture diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index a2639a091..3a3e2a811 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -276,7 +276,7 @@ - (void)createDataFBO; CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index ff5e4c3ee..91c52c172 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -116,7 +116,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ @@ -131,7 +131,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; if (err) { NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d"); + NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); } err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, @@ -147,7 +147,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; &renderTexture); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); } CFRelease(attrs); diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 9ff61d2b7..7c4ae0ad6 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -56,7 +56,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } // Need to remove the initially created texture From 213fa69efc64f2fd86d4e419833313e7abb7007b Mon Sep 17 00:00:00 2001 From: alariccole Date: Fri, 8 Jun 2012 17:28:40 -0700 Subject: [PATCH 128/695] adding color monochrome --- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/GPUImageMonochromeFilter.h | 13 +++ framework/GPUImageMonochromeFilter.m | 100 +++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 framework/GPUImageMonochromeFilter.h create mode 100644 framework/GPUImageMonochromeFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index d5f00f44a..7826c4c28 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; + 6DC835531582CF9800FA50E1 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DC835511582CF9800FA50E1 /* GPUImageMonochromeFilter.h */; }; + 6DC835541582CF9800FA50E1 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DC835521582CF9800FA50E1 /* GPUImageMonochromeFilter.m */; }; 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; 6EE27494150E8FC60040DDB6 /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; @@ -143,6 +145,8 @@ 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVignetteFilter.m; path = Source/GPUImageVignetteFilter.m; sourceTree = SOURCE_ROOT; }; 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHazeFilter.m; path = Source/GPUImageHazeFilter.m; sourceTree = SOURCE_ROOT; }; + 6DC835511582CF9800FA50E1 /* GPUImageMonochromeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPUImageMonochromeFilter.h; sourceTree = SOURCE_ROOT; }; + 6DC835521582CF9800FA50E1 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGrayscaleFilter.h; path = Source/GPUImageGrayscaleFilter.h; sourceTree = SOURCE_ROOT; }; 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGrayscaleFilter.m; path = Source/GPUImageGrayscaleFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; @@ -291,6 +295,8 @@ BC1B715D14F4AFFF00ACA2AB /* Color processing */ = { isa = PBXGroup; children = ( + 6DC835511582CF9800FA50E1 /* GPUImageMonochromeFilter.h */, + 6DC835521582CF9800FA50E1 /* GPUImageMonochromeFilter.m */, BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */, BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */, BCB6B833150400030041703B /* GPUImageExposureFilter.h */, @@ -571,6 +577,7 @@ BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */, BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */, 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */, + 6DC835531582CF9800FA50E1 /* GPUImageMonochromeFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -722,6 +729,7 @@ BCC94CFB15101EB3002F9BC5 /* GPUImageTransformFilter.m in Sources */, BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */, 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */, + 6DC835541582CF9800FA50E1 /* GPUImageMonochromeFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/GPUImageMonochromeFilter.h b/framework/GPUImageMonochromeFilter.h new file mode 100644 index 000000000..63af32409 --- /dev/null +++ b/framework/GPUImageMonochromeFilter.h @@ -0,0 +1,13 @@ +#import "GPUImageFilter.h" + +@interface GPUImageMonochromeFilter : GPUImageFilter +{ + GLint intensityUniform, filterColorUniform; +} + +@property(readwrite, nonatomic) CGFloat intensity; +@property(readwrite, nonatomic) GPUVector4 color; +//@property(readwrite, nonatomic) CIColor* color; +- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; + +@end \ No newline at end of file diff --git a/framework/GPUImageMonochromeFilter.m b/framework/GPUImageMonochromeFilter.m new file mode 100644 index 000000000..970ed6154 --- /dev/null +++ b/framework/GPUImageMonochromeFilter.m @@ -0,0 +1,100 @@ +#import "GPUImageMonochromeFilter.h" + +NSString *const kGPUMonochromeFragmentShaderString = SHADER_STRING +( +precision lowp float; + +varying highp vec2 textureCoordinate; + +uniform sampler2D inputImageTexture; +uniform float intensity; +uniform vec3 filterColor; + +const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + + + +void main() +{ + + + //desat, then apply overlay blend + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, luminanceWeighting); + + lowp vec4 desat = vec4(vec3(luminance), 1.0); + + + + //overlay + lowp vec4 outputColor = vec4( + (desat.r < 0.5 ? (2.0 * desat.r * filterColor.r) : (1.0 - 2.0 * (1.0 - desat.r) * (1.0 - filterColor.r))), + (desat.g < 0.5 ? (2.0 * desat.g * filterColor.g) : (1.0 - 2.0 * (1.0 - desat.g) * (1.0 - filterColor.g))), + (desat.b < 0.5 ? (2.0 * desat.b * filterColor.b) : (1.0 - 2.0 * (1.0 - desat.b) * (1.0 - filterColor.b))), + 1.0 + ); + + //which is better, or are they equal? + gl_FragColor = vec4( mix(textureColor.rgb, outputColor.rgb, intensity), 1.0 ); + //gl_FragColor = (intensity * outputColor) + ((1.0 - intensity) * textureColor); + + + + +} +); + +@implementation GPUImageMonochromeFilter + +@synthesize intensity = _intensity; +@synthesize color = _color; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUMonochromeFragmentShaderString])) + { + return nil; + } + + intensityUniform = [filterProgram uniformIndex:@"intensity"]; + filterColorUniform = [filterProgram uniformIndex:@"filterColor"]; + + self.intensity = 1.0; + self.color = (GPUVector4){0.6f, 0.45f, 0.3f, 1.f}; + //self.color = [CIColor colorWithRed:0.6 green:0.45 blue:0.3 alpha:1.]; + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setColor:(GPUVector4)color; +{ + + _color = color; + + [self setColorRed:color.one green:color.two blue:color.three]; +} + +- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +{ + GLfloat filterColor[3]; + filterColor[0] = redComponent; + filterColor[1] = greenComponent; + filterColor[2] = blueComponent; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform3fv(filterColorUniform, 1, filterColor); +} + +- (void)setIntensity:(CGFloat)newValue; +{ + _intensity = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(intensityUniform, _intensity); +} + +@end From 9fa6554a2803a32dc162682086f6fc017629ea80 Mon Sep 17 00:00:00 2001 From: Philippe 'Peep' Chaintreuil Date: Sat, 16 Jun 2012 18:49:36 -0400 Subject: [PATCH 129/695] Change SimpleVideoFilter Demo to allow all orientations. --- .../SimpleVideoFilterViewController.m | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index b8df88d54..cad165b4b 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -93,9 +93,41 @@ - (void)viewDidUnload [super viewDidUnload]; } +- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation +{ + // Map UIDeviceOrientation to UIInterfaceOrientation. + UIInterfaceOrientation orient = UIInterfaceOrientationPortrait; + switch ([[UIDevice currentDevice] orientation]) + { + case UIDeviceOrientationLandscapeLeft: + orient = UIInterfaceOrientationLandscapeLeft; + break; + + case UIDeviceOrientationLandscapeRight: + orient = UIInterfaceOrientationLandscapeRight; + break; + + case UIDeviceOrientationPortrait: + orient = UIInterfaceOrientationPortrait; + break; + + case UIDeviceOrientationPortraitUpsideDown: + orient = UIInterfaceOrientationPortraitUpsideDown; + break; + + case UIDeviceOrientationFaceUp: + case UIDeviceOrientationFaceDown: + case UIDeviceOrientationUnknown: + // When in doubt, stay the same. + orient = fromInterfaceOrientation; + break; + } + videoCamera.outputImageOrientation = orient; +} + - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return (interfaceOrientation == UIInterfaceOrientationPortrait); + return YES; // Support all orientations. } - (IBAction)updateSliderValue:(id)sender From 697d446aa1152de58445f37e1bdc133e1748d7d8 Mon Sep 17 00:00:00 2001 From: Philippe 'Peep' Chaintreuil Date: Sat, 16 Jun 2012 18:55:03 -0400 Subject: [PATCH 130/695] Fix PortraitUpsideDown rotation on the back camera. The back camera is natively landscape left, therefore upside down is a left rotation. --- framework/Source/GPUImageVideoCamera.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 7c4ae0ad6..8f0e7a311 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -460,7 +460,7 @@ - (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; switch(_outputImageOrientation) { case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; } From 39b2ee95308f83a7021985b4d2e029b322672dd9 Mon Sep 17 00:00:00 2001 From: Philippe 'Peep' Chaintreuil Date: Sat, 16 Jun 2012 19:02:39 -0400 Subject: [PATCH 131/695] Added kGPUImageRotate180. This is needed for the back facing camera on landscape right, since the back camera is left facing landscape. NOTE: Since a 180 rotation is a flip vert and a flip horz, and both of those are marked as broken in GPUImageCropFilter's -calculateCropTextureCoordinates, so is the additional block to handle rotate180. --- framework/Source/GPUImageCropFilter.m | 14 ++++++++++++++ framework/Source/GPUImageFilter.m | 13 +++++++++++++ framework/Source/GPUImageOpenGLESContext.h | 2 +- framework/Source/GPUImageVideoCamera.m | 2 +- framework/Source/GPUImageView.m | 8 ++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 02b051df0..a66968b20 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -179,6 +179,20 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = minX; // 0,1 cropTextureCoordinates[7] = maxY; }; break; + case kGPUImageRotate180: // Broken + { + cropTextureCoordinates[0] = maxX; // 1,1 + cropTextureCoordinates[1] = maxY; + + cropTextureCoordinates[2] = maxX; // 1,0 + cropTextureCoordinates[3] = minY; + + cropTextureCoordinates[4] = minX; // 0,1 + cropTextureCoordinates[5] = maxY; + + cropTextureCoordinates[6] = minX; // 0,0 + cropTextureCoordinates[7] = minY; + }; break; case kGPUImageRotateRightFlipVertical: // Fixed { cropTextureCoordinates[0] = minY; // 0,0 diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index d1e774dcd..c5d82facb 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -391,6 +391,13 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM 1.0f, 0.0f, 1.0f, 1.0f, }; + + static const GLfloat rotate180TextureCoordinates[] = { + 1.0f, 1.0f, + 0.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 0.0f, + }; switch(rotationMode) { @@ -400,6 +407,7 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; + case kGPUImageRotate180: return rotate180TextureCoordinates; } } @@ -637,6 +645,11 @@ - (CGPoint)rotatedPoint:(CGPoint)pointToRotate forRotation:(GPUImageRotationMode rotatedPoint.x = pointToRotate.y; rotatedPoint.y = pointToRotate.x; }; break; + case kGPUImageRotate180: + { + rotatedPoint.x = 1.0 - pointToRotate.x; + rotatedPoint.y = 1.0 - pointToRotate.y; + }; break; } return rotatedPoint; diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index b02215bd0..89092ebed 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -7,7 +7,7 @@ #define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical) -typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical} GPUImageRotationMode; +typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180 } GPUImageRotationMode; @interface GPUImageOpenGLESContext : NSObject { diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 8f0e7a311..5b1cbbb2f 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -462,7 +462,7 @@ - (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; } } else diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 74aba2973..a12f803e5 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -306,6 +306,13 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM 0.0f, 1.0f, }; + static const GLfloat rotate180TextureCoordinates[] = { + 1.0f, 0.0f, + 0.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 1.0f, + }; + switch(rotationMode) { case kGPUImageNoRotation: return noRotationTextureCoordinates; @@ -314,6 +321,7 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; + case kGPUImageRotate180: return rotate180TextureCoordinates; } } From 30dbb05653814117b93183e3086c5e8b0bbd28f2 Mon Sep 17 00:00:00 2001 From: Philippe 'Peep' Chaintreuil Date: Sat, 16 Jun 2012 19:04:07 -0400 Subject: [PATCH 132/695] Fix front facing camera. --- framework/Source/GPUImageVideoCamera.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 5b1cbbb2f..f9aa492ba 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -469,9 +469,9 @@ - (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; { switch(_outputImageOrientation) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipVertical; break; + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; } } From 23759fbe71f12f8b2a42876fa227a9f8e46676bc Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 17 Jun 2012 16:52:38 -0700 Subject: [PATCH 133/695] Fixed some compilation errors with the latest Xcode. Started experimenting with a sphere refraction shader, which is currently broken. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 +++ framework/GPUImage.xcodeproj/project.pbxproj | 10 ++- framework/Source/GPUImage.h | 1 + framework/Source/GPUImageBilateralFilter.m | 32 ++++--- framework/Source/GPUImageFilter.m | 8 +- framework/Source/GPUImageHistogramFilter.h | 2 +- framework/Source/GPUImageHistogramFilter.m | 3 +- framework/Source/GPUImageJFAVoroniFilter.m | 5 ++ framework/Source/GPUImageMovie.m | 4 + framework/Source/GPUImageMovieWriter.m | 5 ++ framework/Source/GPUImageRawDataOutput.m | 6 +- .../Source/GPUImageSphereRefractionFilter.h | 13 +++ .../Source/GPUImageSphereRefractionFilter.m | 90 +++++++++++++++++++ framework/Source/GPUImageTwoPassFilter.m | 5 ++ framework/Source/GPUImageVideoCamera.m | 4 + 17 files changed, 179 insertions(+), 23 deletions(-) create mode 100644 framework/Source/GPUImageSphereRefractionFilter.h create mode 100644 framework/Source/GPUImageSphereRefractionFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 36522a04e..8976ff703 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -101,6 +101,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_POSTERIZE: cell.textLabel.text = @"Posterize"; break; case GPUIMAGE_SWIRL: cell.textLabel.text = @"Swirl"; break; case GPUIMAGE_BULGE: cell.textLabel.text = @"Bulge"; break; + case GPUIMAGE_SPHEREREFRACTION: cell.textLabel.text = @"Sphere refraction"; break; case GPUIMAGE_PINCH: cell.textLabel.text = @"Pinch"; break; case GPUIMAGE_STRETCH: cell.textLabel.text = @"Stretch"; break; case GPUIMAGE_DILATION: cell.textLabel.text = @"Dilation"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 12185beb9..28e921659 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -51,6 +51,7 @@ typedef enum { GPUIMAGE_SWIRL, GPUIMAGE_BULGE, GPUIMAGE_PINCH, + GPUIMAGE_SPHEREREFRACTION, GPUIMAGE_STRETCH, GPUIMAGE_DILATION, GPUIMAGE_EROSION, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 3d558fc20..badc9c97f 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -505,6 +505,17 @@ - (void)setupFilter; filter = [[GPUImageBulgeDistortionFilter alloc] init]; }; break; + case GPUIMAGE_SPHEREREFRACTION: + { + self.title = @"Sphere Refraction"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImageSphereRefractionFilter alloc] init]; + }; break; case GPUIMAGE_PINCH: { self.title = @"Pinch"; @@ -1007,6 +1018,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; + case GPUIMAGE_SPHEREREFRACTION: [(GPUImageSphereRefractionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_TONECURVE: [(GPUImageToneCurveFilter *)filter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, [(UISlider *)sender value])], [NSValue valueWithCGPoint:CGPointMake(1.0, 0.75)], nil]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 30f7e057d..3fbce5201 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -80,6 +80,8 @@ BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; + BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; }; + BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */; }; BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; }; BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */; }; BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; }; @@ -326,6 +328,8 @@ BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageErosionFilter.m; path = Source/GPUImageErosionFilter.m; sourceTree = SOURCE_ROOT; }; BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; + BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSphereRefractionFilter.h; path = Source/GPUImageSphereRefractionFilter.h; sourceTree = SOURCE_ROOT; }; + BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSphereRefractionFilter.m; path = Source/GPUImageSphereRefractionFilter.m; sourceTree = SOURCE_ROOT; }; BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBilateralFilter.h; path = Source/GPUImageBilateralFilter.h; sourceTree = SOURCE_ROOT; }; BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBilateralFilter.m; path = Source/GPUImageBilateralFilter.m; sourceTree = SOURCE_ROOT; }; BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCrosshairGenerator.h; path = Source/GPUImageCrosshairGenerator.h; sourceTree = SOURCE_ROOT; }; @@ -643,6 +647,8 @@ BCC1E637152243620006EFA5 /* GPUImagePinchDistortionFilter.m */, BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */, BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */, + BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */, + BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */, BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */, BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */, 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */, @@ -991,6 +997,7 @@ BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */, BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */, BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */, + BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1039,7 +1046,7 @@ BCF1A32B14DDB1EC00852800 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0450; ORGANIZATIONNAME = "Brad Larson"; }; buildConfigurationList = BCF1A32E14DDB1EC00852800 /* Build configuration list for PBXProject "GPUImage" */; @@ -1214,6 +1221,7 @@ BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */, BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */, BC0690F8157C5075009274F9 /* GPUImageColorPackingFilter.m in Sources */, + BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 53a23ad8b..bc4174a4e 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -101,3 +101,4 @@ #import "GPUImageClosingFilter.h" #import "GPUImageRGBClosingFilter.h" #import "GPUImageColorPackingFilter.h" +#import "GPUImageSphereRefractionFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m index 5af454c0e..507067115 100644 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -9,7 +9,8 @@ varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - const mediump float distanceNormalizationFactor = 0.6933613; +// const mediump float distanceNormalizationFactor = 0.6933613; + const mediump float distanceNormalizationFactor = 1.5; void main() { lowp vec4 centralColor = texture2D(inputImageTexture, blurCoordinates[4]); @@ -17,57 +18,54 @@ void main() { lowp vec4 sum = centralColor * 0.18; lowp vec4 sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); -// lowp float distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; - lowp float distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + lowp float distanceFromCentralColor; + // distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + // distanceFromCentralColor = smoothstep(0.0, 1.0, abs(centralColor.g - sampleColor.g)); + // distanceFromCentralColor = smoothstep(0.0, 1.0, distance(centralColor, sampleColor) * distanceNormalizationFactor); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + lowp float gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; sampleColor = texture2D(inputImageTexture, blurCoordinates[1]); -// distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; - distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; sampleColor = texture2D(inputImageTexture, blurCoordinates[2]); -// distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; - distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; sampleColor = texture2D(inputImageTexture, blurCoordinates[3]); -// distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; - distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; sampleColor = texture2D(inputImageTexture, blurCoordinates[5]); -// distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; - distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; sampleColor = texture2D(inputImageTexture, blurCoordinates[6]); -// distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; - distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; sampleColor = texture2D(inputImageTexture, blurCoordinates[7]); -// distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; - distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; sampleColor = texture2D(inputImageTexture, blurCoordinates[8]); -// distanceFromCentralColor = distance(centralColor, sampleColor) * distanceNormalizationFactor; - distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index d1e774dcd..3b0d24aef 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -236,8 +236,14 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { + +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); +#else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); - if (err) +#endif + + if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h index b42df8108..fc0ea0718 100755 --- a/framework/Source/GPUImageHistogramFilter.h +++ b/framework/Source/GPUImageHistogramFilter.h @@ -6,7 +6,7 @@ typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogra { GPUImageHistogramType histogramType; - GLfloat *vertexSamplingCoordinates, *textureSamplingCoordinates; + GLubyte *vertexSamplingCoordinates; GLProgram *secondFilterProgram, *thirdFilterProgram; GLint secondFilterPositionAttribute, thirdFilterPositionAttribute; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index a13551041..5a1f492fe 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -188,7 +188,6 @@ - (void)dealloc; if (vertexSamplingCoordinates != NULL) { free(vertexSamplingCoordinates); - free(textureSamplingCoordinates); } } @@ -212,7 +211,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; [self generatePointCoordinates]; } - [self renderToTextureWithVertices:vertexSamplingCoordinates textureCoordinates:textureSamplingCoordinates sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:NULL textureCoordinates:NULL sourceTexture:filterSourceTexture]; [self informTargetsAboutNewFrameAtTime:frameTime]; } diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m index aa2d5cbb7..24b92959c 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.m +++ b/framework/Source/GPUImageJFAVoroniFilter.m @@ -288,7 +288,12 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); +#else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); +#endif + if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index cd0af7f51..ecca487b2 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -29,7 +29,11 @@ - (id)initWithURL:(NSURL *)url; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { [GPUImageOpenGLESContext useImageProcessingContext]; +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); +#else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); +#endif if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 3a3e2a811..b52782b4f 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -273,7 +273,12 @@ - (void)createDataFBO; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); +#else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); +#endif + if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 5b69e11ae..35d61be59 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -109,10 +109,14 @@ - (void)createDataFBO; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &rawDataTextureCache); +#else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &rawDataTextureCache); +#endif if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ diff --git a/framework/Source/GPUImageSphereRefractionFilter.h b/framework/Source/GPUImageSphereRefractionFilter.h new file mode 100644 index 000000000..9f1918ebd --- /dev/null +++ b/framework/Source/GPUImageSphereRefractionFilter.h @@ -0,0 +1,13 @@ +#import "GPUImageFilter.h" + +@interface GPUImageSphereRefractionFilter : GPUImageFilter +{ + GLint radiusUniform, centerUniform, scaleUniform; +} + +/// The center about which to apply the distortion, with a default of (0.5, 0.5) +@property(readwrite, nonatomic) CGPoint center; +/// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.5 +@property(readwrite, nonatomic) CGFloat radius; + +@end diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m new file mode 100644 index 000000000..21261ba3d --- /dev/null +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -0,0 +1,90 @@ +#import "GPUImageSphereRefractionFilter.h" + +NSString *const kGPUImageSphereRefractionFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform highp vec2 center; + uniform highp float radius; + uniform highp float scale; + const highp float eta = 0.2; + + void main() + { + highp vec2 textureCoordinateToUse = textureCoordinate; + highp float distanceFromCenter = distance(center, textureCoordinate); + lowp float checkForPresenceWithinSphere = step(distanceFromCenter, radius); + + highp float normalizedDepth = sqrt(1.0 - distanceFromCenter * distanceFromCenter); + highp vec3 sphereNormal = normalize(vec3(textureCoordinate - center, normalizedDepth)); + + highp vec3 refractedVector = refract(vec3(0.0, 0.0, -1.0), sphereNormal, eta); + +// gl_FragColor = texture2D(inputImageTexture, refractedVector.xy) * checkForPresenceWithinSphere; + gl_FragColor = vec4(sphereNormal * checkForPresenceWithinSphere, 1.0); + } +); + + +@implementation GPUImageSphereRefractionFilter + +@synthesize center = _center; +@synthesize radius = _radius; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageSphereRefractionFragmentShaderString])) + { + return nil; + } + + radiusUniform = [filterProgram uniformIndex:@"radius"]; + scaleUniform = [filterProgram uniformIndex:@"scale"]; + centerUniform = [filterProgram uniformIndex:@"center"]; + + self.radius = 0.5; + self.center = CGPointMake(0.5, 0.5); + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setCenter:self.center]; +} + +- (void)setRadius:(CGFloat)newValue; +{ + _radius = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(radiusUniform, _radius); +} + +- (void)setCenter:(CGPoint)newValue; +{ + _center = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + + CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; + + GLfloat centerPosition[2]; + centerPosition[0] = rotatedPoint.x; + centerPosition[1] = rotatedPoint.y; + + glUniform2fv(centerUniform, 1, centerPosition); +} + +@end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 91c52c172..496535cb7 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -113,7 +113,12 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); +#else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); +#endif + if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 7c4ae0ad6..b90051c8d 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -53,7 +53,11 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { [GPUImageOpenGLESContext useImageProcessingContext]; +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); +#else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); +#endif if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); From ade041d67487336290ea3fae82022b2f838dba55 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 22 Jun 2012 14:21:05 -0500 Subject: [PATCH 134/695] Fixed the histogram filter in the FilterShowcase, after I broke it with one of the last few commits. --- .../FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index badc9c97f..99e628f83 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -911,6 +911,7 @@ - (void)setupFilter; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; blendFilter.mix = 0.75; + [blendFilter forceProcessingAtSize:CGSizeMake(256.0, 330.0)]; [videoCamera addTarget:blendFilter]; [histogramGraph addTarget:blendFilter]; From 6619cd27f1fb658e44f003962093e80be3ef5f63 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 22 Jun 2012 14:54:44 -0500 Subject: [PATCH 135/695] Added the monochrome filter to the showcase. --- README.md | 4 ++++ .../FilterShowcase/ShowcaseFilterListController.m | 1 + .../FilterShowcase/ShowcaseFilterViewController.h | 1 + .../FilterShowcase/ShowcaseFilterViewController.m | 13 +++++++++++++ framework/Source/GPUImage.h | 3 ++- 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f54f5e497..feab4d3b0 100755 --- a/README.md +++ b/README.md @@ -82,6 +82,10 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageGrayscaleFilter**: Converts an image to grayscale (a slightly faster implementation of the saturation filter, without the ability to vary the color contribution) +- **GPUImageMonochromeFilter**: Converts the image to a single-color version, based on the luminance of each pixel + - *intensity*: The degree to which the specific color replaces the normal image color (0.0 - 1.0, with 1.0 as the default) + - *color*: The color to use as the basis for the effect, with (0.6, 0.45, 0.3, 1.0) as the default. + - **GPUImageSepiaFilter**: Simple sepia tone filter - *intensity*: The degree to which the sepia tone replaces the normal image color (0.0 - 1.0, with 1.0 as the default) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 8976ff703..590ba0a84 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -66,6 +66,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_BRIGHTNESS: cell.textLabel.text = @"Brightness"; break; case GPUIMAGE_EXPOSURE: cell.textLabel.text = @"Exposure"; break; case GPUIMAGE_RGB: cell.textLabel.text = @"RGB"; break; + case GPUIMAGE_MONOCHROME: cell.textLabel.text = @"Monochrome"; break; case GPUIMAGE_SHARPEN: cell.textLabel.text = @"Sharpen"; break; case GPUIMAGE_UNSHARPMASK: cell.textLabel.text = @"Unsharp mask"; break; case GPUIMAGE_GAMMA: cell.textLabel.text = @"Gamma"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 28e921659..706fcde8b 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -7,6 +7,7 @@ typedef enum { GPUIMAGE_BRIGHTNESS, GPUIMAGE_EXPOSURE, GPUIMAGE_RGB, + GPUIMAGE_MONOCHROME, GPUIMAGE_SHARPEN, GPUIMAGE_UNSHARPMASK, GPUIMAGE_TRANSFORM, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 99e628f83..f24024340 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -116,6 +116,18 @@ - (void)setupFilter; filter = [[GPUImageGrayscaleFilter alloc] init]; }; break; + case GPUIMAGE_MONOCHROME: + { + self.title = @"Monochrome"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setValue:1.0]; + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + + filter = [[GPUImageMonochromeFilter alloc] init]; + [(GPUImageMonochromeFilter *)filter setColor:(GPUVector4){0.0f, 0.0f, 1.0f, 1.f}]; + }; break; case GPUIMAGE_SATURATION: { self.title = @"Saturation"; @@ -994,6 +1006,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_CONTRAST: [(GPUImageContrastFilter *)filter setContrast:[(UISlider *)sender value]]; break; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; + case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setDownsamplingFactor:round([(UISlider *)sender value])]; break; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index bc4174a4e..0f053e4ea 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -101,4 +101,5 @@ #import "GPUImageClosingFilter.h" #import "GPUImageRGBClosingFilter.h" #import "GPUImageColorPackingFilter.h" -#import "GPUImageSphereRefractionFilter.h" \ No newline at end of file +#import "GPUImageSphereRefractionFilter.h" +#import "GPUImageMonochromeFilter.h" \ No newline at end of file From ad60be174f4b36503dae27766cfee3a94965eb32 Mon Sep 17 00:00:00 2001 From: Arnaud Coomans Date: Thu, 28 Jun 2012 14:23:01 -0700 Subject: [PATCH 136/695] Added method to get the targets from a GPUImageOutput --- framework/Source/GPUImageOutput.h | 4 ++++ framework/Source/GPUImageOutput.m | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index b1fb75bbb..df11fd5c1 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -38,6 +38,10 @@ void report_memory(NSString *tag); /// @name Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; +/** Returns an array of the current targets. + */ +- (NSArray*)targets; + /** Adds a target to receive notifications when new frames are available. The target will be asked for its next available texture. diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index f763f6a44..81caafd37 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -77,6 +77,10 @@ - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)in [target setInputTexture:outputTexture atIndex:inputTextureIndex]; } +- (NSArray*)targets { + return [NSArray arrayWithArray:targets]; +} + - (void)addTarget:(id)newTarget; { NSInteger nextAvailableTextureIndex = [newTarget nextAvailableTextureIndex]; From 598f8132a552da8aab68d7b32da4aaf65ed1f09c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 28 Jun 2012 21:43:03 -0500 Subject: [PATCH 137/695] Added an image buffet filter that delays frames, allowing for comparative processing of sequential frames. There are some slight issues with timing on the blends that I still need to fix. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 27 ++- framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 1 + framework/Source/GPUImageBuffer.h | 10 ++ framework/Source/GPUImageBuffer.m | 164 ++++++++++++++++++ framework/Source/GPUImageMovie.m | 8 + framework/Source/GPUImageMovieWriter.m | 2 +- framework/Source/GPUImagePicture.h | 2 +- framework/Source/GPUImagePicture.m | 28 ++- framework/Source/GPUImageView.m | 2 +- 12 files changed, 233 insertions(+), 21 deletions(-) create mode 100644 framework/Source/GPUImageBuffer.h create mode 100644 framework/Source/GPUImageBuffer.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 590ba0a84..3354510e9 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -92,6 +92,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_HARRISCORNERDETECTION: cell.textLabel.text = @"Harris corner detection"; break; case GPUIMAGE_NOBLECORNERDETECTION: cell.textLabel.text = @"Noble corner detection"; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: cell.textLabel.text = @"Shi-Tomasi feature detection"; break; + case GPUIMAGE_BUFFER: cell.textLabel.text = @"Image buffer"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; case GPUIMAGE_SMOOTHTOON: cell.textLabel.text = @"Smooth toon"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 706fcde8b..7a5aa578a 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -33,6 +33,7 @@ typedef enum { GPUIMAGE_HARRISCORNERDETECTION, GPUIMAGE_NOBLECORNERDETECTION, GPUIMAGE_SHITOMASIFEATUREDETECTION, + GPUIMAGE_BUFFER, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_SMOOTHTOON, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index f24024340..1b1e2f931 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -398,7 +398,13 @@ - (void)setupFilter; filter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; }; break; - + case GPUIMAGE_BUFFER: + { + self.title = @"Image Buffer"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageBuffer alloc] init]; + }; break; case GPUIMAGE_SKETCH: { self.title = @"Sketch"; @@ -982,6 +988,25 @@ - (void)setupFilter; [weakUIElementInput update]; }]; } + else if (filterType == GPUIMAGE_BUFFER) + { + + GPUImageDifferenceBlendFilter *blendFilter = [[GPUImageDifferenceBlendFilter alloc] init]; + [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; + +// [filter addTarget:filterView]; + [videoCamera removeTarget:filter]; + + GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; + [videoCamera addTarget:gammaFilter]; + [gammaFilter addTarget:blendFilter]; + gammaFilter.targetToIgnoreForUpdates = blendFilter; + [videoCamera addTarget:filter]; + + [filter addTarget:blendFilter]; + + [blendFilter addTarget:filterView]; + } else { [filter addTarget:filterView]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 81749378a..ae4266837 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -190,6 +190,8 @@ BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; + BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; + BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */; }; BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; }; BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */; }; BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; }; @@ -440,6 +442,8 @@ BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCropFilter.m; path = Source/GPUImageCropFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMonochromeFilter.h; path = Source/GPUImageMonochromeFilter.h; sourceTree = SOURCE_ROOT; }; BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; + BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; + BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBuffer.m; path = Source/GPUImageBuffer.m; sourceTree = SOURCE_ROOT; }; BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramGenerator.h; path = Source/GPUImageHistogramGenerator.h; sourceTree = SOURCE_ROOT; }; BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramGenerator.m; path = Source/GPUImageHistogramGenerator.m; sourceTree = SOURCE_ROOT; }; BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePosterizeFilter.h; path = Source/GPUImagePosterizeFilter.h; sourceTree = SOURCE_ROOT; }; @@ -684,6 +688,8 @@ BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */, BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */, BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */, + BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */, + BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */, BC1B715D14F4AFFF00ACA2AB /* Color processing */, BCC93A5215031B1700958B26 /* Image processing */, BC1B715E14F4B04800ACA2AB /* Blends */, @@ -1005,6 +1011,7 @@ BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */, BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */, BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */, + BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1230,6 +1237,7 @@ BC0690F8157C5075009274F9 /* GPUImageColorPackingFilter.m in Sources */, BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */, BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */, + BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 0f053e4ea..4827ab389 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -16,6 +16,7 @@ #import "GPUImageFilterGroup.h" #import "GPUImageTextureInput.h" #import "GPUImageUIElement.h" +#import "GPUImageBuffer.h" // Filters #import "GPUImageFilter.h" diff --git a/framework/Source/GPUImageBuffer.h b/framework/Source/GPUImageBuffer.h new file mode 100644 index 000000000..8a9cd05ee --- /dev/null +++ b/framework/Source/GPUImageBuffer.h @@ -0,0 +1,10 @@ +#import "GPUImageFilter.h" + +@interface GPUImageBuffer : GPUImageFilter +{ + NSMutableArray *bufferedTextures; +} + +@property(readwrite, nonatomic) NSUInteger bufferSize; + +@end diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m new file mode 100644 index 000000000..5cc5dee21 --- /dev/null +++ b/framework/Source/GPUImageBuffer.m @@ -0,0 +1,164 @@ +#import "GPUImageBuffer.h" + +@implementation GPUImageBuffer + +@synthesize bufferSize = _bufferSize; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImagePassthroughFragmentShaderString])) + { + return nil; + } + + bufferedTextures = [[NSMutableArray alloc] init]; + [bufferedTextures addObject:[NSNumber numberWithInt:outputTexture]]; + _bufferSize = 1; + + return self; +} + +- (void)dealloc +{ + for (NSNumber *currentTextureName in bufferedTextures) + { + [self removeTexture:[currentTextureName intValue]]; + } +} + +#pragma mark - +#pragma mark GPUImageInput + +- (void)newFrameReadyAtTime:(CMTime)frameTime; +{ + static const GLfloat imageVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + // Let the downstream video elements see the previous frame from the buffer before rendering a new one into place + [self informTargetsAboutNewFrameAtTime:frameTime]; + + // Move the last frame to the back of the buffer, if needed + if (_bufferSize > 1) + { + NSNumber *lastTextureName = [bufferedTextures objectAtIndex:0]; + [bufferedTextures removeObjectAtIndex:0]; + [bufferedTextures addObject:lastTextureName]; + } + else + { + // Make sure the previous rendering has finished before enqueuing the current frame when simply delaying by one frame + glFinish(); + } + + // Render the new frame to the back of the buffer + [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; +} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + if (self.preventRendering) + { + return; + } + + [GPUImageOpenGLESContext useImageProcessingContext]; + [self setFilterFBO]; + + glBindTexture(GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue], 0); + + [filterProgram use]; + + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, sourceTexture); + + glUniform1i(filterInputTextureUniform, 2); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +- (void)prepareForImageCapture; +{ + // Disable this for now, until I figure out how to integrate the texture caches with a buffer like this +} + +#pragma mark - +#pragma mark Managing targets + +- (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; +{ + [target setInputTexture:[[bufferedTextures objectAtIndex:0] intValue] atIndex:inputTextureIndex]; +} + + +#pragma mark - +#pragma mark Texture management + +- (GLuint)generateTexture; +{ + GLuint newTextureName = 0; + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &newTextureName); + glBindTexture(GL_TEXTURE_2D, newTextureName); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + CGSize currentFBOSize = [self sizeOfFBO]; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glBindTexture(GL_TEXTURE_2D, 0); + + return newTextureName; +} + +- (void)removeTexture:(GLuint)textureToRemove; +{ + glDeleteTextures(1, &textureToRemove); +} + +#pragma mark - +#pragma mark Accessors + +- (void)setBufferSize:(NSUInteger)newValue; +{ + if ( (newValue == _bufferSize) || (newValue < 1) ) + { + return; + } + + if (newValue > _bufferSize) + { + NSUInteger texturesToAdd = newValue - _bufferSize; + for (NSUInteger currentTextureIndex = 0; currentTextureIndex < texturesToAdd; currentTextureIndex++) + { + [bufferedTextures addObject:[NSNumber numberWithInt:[self generateTexture]]]; + } + } + else + { + NSUInteger texturesToRemove = _bufferSize - newValue; + for (NSUInteger currentTextureIndex = 0; currentTextureIndex < texturesToRemove; currentTextureIndex++) + { + NSNumber *lastTextureName = [bufferedTextures lastObject]; + [bufferedTextures removeObjectAtIndex:([bufferedTextures count] - 1)]; + [self removeTexture:[lastTextureName intValue]]; + } + } +} + +@end diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index ecca487b2..29ca5c4a4 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -48,6 +48,14 @@ - (id)initWithURL:(NSURL *)url; return self; } +- (void)dealloc +{ + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + CFRelease(coreVideoTextureCache); + } +} + #pragma mark - #pragma mark Movie processing diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index b52782b4f..0d21a7016 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -401,7 +401,7 @@ - (void)renderAtInternalSize; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glFlush(); + glFinish(); } #pragma mark - diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 20adeec64..8784a3dc6 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -4,7 +4,7 @@ @interface GPUImagePicture : GPUImageOutput { - UIImage *imageSource; + CGSize pixelSizeOfImage; } // Initialization and teardown diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 85f4231c9..9574e720b 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -21,15 +21,14 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly { return nil; } - self.shouldSmoothlyScaleOutput = smoothlyScaleOutput; - imageSource = newImageSource; [GPUImageOpenGLESContext useImageProcessingContext]; - CGSize pointSizeOfImage = [imageSource size]; - CGFloat scaleOfImage = [imageSource scale]; - CGSize pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); + CGSize pointSizeOfImage = [newImageSource size]; + CGFloat scaleOfImage = [newImageSource scale]; + pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); + CGSize pixelSizeToUseForTexture = pixelSizeOfImage; BOOL shouldRedrawUsingCoreGraphics = YES; @@ -38,6 +37,7 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly if (!CGSizeEqualToSize(scaledImageSizeToFitOnGPU, pixelSizeOfImage)) { pixelSizeOfImage = scaledImageSizeToFitOnGPU; + pixelSizeToUseForTexture = pixelSizeOfImage; shouldRedrawUsingCoreGraphics = YES; } @@ -47,7 +47,7 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly CGFloat powerClosestToWidth = ceil(log2(pixelSizeOfImage.width)); CGFloat powerClosestToHeight = ceil(log2(pixelSizeOfImage.height)); - pixelSizeOfImage = CGSizeMake(pow(2.0, powerClosestToWidth), pow(2.0, powerClosestToHeight)); + pixelSizeToUseForTexture = CGSizeMake(pow(2.0, powerClosestToWidth), pow(2.0, powerClosestToHeight)); shouldRedrawUsingCoreGraphics = YES; } @@ -60,19 +60,19 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly if (shouldRedrawUsingCoreGraphics) { // For resized image, redraw - imageData = (GLubyte *) calloc(1, (int)pixelSizeOfImage.width * (int)pixelSizeOfImage.height * 4); + imageData = (GLubyte *) calloc(1, (int)pixelSizeToUseForTexture.width * (int)pixelSizeToUseForTexture.height * 4); CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); - CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 8, (int)pixelSizeOfImage.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 8, (int)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html - CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeOfImage.width, pixelSizeOfImage.height), [imageSource CGImage]); + CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), [newImageSource CGImage]); CGContextRelease(imageContext); CGColorSpaceRelease(genericRGBColorspace); } else { // Access the raw image bytes directly - dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider([imageSource CGImage])); + dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider([newImageSource CGImage])); imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); } @@ -84,7 +84,7 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); if (self.shouldSmoothlyScaleOutput) { @@ -108,8 +108,6 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly - (void)processImage; { - CGSize pixelSizeOfImage = [self outputImageSize]; - for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; @@ -122,10 +120,6 @@ - (void)processImage; - (CGSize)outputImageSize; { - CGSize pointSizeOfImage = [imageSource size]; - CGFloat scaleOfImage = [imageSource scale]; - CGSize pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); - pixelSizeOfImage = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; return pixelSizeOfImage; } diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 74aba2973..8c31067e5 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -152,7 +152,7 @@ - (void)createDisplayFramebuffer; glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); _sizeInPixels.width = (CGFloat)backingWidth; _sizeInPixels.height = (CGFloat)backingHeight; - + // NSLog(@"Backing width: %d, height: %d", backingWidth, backingHeight); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, displayRenderbuffer); From 94f54eb0c3304ca937ebe527f3f4248e797e04cd Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 1 Jul 2012 17:52:25 -0500 Subject: [PATCH 138/695] Texel distances should be set properly for rotated images in a couple of filters now. --- framework/Source/GPUImage3x3TextureSamplingFilter.m | 13 +++++++++++-- framework/Source/GPUImageOutput.m | 3 ++- framework/Source/GPUImageSharpenFilter.m | 13 +++++++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m index 457e6a570..29177139c 100644 --- a/framework/Source/GPUImage3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -75,8 +75,17 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(texelWidthUniform, _texelHeight); + glUniform1f(texelHeightUniform, _texelWidth); + } + else + { + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + } + } } diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 81caafd37..0eb06eb46 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -77,7 +77,8 @@ - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)in [target setInputTexture:outputTexture atIndex:inputTextureIndex]; } -- (NSArray*)targets { +- (NSArray*)targets; +{ return [NSArray arrayWithArray:targets]; } diff --git a/framework/Source/GPUImageSharpenFilter.m b/framework/Source/GPUImageSharpenFilter.m index 01356ba02..14a9fbc23 100755 --- a/framework/Source/GPUImageSharpenFilter.m +++ b/framework/Source/GPUImageSharpenFilter.m @@ -90,8 +90,17 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; - glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.width); - glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.height); + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.height); + glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.width); + } + else + { + glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.width); + glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.height); + } } #pragma mark - From 29e7cd8fb6b8a924eab82ef74012cfc6e3f7636f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 1 Jul 2012 19:15:47 -0500 Subject: [PATCH 139/695] Fixed the GPUImageMaskFilter. --- framework/Source/GPUImageMaskFilter.h | 4 ++-- framework/Source/GPUImageMaskFilter.m | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImageMaskFilter.h b/framework/Source/GPUImageMaskFilter.h index 69b8c430b..94cf06484 100755 --- a/framework/Source/GPUImageMaskFilter.h +++ b/framework/Source/GPUImageMaskFilter.h @@ -1,5 +1,5 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageMaskFilter : GPUImageFilter +@interface GPUImageMaskFilter : GPUImageTwoInputFilter @end diff --git a/framework/Source/GPUImageMaskFilter.m b/framework/Source/GPUImageMaskFilter.m index 47ca1ae3c..f3a157f7f 100755 --- a/framework/Source/GPUImageMaskFilter.m +++ b/framework/Source/GPUImageMaskFilter.m @@ -3,6 +3,7 @@ NSString *const kGPUImageMaskShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; @@ -10,8 +11,7 @@ void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); - + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); //Averages mask's the RGB values, and scales that value by the mask's alpha // @@ -21,6 +21,7 @@ void main() lowp float newAlpha = dot(textureColor2.rgb, vec3(.33333334, .33333334, .33333334)) * textureColor2.a; gl_FragColor = vec4(textureColor.xyz, newAlpha); +// gl_FragColor = vec4(textureColor2); } ); @@ -36,5 +37,13 @@ - (id)init; return self; } +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + glDisable(GL_BLEND); +} + @end From a0af2479a847f6bc6c77c501126a2c55f79b6b2d Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Thu, 5 Jul 2012 03:41:53 -0500 Subject: [PATCH 140/695] Added ability to enable/disabled GPUImageOutputs - fast way to turn them on or off. Replaced all references to self in blocks with __unsafe_unretained __typeof__(self) weakSelf = self; Added method to GPUImageStillCamera to take a photo and retrieve the CMSampleBufferRef directly. However, I left this method commented out, as to use it you have to have the camera pixel format in its native setting, which is incompatible with GPUImage. --- framework/Source/GPUImageMovie.m | 17 +++++---- framework/Source/GPUImageOutput.h | 7 ++++ framework/Source/GPUImageOutput.m | 9 +++++ framework/Source/GPUImageStillCamera.h | 1 + framework/Source/GPUImageStillCamera.m | 10 +++++ framework/Source/GPUImageVideoCamera.m | 53 ++++++++++++++------------ 6 files changed, 65 insertions(+), 32 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 29ca5c4a4..70e4f4f18 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -70,6 +70,8 @@ - (void)startProcessing; NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; + __unsafe_unretained __typeof__(self) weakSelf = self; + [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ NSError *error = nil; AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; @@ -86,7 +88,7 @@ - (void)startProcessing; [reader addOutput:readerVideoTrackOutput]; NSArray *audioTracks = [inputAsset tracksWithMediaType:AVMediaTypeAudio]; - BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (self.audioEncodingTarget != nil) ); + BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (weakSelf.audioEncodingTarget != nil) ); AVAssetReaderTrackOutput *readerAudioTrackOutput = nil; if (shouldRecordAudioTrack) @@ -101,14 +103,12 @@ - (void)startProcessing; if ([reader startReading] == NO) { - NSLog(@"Error reading from file at URL: %@", self.url); + NSLog(@"Error reading from file at URL: %@", weakSelf.url); return; } if (synchronizedMovieWriter != nil) { - __unsafe_unretained GPUImageMovie *weakSelf = self; - [synchronizedMovieWriter setVideoInputReadyCallback:^{ [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; }]; @@ -123,17 +123,17 @@ - (void)startProcessing; { while (reader.status == AVAssetReaderStatusReading) { - [self readNextVideoFrameFromOutput:readerVideoTrackOutput]; + [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; if ( (shouldRecordAudioTrack) && (!audioEncodingIsFinished) ) { - [self readNextAudioSampleFromOutput:readerAudioTrackOutput]; + [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; } } if (reader.status == AVAssetWriterStatusCompleted) { - [self endProcessing]; + [weakSelf endProcessing]; } } }]; @@ -146,8 +146,9 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; if (sampleBufferRef) { + __unsafe_unretained __typeof__(self) weakSelf = self; runOnMainQueueWithoutDeadlocking(^{ - [self processMovieFrame:sampleBufferRef]; + [weakSelf processMovieFrame:sampleBufferRef]; }); CMSampleBufferInvalidate(sampleBufferRef); diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index df11fd5c1..8bbe319d2 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -34,6 +34,7 @@ void report_memory(NSString *tag); @property(readwrite, nonatomic, retain) GPUImageMovieWriter *audioEncodingTarget; @property(readwrite, nonatomic, unsafe_unretained) id targetToIgnoreForUpdates; @property(nonatomic, copy) void(^frameProcessingCompletionBlock)(GPUImageOutput*, CMTime); +@property(nonatomic) BOOL enabled; /// @name Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; @@ -70,6 +71,12 @@ void report_memory(NSString *tag); */ - (void)removeAllTargets; +/// @name The state of the GPUImageOutput + +/** Returns a BOOL indicating whether the GPUImageOutput is enabled or not. Default is YES. + */ +- (BOOL)isEnabled; + /// @name Manage the output texture - (void)initializeOutputTexture; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 0eb06eb46..8ad6bfa25 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -44,6 +44,7 @@ @implementation GPUImageOutput @synthesize audioEncodingTarget = _audioEncodingTarget; @synthesize targetToIgnoreForUpdates = _targetToIgnoreForUpdates; @synthesize frameProcessingCompletionBlock = _frameProcessingCompletionBlock; +@synthesize enabled = _enabled; #pragma mark - #pragma mark Initialization and teardown @@ -57,6 +58,7 @@ - (id)init; targets = [[NSMutableArray alloc] init]; targetTextureIndices = [[NSMutableArray alloc] init]; + _enabled = YES; [self initializeOutputTexture]; @@ -69,6 +71,13 @@ - (void)dealloc [self deleteOutputTexture]; } +#pragma mark - +#pragma mark Status + +- (BOOL)isEnabled { + return _enabled; +} + #pragma mark - #pragma mark Managing targets diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index 3bb88b971..7339d6fdd 100755 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -5,6 +5,7 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina @interface GPUImageStillCamera : GPUImageVideoCamera // Photography controls +//- (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block; - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index af27bd448..c99e83406 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -83,6 +83,16 @@ - (void)removeInputsAndOutputs; #pragma mark - #pragma mark Photography controls +/*- (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block +{ + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { +#error If you want to use this method, you must comment out the line in initWithSessionPreset:cameraPosition: which sets the CVPixelBufferPixelFormatTypeKey. However, if you do this you cannot use any of the below methods to take a photo if you also supply a filter. + block(imageSampleBuffer, error); + }]; + + return; +}*/ + - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index b90051c8d..28b8400bb 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -288,22 +288,24 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; for (id currentTarget in targets) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + if ([(GPUImageOutput *)currentTarget respondsToSelector:@selector(enabled)] && [(GPUImageOutput *)currentTarget isEnabled]) { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [currentTarget newFrameReadyAtTime:currentTime]; - } - else - { - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; + + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + + [currentTarget newFrameReadyAtTime:currentTime]; + } + else + { + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + } } } @@ -342,13 +344,15 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; for (id currentTarget in targets) { - if (currentTarget != self.targetToIgnoreForUpdates) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:currentTime]; + if ([(GPUImageOutput *)currentTarget respondsToSelector:@selector(enabled)] && [(GPUImageOutput *)currentTarget isEnabled]) { + if (currentTarget != self.targetToIgnoreForUpdates) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:currentTime]; + } } } @@ -388,16 +392,17 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM @autoreleasepool { //these need to be on the main thread for proper timing + __unsafe_unretained __typeof__(self) weakSelf = self; if (captureOutput == audioOutput) { runOnMainQueueWithoutDeadlocking(^{ - [self processAudioSampleBuffer:sampleBuffer]; + [weakSelf processAudioSampleBuffer:sampleBuffer]; }); } else { runOnMainQueueWithoutDeadlocking(^{ - [self processVideoSampleBuffer:sampleBuffer]; + [weakSelf processVideoSampleBuffer:sampleBuffer]; }); } } From 9b57962fb9aceb3764f794cc16c32355daef738b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 5 Jul 2012 16:55:19 -0500 Subject: [PATCH 141/695] Tweaked some of the weak self references to avoid compiler errors. --- framework/Source/GPUImageMovie.m | 4 ++-- framework/Source/GPUImageVideoCamera.m | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 70e4f4f18..be347535f 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -70,7 +70,7 @@ - (void)startProcessing; NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; - __unsafe_unretained __typeof__(self) weakSelf = self; + __unsafe_unretained GPUImageMovie *weakSelf = self; [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ NSError *error = nil; @@ -146,7 +146,7 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; if (sampleBufferRef) { - __unsafe_unretained __typeof__(self) weakSelf = self; + __unsafe_unretained GPUImageMovie *weakSelf = self; runOnMainQueueWithoutDeadlocking(^{ [weakSelf processMovieFrame:sampleBufferRef]; }); diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 28b8400bb..9976885c9 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -392,7 +392,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM @autoreleasepool { //these need to be on the main thread for proper timing - __unsafe_unretained __typeof__(self) weakSelf = self; + __unsafe_unretained id weakSelf = self; if (captureOutput == audioOutput) { runOnMainQueueWithoutDeadlocking(^{ From 8a5bc8060cba4b42f0230f1f28b66d08f9ea02c6 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 6 Jul 2012 17:53:25 -0500 Subject: [PATCH 142/695] Added a filter to adjust the incoming opacity of images. --- README.md | 3 ++ .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 27 ++++++++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 +++ framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageOpacityFilter.h | 11 ++++ framework/Source/GPUImageOpacityFilter.m | 51 +++++++++++++++++++ 8 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageOpacityFilter.h create mode 100644 framework/Source/GPUImageOpacityFilter.m diff --git a/README.md b/README.md index feab4d3b0..d35a6b71c 100755 --- a/README.md +++ b/README.md @@ -89,6 +89,9 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageSepiaFilter**: Simple sepia tone filter - *intensity*: The degree to which the sepia tone replaces the normal image color (0.0 - 1.0, with 1.0 as the default) +- **GPUImageOpacityFilter**: Adjusts the alpha channel of the incoming image + - *opacity*: The value to multiply the incoming alpha channel for each pixel by (0.0 - 1.0, with 1.0 as the default) + - **GPUImageLuminanceThresholdFilter**: Pixels with a luminance above the threshold will appear white, and those below will be black - *threshold*: The luminance threshold, from 0.0 to 1.0, with a default of 0.5 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 3354510e9..b3e3c295d 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -127,6 +127,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SUBTRACTBLEND: cell.textLabel.text = @"Subtract blend"; break; case GPUIMAGE_HARDLIGHTBLEND: cell.textLabel.text = @"Hard light blend"; break; case GPUIMAGE_SOFTLIGHTBLEND: cell.textLabel.text = @"Soft light blend"; break; + case GPUIMAGE_OPACITY: cell.textLabel.text = @"Opacity adjustment"; break; case GPUIMAGE_KUWAHARA: cell.textLabel.text = @"Kuwahara"; break; case GPUIMAGE_VIGNETTE: cell.textLabel.text = @"Vignette"; break; case GPUIMAGE_GAUSSIAN: cell.textLabel.text = @"Gaussian blur"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 7a5aa578a..170e7dede 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -76,6 +76,7 @@ typedef enum { GPUIMAGE_EXCLUSIONBLEND, GPUIMAGE_HARDLIGHTBLEND, GPUIMAGE_SOFTLIGHTBLEND, + GPUIMAGE_OPACITY, GPUIMAGE_CUSTOM, GPUIMAGE_UIELEMENT, GPUIMAGE_FILECONFIG, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 1b1e2f931..cb4ab7620 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -752,6 +752,18 @@ - (void)setupFilter; filter = [[GPUImageSoftLightBlendFilter alloc] init]; }; break; + case GPUIMAGE_OPACITY: + { + self.title = @"Opacity Adjustment"; + self.filterSettingsSlider.hidden = NO; + needsSecondImage = YES; + + [self.filterSettingsSlider setValue:1.0]; + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + + filter = [[GPUImageOpacityFilter alloc] init]; + }; break; case GPUIMAGE_CUSTOM: { self.title = @"Custom"; @@ -1007,6 +1019,20 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } + else if (filterType == GPUIMAGE_OPACITY) + { + [sourcePicture removeTarget:filter]; + [videoCamera removeTarget:filter]; + [videoCamera addTarget:filter]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + blendFilter.mix = 1.0; + [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; + [sourcePicture addTarget:blendFilter]; + [filter addTarget:blendFilter]; + + [blendFilter addTarget:filterView]; + } else { [filter addTarget:filterView]; @@ -1067,6 +1093,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)filter setOpacity:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)filter setExcludeCircleRadius:[(UISlider*)sender value]]; break; case GPUIMAGE_FILTERGROUP: [(GPUImagePixellateFilter *)[(GPUImageFilterGroup *)filter filterAtIndex:1] setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_CROP: [(GPUImageCropFilter *)filter setCropRegion:CGRectMake(0.0, 0.0, 1.0, [(UISlider*)sender value])]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index ae4266837..6d3560adb 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -254,6 +254,8 @@ BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */; }; BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; + BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; }; + BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; /* End PBXBuildFile section */ @@ -505,6 +507,8 @@ BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetection.m; path = Source/GPUImageThresholdEdgeDetection.m; sourceTree = SOURCE_ROOT; }; BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSmoothToonFilter.h; path = Source/GPUImageSmoothToonFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; + BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOpacityFilter.h; path = Source/GPUImageOpacityFilter.h; sourceTree = SOURCE_ROOT; }; + BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpacityFilter.m; path = Source/GPUImageOpacityFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ @@ -583,6 +587,8 @@ BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */, BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */, BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */, + BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */, + BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -1012,6 +1018,7 @@ BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */, BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */, BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */, + BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1238,6 +1245,7 @@ BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */, BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */, BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */, + BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 4827ab389..95b46150c 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -103,4 +103,5 @@ #import "GPUImageRGBClosingFilter.h" #import "GPUImageColorPackingFilter.h" #import "GPUImageSphereRefractionFilter.h" -#import "GPUImageMonochromeFilter.h" \ No newline at end of file +#import "GPUImageMonochromeFilter.h" +#import "GPUImageOpacityFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageOpacityFilter.h b/framework/Source/GPUImageOpacityFilter.h new file mode 100644 index 000000000..826749fb3 --- /dev/null +++ b/framework/Source/GPUImageOpacityFilter.h @@ -0,0 +1,11 @@ +#import "GPUImageFilter.h" + +@interface GPUImageOpacityFilter : GPUImageFilter +{ + GLint opacityUniform; +} + +// Opacity ranges from 0.0 to 1.0, with 1.0 as the normal setting +@property(readwrite, nonatomic) CGFloat opacity; + +@end diff --git a/framework/Source/GPUImageOpacityFilter.m b/framework/Source/GPUImageOpacityFilter.m new file mode 100644 index 000000000..fa60f2552 --- /dev/null +++ b/framework/Source/GPUImageOpacityFilter.m @@ -0,0 +1,51 @@ +#import "GPUImageOpacityFilter.h" + +@implementation GPUImageOpacityFilter + +@synthesize opacity = _opacity; + +NSString *const kGPUImageOpacityFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform lowp float opacity; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4(textureColor.rgb, textureColor.a * opacity); + } + ); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageOpacityFragmentShaderString])) + { + return nil; + } + + opacityUniform = [filterProgram uniformIndex:@"opacity"]; + self.opacity = 1.0; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setOpacity:(CGFloat)newValue; +{ + _opacity = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(opacityUniform, _opacity); +} + + +@end From beee2d6d8fc1bb08f405dd38fb4540213ab6dbee Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 8 Jul 2012 15:03:45 -0500 Subject: [PATCH 143/695] Added a compiler define to check whether this is on the Simulator, disable the texture caches if so. This should enable limited use with the Simulator. --- framework/Source/GPUImageOpenGLESContext.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 400eccb65..b34e7413e 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -74,7 +74,11 @@ - (void)presentBufferForDisplay; + (BOOL)supportsFastTextureUpload; { +#if TARGET_IPHONE_SIMULATOR + return NO; +#else return (CVOpenGLESTextureCacheCreate != NULL); +#endif } #pragma mark - From 3a413c8a1ce86254e27eb19f3e49b6357117ad1f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 8 Jul 2012 18:43:53 -0500 Subject: [PATCH 144/695] Sphere refraction filter is now functional. --- .../ShowcaseFilterViewController.m | 20 +++++- .../Source/GPUImageSphereRefractionFilter.h | 6 +- .../Source/GPUImageSphereRefractionFilter.m | 62 ++++++++++++++++--- 3 files changed, 76 insertions(+), 12 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index cb4ab7620..49b1add3f 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -530,9 +530,10 @@ - (void)setupFilter; [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:1.0]; - [self.filterSettingsSlider setValue:0.5]; + [self.filterSettingsSlider setValue:0.15]; filter = [[GPUImageSphereRefractionFilter alloc] init]; + [(GPUImageSphereRefractionFilter *)filter setRadius:0.15]; }; break; case GPUIMAGE_PINCH: { @@ -1033,6 +1034,23 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } + else if (filterType == GPUIMAGE_SPHEREREFRACTION) + { + // Provide a blurred image for a cool-looking background + GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; + [videoCamera addTarget:gaussianBlur]; + gaussianBlur.blurSize = 2.0; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + blendFilter.mix = 1.0; + [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; + [gaussianBlur addTarget:blendFilter]; + [filter addTarget:blendFilter]; + gaussianBlur.targetToIgnoreForUpdates = blendFilter; + + [blendFilter addTarget:filterView]; + + } else { [filter addTarget:filterView]; diff --git a/framework/Source/GPUImageSphereRefractionFilter.h b/framework/Source/GPUImageSphereRefractionFilter.h index 9f1918ebd..1b3aa0af7 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.h +++ b/framework/Source/GPUImageSphereRefractionFilter.h @@ -2,12 +2,14 @@ @interface GPUImageSphereRefractionFilter : GPUImageFilter { - GLint radiusUniform, centerUniform, scaleUniform; + GLint radiusUniform, centerUniform, scaleUniform, aspectRatioUniform, refractiveIndexUniform; } /// The center about which to apply the distortion, with a default of (0.5, 0.5) @property(readwrite, nonatomic) CGPoint center; -/// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.5 +/// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25 @property(readwrite, nonatomic) CGFloat radius; +/// The index of refraction for the sphere, with a default of 0.71 +@property(readwrite, nonatomic) CGFloat refractiveIndex; @end diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index 21261ba3d..26482e182 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -9,29 +9,39 @@ uniform highp vec2 center; uniform highp float radius; uniform highp float scale; - const highp float eta = 0.2; + uniform highp float aspectRatio; + uniform highp float refractiveIndex; void main() { - highp vec2 textureCoordinateToUse = textureCoordinate; - highp float distanceFromCenter = distance(center, textureCoordinate); + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float distanceFromCenter = distance(center, textureCoordinateToUse); lowp float checkForPresenceWithinSphere = step(distanceFromCenter, radius); - highp float normalizedDepth = sqrt(1.0 - distanceFromCenter * distanceFromCenter); - highp vec3 sphereNormal = normalize(vec3(textureCoordinate - center, normalizedDepth)); + distanceFromCenter = distanceFromCenter / radius; - highp vec3 refractedVector = refract(vec3(0.0, 0.0, -1.0), sphereNormal, eta); + highp float normalizedDepth = radius * sqrt(1.0 - distanceFromCenter * distanceFromCenter); + highp vec3 sphereNormal = normalize(vec3(textureCoordinateToUse - center, normalizedDepth)); -// gl_FragColor = texture2D(inputImageTexture, refractedVector.xy) * checkForPresenceWithinSphere; - gl_FragColor = vec4(sphereNormal * checkForPresenceWithinSphere, 1.0); + highp vec3 refractedVector = refract(vec3(0.0, 0.0, -1.0), sphereNormal, refractiveIndex); + + gl_FragColor = texture2D(inputImageTexture, (refractedVector.xy + 1.0) * 0.5) * checkForPresenceWithinSphere; } ); +@interface GPUImageSphereRefractionFilter () + +@property (readwrite, nonatomic) CGFloat aspectRatio; + +@end + @implementation GPUImageSphereRefractionFilter @synthesize center = _center; @synthesize radius = _radius; +@synthesize aspectRatio = _aspectRatio; +@synthesize refractiveIndex = _refractiveIndex; #pragma mark - #pragma mark Initialization and teardown @@ -45,14 +55,30 @@ - (id)init; radiusUniform = [filterProgram uniformIndex:@"radius"]; scaleUniform = [filterProgram uniformIndex:@"scale"]; + aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; centerUniform = [filterProgram uniformIndex:@"center"]; + refractiveIndexUniform = [filterProgram uniformIndex:@"refractiveIndex"]; - self.radius = 0.5; + self.radius = 0.25; self.center = CGPointMake(0.5, 0.5); + self.refractiveIndex = 0.71; + + [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:0.0]; return self; } +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } +} + #pragma mark - #pragma mark Accessors @@ -87,4 +113,22 @@ - (void)setCenter:(CGPoint)newValue; glUniform2fv(centerUniform, 1, centerPosition); } +- (void)setAspectRatio:(CGFloat)newValue; +{ + _aspectRatio = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(aspectRatioUniform, _aspectRatio); +} + +- (void)setRefractiveIndex:(CGFloat)newValue; +{ + _refractiveIndex = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(refractiveIndexUniform, _refractiveIndex); +} + @end From 7290587b81ad0a7264bc4bebcbdc84574c62b6c4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 9 Jul 2012 19:39:01 -0500 Subject: [PATCH 145/695] Chroma key blend now respects alpha channels. --- framework/Source/GPUImageChromaKeyBlendFilter.m | 6 +++--- framework/Source/GPUImageSphereRefractionFilter.h | 2 +- framework/Source/GPUImageSphereRefractionFilter.m | 2 -- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m index 9bff2b490..2447ea69e 100755 --- a/framework/Source/GPUImageChromaKeyBlendFilter.m +++ b/framework/Source/GPUImageChromaKeyBlendFilter.m @@ -17,8 +17,8 @@ void main() { - vec3 textureColor = texture2D(inputImageTexture, textureCoordinate).rgb; - vec3 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2).rgb; + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b; float maskCr = 0.7132 * (colorToReplace.r - maskY); @@ -30,7 +30,7 @@ void main() // float blendValue = 1.0 - smoothstep(thresholdSensitivity - smoothing, thresholdSensitivity , abs(Cr - maskCr) + abs(Cb - maskCb)); float blendValue = 1.0 - smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb))); - gl_FragColor = vec4(mix(textureColor, textureColor2, blendValue), 1.0); + gl_FragColor = mix(textureColor, textureColor2, blendValue); } ); diff --git a/framework/Source/GPUImageSphereRefractionFilter.h b/framework/Source/GPUImageSphereRefractionFilter.h index 1b3aa0af7..cbbd2afac 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.h +++ b/framework/Source/GPUImageSphereRefractionFilter.h @@ -2,7 +2,7 @@ @interface GPUImageSphereRefractionFilter : GPUImageFilter { - GLint radiusUniform, centerUniform, scaleUniform, aspectRatioUniform, refractiveIndexUniform; + GLint radiusUniform, centerUniform, aspectRatioUniform, refractiveIndexUniform; } /// The center about which to apply the distortion, with a default of (0.5, 0.5) diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index 26482e182..079fcee00 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -8,7 +8,6 @@ uniform highp vec2 center; uniform highp float radius; - uniform highp float scale; uniform highp float aspectRatio; uniform highp float refractiveIndex; @@ -54,7 +53,6 @@ - (id)init; } radiusUniform = [filterProgram uniformIndex:@"radius"]; - scaleUniform = [filterProgram uniformIndex:@"scale"]; aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; centerUniform = [filterProgram uniformIndex:@"center"]; refractiveIndexUniform = [filterProgram uniformIndex:@"refractiveIndex"]; From 4d2f25ebc04663cc731ba74cecff309754c63f37 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 14 Jul 2012 18:21:22 -0500 Subject: [PATCH 146/695] Made significant changes to the internal architecture of two-input filters, which should fix many bugs. You no longer need to set targetToIgnoreForUpdates in almost all cases. --- .../ShowcaseFilterViewController.m | 10 ---- .../Source/GPUImageAdaptiveThresholdFilter.m | 1 - framework/Source/GPUImageBuffer.m | 2 +- framework/Source/GPUImageCropFilter.m | 2 +- framework/Source/GPUImageFilter.m | 4 +- framework/Source/GPUImageFilterGroup.m | 4 +- .../GPUImageGaussianSelectiveBlurFilter.m | 2 +- framework/Source/GPUImageHistogramFilter.m | 2 +- framework/Source/GPUImageMovie.m | 4 +- framework/Source/GPUImageMovieWriter.m | 4 +- framework/Source/GPUImageOpenGLESContext.h | 2 +- framework/Source/GPUImagePicture.h | 1 + framework/Source/GPUImagePicture.m | 15 +++++- framework/Source/GPUImageRawDataInput.m | 2 +- framework/Source/GPUImageRawDataOutput.m | 2 +- framework/Source/GPUImageTextureInput.m | 2 +- framework/Source/GPUImageTextureOutput.m | 2 +- framework/Source/GPUImageTiltShiftFilter.m | 2 +- framework/Source/GPUImageTransformFilter.m | 2 +- framework/Source/GPUImageTwoInputFilter.h | 3 +- framework/Source/GPUImageTwoInputFilter.m | 48 +++++++++++++++++++ framework/Source/GPUImageUIElement.m | 2 +- framework/Source/GPUImageUnsharpMaskFilter.m | 2 +- framework/Source/GPUImageVideoCamera.m | 4 +- framework/Source/GPUImageView.m | 2 +- 25 files changed, 89 insertions(+), 37 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 49b1add3f..fe2f3ecf1 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -946,7 +946,6 @@ - (void)setupFilter; [videoCamera addTarget:blendFilter]; [histogramGraph addTarget:blendFilter]; - videoCamera.targetToIgnoreForUpdates = blendFilter; // Avoid double-updating the blend [blendFilter addTarget:filterView]; } @@ -965,7 +964,6 @@ - (void)setupFilter; GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; [videoCamera addTarget:gammaFilter]; [gammaFilter addTarget:blendFilter]; - gammaFilter.targetToIgnoreForUpdates = blendFilter; [crosshairGenerator addTarget:blendFilter]; @@ -992,8 +990,6 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; - uiElementInput.targetToIgnoreForUpdates = blendFilter; - __unsafe_unretained GPUImageUIElement *weakUIElementInput = uiElementInput; [filter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){ @@ -1005,15 +1001,12 @@ - (void)setupFilter; { GPUImageDifferenceBlendFilter *blendFilter = [[GPUImageDifferenceBlendFilter alloc] init]; - [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; -// [filter addTarget:filterView]; [videoCamera removeTarget:filter]; GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; [videoCamera addTarget:gammaFilter]; [gammaFilter addTarget:blendFilter]; - gammaFilter.targetToIgnoreForUpdates = blendFilter; [videoCamera addTarget:filter]; [filter addTarget:blendFilter]; @@ -1028,7 +1021,6 @@ - (void)setupFilter; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; blendFilter.mix = 1.0; - [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; [sourcePicture addTarget:blendFilter]; [filter addTarget:blendFilter]; @@ -1043,10 +1035,8 @@ - (void)setupFilter; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; blendFilter.mix = 1.0; - [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; [gaussianBlur addTarget:blendFilter]; [filter addTarget:blendFilter]; - gaussianBlur.targetToIgnoreForUpdates = blendFilter; [blendFilter addTarget:filterView]; diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.m b/framework/Source/GPUImageAdaptiveThresholdFilter.m index ace335b3f..46433ce15 100755 --- a/framework/Source/GPUImageAdaptiveThresholdFilter.m +++ b/framework/Source/GPUImageAdaptiveThresholdFilter.m @@ -58,7 +58,6 @@ - (id)init; [boxBlurFilter addTarget:adaptiveThresholdFilter]; // To prevent double updating of this filter, disable updates from the sharp luminance image side - adaptiveThresholdFilter.shouldIgnoreUpdatesToThisTarget = YES; [luminanceFilter addTarget:adaptiveThresholdFilter]; self.initialFilters = [NSArray arrayWithObject:luminanceFilter]; diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index 5cc5dee21..e4db8a145 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -32,7 +32,7 @@ - (void)dealloc #pragma mark - #pragma mark GPUImageInput -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { static const GLfloat imageVertices[] = { -1.0f, -1.0f, diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index a66968b20..59f2e54ed 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -210,7 +210,7 @@ - (void)calculateCropTextureCoordinates; } } -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { static const GLfloat cropSquareVertices[] = { -1.0f, -1.0f, diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 0c75bbad3..ef05ed12d 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -463,7 +463,7 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; } [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; - [currentTarget newFrameReadyAtTime:frameTime]; + [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndex]; } } } @@ -569,7 +569,7 @@ - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSStrin #pragma mark - #pragma mark GPUImageInput -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { static const GLfloat imageVertices[] = { -1.0f, -1.0f, diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index c8741e2f1..062f5cd0e 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -86,13 +86,13 @@ - (void)removeAllTargets; #pragma mark - #pragma mark GPUImageInput protocol -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { for (GPUImageOutput *currentFilter in _initialFilters) { if (currentFilter != self.inputFilterToIgnoreForUpdates) { - [currentFilter newFrameReadyAtTime:frameTime]; + [currentFilter newFrameReadyAtTime:frameTime atIndex:textureIndex]; } } } diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index ffbeecca7..c77f9baee 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -49,7 +49,7 @@ - (id)init; [blurFilter addTarget:selectiveFocusFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - self.inputFilterToIgnoreForUpdates = selectiveFocusFilter; +// self.inputFilterToIgnoreForUpdates = selectiveFocusFilter; self.initialFilters = [NSArray arrayWithObjects:blurFilter, selectiveFocusFilter, nil]; self.terminalFilter = selectiveFocusFilter; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 5a1f492fe..93f8ee628 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -204,7 +204,7 @@ - (CGSize)sizeOfFBO; return CGSizeMake(256.0, 3.0); } -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { if (vertexSamplingCoordinates == NULL) { diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index be347535f..5ca948d40 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -230,7 +230,7 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; - [currentTarget newFrameReadyAtTime:currentSampleTime]; + [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; } CVPixelBufferUnlockBaseAddress(movieFrame, 0); @@ -256,7 +256,7 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:currentSize atIndex:targetTextureIndex]; - [currentTarget newFrameReadyAtTime:currentSampleTime]; + [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; } CVPixelBufferUnlockBaseAddress(movieFrame, 0); } diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 0d21a7016..867f90035 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -407,7 +407,7 @@ - (void)renderAtInternalSize; #pragma mark - #pragma mark GPUImageInput protocol -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { if (!isRecording) { @@ -416,7 +416,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime; // Drop frames forced by images and other things with no time constants // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case - if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) ) + if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) || (CMTIME_IS_INDEFINITE(frameTime)) ) { return; } diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 89092ebed..1dde7456d 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -30,7 +30,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k @end @protocol GPUImageInput -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 8784a3dc6..0c2df936d 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -5,6 +5,7 @@ @interface GPUImagePicture : GPUImageOutput { CGSize pixelSizeOfImage; + BOOL hasProcessedImage; } // Initialization and teardown diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 9574e720b..d366db432 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -108,13 +108,15 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly - (void)processImage; { + hasProcessedImage = YES; + for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; + [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; } } @@ -123,4 +125,15 @@ - (CGSize)outputImageSize; return pixelSizeOfImage; } +- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; +{ + [super addTarget:newTarget atTextureLocation:textureLocation]; + + if (hasProcessedImage) + { + [newTarget setInputSize:pixelSizeOfImage atIndex:textureLocation]; + [newTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureLocation]; + } +} + @end diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index fd257aa03..133540cac 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -51,7 +51,7 @@ - (void)processData; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; + [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; } } diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 35d61be59..f38048ae2 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -286,7 +286,7 @@ - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; #pragma mark - #pragma mark GPUImageInput protocol -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { hasReadFromTheCurrentFrame = NO; diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index 6eca8653b..939b52b09 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -31,7 +31,7 @@ - (void)processTextureWithFrameTime:(CMTime)frameTime; NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:textureSize atIndex:targetTextureIndex]; - [currentTarget newFrameReadyAtTime:frameTime]; + [currentTarget newFrameReadyAtTime:frameTime atIndex:targetTextureIndex]; } } diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index 354979b9d..c58879d1e 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -8,7 +8,7 @@ @implementation GPUImageTextureOutput #pragma mark - #pragma mark GPUImageInput protocol -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { [_delegate newFrameReadyFromTextureOutput:self]; } diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index 5e70d6c67..0e4f30258 100755 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -53,7 +53,7 @@ - (id)init; [blurFilter addTarget:tiltShiftFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - self.inputFilterToIgnoreForUpdates = tiltShiftFilter; +// self.inputFilterToIgnoreForUpdates = tiltShiftFilter; self.initialFilters = [NSArray arrayWithObjects:blurFilter, tiltShiftFilter, nil]; self.terminalFilter = tiltShiftFilter; diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index 3f2e5951e..f39ebd74d 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -105,7 +105,7 @@ - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matr #pragma mark - #pragma mark GPUImageInput -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { CGSize currentFBOSize = [self sizeOfFBO]; CGFloat normalizedHeight = currentFBOSize.height / currentFBOSize.width; diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h index 79976586a..e70706fe0 100644 --- a/framework/Source/GPUImageTwoInputFilter.h +++ b/framework/Source/GPUImageTwoInputFilter.h @@ -8,8 +8,9 @@ extern NSString *const kGPUImageTwoInputTextureVertexShaderString; GLint filterInputTextureUniform2; GPUImageRotationMode inputRotation2; GLuint filterSourceTexture2; + CMTime firstFrameTime, secondFrameTime; - BOOL hasSetFirstTexture; + BOOL hasSetFirstTexture, hasReceivedFirstFrame, hasReceivedSecondFrame, firstFrameWasVideo, secondFrameWasVideo; } @end diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 8ee89dbf2..6e3377255 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -46,6 +46,14 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad hasSetFirstTexture = NO; + hasReceivedFirstFrame = NO; + hasReceivedSecondFrame = NO; + firstFrameWasVideo = NO; + secondFrameWasVideo = NO; + + firstFrameTime = kCMTimeInvalid; + secondFrameTime = kCMTimeInvalid; + glEnableVertexAttribArray(filterSecondTextureCoordinateAttribute); return self; @@ -167,5 +175,45 @@ - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; return rotatedSize; } +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; +{ + BOOL updatedMovieFrameOppositeStillImage = NO; + + if (textureIndex == 0) + { + hasReceivedFirstFrame = YES; + firstFrameTime = frameTime; + + if (!CMTIME_IS_INDEFINITE(frameTime)) + { + if CMTIME_IS_INDEFINITE(secondFrameTime) + { + updatedMovieFrameOppositeStillImage = YES; + } + } + } + else + { + hasReceivedSecondFrame = YES; + secondFrameTime = frameTime; + + if (!CMTIME_IS_INDEFINITE(frameTime)) + { + if CMTIME_IS_INDEFINITE(firstFrameTime) + { + updatedMovieFrameOppositeStillImage = YES; + } + } + } + + if ((hasReceivedFirstFrame && hasReceivedSecondFrame) || updatedMovieFrameOppositeStillImage) + { + + [super newFrameReadyAtTime:frameTime atIndex:0]; + hasReceivedFirstFrame = NO; + hasReceivedSecondFrame = NO; + } +} + @end diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m index e9e8ea121..81f984261 100644 --- a/framework/Source/GPUImageUIElement.m +++ b/framework/Source/GPUImageUIElement.m @@ -90,7 +90,7 @@ - (void)update; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:layerPixelSize atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeInvalid]; + [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; } } } diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index 1a7eac19e..d5331ee49 100755 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -48,7 +48,7 @@ - (id)init; [blurFilter addTarget:unsharpMaskFilter atTextureLocation:1]; // To prevent double updating of this filter, disable updates from the sharp image side - self.inputFilterToIgnoreForUpdates = unsharpMaskFilter; +// self.inputFilterToIgnoreForUpdates = unsharpMaskFilter; self.initialFilters = [NSArray arrayWithObjects:blurFilter, unsharpMaskFilter, nil]; self.terminalFilter = unsharpMaskFilter; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 89a71b28c..4f8d7a380 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -299,7 +299,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:currentTime]; + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; } else { @@ -351,7 +351,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:currentTime]; + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; } } } diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 07dbd6058..2b34044b3 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -328,7 +328,7 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM #pragma mark - #pragma mark GPUInput protocol -- (void)newFrameReadyAtTime:(CMTime)frameTime; +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { [GPUImageOpenGLESContext useImageProcessingContext]; [self setDisplayFramebuffer]; From 7a252d22a5e48a627d7087be23dbbeab3c5f77ad Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 16 Jul 2012 21:33:59 -0500 Subject: [PATCH 147/695] Fixed a resize bug with GPUImageView, an infinite loop with GPUImageTwoInputFilter, and filter resizing issues with GPUImageCropFilter. --- framework/Source/GPUImageCropFilter.m | 4 ++-- framework/Source/GPUImageFilter.m | 4 +++- framework/Source/GPUImageFilterGroup.m | 8 ++++---- .../Source/GPUImageGaussianSelectiveBlurFilter.m | 4 +--- framework/Source/GPUImageTwoInputFilter.m | 6 ++++++ framework/Source/GPUImageView.m | 11 ++++++++++- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 59f2e54ed..b923f6c85 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -86,7 +86,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; scaledSize.height = rotatedSize.height * _cropRegion.size.height; - if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (CGSizeEqualToSize(scaledSize, CGSizeZero)) ) + if (CGSizeEqualToSize(scaledSize, CGSizeZero)) { inputTextureSize = scaledSize; } @@ -207,7 +207,7 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = maxY; // 1,1 cropTextureCoordinates[7] = 1.0 - minX; }; break; - } + } } - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index ef05ed12d..8a65a3b6b 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -233,7 +233,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glActiveTexture(GL_TEXTURE1); glGenFramebuffers(1, &filterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { @@ -719,6 +719,8 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; if (CGSizeEqualToSize(frameSize, CGSizeZero)) { overrideInputSize = NO; + inputTextureSize = CGSizeZero; + forcedMaximumSize = CGSizeZero; } else { diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 062f5cd0e..6958ffa54 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -107,10 +107,10 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; { - if ([_initialFilters count] > 0) - { - return [[_initialFilters objectAtIndex:0] nextAvailableTextureIndex]; - } +// if ([_initialFilters count] > 0) +// { +// return [[_initialFilters objectAtIndex:0] nextAvailableTextureIndex]; +// } return 0; } diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index c77f9baee..eaf2931b9 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -48,9 +48,7 @@ - (id)init; // Texture location 0 needs to be the sharp image for both the blur and the second stage processing [blurFilter addTarget:selectiveFocusFilter atTextureLocation:1]; - // To prevent double updating of this filter, disable updates from the sharp image side -// self.inputFilterToIgnoreForUpdates = selectiveFocusFilter; - + // To prevent double updating of this filter, disable updates from the sharp image side self.initialFilters = [NSArray arrayWithObjects:blurFilter, selectiveFocusFilter, nil]; self.terminalFilter = selectiveFocusFilter; diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 6e3377255..096a86c6c 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -177,6 +177,12 @@ - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + // You can set up infinite update loops, so this helps to short circuit them + if (hasReceivedFirstFrame && hasReceivedSecondFrame) + { + return; + } + BOOL updatedMovieFrameOppositeStillImage = NO; if (textureIndex == 0) diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 2b34044b3..40d4ac301 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -137,7 +137,9 @@ - (void)dealloc #pragma mark Managing the display FBOs - (void)createDisplayFramebuffer; -{ +{ + [GPUImageOpenGLESContext useImageProcessingContext]; + glGenFramebuffers(1, &displayFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, displayFramebuffer); @@ -150,6 +152,13 @@ - (void)createDisplayFramebuffer; glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); + + if ( (backingWidth == 0) || (backingHeight == 0) ) + { + [self destroyDisplayFramebuffer]; + return; + } + _sizeInPixels.width = (CGFloat)backingWidth; _sizeInPixels.height = (CGFloat)backingHeight; From f1c401b6d972682ebc43816c77f4c3a2a849ad85 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 16 Jul 2012 22:59:30 -0500 Subject: [PATCH 148/695] Fixed a leak with resized still images. --- framework/Source/GPUImageStillCamera.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index c99e83406..43ec6d970 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -30,7 +30,7 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina CMSampleTimingInfo timing = {frameTime, frameTime, kCMTimeInvalid}; CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixel_buffer, YES, NULL, NULL, videoInfo, &timing, sampleBuffer); - // CFRelease(videoInfo); + CFRelease(videoInfo); CVPixelBufferRelease(pixel_buffer); } From e99a7014e2f9260190821d3fa9a1e5374c768db6 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 17 Jul 2012 11:45:21 -0500 Subject: [PATCH 149/695] Facial Features Additions Still not quite as fast as it needs to be, but it is now possible to turn on CIDetector for any filter, or view it by itself. --- .../FilterShowcase.xcodeproj/project.pbxproj | 4 + .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 9 +- .../ShowcaseFilterViewController.m | 93 +++++++++++- .../ShowcaseFilterViewController.xib | 142 ++++++++++++++---- framework/GPUImage.xcodeproj/project.pbxproj | 4 + framework/Source/GPUImageVideoCamera.h | 27 ++++ framework/Source/GPUImageVideoCamera.m | 92 +++++++++++- 8 files changed, 341 insertions(+), 31 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index d52196fb7..180447ffd 100755 --- a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 0D69488E1501F71900206FF8 /* SampleConfiguration.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D69488D1501F71900206FF8 /* SampleConfiguration.plist */; }; + 6BF3ED5715B5C2BF002F9E9E /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6BF3ED5615B5C2BF002F9E9E /* CoreImage.framework */; }; 83AE9FD41540F3CC00F7FC13 /* mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 83AE9FD31540F3CC00F7FC13 /* mask.png */; }; BC982B0714F046AC0001FF6F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B0614F046AC0001FF6F /* UIKit.framework */; }; BC982B0914F046AC0001FF6F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B0814F046AC0001FF6F /* Foundation.framework */; }; @@ -58,6 +59,7 @@ /* Begin PBXFileReference section */ 0D69488D1501F71900206FF8 /* SampleConfiguration.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SampleConfiguration.plist; sourceTree = ""; }; + 6BF3ED5615B5C2BF002F9E9E /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; 83AE9FD31540F3CC00F7FC13 /* mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mask.png; sourceTree = ""; }; BC982B0214F046AC0001FF6F /* FilterShowcase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FilterShowcase.app; sourceTree = BUILT_PRODUCTS_DIR; }; BC982B0614F046AC0001FF6F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; @@ -93,6 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6BF3ED5715B5C2BF002F9E9E /* CoreImage.framework in Frameworks */, BC982B4214F06BF70001FF6F /* libGPUImage.a in Frameworks */, BC982B2614F048230001FF6F /* OpenGLES.framework in Frameworks */, BC982B2414F0481C0001FF6F /* AVFoundation.framework in Frameworks */, @@ -111,6 +114,7 @@ BC982AF714F046AC0001FF6F = { isa = PBXGroup; children = ( + 6BF3ED5615B5C2BF002F9E9E /* CoreImage.framework */, BC982B0C14F046AC0001FF6F /* FilterShowcase */, BC982B0514F046AC0001FF6F /* Frameworks */, BC982B0314F046AC0001FF6F /* Products */, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index b3e3c295d..e9f067330 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -140,6 +140,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_CUSTOM: cell.textLabel.text = @"Custom"; break; case GPUIMAGE_FILECONFIG: cell.textLabel.text = @"Filter Chain"; break; case GPUIMAGE_FILTERGROUP: cell.textLabel.text = @"Filter Group"; break; + case GPUIMAGE_FACES: cell.textLabel.text = @"Face Detection"; break; } return cell; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 170e7dede..952587841 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -81,11 +81,12 @@ typedef enum { GPUIMAGE_UIELEMENT, GPUIMAGE_FILECONFIG, GPUIMAGE_FILTERGROUP, + GPUIMAGE_FACES, GPUIMAGE_NUMFILTERS } GPUImageShowcaseFilterType; -@interface ShowcaseFilterViewController : UIViewController +@interface ShowcaseFilterViewController : UIViewController { GPUImageVideoCamera *videoCamera; GPUImageOutput *filter; @@ -94,7 +95,9 @@ typedef enum { GPUImageUIElement *uiElementInput; GPUImageFilterPipeline *pipeline; + UIView* faceView; + IBOutlet UISwitch *facesSwitch; __unsafe_unretained UISlider *_filterSettingsSlider; } @@ -106,5 +109,7 @@ typedef enum { // Filter adjustments - (IBAction)updateFilterFromSlider:(id)sender; - +- (void)GPUVCWillOutputFeatures:(NSArray*)featureArray forClap:(CGRect)clap + andOrientation:(UIDeviceOrientation)curDeviceOrientation; +-(IBAction)facesSwitched:(id)sender; @end diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index fe2f3ecf1..fdaa2015b 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -50,8 +50,8 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (void)setupFilter; { - videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; -// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; + // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; BOOL needsSecondImage = NO; @@ -882,6 +882,21 @@ - (void)setupFilter; [(GPUImageFilterGroup *)filter setTerminalFilter:pixellateFilter]; }; break; + case GPUIMAGE_FACES: + { + self.title = @"Face Detection"; + self.filterSettingsSlider.hidden = YES; + + [self.filterSettingsSlider setValue:1.0]; + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:2.0]; + + filter = [[GPUImageSaturationFilter alloc] init]; + [videoCamera setDelegate:self]; + [videoCamera setWillOutputFeatures:YES]; + break; + } + default: filter = [[GPUImageSepiaFilter alloc] init]; break; } @@ -1126,6 +1141,80 @@ - (IBAction)updateFilterFromSlider:(id)sender; } } +#pragma mark - Face Detection Delegate Callback +- (void)GPUVCWillOutputFeatures:(NSArray*)featureArray forClap:(CGRect)clap + andOrientation:(UIDeviceOrientation)curDeviceOrientation +{ + NSLog(@"Did receive array"); + + CGRect previewBox = self.view.frame; + + if (featureArray == nil && faceView) { + [faceView removeFromSuperview]; + faceView = nil; + } + + + for ( CIFaceFeature *faceFeature in featureArray) { + + // find the correct position for the square layer within the previewLayer + // the feature box originates in the bottom left of the video frame. + // (Bottom right if mirroring is turned on) + NSLog(@"%@", NSStringFromCGRect([faceFeature bounds])); + + //Update face bounds for iOS Coordinate System + CGRect faceRect = [faceFeature bounds]; + + // flip preview width and height + CGFloat temp = faceRect.size.width; + faceRect.size.width = faceRect.size.height; + faceRect.size.height = temp; + temp = faceRect.origin.x; + faceRect.origin.x = faceRect.origin.y; + faceRect.origin.y = temp; + // scale coordinates so they fit in the preview box, which may be scaled + CGFloat widthScaleBy = previewBox.size.width / clap.size.height; + CGFloat heightScaleBy = previewBox.size.height / clap.size.width; + faceRect.size.width *= widthScaleBy; + faceRect.size.height *= heightScaleBy; + faceRect.origin.x *= widthScaleBy; + faceRect.origin.y *= heightScaleBy; + + faceRect = CGRectOffset(faceRect, previewBox.origin.x, previewBox.origin.y); + + if (faceView) { + [faceView removeFromSuperview]; + faceView = nil; + } + + // create a UIView using the bounds of the face + faceView = [[UIView alloc] initWithFrame:faceRect]; + + // add a border around the newly created UIView + faceView.layer.borderWidth = 1; + faceView.layer.borderColor = [[UIColor redColor] CGColor]; + + // add the new view to create a box around the face + [self.view addSubview:faceView]; + + } + +} + +-(IBAction)facesSwitched:(UISwitch*)sender{ + if (![sender isOn]) { + [videoCamera setDelegate:nil]; + [videoCamera setWillOutputFeatures:NO]; + if (faceView) { + [faceView removeFromSuperview]; + faceView = nil; + } + }else{ + [videoCamera setDelegate:self]; + [videoCamera setWillOutputFeatures:YES]; + } +} + #pragma mark - #pragma mark Accessors diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib index 4a39da9a4..cc018863a 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib @@ -1,19 +1,21 @@ - 1280 - 11D50 - 2177 - 1138.32 - 568.00 + 1536 + 11E53 + 2809 + 1138.47 + 569.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1173 + 1884 IBProxyObject - IBUIView + IBUILabel IBUISlider + IBUISwitch + IBUIView com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -48,11 +50,62 @@ 0 0.5 + + + 292 + {{219, 8}, {94, 27}} + + + + _NS:9 + NO + IBCocoaTouchFramework + 0 + 0 + + 2 + MC45MTc2NDcxMjMzIDAuOTE3NjQ3MTIzMyAwLjkxNzY0NzEyMzMAA + + + + + 292 + {{173, 8}, {52, 27}} + + + + _NS:9 + NO + YES + 7 + NO + IBCocoaTouchFramework + + 0 + Faces: + + 1 + MCAwIDAAA + + + HelveticaNeue-Bold + Helvetica Neue + 2 + 16 + + + HelveticaNeue-Bold + 16 + 16 + + NO + 0 + {{0, 64}, {320, 416}} - + 3 MQA @@ -85,6 +138,14 @@ 7 + + + facesSwitch + + + + 10 + updateFilterFromSlider: @@ -94,6 +155,15 @@ 6 + + + facesSwitched: + + + 13 + + 11 + @@ -108,6 +178,8 @@ + + @@ -127,6 +199,16 @@ + + 8 + + + + + 9 + + + @@ -137,12 +219,14 @@ GPUImageView com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 7 + 11 @@ -157,28 +241,34 @@ ShowcaseFilterViewController UIViewController - - updateFilterFromSlider: - id - - - updateFilterFromSlider: - + + id + id + + + + facesSwitched: + id + + updateFilterFromSlider: id - - - filterSettingsSlider - UISlider - - - filterSettingsSlider - + + + UISwitch + UISlider + + + + facesSwitch + UISwitch + + filterSettingsSlider UISlider - + IBProjectSource ./Classes/ShowcaseFilterViewController.h @@ -190,6 +280,6 @@ IBCocoaTouchFramework YES 3 - 1173 + 1884 diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 6d3560adb..159a94fc4 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ /* Begin PBXBuildFile section */ 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; + 6BF3ED5915B5C2CC002F9E9E /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6BF3ED5815B5C2CC002F9E9E /* CoreImage.framework */; }; 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; @@ -279,6 +280,7 @@ 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianSelectiveBlurFilter.m; path = Source/GPUImageGaussianSelectiveBlurFilter.m; sourceTree = SOURCE_ROOT; }; 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVignetteFilter.h; path = Source/GPUImageVignetteFilter.h; sourceTree = SOURCE_ROOT; }; 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVignetteFilter.m; path = Source/GPUImageVignetteFilter.m; sourceTree = SOURCE_ROOT; }; + 6BF3ED5815B5C2CC002F9E9E /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHazeFilter.m; path = Source/GPUImageHazeFilter.m; sourceTree = SOURCE_ROOT; }; 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGrayscaleFilter.h; path = Source/GPUImageGrayscaleFilter.h; sourceTree = SOURCE_ROOT; }; @@ -518,6 +520,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6BF3ED5915B5C2CC002F9E9E /* CoreImage.framework in Frameworks */, BCB5E77914E20BAF00701302 /* CoreMedia.framework in Frameworks */, BCB5E77714E20BA800701302 /* CoreVideo.framework in Frameworks */, BCB5E77514E20B9700701302 /* OpenGLES.framework in Frameworks */, @@ -822,6 +825,7 @@ BCF1A32914DDB1EC00852800 = { isa = PBXGroup; children = ( + 6BF3ED5815B5C2CC002F9E9E /* CoreImage.framework */, BCF1A33914DDB1EC00852800 /* GPUImage */, BCF1A34D14DDB1EC00852800 /* GPUImageTests */, BCF1A33614DDB1EC00852800 /* Frameworks */, diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index c9847dede..fe2536ea4 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -3,6 +3,17 @@ #import #import "GPUImageOpenGLESContext.h" #import "GPUImageOutput.h" +#import + +//Delegate Protocal for Face Detection. +@protocol GPUImageVideoCameraDelegate + +@optional +- (void)GPUVCWillOutputFeatures:(NSArray*)featureArray forClap:(CGRect)clap + andOrientation:(UIDeviceOrientation)curDeviceOrientation; + +@end + /** A GPUImageOutput that provides frames from either camera @@ -21,6 +32,12 @@ BOOL capturePaused; GPUImageRotationMode outputRotation; + + BOOL _willOutputFeatures; + + id _delegate; + + CIDetector *faceDetector; } /// The AVCaptureSession used to capture from the camera @@ -35,6 +52,16 @@ /// This determines the rotation applied to the output image, based on the source material @property(readwrite, nonatomic) UIInterfaceOrientation outputImageOrientation; +// For facial detection. + +// Implement class -(void)GPUVCWillOutputFeatures:(NSArray*)featureArray +// forClap:(CGRect)clap +// andOrientation: (UIDeviceOrientation)curDeviceOrientation; + +@property(nonatomic,retain) id delegate; + +@property(nonatomic,assign) BOOL willOutputFeatures; + /// @name Initialization and teardown /** Begin a capture session diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 4f8d7a380..6904a5cac 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -24,6 +24,9 @@ @implementation GPUImageVideoCamera @synthesize runBenchmark = _runBenchmark; @synthesize outputImageOrientation = _outputImageOrientation; +@synthesize willOutputFeatures = _willOutputFeatures; +@synthesize delegate = _delegate; + #pragma mark - #pragma mark Initialization and teardown @@ -44,6 +47,9 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return nil; } + NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil]; + faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; + audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.processingQueue", NULL); _runBenchmark = NO; @@ -401,7 +407,13 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM } else { - runOnMainQueueWithoutDeadlocking(^{ + if (self.delegate) { + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf grepFacesForSampleBuffer:sampleBuffer]; + }); + } + + runOnMainQueueWithoutDeadlocking(^{ [weakSelf processVideoSampleBuffer:sampleBuffer]; }); } @@ -492,4 +504,82 @@ - (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; } } +#pragma mark - Feature Detection +-(void)grepFacesForSampleBuffer:(CMSampleBufferRef)sampleBuffer{ + NSLog(@"Faces thinking"); + CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); + CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate); + CIImage *convertedImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(__bridge NSDictionary *)attachments]; + + if (attachments) + CFRelease(attachments); + NSDictionary *imageOptions = nil; + UIDeviceOrientation curDeviceOrientation = [[UIDevice currentDevice] orientation]; + int exifOrientation; + + /* kCGImagePropertyOrientation values + The intended display orientation of the image. If present, this key is a CFNumber value with the same value as defined + by the TIFF and EXIF specifications -- see enumeration of integer constants. + The value specified where the origin (0,0) of the image is located. If not present, a value of 1 is assumed. + + used when calling featuresInImage: options: The value for this key is an integer NSNumber from 1..8 as found in kCGImagePropertyOrientation. + If present, the detection will be done based on that orientation but the coordinates in the returned features will still be based on those of the image. */ + + enum { + PHOTOS_EXIF_0ROW_TOP_0COL_LEFT = 1, // 1 = 0th row is at the top, and 0th column is on the left (THE DEFAULT). + PHOTOS_EXIF_0ROW_TOP_0COL_RIGHT = 2, // 2 = 0th row is at the top, and 0th column is on the right. + PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT = 3, // 3 = 0th row is at the bottom, and 0th column is on the right. + PHOTOS_EXIF_0ROW_BOTTOM_0COL_LEFT = 4, // 4 = 0th row is at the bottom, and 0th column is on the left. + PHOTOS_EXIF_0ROW_LEFT_0COL_TOP = 5, // 5 = 0th row is on the left, and 0th column is the top. + PHOTOS_EXIF_0ROW_RIGHT_0COL_TOP = 6, // 6 = 0th row is on the right, and 0th column is the top. + PHOTOS_EXIF_0ROW_RIGHT_0COL_BOTTOM = 7, // 7 = 0th row is on the right, and 0th column is the bottom. + PHOTOS_EXIF_0ROW_LEFT_0COL_BOTTOM = 8 // 8 = 0th row is on the left, and 0th column is the bottom. + }; + BOOL isUsingFrontFacingCamera = FALSE; + AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; + + if (currentCameraPosition != AVCaptureDevicePositionBack) + { + isUsingFrontFacingCamera = TRUE; + } + + switch (curDeviceOrientation) { + case UIDeviceOrientationPortraitUpsideDown: // Device oriented vertically, home button on the top + exifOrientation = PHOTOS_EXIF_0ROW_LEFT_0COL_BOTTOM; + break; + case UIDeviceOrientationLandscapeLeft: // Device oriented horizontally, home button on the right + if (isUsingFrontFacingCamera) + exifOrientation = PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT; + else + exifOrientation = PHOTOS_EXIF_0ROW_TOP_0COL_LEFT; + break; + case UIDeviceOrientationLandscapeRight: // Device oriented horizontally, home button on the left + if (isUsingFrontFacingCamera) + exifOrientation = PHOTOS_EXIF_0ROW_TOP_0COL_LEFT; + else + exifOrientation = PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT; + break; + case UIDeviceOrientationPortrait: // Device oriented vertically, home button on the bottom + default: + exifOrientation = PHOTOS_EXIF_0ROW_RIGHT_0COL_TOP; + break; + } + + imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:exifOrientation] forKey:CIDetectorImageOrientation]; + NSArray *features = [faceDetector featuresInImage:convertedImage options:imageOptions]; + + + // get the clean aperture + // the clean aperture is a rectangle that defines the portion of the encoded pixel dimensions + // that represents image data valid for display. + CMFormatDescriptionRef fdesc = CMSampleBufferGetFormatDescription(sampleBuffer); + CGRect clap = CMVideoFormatDescriptionGetCleanAperture(fdesc, false /*originIsTopLeft == false*/); + + if ([[self delegate] respondsToSelector:@selector(GPUVCWillOutputFeatures:forClap:andOrientation:)]) { + [self.delegate GPUVCWillOutputFeatures:features forClap:clap andOrientation:curDeviceOrientation]; + } + + +} + @end From e23899d202ac1cf02c5587fade9560218043dbdd Mon Sep 17 00:00:00 2001 From: Hugues Lismonde Date: Wed, 18 Jul 2012 15:50:48 +0200 Subject: [PATCH 150/695] Allow GPUImageMovie to process an already opened asset --- framework/Source/GPUImageMovie.h | 2 + framework/Source/GPUImageMovie.m | 151 ++++++++++++++++++++----------- 2 files changed, 98 insertions(+), 55 deletions(-) diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index 6056be860..71db97e58 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -7,6 +7,7 @@ */ @interface GPUImageMovie : GPUImageOutput +@property (readwrite, retain) AVAsset *asset; @property(readwrite, retain) NSURL *url; /** This enables the benchmarking mode, which logs out instantaneous and average frame times to the console @@ -14,6 +15,7 @@ @property(readwrite, nonatomic) BOOL runBenchmark; /// @name Initialization and teardown +- (id)initWithAsset:(AVAsset *)asset; - (id)initWithURL:(NSURL *)url; /// @name Movie processing diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 5ca948d40..f66cdde00 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -9,11 +9,14 @@ @interface GPUImageMovie () AVAssetReader *reader; } +- (void)processAsset; + @end @implementation GPUImageMovie @synthesize url = _url; +@synthesize asset = _asset; @synthesize runBenchmark = _runBenchmark; #pragma mark - @@ -25,7 +28,7 @@ - (id)initWithURL:(NSURL *)url; { return nil; } - + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { [GPUImageOpenGLESContext useImageProcessingContext]; @@ -38,13 +41,42 @@ - (id)initWithURL:(NSURL *)url; { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } - + // Need to remove the initially created texture [self deleteOutputTexture]; } self.url = url; - + self.asset = nil; + + return self; +} + +-(id)initWithAsset:(AVAsset *)asset { + if (!(self = [super init])) + { + return nil; + } + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + [GPUImageOpenGLESContext useImageProcessingContext]; +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); +#else + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); +#endif + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + } + + // Need to remove the initially created texture + [self deleteOutputTexture]; + } + self.url = nil; + self.asset = asset; + return self; } @@ -55,7 +87,6 @@ - (void)dealloc CFRelease(coreVideoTextureCache); } } - #pragma mark - #pragma mark Movie processing @@ -67,11 +98,13 @@ - (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieW - (void)startProcessing; { + if(self.url == nil) { + [self processAsset]; + return; + } + NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; - AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; - - __unsafe_unretained GPUImageMovie *weakSelf = self; - + AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ NSError *error = nil; AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; @@ -79,64 +112,72 @@ - (void)startProcessing; { return; } - reader = [AVAssetReader assetReaderWithAsset:inputAsset error:&error]; - - NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; - [outputSettings setObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (NSString*)kCVPixelBufferPixelFormatTypeKey]; - // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding - AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[inputAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; - [reader addOutput:readerVideoTrackOutput]; - - NSArray *audioTracks = [inputAsset tracksWithMediaType:AVMediaTypeAudio]; - BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (weakSelf.audioEncodingTarget != nil) ); - AVAssetReaderTrackOutput *readerAudioTrackOutput = nil; + self.asset = inputAsset; + [self processAsset]; + }]; +} - if (shouldRecordAudioTrack) - { - audioEncodingIsFinished = NO; - - // This might need to be extended to handle movies with more than one audio track - AVAssetTrack* audioTrack = [audioTracks objectAtIndex:0]; - readerAudioTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]; - [reader addOutput:readerAudioTrackOutput]; - } +- (void)processAsset +{ + __unsafe_unretained GPUImageMovie *weakSelf = self; + NSError *error = nil; + reader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; - if ([reader startReading] == NO) - { + NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; + [outputSettings setObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (NSString*)kCVPixelBufferPixelFormatTypeKey]; + // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding + AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; + [reader addOutput:readerVideoTrackOutput]; + + NSArray *audioTracks = [self.asset tracksWithMediaType:AVMediaTypeAudio]; + BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (weakSelf.audioEncodingTarget != nil) ); + AVAssetReaderTrackOutput *readerAudioTrackOutput = nil; + + if (shouldRecordAudioTrack) + { + audioEncodingIsFinished = NO; + + // This might need to be extended to handle movies with more than one audio track + AVAssetTrack* audioTrack = [audioTracks objectAtIndex:0]; + readerAudioTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]; + [reader addOutput:readerAudioTrackOutput]; + } + + if ([reader startReading] == NO) + { NSLog(@"Error reading from file at URL: %@", weakSelf.url); - return; - } + return; + } - if (synchronizedMovieWriter != nil) + if (synchronizedMovieWriter != nil) + { + [synchronizedMovieWriter setVideoInputReadyCallback:^{ + [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; + }]; + + [synchronizedMovieWriter setAudioInputReadyCallback:^{ + [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; + }]; + + [synchronizedMovieWriter enableSynchronizationCallbacks]; + } + else + { + while (reader.status == AVAssetReaderStatusReading) { - [synchronizedMovieWriter setVideoInputReadyCallback:^{ [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; - }]; - [synchronizedMovieWriter setAudioInputReadyCallback:^{ - [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; - }]; - - [synchronizedMovieWriter enableSynchronizationCallbacks]; - } - else - { - while (reader.status == AVAssetReaderStatusReading) + if ( (shouldRecordAudioTrack) && (!audioEncodingIsFinished) ) { - [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; - - if ( (shouldRecordAudioTrack) && (!audioEncodingIsFinished) ) - { [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; - } - - } + } + + } - if (reader.status == AVAssetWriterStatusCompleted) { + if (reader.status == AVAssetWriterStatusCompleted) { [weakSelf endProcessing]; - } } - }]; + } } - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; @@ -223,7 +264,7 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); for (id currentTarget in targets) - { + { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; From 56695717f8e4f3cef947fe38798bcaf953259ff3 Mon Sep 17 00:00:00 2001 From: alariccole Date: Thu, 19 Jul 2012 22:02:16 -0700 Subject: [PATCH 151/695] A CIHighlightShadowAdjust replacement --- .../Source/GPUImageHighlightShadowFilter.h | 30 ++++++++ .../Source/GPUImageHighlightShadowFilter.m | 72 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 framework/Source/GPUImageHighlightShadowFilter.h create mode 100644 framework/Source/GPUImageHighlightShadowFilter.m diff --git a/framework/Source/GPUImageHighlightShadowFilter.h b/framework/Source/GPUImageHighlightShadowFilter.h new file mode 100644 index 000000000..b84e05d57 --- /dev/null +++ b/framework/Source/GPUImageHighlightShadowFilter.h @@ -0,0 +1,30 @@ +#import "GPUImageFilter.h" + +/** + * This is an attempt to replicate CIHighlightShadowAdjust + * + * + * @author Alaric Cole + * @creationDate 07/10/12 + * + */ + + +@interface GPUImageHighlightShadowFilter : GPUImageFilter +{ + GLint shadowsUniform, highlightsUniform; +} + +/** + * 0 - 1, increase to lighten shadows. + * @default 0 + */ +@property(readwrite, nonatomic) CGFloat shadows; + +/** + * 0 - 1, decrease to darken highlights. + * @default 1 + */ +@property(readwrite, nonatomic) CGFloat highlights; + +@end diff --git a/framework/Source/GPUImageHighlightShadowFilter.m b/framework/Source/GPUImageHighlightShadowFilter.m new file mode 100644 index 000000000..6ebfd6c27 --- /dev/null +++ b/framework/Source/GPUImageHighlightShadowFilter.m @@ -0,0 +1,72 @@ +#import "GPUImageHighlightShadowFilter.h" + +NSString *const kGPUImageHighlightShadowFragmentShaderString = SHADER_STRING +( +uniform sampler2D inputImageTexture; +varying highp vec2 textureCoordinate; + +uniform lowp float shadows; +uniform lowp float highlights; + +const mediump vec3 luminanceWeighting = vec3(0.3, 0.3, 0.3); + +void main() +{ + lowp vec4 source = texture2D(inputImageTexture, textureCoordinate); + mediump float luminance = dot(source.rgb, luminanceWeighting); + + mediump float shadow = clamp((pow(luminance, 1.0/(shadows+1.0)) + (-0.76)*pow(luminance, 2.0/(shadows+1.0))) - luminance, 0.0, 1.0); + mediump float highlight = clamp((1.0 - (pow(1.0-luminance, 1.0/(2.0-highlights)) + (-0.8)*pow(1.0-luminance, 2.0/(2.0-highlights)))) - luminance, -1.0, 0.0); + lowp vec3 result = vec3(0.0, 0.0, 0.0) + ((luminance + shadow + highlight) - 0.0) * ((source.rgb - vec3(0.0, 0.0, 0.0))/(luminance - 0.0)); + + gl_FragColor = vec4(result.rgb, source.a); +} +); + +@implementation GPUImageHighlightShadowFilter + +@synthesize shadows = _shadows; +@synthesize highlights = _highlights; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageHighlightShadowFragmentShaderString])) + { + return nil; + } + + shadowsUniform = [filterProgram uniformIndex:@"shadows"]; + highlightsUniform = [filterProgram uniformIndex:@"highlights"]; + + self.shadows = 0.0; + self.highlights = 1.0; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setShadows:(CGFloat)newValue; +{ + _shadows = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(shadowsUniform, _shadows); +} + +- (void)setHighlights:(CGFloat)newValue; +{ + _highlights = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(highlightsUniform, _highlights); +} + +@end + From 8c351acaa53ba0b0bd90a28dc4d93f861ffc615e Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 20 Jul 2012 22:30:17 -0500 Subject: [PATCH 152/695] Added a false color filter. Incorporated the shadows and highlights filter into the showcase. --- README.md | 8 ++ .../ShowcaseFilterListController.m | 2 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 23 ++++- framework/GPUImage.xcodeproj/project.pbxproj | 24 ++++- framework/Source/GPUImage.h | 4 +- framework/Source/GPUImageFalseColorFilter.h | 15 ++++ framework/Source/GPUImageFalseColorFilter.m | 88 +++++++++++++++++++ .../Source/GPUImageHighlightShadowFilter.h | 10 --- framework/Source/GPUImageMonochromeFilter.h | 2 +- framework/Source/GPUImageMonochromeFilter.m | 43 ++++----- framework/Source/GPUImageRGBFilter.h | 1 + 12 files changed, 177 insertions(+), 45 deletions(-) create mode 100644 framework/Source/GPUImageFalseColorFilter.h create mode 100644 framework/Source/GPUImageFalseColorFilter.m diff --git a/README.md b/README.md index d35a6b71c..3d86c7aec 100755 --- a/README.md +++ b/README.md @@ -78,6 +78,10 @@ Documentation is generated from header comments using appledoc. To build the doc - *greenControlPoints*: - *blueControlPoints*: The tone curve takes in a series of control points that define the spline curve for each color component. These are stored as NSValue-wrapped CGPoints in an NSArray, with normalized X and Y coordinates from 0 - 1. The defaults are (0,0), (0.5,0.5), (1,1). +- **GPUImageHighlightShadowFilter**: Adjusts the shadows and highlights of an image + - *shadows*: Increase to lighten shadows, from 0.0 to 1.0, with 0.0 as the default. + - *highlights*: Decrease to darken highlights, from 0.0 to 1.0, with 1.0 as the default. + - **GPUImageColorInvertFilter**: Inverts the colors of an image - **GPUImageGrayscaleFilter**: Converts an image to grayscale (a slightly faster implementation of the saturation filter, without the ability to vary the color contribution) @@ -86,6 +90,10 @@ Documentation is generated from header comments using appledoc. To build the doc - *intensity*: The degree to which the specific color replaces the normal image color (0.0 - 1.0, with 1.0 as the default) - *color*: The color to use as the basis for the effect, with (0.6, 0.45, 0.3, 1.0) as the default. +- **GPUImageFalseColorFilter**: Uses the luminance of the image to mix between two user-specified colors + - *firstColor*: The first and second colors specify what colors replace the dark and light areas of the image, respectively. The defaults are (0.0, 0.0, 0.5) amd (1.0, 0.0, 0.0). + - *secondColor*: + - **GPUImageSepiaFilter**: Simple sepia tone filter - *intensity*: The degree to which the sepia tone replaces the normal image color (0.0 - 1.0, with 1.0 as the default) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index b3e3c295d..b39f0ce10 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -67,10 +67,12 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_EXPOSURE: cell.textLabel.text = @"Exposure"; break; case GPUIMAGE_RGB: cell.textLabel.text = @"RGB"; break; case GPUIMAGE_MONOCHROME: cell.textLabel.text = @"Monochrome"; break; + case GPUIMAGE_FALSECOLOR: cell.textLabel.text = @"False color"; break; case GPUIMAGE_SHARPEN: cell.textLabel.text = @"Sharpen"; break; case GPUIMAGE_UNSHARPMASK: cell.textLabel.text = @"Unsharp mask"; break; case GPUIMAGE_GAMMA: cell.textLabel.text = @"Gamma"; break; case GPUIMAGE_TONECURVE: cell.textLabel.text = @"Tone curve"; break; + case GPUIMAGE_HIGHLIGHTSHADOW: cell.textLabel.text = @"Highlights and shadows"; break; case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 170e7dede..dd64b70df 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -8,6 +8,7 @@ typedef enum { GPUIMAGE_EXPOSURE, GPUIMAGE_RGB, GPUIMAGE_MONOCHROME, + GPUIMAGE_FALSECOLOR, GPUIMAGE_SHARPEN, GPUIMAGE_UNSHARPMASK, GPUIMAGE_TRANSFORM, @@ -16,6 +17,7 @@ typedef enum { GPUIMAGE_MASK, GPUIMAGE_GAMMA, GPUIMAGE_TONECURVE, + GPUIMAGE_HIGHLIGHTSHADOW, GPUIMAGE_HAZE, GPUIMAGE_SEPIA, GPUIMAGE_COLORINVERT, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index fe2f3ecf1..0b252863d 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -128,6 +128,13 @@ - (void)setupFilter; filter = [[GPUImageMonochromeFilter alloc] init]; [(GPUImageMonochromeFilter *)filter setColor:(GPUVector4){0.0f, 0.0f, 1.0f, 1.f}]; }; break; + case GPUIMAGE_FALSECOLOR: + { + self.title = @"False Color"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageFalseColorFilter alloc] init]; + }; break; case GPUIMAGE_SATURATION: { self.title = @"Saturation"; @@ -229,6 +236,17 @@ - (void)setupFilter; filter = [[GPUImageToneCurveFilter alloc] init]; [(GPUImageToneCurveFilter *)filter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, 0.5)], [NSValue valueWithCGPoint:CGPointMake(1.0, 0.75)], nil]]; + }; break; + case GPUIMAGE_HIGHLIGHTSHADOW: + { + self.title = @"Highlights and Shadows"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setValue:1.0]; + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + + filter = [[GPUImageHighlightShadowFilter alloc] init]; }; break; case GPUIMAGE_HAZE: { @@ -1074,8 +1092,8 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_GAMMA: [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; break; case GPUIMAGE_CROSSHATCH: [(GPUImageCrosshatchFilter *)filter setCrossHatchSpacing:[(UISlider *)sender value]]; break; case GPUIMAGE_POSTERIZE: [(GPUImagePosterizeFilter *)filter setColorLevels:round([(UISlider*)sender value])]; break; - case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)filter setDistance:[(UISlider *)sender value]]; break; - case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)filter setThreshold:[(UISlider *)sender value]]; break; + case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)filter setDistance:[(UISlider *)sender value]]; break; + case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)filter setThreshold:[(UISlider *)sender value]]; break; case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; @@ -1093,6 +1111,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_SPHEREREFRACTION: [(GPUImageSphereRefractionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_TONECURVE: [(GPUImageToneCurveFilter *)filter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, [(UISlider *)sender value])], [NSValue valueWithCGPoint:CGPointMake(1.0, 0.75)], nil]]; break; + case GPUIMAGE_HIGHLIGHTSHADOW: [(GPUImageHighlightShadowFilter *)filter setHighlights:[(UISlider *)sender value]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)filter setDisplayTileSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 6d3560adb..756e3deea 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -212,6 +212,10 @@ BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; }; BCC1E66E152368130006EFA5 /* GPUImageCrosshatchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */; }; BCC1E67C152368840006EFA5 /* GPUImageCGAColorspaceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E67B152368840006EFA5 /* GPUImageCGAColorspaceFilter.m */; }; + BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; }; + BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */; }; + BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; }; + BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */; }; BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; }; BCC93A101501D1BF00958B26 /* GPUImageFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */; }; BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; }; @@ -466,6 +470,10 @@ BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCrosshatchFilter.h; path = Source/GPUImageCrosshatchFilter.h; sourceTree = SOURCE_ROOT; }; BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCrosshatchFilter.m; path = Source/GPUImageCrosshatchFilter.m; sourceTree = SOURCE_ROOT; }; BCC1E67B152368840006EFA5 /* GPUImageCGAColorspaceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCGAColorspaceFilter.m; path = Source/GPUImageCGAColorspaceFilter.m; sourceTree = SOURCE_ROOT; }; + BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHighlightShadowFilter.h; path = Source/GPUImageHighlightShadowFilter.h; sourceTree = SOURCE_ROOT; }; + BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHighlightShadowFilter.m; path = Source/GPUImageHighlightShadowFilter.m; sourceTree = SOURCE_ROOT; }; + BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFalseColorFilter.h; path = Source/GPUImageFalseColorFilter.h; sourceTree = SOURCE_ROOT; }; + BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFalseColorFilter.m; path = Source/GPUImageFalseColorFilter.m; sourceTree = SOURCE_ROOT; }; BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFastBlurFilter.h; path = Source/GPUImageFastBlurFilter.h; sourceTree = SOURCE_ROOT; }; BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFastBlurFilter.m; path = Source/GPUImageFastBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoPassFilter.h; path = Source/GPUImageTwoPassFilter.h; sourceTree = SOURCE_ROOT; }; @@ -553,10 +561,6 @@ BC1B715D14F4AFFF00ACA2AB /* Color processing */ = { isa = PBXGroup; children = ( - BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */, - BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */, - BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */, - BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */, BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */, BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */, BCB6B833150400030041703B /* GPUImageExposureFilter.h */, @@ -569,6 +573,14 @@ BC982B7D14F09F980001FF6F /* GPUImageGammaFilter.m */, B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */, B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */, + BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */, + BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */, + BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */, + BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */, + BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */, + BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */, + BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */, + BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */, 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */, 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */, BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */, @@ -1019,6 +1031,8 @@ BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */, BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */, BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */, + BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */, + BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1246,6 +1260,8 @@ BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */, BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */, BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */, + BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */, + BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 95b46150c..ad0aa37ca 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -104,4 +104,6 @@ #import "GPUImageColorPackingFilter.h" #import "GPUImageSphereRefractionFilter.h" #import "GPUImageMonochromeFilter.h" -#import "GPUImageOpacityFilter.h" \ No newline at end of file +#import "GPUImageOpacityFilter.h" +#import "GPUImageHighlightShadowFilter.h" +#import "GPUImageFalseColorFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageFalseColorFilter.h b/framework/Source/GPUImageFalseColorFilter.h new file mode 100644 index 000000000..cb0b82f70 --- /dev/null +++ b/framework/Source/GPUImageFalseColorFilter.h @@ -0,0 +1,15 @@ +#import "GPUImageFilter.h" + +@interface GPUImageFalseColorFilter : GPUImageFilter +{ + GLint firstColorUniform, secondColorUniform; +} + +// The first and second colors specify what colors replace the dark and light areas of the image, respectively. The defaults are (0.0, 0.0, 0.5) amd (1.0, 0.0, 0.0). +@property(readwrite, nonatomic) GPUVector4 firstColor; +@property(readwrite, nonatomic) GPUVector4 secondColor; + +- (void)setFirstColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +- (void)setSecondColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; + +@end diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m new file mode 100644 index 000000000..f34d73267 --- /dev/null +++ b/framework/Source/GPUImageFalseColorFilter.m @@ -0,0 +1,88 @@ +#import "GPUImageFalseColorFilter.h" + +NSString *const kGPUFalseColorFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float intensity; + uniform vec3 firstColor; + uniform vec3 secondColor; + + const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, luminanceWeighting); + + gl_FragColor = vec4( mix(firstColor.rgb, secondColor.rgb, luminance), textureColor.a); + } +); + +@implementation GPUImageFalseColorFilter + +@synthesize secondColor = _secondColor; +@synthesize firstColor = _firstColor; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUFalseColorFragmentShaderString])) + { + return nil; + } + + firstColorUniform = [filterProgram uniformIndex:@"firstColor"]; + secondColorUniform = [filterProgram uniformIndex:@"secondColor"]; + + self.firstColor = (GPUVector4){0.0f, 0.0f, 0.5f, 1.0f}; + self.secondColor = (GPUVector4){1.0f, 0.0f, 0.0f, 1.0f}; + + return self; +} + + +#pragma mark - +#pragma mark Accessors + +- (void)setFirstColor:(GPUVector4)newValue; +{ + _firstColor = newValue; + + [self setFirstColorRed:_firstColor.one green:_firstColor.two blue:_firstColor.three]; +} + +- (void)setSecondColor:(GPUVector4)newValue; +{ + _secondColor = newValue; + + [self setSecondColorRed:_secondColor.one green:_secondColor.two blue:_secondColor.three]; +} + +- (void)setFirstColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +{ + GLfloat filterColor[3]; + filterColor[0] = redComponent; + filterColor[1] = greenComponent; + filterColor[2] = blueComponent; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform3fv(firstColorUniform, 1, filterColor); +} + +- (void)setSecondColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +{ + GLfloat filterColor[3]; + filterColor[0] = redComponent; + filterColor[1] = greenComponent; + filterColor[2] = blueComponent; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform3fv(secondColorUniform, 1, filterColor); +} + +@end diff --git a/framework/Source/GPUImageHighlightShadowFilter.h b/framework/Source/GPUImageHighlightShadowFilter.h index b84e05d57..357912988 100644 --- a/framework/Source/GPUImageHighlightShadowFilter.h +++ b/framework/Source/GPUImageHighlightShadowFilter.h @@ -1,15 +1,5 @@ #import "GPUImageFilter.h" -/** - * This is an attempt to replicate CIHighlightShadowAdjust - * - * - * @author Alaric Cole - * @creationDate 07/10/12 - * - */ - - @interface GPUImageHighlightShadowFilter : GPUImageFilter { GLint shadowsUniform, highlightsUniform; diff --git a/framework/Source/GPUImageMonochromeFilter.h b/framework/Source/GPUImageMonochromeFilter.h index 63af32409..b67c14c18 100644 --- a/framework/Source/GPUImageMonochromeFilter.h +++ b/framework/Source/GPUImageMonochromeFilter.h @@ -7,7 +7,7 @@ @property(readwrite, nonatomic) CGFloat intensity; @property(readwrite, nonatomic) GPUVector4 color; -//@property(readwrite, nonatomic) CIColor* color; + - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; @end \ No newline at end of file diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m index 970ed6154..648b7fb47 100644 --- a/framework/Source/GPUImageMonochromeFilter.m +++ b/framework/Source/GPUImageMonochromeFilter.m @@ -2,46 +2,35 @@ NSString *const kGPUMonochromeFragmentShaderString = SHADER_STRING ( -precision lowp float; - -varying highp vec2 textureCoordinate; + precision lowp float; -uniform sampler2D inputImageTexture; -uniform float intensity; -uniform vec3 filterColor; - -const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + varying highp vec2 textureCoordinate; - + uniform sampler2D inputImageTexture; + uniform float intensity; + uniform vec3 filterColor; -void main() -{ - - + const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + + void main() + { //desat, then apply overlay blend lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); float luminance = dot(textureColor.rgb, luminanceWeighting); lowp vec4 desat = vec4(vec3(luminance), 1.0); - - //overlay lowp vec4 outputColor = vec4( - (desat.r < 0.5 ? (2.0 * desat.r * filterColor.r) : (1.0 - 2.0 * (1.0 - desat.r) * (1.0 - filterColor.r))), - (desat.g < 0.5 ? (2.0 * desat.g * filterColor.g) : (1.0 - 2.0 * (1.0 - desat.g) * (1.0 - filterColor.g))), - (desat.b < 0.5 ? (2.0 * desat.b * filterColor.b) : (1.0 - 2.0 * (1.0 - desat.b) * (1.0 - filterColor.b))), - 1.0 - ); + (desat.r < 0.5 ? (2.0 * desat.r * filterColor.r) : (1.0 - 2.0 * (1.0 - desat.r) * (1.0 - filterColor.r))), + (desat.g < 0.5 ? (2.0 * desat.g * filterColor.g) : (1.0 - 2.0 * (1.0 - desat.g) * (1.0 - filterColor.g))), + (desat.b < 0.5 ? (2.0 * desat.b * filterColor.b) : (1.0 - 2.0 * (1.0 - desat.b) * (1.0 - filterColor.b))), + 1.0 + ); //which is better, or are they equal? - gl_FragColor = vec4( mix(textureColor.rgb, outputColor.rgb, intensity), 1.0 ); - //gl_FragColor = (intensity * outputColor) + ((1.0 - intensity) * textureColor); - - - - -} + gl_FragColor = vec4( mix(textureColor.rgb, outputColor.rgb, intensity), textureColor.a); + } ); @implementation GPUImageMonochromeFilter diff --git a/framework/Source/GPUImageRGBFilter.h b/framework/Source/GPUImageRGBFilter.h index 4d64ef503..e514c512e 100755 --- a/framework/Source/GPUImageRGBFilter.h +++ b/framework/Source/GPUImageRGBFilter.h @@ -7,6 +7,7 @@ GLint blueUniform; } +// Normalized values by which each color channel is multiplied. The range is from 0.0 up, with 1.0 as the default. @property (readwrite, nonatomic) CGFloat red; @property (readwrite, nonatomic) CGFloat green; @property (readwrite, nonatomic) CGFloat blue; From dd5fd0c4659b5db3b1a64d6e2f32d2d9bc50c572 Mon Sep 17 00:00:00 2001 From: Hugues Lismonde Date: Wed, 18 Jul 2012 15:51:40 +0200 Subject: [PATCH 153/695] Source over blend filter --- framework/GPUImage.xcodeproj/project.pbxproj | 8 +++++ framework/Source/GPUImage.h | 1 + .../Source/GPUImageSourceOverBlendFilter.h | 5 +++ .../Source/GPUImageSourceOverBlendFilter.m | 31 +++++++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 framework/Source/GPUImageSourceOverBlendFilter.h create mode 100644 framework/Source/GPUImageSourceOverBlendFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 756e3deea..1557eeeff 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ /* Begin PBXBuildFile section */ 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; + 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; }; + 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; @@ -283,6 +285,8 @@ 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianSelectiveBlurFilter.m; path = Source/GPUImageGaussianSelectiveBlurFilter.m; sourceTree = SOURCE_ROOT; }; 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVignetteFilter.h; path = Source/GPUImageVignetteFilter.h; sourceTree = SOURCE_ROOT; }; 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVignetteFilter.m; path = Source/GPUImageVignetteFilter.m; sourceTree = SOURCE_ROOT; }; + 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSourceOverBlendFilter.h; path = Source/GPUImageSourceOverBlendFilter.h; sourceTree = SOURCE_ROOT; }; + 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSourceOverBlendFilter.m; path = Source/GPUImageSourceOverBlendFilter.m; sourceTree = SOURCE_ROOT; }; 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHazeFilter.m; path = Source/GPUImageHazeFilter.m; sourceTree = SOURCE_ROOT; }; 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGrayscaleFilter.h; path = Source/GPUImageGrayscaleFilter.h; sourceTree = SOURCE_ROOT; }; @@ -608,6 +612,8 @@ BC1B715E14F4B04800ACA2AB /* Blends */ = { isa = PBXGroup; children = ( + 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */, + 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */, BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */, BCB6B85115041A920041703B /* GPUImageColorBurnBlendFilter.m */, BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */, @@ -997,6 +1003,7 @@ BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */, BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */, BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, + 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */, BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */, BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */, BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */, @@ -1226,6 +1233,7 @@ BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */, BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */, BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, + 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */, BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */, BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */, BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */, diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index ad0aa37ca..230366a28 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -45,6 +45,7 @@ #import "GPUImageLightenBlendFilter.h" #import "GPUImageSwirlFilter.h" #import "GPUImageFastBlurFilter.h" +#import "GPUImageSourceOverBlendFilter.h" #import "GPUImageColorBurnBlendFilter.h" #import "GPUImageColorDodgeBlendFilter.h" #import "GPUImageScreenBlendFilter.h" diff --git a/framework/Source/GPUImageSourceOverBlendFilter.h b/framework/Source/GPUImageSourceOverBlendFilter.h new file mode 100644 index 000000000..e9d2478d8 --- /dev/null +++ b/framework/Source/GPUImageSourceOverBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageFilter.h" + +@interface GPUImageSourceOverBlendFilter : GPUImageFilter + +@end diff --git a/framework/Source/GPUImageSourceOverBlendFilter.m b/framework/Source/GPUImageSourceOverBlendFilter.m new file mode 100644 index 000000000..bef26a7e3 --- /dev/null +++ b/framework/Source/GPUImageSourceOverBlendFilter.m @@ -0,0 +1,31 @@ +#import "GPUImageSourceOverBlendFilter.h" + +NSString *const kGPUImageSourceOverBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + + gl_FragColor = mix(textureColor, textureColor2, textureColor2.a); + } +); + +@implementation GPUImageSourceOverBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageSourceOverBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end From dec68eb19857615350ae6803ecc06c3b505cd899 Mon Sep 17 00:00:00 2001 From: Hugues Lismonde Date: Sat, 21 Jul 2012 10:15:48 +0200 Subject: [PATCH 154/695] Ported to new GPUImageTwoInputFilter --- framework/Source/GPUImageSourceOverBlendFilter.h | 4 ++-- framework/Source/GPUImageSourceOverBlendFilter.m | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageSourceOverBlendFilter.h b/framework/Source/GPUImageSourceOverBlendFilter.h index e9d2478d8..29e30635f 100644 --- a/framework/Source/GPUImageSourceOverBlendFilter.h +++ b/framework/Source/GPUImageSourceOverBlendFilter.h @@ -1,5 +1,5 @@ -#import "GPUImageFilter.h" +#import "GPUImageTwoInputFilter.h" -@interface GPUImageSourceOverBlendFilter : GPUImageFilter +@interface GPUImageSourceOverBlendFilter : GPUImageTwoInputFilter @end diff --git a/framework/Source/GPUImageSourceOverBlendFilter.m b/framework/Source/GPUImageSourceOverBlendFilter.m index bef26a7e3..a1b79a099 100644 --- a/framework/Source/GPUImageSourceOverBlendFilter.m +++ b/framework/Source/GPUImageSourceOverBlendFilter.m @@ -3,6 +3,7 @@ NSString *const kGPUImageSourceOverBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; From 6566040d3f7d94e93d7aef3e05345fbce9f179bf Mon Sep 17 00:00:00 2001 From: Cameron Date: Sat, 21 Jul 2012 10:08:49 -0700 Subject: [PATCH 155/695] Added a hue adjustment filter. --- .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 +++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageHueFilter.h | 11 +++ framework/Source/GPUImageHueFilter.m | 76 +++++++++++++++++++ 6 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageHueFilter.h create mode 100644 framework/Source/GPUImageHueFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index dd64b70df..7033287cb 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -7,6 +7,7 @@ typedef enum { GPUIMAGE_BRIGHTNESS, GPUIMAGE_EXPOSURE, GPUIMAGE_RGB, + GPUIMAGE_HUE, GPUIMAGE_MONOCHROME, GPUIMAGE_FALSECOLOR, GPUIMAGE_SHARPEN, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 0b252863d..bfb443f1e 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -179,6 +179,17 @@ - (void)setupFilter; filter = [[GPUImageRGBFilter alloc] init]; }; break; + case GPUIMAGE_HUE: + { + self.title = @"Hue"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:360.0]; + [self.filterSettingsSlider setValue:90.0]; + + filter = [[GPUImageHueFilter alloc] init]; + }; break; case GPUIMAGE_EXPOSURE: { self.title = @"Exposure"; @@ -1085,6 +1096,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; + case GPUIMAGE_HUE: [(GPUImageHueFilter *)filter setHue:90.0]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setDownsamplingFactor:round([(UISlider *)sender value])]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 756e3deea..9e475cc8f 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -262,6 +262,8 @@ BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; + C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; }; + C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -519,6 +521,8 @@ BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpacityFilter.m; path = Source/GPUImageOpacityFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; + C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; + C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueFilter.m; path = Source/GPUImageHueFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -574,6 +578,8 @@ B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */, B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */, BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */, + C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */, + C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */, BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */, BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */, BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */, @@ -1033,6 +1039,7 @@ BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */, BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */, BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */, + C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1262,6 +1269,7 @@ BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */, BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */, BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */, + C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index ad0aa37ca..ab7c304c1 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -106,4 +106,5 @@ #import "GPUImageMonochromeFilter.h" #import "GPUImageOpacityFilter.h" #import "GPUImageHighlightShadowFilter.h" -#import "GPUImageFalseColorFilter.h" \ No newline at end of file +#import "GPUImageFalseColorFilter.h" +#import "GPUImageHueFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageHueFilter.h b/framework/Source/GPUImageHueFilter.h new file mode 100644 index 000000000..49c7e3d64 --- /dev/null +++ b/framework/Source/GPUImageHueFilter.h @@ -0,0 +1,11 @@ + +#import "GPUImageFilter.h" + +@interface GPUImageHueFilter : GPUImageFilter +{ + GLfloat hueAdjustUniform; + +} +@property (nonatomic, readwrite) CGFloat hue; + +@end diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m new file mode 100644 index 000000000..073766905 --- /dev/null +++ b/framework/Source/GPUImageHueFilter.m @@ -0,0 +1,76 @@ + +#import "GPUImageHueFilter.h" + +// Adapted from http://stackoverflow.com/questions/9234724/how-to-change-hue-of-a-texture-with-glsl - see for code and discussion +NSString *const kGPUImageHueFragmentShaderString = SHADER_STRING +( + precision highp float; + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform mediump float hueAdjust; + const highp vec4 kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0); + const highp vec4 kRGBToI = vec4 (0.595716, -0.274453, -0.321263, 0.0); + const highp vec4 kRGBToQ = vec4 (0.211456, -0.522591, 0.31135, 0.0); + + const highp vec4 kYIQToR = vec4 (1.0, 0.9563, 0.6210, 0.0); + const highp vec4 kYIQToG = vec4 (1.0, -0.2721, -0.6474, 0.0); + const highp vec4 kYIQToB = vec4 (1.0, -1.1070, 1.7046, 0.0); + + void main () + { + // Sample the input pixel + highp vec4 color = texture2D(inputImageTexture, textureCoordinate); + + // Convert to YIQ + highp float YPrime = dot (color, kRGBToYPrime); + highp float I = dot (color, kRGBToI); + highp float Q = dot (color, kRGBToQ); + + // Calculate the hue and chroma + highp float hue = atan (Q, I); + highp float chroma = sqrt (I * I + Q * Q); + + // Make the user's adjustments + hue += (-hueAdjust); //why negative rotation? + + // Convert back to YIQ + Q = chroma * sin (hue); + I = chroma * cos (hue); + + // Convert back to RGB + highp vec4 yIQ = vec4 (YPrime, I, Q, 0.0); + color.r = dot (yIQ, kYIQToR); + color.g = dot (yIQ, kYIQToG); + color.b = dot (yIQ, kYIQToB); + + // Save the result + gl_FragColor = color; + } + ); + + +@implementation GPUImageHueFilter +@synthesize hue; + +-(id) init { + if(! (self = [super initWithFragmentShaderFromString:kGPUImageHueFragmentShaderString]) ){ + return nil; + } + + hueAdjustUniform = [filterProgram uniformIndex:@"hueAdjust"]; + self.hue = 90; + + return self; +} + +-(void) setHue:(CGFloat)newHue { + hue = fmodf(newHue, 360.0); + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(hueAdjustUniform, hue); + +} + + +@end From f091460aca000afa8b7665c0c4d85a93904bceba Mon Sep 17 00:00:00 2001 From: Cameron Date: Sat, 21 Jul 2012 10:31:45 -0700 Subject: [PATCH 156/695] Fixed the hue input calculation --- framework/Source/GPUImageHueFilter.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m index 073766905..6c3556275 100644 --- a/framework/Source/GPUImageHueFilter.m +++ b/framework/Source/GPUImageHueFilter.m @@ -65,7 +65,8 @@ -(id) init { } -(void) setHue:(CGFloat)newHue { - hue = fmodf(newHue, 360.0); + // Convert degrees to radians for hue rotation + hue = fmodf(newHue, 360.0) * M_PI/180 ; [GPUImageOpenGLESContext useImageProcessingContext]; [filterProgram use]; glUniform1f(hueAdjustUniform, hue); From fd65e60451376c481c5fdb23ce8806bc21338c10 Mon Sep 17 00:00:00 2001 From: Cameron Date: Sat, 21 Jul 2012 10:32:31 -0700 Subject: [PATCH 157/695] Fixed an oops in the filter showcase / hue slider --- .../FilterShowcase/ShowcaseFilterListController.m | 1 + .../FilterShowcase/ShowcaseFilterViewController.m | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index b39f0ce10..0cab080f0 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -66,6 +66,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_BRIGHTNESS: cell.textLabel.text = @"Brightness"; break; case GPUIMAGE_EXPOSURE: cell.textLabel.text = @"Exposure"; break; case GPUIMAGE_RGB: cell.textLabel.text = @"RGB"; break; + case GPUIMAGE_HUE: cell.textLabel.text = @"Hue"; break; case GPUIMAGE_MONOCHROME: cell.textLabel.text = @"Monochrome"; break; case GPUIMAGE_FALSECOLOR: cell.textLabel.text = @"False color"; break; case GPUIMAGE_SHARPEN: cell.textLabel.text = @"Sharpen"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index bfb443f1e..867f59111 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1096,7 +1096,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; - case GPUIMAGE_HUE: [(GPUImageHueFilter *)filter setHue:90.0]; break; + case GPUIMAGE_HUE: [(GPUImageHueFilter *)filter setHue:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setDownsamplingFactor:round([(UISlider *)sender value])]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; From 84664574d2158e1625bfb2392c939832ce5cab00 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 22 Jul 2012 18:13:52 -0500 Subject: [PATCH 158/695] Modified the SimpleVideoFileFilter example to show how to use blends with movies. --- .../project.pbxproj | 4 ++++ .../SimpleVideoFileFilterViewController.m | 10 +++++++++- .../SimpleVideoFileFilter/WID-small.jpg | Bin 0 -> 1155252 bytes 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100755 examples/SimpleVideoFileFilter/SimpleVideoFileFilter/WID-small.jpg diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj index d8f1e29ca..2c36e78a6 100755 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 466AE00B14F2A196004FE0E5 /* sample_iPod.m4v in Resources */ = {isa = PBXBuildFile; fileRef = 466AE00A14F2A196004FE0E5 /* sample_iPod.m4v */; }; + BC11C28315BCBE2300E5BEC7 /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BC11C28215BCBE2300E5BEC7 /* WID-small.jpg */; }; BCB5DDCF14E86899000AF3C2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDCE14E86899000AF3C2 /* UIKit.framework */; }; BCB5DDD114E86899000AF3C2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDD014E86899000AF3C2 /* Foundation.framework */; }; BCB5DDD314E86899000AF3C2 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDD214E86899000AF3C2 /* CoreGraphics.framework */; }; @@ -50,6 +51,7 @@ /* Begin PBXFileReference section */ 466AE00A14F2A196004FE0E5 /* sample_iPod.m4v */ = {isa = PBXFileReference; lastKnownFileType = file; path = sample_iPod.m4v; sourceTree = ""; }; + BC11C28215BCBE2300E5BEC7 /* WID-small.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "WID-small.jpg"; sourceTree = ""; }; BCB5DDCA14E86899000AF3C2 /* SimpleVideoFileFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleVideoFileFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCB5DDCE14E86899000AF3C2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCB5DDD014E86899000AF3C2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -140,6 +142,7 @@ BCB5DDD514E86899000AF3C2 /* Supporting Files */ = { isa = PBXGroup; children = ( + BC11C28215BCBE2300E5BEC7 /* WID-small.jpg */, 466AE00A14F2A196004FE0E5 /* sample_iPod.m4v */, BCB5DDD614E86899000AF3C2 /* SimpleVideoFileFilter-Info.plist */, BCB5DDD714E86899000AF3C2 /* InfoPlist.strings */, @@ -236,6 +239,7 @@ BCB5DDD914E86899000AF3C2 /* InfoPlist.strings in Resources */, BCB5DDE914E868C0000AF3C2 /* SimpleVideoFileFilterViewController.xib in Resources */, 466AE00B14F2A196004FE0E5 /* sample_iPod.m4v in Resources */, + BC11C28315BCBE2300E5BEC7 /* WID-small.jpg in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index 44e02df8f..019b942e9 100755 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -26,9 +26,17 @@ - (void)viewDidLoad movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; movieFile.runBenchmark = YES; // filter = [[GPUImagePixellateFilter alloc] init]; - filter = [[GPUImageUnsharpMaskFilter alloc] init]; +// filter = [[GPUImageUnsharpMaskFilter alloc] init]; + + filter = [[GPUImageDissolveBlendFilter alloc] init]; + [(GPUImageDissolveBlendFilter *)filter setMix:0.5]; + + UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; + GPUImagePicture *overlayPicture = [[GPUImagePicture alloc] initWithImage:inputImage]; [movieFile addTarget:filter]; + [overlayPicture addTarget:filter]; + [overlayPicture processImage]; // Only rotate the video for display, leave orientation the same for recording GPUImageView *filterView = (GPUImageView *)self.view; diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/WID-small.jpg b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/WID-small.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e030cb189bf02f0f83d47da885a279e92b73b7cb GIT binary patch literal 1155252 zcmbTd2Urx%5-vQu3oJQ{AWKF-au8T@QZg(#C@2y{a?Uvi$p``xlpq3vo2#~5Oswe^=5C~Al`~f%1 zghna~3Qx6k5Q-}54>1)0K&Y&4skN zG1%VA-T4oH7lSFy?fzge)*tMOQ4oWv|6uFCG523Ge`DD{*wVq#5+n0RXJ<goURSl%7XWgL;s=wPl10V|M%d(?#KJ*e*gH6@qyLzXCC(MjDMVJ;biaR;mYXd z{LI3Nk>`I6;{WG{|E1P{>A|gI_1wzU$`Nxb15A|JI9g+d+tJd--Nwn0(Z=zAH^Tpq z&HhV=Kk)Ck#sG@KYk=}8FF=Z<1Rz_(02T!S05QqM)PVjOH+4J%;Lnq1$bkMk?lBls z|JV6{I)M{0mtZ#=YsNop1sy#`3lCS%KN#~&{5fF*_y7q&3D5xa01LnY@Bo5vIaSVJV5@S zFwjd-3MdQo4paiF1~r2^Km(v}pr4>6&^l-zbPk4q3Bix`3*V4!oi}zV#MOXlE6~N(#NvEa={A3io?pn`heAd)r~cdwS={c zb&XAg4a4Tb7ROe>Ho~^X_QHf(L_|bv zM6yJWh}?-1h)RgMh~|k-i7AMAiB*U#iGzsW5H}Ey5pR>=k=!MbBY8sNOOj4fOM)c% zO^Qd#Myf#ij5Lt+4QVs!6zLHe1(^UDg3N&|j;xeyfb17Jl$?$HA-N@aIC%ki7deUo zLcv0zKw&`uS_xVU+F05e+G!XV#tGAb`N0Zc!>}VddO9UKXSz(fF1p|J zRP?g+w)C&)+vwLBC>W#}Y#3fKd|}vNyu~QTXwR6z*v+`h1Y=TW@?d($G{SVj%+9RO z9LikDJja610%v*7@`|OCWtWwKRfE-^wTyN8F5X@E-4}OX-|f45!p6>K$QH%c$o7k! znq7t6m%WUAmV<~xhQoy;pJU=4&OP`&yL&nJMmfQp!kjNS-*6(iz+56+He5Me-?*{4 z#kd{0^SP&Z2zlgqJbB7^mUyXn)pNTa7wrqJPzJ3hAk#979`dxb|x+&?k-*p}LMO6b-yVVHQ zbk(xdmeo1cUDaDOz#6I=sT#AIcQqX~8xa6P1(AxF(_+_h(fXu~qphX=Mte<1K*wLF zPnSaXscxz6v7WqMqTY-?hrWk?rvZt9i9w0MiQxmo6vIU$KBEAmA>%v7HpWelppOh5 zy?=D{_~GNU$Ezm7CXptSrtGHPrUOszJh6ZB`6 z&o77~*6S~1UZlVHZKGh5WwU3iY@26$ zVu!FRw!5)6w6Ao)bue>ib|iPSbL@7ack*`n=FH_B>AdJ7?vm!R>#FAZ-VNkt>el2= ziAko0JvclfJeEAAJ>PhqdKq}tdXsrOdJp?>`o#F4eHDF+{IL8i{5t)a{6qYg0^|bT z1%d+213QCQg2IDVgO!3mgy4tRg?tU=4^0U@3^NRC38xDW4o5{OMU+JnN4iE%MM*^E zMPo(VM32M>#bm}@$6Ce?zT|(I{_--;B5p8VAU-4hCgFL)NTNt$ZW2zCW71@@O!9{m zvJ~GGRH{a5!z;#Dv9Au(o~8|?-%rnbjsM!?^V&5){Cs~Z{*)pX2Y^$ zvQKg>bH;LIb1U-b@?PehzqNV$I1h>SEKMUhRTVxukJB)_$d$&7W3KN#)y?N+yTu&@!|c$ z&Lgd(`D2IUi<8(>n$r(w@Uy;i!*le7*Cq5aA zf)Sz1Xv8SM&npT5RH0e_))llLn)44nk7oXl-qGy;!kGLj2>_s&dt&hm3i2mG{%r#o zoP_lcrb-6=E%Qgg6c8qx`b$SJXA1b={euNlp#SO<x1Fr{0C!rf9Q|j zKVyzRV}bqO{u2_vFDx!B^gsFZ-#m=g7nmf~6#z(^G0om#+G=19N{kmke|ZJ0iMhm} zKM{htJ2)G2{u5DP!#{kifB1En7XOwR2L6t;zovcw*2&tdjfKhLK>?V00E-NpoJl|qheG=ql-Y$+FeLdME{lA1$1R<2yR1UyuAzANRJW;V z?%ZW#=eWmtUsyyGE+($<;Gv?DvWlv%p1y%0W_n>^Y4zOtg^jJ7yN9Qjw~udFctm7W zbWChY>Z`Q$*BO~v`2~eV?~6Z_l-AVN)i*RYHMewjb@%l4^$!e=jZb`^oci%|dTAN8 zvbu);wZ5^pe{gtod~$kr{>Ls%l>TkjKbHM3c9CK10%OJi3;M?{5ZDWIK*+GLnFMgi z<+P#CTqu|YLvShOliyW$;IRnl?A|hW{f1A)dVlHe-XGKcvh4rPu+aY}%lDIjx$h{gOM|tg^EOv*CS>Oc9V!nrYt!gTP-JJ9VbW{3M%Y#1 zww`^km1`?S+t+BI-q0q%cehC~blP*Z+ma-$3jX9R{hZ%a^w^JMsTAM5=iV~M{i)r@ z>1fS~5I5>3^C)LC3H$aT>q?WHP|}$28i&NcoyKY zbfqH92OZga<$xZ<`h-oZMivKy^ui^RpS;=KS)O~}@)GC0x}hoxcfnj>uP7R z$+oA%l&b1m`tS4fnd9;n9fNxh-g6hgJt1B+5SC*0T$OU7+sE}64oji)+iskL`jm=t zbE5#lWpmcOGH2TW{ypuzidNt*>4IP!im66v$vA7mRm1!Scy6};fkArflad8;wNLYV z9Or_f*y{1mJmbfKVhwZ&x1mdvt9ZtC<^`a?U1M8VpxUl@3$?cM2I zNlY&8d{YsUDe=kEP}sWxbd36bt_5Rt32=*4_wq~0hauN>gE}uK)M{Bem@HoXY&|C?=C>f4&3BDL{|99zlOd6SN`n1tlF6qDV z;DDRn&o`Yt^oL*ScuN>(uo`~!DuC5i8Xt~;eu<-?<*FEd;S^tt!-|Svo4X^e1oUfy zbhe*)D-}aDRjN_7T}BK?S-NCx0GeeK1!GXZlOh9~QU2(#(hz=MZqy#)y4`_l!$s5m zT5IS$uaTN&m{!oOBRsKl#PRRFLXU{MG}7Vya@kV30fFv6i_PU|guRSw!rGC}ytyXBtp?|>W4}14s`6R%%Q-`CijG7kFYb@DYCzqVBV$SpD zgyssa-t!F)tQz;+OQqFL08CKaf!TMAgKTM6!dt0!tIk4eb3R@!CgCm;dPoIub9gYt>6z8Gi??ye21|@df{sOjO;d~PJ-F8hKl8yBic zG8O7JK578%eoEB?jaZR(g=WbXy9x0s(aO=ZZ)x&0nt6N7p6e_ecO-1A89OYFFAQiL zkU0yGGIUeA-ljuL7RuCLwW#i0Wp#~k^h}ue|LjMlZpP)d$9YsD%XNEB+K4`jM@1Ot z8h`s(QILERns|83>M5D1uH!Gd8(CZOV*iPE)}~gT5&xM%R^vsRO~)Z%hAfeD|mIH4XmpZ1?gNX9pdLap0T+C(4Tl zQ^I=;9X9~s?4u30hh;-PA~`{hZ1Hg)*J#pq_pDm1Lvdl*u}4OH`Sr=>AyhnXRH6lt zCg1=B94RIH5xpJSS@5glLXQ$4qUZk@J4Dk2BRryJml@VwIIc>Vwu-N_VikhMsgHmb zLvoJ}8jmA-zY7dn7^DuFD1U&twX;+RAdBD|!|mO*ie9cdlBK(XMoGRmK&o-GU|ShI z`WwUUcLMv;#yiXf%Clwaa@2i+VP{#sf#0=|teLy}k+N#rp9h0UsNwxcn#x?BBfap_ znPI(WCL+6f6hG+E^KY*5->gKPf|tRH>zWe z#u>W(iTf?)h1NGnEU=@RS052udNxm=J&3Z6Xz6%8>edcfsDM}I2GuRcGu@Ws)k@9rONq(xYVOqP68)SP$4j=szb>tcmYdvCm)<-8pA5i-I>SL=+Ytv}G zmMk@wU@`~ezRw1~qLkg5$3$}N@#xSedh<{fbn(~3Oy!j;Tf|meXw^siW-QKrehL4A zQNqLX?|y2jM-N)^RMjqwygeNfve;_Q^r6HwNx6z7qbpgifs?t^i98~yWszbt2PM>W z6V|zY*ZK#>Uu<~w{rj9>c9qC*SS{WfQAU*$m3>rp{b_GM$oKV-K0~Uc(e(-K@VT6f z9UtLY>{FGg0Of`&91{kah~Q-9Kx( zW_S}aBVAX0J(Y_SxhCuW4Li&e`_CRk=Sdjq&U5!C#*FZv?^;n#C3g*V#{DE^uuq0Nao`C^OGz#{ z8{Z0<@uWfCQX_G>5ZbZ2dN0kOLho?&<{&xy4W6?Mp*56}Z|m;v zzG?NB=!$&4*FUdv_=bfN+Y=GCr)+%DUR$9jwL%YQiP}vUdYXuZE+aIhndaF#(6!+p zD&cl&$y{+_+08J-4}zZ?0ULRBUR~|3xtvc^nKHLvWXSgdsku@0e3$o?x;__w-P3RB z6}%l#TVk-?)CY5~3|-kf&UeJwOiINg@Cnh2Mpn#c&|C^=FpyWGW>|0ATaEbl;=B6H zD#0v0>DI5Fta7?;1f1RO+lkV_>3jLRA7ALAaaLv?zBTh>JgScm80n|zX$jiF>AGkH ztaH6l#lDv}z^BvKKF)Lw6*-39gy6Cgn5z<<(CA)>&cGh=87l#0?~BKNx2&}Ii}8ix z_5}liZ}AZmr&=#;?Y(Xv|HLgV_^q~shWMi)?1;WE(N}x#WqZwo=DqaD8lvJM8~k10 zlsTXs*<6Y2zh>6_^<>K8gB8hVS$QK5NMnWH_zkf1OoQ{*tHIZrta4HA3K33eO`GiwuCE!HpByOs^Ze!gO$e!-s2NswKQzGy;2 zV=pnLL`1oXW~NfU+1HP=m8|{5Vhtm7L9&;tKoct*6Hr8@p=VbUw%~ndXrSM6qIpk0 za`eGz*pje!$DUWzXmw`{ue|?{6+%>&{}Zv@)})fC9&svaSYACL&{sKi1C&3_?drQt zL?OJ8WQsSiFGn;Q=S%8`f_;-oq&H5?p#&}Pf}*MJ&0skrw3KY6Lez+Vo>TfiU0Q?E z-`l-VE#Sspj5t#ewQ^a%shRTx zJs7Og%HN}wAWMNtDLGE8O}Q5$@=QnN=IR_j%lleSjW^m}*6iK@TMm3N+YxzDA05Vy zD99fVCWsV>2qq{a)vYHR_`cX|e&*5^m@_hBja?I9NDZL|TvtRy8OG;R3z!S!)vrVw zCl5a*A&%!`?vRZ>WttT@lG-rH?NxRbmJ&$ASqrM;op&2?>)+}L^zgpDd|ZZ7JBc`a zX<&hwn` zcqH>ub;lY57Vm691lAKY#HeP|@B)fklH9IeWzwBnA8kD)SNM<8?*2V1Y;E&1<+;r7$}APcKG*eoQtyjc z-5RVu1#}HduvyXKNs^LOt$*dT6+C-9ZFd9kr|EV7o^cz`M$sK0i|9w~Kw|a*)eKSF zT6N)8Mk$|h`_aiW32yr6Z@d|1N{q=qgNwhB4xbL z^xf48u>xU9hYs{DL!#>GH3N+;=+zBiYg;@V$Hh=b$tyb`_8Z;@8(-S1D5i_H{C?yi z$Tz&UAxjgf3C!i@kkr$E_hi|icr5h$!INN_#K6la;H3Iu$;Iu%KOX^46}`Zvg9r@2Vet-(9Kt<>}T( zbl69~XL%2H#&Jv3R^v(S)l#7+SVTjKww0cC8xGyu`_vQn)G0=oPe5g`u$d(HbUj43 zvG3{akF=@XhD)z-GzMv{&G`#L!ZwxaO+jY1PZic{t++KGxKx=rYmOtID50mulIwnk zf@7U+`h3qi*!*viC|W1T;tS*@vLMEo8(&h@6fe@4*H*mw+?Ks z@-LqZv}m|)_Q#cQFl)^OxGdzAi$9&V=uP^vBOF28#aTu!Q@iE@+aW=6rpB=Wdu zv1^Y-ybFZ)h*B!Dr6y^I<{7wRM;$B?^vGSNp5bK`;gq-qOAL@Ui4EHGea7 zu3wqHHU{i`3hVyLfKve7cHeWgA=*cJAw-XZP#;#$e1>`)xGkibDZ za@+`tS^^FNZb7kdv+QGSjF>1nie8 zhke{#geJcwL8F1MPG#%@)Fqt8+`sODEoO2R-NI7GXAg_FEM}#P49^g@0x2tnetIyk z-x9e$#FpQ1UhneveoJs`%syv$Qop)19+e0Wu8sLf4hSR)nqaE5Kt^uq1rOPobQU^D86E=?^bDhb61 z3e^;2zdWjBM@;Xa%_Jq9*bLpwR}*Fv1WDv2e3!E^6N5q?aD88tUKzjXvbhzzluMk; zj)q<|_g($bBb_gt2ie7Ns0-2pq0imiVG%6Kd3XZ^Po*hc7*EG{|B`REeno3%lOz%4gNIvc&IknI=NHSyH)2!=xt`UvqUHv`4KDH|SPA@N~a zXdF0?^F5es?Z5sm{mkd#){V%Wj>-qB$} zu2j#FZ{DDZu@clvx!ahC~HZeBDl(kbi)5&?4$l%C;(c2z!-ThA zAs&flwU$nEe)F?NXjOz4czZ>NV9pby%>6_FiQVh z>;$RWFe-9J_%SnCKGcuI32|NTlD+_IWtP-+PTpvHbQP~A5VxylMtH>StQlDE%NHk2 z%F|pQANxtyCMuggV_<7%Q!Ueryg+#L*S^=i#gjUwkl!8cUwe~3gkaN zeFnukkzOblm#6bQ%VTnU>nZ_DTs0=Wl-*tJ;!7)E?+<$Ew%hGVpQoy~_a*A5(GB2a z6CUgq!w*oSHn%jFS6*A_8}B|IWM7j+!z?PN8t$bC=(KX4yCnteN_?ko)hJXGDsQWQ zpH%7^x`+d~K2#&FE*kXgDYYpK#_bLZL``kp0Gq{j33J>gS~Ws=(MH`lxRL>Zt$F2O zE2C%$d5af)POi4K8^`1_10RgG4e(Vm5$Om`zpP{@?rqj#!%1%}Yx1x>P0+EV*7xvy z<)#;VoN+5$7A&3;S;T}XK7Ir2&Zr&Ox#xNhnHojgDIX6Fgfu9y3Fgjz)FVMNJ8+-e znSqNl2@%+uSfr!iG8$v_A(|}Ck}S6X-bW{(DX3Hz&deP3V%FP2l{=2};~K2N)eHM7 zh`w&mTuzT%@x3r(;(akj59zLCg()4KPqd`_v;N;40a6^qazI~kk*Jt!^%m0`$!wC5 zA`!te3)kE8U8`8m;t6i!3%dmu(o46%56%o&8c4JE#Y(D83I)mC?&%b+tcILjheol| z4W*moLE~G`_2S=uUEQPXN%Isi_r|O%__<8R@Dvhu7sCnqdvOFpu4PoY@t8%-VVQUY zv!LD`ZFvq3%`q=hq3kUN)OhTxX?0^z!b682SYca8DItxE`_=tH9=s6pwt~i|kGR>w z_kV_FcEN~x5EYokOU66q%JhsiUv!|b6*T<#TsJx$(b|)iu>8?2*LNIC>dCn+cC? zV06xC+ufM8a1&FX7yJIhLTM{*eeYdPrvxB1!@a90EluMLD@<;6t3JScy7XgeP501= zmfJ$EuSMLI9r>?_3@}+RE6i18MD7ymi~am(y@h)fr1?YDyz3)%IM_~ek%?=dInm(;$~E1 z+W(rBtyf-gba9K7aQ7ZdtMZn1g(%*SP~3L*DVC{)v3Fe>8u`idr+mFrx96E7dCXTN zZ{uqh09?v5-uAf}%nkmI(m!nnhxCJ|@BbQ!^I%C!c zqn4f|WtG`dInOE@Im!0fF0K%x8r$q{6WH4)!Vjp~)@M_`aL|m*da+ODe3k`!3JN)c z(a!MRz`CozZ*@63%CCpWq88}CCABxWx8ei zV(D@23G~%y~UDy4ZP9CDV_r(&^fR!{U0nGn{_ip`afx@)b$*I1iE4k4UDN+Ix9#UmxSEYf%4=)rh zJ-J-4?%95SLA3M!ak(zj0%YR(y;i{wglKHkHA$bAC{rnCl27mrV7N>w$P zM%`_Qdpm+C8Q3zNC~Hzm6Iyj6%%%RQQ-Shq;OcnpNYD@C@DHCBN*;}Khe)1JeEHd9 zF(-X;jZECZ%+3SNK^jdNJp%e1&|h@bt-m5vI6I<)#(5*p9NfA0@Nc$5%+(qvH|^ zN`xtsBOX{oLR-;1N6;pj$x`9WxS9+$>&NYTh)?d(nP>bsnsDTo20IJ&ngG=WTM4}D z?THo0kA%LEuYzzLc@bu1K`#ffbF$0CBJn|m_d_`s)(jgz5p&YnUgzJ%x9;c;F4x`L zq=#j7wD$k}A-2$DhJw&w)*tR940XMp4)gi8a~48dJhRq6x^8RbZ)&zzj0D18GQ z(dQ-lZVM;A%(K2qu4n}v`@M`;GMsuhv6{2m`LhEUWCPA}Rv@gol(}~4Et8H!lcV_$ z(iDWSu|xw&-fo8J{4gbQorU5UyXsZQnpjtr6~D}ObVW7UCNL@L&PkMOKI!c*xaGpg ztqGD$z&sI?jXZ^x-PGVtTzoTub0FLke(&=2Zj7dUZiWlwXB=X{+oVZ~)PwSRO z#%R}oO88k+@xfPD!`DL1zpY-;VU0iRax{ye7gK(f0)j@OilsA`%U&8LV~q(W3e>2i zLV(@3sN%q!4a>~6X45tJaY(SV6=W2$aHe0PZ<*?EYy6sh)l3%4GS2I$LWN6$eud+J z>y^Qz(YX8Lbd4T0ObAU_SDy7euB#EftH%nnSwij`db`?bmI)Wg#LeD-{CQmkqEE z8LJ>EpQDisBRPJ%*SpH=TmoDRab%4WuTEg7DaOgUlWt{)nW5^4$9A{yzwVbNyffUK zEPJ@eJGV_3Pt`w#kDu+Z)9ZV*d1_!%^1{!U)d~S!qxEPn-fa!!RihOC|bIBeSG>|Gos40PWP5E zGf%xNoW0@k`q|`8*RM&9=VH8y>#{Sn*^aY9KZ1yfIc%4jYlA$TmguMp z2-x<^(+pCNH7S%Lc{t8$s`gL?WE#aSXYLw+dvvsAVi=wJyYYa#0-udGZ8sx27_v5RuPd>_ZS5&2UV_=cn44`jm22B5uwYj^WIMq8DJ3z!S5pN!dUUyI)bT#X zNsaU){>V%})AcdDoxSnPt?DHw;)f-5PaRSTK7Ej+_jMVMqYu!qRNkRbAj4;M+y6jA zlG?|R<4Y37lV4r6uTWK12kP(k{T6z!P!TwqexOKYQ{GuiA_NOdL&Dr0 zmB!juS`?1g=~Y0UNsENfG<}d&l^=)Jn?~c2t2Y3}rl0zn)~{p;CzV;;2zZe`erkU` zS-Br~hQi$>f~ESJ!6i0*JtJNJEPExVU{wZPuEgnd7HAFPS98W2Q4H8@OuC#O>~d~1 z10}L1zKPfw--A=0R@*M{qaAOfhagAi?uX3TUp_19GwYkFkxQSj6jwGr(^jH!c6~=C z2hBV3Uhm&on0~J{`sz2BJX(ZQg+1)RV)GYb^C8gzFPby1k98$@0UgW5`+()3_Bi%b z-?oKhW{X8+qts-nDoU*Do;|AM+=6a%ZHMgCl|65u=lEr=QjNk(t6{UrxqB6 zXYCfW#Fdg2ly|IxOP(*S|6S81p=o7ryxj3I(x&tw-AEQDscTUP@9%=a&Ygcm_3q5_ z$&XC;9V(HQ^JAtf_CvHvFhE*L{c5 zc(b3UUb*2bv%MZsT9B0^T1twmXty}dg8?$k-@EbkReU^`6;$4Elq@&fkjI4cG#zcq znKP2td#-0F0Pju}{NOxB)D62@90~@6V=S<~8HZN?K5Mg@X{EXW>}FC;>DJ0^mSu=r zr}ZM8_+%Ij;tNeIusm4cm$k;{`uRxnvR2hMVILMEG0QZqc_YnZ)gKGKR&CznHG7zR z*UXTJ#y)ruj=W$z#5zG1JxxI2jy!V4JCH}=7ZMjVJDr}5YSxX?yd6^^`rYzj&8f6&^%wAeOate!cOLast`esr!4sRUo5U)A2vDV_3N}^<2Y2cM?RcH^=D@Pwk6%p9HZC z^zCuntv*q{HW`Z-^>xiwJKzF4yKMxJ9KOwc9L=|lZs;9)NWm- zmPREPro|4trWry}59~C=@L0}M^-J2}y%-Ls0^;081jXar*~(^z?LE|F-v*vVop-HL zG`SO98uh7ro|N0zF=>h@c+lNt&*a$#NAo(4;sjDlt90?N>%rTj?1U1Z$ zFD$Kd3xs>;zBZHoYSk@yG%FxVj>QRgRZe85?L6O0bo+{6h!f8Eou8tX${LH0yQ-yw z-M8ztvml+u@IxetDL#XXoMsefT2Y3f*wLoyr%(E@;V^4<|J%^mvfcp9R~?>(8Xwhj zxhHbc9?qs%LYn9bLEi$}FZXoRP;@UECcl`KBwtj4lScuGBSx>%dt{$7GQvxvaps~0 z#UL`s*z{%6gZ_P`s%-KFui`)wtRw0b^O6T%)efyLEQxynKx}B!KK~lvq8U9h@W#yiNNe*2FA5GEos~>oc){gLAnLOY0r!mvNhhe77 zc>=1UKlP0@MV91GZUDBLo($G1m-sIN8~VO0)^CyJf_BzX+m5R~u(;%Y>fZ>lV@e*Z z<;)L(taeGgvolZ+d{%#|#I>^;B}^{8q(;(%NiNVm9}C z&anX92#eXEtOt@%8U5?_Lb)tY*Ta^1)(dPuN9|RJ_T~(2PC{xM&Y_t5ysgGZ0J(U^?Wv3&#wK#d+P;6E7)q(CK&l=s# zPg7?l^`ZA1tzLl;g7FetC8R>)3>8H>0PtRW} zW{T#$v7-U~QU;Ft*>gFK+N4ajx!j7^pNcrI(#;YJWRrqWQk!Vw=dB4|Iat*p&9UJu z)V(TnO?`ChS;s}v<)u-L`n7ucV653&{QLp?zN0k*)dA*&=W5rtu~(|f0#Y>zI-?XF z=g1UY2H08F4WK>icb1LW#}AK8QAG4xn7wJW1B-hz#kOaq8V1{IW7D+eoyta4uY}0Y zP^`X$9`9|gIa=!yEYr4GZAfqNu6j0j4;-QQ3odwzD9xT1cmN+s9r~f>YI5G8ATq(whyLgVfc38xIe>e_@ z#NG>XRJuPuPoom+%EI!3-olKy@PZJPFfsX9uPD0M0r?(v`su!-4oba|guC!EPLo2c z>mnpUV%Ju8FH(M3BgBPy8=h497W%e-(IWe#GTXxmwlMz`dax4B$*6@3QiiOte1RPx z-t^tR0e-68(O{Oa7QD?Uc+}Tup?j5MSQTKN=k}}Vn*Tm_=d@A^@fa-w2X%+kr?FXo z>$Ej(8|yo8gurVgV}p1Jk~Sbp_~51Y$ca{@#}vI?eDp05F^yt|dlE`#JNoXXfjes7 z3!0j2&~mga=H>-FAtM1&8wKg#tFEgN&4(?Q?j5)-hTGpMVJ0g?U2E`OXQ>O~iL*9% zkAwY(79&p`5sl+?+V-8s#(Mwu7R*M1J-Uf@$Nu4Ll$ZZ;*`36giriJ1THbAD1Jhyk z41x`n^VC!At2bIwpQW|~_+0kZK)#hu=3pwQpz4f~!-kU8Rv41<=ybI9`UKJNVxExq zrxl|mEY8ejsxt73Yt1f^?CVt;?Z+t@J19{Mf7#V+ka+dG)3*Idf~LwlTl2Ca&((2f zB(sl^M`hgl!#Bxizmm>fd=b4%48L+wPwmah`MlD@%gdtUY(!Mn(T^G* zKPtL zyJsh&re9|uVttikO;5w0u&4F}O6fb*mDh=s4nGBjzcnKbAaR-hjOhBtvlDGFPjD}e zEN36Ks(gfbe=;}Qj=JX*I%(#YRHrl^`w}0HZxy85boTy`h{jhj|GLvLb1nRCNrqtk zb>p6?ov!A&`(jhVtvMFh3e`x!bzX!k12s$3((9L4E-GzY^%RelXt+D>Xnc{Du#P)s zP~C22;{8>SLOsY4Z>)!=rdhcl%+5mR#t6MAYw&&l67`iqbsSYUwuPOIf1$%sr991F z;Ia}bl-OJEaLuva=1ZX1VxUl)kyhX+6CT!qWsz(5)qX3q)09Su+M&rzPSS0C;9P&D zkv6f-XxX_%4RgfBO{(k6)Z=H3Vy~7;FZ*R z40uSQa*t9Y8+nuu1@?3i&VyfU=P5&I9~4&*d#}J?2MZxO#ocrKEcaS7X=aA5ew(y_ zE~U{$KHa1cniP)A?8Ib+XK$((kIs)4$Ct*3U*zkXORslXrXK>koOj7wXAi~Nn2glS z^Hq!qE(?6q_Gdm|S(mF}f=x(MFhmmNTDe0bJIzr2^M_ZZ=zanDWpJ5U{F?-!)R`|8 z_sT5&3oVlys;B!(kU^6 z2T-sC3BCRJ4PRaV2V*Oq7VbsnIF{zcYYcKf4oi5h8P~_+Oij8IaMnS(6UK)Tekt1_qq@l%(b|hy-q@_FvwJ5<$jSl455kH!?lA*m+CZ^59@-A zT2nvkK*#NAM)msoiHA4WV!1@JrgI7flW0$U_VIs%N_$|e%}=x6H#q2nY?hLW;OZU| ze?My$Nht7%aWCR<>-0NE^005*6Nzz0Xol0)O95KXO7+8;ahAiC3FPvY_?W0oajc@= zth%bJ;&L<1QQ!PwB}e*gUddlomO(kuXNIHIj$P*y@wSuubgOu99WONdcs(lj}5WO zBDdZyzNHg)8_SWZ`(&YSy04b>?FJxyh)SJLjZyh=gg8}mSb4%qQWwW`MnEyp4-18! zjz>k8Kc}~MQ-b-)IX`}jgfetX=ZH_Goe`l)X{O~DYpJB*8-9y~e%H5XGb$Ra3N0OP zsgcLJ1nivnSGskQppxSZK&UrB%+9aj84dl z+LT|f>LGVbQzq;$ZPwT83-U*YOqH`$+%4Heq5=d~h)y~>#b|b(Jfw^-DWw@MWAf*Ktm%f#j86pK?+UsfQzObUXrI3RBP49rSt{awxbLCw z$7iIOX)7IFVO^l?#!AE^y@~SGmyr+j6|((jt;L{iz83X9+*$QQCF#pPUfYDUZ~%R( z7nGW%T{im_i)2kq56T$0GmHks#@dq@-)X6PFnD3iBxr^C^%#!JLROM(QeD2_HwtG0 z4l`msS6`35$=1XRRV#0L5zeNS^j?1cTS~i!^t}-i)}f;X(n|vKTDa%vxTIDJ+*|_M49ncMK6K%N`DFogUrq zKv-e;aY%P*ha$~i9@|=k>aya}@ z(t=$K$V1+e@NPKEiPKpPcBoF`_wr;P)plY|L|nYURR_7Yy7Z1Lk{q;u-6N%s^$y5}a&)6~v59I!27Lj?28Yl|=v4bZkjrY^l%u!rPO%>{{_#MQkxRr~=1MMs-jB)ij3&En*x!=AJQz zrLxr#UZpYSDs8!PgoaQH>vm-IMYZ}|y`9!fI5#;DXv$Tr%lJyQ)uA02D4(J%g|{-L zP=NJ@NeW@U3r);>R4=rCkA;=+-SoB$PfqYzL)8TuKCt;HzD0QUZM8+GMRIb=f=-Zh zJ(}u?K+{;=udS^cVB*2>hhQ^6Ny~S|V_@@aRMN+XOlttngcTIz+&)6mCUIpKQ|Q4m zHr%uF+|z3AB!-&0k9|*4pT|pE<&)3VCW8L5t-74U`?tB@ zrb~G*Cb%GPDH-q0eWNmXr@+%QY&-PnMgQHJ;+Yo=qPqVB20{70#U&ILJx1nKNid2? z2(dG=5HO>sxIJkjx=|oLTp`Xu`AcxUn;hdDSD&xMJC|kh!?-6T9Ooo<9lnRHO&^bL zH-!?U(TPu*>@ryPpd4;Njz>T^$rT$)3PudOOQ}{Pjl>RvzBu~lgIqZAF-y|p`D|%JBF7D^T{t=sz}3=p6YmR{F-rf-riuC zhXGZ~VS@Dp9>D(qD&eE}iVKp)GDZr%OJkg14uEIz9dpe-KZvmwDT71XPb9; z6_HpfOvBfy2aeUmCy!uR3BW>6$-VyW;g6VoarLD>IJZe8FaqS`Eu8OcU~|)`r!<$)Ocxb_~MMM$1L)h%Q)L#SU&o?&Rv$;J)`P;zmf z%D7SS0^98vzT_-_aR~!{Fh)nOPilAkCpOM@LQ|F8s2Fa@>b|2LGf$dmUst94sP6~F zU2fljtz7~X1k14iayEg<^f~7~)j#|#9dRXJCtSQSNJVcABx^15aspT=@)8{ z+q;ek$9(ZmKO1~Tkb;`c&@m_|#Ag}y9Or|K``4Vw;(K`T#oKDgRzSaW9A`e`Bn*3+ z2aPRKLOkCwmnay0+~a}|e!NollI|Z>qW6jE(fo7qTmy3Jb78q7V9U3BamR1YogeK3 z;<(~)y0nZ4Bq>!aIUNb-u6=9E$BZqmapjr9Y*h^8D)035?b49=y2{zzjHq`$;G~@Y z0JHCd)|a=RaQdAW&~NR#@z-DRXYB2BrE6EQO=oeb+q}F0A7f<(;mE^)aqrE1x1`Jc zw+g%gy!h99mgDBnC;a_u*MDk#df!s`Y>-*9OcweqNTYAf$pM$S93Fa#@b3%X+&-*= zV9=E%^U8(D=Op(2X0n{z)!F*T1JH#WJLOxlm&6SW+)4JdiALXV<>^^^X8Wss z*Zx~7LU6;=uc_yXjpHz6JYXz|^9-C0I*)RHS|XduwMf%!J6E|ayS@QE zzLbjQX_S8Omd?^tmOK(q9qR^O0AAA9Rnufg8^Zx0Kt@YrCj|8RSDViZSV-!jx2MasM%pbj1)WpkK!Zx)oqMhpVYegzK_h|G9Q7IP^{Y(?Xd5KrL%66P zFHC3D&&$Sdw~hI(kz{y%C$VQ*5u$M9{u`TJmu{i9JJa+aX*R1?gd0T=-FA8!0G_)FnWgE~O9_+Oz~Y34v$ORa&g zF3S#m0K1Y1z$pem_zpiW4hEY#tbMw0XBxW@o<79qr>;C}oPTz~V z9EMx34a0l002@ol<&fv88QKZs)7reZ#vTRnAH(-Cc>6)tbU88dz4f_NL6d@9WOmL8 z>4IzZ+TwXt_ed^&Y!x^p9&wD1&a*Y`Cfi@JlH0`Ak!n_~8aIk~gns!U7hO#o!#3v5P0{&&X^;%$ka4shu1T&SUOP@6X<9)cD%2HH_I9AG_Q(p8OCx=cRlz@h{~l9>_HE3{zpFgQN-Yr*E#f$cc_bqWK|BCGPBEU<#GQ|?YUvx^CbThWNg-n-kF<@AfHT)WU(&f)&I1&O zaRY7u!5ovE{(S!cjdvb1(`3EVB1>T5QbORLy1lWVe_G@3V3OY8tDqrIJn+~U`ihAa z6t)vjyGUf%%jOQQ2OEccA6m0)=K5$OwTPMWRY)LY`jS14J*zTURYY#+so{mLD?}B!CppL+vN`TPwB}`!Kpe#3zEzWN z-1G-M38>W?R}U$K6<@jsZ&v>RJ!!7R)H?$E_yg{YXCs5$de$~Oi?-KNX^6twNdxd? z2uUZN-oRIF;a?QNs6vt6d1i2ShY^wH^~(=Zb6$TF?vWIk6qduW7%WGitJ)Tz_BV?q zyn()QNXIzOPJOazG$*ms_`}1$Xa;L0-MDaj5`DW7(yw?^!!4pYmhn&nu zLJY)k0-WII87vwu z_w?&dxz#RM0NhN+InLn4bBucR$KzKNM5EN~d}-s=hi$%?aVU>qehVna8*%ylD~XGh zMtHt(*7&QrYa?nF(u_*PEbgNBk1oN1pG-`lhFJByn#GM66c? zuH4{{#AEZXvLjUvR@f^$b?vz4oRiwVQ2zjeX==9q7V!SRE~p-3I)>j6Dpi0S0(~$* z^{=Gk_>-l|#5iw|kGi-3p1CA_KgqAN!&y^`KajY|&bDn@QrAOIeT z+VMVH*-Npe>e5I|YD;a$BLn=Lnm`GHV4+6E3$UDRKZl_2R9nXya-se9#b7>QzbJ~LxW3HY85JovJeOyovoA8u8Ra9gyuJdL^!Rk*|9;|s7=Zx3N zJ|nbc)TB3(!igk}2bhHUV`$`sZ1JDs=+*V_ii(XM=)7Sa6g#u17*oMvo(>nD{^Gt< z@s^TG=-DU}wg~tV#y0c! zuzxHQTAQh8a`zq=ZB>Z2c@e~g;w+$U3VvX5)BW#ZR&);$&8I8H;wNdX8A`MDXh`U! zj>K`E!nzNzMEXRVN{8MgNkbAJ)P8&c>}nV^(=6dG6*sCj;0AW|;GX`xbnjBt%@nM4 zo*3{BqvJTIz4(5!YN%lhVYM5X!Qkb4o}Bcq``~xLElc87s@heI$TcbOws!LXrb!3z zFgPPPyk1n8BlO`W*=N~KLe-zlYCB=j;m{{M6SCPzq8~epFPGf2pGjhdHXbYk~yA7 zwY!ZGzk^SaLJVMMAg)dhM{L*c+#VUwrnG_9#@x!yxg5jgmC5_WbR=W1dVP_dJXuKb#$pC}<8%@Fjq|s-qpANrjo?CmAOL zr%#(0=Bvx_?)KJFvKU0JrvMkroOLU=AP)E)vtPPD4g52sSpL#q5HzdZ8qVm;3=`}z zuE0v|D;O(~I`qeS^l|Xd!mX#jli?jQ<~Y7!i4v4nYzzh?Bi#0?_7-*&aV@K#&g9+$ znkj+1k|P{!5nWxd!#;!$rs67wx8X<7wY?@?RqVW*o183=znHDC{l#P4C^;jxdK&(V zr1(wYGR}j-{v35g0GG8{Jf{bp+yZgR@y8jjkw4(E{{XYMhjmYaJ|5J(J)r5Dd26{e z$<4F^As*;nSeaQs!z_{T{*8`nYE&0ChTlzOL?_Q+evLdRn7Cp||8<<3aYTz9Xg{{Ut!Di08R zAhl+*kN0k^xW~A&fx&(`IsI#~{fNF0_+MTB0D_r#UrzX|p=r9NopWiZ`8Jnv7PpFj zDP#;IZVL=QuTpDSQr#GPcNTmn7l$Og-miD0h~gXvyF%N)KK*byaaS$;38_qB`v8Ji z=6#AHyp6Vcf=S37`-=X8FF#~2gtA>T$ME;U(Lw>{8z|69qpO^+9OP%NFN3PF{u+2x zB$<7-_A0TGaDH>f;Bp7GaDN;>U>}5f7sJcT-vxX;(6rl~CPurOC~Wo#V*}?UcXU8< zeKAfrd-W5=uBiN5KMi%b@~dW-44^S(nM-u)I)0So_-CxhCzeYYH%5Rc-l#GLM%?w} z@#|lx7T>cM!u?v*OLySiGDdV#alH$l?*fM*x^OB_41URf1%Kfr(sZnH{#y(}j5;%N@=eQu$r{T`9 zb{nlK;x@rNumfny@Ox*zJL11+?!VxeKeNtw_h^NlsIPVfI;UUl}bD#szov1V|yB$Z2}>U*fqpBIUs+f(PNAc%_rVdXn49Ep+Rqk}|+6LV07) z`8E5k{{Rj{{hI!8-UGQJOyqxU-gNXIz2JLxsL%Wm>-KDE3pawbB2RDlNN=(2$D7)Z zsy^cW(24j`-V@ZUZInxAaT=jmj$#C3s3+89;CDRsrc2>1Kt^+=-=O)HL-umR2kw!# z^V&0v*Y2PEILr2L0C`>z*5k)?@iw48_O(Pm;Do=kX#1WO@gguFhF=zHTZRsJK7Sn3 z`kU@Q?FjZi3om>*e5~Nx+^#n7Pc66@~EPc`E|w>SI}YvK3o*YGX;WAHB9#A|Dy zTnTl^uC;cZJ=)HH2!ZAjhaCs6Zm}mk|TPk&aGJ*QID5_$SwZ8ePk) z_`!rcDK7{hgTThz5_8`*?Y6FX%BoJyp8>yz{{VDkIaUdYA7~_yI}ZJE%}^Rcv~hV0 z`_dU$l^X(s$!7Hjra7rAtp0v4_Q&otH>U;p!URRao+Xv2MD#@RdfI#->Pu7_x zlL(m=E#r8~V~{u)^&`0KYxEXh_$M!eQ*PfE_>MI#wL?J*2jidxeYwpsf8d**4vYr> z0EDkz$Uh?ejswqJ91L{mDRZubJWP9^pJ}DQ>xH$;01EG37%P0aIO=)n??Y)e%NLn- z1-dJM*v1t(BlE~OAEkbRf5WzXC3GL{J~HtKlKh2hC`sq8P6j_yO^^Nw#o>!%9K*)C z)TMa=^!OaH1CBZms2x4()Z)qd%Iefe+y00iss;-a+PG1Wdypx>uLfmOfR1HW(9pr8H;!=T=3lzJJ;4#jzjJMjvH%L_oP8?G_(CaAO0p`r zV~w%yCp->2*WOcq!7{Xfs*rf@;Z9YglyIq;Qh*jhn z{o>#by}SDRn)`oK{{Vt!OJi!%N8<}g9yr)WlIefE7#x7xzHQm-+tR$VL;aYJx2el) z*BW)K*=E6w*-)V>S3lnVSgj*x&^^2EeD5cL?c=ve78qa4UT}kUIPKpfsHmXut+bQw zSYi=p0|ak59f$Ww8T>2i&j)_QQ~24gql;V9?5-?i3$dYRc00aS3JB_W&U#lszwk}F z<33ZxS}VrQy#$sIvnM3{!MW}+>&+({J&hxXO?*eqUjg(ebk7xCyb%E*i9+ogxBU6< z>5PnYuV1p$(k)E6DK z_(S^lEs3iKEU0>O~-q>w6Gmj)XlFZJF*8@4h#w+Xd{{RNz zd`Q#Xp3CAd!zq-u<&1cC;ucft51K*x5nOd4DM2KTnBpM`JG1kK+R^;AR58Sn{FwwN zC+}c=PH|KHo!$@KO%ntmSfhNP5<%m)ueE-R&;I}h@cdNshuOSy@Vtc?%jmZo4?U1c z^5^SN&Hn%f`+Qt7u!F?k4CIYZ1+A_DY<=8d{JxmyisX2C_BHzDC)E7&Ycxqpsgc3Y z&F_v#^~FgQn+QOFl~~A+ILSO`BzN`pufL!E4gUc6$Y(M(v+%@`Ab9X@LnpTEax>c% z4F3S|K+la(&Lms!h1aa-bb?8)6pRizDu0zv)oOMRuF>v%5-pXG0$0c+5_bWE?t6Pv zn%^8@5gTf+&G*PBw`Sw5eb)Z~@IbGPvDzJzd^4D?O2pcQz{x(Z<^KRqF;Tbt5J%&X z$W!pVqVTKzp>P1>sr}#KkH(a+(`#auHkG$N6goczqd&!h06!_}PCY6A0NKv)GYHg% z8$%FVU_4|2-2RpK1<(8tbK~T3pR-x~G?9jRZFb-^ne0!K>VFESFZ>Xn_JLdv>`#ZR zLTw&jh~*ns7{MkClUe;%r(ykemviETurtVlAiiLIp~=sd*uglYwbR`gNSmVol8i>; z4?^CU^zY9V_MON45aafTQo*IA3QpD14Ngp-AYCQMy!VtL|SpCna z@891vsRN)@lY29bxCfT?!TJyBUj1+X00jQ=e~COf;N4Th8Vq+f{yNlJ!$6I-SmGBF zE<+RD6clg0liwWIVK@8{d-jGy$^jM&r+}IH_1#me{YY(%G}+ z7J%VWMmtLsRM~^aO}}20!D6H$MB6qMl>Y#GJvOQI`q$Ns{{RGj{i1B5l_dCV9EU=o zHQRSZ0P(f52{`MKR44xcf=m9;R+A#!{4>@h^H`10YBsDDbIByQC)^*xsbQ)vg#B)p zbLJT=ipapJ0AZY*;n#Km$82<`MQmh=QZzCv{o;C%4@&w?zu=Ys0JH=bF-ATVc#25_ z2U$MdYr>E~Qg`Dx{JYgzKj4`kA0~;}eh_%M76Mg=+AY3u&|?y0jt>K_X!^ZQ!&tgs z%zW<+sYNJpEP+dHSaZ znC6P<3`vX(;YMqK$s!#167}jqb z1>6+I1Mb5X!0YrG>)wf=Zz9nOov{Oezrv)RKNIQeUeo^o3=Q$B7G|5_2gKCcSCz1Y zsW>?*rSs{Ur*r!ed}Ovy^q+-45+h~#infjyZhM`sdB%7Z4ut;zlwVq<{Kt<=2k#jc zFd2qbNc;Z#yJCd3Zy*@b7eqPAwhMEf{R!<}u-~#T#Z5m7zYKmP766PL1@L?FcXR40 zl>Y#;55$NHHQ&R3iC?~5?YG0ynyaoGA)g5Ef9 z0-)aUmEH=Gk74LPops6Zhs4(L%CdM%#=~ZC&*96o=R6#2{VKHH0o9?6q}6mk6h!!5KV)X!cXK#d~OXF(Ou)EEnJMgN*eZbCLP`(ob&^67I}4U^}Y(sz~J4npsH^ zNhP+u0yiKQvzICuoPc(7)caI3{g-^+T@`-O^A!vd zWz5@&aoYoeI63}Vr=^IuvXkazWj`wu#HcRa~ z7>doQY0C2at_0h;9D#x|J9=k|pJgt=?P1)4D^+;QN~^v?S9aWcE5Hs88YXLfAy->y~VB4IyKFKW(9}(NXrcI z*W0B^(8Y4n`Epvcj8tGwxncMoo};ZClI%4#+@iMS0+flH00m}WyY%(XJo8gaZ1K#? zyJ0_h2>Yi!GuWP$aqQAXQEMm&Sd}JV2<&+$>%ixl4S^{eqJ~#F8zdMTM?sVG4nDnV zd1ctHb==O90)NzVwLVoTfQ{6X^!}B=_@BhGYWmOiZi5rg1Wo>va<8Bf3j zq-wU!K8bfUaVOmjetu)g0OO@&S?OtQ6s(9M`%2}B!Se|i2cG!jKK0W=Eg4Q}>~elI zihl|CF(dHwUTwYesbLC`T2gQUBa)|#j)NT5{{X|E0=I+oU6;zEQN3|B*yyW)(>*?3 z-sd&Y!J}hKj$8N=MUP`C$=nDyTmX8XPStvSD(2%0G*b(S31(JCC5AWz^w0QHtlUSR?LSzGV2{{T*-p7k5VQanSv?UM);50}&d-|?*}G`aN{%cOI0@}DgZ zHu@5I_o$|^o6K0_hCw2Z2GR&1edB?~a(=bP%X6og&x+k*cTA`~qQwiG{k2Pmx+q;>T<^sVT0`K4AQG5~VKMsV2v@A>trw|a58)ij9WL3JA4 zIerKuD0Y%NDC?i4Qi~U!gv z&=yY97K#*QVycV}&7M~t;C1KJ`%}fAmr%|`5o`gc5KU2Ll~N zYTDZ*Zmf zv5wz#5A)WV1C7R9n0hjviroOM32ip*b%>c{RzZ>XhCw6T@t)l(IZd!vZQ<9hKb|p4 zEn*l7uEoGrVmMs)2dVn{RBBR@pLJ}@2baEAQZ|#jXwO~1kL%Yw(`1CKtW@kE1|Y5q zjP)n{`qqiD!3v|2*yLb01oNM4)4s_R(GRmnCf~eWfDC={*B|E;nA5qIEw)OyjF}F1 z4yvI403n`FerWR8Z-lh3Chf`QhEwxkThyv?=*|aLP;G4R3ESNsY>O<^M8%N`TgRJ510NMv! z4c!ks;Bt8!*BJ)5`rW!LYq3#I3Bblk9ed}ccYhzPq<;?SFoGH6yK)$iNy_ujrUySt z^SvVS9UoN|+R6JYsnJ2!=^hI3<<6S2 zYr5!$a-pP+K#51H0(s9pdK^~`)0)1`D;X6Rh7EB><~Tc94i^VIa>uq|LqPb?Ne`>m>4m+jj*=ugw8DtM%5t_WB8PbVkkTn^ts zRiUx-ErE<~UI!kpc`7#Fe9Opll zedwIvY-c2)%CavD$MWYK^HuF`MaVnJCB9xUw2x3vT9C4;qQtxoxXu?GWRG8JhpvY3 zmB_FaQd!tV)rmak9{v4?YE+peY~haHN`gpUc;~OZ6O=4u2!t*`VB8Won=g)_jCEcQy`(g*!!{;F2 z#qE*T9dlV84A%~cd>RII60XN!c^T`0(;~Z#YfOV)w0|(R`4e<(6C-dRdp!X4{VO)C zQkBm-g-nqYhYBC=qOZzEJ$nLsQ`y9BO6)~JfHF%b`RVxaPD@*d)K=Z&GRiZs$B@9D z4;}k+?_Ca`;6%4neMtP}gX~fU0Q&VOpQkho=3%y%P=!_~%#q0ag&jEPYfnw^WY-HA zkwgWP=2A;%J#+lUb#X+RYokPwK$sag$b5AJ(DwDJH~uBGiU$$y4u}roz->6kLFws0 zSfdYt)6N2EW!wlGOLDwp3UkRd?Ee6jKAVR0R- z2OKGw@Yp?e=dLT|zuMFG>D4|zUr(ZV3RyHy2SDK?g6( zZC>IPSef>>%7_yKXQ2au(!F~4$kN#S{{SZ7s@V1IaZRN4vfZCc_{aVV%j3OmnS2#* zqG*>&LG=DR8#Z zPiKPatMad0XC3$;f1Z_^G?`S#=NR5ZV8t?UGuVHPay-IMsr4}6j2%7cU)NLKbpHVO zDWAp*5FS4ht-(*7yxUa^Cph47w~jmK+Pl98{{X>T{BfsTZSl>XgRI6_9q$1~KTIFc z^u>IOb*Ak3r{v`Pnd5Kx4u2|zwDPMVn3n+j%)I1v#y?&eIN03CEjbF+F~B%7f@}UFXM-fjSrM4d7PNd{Gs%GUjbJ zQHU!Wd6XTpBllb$SD_X8HyeGPNQ$u=l$H)iY;@{6kN&-VJNpxU+jn0Ib*MZ$@eW75 z@SV(&q^{~(O*ovQygjz57}`B@YpRwm71tz|=gejtDTvAc0NSvUZylkIly3=McqoFcKI-C&bPbEsQIRt=mJ5~KM^4G(1R-F4UT_GngTJ-|n3m<5eZyCu;JNj|PMQEL8 zP1V`fRkvZt1R>r4=t&)V=Dhkc(g!NXEHJzSoc8>>Q|%m#6Um8y!E86E3y-0%Do5I* zwz=?CwajtJYRH79*N~7m5&iMddt-{Vqu92AV#=U2Ws8)~3XnRIdFRuo6~m{9uI*s| z09&~W6ayJ0heMA{ahmLWJ0t5FNhL!~E=E*^%I)Cf^gqg_E0ZnG25F|6N#u7Sq>$r} zl>FU?LxJ4YxTG$v!N_iL{A0Ms>z?(WCAy@HkdVy00KG{56O8kLk@(g77+qlo1q>a4 zCp?jXk)KS}OR>?0_`*An-LggqTm={>?&mxYtxnQ}ED&XiWiW8AI-YxRpRG@AVJvpu zV{DOtAQwM;XQoGgN{df{-DLk zLo=T>imQNJvB1KPymN|e#k7%(TxC$WD&ddKo;v+MojS%TXVe5LT*yxYvh&Z^*FRcM zP?6|yPaHlMfZP@vBOECNw*(Ep)7Po5J$a*f6LH+p{lMLFcpUoUKdpBjB6QNcJt$NA z#fxs^AsKUwH?QGb6|)6$19^?RZ$d%OInS@930RU-ppC?Vxa5JyKTepW4oZ(K z802OrmE71;GtMwM73<0330+m#6)dG=RUDl96W^Yvpsxb>58`XB3&2Ya#7P-x z0VP0Y03Lw$>)-2Lq4m(MJ5N{*Rg7%oOb9=I9r`Pa(+KCzY^ zW^-u}h8Y|9TP0X@1$&M`2R;3(>s>{qNaX~xe55gC3zo;qRP+paIsEJ8?}+*=P2&sn zwuKfjcNqkP6vr&M&j57!c=WGU2b%XdIaOm=;sMwO+7SK3Z}z)`+-I#d<9Sw3vxQ{| zQm(#Ghz$nH`jF!Q^rI44RHu$H;d?lCtv{>cHc*Sk$aG-qul| zUpvXYt)!2j0B0TZ_!24|G6sM$%phop^9w1-#&Pqg=sJ6v)U>p@xzjHpVF_@t%ILs+ zz&}?!U=9zd#b(EBR4>?^vXEVyA%;oEKg%CV2IkqNq*%x1xB&SwC)_}HXFuK?0zG=3 z^|J-N=7)C#+B3bLtg(qLE`+DdkDQJa{KyE;JqaeN=>aY-6-?(>?U9v=8TZQ{=XM{!^u&Qd(4E`q$jQvHt-46l22Qw4&Q+zY!w;0EBPH7P*Pw zxo;*r#zH{y+~6rEJQ2^;+e>)WBITGmAyvIKbf zS|$wKjF5l3$i@%ytZi+I(DJw)>_2S1R@zTF+gQ+2WIrkyUN=?92cvwheKDH#Tbba) z3x$^E=s6xya~h9b&%g_`f$v^V;umW_+iSy;!x0i{x*f`H$Ik&mHf$$=Ni2U8Ub0x9 zFm7Z|x&dNZYGn--f!-vAqQpxXJ6WIigaOV;Q%@YsfFHZ{t;w;*v5#fEZzv{MiSw;=M*Ul3RvxIT5I0LnktTI%B`}=A-*q zi6If-%7b>?;I;|%=m0ti&TZ?~(AGF_zv^zVg42=vL6@$6Y z7zRk#0y+*eUXA-W{{X=oKDX?%;rWSJ^jHG}nU{A1GhmNDyvwj-dWuhH27mv>Dj)LnCf7I+9~-btIlK_~#H?0KiAMhXmvw zlrZ{Yy{af#iwNR|+?NHFx*~y=#yHO-pIY(1+g{u4UjtR{0!ZtqL%2S7VD35f4BDmgI<%#$FJ8->{7Pn?2sA36KLgH-%C zGU}cV(cLZ?(&onA;ZIOWi9z7~)5d=awjEMCr=H-fkcD-bMh4&k$RqEr1~Kc_lwF<4 zlDYDaiu@^Y@Z-iBj)v~iS*)!soW+X$sx$Kk4c{MkBm20j8nQL^pK%;})+?7*A;@o- z0iS-~O7<_>tHIyeUKWGInp}!*bh)en zZymT|S%KVnZVPk4=ck~r2KW)*<0J*gLOHKS{gAvSeh6u|eh|06xVzAjV=j~~WDO;lU{8^|_=g7_Ppxnt4P#3` zj2{x>(?bQ4>fUStpD|1UORzlWE5~zyYrI1{kf2M5RY3$5OoDeXfA1cfg&futms8xs z6(ADFxhJTnXV$#iz~2_$DB-s8i#Ev_QY*FtCpZCLZ+x6*=~{Omw1#ExL%fqf)7y|V(&rhXVkK^Zp z8d(*5S>fVhIB)dm`2BgURfuO=I`K+QbCc7G=7+{V2^8EsPoQ9?{QbTzN3Y(iFnmk! z<<{@BYx*pkKJi=Fj@~o<>ZQ3iHp$Iqc%w?O@fL-9rg)0jUD#?+J*~_ocPx=Qm0(Av z38x5@sYH5&rtWGJ{ypTj=&IMi*W$V-Sz05SxFBR`EKiiY4H-zQQE>iam;EEhCtCF;fGQ4bgy41hdoxjjttVTv!l#uZuH3RBLzOt z333KDV0@tGp&a8Lxviy=IMn%Ijl+g3l|Advz8q_brL49t3aYN<^IJPtfCwkI7(LB; z5>B389z_AyqYP&QJTFo`{cGQr9>>c|5a#a3Np`_ZPF5$uC6}=G_xJXxn&F>mxNU?J z8x!;3fze0PCp88& z^25H^*;JgftAMOY?gxLun!`S%PZijI+MeD?4p|C(*lu%<+eh8c9QxF9UX_z>;U?Gf zRfZFT&&}(}Jt^yHx-F0LDL`1`E5Yf{T>k({bw<0{xthp1-08WW=ACVIl%Y)YTTN7n2Q$!p~DTod(?K%^re?i z4J?tfmXcOns2naoz26_>RHz|3@3~zr=58iYgV)irM?YNksndL0gvC=TRF*&&J%Ptx zttf^)_*|=UR0EOj4m#lTnzlkh@G-=Sen(|&@s7hB@t%8A_6T0xzNHkFOOOk5l)%~s z(B8Qn@##~|Guy3cHC1wi2RfqtRHsk}-ucy+yFXBIiZagRPMeg*3XyCa&YK-l|ass-Kt8y2v zTblQatDzA9Hag}d+RgRB?fk3HzB0y_eji({5Wq3P1arysC;3;F#j8oJ_$?a{ zM{#8#^I1R+0Kq5UBd$8veWL5j;ynt^>@v#I!m}}9upvBW9WjtUom}F#Dl(HeZ`zMT zhU?+ghNCT{Gf$vu@NArb&jQR!Ixnv8l>1`7g}LxW*0J!xKG74)6qZRLGC0Go%JYL{=eERKgXP3=jg$KZgJT_2;F2&5vsQO8)?YH-64~N9^tY00ltsVeo#p z;!R#XSHe2vS52v0nU$QilOa_fDuq;jMmclqU$(jQu1b(}-z!H?wT)-Z7ofdp>q)#( zxKt6SxaN#fZsv{D2wEvOQM!VdrM6e zbmeIy^3&lTilm?Z3H4`t6s|Qdf*%ts^<@L*Cemr+k-BrVhLv)C`&a9ImDGBToL3MP zc;`_fFys)!BL}}){C53;EM@U6{{Y2bhC29ky77O5?iH=ra&GL~5)HlZS=Tx2F<+)% zu)mL`_?`PBd_2{!C1<;B9vf@0agj7b%5dJ{kkrFst6ekKHV;8Y(Lmr)oQ^8YZWyCJ z#*};02+7R?Zo{_&)2$gk{{Wpbielzt%O79XfXBK0X_zLAQ@F0ji3mI&)|AM9iH?4> z&D>J}JMvE+f}VlS*2KPP>PZ;)qwOu(kLOjVf=P)0?NSH@PdwB@2`$l12nsQ@9Ojjf zI*v9XK;Il;{{J$z5f9HRYv?W zS+Kg@A}coF4oOqf@ENL6OvZKPZO_cl_$>IA!}fvFrMFmOw3oxy_Yo{gsH({{$m6G6 zu>3G9=}-72l=k}f!=D|+soB_1jAJP@E&vCq!x3Ju{{RG&)h;iz&lyD&kz(TCN4i1JLvGQMN3J2qu0XDJ z70+YUl}6~PT>BOe3h9js`TAa#q^>rLSn=!q+KOKS=n|z5N7 z_+qqRsES@jIQe}z@6gmuJdr}|N{(5wrz}o7{{W3|?9t}W6)1INH$Mw}FFO%8hWtLj z_0FFUKltru{{X^+@FRd^@Nb3NYLx`(kduSg_-mm1ONfiV1y^$^=kNxj`%Jc|rP#hk za1`z&k{G z*MlTy`^Wnx5xeV!=DQf~_R0{nj7aDsJ8}Lr$JCY=V|4pdaUDLGJW}>i>@@&5LC3z0 zp4UA0QT>a45Zz9Y-Fz+ZY>~EQXBt#NLFvyNo@+B#{{Vu2d=H-7`M(N05Wui4jX4yz z)ra{t>GGtr5YWt$BZb?A$Roe!>OCq+g~^1el(}qiv?&L^4@_dK*vGLSU#hR~Gs$NE z0D@=!&)2dEF1``?C8WmC#>IY6dk;@+RSS>!B}eSRRo!gqLtG*_CBi17Tx;cWpm~epOp&M*BsImpsWZ;wyz# zjDoGW;A0%*j_0>?T4Av9lC+V}m}4qZmW=q;ANV5Iz$Nfa=DBlY;z4y|9P^i5W^fZ= zW3$Uv0OJE0ug#x{ULDgsG2tyX>%-}Cr&zgIt?k<~`70rcH5eqsKO$0O)__pimz6KN@`U3?D^Bq1QmV@PMo3)zzcxq%=}o`? z0D=a56u$7Srk-znVHL%##FMrBdVyP+OJiyl9Ti7FI^^cQ%#&D-*6^guv?86&zk!2* z55H6Nq=UrKT@o$6Z1AM8OTEtkaK8%736EffxSXCta`D?Wet zH)BEjKb2$gZ^h`iZe+5ylN-D8n9eKoPCZCGVfL=pJRRI)I0vVCllw^tWx?ThXR-Qv z()yi0KJUN1FkP#bN#p0JQO@D&J${sZMwjxF{kLDF zkIb9@0QfhHTM~J?XT_^GcF1LyLkor{vQ8_nX|HjvtUQ_zC-P`VKSoOfOS z0N3)b)Oc@{C{U$BzrPfGu_d>Td<}6b;~VTIR>m=o8~WGk z^~SW3ylSXhdt=j%iYc&4=!3X{`Se9|9cnF^?modvZ9CRB<<+$zb z&3?aI_>L*Ae4q&65a$6&J%R3Omx=YSE+)5tu#!wDDEk~|(4GPGH7hNo-JDIHcUdc^ zbMdZU_#)rNJ9~EfEBGd989*r7jOfY-B(P<`$8dUjn&Un#f5A2WBK!%{tS0!227?&X z9K~f0nW!}KU9tPC8nTS_?e(wO3B;D5DRz~&?J@2-9eBs6JwH16FZQ?Alf@sl*Tanp zSp?R871QoD+kw=eE0s7r0sFIz;~6-jzEwt=O?4{+oY%xjsUM&5{>FYJ)V?%m{{Rkj zjXEj(X|D`HYA==GDvDXl$bRn7q@FS{-n|!A{{Vt6{?PW#CzIh14_p`AuGan`ERtkn zjKnZ8->;>6Kl~F{!_s_M{{VuXc+18*lEz~2PJtjeVIem+k}9cAakvPj1KH25exTTR zt}Dn#kg`4w)AH@-IQn{@!m)-|O|6Zq=d-0gQ}G)A0R9OD`$I-TH^bX$u%QT#R*ASA z^sgmy@J{~#j+SJ}b?}G9+lgF+Fuve;%8mVgxW+5@?mOt%jgPx`Ps*ORX(FAE zkUEfaQ~i}ov2o%GzDM)rbNdARX0dF|@R!H2gnf!u2(Sh|VCt@NFnIU$ted~sv*O*f z=^Oko_=L{tNeiZVf??a{-HeQMujqPxM0qS=mjtg3g1}L0cJMOAG|cWg^Mm?Se`C@# zj}c8fG=DBXwlBf26MQ?<^ecZK=sqIw;9&N^3@HOy(I zjVr})B*8}x*vcLOQQxOb9xL>J{thPbwe+7Jb-8T9+)1Qr8fCNzCQ6B8vX)b{dg4s> zJlEvTr|}NwQ`DU6DBfz3oci?V`=|NWjg7*4D=441@IGd$VN$8R&p^`!){A!{$2+~Q zN`S|N9eMs(^{I9Ht9!W1L{8njpq$_S{*oesa_X2u!=hM_z8LR3d;(sbV(S=|M9OI6nwvLGM>&DY&hxUZC zU1lja3zB-!abcPJbidA15vy6aq#xd#zboxrO zF4<*p;fewYKVPTTqIR~2UK>f=+%qaN6*2;&?{>$0eQ`+4S8!MIl=Hl{-n{-?OFl}4C-_IVr%F#Xq_`~V%%lQI#tw79^)-R$^I4WtX^D3xLL7|p6yvTxpsB88 z8s)%=6pcXX3pOrx6hp0Wf)1ql6Oh|`XP%hmq>!jkptG_rPEQCubKanZl-)UymK-ie1xI|I z--S$(rO6D;@rKUj*_K=%p~3C+uSM`SsV1?dyeP64hDBE(01kS4ZW!rYMvtb=tzSoL zWe|39LaFHx&)$Dw+}EM#wkx69M{8oveVI?v<1X&~w0C^!fu?UN7;imv<9d=+1nN+aBpx z22wwTf7#APYmjpph^r)pW69e6c|C#m%_SR+%R=^};#=)f8Cc66WW$un02Mr8eE{Q{ z&y~*Q1daRnEOCxH{VBLizSUOp&)&{J$M{q+?V3%l%*@9MTaG)7n${4zM16{;b(`Z zWU$lLE3Xwgu>Sx^yKkB+Ha%TYcFNrbUO#bOlm7q&ztilz5Bo28o5gz6E+Ly!lHyqk z4b2U-CB9SLLym{k`q$_FzvA1!h`Q#X;x7|O$5Qbf)ViI}EMzG2KbR0P`@um92lr7& zYWh~y8Y(FKFAq!mcRQ(GufqmMzDt4xWXAF10E3cx52tbZirdgN8SEXLq+%2Dx)YqA zKzk9}*0VI&rpN(f+U<~7e83)ZJL0!3ZHki3gdu)ytH(?ej^J_n*Mo?v_CH|DuqpoW z?023TShX1USV*KUK36yjeKFA0KN5UD`%j%cv|A*Nyv^KYo2eXn=kTt3PQSR)Zv@t$ z91sw2JC3KP73jVn*JANCg2@WTC(5MD?laCmU&^>$NhW;)p-#&~$sbEGI)&w7;lUqw zJPi8#;-Qw;$|a!6w(Z|J#(hSA4nCFW9zO7Fo94T+izNZ`m2j#XfEbS4b@c08V*dUW z-k`b2#yMPMo=;O$sxukkpzf?>%W4uMw1&fO+Ks~xPyV$=Y+@9BM?>gE zY^AS}E>Si=4nY9*{rWyF7RA*U(YQhC2Y%wZY1EQwo=!UfN^yE0e}2OrJ716A zveu*FpB9*|X3`*iIpAo%R)R$;yd3W5@#E6JKCiT^p9O0-`d+AH`%aN}Eu8zh$jERG zJ7q|0bmU^btN#FkO>0eW@k7MAY)(A8tuM?9%bfXVIsH%auLS+DGzfe*`&xMN-qmBb zg|#s^!)z- z8j!e8m0NJe6F++%zk%;r){N*7TjnFXcwjmDgWEMTOije8xV(}#1f9G19R3-vmz-?R z+h|tjie#mXWB017o-x~wnD?%?;pU=`3qy0T#$U|HY&LQCcY5^Zxbu7Fl^r{fV z1+wieEH2@4Sndy=pD*L>U6GP673tzVskz2aH~?U9$FTnZ>v~oev*A0PCIxFjD=i?k16V9bG5bA#sAcPGcGUPeJX9lHxUnVRa7W3H&Ff54TQgj5f^_ zjpw5;k}~#>$L941?s)Oq}&T-MZ9R>{Bh>X|U>cj$u1kfK?9% zBfsmwtv`qQ1FQYE^<)J}D5U-K{{THP(~fxhRNfKrWRYL5_OcX$S0Pg;a)rkvb_b4q zt54!3+IVOSeGMTzvq;Fyc6ZuNdS|~{T%zYWpC9UxT;9iHrpRQ95w)BG34Z-McCKzF zF8PGzK-sh@z~?6)Q|r&?ODy5suzm7K*mH~n>Cb8{m`5hi>|H?tNx^)ak?D`toq(1* zk1h7b#hfWt8RU-S9^88UDXic{5s^S_a9C#ewDYQqD^t;1Seo6RIvc}#z(gv zwS!>Hg@{rB`P2c!c0ZRNTHm)VX=3Ko1yu)goG4uP$Mvg76s*cx{o%O2X_#>z1B`_y zrWE!V>(;sbK1PORcvuMJY!&|T&NI)c{$3rkrnNd06@KsY?4FL;NPTk}rog1tO5O$#-)2P#hhnaQ6Tl zjtR~yq!#8G;xIgWopSB80$85B`gW#xFG71i1lUCsJK}-_bd({Fe@qa)cHs0q1#15Q zW))W}Ze&sz4Ty3`!Q;?(&wOIN2OA&FnVn@*6;e&^*_ZZbk8qG9I+8$tySvx%sl~d) zLAO8w<$zLmdMz?)&fDeK>y6`u!RwRQR&CsdSAyOvncM9mP^T@FC3BwnACKupPGLI` z1#-hG!A=+v$3M`2jTBhS?^YkQK=H`H%P1)E$V#UpuRXoTd~wZu)$x~2TVD{(<(F9` zKkD{vc8{Y5Bkqxqa5(ENB|01CimdgC~+oqjspNB;l`8p&%L zt-Y|3-F)KGNAqn{p3FdO^MirYHSECgZ+3asrF>n^e7Jn0kDKPl7|G8(jP>bNg{J8| zz-7#TGP3|x0nS%BN?A&&O_+wc?sbB6TfXFTSlX8wV1 z9nR2)CvalldDEN&oM%0NHT93cd$n%~=0mV7rZP4G9^lvkaC44&w;4Pd`A@>qpu9q| z&9+w9BvuK#Jc2*R(!Qeooo(#3Uj=5$IK0S#4;YhqLPyM9dX2;C3Fd)IW54kqfGs>n z9KYHz#?nMgct7h96$5Vv<{04QWMp-(6ZoO~K1-!XEczk~sO9-u-bOCN10W;goE&_l zWD$;rz4J&7VL6WLX+Q_e!9h`uFvRdN*!A_TM_6xd9ybq&%BwT{{$cB}m(zjMk=UBJ z&7&@3;m-|tqr_hZyiIAX{5HS4(seB~uxa5d4(uPe+3G>>gN&ZSzO?W+?H%DC+RIS1 z(tbKNpWuIqB1Q7GxTIyX)T9fPV8aTG#~hyLjv5UWVMWU}o! z+JA{gaf8SmYsLO9{4~AN{7?S?6&0>wp2psG1qYWdVFz*%$Y28U2q2Ctp--E1WaD%7 z1NM0T0D^}2!}dzPvGBj`Q)_+V4+*5ED_v)6i<>0fw3aQCAjuu^j91>?0r9_wzAN}X z-^3pYwJUu?NuE9b0BW^6Sqb2WUd@0y^Vb#l2k;m6;nw~W=#ltu<2|(gJn%;1Qr6{* zUD_AM;}nid5Ib>Q8~+5;f0+_aE?|e!)H}PZ0QWP~!VUkTbd{`@(2P3RIkD z*EFY1OJY^g`X}*(Hl6!Y{4~3D@{GS}wNOB2OeqQpZlnielk4qXs~a?}EO&7%cSmX1 zhbrs*Lq4M!$5EVD$o>cYx;!2GW$M2Vt}T*J4|v1Fn$o7Nq)xj@60Xu>a&W_V1Y{pf z*Vu+REaZ|a$c(Qm7Ff(8Hr=1T*yE=-&uZtCUCF+dDXr${ZdN%EO&j@GJeiPzoDtuy z2>0TqaAmu9K^oymD$#FJIORuk&`J4VN6M|Z4tVX`H0vw0yOBX= zZ?no3Tqe>n$SP01dr**u+_HikY*l93#A9yb$Qb$#l?;v&DE6>sb>G);U{4Bj+m3yz zS3>Mk^_R_=xdk&2P1y=}b>JUV zTie~kaT~zfz+e@Zlpyif^6kxhldSk&e*k!zeFt1*o=Z}uCuu*{p&u)A+yVMm*3wB2 zn(ZSw5)F)=P-V{U8$VwCI#-MS);s za6i1H9(w14#eCsxUR7s>k%KPs-eJy1a1XV0-vB&vo(b{b()AMSr}%?$1&LhTC(Rfn z0svrGarsdvprU#&fH%eQ=i&;h?^!MEC5;$h;KswQe*uqArFVDs{#0a3BP?NXGQ^S4 z9C~tpO7rgw#+q;KLE|fnxJu17fv3!4G84d+!)KmO3XJiMqP-5}yKIKxg93_By8X?h z<9GM5(;rIBnncQUGf5wr7m_dwE675=IODm<`MLvK-^9;@)?XCtqeF8pji|)SHMRY` z%q5JFMj1dQ$8D$AJ$bIKcoSfiAyrp9k|EVNBOA|OUVSRNSv`SIAkT1zhR)JR03F9Y zi3i@Z2Nchnd|Rd5d?wfJ^q-1eE4a6sMOiJUdqrD&@G_^%I|$sp#&h+}G8fYI2t42T zOzjXa%7RNsju*IO^7sRhk;%<{C8+2cCy(^0bgv!h@n2Zo%!p!}kcu;gO#Q~>XC1x8 zeA{_zrf8bxv0-PW!qHe=No@?Q#hsQnWe7q0+jE@v;;Y+o>tjEwsTQPLFSSYL_?N@D zMBSh4_=7}v=N?((82a-}8dMS76&kmMTHZmpAF;#&lhuv~e#HGMy`&mFugwmaP)503 z((vBkc0Z3a=x*#H%C3_du|8Tp?66))$s?|L!Q!LqUPL@HOp-kcJC%mtAiDKs1 zF7wcwXQ{v(_7w;GBjVqkJa{eOMg#*13hqJAB0-Kh$@J|}&vB<+D~&@(S+{)3j6`F1 zVtC~BAo|ry=(Krb!f3KdD`q6~CLL68dUMZjdKM*#;gc`fX!ns#9lS93LVG)n@wzmU z0kz28mGerm_dN~=diXQq*MlVRf9(_F7;IJ;E$5mWk1iHCmob5kPgAgDdRN& z*!-eou%9c)Lr>y=R0sX$6mSWY4+N@mug<#Sr;zJlKXplkG+p? zN~au!)8+yNQ&#ft8;<^jkzNY1miEkBS z-zd0Q8);%l+HvSU@Zje@v=0%^;yA%&LCQYx+jQ=OAd*3ERCCg5MC})M7*7(+ILGPM4ad4P=6kI;8Tx^?>w>R z`HLw#fqp}EJF(P~a5`g(#ER(060$OI%s?lj6W8Cj)~6D@1Tk!tB!iAK&*S(~cv$u$ z+sPYg;tPpcO}Lrg0Ukm}DmoB5p5M-zo+Y}POQO+TIGIifenxOI2pr?FtVpk2cX>sX z~ zWCk9s*B$FhSV>h^BDNwlnnzA`dz2{Ac?lBjDytJ0i#P`-sld~<>#LPv7mzTW4pPA+99Y869;JRPAAayuO79M&_yLhR^lWCQUR!E9P>fp{veMf$n}VSP^KbYJ*WZ^P@K9e8Lv=h)9-Fyv z5DgmTK_z`l_T+=!zcxMqYS+4N?P>6t^cj-cch{ON@}}fDw73OE4+k9N@zht@Kk$-x ziLMyFv!F_>?xcuD(03fE&lv}$etVz)0J7q2yB~3sw~524BiL=f;Gvq*%NW%o)1zO!k)l0D_C^t8y3Y zIxql`+pKRF9kbBjXRdlvoBGa@{Drd}$!E{N-@gV~Y4{Gr^JaOX4;xjD% z6nC8Lm1MRg5uO40x_9)b^{*Xx$4k(zCyvX)H`722k;c}go_7pBRNBKVbH;O2u}^V4 zGdCC|S7xa&y!3r}f3$ zUssj%J<4zRDCxDhiDuLMIW%}4WRdDqF5LD3q2zal?*!mqiqCv@Xm_jDE>&q{{Sk6<9Dw9 z4ruz~?mw$Y`V@b`NoC1=ChirL)^HkF8H({{RIf(k>=Zaic}B4b1WCu@Hx_ z+CV*zu*H1QHnDjnvoyXF)2??%hA(yVDI*;R2M5=h!`Hl8A%sXg2d3PJ#}6IIR^5zr z$KCd$>zCPtaMDifq?E9P$xKm06zi59b6 zcxGJ$*%anR0VVmyL0|yJInSkZzZJX*bKvjV9Xv&-XfkWsZn>vPX&T!|j;kU#+UK5o zfu7uoQLoh6RPVX=!T$h)fp~H|QuAo~nQ#UKcQ(wfPhd=d{$Nw>KW{$|EDqP2R;)@7 zysrn$#QdlSnVsFeGv2;2wY}5YAP<4A<8as|r9yL#PuHOKtrpdE^_n>o!B>eP2ZJZNF~40`5Q}(RHAm+2podai6+n$?iIJ6)OJRULR%2(Y3@? z#^UDO5D!cbH=Ozk_}yFT@!GJX@o8 z$7l7gjiS8p{{Wgk)!_|D#)+{*T&B&S_FQmJ^QT$sUKfTCV(^Zzj9X*6N`bI_SdK{^ z-Dx~ZTe3Zr(e{7*Hdlt$@WXMYc$F9`wtmDI5PI}(-RY0}X!uwpxUlg7c==TO7~Lq& zK2f`zbtA2OTW@#aS+OjB57vM{Ld2U$bLv4nx9Ls0)x0vhrT+kgSH%&CLo|X(R z4h{#u6>7RCl6xO*H|>exUE^iGxWj;d(2hYPKX*AknWP`KH-x+4No zBiw$%r(^AN`(=14ISR=>sH8694TPWJPM7w_@Is>bms*|}6ULt_cj>_E{!M&GbFKJN z1ZBAY0EC_mt;9$eMfd^V-`1*+8hBzU${W8DS}&Qqcb6()eQYatA0d3ggO1tS1_%g@rS$@@ll21JH4;=LICpk*;9 zEI%)7eiixir+C{$)KNUIh!Z)LvKwI`Nj&TuP7fG4tvLKkr#8c3<88?zs^@9sgOYyd z2cEUOaZx<^;U1^oL-vC3R@GDDT`PAy8Gdie(yXt>&k2e;Ng|KrVA1(woZZsQER;Qs&@ zIIn?IQCrJsCT|mH(yAd=6WT();id zYU^8`evIXwy{bT1Z^QDKnw=s&jYr9m3$9x2CwBYfOvLzqXovq zU7&%1#__?=KD9HC60lT)Jq&~&ENJdY$?6zCLB@Jjs_E=!^*JriwSFypJBQ-W!jBSo zR!gR|O?ywC!_I|)cua^?HV*`;AoE|8KNNr9+CPcE6}(4zdH(SRf#sClZxXySvsmG0caBl5qmd;5f zRwOifgzd_&KsRzq`uFvzl%YLY(?wRIxnS&$OZGhf0E21%6aLK~6udp-e~cb6@o&WM z5qN6uJNp`Gp)Ssd7kV2dJ;m%}-2QjOANq;LOW{S%C*F^y`}V zkbFw<@IWB5)b;|-9BU6G#1qDM0ssR%5m8O?qv8gf%JSOyf5q#)v@eZh@DGXf-xDW_g`M@Bi**}LvI7_! znQ})Y?d#}yub;jJm%8!Sggko2;pWj^&i3DC2bRoR3J)VA%wdjt*F37JOPKU<)ZHpx z%>9wSvRJhVSww}I*n~`-$CHe9I6Y~X8eE2DAe1{vW?Y?^9P`|E2kT!TYCp990FGzW zUNpS%MY={qApOhal5m;Y3mkLSn;-2pvx8DPwQ`);#eUakJ z2=4Vh#5xz3e6B7wfE9w|@H!l4j2xainpM#xX-4Uf$;z(G9lZeSfPebc@%$gOzmAp& zl1tAKWp;%DAy7aV;E~jO{#2{`Px#(Bk!`QMO(d$#^1N2WF+H0D?{WVC)~e^Z4-C(- zq|>ChKw^+AqnzV7_x}Lv9w?7Tj@Az@-I-M6XLmb~@qhKYV!l6%_NDQ(JAbq#@f?xJ zKp?>a`F&39#2ut#89uZx?OWqNH3MCEj6_2&JgaAZ4tZdpX9RLHOWFg%%K9Vh7&Oyv z{{S?u`2zr)?c!59~eLpzTK_5jn3@WumPN84B(s(Z03bl%%xKVR_5OB@?nhHnn^LNj4#Vnt;H;Dzq zvT72IgXArv677@sNk$kTcOsX!T}oIfy^p7_Gy<)*Av7XKRskOoqX0QM9082`n!NUh z#JUO#kr&#ax$bXRb#|`8597o+FAijA}8n1|)-|$PPN~&g^yRp8e_p`)_!I zOx1+xd1olWU-<{gwB+*g@h|Nu@xR527CV0q+Qs4fS7EVKkg7mE0{qf(*Xdrbs{Y;@c zvat|7qeB-2?HKF0=dZSFlhP2#TXZtApYKQh-{hj&d6HUp=ZkFvsQKF;Onyta^G70rcmscsxJ0*Oy|_OKGD1 z@=t*2vN;6B{WivSX>ow@h~etS^Z!qvC5}v4J~-5(W=t>T~VWy?C6zwv;llHyUNT zc_Rw{0NMyvW+$Di)MM2C6h-@ETE!fGW|Jn#Uk<-)g9=E<1QYTv-Q;II`q6l_Q>8fc zJ<7vcdFC<65E4k9Y1rVX>5QI=PfS$m-gVfDII@L-b`ST5*Qx8$yiVWtw$s)rXBt)P zL6|p|E@5RtSDnKk_ET+yS5BuaeBF+G!usd{kSZ$lM!_js4NpS{x#WH>jL*rKWb>hgYv5!bB@2# zygJ*Ts$gHcW^mp#5|(KsRBhPdzUcRCckhbfuJpi~iDeQv&PP1A)6@#>{Alq!jg8E# zapnx+MtT+Yo9$VD-Vrs2Q$$OQjb9V149Z9E>0E{A+JalgNB2c?e=TT!jad&#fu5N()#9wx-e|3 z113rJ2h;0W9m#4*0`8QRW=xa0v5uT)C$}S|Iz?D+fN_R%j-R^+9aqqCQrktyF}kQl z!kGqkpG*$jD4Ao9S7@+=a9O&j_xJjCsp@spRz+zhd6289+3KS{XFLyjgU$jpKOs@h z)&qg-R@!BT;y1ZT8G{X&95)}=HK*Zi4n1eYR!iA2C2VKduMkQ!NX%&X>VH zA36q{w|9&d;^8ypmD&*wI48Ixny2vt#A4VB3nL_M>AF+9kfiXVxF)?3!NmFBtL_Y$1DjzK3m=dY*Ivo*bu7?WbJk_xUy8?NL2 z7^oQe5(a#Enc6|>r~E2erz~0I%E(61v2ZYduN`_-eg0sO$GDDgSmZGE_dNzGqGc%! zxRqFN%oR>wjC&85aa8T65-AdwXAA(tHam-Ls=e1XHwLiyB~Y_0`vY6fA}Nby>X<-M3ZTnl(EQI;H&(* z*p7sMg?teWx`>cK3M5g5QdqXo2OOT*?_YiVEYqLIfAC5DM^4j~C7mp<;@F&R;J6z{ zemZ;fuYjzXZ(#G|k0xl9l{xB0cs+)FYuv^BD&3FDI8I7foI+pBZD~>~F6JAV2i`4^ zLH_{RYi2n-rp3t-u=$4Jxdwl{Kb2+K64GWw+E|UdK--T)?V7jdg&U>-fu2Fg1oRd2 zb$#Z~+OSqs(D+pmbDip-Vmy!+pW-L@z3XSg9w4~VH8^KgK@jERBw@#(^y!d#af-xe zNnrcR#mFJLfI;hy`OkU-otc?lJbbuQ$35_Vm4k`eq1onwx%11Zc`=k_l6Eo zkIWJ6UR~pD0dy^Bua>D99&#w<6!#qc)9qbP!e0~ahI?D7a`196fI6rd8SR|^09vK- zlFBRX8XK+7^G7)@oT*QvbYOetl2#O@bBmU7F~gLN9fJmQl21?29+g*7xOjn%2FWCB z+x$d&dvp5HJ-{F&f+QVqsrQdPzMU$u!bsj`(E1z- z`n&!KQSj-sUxq#)@gAcaMm#}z4V9>n;7b%IbexV(9k6?GiuiNmw~IgFI{5G7eQV5C ziu+!{wdmv0Zx%t-6#1$R1cj-b7P6IF>~ zVx~4j&m89izg`7-y4*+PbY^$i_V<#W`G zx;Wb6TT!vHFym^RW1;GC*#7`Zn@HC*y)Hmic=Ixbtj25>pfDovBQ=(@j-B-U+qXk!o8EAqB+oPv6K5m-7d zq5Z1~f^nOZ*F9LA{=U_XrfWvdPnKf1LRAg{0f$B-ss2?RrlTdi%3=(yxU+3x@($#8 zJ@}z&GJQth?6)OU4dHj3j9_#l-v_UyQd!kzO{$LVj1AdO{{UCL7kZ?(QpYXhv2CQU z;nzOcHDAwnbZCeh$IbHk_WuAp)pCJsTu2dA0)v*`SAcuue|z4WG{Kfek+NMjo`5Mo z-R=)cuQbf>@^8wya-ZMhf<38_x-9#o3@~|IXJ&ezdbJW9(l#`x)=c9I+-Eo)GlA<` zw=we^9${$NISa=a&NH0WU5&uCz=$qb5*dbf@m3+3Co(?j}>865Q7M{Ew&s)-!k ziWQOS^uemKCzXCL?^u7?!i8^l_SjK}wD30B^~1Gt7??*4tc*V#9^nV#lnoW&=U z+l#Y;V*qs-;~asGeR|eTr{Wtw32B#FuZwQ}#iZH5_ZJr~b}UiGyO^;(Gsgp-2hzUf z<nqMN?*K(}aQyx_nF^A(Mo;b0*i<)lzr#tf!*jem6#kG@7ZF4@|>fX{mG{yKbZ)_-Z=iX!7nOQB?_ z*7`M^fG61CZnDaH2_(iz`^uPH44U8Y_K|Dg9}dN)Xki1RZo83q^WOsp2a(WVdRLWK z0YSUi_9SwT;nmr&6m!4_j(zH+{{XX1vj&ps?ckY{ z%XRX1v$tI1+ZgFyr*9b6MP>Ckb_bbOK2yB7 zOKh$BBN&IAxMH#+V~p+2-&~Fddil@xiPJ6g?-WS(5W})X*}6A5cV@{T9y^b2{ZIeZBZ}}}+ILKoP1O{<&kRfll;sDO2}~-CbOe7FL)xYX zM>eO3U0Io(WlUuoBOfb93w0y8KD>{mK-OX@+iDgg=Vk{AIU}F(995~U#ogNdy52BU zZUiY%xag|Na+xG&s3SD2rGXC2#WJrSRRz;oaR@6D}jolTehT(j_FV9d9&z-qF&OYcT z)7R@?N`A}tGS8+oc2h?4d4NZT+Qo87I0L45 z{Y&iYG!`yf=Tvk><(PKl0kyG_f*U`m)tN3=J<7%6nn0`;-K5A#Bs=%=bCc)~ABQ5X zn}4(H`$Bn{{a?D8in4Eg?*w&q$#Fo%`EXG(c zOiZiuN9;bl=b__}YE0aWZx$Ax!#DQ#6D`bBCJA`Q?!n3A_rN$lwNqd49-r|W!J0w5 zwqnhvN48JBz~B-O-V2VMdGA}EAhS!~56vVjU4&$|7bJ1l1K+sd5y+@~B`SZyAEP@n z0Bpbj9vPL`a69AQ(zQ*YT=}2khro$^B39wjIjwg{JmoF1l;j<)kCcpZ4;P{jQ;>) zKN3mfF9KW-^#1@4$or&$7Y)oOnD85ufKNRu^e6UH{ki-N`(J4fZQ*&O@c#gbRHxc> zd*%_$SOd9XWB1pd+~Tv8Y{+*#VbgLTRF+iOFj((wE(S0=^Yo`f8%yMa6iKibmDTgH zbASS$z0~0G&(fv7gY5D;Uxrvp`DnYCggN1N@sFwNP?di=GbE9PjQp$*H~{bg?axE% zO=9#HF;+&E-=~<%i6mdT%Ak->xcj4u;{O0>dl=*RAL5sX%ZfNGT^N&*7+$&ROJ#u1 zL0!zzJnJDQSXCH>DnZC90b!1+cpZ-w%6vxf{C8gs{6lMG$sNR+UEQ(yiA)vTLG>68 zN4|Y1OdGkx{>|4B-FyS^{?QbBV~`ajZ*k8Jw;S9K9+CUm$mq22*v#|avNwTg^( z$4+a`{{Ul#In;94#y4Ru`<+E~a_B0BlWsdNf!m(xQ zdUij`s6%kK@e;E!3ntc9Y$@jlY5p$cdsS^;!@uyBX}8*Dp^*lu8^(pnJNV$29SFv8 z+NRXZT80wgBxu=oMjI;8u5rK}0T@4xLhU7k6<3g$SRAyNRL@+0dms*fI&l-&`5qfj z_(wHc?JLAq;@1FBR5QD>lunoUYUSJwB$r zJNCBlUDckYW8%wn2^6Jt%}s)aiEz1vvO1BwZ@1}QU^tFGNRmtu8ZPYMk&}_vzCG(r z^d&nUx$uw1(fI4*lp4HhP37l?Vq37IX%odJ+@?C@bI;eVYt`ntmS#tmIOGeLLeI68 zdKM(|0VAhg1$^7^H^jF768O`n%XspOTj(0eF&+VwjmiUdEI}OclV3?P25Dl7Qo=$R z#yM6X6UpS@+7F9fD2DPjKrh%}5Lo0Z4xC_qxaP8x1j@2FEhH$(5)-&a zxgd_X9^TaDFkwLxHq5&-DcKn(9Ff!$+t!&J!f22tT0E1vPSG11R2~JnFb3U7Xzo)>t8nh)se`*9&B*C zifPP9!NcXj?u+FihtCLf%UyQiQS z#y=W_=;F}kWN<>WF;k8)fyn3pCnu#{Up2!l3x+r6ra0nu0jlBu`AmhJ?hLlYFe;%x^|V$?6@vL8~`vf z4o)&Yl{JlnS;8fdp_I$R6(p}x03Co+&~>TqNm(S?K-dDtNF*mbW4Rsw0M2N`(RXfT z;;~DWLYY(naU6|qWJ7|kyx~Cu@@(fls#WsJkq@1cpfe#qx;XhqvBq@ySY*3IjfbYwGVUtmKeqq2+q^b z_l-v-hn~ZHNDe+&yuwQ7q5Qv5S7XbPvB?v$`H294zJPk1^&KiVw^o^zeo{ef0yES2 ze;(A5uqg$_nyu4G7*V;uc0O)T0O0l%pJg%4%cBW!rAp@+-~;L^VQ(X%pl_HENsaIa zuOxHZif~URc+eQiM(P=d++{qL0QSdG#ZcoT4kue{nHCjAC`s#`%g-u)oZ_7oyl-?o zt&=Ma*(9k@G0qR_4Rn*->CtKu5e!9pPrm>y6iSS(ze$#&oe$SF+*N)+mpaE?;>*=1|ee3HB#PhD?VyiFCK?HRGo-toF z{3D*${{Z9X!+$TzV-B{@7$ZAd?9+E1+0A_^BYg5H1%6|LyN;*Ro;ug%d|Cec@;^-B zsb2=YM#f{72P?4~Jvs&Bx2+Q3z+}ce(~N_V2e;)>s;e$Mz6)VSISbrp^{4s7#kc}V zKQJQz4{G^)pFlb7)DfMe6S!gbDIWg-;Y}V`Vm6L4Ibs1A_UZU^sKVtj5|spSbAmgA z_*0XNw)Fu)!yf*>ofp!;EKx;qF=2tua!zyUlT2n(q~ib+AS9os9^U7gb3wEWt^%(( z;{c4F2dy@D-2!0pazMx<1KZw^5_!T1LeD91IpZg9`6imN4eKds2OGPO{{UE~s3BwD zjoAYpoM-$g7AB8wPSyl(ByI$pgVK{lr*bLcRe_MU#ULod9=)^bX(Wuih*K#W51q-* zG41P`e3rW7y72Zd^vI z9Fm>9VHkpaeevr;i3wn=@nueAQ_7!AbU$B8k~?LM4(>_L-MpTi{XUe`fy`~^fC3Mg zD&Pa|JM&Z*5KA(~es&$QNg;Orw6AwE5@UJP5%cYAhTwYhpXW|kWsWiByE6C22`3rn z-lISYHXXCm1o!&T7euk&Tup7d>f+{2%fVyF2a}%kk8vnsWu8%x21)nqJ$a}k4I;Nq zhlXM}`X1(`F4D+Mij2g7!Lk53><2mNK^GjFgz@2)c_e8D1{jP1+uEmHO7z=H8J&P& zQIVYOaC#BXPEQBYshNyZgCHmyDs%it*PgiiDWS|^k$lukIjyq zz3C-lwlDtxY1{--)4nBEJ6i{yhXc1Asu{Jr+4wVqwCCpOk466g8i25aYHe{RRv60+ zew{niHxdDGKIrTU@(9Q2Nzy~Y`C*Sm>iApISAs}N5^5dUF>C&d`HYwZqZ%&T%&ud|)!E%5i%phIL zr{D1U`gg9IQ1QmIt$1lPZDR5(%_t42Z#*H zO6&;ae2fVLX&is`>ej=%AdgP7wc1xnu|u%#Zy`=N=~hG#!ZOyDXdL{-V*`v1c&y{rZMmQsR1vsMcP{jzB^Qnm!39B6$v{Sk&)}qulUoL6x_{_yKoOqasEvSSgVzy z(R7$)l*y)9znnKWogVOU*EF$cx;xE@w0j^J6~Y2B*N_JTwhy&P!5NsKVYmzsdJJc! zEN);szGV)h9r4F{tB&LrdKQ&x0!62VZ0#kaKR!pVr`N7(bcW5;Nj0EWi-3I7f$i-` z%ZSDgEZ7bG@2~4os6~wBT}E&S`@K8+=Ap{vCc2W_&u?wToHLEb46)9`Ac8PQe%$t_ z#j2zbI41TtBLF4i{Jk^Brx@a@$sB5*yv9Z`$p^3bG{%*c2`4*;-WbonJ*g&3vt|2_ z5v#ndYS$|60LZ$1--ob01ya_vJKa_`OC4WVvX#%s={avNJx#$O)m5nA0v_Gy+#!3?Ajz%b{K zezno~GegmQA>rG-Aj2Vk`i(+*C=0Oblb5r18l7>e%r(h<@)?)%g2_ zuscpU$nFWOAgv&8C3!=FcW^yOJ%_bE1=<-2Amok82pIII?IgOA)E?;G{{V!VPn0gV zsUr-68rm0z> z`9dM(04I=mz^eAs?q=yh^fx8(ZPG`D*RP}wF_s4|bDq8aoenBVJYlGY#2zA zr~B^_7PTwAiTTMRu>^GK$futX>yspDFNz~|<#6`ugyir+9XS<^@%_C7s-%#{BCLIPf!3aUcj9;wR9#-l zo(;r}h#?HbE0B5)xaS_+()nb&ZA1Y;%XQi8eS7{UquS57{hU`rdHi+a zg>&R;)+?3UCSg(=o~ElG82F$GU9WWMNhM1(V3VKrMgjWPJnU97(Js>{QUMtNkAGZJ zJb=l&dns^1&+v@$e@cGZeZ!JHjrja!;#qAWH@6yI_B*#d`~DRnvR9GD0V;Yi{02R`=98-@)VQR&9TuCe_>|pjlGjC- ze2j|n;2dX#-Jfh`wyf_pYey{|o{fbnnA#bMJ&!zph^`(u!jt7WDrCzpbCv_IJ@6`2 z8`P3nw+w>4+d0QSfyt`+#YM9RP7>W6#kyVvWV+Kdrt=kw$aa&TQJ><+U(i#861-}X zXc|n8q>M(y1sE9Qb;0-IxMB*&^Gi6$BPH@k>Uj12DI=C>VQk%8Dqx%jUvM3Z z=w+2egn*&C9P%-qhdq5NR=v6ir|nXx92383_Q$xZSgM`LczAX>zLo3H6GUd9_h)C_T{+(8W|U%bu6N$=OUrE=}4-E3UlGqRF5 z?ji69BOk3!b<5VAH1~6b1R(i{+H=#7P7Ob-&#NU-if88^{1vyvma+cT+9kcT7cBOk z8_Olsgn345mv6h@ca$=J*&em?_O}FnD9{*Pl}VKWiChw6J^FR`uUP*8g0kzT>-Oop zO=3lx?7kn<)kCQvHyN8Dv&bZLub*`P02$4oYTG8>B7B?`_xgI~yc~0GrO)VI32GT+ z6ET36!uMhVt;tp_c7xx8$>V`j9ejbE&Nl4;bq&&pH)xa0;K%7$?4pC{cA4v>ODNFTZD7d zEI2)RIOsixrCq$eO(#t*`1#b}?&J<}$EUxwayODmb34x?1zzE~$GX(DVYy#&^@~X? znPv^1x#RKU^sa|ORE3Iz8_2}6vkpfcyB~2}y`9gUGJvXcjz>U!E2Fe%Zcp!lJY=qV z4^fZHH4@P4!|Kk1?SW%cyL4<1&bjOl`WhCe_m@oW6@E&CblUnqfYV$h+rHHl6(FY9GSK+<`yN- zBn*%{mHdAya;UeD0gFC279ava$m9A|cm3q@2PmNM0s^8uW3Tv8*5>J0n8vMe-bg6H zNEs*OJ`QfSKgtI%A+2i<5V5n?F37onTud4B!GFVSCX^afh3Ci^2+_g zcOLz5QH(n5l9QWqFGx)La-sj;D#a(~HT9lD_x<%8&0Afd(2|J@<>If^-xFB?|K>db3 zIj`*f@&5o#ztwIXG`&EJJGlE4f0PnH;~C9;FaH1qApMY=;x?QA013ClSR=UB^viWi zn3XU!Dx%S!OHnVTIgNu{DCon6 z4V>g2o`CU;RC2Z_C1c7M`A8m81G^8LHsQy9pZ==d_+9YBS@^f{3rz6m!{}P$QPr*l z5IF&s5DejtlS@Mf2Hs%lrRR@TbNcf6!=v}XVhRybc% zU!p&;r|gMu`z?4{d#!eBTi=Kp^h+J>)GfN-ONX!7ZSn?5BQiq`$PT;z468ionJ`!W8vANmGpa&tayl_ z<~xHHEv+B1DyPq7>`Z>3*T}j=d+t%BVS|9CUiiq#^u>4MtEeth<@g^csag*gKZ;C# zo2NePI=gKn<_G2k^*Qv-U6$73B1CAwmjL8^*gd_4Ua@HvHw>W31%S@s+#gR|)XEjm z2<90Z%bpoTenZ`oL<_<6b z#^1-LJJzyB-e6YFM+b1mN7wvmKF@|?j>C65dXIDMn$Oy!wPo|@%*gz>$XIiNNW+7k zK*{&@`qqJFF2#zM0|R;6fI5CXjXvK?`$WN{2)l8T0N{Ii^`)0e2^nX0EEtfDoDTm0 zQYw9-Y~C1Y!D@&joQQ)i@?RhW!1pH|anh!?ouS-YWMKvsLgX(!z0bc|i|ow`69PyO zF5KX4U{5F8)`X2@!9eAZZ}}Sqk4^`FZqNj$dswyUWme8Gb8(Ek9BYCO{x*9$0#Ffs@pSv_;@%>>F#Y%!Q4 zD+wgV?6wypAaoyx@}XQ!8A8m&w(MX4IsJXltqUKPpn|I#F(;gy_8@ltl{Jlonx)WN zRgg#$!v~*dYli=gl6VJBq=%TZdt(_i2yOcVg24dy?fP*uL;~~Dg@hS8^L0v;QC^0%Z+17OM5sx!0$Laa-{Rv zE=MGH74kRjck$XEj`PLgzW`km;Y(RW*Rrb|>dpvcK%Jph`HAYp0n;_+y7lvTj`mB7 zxb`fJ9LE{NVV8gcsplBZ4_bUt#{;+6Q)mt{a22{_H=sP6*Vfj>b7>uq<@`PkQ+(3g zO*cul(QL=|OnX{Gx>;KUu_rsT*pt`2O5{kY$;_%0wns+(@b>igrYm#@lG!^z7*py2 z`t7>horZzbMbO*m5 zg%q)}%AiPHzEI2NHgY|9=xC|BGUk2HmbDEU=SPrBY6+e>Fi}$*1~|Y6*XlFPc=zoq ztFEDBipy~;+rT4`BzW3O9(}S#GBOW6E87!R77`VRA1>S!VB~`zOptn@9giZs$M%xZ zV!6;o=8^Vmdxk9=s*($#h_g&0MR^Y8RK|MsBe?2# z`qfyGZ4m6=Dn_3m9A`KkJu#o4s}kH5;&qKAjfzNDrgQiI0Q&y`T+teRrI>EOltiOYSn#~@w~BPzsQbjhYJ+`Ok%q5L*UC0i{j4>Di zurPCuMl)UorcJpSwxg&S*|;hIcm)3dd!NgS_WuCcrOWu4qqdr69!nD0Ex(VOa2-2i zAdgyByA{u&4w@}xk!%X7Wjux80nP|M{hQyKx2NA2n5?NPZ_2wLnMngG2tD!8w{G=b z-r?3a6M2frfkNA`!l?k~2k&u{##f%$s}_;LcXEorAxQEzG0SuV<^=Q|jz?-uS(4c` z+I^zLwW`Mv0D`;zQb;G9_TaWSK7`TWE2#AkhZ;%Lm(0hUst^Su=gIkpIsPH;a79OT zZ}w{?3IJG;mJa)sy8uZC9FTd)$E8;IT{E8sMdl1NSF^;+f(cxPJcED-7|*W;sGGBD zTL-X>jC&-GLZxsIwp#ZTq2a?f1jlOcAg;s7V54BRD@h zec(@4KD`G#^r}}jBH*}Jbh?b-7g6o$)aU4N>rDqS<^KQ{JR4=>9~W3!+(&gCz>EE8 zWsYdc$qb~7Fu*(>3FA4h9r&mFJ>GaD%xj(Z+C9917V0QA?FDoD%yPYRpHqtWpByQ+ z@n(hg){-F{!FmvOf_UBE40m9G^scT3bd`!cJq~;Ht>DFbpA`H( z@t=u)19+|-YvC5Fd#7END>Fy)$2ejEM~gqa7~`Cg(><%{&xZd1v=@Q@0BK!%%HLTq zd@A^}VEdO&IU3^7{{RXuNnP`^#_kl@#dT5OC+|s(2>>Zf=%0ZbDv&5VVu-At^`v${LE$tesT!t zefo5(m$u;`Zy*!}2+IJ&gN%@Sao4>?{h#J)gsMhhX?B2HAwe9R^&_|ANxK1$;?EA) zc+0~#`c}4~VASI_&Yn?X%aB$^1N)2t^H@uc~P}w2dY1nQ&r}ivnM7Nk8C2 z3_i8?0$LSynF7M_sxO!K0mEa1p8lP4ULpHjcn(b?Q?&7Bntn$KZ>TDj3K_B@pFIXK zwB+{{YD6}9Mz3x~oM%pX7I>UI5)+df1`X8x&?_I6^o(w{^+R2m4iojV@P` z)K4_l_ECV0cKM6Da`VG5BOLpFmGghZs79OdyT!1?HpdOpe7$p+Qzs+yCccT(BSAlx zJQJ`)32wqxMv z(5O+nh9?TYF!jOuk?&ZyWl}=7izkkA`l2YV?2tkpP)%_}j-NcquRt&pJ=aY<;#xOJNJ6F#?wcYHId~(u3 zR%3NxEL&N+Ffot;>67VSM2nYhBUpao+EFa?k0Ec9rLWS&QT;t{5 zHhvqqAbWFPNy80&dMAmWtKj5${-3SKaj1id86}ZGc3`S7r*ZWIBLlTun^}#9Bn;qX zRO1_X&Is;%=e9?!WXhp$MgV9fZSqIEXaM?pf`5nFrSjf8bp>LPlY@bU`UCDd3jKXM z=zdi&T$bnFh22a$VTA(A1=P4fY5SbN-!3f7chbQn9)q{EnraRas z!Gn@VP(Hr>YE@sf2<0+HtPhlNk&%q@Pc7;AR*6`~LpBeQOC5(GlaN5~)3yiFn%6Q2 zRwQ>SK-(!lbau(cNcQQ{uiMV>l~_!jHaJ%q$EW8)U6SmD1{DEP0OXG6(0dA&V{$03 zu2m8vEBxo71zCFI1EKf&)NiRgo?*Op^GWkta_sp>^*uf6^iv{7{*tT^4cG^gefFa;u~_SaU^e%g-G+X{#*r_Wa*!Zm4F8$KEJPOhKDqc^l;jr+{jpl3ip9^U7kdh%LMykvJ?0aDFNFT#U zrc-Xs3;86eQsf0BXOc%^Y2BA-nT?~(EbsPw7P*rxv2l*veQ{Guqqw+FDYh!c_}n)Z zAmao4Pu8u+XjWYL@3(ey-8086^*H=!ngaykTjXK5fS@o#o`rht1FxkwD~m#+Tgwf) ze83~{*&iyO_DJjXH4%N7S)X$Giyx?xKA1dkdmh!Nc^vcG4UAk$`$+_3jDegE26_Ce zGI&7wk|QIY5>j|0rakZn<=(9;kvZF9Yn=wwZpvK5=gKUr=8|@vxm(G~wF2A9*CkML4&2(xG1r{`0808s>Auf%FOW=_Cza|*CxUC{Z-lcX z-?U%DV;pfnTVCJ6%7SgDJZI>CTKZmhD>R6t1l-Ml3CBOn-oGc}z{ z_OF#bkWVdEH7uL9gSZir%y2W0N&yn5D1Z$7qz#~tU&Az@lM<_B5uUz+m5gg4XWp@{ zK3wN{_RnxXodQE4W@*6%32+Kva5&@fqDYn)jB+e$*aYnv$2{}&r^~ipV_?gIrE&K^ z9^}%pDh=xFp^n@Uor4{7>p;k4MSbExg;92uUcSWsoKV}M+>XAXn!42%<;bNs0!b`zm|C}rvf2=&LYrTZ`^bfuW0Z523LXo#2M;INt`%;%N@fpU}+D~1$&Q3e$`cf#z z$sq~5EEsnmg-{4ci*S>1-IXL973YEdc&3CdGdtwuhEb2^e+p3to?~c%SLhcRBR~GC zZSU~_|DlviAuk)Y)uu0hMa$DrV@1H^I-kaqCZX;6egE0sznD zp4@(X)1(-gR#qTL$2)0EQnIMn%!80r@I5)8cVsIXs_tSi{{Y|Voc8xP`f*M2QsG7u zVZg#;AFuMMH{&~4DJO6w=Ofb{sV7q)Q#N1F9yfdc08iGFR|~SdimMfQkc?p8mf>`BU*Efjre*j;-i(>)iWMBso^d+bewPqV9L4 z=YVOi4jxuV40t#v9Czo^s^B_9=E;d!cw8T^q4w`gY|8s%+Et0%Sd*TA&(f8LnJYSD zo^l&JeQA;g{{WUi4gEV3eLcUeCi)KGSR4q^Hf}xgTen|IX+qnUK%f(lPu|Gs`f*M& z6dyjqFwCbIB=r3KsU?rh39uxLRE!tKPC*17;-q}UNUUxF87dB0U!fo5ibrk+(7~HI zIN)*L)|GZi7z`O$V3E6aPe0?*pMvPj>@&C~(~=1F&!{vG=!at}0UqsxKXm-S^u`aT z>q>}>(rsq|5-?Yuod>@i>0fb`lsjRLSROg-!`Brl9$EeK$V`WvbqBY%=Ss*fh>8s5 zKz>Ol7~9Y4YADB>uH8FfOG2cfB<(rJQTTpltv(S$DLppio_XufY*lC?BUQe2!yhdU zH+Sa-m|YXXpat^VZ#fv`l6d<60Q$2{j#QNuE*~sT6}Oz^p8nrjMzH5J$dqK|I1jOCa)8fx9?teR%yk(11r4)>6GrbHE)qC-eMi ze1K$C47hXC^5p#}A-wl2tM`KdM+e;Itr9n6P7oqvj`^(d4Na&{}K*E57Kf*mo z_5T1Gd1Ig7bJun_n7m11@{x5+011a3L?{{ZV&WpfRc&d-!6I2%y#21j~{ zj$^@4NEjsi*}<4H1#uNCdCTkU|6gN2jF&PU9GC194RVV-3(} zxb--tDq80xvB@N^OLh14=~8YXb`>&gPzhntMltjp(<5&-as$V;K2ka``hIi_L{l4; z%WgRYsoX|+{wF`x0rN(pQm z0ZGJVe&}*@gWm$3ZmPmgbA=x(U^h?V_x7d$B49vl9N>;}dvQ-h^G;qy+(7G$V?Mq4 z{!|As9AkDGBxBJ4C$2%@p8o(!l_N1+0!HLj10j3+`ck^I(rzJ+;CavAIp^t7r|x2Q zmy~1oSe`xq06GSp#dl@HG7v^bCp-^R^`s~nxGWrWayJOaY^{#;;D8Qe;wfJjdm0f;~0@81+|H0*v$f5BVi`(N$N;u$UXvf61HYK#n&`DJ3h z$C3HhnrNDJzr?=)27v^3)^U|3-{vIa1K)sa(m&v&*K4nS-X9TSwR}ktvxj=7Rq<{! zfuFt4<%;r8g_1vpb%(c|+Dmyz9KJ&2@<8?Cyv$;}kKQ;(Ocf;hqaAML(2Ik!D!P+u1+yVaAx3zIPgaRp;NZAncJbQ2&%DHE9WZ@I?=u2@`9Fu{QyZgfgKi9pcWooCdw-rP3o@-A`bY@4ED2t` z^!32?^{an8$@_%Za0;A#?tefHWP31oE6uj@;T2gNs{#w2_{rz%+M|;$%jL;8n8Sg$ z0ddrG>(kbyY(_|P5Xa2f7{)#O(oGvoyV+QfHj$21zr946V@5KliO*HTau0HI>DIkJ z!8UI{hAiZrKtxd>R{2*1<7m%bc|EgUToP9Wh>RkUkW`)H)cR-Iy<@>wYJ4STS;@xb z`G#3rIY00pLVar)6uKU5;_}Jj`}I|i@3UZ`h$Qn&pE9})q0c!O><6!U%XtiFG63U{yz~9j_)|nTVG5n4_o^`h;GLJKL%mfBB1I{ki>kupOWSxHm00Hhv1qx|Bk z=RB7%$yuV5JWT%pAtP=;BopiJ`eMIAzu=x9wSs(5@O`g>ykB}E*R;j*^vj7(1~o$g^VQ?>xs7H#e7V5u*Yo{qe-3Nco)Fa`ywR>?g7(&5Ith^BqhZRC=yS;W zSFeG@dpD~;JmQ>-`$iT^-&-^E5B8n^0D^RBpA@wV?OWjtuxK7Cy7`*c;yhYhNE_yI z2l}?>?+*RDSI3_a{{Uw%9sC}cMdPmw>d-`AXt|0ey0(~}0pA$;RQ1aR9gYdbeV6+y z{{X>3biax=R@w)~n~PmLUjbmZ)XBsbEIO>2{w{}btcXZ;A>&|A z80#gN$HL;P&K8_q-1MohRA_wB{KyOpYIoL7PP08Q-i#b<>nqFV{uUA zpp;Yl&Kuybz`qK9&blkw{4mp_hfuxB-fENl_qS?!<-dRyA9Zj$V!8hS+PC(r)4ycj z0YiN>cG`!GwRqe614opf-j(ZjKXigJ!#NpafHF;RzqIH46l=nt17*3=z7(V$F!6rV z8IwD-+a?F^I}T(ZkGh%UbHUAieR%%>$C|&zUm0C%zCYA1wXJtnaQBy!Hs&XsM;Pdl zs6Q%>0MAlMJJzoX5wu>XnUZ8UobtEUF&E_O-(MoWyRF`Mm&CU^uZb?D)HQ8lM!CJZ ze3LxPOFIxx11A7yg$kp9D_2B-yohEVWMJ+j05R*=`Br|FraMlePzDsApvQkq*5#$V zN&%RbRp0~i^y)nU=s2&I#njsp;6+AChE@IOC=Sf<$Nc&pw6bo2$GUK#SeyWx zh~uU`MMy9uESnjQS8rDO{XzWeIUO+2kQ59s+fkHsJOS6APM?i7@-eKK0QVv&qF%N&BOG6X0jp&AryPO4_gd^8krGy${#5c4;lQhwNlaaF%xX zWpRK6!x=mKka}~}icNms;{-=D9Kc(rFB3u#pGc z5cfX*y!Wk>x#r2(>-7&E+F3fREZcW(Y$zjk2Y&s#b|RZ^@iqy93yu^A7~7sZkbi`l z^Z4RNC7~fC2ZGs?gOWHD`%gD9?Cw5bNg(I{0M}g#H#6ovb3wni)|Gz7%buJNN#n2A zuNCM201}`Ye~9j*iIL&Tvc67nj(Dm38>~rTsX!DzmSn@HtACGtcg1S_K=9@7iSqZs#-MjS5X}{Vn2+rQSd)tMdcgVTr>6qGN6=@RN?5IYIy}3D9#NPOT%4b}dk#8#SK1%& zOT8LBFHZ4miSLa(%EyduF{XvHtY@^Td{;l*`omlb7AOMo$Hg0E5^c zZj~f=OOg>Jkdd{rI_IuW*S$w?xauK;CRlHpEggakv0` zgUc>K7$+6=ZnyC0+}r)5O?0~hfWg3#Ke-}=pAFW%z2HNT02@;{pF4K^C!Qg%$F9xc4^Tf&!F?qjss!>QKh{@-MBd=^% zLR%Gki*ayLK_HN@Nft&Nfsu^;IT_}y_`cj*c(YLR1d#&jz>-NDlr|4;{rzf%`ibL| zx;bzPx)HUB`upR(YWUa8Zy4N2+hUe@qLM%k90&`TPWk+$b<4-M4xImr4_3*7p!NpEusEX^9p zBNp7PxpFg{91f=^vF8}7?;MLhZQso+&fuSMx}0ESeFrp)6pD`U>=SStIVA|s0D=a4 zV|PCMQrc=CXPmX)n5?Bd?dVDrJOF)$anGpcrS3s?EmLgUuHr^9s|DByD~t?~cyE4( z*wr6~Y@hIrU#*7eW4F{KWRVWmlwbfylv^vn_?j{&2^PgTU?S(xWLH zkN%JYJb87SAAMWUpKjPZj@4pV%S3+3ADRwa4=@4L;26yii%3J4mE(1xI$-t~>&;qr5zY9@Pb0$;nAHM_M=Yfm1CRoN&OpId{cBss9vp*Sj##yr zW4TF@Rw*TOwHeh)vJuMTk&j`;N8`I?m%{gJi4p$Jb`9fmf^+i!0K0;Im3`uWvs%v- zWtMwbnnjPD+mLPmk@A2*V0r3#RVF5U^YL@`W0Dx8zVN7;`pOjFC+@dMioEiJJHBq~ zpQjb%o*vXZN$_XKacjQ`^<7WHn%qP)Pi)u{?KyQLq=s)Wdzk?cA#08bgt(K=4C1emX!6cZ#GDZl=E8l~j)qKF7r#0XY+TX$7 zw4L>YKeReQ@b}_fqXyIbSEjkQvAmd&6VCvC;fXwx!LPc$0RI5NOMGAZGHTjShre!n zOTAyiE=be-X>2^wQ*i$PT4Ot8Mecb!O@34SSojmD_)dA@@g1p^0A`BzGnig3?xg+V z0l*EwAAK&YQ6^5^ee9lYIErt;dw6f=?W{lawEyw%m)V`_v6#jlUG?K zw~9?MrM0=XD=bnDN-!aVgX}=&y;t_T@RgREsAwAgo3f!Y3wT?2YAqvtXbID<~ zxjY_mURn|qk_jRt%B7jI#BA+=4^ixWt83iPW9eUq-Zx)~-UGAM9Uw_=qE)zd7<8Eq z*#Qgk<&VwJ7&WIMi%(#>i^X#UggI1fjoWtQdw@C<^sfi~nfzX!7Wjd2qhHI7C&Y>& z8>GNXlm}_&gd}B7I*=>gltz}Q-brZ3%*@+HN$t1T_0Bt1GtknTx+>i%k~rWCCLME= z_uBxKBpRMq8YZ=>x$?3)qY|u+XXP11-wX(qS!A|TS{{UCxitumS2`%CHpW#_< zzjqheWmGN+*?^>dTa(ZDSGzpxxl%3sa!L6{dw-9$csK2rADiPp1--J6ij%W~cu+!& zo^pE+#=eh*{{Y{jj}t$3!A$e5Q7vP-juK;nSmI8l#Ns*%rLNI4{*%lT6l7r2Hew+P4p zIB75x zSxMcA0}`cjxjS%9dyHrEsO@zowS-3Y?99NjkT9-6;{((6`qh{51QCD7)N+OEfO46~ z%roogX*b-YmV%~$hBsj37Xy;NC>=6#dHgu$qrTDnojv7;%#Fbcn@9yS$tOG!$4_ds zz9xnXZ!$|w+gFt>m2BgT9!4s*z2YQPjXZ`_R%Sc)vFC+idW`(o^sZ^tlvU2EaEp2n zXxaiza?&cVljMk@beXLlw z8R^b@;|KAlOX4_C$if1+a2WIQgWul-cC6{PpQ*i6sx3?@pf5DY*>EJr)5tjE2iwq( z#+z_M6%xlLR{?%fa!>IA>F-iW`|af!*h5ucnMeo^m=)SEzin^>f?kgoK=2c4^q z-h`jPSD@-BrFMBSr00H9BgkN{8AG>_L*$(Q0Q&jOM-#H7ixi$*k^%d+Qg@$Y)9Pzo zGzWWQJF7f(8POnYtJr4 zWg}_a90kvGU_Tt5+*8bZW!}SKRzDyGm=2iFb6OF2aqNo3jv>S2dVs)n##^uBMbC#W z3vO49*;fT!aI21-1Iav`R*G;URO)sr&bj%Ma&A%`PgVNh^Mg)}7Hf#sP*AA~K;Yzz zG7baz;4DeY^W-t#04w_VCJ7LllvT z6fOZH&;UQrN`l`taC%=4G&tDES^s@N>0Pxa8NaJY*qnDCOk1t{)WC(`dcCKk>+4YyLQ%fJqh&3^r*%I zo?fE&MIZr>bM?;xf^T4Q#H%qV zF_2TK1HV1#xM+|SJ2vxxnA~xWbJTOw)}HYBEKxuh1K=MWMU?@K^&j5qT9rKRWE!p#AWQmY2-il7o{{Ub3 z8m#POc>JxTx%mzVC*5=3iUvypeYRrC%u9XmOm^UU4r=g+Z^{*lE&y%`Z~nKbsc zV8?&+)}0haSN+)Eu;lasMtLJAs6SdQ^81|}6>cB>vJa&+u1Ew}L3>nwIL<+S21nMC z4aL>uVEF;C%lC;L{*+3g3mDZ@0y-0dG2iK)l-6K=SwK1357XD*{{XF40V@fjeV-u> z`@%*BM_d|NBam(|D>>r_7(@R6*Qa@(BK@4iSn=}nk~@As(waua!)``?2tRiRr2sIp zDPXO)``PW+1Y@l!b^{K-UOC74{&cT|Ew|=uWDVbUo^k0zN%Q5|V>#i7$pHIzpa@k+ zkb$%*8Q3__r3{3|LEE49j!4f>^XpQwe2uvLs&K480O!}zm?AL^vXSL7fX;as>yQ4u z07k#O-0`QF>&A1D*SYRGY?(UUP!GcdGS2DbJzy9FKg`fI{*J z5~*$u2_ueuXaYBgGGr(jJf7#j=h~sWc5|~J;EZ5na3AONt1iVNB1~bAex&y2{Pe1x zV@{tiZaLfNanE1nKn&7wHJpNPwk+ILsk`NqYsU7~504+h%zF?ByIU^v4UNUp~ zQ0ygK%faM7Cxe`I6tZr0CREyZBo27`cJ;*oHRH@c$Pe8o2cG%P4@yQDj1*RE9r!=P zoN|4*r%NVLNk2Fl<*){L{Jp8mCz^;YQZm81=jH>c3Nen|=mHW9zF>B5-W|ti!62W| z5z>#dw746Lb1~rHWyjOKK0uAQI19jTr1RMS0F6f~h_GB13)GT+Y;n)0ui-!qLi0!R zvM2}c(Y@(m5%bP04H`a)4o40YFQJ?0L6u8J3|sn4my!hd7fS{ar1MI zgpvIEPy;xTfsu2#_u~ip3RQ_wcEyC-)DgkQvHt+|8gnn3BAFFbCIw$~tZ=Z=)&D+`goXk{BldCzcv9+;-E zEThYBzWLg7gU2K5K^)>bBQ6^y!6gXeCq9Sp;-poPiv|RbyXm)|QOF01O}kwA zsZAV8Mn1 z5y9#I0N0^|Bkgj9$?55iyGifTooyVFM9Bh%0k;x3$@idlxZx}A23I78Bst@6Q_d+6 zhs=|1-Y~piWP2Y^YI8PD3IVqqjz&JcefjH5jS^V?K*iJ$Kp8mq27m>bR#q{Rz=CiG zBcEUM#VB`U-9q#OlD_%w4I7qOi*4kcyb+K+2<=ga{n=M7xF4K@)9L9=I{@h9k9zf1 zAd$xedv>AQ3c@U70fQmndk@l^=I)gX6_Y1C5(xGB@j?*Wi-pfqy!0TS)839?1sGsi z3gf2X(wOHgcNYZwrN6n)Ob=RegBolM%;gT#*Nlvh%e?^t<#q#-3LO34sr94-Wr-C4 z#vAUiCjk48d{k`~@<1dz45?we9l!edsqwYL4ZBgdeE=MsdQ(X+oB&Da4+rz02SQ4y zE=VcKC%^f}_){X>vSmW;#$O|q^~OJyI5NtL6=YUU2p#j%fCKQGn6WtR)71480J{T^ zmAJ-FI43;^wIaqr%LP0hhk?#|P`f2kZWJ>|l1E-UE&73CA06<$v7P2gVX#e(X)gFQ51Cbz&&~N6uwsci6sc2ae>1h^TsG2 zGa``{gAA5e89V`z>+M!8M*D?S0|9{nMpr(&zdn0ZX>6+-D`C`tOAffHEnwd&D~;)u zbB_G={JT(E)ckJ!yF5oOo%?lsU28j4xnJ$Hjh7{hD7Aobp8f021++Kq9-*bpv4Hu} z+XWZ{f`2?>x}V#R#c!m3*`E||V_2A<6Uw;90}#YNFPHPLJc4nGLqL7dY zAs2IF`keLjt`Zn;bg3g66TAcvc_i}O5C`A~wsTtJ;-tnW20d91a#x` zt_ek_q4$(=N^w_5KjIsIvPc!vXpfS=cWCSY>0H~|n~SG5>E)zrlBDGRCp=e4;w!iD zOFZ`Rc{a#59sCjAu(cVjp@7At+(tI09|M37Z_ga|tjkR@h1(anP`rmc`}^_Jr%KrH z^o|@Xo0uYn1e2V7KE9nRpS8V=I9VIa80b$Kt?dNFV%iB;ljd>M0q9SB)XP(w_qh%iE{n`;5D;7|46b{uT#!*k6 zLn%<>JOkV7{{Yvlnd#G!J4uLHkg5)WnQ}+3>yA6oaW3QxUnh55^ONmF3eRN4lq!`T zptnq%o~Dr6BobmR%-|F&xDrk?-==!jchbjPUG*C7(#Q(0B(}T{l?~i5N#O$l1YOdFpxk5$l6l z$kIBZ$HfR58~E;`jBRuXUuHIQz|X#VdWz*_IFU(Uo?4IzW7j?XYtuYSq@NIYespM- zLvNRlJs-9K9Wp!Dn#;B|1=y)mwf8SL=rB5TJ!+HC&O|~)ja$lQIQ!Y_o`)If^dDMn z^a!yr+JW*LO76zL?yQnboq+IOkICvGvwAJU?{3ehl-DcGDBI6lDR>sJ$& zOn?I{xK<0e_0QqYu16TDBb?=xNmY!Jd*ppjZYmiWfgQ>c$BcHzN}1&oMvZU1{$0R0 z$v*z(t(@}LLCn8wiG(eU!;{G^$9(qprpaREOG)LiJmekB0rVf0OAZmsTo7Yb3w+11fy*Xq?STA5;4$V{&iYwCXJb4 z;5qqJFU&_D$m5aHy72h9(thhcS2p3=IOzWRnrrbs@$h&2757bhHU9vGrQqdoRbyFn z`Mj~afEVUDCp|d9>00-n@K=wAF=4d-01fz&q(AExSr9289vJ5&cjJ$G{O*<+7_-1i zmib%d+E=f0>(ZhY5=n9*K&7NW2+7FLKr#MJdMh-YwLT(z1&5Tq$0g)_!Q$WeEAwh) zqWFE_>lDTBxR$jGahU6=wfTV0Ccq@*ad-I<4g-ptG z(&w{);H)MUDXMpVW;{_csPfbZr8|@_8%G26#cFAGWww(WnG@v5`B?YBuJ87L{hwp_ zziw;DQldtSAi0}aKE z;oUE(2tgRfq5LbJN_FFOdr-&V^7^WcSt#4SpYRU`)8J7s`#x}~mIb&O>Cd%p>H0Or z`wz3kHsCJP@{-ud+n;W6)~`+Q^HcbLuRWi{Z8m!iNEtR;O&J&q@|GOohDiMTR_&&< zYhw&qb&C<@Q;n;~&5_)6>G)TZS`v%1KKCxf(yJ9ZZ8ZBF`gl_9k(xyTl!KGPsp@wh zrBZDM>Lpf?7~?E=jiiB${{TAcU&S_##J$GgSzWNajtJl$-74+9{5LZpg@f);p)v;1 z=oh%-^{!cJeGNBujutr;Rgx4xAl-*OeR}l#DY73a6h6gVWGG|p!S&5=_`gL+qHCKs z0Sjf+rb3RKA5Ye>OzNtpNeD&3JAfs9dGxHCvFJwK0$9}mBYaWvTjt~*xCf`>OB~Kw zS^ztB`Ffs&{{UKy0%85y{_T{IPfYrA&~Z*!nsA0Pce>y*_v%hNXX{XGM961Tu?GFy zcO2mkeZQSZpyos`ou`t@2*-WB#Whq;xwjZA*BSYbuwIU*ZGe z-9@e@b&lCdjvca{qyyJ)Vt)>KtTq@>@thENP~4NAnf3KGVVPoO^L}R}k-r}~JaqK! zRhA{VZz!$~a8nuJdj9~8Z3o=*sw96UTwVyGe>wJ?1pya3eMtwcdLDxR z0B_KNX#B(Fj01x0f$BRCS}&<4Z-pRx>xo@aqlkh8t=E&u9;c^1{`L1S{1Y!k8b`u! z7GGLMs}<&>94N}WgR=eOlgP;&_9WNAw|cO9f3Vp3zGGpeR&TgHI5{4*`XT=S1oN=| z&i#|DOp)!9^7-A>)TtW|F`m2;iuCfO%{I@CJp`@VEBd@xQ?Pw9!5;TU=|JS|~|v@8JFNE>AI>WgPm0 zw1Lp|uXoUHJ{tbiww`yx-CZ=Tag|@}w{7GxI3x(1eewv#)95(nxDxDoso44N$A1lO zd_AmPL#x?I1hC3uHu570qH=N-lRq#6_|uHn6RFslvY7KBknAi-8~MR}^vG`9SJ9sr z{6pivhwl0x#~mUM7U`DHn|Teehf%c{1QnQaQ@=dsxClHkqWnmRM#*i9^k0 z1e;W=1Z{*8J7~}Wl+0GB;kP|;g6wSeXG+x58jBpb)}nY zgqhPz*elTTsdyH}1+ zC`U4t5rQOga!QP3ZT4*O-jL6)EnCPST}N`hTHvIFZpJ#U3Bc`xk&2laQB*+DmW<*! zOBQ4#bsKpZ0~``K85IVJD&J{p9HfLs9Ipu?^MSQjAot5D>DrcfWAi08%v1>hDy#rI zaq|)|bI@^uNa;zdiMtvQBTAtGB!QeE7{NI`J^PM5MPmFvSs~ZFMFcG`%+atP#G%RD zxdR7~4@1W!4A!$EYAC;LibFFo%Ci7@9E^?|oDsVR+~TslBB(rZtqB5yCA3VXxY>i$ z6W^~LeesGdVt3r=m=eg)vzZHJaVAg`#(js=j(SyexJgrG*Cj8SC3L&0k3S zK96uNqYn5jC?kuquV z>cIVo$g(qn7Xe#1%JO@VF~?j~KWn+MWs6et=eG;Daf=NfI9!h49R77B)|!h3=*ufE zcJ6Epf=&P)nB(inr!J=)L6cU)K=S;}o9l6T^0>BuPf} zVaN(p`W*Av*N%K){g`c9%6&(`(fI};=Sc*dk+c@tjrT}A@Z5~?UeI*o<%u-xN}=*Z zhZ!9hDD8~obDq4_Tl=X^t<+aBFbuLrKqMT5>&W1+Ip@--X|v*Q5cnSJLH@?od??o% zMx_)0!7MXvk!IY%SvH)h;knK@uVe6E?Zu<~NVShc{kwDqy1I-a+jz%Hh>Mtt5WZxp zFeN#`-T)&Ude?36x50W(i+&u%ZK~Kbr_Q)Uo+lfl0!I0F72U>qbjaqs^WvZEpDmg_ z)_^|QWeW|2FEN6@F60@&9GtF3G2Vicx%U^qPuq*)FYK|PTOSeLFUFsQ?iNdJPSR4^ zj-Lx-Xjw*i9ZYZOUvPX9`0?O>+Izw+s{9JqAl0Kxt=)u}iuEKQ9LWjf1sOjt2EU&V zhF(AMr|iGt8SZ`y>l10w-LgY>rCmnG$5h5iSs~?Fo2QsC!~xH0`a|G{?H}O(0E^x_ zu+@AQe=oq_i)!iR6_t}pzL%eoWylB#INKlx<~^z<8=!jVe$>fvZ*%9x9L~(h1f^6V z0Caq}-r(dB=~ZsStHze&bi6!l#3u51-O0fRrYq#XgFo<7yUz@2aQIX9@6qJ&#-}F8 ztb9>t8Jf#b{vFc+!skDEPeaXpXXe>znjNOA;fu>F`x~@r?XK;dPZZ0r0Lu6~MfGtZYEfOdo2v5jdm5{6lQh!3>eQ{i@zXmfe8P z$yAc39>)hgjw|WEhJHH#0EMaGohMhibdqI{%f3Q4I$WRwV*!9wvAaI?^GDhi_S1Y} z51SgXB#oz@haLX_z*l4YIe6uK6Y(K*y;69f(lzWx3y^FKGJBRK_$RWO z_9>ue%uZM-n8MMX9hedFmB+B>ze@3++A&(^$KD^nW|Cb#Xhd$gbba|DSab`=Ub*(J z7VdN-lOX}})RZ_om3i|I9X&7xJ*utKjqJ0q3Qlv4#j(f-9eLuVmR}`H72a13^0!Xe z2cSOvDy~DxCze1PNn9LZv;BFb4nSl`?MZ&Bc9O>==Yj@1ignDYcBypCL#IrE#z^Wr zb*Ox_c{UWwfOn>F6dpSEH7R6{GPC()%5v-wXM!*Z@9s?q&9XTs4IUL$n{jWL@ZW*= zuMz#RAdY_$cs=g?$klw{1Y-m?&~ekJ_zL#f7|!8XxY~JAGC&;TJ?q53Z7Z*^zl3Lz zvHRIwzFhwR%QnXE(!Ps^ow4-K7eChpKSP3$K`pwGBYBt`iDIl+_0BtEzpXmX*Uz=w zcSREtx#~^`rh>ZBE69u$jo-1x&idV9)NWHDfZWJ+%XWy zhkBA&x5{vH^vU$7ZuYd!%A!G#rB+Oa?b{rVe+st|DVD7Cm@k9562y11$i85~9nS{< zeJW4v$YX#I%oR=?W0C&oJmhiL0D@{gBtR@AVx>^XR~vSaK_U|mu`ONLMbIG1=N^yjaq zYSoWUjjcAhK3)R@_qPr>AD3Fon$@3McHX6)K&4qv&&UcCeFtjgsqg5{nm1aSP2sc< zqQN}dL`6pII7S?9^*QvY+rw*a*;ywDk`hZ5C``SBCF8=^H2Rngv=Wc(` zJpdgEKEL5u?nHM|w6fu(H~{ic5J%(d?^+RSFeECH23Lp(-)ixKah5-oZ(2Oj zRyk-j7R!)o5{O&-Ji@`wzy@y(CdZn_3LRWTh zO0NNjX29TzY`3;;d0k9Q#W*~Tql3qOhx%2) zHMugHz0obj!>*NZu7LT8hG3hD0(#_{%t*vuSJ}!(w5S9Obt8~!^q0^*oa;M8WD&FN zEDjZ~ zds15`nHs7{B>BEA}b56d%mA3-hKtY4Mlixj#bImtTE4gqthTO&1jzH=Dd)GU5 zHssWs!ArN}cf&?q#m9;uJCNl-@}}n}*PzcCucLKF-KtzPydjmguHUx+^V`@Oys{HXFPlLugy5I-xj?O(YReD zgtwVmNmk}S0a%Yed!QrRr8N=!mUSGAsrnB80IeQiXjjixUYw}OEKNk)Ps&Rd;4#~f zap-#wTKQw?2}=1gfT7gqI3u3Eo|P*cD@eaEVaNbyKE(FVBc?|OH1BcTu!*)k%2{$Za5*{jJ^uiuN#^6q z39?fd#sD3<<52?AZy}fkI43`M>GkJ|a}knH%oO15CxCiq`qB`AncsYi<>Z3O zt(*dQ#(MEjFuDlj!zf|6U~!Y24E+ZpqLLK|%OOq20F0A^(~N!;=iDUoWRS_desTs0 z2ivtc?gGBWv)?)eWfD&fP0+qG3q~BYJ`cRAcjJBD|Ox5ka~(_ z%^#Y^>vxz=Sm3Y+umDwn=5YBFGpj3Qh&&%^Qz&@B+aiAmINVfpI3AqSVU!{;hzC>2 z&m-7Ur2FtBKppZigM-_*r6$k|{-~<96rbV)ARm1Dcc*7@EP+(E6e$_O>-p1GQy@4Q z;3!=FJRZWCa#l!o+Ym4|hT7TBp!J~usVJ5Pc1`6-`8tos-iaLpA(VpH&HyS2&j;yI z%_;;$W0Q^HcXBh_5A($mN>)hrrreerSo(jSzl{yp2@(Zq15DdgjDSCj*Ze6E`N-lz z4%3wbr`P`gtxU*~-Q)xkKvGYqueA&jW6$5g$b4Yn_W<;z%qBAKc8@C&#EiVI0Uzh| zs_Iy}c|;fI3^?u3d(zzVIcE!#-*Lwn;CddEjNwku%%o)R1LZ@<6+}5STC<6V&&ucJ z%8pcHr_@xA1~9o1o(p;$<0tymKmd{eeodq1$;lmw{{TJeR&OzbfUH}VUW!PdsLJ9= zyO8%Z+{{VaI zKyJlWXk3Gq%ae@oKgXJU(W^4F-zh`J2LnFdwF8xtMw87JMGWhKk&sVbPxYwG znMc|_;rUKBjCy}M1`ar2au|$mKgfE0Xq_5))IR16n8*NQ{{YqNLq6!($f5Evx2VDX zl&8#QKYP=!2jB4Ypa{0M^L`uor)y@=WOKHxV5JF(atW1m_;NE=@SW1Zi4p5xQ{)8=7p zg+h?UNWecYJ@ZUid0dqwbHL6{I)g!r+*CeV{^$3fHo>&x{Qm%xQo5InD~20}@0*T; z+K5!|UFf)9d~Q7nrwEhIU;td_mgEucC^d_+)QxvWpXle2jGTdxGt~B|Eei&?GBGUE zs^pKm^7i~Q&%IeA%T(Tq5H>jEu+KbwJ5_BeFzIp`i2eI1Q4Fq zhlBFu=N_5Q)|`<1jAJjs#xb9-=bDs9@*V&mdm*#$00p3va7c2tthb*k%at=stJ+ba;XNW~`4Z#Y7 zla#ep?a_(yxxA=E(G+mpLxnbQt^i`qah+0KCo= zi~?7TgVdb%`cwen1E>K|hW`L`=Yl^^#(*3F!Bg|A@^QdEpO3W#S(G7J9moU zEMIwuP+#UgV9t3yl`GpQI7I~T;Y%DI{1HtnfXJ3bZ=Es^B#-f>Di$nAz%M+h(qZbY9K&VgYxcGCpgX-uJJS`AAfV--i8~Phf*2FRC@7`@u_OSLaaj~Ad!*O?NGQQ=JciL zrM9XJ;Rf-*{{U;b@9$EGOodZ&1B`NWk?wz`FP0TPQyKZcx;W>l&ssrYk}E8KIv? zdLM-U0JUY^uD|<1d`-N*WmxC&P5#GXSgRy~0|D+A9^E?Ej%a%6@b8FYn%-Q1#4~aU z8SZPl_|s=|;_rzbE4i~kW1n8s=gU6sP3*h^J05ZLuQSy&>x~mr*>{mFWMCdnE6Uri8MZ%{k~e}BFR4AV z>FZoZtBIy8PSQp|BLw^XdR3@jQ<`{*DH2)P8729cao;=-ui;%shi#o!Gif0}3G0qW zToK>tT!x=I@7pslC$>3n{=IcR8<59vW0`ja`@9erJ;>|r^~GUPS)RTIqMEta>DN-) zvB8fIg2T}Je}!7PyN(}{OLmk$&T-CgIXM3S8qc#T(2e_;G3Z81VB}}tJ*#5epturB zB4m>a=Qsn?1M65b+onTm-e%zox6m2n0g>W0@ zD~_4$LGS5Z+oW3UtdY#c(%=OQMpgL0$DtG_W)I#xx6ek1s`6cV+`qS;^X_icxK5S(4B=+X3ULZv*il=D>oHpX5`*-H2LRGW4Z^l#wz!~SKraFqF zn);UPp_c6JZ<;=`5;7Z(r_<836ey1}23@(~c?aD3Red_zRgGLi-dwp0&jYp>@vRv& z=eHZKnE*Ttb#L}^I)1e>I_Qcc0U4$l$j2B5JYkRW#Wv!|%OZ>c#sdEUv+Y)7ux&0- z3l=jBoDaM0&rZLMO12Wl%B66_A1OF)dkpkG)r*r`9iGlLG?9|_21#)1BV#x?`<|H} zUX{J!9|FkRE_E1onKqd6eq|ruVe7^Kt?vhT2hWu+JV67LU!5V45F`K`hacVOKDD>v zeNqhy)vjiZ*(JnrC_6mN54oTAdFRrPYWs>wXPw*4nYW`eWC749J^i{>l-B3dn*sc_W4CJzt9QX4 zpHFHPM{!FFPS&wgU(%M=;#9WWfzIa}aIb-nm>#`)k81jR{t1=w^H~1?gzo3TI=%JH z&W)+Xz8GbF!p)RnRx(aPoObD7G2Cl^Z=L?r42zb@aB>sZpI(*gfACM6LwEaDcx8-h zDl0bZbFpwwIPJ$imF(r!8>p4f&A8()rz{-mHLBU3kN*G#Sn(hBXOBD!_W2ZC$zgT0 z@=L}Ff*FA43{(pFTFX|F=XjZm?l~&mPds}JbI-kd*ZdWCSBmTQk{;C(%F)|~?FpJXOR5AuK)1fB*BeEgaE zMo82q|dE8<%-WvG<3EbAZ)nO(&}{_yTj58+*x z!uvSybg5G16LLA)ncL6T)Z-qtTgRRoxYacnq|;VL#Cu)&0374DB#OzqoiUA$BH9A6 zyU2Irk_wO)xZroyk(QUFu3KwjEkPhv{4%zBL_pYBy@Xnv4LrONItV_rl&VK6f2dao!Qir^8f(k=L6oT+AFjxkCh490US3x?f&o9wIJMtGMUq=rSwR^a~jDUkuz_+?JBw${-AkHsc&0 zucdI`4D=N7FN>o$aiF%b22j#3%e;bDJwfLr{sy{ViudDG(O}bUt_oV04JlQ@!t=DA z{O1|yI?&9U)ZxR=;@M|y5=hb|Q?fuXQ9?>Gr>^ap+-7FOhJ6_ zXF16OgY_SkdwEi{TSwx)E7a1AZgnd&c`C2-7H+$_IP6DGI*d}r%v5AM0KX_WB~Lu_ z?rJA2$0OxD1GsbV(uhIW71aFs$vGsP@sCROlRp)ftvTOeVi{Gs5CJTQu|9|2-kU~ESg@PPjO4Qr z4&rv;pHEMvD(;gG(UH64!S(+DKD7iu2F!c%6rYr2fIrXHrG6N&AyL$2f#W^%?~_Q% zYpANAAsCQzoQ#%lz;^dO)Kgrf*xf0&Dggc7cN5<~q59E5ne#V~z7ptv5v>Kci!8;* z$jY-S<>AQN*BLw$fO=-Wb@-S25bFL6)TY(G3{G=y##n9ET*{A-0SVBNp2QrS_OGoH zV#s{PSl=A7{nb8%eJN*c!Q^98W#7ds~9*dQak$emLZg|h( z{+$PfemYq-{+4BpgWW_t^uuyQj5lX;k%Ptu72HeUp8)>Q(nYL%HPk<`b?Ac|X_8SK z!z5s-ToSqLdFngYto%jzJ)rzkuzP9O4j2M)21ISw!i$;VE(Jx+S&zIFJ8`xSVD z!846l;SQs87)n{~LBk_(LX`d`&eAYc=L4GbY1dUenMvH*@g@HNi98=MvH0htU3h~| z$wcu6oKhS6G~3Iv{nk+2;E%7ZQ9lf=e0AX~3;zIxy4AOcEi9GHrdWKrp#olE~9Se zFYNuU-f12okvztd-a#CyTLhy<56rp87&$$wq9EOmJfB6AOqpcVEXAB|-)HmPfdm7B zqF#OL zO4%O=Uec}d2--06TLXfi9!?1uuD{{;ge`R?vei5bc@CwfZ%6Z$gGUwy3lP7&w{yV$ z?-(PT)irQZXSZoOQ>-vGx0xT>6d#>~F*xX3qjm$MbfLlX3A>D{pz_Yr3x(UtTB6)40-=o!5JSf zO6g!$ww6+XqLDd`Lhi>MvBCEXkD;uK5go_HNKu!|Yl}vVxIC5vB;|ITkUE?ksTec} z+MX4THx|Kzs_xjupLcE#*97B^I#zUd@i|yESmugAFpLiMT=I5-{8{HJc?YKzuEyfr zF}N9pjss(Sco^@&Vn;b38mn_>72;qJHj%YhZuKDgkn{~I6W~-;D)!?{2OYQdsiSP7?lT+k)BT&2e{8XRYVOtvn9Qp zi3>|OQbCOMP*dvgn`ul| z@_nWp~9 zNF53FP6z8>xsOa9qAd+@2Tj0)Ca%yS2Nz z4B^}&KiwgEhV}!ITxYOWyvbJNh_Nye@{EF@ zo^ZhW5J2_y?MmZ0UmW}|(!L@^l#V-VhaO_QOSMY_^9dtgyVt1alV3XgTK$$T{5mdH zTPdzA<50@#0}ygcD0a^7ag5-B)1`e^9-Nm(Nv&7{%fDs{hUW*Kxd$|jCzCmgSBhy; zOsgs8IaeIy5&r)|%8zZpIj*+u)i z3)zqMu9AwuN}*h`6&zuPJA2k`K7xB5#p6E(Tzo0yCd5JL!(Y_8<*Oep=a0mw#>6-7wj{$z$-wkcNPy0V#8-Ek{W(;5W ze)z09jBv3Vk)j{#b{vrENb6o@aVL`7XA;KI?HC~K2S1q~{-7mXFBSJUXz2P4P*!i}E(G8@)zHI6X~p ze+NDxf5NT!nu7J2bX{w0wxU2S<*{r;;ZGS1ag)vsdSC5lr@frM7IO$Lvfe~nIo_C3 z59SHT>DsueD>G=`$C+PU7{W)0;|xnS#w<=o4o`lZ53N)4LPEnTJk}X(eeONKGfv%w z+Y^Rtfx8(QKj*DiGCj=fgsRCAE4%LnJ;3$P^{58yT(-ILZJnl7Rgj4rJxS@;(E3zz zoslWEa#-`60h8B|e@c#dlqvh9?)!`PN%YUxy#jwBP~Bh?lB|RpY0ennD5G0U|T zN6u8K#?np*{+w5de%&_mu94u`cwoAl?v)%e6)?%2zuv*dSK7UjW_e-;Rw>3v-;SJu zarHIiAGV8s#WCS&)FAslr2AJLa}$8r9q@Z{Yu(}J%a5h%d0EtNf~n|vOsXY>5$0fl zwZ8Eq>F-anorAKzSaiV|D%kWj3R<_={JEl6&Oilv=cY&L>)xia^P_2`LFMEy-s$p2 z+;UH-_u$v=e5c{+V=m$QRj^qj4qZtHBM5Wb9Z2;ZDp$PwF%n!naI0g>9FW{~2iMfq zT|!2VZ!X_4fOk7K2jUKMjQuILcCtw!Ga-zzJ6=}GzrNnXC#U0F)heXywL4)!+nR33 z(6zfqwldn<`Jy>_k(_~&4tEaz{{V$J$kOCFVq?!J=cpLY?!Eq%K7*#gY#vLoCM7BZ z;1zZQ1+nN)_*Se<3L^_q3`1_*@y64fG3a?8%CeG_w=ND5dNZDnO}Lp%iwm?~P*BIB zoScvcm*lSD=#A}<+d^pUUQzK(-qJ~{*r-}k#?v#07eO6l6mRIK3buu zPxgIFeW;EyfpIPg3P|V&IT_C#>jxKeWmPm%Yb&cKJEOQpP&XpZTpX~&6Py4#V0xO0 zIcAOAPnl3lu}ciPjQVxObmil?=0cL5gsNklU>fJ#pTqfx~mi+BO4`m0{Vv0S2@5{ZZE5Rk{BFN)U{!hvmT> z73Amfs4k{Ams0uiwn~6}pa;sl;16$JwQj6h(1_uto!-UPy0?MbUzkuZWebKN{Ma6Zp8Y=)Pc}Ap4#DH|Rh#&^ zVxaMkM%*6by=Ti-PU&cLCqkOEo}xv4J+uWGHXvr$R0ZJn9@yfelI~dHUpj4#xmS1q zV;q17TyfXyR&1=Iw1|dPJCl33TyF&Q&(}3&hESqM6K)^_<>7s?>BehiN}^hsdwNai zSH1B=vu}=6A;?nTfg0zIbKAXG()?Q)jo9KvjDgR}&T-2r`u>$Bqh$n+%9h|LKQw_b zpmjK2*r+UYn`xJ17E#$NoNZLd&U%dT$T>Ln6^ny6RU*wV4fvKjpC0%bLNdyHPp7O( zIx}u=2XFxAJn{Wax$hhnTacazj*bpm-M?g)4m{hB5?WJ;;lKlZ85KyS0~UA zbB=LePU{L6S-TlfJmwfs2N^gRJ$wE&`HvQ>V%7T}qHw#5!s*oaK69it$eN7^h0EmYyR(J0aDY$tTF%sc3*MQ*iN8#&F`$G~484dh6>*>$(J*uh&F>dP0 zG4mdSIOo=#k_zG90eJvpBy_<3bOAV>Suo72<$V7Di1aW5G=pdbyO5-9`qTkRg$_V0 zNf>XNBc45}B9yk^_;GEsLSMJFz!9GQm}BOkVrlDowcT?w#K+JbpRr-ldClXs2k-K;74$e@YrNA~8|5Gm*D}kEH`5-n%@e zRU2~H&H{ms522x=REsmlbGvWMF@Sx2>C(r(Wm#Ez1G{E+lhfaW!j@;wvNg}f`^T<~Oeed)6RHc^v>rUJ; zk+>{tf$fozpX)#;b|S{2-~ePS00iV6#}!vgkL?z-w2T>}nZ^mh2Z9DWfmaqlsE@t85C2xZ|%l zJ;zF!9Pp&6`FRX7#C!h$N(+4Mti%J#_s9A4ptLl`%_dz*KYS6`deaOn+ly>01{e+j zQ`ZOesWygTxDqqB2fjbg=}$X6)l?rZBn27g-he9-qEh>%MFf8l$m~viedsZeH%1yj z4oeQ-PxI?jO05)Rz@|he1d-D{g)}Lia5t4GrATaWdgM?8JhRD{Jm<^w!QJn?R#!U`RMtW0Ftd zPl^-0Q83H*cIT=7bdxYykVLzPIAgcC>x_F-(c_K7%tE@Hg&j^0uVL#z5NZHKf;Ry{ z`MDse{Avim2t3Wi2Kj^X0pkFV1l$3y=B z)}RUPB8gTq+gu!uPXzkou=c57j4%4e3`tRrp1@<*^s6QmS7nw!z##x&9mIDYhx{rw z%b_zVz#t906Yf94sXGA@Tjh#MoT)$OKj#$jhJMP*Jvjt_3I6~-l>NVEk8%=A9ss9I zLFV8GQV!z7?`QQi?tq0N3y+w&0F$0FJ^fF$B7lX9EW6j`4t;u_dIS9GNjFOv^7mm# zJvm-FeLu#dLgm=uz+>+ea(06CKj<&5){J#*KQ+La|9TA0bm`La5C9MK=h z$RSl?M#9Ih)BgakO-?cuRFFUbgN$}K$9|O~O5&ztLK02EK*InzIL$`Hu?9s_2O)Yk zeg6Q$p3>z|f}l)+Zb&|$Lj6zI zI5aZh@gwm60K*IvP1n$}iW;n>}kUCcx;x8A?ujU){c;X*0RwSyN zWA*2X@}%9_{R>7B`m_>V5s}~xU3A?*JXH+Q&Jl{dMZQ8g#~oYzYtQ^eYO&3L%YaK2 zW0Ftw=9Ma%STUGxY4b$o?I!Z3+`zZZ>x`eRbzT&|^IL55Ht$^Fv(u^c{cD$+103a~ z+yLZ;Tvp$O+$-{Su^UcTcOI23nHkK}goUOxpmz}UnSfsb!m&|P3#qU=Hl zCD#NHN%i^)$9F{kleaFY zwwDax$Z~QDsa81k=iZ3ePdX@8WOl~W&QEebDi$LOhF#m6E(zch{V6VDF))=&003-f z8&7aC`Tc7L6V_5Dn(OCchE5v;E%JSIp zOpJ_o&rkAc*MGZ55HL=7$IG|hKhBO&Q)JR!Nf79l_yK|hwa5u$mx3z5S6^T6bOT+&(>buG>(SkP`Pqy|xjw~&xjbZ+3D=iapb4}34w zzA^k*(L5>Phef^d714nukdqW3g3j_0$WgbG*SC7(BnTu~wWCXD9&vB0a z)#@LxUY!Krwcmv%v{;+S^X2(~*sZj#;zu~fN8??1NPAhRpEsZ4o(By&&~|Aa4Xj=YT8_r$8?%q?D~J16A+E$%F$#mErYisJm8Gfws-G!cp5k!S8tI>$RK(J93QW2 z;=TU><0tF`ny@FUIRF*C7Nl617kO}+U_~VXnt^WXKUx+>& zjTV0cYjDSmD+tlfan9X`pI)F=_?#Tz+DV*Q9}?j)G+`>WQg6)jjW0;N*00o<{IcX_ zrTIpB0tZGQ3|DL6Z4MnCG?wBeyqrGl$TxXJ9-&WuGx=7n-@@M&>HEg3;mv+A9tH-V zAt2)*00*Zzu0ve7*6i)a*>p{I+{okxmrA)-ZkRl#RE&4VN40tH3s?DB^)&Nr9F^5o z_oJ%uAB)#ZvYO)Z;#paX6&>-~5lgOL`M0Oc0d~eW{kN)FD=~?1tF@rt5-oki8ZtB4E$OT4zodss_wJ)){&2XpQIXJe{&dv|_A{PmLs!nf0UmJ>+~QSG#fJ9WbH{J#(!PoR0D@m> zPpE#=kzK{+MwU8l!=0GJ0stdE`RiXj+G!WJk`#){`sz*lRc-C0nVYXoihaKd`>Xy5 zrTaSTe+~4FZ^ge6bjkFKy`&#N_#ox78#0lb3{$8#2L?ry-QY8Dw)E(V=3}U$rHo|Loj7=LB#_l_P z20v0Y=`%=5;zd=FNq~^(<15>OKAq^XMM(#lBa;c=llK8VaC(u& zB1YG0%+aza0FFP_5sdZv{*|}kPXt}~f#VY5D`aiNx{y>3;CDXN^Y2sj$VnuT*L*hy z%fsuv5#+gZBJgn^10LBw%CBE|w!+RyRp*K4K%zhoEuIO;eA7lkxNnT$zq z2nd_92I78P{d?lP%Ie|gxOt~29z(gjuerFMazB@)Pbp2Nk5+FUX^9yZ6FibiySC$Y zK;xfr+ z08hW?RF^|JFEi5a{w-QUhsd-H$(Lx$cRAqWp*?ZySvUUx8ZKgU7Mp1VTSo-3VgVh; z*Pp_oz3i1 zOEie9A#W}w!e>6GoDu8zSEkx(iLU8T-NM__Pnbr(d2#*kaB?ff?;!GHh=*OXfq>n) z>7VKJt^WWC___QhZXsxlw(Xt7vD~bGh#uWfzvo9&hNg_O@dx4T*3x~eNeW_+lBgW9 zjP)RoL+f06#KFU}g>nYeUz1?ZJoNtn8uj?~2<{nP7gknLkVppyq3O?h#@BoqX{rGJ zP)C2bQF6R;LG7OZ0F7$2W)0n(2AL82N-i_ia9idhk}>WvS|J%@k73KUR1Tz{OnUoP z-KWFSuCm7?c_fBqEBnPKr(dU9*RjxSydvgV_S`yhtUl-%$?MgJJo{HnSu)Vk@J4_< zHR0J&<{oqY`rtX@Eb;Q5jmM{@aegJ&?tE?H2(9#FcD5u%3`YnVRPx042Lzn@RUa69 zLzBca$7^6&ZMwKs;$ja0aohRU=Z2w+M$@Fam_n>m1)Sqx&Nu_MPc-Dr;Rh{?miB33 zVQ-}A#3Ii;LPt=ssWtezfbB#vMhFZ9!}!P@8k}Z5(IY9M`>-$Ci=! zABvUzt}>JtL_&;?BYY}=yb#^-pXJ)7Rsup>VO(X3wl{u#`OZD5iyH*WA;B4cmyyOl z4x{j-3PZ6AlYl-^oPIs4)=uZ-&vI}!&OF_W0o;3M1E>`wbF;a7fcRs$FgtUO2OsCH zK$&s4ss=59q~HV7IHv>!6qRCnvLhayIn7@|TI9@FMx}=&l0ZM7Bfqsh6LBNUZMi2b z;Nv~O^zWKrPbL*9zvs$>o=0Fg{{SYO>mbLTn;eV|7Qdb&4QHR;X%hhz|LGqH93dHltBepyGR2N#EpqU8OG(EyVaQ9;X^#?iY(EdWc zPPNr!D6uTg7D7>?#?)o!9Y3Gvnwi*NEJkJKHw6PGcLRbxW7nXqV#bw^qdp{jDDd~i zn=@Jg+lt%*Qz`oaZFxj(suP=~V2#T{U5LxL}UOBO?f^T(barj(c~m zs8^H*JHbD;<@bZ7O*8h0(PX~22WQ(63Wxsd7sg0n7+{Q7rRX0Hyes4TnEX%sF8Gp7 z7g?N{-aBVVrpd`3WFK}_&TZ2>D<66MCjGAbSMc@(@c#hq8Kx!f zmlF~FrEWK(^N-#}N5}{{P8P8E2-6dJT&)cb=zsJq>PZVG&@y^ z>A8A7dhyL;UfN5i$jcv?xS{FM*7Xb>M z0MA^GfSxOy_+t;B;TR{~iM&oVVUjC{v$e%(F#)bZTQVnqC15rKSmg?+VRBjxGNinz#B%wopO7Vh8%b1 zxUYrc5BOLfDu@JkH%jt_&%U+#IfQ2>$?Rbmts%S~9dZ zj~|@HT1$A!mOnaxi_~=Kjs+)h*zj+SKLD-2w4j^8;Q5y>QSGEVkenP3n}RXG^{*BF z$?-41ZyL6z@Yhh*{4cJ;sIM8^k=&-@0u}qNxyZrD1Eqa!@f{%vIfQCeOY)c8ocPoxiugED+dMIxrz0e;M+Z2sr5E<6@khf=4$oKksij){ zM(}0GZ!5)KACNSXLZ=0uG1CVfde_Qd6+dKIZlab?2r}x{W%6vwtXBjD$l6a5bk7(( zVCOaEz7z3}jsE~;=eN{84r{aNlV4oiTi$7sLdMR0th<$=Zz z8ph?E1$&r`S&l$IgkS_d_4zg7U)s;Yo-6T>_Kv$9$HGq@IRtBZOoBTLk}waPIsu*l zIUM6AzJ~C}{1gqm8;cLxa>6@^n-Rm}T@WaO=mWz_fRGLjPTqY$u6e^z*{u(%q`X&k z5SAcdZBvh@UY&WR^VkyEVpx2eM*{<%bI$<%E6wze+K=J4i8S=O(mZEpEEA0G5WAJ> zk%7R+9erz4P5q$$A5U(ic)v~9+>+|RCnt|y*{*i14KuTAtevrlx^5&6TRkvOpv@m> z2Vovx+~v0X%)I>G=bGjq_`l$tMK?j>-6swMg2aHM*C+AjtsjXV61Y_RCyKO(-U{tk z$4vFjJCSB>Npz@)xhb>^Z9M1K(!8Jc$xZ(N4m2j2P>6N3Q}T>$D8m^X^T##lAMmlf zD2`ZoqeWyGCv1hW(|~$cn|{^)CD8TXhdMld9oDqnNJ5n6gpvYB@;JxVsl!7RHraAG(aJP3yL_1&i68;cfO;CQ zt6DNhq!bM!e1rlBJas4AZ$DZ{b%>-w*Di`A^O|jpv&tNRfH3((0nY>9k=mh_A2#H*%du|0ks31jiROIcV+Ia> z?;eLE1NEt-o;g+R-Z3GO(SLb^y?c-ek9sTiJQ_)$NR<-$&YRUz)i)_&V#rF(liuz=IY3ZCWDp^~FQ^C*l zC;E1%wE2~j%U!_7DIuCYpn^EU^*P5iG?EzLW)khgavSdgdE|=H#wtxSS5dw5lzC9d zQ3onccbs$st}*LS!zwkXl_HVy*j$20CmF)$A5Th4sbse-BaGpfrZ7hXsQ#3ZTpKGh zHQ@-OtFF#5!OBKx2=zASg86RrSPNw0AzlqaA6h=!{oWbkjImr#-B43T(Akf zunrDM1EC%ICMvdomc83Qh=r;^XgqJN{J+Bs^ov z!E_sV1cf=x786$=CLLtKOl`?kIRN@n94f1_6jcD@XgSZfU=23v631&|HhywO8$Ur! zcH1iP7!A;a^7O|9)sR1Ul%RKCm2$;9`hSHDFklP_5l~~3lb?U-QLAir*i>#iLgyL4 z&M+yg%F_ZEK2AE|pP=jj#W38Ik`=thMrtR8ok83| z05=2EKdAj^JZFa}bAS&jeN6x(P9$UZnnwQs$4B+2Is%GOBiz{t!HyfZ6&NghzbG+0 zk+5(_siiT;CPSG4lZ90oQ|r_7$Grk^>O6p1RP8DW$tRP8j1OvV^uZxiDsj-A$FFZn zWO9~LS)|WZ$Ok>LG0jLFOOqoa2#z^VdfAy#+lkFQAbSOy3KX~zv!1Oek z$qg_dF*sygll}st+#Ls)%e4jx&TxHkN*iDvQZ81l7q_E&|*(*60D~57*bF zK3Rh*ET6)nJ;iVbUUB%5P_(MBhxu{{Br(qJIl-iPW$Pi_zPZ6)bMO8X8Iy@rPDG_P zuO}>Wr<`Msl*n@(ZGLmTdftbCZt4(B^@b zpAn|T89)aA0GN#T1ZRpXer^9uuxa8Co%`Qn}C zfhh9VX7T0iB#Zz${VKVO+?F{2nE)hk`NB0k~kUlAN_8Wza!O0msle)U+LdJ4<&t+P7$En}0_12{mt&X0o#QS5 z=N|sm4wpK%p3*x6V>7YA;PMAW?w#K&M9eeQn@ zng-%%D~1lCm2vlp&Ihi3w5Dc{ClUPtA*mOMcpGqAU9&(o5w}3bRFzx~G%|r-|*dYi{ zDi0lT#z*JQX-&Wk-eco#cpbNTAM@=%4l;#ABY99V6?=OhT88>njv^&oZ~MWy;~fvD zT70txETP%J9I*Bs&!#x4@=NB)hbUFo3IhG#uk)Y=I3>bhVUGl4bpHSj2fk|6klcL8 z*nos>1GlKpe&1TGT%g+%Z3VEUL2U8UHEmTyD}oG3*8}CwI{yGV0F{~9PnZ=!I63Zm z4rnfRuwV|-GRSgxJx`~4WJO&^mRTF$w;laxE})R1n{Gmd#t;7hTiTn55*I~ZF<6dD z5INdUdKq`8`p=Rq2F4CgwMQE;BoVQbBh)F!On2=}j;OD;*s;~tsyJ!xF;g`~V-i;s}!BoWUv z4#Le6G)nGJBLGKUG0rpWGHK6hM1><^z5a4HbRYh%X^yWXW6k+be4ck6-juHD&y~v^ zfk-2_PQRrCwT3KTIVmFTL!HE9I6j|^Hb#wn%&rQqdFpwo3WCTS4u`4FP7Z&i3?1N8 z%Bdw)NdVw+l0P5Tfwgich!@KdmHA2C$RA&R_0RlOoW<~8#nL2^{_jP*ea2(3OXFUr;pc#L zIs6?Khd#ZcJi1-=v_Xo4Cg4{%&rI|AS4;6H;hvuslO6YlB5@E*4a{3^MnEL=z~i4< zq42}vvRL>o*Fe>g9lp;JMDNlwuyOC-n%TJ3E-Wi@(CRD=tXwF2{q-gyo)YV=HwH{Jab&{#0y2W)#hXy zJj3@-Z>Bp`UJKNI%cw6nP{VdWBOgksN17%$YL10#T=vfu#}($9(neY!peZ~RQhf*U zbU%%Gmx&Ns?mN`^m~3;qcT@UyuR}M@spxn`Vs_z5fJ1s?)6>*fp7^fWgzx47xlgWl z4^MMk@Yi$N#x-Rqob|e_^Rv!*#((`)qozizzy$dR%nFWhIsAR=8b>KGIXUA6dHg-= zrts<+#-EF zGB!A4k+^4`pP%JbZqSKi*mJm@q;ORFx8ctfBRDPP#sCY*80EX1k?d)&FP5#l?;MY8 zXP>9mxmolVEBT8gyQL*n&+zhdPPk=cl*S#lkCS&f9{!Y}M9jubtAoK&la7F5n;T{_ zP=$%4-G(H4V1Ij_)Z4i&+=@8a_5wF_0|z^XamVT^$Qv`TDw%o`esBK2*V>^!CerR0 zpxmsP89u)L^)wEk;zj|Y$x=oQ1@1{I`7x2XiUWA7rs3E}Z((yRxHteP82V+pdlO$g&pzn`ONkX1auxOU`t$nN(?9S_EoQ^Q z9~3-m;;#|JWU%npg|2Vs+JAWBKbWG9+2fyoYVOO@_NlYtc-B+;gyR>v`Wa=W%Q0`U zTFJl6$z>Hzena zje>Tu`7J&Z$4&}KrE~SHwc8eJk$E70ydE;eGCfCZ^c5s`6SR3AV>1p*#0eo!A&DI^ zUzIv%?d|bS!~<{RZE>G- z-+(yjLdH>KPldBM?7tKA!gYzATH?;kDmK>r!i=tRF`je&6xlTGDSzd{-bVu>PqQap z$2iAx?O&XBzwlJginho7CsWfUNI_kO#awfospmNK{OW5T_$vPZ#RGDxCD6=eh6`J7 zbNzm%O%!} z;nzEMscU6yk#dTcYjGIuJ4kpzT+z z<7sYEOSV_T4eY?5EP8e9f0cYIXa4{NcJW%u8(8qxfjmxj^lhu(sKL){fAb>p0Sd)JNK zUp?1|^`{N@^;@|JD}V{PlNcSnhid5by;@6GEpH>jpyz70C!RZywB*~7NvYW zCFGB6xA5(wTQkRP36!fHfkqo02|m5+J6F{$w7Dgb?)SJLn9u?jARG@&@z>V8(e=Bz z1f*QdVvuBw#|%A(O0L&08IdM=Jj4elJh#;Q{&nP7{RW*Y?pyH}h;DWJlxvr0-~gE7 zCveB(#%ng~bbA>xxW;z3FZ8Ld9M1tQ7>R(~z@A4K$n1HhM=D1U`=pbAxz54vdtl~~ z(4e9{BWV!sU`YNPWMdt%&(?z&jj*JnVM^>^$Le#Z7i4)7R@sb8zS8xMf$zP2`R`U~%>K%|quI zKh(RsJ_8VVQaCyH>FrU^F7|laATI+ak^af_^{p&&PFEi-%QSLHw{vHajtcb8&LA#YwndiQHVwy)RjV%{l zy3^(c86GrGm*s4M&T;NL`*yB^$KrJAktNIqWlhYigo56rsqg+panP^NyX4yBsbi6k zQ|*j>YRCpw8#rzmNjWUP*YT=I!K)sNr~FEWXrw09fQbRiXXf4481&=(n&mzs`1Q4T z4V(~18Wl0k7<0Jv>^f(us4b)xkvK)z$Dm?KVUT(Q+w1RGUL~1?f;h_TQJiiV&POEn zt>BEN`F9!NtAFhao#DL041h9|kEU_yj)J%RL$1kna<+Ox$a&6t^05>paVdS-xUMaK}7;zol!-easzRhp7I^+CA;x z?HA!ITbo&7gz7QKSSeAJU;*_jk^vs$HTs#T&GwCEUVMz9ZH4 znWKgFNO~yp&J2X-KQE`b>-f~JK}OylJmenXzNgZdhiM0U1yS>r;N%WR;7&d1_z%M< z8)UW9i)J8I;LawFOsVf(xsi9EJnmzq$9Noi`+bcbPCdl34Zx zepQ_(iLE2JHrBICeRa4NOJ&}mb>)W{$7)0xuBR9>8$A{#INF2Go<$u_cng!?wM*QG zxv6m^HlOkkn%)9VF(kn{5hvulO*tq!oUwQa3o`%e~Y2|QAp;N=g4RF zS-59bx7Xm90!A9&YlGOa?maR1)kFI(YSEm-s%a8Pgby^MD3s(8jErZK!Tl@Tnh_*S z!{^K6AcM4H^Xp96h(CBFA#;Em4U%*8>)yUx^qkT>8vFKF)&9{gFYIJF;hl)-oB_uR zO&_w>ydQLWo{IR#Qp0C&m3xm){Y`tiF^XR?Rgz4SazWe1F@ybhrdvAs%hHr9@C-XcHgsBzOp#}(9$JY{{VL&`PXnKjAxa|1D;0|TKoXlA5WB9$!jaYJdrYa z*oHdydHvqQ@e*loVl(yypk-$LCZurD(2oHHcuxaWNJEE2WB~#`$K*0@+;A5pxzW58`X=Ev>=nZoq1k7W2-A8Z- z%rHONub|R>&l!Eo7{S0|`5^I(_w7z_xQ`WGT_G7$3xA z1B&}KT18oiED1PZT&Z#oJOh9T>)M`VcZrs8!V!W%=Yhw~jzAUB3`2=Bscnx0@TcwT ztY{5ypnlmt6^~PfA>}@(mSzi>x{gjV;Nv8)?Z#`?z8`o_!^MieB>jr~U?-WFyIDms zMqV?upeN=4{{R=gS@BnZ^luw!zh&`dgjewg+@@8|(iZ`Pb?d+$)${MfKiH#H@Gp(5 zwSU>q#Tt%}dpgSN8##odDBb0UPnCmmGDhx$wRY32r@n+Kr=j)Vh5rC-x%A0XOZ}uY zGh;Mhqh8uZUfEb2pEVEN$vsr{uSv7eyglQs6>j_$soLJzPFTjvH<=N~Diz1hgmQjr z_;15sx3`G=BMW$U_SW!n>vqaE4MN@#1>{N&GC<-`K*$F z;l3GL&1++MX*%X{DM#FeSQF3P#(H--t9lRZQ>pk$L!*As+BLcCwZ*%>?Z&xdW0qmxcKm&mWZ=j_k#Sz);?Dtf%A| z8QY$q`*-iiu3y7&ychcTwT)s6e5^+W*-GHJVbBwX_s>f7zY%yodubF)3*@od|PBD?`kO=gvS9T*(e6)f0lH@FGt$~7AA5P~P=~UkGO)%}9 z_rozE!UDttoM-gu)3~YvN#J{Elw3#tj)TihrvcQ1z&%F?J*kL%hm2ay`<$ znEotykS6uGlgnm*C=BvPPf#}fb6wk8M|D2iZNfIlCpr7wPuC+Ou#GA1 zggul2+_1us#4ZPXt7ndT*I#<7>dSB)SbhDuz!}CsKf|16faq6cc@co+-vx;W1RQM~ z_uz6V!%~{wT-|SF$!0mg1&`=*C=$!|g8bmNBz?y%o;c4PaZ#k-Y5^zx(T9iZ%*Qw^ zIvz%SMN~vq@h+Pdt)ty7oZ(Bt%)clK#GEpfJ&EsDZPGnMM$@FaSQ(|TgDN-(+cuIL zuNbKHOGduar)b==%LzD)=X08_04mC66Z4L2vlN2 zcN;Rh6$G&44{YNix)`R0>PSrPg=E0VZKNq)FnVxDdY0}!Q6-G|D=tm6pmOA7Kh2&y zpRa1*J|uh%KkwRK#v-2$;*Pu)FF(AS__-Li$wS~&=2-a@fB z#s|OY%|YPDib;GxBJ&82{tWLWUmHjueFq->DGerk2jZ^?L3+;}{2)rmV|4q%B0HfS zv&TKFiW;W3@Y*3~;mfGx(xfHj(=H-1TF=K-?1Y}XanqdF)jze*!i$dw>aDG4me2i_ zsJk@cJP;flf=J|N9R+;d<6CzS=64CZ8_CW(=K;O=IsX6}8o6F@Q#QX6E$50!PDS;;3~Pbh=OZH-_3d5}s_0N^3dwO0 zatUQQCt*Lt2d`{YIzFeVXnt&ZbiZh|MjmCY$S$f1=K~z%oMeujaoV}+Qc}?Agsrjk zM~hn1S@5B`&~B~nV0B<#Fj+(KgN~tx2L`irZ=D(E4>FK4q4IejFbDcpAHl6J!`~He z$)CJS@VtODB1S{0ZTWo(kz1Ex0T9P~X86?aUY zOMew;Va(Drx1u&7o8|^KAnhM}k(_6>ePeb100fV}wt*xc5^QC(xdEe|D^o0TgU&;* z%ERf;t#f}BKj5EF@GnWxd{X`~gI!oP>u8qLTa?NiQ1e)dme^{FD!uW+p)Lht}`vt^ZW&PeJ8Nc?N1w(y>( zWh|1|G%hXx-WY`m?719(Dl_4ITXFj=aY)cH`Ohln9DonxGsk*Pv>wc_tIjsMIrY=8 z#6fP>2H3zZ$+tTW!137NVu|#d>5bAzjUzB+JgMJ~axzCCjt^{CM4ASs^2n(TznHRN zS)|7wUYYh3gTuO_yNKSZ{|G-(P`PUjP)waui))<$XORol1t zM&5UC{x0M4q}EpY)g*@Q5xIyvkeM1H7dhvEIuL%fq2oll(Df*#xP!@Cg0lwSk1VLc z+B+Uc)84am>zm&b_>e3%&~KgFF4GXvpiBTg82((E#Y!o1TvB@U(=J<|hP$&Uxf}`}e0^>GxkL z+QlCs7n6gIILFJ8oF0|bn(lD8$c665l3H~wxF=Mvyr5Z8--X#(8TaN@&{3Zc%;AZ^W4M|Pd+y#opMQLY=eM3@zc|q z<-}7>b42aJRB7_dW?9nbDQ1stAXQZe6Bz*D^UrRhC+ky7b1bniS8{Mq?;m`GW51y1 z9=NQ}52Wx&(0=h+Ndrg70UwY-_0LXyD^%(41f)m`GaxDl83T{QuYX!p;~A@pvUKFq zE9zS9%yBcbqztRG&J1KYBayWAKjB$+`sLoIcjej0Bq)Vr137KDJBdB9$^NwO5m`vu zbcrc=nZN+Q$@1s#f)C-I{L?%=rpV#uo*6vJ6olY}R09RaJm>VRYeqAgj842aG-8|EJd_Xs&AHAOQNiCkM9z2G3#7a_rQN0 z>GCWWJ_+%9$c2_zq_LBq!*BAh%RE7it5b2_$LgE~%Pc(k`%$%+82LtY*|HCC7jHk-zc+5F_xzM!W3{#Yxjre`#~Q=p zCEd8F^DV=(FC_IJcn<#k>dOAzpA*pTn_GfcBYpbu zq2{oa2po4S(DcPry3loHn4{?$vKRg%V=4eTa5nHyPIwhJsy<3REPA4T-rp2$zvJgs z(%F6CMjqMuIuA~{sgw5j_>&Tap6g3y3Kg5|=t;@r0|LB&=~po`39L03)jGG?T&T#v z{vLQZ`kG{s6_b6E2tnr=&l$+i zy;z6-3LoOkLVw{O@chi;H7jZ143c@CZgCQ}0q4+>kbQepuwDrV znLMf_LBg~A`$uec7(HlJYSO#jDZRuWdvuEPxa|nd^P_7 z1u4~hMy(~6g)}9ZB`G9IvI80q;`BKu10MaW=K1uij~D8Z+i6SoxtceTQVcf8*Qq%A z43Di%;gpw5lJ;bZRhsdV-2%SWgJAiFJ@O8HD{pB#8T$%d52dF60D_EaNi31yct1!c zHrjB^3oziZIl#x`Pe1Td7eWp9f~^kBVtD3%nEeL_9kbTHXpNOE+2itzWx&gGkbjm3 zdX;2Mp?34O;J6K(1Hi!SD>qu8{;5ss(e$|g0D_T6vAoX%#g*W=xpmLJ0OO2z?@~qo z00kbkMESf4BZ7W!F6@#4?~mkuweu=0QNz07cEVKd3m{Or&re3_Q7e6#0G@j8P#Y^Q zn$o?vlSbW1ONrQyk6raQDMkxBk(0xvs^(g-U zf`@o;q|W{f))&a-+wE$qLGQ@PjmT{~c58nmb9!3($r3cQQ~*S|ErvoX9KGwRqs;Go_Ka${Ws z#Bsg>^4zHm-`yGO!OlflAGgPVnsrg6Yr&g1RtiIBzJH7Ad9RY3WmYM^WG5;M{KF@Y z^V*ceAkHN7NFkVg(0Sl}dHQst>oX_nkZ0FT`*nOhLh9DuB#5(M=Gjk{du2h+4`M22 z{keV{HxsvrqalgOwFe+~{{VKrKTBp<$qb_> zJOk4MCz?L9F?~v#XW0>c+P@5BkQKStm^1PXkvmA^I0rpDRPlb;pA1uB8pf)voytz0 z#0>pCy=&s-@EYK|oOhlepF^1cLxqui1u2c%`A`O-Bfk~Z$iBO6b#{**=r#u$hbi4MrX zDt(VpkMX4OkFh`5@m){7Vfg#-^60|R_~T1$_-)%9m&xog{{Ysj7T+Db08}D)$3|G# z@b1Pj--aZ7weSy?v&6_%JczcY22BZ(i# zKp~W81%M34(~gF`Z{kE93c*fSpP8%b5x$;5k ze$Jm7Xcq+qr;2mvHh%Nxx3U2syHq~znn*5!vWW5`gW>VtLbC8@SZ9s?!B%3 zjBsFUIuOfeA8tZ1(2qg&6)L@>%n8(VmK#KXteru08#BejSzWWCecJY>i&laZcsbK8#9BWXM3K3ukwF+4Zg6A~PB9Ooa( zzbAZsb>fXP!&+{m;ay_zMvo}J2Ia^xqHYd~Pt1A@b;muc$aJsTN5uBla!Egkb%mI1 zD-dZ{dXvG(`>T$*=A5xgIy4ww9K>Sd%}L!Kx67nmG=xU6nMeVOI6ZjBU&5+sS~cTo zfy6+sohrA?2?RC|f?nUQ|Z&!|f6J8t0Mb-?Ex>sI6T`}m7x zWn$L;EY(f(yNQ$S4oa%yX*oCq@<OcfagumDurbdSdrJQR zf|h(mO+NZr{7ZiF+W^XsJ0X-4j4wQ&<~=C-#Z22N6qL@hTz~hmTf%{JQ=hB#$-) zB%Zx-!1g`9l)k+H{?4C~_98$dM-PID^Wsj&JpL5oh@F1abMldr zGBO7o4^P&S<^8}&6fq3PCz0>PcmjUj5+j(T@a$2tV}zRYhp8Zz4-Q|)Zm|a>Io#Pj zN3iy)c$#tDll4lk?4IH>xgo(oHi8Gu>&LIwyvz30)rO7x6?|5?8`I11wc`M%EWf*8 zIX(MUBwx2jht*X^hdM3+Q|6XZ*~T-BWMpyPywCRH{jUP$47CfF<9&n=q~7;NB!yPoGgE0WWg#d0(4 z->1ELU&SpnTiH60S(IZVlGyGs-2R}~mwATXKv3i6&;I~gt`6$Q1};36E_)Y(wNV|2 z&RG~?m3~lh*FVm%JZzE58c4g1#dFB#)A1D_fVE_JmKpkiftClpbI(ufQh2%iqi}7Q zP3EX4Z#xJ-(~8HJmPe?nb5cvO$Hq)enSSqlpT@dx36LMmiy)ynC%E<>ui;#?#?nX* z;LgV+`WovzDVSGn%KreWJ6GlCeKY=g(t8n0SsU{sIuRQU$^bjY?c=E&et(TYyd5-YR%i1mCm`X@M z5dz8^k+<0XwQgA2*@$w&OkuIf86*Dy)r!WlycX=Qzsv~0unU3cMn5{)UovR=?+Upi zx{`7E;DN3|fNhuegXPC6J$n#)Rxd-T=tB~gm86)3!hFR~5sYKMYMLSu z<1SbrVm6#@>5P4Q^ForU5q1?nd)Ga&>r%lQsu40FQkzS3!5HiKo}!s(K{+g-^<%dO zk%D{vU23J!Y2$R9?shpO9Bm`7`S+_kzCs6-q=F7UY+!V#Hki?+x5x@Mkld>doR4}2 z_9@@ORreyW8Qd~C#yV!Ud@1omTkr>i{8yxSLTGH_@s*0{TC3DPw=Y7#!of;*5nLhwtMICBz_gG8k~;jkC@=rEhx)lHY*l~X~<2v zCurt8^#FDU+ofN%wpl=J#a)!1xC%JP9m)6l)YiI6d5iY3iH~GB;Bm?BYf{p|K~_~k zwaE-uoDSdpV_HhHvCl^@iqY(64JEP#x@=N#3mjvQU#B$~)3XTy3o0-G{{Ry91N{2e zMR#(nra8(pE-}!sUN|24sLi+V#LSyY>^xzC&r$h`$J)!e=|eB4BMxW;R_Y;$6UZMa z`FnNmj%usIH*AkAP<`W&25Y8kWpZSOGD;7ZKX;D9@$FE{V!#ygLt_pG?ih|w<~w$! z?b_ULD2%o_x3V)xd5%LTVmM+t40ooB2A?R(tQ3Xg?_(Xw?Og=6DK3&~u5b)zjpciK4l~bsZxBPtnU8A%MJQ}B#C{RB zw3|{(d0~NW2@yvl0={FAGUY=Px1q@7RwccVGaowvmy$Rjp5Okej!h~l3G+9hB$gwD zKhz%eam87tj!Z^F?c>QMbZ2PD*gkBJBfP9+c`#aMcPv%Z^X1W_2!eR{v&at-N zmm5jR`A>X|Vzccu$6yFdsmNk+mL0M5&1+dOju@4cjJ{msucsBsh@U>E(d76=g|t$& ziI|{^%n$Pu#t+I!8OA$t_);?ss&@q{0}+gq`1Jhh4T40HMNE!POJLw0aro593pdSz zB4PJW2PeJ{T-O6uKC&_!Jj)?zHoe5o)DIwFiP@gE+K-^gLW79uhT8%{~Gk+=X#_yag3_37vbY7TcR zk*M7|Jm~B~cR3w;W2qVZszuZi9ik;=V1MPH+I{|<)Nh^pQI2Cc`=k@!Is7SxQ#+Mr z+Cvk9GDyyUD!7@+mX>D7Tm)r2FWw~gBy{|0TMKAnen=`h^N>fSQ?yjwxi>LWjmj_q z>QB?@SFBxL2$;4A#s=O8Jmc%uv`E3S{yxobC@Hj@835pWW4}t~?=NGX@x-VwK>*`| zPdVqOr{i0<(ug75B0Cv5%P}YqOoQv%x!Z@8ju?i0+nJnh!0bM?ycLWpHpNAecl-0_8-%w zYU!~VuLM@=Sb#xMlb>C_Ei`{M@!dr{-mjI7n9*cyqiJS5ARSL6@Ot+Asyppc$47{^ zw{Z*}X(0gN`sqvB?HEZ2Lk@OoChAs%6_D?TAL?1El*A*N-99yYbwcDAm zPV$B&K3pXFYzNbjPo-$GhJDuovH&P^o-^0-?@Uz)#4#_BGI51(Pp7qO7G~E{OEVpm zEgqP$TYwJ5NcMm;$-wpJH7d@=Ji8DGAnpSL(;oE-yX6{23Z!-ZGBeX3)7qZOBgs}? zfCeKWx#!5b2^@ZWH7Qw+_r07E-(SV4wcDq9#|Hd5GpwoG~ME^dIBxS1#??syZk< z6IfZi>r=88I8e!tx~jQgeRlWynq;yl zmkN*UuJA>}r0aMop(<{{UoGXNfHQ+x*kO3gbqL_=E>l9?tB>k01f^$UyXnEWAX3& zBAV(DCDZP&g{9fgRR}VYCt`hi9xKr9tRdB)lGj&`Dd3fGW0^#VPBERQ^7@MLkBUFA zkA^&Dcm1W{BQJ*aaHNT>({eKbj1i3BoM#5Q<5f#@RW#3_bdTC|#h(pjk4*idd_LE< zF`z}%?2<9LI~RzYKO1=;TJ#?PX}%r!l=u3#!<}PI)S$hMSV0ctmfLPl+2SX1a(b>Y zj`i^-m+{BrckG>{J&(nGF4y8Gg5zKvr3Pk(Fga9{Zsa)Vq+oN;O7A`z{6+Xr`$pWw zdGK4rT93n@6|`U`n|w?!EP&*Qrw0r({4d(KQcPDqlhpnmO=ISHvP#fndXlBmBc2F+ zXK!8zu72X&+06F$n2CmWZ(MnR@$&irMtIL!&0mk-5>V*@AnPob(QGl|snQ8rso zoU5>OblZ?yjzI0xsn6c1t=ec}bh<_WFieF!3}XlLBZ}@kQ{YWQ!^meyRiQzVG&zwU zu>^Hoa1QMBtP9AEx~pGc#^);Wws&{heR({6X*4^YWj(UP@&4_d)dZS!9%?INdMkXT zGCJ)ff535Fo80b0_Spjl;hCER4E^t@IOD!+mhnA@_IJmdDIH9cNoC4{N0>JP0r$p7 zwRPH!tWt-HQtB9okUMS)GlScbIO$L_p|bO(!WP;w@-QTjc;^GIew-T4y|CP>A}Afd zcmQGw`Y84cJNwn^h~6^ODQ7Yg`?v`T9QFE8 z27I@Yy{Q+436wmCaufqnh}h@sA1I zTxn)QCA_hcBpY20;L31)Fh)jt*5olIrLY!ECy7ycOp_S^Fzed{ps zc{{f&e+c&L??;4glR(gm;(+$S5SPwNgXMgL9l4Yfx2R=6pLSU%(zudQIGAUx=OpvG{}G3ymjMDI9kw?uzW&RoG|c zE6;D|UjY0~@O93Gt6u4vl1yi^E+h*Z9f+p@`m!A46Wi%uqY_!LMmCZ=1wT5nU;rP0 z2_HHT20IWFkj>xF>HQ z40H2(_xHvrG+PMHpFFSSg^pzoan1<&NpG)jty-NtxdFIgv7{kDZM!(*Bz5%1xUC-z zM6u~NU%825^OZ*TIVu3jBObq(<3QA&#amAYL9W@$4y_auJgTS2C<3r2xjl1U!|;># zjPcLGeKt)ZdwVY)cs-=UXgdC7Ra{`K6CAW`0qAlL0pk_GXmC8!Mxo+pkb#ZaRqAn` z+;{6;#-DE2)}Bkn8jJ@q@7k&cahB`ONf`WUqKRz!TlQc5ru4fzsN?;YJWF-q9Y%EW zAgVWZ&1l7J4FO98?HkMP}OcXiVpq5^no9IZ%9P$XR!^1xt{w4TV z!a8q({9&nD_>aQ3+NFimDXXJB{*3X@fY#Rp?_srem3_klv9C)iSH)9aXO)^O;c9v_ z>dyz*n_@#s5ynV!g19|SGr=U_L?bH@` zPa;~gjz}U_>&ZNHI2h~=byglHH#gRaG!miNm0vIf0Ci9^gV*c%*X)%jPBFV$ABa<_ z7cNt(lH)Pv_<7ALmdj+Z;Af!r@6w=@hMo`Y1&t8~en3EM@&MfyqCyFb};0fq>+K|ii7OJCS);^ zih)pu`=gVPKO9xT3NtS3GT^8MfdPjkejn7*i&*7Wa*7C0%nKZ^9=*Pldq#rSDQWQ^ zv|Kd1cE&<5anAs9r?v-v^yw7kin2@{`6Lx#&T*gXQrg878im1BBq;>9oA)!=FLR2u zCBFHx{NSj@1mJ3pdI}eL(le6+-V#TSz06#&ELj`J~EV z_hIYr(~(+NGNjh1uPz2K@?(;7fKStkw+5dEp{5T%du%(fSZ`oBA-fKHcNN`B5z4NQ zD-}nb*uc|~0>Txx;Yu#mKXW{WC!piE)|TQTe5F2O737vAj&teT9+i6ILP!@TLh-X@ zShg~9K3}h6>ME?(DA)|r21zh5`6LhFT=eT*s;Zj3&pK469nn%57G?t70)k3~5@AQT z(DkWq^-D!(SR3ss!~+_!C5Qv3(;a%&UF803uM81{INI3g0qQf@`ubA^+B{xcI;+Qt z7y;3H^X-btrA2KG>Bic$TfRwerJJx?D_Y75KBE{w`P(`P4{7R5vgjOtq% z^ug=jo_MHq`FHUWIV6yya0)rX{JlXn&+X?Sih z%EIy-46pe$_OFfnTd0o|--)kpRs7a%o@qNqYvG-G^w{aqvo{gyc3B&60{yNmo|ww= zao-j8zl)=j{t}Ds8Of6weDlVC9QF3ietX7My{;k>@;>8*DXKVmN6c#YvrsNGc{4^> z?j@N>$m$Pn)W`8&sS6nG?=EnsC9}s-&JW{MWQWa&lgZ=#?2gzJ+je-N25bY)anM)9 z^E2wpyzGfyYL!6MO2mIvI$!OKYYZ*Kdmd?}ZpLzu3`WH^VcY%FtrMm4SEo&IhsNjAz zTxt=p0NH5cA1BRW5hvIZzy7LhMUnb%Z|=r2as55TAYU--h#YbWCo9K1el*jtx!-ar zS59)GZ6`sHvB@o^#&+Oijy_|P&+@2lG|eVu-9LwXHzO4R!|Cynj+}8;9@$+-nitF` zjAt0{k3ss=f8*$W?MNL0wm2M&pKniUq$e_jz83J~y9vB0;b~a046v?2)`bVW|l)v{P)(34r84!jwl{73zu{0Da? zmuar(I-EBvs94JxM1LwKUF^JM1}l<12U_(X+Be{?v+=rr1D^#=r9#>T^!Ilye1|zmH?^U6E?R7V< zz5@I>61kJWS_r{lrakBsdT@LGywzF%0B5g-?Xl$W9*(DA3nEV@3CE^*{{RZ>-Y~lw zNgIN256lQ3-Zd6iC`bc5G1?9|?e(nMOipj3IR^ch{uxhjzHfl^sLo2@+)Ioer#YzC z_Ez{^EPE#KO}L4e0ut&_9|t`NZ{;fw==nA9)+k{ zq?c2JZ`m8+EXu?F5etmxb3fbUJDccE4_bu&#oq~-22TxYXm;ZZskq}khi-eGmFSEJ zln49As<6iF`Wkyi%Z1u@@THGWtz2Us!}hc8d3?XIAHqUByL}s7Rcw>DRBZFcNykiZ zDmg!4&xMf!kl6T^)<#@yi&V;EJba{Zd9PGp#_Irs9?&@C9CR7{>L-uNwr2TDV>vH^ z26+S1(w`)I0;@ID@`*oTZ-wZ^h{?H( zwlmQ2&ts02>vLruLZ30nF2nAIJ-Oo@DTe{_17xo~&#q}YaD4;YRQ_YgrTu|^A4-MS zR`Gle#|Lx7Mi;4Jp z;b{vPJZIu4x&A9C^O4js9S2JHDAgV{3b;l8pPD@ zcw7Gf!909E@v6t;eOIphHGm_Yz4}yV{t3mS%MROrh!=#p`Pk{-IbKe81CRdzReQiJ z2oV5TPH=hxI@Fs3HVG$wNL=v0;A*{%KE-`*uSR_Q{{Zk#YZWBgc=lt@Fa4jKaqINQ zUWcVb{{Zk#Cz9e-hsXMH+1^byMI-1#WANs_h27;dtGg9t004L=rrL8O8FqpQ0D=fP z2S4ZVqw4T|1@+3S?H@M}_$MXrOHUtZBm@5dK60-(%N7PZxMdfWI;UAYcas=LB)rj>&f5CAqV_(|i!m^)~OW=sn#&8=K zEwq2*#{=tGSEUF+w2!6Xd`(KZgdpDM!*`S7*z+J8P5@()I(6%sf+v+=bzRIQKQg&1 zxb@GqYMm}w<|Ur_%5!8(2vUwmD-)Ut_w_Y*=k)%TANX|^QFUMBdO`X9eVcks`1#9Gj3Hm8+zv-;q|UNuBX~4Nt0S?bD7ku zm5wIbxIxqW=B-EKJ9uuhH_nKKQAyfKKd<9U7K{w&k?lkzg2d;X@%mG(^aEpbB}oUF zhR#pY**M zCYJ758dX>m1c8yB{{a54di|;Y0D^5b--7=D;F>=LZ0wp?BfQcj)C_2PwDU9P80vY> zYqJjpRW^JN8sevcrwUxZ5%NSn64mS-&DMvnqvANuH2Hu}e1*XSKZa@JL%xb>5`8OE zO{@bkvyp_j`@{{tpW|Pn4dR_ez}s~u2|Rt!c*YOXn;(gOcxR`ChpGi48G!C7QpYv2R}pa zU!yCp-W;RIzcJhk#Epa04cmCJECE<`kp^i>p;3hjr_R`Y7Pr3a7IVBJvsI5U!#qElqoHyn>vw}GFnHqhCc3b z^!%zhC5GtlO*>3>BmmE48C-PfjQ$jTNiCRvX}7vRI-365&H?Tha<=FF)>L=oj=W=z zlna>Q3?r0$obsdy@_zPu9+5poUsCk-yX)ed-tVTJG)nX9giy#aT<37DkDp$E!V2vYu#_V`gjC&q= z=e2$HH-&sXJnGHiPYuXdplc-S>GkVOy6_)`BqRPP-wnvTZOxF}++(kNXTPNUjl+3F2LKf)gb-F)}n5768aNFoipc)%X@F9Cj|S(^S+;!x2%cu6(@ zLlRgie%a@*UNKodJCQCl)V4*EWtg4BFviuvz&%ONVf`!a+mC^s1euhd2zy}>T?hbga&&-NIHW<-Y3bBk~FfbKy+XR~QUxObB zZJ_w2;jI(J&_Swb+KlBUNap!U>?EA}?`K)_$yDqp9K6Z{fYGrQ^D5ylp2lZ zv!~jpn{;PF8sS5!QaL*_f_iloG_Vtdl$%Fp3oxfD@LKMEX54tv&r!aJX{j&TA_08( z(`z<8ao3+(*lTBzKGSkW;&(C6&Gk9;HNt9^tEb&ZHkMf+`{1|UBd65YUEpnaUB)e+ z8u&QGWq<37EshtjWF#_3%NQVu~C(_Q$UJDVj`XJ;ga^*^8a#T5~r7Oyh1BGTSG zyU41?lY__yfs#EdYfi%N-MtVDkPicn{`JemWQujbWnw`94o@}F!!&BDnCdgL9;UI8 z=t5T1-?F(5fr$znDZm6{=~o^i*5V?8S&t0Ok^$rf{0(I3)0ZJ)jf-dH^dsx}n%0X? za09>=JYW_FjCTJ3>((0{q-5r`Gj=R;EKx?Fu5v&HxsT?_7Ewgw%}RXNBHok931` z5;A=aM6VzPlVdY*5b?BU9E0_*Q2miVXX(FbKaIM7hZ1QlH0yld>vw9SeXW`fO6P#g z!D9gb0C=8piq?fET70PT^E}3$S%;P;uE`ev0A~-_^Tz)Gw3W-;crpld-2&E6F85i~ zHw#!!G8P~(W|N*(P6u<^zMk;+{1Ugp+C7nr#Xc|bE%oaz*(SC~;DbNxs2RuNPc`(e znWEWf+7+gc;L9sb7sJ{$y1{L25fR(k#Jmii22L_b?oD|okN*H~?}Wb%byH(;;yFA+ ze+KRF=@!i_aI)~*=07PQk@Ajv^cD1!@N{U!b0mHni{kvxF|OVoO)iOkr0U5((bHYOb9MO&Arz+ zA~zgy+%^t7SK69C{1r3dhNFDZUTMB1v5W2rNk=4wGT;^2 zmN_JKJx2nc<}iq0ddC!^)hTS^Iufn$yf^#J^n%BxFmTw)loP6-6$D9?WUbrp8=OEzo;xo3m!jx)6P2kG9kuMCb#e9A{G z6o5y~fDgV71#XWzy0al#g^#pj>V{rTJ4GIma~iWiiDg6gkFJ zj1GN1oYZYPJd9<)$ny(l?-Ryx>D-F5XJI7pGRW#9ZkbG+`)BZ}md5m*o`VeG4*P}N zPYcdR)c%z5alHrHB^zWp&f}FN@;6pNvm2wRC`VloNbc9J`scE=d+L+Sit)y5S7 z01USt$EOvWM{=k~DDvS}+73rn=OaJ;Zobt6eDRUH12|wfKKVb0z^QL+B!&F8F3R{J zj|7g*ih#?tRiev`Wk4HFM@%2ai1``RpHZ0+?DLp6Qc#S7NAs%)g%(VxRy+XxG28+5 z?rII9GxL{V=NJQ={{T+;sV0qgn8F^JB=S1+$6rnbYK~b=wmx)alyC|$1zlfv(0zR= zk&&?ZuBz?`P!}6`{d@CBZkb|`FljvI*jW6drgNU$cdGvYY-thxW&|C)C?~MUJ*c(J z`HKk7_-(AQAmy{meSZ%0$y}}1?#W`nARWm3J$ijw)#nQAOUNg0aZX z=4_TZdk*!TZyJf+ zQMM-=_jL!c`uldPI^Nrvz>SKdWlQ5E`sd&LDh(`;?Fkxi{$~rgq1zz!Bi6Mslj>{O zTgJ93U5sz?vB(Vk_s?pxp_6;5;@flVkl?5#i9N@2j^eQHwFgbmF3d)}K5>wE#s~Qo z*mx=k>?McJ4cM;IK`YRb-ACcpm@71WdH(afGss5-tz!z`*tx?O#3r0Kq%-`7J&ec%tAkA-KPa2+Mq_Ay7$f2V4*_ z-x;rew;n?;mT*TQhCX52Cccvmr8u9<99b`En&KtqTvppCTqq>`pbkcT{{RXjD9AR3 zP)`6JS--}h-T_~ooHlm?K4H_+q>1)M1ZsB@TaVxw?0R~Bb=4E*q*#PEDvGEHIpdy~ z&S~oCFfd7sV`_|VIO$MA>$EH(loOIO*W2rZ(xrDB2xnF5anLgQ=cuhBX7(PSd8!;U z2}lD9GCvx6jl{7k3Ia|CLG|_Nnu-^dxF7_LK?PesG4vjlCeZlZz~k>6h0k1{PeJvk zCS@XW#E;&TA&y4Vw1fEeqMHjj1Q$t z9_@^%geh{Wy?H+VgVv&qvv7)wox#fk)rTc{&re?T=!W$kN)pTR?Z;j}Pjg>BPL~xV z@)=qtW@o?($K~8QoObI@7hp<>GI>&tcOV1>$3nlt3C}dynZC-3jLV)gu;4N1ed;2m zr;u$bs;3dh$#OdL+;g0Etp?T0a4QLTQ@rgZ2T(g7@Tx-BX0lQ@CP{4>i6@pKKtVnG zkxuf_Q)w7=BLJRr_|$JJr;9C3+WFpPjOXOQVU4&1{{WtANTkQ=S(Y;uyry(4$^dp? zPZFOzE+z(=z8zu|8Nw@%hP%uIf z?l|xHRIe%{e*I*T5FC&?V0Z3YKZR9k5t^Aft3ruJ#(JD zD7AxfXvy*b4VcI!x)YAyN<6ZI4ELdMJJa6mRAb6`^fkW?VbgA_r$N*-@xA${70)vsn{Jq zP(DntTw0B?p=ii16nv^d81+5t*SzoD`HrvqvKScnWjtj1aaGbin)TP7$+6&!VN|m@ zQpADkNN>ZfXsS4rosXaVKHnaHWJ@s@fb}b1ANVrZDoLZ?7PyWe$D*rcly3W_Ngmu+ zLE(?uo8bq>>-ep{Bg3iuEAe_Ue==yLdrvs=^2z`!mgw972Q}=M69rOYHwaYk`A#|P zFgsT#@dx0ag?=t+tq+fM02F=(K^4q5 z7T!1T&kV9hD#;;;j2ujaf;b1}!Om;B@DIn2hkqIr*!k<>y>;?_&ve4n%>9)~`6T=g zKDF`2llwk=Nd1~M2fh7}Ja2mqtiLpxMe+j#tBjqSi9^tgV~}yhTTj~~!oDDsXiWJ;G1*Q zanKXfpIXiE<%=$vcqB}`dZeo&h5#ube8lxoc*R3SBQN4Dsk`u&q7pSeY(86IK47@P z!RR^z=}ysZKHZ_&yeh-av{SUOIm&c&mOgwl_W;)gnKWvSY<4+b!|UJcRXjUtr^ed6Gr+6n z>5XnX6A`k9Q)LWf5#u;EVux>&NkRsQf${*T(m#`P(L+jjV9W7EzIr z*Bgc@H(*M|=H0!7aysD~86}4*8yx-|9-LQ&{@j+$bMWHa#?pZm;BsSNp;V@LKDo*K zYu;WYzJQcb=5l$+BL^LNXY2UaiGJGpd&TgH&AP^cZV|&1$m_V{rhlJGsK{r-I+O#* zMZIn46t?1^Z*N@t@s2ZE-Wju+*TLG-`EsBTz<$81$6=8imev?jcn$HcBR zX_I}-qj?OTUzf9w;p|6Uq<%GhwU!YNIG-+63JWgYSMHssx!`1T-jhqV3#mvH%&i&v zDdQvQ)b#7kSh+y&`|X8UGD#UEb{OrCt$z5Sc%;wgdb8!5HFO^tPp8Ehwh8yk5VEk1 z4@2*R$JZY9(b@R+87@j+q{$!16zyJE@q_L?D~O9shDd*M;#lz`{K}-T7#Zi^JXazyq3H#aYjAo^}k_8Rq`DB(X;g8JZ1A==FKczvZS}Vgg zM;QQueLkGv`g+uNQNrNtPxfBE$`|1RZU%B`(s9kS)mvib_hdtJ9-h?t`+%JjAe%AXAf^5 zmo$;6nIAYNP(D`2@qIn2S!GYNx0KsVskNEV4WxA^*pc)#a{mBIf(z2`6k9Ode8pIG z93F{s`twiK`OB%4Y?S@wmksp_|j?MMJi>- zmm)K`2j+~9n@90ykH)#&u6Du}+=s=NO1>FqbOJbUEXEYzzHX!E^E?XsU&Z@vd|7(i zvSndd!3lVgSk;spT18d6X+=p3LiL^ zE%PGu$RDVw0ubx8F7B*Y{o)2N2Wp4U^BtJ^eNF%$cj-X+f)*QsftPcUxaSA9eLZT| zljH!3#H$>zBLE+$=~e8})JRLHj1ahPxg$T9N|j~v8Zo#fj zcpoVT*op`+mf8163C}<`S?B=q@7?~zZ*z}!^xleu{rL)D(8`b z)7Osw0F77=kSok%jpI23ap$M>_w7xQb2tT*XOqv$2iN*j!g9P}cll$YFGmv;NA2MT?vx=H)O zTyl8w+wXPce?C3v0q8q1Y%v?N&>Z9Q?^7ufWX5-4zFd=mo}GHsakEP&-vx;IlyFGr zui;KtNz{|DGkVCn;hKbN^N4fBc3tH=eYV&l`R%Gg(HofKtHcvT2r-ER_U1; zK4E}JAdaIwDe*#%gvv_<#tGp->JJ@FH0({rVOhedW(OzR89)7MLY`tS{!}*NN{oY^ z#-t<6kw$jqxBy|Wdt&*4Vgg2BG` z9P^R&^r@VgA9UGncq+W(=xHW&kA~Vw833Nx>6(zSA2NUwYh|!7ai4E)JJJFWc;E!H9VxG(U zou?|KlhgvIzDVhhN_kdk-_P9}Z36&uJ;${%AuSna3xSSsagN~k;+~{A2%`a&4(yMW zRB{eFf1ZR=q!I<(t<^^)WRN|({{UK*ILM9IfS|9Kc?a5%Mg(L6azGt(^BNK%v6lo1 zaSnF6g1I=!@ARigj-0aR%o%1Q?vebz`t+@aO}l~>A0T0qpQmoM84DcP`=c1#LC609 zuBf=NvJi-_$;cVooRP;~dgt`!zc|0(w^r+Q`%`#Lp+a5!78tMbf5*rjNBQH5{UcH2 zqi9tfxH zGkQzc@;)bnMtS5=?a4cG$FKMg=TKbe43}-^GZkZmIKczH53f;ORkn=Q){M z(@u-!pz=Zhje<(nN z(lQdcY~+ORjBtO?O73-yE>AqEkqB|q9JwB!k9vv?IQ^CR$spvS=bU@@{{RY=iDv%* z*l^cVkv2guUEdL+ow;0C>$aqPcLvN|NP9P24ekl~N~F^6}IjKELDbR6N+DmvoXo z_TwCUy?Xm`U2WcvZ4@h(e1^lT3C>-9o9sgwR|m^tz<16@I^+KUuTPB`-a`<{bMleY4?*w!Del0k0#5I}j(0HakMr7@ z1SvD*xj8M3z~kQ^(!C^^`9pVPkRvb#OskXg1wSg0>FO~-0LGxE0GkH_=R;ZF)i z9Th=Q&U48grleR)%EN{vj;FcK0ICsO#pZvjUE7Z31Ym*m`t|%NQ2->a@(KE5j1R9h zB9oAC`=6jcjA|EWKT`C%5&ak`~-BpoUx?dS|f5ZqzU#je~7q7!m*^pSkFN`t*q= zS%Ao5G1Gu*Vx!GdQ3g9CR4af12L$)PALp7iW9BO& zG}4TqEO=Zl?DypV07~=!0FQbuqo{bF!PojPhqZlr9X5Gnyj?aGl1NdbVal-toz2i@ zy%z$%pI*Mfb0YI|7?vaz-@o^T4bGxRy@_4KMmr)^Iv_*>!KZsX&Ik*i&J zKg2p7ou}DcEY~`ntX9EYfY=cOl1Ul#$JdJWCnU(o05PfFIQhDI`u3{^Nr?+`#mZyl zE=r$V=9zK=WdJ7}o#O``v5&1VY>iG65rP5dBz62f>*OE!E-t3pf9zMFTfnSNrQ-WF zRaGoy2#+Q*I(^*p>0eZ{1=;1j@#gu!z+2qD#_xvnC&M7 zC6xKjI)S^2Qg%mvR~~FtIQgUVKfwCcma8P%e~Kaq(yswwh_;nwOd@mP>d<^127t1F&b{ujCP1(;L*{fOyiPy!R8x~sm2Ik#J zRsgfUINj~XADwvm%L*Kn9Jxwt&ZWm`LEt*Ee zLnqL3Yp(ETfi5mBTJHKe5;PeFuoRqepFy58R=g3T+obC*rVs^9*aHQ*>z`a#W2$(j z$!)x=AfXgwvFN$%2<|xjXsJ@#3kihgTmf%HGq*0FBqVo4n~nxxuoj03-n z4iD6tziDkWl9d_U1_Nh;2dL@k_zJD3L^h8sGCN=ZIw;TUS7eeKZPF-o-f~M0aysV;+WK_sm0U61`#t$R4bf&?sEsMmBG%Nd= z93PjSaDDsM70#0+6BL#iK;)<+wtDBsDp8=v!fKgK)>!BfViIXJgUBO-c!f z8w=&A3yxH01arX0tw@&$CQ<-qBO89bKdmwe6u4kp7(H>vu=eZtRFNnPxo|fDk{5E5 zQgq!7lsYrVJZQau=bn3Gy(PxfZUXMl0|aEBUsL*1W4A4D$!1Z`!N~`==}53i<&w^< zV*r%t?SV*R)TC}5-F72<#F4@7$Mna(YxE2L2~F_WY2O3&{{Rt73~PJhokZ!&BPYyl z?U!*3-kXcRU#)(Ak>nOQ5$roYY_@*2_iv2+XL;~f{s{Y~9}h`2z2}H@;ipGDSy>=! z$-K9IpsNKeat?D|zE>Mb&GbJu@d~8sQKf{Y{w8==?bG{m>K`9GM|t6og_l=)f5WXc zjk2snEWRU|8)TO^3_0?6#8D0i%QkYj`SLlWng>aiR!oLDlN)qhki;ir|ua{XM`?7<1%%lb? zj7ord`(wE2_q|7@b)N4JpNUXns=WO zXk%ieZ0VLAMw`TGgH-HB1r>~|f8gl|-^9lh}-Xaf8~YY1-vm1TZ`X+&T9A2v?0=NQ%8>edt0BeH0IeRF&N`_ z10@xY49nDk+NY7dha5#X=_wM&Jb);X8Fv2w2tmdVPAScID!B7xE*m87KXp&As`ipA zu2h@>g(b20k=Ks(ZpBG*PwvByn|~Xz-#x22BhaNaJz__6@}!7MvM%3|UyKZM{SJNU zR_v^ZBWG65)!E7C+rN5};!!&y#N}86fgs}@`TFtnsMaR8Y_I`vF^&#vEBPHf=swV7 zQWeS_z<>t)jC3IN`VN%{k!6&JQdk@_6a4+D^BEy#Q~=}UVUC^u02BWJ*QOyRKi|ie z9IggbgWuk+E2*63O>;9L$XPNzRnJk+IPH&ms*fO*vQFh2NGF%vPg6?Kn{svr3yf!y zK<5MT_4-pM+*kn8d1M4T26^=V0Bf4Foyy|9%+K=5K2=?+I+i)=DVCEsjx#7k$vdz! z*Ptf=FhS40)}J;^hiZ}l0fy`krhh7oTzO=%Yy#Z?BX7Aq`4kb%D_b;zF+ND(fCflB zruL}ET8}hS8lyMb5p@EoNWq*BtI&2BauxK*)lWkM)K3= z$Y4p%M?-_swBT`TU<;73X9N_^!g`E-NAjvx>Sb;1ovQnC2qzwd9=NM_7amd^kXl9` zARgUMpzT&mWSO$OMD6kQ2fG01SS(sQi$mZ&R}* zy92=P20M?hdYVXOypL=E2ORD#fW0|Br|DW5$Zm}QxOJLf(FASM6&W~gz#mM1I_z{w zqrcQ5TT~)7;kI=4=hL2X>s;lAnk;{PA@il$5q5)u0px&vkJqhqJ`<3E!kgsHgLV%!!+Pjw|VU9ET ze<8(rx9o?ezK#1Vcu{T(M=XytrPu?;;qs6=^x*r7^tiu!^FF{Zeo!&r`d8FaR)Rm1 zvzor!8CrMyOqn;lL(FZygkzp~1P*cE+MgShR%PB1Lj%r8#{_4lDmb$E@^DHYyasXW zk^MVUw(LfY`eb!}G3tNDwp$)c)R`6Y^N>Q|kU1kGuj5X9V3b^vpsNvsgOkDb{&b#K zl;3cvIa1mC+;sX>yO@QH7H~-H03YG*D@C!GvLKo>?ho(nPhw`O~_rL)88wYN3F@wp+r?nC?nIOcGk2`5RB#r;m7wMH`va=W@0P z92UX!^{Vhead46#API@0vkEb}N#pjt?J)|ATyIEL+)a_p1?PL5a!%3!3 zTaLV&D!bYD$o~MlQhrnZeQD7|;o~8g0HiQ2$r$U$eD|o*NoCz3icNzms)|Tla9Ch> z=Z@l+Ycm2CY(5H&hY!bLjNp1z^0J3NMJ10wGt)fhnx%aVXH(Ps!0KPlLm_^Fmy_$* zRkIt&oAyc13aq$R_2=8IQP!nYzSHCc68A`_B;i$+l(6HaX%x_zd8KHiIE}J!PtT9b zwkhz$ZMKHoxye-wPaTFmIja6>R3X|nDo#^qIq8C@^ZL`~mww?W!7Io-u+KrBynA}p zkY9@R#4q;L^9Tbb9N|eE0y~a?eR-$sjmm&Y2zPB9mi1g7gm?6+izrnrOAPG&RZXB;%%i z&pD?V8JGPVY^NOw=Z+3f;t%6XcXPhhWp&sdFdVZ0c^KLczAH;#Vp_QYLdx0R@(d^m zgbUmJij8oy454$hjwHg7oNzl;(!XdCNUTUPjl6@{cJ&?2M$juto5%|I$zh$??~&WJ zCb|_8HrwO|L@X5SsHd|QJZ4?>%au#u5;;((niG-5~~SUBRe*O>IbhM z<4*ECgk7j41xUd;BxkW5>Jl^^m4%czUCEG0Cvz$E#|3lzs=dnZ)dGSUnjy4+K|eQB z=s@F+)osz@d_$CB@^8k_z>agCo$@NJ@YD>HOolg?sh6ZXE*~V)6>@;wDu~oIEfselwk9N{{ZU86$n5B6;&@5 zSRm(k9=`eFrJ{$$Z@HMlbIvxL4oUUxj%vS%JTIsCvrB6)5@~iij1rIxb4IMB0gj|$ zPpf)Vzy#c43L|CPoSZ+Pz#WO>@id8Z_NHJMg=P`9&$>w9=k@%BH760>o(JN8*oxc2 zo;izF{h0hgtN0sLxwUzThF{#i#{_~08wTtELB?~&b5ft$C*n84sT)rHusjnNkMvE% zN3Chc{U#*FHxHMQ>yw^1&3ldHsM@WL*%*&5U{tOP5CJ$Irxjvbjp-ays>usr0VgC3 zagRY=5w6k>V}bZ3;@=E-*HTIU0AsI-DWYnuJlD{5Y0az2#!Bpz;zOJdmjmB5>rwvF zy0?W&X@9i$g03JyuA+e^(r#EKEv?4_*3GxoGv~PYr1}|0*(Gluz4-<{pCM8Hz$l5=QOVhU1`^v>Akmb zt9*_#`^7`$h36d(6?31Ze5<1V)L#lbQ{p(Rek)q|gW!LSjKva5g?Q}VPP|OL$30IK z^go9_E&N6BcAjq`n@;$r;UYZ6zp{AE(xBreSomTy(Sbhop{g(VpG)$zYnd%jl!_Ag zLz2g+gPl80+U=IQn@dC zoqe_*P0|tMmR-JDh1xdb8S9XJYnSodX6yD<@yxe{m2KMNc*e$M4vtgTCvJK4uC^&* zY1~~azyVffjxtMObC7ulr{i3&j$&i`G<;WBpUepr?D$Cc86U`33I=#24utX2yE68c zDxa$S&MbZXg-=KM9PXJL$$Ih1&E=qCcHnOq7{|5`J&#J!x+F}WXlVAy&QJhjB=SC( z?b@@nnSr?rJZz{}a=&*4K+Zd0=boJ^^oXq_PZWf)QxOb=C|>Qqr(6pDf`hzK{Oeub za`h*-PcvYGHkt!~Sh!Mo?mO@?OuS(|%Peli1BOyt1p&_le_E0hQX^SpXvYh@uO#OL zV169*q?HVJ1}V-TX)I(o2M3iWspkfpb}??lW7Cbys~!rhfaS|_4;{PlkO#do^F@>x z<%UUc6vo9{cJrQ9bLqxUwONTpoJ%w)X4##pz=94A<^*&Ebj?R~s$BUt&2IkyEUAV0 za-cUOBe3JI_|(666s%}l>NDHj1$l^>P_cDDcPQg-@5iULYtQ1_i*Xvth>tcKdk~!C zpgoA-^H?^o_JmZ8mue_1$Z^l!W1p|#R5hmZE^XE14!^x%6cVy>J$ri}df~+3;Za&h z^e~vY!b;5a-3ISp|gSs=L6QPT|n%1kDnmm1IN&Mb6#iRtzt_( zG2xkGM_Eg#Ooa>m)1I7Q40f$`@$Jo|X$V!h1RQP!Pba5dnEwDgR|>(&d?@t(yruCy zPQKtg3SwxM7K{K7n0JOJgO2oDTf=v6AeD=fy?33eanDYtwmqu>JYxmyF4O$7DgYnv zD>95=W1gITHMyhRE83N}bt@rJyp6p9ILDyovz-}1K4fc45f=1h(rNyASF@3#bj!#J zh79M8-|YP=l+p;qkiPT-EZbWy57)RS2R*A&JJLhRY8WBp?;8d&$NvDUu4^mpLfM0E zRM;>`=XW2^{A$ltG+-X3g{MI95;& zTlB!Mx4dU?w;J0qU_(J}+p)ub=`(@U3iwVekMAk7?6`6M>S(05zFfh{aNLmOgS>j< zwJBCY1C&-$Hm>hqT8u}$Y$}~`@{x~G_;mWw98u2M;aM}u@9p{5$Gaa$OC-4jkcb=* zMt!>b`u>#?KKOueynuro9ylL{Is9oZKrb9hGK7*;AH-5xsE~rqDj;02+mp`#WPX(+ zE-xP}p&gWT10$LmTwsi0@xbE*bsW?s6`g_vVh+>B3HBN3#VpENLS!OF0E4%T4@!0s zF+|4L*UVqz$;LqR{CiS)zEU0XHe7CP>_5oQ^r&QEC{$ovZ5Tywm*`3S>8Iy7+M7qr zR2<~s_4THga3nV+L-`rQa!4OBJvjBwc{Ll{vMh-coI2t1rzhxpQqLPqsg^}CjE={z zUOjO^LdeeBm=2>P?>%sRs;yufCfJz(+yOuU&U^aMva>@Y2TwC3{{X$)Jo{3!d2uO` zcLpIIOqufTW&CA$xs!=8-2dv1rkxj}70b z^&|4A(}pQ1MQ1rb-hO(MPx8aa#Is4a0048J$MB$wjJkF!h`}-yCntgb0M_eB15D@< z@KuHePE_Oi)P87HGB6Fa=L_?7>&H?!sTC1pEaY>6oN>>5`+k%Pq^dFV%#iCg4<5gLC-&rZ>1npypBQpu0ws(j-d3Y!DAU{+?5=LE%Oe8q4l5%(o9I8 zki(&D5)TL0zJH}VkvIrSkTAhp7$>ezeB!D|{#nC$2dTmCPqiw@@Xkvz;EXTJlabf~ z=|C3pWh2YR@JMXqBxCjdRGwz$4H3eTouub^914x6G9vk-aST*$Oa?u$f2B1@NXGSY z&klfN_j-(+8-gvlez{ZQOjr zJ+tfSO)9FtDw11(yK+G%_2ZstH*xa{t-3NxWx8;32|Z3a{{Z^wWnVYtk2^sFXzj*3 zj+{~{-6Jx}2x4&9VNU zLw){o273=`BtXBsk(3rcHyuZ}HanO_5T0`kJ6g|0QRQvu>i)A_&5%~DBW?M zeSYsX`UDh^STi#Mc|2r&e+u{){tEegE&l*&Jq?1hAn=R`$D*?tr6>K~g1EB>`-vZQ z;q-l`aZ3Jwk@CbEI?A#~77vyDC+>#h<@fcb#iYw7pzOr}PN0La$6=iD(DPf`Hjg3F zB9c{TOOG&y=L4oO+dX-!acHaNmLRh!Jg~s_nRVv!&_0|&txgzXyR~BDr%G@9g zwCqp-{LfFup^C~wZZ?GgHwQUyVk@Azu`@#;E0c`n#xgOEN2Nnyrhe(7l?Z>7V?7A# z*SEEE`$msT>hakl0!=q3Yoel#a7IfL@BL}eSqQA+dw|=Vk&-jdrbj)x*F!yug`H-N zQJV~RjD|S_fl}C5?Y9dm#tBfk&U*G3{x9iQ?d&Cia_V{g{*G5rWR@{2h8fy^RN#;s z*Vi=LD-t%8L=BIdi~vus_}71Tpj+HZ#z@r;PU1LW#xd_vE`qOVHWaFXumU}JJ$<;v zXt6PF$2_vikxoYwrs;-Bi!eKh!Rws!o)533TeR@BHyeJ-fQNQ+F|_0E z*(cETqBR}231Mlud?z3A8^aOa_)uE>%PsMa$aLDiV}vIi$P5lE_m9RvT56WI@swY) zY4)&Xeo=u6j)SM5{A=+8Shj1w80Z$Pit#?Prp1k*fEw-)ey6p5-TX-^zA?ImN;1YH zMG8RMwG?&q?O#=sHt3(tUN3UPF{c!^MjT~Xn1bIh95KNjpHHP(SoT5&04zBybGNV} zp|*}WE>HzRgoP!P^Upz(`qh~Lkyx%bH)2S^2d)iz=i~xHz$sTdn;BEr^7Q)Cjj#$b zTODzp$Grtng5i%C7zdpD{xqRSo4E2iV08l@(tsNploB&Y%0_m+?D?4Q?MSSox0uPh zx$BQ=en^Frh7Xra9;ADJoYY}=NES~oAcMOfci$cQ&;+t7$l%UdRQ$jXPM?U$rbZQ| z+puk30`<;6r7Fp@ZqmihQE~F*cQ`*&N+S{y!E(+qj9{oA*ZI%`Wkt{LaO$HwfINR( z^GP5U#eB@;wogA#{U+ z7yvLNWBO4$G*;nQVdWW2binr=4M-Uu{bD&Ujo9O-89submR4z5mD!LU2pdZJ2t`F5yNw~{_?M?T;EdTp|XON2lc59w(YAf!MK%N z<0SR`2iBswK&Z{SGzvoFf=8=+xv()C}1mijv@PXs!p@~BMk zixP(9f471?>Sv;7tCB~b8%cTp0Kq;7_#NXf?5`8gr)nXZ*HBkk6_jib)RGP{jCCCG zR=jhh%kcBXziZQ#lG^0?ia|Vsj=B8tTyC%8CD(N{y@C|Bxm=eBGK_PQPrvicdmG)u z@ps|c8;!4hXsr8K2=7^j%I(BUF~&RARXxh8&PH>)dn4;aBx&n(ExJ0}mM> z^u~JQzgo>LPN}ru&LHbDS>8X8SguO#Jn(wcTU2>VF_FnRVmEZ@{{ZTxzp)VAJIbFT zoF0GAHBV@4>=^CqpK8^`9%N@Yt0rmMPvx^Su;}|^S z9eW?8X+?FvaGbX7z?Nf>J$Ua~R(7Hl$RU^#_y7Z+Qh%?tT(`qag?IprfyiUku~o-}FMVvdls!D<}lkd(tk80QvU=k6ZXaRRAAQO(B z*{T}tyDgzC${2S5fycjN(xxv{Y*abv8M<}MvD~A~^6!z0zE3&#{VQTw1PrF#w-z`o zPCz*QJJuMJ_loGfIYE<*_x*BfS`|TNt{IRhzyuP!o;!U$l++-hG*SFLx z;8%GrtywuPOv3{mN2lRmu(3sEKx^GUOqMWuy_$DCa0Y$<02-}*;V%wqNFvsJJ>l0z zRzJP6LZFk3k&51VPd?H-+$V^u4e?R@PsldDh@!o%)J7Qrb=x|R(>Xr*s(0fOuoA^6y(W@R`Wd8H>bHRTcA^36oE__Gu9kqeF*1jW4 z1*~^Lu^o-9Y^GLza_-+SP&!wc!)r3W%XMQO{2yP(>(akhW&MRd3hNJv{ulUj%;cXc zBelR78OhE^Y&w{y4CAb%?TGQ9nQJ`JR) zFz`K{yhxY}9M8E4>Y=v`A8$j7r9bQk@Mc#z@MKJ5CCa?=;#`ajF75}a_wQVv*%IF8 z(JvCP{FYSR&&=D)@37gl_e`lAN>urb0w^B+x_v9&ziLe>{ulnrzXAL@QdlRxH~RhJ zx@=~7Mp8x?<0#}~+#35I!auRk!fym$+g$i}z#blw@(BaR)5GQ{U~&lzaBz9s>t87U z0Kr-OR&~GHGs6~>Gq?7Bg)6yJz05F2|8R=-kMdQSVCbaS|q0 z!|n2vI8HX;9i;WeXR`Tf##Sf*!tsps{IYUC3du(2MM};)7ZXw4{;zahFcgfBY#NMQ zmboSnfA zYDpWhjECM-f?xff*!t0e?$N?`EJ^?w#!fgn?}~duKnXiGK_L_zcjqV2`qRG6BHOWL zSi*uq0}IC-lgRqgXwu~+5yctvS)HWD?V}hTgdR^yYQ&~SV#QIuQV-4)Q>L_F>A99h z&I2Q4l7ET6`t=(^_i9y^Me_JN#uQ_xBfq6cxrdCj#Ba_%^DkkJq<)mK#fch8BuJ4I zGJxFsAE&)Wk-Bcp)NCAWE3@W2^vLc#O-*NJv6Hlk*+EmdVEcW44l2^Hw=Zey34DRQ zqRQn@B=OGf-1hHMYa&Z<%#F2Ila|L{PfzfqvX3#5Y=N-7RAZcXAEh%?nnQDf=;AZG z0Avgdb^euB0xM{ONxmSZ^ON->IZ}U@y-RO8sW>DtZ4~-F)Ab=i5Krj z*yoSp;8!%Uv~tEGCPtIyMIhw2ah{&vjdflew3_D8Av;;7#8HIfY0po<_wQOkb4eqg z8$V@2r28g*oBRvXzp(!RXYU1C#;l7Dl&51KySSdc`+jxPh}Kpm)Hov`;~+6O2iK)X zpxccn!ag3iQ{;%W%XL)7cHwiA=t(DvwG1pA@8A=(upGDH+PZcc>fJ^ug<(+=2xEJ#HB3FD`>eSN9w1TIi7 zIqG_b#yXGEv`)mdHB$-{GO$utX*daykH?O9sn8fMGv^buk&WGb2py@4T2qB7#shBy zA%36d6s#SSDod}fG8-rP=7#QK(C?V4jl?%3umf@DxuTHAkQEDL4nhy}$MT}FZCslp z;B@$<;w#I!4X(R=bcmVT6z;3TVBmB;N4UZDtF7^W#`dwn4X22;AGTaDQJD!>z&n{o z1BKm&^*t-mel=-O%ctpc!)**qk19x!rF`7`5xDRyI}`0JKrBVS$o9r}C(O;dpq` zQhv+gE8VVk?~N3;GoHBP@Wnj*IMYmFzRLozZLvP*B!DmoIqE$z)2?Z@{{RkbAQ0vY z$Qi~_jlm}?)T-wLJ$)->g^jFX^__%&jy^N;_gw4uGe{q62w-27b>okfyB^%rr1;t5 z_|2uy_SMzR#1s9Yh0s$E%kqRE0C9ty`ij>&7>39#q)w40L$=?U{c_z&JbPf(X}moG zX@EkJHrXRM2LPd98$5A=)A6cUZ3F8!b|kX>q`X}Ll+2nc!ghsm2Ij%)#C`{*OrNy} zilb$cYb_Z_&fxarGA}`l9*6U)FX4zGzL72MWqp%uMg$cJjz1pU^%Y_-3B-J&kzoPj zat1t{?K$nA#-G)N^@9Dk?LXpYoZ`nw-M8mK9u>$w=j8xnJo8qc_MY)8#-()q21H!3 zEfHwK_5cDoKIa3})?A(!fXY*Bj>_Q%FgQH7vholal`en-9DU=%ae{I5 z70usxHVH38imb87GfhJ!7)C*>r10pGnk=fJGM6StP!qM@G+8Gp7iLyXkQO%o?O>f`j(iHl3kpMv)BwTAo`!my!TJ=^zmCX zml8V-s!~0Rl^&(LfH=iIO%Wd37LHXn1O`kt6QN>zpJP_AteIkBk55mIo(oqI&8x_c zPB%#d1U~r2as28-@w34ZDwgpbl1etnL&VAzKsZsy%4^9_fg1O6F$$pq?#4X8I)m?m zDwXemW|5*u#A>5(#?Vxe(TP2I?NacPMg49q9?d_-PXyaqubJX&C>9)?oy26EjDgQW zNu-zKe}QDUiaESjrlx*Y%C<3%+ebgvyaM~-?a=7p7S-LXpKW!GbJ-<}=>)?rRtX?k>+sG~CkvDk_^6p+2rU!g_ zfz4XB_`%@onO++&7U@z1=2U#fv9D%r-kyTIF5}^jrzeJPHFk>2`#ves08GG2&fTyE zM_stAc>ENm<(?=algm=#B^%1G8EkqINXNBT)#OX6lhvP0+x$)NmD;Mu;>`u}zys&u zLG&$*kIJTl$DSFLnV|7bfikI6yx%TVgTW)WrhRMWOYZ~5nT~j}AC(UnAx1J#p1D1N z`c;nz{3!7ki!bkwg*2DcQrItEp3kf|9vCVeI29Y?@k zJFPGRiw-8u7go_H4KCHotkS{>Xn6H7@{PM|O5W7NRH8 zt`sQ7VUr`KK{y2C0M<>Hz;7C~MVrF+ix?%DgT!0|#z)PT831GQrPe+L_@>_Wb-eK9 z-NnFBEUyGg>X`swc4LehxJ|7Ng)1E&iT?m06T2`m!lAcNHi>IHaS zrSQ*Kwh^`e0EV@gB63ha*x0Uc2RvszIO(31!T6{4e4Aa=OjGFE>>n?i70TJXQlyz9 z_fjC-nCci{kJhz}ja2S_hyMV>OT(nxjVtz!@Rk1ng>F&54TV0}`h^@Ct!l zE}fuhem1|;wQq-a@N0G!=2euzDoBd1m;`?iIOFCO@E3x7g>i-|M0 z3o2oP5_-x29-XUIW>+!xMgIVXC9qwnX0&s=Y;ysIVn#N6b5|c#BYhqFpyqZ?P=zf_83fpdf?Fk)APBgx!zL>(vFzCz=z> z!7^iV`h$)E&tbr;z7&Zr@AaQNqaW;oSR|O-1go?W+>D=MMr)?{h46R89t^skKNe{> zR@V@Gk|9u_DgH1=54eu1NaSL$d?}=xd)-x7$nedkPYXojX#g@2&s>6Wx8Al(sJXQr zp{qkU#IEk7a(+_#vw@Cscqe z2)4_2R+S0Phs6NzbF;uT|rwV zLV~zZq@d2z>ChU%)NNK@gTEB)nHk`c*6pTH<9h!9#J_>`;Qs(R-;Nn#5+=bYXxD(G z?7;iVdJO*nPHQer^5`EB;y`7$lHOwQ6~KJiVDs0Jk@#0e5!$ppQHCd4Q}ln4=UyLa zXS7c^vX+S$lZ~#$6oLrlR|IwHYoQEGu)8uMNAme>g~WuY%W>2UV+X0OXToyHHj$+p zf?8RvVg;4CnN~G9&(o*pT?MSctr4M+$L4~_SQh#d>OK9d`VybOkLL>dRF|l+A^q&E z@kFSroz3!&dS|IUvD&57)uNf@l|-AFS%UHy;}{NlV}XyYK{Q2T$x@4)rdQ_AupK|n zYQ@Gr%muk4XyNh|Jb{_qXh55W@TeeC0=J9fnh*vPl0d2ep( z8kQVoNIxkZ1_!UF<4y4ujn@xIyxrxyL;B8OC_@sI_~cd8)V0T4M=j zXX@j2I6X6wpT?dW-i^)il=)?3M!JBvyN4+Wj6WNR5|5$&A53*TR_BJiUe<3jUfc+y zRvSa$oB($Q9ZC9j&2ux|!5mxl0Lm4H(4*&(k4>xJzDe||H#ZXMy5n3+9@~QvAzJ}r z!0bWCIURjXWsBvMc{-cmAwF(>l07QZ;!JlE#_*`}q$6P?=5d}#AH&llJl3RI)ui$W zpt^ubyppmFtU2qCLyooQx@DQQNlnpqky~>IKOk%mx(`oW(=|a0v_) z^Mlu>M>zJcBEAM{Jnv+B*lcY%P1BC&WvP)W$10X)C(IdQpa64&^&+WFH=gWgDy(^V z81hNZFnb&nue&utQ3v!*qO*4m}UHMLK1eA}nAsu*ve+e5b!(L5_RY1+R#{^9b2jXbOeH z5Tl@O+3S(lrB0q8+OA*?@(@by+AwE5bo z#nWm__ZK7%n}5%5Ymxjwvx-x;H~z^DyyNCl7bJJ*7#-=hAMjI;f|~A~4d#n^ z;^(uwaU5=%Qy(ybMg}_aItuuv^**J+p6Dh;n1V=PI0u5gkJHmNG&2~VZU`lVW3JPW zQT*%0q5lAai2NRz_sytytydpA9TroNIOqoi6O8n$@c!SQ1?8E9-XQS}w!j+`Xp*3h zBY;jZ`BJ*>9F256b)_y4?(+u#E^*Icnol&wm|X73>%kt_^ya*#-}dPECvgZ#{AYU* zX8BCIH0s0so=0e}&O6e_`%Qc#a_*lL{2Z!4WoNl#jCJ{O{(lO0 zOk9lY{?rf^ivdW$8@Fc%s2|dSJ2P;sN%?TN&JVBST)+G;?}c*`zworY2%E-LA5m1? zF~J1?04kQ><0r$5ovo()PVfUJIVV_+PI%)duN?ahY221{f_;N7BO{|0ZhsHN3<_gj zDyCy9H;gYJW4}Mvvmp4F;H&9R*}ft83SUN#SBQdh!5s6R)hO{VhxG{pSopKTG9W)U zm#V;We!Hl(_AJXlNW8M+ zREOsD=XO16;L>6$rVUp^#_g&XQiOm{7{>0t)W$;LFu{Dn$Z|sP7m9S3A31k^qk+I~ zKdo3E7rLB-XEl_}rx{DgSb}>Wo0?YehNm>ee1Q4qD=IcS<2$&d1ue=!^3)YL=NThC zzxwpi#EP)(TyO_M2mb(Hx$RfSgEe_@4V}w;{Xt$%I%FTEHt)e2xI!YZx@Ue47e7vi z{{YoMBA1v8E4eIB7|#RVp3;@vSb$XRz~mk>G5!^HZv^WN9wpPSPs|q!9^;&3;0~l> zp_{_`rK*1WP1HjA{hher4sbsViVEcOAbqb12M)R1pgF+*00GvPGqz@QZ#aX<+7$l) zp4s=Q+r#>kIB&7tB!y0MZbnG_I&)FYpkGHXmo2T*kOJkQVh?@}IiP%mL4tq+8P2(itx%A`Pr40Bk&A&f;g}}#5 z=hNv)wnX_*6(n})_?jL25~9U%=0$=UOmIl=k<*%JkoDRV<+q0zU+*dq}#oV5LG}pBRzTPn)o~Z3X7{XukD`Z z7iQ0fH2Bsmh4Wa+a7pKrfDQ+{X1x5-{^6v4gW;@K_T4M_o-J!+QuytRs_e-Jw;0Li zoS)@QzqKh4NdN@oV>or^jQ+J#O4M6Z)Z{C;sUcGUfWxK$@5m$YtsQGmnT!i1;=~Jb z01R`F*RaRqUkOn-yEFSA2Gro1MqTZ!ml4P^-ztJj9l?$`BkB27OE+6=`NSw3yD!Y3 zV;m1m@@qmykl32?P3O)`ui~;Pt{yjY_tngjD zHl7@7%Y_n2A;d}t4aeX2?gvV_#@ZaXY+R<^gV|X=Y2kHDVC8uuo&fFj{3@-@#Bkcq zlNAB^1Aq_L-=!D2jnss)%_bv%oF)kXayakLN~3RaHod00-Xi(v-*k0l&N}*zr_(ht zr>)IvFUMsKA^!+Qu*Uf1Ln+2MX#wI}7LJ2#)NhDW*7V(T=h4cfly5CSMb2N>P66fq4^Pf$4+z zb6>H)5N??G*Hw@h_L0fh^e*peQ@u9Enh{Z3mRE69oU4eWPow&#&p#4uY zNh<;{z_&el$G`HX$#Nttt@8!Q3!y~vB*4n{#<+4v&?=xqFD1E zX-P8}#tw0hUO&$?#JYXkWN(}dl_v~-ht{AsppWBN)B?bP#z#-c8YH=pDFHrH&Ie2n zUvo_`n9@smFezidJ;;msDMX-fO#jC=aG|0P?-kf&IuneC5SoO`r|bZo)K7}Bb>7l+qDMh z{Kij^s|}@x8ST$}e!b~)0XQupkt(qTfEnwL^MUzNPY;@Q&+}yUE3}UM( zFv;?rzz&BU3GJFsJT~Q(w-?E8_PdX#T-6T3;S9TwxeQAM4Z!yL^%TS|hYK+1X%pHFO3G|Z7@iz&b(a33%prj_(A!yhxco#4EH{GjCI z@q_Qyl@FV23}67`o^$PrN0%}Jq_-!98Q^j{cEu=`Ga);a2*y5cGyZ*P0Qid*h38U2 zj#mc<*C)3ftMh~Y3&VU<kA69>zu_LJV~EE1RhmDTDgGis$ovK|Tbco~@z;f=)9(t2 zHW#;&J{{YpNFxCAou`k+u)HOw&*2Xf{{Uxd(FkxrSCMi!JGmbGSCc8-AGy%Ox^ueO zl)fWq?P;$)&6H9zMt3n@I`ktwj!Dm`s+Ixn$YQ~{%I7?H;;bN>L>sb2Crs@}Oa5V*gCRGd<4Uxdja~C#p369J%s68-9{5wHq7{^q(ZD$^!2h9x_w$UX2rp0$IdsYi?uL$4SBa6hNxT^)?-T&M)G0Ya$c z4CndvsA~F~QFdt>%w%ZsB8GO)%a6JU>!0zfnr)PJrx;ZB< zx3z6iXn42@+N(vD1A62lIc@@;IO;Ng&S)iB$@1`c#&gN{{XZ&m1Zd9WAgkd)A1L~I z_CJkD90m6)FUo+i=axRB9r2&exleUT5j<~lz+1M`ALb|19glD8P}~wM(NRDwH;#B5kAs$**BjN^~X(xJO`mpfZ5q>MiR@sd9e=}m4awaVE-(OPX%!rTcN z?=Inl?7=J=MP4}f{44K2+n4?d0jz${e-q*Oeeh!6Mi;t9nPmE=uXPWf_GwxrWw(Yf zah;sGJvS~h+uCE&X@usb|<=&_`08oK~n3mWwUsjpuRTiH`-Zhmc^Wk1@u=sJq@(mmGK z{tA!riVz)jtr5yNKk^Jv(eu-mIPcA9NB;l?U--3TOEjJrxXR>)vJKGiNf_tw$F+RD zVKYu~D|v3G03aAS91~XssToHCAlwxT(C6Q(;$g1!7m zw8Lr|M}%i?FQZM){UyETe$#LNC3*SBo$Y+ED(;e|&BAZ!aCntGjJg5f; zIO&i709{7S3avF!f<;Iew^PZC~u7sFB~lmS0z zl0EqCfTRq4PJOD&f5Bt!QZO%k1)_kbwC%WpdUU}(vG~`;4`k3T(YaJF8Q`uxz4}w8 zv<$HYJ9lSp0Oh*p6n%cDR%iaE;M(|K-hHG$;IVCR>eqh{^z{UmMgGxzuNdi!=ku#p zU+`C*6nvVufbMPAaoq9h0l?#*m#Os6y?i@723Vs9Dp2xQsLAA${V9^B!hU8#=yFj; zPtf{gRV;Mc=tJP#BKt4zKSsVAf5At-9sEqy?W`~DwS59>xzZK${{VRwNx%%_?vii@ zGwN&RFZe0ut@fYV{{T|95+s7pOR~$U###4~$I~C3ct(wV9j3FVT}Wg_ww@{3qijFQ z;hP!bZ~)++UU;srx_N#`EF=cQ`f!nW*41>-}4Rj_h-{5w{5lOLK8 zqi#sXC15`B$4q}((A}G6aLowDcjF*|-ye_bUq4ggXYDzEyGA8>V`f$ks*GFZ+1rm_ z!#`R^f)xz2ZZ1v^)yQ8%_4cbo37|&FF8N`DfVdbZ>rl(G1GYCR&UfL5%ul%M-@QT8 zKY0-@oD@2+aNbxOOK0-*KK}JHO!CdP)s=P(@OZ{L9Q4OMd8P9ViT;j3UaU{?an~Kc zl_V*NH=`Dj#^ww}LV@0|6f$fh_#wn-sKbH?xg097_e-vq3T$L8SU8~%ce65WYVd9rjX zxMhkQWDcBm&q@_qMPndUE6G(D1O1%#`cz=E;Hgr)kCc4B{=N-cjutY4qiQA&P6GQ= zwZTZeXNaH^m%vgLReG@_r|HQxTJqtgxlnfkPD^wLKf}l8S5-%pe(xlJ!=O0z{{TGI zS#7{2fhCC5S&7s|~x1g-8r$V6hCbR$P_`uj9>Lgha7s41mMrh5d0dR+-xWl*3;`Qij=%u-_XeI9Y+%amwF$r|E-feQzF7zaQ7_E-EYcp?C*Ru@+k8p258;+q zVia9PBmV#hCp&UasLvSuYmth}ZM=;cl#*3lz;?dH72cPEyjl71Ve(N zMms`~>P}C%>Dx50+mw)-XRn#W4>uM2-fpQnk!h+WHGS_K2wv)#!q58 zde*5vhC66B;w6tzovrZ`8C`Y^r3Pd)T&g%zCmY|dOUBuDIL_FqZ$2bIoYJS zl0sq3r9NlK&luo;3CTQnt1#Qm5SQ%+H((WZAm#r6-Z{ocT6~O`u;sb(3oFgKFO=nn z893o^Ia-k*X^2PIaOdxyPc7hstQCypL2n4uUNZ!XBzrdkSBXjfFI;Dj&lRhq+RS8DjR3$Z{{S~CamIal zBd1EOY9m{xO+8A20;UN(dIs&#o_bZJlthTqyrr-*dxDl5gL0>_^x~nq^OEL4B!mFpDN~S1z@^C*KpIVtfwNbV}LrIfs6okk_H_OqxoSqNYAB9D7 zfv0DW<=RV-&Q3`FWaAZ}_aX939xkap{Uy zEy>t|*%o-29ZSbE0tsV)LgXgPf?gwxP+2=f9@%%!p+qx-bb`i?s z<`~I-dM~%VNNt36ul9|Evl!Kj;3*6V&QHoZb?e@&!Lu|hFSU{_(l%t-&QGr$xa69D z_M;`ju?cbs0aeHaMmfR8JARcb%f9C}djJgX#ePf^)qVYa>S1F7MkB-vy%@;hipW96 z+>YJ&6kDisGM1<1+{YO#qik%=BL47_PcfA}0na10c&P34Sm4_fa)oWX(`mxSql^z= zIL%$Vk>X^MIFOje(4{v9Cm$|5{xl>m(;&;cqX0pVqYl^}nWf8d^D=u~JuUtkYN8Zv zzuHmEGQo)_A3E{W5sVRB%zAl-cJrJnFjgdhp}h&muczf*tP>RQHmjKO(ajT|F?KHD zfO6gNdgs=%qA|RzQYC~h82ifO94>m}lZ^V*MjEqe&t`JBHY}HR&2ZN0vhoH=H2qwNl%u0==`vQ0H{phjNtOe2j8_}>Ka@IFwn&d6&ODuI|uNC>yAkG z&2`@kH1xL7H3*^JxV>2pLF5>)N7p0uu6$HI!)!H0DV-Qbia7BjjfV@|fHT~FH539x z)#e3^c#T<6WNZwKZU@(l8lUXX3ox}+Vou^*{n6hatwPGHsog}wgKRK9@hhBeJp8!h z73SFVREgGU*clpC3{Du5SdXaBIsUn!H7ki+xOo-bdDzDz&|{#eWsDZ{5;lDEp5*(E z)V(8h^JMdXfa8J(Z2pwWyC+Rrc+t^kod_7)o^#(myc}k+d}pKS{xQ1KtbAvtY1+lK zme(){uWjR)Z6!%iSbJwRr?lh-94g?T=N^YW_^7oA17BG>C{j1DW>857j1Nv~l$g|+ z;;9o4&FDr z^{lP~M(rG}mnBI6XVtp)9culnMx5;Vf5ZMh_& zJ_h(F<6fODx5dv3==$(unB_1k&l_i#5--fGIp})VmEC^I9y0hltHR&1XT;0vdmE_b zWbp5b@u*m-O}`?_L68HSZY)U8&{pxQar2y4hx`L&;#p&V2I@L~p$unhL*@Y?0|bWt zJ>OBO^rNARA9ZG6e&FB4yQGVOoit$q;d`Wq~T zSH&I-&Z7e3=KH9tGWR6yz!mEsvOmUMLsGlAKeB(sO&{WZm3UT5jR#Scf3#SRcn55e zI3CTMaw}CUmZW>K>8&lh>}ucxVw^456XA+|Re45W^7Jv(~Vv>mF&`H@|xN=wxFPr$b&{5Pfjl^JDgJ95#; zKyD*nm5AVAgZN^)kF=zi!Y<>^IV2BZ`hGRY_(BO{@V$&z2!ch6W41}?#c{XP?azAZ zZIkSZit?#tO`y5p^MHi){5#`{{)3?TsYYH$^OiH+tx`T@w==Yb9#JHwQIa-&;mN@D z=~5HEAT8oSAVb0)eKH4ZarLUQWcjaT&cZ>vb1}*W>yJUl0CW{9t0wliTt;KVo)oVg z^U!0zy=axrCm~9*LceN!#t+PjL35Fhn0xf3meU6qPQS*J`o1GjNG=zR|v`c*3_JgwW5p=QZ)p@|#~zJsq?yN@bk z<@t=19Aa z9ss{8mQ3&o=x}k*T+?Ec%`wL+62U}(_Qy;E+@9i#*ne`kjHr={4N1^xhu9?yH zk#T383f{_UYoW=ZSg!U_VYtP~-f_$H;PH*U%~XQwDOrFJ0##ktBz(PwJ^d@duSL;(top1yb%=tTOG?P3 zdFXZ$6^foi9y$&Q6?)POTfM71(QV}eF#F$^PM@bWk7+B~$rC(eI~}7OpZ@?~(yy($ z`9Yx$6LCk7H!e>gdeQ*0JNFOC9p#NCbPfboL}%t z%}@5{(|mEQcn{)+m*CqU0_w17w;E;cj&71`iLIizN%y3Suz79(0CmYV^~d}iZKvA! zOW@DJ?+|$2{!JpsP4NxIlLHZ z7N4!?!&1^>Ni0X1Y}mFTq**}3kMnFG6NLjfuax$2?0q%a!gy!?2yf$$8tQ%}xA6DI zUk1i}EvYt_a&EMF$DbgLUw#C?C?UrOHD+JAiokmGFw_K&lG+th1K_9ktK{RgX#guA6o7wwJ$Mw5lm_UA-M`Oz&@aQ z3O$4$LOrC9%=28l(5x1yfSa27h+Hy{7dU|)P+FJ{my${W= zi+`~fj(it$;fcO2_!bR1#_oHFA(l&+W+rf(z(!Ui45@7K$TiGK`!2<)8eTB zWxYD!qG}!)uqg@M8vTt*qa5M593Q7n_4Td3n-H{E?kxi`{op0}13xIwY+{t@*5xGK zZzkeSBw2FVJP-YlurP z2bNa@ARO)Xs<$7r)}$iXbuSoNfcaS=)b67acP9bH^~mYS2ENH#Xas*f<-_@T3SLZS zo}eB-`ogpI3n+{#%O~1{J2pau+P!<84tnu}iaw!A-w57mF6YO7BKUu;*!X_!;MF{D z7nKvp9W~3uWjk@TO1^g!i~-j?RQ6WBG}5AuA*lRiw78Bm-&<;x zWu~wEBsvoBZH=ngZBF| z^~m?H%g#}%>c zLZV#`de7sxi&iF$z9;zI4mTL&znwrFbDw`o)Uo}gd}V5Of5O)BLgZ!PeNblari}!oJSB_+{XUhRMDjcph-XE>4jdVeRzIRl4{`;0yDM--q4_l&YQNX{mZbU)zJ?^jAu$u6Slp<2X7TZp3%U-P)yx_U`z(2$%gc!DV)U8~YOs zdG!z9(Bi(5{{V(!_*Za>Ps7a5B^fY@p{{S$(y*Ktxp5y(${wYHuse{1IxI2WpLBSpRN$bzBsTckV5AiLPnoS?! z{NVCDix-S3g7tX zO>*Q66UYi%Xzlf+snq^qs?>U;#HIfLf`oiPj(?xSJ_L|1?dZ@-haHZ0aDP9oeB1kH z{9o4oGJI?vIq?>Ur&`@fqFL!9`#MH=Y}FcO1gi}1Z!q)I0Cey7%%8Cr!Xt6C_-kK{ zop$YAdT>C`UPdD*A5r9rmzKThzr7<^7{qLb#cvphfHx9`hd>q{s|0Sb(8p@8Y^dF$_5Mo}v} zHV)!go^$Du=y|AoL8!&0TIsq)no0>`O2(kzWan`|c;t1b-Q2?(`B`Y*L-T;x!S(g@ zua2qjJD=7#1?=O<*pD9jCR7BUKmfoTbnjV`TNSsIJU}^4M@`&dZ9as5TF`ydTF5Qj zG~ahQ!1`zD`c#@`k8!9$FWF3GQFlo+gzSj)>(u=RrDqqZ+g_hEU5-udT%!XCbjH4WcCUTgSz5cBMuzFsBCJ5F*=eMj}J zZvtx*re>QH30LM;eX8L01FwAMw5s$+mzUDJl4drsVj2#|nW9k^kTFn_|jKM?-_W?V6L`$Tdv+9BJ5NGE_ng#VL`YzH zHyj)T*pv8vwRAn>491_cdKUZ_GfEw#0%(L_gkiv9Pb1gq?Oj)g_0ytiQC-6faOLX6nCsfJEYry0KeDFeXV)J=Ujcs4-wdYsz470{UKQ}P`hWJni7q5XO%#Tt^x2v8qNm3E%woO|$T@qXC92p&(}c)sQ_&f@w^ z?914U;E(?RU3mPz@K0}vfXb^cfujQ748p zCnZX=4PxIO!L#e>{Hm2&zsg6kqx|R5qxO&ZTQdf;_=n-(6#TBi!CrCc?mt?T{?H!` zE{nMMgW*RZa@%f5Jq{1ham{?j{{XOe#cM>}bKvbiDl$Y`ox3WgI6JfXj0%Q-*kj_9 zhiu;uRzr-Tj`rQM!=`?2obmjr`+C31Pu1z}rhQQ##?Ob66;=3+;P^q{iEq|0#~C=! zTD2F&4+Gpv-(>iK;Io21cm1g!=sWSver|rypAByO6R&DIKg3-U-%Hf2gmBLfmmJbs zhZ*0-ago!U*5|_y*?z!yUPaI}wEG-VY=T1?t4+|B#xgnRDN7LIwMKKL7^~d<547=z zg)RsBCye|dGUudvtYnTk$2iSN2D9Pv(tV4?9v8U;5JKv4aqLEa{dMqF$Lz%f5t%Ra z8+o9$Bw$CL81a$ooOA>Z^qOz%*=BDUH4O&cQW=OLU|7?588`rAC)c(OVDZg8zY;kk z-23QV>25I=zo5G3=G&=7#ya#p>UiR|Brw&qCnOKOs6vZ80s)<^Tt2fw%9x|tTzDpY$Z`N zokuwsJqhf1=}x!!1n^An44RBmWUkeDOl7?T7UPb+sQ%IZ>0Zq~r|3}d?b8)8#*#L8 z*)krZo;One0Kz+WxV+IJWx-O8tTF4H*XN|a2z4t-0J6W=cWwu7+U3Igle;a!tqmvP zW~XlZ?e*^!fimDP_JqN|02^;UovOdIqPK|E8|=@&8^f2yCQYdj8$3Kl0e*X>62R1#zwknD<1y< z4`JKJMW?mTDfngLpX|G&is|s9I2p)8-AMQAp4I4HBrxhQ!!^$5l`u%i>_!If;ynJf zWJ~FTwshG^O3>z`d6!HO0roYo;cZ=0M2p-Gu!#sJy<2GKWoczPNaDxY}_BW zXwJKku+MI}@2vgPm5o%L@$TJ?quBPxw_a+c`~g{vP8WAvbGJQn?rTc++E^LM z923SkQav%+sodE4xomvRzyxq}R(aBqMIkQIbPNa2p4d42ewDwbfg7ilxrb-ZQ{4M{ zRSOG0Dnvv@1Z17#83&AyTvlxB87GB*#p zG0^`2I?>ZK;cm?t4I{?LcXb6%r>=eK-IkmrB_w5&e;CFT5ynn`56IS(T12)vG7O_< zJ4nM5=sjzmN4-NwaJ16Fu-`n8N9KH>E9H-v_e7G_W|$b-G+@A!$@C-Y zdsKQ+1?C}?uo=NTety+HrD&~vDzd3i-!4~ZFOG4~y-lRRl1rG885JAu^inb3wRFi| zI-U+4+Y$38`zGZLu)7j6J2QSCQ^YSKN25J0AVfmQ)Fqq}h3!VcACd`Eyq=*)r}eF$ zAcz8n^1wTkp$svOxc;8i9FVN}NZF(0VL-qje}|{NT8^Ytsmm75V(JynA==xAmYsMR z$;a}m8cn#kEgI$58OH>1#zFpnO7(Bq6X5oh@rU-O@P2{gD|gg18@s8bzqV&!Cq#lm z6LRAjaUbMs&aSLZjpA)q2;vZZhf}H=M$CJUY}Nfem&!ukTM|PYw;xZZ zQC7IfF(&CUSJMD@`uDCWP2BpdHXffMb}=NfSmi8CpaF(G2|e-ru|d-9(kE#qE7hFBIEL506}E=%O+BaWHrjw(6X(CEQ*FyBr&l~I`q zUIy%suRoPKEj%;>V>qk4Af>qwTSHenk#%y%=d z896_o_Nuv?r4(fiE;+4!W;%FA>*?=Rt~A)tD%<3=zsI{H0N@Ut58+!sXWEL> zh6J6(w{WL881x-zxmeZRQZU3XBb<8h4`1XcjGsdZ(Tul74Bj7tOtL82K4%9YoOK`P z(xZmO2wpcK=X#QR4hOz5&3pIk9q?!V7dP!e;mch^O@jXbN6>fcT926?_)IWhh|WkE zXLKF%0k0$RwyOGv#NQI#p^n|IwY@>&hBOHpAi9()s*ZpGv<|>ma;Etd+4D~uPFT6& zq0trWq6Q=8vECg>TmiiGACGK(YUFCoHtE=`gq_<|5C(D%J*hOpb^~yuYUM|$$mDxg zg!XD<{{TjcA{bz?7;nS*dRLiI`^@{yE44I?!T^XP78qm3bAz6Tx6+dfa0omc7Rcvl zWW&%InWjw4o$Vp##$yN4=zV2=L){eMb{t-z0b0ppNx5WmcSr>#M|lVmSC#u-_H zv`LjfG6D1lz6O4^Adi0$KJYmw8Q}N8=A?^H`C~*;8f1_d9J%yw^VX!2AG9BuFs#ji zkK^?R`RCSwU%6b#xm3gs?Z*s8Lh;kzH4KZKEQbVfzdSLktpmox%b4xP6mL6A zH|S~=i*Y`3`K-!G*xU?^a6ivVB~7e}C@bdY4#$CxgrC-(9g#_+Swfdx%n+V2{yg>c zG+OATB21MnEI>+B|Obk6eM*rxoFvG@fnBLdm_*59=v zjz&VeWM?CEWpF_pY#8Sw-1ny)p$C{$4DdH`gWL116!65R5%#&&Q2eAuGERF8)!Tg% z%E@q%l0y1K5hZWq5gGh-%hz~HryO!yB;%+{{a1J z*Op-vKtzfe0R(KxPp58`1|%VmT0wX z-crVrF>Qn>$Q#&qIOs9nr#gUlBH}kvNn#W(=02W-Bb@Z-itglRKRw4Ljc~|b5?(Ja zdu&i&ZVApa$mz#ZRio0a#kSd5VwzPh%HMWljzae*r!_IuqX4W(#Ile!wh1G@p!_OZ zTgc=pg=13~4oM}>2t9Go_s?3^H$rMG$FxVAPq#88ax#Kyim#&TOqzYXax{AtaCWW~5#Kn-?frVzrM9h+^1HD{50*H_I`QA0 z-Kx2o7qd*Hi!6-6OmRmXeSE&e^(Q=WSEE^y1y%E)LZNXKY7~s*0^ISO@;MyT?RglG z7ARcj0|B_lB>Q>~dM+A2v!kTPYTzR(kT-WbyJx30tST*;l;}Osnsuo}Xrqy%^2R~} z7|1e72iWBC*XdTG(_NAx(kWGJ=QzO})N)Ak;^(#O6Gn1;@aX!)$ritrr*1}80V%)?M;zPw^0zTiilM0Y=_Ct zf7z?|H(zGDbeyD7kQ)SsZ)S3Tiywtlx}01yNS;}E(2|ON{{VFbee+gh%F@)9Yg?8R z89c@$s9@b#@Bz1wm>-^m_DD4 zDG0HjB2}5AV5Ng(F#r-rY<)PPL@pjwsH*cv8mjTN`6U7Ej@hS5j~p|_2#y0HoF+Fe zU&Vp%R8g42|L3tKX>M&63?^? zdBFKVaNT6;GtX1>qm(YlE@OWoLPSwG1&BDuPCb38zErO-n2)z|?p53KhRz30`0Z9_ zyO->snOS7Pe3s7OI6vW4-rb~`R^eThzFozzQ|f&U9HQpaQ%=n$e+u}9Jw!_?#PPPt zasXTmZ9NaKxfPVi@Wg~NYBf1GLrH$JNkpfA=k^sm#Jx+U{>6)!Az07*v`Bbc8)vyLb51SyL$l|i>#6Yer85IFyp`Vr^BeL z+!eY+RZgHWDhGUV&Ocf}(-{GJFqur1a%!r&sr^UA`-G9!y1AWK0wEv zqpt_KB9du5`*P6*h`-M0TOoU6KAdw-mOm^qmfUhaVBERKq5P^M8c?2ct_KD12_13M z)7F%W89ERdUGY)$s_ZBoTZBLy^gWJ$K5416H0*HNc7gGy;a-dVo$#;X7Mbxg!_lch;opf` zdfv$Kh8d16K`}ICm*w3dkd6*IgUs7}Z1A7M?S5(gD)<-TZ|v>jD|RMrM?>AJ_mozfzOPeaq#(sp!pw<1uD&(DJY08H=?T6TkeBJnJ+PICp!kt4+-2S#1L zFu~&our=92yHkz(ilpxrndCnYwd-w1!TMFknRyNUo#Z6NdlpPn$L25&gq-2V)6Y0Q zwb<#?q;Q9VP>#i-IZiru&qIUP^2K?_!#k+0d^(o*Xa>p<9VUjAMbc50rEj z-D!c~uz;75+^+T~ErlFl=cxxhIU>KJa>~Bj4^8S{^rAS_+h#G_3>=@7^ZAT(S;p_maVoQ5H%<6Fj&eHz>sGC`8Kk$1dj>|2cp&}d z1moy`r&{z6A+hY6&hVhRjBglR97PrXc+Wi1rM2N*B5QIbjQ4{m=d2}~`LSXyOL(9G+!md0bj{(Z6d)s|!|41;!Z zRoD_yyJU|3^vhOzd&ejmB-^pZcdGz+IPP=)0;Nm21Psbo69Ey&1MhHg_*PGIXzz1B zSF~5tR!14d#>C1JK^e;qdFR)qb9#ikwR<@=DBK`zvK^!VGtYj2WbyddN#YsVBWPy@ zBaOGZt6^1FzvEo)xq6nd*~xNal-_S=2>4jQIOHCA$o8)%5c#KceI{QQ8a9_waU(3C z#`46Az)+=zJwGBi?N(yD`#g$YF`{f`B@Y89ulJ8`IIP_(Tl;V^UJ$oHZYuAFbm_Q} z#s?hx)|IS_X>jjy-eRhtO#JEwdE>V@uTqSYNb)fh+#9)ZZb#ddgL$P>AxJq4I*xrw zKb0l^e8<@_g%x*YRNx+<{(hddW=oi1GI^#Zk#UlvIVYTF`H@lFG;3@=>tQ!##!C$6 z@%npLd>xM>W);l4S|PhTKzx=Qj;ABn2dyjFL3b>1+^WR#Da6RUh8*4~KMJPvbwr>s?Y!8&8ToFU6h|)MxOA zidMl1@tP9{97h5qhuE5zJRmZH3V2(Z4sTgT(%0Io7i*Tt!?}af%QLy9tgI* zwu1UI;A=#ZIl`jPwqgP4>HI%|>0cklwBn&nqwfB_=MzY+C;iV%%r=$ zzBVz&GldxAA4>CGFZL<%zrkyn@4sYU9cr3Nsgc&(O}=Ynea9@%Zg*QqPpe0hla96d z(?3LgkJ(SzpHt92D12A=udnB~P*-X2PBoS$5~wiu9}9 zDoaL@ZUNj_vrDw8=dMBM20B;ZR<-fp$NmKIYiO~_TPq{7oIo)W1?9FW&?7A0`$)r;Ql!^GZSV!rHd?hEEhZ;=d*G7nrFe?B71Lv zUJUz0Zy%kY*}8|zY;PZaZ^V&f)%#dzI}Hl!4T$ccjFe5WTKp4cY6kM@han0z_3Hd!(*s}W<2?Z|FVbK4%3m^(^7^r~ho2{Ho(I1EM?&~5a<&1uiJcmgfN zvPj>+MmK-Ejyry|Tg408tgcy*sOQW%IrjA(K9pFAOv!5;Tat=56Oh4h8=v9_ub`-w z$VUUn14dMp$ZwPbz~uh`KT6y%!whl=nnh9w1*gu{Jpeub0G(32w~pT5eYRLB!vrCK zIqDDe?b@wGj&nXA4#^(7q)4XK%zA~KU@Vv=MCeNMzySVYzM%1ZrTj;FBN;MI!<-xg zo_@IFHS=t;+9s{0`EX>d>;b@Y{{TG~9D4QUzKQW1f<1olq8zDUbIyOlzGpg*Em)sh zkxKMi6HbsUjv1X&Wn~68+Q1QlRQ4m*xDSVavj&Oqnr{zB;SUygs%;m;H%98)OTL2M zRAA21VBCcgH}4#`%t<{7uH_VnL~I8bV!&s2AN_iBkjOq}Wf%Z<9Q4QauNe0^*=}3E zI%#CMi0*T^_AQgwKZi<$W-!kZtVHAte8bcO-m9}nj#!p#9H`Df?0%hp&S@ofg`3O5 z=cp$eeSx4&+?=4)0149`znw?t>_d&f zk4}IbpU#mb!6dQW8xivHk8FR106nEFrE;y7BcTP(G5ovrsGx*zNZ%tT=J|U60EIG1 zOob7fAhE&5G3&)1ap0gOa0Yhddvo4^E=n1sa3noGTn-p|AM?#b%)%hf!z1S0M>NQ; zOQ+08-}3G!81*>pX^C>_jjGHtaLhaR;+@BG!Ivy|oDcShC!b$xdog4C$8`*Lup_TO z&yUKgr1IfL7ibtzG3(#)q%txwET+wj>3^hC$_$cwT+aJvgs`Kj5P} zv^r1iuj0$qd&qAsv<)$1hSx0jA%x^EJ1XIhM_l_?-muK}?8=39fx`C4>^*(!^QZm_ zd9Phre%u}<`z+~i9ln>PxphEG6CAk7^f)|r=hnQu;a?2V`k#c3+1395y3Zx>Br;!W zGHZI&>himljxmg)_8(rH4z&GKQ8%zO@(A$KWT@vS(0gEGKU$Pt+}`Qd_d47*)|VH} z^2Kitlw(c5#yg*W`OPy^g{^IoB?LG;2+j!49Cq)D_}L_x{aBk(CW?PEM~P#aJgFe< z=z}@O*PzdO-qELzOz`#G`ii;xLo89or{;X{4nKrvy+r;T(X_u0+gf;$uYTEe6jRCN zpaB$|VVpj>2a9Z5dDE0wKJRuvqhsn7U|Gbl+TMvgd$ ziZmD}o~(Jm$?e*w@JsKNm5(f?7@X$=zu;8#B?`HHIypaUu7 zau@#q)yE#S)Zb__Y6>E?iffZ25LO1mjC3UM0Q%Hz;ivGwg{RbFw3RNM{D@xQ?-6Abw7vCWsN8Q>8^9NiX*EO+k;kLio1)4R~vkV1Q;|H-n z)}0K|K=$)%5jDKGQI>eN9fzHykUA6B6pmWn#un0^<~VL8e=U{1_QQ;NfHRy@sM}$M zjX15fBfjvP*h&`S28n?ShE2I0fvnFJX%bv%M8|YsAmlJybK5?h`8BqX-Rl}I*P7yQ zDnP2wA;a_h!00QS_^G4Z>AoL{1+J%X3@AbZw)=8H=zee1*XSIKfzO?{X*-Sv0U6_p{Q3U?f?4Pq zg}3e5qRp$`HN~_Z7uBvK5>Jr>4ws{I6tM`FzzCj*RNgY`YWwfA{SwjCeH z9x7Dl&u4Cl3d*=99pRxk0FBGfI47?eCY=(mn(nC10_CyC7Q!!&&_XOl0dwuWgKyWK;zrJH2@&&R!*Rt3^%_$DNF8M>SQXz za0KM9zGkT7OVXDO>w)PC>KzGS) z9Iuh+N|V~WM@+ejc{Q0Xm^YoP&d;>~QVX0MF92hod{>{0NhHwfRc$0-UfW)c%W(h% zHqu8=_kO06N`JA;8hdMlhS|4g0Oym>8OL#5E}Gb2AdW!QI&+QqG9?UZ(s`+YIhZ*WKoDZ)YpL&%{aiJ*?G8}{ebH`lz z4)voaha{WkXpk{NK~e?|e(4{@Ngkbd0Ytojh@~MF_k6A2=J)#4*$1?do-E;s94c;! zm;lP4?IdRa=O9#RV+^hw!UOVnVnE~5u&wEInWLL25&h-^0K)@}WPTM6outm!1O;S% zQzYej=Q%W*u+>ImPojeoh293=loZ^l=&C;k^@v^U3g`qXV&n9lg2dr z9wVq|%Lc0^XWOS0~fkx?AsyNDm zP5{qb_8jN*tQ~($Fo$BqsK^XcCA$_L)#?^L6S>!~^t){q-b=>SL9;Pz9D97Gs&AP6h%g`=Z9tKK# zeBF&=$6(CcU6~!pI3VEm;=Yc#{fPb|-orPOps2_2$$JWc?f@hc^fgjn*hAuE5$}V; z_AG@-1Zq&7$EMNFbIon+n>71SiZfn#(;e>u8X}Wx}{{UlHlz@kP>XGF3AYgR&?XW?1z#Xwi@Gx673n=Qtcvbl*}VnNzwv*3#T66LN!lVEm^FzJQL{9C2DO zTNEnsE>=JWSD)w5*QROz0I^TRK+>hfmXQ*-2{Y;eqi=LzxH&$%YTx`Zzr+nT*(SWx zbj32D1}LwU%y=JooB@vK8LV9n$FWB}qOHt%B$g6KAYF~L@*9w?>T-QE`BQE#mI1Qu z)mlct+&=l~k}<~}>)dpI*lWkS#kdh%_(n+?u<T4X=c?Y>i}q+`<8WLsEJ4q2Z)&ySu$LFW zBOw_q*csY+$vCfaz5f7$aCo9CBR`p<9I+4PU3}|<+XH}oGEQp6x9lC_Ej=@%+~~qa zJU80TK+ZwN-k!YIrB5ucUY+3^qs0E*!_lwJIau+pvb>{gC0BCeEHc9#G3&=_C9`=H zJdOwrhTHc;b;dm_+T{I=JZJVW=I_JnHcFDNUvbYQ0s+DF>N%@J_9F4CWsTQ{71IiQ zxt*2r0mvBRj=9gJXZ?qaYxr;OJ#Y1=0Q7Yc;U`ZeH$=qAoxw&hIq9FrrB%7HFK@Es zXD#v(&JXvGuhP9|;{O1^9b@2+g6;Ls7+q-d!FO~lRvTGaq}+MWAZH!>jCZWhgTDxG zJ~`|2S$H~YD+`$IUgv$;D42|l@&V-T82oFQU~0yqrzqL>HmRNAs!(+l*D1IE00iZ+ zE&F76ZdjsejlHGR@&Lym1pCM@G=1Uh06Kbri_OkbAil| zFYuB8%I9gua1UOW_A~vHwQqx;6*a#Y_=59Ay0_B2J9Fj4k0P@)#B% zCU}nO`W5)Cr+9ZqS%SJ;>36bBu$DY|o781TQs1S04IH|D%a&0;AkA}mtij?i&u_&1 z%hIF$=@&8l@xPSuZTX_=HZbf*BD8$PkwT6ghB+K^cn8x0zem4l&-f=6oAK@;;vWKP znl_E%XN-uiU`A_AL3todfDV7#9OoS4uf;w;_zSE2F8GUe;ZG91nZ2@%yz?cq?Tite zjtOy(;v83#ippv!UI_gQhxo@2jD%^_cAsW>=zz4X?AFDpF3VymfY_9rC?A6T<-J)`_*Wywyb;q0Cyxx z&(}HUrg{^coOTuTbf2)!udZSIlD5>`p#+E=Fa*Bi+;k$36&t&psRdm3|v*RvrqLeN$Aq zw~~ENSCInAc2QZ9DAa$eg>pb%$C61Vzb;Z1yOvAkk!Jg3vPww=0?g&PZ{p;Wp5*4g zUw$BI7FwUfPZh=C-xBF^T|=i&8I3`al(Ln>0C{Yl#=aKt_xuz3O)k>XE1wo=>n*ea z0>@-Zw-^DJIL1ykuOrsFaam9(;I3emtNI3pp+ZoHl`$>zJ!{{RI1 zwT>_^d``!2%*Hz<1fFn6KD}vE%B$5%QI3p?yhDbeHwnE@mZctB0WMVzcHv3-g*lY$t!f`BrT_0hVEfY_>TB{{V#~wx2rr#061; z2LVVOcSzA|f_~Vp6+BmSD9-Ki+92Tf0FJrHAm^rYL;k>eV!X09imr*2U@@~* zMQ)%rM?wct-!)4l#eXRu>n<1hzXRozv?3>Ho)O2)a(Ny2?bfV8W#txWk&$HJKC3Pypb$oEXZw_ zYi;UFj+xFl;+x5_F;{Ukj}YN1K2;;;`N(utlw_#d1~?y2YLTMYk^l)o_P!**2?-hW z0Cxx5(xkJr7dqod0p795Ha2ivWP$CR4r{5h_-?m9JKVA(o!CXr(tBg62cNBZ{>8S@ z>a0phK8GG)+=27FboB$%1E~5`;@y^2M`v8N;Bk!l=lT2BTMxr%RU}rDL;=3);NXr2 zE5}~Ar%Uk0RZZoTMhRYe$=K~3fak9r>3bL0)9Z1zhF*cE2<@bJ&zkZ}fXco4k?YdF zrT+keUHA^<{BZFl)w216PSUrP&oCCj8_53g{V`uZ%i;LEBc#2=?4m%RmnRqm3~)Of zXP$j4>#z7EPM-FD8u9+KXs*w7B1F#kPnck_2l$608R=bEN^MN|&OF7ZmN+M?XVcc6 z6_+I5+$=&x+`==GbI@e**P6EvhHT=Me8+2o2vy$alb&;q)i3%)Fm8}14Z9iVw?cm! ze3OOV3BUsi3D{RT&PTWNuT{GrgYqSyv0J6Ig{`BGHerH74t>6y^`chF$R=(8EOK&v z$vw_$xYS3=$YIYPGq_Ro=hxn&U0U87R6}uZ8}eK`sVAPf=d}r%MhO>#x0u-q?7Vz}0~YH^R=38M@ZTW)cT@yI=Xl}7&n zUWy3{+q_Q4t_aKV*ZrLIsg{ToS3+q?Vghe(Ts|>HX0D}>Hnefz439Jr3FM9sS}U2< zk8^LUzQ=%TrEhd=mA+J$bP{DsC^^B(la2=fy)==cawID%4ina@U(g-hpxsI`i2_uf0}D8bZ;D;$+G(CpZJL zp6ILT-EQ(kz!?}oV2kH7(sZNRbnf(9rkW5>Z7n9PtUoicSxF?h$O*zT;zfX1D}{4 zbB|8+MRt=%AC~YUHW)mLKurGtd+?;`+}1VGtpqD6hjcBui8%}bM*8$4rxhqTVZB_l z02x&`207&V1Jm=Wf_0S?p;cgV038MgUtICez_jao)zB^`hmY-D#C z_aBWMr8cc=6{7IyVnxNuK(dTPRPwAnj{~Uo>rZVP%JRjWfail7uF|XyI334vPnUhV z?NkmBs9d?{BRmt>5&ktal5plIhYy3hy?YCT&+^VUdXxSl3#I2gfRbDzW0y>82J@u|S~? z9N?3OY>$@*y=td)V=5?)O(!Y3H-xGvP2PHR`f%C4HEZnRSu8))M8$w*!;%L8 z40_|k>9HvGP^02sjbH`raXN=M4pdWe~$ z1Gq8{Mtfr;JuBA41yt@$#j*nb026v-k>5XsCGOa-?J!VC71ZY-43K&X@lSmoPO^Ms zv6m7jh+QLQ8;{wf+mVn6Y-6CPZhTkqb4^Ji)vfhuk%)Ob%M{qodJL{{$>*rAVYs+v zg!x;Lj;oBE6UQC@0G&%6%!ww~o>e^n$;mkM%{wU;c-6CiNqYPwZDIEF({xrP^Xz{Q3XwMp3LI%0v{XD8LT#YVBV;mYT>FpOa2-o#liw3(R2_{Z`_(h<9=`tQZ}D%gWjuZU$iHSpz?pTv<($r z+G8LOrb;%pF~bfsk4{O=dyv&GcQlDJmYD6yZYqy9j_gqMEdmB7J z0;lD0G3aV+Bf{?g0BVhUO(AYH4H?s%?zOnLLQYNxQh5GUmLIjoqcHyfk#9y~({2o8 zomk}L6$BmzI#<4bYwkgk=YYhL9B%&U81M8n%X@*n_WhPJoc{o-UF2s3V;p*%Q&H4t z@aVs4?Mm)gP%9{_ahv48SBklvi+!~)8vBl#C{*s?>uoN4Sb< z;JCu5X z+~i{(^cX}06yJhyH+2Al20c4-_*H8?SdW%w$cXuINaU8lYIJ}`vmz7ZvE1QXmTse`=~KH!8{rCvi0r}doFByFJl3t8qwOzZXqG}%Rd5DQ zM^C&l*j4LW`)Lpr5fIEUUNf`(qCH17MP-5se{fO~M%)G7a7H-?fsgA_Z&li>DU)P= zX;+hKkOl*vTw@&bT=QGAs-HwuyJ)X97~OXm+D(cIg2;++IR5Wb%}3&WE*(k}4ZxFn z$+;aqRv14k6Wk6s>58MJTt#!JNhR{EuWlH~0{{au@G;zsOayHJDZc_WX)o2%N}U)m}}QWk<=+~e+(-AD%*IqTZ8g~!>i;xNbdd&oXQ z#d64dfN{=!PZ;{wJa2`ap2wkhW2tj>I(VgyJCH5f*hd^-Lx5D4Cy-Ba0ps#C%hiq| z#%+v;<;rB0-N^*|5&Wth8treOvtt^^Fh*8HZ;_62S$!9%_2RE;43M(0KtXV=y};T4 zByQ|T{LOmstrvqOwQyi zYF$-h8@X%_x!~iqCbIKh+@yAJ83z1C5XvJGPDx+kYBsc=#uU@`~>s(7|QQc}W%V3Q1IP#h$ zY=%CgzI|7{b^iba?j1fG{5gA=gu>^-Qrni@hh3LtPaVi31pYPouNmGjrw82qUxJin zI+Y{T?`^!x10-*XM2A`}WRn!xIR6f8uzZpu1UNiJQy^Bo;Z^ zPjl1o9V?sh_w32wpNNb90293)Z7S^l0L#Uvm$#?!sQFI^xF)qG@ujDR{wwP%e|HU{ z-Nd70lL46&f_d-3$nV$Ix*LBP>6eg{g7U)P5wr)wZ9b=wpYxg;1LoHKhkQlwZuWh1 z_G$6nx8aMcWqBBB7pG5G$ob5WjKeN^;zVwFs@nI(e~MoQ{8uKU@vq_ThvMsq8DbtL z)7noA_>m)J3eI&6JOr7@JPnbKNUx+dsjTMk{o;w1CTm7=h&=QvM_t`i6URCHt3fW7 zNYQQlmPdpnv57-~xaT>@2Oo`3C>(d}`~Lt1x$zgm813|{uZX&ikEO&Ft@MwI+7wr| zw$bAP2=$#m9z<$z15O>=Jo8^^{44(ef~{yCEzoSWKZ>6WwU6wnB3WC+J^;Um#adhL z;aI~77h}|c2>^99@GgV!OTgYa_;;tx;*C1oU(WN3n}}|FtA##eDag(njxt6~d5?%c zV9yKaekZ!rz6$u;{t-Q1XobpZ7S~c~a>P~eQd#X?H>n31ZP+7_YJHeo{jc~N`$l{s z{h>Tc*1rV4BKTKU)h)IQy)JqF#i-ea=Mq`ZwnbtxGDpx?&)zBUh3|rO&0g18wY!1F zqj1q~LRE*D+gKi$!5!=JGva@azA5-_Xtd9X-YW3N#CuCCg}AjIA=54O87+z(!Qi}y z%bFJlm10w}M!5IH{8 z9?gx$=>1&y?Y>_D*o#vlr}oqX&P6%K(~*$?Q9SJ>Y*7{DP-^*gq-dWtmj7cJpcQG6R*QO6Yg;S2>RgC=h(#sTTsURo`Q;r6DXOY{b z3Md`Noe3d`g}I7ERL;>J)1Oc~cB(fTa@eLf`H{KW0)he@WS)BS-=#YH#20q)GA*^b zx+hjv9OILMGwb~-q`IBW)Di8rY{&BfA0|~{p8lTIs#h{JwVMwj7$%s@l$zPc$^!8! zo=;FK+x6*#>z8E}g9%Ay+w$W*eweSHz99IbT?4_ot>hvpt~BdIeFQH9%jU@*84;0r ze36VVKAhJS-|$j@iL-{ETKHYz!S;Z%mYYY_Ala1}Ql>r+JuBsN?{=y_*M}E92V?4( z?sA}SDpcU}$Q`lknvvuSCf8!bjiU+&PxJJzlqLTFf|~fe2@a+3zr#_4$IZI_Bh+I# zi{+1dO=bAobl->2nYEJObQ1yGU}4}0+E!(lK1fA~mciZVIDC(FX~#wtkv0N|?n zb3mr=;ijD=j@TkU6Dr{2kOM6o=skpwsG8wKI7AGr21a@l(~g3br&R-a*!@FeImb+Q zHS+|2@KsL^v|!8d>3}DnE5#88ut#u)$|@>c`!ALp9++CTUy=Y%8x%kcZe_~_n7vuQ2| zehUBwd8t3)=H3T*l+WOQ8!NU#mAw+~;G@z1Y3Q^))i7vU|^1!Lo@Vx2^q3z745#y_1L%eZ?Pc0Hyk zKr7`CaCZ>AWcTa*>8&~ul`0QRgO%Jp53jke9gF@73GjXT>i#W9R>=~0a&x^02ONK# zRj9vjKZ4BUj}vQAN1Sdx9=R&VJdA}oBl%IxhN#H(m`>Sa+FQ(#uviY6KmB_A`u_le zfZ7?qZSNdvFv)4{V(E|?PcQo{{RB(iF4qu5!~BHYpX4rDcuxn8-f^Q0@+_vkH);L-bv7D zGxZ+{;V9=9Yfe*+(cW(pc!FJK?nUyUC1XtRqqrW!ujy7VW&3n$CvzDG?~j)m^#1@F zsBNuutNVQ;LSpG?pXpM$$IXnA2fjs9*6$SD6!SxE2WcFr`e%%Eua0i){;XDN$Dv*L zbv5lC(^Jy!?4gF~k|{;g6$r{Q!*}rz0XP+%sB0FtbE@ggWQx{5DP;p0`VUWW+cjHV zm0<8khwP`3Wglc)hTLk=Q9N_cXvh>MP7hQxW%YreMUtT>ifmrXU*9mE4Ue;O* zEj%>RLlVizW?&9|KD8&qS!0)2oxn0K)>VDqDbI2B=clE5C+w0mX}&o4isRxwjidOB zNbvsv!@Yl8YaL3}E-jv0b%D?nau+`_UEM$@9cz{SjWwyfcl$wjD%Zt&Plq1Y#(KrH zdWD6gKV`B+xj6FSK!0|KF@Oo+dYspzPb`&MahiV?hsLgmq|G* z{3670T{$c?l{ae6%WXYQ3vs51XafNgEjENgOjIhz=NZ z`Z4t$gNn$rxM*dJY$j{joHpRans+7RmnU# zs3d{D%W$J<=@}gQ40Zms2=M*)oFr>IlwO1P50>`96-k2AVhAAfSx3x49Ag6@byr>#vUk9dVm#iicV;Ey50V4j%A12qWKF1Imwrbf>nDZt~U41BDgMTCpk zozSQm<&-Pq2e;O|f5N(CEu>sDlDSzg=ahxVc@JN2x_9ChNB!uf9?M`(Pu&Rd+1!~FN8_8NC1c!-@g#g%Lm$X&eWBkK1k*LpnX1{QJEej74*|Ub)u3Kw1 zK;ZGu9+miI@nx3##{MgNh|!JTi1jJex!kAilJHOCUD$7eN7-<4a>PlcvNWCq@kfS1 zk7$$woNx!fzB<-Uk$Bo0TCLZZc1kyZHjs1Q*FK)LFTy=WT{BU8R%K|&Bi9+@80pjB ziqrU?;TiOYu(;FrymB#gQ~W2cLGHW{$J({E&(xt(r7KNteN*rTM7Z&f!pWz7w(oc6 zvojH&-Aj$Y_W6fGE9z_8PcAtbeA#1XWd%R%Lo9ok<(1HlEQ z#PY*F9c5t&7-5nQOXnlHiuzhl0qIeb{fOF*jdH_lKAky=9l1FsJe6bkcddC;ZDXGu ziddO*J?vSzI8s(p8Ab*h8wa=MYN;h%Rwa#ydFQyLg~!@|eUF$I z+*js6H~^1QdV3n>=Vz-5F?)@ZM77ic{jwN{QcmEb%magjVbhUUEOZ--OBha_sg`$N z^%oI|Ayqtr8Ag9vWQ+ce-!x38w(X}UfDSrzJu7h-3s~9q0Kg5gk+c8+I6X~kPHs-c zRi_vv(mB0h?CdUEklRah7T{HyJO$i%JoNtn>sF78 zWft(;sxQuF*^&u3?T=6mRJM*Lnf}g<<%!w@;EuTG-oHf2mnIfIXT)YPb!)OIEX)Cc zz&Ja$jFmlrJ?aHf1kspKBW*ZvxWLFKJ>Ff1 zw(e)S1O(F*Wx2-rbD#Hk{Qi|={t6yeZ9Bl$l5$o{tB;sqFbWWpj+{Ro`qr21KcqmK z4y`LHAbS{X&;nUe22MRmCvWLrDCHUEo`=xNgsJ6MzU=w}J!104JJ@WlWP&|LBX4oH z2kjB=$x;s?ax=%JSAy+gjzzi&wTm*SQM6;R&jfSR=}IV+NKGk|*Hn2uy% zfsip^1_1-|Jq`tZI*Q!**}_S;W3u>f@h?*NYkmftR_jicm98w9ZjJN(*8UPlap_$S zy`p$m_MnSf)ciWiy3UreX|hhc1@4$w58XN+yp6}y9xKgkZoIpddvz>bw!|tmH7mDd?jEAvq_%O7$dvw`%j+>5)Cv-OQvc zFrks0{{Xt9KAkJod?l&ae$}26u$#s@1=KO5DLT&f<~Z5=O=Tl`V<3w39{_kGOZa~T zaQHgS#Q84wlVR?OYqAuM@MmgEN4?*$2#r+e&P9eLUFK?6P`xFcv_G7*}bRAE6@-G_vV%L0flSO>ZVW)`7 zi#S-7l#)LC@J4ILhuUcDN)S zgShpsx^yEQWvRUk0)?EGq&D$HwxTIYEMTmNh%uAc;9&9B(x*k^c?Yq|`*%Nqs}`0f za{g?nnJ48OkVn5@djA0W>Q=C~0EKPtt+)}K6ZHC4u5m}dgu+QlPQ+149#ssf6BhYf zs8Tt}$G3mRr!s>(NH@E&1g=3*jGmv!QEd`46;XuA&fa!Z&t@fTsdi>=0pOq<^Nz;3 zB-1{Y4#^Ni1i`j>Z7Qw-Rr$K|4?Ne+Kew&v8t#P&DHFZG`O9NtD&aRrEUPV zn3j_C0AC5b4P~zt&lQ4xgB~}jh)--&(!wvU2#x7 zzxF**r~EPf?){8+u~E#KVh97LUWUD16Xlg~qBlRnt&-W#@pP{>{hXj}JK?3EDKtvu zKJtOJcI1o#LFb(J>t2ADp@VD+HjIF-Sy+SjgC0&sIIFu^G>t;*-+ zYz&NWGx*dmaplIoZowhs0Ctntr})*V+|A2Ub0dAPEx5kjz~htawEqB~dgZ<_&MbZz zYaUx>KO~g-zEP9U1E}xE0~OM}%yYV#UA|H_0!TjR*!tH6`%7yBP5484$;gz2182%X z$mEVjdt<4raZ*sFC**YD6P;MZ`2*p`fj^0LUpstj9L~&Sl}g}(No5|~anmQ7^vGg| zO^3|5nPY?knRWyz9QF0@^fl!6J}|xTu8SSNhZw~pF7{?XO7!FA&IfWmMRxxH4175U zimhV4@h!x&+{*Gao^}8r^Ts$C82**{?G)=xrMdcLS$isRze3%|jBJtz{?3Z#=1@$# zmLgSKA9aZJ9R3x{f5KU+c(28l+Eu1)B9(&XF}>FrImhvE4}Jl!Qt>1f`X7R>W7A=d z-ZxcQl_JSu)a2thJPiAs*OPoYCiCKFnH+)>7?2jg05Kk-2Z_Jn+cy{{ZZx;dogIYojEfC(5ms zJf3+3<$)b*zMK?byPuo!&N0pqrRH^ano}6Y`1o=6!)I~!C-L{J>)jD?le_?Oz@`ZQ z0QDT4_O7nx(nTtgJ3MP1LEV6PHtRL$`2N0vsqQxDJcF*qyE1{bCer@e1@F|6$^mfypPtm>}VQ*uy*895^_v=BW< zO6p>ly z{{W5t9iL9|dRf}vUxYDvgUfLkPH~3EB;%ZWb+59#=xk#WyW4<)_MC#-g5{eXG1H%Z zE94K0^EKDR+oLa%&XEY;laNW=LC5>uYYbZDrf-D)C7H#K2fU07nx3WQ0fof9eF-P7 zNA;q%_DMb#;exu30AAErkmnTjJ$USVeIJYUCz06dT8JQ-BtYOY--6k^)0dbB;A8^C=c)AV#Y+Ti(V=kv06T3A4+?X^ z9{&K&nvu7h!B;YM!nO~&$>5$(^Q%p^%(nTl^KD|QluU9rdh?N=diEl$cn#c=TQ#>} zWQOI5Ar%*5st)^xbI)7~YF`zdg}X}1%0z*WBRyN&98`BQ;5#uTcHe9TJ)1E1x`dcDL{K(lKagmK(L(s`=!wodc%Q=WR% z7Y@s>+(jz6BrK|qKK}p*1om8v;CHJQCTpaJcrh!hYzly^ZPyIlbK7v~oK;wS)+R=0 zUDL7+>=!V&Y-Hg5alyr1j(5{h3`mk-FdX0)$s0y`AHy8geC%H~L;)ZhMig?y;AiQR z>~l<+<`+PSq;Zl+AZ`Pu6#oED{{V$I8xNhD5#KY$U9N#>cDN_0IKkR6z|MNrxHWlM zTg{7y%M1`5M;PPN*0HSiIFMp@J41f)Ibn~y2W)iblUC!*YN8wmX#z2PISN;xBc7w_ zO+>iWXuQrZFA=9?gg9-VKT(W<_==9^cC-0mU9Gndle93%Jp27S(Q+2rI30G%SQQG& zGKbLmXY{IimD<}|$QmBN4_9(7UnoeF5|yl*x=yG9+xMR0T{8pq3e7?%WP) zc>~&-4XMZ?gl>?capkf3LiNe~amTeYRKF_d7?fDo1=YalIu5zXIQ6Qnu%u~uJTQXX zG=%)8fCmGSli$4;>XA;5joS+-tmNd4)3jBq$hg3$_jp zNc89HPn1e`E}dEKtoJdI84<`Na95_{KfSy3s=8g;UC$4kWnjy=f`BSxIM1g{{z92^ zrx_Tfp^+DRj@jo_7hriM3-v4AoGIR~Ej70!HBxo_;vHb@Hjkle_z z5I#UmXOKFRj(b+dm*&Ia%O{jOJ6c4C1boB~;Xa?tSDj7CRFUY_g*noLB!kR@Yukbj z{mZzKjP%F!A6(QCd`-6aXRD;zy`_!(clJ*ljdODF>@l`U%7eh%GAdm%NhFFh451ij zc1A`!4`bIg$b5PczMZCvu(J~KGXR{8pa3^^AmHFpimfG0lY_!jl~rT7kM^C?LjL;O zL|`L1Z|w<~Dah(}{V~vYslVZ(w5!Y5+UD0wR<|Lf@^7668$1V*c9KZsarLhP)2!^S zRdxu2BanVvxde_ELPO<{pa);;| zWs_%KFmQ9nuOt`fL6x`KYIj02@`+B9KVG=bJuBlYZ7$BzPd3$VcZCGAUCAe6 z2`o<}`X8k}<6646bZ@lW$`M23&wfDXxxh5}1C;wEej#{hVo5by)t7h#_`6ery&39O^N98Rb**KFNZ(ey z9&&ukHf1E8z~J-89mQ|0bw$&ZNX9Lo7A(9RjFJvHu6I$<Nke za(dNwxzu!A?Ums&WTQtxQH*R*LmUi) z?Sr4h)OwAaQt7iu>ZPNMuo=jZXB_A2kSm?C@g#zIT3E5W<=Y7>k&ogWgY_P@Dc2VN z07iRDmY6vM8NpQ<;|H#CJB;yDIi{VMLWH9wbYAf4BHP{>Bl6MX^0GkWX9dToApUhO zv7|+QksE`|a)$Xh#sC=4xX7%V4MY1s&KiM{#K9N$5rQx|5^~X+qO*#{dV6MxrN^_~AE@~EV+boX*%NgIbkxuN4_1)N!`C~OtP=YJz z50wOhY=aE@v9JvA+55}y>sgncB)hk?-!QjhTh1R(9E&Q|2 z6mFR9I{*p+0YJt{$6g4}rE_8?s!K!D!BLeOcat{kgw_(6u6(wZHe>S0q%bRjGCF6| zu4?V>yC$g{{iASIP>CX_#s>?PJzK6%wKmU0dv{j5kzhbVy2d=h>IdH6)13D7rr&9a zdXo(`yw+AS2xdPyBm1m4z|R?|`n_viBUg%{DRSLhE%az@?H*e)lSb~STu2JG-bi2% z2d_$=)(5+h4ViFuH_Ivo+)r_ynH{}GYngXjYl#7Q8g*>H$^Z&S^*J8B>sd8H10qQT zGZw%;Qn4?`Cxgy7>t2o@6;2T4mWPds!B(94qV9`Oy0a@fbvR)R4dx&iwF3JNN6-u~SpA!WiS0-Za98z}^n-m;~e0o|U6%;u~nZ)sp7ijrjQ= z0f#}KKstL??z|EXfp08-Nkc#pn+i`N{Ob<2)Qwe20~HMuJv$2nmyE zQhCWEsQ&;Of@`=gW9id1yYMqM{s;Jc2LAvhbS+9X808o3 zgn^#9Vo4|3xcg5LI%+o0V{R3MpTc&izykmQitauQ#pV1m_-#D?RD$P2)gySFTjh1T zVUJP2ob#n%Tr(EA%$YFxgBQwYx zs;)Wwx^YUrR{ldr^5BxZ4mJ2_1 z&7(9d4#9TnF%dvMP)HuVx>RibNK|d6Ft{;*0aKp8jcv(uE^>eEZ9>}BL|6KZK4hDj zQgRfG50fj~xTv*_di(wo8`l>X#U4Tm?=i5*#z0Jak`G#~9ji7(NYS?Jp$Brhj@Uos zRDL3Y>2+OAMaq|VD1nrN+mZQop+KHyP<#7`EaHuB?o-NLqcWYcDE9TouQcR|ZglNa z&1;#wgo&dvIX+VvJ9E?P#WGitHv{G>2P+`-86*MUK9wD*ORXPR5EWE5=nE-q$g3c3 z4_*&J>BS9Lw9a1kC{jmlJ|P@Rc_ld{f=DZ#eTc6n@x8DYidk67(wOkamQpj+P0as6v4BWUb;XZ#cY07_`T zZ2tfQ`3hHko%Yzk;Fh;y2<`~R0O)c~EAMSQT?Z8DgB}(2OuAuUupKX1!U#Gv?t{$5eDN_~mb6 zWz~GuctCY53kjXTkyJd@#fbrL+ zPvul@;*(4uf{v`D#{U4qKsYPzS2@LIsOoC552>N!{XR+NwYX^&#={V48-vu0t_Mj4AoW4cGsJ&uXOn=Nl6m=)uRPQ4klBA-iJA_b=UqO>hfxrQZA)( zGVD&q&Q1sz&lu$WMSRD9@i$Aezp=dWLw%o3wYs;s)Feb{9xHW~e8aVQV}YCw%g0*x z9}s*?@KxTYaV@^TG;qlO03*JSb`i74Y>4>dAIiQrJW}?m=ihMbqUbw!HD>Yts_ae0 z>a>Tu#*9V>`@WT*FO6^Hl)l?Je8Y}x;=vf|z^?|m{a4}#gsiL?to%YGW+6!a%ez7| z{6G}^s=kf!3&Ho-Q#9T$(=9x(OB>jygL&w1N_MXgm7hX%((A8u1AUiDl0{IY$!7pp z=hJ6DPin0#&AjokyV5*8AS1q)0}^xTva?&po(h&GKk%OTL0K{hmiK1k+p7Ei7^lPI z4+>mDB!|b|2MSbRrmY%+I&q&vO+*_fxU|wPRaQ?9cty*Ot)s!l5Bt1TIlL|5yO~%` z;J*e=TY}A_L^68x$4+xoja$QW5|Q}hz|3>W8q8y!IK@x5PQF0!c&EYg$CJuyaFBa( zlgGUdBwx(Om*KyHZl)&VzW8ujqr}$~$Qg?4Inp!UGj(~gq zmDNe2!#XZ?pAAbP$qJgZ4A1oWxcbzC!jec7#dV}HQLt^)AY;#<-;qtm#ahP<{{XZ1 z!uIA*h29P7Nb;>p6wgu!JQGwT{ha<4T}vYmh8`6XmjQgJok2ZLdF1r#UG}S>TxnLt z_hNnl2QKv2#&38Smi`sBD+=Kbii&8ecfx^K7^ z0z!|aC;TD$!^k|{Gf+^&1AVh}{J$D}mmf5{o<(K*1^gGd)FX}b4;2JykxH+KXJA1* zoD;`ip|8%b+E(jG_)q&p{7LXmh_^3ep=+{1rAu)rX_yGn!H|wJJkq)D0PmAuuC^W> z)Z)}2CrrN&y>^3a;G7(B#xQI0>-OEzEcKt-@8cegeWkQATlj@0g5_YrV%Crojyc9# zIpk-G^K(jRQrP`3!rHT0t5^F!ap)`K>POyZ^)?<};vexcbca^5@*@Et(_jiQ{;w)NQaw1%e+t9W z-qJqdq0R1UWK>uWLDaZoSEM381qI>GNgKQ^{N-TInXsZBD80k z-cOo2HekA*fUbBwz3Y`7@I5E?T==cwZ-HME{8Qq;j1~i2@cdo`)U?LY(IaWKd2Zx^ z7Tz%~6D%Wq}{Fla&h|C(%|t`DNu@0)1yBf;vOHs=9!&o z)WkT-+NABG?t6Zz`&a(Sej$QezYzQY@$Q>@dvP@K$pay2|VKYD!3@<|=){{X~~ z*q7q}0DwG0d8XX_F7ZyXx_cCY{>SXn!*>x-R#?xP8zeSJAYcrAe7D5D0M$Mlc#W(+ zAm~@V81V(XOEc;EgaSLE8|PzurM^>xwB+Xv=xVVzx~dXWr)%{y$+%}Nc&asUxbA*O zbr#dN%b`l<;^3f54=-VSwnwHo{7+ieOYFw2dT{77wN6VMjQ$lxrSfBf7!}yE=LeE= z+Z~NuwqGtqP^`@AK?8yG`U?3uEpC48hJNBF)gqGP%adS~W6Mm;lH*TI6K!IzgHWD$Y?0P3vmGf>q$J*iEo_-XBerr7S1 z<*>I9mdhZ|uUvZyaMMz;E1DKW9whK)webb4?&a5~(5Kav?-1#Cl3E*RxCRvRh;p46 z?l>nWwPxCU4e=A_%J_%lp}b@j@iqDY0q#uQ@%Ve!eWBQ0N#h+x>f(4HxwwbUe4uYF zNdQK;;{b7=O5KjqSA~eUwA<0Q05}JYzu{fFbZ!2jk9&m%6#{B3$wij$L*mN-;|R0EzORm-`(4 z&~}bm)5b{1s?N%uHkb?nk`80eJJ*kX&o>_&{y*xIX@3m9C-|P{R=ByHU2iqND&E=% zScx7fJinQ;Fr@X!HTn#*Z?e0MqA%xKOA;#Z?#zTJ8Q>m!*U$d|u-Cv1OW^uxkK&&V zYWgkRjfLU3d)Se8JIjS#%Eepd!Q#CyWu}Mc9^U(+ls^GKXq`F-NxVnmJB26|NIX*? zJb(cl5>9&lbu=FdKWLk5gw%E7xEKrK8*H!~6NVYj9Z&0DLwPGIzQw~5cWrEyH1QY7 zu|`vF1~OZL>r&|7Td;NQ(H}ic;SbtM!a3S2zZp!?BfBeV7G!k$;PfElr+;en4-Q#R zYvKJpFIq>Pqy6(p*_GtLX$uk5mM5OwE70PNwn$hN*p63l;eJz&J^ELh=z5$snjB{0 zUbz?wNnU!B{XZJv#lw=;IB|73>^ogqkVI{ap^i>hk%82c`u-J82`6ptj$LzrSQCyq zd-TuaR`nfPA2L5WM@^aBz;dS@dF@GSsM|<^5=CZG0W7#69!bw~O>r$w0#r&6|sT%E=P~9kO`mA%7G2)|KtdGr4AD zA1-pIKbNobs@76Kx{b@oVTvg*g|?iYc*nmy(qko#cWD=3U`|fvPEXU)qn76WNL$JB zGq)q;`AP0Qjc8lR9n)}k0HpDiBzML;k4kgF8a7xmmgIjC0~pRaAO5{#A>PDZ7SwLz z)}oY@K@!a-I45_O#1DRz_`~qi$C@XJhNGhR!pcC}#pKeZ=poKzl19(eZq9zb)%!;b zcGe>HP^WZSearM5Vi)H%{QiBeShS5UNEw8U0yvQ5Htr7??a=XExOnqZZ2bd)YN|DA zNvr6Nzg*L1_-W#1ObOstz#BI7CkGvQ{@G;)J z>r~W7jQl$d!|jstG}up9;P-0V(5)niY+@H82Ww?e#jqqNx3*8^TBPoe)2U5Vn~k(S zp#6=s*Ms(h@XRE-q#ho;cUHmjnE70vuQ;?{37!A%d*kiW?>sv}!Je*ZG2{Idi z6+TiyJT69m14$L!wk~AT=8;)KhCtjL401XXRn6DgrQAzlepXdG zvByRgC!Y5pzwq9dsu23Em9e;KcfG~G`ZUKKM)b$EEw6)`GG9g1u2F)P3v{a{Mt{Db zHym<(fRRg~`qo97oRp zd*c-V?m!X0EcefKr-*eS72>zbR#XfL>4V=re>%kUX|o{D6t-AGRuDNdHs)ddT#W_Op(cLC?lQ#$ZT=-uBEO9Ek`I+!nwmj-37!v8j&T3+^t%kCc^Pt$v4>`?zSM zrdB>%D z_w0uNw)i`7A@apm{{Go+sh+geRJYDK2re746R zVB;(RJrAX6cr*5TvjRJhiSx&QaG2X+XzY;2bDX?`<~bdQ0=|t^vOXTRK8!D^!FXH3 z_ntD;g};L|`-_<^g978^g&5>wNqR1DeQNLQ{re*LU*UC){-^O)csx(yEmKtcd)s*< z`#R9_6;&JkYp6WCaD4|#_n4qde-F)TqQwohya)nE3|k^a9;APq^It#wS^ciGpNE!OcJ=0jMru^IKkVwCJIc@^5ET@912`7VC)U7FKc$2SF7TSXQk8h8}Hrjr= z+J}lR;I*)|fUIop5q5wGSiryl4loA*RZj+dVDSF{#7nD9^#60`IW)oCl&7=kMS?yCZXYJ?lpf4wf?pk10)v?9_AItR40~2$>W3d zuQ`iY`$M@Km@ZJS-16CYInPeD=|2j8XsfLTNOaGM(!JiFov`X*b3LvGK$EkNeh=2W zABjH&bZ?24Nvr5HM`e9>0gF(!8H(k52T{S#O!XP9qbCg{jVM)gtr;W2C6K$X+4iIZ z7#m34frF9TCp59b2p}lh0bn0LPI2C*@i&LHUj*uDXX7hj3rNIAI=AlU=aCuo9;Tu| zWtEwKcCNcv?cn-*XVSKmw9xuICoHwxk!?4zR}CL#$LXJ6tvl?&Ms6{Y?~ERqC;an5 z$b7j;Fl9y*A;VyM9>7$2QsBy}zb4%B!M!^D+~%=*9<(f&pR-1yxK2C5vZ~{?M-%I+f_C`JU!Xty#$} zk@a`Ms}|G#9azO|0*D6P!AQ@@0aMc$?Oj2I%jMC519lsL!yFyIt}3^JEn?HWC8fm? z8$6&Hi*7B!2PA#&ohw4#-Z`XpagY~jkg*Mtc|P3-@~=vQ<);*RHJ>#`%EofBk_cp6 zWydA6>-}l5-W4h57c1S#87J5IaaNm7WeVGr>^rlLez^QU8l)^*Cs&CH+QLJV*Pj08 z^R4gL!LgyYGhs_9aG)<#802;Qe+ol3 zdyc%<4rMD)lUxZ(+QdoSjonH1&wiEcKMC$y$3VARl#sHblE7f@ zBRr17r_#JvP-FJ^v4EiAcb=yiJa*5owR>NH%ERI7ae%prLu?p1&H*|8eZ_o64nF(GB%;Jh6#nW)am98*OaHr>B{N$NrE>U-c~x+_Zcl4N1ks7c)R ze-GYAqUbQT&GM86CCUNr zrq~#xEv0U$1)PwJ(St6}}+J z{{Rxl)Rhc-%GlY6k#p3EAA!feIH^70uda(^pG02Xy}MSmwzuND)Q%k<%R|tuTPhkGL{qSOZaE&uo^f4Kp(m+} zoK9_@;x~*^d2S@ue#jKE`7w)S+PnZ6yB>cksJ6xl6U~}Q9HOL>JMP@xx%AC;UL){@ z^XYeYJ}~hO)zm>xl^U4|Y%WMDxEVdO*R68)sv2>;FdJ02&4PFXr{;5BUS;maDDJ_u z?#8SnIaq^9x8)#!a7SP0D5=^OXLSwcGM;ge-q|DCit!$-^c0#uHQ@N^HpTwX((L2_ zhLO^CQowzBeSPcLz7c$4({+Cch~~7pvDtUDEN6NG!{sBs+#g&Hwesc8V1dQPRBqUM zzF3fYbtHAqVa0m)z*$5-54yI(eWn?SV&e=~t^qxO>yDrF1yl14& z?4tVF5HSU1Cp|d;jz2tB`M$L%9q#PiCyk0IeWAwy=iiZx_xe|kP4mi%W-RWTK1lK( zj@aWPj!(5{EV8}38PIO>k)#dS0oNnBuVK@=lgdrd#@P8~-T@Me@m0SjA7z{pR*OGrOwdEQW)bZ+)c@jvBvj!3dEDWB&94}9)uEN7xyEhVfmvb3| z0Kt$nWk*b!T$U+J+nQ85^Dt0}G$Se>%)<-=liMe^YKT<6R<`Hww)as6trjYM&UG6D(Zasf(x)~kKRO*!IpEo zelvvX2+!Uejy>u2dWJ2Xk^!_53Y8-}xfvPc3>*sK_#OLSt_5-Ev?&w-u3hdpvXol>@yWQI>KVku=HvH|h|$o%>mmcsRzv2da&iB@?} zDxh$2>Pf)QT4@I{r+Y8TpLvy=83UY=o}T}t&DT0~3PRhj;7A~;_{-2NE+YNgh}1Z?r6J{YO;@>ixup!)UVtVqG<4$!O( zBC~8jNI-Fd3G2}Edzx+`%t;N~OSy;=7`{M$?oazb{{Sy)W!3Y|av&xs!jP|(`JX7u-uYKC9vPMScYdg zIRp;92tBIbnI4@4PlS}8n6BVqN;DdoEyK0FxP>ETGUM+}le?e;Jx>RZrBt$z%X*>1ERl@2mNH8KFi9Sm z>rqS;vlMnbuHaXZgVYnq$m2a}_UxkYg_p}NcBmOU{lN78baJLXV>{w;66ux>WXTsH z3IY^6GMo&56LFqDt!nsw_C@fvo}WFr5dg@zCTAH3C$~UHrD6PCNZ-OXPkrUP3#3IV z3gn!Rl%J;~ty=JW@k!x3Hik(h^1)Wz=WzLt&5y&Sa=5N`cefNT@4zJc@l%L`blI*7rK-i;;Pm}MS!Rw%-C5&od5l3E zbDU%R@mr#QwCLCIqAZb1Z6kB@78uA}_RpnrkV>mFi*XAXBq$doGGmXM9S8HRohLFS z#^WO(vzK=7mw(H_+z)PlF z#(Ex=)fkvFr?S@2!V*Y=0U_Qqk1Y2f_HJ|OT_=Y8QRnNn(p$=pDLzu+_P3!QOjnyh zt_ik_X`jtq&Qz{9l5#Waj(DyA00(L+y7i!DU5h9!8lWH?=Zy6K03xOk{W_kRq_d z4a{4dbOWY44|>U(UC|(dNnC6h+w!ujXTPr>sG-0ku7^n*r z+Kjv7#_3}mE--q29FA&vM&Wa-w$`DJY=(7W!Bmrwr1Sv#9DWsZPSy-k5Rdaol|l%U z0CTuwo(@lH;?q%8k&zi#`G5oc+zvtP2^^39yOS*3E?f0BX^-9gY)Z(7QNr7;;81KEI`JOm;j9Q@Ay;~Iy?r_Mup}q zk$H)S1=|N1Aay5@PqjJ=$qbUn%NPZZ3b;~FeERcwJeQk~-TA=E{;_IX=dYj%^(4#-rT4C4$=cW0>gs4ff0q9EbXR3J^?cmvQ5;AHXj zrimsNk1SGdN!fAoeBPr6w|=~FNI_{p~@}4~49+)@-w@`gQDtFj!rbQNrq&k%$epVnJPo@c{rne+OyGQfy2tpR$Dd(qP zG0(PX@2IP+4H}Q#mNAZ*_2aQVzSZc*Se{hx8ER&-{i0~%x`s!OJJd1SIT!~$i5VHB z{>ns*EwYc0e5#MIh6k`b9G}vqTZDwG+Ql+L=r_4-=0lDTJanr<`JzDTJj95uMlwS6 z!O!9JtSVvY)qe6fql>9aNV6Vo7GlI($r8D3!HO`*_c+FLQ2zjB-p6U>#b^qKC1mr| z9mI{p2a}V7TS;ehSa6g&NYG~GTBgk4mxAe;rJv~l1_ovxvO0vq9uEIjw&&USs@ZA1AD>&dFw`Q+2s@;;Y zr>8Bcp5AMh6K!A>NZ1cSkOy#b3Hn!G@N?t$!=Dd$4??i`k*Mlk6r01%sAw zT$i{xXl{Vm?YoktfnQGb#jW&KpJy>G!z@w<^3egn2aJ=`>E6D0@n^+9AN)D^x8kPw zJ>&lX6L@mTwRXmw9vhny?1{O)&2=1+##=4I1T439Ra^FZ?9l3;1!ZUrK-EHK&We3~H#Tas-lEGc3e{ zL1VOb+s$iuclMaJ(JxH*7e5pHA8ddbC0`@Nb}<4%<7yLfMtSML?_ZWiX& zm@mY?4E#ax3%X`mC$nq2D2Mlq@ozve(=0k?6@Ji$tbFyV{>gg1q!$fuf2RhDGU6gw zJe|SZdX6*gQP2A!>$=S5WV_R2OQeoKrIqj{3e2w9c*-KFI zUW%9VYY^$`(@h$nPcXTOww`m9$p=4}t($My(%4TWuCuQPx6~~e8|=_|epp6U03N{P z4^v*b@Z(D>;FK%-w@pInz+uQOD;?N8@_7}Zbz*My>qD^2hSq+nc~P{2J@`L?sFc~N zNb`*w_E7K+izHIs>6(tEGdinFb2~D2`>EI*at~VgzxJijZEQX{_{PUZvW^=&Tf9SV zr)a>8asL3;HTo$Hyq0%it(D6b3K?JbWO^0;mHGSoSzDWb+84%+6vUCJY$rHiJe4OP z^yfT#RJk#&4Zqnjq)*z<;Y@&)7$zj#8w_mc=RV^&KKSonZt6C&*;#@FZyaHilEK1* z&=60*-LHv1W!H55tiBYlmd=**0U%MgcsBEZ0QKBK`U?AM=FU3>c_ejYR~Z{lA145P zK*`O0Zc6V(`k$V0Q~v;JkD<6?l1YJ8m5~%HFc|{_x#^5|?b4!-5a8}-UEM>R0DAO2 zxXnoVtI1^%Gs|rv$O|N6BP4Oh(0`3An4a8RTTd$_nUXcx%7A{HeJj`H?0mXpTLK-f z<(KaTCjk2c^sCw}=#D4fG%$kW3g~1B{>W4Jay$FhWySZMm6W(8{{V_Semr;1X_|EL zNnpiI>I3q=@CN+h$vkGHo|(5p0%WV z8BLsj#@#KU_(kK1Exy$mUk}`scvYf!$z1Ld4nZ7z-9aAp@wbM)E_l&AJEuLTkNjQ_ zl&o2`S(LHcjFL&oK8C)``1gH$zXrT={$<40>7ZO?RXAa{q3`&0&3sj*Trb&d#k%f; z3Z;sHk^tb2=N#s~Up`;FiTAuD{{V9@Q)&;5zY(n`&9B5y7(p_9#`|kYv;cS|v)46t zKiUi8bZ}+1JbWGEBH$`lX1^C3T4=4HEzRdeOCvYZ3AlY`iL0seDNhD%np4hkeE zhA7;SI^)BegPd42J z^Sg&ocAq0?BhYi7#)VBGXl>a3)E^W?kM{2yT+FOI>h~{z9OtkwNR6SJx9~69EqaT zPO2~3)5pyachf!|NYXhQpF>@$Lw8-{AoRy?deF7~tUPpyA#Eq&ySDWOBhaOQI`#SS zKPRxpG3i_iw9l2AD`Oh`g|JB@wm+%uS|V9RqDkc1x`GLE<8I&&Urh2Tauv#v+eiCk zc=FX2H_*Hho)>I(_i=(co>p#8zXyZXwsarb{{Y69T3)Fm_;bOo)=?uVS?|;4XWADY ze*m8R*OQs2MhS8(;wJ!=d=Lju$mIPif5VWo>3Yk%yh_%HK2TT@ynW%-k4$}Pc}Ex~ zcXR&SJ}|eN7Tyu?=meiI#jWZv`9J~4UFVX2F0|wOdicbZ58*p~i<9O>;~h;l?Hv>x z*e^@Py~QE+6vdPeTUPp8Tc6rD>uzPpS zdMAmmpz$w)G#l+P7CH3zp2p!6<=3B;h(B~3G3VEc^FIb!*sZf%W!d)c+mgkYbsKwn zlU*N${7l{&xOwf82J=dZqL_KBB93;I^%?8dzCyB5ZpZX~2CJ)1GA>)n+LRGPV67yx zpDs0xOSmT>XTAsNTV5%<^L$2@>cxevw07<@%P?FMf!`*zth{IarQqw^pAFeq=~}Ie zR0r7Clzz@$7_jh#hN1nHr3<@zS?tf)qhlWB zidB<#dgSZ_I6T*>e$Ad79~Z1XFnlJCNFdh!Dfmj#3p_9kK}I5)NzVWahBcxiS+gJ91)x1TnTPYX9&XR*UqFUzob<`Rxu z70$JnFGc6-dA_HpOQ+t%(5aLN*Krv68y}haR-$UIRFN=X!v}nPk?1k&{VFT33`={c zMID?HT{|wqH{gTN^ys74wRAUL3`2DiTWZ=P%7X?WD>LuLc7g^o*BP&ws<~ay+c0&x z)t^HSeML(KG4BY)UO{oH~?@@e${QX zMW0pFBiCA37fyk$B~7@Qz{kpmq5A%{#NQi5)t)$_CdnWS$s=@TJhL9y1Gid;oi%;s zW7=)}L80oNA-?{|)NS<`w99C$mS_fIX#qLF>$G-k;Nu;s^WIvd49*J~Gn2DCk8Ef1 ztWN=3NutkxZ>z1Q>7jt6FlF>%^hD8~`$ON_zy?q$}0JoopZX}Sc z_rn+aLEMp@TIC&&QU~tvaC67Ce4#OlPlnQn)l8Ca&zTn_@-RM_>V1uIQP{yGVVNR8 zM%Gs3fJZ&JJ@PB>xMn=~W`84i?M5-qp)|GSKHb#+0B!#O4#=@D+rAoEqbMupc!q30 zBypJYS8YFT4-5@F9Y#+B%*5pRJ}GsK9PmDP{{SDxz7$Ok+T4L}ZwBG=uyqG`{{Uw{ zbJmt057@~r>&rWR!Ly$vHgYg?>-GF=>Ai{ge<}C0U$%dQu7A~!2|3xlig>m&@@M_d z{PEhaL;GHMTIMB|7_=r)i4?`+s7pvY{{Ro+U!Rv>4|J=APqSFV8mYrFN69_gj{JX0 z&OZrsxu)Fd<;d(;{aUdL*mLX8T9-+Sl>Hii+K7E|9iaT{JfCtVFD%1;RXt)zV092Xs$iDOV;|?+r+S79xo@Ko+HZUv zvd9x?KA|zxax2Vg$1UvcX{F!UXY%x!WV-Uu5rM()&tvuNinXO($9}`@^T@LjFr%Oz z;}{iM*%HIBxb5YH-LD8UC_ik=` zdV}bFJ5*LT5Y2mdUOmdV_E!8mXNu0#^$$83o?=9{>O%pLeHS_F)0%dN8%3o>BbVK9 z#lrsp2Sp^;~tdPzMD&#nng>SRQush;~&4TwLo4;q}z?4 zjO9m6`s2M(xw}4T+T$RByJ#R0*NVyNUG7`g{8I*x@Y}_DqzuL@T@v-!vf+jxbBqpz z=dViqAR1dYf%KPxXkW^gZG(16{PSP3Kebi$&xJo^pNsmog>@_w!Qo5N7^dOM z?HCQz08d|P{DFIjt*i~Ly{f{g7>sRPk_G_IdivL;hkUeB^FIFof~cwcNf7uZ`RqZ5 z18d~+a1W>h{P(Xyo;8oeHo_R0epr_TWqPT?j>9$Oh*fV8L`sxyr;feI{7!4s^r>dl z{9^<$jq-Vs51qD@>BdJLzgn%&)Nr2avGwol!S;<~;^&H6OM5scheNZs65R&FW@kG< zUUwWePhczCFR%4AwkfP==Hw{JxznyZ_`>%2TMTphX1t5`KeO{ZU-1rj0yH6PU=kyS z#seIB;N;h~%a^e;Db={#K!T_DQ5%BzJ(o**s$| z0B)U)U4mWkhqG0k0)dr2Vx0P8rCPta^P(wz99QUs0Fxk>gV=`j~3 zblZ*U8T9*!EuB}?s5^Uf>CS574r9T@H%?YIrE=F$hxvysmghWm^#1_$Rm)lY#9upT zUE3Q2l08qS(y=1ZFC)D%>6+xzD@I)-zqd(u5O^Eo18=#<;a4r6RJMzC{+$)j1ZC_l z72hYO5=;@3SEK^6^dM{ z-V3W%Wh2YFw~`#6a>E!Nz466r+ubGF?zZx!LNoiK81(0%u6DIOC^F2V2 zjCL9C)|N&knI$QV??Sws^vS3R^Dq=L4DM3HfsapmS#Cg;g}*9BL1D@1f@`k}y^QfP zvNJVX2ffy!c^t7|M4KN6vl zsorIdGNHBu!;ZVN>FMvDYwz%vRAP^snq2Lbl*^@-7b7`fZ~$ONJ-UDOs;b^Rt}<|} zK_K*CIL|#t^2IvxWSZj(5oQCGM&_Y~k!B`GXAdFUsWP=?)PjN|U2lEC-JBaX{oR(vC0vwRoPTFB(w+ceBd9A&p> zY4!&{g?#Q?PugPY$n`U+@?fb)$om7}3Am5oc7mv@GfHKcm10bXb^*!u$LmMLFN)eX zfY?Xk35~|1D(_nxW*&5mPaeuXxUM7O2gND=5&RPHev#p4G3xrJo>?Cog}izBr8($E zKm)ls?OrJoG=}A*GD{`Ii6z9+o$|=uq@TT}!+nshc3l+*2Bs{laroMD?Ceo_ZK=DvFPOQ2oed@k@o@@-;Co>`@~oaJH$ zRTz#gib{<9+=E@e#tl|IKjAjGZzNF~po&7ofU3lGBaxDN*Bjw02EXvtO_pI|slHXA)%*@Ir^J68&0}vEk{J@(P}trT zT&gL@1RNemO7w3mv}IM;0t&b-z~?`i{*}di6wtgc;r%yJe}`J1h_$QB?UL(vT7pKF z?RH5xv?B}v2Hr@am zdF$(*q*lj(zAEZp3ol90nA~Z1J7b?tnnF@caq|BFa~(k)N#?oBw`mnht{H-5fFVIV z6Z8l3%}|^%5`g~zyi>Gio_%xZE3v{g6`A7VFxb1#-9z#6i~%IOQB^N$w(&N{8U?6z%!i92OYCMQj%1``*UAigD$Qj}mgciLM_l z%6zNAkhcZCgSUUumEG{^yxr1f+nO!7S!B)rwj=l4b!#M9r#nxSw+1P+sH(U(!_;FODVI&~Jx!iCD za2K92-!*0KktSqqk(VGkqW#nAe<9MHx(ejznM}s9Wc~Ga#s}2(>0dGb0Kr9dRE=~S zIKv4TD+Fn9SSjR%`u6YdUrI@OtTAxmuoW1e;vSehdX9Z-CmGYOmMfB zHvF*>oM%0;+;qixnXkKtk?Cb`n-c`Po(zM|x>bv)lN)omwoY&})A01KbnuLF#iT0v zYSNYpRU3AA10I6BLrj70HRxlvO{LjXFascyj{cst?OJulG^K(zX#Bi`fwvx=I+M>z z`Aj0+pKFSfdKmuz6s~tdvF^h}rT$)lK*kgS$p^i0e+WRD8`;6kl0MaDBjxT$9lMOz zLGhyaTj_H=2`2ZC34`}kjOU)C(2jdn55b8dhQrRgF(RzPadWWq=zEOuQr+s^n?_cn z%8yur*5Z4MV!?!t!FMWr%6RMVUu9WoHu?qUhcxK)7_|v+B2a$OJ3_b!814hA_al!= z_~XI<01)(@W8wylqgu?_)BG7{qxh>>8a1mREUe8tobJcXlhkzM zpK8zXj*PcbXu5T@12?zHlaq!k^AD7B+n=X;>vYsQhNrDg?IT9lzFy#;c&N@u`ucUO zommz9b)qAqv5HA1Byqe1!2>-ykIK5^PSEEe&s!T>U5v3Z+TL8nGshs6e3ZZhG zj0}4HYnpQEHc(RI;r;ZM$q6DYzc(u2bzF5k6M{Vrc_Vm+;w!cb97RgwW_eX0 z5Ci`J`u!`p_}P5F@QOhbxGgo*NOv#I_lGARbPi2<{{Y#Pff*`{gkeA+VE6j{E5XfY zX+|fjfcRNyb(^cX34W*MCw4az@9onRRU}npQquWcW9Hlk2e2NrSBmDBQ@-csguVs4 zmd&3`w~}uoZtt0R+;|6`r>`H4cK-kgbonhMzqP-K;c)T1D)Ota$mPk$UzGR2tl9OO z$yQ&rC9AZ!MLt@90^MySCJ^qISBk`=wGT28j zJ93VM0IUd)BmDIDt(^)N7iJvG7>qL#26hD<$?bt&+kF}GIwK=W{ml0*bnO!xm0-#8 zt~%$~^yk!ZU4Q{!GfbQ0V$8At8|(ERmCH%0eU|?5?9{AREV3rlKR73;@6I?C(_uc` z88;(mZqf)pD|Rices@7Ocw~Gx28Sne-bkp zEaNiIaFb24G9wx3^AYQwc=xABo)CLBnu(W806%Cp4O~14_{vdpmg`F@Vsa zXvC!qW4eRbdj3^BbG(vB8r+$}5Lio<+m8Lt2S24Z!=TGyZn31S&l58eqvaX*?a)=& zql{fh5j?Um9hC4u=O;W2XY|cUT*DG=&cRvCmkJhVR?3_Ym#;y9I2=^7-T5+!?j(g% z0wCG>NgU(fryoj;30$wAE(0hhBkmr(2lDl+!ZIw{5g=DaIBzHxPzHW(I(GHxPQ=`N z_fs?t3QQ$2#4<_c@N>KAflisbhxt(9niz_5&e*+8; zIQn~as-eu_0UH3xxj^832=z5fKunMR5@>911-7D(zGNgA*K;xL$3SzQeW~`IB-3>W zSN$mgS$<@c9H#{H+d0TShOj(L1fC*O8%m}{Tp(Sf9-og+qtdhPA`m1cKzRZaw2nw8 z?{U-LzZI+@eaV$Znc9n+d#GhFT-wWtK>;5*>`4AcJabc>@e63v%8i2-+*sxF>*@gL zdshPJh8d)dRFFson2_uU-Jd`@W7ictw-ef1Dq7u5ZpwEutfoQ1&eBgfIUsswsnSf( z+MTR#dm@rR<95HUO3vbY2)>e9gEV z_WIIW7*Y1Q7(Pa(Kz(I3lOn*lJ`y6V_MIBL^{wZWVwi3o!#K7tr3EgX?!gc6>m7RSYPj1OP-~iJq51XEY)A2vbxqppg{wa+;C3MPNG6>l6xmLpv zI`yutQQF{;WZF)}X5b?e*N(=p{v_$P_xdbpC&?Pzg;^w!Mn+c+w?D|Vt zkN5GEjdQ^#uh-VLd^h1JVbtQ^ak^On1TDmE)D^(}IKcF;4xhw*Jg1@IpAk&H9`FQ{ zO>=puFr7=>G7mZONXY{L5HZd$O?esdBQ?v*Ik-*33gjzf{{XU2`Ne%L@mt~7+dKL^D+{)dt=zV)vL*V}a5}7p{DHdh7RGu)z45}U7+uZu+ty_cO{laO+ zON+Upk9JD5B!F{)&#pln@!GBFe+(||ni-z*%}u+j$Qd08Wgz1PdF+4s)wFvV&P6{E zYee{~S&mf&P1}OovVQk%zP_H7hkdLqgqTz-CejLmeo@fip8kTnUlRN_yPwB8#E?&5 zs`pY(LZMS0?@^2(8SCh4lh!-~acY6==d}?_^Eb^S6h4IGJ&E+k)~Tx%33W1THHjp+ zL}}mxM)^s}!0Y(>S59>+Yj%y)J|E=avK9LPe_F!-0EKCON|8O8B(66x3U_oI`VMPS z!{Np3a=^(gxG^xtmivZ#oSwe9^r&fWY0ssK@8W?K{GM=x?LR8{oHhsE$JAhFzZGiF z#89`9I)yBE46AdyIQfQuTA`|ZHq;whPqU@FBglSrxKe;}Njc;W{{W3f-w$sSP=o_& zB~}5vyN(l|yiZO#@yF#(F}ckrbawD-$~PI20xJdB00H`NNc>J~R>xNlpld?Q$!QT_ zJx1mRTmZxKAC+^L9t6CO<_Y)2z#P2Zdf=$+N$vhMy`^|3Q2xW$VTK5@Y~ymNDwzmb z0moi(*B<$;qa9L4GI}%Be`YJCk4)C1WQ@1=u*WCMU@ep7BR_j^WB&jF&3bG%iY`^m zVnECRWo+&}&!#iZ4_fkn*&-XbG;a}|NIFd(rj3otS|8jg%VgoWIs8YxdgI#wm2Z^)0C%tB_=7T&ZZ6n4IQ0Jj>(x&XdGY3R_oKvj z5(BkZ6NNi-$mbrpCYcUyt)1s@Fb|M?+<*s8I49b;D5p+SiS1YAtxgpe%zQVhu3<+& z<#-#82t0Bz$34C2(kAx;Qy9p@9^_zy*Y5*S$8g7HT@prp>OjjLF}1V&s!4un2FRh@ znG6Z}Pk+mk$gLZ@yCp}JSq?)Whh)H&KOt|s#yBG#MLn;~u;Vd@auD&Bj{~6hzz6fD z!E1FRDS#q2H>;};kdyDwVx4pf#O645q=$TG7zz&{fIA!#eQU0cu{d!$OHvhO`(Vnj zk@1Mh&N%6ggFSOo!7tfI&V0St&f%P%>_>d?G3`{6-f?suY+<-&+&6vSy~kWts2oPo zw1La79B^1;-}S1Rw&rp2B)C}QyN}HtZ~z_1aLxYd9Vx*ITdcPY8UV@3C*|C8^*q!@ zcZx?56k!+-&&o+7Cz0P6;M3S`c-X7tuH|l}3FHiqdgXeZk@r~R6mhV^Z0tg}O!J(c z2Xjoehk8n6krj%P%-psB>Ok$#lirkb{^I?^AjZJ1Sc5l>w(wOlFr5{ zqGyQ4QQ1p4C!suZ-yWUoN>A*&tD%XW*d7sEET675Kt!pRW5uo78+CZ>-qPn(d@FkW6>&xQ%7=jtI$8I%DOh_%ioh_;)MG z@SnxrFYu&*1@i2*S%s=_F^fqz+l*ij^?%IQOf(yZ(c)R4B#?8?*4xfUToF`%v;3F= zxfc=^`>~PS56h2JR<40hsnGa)_8*v>2XSdUuu4ZVYne?B5KW_HZtyb1w7x)tQ zPt_&+O^kjn(r57N-Lvj2MckXA+;C3C0|%P*+h2~h6Wm3pc(1@-A%S3xmO1=AJX*vu z?f@|&+1@}fGN)(OzdrS=Ta8y@-%IDi3I&1(T*kY(WK=w0kaP8{+kXc|;jLCn{{RUs z{)v3p^RBdOm(%4u4Y_C;32xarsprtqHQfCl(Y`JGH1U3^6c%1Fx6`krbpq2`v}-w& z4aV@{PJW}dYvP~VPvM>Bo$>RsYm9ScSicZ7ua!aC7p5Bw|y>K>gt9>s0lhA8P(0h7avs3&MtLWhh%qY4q5i zfyjtFfe0P5j!tRC^$uiR{hMNl{?wlc-FJf)qKHI*fe<$HjfbYv8yp<<_pi6LL}j;_ zTRBHra58vqbF}syG6#D2$KWT5zvBFSKNr?o-KtBj#~1=jdz*GUB*tHf262$s#&A7r z?45th2Ie_Za#6|KxEx@dA9LIDud>L!>Mzv%=ZfF^OnnVAJhsY))>e(w9q+q4m(xDK z{;Hnd^5s03;hBjK@+ohX@^ORz0M@MQIpUVW-!gF$sVF+Hra0(16+N`@Tg?=U%&|7% z8B_PO!1V9WHSJjWRVx!};YwY_V>Bim*+5%+E;(U=_k}K?=NX zST!4z$~h8%>YRtmXPl0ERU%o-e13hu1pIc>Jc= zr6Yuy>_!IRk+G=D%>E=clE-{>({X34MHDPsO9i&9g1ewM{j7N-h z{-UC@TZDo$a`8s-$GN0s835pR{IF_hE$6^OB0ESZRYump`={IvKDFT4A6s$%0BCei zGC5;?**if2f#^29jeQ(>+aBG`xDfpF$ZmPYf1OpnxGw<+ ze|A_pX9HpBjQ(b{A`-=ZT{g_k^9{ovDD96=YJ&H4c2bK$`>++%JL7R?#z(h34`6Cq zv1?O3E@o(5Jhd)PL1Doe$RpFCA6l9z9phz4)l<#t7*aj)&tBAx7NXn!`NB#AmjLBgYiH4O>Bz2|O3-yHPY2Jd z!{Kigwuc0UJB@ifH+*zp!LU@{n10QkcK!Ys5P9Oc$JSN|3qc7DvnUIVyx<&@^{-L* zDgOWk2>6NcgG1IlGCX6g>K_kp{2z1R_#Y%ot0kSaB06EapR&Ioph503LgP zWTr)mBu$K@f&d|b=mGD6=~sL{%9=*5VzqGM2*_an0C))j#(F64j=a`pgCv@6lVxWy zdzQ1cirJ=S0j4OR2@W_J>Tm{6O4QKjF=?8VuAXGg3TF+B62s=l{{XA4OVOG@&T`YT z2aGz9WXSuuCjjx^oKqInk;806Mavz_l1Sq}Q;vd}Bg}}VIAmRb0kyXlJ<0Ursr;$- z)3v!tWm%Dmu^_fi2UG3z^r@28=Fuz50?ROHQW*=r#oS2w`)&PjDs~%=?*z}&JU4NcDsh)(`Iqf9Xf$Mw-WWW)l>OUCVz z@T)UhJQ2pSACg550)jFRL5{rA+uT04su{I;8u~^+6+i(F3FW)@1MsWbib-)iWGOAd zIU|GL9^I?uYJ1zC(D+!Yak4J>Z&?2Tgnw3v@6bJztYNu~5}~7UhUw4ZJu0=ghc1`I z^Vn(7$#Jqwr~NZVISfeYfJZdjttB3%K#8~gF;Jq+V}v}Kr6p`%LJ^u z828%D4o^;%^X1;5W1(9^9=CC6Znq8%5>o39bW7PB4Ne*D}=Be7Z8&I^}t>|4Gwn);K+9}B-_uh}YFn=jg1#@gq_ zKN(o2B=FXcYcREiwqzvM@c#e-9X$5hdYbv$_MH8qZGUQC+Aj0Pei6`byf332A5YP& zG@FwbnQI-maH_sZC=l-?0C?|Rd6Z`8{_)$$`OXZ)VPTF?z|oYV_o*(vjgHsCX}S!{ zWplh-%N%}sWiWsi*nhj8xbz&<66}o?B}6zGJ4P}+efx7!+G-G6-L<}^8|*hhOoBW! zM&OOEbHT?vcjC0K^t~x!b9Jv@Kw;zjw6 z58ekneJhrtyw7tDRxzZG-^6#e@%%h(J5IBWJf~DMOzigzMsi1BPI7*g!FhpHJV2x4 zapPN2Z z`k&-(8G(co{w<^f-mk2-FVbh+Y(wih<0ZF{KT>PXS0Qz_5^QT)zO}I%Jf+_ij zQa~IG{Rb2zLuX5-TC;f5z|ha;nPj=L+!Ti1tv@)&em@HP3&j^uZoMD!*iK4?$O^#p zVtRwqJ*(u83PbjPiyjQN8zV7Kr-+X4lzils7#PSLepU5l>;md%^8sc@VnHX8NzQ$E z{&nSM5xkM-Vx8oQx0;M|{Knb?B&+_ku>pAg>F1A1)zDzm<+n0QFSbeY7iU87ksd+8nE%7-yjE>&1C>DXSdl+Rje-Kxs0Rvf>k8B*`5dg09;hpSL<&g#TvZVGRKrq zaG)NWzh0f|icz+PsG+LZG&-9YL2^}AV1$x0$v)gwyQ?Fy5&%@Fz|Kc}k8YJ>TLEvR z%D!XEaUzChUZ)+mbv~bkGQ#pX^tim)U74f#xh=@fdUX0$O%C=dvniN?AR&kx4nNLo zD&R1>n|y)Tmf#F3;Qs(DcCMn~L1N6C)xgeh0nfi~)sJzfthZA6md%D>Nh1bAJK$6_ z7rEqrw{`FKN9+~xW6za|pGRADQcf7WsJQ$yn*6cXyd-3?Ys(AUONU?iX9Szfct6Gc zYxMK}3T1ZsPwW%pW`uA1ZT^{PLkx#kyNodR@0$Fju-E0#b*UZ#i4@GihBCR&UA5av z{>dMxa5NIb)Sp|Fyt4Oknef2MyZOO9jIXtKzYit*PsKZEq(bt2p;QH9w~t_Zjz1db zZtWwuzqV_2FZ;kw4mS+?`__lTiMRY_)8kfXjJLcAFbQp~jN|dGlDaR>lgS zudiC#p4U8VV)w$)$-D%{xs3=QaC-CgKgzW<@4UOYb|f4i;QD8^P_;%kQcU<~03zUw zxa6Pk=e=9D2?$>$oiWQ~08bes6}FN`1ay_rrw!9D%W};!_ZiBcZfYsC4Jze>URoq< z#Nq86+Q_s&87RLJ5p^CL;L9x>Y-k8@E8ayer4}AHCYhryv3c0Qc+Pr!=@l1(iz` z%76&<#eMw+`>4Mo!j_Gc={2QZ7a{A2Ohn9*VtYLNhA1M;rm%9CC!2>{_`kury!2_ByrZhE7P?W)V?w5 zS7D16)bHmWS3Yp_T|<1`$UF~v`?E;!>uKH|(i1T}miCdVua}LaFWx6VU(&o>jVD^G z^F2NyiuP1uyB#mYFB+$hyho?p+1N{C29=~+X{i*F`KNjh-nhpLxv+3~z!i;hK(_tS zRxAMA+<}gpkA8dAUol;u%nl;R$tQ09{{WtSX{e6Gn{}Es0FCSh-&`-#fnQY{MOhys z3K5F6j$`(K-k%6BQgwz%=b9*(7s!0RS9T9f*CpYvhzp_V+8&*2pz4~P#-FFEu$>2) zG=MhvG4;1&N;}&0Qbk~T!+9rIc&ZV>5ZtNj!TJWl0e6H)4Lsek(?9W zy4JT6ugD9@hB2<;fO=&6S5^_fWfsiwF<#a~%Pc{K$z9EdaD?EuQ-a+4nvVL@?NQ^G5_xH!R=R6GOKJ~{zA~c*tL|G>#_&%TKpsKTdqW5u^AD7( zXAO*W#WEXdxF%T3sXMT|a(MdFBykK%C&&jZ$A8L))ce;niS){P6ufV#Ew6<&Cc00% z4p~bOR}2XLUjFs+C+zJC>Yo=OoPuR}<+ve<&f~i{Jv;UG_phivGU^iP9}aKlw{WFV zx^;h$lY)BSSInQWjiTRp?%82*(fI|Hkp0pyN)zjh;15dq+|oSQnovH2ESiQIw3+r< zzj)?$h@eQ3~l>_N9wbUC$CmzdG*PUjY05AJ(Wy7GUiWW9EVYbB><>08vk1 z!I9!pT&7PL#~iLZ4{G<-HL>&VcP>kR<~(TV!G;(Ejy;I&)AgX;`Em}fPs%|&k6=B& zO3#xLN9D~MEOGz~gVdg+4&UKYEYiH>#IluQOYPb~$j2wH2&&{pZI>4FVO%&}!LW0T z9uGf3`qZm>$#W9G=&GmYjn7`$+~H{{R`CU`W<$OK_4Y zC2&XG;PuF0eeqs};*Z+f#A&MDTliN@({$Lx&k9c8zMO411z7N-AdZCMyti1?E<97N z-RgcMV|R0OOPM4f;fELmju)`wHS;;PVMeV#WlidRHcx=93W~JVk;3S9S4UQgA)7y+^=#8w(d zlcl7JS=VU{6e^w$dk}f|?^|9XG0kx#yO_zGmS(_K^gmDrYK^{vHHlI?r}B`H`2cN` z9G<=N-0&%1Td+~PvO7=MqeO#H{i1vyYaB|S>8RwW8*!dSI-LHs`e-9-ui6ISsydi$ z2?5Sd8Nk|oG6sJN_*eD-@R-*>Yi|!Oieq)t#Fq}l<&-KMpTwRIw-xsugLe(j#tnX1 zB#pmy3ZRtZuH%vQ=quQGe_kT z5QaiBd2Er?ay!=d!@JZP)NxwQvMjdGxMv~Abv^m&f0cQzy{VfmR^fp&VTlDvUFXmW z-uNS~BKY#x$^&Regt5UfoPvJ5566o7oIG4AE1xfmeDq{{RC8wJM<|JbBw+Ehob>*F z^}VIbB;d!n8)|Jq8QMX|-3O`Sx$`>RMusG5NRxVr7iylo(ZD>Bz$Qr_<5GGI=atS%;Hva(i``1}-IGQM~E!8Gc7kq|I zxf$g8F#vJ(u6I;uTUzr_7MfVO`G(NLjDDRxYof8$4a-9$KRQUOw16<+;AD?~=|!3# zcZieE)1Z_@rB-O)b_V6$k+f%!aqGn-axj^nXxhUgoa6z)+x6o)oYmc<}opWx{wbWJ@Xp#};NUX2PNt}m{qeavqMpZ8)4q23*RFD_^ zgPye8R?H}}2+>r0t+)4w9;ec*c=hex>rH#4WHN44+Dj5a{^;OfpKi69c3YvEPu@oy zzdq5>#agh!4i0 z-s>~P0?;vGczlLOD- z%egI}j%G<><7W%c%)=yOi~xE7YNvp14Y!9I`#oiW)^@@GR|F78v0>AWIL$APE@iOr z9LG?@{fnQvk2H2qmEUSoy!{r z7$1*9efgriKXlBnwI8;MFf_l3_L{!4_G_IoXq#}($<{^TdJuW-pRIOY6V&amwJS&S z6&_Q8BF3Wx*+bF@~` zMfRxG)<8*4c{uFc@tXO_El;nLe5G%Rl342A4%O34x{g32#>pG*uzdW>k%r?OX9m2M zeK@Spn9*ZjC^$G4G6kIQBeOny-tk zCBnU`825aiyd&J4bRcJ?4K&M2@l5HU(;8KdM!2{jw$^VkmxI#-ILPL-EMU8pk(&PP zT1km$#XfbNjP5 z4myp%as^yu(40%YHd~8N9_v!WsOm8M>#!v4i2nd~fQlq(zZN*ufhKS36=4YE(0~St-%d10c2h}aDM6ediOk6Gj*%m%_lgzef5i-VBQIJ5!ImqLa zT$1WGDH`p%xRqpJUP1ut$s^SJ^sa)(P_l?>alw0X=yaLHZ6te$KPkw^Q;r6C>svxi zG;-97JqPwy)Q#hKiFFo$%5R{UFpG@&7~6rs;DCLAuVI>8s{N4wK*2~>%M*@qo`Z~o z?Oqf6F>296t9XFLA(h!Wt+;4 zR5%U`bU;r|dkh?Rw+(cE4yPBEb)g76Sw7 zeTNyWEi^|J!P;CH_r?njHs_D2>&LxWotzD}vMRA1Q#p(i`Hu9Q3Q|SALc$56n%TrA zImX4w#=s76zeAptm!-mn;_lW_6mmlMkwja}l<@2fpECm+1M(GMet)R-t{hAp8mf<9FRH4=(SIX&>2cUutA(C37}z6V zNDtp9@#K$6tkR1}itx--i1NGeNygkB4hBdyLqXIMeI(5avd)tTq*Zf;JmI#UnFF6p z^H!!}!bvREP;lx*gqH+-#17psK&<5}q|u})xXs303u|W-?u=SgNS%IHk9U|ck&eSB zx!_fYie|S_12ah30AOXhoB`7SXMtJP@y-@tguWCN!|}+@LF@h$E|2bWg6QRW|>qd3}iWAGt)nn zVXV(2>Hz_ZmR3CzCm3x10AEpB(L9(h``;|^iZRa9jx*D#$LB>^*$#|3-HBUI4p>|t zn4Fi!4=0b8KA)8|6CU+dk~SUBD!_CcdiM0DER44U45|nvNo)=j?#?+sUWSNd2?+|* z61ZZZ4X?);?zr{*E03J-_C>UpVT?*8CuUu7@`cU`&tNmsk}GSGad5Ve8pw}^cZ}he z9dbJH-|10Bc_ZyuSr$h)JF-_F!=F*>?^4gJPj6)jS1lWs9GpKqVOzFFf0cH^N>R|^ zoE#;oe(KHU+Qxfj^2jW5Rd7#UdGz(**MfXXiVKg5-ZWeL`P0qRBanm(D>^JO5Jv8t zj&qFhUfnLD?QF0Yhby=DioY^*(2nC6{Hx}lj#t~hH~8)=ld)Ff+(jddw2S0NjQv|D z+lu__k6rM3cRxnp8gJ_oPqBU<3)#sQEblI#&27gi8mJlME*RsJo@&%y7q&L?M+MsL z^8{gAZt&dlaBzQ>a1fZHLeCT?IfAP(a0Bu)yF9l&>QQ@cB6EQzRQ$vMV!TG;CEejBEx6PpXSki3Iv z5&WyibJsY>6#4!a+}r6zEzahX4i%8+jxYy*uhSLDTdK6Xo_E9U1o?z);AG)Xrv%oH zop3bG8Q$9N?j>nem6moqfrY`(OmxRyl`V-TUAOpmbQfwoLN$z*424byRZ?@7C!fx% zU-$-CrrOsQW-`To;Z!S(;GA{c>(GPEKHtTfgTk9`u1F1^-be|E`Y1dCMshlHO5QKK zmi9q@(?|#b!6Z0L@s8etmoau_{{Vto1o~gbZv@^-VudaB%Y4V2;YnaJ$EJ5=SJr+e zkVh@^GKEICIbfhO9QPlGUY$*RweWvk^FA&3RSHiWk?S_hv5*-tzXWYRf92qICl&R6 zx2DJ*@JnwvgvipmunQ!Lr0_>!&p7n2wc*yC8C?ALi(Ro1^dhr%eJVGaWlYFU)gS^k z@%Zu6-ll0}kdW-4V;~mWf`6q!;rYDXAp^5BD+L>uBxiwuJ0Im&$l?eM#3&aR3 z{LsQxaV}WlW5inSQ`AEWJI0LPGuMpLZDv?b4-V$xl zox7YIzXE(sYR>JZ#PPIQ3YVzP4(>9%cK$AD&G0|Ot79B3r4lnjugpuy+Z{{W3Hm+;TTO#v;SYHKWk4tDNggUI8K z{{XFeb9`OZE|w>}&^$FM*}x5Otsgx;{{T7k;X_UlX7 zjIg9p`LRf)+jwjrm$2{6demPQbyQj4Zx3GvL-RP+B-q{f%5&D8AH~10iO#p9-C8Jz z01ZjlWS)VVKBv@lr|ly8ml?Cf8&91Wms_ZbW1K+B81xuD4sw4=YFIV5&vz_0a!g86b4p*0aj-pjI*7WlLj~B*oNmPCpl{8R9FVYF7c2ksvX7d%6$#W*DDy z#}y8wJDVw7`S#;ZK?yQS;Gq5^@&TM@^6k{*V!XS@I=qnh;F)7WE$&#``FL!hB;$_0 zg!Zqr>^>)GI?ktVvuW3g@V@s{p5Hk>fT!zU4}4peTfKV!08rCJuWxOs+(^;8V1+Wa z8GQ$02YjBDFy17 zehl#xdQQI$#rYCLGPS#-HU=DR9Q{cAtD3*j+rxe(md4~V$7IDKEKB*E0t&Z&2sx}< z)ay>itA5Mhwbrrw7J*=^O2F2<8Drw8WVbeHcRkdK5+I^PU>7+9*k!ZW zb6(yDF_jdfHKF-u74T&Y&a|;qs&dWmeUGJoZ*KtH_&fHv_=Tu^LeXx#B?pOoM6>Be z`XO%}<+!tgDB3p88$L^r8wIdP2d#L-UK_Mq;~G5dyTgSiX_Z58R~dP{u}s# z`&@XtS@6tJY5pI*n#FXhJv~!qodViKzCtMDY;u`8cPG-Y%#>e1u~EWPgj_AEfJbkwa!p!H`W!#KNi$wMSuOkm>u@HRnb!fjFU;KY(AIUmgU4z_i6~Q+CEOjk z`gAqu+8%+Y_~QEBJD6j%wU*3IL)@%;+;m@<;POd7g=|~=67bw06~5kC%$ORC2Wjbo zH+t75zPVk>%voYwDbJu|`TEf2x)9D!z?N#? z9DE-LRVsB0bRd!eA|m^O_W-YNUuycITZsrQwLvaV$bMz|XZrT99`NtM_weVAv>jr5 zr)e!Nk&G`01-?R{?#Uy9PDfhxca_>QQ!ZnD%y)7Qef{gq$2-Yb;Kgo+U*Y+1xKeTR zbM^M8TePnLiPdrD1|T=}~25lOTMfj^3WtoubP$ zb^!!CB#Kb1FgjzgUdKvg~wCd1M#e_GjP*}=T2R-xSofAe>%yb*wA@} zsc?S~MX61=A|#zx|=w=74uzfQGn*AXK^LuGcUQIJUEoYg<<*-H}~xGY0u zc>D%>oaUv+P)g^|-|$u)Vry^Mj%a5)4d06N*!;9_^~#J~f_o5D9y<#By73&4-=axv zZnn;h1FGJ)+By>q@7-EHCsO0XphF&sA-skDkXLRMx~9Q6PJjP%AU(=W7Z z3$`zPrs?ka1d#}hy6_7o4_X3xxagN`%F z{CLH2HvSdT@9}YQrNVA=mUxgvSDa*&$0v^cD%FmYHLRXam8@$v4xH>4W@uLN-?K6nw(g57FHDI|^7#aQ;ob1aJ- zYJB{TK2ku#V0ve@JaSbdL?nO!Rl|GcsM_2Jpd#Cpb~0gxJMwV%0dWBf_4tY>}QcMrjMEZc87QLf(XTKT2h+k;63en9+<-%P-7$1R*^- zd;UhCl2EddG>IWojDzZWXSd;5-X^>@UJlouP^z(M*DTCN;-n*X@1CEXRQ=euwYU~BUp*O6Fx^$uO@gsiQUQduhKgo4_x?z#8z5PmTe4|Vk>BT$u`BjAmq0| zxC5Y8-oxD|3+43dP8@Io+&x>?@Mc+{HrPaiV@|UuaE@9uCbMpdznDngO zbHI9^hGB_3MWJdMO|bjQJ-WGY8kz1zaUV!5xAZMEQ<5qIjA0var zPO45vn10k2t*Bi1H%+h&7`)XKGRAV=UO*_LxjVTBgN}Hr9yCi0FHHE0HH@>(bPz%k zScHK``y=k6l^`5+!9D8l$9v|V;@89L825hhT*yxkv&}>D0%a)h;E+xNZ61L$pQ@EcNxhz?Oufmu2mFx z6!U3fDmBV-vDxe|=Dbn)OUFCMBaC-B;GeBU6YhgJDFNG6BJ=F4DX!iyLc5JbXjlcucfzCZKP1ckbk@LBn>Qic0 z(Vse7hf;Ewk}^l{7i$b~RIg$x)v^gAM{EtCF*(OLarq&(%#D|IB|vr zv7g7iCAt}7Zi~2v3)dMx=M~WBbeX>H+s@pDTeZCH_Tci@nxkWWFLdG-3&rvBW` z_CJC55o{Qpgk+Kq#@sW<`$LS^A^Qbs#tlnUcMRns+ZhK7(-&#X$e3nr+gp;y>(idNq-faOw(zdZ3oBsqan5P$5q*BZpX-qkJ8pj=3GjAFWDf4#8&Hq_`u#-aBKk=Yd(?H!W-7 zJyeMiRjlP?CQzk79dr5d-lC(l8!8rZNch6`<|ouHC1% zpCNn@RCec)o^mUb*SutOtF4yS5J>FBjISYJ31jmrj-wm_^sHO2h#I89MAxP^Whx3r z5tv|)&mHUYN|L99FVNdX+GW@a4W zv%w!z`B$9i^2>Rw$LGl*ETKs(N`c1*J$qMkahq!Zh9^Uxy1ytOansv15$-3UT6LFJ z)E{V5##9mx#~)b%TPG{SIr4tnn3a=GW9=Sl0MDwO$JXVl;DO5G03e$ZNt-kc=3I)0fXuPYI^ zo`84A1oQ8T`+N3#(Biz+yicgek^Hy&Q+ftFRXD&oz{x+(zD554f<<^@<3iUwcXz6w zQ5A}lwqSBe!2EdpjeT42Pg;_ zXHoXh%JC(L@ejq_H6N6>W|)Ep01f~EXRdka*15lnp>H)?bbv;7$jnu~`3HlNd-3%= zV!AzfuPl6PE~{xWLw2fBa-jY02>l4-*15fI!d+KXwx0c-d19Fr7~raMIVbSqyRNxy z)cL5XIi`BM+pJLAMIP*=D5N`%Ktajxk6Od{cdf?<{3J5TEM<-8LNW)+7ruVKk*(cj zV_V0McGDV_%#F|y+>ZQ{^{y}B+b`L*D~Cwc?ll=00y!aYfPOdzx@P^HRmoB2Y_p_z zlGDR_rS;CRyTd7tFo;fEocHux{-e^lPl2@aJz#6IMd)hYT~jkGqVH*w0*5T^oC98ocxE46>wZ%J>O^laE~Sk9^hG%0&to z*`-j#WH-v>`*q3BU+Z5Hna|qSl#iyuFK0?9V#OqArT`@42YTd#?0eBt!h#ICEMq(! z&PdPG`q5rhnbXXEMd}hrnw7*;l8^U))q}7F8B)I9{O9nkZ-SR|TloIX-9w{?&e9ad zO8OqS_4cT){4*`Sr~9>8+_u(sBYO@=mQp5=uxBg^{F@iuM;!Y86=O=cHj+kTxRIGibtnia*q@uPf6Lyzh^wtn zkCV2Bw}?y@-YSivXJIbj8Dre8PBX~w{OhICSj(r|1|YCas1)rP=mGWb^K`CvT3IH( zwz;#&K+IU<2-qBP+dWAi%C+>Zt7ElQVI0C4kKFHqKb2O<&AS&h#aHml?^a||ju>(Q z&d@RJaCduEXzk=nOv=$K-~qcF5P95t`ii%x5BQQ!ldkBXk9x5l;9cJDDzU4%55)*%>?zojML{b`%rbhH01w z3{0VR?CZ$&^vz-TNkmI<)~mF`BzVK_58uCXF@xU(R^7tNNS@4Pq?Cp#I6_W)_dl*N zR9WT5>RVPmNFm&lzzoZRaxvf6^{(gPh3ZdZbr?w+NQ%lq!B*or1b6iJt`k}bYpY!4 zzU`I2`7(R3TL{ z4U%QKVsOL}&piOh&)2;~nNde8@j*!Y0|YSvGpf04uwn)Y9^@ZkjQ6ZfCU=$=h{?D} z2p}$9Ta%o3sHX3Ejg56|CWKc$5X$P;i<>R*^xy>FIXy=iY6^n%fX52YZ zjx)&M{*}Ea?uvVjH!B6k`-2#0zG$%9iky7kQLu}iC1I*r@=RHnI$LcFn7F^VBM4BbE zh8bQ{A>Aa4_wu}e6yRX<&ox=urm&UeX=5-AuF5*7108#T+NITexO^=aou4T+5bUbm z2|_n7bAmC7g(UsKh%gdN#zo6+4o9wf9@wBlShL%xG6FzJdjT1 zywqspC{>9d{MkGX-~PIm+UgM+3#*Axlbx))oSt%ip5FBZyzRZx7Un_8*^R@tPp@oy zPz7%vM{#lB&1AtRmhWop5o1^0xadLoa1IYVn&mzPM)7z{P=Ye0qMjhEWZX)WJmao1 z53g$Nb-yn6LDV2fosq33Rg7?4gd~nn;&a$>UVHmGT^aOCx1FVkpp8^32Ll<;x#IvI zO5~`&dlS;5Z>r5R(JX$^1=M2El@UTb`&h7K{--8`jBytTvXmHiEca(tqE8ti%+<0mGc=!&`S*P&BxvK z@5NnZcrMwQhGQNbmM&taat9+lZzYK;}?lW3a`8C^4m0E~v`7~}M> znS%F^xSCw9=OgiNPx~*3JWCAb4?a0%O^1YyQMo@iP)0FcM6+GR8~vSrQp1HGDd#=; z9jn|vJl&Z-EO?`O?v_d9a1IHmLcUvOj(&+v?O2l`dYIxdmfZ%n(D)6SqD^)c>x9VqXNf_MuJg*rT2d;C|^Qek73K2)(4dnPdfR#i5X%y4mls^wM}8-b1ZU3?o_bI1&%rpNYCbL znoX%#-Z71if5qCH4-h&j+qv_F7y#pw?tT9N#;Y%gZX@!;sS2#D2HoUy)8D>ouf&&l zwdPVeI41|?KPbizdZnc^`N5uDp}MFU>*=2L(2{37k?OH{m|WPAJ23^ellQPNFuZ>+ zOjhrQ_104~cL!=oV>aL;KO*hxk-!=6*126GBl^bbM&tB!dI}~ zTS*H_fXNKrUzVH`u;c1M9sMfShb={+*8a#htEp<9A&xhYMIEKS6#&XIvwX!*UN|GD z12y!Nq{#xX!NPzP4czga#Bxtk4ScWr7)tZ_$HgY`)mikoB~nMtBP_%d$9xcd`4#mY zmB#o9Rg9H52b4T_UvFCefZ+$tmQz0g<9PDsb1vG%3x|z}*hx@Ecd_rgu%|++Y#YwX zZ&Ee@4>{@X$N5!wQKOZ&hHo)KwlkFn93M~VPJ4!pfG7|yP?B;zMhWDR!2ba2SJR&! zPiri#01%C#m^euQZMZyx_{Dobfu<6k(lNq`xY;4$mh*mcE2 zER7S7vdUGRLBimcJqYx`^`Hhql3KVhL}LRgNO8Chg!^^QJJj+acmcp&tPllGcOLjX z0sgfGtgmV$@>Rf*@WW}soM)W=Kb=}G5!kydMn(msU^35v&$r4k_)t$V5td^zpa@i} zE_U)d@CU6_bZhH(h{z06uafG=JqIcP_Z$)HQpt3_RHZi`kbxo&gRj>f{c5z1WJWR& ztYj>#IOiRR@BTFvV|Y8AIA+yYv~xI@!}qhKh|cluP@ZQpAsJu`dt={&TY~c5>L}*1 znVm`vkL8sZBd$Af*FKeQeY?Rd{o`_vT21 zhitA4teg^h?R@tf)r*}`QU?13n|GbWKOhmtKpp+--KSPE zisfg_R;ML5%!*7^@0do?z8RSAU723{x$FKFr2=f(=PO0OoW2G@JPgXP>8?v^>ipXPg1-`YW(q*S^f>x@^vy$ea=u$Y zg=KNVD=RW5Y$@s28PBajbbol@Y(~I8!dn>WyEx;X1z|e!rnEY#;p0`^qe44{hBa=o zxecD=^gz`m@f;KTA%YVJVC6BEDt)sV-i__Ja7fjEEjj2Wb}vYi{=3ts2na6L5) zT$1d0xbZ#PO0rz(@Vf`XlgK<{A5PVFKNH<0jOi|vGZ+9E;@Z6R2ON>p2dKqy^7w`0 zmOm`8SqCI!labW+`eL-S?-j^2Th|Y=L}g*~ZpL^yJ;?Mm_{(h{uqsh#>ufwte>Q=k zrQMq&$hR@Oh-~rRj(pYshaS zMGic)$INk#{eAhxME*Ao<+PiN033{fN$4?;^TjnVmKk40Xj^#Eq`!=d9fg=Ad(fSy zBPXv;a&!3A-A~6$ZFuW-Vx^;UtjaJlIQdUn!LjjJk>J}hBOG88l0zQ6_0Ra!`qzk( zO?G@exM<{MPcMK-?xU{)nw8An9U|So#CRGfUm+2<{Gr=wsp-eAPgC@*O+VrsQh0Xm ze2Tmz-q5V(H^?%v(;sjTJ zwMWCtHAltAh$4+o-dMqoM=E;m&dg(uNHzA?h)&q`XSzSUF6_IQf*U}=tjAHD4yl-lF6l3V6v1a9eHeh z?%!T>Uv0xpN`(DS%(%{zrHF^1?E+}+;`0^d666;R7|1vrgWQbgZ=tO#fGurWKQ$!t zK4oy&0Our}_b2kMcf+@jEt9p@-!pdB2yj%9*QXqMoZ_`?ktUs0!n9%|G`of~w~XWb z^sl8pIywtJn{{};bT-3kFkG++gPa^O`u?>_YZ>fQ7ZEdr1hXL$EJLu!=YVN-jcfZ< zxVVxfKmmJn+!OZ}TK*`7XB4B&!4A~VK4>RfKixpM9}?X+~< z@ie-FWs%3+hz?I3GTlFwW!y;!@{%UrBRhyuw5sO=*!or7YITy)FC&5yW+4iz>=2b0 z$G%TN+Oi~>Ot9`o-MN9m;GV~txUQyiFupp-w!a1Zbu7wu+i7heY@MZ5l(TyfInO;S z=idr^UGT1vZn60H!+v$CD&BpBuLSBb^BG;>ms*!JV?0&0JYh&u)h&~Un@b7^xH5vRtuE@5cC-N>WqQsln z0k>$*?DQ4F$*9^3U~P3EBwL2cd0BJvbI-r{*M`4~{A~`CCYp8AccSxlaMo4BTo=oXruRVG{*3*JnZ>#i14hWec_&iu6x#ylCjTHgwxpe81HRbRWRy# zcgV`d0OPS8FfrbkZ|z#&Wcrjq9OM}DjB-wU^ZM75LqCb9oz1O~n(KcOjL1TgQ5IY{8 z#qIxuaV=dEBxqfwR|lQrN|O-umvj4a9`lvLw8+kDmv&JCo~J@9_gw zi&BuHIh41Vg1d3X4+oqR(0bIgx*A55`lIUGh;-d&P_n&`UC=_n2bcxHUFv!sdJd6! z)9q(@{&Z&`oxQj}LsHU4iVXTP<4l@WXVaTcbql>0?MwIp&$mjJeKzti{!q2JSxTt= z;J^fA^Z0b>UJ%|OwX!?q(PJnZXgj_@2+mg=j=k!8PZ9|9>7}zv%OY-9E{;a?v+ja= z401*~(kVfs+(otXC=YK6q<KR1CMCaDzNx5!~^UQ^n(ZxJ!R$-s+PHh8i=dDGSd-k)A!cG&H-GqR)JbO}T5h zLs&$?Sde$F&`2bcj(c~niF|$G$zZU3O5Wg0r%iixA}cpG?qyJ!LZ!v#)w2{*o&NGbHD`lfLz3`U)(#%<+0QV7t^ZxYk%FWI*>(;#dZk9h# z@aCU9t6#D)ej4d1aiq1@oWNX0cjdWeJ-|JNJ9^hbmkl)XBxt+Wsb=~4>$|o)0ou54 zg&M8pgBWhy#-p92a_!R?uC8k)g<9e!X?FhrtOtU?@yH!}*N;_mHh$li)s-b1Jq?$c zA-7a@jgVw0Z<}!)zYe3+){cR%S$LAp+S|v1aAPDve2PH;50pvh2VC?x_N*;xLhuK- z-Z!G0cg8r+y)TC0a>?hE9P+AqbIANXJ?o2=A4Sh~bLo$VJ}uGz0B0ZAE5<%CkHcOA z@xO|^eenh#3;0fN66s5*!=xpxsFv<+ft2I~n2az5w&%ThZ@>?To*npS`$OoyF!<1H z^*uHVo9o?X(%J-$3#i`KQTAA4Cu;6@U8|e`xXpAPIU`m70D^3MI$K5?JSXvYUA5GL z0sf3`tmKvka6ag8=&DZyxC5xK74a^e4aS{`L~5o)J4)m@^~X?g+P$1jRYTb%x?KFv zC(9mZ_4!V1N>g$4T`YZt;BVUR_Dt6Xiyp80FnEu{)>^gwy^NP|eVG;^EQ=VDPb%Z? z0^pFjUZY;HM0?(#8l%eeP;&d<84mP9Lt_b#4y4_w5lfy zzGt^@)ONkAT6kL4%F|!d4fV&IWq3s4e6Q~1yLJ4IDhsb4TG-opz8mnSi)}il(=4nd zb|)Z{k%jf|T-S(igX$7om-8ld*j>*2wdx}V<0Q z2Y1@8WF&dAwmwuD$R@hudn3fG^=C)m+i5KPIT*ROOFM|acO*zKk>j8T=~ot5~QBF6*NB-66$0r zrD)8CGbYlYnK8z8@BzoaBEIJ+i*ynEapLVoEc$Wmk-nZAv1^3IyaCaImRMIHXO;J@ z)$p~X$k}51xCym35$(rp^gflx*!)d5*DLmG4L;%8L_!L%RA4i+Bip5JOYsrHxVY1F zWm!oq=4Ju2z&IU;r+inYp(FC=By0}{>GDar?IW4Ok@Mk0`s5Gg?NVBJQ%j5$k4~{g z1933|0_0#GJ;zU4$AiWjA=qHj?UNZkP$xO>*N&ZP*Zd}NI>-!gi5P`vLxf&9$UO8p z{A#&miE>9x;7uY64;N`eOMt42hB1JpiTN9rIqG?@Pq4fT8u@X%EBvH}1gQ1L*N?)y z&*1loBGmpZ+gZT{ykZFMBzF=W;3PxuCvUy_3iV5bwnesv)-_oSUT$M;!G4~exU4G4 zsac*@E?)hSQcyNeytAvG{{Sc?Rg`3kV;n3pNE{wc2LsshMOM^p9xF$dR*PnKw$qji zp1Axmn&|ZSp|^lNim7=qAYxU!amQ{y`t{FJcG$+7zN}kIcCdpO*yIx2e66)@$H&>jNE*{D3tufpO(ZCqwleFy&l1-tPJS!h2A zEMZ{m(`uK11<4^%5RQ2uZ?BTR59`h19}YYzB!){z+=?(jUf3VbwyPJ(6ZU=sOX`+= zOdk z&!;>u{{RI6)qENIKX@0w-v@NG(QmvvVD|T#<=IP_E(WT)`TmUwpQO8Qh{hfbjPZWG`()C?i!}d~G_;WzA zn(pscx>7BPiAnNc$NK4x2*TtqesBwPeM((I!Y7VEi99PRsp^1^0B`0!t1LzDc6&K2 zFs>~_R=4u>GIeN{{j(HNsTl}%jli0^*|%e#i5i6%>D2a|EYrG|g?CQC4Wv6`Ioxye z9^Zvrwnd2mxm1LO`3@C#fIz_m1a<42@tX6kWA>-`d7=2;+r#>&i6pkxwMPOtA+wf6 zh30IcOh6t~gz>S4dUVZtC6dE!aWdP?h=@r5s6wxdU<1oGGt}a>sdns-n5WBR%d)FZ zyk`YUk!h%xt8IKXK;y8MpO(Qe=Kv{;8p43 z@*Bc&G^UYb+^#^S>f3&QEK!r=G z`O1NwE3Xe9-bd8AJ4Kx3wWOlXE#6=60b&ahN2@Q>9S^M!VYnj50_@2R{76r6`Bbr> ziU=84k_OIKl>}t-&p7HSS|J?3%G);~!jsQVKEAd0(XvO+$&sy^gl+7n7{LRe_xk3! z{{W5m*7^^?j~m?GNYT6+4cmXZSqKN))AO#7$>!VVVo^@?uHx!kr`&j+#H2&bLrdhuO}l`p*ahS=W3k3Meo{{L8yFGh7qzM zZ(>T2#JA4;k@N$7O5bI=VKir|BAnuAk;Z zb9$mwg~@Y`hxon8$2G^W>GImqmOoaU;= zCQFmC#_Wy&>CSVX)AOf5^0l}Sv`ZqAQ0J06gY8uAeJwV*Y)D;@#>tE++F7{yx^Db> zXT5so?BdC%{4enZzJUrWIuQS4I=ZfypWmZD0?%W&?or%EDO#Xtcy{o8Z zmNjKl^0K!>jzAybRrILZZ7S7Y%3{&47y~?W`g4O?l0zD*f`CSf000089X^@h*H1N- zjqud=YoP>trf^x6nOAl)FsD5Rd-tg3w11r=Z@R+{2R^*ijTBR3F`{KU?&zT8=hu#u zw$8!Wt78B!-s(E?58+vJ9^7Yh=a2X(o#R>jHn6pKC+!#Upi%sLSQGXC0PEtU{e>*d zJ`>cZm`YkqqYb$TLEsX21h1!D9+iv#00kM;*;~Vwah$22%zmFZ5w-`@EII3uitT@5 zSeZT=OFV&+@&uPgF6p4>M@zmD*ebf$Do2!xb({GnbLm zh4-q(d86R%c>e&z+INjWJKGuLw58E(p=1p&80D}tpP~H5Dt$(0i&3~P*^y*q zRvivF{VI*k#@M?nHvk6X^smh&t8dKxULNdY=wI-Z8#O;NK+F%!!E$=~k8D?Wa;gS`6TdSmO&b(XUhl@?YDBA!cq;0HmE!-galKVW4&LXJjP*R%(4H5#u)ET&q`0$^A=J!HB#?~!&FP*oj>5hAIOyS_7|Cg4 z@LcX**Bw>8?r>fxl27f)TrnqcA1NfU2ci7Gtzzlc3f?c%W0hYQ7r~!+I4U{8{-(Qs z6X{aHt-D)ABsR>i<;^pIfGz>#pMTD6zD1~B`pLTPcj0~Qihf3|k<6(%D zd0FQ2IIT{*UAPfj-Fc*M3g@6aeS7g-ufv-uZT=rx$tVnGl1WPr9!$AEF#2N{td@>|SRe5NbF$T=V%=5zVgKMX+(9tqPU$y5*zo2JlDBp>sd_Hh!utaC#{JH<9r zO?Im*A&8z^I4yAA-)~=-_zig3q1Atk z`c)T{My<2SkIF(a4&R{9sO?-*W{O&wo*9gdK55Cod$!7z3$qy<_xHiA5f;b}pG109wANV_@v61CV(8tUdeZ74dkljh{tN;UkSy zE@o^laHI{qcIrFz#T7I-WGf;@flnKlcl!3CxQjkj_zC+5Y5xEhbj@Dt#NH*k(cZ^e zlEvYQ!Ddzu7nmd)j(E-wt#V(sXY8kG`!x8!z*m|svwN;Xs>t4R$z~uHp;!gL2c8QO zKAo%S57_fklI^}CLzVvkLf332191#eNH+dmLHbt{{{RJ6xAU~G09=8&p}x3P55VUD z{Q*)BK9%>c4+OM65*XT&pC$CM;qPE<09)mT>@FGOax=*Jw*}{s&J9~_y{ATJb)z1NVrIr&F^JJ&(s8<(9YXL1M1@t5OhJ#+2;G}^fg*?H!BW`^ll z#=(gU0Sm_q_0l_?Sd;3(-$G*X$blts3+7z6V+dW7F znzdrdABOE74>1G8BQj@pNF3uGMlp`rp+%6Lh&&;1MaH8Br);QD#5$0v*Czvl%rW#8 z(#LeM-4^63us3ZzdTa*v{k;oxlOmk=G}hn%2wb1NWja zxyf5MuQgF&c z6WgKN>MMwwSo=|z%pP25fszrD6yuObUU@&IcRvxCAHp|Hlx>cZW!b)5ouK2sbNF?y zHPbHI<)<;UrCa5X13U4?Mn*{K{VRMsy0JBMv1HwbKj}!`RH_KKmjiW_!NSZ{HUkOl!Huc5^x{vVH0w({eRq?vhESqi$G zat?Ufc=qDDEY4RevDX^;wz5%h8a5?m2&xz{1(Xr!Ip(X}UOnvbtY%CpBLEzA;3@1+ zJ!y5V8s^?eR@q7OBM~}=8>2YreSLVQ>H2iCOXb|ku*DkXX4-eic*y?%cbsRfBCm06 z?}B{t%2Ad6ZOg+c2chansqOVMJH;Kef;3^fh2)&|9-mJ2Aka6*8(Ge>9mg#kS@OX+ z>HI^eIN(z0nhY@NuGbg2nm?F%YD$$Impmyw&pjv;B)qxG`VTvC&3Q74# zK7*gayp#5Je=AJAwMh~@B23b-XUEJy`G2|(9{I0lhr&x~alK}gy9bOZKtt}%6fxit zo=LAG{hqW@{iCYb>LH+b?aDftGQn0&zc}xL4sqCu=B@llo{kywP^gbcx76LGWl|Ma zBhAU*~s;J=RGnQa_i>J>W{Pz=^h~MQ#RXdDq0QUocJw`#^bxrhK4 z1OPjaLJ#w<_8W;KQqp;^WHpQGukxYd2Ai}wA z-`&VK@5!$XnszZrlMSIj8+w3q)9KGj`cw9b&@}nJC8^aXnf}|SS`~~csvq0{7=N@# z1M6QjHQFi>0n>j2`sOj&;IV&rgQlCPuw{0R@W;V(f z$=tZlanEk_?Ka=-GnCj2jJW}rfJyD_dHi!*dYZu6IvFJ4CP;%e0Swp~9)qDI^c8zc z&@60xMHD)|p{K(fgol!8ar&F1F&2Ym4XYB-u!7%a+#mLibCHf~M6PEhiS#L%ST7r!8*rt)@sH$d&^{gC{ijy8 zi5fnnZPITBDsA7Ua)HzqyGR%^UP`%O~F)ghEea2)K@{_ElM39P_Vy& z<5aPq?H*f3T)x0cfI9ZUKIb*9D04|8jZL%yV1(LB`V;Sk{Poe!OWU=#G%5w^+d=~?NPgCl=ccYuQIKHJjLSVfJu1kFCAVaDOtO#*Hq{yA5_T-}+Q-5j%kx+7yllJ@ZgW;VJFxW>Yi~KI53m7DYRFIUkK>R%%gd zCr%!mqcqwuVuYMVQMN{*PjC-TJ&#|)qQ27?Q)nP?6sna;3WCaWlatpT)o^H`oVmLu zBt#7930^y>1pffz-Fc}lv^N4ZH(}j~7{U4To_3OX0|WK14p>@^?0qzGw3@du&S|3a zL6Jf-2bx9=)nJ)H<178(IQ8|-bQaUC{kihgq{W*s@Xo`pJ(zUqRwK7BYS3yZ3_fT9 zPFr~gk_WF&MP=(6B)0p!qb$mqby1Nj;kZ%V!0Um?#%kg1FwdIW8C3RIzjpRyu^Adw z3Zu$m5bnm^+4Mh`wP{#L^2CiQ;r8SX53WehZ>@4Mc#YAvA_>%BD@bu7o!tq+$olie zbeeXvXK>lLy0(Re6@LFr1X zEzD{J21W!SeC^2fKBRP|cVt4hYJ+L=!i8nYC!sw#;}pk*U0ca=fP=l1;GeIc?de%c zX`9BIR!t4Mn8!BYT0+18syI=eqaA(f0UIRDA#x;bxnQ8KPjlFub`83qpphOW`kQWwF{p$j|2dCZ1((( ze9QY+*-AfX{{V>bNr@hR0oe%f4jin9BxHK^^v!)c_GYk(FvH3!cCcm_ElOA&Pr2a6U%%-&quggaC*ETpV?;2a-+ z&#y|0O*h(1xwIwlgtsr@y(O&#vO;ez!OUmo zI|pz*Ju0rFcQlNd4z6+o1U%!ZJbGXn*br(O9hQzRciVZ_cROQf+8}U&PSAPC&N%Ce zf?ZEjF|$E(jkFPsfb-8%eX08*RGMtegf7BUtH z3Y085`(wU6C{)9o#E19BVB;rqb~$werVVtOIY;<^sS8(CBJvI8)R1`X?g9O4I^)C| zt<9`&5J@9K7%__=@y0tNvgfdt_8J+eP4ZN8-Q+?rh+j@=0+T8DMj_cGhsjfxteX z=NP6X+uh%>xunPe`brgE`Mx~hC=KGf`1fR?ka?b4HK^5 z4suT%dspb5u>=c$e59hPPVtvhjjgB}vClz4*m7V_|F7WVUESqrX6-rI>F5!~0>@W=3{>V99xI@hP@RnVC#jH$Z zV;WB{%=q9G1F__idiJZ@X=$Xrgvg?Hwq-%c`L|^A>)#cNZv$&HZ?!hKk#}#nkS~+8 zj;FaDhkCtn;u-FB30l$8B=f_^v|v6tCqLcJc;ddC_-mrI#Ec{ir98C@wQ+;)2=t~a z$qKA-plIBZvLCzGBzojkiS6w#W|CVMiq7Ek=8IgUUA?#aPlq5-BTU@8eBd5~k}=bg25TnlBoCL7C5l6aDt_-{laKS7 zvv;Vjq9gKmtS~7^(`Mf(2(hq4@g|hv0X_ zTa9Jzqq|QJ+)5D~qC(2KD8o1k1~Pt_uZMIGi4AFEYIT?dgUkN_SPs?%fq|TGea}%} zpYd#YtHaR!Q-G(-hN!&F?SEQ-?VFd3?0xKtcN_pm01t7VYJ|QZX)SQ>Gmxv3@{eAA zpRH5Vb*meenXk-<>M$}sL7v}GPg>J`D^9&Y))x?$U`rzWq?~i|_Z9MLnm+B-mqb;M zR+TQ)TVh5|Q3*I=dBH#Dj+N3w;#Y@CIZ2i=a9pCeIbwr3^Z*W@*08UwO^t#{60;Xo zAr(OCaf9ogYKW3V(33nQm!$_83U*|v$LE^rqe?C<9ChlqBz5w5qsx(+H+5G`f__#2 z`}F7VG>PJtm~D->1v?e@e7?9Ip4G@(>L^vd*}6!;`IB$Vc5ba^Z*R7+}Is+ z>7F{(Tirw~q(U>bLt&RH+>$x$Dw2xh>~m~+YF`5M+VnnU)tJF6cVd9iF^ zw`W2VCPDtt?m*-6uD?k5fuc#K*)7$-?@!44ka9-^E;z@fc+^_k$2)97%>Mwp1y9Zf zIT`iGe|mJcZe7CgODG4S9CRbs-m%0}X)7HxB%bHE+W419kTY9cn@G|B0Cr_RCCU;nWWWBvPy}7#+-`9PaE7 z2RN-!s$4_hbS744K0c^`}@r~;*nZZ#0abiQ}Z8gMl0rvtEZbQBJOSgJNFI`8Rw8aKNDJ( zz9gM(oqWQsOJK3i2^@3Z6_bqatj*)d*2cDIJ;b_2rnNT-4$?sky z<#%)Tj2$$WDVohJ(o1ZLL4*1!gPoeAo0JG=CZw!1O)qF+a@7hnp z^Z1kD2gG<`i(iJo7u7TysLmkOEV1($V*Vvuu?nSmTsNTVpYTm@34BG+V%EQBAKHJw zekJgf^M!(I?LIN6Krx-OB25?)4tEW!?}JqS4gSEMIQ^vm0B5fZ`19bdrQnd7=Ao)- zmv&wv@d9a5t6AK6F}=R%+s#%A#g7|K(auge4~t*$MPH1wTP5zL;V*@kQaqn5mfkk9 zmDKlKIw?KRB!Da5!qc3fqh1$X8Tl4_jl$E$PPSEz_H%C1Piv-o4~YIW{3HJWf^z&e z@eYOiD0rf8iJu*OS7LODb@yeO9}dRj=U`&})CZ76N%J{W+)fKu$=(m}l)fFdkI0iT z+P-CZrVljE+`Eu|_Tot=)RSJz@b~@+XYsqk+Dln!pABrTWDmQ`(!51sIzXgnClV+f z3GMlFUOzOxcZlVTsv)$NOMHgTB#qe|0yrQto}3=U*Poiyn~J8RXrEiaI9wzuRK%=D zwXXgrdzU;zc4wQ+Dw3dFfu4P_k3ovZOObIK9)3Uzp1AzF3Y$<{nJ#m1;ZZSz)aTa& z^{m}e=)rEL*q}HeopKBMV0%}Fq1^pORe7DvOPBL?)+;FGw-NWT!RkJhx$yHxid{=k z)U^|E+IE8xnt4@5=ai3;6tTxcoP8^t(QVgK)GwqCu3=sIRUl;GV;-6PO>|m_m%_ge z?5wqWhnC}0nJ-=vzj1oU8(`tG*ylYstyFEH%JoNGrfSy@;oUT>lf`b<>ovN@a8q$S zoxjH1X0BiBR~A#pZ+5Xqau6AqrW~_zlg|ye@x^BNXHwR5-wPu}s2F6LF(kI}C;=S( z;DLu2Bm60v4~OS>hUZtfu+yTuokUG>F%sUhHVXhV#!fQWu0CF8q3kKTP>svK9CbF( z{6C|-5^a*@@TBk#&@#Tm-`2d^UmLoHRdmBh3o+*h_(nS%o`bLz=s&e?g(j7!czO%_ zc8X+@c9G=COsD}>N2Uom9CKbM>nd7qR*Xp_30H%;z#L%ud;3@DIW#SYif8f9iuILz z{;OMPj`PFc5Uvih6nG6cm;(o5izWwu%zJ}fLwrHicSy0?S%Rt-MV@loGw4)cp1o_s z@2>7F;SyU-9{8By-M9dbgpR#`GAbKi6wLurj&V6c><*S=aAJxCJfH^MFY``RQI9b$RBy z7`bJ5Nm4iNZg|hrKZR&$5#GzMX_n1?aXz7LyF{Brz)YmBdy+GZ`c{er$tSV)XY6<5 z8MQCkYs5d=i@9y|Z9$SVChgA88i9_z0rsz^t?Z_PH5+p^!Uu2%E8COb`d7!l@J@TB zwf&`jBwydGvjx(pjV9Z<*LB;16nc%R$?ejJgCNT?0u`p#wG0; zr0DuO-0qwcB-g3l;nGK#}&ge7Uk*VWOX?#2g(y^B}w-EDxRTs z;%2q6h_sxudRfaWq)H~~-a@H>vZGg@-otFlL&rL(dp-#bSehI8NApqBPnR!6v3 zRZ^>+qjuxYIpcx&8cUsKJuWw8l(z>aCIz~WUX{<>$#JUPH=VxT!atQ&TYs5=erEj- zw-u9$xN{#3f5B?}PBmW`{3x}OMpU)%_M+eujCr>(jFaCxde_N62z7Iyc)});l&Kh# z9SY-0alf6xMzf+^fj~+!!+&$_o%c;EvhsE5>iNdoK$3b5XF=W0G0#WlX@a zfC`Lm+{d6GV;tuuv%*bm&#=$1@|Lk%pQt`G(vQM#*jmQlL$f+2k)nJ*mF)zmApP-= z=8*ya09hlFNj#Ek^T)%|?9$+hBKVFaP#?G-PfS)Xi~cR%d|vT&?})s42C=GH$vBHk zhVxRANNhI76h#_+#Q+W13crnRcv!3H(FOzMU)|%cUb}rW+LkIxO<3QCaPq^cbMDHw z_i`(+ETbUiL-&gw!}PCb{ht2-;Gmksv$WT63Be(hWu47Y~qmfJHN8TiIOL5ofoO{$#lc%aX zvs^SWUgXY`;=hlh_`&;2>V72fQff$==ZGz2(~{~iZjK%lK4voeQOa1+aI!A94@im-R(NA+Ny{OJby}^u_<{Ivw#ARl!MLy z?ZsJ{vd&;~&N2gf_0Q8iDJ89nj9so}t83bN5e=t@HDR2olI~ksN{sRIDF?O>0Og}sL2Cnu*M?l|OQZ9d(|h=QJBH~@|g)9>w4>llwfC^o!~`vjXg zQIOcrr?qzBV|uam2~XW<#fgE3%eC_3O`{km<ei{f89agAWo?xixR$w4HFxFfDx0|0P( z*WG`z?c5qhtK&U;T$jqT(sbamH#q7Wf!{dk_*W)PrVjpRpT-jX^pWd2hrzE0_>$^- z{{RyBV^6)lmu~ScS1+{{Urgg>!hfTGXNNT#?>tK*u3%N^-{?#!dm_uT#ZVxc!d)8+en%S|oGm zdbA(e>`E%?^D3!0Ibt|t$4>b*=YAId0D^&C>Tr0nO-teai5yy0@U$)cwAhrEAxgx+ zGh+b!xyEZo)Asb2{ub_^qrZSag67NZEi`(-+Jhf=X48UuWY!m5&cF8ib+PZ>Irw#= z{6^EPH2(k^E~zb^oK!%TcZL!+@S)qO{0O_w0}1V{U%It$3+CwQa}uOi-K>bGOrv=~)*4 z0Jb)jY8mA4e~49MB<)$_=y^R)9eJ%7KWu*u$cSX{?}=9+63HY_w>|N@85J$f8vSP% z6}u&|{g}KTV|tTn*IpylV@C|O(@r6TU=BV&4{ye_e`zgnTYMbUqSKNKdv%68C?NZZ z5*G`OI`NV9HIl!zCxRp(-~Rx@MPs!CmXgHEG0=b%o&{0;p}a$5uY4JX^TT)c`ktSA ze+ne=axsv0us?L;JawlVwysK@YO{~DJaXFol0DZd6bB;&XJ8xw^r`N3DT_w%9e{Cz z(;5DKz^ba)lY5bsJo*fr0zF1?>r%-XxhgdTeT06OexCVfsG>LGJ;AdD9Z zN{zS+mOjVS(=KIXz>LN~T(BxY&wu{_RYuJr+PvmfEKbtDH&8(Ls}VB^A{OQ|yJ{9; zk&NyDpU;|`9STh!ApZctK<`U@N6;-!=#WPws~BL*#?THwA75JcFWC;nSbP|X8BQc% zQbMQZB$sUV>fN~QUpIc-nzVQS03NNpm)b3~@Jfz6pj_mya!)^yuc-e3XDc(Kd>+#6 zWJL4dnFpDG2@8M#$mxzf>*nz5pC32a`b}%)`3A+zeXk{aElHlNQ z8=jcYL7JG{yDlSCatIqqI0HQ7)kceQNX@-~a-ePbdUrjz=A~GfhFO;c;1wi+j+pnW zu&z$?sDLsOj@bn6BY=Ht%KrdtjX~|c4V1V5gK(g#gOSe!lh}3Qy*YwRBQubW2QCK$ zj{e{MYVm*D!tHH-8|g?Lot{RR@8uat+nziB04^(oGM^?MZv78OE{{GU3(WYk=Jh1F zX#)^sCqF3X)EsfoCyLH_Jh?+50zwAB20_nnYPWF7GJK`nf%m(ga!>NsFm7`XxBjx)6N#{-_EeS7m?=3TWa8ddB#ttYS6h` znY7n1vnY=)B2W2g#sSCa?NcEuxJpd@8vTQo3s2au!`e2Ne3sYOxAO(eh_3l;DJj=! z>QC1guY6`pMX<5G->5Poi`^6U*ek;`e#o)VgmXS)Wb$KMgNsKTA?Hpu&U2Em@JnC3^ zN}7N055h4~_L!QITV0r6wBN<6TW<`_{{RR*i`r@s1u$kKD#idLXZT$A&rH`L`#t$;b%Ccor~r}+fU(IYXQ1-Zc2H90)wt8Z@C8@Z^%LRE~d#HCz4)z{w}UT^8T!@2%B^#Cx18ChYBC!1LD~dsWZczr;Ti zJXP?*DE|OyZA(PeJU?%KvZPv6NgUA3RE1&y1(%;%`uf?<4vk-{&Z1N8)co?DE@{ST z>0{0<1hH8}doe*X0jhHq`}{5_^T z((a4OPc1sTFCh=FY>;zWJ7X4e7n90GU!0MWK|Mh9$Rp`qoMp_DM+HqL(N|p}(?_?s z4D71QBO(xwfN{a}?rW&^6+;ZtpCO3{ox!45X3jdB^$UtrNl-I6+v`0Z89jI2qaTam3QOe1wMVK-py0~yHe^cAmhY_Pj9+5@XAC_+&B z9FBt(iJ}PYJVOn>(BpHHj2r-@s)p=yjFIVEX?bsX9MQva@+gqR!GT|#0L1R^*AKGl;PjI&;>-dSI?J2?kv#&N*xJL0wAwGr-HhC2gtg-F|; z2ybrrtO)K!zOAVXxg_$w(p4Q741lVf?LB(`09wjY9CRu8{?yIj-APns3~9BHjp|jy zWkKu52E5ABSw7YbtfMc1h5(Rqagp4CpH3^)b!E113|^Th46h4@j4owijIaRloL38N zrADwhjS!~MmQ>3&N2gW)0P9xxUZz-$m56N-4g_QtWem*h0b!m8x6-9~5v_qcl2Nz~ zjfQS|em(1}(L6JzTq#*B^ypEe5{VpnW>1*pb;d?GKBl3#_+ccI$@X1F)+o`Na5m%+ zq;L~HwbgT$=OeCLh`+Jk$pf@A;XsfeErM_q^}x?QqtdjZ*6%MBP5Ug{3vK<{jhu6g z4m%9@s(v!jZ?yR>tnPl!e#I)4bpHTX^Dh|h(43B^6tTos2o~HTY>buIHV&P=y?&G> za@3ilrAor*FS0$!kYiksM^m3#p3dJFWhI!ho*GPirF$Q2{&h~+NgR>8h>$1EwRsGC zoc12yTD=v-o@4I|i2E@6$GZ{JjN?6Nu{UN;m9LBbDg+8#=Sn-WLu(B=SeWcgya#(0R9HN^WgV` zXYhZ-i7&_57TDa+ak>^Hs>vaLm=VBik)GsNHAK0Q=-{N~PH7#Em1xt>(7qBd<<*Wk z`MP@?irGuYiq7gZbz&8y#6WSu1QLF^tovJ&{h-lB8Wl1U+fCEvgA4`^Nc1O@lUm7MEaim#YKZJfFkHor&gG9M#R_3y&Yi%8V&djLWzHPve zM@)Txr8;D7sP4{0q$%1sKkt1{^Q~<&;opcYto*5TEl&*G4=GCyeHD&>ok^&8M_GbP zaW;*pu;2*N3}BYP7$*lj=dhv?D)uz~BU~Gwg8m(AhC?N`r*f<}?kpsX9i*Q^2R$o| z(*gSvHO|Z*mmp*w{PW+YI*RW6NuX<2e+sm_I5e$Lm^FE1cox%pZZPcxu;@DDrfZ3` z(QlH;)aja|oR0!9Mu? zD;BJ3>R9$q2fM|ud@Q-UZL4jozuuE3073Z(?boh-Fws2=9;5lGT|xx74?y$Zl;i&MH^9LJ% zR#DV8dM|IrxJ?G`B-0gK!V9lO%7T4Pe(?0Jzru3cU*5qR$!j7@B8J*>vZ-JSoSt$s zn(3valQ638nm+3Iw$~SbwfBZ(*QdLfzr*;90o)P@RKk)vfxyA^9`w3ozHiQ6NAn2V z@?-9tVB^3409w4mL-^aMd}sZsG}!fxD%vSDttwkFEH3g&_R#>N831ii2f5LMG0&@dbJN~S%XeR$k)#eUJjwWIX}o3^Lp9BV=Sc{I8kGAWf~7;Hw~UzX3jzI*4l zaa#IsgLO;f3?K^tAg7$$OZ)A|BhdH7TKIpUTg_s+o}<0Y(f;czv<1oe&!&23sOF*9 zJZ*7upYctiLmC!VmB~DVwC(mB`~G$BRmILzaHM?o91S{fQ?5&A@XGep+2Os2m**S# zU`8^%kESX;TS2+dpl|IF93vn(L*^@EsLG7vxE*SZp1r6=eF40_mf}FpryP;SLXpr6 z^N&xZbh;PBMoIji5&03TNN~}i=Zx~F(DC@t>SAfyQd$W^2~o8dW^&P@B$CNKOid=u z-3|f9G5kOMdegMkV`zd#q!ag93CU5|{V{?1)SfQWMw>fb>HE%~Fjd1H!ZvbAbDrGs z>6)t7BH1D`hCWh|*k8O4UMrzgRiSipN}HiOGeY9vNa3b=-^)_#y@?qZ6?{D&M=5!^>T+^9i}02C3BBt6c1{VOP@nbCDE z4oV@j%v+UZVnE8Axj%;)s|HQ4y5SBG9N~ckaoefSCpD`r%o9q$Df13MX(HM|>+@ru zrYjF!a7+ex_k4`uTzZL66T^>{STN2tsEKFiQXJnLwEg@~*$3Nt8OMeoD z+VYn2`3xUxE>8p#$nVd!OK)xdhdRh@_B4vmx0yNPjB$)(p1G*5BHwK7Ps_FkE~-c)o_c@=IH_&54Npwj4fL0hh%i)O9-wkb9Go6UPg>nw zs*yVRZWv{T&8~zTV+W}`b@ivuKb3FHgvS2>HXQN~_kW-1UR3aNhL=64W)!L<>~p7I zy*I!t(k|38DU2ey_xHv+RI%J@Hw>%3>P^L@Q5?lL5!C0mTw~s}?(dt--vDUF&o70> zaoxD@pX*D%W!Zax%e(h(#ALQP$@+AxJ&cy@=y;etV;xGinl0q^4Ght$I}%IEbF^(a zQhJVf$gdaup+N9g#~&8n-iU6?{4|5BQDDWaAM`kzz6IGIly z%GX2Jz8-ur@MeYJZ8dyVsY7`@)=Qh#w)P!evLEuKSv|Po+g4(VHAQJbb;fI zys!%V=t#%csIQ*>Hc2Lh9 zX`i&wt;qB{-`nrS7CtWV-@|LzEalT}?4#76xq>TrZOp7pET?RLD{ui0c^Sug@SRu0 zx;2oIbh~--BVbZ_L+$?Q81LWMaa*4ezBTGU82k(2Enmb|cA{%v5#H%vx?Q;j)J^jN z+-(B`gVwldyjN>r@(FA$9SJ+h{D}4GT{L6M1rr*M@@<^Yg*6Cb)ve{#E#Z#OVa8F9)bnR13w6`)HE@K)oEFzqj z&#I5&7|tuM__Gu?vC8)`JHvAfcM)WgRU}>sBa!L&RmoWppF`1nCGl@TIu4Z5{4Ve% z^~8EAIn*^TIi(V^;fIt6Ru}`Eg5QA7{-^PR#^1qHw}Sp3d@NR5Yeu?{Qt;Q?kleHF zB<_@MP7cw=)6IGJ!kKLKdy9BA3p8lgPel1#0-JhZ9zR~fyDthYt@p#-NTr3jjy1GN zR1!?Y$UxocoSv1)prxt1s^UxGZ;U#Zjqjw=wciN*D6rGyfs`(Z;OKPsR?kr4MmZh* zGhC;{PYvnz8ugOdTgL#nN8G#jecXJ&`eOs%t#|(b2<`lzi4ocOa?ZvUxr$42XHvlv z1(=+6z&`b@@n^x`*c!H)FF&$pYndKlExaX4kbrmSIUPET)_%rUxuV3!vFD!#Y$N{w zhKKN6?Hq!2@imUe4V{N_<0H7nN8?|kdd`J;J^rN(sR9O__Xd|Z0Yw~O|9P`jb>9jZdPH!jN^7X;=bF4BWiPA zXXZR|*R`hnjv@~WUQX3m>*zaY__|`grpLi49R0+9XqA!X3K>!`tiz$t z<~d@K>sf|9BF@(0T|UBP^1u#a1R%#lfyXDQ`d7kn zWMu0?$Ld@KIQ?FyH*>eue`cG{4$l;RBlv;vVODuOmTO-YeX=`eJsLnE1gtMx?XtYnN=J?G2UZKBqY2>s>aK8u}SkV@4=L9E=rS zp#6K-NOk`Jhx!(gV16!mZr=7kv`%Ah?8z_QQV=##42r79yAV27^r~{j+~%uEPHM-J zF0&Q1+pbKp<;!M9dJ!r44e@P1pXsAMiCvC{Ow9lwdU zO#8E*_`wxFS#M~vmJaIt$B}7zj2hXIbSc*QNK?#xm@K2*1JD|&cdA->GhE%=St43C z%cJKh5k7h`&&qv|JlDN9?M>iM6-yK!3qBm(=tjcnZ*HFYJv$d@r0s+yy7CJVlE)iC z6+PGObsdL{Y&=AK6=d`2HWF#J_O|jtY=EAEfEt9+37Z%x*9Ddhp48y!00@=&Mv zw!)0Vk&NRN^abDi6tBh_mX&c~@c#fqhr_2z9kK$91J?qrJ zV87Up_M!OE@O~ePU$OY`)`{W265rlfN2oW8f3hxajkUu?A$XSE$U!2$(il`gs$)^^e$Bx5sn_9ui!MAR_IqCk z`2Ks3?H@Eiz82IPUA|U4&o9Z{w>)HwamO|K2jd@szqM@t03I~Igqp6a;Tzu?YkFMT z#2daRYL^zX!xO?E%%96pl5UzZst|%V4l!MH-|$Vp+TX=qCb_rq7l=Lz_QBrw(;e#-g~d-;Qh$0hc&sEHrBxr4+UA3Q;W^oSRi|otOn{I^ zqh%$WgVTvsPx$t#$HX>v_Rky7Yb2#ea3mRQjxxE(uhbulU+_$?k6r=ru9>L#^Tofj zwxK78{7I*HZp9$bZ#4_2p6+#t9JI3%7BI#`)a?z@v%hX{_$D{R57|TZRq=<9{Cn{m z;GVUmcy2wj>7F0(M7GygrMCi+Pb{pcP6^ICVuod9Br5g~j*m+4t61~sMO%C-W zyMEl8zrw9SrOO52duz9CfEGAAPCDoMeJeRr zx<>S|ElN$Jpz)S~-x0KL4(T2&hSK*)@U6YfI&2a~580ODQ7p_yLd?oJ?N$B}e!)%q zQv64?@OQzD2TqRaGA?y}S*-(E_(X;rs9NqeaLw~BKtx^*541x_-p zC#$x^pBO)AF9m!l_+2;b{{a601muM@p9fgGMdHsE**}+g;wiuhG;qv5W?}(Hm>vKT zrZ7tQg}s%&jU*PjbRsCN$CiNy*@b8y4pQLzl805Xbm2IspU}f_z zBmnJ18OC<0KS9lH-Cw27vK*#ST1eS48I-FKLB~=Gu=8Un?o(}N8l->&^EoGI$v7GH$n9Q7E!~;-a<63DCHQIo023S36R$pJ zn5uAb$;dw5m8q?3KWg!%#r^zGbsd8&7FOW@0Is-YJ5f7fMoI1YR!4!Z#g3IF!Ub6{ z%NqI;xXJ$j4{D3SkllEzQN4RfE+mghfTf&v@_B7{D-d0aF~Gp&w_(z+ms^qTw2XSQ z*l)DmB0UDuJxgD=wvbszB(bHl%<9E*RRHR9{34;(bSs|~_^!r(4#G7HTZ?$0wkV(k z3&Dxks-4`BeR|d#UipwhmgqNxzzQ>i+9oHE ze$lrU@<$1880o0Q0#^e{iMR*9&769ZUQ7P~2U_^r?^oCUA6iFuC)uOYRz{9F3`*?s z$)3G&#$9l747~94VKH!{G`no=y3{10y8O~NbZ5hXY zJ*&;Exk*mqiC*gCGrX?k@-u`7zaEuZ{{T;h?sMlu^RUKLZEik?{DD+Xqdc6-@-7I% zvt#AYAp4&5w->WQrRAIu+ru6Y7uyf-7?IbWa7P0N995{VZj`wDK@6ZUB0RVo zx{`hRU{$(e)Zf~wU zlZlZOoushf=fBsl<5dzJ_KhA-JA?KFb{Xx*H5a&#&Hn)SEY;N0e%My%vOL1m!Wwif zxa27^PDvy9PYd~1$Z#`9Fp@KtQ;>S(*VSL}S3N-{{knWl1Sca-(=@wR0Otfk&-|Pp z#=cQuiJQM#^_sPplKhX=@(aTSP5Pfid>Qd{y0?cK-r;xrgfg+}z{VUCJ`nGZ4(@C!O6v^vxb{Yq$_~RM&NPy;=dM<;fI;?DCcP$5uS(Iy`w<=zrHYd zZO~|*JJlkNFcl$qp_VjIFcd4saG-P**&2#5vp!0`0;Ouc(k%TwSyxR~mPnsqP{mos zas7F#aqn0QxlQ;P8Q_vL&$l)C>!E+aOg=HRi1X|EEc-ynmqUetAKk#m2D&>h_$lwk z1wbUf@Q_&uE4x4kXzT~?1!n6(X>+m}UMfqPFw^9H#Ssp#=7c1St1ATq9Gnj4wKrP2 z^ECJnZVxPg0gtAL7P4cFFHw6Cd~}-^A9Cwc_|9MhoRAeHHLH&ls3vuU_=Bf5A!q zBknt`yZ}!FCqk4F>C$ci>z`Wo{{Xje-eLZ(sGh(47l81b1^Ic;~45|n;VEFWlDmq~;ceWbFqtXV+pK2S64YwA4<#c=2!4*XZ5M+EZS zc#2yyZtExRqez={o3qb3$Gv`Z{1g4Jd{6K$%J$d6nrDaa()t*!Nxn%Oq*3PzHj&TF zPJf+tci-?+{{R@3+Wr;rIOHAMZVmwG2RwBA>s+%o!_c6q&FkoS8TSt3F<6;Yj4rNy zjvI23BkyDPOE!4*KAiNcRv5Lo63Q6)N#TzC_v+O0lBgv=3IN8a5 z?A+0O8)f2cFHzJrJqF)WYn@fawfgL7aLveF#{)SSKA>l%cOM3PIb)*!&{uZaKZmUJ zL2YCl#U0M(-oS$+zDO)oay>uAi>>Yev+p;=30^Wy8beugmf(g~1;v z_sw>n4?k`X4fucJ2B)of+rv8WI*e@`Yh^rA`2&m+tVUFI<0qwg)U!N1q@OYD*Wuh< zILUH7kF43ltBJ680)*}$;B%4nAJ&!dCYhzRKwSLCg<=LU3F=3B@$DD({rFF)+o-$L z_01LAE4J@PnnX}>l36!$dio0L^k3R%;cmY>C5Oa+3>hXn2il~2a?A$+d4PR0(!JPY zu+!S2`_Gw{S&5{tDs6m@(r>(222kOK)*-g~jMQ>`v670ri5s!Q1D{WCN;ExRP4NT} zN#X5lLewIeK_6z+A&}>x%I?m7wQlOg^w#rQ69Oj;=6FeUL=(j{ zfbjdJQ-Qk&IpmM1=i0Yh#Bry=*YL~`&MqHWH{$1wkwv!$1Fr1npK9c^Pa9~yCZ1R{ z4OZIf;?w46#&?__Om!IR?N_!LnoWaqF>K`V>QADd^WL4~J2Yo3Ba8QfGv>n@&VpRF z>=U5sZP=(&SplLq#(ZJ)NABXE!Qc}ne6!uVu2e%%b zsnmAV?ZZLqav5iE&F2i~mTlSFgTVg)3U!Ub;kOf#PTkG~Xxw%F@2+{Qx%^S3UwDb^ zZS^Y|H6zvlWrE?SnIiJ}C7lB(80RbBw@OlyacnH(G@0UERfTUjZUZ zPX_stJV(qWwz(1nOc z3bC@}Z#;3&{{X8sCzt~^)Gxeej-x$~q4)NsSXy}9p(={NXKLgVj^n83r7ViEmNO{Y z>x^fwW1M;#=<+g(EGx6yLLy9+1AssW)brEUzIXosf`VT(Iwq5B9n=_PVi*h(c>ceR zE9f}MG8L9d5Qf@7UU<&~wsBuCf5AevQzwY5B9WM^c42)o`?{0pF~B~xbFwrBYb5F z0r!X9$?8DMxCWgEVylng~wJMG40K9nq04`YSzyvEs0la5u6RP8&FO*Ln$YpCw`nR} zU1>6(u&)V)0cW^h;tSnF4t?v4@K41pPg&Gn^Tw|{x^6ZRLpb6;5&7=Z>F+ zdRb*@SLIOM5j!N?JxfvXot~vEQ9iEsck)OJL zScxLqcB6oEk&aXj2hy;on@{kM#2qe6ck(>OLTNlG9ev zW4P1iXB>kklyJoIK=c^Reg6Or!nAQNRUO&pRI~Iv_WIH(UUr$LD%oE#B&-kvS9^^YM(EHQ!DaqXIn63~soS0Lw}SJ08) z9VyJ)hSX9H?Zf3AIuV}#09s9>VFjU!EI)U%EJvvRwes^oI1L^hlqPh7>->LF{!F#Qr8lbh3Mv!X$6mZfeHpuZwgbWX;W5=kj z&-SC!7sNla{=B=C3q^|Tkq}}6uwR&U892r(&-?>_Y2j~-{s`3dtgXG?nW$QqR4&oT zBwQR0-F>;QO7V}3bWKa)CbOr-szc^aq})IuYjzUkecTLSH`L(pMSge1l&VtVIyGSz zYop+zpSvV{zu<^I+u^M~J4G$EO0$&O*#zzw9k}5BHPXyc_91UH$Vl2$?NQNyZs&pT zSicNzrHjDGa(5wN@)4Y?W90Qb=bn|*OK!61z$A<^#FlZi`?a1d9`_2*GlwXm{ zTjOL}q>;nnJD~0(0u#8R?kAo`JvhkxJ?i&>Up6t$Q77|bRZ)_=zl&k%+pTBr6Is2g z#18Vv6C?rv{vp@!_pJ{B!jd#G$g)Z2LR34FJnsO{qSk!)$qc z)e($tUAgPnXF06Q%Gwge7PY7Sl&pYC$i+})bDv&1edV$+3G`-G_kn1kg;Hac=!DW;Y~0+^W!WG zny#48F?>MZBc53H3-s!L3g^5Zc?$TZz(nPIyNJO;%o{l%jP^Y8d-Sfu<6J8ZhMP1+ zLq^XZnCA(%!ySI$>7fItkDl}>rc|);7bJ&rdx!~57&CC{1%J;JDgeXVIC19!NOt=qo8A5iRASwWZy-jy4Yru`;mgxF>FV9@+dW z%=Bq4BDjt0@{%%%B~n}FARm_*;{&m;R<=*JNtJOal^t=(7$ERK=kV*A@{2Di)lpeg z0`Z8!IZ`+)lgav?Yiu*M%<64pqwvI#YjWGgd2A)RjBJUWLBJrB$?BsW{{W?S4${D= zZq`saRc!4bEJG853h|Ce_Uq|S(k+dSyK6nX^Zl78Mt!;7 zfafiP)MJcso-3yJINpa%<3A3i{C{m(f?PR<-ZWC%P?pB$Y~ivGUbyDG_fOPrAis#r z(8_{WMka1f8w3D9ha(2PXT|8UczaNEW=M!h5rYg7xDZZz&0KPmI(gT`h;xKTq_{Vffs>>9Q)%Vy=7Zu#|fDn z?kY3WXdH3qd!KsNia}>+$M0VL$QpG-#e%E$SBrhe@%+f_GD_{k|KBVw? z^)*+!2q$AxOxN`rNaO=Y)L~zrC(K;P$Bn8-TDN!NyO#1x==zVE6AW5d@Pj`wBN;1? zLBX#8(DmJJ)=A@+Rn#`ZgJQ>e?7ZNDy!Z4Rj%x7nX1(O8ZCh9YGD9W71#{U?Q=H@8 zsw}%R-R`_ubsvP8?zHVrAh)=29Ez;#v*nX^cwBLwdsbAQEtPHK&Y!J-2q2<{a5`s( z?dmxrtz~>Czqr-@7-}i1YBOBR_Nbl*X}7W3tO~Ar_at$e^KTG%@5Ht`oz!-E=AjzH zK2@WT1B`KujtADYdkFQ-SH{rIVhzQXp&BVUCfpVo9*Rae8K|v1VP%l-_VfVd2iY<( z2f6mI9E;-TiX%xxdfn=i%Cnf=v)FRJ=kcj*el2*RcD%Z@r*kVD+o3K2;2u3aG4-q@ zJNG?%Tk$oE#T1c?=wb-ib+z2i58hsS9G<;#nyY2v%`_w2Trfvw+a&K}BS_nNVE`cY z&QBawT^q!jw!QGRbs26v>*(a21inhE1P6>E1J0Q)A=+;w4*k(%fFHZV+{S0TcpJshXdfH2o1Gb8xVf6*Yi}*`T4Z?JaU>66*ZZ~ZQ2bMh z{^6q4Ev^wJY&5D;Sf2-g3v>9MoL7U%II;M_;aM$2DsHtzZ}&XgXC;Gn$T;UCn)E3q zicOM8Wqw9m>wF(cRlqjh%>1j1@e-qrg0_twqvO3nt#pWCwh$`LT^KWM z%3~yf>*_xm%@{$MlbLsilMe!aNdn;M)m0T;MZDEyWW$0vHoM7?P zj8`{rA~Udo<;Xb$g(p3~`op#>?6T;uXU)|3eBx5})=x_opuAyp3vDdN3<~4EPSQO) znnN^a^-{b5M^ZbS)Nus4mCjYwTXF%%*VunwYL+{{v|TUSn<0)>oCf0@epTom zLTx+T=sXX8b$fgLBUX1}*bBL{kl5;R(00$#v2A2k0x9G&rM!|R?g9`S7|HwC1FzP! zz8yr#;t7O1h>jAn7I0XSdj9~rF~L2}SJWhp_50Iis;VxGYR}6P+!Z|!2kTyaG^1K^ zN2^x#XhLss(FT$OqS{3$&R-G>y#?o2A}cXyMKu9dn+*deuq9jIoxS=0HIte1qxfocHTf+N18oixzr@ zQg8?!qM0!s@(C>B4B?tE%G-tk=yQ-hnD@mvTL+K;V<2+9K-@=CJ!xc>jkrmSawg0I zRDxTpXSW^2AY(ei^EMqp%xlXGai4S3*0^f5W{&zd=8I;1%Ar6+tg>f&FC-D)C%#V< zzC!@};{D#>NFa~EV~URYo@9tJx`*HL5;p)x<~{vu z%ASb!=<3V1h+~Ynk{0Bu^&}pI55phMyl>Bt$a!BJRt}b;rvi5L{!P zHV=CCShV#4_d7bj-VqKIV~%>~rhN^0U&jY!{h{=kt>=YhZwTGxoetl-C(KTJbmOjT z<@lvv1txuW3Counwdi^WguHvB{{X@>qgm=U*S~18)1!`gV~hycsQHSLdK3KX#=mOa zM#9@b@wTASn4;HUhwM?X{p5@=r{(Xv13fqu!HG3Hy*kr)wvyeV4wAN>%!!1~bJGH! z@wU$9*Wk^dzcEPW=^Th-Sin#VE(c5j&*Q~@K;_JuKU{=dUp3AH!Iq~}_#>t~PZ>=Y z#kZF-phEcuz;y$VaQ*nf_pB{f#y{FoNV+YypKS^GiHg)KbnDJ>j(UDI*nA5$wrzHj(vi&7ad1!FW$l)TQwC+FMOD3Fa1I96_?%a6x=@BadNI70~H* zF3x@z2FCfM^3_r!mjv*AYutV_S)+Utv7If_-sNJqTZTj{<`B39H%^4{)2(=orUsLC zV}QQcn6B38#~H7ozA9Wd{3tmRErunrwN(eG;d*DkUOi1sNphrJEn7M7+4}O%8~f-r zYYSVc29Fc0+m7fIsTe?b+(vrz?0{f5O?aFC-}}w?(4Z;g}7l<@E1Ue$#W=*bNSAWVsWy z)XG~c<-f_m3ONJ-2+sspi1>HncBfKett7jX9I)y~ryZ#&qz)~+k^Cxx(EL;Iz0LYW^A8bNDok6DeB|dH zi97-CU!*#P!IM~)XH<f2tsfC1gR z<>w%AgHF1cNZ78MnTg3!l|3+UKRTjsgi{4_zklUBc?0_AwOG8=?ey`!=1~YZU!3jS ze^O7=BEFi(!bS8b>QXvc%%~ZOY?f?oKr!=wJORyS>KcdGttEKXWD1Xh0r?I(jC*#c z>RRQ_p&}-o9Ktd&=gdIhXCNr|+mC9%me)|0!tt(k2vu8y3{mlpI0xUHj`Y&DrriyV zIIMallFZ-1xRJnYpYzR69^bSphayyv5>Ls2=m&4-n$MCQM&39Y((2Yl@|10oJm(w$ zJqz1-Avjq}Iw5p!xKjd-6J;c?_e~UJD_kRgIcjrjb%-TK5G;&9gAYwld za5~qRT;CNn7D{Z6NaY@8tc)3!G$RoO@T-{{R!UXm36l_{ppTUhmSJiDAi) zh6i&W;@}hf>*GHdYu6qX@tVu0T|*`hC6Tk$Wwb^y5*si_Q@|eqfa`l7YIZ z1QYbdaJov*tm>v6J_B&qrQ^W)gPvO|PfQ-3)zbI}QoGZv?xDN1m8R6JjAlnaGWOlK z{nOLF1$?WFUgzD$PCFfc!h3b`2Zq}E;Q@H=e7&h5$Q)sCdtmkNpK4Ew{u7$=Ei_t0 ze6sTZS+?UPK~)_I6nqVm4HrPVgI8urrJoVFLAij(E$9b7on82`t6IedmXlpT=5IKn z`Pdv4$@VxS^R8B`nY3lBPbt-OhSMYR?^ibjvy-3TA1@=IIsH0UJFD2o4ybG|)<|w` zc#%onh3n8B3D4zQzBBO{)2E7SDXmyXYb0!p-eQtm6eH6ZKIhuG31Gg|FDJOYRg!tw z7o0fEq%KE%@y}nvl{EG{X{fhmbl(YfzQ3u&k}P0b4V@Qw&rj02Jyy@{W@S^b2>1-S z1+Y%+4&TnXPlh&cb>eAl?4gc4!O!nO2M0L>^uhe|TX*&vgcoks(v*Q00a=28F@`6< z^cCq*ig7&5b5N_H%xPEB&EhyH40v1N+?KkRg@3fCj>_Uk)GqHOyI(z<69DLh0HbdHNys(%84}9+^zCPLZX3+V zk!A>Rays`UcJEydgYd#c)MsxM=#k#r>?v+!wpoTl4C6m^@$H)Hr$1u(k>*#Y97J6? zY<}t|jQl6#pZF|plX>8u8u(9JvV+1qEKQE0leVFAB=-1?2<4^3PT2nFCccvw6Ca2^ zDSO#K5hbqXBMLDSADg~;$6n&U4u9a8EvI}T{{VuGd==I_S)yv14uPO}l-}w$k$8IT zVbkr}(&hmyo>V6giKmHLU%0!n#06qMM!r4%+Ws)oe`qfi>VLAQ#2*KEgTWe%w&vP+ zw3XGMxsV}ORc|!{?b=t8ah&^Cr-8;sj9Zc9V{-XblH@&~b{?(tdr-a&86G`G- zcg8nXhC&U^wT6{63c!v=*{>jM9yrfx;J@Iw7d}_~67R>R=0q^fd20(5IZ&;;ar}Aw zE6A>YY!8cf-xjnF9^K2~8GKRUeH!CL)8=gqq)^+==+Yriv>dtE2H-#=IjnEmJNAL` z_w9H4KI*>>KWI4g3A{I~PZZL&jiF6rcMC*Ae6QxX!Q^L-O%?Hqr76R!X4q^L;aU=V zMIVxSW~XoV_`;ll^2Swj#yD^~_QpNy(LNPi8~*?UY7k$So_iTE{hl;`m~`!*PL=Nd zHva&Ee|RUt{tMPMjRH>=OQ>lU7Z-NEY|?o~MP14q5ElogPp7?n)9_zbI(Ll|?eexS zVF@cbm1N^NAaDkMrF>pytz-9Z4&|*+Qp7Q)m2y9_Sb1*6U0;<4``PS04Q*MMKc|ZKN_sBA0A7>>omV@y;v8 zdZYDPQsiUq@VQOFIXoTR2?N+w`)L_wX#}bX!-iEHeh2H5RBVZs`f17#Bmo03 z!6T<{&|)jDWfhs(%`b`^g(~+7g@C_wR>4@KSG!p9#NbTOWox4~G5?Yn}nI zw36Cu9ecwv%yngAceV2@!EPCWA((-XYZG4o0D^*jmeNSIKiM<(G?Lq3072k}g|Mfn zY@XF`_KNUtf<7I5AovGq@cY7=lK9)le-3od8u*W1eRgTBru$3Civ(J85|NfLu`&&# zjt3_kzl(kl_$m+hC;ZZT*RYwQFD1cU8gJa|&dOD!e{bqQj7h@)X7gkVV7<-NC)pTyT& z{{RHn_)*~xkAD}nKL-3;@a^s8)&7U5>oywIhPge2+FMxL`L7v;2Frwet^=M3VaPmr z$Aq=k)_fZ}Um%dG=Kw;9XJ^Dr+8{(Ca1u5GEAVb;jnSY^!`;wY2V4t z5UMEvlhosoN8$QZIwrd&nihL-#G`rWGr5TaAwcxbFmc*n8q#_3!V0w0+{joQBJ^IvJb$09cYgx(QLX$` z@P3~xWQ)%dX%GOXC3k8T>QsN*{)nZ=kN2@0W!AcZ?X81Kdgee03&taDv> zyTQ?2vqom|1YH?reUHv2+^RR{`kx&C0Kr6WB%AiR)&%<) z+IW9XOaZl6m67=M#_pBnniK{-DcR#d&y{ZxZ37xnf(UTV^n;K5`YYf}^<4;e++4q`XMk<(&g6u0}_E zaJco)0;`##NTloy{CK1?S!Njd_I$$xjzH(Q?Vg`nb+QRIMKmW2;4+5Ba(WOy$*K&J+(-ls zGR4)ATcHDm&V6zERjn#HWYsLe;y4%&B3aw3aC#5B-?8=x&5;frV#@v1t<~|_1ZDIwMMGGuomN?*#YW1Yu)%=gwvUvXhu~U9T-w*YfbiWb8 z_T=u)K+Zm+^6y^t;;7qP@T7OJMjXo+^Dub!BOU($!oF>?m7u$g*Ry?V=x>G^-}aA# zyqJbhAcOa_jP2*?#d6|fs*(2D6;)}{Z1D|kMYa5aM%||eHK*Y(6G>!(B-#^pS(~O0 zuj7h?;!T;f*Cim9Nt=3{a7VRfcz)?&xldY z4dt%#FrZ^C_r0rPTfkm5MUnP4PT`PG)Ymzq{_L*eRA+WEjD9uJTF#DuwiuAW0oA|H zYUY;rJ^VYg6J~CsAze;Gx8{6gk%B$_zO@QYR^iWf zclvYBt!F%2lPx16sN*1Y^!iq-V~(f0RNpsy4rAM~xhJarKKQ49Xeu~lLd1;iAHmNR zQYQ0)OD0He26!j`0I%MgDMfsMcdy+6cs>6Bm2=74L)lL06F#jZaj|jpslvE8ABVT4 zGEG&<5=^Ri+nu9sa(_Smy+YDPoUS)EK<+^H9<^FfM>2rGi~tWf#~nB|HwKHgdW1Ie zrUZj#30(8|`-+a{?Jq7JRZhY=AahL8#9nqxO8j7C@t?16#+=Bo%OQd#%XMCZJ;2RZ zJ6jn#eA||7uGA}UQ@mgkfxsrTHzT6FXcY&{N&CR`&*y>o)&BAnQ0^v6@m#BL0^(ErSsP$4uiFR ziF^V{wC{tOjQ1~nb#D{L79?{f)kr}*7?X?xkbCoyn*8u-O2|+kVIc3d#KBA7VDM{;$#`y8*{Xt`55%}uTa?XJYgW2x4-WGOo=c#$Q*;v4A;UsN9}bt zhpqQ$$*EYeU6OsC;4b11e^K=ODn$LawZvy}d#?sAq=vZ$HuX3hiuUlC{VFM`-1(e; z4OgutC?&D?YDDlxNw+(TDcn%!smRZ-Y|^_tXc$E%0}_#RXKZ5`Zk@Wi+;(u+L3S zNN~<8vOTxq=h=Kg@w-&}UzWF!+&7gQf;TdJt(NrxNXLBFso!6%rIpO_a=u9=8H)AD z`~U~9(!L?N{j6isZw{xUL#kTemIba9q>iqCh#&6{^P1`8{{VuIPcMZoEI-mN?x#r$ zO+A{2B#d&v^&LkT&S=7C6qF>S&p$HCF%hnuW3`Vv)Abec7sgp+XY$(jRh-6T`N>`F zl21}_yn5p`^pxKZWVL~k&Uyx#*O7*=PA*PQbKb_`>rFy1 zS|oi>@b|;B_*22_ZFO^Q$H`Y&BL$H{sV%e~xI7Yh9Xbl-Vfe#urlYTkwHcA8kpvOo z0;!I`azQ!guNkkD?7wYYOT!mB%4k;x8x3ek04qV%zVBlcWo?kT%j`xZ#!o!wzH5{5 zZ|w}eG1U#-`IT6(5w0?@Du4p7`&=Gt(EiwsIHd!|SuJ_Vxufo@Uy1hG_3*Rs{pH=x zq6vR5$Ze{p2h4noU;uHSdhU`9yVl%9#2n*2ax=gmTKMDkYyGsmE#NN`>e`pZi~U_+ z`!OJ~hSuNBdF2G~?7cY0Cxgyw)_xLx+};QA+_KyFw^Xq3lA!|9OWnXt!O3|#DD(!s z3@&9#s`uq)an{T0QjwIa8rxq+M%<3f-MBfghyMU=oqzjF;>N4? zIZ{?LvY8cwgN}d^^*@eln>wtgK}9pt$Y{&!3AM4~_fx5M-c^%;dFKG+5!?JLE?dts z=@hv;pB*>@(>|Qkw`>qI9mUTWZbJ9#>s2k3eX9T#C%>mk`3|Ss%63PicqK7rn;q0Q z0AnCFagqA*?_GwM7(1EC0xqNYbM*J?T4XX=K zaHA(5$B~?a>U(}Qp~Upq#qpM?@>x6~!!a27pP2dd9Zg*LLE+cbz9#r`+U5kgg6C6$ zKe97(c0-0SpG9B@C$2MD8k&tlU?Pt`V+?2Rp7|K>>0NK^{{U|KN5_v0wan;N-tlBn zoCw${IZ}N&Cq0F8VwI@LuE!2(FZNoG$o(vT4#TX#bvZQs2SWQ~>=YSZ;&p&70xmIx zIKWfdxu1z%B){+ulcs1N4k3{*@7018TonY?Zz-GqWzyfHR(P%@c#ga zE%iMX=IY->f3$yXTuQ5I%yYIVn}SH{a4~`_qR_tEVW{5U=#h(% zCj->i`qw-1B`W;}x{J3|3kd@r%UKAG3KS*K3e)(-V!VpzulLlg4Y( zJOkkW00+&X-p6m^$8Qk92%h?RB+O8Per=KC<{Pp-`&Ty7XjWRzwH5x6rr&BZukJ4G zV+k5a1~!p_mKucpiJbv>f` zv~EpVB_DX}EEh?+@w6~mTr{>Z*|LczPbp_C`QAX}4nG>*@m=&$Xo~A32p0^cFo>t1 z`~7r89vq5YZvh7R-f_lXB$379}+Wgasu_- zduG2=%3&o+^Npl=@0YpHY0vg(Qb{I7C*~Vu`B&aMBRG00`XNb|<0EI{MNTY)6+>C601VSKA)H&YdKSEZcFo z>?En`$By0pwArprA0 z+=%126J_I93|NzuY=g(kfq*NrNnYZ@TnL>(48#I<YEJ-%xVyItatmTXys1#kGmXUYoMdO-p|y$w8^BT~GTU5zo>(Pfh-0~l)tr_aw||dZeihasXqHy}(>Kh8R1jDb$@&gY z0-Sc~pPSpi9cpw!IR5~TwuaKnPP(&I z+4i#tWyVTu&gRdl#|OBtIYj?6~2{2hL;C6SIO}lHd?qV^wC5Pcw{3;saYeX(# zd98s}k{>i~WCskVr#b17ii=qA;nOc0_Z8ox~GpXYz%mANGzu{So;9HSw=Og69DIoLC zM^DSGSg@Jx?xQz}7nZ85cQ7iXAG`oNfyNIVeJi0OnVyLu^Yp9hTQrV6@Q=Qvfwhm` zU&p6T1zNP0Si&R-tvYAsR@<<42X|9|PaWxkRgtEV#sq`z=hS`Tdk=bbygqP5W0yOA z_qpkj+dut!)jJ%gC-EOr`xl7Jk=yM_AdSoI2h0Z{vJWfBABA#*R2p6UYaCFRB?l<1 zNe4W1>B;HZx4taeNIXjcMk=Pwyue5+xmy@NpCjpt;-36SBoQW9kf5j=k9_B^Yy;k< zy-m_OOU+cSn?IPal>nnL0rs~Xka%u*IP^8;6U^2hw6>)4n{<^VgfZv{c!qoNox`V5 zk=nfi-cLTxA%;kq9nZ)KQ`~>`{Ryu*@s;Yu@$g9?jxUndbQn?Pf~7`(ym%aXS1own z$EAa6JjnF5xLq>bGpn>dTCq>!+&XYSm2~S4V-4ZvRbrtI3j>UCz~iar zJ?k{CZx?2dnEn|?f3+r#CsF3dhf|G!XCvHKf2ZlrtjoF~fs(ll0LE}Xop3q?5RV;9 zAV|Joz^~m=o=!g;ewEhRNF%&yFvPdY2|qIDpXrR(B}q8S*FD-%jG~)IuKXrcJ_7L+ zY>pAbk{ z5j@=OW1KhB@cgQKO;krbLfu(pTorT3X7oA!b(1&l8H`M)a^xQ~IQsh2G`o$rKQl-I zt)ei}F0{uJHBrHE^nS3;YZQ?^~N~%uQu^!fLmVF{P{K)x$_*M$^S6oE2Qx93AFo>Az$9B5%Ue*ISr1Z70md39W9t|btrb0 zQ;-jA3f%B}$!{Zq@w2ETq4b^o`L^*7gmnPnDzxY1dN+bKD7;VMr_(hC5lL*V zo;U3r?RD;ONcZNs+p9~B3TC#};8^Dbe5FW@xXwp*QSHuZhL3x7rCubE%QDRpt~Lye z;0>eG-n(r##yWqA;x^tYguyd57)m!p2_N#!zk|8@*V(Ag2Pey{S@Cb#fZg1uiFa)&Iw)ZEnRUGFhjB}c)SbQze#3YTB^A7SdwT zY;JEarHy63+8LQJVqVC^a9EL^II4am@Wl24S>uInVU|xd*+|_Vr~rN>pF!_gUL^4c z_U+k8SM0V?02n-(V%h3XKrzi;@Xv}*hgv8nW|qlR{Jl&da0+9NdX?wvSgLiP{kMLH zM5<7osCMdBl1T2^e#pUui?kf$0Q1P~eFYIDQbxob#zV+Ooy*Ss}veQq!O zH7H?ln~KL73qCrsf&4?9*D(~)G)*j%BvLmki3UzMI6b>?d9I3bRhFBawPNTyHFeyv z{fiRbW>iE96_gY5x6Qyg>N0bVwS{*Wmhxo61xX1QC!C(E$3ywnyXk5qUH7*!1BPI- ztL{C?-Ozn8*0Hsy;2tM z-!{V(W=KoOH=i(&NbQ684AbGcmD_ncQ~=84+M;z&D`S$7(h_1AkWIf zza2Br6?ao(bu`a5Ww)4}p~e6?=YjrkYdAS^8eKff?&{^0u%wLj_8bcHD=S9lsfM>X zqi1kd)qLQMx0dKFCNwM{7ZRYW_^DR z`?$#Z6@DIELVg!$Ej8V=Kk+WY$a3*Js5u$#3CPc-aX%kyL;NEKZz)Po6rNCwpO^x6 zs}6&y$5UT4Xg{=vi*!E$>DD@Z)N2K;tYt>Pa;liwfz%w5K*u%oKgMl#dAP|bHSHa~g@Uz96N=j|D7j|R8jeg8H#yS)IYliS8 zlmdXVaz`CH4r|^%BeFLMR(o@@ob(T@b8G4 zd2gmjZ6k1Q%Sf`m@xqqt#~^!VxzjFMi*IOW@u^0_lK7DAB)P|+`~c56tKKQpr|`@$ zT{Wqd=A6R7<&`p=6Zvundd#)e;?uQ3cY60BV=Bj$5-&X9_dcHHt?Irsi^Vs0E8(9y zI8s9*32=DmNdu3|p*4y$=vw%9;Tx;}0E!+Ey}F&_7G5CJCg+vg_L$E;xyAtN&o%me zuj+qp)NWliM?akE!)ZGhjDgNNbj5yQd^eine~LaBFSPO{Ip|TTAnk&5~1C6SY z`EGHv0y~rIRP14Wa@b(WZ)CX39Ogy?oDWas^{Hoswx@AovnaN>m0JqLG8XErKMub2 zepuCG*&08}3`mjiSH1x0z#Ti&h#X(Vtu9MHgMK@gLWm@CXtONPs|ER(V7mVRd+&Di zuYr77aJG8A)wSOEc_V;+_I8}S|Dv-m0FD}d)@8e>eZqbDJO$Q{l= z?i7E_yXy4&0@{q z%KreQuyFqXF7i~3qtla-^sTKe*H*r2#?wgHbCd%ZQab~l-h!~SmQ5GpSN60E zER6wZRK^0~4+Ic;lk%TlDLy-VPiVY9r+t>r;x@XHSlUrCk{Lkxj~$rfk=~k4N!U(m zEhcjJ{{RVWwRqx|-t5>-J2MmIZ$%kB2dEr-;<>F`!f<$J?Uu4gw-2x=o69km1pVR< zPinsp#(RihNX?j%D3fD0?5iKIr}C`p{{R*r6D`%ut9i6we1I|S#(R-VmTRHWPNg>_ zYVF0Ve6*4}W2IAb#wKQScbK>Bq(>vHo#yuH)!lIA!iX#Q4qJQnN5I-K+! z>x}q2@o;GR?xAOEV<8U`2Mpm@fX9rFYV7r&9<|No%(Cgt63RqEBw$cuI4$efpI&RS zhcs5FHZzuUyk3WnT=-_@9}z&})*`ENoDvuhoFB+?e*s@WiAeIECj)8uN|FE|@ZR5A z@jH(eY4YmP+skir8%1~Wd2BW|TzsT<9{z&8q5&Kli{!$q=6OZ)h?E=x#GZk2Nj-o$ z=~}rqxlUeQSE&}A`&oQi@Xv_fR`AEgUmj_it+k72(A`_=BYbuni598~74oukf;VJm zaj&O;W?dQ&7JkKgMW(MG+N9L=tGnBo0mIJ5;hskYV2jW zvhfzBX)A8omWt*?V~)cywmQ>`v$GVIio`w`_+#PE82n}NH-fayKFdeA@P?IZt6u6? zw`{N&u3uzgG(cIH5KClquB-N~{gkY~V^4y&em?ktdtt9=HurYce`oOip>l5KGdiqp zzH0%uEEx098tMN4VKDOl0KroJD;roZWt098%_T zwfk=p{{X=)yiKimHtro)OkWmhx_G{~UGdx9$A27C+quW?(ZMx_0s zk3->ofA*gEapGSH>so$`rhG-QxV*A!SR|fuVO`D3KkrE6-z4_05xujx@b|=9dwba< zn&Kd!&Zh||+w!;52LyW68%ArZIX1Zo8f32|DE|N+e=5}Yu^q&=S`GC3cm0+%$ZQe; z`5A%d*FKftW4-o|)_5X*%AA_+be<^C^<7@;e~2{&OIXxN6krmF4hAvl#|>5DhBUWZ zdsTTQgqCJ3H<8W`Kb2jd$2OzEup8@Snt5XktgV1p9zn-$ynEJHgzo;$zDu$rn)HpT z-4$`bB=ef`n&m%Ni&YJKH*38)B}7JvGP`ripF{PiH3GJlSMu(Wf3_BUk?}8D_<`Y1hI$T#eS6`{oklxbNaBH=A^!kGaIDB>kdcCZdZXeGjUVt&zY}~M z)BYY`YkwTHzY1x-AfLq6@c#g3>W^@@(!=DlnVL3c9$(4^dS<>v(X^|7DcEe0n;j(Z@^dxcD@~>hUw03bnHml*qX)DJN(!K3%o$sc)A8CHb zTCeP*;7w!4y0`3?@dLzq&yL%{I_-v$r+BSpvXJ?frJwAm@hO^Ou_)!Rp;(Uf@VA8J zTW<{Mh~sQ#&JwGg%%39jpMEPVz}ggF@Q`g+mMkycS1Gg}J92Z=9qY649*UL`pjA}} zRU9DauLB;vap_#x%uF#6jAE>Nd^f}O@>;cP)~U|rWp}=XH_IbQ7!mBiZh7aS{{RtK zb|dZHB2fn7s^H|DFV`J^9{H_1i+JrCSmX|j!yyaqD~@sW=dDuF40b~9=3o_*032iH zJ+tZUUVkmmuyuAF6~Fu?e-do$?bmnA2}UPq!R&p2CcBIMbM2lYzJ}d{!DpD_f-{!? z0BT>?0QSvt-wR_JEw;7dIf+Rvl%z}!7?$~X2ci0Q%}wzB+SrefV z?e#RfyN=H5;gC{~lgsLSl1$Qi^S^E&mT_M80K`LS;dvR*Sk z%Z1Bi`}h9<3iaRFBS)5h+DqYjOCDpo@yCauJdwB^R@VcLo%(ZLbK!k1EkX;K_N0uC z0;cRRz|M2uzZLGku{Mcy;_us6;69gUEK$XC@e@Olfa91h1pE)AJ9F<^Q>o1~k-;^~ z7SHOt#vl!H?npt8Y~&7ch75Cq>PBmp@c<9wzXHd*<+jzXXC*U`i)AneCy|ZdeNA+} zExc9LrhBwaf^#8KxMcOo{Jra&)q`C8TkxH}!X6gXCm=2he&rYP%$)ue_fPmKc^{l_ zQTemrf7@GEiT?m>FNyyEXl99)?$RJsIwdB5c?N9Ms##hT-X$B5AWo@8RbK9ZgwR8GLoooL92+T`7eqWe4D8wntWRM3V z>E6FJ#nej?Bk3GlIqwnaRwq-PuO^x#AbF?F1Pm|d@9S9sG@mWgNH>y7akpxng|qL- z6|sGyX^DR8_Y4O$UQJ~*B+HLml271j6_wkHyn^Lj=sO8Yu+qQ6Jn9McI5_Gb>yF1bQP0! zv9zqf3?ID53a`M&<@(a6E@3|7W4RXbpDSXAI3SLFdC#>ZF>wx9qcQuy@Hyw{#Wq-? z`B_VYw+adVB6@%I>1`qNk^)L~#&=*2y{fElPO6UT;qRc6kH(D#NG4}0Qa#yC+>`6mzx1vK%}g=^I+Kk0SGxR8&|33BQzXrR z3l$gyan$+`>0T>yVdYJ<5&#`dbJMAHW7)*veVtBYz3`RNPo|$Q8AZaOINip2`F#fRDf6<!02l-cVZb2Ju!jDsl{mPP|A`=wncLP0CcGDo}=*ms)61KE*Nvz;2*}dTBDB; z?NOT+#iWWRm5$;8-Hd_9dK&A@S7l+Az~mk~a%sAD*x`xL9fV_s;8Ug`Oi++WBmfTs z*q-^WSt~bV*rwMi{<{!MA@i7I1>5(B8RL$Br7p;w{P99|Ig`@$Xk6vJ9d^WnMn_ z0dw4novqeT9%XV+a-?&d8~{F*Ij~sJE4CD_;eo+E{-jh%+~`rUQEkfwBaf8fnEl-P zC10RwL&DBL(FJwN?*3)~|@+ilSstAMA|l0p7-mtt3iyp`HQ;BET! zW8R>eDN-_LDy2^2hUv#2g;Y#uWIIrn1dAm$It&5)N=K+IoAD{&}b_ zE!I_Md5{$y2k`)Vd(?3(YbhfP3HeTV9;UQP=PP6NjiT4(`Ht<)^gRF{*0I`Be}jY6 zuj7;KdsV$oR0*;j*z5bwa(ezAm7gr{EP$)CZeAB1J!__($A^#Bsx{i;G)0U;K-<~5 z_5T1Sn2f5dcWho8YIBcHYOCBIv&KPSHj(NZ>)+a>M%in*La5Kpx2P1JjNT92LQQ^R z1w5=^;|<9m4m14fxSP#5=O+Z<_3u& zkwE*z$&7kuoSO9?*$&f8m-djge-&TGZ0+pioJ%C7BZfhZyU6wVhJ8Twu54tlLVkyr zp21SURhNp^U)$M`m?pLJV}mCHYY&nztB#=hS54tR7Z|iSQ^Xf` zR}jJ)Ia=OLu_U2C)u7<9Je>4AV!Vq>msaq6I%VF4cc~u=YnJVDBbs~|%l`ljfC5-_ zUT|dGv8s2J`*DtARQQ2EqDPe3B zr^u=^xlj7WVhG)y*cI|c-^SfvQHBj?Sh?DUH5Te4Fm7yt@}cT+)Ets=>0Y1kpT=6B zjCIS;?L9vF8>^UtBrL!@$jipn{srNVUjQC^*VyE>9ulWA*o;=TN347*)O=0x2VU2F zN2FTVTUlxst8WOqB>52z3$OcF=RWxDTl$rZH(ocECpXhD&N7a zQS~1O!1gxL!*3nKMG_fHhhIg0Hyq?-@HwXHwpSWfq|#hVY{u!fkj<7c{{R=u+=Gmd zU~BY@A0%Lzog6bB@@ozZZC4{u8ZuTuR4+j^eUcOn{fx~K2_#7^6!U;q zs0W}VbB|F)K#$J9jh3fV_ywq$7{?{Pv0*aCNyb>Rl0fI6;~g`TUp_<(PENwXdO?iS1+}9n1auSBh!P)9<}Fw2k<|K=X*PU6zM*9n{(w& zvDowzymz~k_*P19~x z-H~LC{J99m0Sh4q1xV@mp17>*Zv$EQE5_Qzo`8)MZm8%)oA!WCet)N0*1NY;0tsYx zL5-)WAa?_{Gx+Aa@Ve7S9x}>p8oD58bv?dX0IEQ9lP}AX0Ua^VUwX>$b;H|umg$e~ zVus;&23^2{Kp^@abH^2-p{tvQNu+%2DvYa*+;QKN?Nxj;A&*|Xd0!bZykIWZL(bsR zdh|H_Yozn#CeJ~)+M(J{B1sUKw-m#WPb78#)lFXN-osh5bG{hlvv}CK+yjXLzyqN@ zv)2Z+WRga?XydtmFpcCk3gmKgj-5MI9bq@$>2k{+L}@rJxNRV?BMaQ{aDT?LWV9Cu zkXW*>%pF*6DS!d~wb|&yHcdwn|M zy59}l{inm$(#EntTG0taJV-ekw&Q?EAP&@`t|A{4>Hh%Qo*VLJ!n02dYC_?`55UJk z!RmgMfvkKwj@HKIr@XjfX%vzmk$&TZAx=6Drn=2!rIwK-^T<*-ZefwjAD13tK0S0X<`d@1i6rs>P`t9 zXD1!`70-CeFSB^o`)p|*XD%6}$&ttd1a!s^U!{6Boj8W>Uo0v^=9NxCAawjdt^?vq z#}|%u5x^s13ZpB%lOz@C&;y#%lYG}?)QaWM#bgl5zIV(}U|^HGo|*dp04k2xFp$tB zaY+mA54R*9qmS=%PA%ozZAL1fkDEDV@6*4%Re8!r?zE;qD0@kRI6UWgATr~p zPs+UX1p8L$$i{Z=-GP(HVtWNA^{)Q_;@e9UdSl$GK*C9(FDE+&+_LAO=WTh^voDg~ zW5MP>8xZdepSy$Wk@{3L?_;7GtCCyF>8CuiMmI*~*hY62IKVvM0n>`}ABk-C-y5{n zx{ln;wy-ua!l`eV=ljEO9D0iMmbZ>;MUNnWyNa_Mo`1XExW9^ebOXiuB;Is$NU-JE zn+%{h+qiyWva7M*gZS=t_xINpx{bhK3KA3?=Oh0B*IK$v^H>SmFaeMhD!Ax6jP>M> zqtdWiadoUu<&wuCQvhWM$KD-=D{{uvNF)(DFlQTh!Xd{X_g;I}k7RQtc6g`lLdRF} zbhBNoJXpmRJfcFC-H)Nm6P}nprn5d0%56L}_;n8~f?cZ+bXLX*1b5Cq3g~}n9WFDg zqs2ZVFf?q(Exm~xsT?rC$p;;)3*k1|G)dS@$M=dQb*O`rOie+ zJu~5?s+tw#Dgu?e0R% z35}Sl$QY1*VaeKXaZXJXCZTZ*jkGMx8Ospd9;5Qd;wuSJ_KxSFPZ!G@SoDwC?PXj2 zdNU+r7JJJ|x!l2q(nfjyA&&Lr-xcE7;_Kvv)G(Cb75Pr!4p$#v!=-zFz~2u=Wvwxl z95vRJIXfMRJ4WD1J@TXTHRC@MtY=MJ%cVLLlqAU*VS|x^;c>^OQaG-ZjyV};I17W+Uo0DMO_pmn~!>6@rt*riI64-7!;h2-^J$>pJ ztfomqsSE>^EC@cmKfD$we)yH_|GjHQ9S~XpY zWiH<~;~+fmC)b{p)O;hqk3{g!wf3^a$dNEWMpzag;B+IApG;Rh@lhvF8EQ8ckO^Uu z7^R8x^MF)xdojo$A8dB0j^Ze2QmpXHzvWOyLbe8bpU2<1u9w0wi=9Bp`_wKAV0hPUGxF|cf?HVRjniQZBWyU%bDl@P9Ot!7BLh6G0_~81 zrK4OlWDq}5=}|G3BMQ9oW-Om5VMu<5o~Hxp)~y#d(JNX>DuQ zoMcwdh&3$(OuX{-i+gpsyHhK(+iz{BjqGuR1cQ=#;<&kQh@L5}<9ON@+*O|-jt^eh zAC-1GhLxsx_DF8c%OGgpH%R5fG;BGHf^xqw&wBB(w7r#1Xx%1#247uOq~R@EIiD2x zVl5X?hVw}_%LUpJ<|Fd%UQ~j5sb1ZyAP^_r5-%9q%%QetxFm61C&aj3I5h7r*octt zGpw6}ow!u(!5GJG4RW&&KHNFmfSdkD`Nus+s2y=$mR&bemHM0+ls%PRSc;cG%W=9` z1gN}4FV0_{a0gNRs{OGm1X0gzZqbAzD5L;*KD=}Ms+F3DMFE}Nfnk%DByr{)#M7T)2$Uzuv z<&HQYXX%exZR{cK$DbbeEx!cy9Zx-o;}QvxM`HEzV1DFmu>( zO9O{&%GnYw05}0L-#?GjHI$%tLVFc2BoRvHK+&0)ZOA+xZ~&_Ah{HEF@tC@X5@om? zkE!*mT8<-TCEb}{3~+ufgeQ{ow`#40G z`j3h2n7nd*h&!+#bXU(#M{q05^w(K*n^OsrIOU8ouW^yn+~TP#5Rr&3q>&t=<+iZK ze)k9w0j~lAli5&dYm4WpDGDV<9r!= z9-r|)!m(S!9@g;=m$g)FI2Uo1$FL)%ev<0in6-~y`#3;hyqT3j!Dii%8$Ay_Yx4(4 zi~Bp`=Y++>I=o&X(*af_F;ROEIrIQm=|_n5BHEU|jtK(kw<+Ll+%uEh;0{H7rwi!` zpPccUeAL++{^rukH2(lv@UNSN>cI2C=eVtxnn}jQBjqaKf?H|mMtwT{D-%^w70Ro} zBZ%K>x|5OL818#|R*kHRbmS4|_o_)Gk;Y7U&Hu<4!D+~n-)6;j?tyi|6 z>=Vu<5UK^`)j$N}ByR7HrmRbt)=w=~AOT(vIpd)J06l7p#v!wrqabdCudaE?3!iQ( zt)Zb#))@5-K54MB-b~xXoA3b{!8z%Z&!s-wRgY4Q)dW`e7T+YXpOCHx-UJ*TPvKWB zWijYbH27~aBO@LHrU~R9%j?Zh*EHC*n?EvhvPe;kZi*CSkGM~K^OH?00nhwzypjF@ zc;ipfhHq~)iK0hU+|gxl3NLo%zd1Z#rC)ecR$C7c+uSaqAxS0^unqwj9F8%@b6jda4|5OR#E!{-@L20%6W(c=FA5`@&DeMau@P?}44@hi?TN~}-PxH4S0dHR~#k@6#sOQE7%Uzt?>KAwpJcI((Wc% zV2m+VVH+PUh$?fAZ~+4&`ByDt;)8Iu;_aQ@8N)65T+60w7Fv7D7Sx%P4=k@nE8VmCX1T8v z{3g|WQKs8JihNJu`{|VZzBRxmB?Zs>A-yQFDQ3#hy&?PZU%y7hYAprJkK6s$m0%QmS^hQ;ylqZGv2_#T=Nq z-6qeSz99H}QSi5eP~PfVee4EAg$29-824o1$vlobb*>vt*RM3qTp^i4jPQeuo;V%7 zGhWsEX84!FI+}SO1MT8X1w>Lua*;Gn^6g;g$iNVzgY`XY!BQr+hDVQT2*yJf`?>5r zO?s4~t*Ol!yPZy*;7OBOmg7~~3{%IrB1%>HckvMNzwQfr1%FLB}i2ak?7Z+TO?#XyZ*q$XirGsRuoW zpy`g4gO05pjAX2dbgv7=db3>W4{$bN!B9ry*Ev0FtU$FOU8> zYySWdyaS+VJ|Vx;0{c-O zbeg`aF75lDKW>yRTPK`;hQ1U&6gqCDEsS$5s=BC2=>OTn9FD9cKrrV(y92fR~p~MvZ#tg04^22SjI7f*ndp>)|J)A z+5A0r@hZ(c%CV*o5yGb-{{Y&_H0^P!mS$G9dnC%Ge6nA0e}o^guk20Xzl8q)8Fb%>@oT;w*7ZxvmeO>nF0HQNytEq^hhqAfd*1HSyp476bO+@Q3Zi`(8=n{{Vr|>kHwP(XH*GO;XS7*GX^-8C8^% zkQHJ1hXm)^yt`Mv(yY9Dtc_no()Eyw5RGr4^HvvC`L+!4oQ`XS_?s=Sm1g>Fova3F zSje$Qunzk|`hSIeMHZbk=6^G1RFy1sSgn&{cxv)7qsr`dlQz-_#&SMf4#K^M_9OAt z_ru@Y2jKUJ^qEm4(mZLVx&}?aZj{1Zzu5v-C)ih&YFcbop9*{{cVl5|3*Nlu=6Lhw zTor5vVbGD&HQav4$pqiE7sBZEiKJV3JXdBW%I{JXI}8E-(ys&h)>4y&+;=>w{4D;7 z^xxaR#n)al*6%Maw2gC1g817DX<-q?<&3UlWx)qHV#g<%?0gyfUtIXF;_rngzVOY8 zTnlU4c+wl$9I%n1=o=gX6CYnn_*X;m5BwzlBY9@AxROhGo5)6tl!{I5`_ia#0m6;X z)1`Nw2JvcX9x2eS?gUa_SxqdP9hn{?P_SILOdJ90To`U5#nXJ1C3JkJvZL)T;#K(f z;t4!K@z3H7{E#dYUu#m$SAG>V)r~R%oPg^i8C%4lj z6HVrWD;XLox8Yp`tr=2%IND$T0K~x_7urA$xybhI&U#blnRKl$QNO*Bi6zVEunete?4%?id{o zJ67hMXJ>P#+M`N7(-bkr$_@y^069JTRz36{MC=y?1L@P&y56myv|;1RN-M})wG9{u z%E}L3^|A2!;Mw?&2{#nOU@#o}@!#;QGmV%VMh1B9e;To(Ok&icZs70-)}~8Cw+k*> zv1idwsDEnsY{#)s0h5EqG0{(6mE%4u(*DD#OMv@#aL20Wv9DL~cA&bhfekO3Nm z8Nl^EpHFJxJ|&TDcq5cxl>qHr40h+eaKqhgA90I{lsSx_3F>0Tea#`{0m#bx9Cyd1 zbXw6eTQrKX$1<+jROf39bqCX>a$X+PS53MvBx-SvN&CM+-|1aOr!32)`GCVDP1gqm z1L^DZs(PGopSxp?yO2vK18=ogC{?r9=~8NHR(2{F0(u_RS~+rXanG$Zj4DlEQ&UTr zqo^QYaC7hLT`iRRK$cbv03+7`{{Wm<0QNu$zb#zzcvtIqCV;omfg`M*|zr2X`a4 z9)pUd7%pE2BO6K2;st3Pj!aa)cx~8443>yT@vbx5Y3NV6=N^>dY?k>cAUlXE8?HNw ztr2LWK#`~gdT!3)@9oV<;hZze7zI>=j(PPyy{iVbJ(_Rah|7iY^XG?tH5GXE-2nk4`ACIoXyhB-k>YFut>PO?nZ zwA4qK#2v(i0PpM6`P;$hbrH(o8Rmw#oF;y7b!uS0By?W9`a!>>W5TlaV z=sD|IHDk6lRJJe2IGKJ|Wyo!f(9PjWc# z?@4sYY{+5SK*`DH9gcJBQ_5Y@43}>l;7;EsUPoW@d8YpWYp<4B%3!Djo`auH#-n+s zk~9mq$^e{^kf3*{uCK&w{AETsIOpl;Xt6Fy6T_`6Yqb2RoCA-$N;PGb)n#0tP1)V- zKgOs$kn^P^$R@Jhx%_bj4*K zF`^`{2<*r2eJWeY(8j8ZvB^7zId5=#Rdk(K8_S#=U^W+y*!B0Vp&br7mHDNhrwiZuQ=crQp^G0VKPbuMk^0j8rAqzcsH1>RcITiTwD=s8vT!%xjD8=>(yx@k z%%iD=c-Z8Pye<#)tjz9C7d&V1&rjC1@1;Lv3faSBJaflSum1pEs7B2z25<)9oMVH} z@~xn>JbY}gP_uCon4l9D1de`()}dgiok2P2)AID`Q{AFQQy6&y;ej0cRaR`WtKf6U z&q~dmDd>o$kgMSjIU<%k30G(hwBQ_ZO)I(gHa3CtbHS;jjh%ufHlBcY{{R{ZZsfM8 z(l^bJSP)yO$I`Fcf{a9rz=4gJ2R~Y;ZwXmB-lTWk{v6eWlnZA(9is|Mayj&-jbg{< zD|o?|JJ@Ad_V)IwH`8qkm2KNdIqBE@inv0E9Fj`0+zvC5{uNU6M=Xo6%WhCf!8rE% z`_a^<>{f}sa6sI94&c?CB1Rl03Ftu}A5rg5wXn~Zk)AR*&H?8K^{WQOBtRkPrH6cv zPsCN3m1djGL!LR#Iv=mKY3Meq2k!Jpkx?e=1Vg+79{}x<#Z{cR)!avu9~_7{SLN{{W48ckG#^Y0&t~#nxq2 zn&!egD|eI@*(8!0Jel*{T{R54YWwJYN$?iteG}kf>6-o2 zuwPrxFZOJ6V8d*u3ZWc~sNK1VW5-cdEOh8JUjbg|X?-@lF6R41^xAYg+9Kx;%zClL z6fo!ss`_Vut-Mv?&k*W&x|X9hm*MDlvRm6T#d_<5f&Tyj>yA!qFTy@0eJe?i0^>u9 z^~Jhr=(}fg*Ue_n3$*j=)3to=9}?-u-ai&`M_H%oz8%%{D~p{*D-yCYL1_lSX0RZI zEwzW<9;34w?ljMYko+C^dvC7m5cyiBwQwVX)mWKsqt700?ndPUR0;6#RC~m{o74GG8r--FFK8G$PwIq?5Z}Ahv<4(5!0EBZ&wY#;6!!uh-tQnY* zvN3=@PI66SS$s{swb!jQ-wy zm17dyL28ni7ljJamP3|f&t90WN8&Gl{A1vKdc$6iRnDr!gUW1P3 z>s1WWr9Bk1LX{NR^l8-^+6HtIPctAMR8WxTj)xz2sORvj9}jJ1()3-^+d~xh48iU^ zpl4&*Gt@6^eihAFd{%^bR@HRtc+*t4441MqWO;yMO{5&0W3RER7Jn74d_NAGXLY2w zg8&I6Xy)|0YG(HBg9@f4Do81L4cyzMd`N6X0H zk8*o^)Dr3l(ApU1ll>qQ7-q-=1d>;v(kTlhU>MJ+$?xbr`qZf= zcihvG1(*-C?A^&CUO@c09AkeSIejI{qEFN@?W7=J`mO8ySn&y;uN@wKegLf znUu!3+)=}VhoL9Bo-4}yAEMf}m|n)sCYdkel0ao*QbQu1H+|FFla4sAp|xLvnw77H zZJ}@DD_^yH=Y~)*9$3 zD$O883zM{Aa0kp!CpFlna6Jt4jkcgz&;uHi)6gB+AH(fYU2a`ZO!9IIGwo0_yDE0$ zws=0(*~Reo#55|;a?21WKp{DUxJW%XivKeso3ZLpFR<3A*q;uL>`l z1a?vt?nwhXkFE|luMfACCb^77_I$wT;FJry)MRz)eulm8TH7{(s6bT6e7TDNc9VtS zxb-}9Uq6eN-wdWWWHFU|6(I>Aa4Vq_^k=mEEWLzyPfE6%%v*wIRa6A4ga{6GQ{JjudOB{k?~i>D7+`)`K&E;VK3R0U1doCpPX(Xae%nT)~I}4 zzKuLn6SRtAxU@%(ChP}AAb01UX*_e_4R6F=Gm}%%H1Tn5dt(Sogd_%TLl+;yF}L4} z^xY;;FHL}5L2NFdiA1}G@>>7`xf~3N6zyR(x#8`0mq8jm@<>SsYL*L;o}ETL>V>_@ z7ZNOJ#aX~EVrEiLLDP($E9k)_R?=`Sk@tdKQArGaNd8q;Ym*erutfxDv8wH8$I1cE z2e3SGRI6CU#PhEY_@ht$#Fmz@p!0jV}j;8>g)u=p6ZE59;spk?#-*zi$ z9Zzq(qa&sOuHx2aM0Rhp$kH<$q+sBahUzg-(e)`JwGuprC08ni58YCD;B@KKX0`gs zgTvpceOq<2fYqPu93u`~$A5m?qJ+AkdsNh61BK z*fvf*atW`en&w!sB1yO`X9VYP4URF#C)TP*EUsDFX%HzYgP&js^d8j@5Zk$|XsD|n zJW1ePeoKgajVDl!LPG8^;1Wg&{Cx+mYahp72K+~<_>W02_-g+0Gq^@lMUA5>HypQL zrg*QXrMhOh3h(B)<+icmvD|~&vwUB1DqUHdhGq*k^M)!;K*Hp9;GE{7rGIqkpsgf$ zeZRv!e)8k(FlZMB7abIZ8?k}}hwqYoIQmxIr^5dL5m?yUBk0nV3&MGTkV!uy9N@7y z$33goGzIgt<`;8H=W%v)Q z>zclwCGE7fvdbKc=J}Dx%6f7*10U0x#Q1mc9`nMn&2Okpcjg4n;;}i6!TE;Vf!Ar{ z*1n7Qm4&mixVv?2ld(j>U;#`M=rVZCadF@}EXu7IZ@LLPz#TE{2CSLnJ%oR&g zNXhVD!x@&#Qrx$AXoe(YkL4k^a-i|}d*ZS@Zo0>TCbYJ+zw%_&R#}99U`bI_U>*GB z*k_>j8~%IImjpo7|#ZXbWIdq$t~xJ zt!H^Zc*?dCr&HS`f<1>y<+ak5mzN6|7P6x^A9#VgBR#vHYD+u7&V}R0%eWkzHyH2O z@=b7id9J6vu(Y18C%61AYjLSU_IjDUk}G+T2%vJXrr(&CJYeS=dYa*WDOua$CSkc{+RyT?5{8nf_!TK>+~p>H-w9!EbkY+IeA1^{qK8SBP9>ksyW zjbhhg5ilF%{v5X7m#JgPW7PU_UD#T#YR_}e#o^UAb+OOf_y*qEbZcJ|_-<09A1unq zTL%OTj;Hz61^9ZgmyXL=@XU^6a!I^o*a^=hjCbi+!Q%7wq@qE%=W_F(QIB8gS<^6k z_uaR0k%6}XKsfK%ir#AH8(JQ{;C~7}g^#peXnK;efUt?n?d}+mIR~|Bc(cMMT!s(q zYYQQC(0M*wdY<3_KPrzf4{}NA(z*WtgZ?9UG?cJOWRAwV4giI zYvSJD_(W}9GYnD3A&r}r@|ce2t_u#i$*GKN?!{x4(|!;5k`r?~SSOZF#PaXpz`^w0 zk~#F|wfsHsr^L;Ctz)K1Ax=@FxrwrJIT>u@2c|f$H_(z7ykdnKQarUi8zZ)DM26HM%pBx;?X9(xtWdJ39D>Pq_1KZ6<|f7jYuSS(vG4 zfjfX>)MqvH-jU#&I6OHO*N(0wvW8e=LL-oFR`SLVBPEFR;}!C$)KYJQH{MOO5#3wc zN6kR z{XOwkz7oSWrF*NOD$q-4VJaMxmLWkSw{uY@n|E#HT1^bTZq3Vyfzb2$iv2SW zU0uRYWAe;a8tOG7te-*y1QC(BWsQNxN@wK*w{zdES&A5BjXd8mumDtM$depox1c}D zp_*X~#9u`{yrF*SBo!QSgX=+3(tv?>79i|l(<39FPipN_QrPq5O~Y}Qi65P9`^H9Q zAruaWjNtxtI?L5@eC1@pF+7E`qy!+>2Y}XL$kZnBt><>+qZ`p!A5UDdHe-=j!y+!`>gh3 z7muTN@gt4X(XGf>R7AiWlh82fk?MVF%wVzzM3Tm1IR#jbNzMW7o^$P6AMmVo3wWh? zB(S-5LaL%tBqJQ1tT^X`p5~~k$7vHsbF?yTX%Sm%A?_QDfsxniUX3h7Ds0apwiR)Aodo?fx`; zBe{$Ph(~)FEr0_!)GBc~kt_dkVs=f~@NR`{*(m+h^21klZP zZC(iXB3%QJ4b4sVofOYoMH@ZVDXoArDD0Ej;jJ|k$pIc+Le(KH<^!Q%e_Nw~NH zytKN!Dok;)z$HqR1fJFSWTca5{pQW2&msMrZIai-o*?qTC9R`IAZ50*GVnX&HRe7f z(*}`uHKnnAw$ij)xBcEvBOlVe=k_GgJO$#fi`uT6@zdfp-@|P+>{?g9i$*uAJc=@w z!cq!C(lNrci?xW@FwD5|Zy8T)`tG43$nsj7$-Jg(c8S>pj1|me<}y?x6getbgVLJR zcCm|Z60e!Ln=To8=eJYsUAD77+i&#LMx9lxp-?1XS@6Aa&<+RXTpgwIiCq~`?gVF^ zPxZ}u7OwWO>Y6&(T*G}7nsf}#A~C39ry~vMc=x3(m@8c(C@f5uF6hjFj9@ndwsZY! zw(vanDdBGtDVkudrg@Ew7GSa|;QA7I70c-FYkhRW=6gGLMI}tdh-`8O2TuIgOW-+T zIySr`RCbq6`Sz2PA-+;T?cegQ8?&j$Lkcl0uH)?!6COrFjDPz5OzlwwyL6M^&@0;8FW zlAxR_-oZ~-Q{T1;=yvM{k(S&X#iN{U2?T=0g{44XL z!_3Lzy$$V#;&nS9xZoZZTa0hdN{Oj%b zT34qt^L{o~oieTc?7y z8B^c#=ubmXn^SRRc8FvEp*vp<-#H%R@}^C=JE1YA{LAw(z&~F~mr9o>{T~mNBL}cN z5%j_7(zGt>zc^%1?i3f29*h(@?EQq*@`4R*mpg9aY)zA zrCQ5nZxoFu>SxW2ARTqc+*{e0(kz( z*^H0j`^9-gn^34iOXnHe-`osW=6Udv-6V6Fn{z~%=yv?086NfehxU;}MGsD!s za;BA{t(vG+B!MAhtM;mU*XOqj$4;UHx=bp7J zAT(uGLP_e1yn~)d^*FDNb!5-FSbBX4UhQJGU$a`_Lu9V(o}T`htyy&|okKvgRo^3* zaOyBO5JoubkLy`*u^+_6PpVMLu=7|S^ykBqOuMSV8 ze`Mdh*D;8^;W~w1m>lCg6UeCI@Wgr!sJAofFj zG3RmoN9uZX{A-BNn^*A?&Ha;h;GtdLyumr=BhwX2P}JttZOnI52{D6?gZ}{4?OWdq z<6SW>1gxym09OaM*Vm4f&55R|Lg#iH_pZ$7Ec{nGq({e+-Cti#CS*0NA` zJ`?`{f{f}hpWCbAEORu1Xzs0)>={M>07i^}r@vg}^PixvG1L4@9lnPhv?fL&-vp`2 zC*R+_d-v@z;LGnF{?)$_E@jhFX-=cLrk%uP)gg^~wljrLJ!^-b;pN7V@+r}6-b4gS zH=_fAow*Eo$8p9gWRoKHDR?3|b&WDvRiG2Z6=RNJy#YLBm%8VSR(_=<-V5>dz3g`X z0AiXaUC^NUR~QTzJn|3gT~)rHcj3FKjCKdeMOkqavF&*dK28ZIk8agh_J@ftwHsYZ z(Mns~!l5@DF)P=1`&l^muO}MPpDFs61<`WCI=AXm)+|@Uo-JKVN#1O)7tD{TF^1|G z_v%mo0IIt$1}wARi^$PqjwCoLa*fF8o}Rg`0?KyPd^>L~_2h_=aIuq+ce}5FKQ>*Vl#;-4)OHx}>T8Xp_dex=>0A5QhpRVhm7^)PiD zA!c-*6})7UG=G*s^D`bf9m(~@Tk*W%>|1FcI_@$9hR?9?=z4XmpAUJkIw=KsISzLW zXV7)$6{q5;!dXVLfQ^&EZdcTg&!ut7KKb-?YkuLTd4>J_vFed+FTD?J9CMt0AIMj6 zcdabG7=mcJvktv>p7^dCUfXY}MhHbx*et3~9^Sok^{$u0qT5tqX{vmJMIcMK4X!;o z@9AA!uS399EpacUwY=9Ur;HzZv*Vp*bRP%9VFn9Iqs;YEdf;~Sp~mDXIJ=qJ z6q0HYU0=<(EyI;Uco^x7{YmD!YnvvYN}1)Dh~O(6P=SK&fsFc*=~x;)quJ@u!GLDr zws!=K;NyzYQf9JeftXt9t}Vcff32N>EcrcxoDas3uc2Pz*{^kbNWqO(Pn_;K*cANP zUryhRNula1uK3?n)ucOZbhw02{NF07@Txt2Z(21Qk)ddJ_tLuwLWrVVa!KRx$6B@E zduY5b;hRZy?WfF?U6gesNZ-H+AA2XawKNU)I4>6KOKIY(mcD-`Nj9+#xH-p9rYeLQ z#(}77Ab6_s4<#cd1G9BF92N9Xa4VhojeGXLAL^1ZX&I+tUO|G#>D%ep3d30#%19gz za#y8&H4ovV`R6&O&yKAxHhL$D{9C5#7CLR0h3^B}+pDZ_getLyIZ?FqC#`oMvLUt9 zziOX`wzn&FJ)-!ICwSq{n(iWyow)ox1_7@Ng6y=|KPU(8_7(Kk{1Ut1_xvy4_$VjC zZw=3`>Yf^k>F+Nm)pXd>ORGTzq>LUhAY{qT(pgBu9y5Y1!=FTW)#J-fP4+)Xyc^=i zxBF$^h3#x?;?yr%A*Q^}uP_YWVUhcT)F~u$T_=IOQGYj$wEaH%8yF(JmP>+yQ#{JQ zCfE#%c5+46qR%;B}&Nk!(k@Y#rAH`2(8 z%sx?(&l%@Fln@3-kE$8JVDyu(pgWKA%zp#@*@a@i<4fV#Q_9?C*YnOy1mqbj& zxr}_HC$2ly+bMVHrRO=!L6-;S{JVO7b;Ioal&ty|^w5UqQx(-jW7sFzX;lqDr4u&Q?S=Q!$3U%b=|a$LRL z+$jr2(JX5GCmaByka+(9>(({Cp(V5mAevEy`NEv^?~iZRlw)C&PUa0B?pvgEYoMwT z*DOFIqMt$2>rg{Fs6S_rg32)>x828l{VE&DWW3)vl1XOc%Y1I<=zTw?DaJ_Wx-BVu z$;x9m!0V6jtzssb9F1;n8cWIJR!#;OyN;Zn@ce6r{jO#fzp=l@3#`NyyeV}EX2R~@ zfE9Dp@;Fk!Kd^_y$pX1+rL(e6o3EX78Xv9! z>0NXs@5P;1I62pZd$aO$#1@}szj+|W(sFQme}z+dMat#)J@9MNw6BI1y0(`iM{&CH zR5D{Aq-Pxe0ETPNHH{X359$(IY6-F9Y+(1Uu50Li-5O3Xi)%(yWyb*UI%L$A#3X^3 zp1qAm=W`N&N|xF#K{z?+4JPz8g4I~{e}5ppUan$;pHX+oZ$u5VP z1@b04Pft8 zOkF}lDhzzUaHqa1kIG++=QXXYN6F`v>4DUL^{XkN`G6eN#OAAe+|sgDF%8-5Hx4md zR_5VjSsbYfK2eTTcluT(iiJ?ynBRkN z$7oTGFi%RN$1{-1P_g@?p#K0rom;;t=er49zH^W;2l#Xq9ix4s=>)O>{Yw#%pIm+w zNoZv`bIjFpWC^*OINGG1Pvz2wR+PV*=*}{JQ;z(fYMSK4RG*cLwt4NxfBv;bkw+k3 zC~qeRccAq(%en9Kd#I@-WD}AD0rLaSbI|@3P4dJth9@~09=$)UUcYsX2qZLMdf>HD zU_+gvOflmpwFWa{CDSXM<8i`*Mk`lCn-_VAHZXV?#xYp#7-KwO_4KVRBJMkM4LSkG z2cN)?=4ccirsdKbn8}a#Y{x1GP%-?gKHhd$3o~%18NmGNX!Scu6_!a{f&c&yyX+5d zTDIu~flR>}RZi}?$3cqC>UUChWVY7f;y-15**uXNX`CK2{rv<&}zd;EHnEyBy7w zWAkB$2ev8k`Frh1fVIDh~fLFt@&W~#=!+$y^ak-_inTEk<<#LJqf>9D8gV8>|o{$7;X zm@=^hhU@jExm-%Ej(x>ItWb`MLC!~|WOc`3QZ;57!+R5q)teZ}lM)hkjydRke+sIP zg~@F5kEKZs!H#9!v=H6LU#(IOWM0{cI3<(}lAv-i{Eu2#<~H*nw{5|Wc>{`K%+CJ+ zy9>`%W6;z_R`b9hjJ7e{Qe~!Fno@wgj93B)0CA7&R6}{UC1MQO^&EjqHQ99AyyF~$ z(vrY5v*aFekxd|Sxu}ttqdOU29PZD`oPRoGb9qn_`-TqF=uUsn6iO8>kjM!v0q3dw zDVFNVA~R=q-^O|W0PEEfY3R0l-JGn9*}>!u!_eoYbc&5&rZ6_;MnC|Neg2uoYd1!L zppSfGXeR*n9mX--{{Z^x-l=|VY}nicZ1cH>0Ug2oe=3)$ydAY0cjBYr=ozh;3%SWy zj!9Ja{{TJf><{=Sf5ZuVANwl!g4X*+x0c(-8r0D~qczBmQpy%Qu1*vvQn>DNb6*8b ztj~X_3xV?#&cNLV{nYFft-^2Rk@=mS2C7R&*gc#LWA1O~xIXOK# z*OiU|8JBe?M2i6yo0SN4vnq@*nHLuDfyb+{M>4`$~Cw>%72 zo8EZGP}MwFb2Zd0bS|Bid1h^|3CUvHKe`W2{L?-h9~OAO#w{0zZ1rpW{P5}8dY0T2 z5UO^4(0_>ZIOO-Pm1ENUEu%H3#H|MC>X2l)n%+x!!WPEW+y>xD>NC@=e8(f){I8ho zG;Kq}-w%8mTgEn?A=EW%nGMoJj!m;J0NM~>Mxk(7&&+dPi)HbLS@^r)>DR`J*97LDr%JNPaWlBNWL!1FHe1Z?<$ryKe(!4XxqNZrxOL0u zb%u)OX$mmAg_cdkkCr&V04m@BPB1!ms=f^Pld4ItT-f+~O}B>oPj-2)?`2^WMZWeB zai3vPd%XnRk5%xls&vBgA1U=s?50fab{l{oU|<|}9{#4ge--$DQTU||owtVVQ%E+j zVogc#k~qN)3_$zyl5@{$^FIb^mio@QZqiPT4f%@Q+SW3Ub2f4EH$@(!uNCdy6VsaJ z_WliBbtbd6muT5#M)XebLg>Ke6Z70MR8lA$O()o&2 z7j7|~-9~>ReXFU^^gAsg{KaDJBNZW#;ew1G{=ef>TKSHz{i4EI1Lae8NF6c&JqVX(4yP`b338^5uyWL6pT5cy0;PsY8<>qLAe z4ch3~)u)qO(6rn8mCeP(YUQ^D`AIoEcQ_w_096QKc~y*@&cx>@j-&zTI30azYZ9{f z6G?cE*H|Gg0T@t58vysMRB}Tz= z7^`Fw4;{MWoOaD~nw71++`5z(X?Bqd;VO|K4yP(qXB_eY#dWt6eVXQHCNQyl$0LHr zr??~h^{#&5$<}ZD=?Ricm15^30I1u$)RFquia;{ydP(}e`+-LKy7vMF!OW|ASWP&%hw!AxXcBv%+W<31Lco;aruKMu= zwo)y?Ocl<>1-7>w9Chct5_;HMGYeGIn@`nj)9n+)s6Z+tDiKFNFdas5&t5C1&~-p3A76fz&Fh*~&HLHi*`T^equS9f5D*S{B=^Yx_pXCOuoh5H6nkSt zJHny!Jg|5J^!#vZkvS>8#)}SY4#9ILE$78@p0@en{IAjG~<6 zai4zqIj5qu@u>P;( zI3G{xQNpL~Q=$??QUZ-06;Kr&0qOj+nw1ESHfZ;kem93CU=D*l2emGozbRm^ofECz%?wo!Dy*Z@b z?50eK6!PFO1oS-qRD}Jdip-$>qa26E!;X0!#~;dz>I5E7%!@o=AQ@7hDzCd9xXwM# z(y4fg-OaR53zub_e5a>z)4n-8dsW@d6i0B83b*i(cXRwh^7h3+uGqcBq)Quvx^XK4 zK3+PIe;>mYGj@wMqOUZD=u)t@44Xq48v}MT#z4>KpTecO45NEE^CLUFqQGO0g}e6S zuS$zawOd=c;+;rX-y4JHYwZ}vsN?HW%4A!RCD|J)hTK;?9FNYeJqW25q|-4xeE?lD z2_=j&rO9L^v9uA&mF_y9&bd^M-_G7t60S)nt1dfdo=N>Hv+;(RKC7iHc6(%)Oqfu4 zAm_R1-|JlScsEv&RQ-o6oP_gLT2<@Q>(`tL^KoAp>tLgLcN^g;LflHzAc>!D#s@iG zr#x^$0B62y3*(X^=zbl#RPz-sCgtCkB{Q_2bNFOeS>X>4>RN86aVDo^u&c(>NxubQ z10VoFC-#(_Y^s5VZh%{TyM$z+OhJT0;Pp{=&w~0O&>-Tr;`hJCfI(g+I zkTNmqNI7Qo>VFQkn-{{r6hkXDzlU$gX6J<`1Fk-9{8yfRUnu_ohml7Xu%1dvBv((9 zw+DbR(4Ms)$M3VrcqWENh%CGi!OjYduswDIa3S4@R9Ss;qxlq+Kdlgj;A~iuUhQBEZInY72C87Q2|zF4W3I7xl%K@H|bcv3#_gzWw?D>()ulq5;l?t zjHm$Ps2pGbNga8vr{YDJm%uoNDHe4n<-mOM2pImphO>Q+g$tv^d^u+=)~f3q$s4fw z`Q-Y5dml>HwXwO2QCoW{5XGE;r-lR8xod4kIIm@rLlPMB%%5~8I3pglp`uPc63tK3J zg}{jUZs$D%05<%?Bz*;TR+`qWFMy!Ewi4ZH19VbIV+zCO!){P{Kf{iL8Ropc6h^vD z#X`hEa;wh=Kgf(8*siZg)-JS9JNqr6XdL|OA{ioOVdTCob+?mV@C>(1USIy_;tl=+W66R zDIGj|&`Au@h_^=>SkbxZjGj7sbK_U`_{YSAEYbVyTS{fig!cNy%hJRmzi+ zNb8PA6o?2g1zA^gKQ7QRNIi4kKhmwdOu|yKM5WnWxCe2;&tIn$uPel!Qpm9t2aUPM zrZLc9)hA(c>QU0|mh)e>f#eXS%%RTdPQY`JbB>MAA zcMuc-&pgV2Tk!MqwL})Qu~;Vk*{8!$3KO1pAmE^bxX@_LrPz@hlN*UV=pvg zm4BuWrFqz^JVaGbg!XVPtTdfJi08D=6l!`U>dmI!&hDWTYM`S#(htr!O!7czl)=X zN$_p0gB6=(iGZwBs8C64{{RTd$NvDXrhKrg2T!Xm3Uz2y_PZo-TB|sA`#es&SP(a3 zc^z}?GfAc=lWK@wTt<$nM_12G6t{O7?a~&bO&FuE`M-HW-Wmr|;*`cRA`Qk_OxpYeohDj1Y6s9(_k1+|-3$@-6Wg zq(|Dg-~<^Xlk1*%?kQ#ntWsPy;5kLlLBag!<}0Af*L*y9bVx?RhamInI+pjQO$x*n zq*e@E2~PdT(ETtlDNL;@Fw_Y$PX7Qrg>c)5$0xS~13r}PLg_7RmF5kRAVmun^mjY} z-PB{(siC_LI&N5k<9m-Ou?WE=umz3|0sOkxnEulc$^QTecfy;cU|scz6L9%Tw$O5V zbpVWdn)LYX_g;~5;weJp7hH7v!;YU`oL7~8*9@h;8{9C&mfj@uH=rf{V7TCPBol_| ziusNvgZhO=eQyd>U)ofa{{X8W8ETQdnzpWP&ouWsdb7Wr2#f^pXaCb@qXKy18Mt|Z$MQK{WBg~8y@Cx2XZA6o4^A!!)!EG$m) zBam(lovumC40F>M&!vAp%i?GBWK(fW;J;_s-F$hiwi|qQkq$C=^Kcn{y~j{1iSglh z^_$T--sv=el1S%y;C?@ycRvEMpAvjSw8#)y0;CU^0Wjx2r;6f!Cq?CWt5FDs5N37? zTrmKgfJoq;dH1VZh~=%(rMhH{0CYdZ{iRTBWwmIw8xR%ufvSc)aIb4nb$EUt)cfwkyouppIa?G~Qr0(D@K|BG- z_OCgeo0)glF+?*6j4=Z_=QudVeR_4`wf-GRx@)Ns)T?N9up<8eZ|OfOlp3Xz2RSMS+7R~V zji)`U^i#&S;x8FAj|wo3a#S$EB&Z#G6Ybi+Iv|iud8fw%{Hc3v;OAjnOr!wb6++q>GjD4~Fhga!iU8 z9AFd9Gx*o$%pM*h+5;SBAKiixfhVBCoOk+h#eRzXWtu+}d?fME(`PAenk1;6U;(CZ zpsRD7AkXKKUm4qY3i5qa+nE;K;e<9(xC%$`<2}7S>)?309MxfC^)3Xcqlc+}=b1i@ zJ+wfeU>;BtYMsl$&u%yrqSD}PX$v;f%K^tegVU$dy;kqxmaUaG(<3rTwnY+ROb|Np zjeukGtjYWlCH3%ul$j$LDoD=J{8{wJ>0cP>G=1`|6M|SLl3)308jhnQJbQHfYejEX z-$}N48JQO0%Z6SRum(UJ{{TwuZvGoz#~SX^Zu| zn`a+yuislhM5S2BHnG9Vj@UI{Rn_Ozd6Ua$>C+32+*Xy&o*D25?#^-vKQFhrtoxlF zS>bQ6sgR7Z3)Fv&dr0w2YnzNj*e#Gb_BgJG;f=%HNiw8pyBBEp80+m>v3OTelob}& zJ3^Os36Q8dwtYS8t@uOXnCFV}OHnfz@N>ZRMjXjnxyTZapY0Y)GYht@85@-SAu+B@NePHx8V;6YMvOE zSJCZm4Vw6-_VOK*u{llch{6o0RSKXL0C8WReirarzl!aArFCRUnVBTV{IfV9f1dUC zckJV1C9mw=@SF{)jRQ_XOr2ko$KX0v7+HSq);cT0_m@6%_@D7##6A=F!{ZAd4PFoI zt6gSDZJ?b5+fX9$Bd{#wHttF9Svp6@9csen2GpX`lF}=qtpQUr@YjtSyEbhUutm7DB2RJ_U zk5d+USM8aqcuL9{8}@kdR-xj*4BYD3)9>|92n_>OK@=$8z6upz=Q1V{5MVDIN%Jok zIPrhMt2^`xS_w>Tlk-O>A%`6S=rikA{AnEbKMXWD&dDG9M)`zf@cC6BpRe-*u|5pU zy6=I!PovIufS+h7)rT8$JCnz5nXfY&8`Qb_p9WTN!8pFHn7#$Ki(1pCg6`bh?QEhU z+S&U4e@<&|DcV<9K525Iz{P(UIE>?ZD343U(89R-`qatHy$m5*;H7StBpk_nUB(@3l0FQdB zY|d{CSY7JGC~kw(KEGPHA|?!lW!uYi$mi0rYRvU1OWj7Nhvy+bb_&QlF&N$Lj+M8p zvp$dtmoDpqzK7TR^{!vT)3k0(Kqk(hjtI_jJx4Xt-8lZkVRR%$jQqTu@;z&kUlHuW zf4bE39~e2al_kL^?w!Zx?0=E%+*X#AX7{#)Gh*R@XpdGPbIoRWz9}v)*5Yi4(YD4j z)Q_)ErEd5#=EnRBJ$n6gx80SP4oLI|`qx$c+a4Obse7B>3H};i_|wEw&hag@RzSRu zFUuHge50NRsl{_%C?~`oIeSxeZFL2UmzH>2bPdz)w{S6x*H`f~#kv)jhK85n3$0G- zOPLf;YGgiD&OeEmbJvZZjbd48Q0R7W*xHp#tGr8cSCXJ~TzY3ek*H5Yd8XZmM(qMT z%Z->gegFsklUFXLHeMRAuvJNJ?`3PRyPcq%0uS(>fS*j(cCwh7+5}PNPr(G|3!dY* zuf03OI?>baFK+D8HcJ&tcv;WM83Q=Se!0)ml2-?!xX%#7Cbi5XQ43O@6 z{dlb@ZX?xxAX(VQDlMLpcic!0dIAW^?gmF5wP(W?T3^EN2+gg0NV%R*5bCzyX|u3b zDK^%~StM`a1Yqqr=xdYE^_I{rjF)50ztp80+4RF{{RO2+NPoZ00k$|WRf(ND?beDQx#xI7>YGG zvy zD2K~a8Uk>^AD)~KQCre}@;sbky$K|K*IM2*8iF$KL{=)MG3(j0+n$Gv*2asg#dG4l zUMGJ(ab*NRvTO>fuG!txoy6D7I)D5XclL3Sw#o4WT}IeSqxfR+K|Rjmm~UPyLc{(F zqx(B)I>x7{>mL#>&8_94#}ubQxgkoc1`-Xt5s}Y9n(myHu6&}SJM424OfIc18gDQe zZe{^Xef`og2R@xCR%v3=z?U1q&cb;-bSJ+8v!c|NPY%Xlj%dWuiDCp`k1%dmIqiZt z_n|=+in5isct{J$=sCuFjMv80cbg_#nvZujn*&-}OR<$zq>)r_b}O6$dvxQaM;^Z= zywVvSc|6AXgZ$aZ1Go9_RkdlA^#_td3~WOyVBmr|QSVWC($D3?VgpL&aw!=Z>5_YP z&1YbVa_$ppbBID=;otKyZW!>sze0Gb@k8@SWo@Sfjz=6H(~jNoMzbo%cG0Ap%u1-z zFCmx%k)J?vG3ivcsg?J!8<%qs*i-4p`R!2AY1x`dWU~T8mLvutScb>0dWyMkVgxTc zgqVpyNZrT*x}DhmRg6rwdUOk=G{DHme~}(rc6;Zrt2cUrLvb7zDJ+F!%!D@5uhiom zPp@id)hm_`iT$&8H<-5eGQlE&pUg8ca3fL1JHr|M4mwPHQMV3ZMT|%Hz^!+0CXIEKU&~?Aux+ljU+kfGv7X+rFup5 zX(g~|u;r9xM*xqj!iALq}Nz7HZg_azW4tC zTAkv(GEAg^1GJDCj@K9K+n%)>x=eED6yt-?5;|}@)N>8!Omd9pl{|F*wa?0Xoc0vTWp)z$ z!1izEf5xjwNB|b)cpv?0Mh=CG0tX$tQ!)#DrwyEff5Mk3oTfcwWL(GdDfj8?R`mId zjfpmpPXP0QS?s1KCHs0*wx2t2%D$VrP}YG7>S|ott*A*OULAVpJpTZmYQ!icRVcG7 z;IABpK7ygMb$CMX(xJc&&7L+v9xFC_G^KkMje|}DJkK7$ zM_#zA3BJ?4wuA-U3#k4ROZ<`!oj(PU1oKE#5 zM>Ka$aAt}$!*B+BdWx%gc_7*L*jp>m?&N=m)})(IlXC=+DILdeQTWs|-EL9~Hp9pu zVErk@9MvA>2D>S^I6pT}Z+ar~=H$CC&5V=VAO5yPt{)OMsivH{1-#(lreDzBQv<`SbIk&fdX z>dmV$Qg>xeO4j-$cyW`dQt!C^L7GdV9Av2Of1OlfLLK~Lj(h(Ag-a`f<97gj#~;q3 zmTWQMPTy}@%Ex?|09jb6BOIK1eLpI4DVP#l3!eV~&ZB1xaz;H)YF{uE8P5YC_NGcK zZz0JnSx-#ho}j1-;*N8`^lHFDIf zBg$l#<~YUx1N{EAqhx|N8%EvSZX-QA{{Wtqn;eEi(2m*0O=?=8DtGgR9FE@K{c2hv z##bjSsuVzBFv`s);r(!V$GNS2F4xOby`5n# z^8WyN`Q(pE6S<;B(oE3Woq-==+z#B8NfgivyHOK?l4b42eo~p`y_Z84~V`2 z(QKr;mra96urqH7zDJfuE0C;qE>1C#!k#&=iCWf4H2Gvg0or=?JaLc5(!WT48S8ov z!cT{m$#W#4+fLK%=f0BG1`d-DqxZk_(eQXc2_11>R&o3kmhGRP@syOIP6uD`>%@K| z_ygi=*?u3*Z9c1a2iZQ+2*}86nD;Ot2?H!~(y92v#-1nmg{ro<@nct;#9H30%Np9O zQ6gG(03)aaDmf(lqz*Z(&lmWj&%yc(o*~h0^ck%r-0?vpJQG~+alFL{1hE9?XgN7G zm2SF@w3hdmkY9{QIe#B82vHpUX|ewhrS+96)c`M(Jy>O6!wN| zEiX@sX)YDWP!dSv83Q=M;{fy1p4=7+c*hvUZecc{-Ogge;f}H4&@a42EtF`;V@q_m zS!O%9$Rpba7{+UrvG_N234&1YxW7~m_E9y-@P1E#~BwrCc zAF6m%Dk-!{Wt6a!A2*btOE%DPxw+ur3c?4$I)X`Qs%tm!vK^tBN*OS6G95p{zN&`~ zs&C%abvfr&>qE#s5_ocC_?e~2YaFLdS$8Cj9@SN4I;c z_66Y)zSNJtWn=eKJZHaQT{Y=Og`pI6;O^t8TGD%HuZ_*Z$sS0II|H_GPa%7bqM?IM zwDC5n_S?(LYnVswQZ<~%04h)3Va$iFMlqVKJ{eftT(!rGwF}GZmn_C8S)sIpxC(&f zy$L;f`&RXiiDP4Cv1#_!>l|z5Dirxa&p6LNQ(TdbwmWWHk3zMzhZDyPV{zeEYJ=&= zw?B;)Z3JqHIl&nKw&0%F_4o9}6}pQdv%4k%A|zcIU_yyXP2WkMN)m!g2 zGI5W*J^uiuZ-d#Kxs+67tWPZK7*QVXrE!dvJ%_*f6E)xUG8OdDkC#K%tQC+C=+X<&jfwf5t6tCa;c8v8M&rw<4 zD7W)`HK}=M#K&r9g+l&$_j+R5->Rg@wswA9dS)Eosnlw zo;JQ#i~x$mYM+pC$0xDp{N&ew_{#k(yicmzsEA4S*#ILewRe&iCxMS{4n`~AL~9Hw z@)ib7!I)z|Fx$cQ?fF-Q{89$T;#RlzMB9s_AXbNKV+uh~$K}B%1Dfcj>@6AGe$SVy zd8cY2LGwUYOhiK+q>Mkm`8DY>On-XsAzzS<*Z>@_D}mqNy?H!p}Ue%hey({EZS{fNw&F`LW47dBMv)r zzyqS=8R=TOWsF*Vntg)O-qj~xyBgtmI0plv?af8uNS*C=D7RM;ENrqVX$b1OU-LOV z>eQACW2)RsA-NJXJlI3WK3GhD7sPQq^FmhzN*`C+AH3j5y!*bm1&I`^lD zJh|N9m11yu5B~sPx3x74QpAQoHHPKd2<3VI03NirBndfu9-sk?`~K)O0(?~FG)NcHJSe2;K{cRkEm$SSM=Zk(Kt zahm4DEl)=QQ7AOaO5z9@yc-lL0ENzY&-LQCZ;LkZp8_4W&NF`z8-ODxB!Evi$A4Pv z;E5uH>5kSr6rVd?lKqUOXk2$IQxYVC228^QZEM&sR+XK{kcg16+%o>fc zO*yqoCXK@vo?*XmC*~Y_@_O(^X|y6(v-Z2z2bCpNa!;@L*O#gF*Mr%iXNuY0K^c)Y zsLz&2Q}ZAorAd} z9C{JfpQLzSPM1`V?N-`L#Jh(OwPB=4cu+UQZ+-o-VlTB53a#xS5U=s3qC zj(uyc_(3{Zd@s=;`CVYJmMLKk`^99H#xdM`_w=rE&Q+e)+8OV(#U$>Hp>~=lQhDU4 zBN)yPde-N-VU)R5dxQioRFQEeNbWOVb-?wUF;ZPDes{f%{gyJiO#CKLv#}#jvM(oii)bpXjvRn+IqD8^itMzzC!fJk zN8<*L6o7_`V%T5@J9FG)kEL;z>?XRjMkJXh3QUWDxM92KI5ny98&PZT5Qu!1*=-t> zjHWPHXFYH|KAcybiB6?x#XBCJ5vo)rCa!HagKTveoOo+jf>OB3$;rlguY6$k?~2Es z%3U7)Z8b)o1Cn(0v8I3CdJou3rz+%IYaol^=OXrhkm$5{x zkj=bq>5v%v`u-Ivyn|-YyHSqCb^|9F$sOxHSw77U79=7i82re8iH zilh>|lx_qMUJpNoRPkM`c77ngh7}64N-l7N3-kQPKA(kiVL4%4#P7^Gs$ru)Ge1))**pU;fD5w|%%Hv}9G{j0B&BV*mudKx5LTiNc;DK zxlfg%86Pfj)2>fZL@IM3)T7AtHpGuKjPr9I0x{za)P8v6ezoO)whfxThu|BBHw$i> z`trPBZ3l7mVYh&NYt!HXPplGUHnFkb3BE8vW_wqF&sOLn+WC$faKId343aW^Po^r7grv7Vbhi#<ajDR0J*2ji^68K8q=1Abv^|;N%6I-i1QY*6sELA`xDe2E}4RL!Jx3Sah z;T5^ycQ(>oxkwgV^exojWA*-Z(s&ZxtZgL?<|{McqVgBiJ)>Jh zKGSu6{{SF$42|5B50uZiiaW*#!Q=BAEhJb> zHanlKSki4S(!xYdT3wG8`C)V$8GXqa1e{}@4r(jdWiF%3Zj;;G_|yy0ssj7CTdNGEXay-yrq*UcJ5s#^R(yp9worqcvR&>SfW z0Q~4&Nx24=Dg2A{gFIjcjD#MQtw1I$!Hoh49_F8 z0m(VwbMM?&#qmTXIq}O*h zQN)5(zz*AA9*W&|`t+|^@fYl&;`_@H{fQ=rJft>bk>!b9d*O&UIsP6qN#IY}PsRE^ zm`1m4qs1hTxysxYB{tzeZJhkv^v!&?vX^7+Rd}waD{pD$X?D&wE1=nt!8jf3$^JfD zn7mzJwsDZx7Of-fZJ`)2829zhp|7X3-`UH=@M-N9r4F3i7~}_(rqX!9^7!>R&2b+V z{{Ulu9Qe0V({A()FGrK?_QnT4Zg|yLwsDgeKnGLTIH;XDTVqOfqU5ghK5K%)R#{7n zh6+Iex{rVV09|sw5tkQs1ALBPF5fd?x2Mv+kCXNw_@WX({vNR$g~DqqmINMvpvn5z z595#6C*wY)2n3`ZTh`JC5d@YmosjceR==YnifUl~BRCE-+p<%25cYOF-$`V5-; zJNAFmWYInZd@Z(*%pwmD>BzuyRR8_hT<tDELijiE{wwI@H#WL8inBBB1%xGtI3B?J8swtfRhjBir|qR=d`s~n z6aN4UU&Y2p^Sr%o=qqg?F!MGV% z&rffqQq;L+)s_9z5qIb}V6L0(of<99zm;hGMf776!e{{W73ANW`Q023~)E@PGmgqZ<| zBq{gqIpB|4*R{D@^?_r|p;YY(e*XZtJq`isT`$Ilw(%y1rTCD>lMC3@OA(bM4&aRE zJBQ&|ULUvf?Sk8@7iJ~NINAs4)3tC*Rdeky>QozwGhl*CJz2idxfmR(vFbf@>HTYH z=>p-*fS3|o1tqs{IP~=NH3C~T?xN;KE|KkEKp%(l=QY(nnQYc7$O4vJHctq6+raJU z4@_25(VY}4Nh6kyHqox4dr~fg{Dwdd&`IZy)9^LYX;y~if@*{xG!x|m!1p8iRav9+ zu1e)qNdS7W9UJOSe>&+OOOC?IE2vxLWnVM~+*c=@cRf1SJoIO+g}r3%&ouG9pO+iN z+sRXv8@W;29-j4@x@u~A1T)#d*AvD9NQw^Qj{g8&Yoz#-rZf}0m;fBIwsE;hpS9>!a6O7;=Tyw`t+0!1^ zTD+F~PPdUPBjPrd%S$OAdC#{@4%M0B4-uBr;Lvne7@fD=?7;(^?a!~RX-tWuczJhy z*uX_jgrDSn&wL7*ZgfUBNtxej{{V@@NUIu^CEIx1RQ~|Hdhy089}iu$elWE#XwR-( z!i{wegKiNl+rC*Q3(F$l9lyoEs?i^p_r-%v$tR2h$3K}EtgjXL+feYXqjRWuD&ku^ zwah6b4fB}D0fuWzF>{hg<;*KX4?rGnr>E!!V^F52Hn2wnk z!l(m)IL0e8RcqaETDBI}cWj6Rfqa9Lobz0D$HmVZUqY#QtLkz_m?M45w@wEn^Vhva zVeu=)`do5FrfL^aEy=`y;j_+qkbg?_)&_Uf_&S_rm#Ff=zqseTOB9LXE9mYK=zZ%wM&p7&8RU+G9ctD7pM8CMJ;tHFTZ!DWmKbRmoRj#}CrP+@h!MFU9D&Id z>7~l7eqV{is`aN)Y~9P&r(|)3$u2nu)Bgb1Ud8(xc)!A)7Wm%<=f)onXx=K(*G;;O zEVUI63QpTLOSQNqb~qlJxUVnLY>kz)eq?Rty5Y0m{3~}))+V)6<--rm2{}%lpI-G# zO-x*rv}f7&Ul#rZO(t%>40r@az$s+1Rsf!W9QV&^x#Djcd=k|>H!%MIg=OJLEazDT zgb<@e95Ul;>_9*)N$1y*UmC^YN02UJa9Kbdi1+rcmTgpB={^RtHu6UI_ey1O#O?=C ziZU_ZgP*Nv-i;iU5&FfdK$?D-yCD&!wUxd?u?5v*TpoL1jw-!{(n$+>jT~Y z06$tyE*R#&WxFAeM$C6U0$^lr$3cwrsN{|1Q|HAa1j%ogsP`Y%rP1`_mXjD3cAn`Q zYlQ`3UfA_NT8S$KwI6YLEyt2=9fA}K7&2ox>cgf7PQ25jk|@=T+?)}R!~>sE-=6;f zO0O1GL1i0Nax&Q;kEKKBh|sgfK_hVkB)5DI@T{4U4=mMXS#hU2gViuylIy#TvPT|mhz#z?`*1MB&W*UF#pRvlID zJ{$Zqw6kZ5=3P@zx<%oLMTD;Gcjfy2bO7QElKMdUOwN=JcrZU9f zcRYP6WO`T)Q%vXlTVfY0aKm^f45RVJd-lz7cZAzH{xjA80MFtp(>z!KfQK2#!RLX; z_3vB;x~}p8AyMdYf_}cWq+QMobr(i_-5F9FfMWz@S2)S-?rKRkd3lhWf_rmW;$nn% z9088iGEPdjoUPB^$?Hv{mYqb)K4u)Mpl!J1AJ-pBBuBVEAjZ+VIsUZ_dzILz0Ao4N zC+SXw{Ks9yux@zm?Mlei$(LY};Nm73Y>rNQbO+w8ENoN#Aa88v85~tu2b{(-2sq>c z#wz5B8PAx*=NScC810Y4(xQ53c3{=-CLo6aw!U%>6!J6Q`E{u7V^XB5mM$@pe=|+m z$uCFmjJ60KpU#{Dg*%-6aae46Jl7&B$@j|wI_I@S7&9L;4U&1yPdgEuF<}1K2l1%0 zvQWsXTO{o#I3Bc#au}!;ve_s{Q^sk~w#OV23Hs)Sa`F;zNXK4ADPoj@22=x))9(E! zDlF5pvyS2=-rHmx?j293{{XJ7CUR9muu+u4gAnGh0B z020R>jQUk;xiW_<AFL- z7E_YNjxs;bN~%;ySPr?GXqGh>tTy*z7o}=qk zp5O1BaHEr-e%|!l{_Tvo%J6Vr*L4v~aXgAq=LARHb~IQmpNlP{Et zq!vAS>M{QS*Zy>jsyPZUM?>4`^s3j7x?Erd!C$3R71@R&rz~tJaUuQM3}g^beE$HR zm2KfG8f+?6jt{>zUfSQzxEWK8qZk+m@u_Z!K)z8Ya`E!}{{TADdK@$ruGteSOCe_J zPjWN#rbz$23>iQKagXrztld2~ZU=Eg z!wsY6829(%>M3t7@QWP#6(a?50mjb;Xs`>p~rDcK!?TeYKPS0K#?g3&Oe*}Sy$$6Mr)Aq7sd7X)$wNIQPvqIyVYF%iGI#)EhGxLFC1g$Sd?(N z>Om*1a+iKL(ELD)Z{odHI~!YzaU(s|v!mOrO}ZH3jesDYK2kXATUu9%Y%MhBn?vz7 zj=H7n1Vm-D-qWDyu&R^g;1Ujdl52%VtyrpDw>~f3i@E3@v)_rl4XjN1F07Z<-YdDd zDP?x3>mA_kkg(z=?%5pVSJS_;_rF18{k9uyGqn7 zf8jdOCbO32Hv4t9u8VP~LmKT>a_4f4o^Wz_?ZtgoRfnAg7t3Rgqr94XA4zH-wQq&B zuZY&3CO7)FoeLG#O(lBd``X7FH(6o&9=#*4xs(+ za&kJHe7Ua<@dv@3Tfure-)OcG>Q?Z=%{|;Yj59N^9Bw7IXV?nkv`-Cdo+7tY{=(KC z$S;*V_ON-AO2_8dxChHq$SiPc*_I+y*p&#$UghuG6XU*%YvVa@ehleab)A-zAC)$t zYaZSKeD_>X?)}s1Au>sWbsx!E8{-|X#Ntl@P+O5rQW|j zlO@!)I&>{^mVx6eRLG-l?xg+|^Z1IAsaoDgZ8oVT6m&ip__5*76!^9D&j;Y*f7k*U~L@oe@guD{eylfY5oKF>E$Mw1_llm&mWRI}N>mUNcqU5Zl=#nGhY`nKAlj9gStrD=p>6*+i%Jrw%{@GCw63P&ebY3fCvY1^ z91-05di`jX!%ZigcB_qqsKU3XZ>aq7UGZm@#WJKyzq|@JU;uN|*WZd~nA1Ybx+y%! zoS+9K6^ZHS-qhmD8>!l33(5dGj&YAc?MV>Za}St0x0$&|%-P@%ulUu9xFgjy3<)0k9MX2dsJZoJF zRkn&-XeEi3B`*7cR_njCBenHOj_qZpD_BbXi zySGH5Kt>PE&u*P-#l8q?cNd;Gwfl9)n>Up9`T12-E0O@<^R&0py_Ha%sHTUQHBpvPJ4Ro7D-SfHuUs;MIsRUiZ%LcWapbgxL}f^95~IK8&OWt|FH<=)Ks!YP ze2VcLjDyP`trE?&Vm6FOepUqX0qv9YsF49GC1xzZFk{eQV+4McKKO!Q%-|3R`3484 zC%;;#=t&*anMN`$^T0gq$GINW6t>I#qirOOyh&{`N0#NVLB`8=SCXxuqv31CE`?PHGEwQ*Ijdi{u<_7z@uu_xCj(tcEQnd>3Yx z5=PO-9sQ0eJr%_V?;(t#wRt?pPo5v(W6307pH6t^)}~fumtbXtI)jyLWP9iC=chH! z_*QgV%*3WpQbOgi!3;CBgU%1(T>{VMp&?A0yS5Y_IQn{2!&sxLu9Il3s*@&y_)!~7 zhj!D%U5Ur9xam<@-VZ})MCnvb=kZYNc>d^)! zEA@SZ?usula50bw<2-|pddCy8H^OUkqxqT{9xxa<4f6H+9@zSIu0P`qqtEcqRhkS& z%M@;aeE5Cipy~%=KBlD_y~IX1{QHp5;FWS?$mm8+Gme~htp5OuR;j6cIoECN{9UE# zk_bZ-zJbt{$oUp!>5+~|=D8&O)4r0mShK}HwVDgutIH~hKxEmK&m#lBBe?q4QE4L> z&@4{D`8frKeE}W&{VUG(?+bXo#=-6^u5C4YMj>8(8tyxSgSKPg!0nI?WLS9nS2H@x zt6jw?RV7*cnIgdG69A6Ck9zZ)KCahEp20lNJ-mSwqNnb_RXc&}fP0+tn)6SMtiSM( zi7mrI1ZqNuB<>5y&s>v}=ng83{w~$-R#=x+yoxs)adhL&B>J;DeF}sQ&;a zx8U(5$cqs?sgNXM0Qq^yBRz*a9u6zb^_wk6Mr3VlYuZycA?{!hvh#oeBX3^a>b2L1 z^*FAXqwxl`BUR|85Eyni+0Hu-p4HdPjvHL|uM_x+?r#-4nPiP6WGEs8v!jo0_y@1A zrFr$G3kyyGhE5>UZbjAM7p-OtunSgY{&Ef?NPxTR8~^AYQLJHaC?$C?St*_T~)uu zG+trSZQ~L#RoX@gz{YZV9)7g>gxtHHh2kHHo^FFG!nX*qG<#ICfJ+cJFdZ^$Yv6{s z`lo^IW|}i@!t&-hL}zgYWjVnk-#-0o%g>JF)O36KF7(*^!2u|xwhjm@k~lc)?_QDn zHtI&}!IurV!?#hK02eF3QgA(a$gi*9`6Y^%q4K;^r93U0>UtCkX1X3)Mi+1-hsguq zJwKLfV$MzWXo}&cLIbw`0M8(tXCQM}Q>J8;4?amB=5R+Tk};n_&VL%$vQW#2XDaUN zm-6=zr-oty=-4E1p&2t8CE^M>xSc&0K0rhXwijE|Zd2@-GOP{)~QzyA4PaSc^ zb5@(@Qb&FsoPC>8M%egytzAs9URuR!>Pp2Y+7;Ir$;Jn#80u<&8{e$ZSZUfjmWNG1 z36B^uZ9Pcf01rXXnqLfG-Rgb~*5TAHq?8zo#Ai~bED{LFIXNJYUUOJBPV&f2x`qZk zfKC~*G8MDbbJTN+=)tE_t>w_=%pb9$xmM-4A!iJ?9$6cCQhu4oVN^8$@rO3CFh zeqK*Iy?uQ;RrzO{&ec4aVi7YH5y^}vxW``q09wwxxnzv_P@U}CSO>^qz!>~{SG9W| zJhvcr+Nr)+gTVi5PWE`gP=wVNr|W_JUMwjIcx_<~cv! zAJ(O2W+kLR2~)@z40FkBoO^VyGQ9a)N4JNk&XI4zxAH;a9X{wh#zAm}mHEPzAc3A+ zso-_3zlgzM)a~SfM1Q$x!P~MhgIWE}Is?mBT*t!;djRJaZpvE^eR?&-&_PhX{b zPNLlT_|keKL8L}@bbaS&AwkcWI%AKHUIScLi=@xr*;?5lqyYGo4=vIX9lUJ1bA zy$63!lXjcF)P^hn5OlOyDA#G3K**8ZVa(DyiTTQH>j&zXE#f25BV>TspyoN9F$5>NEe zJIg6Kz)*NRfwXq#y>56;Bcip$x4#H1z9(t-DVZ&`-wf&#+p8h@877J%6>`UST>B1d z?X55Nz)Kr&-U{(Hn{JaG$leb4I}L&Z?IrwM%s#+9U6%%pR~E_Sj%aE2+<>U>}D=ivUd`hb$(;l8hVX*JoB zJt$bq3_DDO`6yf|Dxi?O=K*^2UEYQJ1AJ8R*Nv}rKLmUk)--PqT*y3?)pgxIC{qeU zZjxJ}DuBZ{+r~f{9M`UCJ{Q&WJx<#0^Gp8K4#E{(Tf`T0s+K>0Zts}(^{$si@IyKHoL5Bci;{cXZ=&@m8?1xs%1KSn?Z>*gwX;8km2=U#)x+@XDR4 z@oOItZR3#-{c?&I+%Z} z?Hh^42Y!PcDwZByOx`Icba0KR%?4j`A!q*EntN#EC%TtCFDm?q259shpSQN_~nH2Iz7zfh5ddv1^*L7W1D?9sr zQdgcAo6Eh_T%*Q>0!e2i;E~i-i~j)Fs^;d~Z1!FsfW5?Hbh4QM!wv@=rHMvaJ0Yam^L&RJcMS8#x-$cLd=>{EFI*Py%~{ax712D)i3@FDR|n+> zB}hN#2D(d_A#$$K`KN(^nFHG&Kq@U7;1O_VRcyIWl=4p;;Qk+#9K&%jWz)=eOCb`+ z9n)-J2GtFY$auCq?~U7$wT)SK(vtHyfB03JedA#uwsl{<{3_l4 z?{WeDRWyGLZ0sTeBoW)GE(TjU?aq1paf0rg-Tradd2@bAOtUlwY@U1P*898w@e zlUJF>3gm*jvB5vey>jN$%!z`Si^!SIG87E*N9UU4{5u$b5bGXpUNpE^_c+4fMm}Ia zx=(tSPAu9uiFY$1_-`}Be9cc>%z(0IQg8^*83dj))|Ov~*R1Dmv#X;lWNiCe1xNKc zOA~WMg8r;P(&iB&)0Ce{uP6`RSCnX|}NE7bmcS95W0l3wgUe4xDfR_fPZq1JK`AiGQCCfgRhTY78%9X=CpaBzw7T&0mVOWL)5~W)@iw-}cO8z? zK+F1ie30&G^V`rC$wRDjPXO}uMz^J5aRi8N#7spTer@ zSchA>lHN%Q+S#+=rfh8Igvn&f^RNqc9nJo@e5h?7nkp7m^{-Et80Se1zd!NF1A z1bS8~obO}lXP)3?4|kbAGsVAdt$jtOfl(rzZS@<`<4iH+Fj7gcl6+2r z!&=<#Cf~qu#(g;T=kc$5{j9zqY92T7J(RlsqklEMn7NJ!uObn&Nh5$5Mg~we%#~tT z9u0U$itPSK4X*bxCgZecC)XW+!n|Bly;pPYa#==LC{7P^x%g|Wr;9ujsQ6Ooxw}Hw zRv>>F$IO{N`9Dgr@aIjq*EE}!f(g|vvXVI)QD2-XZp5A|fU~%pMoSH9$a$*^fg+d2 zcJ?H4q>S@ksRzajj}~}R4IjbUUAB*7aWL5$q7CFx+t#V0dd-UtJ%w0gs zZyJ_Dj&cefIRs>M=bz2iCHws?h17QNI^&UTHCz)U;@8VpG$YTwkv`Z9L9P1PJ8-(HRPJIrj2@J(=KOc zQd@d$K3MJ#sl|OS@aoS@w70lzQugLZUzu&(gg`Jx;C*|2I#e33g**@7-MX%mpy~J5 z2>xZDc}XuY<#G@3)k30+)Yf=e*N-$>JY&K-G+I8N70#mf3x9Y^;%LfjL(%yhD<1NHT!o!Ln^MO@_WBsyZ;%ETEh{#6+pRO7d=HP!yg z{si!k#LtV@mOmS`+x=HbO%CGaA+(8}L2w=*j8z#(QMvNj$4u9s_>Nr6Ay?qIW+46H zj!);(z4QJFk)_3|{C)8@)LZi+0~a20gl0p_jv&vbpkHV~TY0%FaEH zL0{P?;5(8Jggi+e@;O^ewF(D)t2O~VXR)dpuk2&+O7huO$4BvPgr_^?iaWK+`>RcX z_;ba5RTqZhE43qHgEDVb&fejVe);K~;-?-Ij#oiCjpXjZ3Rw<1C@Jl{t=3DT*Hm>mmrXE2LXNgB>Qx%-2-KqJ0s-? zzhZBKNCI4H-YSLUJJ|&Kfn~wyF&PBoucb0?*qh+P+m9o}J|>8^erLVD!g~T?!2E0K z**p~!BC~;$V_ZMS*^=N}`?T|WTRQm_qYaY*)N9<$64i-yupTnopqO|>)z7pQ*J{LM4#YiNd!*g5P+1V}XOmAjOm6V4q z5X-Zwf{I5V*VLDO2DX+d0R`i5e((*v5sov{(;2QG!(I)xv}?jqE3l_bhisRUaqi zem3>#)9F%c5}0R@M7z~fa0R$*oPnS7(y3dAi%pyDi6Y^1j9@S)sP)Bsqulb_xpFNM zNn9=Am0Kq=GmV~^KBJzL`Q?I3q4ozs1&H$FW_{bnFi)`U_*E$-#*SAWV#9D4hE~QH zbmQ3cG$WS|+kQfDN$7FVeqYLjQemj7Gi@_A*v>LZRwJ>`f2~>5wQSDcm|06lp3to=o|Mq3O^4cm#y^f>qA3{{JJh_yH^((NR)aDo;MyhR#7KR&Gjw`%g~CAO50IyiyBbUpC4rE1XHn|@*>;r|zrg^NL+0hb2nHNkf<978N9^=!FnEsXW zH~bZlIr}G7r-`>fg0L)YI2L5fL`Traog^7Jeujk=`DLR-r?vu zOCtt70OveY{6}ntR+1&aZ+-_ILH?D6rQVxcq;)4MYpJ-+)q=hY6(5i1Q8miV=+Bxv zn06qU6d=xcIPG2l3_rzmj(_^qEcCE%mQ3H)322B^%u*a~JfE&T2W(dhtV1A~`i4+D5h3Ry0y=n_5{7nHw3vQ~1^7W%8Q}0+Gf#uRTww>sin#iBvP~ z$j))o@b;&px`n~c?m!2SD+xQZ-l0#D2%c#cNl9J9Ez{PW8l&U=SYyvQ$m_wXk<9re zjsqS>e@s)v&m(M;bLW%BI`=2FO|EUWgp%y?i2y2$eAvhss?%UF^FbLHUUR{uSxj+& zz^EPj6ZED$rw1ExkKq{VYFZI8vWDYkamIK!^vLf^Y$G9zi@1S-gN#*kcFZt9Cm07D zgHBnn`~@Dobu~L`X&p;;`($MwKK}r_$o~L2tt$o0WTwsAdK~e`O3Suk=I3|>jP>dD z^{pFQBebRnzdG$HZYO8#vCPhP#a!5VCl`~#N z5pwM1fGP;X5`X&j1=ZTzTo%a6fJq~f{uM1;-8&WTnT(;OeX7KE><2?oDB+mM0UdXB zsb-lGGNceXmFEZ7ny%@c*+LX@6m+308O}sb5NRKVEs^tMwQWv3 zy0gy2ROgo|e#rStx@8QfjOV93Rhx7dGRcq^c^gY}&;I~lj(bxUMM#1oWcAPa>M3KL z;ECScH!s&ecb=6k+}8emEQY8V&HYyt*PQ%+|r2bcG`d=Mxd-{5D zS;?KSEL%umJm9>Ydk&txMN-wT8YrD-%RWwWcolcgS0Kt6*+5mu;|Dx@;wYH-z)T6~eYQs!SiZoFo@uZNmUR_e3eBNbdZ%VP{X6Wg_LmXI{ec6A{BHQ8vs zC$Z5X34FzK8sJBk&$mBH+4em2?|C!Xzh>WvgTlYG*Mqh13Ej`9YC09vmuYgP1duR| zf|L#NhRc96*q>_s8Mprcf`NQc(=Xu~zlk+T=hQ9D$%5wE+Tvy$Zw(#+7%Vam9M|Tz z?2qF=3`_BrJx|28X5&lJH2LRiHb6wOZjZ~~o)}~wmpCUJ@n31d;3<4Y+I{w~dkus5 z#(bMpg`V!o00cuEgyf7vU6O}mVz?ui8F zu4|L=FNSbsS)UP4KtvM{72-rbVr2 zSJoD`H*0ZmHJsjSm{jLvF~2BS;D2-q%L$3ZyL(1>6Ie+v;aU2cW8!DP?P~GY#9s{V ztuNzo9MIY8Mkyj}W9CLGMl;-Ir@hht0B4;_b@&=CWW>9`wZ+??9177|-(&cizw?J=I2z$ZBMHS-sOb&V(B-^MK`!|xAPkvNLet=jyV_{ zRgVaM%|8VGBgRkBzU9XH^41;d@t~A#;xP6OGB2`r?S-H zns2naZ9ipcN~}x312_j9*T$a}J~_+qhvLqSq3FIQ7nZjco9-?S(=0Q2yHXWc$oa9j zka-0T(+)_IW261>6L6e%DuzyR=gKhC`~K>q-OyLiV&o+vInd4FzWbwZaA zoH;+jta}i9`c_|A!NT#{=6_PI)#GRLK5h69@ZR>{!86?Wr%TtoKWQc7i#MLu;yZ~@ zvh&VZNT3dw81z5NtKFen$$!-_bpT`UZs>k*pszwo^pBg4m04BiQ*g)%4ZA|I zKnrn#ecQhkcT2?3Cig8Jy5MAF<2}Bky=Tp`G(mA7JmqqvvB2Z;$?L{y)rme>iHjCV z2st_2GCPjk{xy~x;tX2%3r^5mzR1HBQp7P+oOj3{%i5J3N{#Z8Fh~+8EIt01&*w`l zj~&~2jIz5D{$oDXBz5Pp?f6p?UGI>_BO;s@>JM&x4>jnc&D@YW`EoMlPnne@aO>0o z=msh{CCsZNAV<)JKY6+2kId9^Ol6KDcw{}sat=n{*96nyoA-=hlw*K$!#zGIbz zD}hVH%Nekq2=lTV%ZT=~<&B>ia8Qr@eoRRbgKEGO^D)@U`xYXZK zO+}+;vAGuMvOK6#xeUxW$t2|FxL=Ik8yQ?c6a50SJah}<( z+rxT9x;@UNFP`!x?8aaTDntF&$sa3Zb6U&|y6lc$l{nnTmOXMuZ%?gU9f7+ZPw=zB z7hWInmY;DQo$RR?XK5#~Xv82X+D?AyCvf-Ty=j5+H()S4fa~}7ae{xH0&lgjEjOGS zoEZxPj((XPKBAEdAs%ZaeqkgwIu4x&Z*Nmqd#f3?L1{W%_^w~HvLn1)Z9+4GFa~;c zJ$qHV83P=%#GAkAp4^aeg~{N3e;R@$53XDbMplMGvM%PxZaNd{ans(G)=#pP^4yKB z?URytKHmP+a+I4e{K1Y+ z;f<%*3Y#))+2|1!ffT#!^FC9%IXv|JGf8uCCDpvXO0~w=-zXzEV~l`t)MxasI3E?Y z_mF>Q-Dy^XYT;pkIaA!1a(F(T^_Qu5&tBBlQ+2FrO7d<}w$g<8v5cSq0rWf!8cjPD z2>Z#Ng`-=~d#PJbc7a`kDF^~9WC9L9x=6{zXdOz%2n*k88dNA`!Sg2>&Q35gbIyJ7 zUp{D4+|8!kgMD=?I;fCIa$VU&V};Kd$lzl&r)#FgVFF2LuqQ+21jf}P90ShoO=U^m zCvGA>{m)?3z99H|8zJUv5Xl^$F#9A8DmPJ#fxz_{&3T{vE}b(?x14C>#5WKGc<~At z!O!sx>^`2qg;Q%oZyYfNk7(VoP;$z8dt;vb^IV;dpKxLG1bc;(n zC9t`HA%8Ipk}zdi22TSZkT~NNl`f9cK{Cv$?<$of5}5Sd4^DH)=~sMRVwbx2n{9&$ zL{0u-;ew7mFmu#>E0MI~&qYGhO!5=piEJ*+-X6H}WsGsjma z8$vZZT{Bf}irBoe^T5VH23%#bN#{N5zK=s#NJ*2+ewzRRLC+^Azt^ugs9@8C(2emJ zfl^~YpeW?>K=rN{8=lg{*&KJ`%0Rq=`SgO3Aokfgon8YSx|| zyqL%09RS$evBOEDN%nMn9CH(Vxf$v@_ODlyNBc-eN81#egKo@Z9P}RJ@~q8wNQK=Z zxce-n$tbAm%sX`CliSy=S22e%`^sOtc zSH@l+y}bVbgl}KgPM+uLYGvV!K;H%~_4xb?` z%g@Tp2W~T-mDG55_H6Nr1ZygT7(l?$>Lx^=Wfm>s9@VV4JtfNArObHJdUEkad4 z5HwgOc`_xrvxr+=9DfkU40-|^6~F%g3gbf77k`F)RU8So2G>~A+9?yB0FpDcfXNuf zd)Lqwf3T;EF4APy{{XObuQZ1~W#i7^f--ihWA*p0pHKe)f_=iMKeoJCYZ;C5q76CR zup^KQwm8qHdTOF%A2aFx3%l^_7oKz)b=(Hngx*BZOalz%eX=_A&3AvZ^NX7uXnm3! zc_Gz^XdpuzaD#6dJU4TX$2?cPUH-@#E{Sa3Ux_uj7U-lC0?>%U5;9Rh`B?LweKTCW z-@|Py;n&5F7wMh_yttoFSu8KWxs)+ydu^l=ImgHf^})#LUthu!ZyJ*7kDB6(eNDI0 z#aFSCIKfvXn1v+qk47Z-JdE_KdP4s38dZ%^RH$|Zotv;Ae?Gj{jqiu!jshV>Lhig^ z?%Y=ga2*Z?c;c;TwkHYpi4rd@HmWfh1RlQUryYGO_4;>8$K)7^Cp`*NS{HPU6qE$6 zanR!+4_~b_Ye5NozT_MtL`tfG{Aah;x5kqjD*d2^Mb18dozGkkbI&L7rGO$p{%P8B zU6i&u{{VaFKT}Fi-bRqt8XDda((UXtj9y$i&8|h|ZDKa2LBI#I073k#n!3{^v(=}! zya-y-MU9wek=OnO#^27n4If=?6XEoiY31c*^5I#43W1I|^*PU>>0Ir_+uS=(ba$~I zdm*2mdh$I-)T1G7sPBl1E(U@T)p@i~X~Fu~^2^vasHSVK$S_Sbfkjkb9b}AD z(i8oyakZT7kwhyVP&VQ7G0Ol?UcA=cx#4*HO=hcUcWjbE#g)@+`v*hQpzXzRH(Fb2 z&`Un3&oK%6bcgyS1f-1c@>>3w8{-`>)uJnCsTK)1jR|Q+ThpEzB}9J4%6>@r?B273xyNdq}v; zba>V9>XekDvon&?RgY+Rxg@H`p1lbq_s^$X8e3a)8cG^Z-VV4zRAU@~2OUVoSzxIu zqJ||7);PvS?2o6f=~rzbSD1n&MI?RV6@v872c~)-PPGYJLZvomHHFM}jH*1q2M1#O z!*@`l)1e)6OJiny$1yWXe(@Ojv(G_}m>oT$bOw*-EXw zx}xK$Uf4fKTDw8Pntqr^4rZZwdRgJ8{%~ zDzBg?VhEy<7k!*!-C}MQHTkoiPER?>>qduhGeLOL86(>}=V{N%4^Te6s>)kO3{27P z3PyK=4)08!r@ckth7dz|w$d2LyOFoB$R8^3aqXUc={<#WIZ-9}rKWl58S?b0*bsKJ zVU(Ubb>lqnYTt+u*eou&DA#eQ#Cw6zhP-7L0DolM#t+|hBHaAg9Y%A_d8fnjsiWzw5d~ft+h`z+ z1jY}1``4#xVny)pj7l+A{>-?2z=gr`Fa}2*0q4DWr^6!{(Cr?{fC{U(kiKE^!1e3} zd$=7rnew@_zbSQJ%hXR?J{gHz6+WN+deKA;9FBUvN~iMA_*QPKFoRM=UF6Mzg_{JQ zL-_D3TEv@=wF_sAWclMl@zI}q#u#t&|L zpXE|%)=|TCID>IWTws%&9G~l+y=vU733o7jXQUlFz*>Y+JdGPm13EDqRea>gQ;d`E z(~97!Nhn38uNn;ek5^`}WQWO)o+o(Ut2`r?r!+Y)84a=`B6W_ok^ zQcWD8vk6s9WV(^JIOJo}rbD|cwCyd+86;D}@v6sh43QQ)_*}0iw?WiqhPxFO5zCd^2bsOc%Aj;P;PKRdDzB)e zrIf5Sc3Iv%q3z;0Qa~pXKV!%^U#D8NsYwolq&?23duycG#4#oH)XNW>{pC#c1JHU` zD13cseFGnc+AgiHNOqVf5sOO>yfaNH49auXHDiNV$)?V@6}7d#@l)DZzMpS*XA?%> zVn~9+yb=`1{qS2PvBymGuORp-r9uTIuAj}=%#Wbsx10EK)xW=eqtm7!q(9Z#D-5)yxlZcTVSr^HVk{7$vh zEPPL@>$=6YzNIu!TpdsBb~DAjyt2^Sghv4g7%F+sert}cPRFZd5bf7&~0ze`-BjO8C3+ZvOuO;U~k-3HUofu($gvSomIRi*$Pgtd`7$4^qL;$_H;#&lTP3 ze-3pq<4r?W@MgcKTczyFBU;~S&gd|Tr2{L1K_fkny*p0uf5f>o`7JcB75Ga1(D_j{ z>@y)mU{98$k`+fm!96*z4z(K6o03QCS#E8YQNh!ss-9>W@POn_&H;y;OPazs3Im1N=d-pGxs;5a=_>AC@mNvLKT@lH;BZ zIp}!Bak`I&VEB8eJhqy(h5T3&!*Opq$sEb_9UGIydrqVKI(X|;vq#r{1M3&F!6qVm zMzUZ~XJB%(ascC|4_eN+{g(B!raMdfHu%&|;|I#QK@kM@*(OxuzB5_`GMj(8XVc7VsA&JV9@ zlTQ7Y?viCqci?Bm?E&Bl#^T#WyuCL}I**Z0lsn{i@5NT}XTbRMIRVzb4E$R{#3$PB z^egz5W8LsjLAzL_;~kwXIe6lX$~W(Ebp3d`P;EnSXM>ED&4FC3!m%+j@N~ z!>7B|JX5G#>l%S3S+lgWW982QM`6%cpzHqt2=vQ;DfG{W-w^G*+`IX@J=rOP$o~LV zGBLo%PW4JZhd0*}v>q7nAH+M`i7+8Z^jouqJyRP!G1IL$;iu9p=&hV#=VvOhUo?4U zr#G8+R#^t|!;Ex2^Xp$p{{X=<^*D5I+Q!n&*u>hdg{ay9ubeqpWL)E@#6;kF*A1b5 z%>FjF)Z<&`V?2f`P64}`QElQsRt z{{WL_(g75(v}n7FNwm1n0AzQsM+Hi1tX+?f;!J)PzF%4@taVSSKEj1sW4bvJnUr9K zz|MbAMtSQ~{h3*Zmg69RcK-ko2aKNo0Mesg;aC8GH(`%KkIJk>=1`1Gj;afMz0X1o zeTMs=&bMS{1uf<#<|81926BCI=xI{YIVMvk@13@)5t2__`;2~7De^bRpJ-KEh_k8evQZt^o zt3&}36^N-`j?JDA>(9MMJb*J`fLDbL&=0TUNk_S&mCRjY2>$@H+%!8_Wd;UECz9We zFnz0r@YEt-4;G6m*E+%vH1;M?r01|DYte6`Nu!ajWgy77AONKM1JnF*UU}hc~QEA(Z)q?H!LypQT12+LXNpqaNlcn_3MQh6hw&pcHi?6J%* zi3caDgjii}4!&6qoQ$`xA6xjmnqZ`0@ro!St?sU1;sDA^TuyZX}O) zk-q{y-!?iP;8NXPc|;3uEL=AwLj0!(fuBmH;#o`@jpfP+n|N7akT4;*>Bm9|Bk`!^ zHcg_{mE1S5yqbEow6@tUpqESzxFm8w2a5Pt{tB;pW&Nn3i9U6M!&-DmHe+CCoyhj( zv+K=$)8TcN-p1R>nFp8}d$lJ?nZgwc9?cgkt57PqIFAhfrwLM=1=0ps4RuZ5u!yp4DqxuuEqT zZI(viA=briLk^XyEGt)!e!}O8fM$c@j`^PV&QPio@) zMQ&obZdeu>emFj#jdhwHptsg1WRdaI0h8^K`PLVS;8mY$ZpKIel21KoM`d4rIvjqZ z5q$IqIUtUPvsF1EvJP=u7gGgYuBzGlr1tkUlE}gG#c)qt*F<(cZxwER36dezoB^B= zJD=%V8hl`|FqJ)lJ5TrEAzC2*E-R%aR5=(x~i;!N;Dexnux01`W96 zjPbUf&?rDo+#W$Dqm`R}WgFNGa@}ZF9$~@Cx5z;`;Qs)gE1jzz`g#G30vVZ9@IV}| z)YEq&@bWfKQ`_;Tu!xVH)MvODAC)6ImnJ37?2-pRg)0u@rd{Zn2j%<6y(}siosI$Q zG1Kv=9^kfE@(%;s{Q6VYMq~#hD>oQ4nz$(vNa+)A9|JPtmU4(-j3 zz3Kb+50sD(QavgSV$1gOBSd~&F&u!n$J5l*s_6W@XjG1ds@b;e`R4^k8O{%=#Vm(l zDjZ;pU=E(uE-cVt_djL6npUmUa6v3fv)udI< zdewO&<|@t^wtzA@9;f{EsjT4v3(QXQ$3M^dR2ESeahAd9liU1$pN(iD4W>AH0ne%b z02-;gXmVkp%=wt`RxQOBX#2ZcpKQ}hg@l2gcI2L;@t{eUQXG(YDpwdj^v5_&ufybw zj&Y91{A(7@+ak0s*>FDYa!+yer>hlwmM1wKI@1G~WIKl)26+OMg4pQH0pJR3#F2nh z8_NujySs|3ESp^CJpPq5vJ4#Z%h%A<6U)Ev^HhkFvKbh_>)VQ+72H50ka6iyBLE1i zcEjZvz#WO}nix~FG;K+?4$K35-^bJ(b|2EMz=maSHB4Z0g50;YL1GM;^2>b3190en z`rWGMl*c&880b&USsk$|$#Pd526?a0^YLd@@CUGQVTVZ4;+R{ix{|B6aKm*j?A(ujm6LGiZL{-y>Jy$SO(Vd6Yh6AM7<_57xw+I5 z=TOkmwChFFL6EG$i^(fSzsAe*?jW9nJ#(E6^v2#vX12IVV2Cq$(X?XRb}mmR>EAWX z{15Q|0FHbQQFXEH!o+;EEEvyp!(i6kyYOpxRUEy=d#tdH-Z*={2PmFJ_ zTIfw6k>~Sw-oAN|E(j-&Wdi_ouRf*j+B{BK9><|P`em}-UBh(@QwKg}(t_+Zjw8?9 zL)RUDTKBJo+E0MIXYg112jf?Umh52?~H{zcsz1IuZ^_ti+3I` z@fEd)h7sQTQn-%QBU!_J<_b!wCt)X!ea(GO`#@^T`!Re3v(@L*tuOpRaV&aWmAKUn zppIth@xnneh}SH@blQ7YUJ5QzbC$!GB3}97-WB-EfAB-aI{yHNp|!X1mxsO`#dB}r z_-rkj-O}N{MYy|WVkTums;Y2QZa6vNp9}m&HMfH_om*A%?yqhmlH%bN2ty%bx+GrM zITi9x#b1j$wu`D?S?T)A*bBKDX<7*}H15X^%ttvVgX^05f5RH(_ke$AtvdTzjgG0L zXcAmW6~_$|0ACCU7(ECbdJ0%bPun@mV~P$^=3Nhse0^;lhPSPFi6^?Xyt>upo+LKg zRh`_kDSQk#7|7)Oy|Z4eru=U44~%{dSon53D`7sevcqe+jI5CkUPc`-LJ|NRa(m{y z@5Fv2)I3q)S;noXE~lw#ir#6EF7_|S;2tZ{?z}PK=_Pv~6YF=YYo%JVPd&5*%PgWcWZ1+N7&{kf``eCAMRA@IyS7a$ zRlBjck=Y?BYdgqZ-%g0~a~^ZN@r-@kb*^Jr@eJM>@cyXtUTRv;iFM0_j%UL|X=7$k ze9@u*09x{N+&_41Q0h{W?((k1XcPi+px~Yl)MW8XX>b$FF|aAKJ4*b`&u_2vrr*HMV-~VVt>rX; z0hK2s11Iaj>)N)8y(8lsnyYf0cNuM};DLd-l~Y6Sk&_$m@y#sIL<&P*dA+|@gK+CIvXh=u+p_F)mPo+%{oLzF@kZ^o`7>)%~*? zj+*b`!7q~|TeZwgz$pL#;1a%sXZ5c-*FGz2a_VzQr%i2XCBy*e)ch)qoo6}>Tum}mT?~8ws%3_Ax=2$_}0YJ zCY@^;1!uUCzUT^gAIx*!x$CWOOVD+oy507lrxS7-F+A985Dowww^RAztLncPyghw) zGwGAwYKV`8`yQU^gaeERY-b0Z-SbTe#r8TVH7TSHX8R<8kUIkg0u1Ava(FoRBvrLY zVu`NfM^|(5i5DSp)Qt4xR|jwLIkhXKk4o_NsE;2kZ*L)uWJc)6VPbUsE(=9ZMDEy{na`MdVK^Qwu6dzw&(K1~-oh&voU26sHp(*FWfyn?Ry9OZO4l+T` zduEqh3!>V}bb}a~<93Ok=Ge--4@1z`F{k`NztYiPSd&MQJeM0*7l;xDa0cVZ2RQFo z+Lw=YtwflvE~8eLBXm&+n{Gbw&UtBQ7Si#E+)ISay+&&lxWWb zYAD9+l21J`Ptq)TtANgP2^2m7G84Yi5jW2gjm zscz_ewifq7i9}ac`Pk!YLK7t$1Co6QI34mTr1lVAT|9Dr@;Oz3G4r^Q_i@mDKMK>Z z3ik8cGYHaETqFGXBaG+QBR-WzTUl0E;si8{!CdX#j=YZKWag4%jCDER2wFyhUoIqe z^0yE{+Qm*V2>gDP)mZ8O0NPf$(*#Q-N=ZzEkbC`pzV*&{Zp>TWHMP6pBMebN>IWbL z>CZ#hS8L&~2`a2t8i$B{8>Xadx!!xmc0t?_ig@pu#*DOQb$DH)6&aFE%Y~g==L)1M z^V1{0O6K0pR#`=|L{TI-Wjj-LdH^^c{`Kx_@Rz|Fs=;;QPl@^#!?c*}6B~)-e)3Ka z)C^UvFX2bR8x2vWn_1GeiR8(Dw`=@LN#hZyP!Fy;isr{nD;*dZNhZ$#y0u4!Lv=h) z5M8-xg1O@zj&cvBY-%1HxbbcLC&RW{uBjSWK+pC|7LqtY$k+;wtVV0--w$e@0`SC% z{{RTt@Fj$yFs30Fm&j(I&QR3|NwqiG&1q5jIY(7n6s-Z#?Y19KScZPYZ(cpHq3jCJkSw=^%=o5LD) z{L*XMp0}%6!)^p0=@HvBZp4;p9WoejF^+wESJD0${fvGl_^^hw@S^E9{!#w`O4aUT zwN0mz*>C_+_048@=At-{;=UXB&?Jwz2(c$B1>m0{8|6{@&C)38g5>L@>uA6;7aS z1fQ7oKDe!G?-qW_w^z>kM}j^qe0J2K$r0OWZ)XI}j2txOLW9_VFg~@nr2IRFQnZqP zfZ~e-C8TA&0}3nvaOC zk+&GMZ8~0uo*D4FPfkAyz2W)%U9M@nJSp&l#FN-XERXiBe^nZNwYsyGP^#<*;NbPn z0j$p#{6z82gQ{Fvc-!KShrAY6KrVD|0%?&v7V3INlZ0}8Ll(_(7k(7*$HYfg@kNJ^ zej>WND7oa}h+0*I*0!Gzyi=rFy8$#B zbdg&}z{npe61*G?5uDdtFexQuVJt_P=-NiF;)rb_e}rGMcZYO)Wnk^9d`j_OmSDl- z_e+q>21&^Swrl5~+9zAq^*`EsU%mK`dEg1PY4klO58$-hr$ZQffgC^r-@Q+pdlQTm ztv?(56VrT29lZWFYt4Fbc?_WHSJU6W`oW9|S&90A#b*3#@CCnt{y7LVn-Qi(taxJ9 z;Q4Ww!?brYp^)*9y2?E(>9}T^qmPfw`R*j2wZTn#7`lzen-=#|A&xP$tK^b!1`mHz zRkZg-y3WQsa!Kj56UiOVO4zs3O~s3uqsWwGh5?Q`U~|F7DKu>zX9H^l$L`8`e3P7> zdt;1O>esSABX@5>*3o^jkpWL9J$~uIIpF$}SNt`grlDhVed13&W49#$jD=#u88{sJ z53O6au#RIfdR$i;W&C=aAXrNvWOw__RY7d}fx-IMCN6xb zGq(c{d!}by+eP9p3o>|R=2*1!F6%TOImUaQ{GLX79M>}ilN5`7NtzUqLvlkL@<<g(xcAL#D*)0XmyD}zBL$nF z;f^@(QC?dWw9ClE1=)r?kH@|^7_Ujzc08p@_C{rvl^@&f_D31tEf`hHb~jQxbzt&xZf8{w>rG?+p0tf^1faHtg z*18|rj&^_BBjC!cl6jK&uHj-PKbM^%{2n@XKZRf!eBG?3K&mzp08$4(=QX|iIcibZ ze%F5nr!J}!#nQqtfJ?TMeSk-%27a~XX3}p7QF(rct&`J=#lf!V`Wxdvh!*`c?LH71 zJ4k?Z1m#!_qyyIk0CQU3v%iLfEpe+)9@ddeP`N-tC>)F)$Jg4t-rD{AOz7-)Np&Qs zjh zoZyvAAt3u_zJIN3cv4oA;r53wmooW!Y(IXV89*t&JX8P#vNgHf=2~9ZvcWniznOsDh~>(S+=HQ z2*vL{eZ+vcMIelG(DRxbun^xdUy6D=O)*{CebjrRUAxE#1{9vT>+6b_#g06SHH?D) z0NN2pl81wwlk7O_+No+1C;Tk^1Egv#ZbFqA5;x1yk5%c?ulUW6*-`IN!!^Vufa>SX z18DUpo_*>7zi~K%Sxm~mIopxTI49;H{{VNrc%SWGBoNV$1Od~Z*1Sjdx`jmEAA4f{Se8)^FaS&g$EZB>?^@CL(5kCJo-e6h zLk@@I6`oOs(&sxuouC_Yj=Y?E4^M7KHRZnxjO%r7rNf4?i3R8FhJ z84U|cWD2A(Aa@z#AFt#p#*)S1bdz!%S+_m zwLk$=joD`GF;4KDc3vbG7WS(ym3pjYg$$x=d$0yb+;CO6?OjesmF&!YekHNf-0oyn z{m^rcxWNax^v_O3WayT1%IL8N2OGCC^j~_{@zQDj9=*0rdU@r)m3JF!S6I>|VS~Bb zIX^+ytxe%btS+n`ZwB1lOErp*v{~I1Hvk3x2VNVlJM&AL4Pvl7NSn>GYL~`)k z#=mG}bAyLmb?MaO9MN_hsI~D>?C=JsvR5a{hjtg78B-%Z{@;arBHRhiV=@BRko>%+ zM;!P60PEMy-xK_2{j=b&5UlF#W3qWvC(OlEZY%-D++!T@E056s0N|qfMdg$&ZKe3) z&LWE;M~2ow2~mNOAvpEN0M~_@)r~o>W9hP56Riixwm!X<;f{R9Sk*@@w;B4L=jl}M zBxqy?=V%2o0V5;u9{ojp*9Yz4V=bVbC)c5Eps$^#M<`CjkgY^Nw;q;8X1mmZP%|OX z*lr_($Zn_Cr#0mLZl817csi>~A3|T;#I8(^k(}TXa02I&-%kDcu1mq{&*Bddl-g2D z#c(=j_i6$E0Caw}|QHkC=A@u6kmeBvo}RH!wL; zgF8kD=hv-#;Qs)(6@|PkQ^Z<8QcSxaO`P%DkUNfqVy-{!*P##fy3dE>#v3`ASx7m- zQk(S_CWZ(Eb~YMqaBfeT6zG8wU*oDt6l2j95-YZ^UsSMf#V+&>H^v(oJJS%i9r ziS;B_)8K4wWw*-#BdXwJouQ9>5nfc^wziG79}q7Lx;}+yuvuvEpDN1V4Y)}04EfUZCP&XBj8=7Pt6D7T!(khDnmvcc z-xt0WXx3NI>E~VeyR2PiDYZ+YuL=#yaSYA`QHB74A0J^OW3i zAspnN!1G*^sUy>kD6WLgUs@k)*XF#{F5H%BZzg%9X8d|%o&dnl6|187!Sq`|ka;&2 z?EYda<$3Rne+d}pwks+thPYWU_%DV~8@31C9-j3pM=G)ga*S}JI5{Jr_UdaE@42D4 z{wj-7Z!b}ap|_VR;{>h=<2}IsSgO~SkWB=iVY`ZLrwR!u+#DPO+ann@ogng?7$&z8Nxbw zP^k>0$H_n4&wsCK!*F6kVg;5)-MOSV1DpYm>0H5>Lj)w7( z=pGq{7J&+)>{MV^XymsecjeN$oh_EZV<=HoWXhc9JPpKsbBg3VJ9fv)4jFJc01SiQ zaP8PvU7*PKQbQRJk&LR0@CUz7P1OwAEbBCT=^&0jEV8qMj!I;7>7Rejx;qU@XOPJy z%)l=!S=bB?zfa1!tvwb?fxM2K6&!Jlk8{W8Q2b!=lYBn-XQf+#P7g5;T%Fauu4T3YAk&NK_SK2yV)Vd9w zhMA(?U8SCr0@}riSwaOIoOI;Z!#@CHLGfci7mJe&#g0kLY&vZ}#mVpOUvFDDHw-5( z3jj}Ice6FMef-}Wv>Cflhf>}mJcHr7ah;7q$IXiC^>daTq)io(gvhHV@vPm62f~B|d zHm4J^eY;YZ&0OHz5L9&k04BNkd`n>@JB`(`kYwx^FtHwh;j#Hu^Qh_bC!8;$4tVSd( z8bTF`4Y0_>7AL8}9R7UP_k z^y^X?7x$YVVaD!PJF(ZEooc!>kKPzvbA$zy?LvEgKD6&3l5n!98?ah7+Msnlo|yWI zE-qFqjM7R+w}ij5TR zK5v|^26lvCJjDHs{+z|XD?b{;g;7TZO*d0gYkm4N}Xz~m^#bJOsyC&Lbrcu&ERfUmz%GN4jP zJ1yn;!5z8BrD2Qy42@2*IT~HLkPZs%+s*;#0P{c$zdz4^t+GYkJ1u>Dm*$v(CPB&l|jhgitatJ90-OrD9vg?|Sly405IjDBmjc(>=lU z#co+mJ)O+IW;>EbK4LQEN#OVC$7+c*30Q|xzn1?1K}MD0lHw^sNAm($5t6t(V-$sr!)8F^+fL>_T zofr624#z#}Z(~>{VqQ=7c99?|&Cmw~V3WZ-arjnk#pIA_k|Zw3k{{kGs2MrxN7ujS zT@I(K%`=;QQN-}O^30fM&Mr&rip%x*$ zU$99wr##mZ#JkyMJJqpfQ)B2 zKD7cJvJdN8MQCxR#)Wi9OE_1_)7GLL?rDD z0A1MY{VS!pwqqMeirbO7=eMPENo!;2uy2|OyxJ7D4%c=HCQvfUt&ERT>s7U8f_UU6 zN8F=v55s32G3)JC^gVG{DoR;oVYe**08VP3jY?k2x-#pY0{}2bbNK#rqP4NnT56md zXCrxUwZk^zrz3-q2le-=vReNDqwb8U8;=Ba6)pVI!hT?^e(7&sKl=3*h1phNI0abp zE2CrQ8ghPRc$}+kP^X?T(zNWEl?Fir85s2SHCF!IEWwbRInDt4zx{fBoaJW8KQ4Ob z6*9Dyjc7McqBH|L5M#j|M{$a3mI@TB=awTG_NfOBrd(i*=%;-r#&t%n&WfLr)|u~Eq)%N{T{79@K6(_4cg2P|-M zGn{(Wg_(D5IO*@tv8Wtv1Z~Oe52y8~70P__ahzucjfq`{?<`Ifj&gCx82)sT0z+*K zK78 zLny}MlC9GfGD>8R_mPA0kC+VmaY-Esv5=&pPsk1cDx`2}p@{^Ypy#0H^!zFE%#pY5 z*mdZqJ-hz^g)lzyrz?zO8OI*fin$X4OAy~77&$#f9!q&yjnskny$7c~>CV3>3JAdF zm>(Oq00VVX)9FE*cOxIW+qB`j9QxDMT}jI(MhQKKJ*pLQW*O%myyBU8dG~+Cw>}B=gUC6DUQ|nP6Vxy2fGf|8`C!fcfvkXB#X52_T)`{|?fwxv#mThgB z7jAj=QIVQ)ZL%Dk1HkQ(N)&=NfJS@cKTQ280)aRYf-%S@%IlO)pYgtv%i zA1;3{t#@`2TIpIw=`3Qrl#HSk9sLKP^!nE^p~vLP3O7zk#(3@Z=bGxYsFur2Ym2!V zSyi?=fIvL_!yU(|tY;^C9-RsiQM*UEe!_nc^&bRyE5s7$nuW%g+Lp4CG*Cj18S>F_ z)Dom;uW`qE`bN|C$MMaBuiG_!FHI&SjtHc(1zoY+wm3L!S<`Gxg^xBepJa04&CE`IUh>-Y;|e6(&cB)SHn`A-Qs%u zKec4mwxxBS4%$qSgDc4uTE9Tu}QYO}POMJY81h^`k`}$!1HQb~!UPPNz86Z?#V;iub56if& zXyYoy-77*+=ZzH1}m&+O&mnEn-N8a9lUH?l3FTA{kRbygup z9%%?9lgaN)(>z0|cyci(hqVn(#b5ydg5iiD`T|Jn{EcqI@xR6q#F5Fa$t|*Q-)(|9 z6~`C^mCI!R01xY3RQQTGpf1lOcHn z%W|M|@000VPsXp=^I!1ZwLbp<2zaI&%g9pZX83m|to3J~SBL9R zT-sS4Gy5`lMJ+rL;j3wiNo?9w*MdTP&SsrlU}K^A&S(mU^mxrP=!#(ZWHGvEb62k|#ygO7UizxYIM5>py#F%gBqkja-k z;A9+ve=aI<;j5)bAKET3yzG&N-)83r9ZwkMx<0gyFYM;d$5#7Rtu%gJyyI~yxda}^ zBehxZ{*`e(#8A%}NW_6rx8x}5a(OuC^{x$kEXy0O+gk~bxLr4AuQ}*IAB|WR7jStG z7383SyUk6(#ySJ+J$><1v1otUvPV~YWhT~+{y!;9r2@!E+Q+X>N3A|cVs?yNr1Byz zP^;n9v($cE8syhcx`p>#-LsjhH>Z&IMoA zqu5_jXQgO%XfE#V$TK`ccKKAXW7n2FG3ix}&CI%;+^$&3afOrs06v4*^P1*G)~xoD zM;+bBB!YIzb0<8KdVPDEeY859GJNx_YE+b8G?pEBJY(LEtf2aok3-UJrLxgt^L((X zrJ6NTK<61F8E$#1lH6ThYD;k>Oe9hY5Hdo0V~n3#<0jNEWqAJpw6!^v;9%q>!P|m* zf$B%~tt|_|{vq*w#ym4?s_G59d}bGsLge(zVQ_sjgI63}Z)PWfm5#4n)8(2p-xRq< z^8xvHbN>MA=kTn5C`Qc}l|J`4-rTAWLGApje$)1I@w~AmhNA>le`t_m;^y?S4S<&o zw3f!-;T=fpTXvtamGz`n!uQ3Z>0&$PNUfxZjNp+QmOF4e;Pj}ej)Zq*#|0*nvCin0 zhfA=zxoD(CmmoW5AbvDJAH02~WJuS1g${p&Wsf}L+ogJ+hkg!O zcy&t8rdVt6ln8#^tll=`)NYI}!^UyfKDFNHhg9(Gw$BS_UJB&VX$ydUf8P_f3qE(Q`+21a`*=-p;&d>0O_Me`Sx0zB&N-Udr8V$SuC_O_;{21~N*p2mbo5s&lO^ zSsum-*(2snfA(mbM!dSZv+-?>!eTSijv#C{)! zR)3j3#Vag__1bJ5~tfV#M$; zPIFu&zqMz<&j@(EwBG^vd&Hj_?{Esem7Ug;3UQsrd$Lwsa&Z_qC!AMRB`B*%snc?3 z^BDgCW_?cT7qd?gcw+UP!BvXZVLTpQ9S*J|=jF z;$MiPXn$&d+G^9o_R^_obiWN;t*nfsV3mr<2?t;K=noxhNhL0Wr%l6Kn#unF1j_K| z!<#46{yAzs4Dg&`3-0k2wj_2?dHvaJ2FW8EbK0{S56+Ed)=fa`mBn2Xpq~6Ha+QvJx(EK&=Zo^x6 zSN3E5lT%U=$b6gs02W`!>w({8xMla+Pf=Ol6TTpPbU*{u}~45x{T=rhLl{{RnsT|3Y5pW9e&v^nilc!HReayy$q2m|@xCg1gu9w1pv+l2V;v2bc?d`0gHnDGMm=-%p z!DSzNJ^kvH1dQG(?v765;-|$uR^4N<@pOI{hB2|Nyg8)7r=*L>IeavY^xe({aULZ2 zM4l*-W%!Ax>s}+4PnpiAeJ#*jkC$S*VRMm@iu!X)_ycJh2G?~7=RkgKi{+D%z!>kJ z(B_%(BjKi#;qQi;r21v1XN6IG=VJ08ILQS606%KzgdGpkZs-1(Y1> zPvOLonlV3ucB$F4C`*+kPI&$xarLjJ{7Al5jVWUpWq8Y+ACW_Y!R&qO=TG=4Bx6ne zq5dCST*!XBR9*{T+N z{K0-i9WsB*K5q4}S%g*2qr=Ub-uO72^kZLiTI zw%Qr4Jj^RE`#Izu-%e^he^^~bn%_%4Rg^7&6k%oCfx#m<$3yCBPY$GdmxXmJYuO%O zDX|lBSRJ5{3F8B|YRy8?rX?(PoRCI%0B~`^tQ?%>?;R>C5VS#*tP&5GYAZ60!<9Wb z{W+?aB-`98U2zhH7{JT1Ib0t90R3vVh$2-R3ZWZ8Va886$8%J*2lJob5!p^iPRN8F*)av=zaeH!j?29PcGe`&Rif>8@W9= z?kmNwE6DnsCDk*27_^@f=%)5)WVZ;;vK)w|Trke#_fHr(6)*M%k!VDh8iL5U-1(e& zdwOK!oO=FsQ&x4-d_8YzXC@iILc4zQ2Kktrbv*ucnAR}c$s=hM89ah>yPWZk zgFM$kdRit8D*3DwDyn4ppF!9ULGM^v<-+-qg-K$N4X!}wPfU)(kIucEH5k%b?syoC zL#p-I#B_U?2ppqINlm0?O}#np2U?oZGb;z4}MUB@agxWyPaqGv^-nOd<@;ywcRGVu1JsjU>P`4Gq*)FvO3>%jE-n&GFd z&f5AS>X#%j+}JoFxybkb063_;8FboL$3KNvcI$_S$99YY{J1Y^cNr(R&iqu92MDI$ zbFs-`)rZr!9Q}B#t9CZu6uurc(#ax^9BD;DV3p!do~Nny99J%B3*hSM(Vdx8*Vic| z`lITv*~h};UDYjEs~c+xE**yf0rOjeJ$=V|_c1GPaO_6bD#}z6qtlPW^{#8+2ZE*0 zJOK%kE%!5A+)i6)8*?+Z4?O212hzJMeK0Mm$$rq=tDl#CaNPX4Bd0yj75Q6d>YTPY ze;!&$z6#VDMKKMJ3byPFY+-^4^f^nX>n5-@Q809EuEter^5OO~lgtD|1&ZZ#{Z6+UG+c`!#2fr3v=k&t-j@~Ykf zd#EpUWp&-=-GIyx^5!v~dJmTv&o$?>e&1gQnQ`Dh5?pxd;z^ZP{t)c~`@|4AF6xxtI;Z8LlVC{{Zk&$-Wub>XP_(!53O0Nhq1_Jayv@Kf@N+Lm2Z4!}g1W8%KD- z>zq_dyi1N6q>p>L(xv|Zg~{RNxPcuchUhN*DyY~Pf$5Qq`_=ydh*}`M(xQ_|h2)Vh zq4UHjWh3{C)mJ18XD6k8Z+v6_0D{rm8#raq{CV)BOVsV0`6I$wCZ*z;Vq^RZe<_L- zCxBVw!SBU+&&D74DrUW|_+ss@^$(4HFKM^Q=y9ig0DmWFlpZ0j^>tB`LCH=HKPvUFAccA<~_j{D=2+76*sF}20e3=&~>lPYkv^36DLamN9^ETz#qNAH@TX3*vSBUOsUWzxMSMOm82jxQUcR;I zUgyu)z40pUEBN%ydrogI9cBd#P-RQ)-PHH!G20bWz&uNTNo@V(bjG@mN zKyWt?T#ntol+c`XI{yHRngaNL$CJZh3yXV%`&?~|l-zkhdyV-&L-edBEYYINyt&SN zzf=7G0R2_bc(hC6Z-!cat#K@~>KaUjJFt>-<(wlDdLQ9GLtJyRSs4r)kP-kS+e8hD(SKTCv-!5`}ef@v^RZd+{&dkgM1NT7aeg6RZ_42&O z*}N)!PpIYbpNF*>2ig2%;c1D-{JryzyGcA}1N5i9uc9!5OJ5N9U4{sahM=d+8SMW3 zaoWCE^TRVMVe&c^=sjx1)*nUF%xM-B&N>X_us`SCi`>RoH_@L@`S!0XM-H{&`51J~ z`T>LdIUPFw6*$wDbpHTDz0f!TU;ZXhB(6{f!m%eA?mG47(w!8o3B$k0%owWUrba0Op>v3; zAf5BVg5i*C%mOir$tC0Jwq)1J8i{ej{CzT&u)a3MshZc;YjJmdCwfzWuyY%Kb<0oa?I{rcZj2szD1ppDr$;L%`hNr8YBSmZY85TGo z-rJW7r=EkS9na@p9q_A7Z;Ia)!0|ZQ6gQ1|D*3yJSo$CXj!8WGQ?Y91pTj=~$Kj8R zehrS~Gh8x9CHly6H*Pz!e!TrF>qc=FqcD7qS$SN92c`$6E9Ol@#@a7~e`#ZR@iSG^ zyf3BM+DWLb_OBqcLlTwwqDR4$k`+Jz=QWS}ME?N6XFeSKDbxJF*|S8S;(v*!hmBXn zR_|ls>p2c{<=PM5UXg$@#Umi(6VjzYvX8PnN8)V<;Sa-$pBnsj*MH#}@LrOtvtKwZ zaj8thMdowH_Mqu89k2z7z2G$uIV0q1w*# z@Kvs5WChq0ji4zbac`e~J^tJu5x;4_iKE4z8nyAS>X2`a!YhkVwmMWT{{SqlEmVl$ zKmx8nE<*gw)$1SdO-}|7+Jocvr=xsG@S=FrNYcD1t84ODLE=Nb$XYq=zGf^HY-0I%^s-d_kJe*g}hPlFTzoL3h-ye&k%e>o)oy(?8n3j;C(%IW^K;X`7El$D*0fs zEV=$7HZ?EV8^9WFpQha>hwXd}`lgizw{2^${A6a;Bea+|lW_1f4dttBeYj(tt?5bK zY{_tr_B=;M@bJ9sDa*`yL#!Y}|EI9@@=T>cf8srZ8G9}2zAq&j4m3dhYa zV-u3yn1jh252bt0h(BWsUk_>wJW+ctoqE=(c9BWqi02OrDKW~R#y2D2{M{>-@$c-L zqxf^cb88yp+SRq|T^N?pE+VHFV?2eMAR z*8c!_`sc1I(SKzr{sL=WJ=HEh;G!Nc@t=VF8)>Ae)2@6aYv~i-LsFvv|#<9yj+MQjqLok zXYurH1LfAJc{ZIVmtFBMwFrpsY5kyH0$Avd;>y25*@{j!DwzXBI%+)2>`Z7=2H^t1dq}M2>LKEb> zyj37`$M1MNbg2*RE8^IhL6Cm&i1{@Ov?OD<&)e3%c(MJb^ywtTo*KOK9PK4FBIW-8 z0-PS)SI{2?J`C#r02w?LY2qDILGc%b^esUR#h$6DX}3$K-+;`eEv`gj8Jp!KfceKD z8ds>giPKxyxZkx8ih?XxDI~EeZ0^*qh%Jm~X(vC{yFb}S$M>Ez_|0W$bEd^%9hRMQ zaGp)vvc`E;!mE6!NO6JG^NxnLJ{*6+I6PVLSK=>+G*1d&V$;Q1YihCU#?t5e8&8OF zw&vuhUo$&Gs-K%YbT#W&AMj62Q}zz{yQF`@bMX_yelOL0Nu^6Hc3NJSb7s1Hak}Nq zl1S?&Ndp6E9C6KMRms7o%xcCe4Ww*o*DW2eF|O2zwmyB`PBHC{;-#MDg{vt-4oF}? z$R4NEoDixUGX~_Gj)&`v*34{5$M$`J zRY<_jMsbe4yH;&#R7;I>l~sr*&+>zhlyi)F{xz>6wd#Gc!5%=d1(cOJjE*vM&Ozhf zt#h}+SXLrPC7AL3(bu<3{{SjmTj}7GJ*!Ov1jxg34?Lf*y=N$$37QkeW>E7c+jzk) zTRTUnBd&j)Q?=ynw@k{XdSob5oZZA=-01dK2Hxn0`#h}0Snpx9_3eY&zba+XwT)*& z8l-7^C57CNCh1p(W@5}&@osU&c2K`7x%QkP8`Yf9cyj$Dv3PHb9mgs`$sB*4Du%Oc z(Oov>AhGArf!?ax+(}_|^KMe72aJ*URqNun5i5rzU;=uYrmXZoNQ{)xO6DM91wsCm zMn&ps^zL2~7a?#C1yYf5l4{~}Rx~twos$EBo})bH+Pwo!*?DH7M8J>?ka9=1Yt3w% zWVy-d+PmKj>MwC@5R@ZmQJ$u=sT;G_z}HcYo77!cC9`abJo-Z7QH zY=8Qw`^1*&c^K(P(W{Xu+(8(~XLe&e`BDJ9-?_95#1jAkagPVl{u1 zj+=*CnA}Oxn*@QL)eEZoj2?Zz3RvSZH_OQs8{+1bK>ABN;q_O7eybsB#W*p8oYa9WZ(l$jc$ZbH+wE!5;MkL^|h@`u!=& z3lPz$EIp~o8mR(iQlpRa@BS2QSsX?{=gTVGW1ju#lR1he5-8jbI#Zfms&@9`qPe=- znMNf0^rsbeV>Y6$$Yi_O(>{kMny(=9n{duE=|MhYlEfUIeW~%LPc$C)WQ zk5OQUob(EN^)+rYw*;xk<0G14e4uljasL48rz#v03C(9I9dxO3B4lp)&!YO!ASY(fy7d!r1P1*G8 zPl-Nm!nN5Pn#q=Jmtn~Sj=1Ug*4~+FGk}5YL1x??*MWD&NJ8gV!7MtnaRd6=sQ-9t#ghWjP(Pj z;aMMkUQfMUHPq$B&rU=-*)fBP)UYJ{!vqehI+0Z^K{?Jnde)7sEhDNi+q`fy(0kIU zElR>d%_Cn+ht8ZC0FgkzAKk~l<6ByXh?7f%MLbI^gk^aEE<2Ia@T}`67Q1o_5sj+d z&2QWd3q$bL+}gB)^HS6;+BoggC(1pt*yEqirDJ>8^=zXSeFg9)D}6WMr-!Xd%eqTf zo^mh*MctbO_823I>?GAK7UyhEz^Tb7K2_tlzAJ_B=83Lo9vZW=(`|H1<&MrcRXp~I z$l4hF;kA!AJdSf#qVW~Ziy=NT(Y4E2B*&L6tZOtRXQ^c;fOzd+Er?EaB`-7N=RH}{ zU(T2IX>Bh2T}u)(JAr|?bv?Mvb=T3d+!Td2tgn}1+n0mKKgHLrdA5h+Eiz9NT3g*q zJaPHu%S{=Kjxr7i>0RBe+**?vG`CBTN6KJ)fO;R+xT>yIV1%w*wNq^=k|F}eNDsHJ zbKCGWEMc$i2il(z#M}2t7}|5(`wvR0?>?P%wT>p_;~Wk!57)I#J<^wq-%RplHYP^V z7#PSNtMAv7TyH~U?XcLSl-&oJQ)U;J+ojzI8p+><}NpN2abc& z+=`v9AYx^U%v`2GQUpv5*?o}8BfPU%6KhmA%Jj@KAI}x~pkDY$##SlXhxeXF;2Mp=P zKid2SJxO;S`Z>;`=^$86-)Rkb%pHa20clxNH!C{dnU1E|lZB-N4S zA&jNVlNidTGt)fdu=eZ7si1~w?%-yTQr0;+jXq#I?IY5eU5{` z)@cRqvgooh3#jeEjmUCif;{Iw?d#Tx#_+t->fRNKVvw|#SJ$(ZX?Bu4;}~KGP9y0> ze&uK%Nb1!&ZXH z%6Zyc*@>~c?(XDwUOC5V zARI`AN{?RNz}L*vmbX3W$K5$Adx=1bOFNkm$cRv*k>(TKao@k?Qd@YY^G64JdF=a> z5}@6HdN&-8QR(!hJ{oN*+9kZa4EDq(Ny`iXK5XwS0?7V1S@uAdu{1 z$o1$w>U|UTe({#S9BZa{Ygl+$vMy(hEmWx)7%~uX+c+n+cRCmBeXUIqmtMZmG?aGO zQf>FoAnF)}3%3N3*V8qhv{BWtY8WlUE#PRNjyca>-Y18CTQ(~T3fely z2Q}Mxd-ibno8lQ`Y5WCyYYQ&lI^tMuLas6$gEn@MdI6q;8Lwv7J{Rbg?V%-|h_F+u zK&Wh{mH~zipq;O|c>@Gv(yd;6BGN3&HRY}Q6mqXKYFA9|bI4XQWDMhx)2$N5H?a|; z6mXh1?1AD5pc446R@1c9kpOt@A(HK*AmEj6l|jctj^?{f8}?Q3q;bkMn7l`=J18u& z+z4YKTN&FB&){i?;f9E34p&}2Qt!aluGimp50l3k>E5-p-wE4kk)wJ3D6qCvCwps? zMUZ(TEZncu)-M%NyCM5HnmSj*eGfp3{v>`Ku!;WhD{H;}@Z>Y(OqIJY(Xk>$ugFTWPnF-%T43a2tX_=sC#gPt-LZ z7wVd3?+fYL_K^`%f3&xC< zw!KvuTpThm89(QoR*u!4&k>Z~iG^tf-Hbi|0EaoQU&CJvJY}wFQO^D*zt&)R;#H4M z)3X$Ae~D+51uQw|kU7Y&Nboo8A>yBivWabUiSi@IXABz;@}+rFvey z`yc!)_)HxB(jGVPhld&h8f#H}u+O-E0D{=Fws|?d~5>(s>{JVZfUor48 z?d@Iv0EPbmWB&je_~F&1((i5Jk}}?W5D8EL)qKKMB|Kx6=xdDCzCV0r_@8$J`~vuO zqIee8MJfHY65MJxwvpui@u!#wh6hr>^I5(<_;Guz>B)8bYW~uZJ*%$aX+MaJjc_nI zHnw3^i97?3YU`(jr%zO8x#+s*!oP-}1+Ae!vMw zg5A2;E`MtO0D-;{o6Gn;;2$0QMY}9fCu>#F?OcO^OtO_>{hvG?0Y3;l zDdVpm%N&3ip3!uhDVPI>XOMZUx&9@|BbwN6+Hc1$iwD9l4R{yf^mtgrmexm7yj478 z&oIV)4%3WRWNA05GL)emB+pRN{{Uz|+7sebAp8XQb>Pp2mQGY9(^$Rz+L521&bZkc zAHa@lfcUSXYkneU{{V)}{im)Y4l^!`W2`ZiGEPw~tOAT5az$}oCDJ@q@k-;&_`~B* z6!?LgDr303c%eW#<~X*e>E5T%{uWtiNwUJ$(%h9Bwjd#a9ZCN82b$hA8{EoRn8kaj zsTIe-uZ3wn*Tb)eUNQKCcL)T}sfE&QF1;Ie46W`+=dE0u;(oc}(GADL{{RbkXW@8b zn557|lU=sZbH3tky|@TD^{uEp5HGCcx6>>x=b4cFv7tM1K2RH{Vr#SbVen@E0L3~= z{h1+%SjMr;X62QL?T_+nSkX~t62wYM$n%|dL)X3_+&g?p@kfdE_ZwAG{{T^vG#mq; zCOxQg^!#epf$*b8@ccN_?CmX)WIkpg3epcz#(MRydeQ#?XWJWiqZ;O+adH6*m_Sv? z;{+aaU1x{<0i)=Q4Yi~VA`^oy;@d|7w{!=n#cY&ULnk>tr+{f64{miw5!l(!G=u^7 z3HiC?5;3^{h7a-HuNOr)u|jC3prS*c5W5PB!DI z1KZN6$7-Wny@}WNk;aZ27}^=nTy`h(q{&M9oJNcABTlygwTp?aRy=MfqCQVt1@F_3 zYP<07!g^(u?!OA#zzvnk7&pdS%Th3L>67c+*J_rEW!izDbUASU0K<-_9sae6;G~f} zN#f;{s;`|3oxo>yz+0Z&4C1kqu?^#?!UT-U{mK|jN-YB>hqG6HzyoMW)<$ie*Us#qFhwfFSM#~2>|nXEsE zaJA2XHIeVt(o#s=1GDVgy|79V)NcJV?M?9H9(CrU8Ot}E ztT4cEP-B7D>r)AmOL)WKoS+RDI|~tyn4W-VwO7*OE3RszYalBF6t8^4uzB7bzWvgc zF*LlX1OPgpVaTtaf8eK3D){5zUCs!KdwpKW$VTk3w`qqxzt#2kt?)YHslPE}7yC6u zOl@(w!n ztUU`2WayGJ1p#*_-uu0M2*)3VP357HvUjd{+%Q6(gb!ZT`a~C0esewS&Dn3QVAAH( zv;xl?f+wFOVX=Z2*mgBa-T2z7zz`KdJm;wuQ%;4Xk)wb!bl@Bnz~dzJ_swYOmh#`9 zD$%$3qvm2Tu`Yi3Jmc%$v%Q&4E=X&VZDTU!gKoehB>EBlG)v*@`=%z!32>Mv%zc>k zJ5OIsS48pKcwWsnw5=qI!6+I>9Y#Gl=LZ~C7O~?C$z(@>K^avcjDWnnpL30;u<9#n zbC)&ZVOpFNef^88;ak1Swi|cJAwjqRkViX*sm5{isye2fHK0G*5KOAzkaqS1`@_E# zW*-vjl3Rx}smkLbFbiXj20mJyJZ&Hne`rA)=aVK*2T$O~Ambm6bgH#htl?BBOW}H) z^wJ+Q_c=Sp?ZoGdbmQ8$JRfKFsowW%2<_DQC4e74cF)s18fLMeTWawAqe8jzcMN%I zcE;H`}k{{YsgGOPgxg^k(Gjh&&P9mx3%n^-dP3H0_Jy{nz^LhLMLjkbZn z&(02d4%zGL#dLRoc}6vnncQP;-Bkki)nzCvHnOb^1|rbdjcRHwRWFg8aM=pW}*!HIFVS zO`4Vx{LbWVCj*j4Z*N-8aoqGNy%Mq4TPT*&09Ho?F&B(E_ zd#jd<&&DHxGS0-X7+y_Lxz{GXXC#A#$lRGEXOMCF`ewKf+5=OX!{A20dG?v?<*}O9 z_s_MJl50(qD{od)yNqY$IpVrAJTEo|qW&W38tU42gtWlfVmHRpHQ?ZbyUE7iQ(rcGK>q-O$u^l4yvO2qz<&&s4!2r= zgS5Nvh#Ho6e6E*d#Txw#EC=CVn|iEzAB!$qR`E@~q2lY-{p2^A?fjRQ2$|z+Tr-s% z0stbg{7dm)Q?{~_4+H614TPu%&*hnzF+Whf2jSMgo+{UIlZ$8cRVp!*RISka2jUO> z6`oHXi;Gsj{i8lAMI(X+x8gg01!TdS~| zM~Cb!0CmB6+E?06IBWnh_}5e74~n{`sFv}|c4LltLGt2-6e@whI2mmE*N5r1W(&E# zOmVqaIPcf#U1pu)8;idnGUsE($y1Dj-1V+HvvHQ^RT@fBPR5?49GbX!FXxtYZOW|D zwm=7tGs23)y3t^>i^>qE%ueEFoI8B zi<8^w(zzuz`kj%4c1TF=qFbmi3bIVHs}H;xTr!?`>Z6MK8^j;*P%nr+D}u~w{v^41 zVvu~#rQ2=B0^|@mBLlA$^X0S`S5v5tRe3=p83zRa0F7#C`c34s1ArJ7`Eh~(``mOH z#czhp>fqDmIk9<79KziF4{_5!ZEqYs{3cyW%IsS|np)#Yg^1dF@&k`TR0+qCGONr^$oDYd}lb?cl8@%=YTnOfmxh13XJ8@^rO`X0b^;<;^S zN7SM&);>)0Fc@Phxg*z}{j0t_MPI5s$#A9{R+~PI@c#h(6brYlb1V zOQuWv#6QA9vBr2f9S9X~SN*lMd#zsXXVH8ri7724Yi&GY(fW`+VopKqIIo&N;UK%S zwNWOU1hS&3j%0j1BpiZ0NXBb##J)a)<5;|gKeP+U6t8O(C4h_L3)#IaVPSuP$)$vVGGZU`Yd^&s^8Z zmfBoaF-2;ss3Tu3BzDOw?g!Ggbk^OjSuCsP26A0goN%p!k<%Hf7jLuxu{PqlIQg^B zr)=?FW@VU59HQi{W7oT&*gs<6mjb!j9L5TSPv4tt)Q6OqMQA21sM$mB6m`@@bgpT@U1iL>U+Q)n4G zGtjs_IL~9nSc+i#9z=bZE0nttYjO|lFq^3IQ7XORzv>XUIfunXnY^xj}&;a z;5Y>gddgHcm5@i*&?&aC>{zD6^)V52gG)dmXaEE~R55kOTl^u{}UlGe+*+Q;Fo8qPmB>U!MK>DG}b;JJC25C>hr8u$anAMjDXiP!eOW%zkaNR6h0Mo;C4~ukjyJOV5cq#UAA!=(6I$9DcX)vjGl%pMuHdF`M;4ntl@78YU# zHl})v^{$upU-;wTUm18x+eQ7CJ|fNGABr9(f+?qcLraV8`h3k15?R`<)*!z{E4gHi z)xqSApl9fMqMvgq)>G7(DWQ`+uPUexC zJ;uIo@t5o^;qQ%q4DNhw{{RH>@wEOt(=3So)$n(SBa2S)UW*@=xR@f51^flpRWe)c zD%(_sA&7VE)&BqmBKU*w2U^oEB-JncNo%FDt*N@yC5u+mB39m4Pt;WTu>yE8%jUwv zA<*sCICWc7 zg-JCF6!N9yPMo8oKOuEHDYX0dSp?C`1GG}dB9wTYNd;L*1xW4)&3lLJ z1N(eg2ZRNLE_$FA~Fm=z% z^6){;T1HzQ<>J5iI3MDtkMtp>_>19R?A3o@6sp57fZ8COV+v!r$T&SK>~Gj-;tz#C z;G>_jj<@jx_Rjb_@N-|+wEbDUAE#c$qb;zpu!hwH5ulbv^8C3ZeVA@?GhaLWG5-L9 zNPf@W7SlB=Z;W5HZ|uFS>M~p*wYaqLt<9;kj4l~=qmaa$9Gsq`>FpYC!5@SF017{2 zzZ!fY_%-`d{>yrfi{lyOx_8yQS29mx@@x;~z8fd^V1j;NPIFsADQe6sIZif)_dSc_ z5BwAV0LI@FramFiVAQ9%u<)!JO`LY|TkV-*jfUdHk(b@T8Bvba!v4{pvd@VB0J1GK z_dW~odYG+eTTc^fiE8QP+M-Cr4d2C{nIAE)&2QRg!`k1%ABh%L`d7q{5BQTy)X0wA z{2}8@tN0!@RSe}(ltitb2SP=7uZW!Zhgb9U*{*d9g)v4Yr8(lZbSPeWYw zIV83o__yt0rNF>2G-?!rPw^b^Yv+F) z{?7?AVR$UmGw{j65HYaiQ-Qd{6vq$HrA6zZKGKT?d~lSc;w%4ChwJo2LqtSYdSEz z?2W56Mh;S1Bg{TI{{X>8zBc~U9}Be)4E%TafqCLD4~v+!AF?iyr`kmGqkN892oG*7ScY@ zLBnO$2^j1v;X9itEv9(xBV>_D1RlAr-bq2(vyz=?)rypMCeUR|eO}s0$V6FGliL{_ z*X5r?{$aK=X4>$&#l7o zlCB626^7tI+l4vpUc-ChQ{q1nd52EYELO@m{?4`;xRE+5V;k1#CTc9XYm4^OD+ zTG7t)MH4UzP;MiBSo7;xOj)lyxt-oakQv9!-nRQK%WlY%wY1Cn_^ zO3RuhE0;Mq#{+;rtxuS$N1>mvlg~rzP<)}Xcwb7@byz<4Cm6`@?d)oW$o=`+RAI0> zbpHSfxI3P1C0Qm|)1_$QZNZ8*I46b!wOYz--2$*yz#)&fN~vH$L%$eaag5ckHDe4B z@tzow$sbCYZg$~k`?Li^jp(E0`^r!G;*6^kyn;{gj@2Tf%`WJih66iD<-f+Fkch+X zA2xBGqu!wC=RyYC{p{x%>zWv#PIJ3=JoOZd`?I){>C%R1*OufSFa-?~S2G&y@#b$W5+c-&NmXjLr@c+O42Cit05F~%~`dJEDk`$LmK4&0G?|{ zOtlgdh0jj?2W~s_N>4zg684^@BUOxHhXuM4Pi#}KF$8-N<0m{|@;y#y^ZcdUGlDjg z-m^7Jk@E!rDeO8ArDYd(cDKnE$`|(rRv?l=JabXPxgMm`3G-znRfwYbPCE7ix?j4i zc`EfL?hSMizYh>WmoIH5k_Ei!|<$VNO2t0sN_TE8=a$TbY<(02ts8 zPr|Qw2S|rd@!p4M#o9^lp;ph`#^6Xll|{6<(O!JCbUsTq)^S3`;8gPI16oyGRp7f*AIy&$I^=Z&aOqUJ9)fO2(YHw% z)Y;s{JctV(Rk6-EAmo8kW>gz3fsn*=_X@Gkd>+-zufu&gZhYG)Ud8@qBTt>7VaFH) zr@v#;r?S&^jU^oD`t|<+npm?7=$7e2V}ZMZI0Gk~8np!VOqVuva!>YY3|DJ5Bg2Mu z135fkk4*HbZM6t2{?R;0sOr0ms{ysZ;fOy>8s@LH-xI*i7443TtHJk^?AHwq!vZ?8 zupv%IO#c8nb?=L0)bu@J4vDGRO>b$mJct=x*cDx@I3px|4SG3EA8CuGyw5u}tf}ED zN?nf5)u7OR9q4VSOB7N|YZR{2Ho#t8@;3wAllYn|Blg?YKjBdPEz$0fPdK{NBD0Pd z6d{RXwZSCvIbwQxQD3tAOYD9L96vX_#nC@z%|lp#P2wLIcr!?ipKr@{*AllJ?%)L@ zj=Amyb{-M^o_rbl{bC@*Q0Y1NnzpA6;BSN83h;i75^1w| zO73W)F4JC0mseYxla|f^?V9Mt{hx*Hl<2z0hAkp)7}^+vIs7?4{c73LZ6TAxns=QP z5wluEPniUHY^dl*Cmz3zK$wq$I@99|1wB+8SJ<`OJ{{+$T6$TyV!Q_)H+TEs$9fRuHo|$KMH9IC$`%0-ly&H}R=oc;d)|JP{y&qEXH1-}7 z)9hr?(K{A}?ThqN7xe{-qo3w?6jXJXo0e59Q43moU#y_#7%vgVej z6!E&gRBWAg{{Y43WF9&AY2myRw%baPwL8#0>nV};s37MJw2pcj>GU7jIkgLTFT8Dc zWvC^~C>I_n@gzbyLFu;EB1t~LbBtG&505_#{4X4q-wM1Z;?EpO8l1}Z%b@AFBOn;D z=Qc6Uat=FH?GMD?6g+OSNAUAN@Snq7KH!IGG(9CA?axi->P(y-ha;~;UWGgbDk|w5 z?zHE-KEUvI?0I*icxo%Z6Y9DKho$)|BS^1pq*{o%$yQ?16$7aV4>gafd|3UQz6ok; z6KhN3U1k+KExa+Lwc~CBo%gpJfc9kzUp@Fw;4i|PT+jPRd{WcjT#%V=7Vc^9CY?rp zKn7Hi*=wzbAzX#W5W>>MaayfbAQPOB>8SYXTm5?Z*gVtfcMm&;AY_f??a3n>aa$@Ab~BbD3#rpt zXuq?^!pB$s(D66KyYSlz=(by;cH=v)CdTvMa5bYp?PYtWIzjtCd@k^phG8qZEA45H zp?VJN0p*XC2*4kB^Hg-dhtWYZwY+8=?NuRn0HF5ALy^yV+OqJ8ypll#Q_Ul>1wxGX z`LW-F(zjT6t=Z2!OKU`NzAW*F#J`IUWB8fz1H=>B&+>m~S$jD&)_S)@b|-O{a!fEo2R)!g>B%48;Jyi@7wjSW$;&kbd3v3c(jc^&L)Ou z+b%b`1dNlrzCg$o)yE9Xs;Hr4<|SQ$l{5FrUW9R1bY^)jgZn>CEWx$wyIXyr?nui> zPz(%{(PpdI^j>sUXt^eVR6^n8bkc-lS9 z)Zp`u-Eo@hB(^exxz(5M?ZC@%k+>e**FW$z8sA&-670hvM>t{g;I?*;$miab+XJtH z)u#m~MBOB%TW`#IWRd87yVC7cnOwH`k;0N!gN{hYQ`hjTBFw~~?UBr&Z&TAgnH~A3 zNfD0W7U3Q+t%S!Q08gh(_CB>>il#3#$t1EDSjgM}$x-S*K~(Ki?0Vd>-7qL^g9ig8 zFvR4M!5-eVsd5`-G&DMb~zaQ={-#o zB~`+ll0a-=@w1Npy|}DD2qA;w7QYHFn9Xeqh{*$S=bwBG=Rf^w>3+~&eaM6%K4S&| zo_NRS_}4k3!!3`+3*>iMJnJaSumdasAm=?gio$3ObUU35JFHu@Z&_4$&oPaw19Q8HyAAv}@_<5np0P{ZzEPA zBadr70^pU%$vrysubuw@;H8Rgz90V1H{b=wif&_^2HLCUX_Kxo{_$VWJu7S+zuGDK zh9zEv{STbHGKapn{orCrkgIeA(M>mQreKY8kCv_^X~$jv3xk0kOE?D!={d*ik^;-J)bGyJ|icXZVyhtYH~}!YZX6DRql)Qb)3%MOsGzg%-lcZ-^%w)*sp^{I zTP%$^z{3SXRBj-8duOG0GsCAl2H#DI`fRyhr{oPaxSdedL4r0 z43LA8se_i@$D**$1DyL;n>udyJ%}~Rk*5Z&Z4J7c#)LwJfY@-L1CPh4{KZGA_=W(g zw&gHrz(ilq9-+GbysiG*OP@Bqd^ zKK}qt)!l}s(@gWRGPGJ}RjGL3MH9wWINbf$4Z~;q-k2O_uqW|*UgkC4uohMUeq5dg z0O{X9hHDD)!Q0eAj1^$z;zn}oxM5ya%+_M`#MScJ^0LrM$VBWYDWhf)bt$=?*9OdPGznd zqVj){rcRu3w132pnDj)lpTas_z2xwRmdRC=zTL-p``(}ZY*#m}Xu>FFIwkB;2&4f7 zqXMEo*a(&&lUW| zilzJMAJh10-jq&`UlUo~YWCCkkHh+GlS3krG!KSe*dKxXGhS(|5VBnhUEWcaLYw&^ zLmmz~;9{?7Gq3z47J_DG-s_U11wrHUGaI9_{!9Fy%bws;s&4Py#is>ef}%zLG8 zC*>pnqmke1R#y+bXg2qi-L(JR4G=^PUj<~bb4Gi@m|OFQ6w^N7*i=L*UM3J>AlrMmMiwJRUCl?5bI6OKR`>!0ziDzR>7T^DE@(`7ChWFN-g zE;($I{xzR*8$GyUPFUc7L;WiGKiV7K<0JQnjogeA&V4Gi;MoS(jJ_O$y9cj8PrtQu z$#S-h;jx`Pw66lq0V>2X%96Wr!Tw!+>!H&v?=5soTg!byU*9de=ZU%5%}+m9+xXF0988!>e)sk>ukK8>x~eU@7(i#cDB)qn&M^9s4?-+eKH>uz05Xu5=kUW zw5Y(~lHCdC810g4H$mAU{bzPvvC_2rdp|Bq14%Ehq3MqN!yH{LYHR9n1pc65Y8UUMsusoRGoc zEh2k3B4jp^kWd6{;2aEe_wQKBmn*TfYxAp~9pcXhO1eCs*!o??(#qjj-TmHw**yja zPg>>g{3$nvd{yD7^%jUV`B^-u7^*^>hCl9iERfMe30B!a%u--T!xg#TQ7~?g)6%`#$deW4ptj>zt#hTT>iW1jC znbOMAQ!DO8l?svfNp4p>ao@FiUWeoDV@>c(C&hx^$$ zTgCn(Z3<<3W{}#)8%O1oKg2QL1o7=&k!hq$2Y|H2l}ynK2;h^-93z5o6^~Jz4Ai<& zzKEw*R=v)1QPgyw5qM8ady7kpd$_I_VM%hN1D&`$07x8;ojTUsPVm%elXR%SkM0e30ARxeyll3 zXJw0@_7@6AwkoWL8W-I9r^O#0d>!EPjbp@mbhj~*8VgL_O&bs3DxFF7?OZR2zio{& z)+dj^z8=21k+}0O=U7nl)GFnN(10uFW%A-sBiM>~;A8aksOEGelHW1!oac&Zq-`28 ziRvCE{jNM|uA{?adtso$?VMO!k1&j5X_ic!eE_dC@gBc<;+wHQigg?PQc;{qd2rJa z^aS7!rxj9mLP=r(Cy&aZV;Ig3N8LRC0G=pKvqcnyiZCX`TT}s)v}2my@U)Eu@pUAD zmg&?A#cR?+2FLoCA^5{Pm%&vnkwIka)+ZerV@4~39P@fxR7z2;F3K%RF<~* zMrn3OAMrbosJ!DW$DrrGaw?N+V>v}y(m!55;GQ3~r-uG6e$4u|neoEgO;3b+?ynY! z<82A2@|(bZD7+?38^rn_l-^~Ht>wy?=2*)47eGj$0W^o=fA}p2!ChnFZ|%3J*nCCS zF8pcn2J^!@9;xFi$s>mEX0t7x+p?zKFoAz_3E#DMWD|mG-TwgKn}6_5*?t~)V@>hj z?VaHLM*1&{SGHar_+{|=`a7#@&lc)1-3yVc-&?CFhf1}MDWz{c37rx4fUE@FKl~Rf z;%~#hhW`NYRU6j3@Z9$LdiYaKwbrk^J8KBIxSgbv{UsxE5<|8&TsQFT9OI6Ny;0=V z(X|uuhG^}q*rnuF@yp#_1&xQc(g77>##m&C0UfCX4$1&Om)5@iyYWBlZ>hqvYTp(A z0B9i1mN2)&Jsw?~xgePpvyOo0pzqCRSWo*9Y3U?$_|xMytsIP4HQ&RXHD*kloEY|x z(zdyWERUT(WS;ZD!U*e{@ntmBTm7jQpd&=}Y5#AB5IYT|?o? zJ}1~-TFmzITT2C{#0EriHzda_5RiBz9ytR%{Vu;3KV!cKX_uqn#;fs$E4#Hw%SGW^ zXqseK$X3or8DcTq*UUe(p0Dt#=f+Z>*|zuM9qokc=Sw$;tZi+B%3CZWSb$=fCzj`M z9jgkKwb8vOxVyG-mpY$?e5q2|JXU9Mgpx&oMH$Z|C^DOjov#Pl8cua}31ZzpjiF&R6daj z@~!Th%Es?5BF7|j>0ILheWtYcO#4`b<1+q3qQ_(k!{;r{@I^uO82d}@;KPt>Kn zy>A*@>9+QFlZnkZ>wpcM{>@Ygl%lAG`vgXrQD;?+rL2z;Np2;WlKJ{uv0~!GxZ(o`dNd+cK#R9JU12XvAB-MK-1z$T2U$}7O~)L>w%N` z*KQipk>=wYg*9&GHnH&vXyVh3vi9zm7xu?#w}>JECtwq&w^N$&58J0%I^V@D0&5wp zoJ*!I<8Ksbjhlx4?l&9^Wb?tVe$zZdYvHdQ_)A;0Hadf8dfZdT1?{o>IAE`U(T;ks zD~yoASah$SKW@JjTJTZfDV|fDbl36wMu`n=2P$c5MYt?32jO zI%gnzb6dU>@Q#<_5Mc10r*jqe3~jH%r;(jNY^!tf)?LswDtf@3f zmT)t-<{idPN2sbyr3P{z8nrpJuh|pgOt(Q1uCzHVq#Q9ucSQ^B)Q`r$J7l|STjw#8 zkllWj_vh`iG10$ce-c2UA(rmzPP893-!nG~TNvQ*4ngf-0qV0yHOXjU@;Yun*#P}( zp=$+m^d1n4g({L=(doV!)Stv27YMT;V7qo;563-#uQk@}{>!P#t%HUnkUuKweiUlr zJLj}=aOgshe^FHaBItkF`o8ROCnKEa-m#CnCXc+SdeBVf90It;4tk2OBK+KQSG<9= zk}-}jf0aQhWsZ91>sv-g4N5PmS~U6cD|f@Q2xpHDV>#=dwTR2Hs^*z>_wH1Bn zn&2j>RaZTWOVrHvs7})#P@s{6(+e-O7k~EaMQL*6bQs3& zpXczadc;3yiHvIMs&F>_{{a5CHRm($6qKN(j(<{hiAc7|3Bfte?rR?AQm?^Nj(8ka z&aDF&-zp>8Ly?^JtO>qH=L><~v7sE*7_;0N9F;l9x9S=A)Z*XPC4)0#I zUg$I}k-$7Qd97*gdDzG9lG?T#sU!k8@9k5lEWqRsUr|+UIC6Oy7{KlHs{xb`oE#C3 zojvJEU6qEHxJ#8|@{$Vioc{nyZ`*EIT$(m(PqcYqFRDN5l06+08dY)63P&8cX5JA;PF%%b0UDv z#W^Lx8-D2==b)pI9wEJn8OdcQjlQ4Gh@ksP3m*iWdV|MWeZ8@`+EH0?-?ds}wmrU5 z0=;p;q}_)KZl_2D0=O>QY$6T6$<0B1~J^J+e)7;Ig3JC)P1a-!9 zPf`>vcLVGGAK_7}jGerExcur|Y>YCnImyO-DKkht1bG0ABE==e~KQSZ*!TgVT<}qrv3l`gN&fkTQIO9AwlIKJR*@OqxR_a(MTq4!x*u zd*YTj_jTY_i$jg-$*k?n(f|SH)016Bk*5bFTrU7@2j8|k9xE$FvS*P zoOY)<5r(GhUD7OEI8pOC!5nn;A5ogUK4VeHSBqWi5wu@|jb8q0jGsZi5 z8l!zS`a0$lI&~e+=y!!g_v$Y$oci*zdhnHOVwvg&ZXyb~)dC5)~0H6X7ZcRBZ zSW13JotR=5vz0WrK9;d#b2p!E+fhar_l36c)N}2OQ`cFUZWZiSL%$&jeb_xe9Ov+? z>yHoKM?Jrh732|TcJP3r9Cg6y$8%A|HRKn;ZtlZAL0>I4`Gc;0p4IX4)!gtGW2f-F z%$GMBh0K=G9J)m>Bza_i4nLT!d0|C_$M$m$P}NP(P=c?Fc@RtJf{Xy1YV00U910LIb{{RI7@s6P}i}qajW#OL&EQ(Oy-=V#~bKI7F&U+jd{A(Lh{hod={?KXtt@}dw zw_0l{NF?f)-(<3k5s*gW4l|N5lUF053AXoUFO9!uFN2@6oB96$5WY5eH|^_? zk!iX-x~=|sA!3?mXwH3h4z=Z%U$qUr=Ajf{1wI{}a#59!Q1M;s+^#|U(OIe3s(OwW z9^$*d6!<&f7sAVbv-rctI+uubJ9i}5_)AYL^0+-3;l|u`&TuQwuRbQ~N6d%ew}ZNMUupjU89p!RhyE5fjIMMo7t0Rz8f<4r zwnBK=#xgQTL(e1Du=J0H-wXT;Ic-ky&72)gu0Qg1p-##rS=~~SLTuosX`9{I_qyRH|cIlew zRN2WXq-R=uO=Y)?{4DT|wTi}}A-%tl%`$`6363$G<0h=Onc{C7T?Fxlxv5N;1MF7l zZQ_h)puic(9P|3uVW;?R!r9g1vHLSa_k6hH+oZ>t4a3{?FI#X$<=0sR|TatSy#cTP3{@1YmXbuCGb>OQLAG)RtwU3gB(4k}qs##wl zNg3UbL7WrLMLUYgoF9k&32Al_6Mmm*Xq$sCLQk;jIp;OjL!n#g5s0iHiDHR~`D567 z0gp}xTGL1nMt<2DlWPpBpKN6NdJ|4-6a^!;l1F`gd?OC~tLyfeyOJ9rA zZVat1ofusFxEVRf_5O9zy_+^S<(^NO4?+i^_Tx2|J+y=3<(pnB5j~qk%NYfR20=c& z*Fe8AmH>uKox}cG9(X>P=|YvqWK;0%tbb;>K#_u%E~jxUq>u^Q>GZ7&NVdta@T|u> zo9?OU$m(i838GHAjB=ypCJuKv2L(nkkEdU1(uE8q+TKz_lhktDbO3k%03xiLT&)ac z;&BLLwOi#mP=6EO+L$G^37x22GIi;#`- zF(1Obdh#>s56HU$NZ87EWU=jPk=BGx&ZraqYxvUPVbV zHjSe^_23SJ0;%1(i6jy3L4uepSVRcnN%ZG~O)HC<%=upB3mLz7{{Xv@)Q4O!`MNM3 zx&11pnnWHeRfagEX)GklmLUADr}WAEt6N-%$EshdI|8>3sm6ac{VO+5ick1Stl9|7 zn{6kEfC+G?1P|qo_1S%oI$sky9Vcu#F;xbB56@o z$-p7`!RyzbQ;P5%DVZ5oKzINE!-Lr4raD)@d;uSC_+=LS<~x}JKTqQ8pImX8&F*hc zQ*!Dycpalcl3G=ICz`x+4HgVm4%YO;=3x_^sr;K#)1M~i}6B*~YBRQ|5 z?=4J@S~Qi&z6?fBP){{X>3G-bQ}hkOdtNYINP9_bAx8*UX{*MfNaz;HWe zoe6T)gY!0;=A|{{{{SQ8uM|ZloqZh57Fs9c&<(>Uj-B!8S7O+2WK~^}gdE@ka6Nr< zgPPFsR+r(M$R=BBw1Q7EL9S z9qaU@^i2Hcm7OPrWs&?>5tSGhfs`t@48U-3dB$nJAiP^WV(vSE8gFDLugnVYeY41} zIzJ!%gI%<^RRSm+w4zPB*;wrdj!rS0)V~sSX)QIVE@hfYmg+TtklTFuR2BrV>GJ1; z=}&f6=-9mR1W-n@TsZ;A+(|pmMn0Q(9kE#2pNoXo2$stvfyiU#I1H)C&mH;?%DF?V zA27%RM#L}=yK%twC!pu8Q#WgKcm?wAie({>WF0VZ)7OgWr3*B2RhpD+Z;ukn_Kw$b zv5mg+DBz6eJ5Nq}k=N3)@AbBSGjb3k7}}?EE_&`KsmJkt6-eEdibROM{!|njhTgzu zo@%x6^Bqec-kzZFykK$t)AjVPK`jqEsM)nvxp`lE7A_Gozip%=IVy_N|`;vAXeXi$?5X&z~!XAQeSC zA5Kc~-!;iuEo^!euI+PI;z3A!PZ!Fv2encePR0Wy436EfD=HoFzsjClsuc$q;D9*w zJ!;>?T}9{dRDs!o!3<&0{{YK3B(^XHae@wOHrG&=XCdZiS0%7MW!gtL9YEj#^{sHu z*164!PESHR`*^l7ju{#t`AEZo*n`*Z`k!7ZwX)*zR0HO&O7?z^{6eb8aaoWc8&gGx^h#X!9M+K){9oq@!GVsFIrpq1xhJwpmp5eGT?Uu zzI#$f5s{n%%1_QzIl}|SanN9A9`z5~r-pPg$dZ2S#O=4{b>kqPUX?s|@;$*(ga?uf ze9!0r_UvnVGlNNAQU-vmHQnYyhkL0YjoHD$!8q&JwQU-T_D@nL33A=7 z4I?T?6N%KijyW0J0OVIE@uw2}4Do=86q)pS)U1pFKma?j)O&i@M;zO&-XhQTbvr_{ z2H05i$8V)#{8qIu@RP+5$Q$I*?tIUecGTOPsp;DlhB>)Vn(}{<(U(3&e7l4@w`B4NS~_Lzwfxbf zEhJ-ljf^rgo(6w9qjhKHp#|8XaG<%)KhG7V;q3}rTbp48gwiC8qypm-ffgQmkR5(Oo!!B&l$lV&+w|Z(}%S^8dmOlpL~B>v*H45^?Bh^$k0sjozJ@` zJdeYrXX+!xIDfX^uE4FPJSr#nGk4u(2hgN5NjonD?j8;Y4sFWD;z;H%7 z{wJnuJ?`g&bE8NcNs<(vnCZu*S{nV=*&}1++zgd+!vvG>S@N25llXSR;dN-AV2H}B z>f5;>4&%S26J6cJ>}OXf*dAuUGwuy(_)Ai4OIe5Qwv8D`T_SXB;ezzfr(P-@P95>I z7BVBtoT^H8_28Tz^TkqDCQj(cnXIB>^Y4Y)Jg(ErbLrdv0Iydy3-La^a2c3xjRNHI zMg>=vcv>+IryaPKH7a+E4_tH4YIdoMU2@?RqccQ~a0lKakJ7bQ z7$&}R@D%1h7U_Oq{o33O*lnk74nS_-<6epI^Tf02zAn~fhRzvmpq*i6l#q&mfy*3i zI5{MBpy%e%qtG<{FhLFVql8pjrb1y{p$xd_dXAXyTD}sw8aIaY`zyIfn$9JJhL0@4 zIL9CUy5yVVM}>Somlp6%adPlZ(Yd!9mQ(%Zko=?`Mr#t|_LH`-Xoi)ewa=8fNiHrK z7?0r_0O~%q$y#a2o%CtGRC=^8tD#^k7tSMLzr z4_cZl8%xb5RcWoSmDszee1#{j-u2T8m)z!^B(*tsb?a-HiurS?`^00RA4-;MnB0&z zoxZF3(LR76zS*UTH?m|S4cN)`syDY67S2uF3PQ052jwTHYTfG0(y=_3Fv-gvM+1(P z8M=tD^0_BCJ9D3QWXpk2)ryaPjtiRx!U$Q@q{{U}Kh&sNL;H@jb`t7!bVv^5ud!QXs*gMIE ziDZnb34e(0aq^K|j&fZOrlWzOD5pBQwMlHvm+ zs4?lV<|}b0m%%@1P)i2J-PP831NP<^A-rfi=TpX%^`r+R9r12CudM0N|eAut&q+1N=fi z@XLe4{{Xaq#D5Pu$E^7KTGGMzQ}D`V#J+qe?6T^Y@u*)d13p}@Fe?@wOX277*ZdSS z;&!wD01q|ztK(bP)cvY2h5iI&hS-5F(zESxV`U1VAeJ)DLggPkAGEGDxix_7q=sYchjl~HlHfHF^B0M|e$zqL)M>~K`ADQ(X*xy<@Dm$e1 z&lyE0jcS|zTQCM{wv358sTaBCi_J<1%?;aUgXV>5wt_SC+@(m47re zo3O-Sq3TbiNiT_#`%RuTk-YN}2_Odpf&s_ZpTN}fYhw8s+Uma$W4l$7%LRUL=TZ7yu^Ra5(GruS@-_XSbS7A}uZpND*NU(Lo27wCs!m zc*al7)3N5fwd_UBs)*xEWA5i1bI;a=CMO=}KPIY{vw6;r@H#Y8g*Yu41TfERf`2Og zI`KE{JNs|8v1ToxwR<@%t(w`}PqK`(LM2q(T0?>q4CD;wrG9ALY0%Ga<%D0}Nf^N# z0l9Pdk)A8{68`|>&9&CcJvOL5{{W3+jjbs`Ce9krjANnb-wChMR=Lr22prp7k2ybi!l~ebF@iqp z523CzT7j%5yN+ftwY0ArvyH^hR!rmFb@fNchHRZ|(>_aIo zgQA~(#F37|xy?3Mt|KpSq2zLR?&qD|2nUboIIe@^M~nAe>3SxW3{b^rOtJ{^_p!AV zPCKb2f<<9yaLF_{DIc9PYz-`-nV9ewj)yq^04ASJNz(Q@uK`-wS*8B7sFsB+;b@eG zV1SZ0Gh@??dz!}hwQUR@DYm?|n&qIpj4FqHtrLO33D7Cdex|g(DBr`O_#)rKwnA1j z#y4z`$GJfTi36_ZCnL~Q`lZ0}2f}MR{cac@^4*gTFt5EyjgCm}xH#?Bvo+8eXASA zS0_)ig&m8_a0l)~9I)s~K7{x7t-puxf5KDn>r}O70(%ybVss9QCb}(DP*!q;?())SV*cPy&o8Ju9Z4 zQa2H8D)LCapLCD$t}nt&THyk2B%S~~=jr}uPT=l9^TouS55!)TV8gLDb#GC_;XmLy_R&iEE&$TMX z0B>$M{OP9YR~t()1Dy6XS%iwf;N};OaOaW8s1_%SE470jDq-d>H=}dcBdud8 zT<)bsL~(Kf8-4!(8fkv4{re8oG^d{|70EwJMwOEVfgpj#cr_PiLeMZooD=x3AoOQv# zKaC-f5%Y!M5-BAGPGc-KfDU`pcji79p1hh?6~@ai9l-5Tw7BAlAM2CNM#FLMS|nvT zwXopdHCVEP?Ggal=h~r$9nJygu&$58dO%kVH{Jt1MpvF{ChTp8r|ll5hllLVsuq$q zV!Q*M{{YvHaZz}qQ%K_S;K)+HUNOff-!-YKUq@#V=)1uiN$Nc_+PJNIQS;_+n{XTo z#tF^X^s7x!r*k^`<*pATlTC&**V>w&yl$0Z6hDXQU2ol1JP0RNZcLiqE$NZe@mrc| zBd#VV0~zcvIO3>TT6v!+RT*BbTDF#~mb=-CD}M_N?)q0W<$Vup4NsR=X-RTE$+ifF zIV?=2I4%jnC+`#g0N1W^`sB?a&ph)=5xXxDSyPXj zBT0A5lk*(cul~r^V^Q(8uW@wo?@d3+Q0E)BxcNt~-RWLmptZHF&izg{c=7xrocnrL zxcIO=)kzCFIDDb)CI3wU8emlfT_V>>O# zCD0NW6VRWpp#K2tRc{O2BItJIo;hXvKKC+w*kZXLj>M6V%C%wK>%M4?PTa_Gki2v~ zhkD?fyEQ{6Ge+>61@lz%<*NWkp~p|gn=YpuN&f&7DCFGj_nX%p{dgZ*N3)D8EsU}U zB;+$-uqPaTR7)J_!7fxxBRhz|Bn*0f%u%+#_xo0gtA6UA_L5s$~2{i(8`cFZPs?#8d~^Gq{`{c<6cj>!bKVrQGGZE`{{Vt+cv?MI z_LlL^sdB1UO0?1R=-7?QMAyo!6z7A8i9UwD%Y-R&*PTwt_>MKGmKHSov*e%K_f%W& z+h^h(wWBAQ;pwcjBfMa*k!cxaBz42e;C?=|S10>H_^#u}pR}jM?QZLB+v;91))*>~ zfTVY_!y9A{e|HKm;YEFoX*V`}b{QyBNd1V`{{U)lf*uA9X`;7{{v}>Xkh)^Zwpw&7 zI38fNRP#OeF&M5w_x8;Asp1%<(!L4kejE5>rChMZzL986)Qjo8M_e8)tuMMgZCAF$-&4jA2ZJu*a`8ovVJ;zA~N}t$q;b+7H9sGEjfx&fH0Ic>B#W zago^lYjsV_WO$BIOIAMr0QNocZ;z&JbM}St7N@d6WHb1WRQoDm^lvQk-+;l*I?8{8 z9|z`GG~Gty#y7Fye$S)Wl($x10~wfcoSp#(z72V9pQLL401!M?s?YH+Th)9;b8jlT zz2(yoftNT~&&r)X=l~4on(g#&1w{qA7?ij_#D9r%*++j*P%Bz^XZDOLVw8RpdsY3b zJXQ7>;P^A3cz?k5yvO!|Y%etl8$Wx@ZZ~)6eQVCVQ{gRh;!W#ad`;KlY5!wA6$qv$Kqt^78zx&HuH8UQ!3`4_)a_2)i@wDivgPpwHRY4)vf`#>1^RF80R z&!u!ij3aBDlf_BB4=b?n6xu3zc2fk2U0ft*FN}TQdIUJfx93`mp_*^iQP^jk=Z{LtXjLX9SeM8Ek&sS4@jsPy zMky^0cQ?B^fu^<0OBSUPU9Rn`=0SpkIl|+i>-biuglvcWBN~6mP9xZWpgkD(_UWH$ z)14ulfhr;pK?uN+pHq+WDSR%zUVs%6}FW0K^H$9WnLk$6QttlexMv^(J|A%hLl# z9_Sb=Fycldf~PncF?HBwpDW23C+5KJdwb)yF;U8RRaE&|a0vO2uS3*yI5h$}Jz^ti z@jFCsD1yr43U-$Rqbcj0gUR|=O?4srW3|TM@W@wgFb8}LaBCCAac%K_gF59@OXZH~lnKvDgkl82ii50rz zIP}hIa%Aj597gKky`vJM6<}16=45k^eD?25C=&+yCS35JHd#2wPp?eXhn7jqeqWe2 zgS4JQ3~}`T063=00>EL33fdKG$|=m8Fo3qI2b38eK^RaNet4uvIhx}r(+Gd?hkXu zJ@P8;&&veD)i(0JW0ob3diCmZ4^Ek=gpC+6LJ25C1|x{a_i%a>%~?KWFEl)lB!B4W zpDs${o;!8-%}}{mr11ul(U{3ghB7vCbFhWm&mf$0_!`+*+VGdW2$2W-`@ZV^e~X-8 zdR9)cA#05oh%n848szX-ImiT5$h5kbE*4mTEF|+wl{^9$JYk1GPdNVo>(@K34WAJ7 z1Ai269BCpTOreYpa7g?*``1@^!bB+={H!-ix^7j29ixxE{{RB$YnkyhOK;+D4SD!d z*DM=&KixdH)Z^Bny-@cy-UYbY(z@i6v=g@^dXfHpD?d~WC(|D9YpUHxjhqrm3bQ}gr6rk zIN96R9)`8Nd8%pfd`Q(a*)L*kOwLSp(Xp0!06aIAnQq4?7#-`C_@Cp=2jKn9wfDu3 z6KGx+nhnghvol|6Q>!7`Ah5Q}$Xg)tayyFI)KOZT%9P~Yk=p4p+=Np+jUuQD!Tx0# zJay=E>*_1s{{UtysCAzLPiLiETHId8s62+w3z*4OZd&Z%$b zd?WA#Rytw_{{V`U;x*#M41=P{4wY*8VS~a<@wZHXc&{n=jq&G9yOudWYL6D`Ulc78 zJ?o&X(deEXiE*`*TEe5vTpkuEcBd}ZS=_$ptB{5_)$C-zG4?}fe* zXwd?RCx+~zZBAqaW6Zs{M+!Xzab$7xSI!syFV}uD{6*2VUmxD;TBfr$wFJpNr+E66 z$dRW*^2;$SgN$vDY7NH=QG=-|SB3kdroA}Al(gu5rQ+ReUR+-*%N&wC(ktOupaqWv zgN$b%OxBl$wO8?%gwo$pk)xL0V;Phjv;ZHJg4_~U<-zY*UMsM=U2f?wEpK9&O!4e7 zFvbo@2Olsb5HanFx1&Jb7VsXVZsJib@F^5BG2H%W18(2p;1)Id{9$;eeor~_vtjh@ z2S9dhV)0%`oW&`X%$Z|@#B0;#=NSBI-kYoGUNW({(%{NMgD@5XFx-5yAV1yXBhtL` zIHH17Xc1Hu0f+<=ae<%9gPOUe-c6>wbLmczTt~UL?c5iP5LdYM6-t}jpJ-2erQB$j z5!mXet1$-*-!YsF{K`jBpYW#0b~7-PDq&eQP67_<5I0HR8^x$xM^rW*{JNNs2N1LQ5vokVEHpsUE*d^&z4>i8k6p(%og9K$URBmd`l{ zqhqKXbrj2p*q=2+85Oeb?Tx*L3F<23*DD3fZ^UZEm3{dq*nKnieJVMo0y~i^IZd8h z#!lA+@y|HNr?qlQHfL-m+St#y(`1%LiwPFj`S5=6Jm=}bq|uw`&bg^{wcjI!~L zzJTYSdbNI6bWBSS5CWtQPBFn9PBD>5q%PT-H&zj{5I27h<<}>-_*Y#jP8MmLbukL9 z)wCv#IOK{n1Wg`3WlV2H&r|4f2jQBjmxxQj}%cofteKl~_(M zsy-3c72i(L{Ir(*JU@KK@>4!hNH|l0gUx?G;}z>o`Jd1jX>!quL(FRT(Rpu?m0$w#m2RJ%L#oFj z+-gOXsC$fj$UtT%)B04c7@9~NZ$PdLXQ?C{^!nA05UC+~%(*Nwq+>js^TF$i z=QVO{=KQIMMv7Qbi*;DWPd>j&)wZ{u9R}oE+%OG1Y)YWx0Q1dfe`TzZ76&R=k)AN# zpGw!Zg5>yW=&M3iZX!6rA%0VWPw7<+!E8{yv61a0iQCN#G7j7mS1fP!542jx=EUh3 zR0QXs$0f7L_o|XjC|7COc7ec5{G;BkS==gI!;hbKH)Zj+k=nT`{7CDj{npFc#PVF~ z7eY;r!gekI!Q|)ks<--ut<8qTk(bK@2YA5epr-ijl+^D;nO72(1$bb6J@H)Vzn0eA zv%<3z$u7Ca)7Gr9_1#!-C+v(F4wcr@^+vp~^GDMn+O6keLc=mE}-}+W&p)!k` zpDsvbEf`cP`Q7QqWA9nDV@up-rj32!neKH3fgWbuU8BT+kL$qa@T^T*$H>>7McbJp zLJ)QZdY`Xqy{*d?zlWnsiNu!*3v7wgjoz)@Z2K zhDc>iJV<3>$x)IAT9P|yV!ySw)B{H(d=_Qe%r@~;X}Zd3_d9|y`B`wOff*z9J@Zq~ zt&LELugaMd5i4yc#oi^n zyS~4+vzB8T!+*BkBR$`O(B`UBdzE7DGW zr>lmk?&?_aAAq&J6G&ZuP_~lN&vLM1GM7SIjHgl3n{ngVyhAm*>yym{Qbx=Ej|h`< z=Ym1%3F}!pcDJtSPO`?=Qjj)??hlxyPhuOdx20-oH?2LTq?21BT(mfqqd>ShJXNYn z+K#10wTWXzf_V(;l8@b|m`g@>;|Hg|^sd=-T_)q<@s`NN73?;_-K0~A&qhI>y?Cwy z%UizFWLLBk##CfsG8KLOfBN;UapPO5t;#e@8jSp)5a>w8M{IjnC0bHXL#CZ&EzSP` zhMqCB@TbF@`xq?ri~IY@!=v3HX17ru!kiqiJhxHFt{8Y3^nxLY+|721sKW>ca(K=$ z>)RCj`%8^t${_}qBv%MFhJprmVcCfTlgHs(9vqiaTe;@Avoe^iB#im6kX#%951}~i z*0zT-da`QE-6Pj^NcEfPzQmDRTC7TmOK=!VJ=i$AkrQ*nRZ-=*cUM9M^+AaRWVK|m{E4YNWDrGpq?T$0j zy~fK>_(9;G58G-U4fsXz7sr=xHh$UStFs1}skDv~z!hc(A1fSVuQl)g0I)a3m-vhE z2gEkN6g*d^{>(lYweYR&_Lr!5Gs8Bzan?0x%tG4AOPSV5JlO+bO6_S5;gDAqpj{q2 z@N@nNJMsSj#a%p!;z};Kp z8rW-}wHJ+iPvUJ{Tce9>+nKcq;M^6SH=6EAHspW_Ko1;x*L$dZJ@D1V%<}&L!Yik> z)x!xTp7P=EWdJA&k?z981~^q5^O~In&XYM$ho2EX6lgv@NWW%}fZi(jy{aKutfcsf zeAhO1^8m@ZT{g#L6C(m!WX_vNDjTNXsC*0id3=A?@21lK0BL<^;n#|uC4r5EW2Zh)^D>TfOrJ1I0rm* z=ia@az3b%f_3=ci4N^!dgq|E;S8T@V6{8RSvtLm?C zx~R5G(9)Sc(jX_JLs&+{_<3figo@Ij8{K3yV}1XZqH+! zR^No~^-H_kOA9Oe$RL^Vut>!aXC&?E&o#d)9HC=k+DltlXGIwoWtddeVKd)<9Lk!91RXf1K1Qf`dE|2`Bt1 zr-u3Sf&PD;XJgal*zTtB?azsPFKKVBPG&X$q%9*7*e5$#yW;>1_Qhx0YgZ0{JE<5L z%JZLG`u>%HqTUE+DK<<}0vkP#t!mp7Y|Jh`VmfihN~Ek~HEoR@F70O2po-w47nuT+ z(auvd}HBbs%e^eg7Vr+)fW-SPtIL`y}WatIn91_+jyQufzIOK;TZkwk4$u}s}GGn zAY+ym^r zU5fsM=Zs(w*KC`lU|BF~Usy%In8^RqmxN z_MxlUP4=R0Wq7Vp#Aj|sK|KQCW9inq{{V%W&Y9w$5+&XKr=nQc=}EoA>JfR8OjMNv zC$g4eJ;1NbUlja(@ivGA`fcr~e>VmG!xLbU$p;<#j8wiH{iJ+Z;u#*#P@hbe-WbUW zH0Ze}2d}Pqs+Jy5gOfC+mei{>mhAl_xbaQ5iFL=--&3$#3I1rdT%ju(50tYLz&vn1 zrndeUc)G^=`u5kvSK4Aha;8go-svzm0vD_>mHE2A7W_hrLw{wmj?(Gq%A}6N zBCmLB;x4=5ORY^cDQshlOwlj3OhaK36=)+2qnzXtdJb{W*CZsWzE!#C)yQ!)V&^@P z_U5Mmo5lBVYj-wm`e`cWJIKnF>JE2c1IHE6d^*>m(!5D)Zr2u2+ug_Wqg^K5`O20# z{5|tu0sKq&g{=5<#LuT$-B{egY2@HbV;g16O2lArRBkw~TUz+3tuB>yC;Us9B+QbQ zuw2UA518kk0KmsecK5k@kxwYZN-9Zc&!T_erppF_srY)y3>P-j-Q8ZSaLpTyfkp!q zCp%1-$*+;FrB{`jFhKqsoRL?x9~j^G^41^i1=HYL6>$u9mcrc-92Vhv=K$o^NSLwt zyVlMeuE*$nKTYBAaD=xdJbei5T3Q1WGHfI^;ern!`qo%;fsWm?Ry5nw1mTDWk=r#B zjnVW}XUimZI=-KAd8Pv@G2pO0PaeMgeznP7M9GcW1JH~b?O?t8W}bx{upKFM^C zk~Wcm4lC94YxTaZNdiz&BSl!(B za+P_#f)dz|~#=5U9CdG+g2QR;PJ zBAjl=LvI%1M(v}nIiz?5YlS`XGCEQt^*BFV)UE&-4ZG0#)=ji_!ZEhQ&{&BA`EM3S zAZMB;v}6U;@(wfU>&;e4%tz(MPqj#7^8opY1Y-pBsCPG9y8+4S+0UncYH>$k4oLp* zy*HKvB=C9dPuf?HPkt#IMJ5Zl5J@>ued=w_?7QU2`@=0z;Dd~h&x%xXq>OHUP$gZr%7t6+)4;1(;28d(t!T}4u3pQW#72AIT`-|^-|P(fRB%v&RejiJbQ=A z+q;v~6z$;`Eu8-VN{yVC9W#t@X`?y24G|U@!w^qF+MG(rc^{dj^Zw4GpRNyDjpq^p zf`1Xy@vGeDZ&6Wl=kx26{{Yvib`Zyo_$RrjP&`c@F;qZU}9fz`^2_5 z9cnq+L>pft1M;Q&NsSKP{B`M2++6M-HwW6BQzCLnZbu^=3>?xYIi?wRwg*bPr`Z|Y zb_ap)R`f;`)2k~)x1i~!>f$}X1!l%iApRBBCA>OSmgE_as3Ex>v4P(|g;225TGlP_ zDsNCi?jz;z&(fgQ^=3rH!!G4q3~|@oboy5-Zcjtrr3FSBmHbDn2~O0=87v6M$TiH* zF_q3c)YsR(VLb*S35?1J9~X;VbX+3 zvRn`uhYZ7R;5uXced{Y&zH5B^+nnSQc^LN}jdNP(uXO}c*Kd))5tb*v7*p?6v}+-C zE@k_pB>gI_#J+r-_Nz8`UuQ$Kwoh@;*7oIAJlRxLYF+GUUg!$03~~Ux0y>q?^RI0E zl=S4W_Q3RP%X6m;3H5o`k${#@CJK@ZQz*09zE;mzuBw9=${8H?&C8_b8~Yn z!BH?H0gCd+s32~~wQ%N7mk$0%CN83FB#%m(_Tteq9IRXd%&dihIKUuwJk@C~qWR)= zFfGDtEy|yp0380GTB#k4{k^k0+~kr*$rouSJpLH|l{A`_!4|R0FkvLd(S~>7H!&js5&2b>v5?))=1tH9TrNn?JA3~CGgG+pUPo}D zI1SI;W6<&2wkZD15~rAkRADd7$Djv*LF`BeA6ns))tUod7_$V3(viaPjpP3St;b3v zF-;mZ+|L`g7;l(hcKRN2edrH0jPiMMB&Q!MDB!3$2cCp~I)hM(8=1V#K@bo@9$S^q zInFx{YcMYEON+HwCi4u$07yLJkTL7W{~xsuu{L9>1UKSrF-R!81t& z%I(m!l3?-GvOT{VEw$UNBHMPM4a|c(U9pfe)963IRi$BE(~=k^jaopyLIF>qW4T4K6Fo%Vn7wHZHLMfc0h>P`$~{MSUUv00g+PlSc55#E%rXQ60yK z0M`>X^?YkM|J1ZP_BEEOAl1nS0HlHQKwYd(ggL8!dmcTuF6VGp@dxz}VtHbce z{t12Y2gT!bQT?CAx{u1Nt^2i05sdTq(Z0P$TKnz~jiXXW=bURM-6$jTb4S(J#Cm1E zp>&MWYQjxT!#+rBi5gM{Jv_mmdMiu8z90VpM1sP_1Ai9*{i%%=>#SW>OqAaR^$k=%;ZxA5#~0Q)Gzl~5if=V-{r)7w9u zO?ozs@RI)clXHtWbHl$Rdhk2_YqHV)4C&fnX)fY<=a=OX%G@!}A1LFf=j&fWv_2`e z_dGYjehss0w|Eh8!D&Cu#EM`U$4@%MW>f)L|`vFhdBX#d7-^YYUeHC{{V#g zMx7*QYfUzGOXl){x)7teHPH(Mv$ex~s)x%(g#Z}n6raNf+|}>1EKFWk;qVU8!w;|H zO_JI-Il~!Oh9R&q+>(0?4r)cpc_+u)Aax5FB2r6+BYK=8aey1RKhnJZ;0ahWVSqb= z^zG5TdCyO3^)HWBk`ZMp4b3FMH|G(7$m2aZ?_Onct>!M&5wiTC50oz6{)aWyOI4|a z^p%QI2UR7&RyYS8K+hZw{Nuex;X-56uM%Q$74)&L=G;R3r;ku`!TQvpRaKdMunM;4 zQdN}aCxgf|-wi||{?)?(O!2rNWR+wb z@Wr_RR(VO>N*rz&=zC(MlX$v>$0Tf$5V%Fg)7XLS`DUhKXCd(lbdu{wmNb>4g6v8_ z&cwz!=bRr;U&gvyv@$+e2%jXYDc!jA#(IO(70!H7xoGsu3zd#GXs=K*=kA3)TeEu# z=`|g(75Ujb+;#cGGY;RM1GPdV&(K|A@lDZzjDhUdGq~h9-_&u`9P#&+r z9iW);Gq=v$RZDIlfx*vX{LM6?T}I*-R*~CrXF>?ZK^uL24|;oB83&eE%i1ybk8$7f z{OQ*sLh82!NAm*5Cj%WHIP01SO6;L3bA>{~0Jh*V!~4e^aC>@t*B7cYX`dGK;#Zz~{19`%_53Te zoO!ZH5+cjL?nfDCkREq!>IQp#YnSoHn{%(HZM-~;X2>^6c52# z?6YXUv$usjTk+dkxGf7VlW5vEhoar{g7;6Et`{RaqX&bKE8%~Rzqe1ouMK#S^{*Ou zgT}wL$HW^yoi66NYfT2mUB7)UWkDGkY!$ab&OjK*A3c0${{Vuf{AT#S;n_4_4{F*+ z!w(8dHjNv>*6nF4CJ5Ul?tIrg=W_XYJvi&nD$;r#al=9i?H_mk+8?xM#N7|V*D?Ol zUlV=}d=AlX(H<`bco;?h00}mt11a0~!p23yk-z0bf=)$zIj(-zei!&~Zrk>9@b#Uo z?9N5bsdX8~oX5n)#8VSv5P0%YiM;ZjFa4l=Q}GV|Np)-YiNkR2-fW5oV9)Y{lhgs4 z23_3WbKENONTPMdu6UB`#JZBte#;ziljT7XJ69u<&p9N0 zYeg9@?V>C|X<vu`c3FfMkV6>;lB(6UhX3$6v%(?KI!HA4GmTRr}B8 zYC|`ciz-XzL|5l*?i}g`6L+0&nj z)4DLZ)8kiW8|5>-tk2_QVF%3nK<8AkKK?1JbD`Pd1`zdX4Xh_ereX&nQ#-zc2&@=kBOp--SbL z?G%8!mj!~Iymjnz(DtZSM$YHMlEjwIdVd!mQP0wyXCQ2 zT>1GQyz>5KQO`bvj=4Qgw-qgt?!5~!F_uDPNB$=7^L{zaR+Kantg<^ugO5$1`uqF$ z%}E#@Vk1bbj0t8ZKQ4LzdVBpUp}CaSfpm({7-Mt{TMM%T9ORShNfWrWb0$^Tlju0W zC)k{R6t8xvZtWvOfx`luM$zfq`qWkuFP^FxyGfnd18C!~J$|0`>BXfKc@s^^+_5?< zUB>X`LHn-RU=Oo)AI~(|!pa<#y=f(tW(Z{j0rKRqTmjSW`j1~~j#eu? zN6S*>isgn2ZR}64Kb3RNZL_kJIb&frOk+VI3O?yn84ZDq=dd2M>pO;>rD$E`iBv{e zlmXO^Pp4nfsHDQyHARoij&Ho|d5o#$jy?YXm1*hfBMP%JZBPLUOJkBj&wSUVLP~I5 z&l?jNQK@TaOK|QT{DQ&CcN@7pbm`NY%JCheT@lqN0%XE$IJq^9GnA_jw{d1t;p@z_40eUtM^C1 zdab{e;Jr9Ktkc4`GN~Zv%Oj3HydQB{noxvCB$jd4;*I|$#{&i>*&r28AFEWJoEnm z*RGq!Ff?~}@h^EpwmR}NkK{iJ!7H1b&BuwRicAQABOvkb+upUTd_{3Dg|9$~GA4xV z=ob`LjzdD=U3R9X-fnisTX)xMfLbAxX9Jm({5_2<1d9bJ=P@>WoOUAu6j&{S*#TBsN~U^zb2 zmhJoTfEAU7bI2#PX6d1Gv#9WvuW+6qPc92p{oH|+f_Dw1a(^t=WS$|p%OsH5=L4OX z!4-4Du2Wt^jpPY3I)4e~u~o}qzEVQ2Soim%*~Y`?WcPj}xZ4?q3q>JFz)$i1y(rhU zTd4I{2+@tvCgF~}RT)o~Rd=Xm1oCm$inZcN7JXEZ0+R$}1?j-XY4RcSU#VIxV)10% z5sL(41#|CDmr}fR7%`8VpiaKvW~m@0_yiD1>yOOT?D@7+^5BwljDA$qNo;;Afzr2h!}gyLT1Ju#lH4~@@}KaoVmXO?k$^|#R^nAV z*tsULs4vWy87I^ZFnUnh-lrUylIZTh#sKg16<^I6{p)j#ifcGu^+!KSmjunDIV}s1 zt?EbpZQQ$0pcL!PPVm~<;^It%Zcp)i$MvdP_rG2ycHA6| z?BPyq+-rRQ{wbG-1qOsc$A%RvoIbU3N=klu! z2nQ@slmG*sI)5zVttQ(g)n#uE=yrY&(@m#_BNld0;Kyu?&Wdx_%O@E<&MNX>N|T@7 zw#d+&fx!BAA6k!{gUn=6Aj6aL?>+wj4`JG!XwCr&KqKXM3yuIFE*WG-XQ?h^{{IJOjr$ImK0x{KRL%Ww6bj6cg9n4_e*u zE|KT!O>sDl5(Qn0le`{;gVT}t3N2t#X!Q>YX{)E{7H}2+08j#DMgbV^JNt_3^w=c( zJbrrZlPBf$!sEApL0ry+R9Z#l1k9zJuF^A}I-Y}!16?+j!J`BW5JnWAn07ez`qY;f z&AHR*cI@R@)B&&zWAAb}$AA94ZaW{d&XAc0$Wee`7<&Wt#bIdct9P~mhs7UuW__0pbWs_ zQF@=#6whu#&MSo29n~eBA>EGKM4P?9J-M%eKj5uC z8?wKrU%IL3D|$GX?R{{Zk%(csx^aGqhR8C5jnTbKEPa zKH%3xB3uudr<-u+pXMub!=5|4(rlx(M1`R*$#1=nKx>`OI?|-U4?uYawYNiNcOUS! zE~e7wwvNKd9AZH+8;anL06bv#syf%itIbP{;Ib35WsQfA| zW_I&vIu!*782)v)rOt0{j8_Bqu?(wc?=RE&)(ld4T|ginK|Lz|n<0(2M%?GFI)9u} zXvSL|E{zZonI%ve8v{Ic{VMJBv8}*pz+Ig5;2Pn$Hu2M-Deg2-}|CxgY16 zuD1o)DFZvObNSRwn=OUbXItB1i{@oc;gi8XWr-sM} zu&sXqFPD3Efq>;kdV$YxU!`;6b)_S_0UzJQ>ZO`bGZC_mIL{}F-0(zh`e%%$FCXrF zFLsJH{K_PF<71yek@oCAElYo-klt5B7DXpurg3J>oAp>(CGf zTJi8}_lra7Ge>MRk~97_T}dy+EoB*$$radA6+j$C80b4=9V?CTEyI6dT#{6cs-Tn0 zaz9?x)cjVQTzpK|WSUlS_W4v2dCHKa=e}`Vhl`pu&?P8HGBWiX^{rO5*Qw`FT)1_9 z#a|9y3u_f-RUwI1>(l8>a047vx|x~%E%j$(2l3S z<5_+d)J3MD7nndo+>$ej>-Ob5*16^G$n|KxcpiH?@_#z6=Pk`&00BY% zzP*gb>>C^&)j`+>=DKP7$ntS3k&>%mb651+=e3zy7AVSiBeiG6jGR>H+j<_A6IV9F zO~vyg(DWY{TU?@x#(0ja(Yj+G8yK|0tABA(Q;Jy&oRpM<8gmJ8K zw)Pu|UU)qXa`M@-Ty0)Yw>8sAu3b-?%o~+wV&$`sBxLjL#aP@}=OmnFsX_=JFvsIl zsbP}8p{SbF>7i1}#kG$KxPm}9Jn>GE40ypDjOV>nGP&W2!RzTl7E_WADmhNIRdgkA zK;!vRL|8U@W2Y3-#yp(ho+w#HdC#>g51&%#e=%}!ao0U*e8O@M9CL$J(YFDx^HUaM z_m56EteQJ%%#aa*gN`|(J)yF5pJ7pR)C_^mDzQ`ZX8=^#+nlnA80KPnXNqAPG1HOH z6eNqz=EDv}M?J>oIXOPKq?2Viq=_cTOt3fuj`aj=KshBJI%D z@mAHIWm&mCR7+z4mRx&tU4DV2IE8$~!VX4z{{Z#tJHmP)mgIS=z_;BTe8aDL>#k!u zMYt0MRdC-iAp3#Wj=d|Iw7Hq><+ybS^D>6BdaG_$GQ8w47#!ob;arBNsEI=ZjQ6WP zAk~A&`wj`?uLqvBfbukw5_zhlO8T=L%N(KmxNbOn#MIEIOw>p)*&Qn65tEE}=ZfBL z$CpAJ%&}u_z53%Fz~;LD01EhaOTwgu5rc=xz;AlY@VAHl*mq02(;cu*IrIj*TdgY2 z#@%8H?D6(FRwvUVt~jn5lD>!1U}z~Ty^OCAYUybZiWyWAyGXz%>Fr!Lv8XiiI6X6; z^XppvExhuNlz|jukOxDW<>s8rAtdCQ){Huwd4+yP;)!AzIX(Sq<*Z(74f*uoReKv| zo*fjc#;=d16(%v5A{{ zoy{gW$zG(6E6L5DEem;^_`PQnteaB{0>vN_nAZrdLn|&nyXls z>OHIFrQE@8b+(#haE0A+?44kZM-VB#vKftTI(bN{--q=kvu` zHrSA>?3gk8$Bcpf0OqSla#rq4!i;2K$`1gZoOky8X_8wRr@;)v!jX3P_-BR$c-V)E&J~Z*G+nY4FL!1)yZ) z$Be5sGmuYelEx({#>!T3K0$}Z!Z34#)br4KQFR2d6_)rT;{ir^Z1QpkI3L!nY%PfG zp_;{JmMLRsXGYwra>ZK;RQuqbmG7Ul)x3WW{{Y~QlG(aT6#gsl{+_DCCE0bYVaakB z@HUK&_#Hb}&i*vKk52HN{MJgTb8Mb(n1cm=Qrob7Hv8AU{{X>TwK3pt*pK0_gr|g+ zI){g}CzZZu*@ET29y5I!OJSz@||t$F9gC`i(|z#ksWg6g&Rl%fJyep`Qnh6pk*68 zuWFX z&JGCgp4h5V#Tt0B&8Evh&`d($wgFMW9ll@=4>hLC^Tcgl7^aN;<AWRx@v@v4^qV+-^B2hekxWU-)# zp#+rqxH$l489v;OD0-kroP2$>R?%(Bjlv04i5*j(H!1eu{cFkYcL`=i<1AYs{J?g| z?OxIGzQ@k+inE3a?iqKS@5d)6vgBhwO7Xk+%#o8hjZS(6&nLOZQ~v*Jq*1DYBymV~jloV%Fy75Jp6-loOBrA z)EXWKi0(pRi&_E|GIwomzm98Tox7X1?7nypj!76N0l4Y^0N1UZHNSAcvn*t74Z8tH zuhX_V);w%T8Qj}gk_hKKa5L%oaax*CNMy_^rBS|R=OZJoefrjNS^{UYd?aHpfg@YR z*xq}hfOfF?hYC83oF8oa*GnPuNLj>e_U=_TbDq0_9sLKU1#-UzCUM~#h?pef&-sgR zQz{15JwZ6+itEXdCSR5(C9*zJcpP;+pG?*g(^IAosYc-$;Fz?MMUjOq=tl$j)P4^> zR-JMa&HdfvqoxsC$^lSMzqf3DReY(5yKZxT6IMw)5@nNWt4g1}0A;{n zI6a6b)3tPyN#{coER4$PFu{imJ->w3AH;}+z6icz6!{Mvi@4;l2aMyft*tI!wP_Zv zsDKy~18*FFa699<_orlpoysbF&l%~CBYSq4CQ?>H4@g>9H445HbxDmoP@b! z*<|hj!J<_o6>-y}D!Ur2(Zi=rG>Xt#M2ddU`y;khJzsN>Hs`JhIjr4FN{7ZC9=f=& zxU!2%QW>>9M&tBf9@K6r}=r`@8{20=_Px05p zlR1JrKMynM9vXpyw$UZg%-2i6&z2;~AnogqA^oa;K72&dybr(jl`jaK1uH)N6{jaf(pHGGCu@BB-7tLl>6-s<-(T2%#2*grE@O~KBwj7}iD?_^jWV+bxLXTy zBW#Q`Z7hMoB(m{?^H0Ygk6t|erM1W|{{U%^8Ec+DyN*Hjc=bzz_8U`;pxfA{Acp{+ zRX1UX$*jNZ^W^#R9G3nSBP8`Fo(LYbNCaK(qd6P0-zg2-^dE+4r_3iIZ*63YQkvf6 z7{mu|HUW$ePtvNrx~xT!9kY#&rwqNg9>4u+={_e$v3x?+;ekSk-V#X3Oqfvot?F~1 zeAWz6$uk88LAkzGQ-vAy9Ys@CB{bF1oqDb=*Clo&c*bzwm!(Cg&dYG(&Q?b9oH5S; zW3R7H)qBL2%LqnbTgzNw6#ThA#onvvF%LF&jP4+P?YS%R^ONhy$NvCYkjiotmfcM5 zOYl9I&*PkWn%@ijSe*6sgFdzJ{quij#*%!e z%TiHC18@zGrU>J;Q`S@L_pK_fLm>oYVL9*m{b`;NxHlJrsPI(o3 znC@RmTG~I7N7%`^Q#ta;>zw`^{uI}hW0E!BxUt-T<#+?IKKZB>Nm3jmorS}kk&eLs z0AAfXROb;znd4B-HYijq+kFl?4xMSe%8z~~Q3j`HkWPFNu)_}ybaG0zA3Rx&HuOxcQEEWDb40aywOdfOd;;S3))t zqW}Zb^y^N7V;LnrS0Jjf9I@;Nk)5NqR=_kyTmQPVl?|?Vg>u^`w9mx(brUUIH?^cy2IM`u-K&9g*iv`^>qw z_c64=gEtBzVUB$>-yMxI;Sj`RW0F6FJ8H}UK z2~y0wvv%XSrFp>`;w}rqTDPS^rBOOj~K9vxyD7_1*MimvLv@hxxo_tFb zi!6JN(lRm#=eI-OKD8T|?r@u2Kvmh45OAdkB>InI(-heuk*&fZXvz}A44!)A4_xz3 zSk^h=GlXem1Tet_k`6&5x#O<}qP(S6F8z%#v5g5O9j<(b;kL(v;fzWdQt_3rzbDEF z2an=7C-JB!V=~Ioss&I-CnST@udPp@!jO1A<~T~MvFp#sQ_2|IgV-G45$#aR6TC7g zQp^;#9AspFll8B~F{;((ywBP2a^|HUL&LmY79Cx7Mo{nwCy~!V?~3a@d>HGuj-G0) zs(>7UpOkT*U!`)t5J8Jn`M2jEdmqZW?;A4QYf=a>@iZ~WpaM4hgMv>(oYyis&K4CS zM>6MjdFQ2SX*(N2)JSG50u8EoW4g1lVwP{+mJQVP6?Z|o@^riPWdWHN7(9-6{3@;{ zu4mqWk;%NCM?x}1L2EcJpaRRcQe}r+ zLd)hZ8!CE{wEkUd8J!;)QNrNlV;Jk7df)KM8N5jWodGOdVlk4#X}}`6^(^tmPJU$s zpRY;-TiCC7i?tNse(PRa@QJRsjzOjNqS2x8hZjT~rwz zS-#H*$WpigeGgx+LqHUetc9=!;m=&|{OV(cwu zIKj!PxuVewbQ?IqCWzzy=*iA_r?NX>g5QwA#Rl1&a?R87rOX#2+D}7+oadpd7cuR& zwNN^vdvThG$F+fN!2Nlr-bUU{vlenT9{hFbO*@6i$_6bEtD=D zqt7nCHc#Cd^y@;RykTTg$fs__;E%-qJXT~}vkJUmM=tEDhEmup0N@@v{{V$bt%AS= zJHBFjp8O9=g4QVDIr)Tp^TGa|x>N1p@>N8D;h3Po<#IE-=uZ>?;@jh9n`X=)s3yGW+x7$u|GCCboD;o_0M>HOm5D;TQdNRQ8Gtf2OW8>!rLsa zBLMu!a&UX}`gA6tqjSkWWj)rP9sE?1A1R!!H>fAuC!8E@!S^P;tK(n9HTYfdZ&=l( zl0}|an%*`5WXSmglhEYXjQ+@4ea^A*>&4?sx1QoxRsR4-f+l%)0(ih2XE?{%=U+owAE}wJ^wvJOMw^A-v+>lh2$$U0I>smr1vFYFNPoEI@ zWA;w{l00wm_x6gqp2NfMs->N(Dv2(vz+aW1};}h?-Xe&c`yMxKvCs2(G_CWgE?w8dx~~3%`I7_?nx10 zZ$C~z&*%RD)~L}=F;l_^*k{{}<$tNDW5(`y%`4pvZYrT8G@u>W<0Fb)xdh~lboZbw zL8aK}7juE!`&Oox85tzxWAv=0I|w|S@%5{=mqBAV#y-4$KGiZ4mWHGnpt78-r1^6G zp8o)yHts(l>;ME|kU{&v_V%oaB{N+gGpTNU>p@st+Y!0E$hiX?u%xum#p+11Z-H@x z^R@@601heZc=5`EA!VQ&5MrElB9d}sI}e8TMc(+m6dm3ao4Be zT_?lxPud<;T)U|JhZz3=8smd7&({^#{5cKwS7^`8=3ryL9V-lHyG5RsU+-6m)k`og zS)pR5k;Xu-!{K$GouK%OZ^*|{@cb%vyK*juwTTv^jXX0!!w5QwcK~!Fx4bfKpOVouvNhS09yUM z`qwq%R#T$ocVx;2575@`sdR4dUbT}GGVl&6{gg6F2M6+^P*6jqUE(EqElC2E zAgNHG9RC1Hh{6kyxxhc2WZln3Fp(O$VaejG$7^vSF^OMdjFXN4sKN-2NDN0pPZc4# zmNGz;?QX%isWggfag8g*m4BNZN2L+S0reDY-PB``T5z}8Gy2kP8o@i=79o}vKfFfd zb~vZJsk|7mjN+k4^Y>|6E9=Ot9_M@>gsSBAVb84_31X{;+Iv(*w-JB^0CSRYk4gV96eNWxcdQb<%W91~ZgM=HV?-IY(>C#HD(YQ2;haHc?n zo-@!NTG43dhAhG&mN`F)HpwH?9Y?K8dYe;P6$R9>V`M}!j!$wbrS0LH=El-`)R(t~ z-LP0^wt7`IR+WH3l1)?>R%KRiRESPlxjfd!f#K%AljnSN;10i!w|bvJ@O93h%H=S- zus0sQxURAEv!dEoAxl5Wwc=U@a8+Q9e%gCevc>#gxf$hg$ zwa#mLnnukXySqo6{Kq*yxuw^9KwX?~Rt?bOkzC#7>5<6?nwoUE-ltA48yqZoVkOnV zo?f&n?Wo~9j%vhl?jpLKqO5o@=BoMGEwm;>g&D4g!&)EPU+3N2jie}(iYw2MV)BNDcF0P-+7$EWnJ8r5x~^jHiZwAJWOqiF*~un#r^ zxZDrkC{F{Q%lwML@pp$>c^>fA^Fxyi{Sa53~buQk8b z4a1zA`ef#?rw3Ks_Axb~gr=i?NcD|K-ATGa%-F{#H9;G5RCf~>at}2%q*)`3`&Xi) z%8!tpcZjQVPSRzyh?DcV9Cre&S=+7b;jUbr!#V5I)YVIC6L9LJH@VxK3X@S`rvQjZ za0XA|(y(#4=*Fsw*JDq_R^D}#doC2NL}3+yI6Y1WHT9m2e=eP+S;sR5kXu6<6geCy z9CjRYo-5-$9x;Eb+D9y&SeoKAXD1s0Uf3zeYD!SOIc-zTf)1>;1u)F zH>lv(ITg%zC7{2vx{gE{`-N~lIsSFicp};z*VEg8!*W7dmn@_VOkSq6 zirQ2yHsJ3VVyK|F`M4O*;z0MS7P305Z>meQrdx10Z1f#^)Zb=!RyVblS;s8OLhwoG z52rW>@iinD5lJzQ^4(7$DJzh}xX*E1a_DPe*6oKi10Ne|m!1K;WZ}6(#W}&2=rbTpbkhEtZax=Rf$@TW3 zE0SLFTW%4`l0!B+j&K3({xp(li}sXh?Gix1hVs)3xOeNvJw<2R>dPxEb8ZqdGd!MP z$iU+s{qb62M2_a%>GzK#wp(e)0~k0xfg`P05yuYo+lGe>#Hj!RMl+vdO-V0d4%VuU zs=N|%K7jS&t%;_J2N#hflCy4H9I}nsI3D8z6;j&dUChN~W!}tk!#Kd>KKK~+tr0Dh z_3bzQ64><39~*9UT|(Z)06P`T@}wU*?abN#0P9z^{{X>wyg&zxejVsj62Wzie^81z zOPw;C))TKsS-xgWjpvh4u*<=@oaPRWkF~_2u z@tWtq;IO_ai(CDxyg6kYuOn%G5svfB+wuXZUR+Ap`uPdZrGBfCN7?1jeb34B+51e& zOR)$16Msye`%v*2(&tzdBH%7CgDc0)!OvX&6jtB-6N=gN{{ReYx|P63Nv23+c>nsw=xDDe5qD9ux`Ou+`n<~K7dFYp5BkBkpXxi&G-VDD9OMN?>lylfqw7eoB*^T$ z?cvDzo9kGA*#OG-CC#wGdlh%MZ?~74q!V@H?A$dITxjljH zjEsBcyiW9aXcK45M$kj>JDhu0yZk~|ZwKDO=orM0hAWjM^(XM{UKM{f__B)I6+p_2 z?E|mZn(3jjglceva=uKKaz~I)54;@b+x+ya?Q;~9 zu0*Pt-MfNVdJm`TS<53I6WGX)2zT=llmc=}cI+=Qus9V?~XGP6T9c0kESPKf-b8 zjy>vRGuXZdpo>k^Bf64RVJZc{B?#(zb?SIM>$hcN5c@jH{{XxT^2wGX9RdF689A># z_#1R0xzyv5N7=PYE_Sgb@-PoTF_Jm2K?r1@F!^P8jHTS3mT`ELs&6=z(&7@VG)y912VW??PTB$A^# zXY@o*=4`;HLbr$6f~*#t6?^vEe(1ZwhHsM#xe~vY)#H ze{Kou+lq_DQ8d0B)TNONV%X&f+M~L&b}RmIP4EF1UJtM{I?Ey<2W#>GI4ifH@J$uC0e-t&iq-B%BpAU;#X;C^A-5vg< z?Su0i5F{J9${bd5s~D}#;f9>8WO~)L(n+Ycm!w%<>pI>G4Le5Ld2$c%q>qst86zaf zzziDmZ`w!VN5jv8;ScRWU+nXw z>h1dv_#W5dF0*7Mn&-wIFp2GSsYwMh6^4A<#wQLQLZOH8*Cea9dJ)6Ip1n`1v|rmF z$KF3nh5eVcS$+n1GUX(aZF9s@!KiqS`3ME1d+V+7!lMKoo@fC4xW-4#Ul6}+{{VrX z3N_1(SHp5^zqGH9iD;+PF773VN=XMlyws*Sxr{MC@$Zl^!t;vxE8~yH{{R~P*~Z(% zf3)|BE<9hU+b-K{d)Q-xPSfHCgtUS+R7F)d3`0LaT=(I=Ab5vH@Ri-Arjj)orFeYF zT33&3An?B+;5p~(=~zyEO_Ez4&GGN{^!U5`Na^QF@jr^?@VA5(L$|{I5G|%@v8htK zCY5nL&Qy?m$JluJ1$pM3rbDK9MmtRg2rc5alrqB-h+`zSc>r)Ro_$HK8pp?)Y|fG2 zNplF^rA&hf_yy!-pVGT~e-vrDo|>Y@_QqYuYdlhY)(583)bqx8tgmv}e^$~YSwcI9 z1=>K$#1WCeBe^4*;&hi)zmz}=FDODD-HuPDI#*5N&mF^Qc0_SJp%D}v-zg`n5#Jp> ztAVufj+Z6f+MCN;8H<-_?xZMOli2h<^F@qa=SgvNk?F0$VhO=!`G#;0&{kaeW>nsU zmgS0PC+XaKcdXfUhSb?wIb&j(%Bcfr?T&JB$2G5Etla4KZnorRL@4OW8$9&Su6fOG zPBsUkH-00@pBqflqoh|h7I%e9ZV`u!00{RgdFhJFww5^c9n%u&^W>bLo7)_cI6jqo z;>V7(sQg`N4yu#D_gW>5z>xrDISv6VI}Mn@;9%8lK5Z{mvnRtkt&Fp=`C@qj$b@wp zdk%-*w3^hIY>ZD3UZ^2sk&igfE6Miv>(5S|>OBDipu~hRB$X$e^V8J(Qfu}XP~2wi z33XxvDGUhp1a&=rxue5{VwicxJ&7g}@yP4J_v|Y(Lp^Rw7TL9SoUz6^B=T|Uc*SVw z3+LVMlx{`I1%7R~C~L}u9L&s_MbEX?e6X64T9gj z3gNTJKK;k#K{7fEiE}AiexMPN#xdVMlS83aZ&nNQzDe&E89ditm6m5*dBX{HaQ%q8k4xuumE?u3J;0EV$ z@4BJ5y4^5yDF7dp@rB26kK}36$CYBNGsf>RxJ-_x_4?Dk&#@g#gSh0YbM?kY13fEF zge_S{c~^JN!Otgf8S9=tpU$4Lv~sq7XTVb+ZK~%T20B!C7VQ>Qn+2D60DQy_20eM= zmfsP+cdSKmB8+H0&0+9;AZa&1K*F?B&sk%AR={;kxvw z;kwxIv^e=>Do=Ieu6zFgfTX+zMLuIRfx2$|z~}Cs`KWC344du|gKs%QkPoKPJM)w6 zRHn@3O)}|?t|Ugc=1;rkXKwD~`ycQ$%jA*bhk3)cOD_DVJ#syG=RK*UJZu_5(&u(h zVhHpdy3-mnHLH0}nd%E1VFyfhIp&7K*3hSZ?5!k9%nkwEyzb9Ze;@PBS<$4Gz-WVn zQ_!vf?Uf+)&1by1bt+j{U=}?&6+WICHkgK25dG3QQhj#R+|apwedT$6Y?3OEm4XbC zM_iHD(-mai+-g4l;cr#0%#X-$!9d&n->9pS#>;$)K2xwM zZmJ2%`H%VjRNTGR5Rbf%kz=}R4I2I#ROUTbdk-)%W3`i~aez7X%~!S5!oqhZcpx!2 z2k`7Y=(m70TA2wL#-QqB?r`#S_WuA8P{$thkWN#dm6+sb{{Yp+eleK4;;J>={gVK# zLOzF%d_qq$@t94V<65 z+XvIux(^nXz55iqvJISja(euOpL*ivJJfD*g5v^g5?hjU!2B^y)8{D_z+KoW)2QT* zr`o6_ZXR&NkV!euN|#NE!JI?5Vl#uDI*jI>(41^HP~KgK%Yu4?)|q8)T2Z*38z6Db zOM7a}ip;H!M_dAZsI;_G_qiCz$)|EneM-e4xhgi~D9$~{uX9Tyf1?bNgX^8A{A%Bc zZA^N!fIdq{9zn_kIRnc*D+bJ$dx3#fNE6m@@Oo^X*@}xE(Xe{X6xl`h~)^h|7b6j=c}R(vnEaF9SXK>rq}=x7d+*Ex(c1 zoOGq_5bTSd2AU`FZI7D61)QIoX$Q-0{i>Cs$23uwWjRm)Jx3k?0LHXF9oez*ww;Zo za{1nPAG>OT%Em~o6Js&`-%`2H{{UWxQ6P39J6(dr127zM)|(`%n}KdKw*Y(9#i-WJ-UEN6( z?2HwH892xT9S+`oaYL9IU$Gv81)uFBrL0#oHPTt$yB}e=~nz-XsLM|=*+@s@JjGF93FaPccxK~W>{<|9Q?q4 zci$fP$35!MK1`)!4$PybIA5oH^yaIZk2o=r8J7bf5;N00{REv%V<$YFJJw<><=WgEI+SD1L){tD~jQK!po z@Jqp-4)9Y;6Cl(k^EJ&{1Ho2~dG^GNr#~=^{{V`yq!%vd-~J2mj;XAuzS8WjBCv)t zb0zibi#sJx`RHbts+H@?lgP&=w>}=r;h%~A4)GSP@V~{{cf`wY4M8NDy|00;Bh@do zq7!^_PXQ}5w({YW&21c;3O5`RUyI)w{{U%k9e&a}_`dkz;@=SXt>Jy}CZ~AP!3P^p zlWs8#LmA-_c_j5UgW*3PYMu$#to3gQ>NmPxr>2wkOUoOHEpBZx2>sO2GQ4>V!{uSY zBcZFZz0UercTsaDeNpkhsB@2T2cBJFtHuaqp( zq7$$pv@Fb65O}XM{iXi^V@-45vuXOSuXCmNufkp@RlL$XY2o{ZzS6Z{Gbe14pPmbx zg0BSFaO!?%7&Wc`00jK~u3z?b{i9&lHQVU)+kIg!EcJatT@F2R8^|V!_d}>@i~zre zNkn_Xyi)*Jtb?5Xh4^#!SJ6HtYT8eZf8d`QcZ0M&Q^uB4-B0j>?^0{Ohu<13f}gan zhwkPeT51ZAO0#LxD%@K*{e+PqIeZ9qq5X=eRoZ`O;_Rl^qD`|dX%oXW)2EPD`A{$4Y|H% z`MTprNXb*UkT5f!^XpXfGQEsMLQmZ%6ypIXNd$4&R;bgqFUrK6=azWj_2T!d-9l7AJ>5zD>&#;)Z`3X79gWU8#ht{djZdNhsaoepN z<)%#%pnykY)$Zt#&NlxV{SgGX}!5sms3c+Gg zwSin?G^-8(JaLYLr93G)!5w;^=|hmNL6u2aj!&TXt5IC6Gof6LdFQT2PtK!ga>tR$ z$jve0CB9A^{{WoQx)HHF0%%nM846ecIjWy#D#VSxv&O7W?DZedy=8c^261cVG1&6wuRuEST9Kq>z>a*XqJUHZo(4X>>V~ffcYp`q zjGTH?r1@%G$*VyxLC-52DPvN_H}1n6m7+*|@?Zf%5F(ydH;Chd!toaw7 zYSH#wmWo4FaC+5=i(EyS0R#Xu>rfc`f;!aDFi^nf1Y;d($=q>TS(O-k+-9vWpIfXJf8u;+Ds2WS$QLBxH2Y^{#hWvJuS2K7+3u1L<12 zb;_(iFDJG;`qS@hc9$duQk{BW))9QH?wnOfw9(11^5o~Wc0K^{91%z@^^+4L4XR}5 zwa#ibK1<*o+lalm$YtU4?hjAKvGw1C ziEliM8jur?c<0;e>0G~sej{9Xe5s9#W3M65@bd(=S)KQSJk zl{n{j%suKEv>7SNa9EN$k4jd{58h|mqmLnuNh1`iAydXP*QYfN9TAqAidSeL^`IWP z=9IY|dYVpvi~@g^BTd8+l6sL!@nn3hoOY!1N)9+aw1L@=9nDfq$+RJi?+Olj^zT#0 zX(Fai-8eWD_^o7_f#)OJn$ow@3&IGL1_O3SPxI?jDHN%#%(S)LAqZE~9<+@sD;=cn z&r#O3r0{jasya&vE&kRjdryXXwb%_6yD;Da4s%PHbu>_u*&O_Kk9OyVW7MBdt#w`< z@FNl>xdS7CxO{{BYg0w=1o~X6Z>^soeA`Fm*RKYy>pnJzMzdtNRStt_j1CW`M{HEe zqk1Evo*ppwrdgIad^=`eatBld0rP!Nx215NDe-e%??jO8Qb0N6j{N)9Z;8BVKB+4+ zzbttG_2#+xt_;n|&238$DQhE(9h*XuaHY8W%fmZxc>Z+=QpcWYRuarJnz0qG^PE>* z)D@BQiZwA3=8)K7Ap08A(lo}smyUyz?NQljZ*c4v91Qbbh2W0^z9VVKP|P}vpYZfG z%U-HT_V5@7Qb}09;GYHn74~fiFn1lKH>vdcRj(O%k{tt2SXH-8v}9)h4D|=Oc*my`91lo){v4hj0WSa zGTIE0@5eQv7%(U~P%(f9T2r4yRvwQotU+*e=oyi~C-`znKZRyXJKj!OVp#oZYuUW{ zPftvGRB5nKlX$KO2c;{!R1c}p4Ihz{+nxkcQm*5 zt!X1mx<|43A8|RzUV}Y)abGI@Fp5ok;%rn)-1i)Zb8lF68~u z=A`R}_P`x@{V`q!bnM`aWR#}tSxB!8tM+|CFXQ{WWg8~j=-=M=$5YK|_)o;Cqlu!s zl1oYDxyTc#2+kAkt8~r>A6lfE;I&qhP=X|PQLrK7>Fu6PbsiTHO`{@B8r;J+WJuX~ zLPr~iQ^#-CzILUWvo0#m=+ui*W{N3pkP~zak-8kCWPR>Ez!>(c$tzwc3Z_<*A1TOj z?mxOPdRI9wfh^;={{V_!d)+GPPSMPKzPZVbxa9TCIqtkiq^XlsvxiVif4wD)pS_cw z07J>ow?380$$g9Gwyfx-Yf}qG9qpw9bU??vpO_ARmI>+2MCm=d`GMn-GJ1vpV4jtm zY4Hxm@cA-LBgl=mST0b;=z8azXFZ7PgID3y?WJ$rTkM#8z<&;X&v8qXT*BQXa~$e6 z@WA^)^HhHKlZ*xFjQ%*NA3#+yKAm_YjyXv3oDOrr$EhQcT2kG4h!zQc(An5kfH*kg z2dNy?FvSJD1kC|SqTG&2+@$f3p&k7(O)CcIVjH~@L{V-66$NDZTg>O4rCD2e%Mu3B{yll9@16_9Wxa(X0kU30^Aqj*RV8;~ zUWcZB#JW5h=k15#JFAk$PYCIHw~0`uSjJbjc;*sFDjpbriNSwcz znc$PoJK%azUQJm?ncbeX2sceL_67$nhPmB<*utATdaNC_6VYlaQ)?RauLFrp? zP4=reT%-9WG}x?iV{ZJOr}|Y0Q$Lq=iG&PSqOs+3+=0P0TI+s6pAs^B{W@UhkMrKG zN**HQq(H72oOL+h0qIqyiS6XN+FX!>4UDioa66y=wG2iti`3m|H$fH^W>c|Lk%Nrm zo)27C&zC3|{{RWk8B@f3W2axQZVi1Es=|`nPL4M-p<(j{?UFOx=N$E~o^?cTwcM#= zxVtg=GmoY}6N>1=?#_Hhi5SEgkbvYV8@b>QU#4n{pCiQDL+*`~PElD;$})@wPh9cF zD@3U+`=#D;a029$>Gk)leNsS|78A&(F%{ZAo@VwXvlD&xqAFfCGH|;CBB2c=gR>#tPh!<9JeeQ`8QhPhY~ebXVCb2;D(Z_qLYZ z&;I~lueD3qw0dX38-X#1&Gfq4^fQby*53|DDy~nR>P`vU-9Fb^5257 z?D1!naJUjhu|8l4B#bui!=Fm^McVp;v&S4o+^ZeDk~!zG80N8-=S(^k25lH51I~pL zbZV)>=dVH2oceUC8ayi>j&36pGRF2lcn|fgt(=4HlUg@0huVn~w%)sPzbQTNeQLFe zgz>GPmlp=oW?lh8S8jd#gMmoe-Hm8%qlIC0ZQVk~%bXF&Bz=1tOGqS0h=Ex*sd-Ns zd>oPZ_QxDm_+fExET1@Zd;r7&lfn1wa7{<3M!I%|HleS}{g+{!3#-Q#@CD$EJALnP zqcjuC+@+~npX}SWmu3ts=PZAA04I+|&H${Rgc00a_y!laHkNj)=5DyTaTGDCu>_Le z!|pR%_I5gtj65wh?|>~MwD9G#hL^}JV1MH%}`0=#V!9*2zAhJMsv5jCF>_;Sz1zwlIVjM_(sJTEMm z(>yO?2shhE8!U8KS(;V=fx1#gPu;JQ{wsgMTXmfh%3Txw3Gd*Dei&)8A%brh>ybgI zc$(rp*dJw1VY5xVe4&_b$=y8d_{aSKBcVQHQmg) z&jv>%g&6yz3Oxl)WoHG{Vp$y|K)_%*0lRcHgsK+Zwl92U@rR9nX>T2m6n@d3IMqCJ z;tYmMyrz_ZX||U!M--4O=-3%TNCfhFa(%kjruc8emXm9C!oqm&?oL)ViXyGGfmS4*7iexX z^fZ+2XF2t3@;k2>+W3Fr+!h(PxV$j=aVPYn5@yZ zPZ$8`Ko`H`^*QZR&ZnvzUpA(Hh#J)=AJ{>>h}979e6u(4HV;m5z^zXT2&J*i$kMWs zHzNQ&a(#2#y;kw&hPoD}vD+JhuLvw;jgxZ|)MwYIu7lwe@g=^Y4ZtT28Ow&+ikKKp+b1$du~A~yak)Dd`%E?h2oBxi%`>DIoGxYjM< z)9kl1BM7?38R|*>KgqA0z9fu%LDm&F4BQqVji)Z7YOjpXcNT1sOCzc4XIVo4t&yC5KA084+WD%^jk`Pf0=mx%+$vbemtQQ5M#4sR zk8iDX#e|~K()?MlpHs8&o$Rti^2_1$jhKA9{HdfFJ+t%vHO1XGltWJ&D*=^a+p+mq zp!lXJ=kUjZNx%zXeG&i$6eYrU9^_{{=N+?Hb6WYThAoQ6a3z#-dsCaaFtw4&FN$Z= zl?9ZtGRDC5I6V6HtxX%^fwyJz;ts%uD##B0c;tUtX1C$^?w50rndny>W3L~TV@ctu zR&O%iWnf$Gw*`I8W?2@vsSWMKwv3JTiHnu~=6-Aw>B*|`%3j^pby9rAIQ9H1Lh8yr zD^zoTZqi346kv=$104G1n3`^#cyR^O!dQSj-;@LClj&5N6pK0~Oyb8f&QG7ksq)23^u(QT%O zP1RQQUNamSO~Z!dbnGw=eKA_oc9Jov@Sjk85@9dw<>0M|S(iu%cpv~Ie*M7y^>>;z z@t;l%#~~Cbkere|4m)J$r+VOjXJE2^&R!CDjN)atc)(H$kR@z`k--`K>$UKy$#9`q z$0y3HbB2&w_urgYrKj%v$=*PgX&7EO6?J<*NfP-`~bL`A5I_RsBBm$UrCD zu!31cgMz^0BiqueYp^A}$jHkCXg3n;lEn4Kce?LW#UJ5E{sPcd;1D!+XcHa?_Lh}&&%RDr4V)$t-&X>(}ew*otJTF82u5B`TzooQ5RuGw2WF%|#4}BXW0dYDFE9n~lb=J-5AmyL{!6TpGa|9ykUL|z>(3QkWC0dg1Cq;}0x*CM zPCI(ynH-Jfos7(bg~-4p^T+pTpc|@8R@t-i@8={E+2cQ_KJ^1MjS)bnDhe($l^N)L zfHghLjQA2Pi@bs`K>%kQXP(s+vn{?+cP_@j`Lcv(Bo9hz#57(@QyUjgGblF#KfBzI zL&aCULmI9&BeLLQ<{3VMi^1k@+F3UON|VOn&re@pp{8Ek%Qdhl*xbM-Il_()UerjJ zsZQ=alPZLKk%e5~DaS$RdYW~MGI?S!7#7@$gOG9jUdOFNJd%B^888%PJoOxK7#_a0 zqiu2L$W5yq#B!u(D~|rz?bf8!h)hq)q#|H~q;ku~bDw&*1>c*g+oj60J4gh8HZrIA zkUu)5EX>mRa!P#QL1!co#A74r&*mygXLQx=SxYgF;x|xK9O1d+>CH_37F0BnK2(Aq zDjjU0Qm0pym?+6$CUpdQ05Medw&9S$3lZ~n=YlcZW~%&B@k{CY4!3EcTFYao!Qx3; zd!?D5&r;It1~N9F0f55tNCek2;qQreD25Lbpt)BBM?6XvR4vf3&KP>v<2i@Bh??_1 zWWc-7gYq5Xj}JAq;w9y(mVLoPsLKL+^TGD|)Vh{|aj6I;w}ILuw*a!HP!CVj^sbBI zcZl>q8frQ`-UINBpM@f|(^Asv8+}r3K{Xi{{$AauP|GuAw-QL<06!?MgW>0mejMq4 z4}3?Y{8#vGt$3eVzO<4JH(k?wVLp{MjWLY*a+@Xw3y`mZL;dB*^aq8zo$#ol(c@D1 zVl7F@g4sh7cM_p+M|_XYtZ6?FwnKL$s-t3c&Nm#7U-OFU^gB5W0d5MrNQ2D^Fr~Kg zMtTBA0M|>QMLmo+cNQy>u!ohJHIQ`xDGkS71sur}DxBLMTR(z+)H0DL85mbMCmH_$ zCYcYz$0!kDamF`p;FH@G=#y!qYrCqXjKzwC3(4n!+a8@N&AylwZP$&*s3#yEP66+p zzLaw#K4Xs8d=Rg$N>NINjR^$fZ^#EZ9DnueE^mkOtP;B<=Y9gVcWx)Pdt$wZP|{xK zQ_appI;kBFcwiSc?aoU`QZNmgI*x`k*eERd_B;09dh;ZqB}?lAPln^=umFyhHmGc(=j{9G)s~1uR#N&|1X?yXW6sGH2vVRfsWc zso-Ssp7mE!*^M-Ou?N6!5?$HDbEWBPc9W=OSZ?8V1pffCSP}H=Rdo-89woL&;=Azn ztrX8M$rNa_%G`6dIGKq)z!S}WkbD*Y0D?mJtHr(+x7R*0-f7+m(2IGj`lBonl|18l z0k;(&!<>`B&3hh?@aN#y>|d;C@8F#eP4Nu6yGAZ`DJ-YbZ0*+#`|~`3?k)*zE>UpX zm#12#3x_gWpOQZhz6JQg-^W^cxbSa{cSO?eh8MoS}<@u>zwevj67$56mNg7%$sA$VKk*l>KF{2>~r6bt!eCJ`Vi~Wiq!nM zJ`ui2K)TX(_yYEQF6i;!k1ngWjDqLOxLdd!3;{GULBIa{QIqtq)|(A;#(q=6JVAR3 zlY|?Yyubh@vPMDA7^)sD(=}fl2(7$pb8o3y+el=JJCs-2=eqoXiK+U$pF$oonm;UJ z@U&(K-s<3kAtE#&ZkL=Bj`-=vdcWhH4Rph&`ApH;i2ne046ZVVzE6CfYxH7ogm!BS z%X_2vXE3Na`zQn)^d}t$917v!@Sd6C3rQr@{1f5Hu72d6ecm4XYVlYc=0QBpHz{u%}`X5sG zWu`i}m*D+4PUGjq<}8pn1%T*1eT`*L@Vie(m+XETu(z6DoxaZ_G2O;VJat~3=Vn%7mN-&=iJw&+$PymA#$S|hH^)s9l_(?s(3@eF=$%% z+cf<$TOT&jqTCs>Lm!k7PkbIlQ22rI6T`m?u3UKcU$N7q3!k$*qDkb*z}ph!ll0=D z$CRYGj&sDD;?=TvRz1c@8R&7*dJI;!rvCui{u74f$_W<)BOkerIQAUZiuk|wxY5@7 z{k$EeYMPmI`NwST>*4$Dmk;6641>yJ(Ibx$=CiN_;bNfNS-X$G^-a?!l}4de!W#!B=`DP z$(rAb^=}Y-{vy@&JH;oJdzMr={{Ue~QS`-Qi+HWoe$JvG*~tn4KJ?T(nks$IqxHYq z^TN7fw0bSRtE@^G;h}&*6oVfr%!eZfuN>D6;&0nST)%Jlr*w@UObizfE49T8c+|tA5m95d2Oi`%jB?OH`GzQ%);l zq-WM37>~xOd^iuPc<$2n{0q6|yAjJZ!7|Fs;O%20<+H{*_pV;vAM`LlIU^${99LEF z<^lFe8*oWd_SMme93L@8e+tgLxnSAtRO@%KPi$085rd8 zTuT#8ZqDp)31&{ToGD#4cxAZXA@cyso;bxz9kEgf2a(Uy9c!TR*Mf(D{8@9R$1~65 zsvj}aW1YhzDtZy#vPfOod@7Tj%y0*6n(Kq+S4S*pPYS)9)tcO7Ktm_V_kH@;(!cOe zzuRqpXFn28;a`mhP}Kenc*6SLZxd)YcU@^%(IW=*1CZbc0r|wtBuY(Qy zU-((ER zW&A9-QFXR$p-seTGb;2OlraP7O@8VB0Kq3eWWNV^d*CO5ekA-|y1I{B)qVhKwmQb2 zad|u6jV|u?aSh{#Kj^mq0B43c?LrW&ttmyqFTwtt3+5VQ_MB$s@H>*K@+0l5Xtzajiih4iD2G{;GYwsbwE3^NjPwePa*o z1K|s>TGQhmoUtzs)A$coiB++X4(U33^rx@<6RSa)LDK#*_)7%tV{_q+PTYaq{LD}P z09zDt+)K-t`r;`XF0*FPYM3QJ}2>Sm~T8s;2#fpWA5vkh0Uu<4?>$Q-#?8< zDXN*^X4njY&QBb5s+yLZR!~46Fx`>Z``6U*f5A7kx!C^z#m4v`$+Lf&z9_j=Vd@y! zb~QVH!7{u_aTL3}dGJgue=hUm2@n(81+4%%spWUjzIELBCOd456)IQ1p`+}la0ohZ z2a`h@ZP_9r^{)kUrT2pg`}|5 z1=KP(Or(Hehq&UCiz}Hk$G*x>1~5S5AK^&Wis&$yVtSA8`q!v8?9<}dllQu9x@|bm z+Ls6X^!n5v@XmfHD&jpl95K)O;kXWY$M`qjM}+M3g zn~OQOMvQfXb7HMMiH=x~7#CcQI`DcNWE#%9 z_-m}2X+YAh+vU&P&Ux*QxyMR+lBA9W<7GR!2cRdn`Sq^j!U3)PJqc);iBd@;j!D6) zP4M$ojn~c7FF=t&T&8j{{{ZT)hf2~e^vxpKE~0q)4X!bR$>-4fR~|jTXJ&f&Lr%IH zOE5ds3=#Z2MR$G~bcf;Qi6ljL4Lig)GDbleK6Sic=eNp86~w=tkkX8TeRDd|iuzp}OfH6?q zIWWmAD0Zsgk~$pKvm}c<0GobpPIH0vtnFH7F@WnJR&0!L4nL@=h1`v(L!NM6g>`ZE zd}BQIs_o0<)Ww5t5#%m-2em-M40D>@A6X}&AM&dJ4nRG9Y4Bm21b5=0EO0T-Ir>xL zCp~eFb3+96675&FHCbP4@-tU1KxN&@VtV5Osay@GBCa}|*oDgZj=#e8X?17jC{|=V zpH6)}YjQ0#!=1RtBmj6G$I#aYq3ds^&K?qX4w?0?-@@KIitgm5r3^(}^S6KpzpY_X zE-dtL^&?g*T}*vnL^G)=8BlroM@;_!`h{}(je}b^&JKQNk-f%=jFj1 z5mj~123YI1?x@8i$5Y2WhCjlcIr6hSULTq_M~$?_9QUg_ey1&@==SW$$Uy`gVAi*a z{u^pO9gwxm5*UC7cwCHoqsCakIG2vTOZkJG!DUbu^kEN`cw%Ch5rD04&I<+mj3`6pJ;VLo$OK&sRKC~ z;~t*%6r}Fwp2HQP3=K197yxmenX3_LO+4Vnd13&<`qcBAdlxMckp-hqAQ*1A=~~)W zhHfMX!GRt78tSx<3i)9RoPu{h%kvTIkLz0&S`0S9yr~pz1TkN{z;!>%ic+d+3?z}w z+IVd=_bW7IxcQenD`$h6W~pfvoNCajjGSPeaqEvv_pM(MYVp}fN1QhwyMw{{isfXw zTg#aMau!a5JYZ4gOroi~8Wvjm+f1fZQU`zH`ubq>u7!M8Z)XBLMWA!Qksk^G?T$wLNGOMZQAz$;qlz-AAEM84N62k=Xc~;TVs{d06$|tk{427R2*XxH;bN+h& z07~7{d=B=phLjv&5X@Z4i- zM$BCsBrx^q!1~ukt7_5c8fMFR;f_fD?!$h;`X7Zd^NVB$JWTpGwb$Jdj(jrAKUr;O;zR z)b~yHX!ZcSfNQZuL2{$Osa{x_I@LDlLv=PjT5JbBarn~_OpTLQBDGSW5_cY)Rl7x4 z<))=pT*Km>V;t@o^!+K9H+YL|WAUO(a~k@A+*A{vN{FP{)lyAGj9CuuDnfEHaz2#A zOq};LvYajtYSXF97Svm3W&1y~H^y%d;0#AQG05x@vzq$0En(x28j6=PI6^QL*VhNJ zBNg(`?AdKC$Hsjq+V9^IO&}_pjs$1&>({k?A7!X&6F|cD7PyEXEVoSL0xRaT*ZbJ7 zAyJjvH0^D)=|r+G+7fveY-u6+5DwsX&rJ5NlSt8LwbP=O(nbF0!6z9w+BnaCwaBwu zUEC|$BU{Q!!c>w7=bZXicW-Ot6CJdQn@&Q8EW{Drk5R>Z-C0=bg1*AZcX6l5_Cm4C zCdJ(6_(!?wL95o%u1*feFrC*y+y0Q+IhwUS7Lm0s;pW!6&kEc1OL#`yZA!0(Z9OZX%c<8w3b5$7- z;EFQpI>v_@o6AR-6&qeQ1QiDyuU@2#RlOUy_vaY;b58yxu>jp-KDziQyJ(;$6SnqT4^IUp><%l)FY62 zg(WNzusR=e(0Ak3q-dpzF%%^qe2Rfd$i{g&_4cf3JUw-749(%aRbDwq`iqt*sKdIj z9eNIVrLfknbd6>KuIcY?l3*D(Z;gn+BrxQ6$*t&9=BX9tj(YVuVJGB$fBygk$!#$TVk*+?x&?#WdJIPYL{2?44!^q(G&DvTKu-~zPg?*)g;u5E3UVw&#DG+cR9G7 z<|n5Z^E1<>edq9F;$)u+KVi=tYF-z=k51GtE<8)D6=S&EtQJw&2*5nEltm*P`d7kV z4z%d)XVdMKUE{QhD|poys{o0C$>;w7tSj}J>)FwaQTXjCxz?QDc6~eHn^@xT9hhS@ zZzQZ)$1F(Tjt&UtIij=VlI~ccgH%XOlyJt-lv3)T-6FH9%e#ad!Bsizan^;G{S?N?;a!P8CPM+oKTKdyl1B>fwvo$&oHOnT-y`4a zPJ53sBG8FZQ=Nz9!97U#&-1U+&&5g_>^^RTCe>dk42a|)Z(;}>9=-VQ#a_|8)1li) z&KfWkcD_0eae>#KKMI3WxAW|p837}1;xo4$LBZ{j-`f=53QBK0HK)gYwa5h(&&iUf z4eg#f&^sDKZN&1)a7cG;#vVq}I&;vEN~Pr!aIf~c*6sSlLDdkV|*Db7hFs~>)XzIyRi z6Is3T(_xO`qzdO5+&w)zSJ4-C?KI!N`&5I=VTOD&4i3_Ny8H270pqw94;Ei-5#gI~ zR)4+DGEZEJ+Jn`c_>E(8mza|o^O^8Y?1jS)c+a8fSw16}wVZM)`EkV}xn|@L8FPWu z@_Ff7GY2l-TQp_!htEFv?f7=dtbY=geG1{0HBHEVZQGFNu06ZgN;whK1N-+AADFh& z#y0oleKGh}rk%l1g>%$04!rblOx9{dVUc8b=8aea8}8#OF~_Z5)9xco30x>pK^uo4 za(Z+1CZ+6a6VZMV%(lKa)3+!iYXCm*`@ON$=eOft%43sYR{|wt$P4olc_0qQ1RVWq z#6A@25y9iFIpmwmQ!X}ywtYuYm12rKj&sgg zx&9D&#bYLPQ;Aqxi)mC`d46i=86;;T9W&^79<`fyac$uL01@e$my9nhG>tFHks4h` z3nLa8P?3zYl2i?#XE+tF;VnN@@%@CFhryc&tTZc7#_PtuE{xjg@Q^l>ZEV|KTonW} zZC-K->0U$e8}{$;55iq_BmJLjkH&wANf3#AU9G|wOt+Po;M*c7^P6$tBIMylYYLT8 zT5ftYFz#;hJ(XkDwSNs=_>W0~$H6`iNQ>O~x5ngIq$)o1+gRi~fr3Yv$_eaizB?fSE-o79EQFw&v7uNna z{{Vui{7_97?QiGl-W|LxbA32mkSug)$p}H@Jh>ydua!S&kN7K2ui)Pdwv+n`_%_4g z){}aTZzqYhrH@qcMBp5JhnQ^?kC+7CjNquna!$LKQ@Rvk4UzSS?Kk5Ky>i|U7k|N1 z{xI3-noBu0J|C2o!yw3t*G7xxeD*K7i9I+1zCZn-zu>5_H-@i#Ir|g*JJP%drrbjI z*FG%QtrG9Vcc893%UHqLWVpdnH!$vi_4vcbo;B8dZQ?m~&xks;_lY&DmNLz$>QkGm z$%!L5cF7BnFsp_3s3h?&p{+mfe6KVhKvV=6>9~yJBzNN&u5NB)OPBmdeR;2VzHLv% z7nl0BsdC$8zP+5?Part?1drZUg!M0AzuQhzv@lPavM7BL~--66P?IyDCef>H2lC zHj2nc4j69Fr*20*s{V;%9Jf#;5l+)dg;EnNNBb-|#~8(Pm;Nu5#^2ens%`*3mT@#3~+H$(2(73-|W69oJo{;r@<_^bsz)CJu%1D zy+`2{@0+jbayx*sHrD`^W(}P4->Krff5jd))ci-Qz2>oT_S>mqRFYPSL+t~BzyKfT zTb~a6XK|q+F^rYi*WgcXD@wlH)@aKr4wlf%Eia{h>H?yI9 zl^uaS26~F)bng*Jvnh#gSRMihhH;KM^!FZ>2gLsXjXFJ!rKnkW9O{>s6KZlve3y~= z5sYL7R|Dn%oPs&^u6Ebr`dhwr4JC^(88O}99G*LO=bGiAPEopRsOfu=v6u0t@=Zrm zvuT=ESgpz{N`+K>#E=;E1M&2$9|hRQ9;jpUc}T*trtFN9x6}juD?8#}iz4xr{fxHO zGT8l^7mUL9B2|>J9QrOX+t!!iHoU$cxVkqn`Ku+mt9;}EhR7ri!>8+ANU1Z{QgvM_ zB?d(=8*a!8gPuPM@ZXCT3m?R7Qc)Wt+&am%{_q6=9e$awTe$IrFzL`sscDR!abOBe zIX_d+e0y+I}Zm&B15T6jz}4e53X=defY&?{5pfp)~?nclo*cH&JIUU*FS}Jaax2a<*{x8 zfWT)x#(Et3)blg9mOY2~r%C?G_+Q~~>~m}+f^9}K8lI^0BM!gBahz8zCZIy?nOY?S z4Y^4QM__)H*m(Xtd>hgNHlfkn|RQWFv}s%dH12KhcVLX)|yq(iaCs~H*5t)Gsi>kSen+4Wh6l9 zf)-By03ipC#2)_imqnqSM3Q;1Z3iK_JYuF|u_fWZTiL*0v#~(Syyt)i_>)xh_+9p$v93o@&5qork#mvQSzfYyMqgPNtX_A2pGl(@qIefQp6E~bp|q|6=9K) z{3eu2sW_7?j7|!(e6RKN=fB}m%`3&1%CcKD1s_}-(~QDnwr#sy?G3*qanz4|{c5Ro4G5La&;Uj~KmA-( zFo~zXVcRKZA--nY_=D(80LZRHVK-cILMh7*nd|t|1mxWfvMXWs?jY@Rjy|7Wl<6Eu z>bqG=HuV7K>Onm}tw%9J+{Y}$5>sw4ryn;RaqU!MiCX48;Tb{79AQ(wefoX|u1y{x z%!=D3ZF5%E|^Cj&ggRJNBq9{G!-pD)R8kPTX^y!1W{f@j)tA zGGw)8h?pB`EW0wf$oKjj^Hv}XvZQKqjrYkQsU0!&?@KHwZV;$gkHcFAGQeHuzrG;Wxwa zZ(-s801ZJ5b{}ViMINNZKYc9S-r&i(V4^g60{1BKV8pAB3|WB(#@Tn)>qCgfd)I9`^`Q_E09QciPd=+0R1yxUu$}di4=fH(U+HSQZT#|jE=zI@+;^60FOQ@ zlSR_!iYbX_^Aikq76p$Z9l86**1k^(#2Bnhz7=noq$|0$tbEntPllT3!wqsxGskvt zS=__|`Ih$!cWW`oAV(_jLC!!pI0uTmVWdeukEoPn+#@GDx{QH<4;lVqyRWdPgTH4h zyRBN<54Cvm`WW=&2Whv0*|*JbayH@45FWh#RJ;}Nr(5y$mBqh;^vm0!a~{Yhc;riS zCPBfFt_qRdX1=POPI&V&?#>F^N@<`{$m}pPfu4Q4=jmD&x@2nc$1TE%rP{>?O97m6 z2YmC}t#v*w_-wue)t68472Unf#5gmpzWhda08}#oc?A5!ur>B?!X@yBfqWUKKZ5@N z;S;ra;14)3s?9Mt++BzznB#ybokdS_Po8`Y`yKeV;t7iW@?8VN`fR`fE~$SPn=S@F zcM7)S&Nw7@uU_y^?33WH4cn>lb-D3%)O<-L)#9zVlfEHSf<1{f*jf(@YYGf@UKg6< z%zXKAN5~}Sc1PikdFfVV@YjOg(VFv4(ISWu^Q%UvG2f1Ot{RxB$@`pEX#heY2U&;%TzruHO(;k@3 zV`?^j2Jq~bx0;0B8L`sEoUT^(MKH66U4>K}?(4^JYY#{9@4{~p-{w6>!%&FWhji0! zql(mXmX=U9sQ$exIMS(CWJINH&a!_8Sx03cw70lN1S#36$f1tm*tQ#=O4RV*!ng4j zu56&S@g2qcow3IS>&o(jgNKY{C>i_2*HPjB00Vp>@TY{J*KQ`V@wKhQe{5Tb*y)-O zgbmx;`eXaSft{(i^%$-r;wSAK+Sa9~*!%+1G~F)BDMZrRcy7kx#tlSg{an{go0-=H zWTM6xj`ir%z%;$)L#WopU)s0ASHH7&hxFMmekIxXKT*GF7T-jdSr_`v@~9iW&u)rY zFm{6EfIHVW@H^sdx4^qiH(vO5EQYJA$g}GAVUttT?jk$4qBP^nh4NL7813YB=95YI zW#UhY{{R%B)4XGErs=m*%#sURYe58X2R|`6%#KtZvN1W$eJ$`~_GR#=!q18)O|r2% z^FyG$-<_$2a4vq)jp&^h10$c-y&70`O<0#++n!kh{7(I)wK(s*C8pn5M4u|_8ok?H zOo_WAY?6;IA`VaPleqxbMd0t)W5c%p02(e^;|{H;c((FQ6*W0R+{#i(no}OecO{u{ zI0FE774)X1=H07#uEHolR8T^Q$6cXEL0q<}aJD}eZuWVM^7vjjq5=71_JheM^R3ho zjH@@P&ZMhp{%hyfeR5P z#W^SCVZj5pJ--_C-`jHbL-0FO)2y79Sm3$51ZNP7nD9DQ$;tYOUA&ueNg3!+De)i-S!1@X=S^(6J} ziu0cWCz{u*wm1I(Nt7l)7*O1OKAzmyr`;ivbdF8iSCRAW&U*9HZ}``rcp^VGJJ}>p zoaz&~S715M9CsK81HLOcS(-*h$M$S9f^A&m8_q!r*!23;7dltkBLO_HR~Z0fX!Jh0 ztt57uHfL!_7%P>?B=pa(^r&uLBFgiOs5uztJoUiulUeee5va}s<3ELbPp^D1)GWRd z-P+jebA`d(<;`&lpPm?;f)R-1bk9tVwfVv0T@zUNZQ`4YKZ!a{sbj3PkLI=bXr-L) z#_(U4AMFA`>}&Npcs5BU_6P_hlgl7K(z3ikX9tTkxokXBWofSIIKx`rM7ILqV2!^p z$QzRvOA>@D!) z#7`{V5?yn_*DOn@v$+>mp^tAST#NX2-MjlW@k9C&|ocsE(lyhRvNLa8>hwmlM0 zl;_#16i-eSp*>SPXvnN{gPy#Oow=wSfVl&&TzAK{TJcwhJW=rW@!|2lg?V7n?ce9y zFjKps-ZG~>xu|WYmf{6_h!!y9?I-^LuT{!w-H1x=KR-nsdeSsI6D3G2Gt->a<$#PG zr_+(sjxkD*6ZetH+t7FC^%R=0(;+tC!hn`WoN%#MR<*8`zT@RT+Hb_#2a0|-YL{OP zpUu(bNQJwVaL=_y+3tzrB+@xH6@yh)u;H#+w zf)4~5@4sg+*bCzS0PSh0MBlSl!(SWt))`sUY8q~o=D~JJu!g*sWw^s}{I;PFnW;r{>@T5)UeaG`_>yUF+fLE!)uwIl zzDYc=LPHYo19P%QpsI$>0sT+?f`8zReg*xXJb7_>`&`*+{{R=hAoxL}ms;?Ji~0T# z@O;d{;kVTuW8>E?k4zap?FK-PLuxt3irVJWK&#y zhS@@1YLm*x&6;=X6UxN9u_jk$C7UFQw$xeVPNbT(%fA%$^Q3$x_`PFst54z&7kKhL zLtOE;w!_Y&7U#(_n}=O^5`cdbi8L1Ghev zRK4`s#B4xw@3+2)rycBnp?wW4@hMoFBX98a$vyM^ zD{e!V+gPQf_?J!a@5ZS0d#yHYS4Gye8)lNx=P50)^CZj0e~HHKRQ4Tfzxc=CoeRW& z546os!1r?$TjLVat*%_wD*qKF66@$%xdcBRmE4 z!%s$E#`&mEf5G$8dQax(}^-P0ffgNE<7)LBSs>ByKi*bJrhQOS?5O1W-3dyn)8ifzbN* z%^ZjoX?Hwo^Wj|Wut_s98$#wFcIQ7U1IZswE6aW~XicO+V{Xh9O!AGObCtl|^yeO@ z@UN+FH05~|hjt_6%VU9_aDJKMzH9xWWrE`SO^zb*s>yWZZo$ZP1Fu8Yyv)&Z(^fu@ zhUVpn)bjyoU5D=j9G{!%UDf=uLGaoLM&TInUYp9Et2NZ5=l=QQ@vb7~8+&_Kl38X! zf=3;({{YsnNxty(ny16`i%iPhzKNyj@4#Oy+ZK>WMtMm@n|+Ayn)C1v-I?@R)c*j6 zpL57v2KO>Dk&}ai>rB>lNmkmz-aWXrNhEA@%#GjQ6>95DYi+_-Xw_R|D}1c1I;r|} zs+M|mx{jlB{hq&SF#;I@3n5Y51J@K&-JZT#1v-jdjJ>;oDmbX!wv3vy_Ev``VCbOZ zB}hKiT4_{_CtBJ!XVFchh`juoaF=Umf_{{Y207|!o4_8mcDc&r%8Y9 zoMYazuU7=r@lL3~kPoq@-boyc3|SfVqAJW)q^Ap9sko~TYL*-3i2SFa%|R#1GI;l< z2}5)>w=L1;x~`kDX8e9QxsDb@V4;&|PJ`R>rGFe=6mQ?TE!30Nx$%Nrm-MbUGu9t5-{#vHVKa({?W1RucGCFR@R%eqWt^}wxtBg0T?48CRctRuen z#w%*$;ia{$pqKk^O_UW4wIunu>Nfg{j%dW__7$tET;a&u)|DjK+0JWoT=2v;FuTEh zZ8qM3Hza!s!6OHX)-6dKHK|VzD>Gw9)=~~9K)@cE{HuB&6=29;o#Qbt`$-7VQeE@^C-{+zOOk+rtk=;))rq50{R?BV+vhI9!>ODT6{d%XUY$!}^z1z6KQ=TwA zD~g9zd81J7+d=iMTP;s?K3@KD@{ZZ-)A?6C>9l(EE7Pd1bQ(Q}+SLJ6!8uSzBh#&P zkU?!>5!vMVm^mcv#~;hKYk(dhYZwZa4%>F*@JG=4^{mZL#+MUDQKV)W>FZG%Gn>%b zrZSElb4i|;b>mxYEweLQw15WQK44F#1#-II#HMKpw9HM<%nm=#*0?$KX=OYys?9q{ zb0N-asu(ZkXOUlsths4N=55~V$55EOhm+WFDN|HfVm*oEW3^&=p?U8}Bxz0o$81+e zu!=mVn$5etTQ1&eO>*RphM|rZocy4l!nAZPKEyh{w=vnDxSX;701D|W_3a^X3=oK- z4qJ04%zmfz#U~{V5-Ob;;$_WJRynOR!#6sUuaKDqw&&iuJuBgT#Hx)ha7f4)2nb-98kfDTR+j-9%GAFX+${{R@I^4LIIB!7D!(5H&QVeJ&r>kg5U$qeE!eoUg{ka`i`xxHgecrF@AWh_%H zOG&`TLOs3fi~j(G-dLqm6wU%;ZVvh^ywlPE7=xhXwOfMm)X;ab0nWfonF)q#-kJ5{?$qKZw^1}JmW`ijhj&U$90l12;3>rp7S z>~zzq9$gV;_E@~e`!kX|RTn=u0+Y?$*vJ*BVW!)>VduJyct0r_Iiuhv?zV`_5^Wv* zX{`H+^)$Efc{34$q#i-)DkOcx+^dR>=MRfM^OKuh`m>Jk@ zWne)nKmB#g=(h09e;Y+Sq`ARXTwzaacF(W)*IgV_X{norM}`sdfO$|s1Pp(kYv(KP zbGDPdqCb=4(<4-ZWP5ntCM$vp@N>>dJ$Ce`#cdDS)osLO z&N*+q-1Obt^f;t+y0e@m%SUjSKfNcF?0EjQ&TNYhaU?Q+{cuX0V0@i=lllGztG=CO zbBQgb`y|iv`^+5sM?*XdT8@>{FYn$%IuWdXv4+EfG1N$PmU1#2CQptdTR|du%LrygefvQ?aww=Zy*krUzA@`@Y&Pl<9wUhvdJmX& z9CPnQer1fT-Dxy_sfD8zMk%g`?G3%{#It#~c9wFhVlo1Nqa5Uc&OPcW{HatYl_oM2 z;mKugcpuWAYcgK6o=n$Pt!sWSa^A zeWV?u9Ty`69yq8x3}tT%!Wo;(ib-LK7!$M?EruPj{o~fH&Ak$G+vGASWIzLNVbKWe zF^+xepMsr}NxhEkR1tFPAlymZ2;<+V=7E}RH=HBt1cP=I0CV3Sob=5>D+fh*r78d` zy^{p<*WC5`nw_D0wr{fxG7!ftfTOQD^#J}f+qP+9J3^g~SZ?Ddp;3;<^fX^V6z(ib zxZ87X?D24~Ay(_iC!*)u(!3|)ri&%7jBdP$;dDPC^4VHNAY>A!uS3Y|Uh8#d6jH`y z68Qjc*u!unaLfqj(!5vWE}WyrZq~6n`G{Bo-!K{J`E%B_rSTcnjo@&TSxM!Ujv041 z@vM0zbDo{BYb(UIZw{Ap9rO}Kx)vfd*`UGw2m%TU(n{7T|U*srNhG?ECC;M1CV$;_w}xa zMAS7KyJGg1)=;EmnJy=`iBb{HOS^O!AB}Oo8}US1#kG!?;C(vp#v1S0f=zE|KhUjN zP76;k`FiuTa&gkK{wjFW!oLabBTw2pSUxP*!QE-#j}N-+4n{zke}w-4w;=#xv7F+) zPPkB$vr9wPJ|BEoxzu&&;`k@wyMG;Pu(8IgdZN=r(+e+Nfuue1Gx%1&ia%~I0(?5v z!1d)u_%Rd=E;HTPe!<{zcN&f(XcldMrIH6e2jyzdrw-?f= zP!Y82F@?73=X2oj4%W_V;~$KFwco`*js7*b*8c!#8T20?YLgd|2G?{*?vqakAG@@T z8AK>B00Sq1l6u!mF28Hze+fX)cxOxSyxSsaMv$)zZWoQM8?jaQ+H239Mvm>2@-B<4#*w`%n?w z>EOdQ3SbitDA^dvd_$V<rKLI$(X+4tGE{Q_Qo^#*3lu$LdyIq@gAFF_NCCgL?h?RmeWa|?G6qJ^B`9Mf4z@v z*K2cVZhS4F$8#Q^abpdi*`rs4#ViFI1qr}$j1Y5X6_LDxAVvW4_;wx0QV&|Q;tzqAmVO_K=i%SPzlVM< zU|wIcicoB{@L$1g3Uhh!55->?9`8|RmgZe6P0~KeVC)7#j%V`#_dp20WEnga1d-F4RKH72BFB#KYYa;jt2ol9!4=yKY%TKQ{y+D?#2hb)XwQ1 z*4Y+4`2H0q3!Hk@^YAl5(C;+c-AHQ8=TM3zjUg zV^&z3!`=)!kY!?4&sVT{0LFf3+GRQR8LSTmd@1oJhvJE>yk+6f5oq$q6Ye*fO#W8& zBWMyRF}8ET3~PJir^3B5`ohQrl0$DZqIuRVJgD)Lv55IjK;U{)J_z`u#vU5+6gHY~ zjXYBog4@aanKdb;iz5L6NecmxTZI5r^AhZIx;Meeb>9q6FZQ*JKVrEnGhTk}Vmo;q z3C}=A4?JSIPY{00z9I2%i6ooAHkLjtYiQ#VTiD*jw__xni+M^CFbO9$>hau3;>g4J zyHcL@<8oJU^8Cglp-=!kbvdQ2mI_a1JgDQb%`R(>GUaE3 zj|l6Y3GpMx;@tyW(cMAH-s!Wz2cQm9V`s5aLF`Rw+F!$Wu<6o8BzeQUcx|{pFeG$2 zt=|v)RQQkK9}xYE!+tyQYTEo?UWUq6HlK4XoSFA9x}Q<`*J4&V z`R?^OO={&dY3H-oo?APp#vTi}+TK+^?nna<#8!L~3!S84v(5(~dxKuHs{DTVnsnw( zW5sv6tO~nKT9vJ};C1zK@dhL6d)J&?-r8PYn~ir)jwvo!w1Uu^RL^p#GON!&(wIAR zI&Td8AMsC%Y_z-W3fE2hCHWCrwbrQxu(*B2N`-U51a&yBi{cmTr{n(sh1T%R@dx4m z0El$-zK6|@;?6a`fz?~@E7~-e9^?UDe;@qD>hb~_~s`0LIq z(7qadzs8!k_Fa@PHO16!u^C)MrLog<91hseQ;MOh{CfC{;=3aUjr>P9h;64(jSj7A zZ+C!sATdD7eut%6@Rprpd*V1Cn@&ZZWh=fN$`j=|#CgZC2hy%4Q?l6iui0mf9OSO< zm{XazT_l5O6FU2QP(=8KUcvAk&m&vwMZj5}$yRJ@m4tX4LUhCt(gqnqh zn-$-OuI%-TXwb|WIN2l-^xmt;U`{iRdFfxSWpzK^OY^v9Dok*3m_Astl zSVl9EfJa~F_32T^ZHFa(c)`J7a0jOXqS0>iWFkPIsKXa?gO0x7jAI6;WeS9`I~R?| zG;$US)-_{~?l%ta!3VRuIg7irE8M&N#(YoO757p?0BV$(Fc z`N?)uD<_tYIofjA+`T$d_=n+Ni8NRh@3a}%s;=gaMU!tm8wZ2m6)sxXwN6h{9!LzT zk;ofy`9?VJ*B*f4tVXV|m24H{pvF&LzWkikc$uKMjtiBR3x(vQ=+HW^PK*H~-=4K% z))ZL~e4rngI+KMX91Qg4qnI2S9n6ANP`obRy(4k~<2d&}%AaqI(S|a}-0V=9JY;Z3 zd}feH_iX8CR$1gEtWg5)=N*6?_xe@H{57e`()_Y~;)&{{RsHaB)pd1B2W* zf>n3Pf;h_KKD>14P|qvLAdW-4M<_X90qcNA_)<)f$#_<20vEs$%33#WPtCOZ@qzf% zrUN~$!k{V0I2;Um9{hUNoXEydWjP!DC-;tB)o>gy%1`kec06>cw}5_h-xxn88}Eba ze-FZ=Htn_&rEqvE&G(4uk9>8f#C+}N84QHvblfqKk3&Z=;;e<16DH8#Dx92-NF(@2 z_Nes@z*{a94d8An2|2*Wu#sYjSx$>pmmJzKzo-P+ZY0;#=3PSy?kgslJKosZqZMd%Bc7yR{%#lCGpNLvu zolV5oOESQcW%h)LOZj=+%g!=-5^J&0{u@Q(_%C#uNaWRHTW==v1XbGzVS|w;1b_|{ z@K0L)d*XT&u{i0fs_8TKyta&MVCkpW`YYm3!;g-B7roS#z8ic#)nl?#CFHt4kL_-) zm>dw%7xK$z?*Y_j7_Xf*uL5|J<9EaxdmkU#>3$LL^lSeB6HB>oRgJVGCQm7qi%B8i zFG1ftVDQ#|uzrCJ#L@V}LGeDDX$T|jcJbKUM;-{tXvxWJ4Be zJ@L)kMXOv{=~BmYr2*$a^>I>N#2V7zVhXUR9)IF>OZuP!&Bnh zX)eAMzlu}CmeJ{YB(UA2Hjvv#f*mbf><+{RX5_H|_O8kQ0B`>Q4qaF$+WZ&eeK~Dp zSu<~SX2`%CWFT>lq!EGZTy~@T5@|XghGN$>Z;Ez4AF-7T&-UE~n_%67ic(eFMo8ds zUT0K{J1{3;Mb>45!l9eMyJMai}rsMykfeC zhwU{av&IFz^lRr58|BGTM@~5B73{tO{i}QrVc}~SyhR6z?QU&ANnQ;(S|lUy9l@|i z9l5R-P5p?xNfo8My4Q<*38u{{3f3k^dx*|(Kq1EV^Z*Vk>YssM@J$~L_#;Du#2*x= zvWng?pYbyB9HKZ>mIXu>O2t^`rgu5wx|ImjMpB%U(B=LX{7&%i#aneAAJ9BiHM+@@ zdo6*rvs02rB$ENN#!7DHyG?W82glD7czWkl_#@!|00($iK!r<7t$4r07S_fz9GN3W zh=6c7&Uqs^uU6LnD|j3BeA8il7TPGMGD{V{sp5MnZf=8TKj<1XSd@$&H~C|cUOnUA zj^7YIHQruopAR&RNXMfq$v(B>7^Bo~Es`+Uds{L7i>KgiJAik=!wlAx^6GcF4z;&F zQ1N@&&*EFu)UOlA8q-`dHlUIsY0^!`SqKW#s9b^Ns2LvFt&a+PH`YENO>Jwh-CfOW z9b&h!jCmH`VPFO#Py_RV3zi`CuC{#*uJyFkHHDW@zq(hROQ#{Go!bSR5CG@UU;)z@ zuHV5Cz@8?sMMA0e+j35JoC#9{j!z){0IyHj@-9@4Pi=G6^iTLFjF-A)s(f_TFC~LZ zL|ZL6E?VwOAQ)suT$te?6Of>F&U0SB;co@_d*H8&wTq7fY0&A(Z{g_W^Bnn;NXAxO z-eKs(4&8-!UO8Cep7d+^3U2^#RJ3Ijob=C$*E}T17KvTi8(m;29k*~ zs@Z}2D(Ex#!{Tna;;n1R`BZo0LACb1x$y-GB(~w2kltkcg6|F zy-@w1JS887z8Tng%D-vUirhFKDNj$KD~j6i!83eplgs6o!*8{7^8hYRN4ckCK4x@= z(GWaxsX1`R9FM8=`d0s}Y}Vtb8q_J_99G{W2UeFVVZWI95#g5NOca1S**G1>Jvf7%w=uRmn}0Ek-k=)~H{ zv`b{p1TZbsTXK5j=RWzaTSK!iWQiO*KvLibUqWPcn%Ya6Y! zcGj^(6?lv-%v_K2*1US#TT!B0DjzaWEqAftmB#>9k#{hf>dX3-?k&tH!IfBsV4Ju4 zjCT5dHI!Hg_Q$w4aC#B=^{Ax3`EVIoiQJ_I2iF}>rh3#9-lGuE{_qk3Vd{Rof00gG z86hQ)bdabuoxuv#(z&r zid8X{#@~^KNMCN4{Apd*X!lF9JQ2{0mhN%-8iMNMVU@Nb5^^_4+>c-X098xe)ofF{ ze=V?Aas}fg5Z#X*_^LO`uPX~c#h7H{j`;roKGi+N=Edr}Sc9K8IHJNj$D0!E0 zlzd|uA|5q$$qaZWfI8>tT^6w^fj7eH z(t-#W$jKbweqR2y%WJnHXtN|zI}DSSI635u^vOL)=}^^V$8!N zq=4@Pago#3xD6ZN4~@KAq>KLm4|pTTH@a+?M7>Q0<|{{I%BZ-N5-gse7v`n2(V*Os z<+x^Iehly&1((c^Q`FY#`BxoQ z&f9Z74^Xehe+uY69bW#={{Rl|+JA^?@i*fxrkkGIPSJqyu9-Q`0=$xLyneX`KAqOH z=DFDhc-Eq^X)%GT%MGz)-58QpMt}Er5uU$>YuNk+{{RH%_~ZLi!J}!vv)97E8|&6~ z*6nvDqb`_qeKLEQ56(W>eqw~|8&n;~jGmS6e+YkSFNppS(B8xLM)(Erd*IfdYycYf zh%^<{HH(=Qw?!?+p{Y8)^=+;gLR1wk^Jf*w{AJYsA^y~}Oh0XJ+E2uOGKzAN9S=hn zTHUmz0cgrY5Q@o0{CwV15szR(X7HaUQqGtE00g7>ar-=6tiSM3Z`yC+kAZGsWb-^X z;KKeh@e>WjSxk27B7w3AJA{J@PJKN;;YaOR@JmS0^k0Xc@K4{_f8q!2M=p^g#RjeM zUsU^Ek!iYPw5F45n@A&I#H&nUc=7?xNUj&)zwD>r?+U;hK=^Z_+%%23H6I>bzM{mH z0kNZ6nCP62TQSb7SHhC;n$0#(_YRuVg;+)X>pGr zFWhf7?T~^AQVwem_9yYKz3^Y*ABZFUi?lr(_IJ^>(pvjl)BgbCd*dxqHGHfiP`XnU ztV_u9)g;bx7#>fH{Aku=@n?+ed^_N~8!a-($>c)~q)L&XKQ7{<3P&9epv8SFrDzd& zJHYmuZkVy6+1dchyY8L4NBHwm9UkXJe8u7^!jptoFI24GtLk!}u||(=rueVM8k|pY zd92;s$sNYCs7m*j_e!m}m${UeAeUywKpUGC^nQ=R;DA-R+@v<*PhVm0Up)TCvFww@ z5;BsBc1BNiCj$fPoS#r@-@G=(E$xY@e4F(C5M(c$8x#kS8$GtM>pGd zyZ-ThKnm>~V~!7c?pEzdMz-68UNO{vw0&rCuom5zC)#9k>$`4B<=AH#$?J{{Lc`4Y zZVAAA6Sp`SAbxz&Ezo8ocNs1Bx)1kzXVRlhyB(#Fh8!;$&u)F{MA)L#qp^|v*wnVt z7j7}pN$PP+AXvDKaK&&D{_5w@f1i3u91DHQa?+nH9ozxOey9HcuS{Z_3tULb>^^)F zM?ElT1nxyU6;0B)WoG5Va?PGI{xzTCb%nIsrkT_?l-PdY?L3p)>))kmF%Od-BLzZX zK`W8QGJct?uNlt2@QdmuCsjXZcFy0MJ91B_YL<#uIS+-9XTo}1fpYI|t+%l(Gx~F% z%DT%-PbG@Tq#jsc9i@mF!1{Eqf8oS&{{X@nXs#HQwvXk<@e#-*b`{V`aB{wSm`>sOt)x5(mxm9stG;PtYS|_Wu-(VN(NM&OwyBazh_p!$UlepSImF3nBC&tFUYq^ z3AA#~269Y*4i7*`?_W;OHN?cFKjLonC>7uivWJ<2aKMa@mqc!_-)`H9cgk|S>D`enx(rPlU+zixdZ*2 z?fT;t=0n9x{h>6r2(c`g`4IiuuQ!OL&QO&-KT5RmiK6@wTLf^8liy>Eai%*vW za)h}A$~%<=bNW>?`#yNN6f}BMIAz?s9Z6yN*JY;u(=jYTukCl-$AGda>O1G@+MvDt zqUHNiPocE7^8Wx3erMSV^Jk2WMTe?#I6sRs03w zIHlV*i>fOQ%>x6P^&4N>+WyqLO%!q#Y>~L~Jw5)WsWy{@u#~##sS#^mM%W$!2LlDn1xbTj&qxafQqMT%A2I9S>hjRV`!2UJcakP0Rq??<#{A<~4d@Jzw>i+;^Yh);6l$y+-9P}^Td-XLo ztKgpk>R-FlZ>(XE96L)Kk!}13AC*hQ#cqvZlHw(*lKamdx4aRrC#6WKPQx@q48 z{12+?f(<(HWD~Ng1T0j1yzOFhp8WdNtzY(e@TG+6x`oZPpw0rtKIfC32n3w37|8Ef zOA|`xsY@rv@~d0#K7MP`-AOeQN?(zh`ae+k72yj9f!%GE0tk0$i+sdz7y>Xl9R78W z;O~V#4%YQ6%UgXzO~1N{en?}9qf!CogR#TldQ*-fp6H6%CN}9#-+AE7+ezv^w8oRM zuc5q4@XNsoBv43n{W+!wX69g6jy`73$}?0vMet9ZuDy?p&ZQ=?JnSZu20N; zD%K_p=c$q6;+xXT%Yv{N572&9@(nxLeiKAi6t#-$r_yqHgnD(nSe+v8~JIW2F zi?R`tB1SF8~^PxuAkX<(C4js%t!;H;Mo|QA4 zA*Lt;j=&NQao7*Ws$F;=z#baESC7N?0!b4pt~amOV;Y#_Deh}mhHZB-+XLJb z&$OI|3hkcw;QlqOr)avap~Z%msLpYc5(jQQcopqhZ|yIn#VdK*Y9bT3e5%ABt~%4t z?Mnr_{{W%dyyF{oZJ_7N$7LUk?E^mIw7R?WfwTYnxri#SGOGX+v z(U@*#C+_{xUjG0)#duXA!m-FWU72DrkUhBRUq1fJX)E}vUbwNiNS$p~ExlR8KW|Q) zpTfP>brwy(+E(Ft;nk1IdI85no^k14JDaQ5`5r>FZjq&-+blA}aiz?XO&BP{2XP&8 z0qi<;&2)CxWeAQ;+Lg$1q+w6v(>|uK{3UL;Q;}gd*;RKbKf-(9`X66f=-Eoci@}9p zsQXtTPu9FD%IxT-?286y?iE>>KGTxOm^}XgKAmbMmDLB?(PYL)IRgZ9&%bQcO9QMQ z=&X(ufTy|lA53GOv`ujLaXL*M#j?rrvoH&}dFn?4@b<1{160CDtghfGac)3fOO?Z} zdF*+{JM^l}Wpim6n#qz);DD;+5<3z)V-;`g@-&jKodnUQ0ouICqyjPzBm5~Ownrf8 z@-h`U3nGED)ML{;=B-BC4ZDp^LfuS}->%6b3KZ?zkbS>A)yU&uzIBX(aDcLgJOX?E zJ#pTuNhg?Oi&C?woyB3rQw z$}Z+(avB+<0Odc3^VhKTs=h9f?z|fopZlp{)pd&t0<79r22>eRnOq zLFBTLq67`(4usG1aa_;r#iX^~t9fxc%3@ZH z-x3n77(aDE;GFtk^H2S;uiH`a$A@D_StAzL_s-cZyxd$UCyzl35BL>m{?0aWy{+fk zS>bu(Asu-wfu2D28RMosYwt5Dq@?;Jes7gQ$-~W^98?c@Y3&$N+AO zk@TXrV!pAKAX?l;2Lewl0^_!SpYx)>C#}s=ZcAhJs&SNJk^3iTB)FJ)nPV1YRZtYR zI*bmqk|QF?u~A-8l1h@R{Xyp+okFV&a|rE@-2BB+iO<(Q)pB=p8wuP8akY*~80<6G z>tDFu=kuu?h$A~fGbtHjz^HIXayoOxQt&%ZE#|D2?H#FGz2TUgLJH?Thk^&Ldv~kt zGqaO$qb>s;q%(a7d;wIvF$+cFeO@CJXk0@fh~p)&-!LTd!>1iHihQH7q_gj}ZOls$ zcZ6K;4flc1udni_Mw_KqCjqd8UDP-|%QN;r>nL>m?lOF`( zhi-pL_8$~#`e%V8ir>Vy7gK8T5G}NgGTp8(CdkO)bF-f3f!?^!i=VTb-gr(=5q{PF zG@Iccha-&6wsr5Tpx{emr)&q|y3R~{+VtXZz^aDMf=H{L((wpS-08t{J>_^ZO-3ANjeN5+@B zp1tDhg?VL3nBCsU;N)+S^X0C8gb)Bc0Zw)F+`4!^S9W^GiM~E~n#vvz@^Btolank~=+huo{_Ye==d>#*8M|0^?>icKYZV|BSG)@(0Sz(&hT}zT{a9Ls9oi|~TdoyDhheZrq>tVy z1o!V*o;S67j|XZ=wPq8-*gLk6R}IH;)AXj5*e7$y?(6`I7gy{FBM5%+2aL8j8UB@0 z31M5|6w^&Nl-)Ch`t|M9Rco8GB+?mFxnavU@MFFQdZ}#V&s3H;TYw2{oaY_;{{WF) z5k~Pz9hJVgEh9s1YZwmT6>dbQrgNN+@#$Svm&8%wy&lyh(&BM(ET!d&O^psQf>h*Z z8Sn30KAUs$#_%u9hXp{#%sA=WBl4{cUL$wmh*`^qj_9fW@db0p$4)@cT-LFCrd8ss z9}qlsbK;Bt04@mRNG6aqt+)Z-Bx5A??Vn1mpv3E`J)PKT9thkVauoWO9R_*FsjY1j z!IxSz>wm0EZ5s%JM6I|<0LMG?#(HtvH71X%Tj`oCw>xdtQ#K1Un@jRAfMYm5zV(!) z+{V^AeJfJaJQ?AOD_u(d)-cxCJQtG>levH$&p%OIVeteLO*UFdE%E?V1#-PO9s6fJ zYR0i;f8z;SZ68P70v)@zVem$B3BhatKox6B@Xo7aJZX8O+rOFyH^sP&cRb^u>F-(d z4CZ`8sM%WIvXiOCsH&{6G7o$%dK`ND)krl+riV87TAD>1!ekP1V{V&)2N}W6M|$ct z-w$iE-n90f9J0Ui(*!M;*r0Z7u*(2yT_Z=hx07#)z8_oMvV{{gGdc*Df_MiTv4TBl za=Q|d1^xY>_B3-}N5Hcd6&g^HY$cJEp-!yFT-v5U${GE|8- zKG1Q&Jw1I*HtO6oUSw@5DQ<-1u;Y`SyyA{?UuMHc)9stW8u~z>c};5DvG-I++-I(O z{sy>N8Aa^gSyXM!g}@^O^yk}wUG9J};m;7pLMS${vGWJr+b(i_dg8b{%Tn6Qsbau8 z51Da;o}T?{rY`1J*HF2)i0SOYIK*-ir#K}~u6my570ush(52eNINTU;SPuOdeL7cC zmdib~i#sk?*x-TF>G)SYs%h@GK`>dJN!yOTgX>lo5=|BhYfE3V{JWKgGmPN!GuxkD zm19h?niqDFB0qUmTMWnPkF8GjxweDN@=Jik<0ES4s2%y@mfp>fl4Ssu10ZwkT`k9OVudR6TJ!v>=Sk(KkIIS;pMA zrOs7O2T(n;RFd7TFOx4Ba5nDParpXXt}?j}UC&Pap0DE`8}WIJw2N)6Ln!GhUs~D9a8mw|$ku z75OpFN$7L_6r$io4Cdf$I0bTY03AmjzO@IM6`B6~OZ&9Q=);VUbL&#u%%m9^R2BW+ zG4i&3eR%^PT3o}m%NlN%Hmi39u9BkSc}Ov)4t?3rpwA|~XTx3u(R>Y{OLwR|(%eFu zr?_wgaTUnKdEgE)&nN3y9|`n1G~FIuOIV2#_fR0)scs^OagcpmjQaspJ|_66&33vL zn*RX1hjPiIK`i$gNd#M^r zfT~p;hwz**J@R^V%{G?ejGl<~ofllvek$k^F12GF)b`32;@*6_TJGQ&--1+};Py3- zru+`Fx76fYo4c#6E-V{(v$pN>dPwVxbjC++yw)GWT`uPH#Zb>>Fp4WBV{l6k-U2v` zk5>MfuT!@TJcZ!I5*(~j43Qfgjo3YKYn`)Z&P&DL5v_h7!Tp)w8%;ht)d8epgUYwa z`>w#{o2Sd4t#fuC8GKi1f4<{WieE61vF+4GJCVoC558*$RI!@Q{_fvU*w-+-3EKb% zecycGbtjxvdw7J?ua~}3q~(bpFZ;u(6woGn2Zp?Rru9 z+?|Au6@mW%IQFRGf%dqaP|Eq-RBagp^vLV$TV5~ls(44lvspkKz^bim*d&DXZrM(m z_Nr(iQWc1AF)$er;Ed<+{A)!fVJO*^p4f&*WjmM+!vOL+eR#m*rB#yT#Uw2&O3p|a zbR9|Vdw_fP#ag-4Ac!f6#zDagk%Nwd9{p=J=KM*hKyH_DW+WjWdx4xDgB*3F2^{>t z4SZ+ue0cjw@PCLGNz*K~_Pj%Fq%6`IR?^+F_ew;J7%@P(+B2LQqZjNw;@=KIZFl28 z6KgFFr7RKbT>^A?goFUkB1^VL1oX$uIThvq02g&1588gvz9=3v)ckd&!Etj6gW>Nf zgMXu^62|N@P5}8q$P{Yd5%hfo132vK8iu;P`I*T^^h8>%unj zBY`+yw9GnSD&>o}WgCyMuI}^Vr-Q#{Ek51+C1PzaH78taej>JMude=FlV_%9&Y5@^ zd3Gq^;DKI6dGRaahwTI7i*xXPJzq_BklRn^I&}TwgV1`G6;E!uY6aQ_)Amx zkMWPh7k}`swBn6^%F=5WmgxG0t_IdvCdZX$9~lW6Z|Co4n)Sbh->~P0d>0+X-^44M zj}U6*8cDqCnI|md9%Q(XnI-Aep0(;f4=rQ2_*db`ZINJ%*hX3?@~X{~*mWR)4t*=C z6s%!7)>b^1;J55UqxeqQ^-qd=h4+ayn~7z4o=MtS3G)y7`Q&2qk@e#~)#@J-Eg;f9 z3HYYVL9~ZYvRxYC3>N69fNVSvI@bRHhmf5u-US4SCIqP99QMbjIjrxBmRr6P_?rg+ zX%{N$+<;jQ59gEhu86|hoYR|V{QYM~{?FPb%0ac1k+v{E2Z7h?(z>sQ5-i&Om{v(J zFJL}dMJ(H8QHJ*CBeimK#IaoICUJt6t{h~gO!r@RNUAg{W3u3->Cd6z=WxDyy#E_!|5yxZK>0TZCJlT&O{B+gzi9@nQ8_yJqHx_=_(=%(&m%@oWbpip_rCA?S6p|< zuI}4RmV0A!<*~!#a5%sn3GM1@iq|!*AK*uiwC!)>Ma148(sdm<^s7sW;V$#tw5C-^ z;a}d!N{r=Hjz=PoGNd%-S2OKf$Svj5b@K1Jrp?=yw@K7Iy9uxRqsrYK{B=HyatUg(f zRGw`)E`V`|g3cgrZVEE*1;lH>=La?N4vYJ2cx|mhY4P~R%4}!LjyT>voa1|*{`^PuV6Ze{akmg*BUv$w0r$8#TYNvBzSdep2(I%a_B z&HkksD_I|)Df?RK6RH)}{9d2C454k~Vz}v?`gS;{f5TPj(xYQo@djISZJNOffIV<9 zKE1_!A!YkdUfV9o{5|1`S0}6zE^>3!KTmH;(ofp1;%N(9cuT_$4^X0281y)5l~QPj zm!FWXgQ=|DC*wYg;rnMACx~?je90PVKGmj& zGB-TuZU%bep0)ASukBVMWiog-Kw_VCtn(=Vobxw3~df_=X81LNEtM;+NV`UQ zW6Sxt^`qLZgwyYc%bD+FyLgG{19x0;jEr$m>dh1NSjTj9^L%j7-gw8_HJjvc z%*|(Hv8gHt%^Z>tGJStTS^Brf{T|&^_W38QdMPKsf&IaqU}^d^*zfQ5d#q7_JyO1ePPH6uH@PqXp35^?!?A zG1N6UuYMcoo*3}nr3TY&HLjW(8$-K;8cn@H9P+@9gpSoq#Yyp7;}b}q8U7~tqf@uw zhz7ARx4`ID+9r-A9FQ=cwcFg;7?GU0NcRv_gVVcxf2CAOu)&yb&T>h^4mjj}ahfjK zw0+HwJJCO99Ro^9zni9xQILT$t%gvsV2M4BTumK^ijv*YfD`?MguEa+lZvj zKJz#mnY!fXnvyn8Br6g?>M?`ddGvi^^Ov+*=Aqr?z_4-x>Iod>!E_ zC5$SvMpXeA3z7G?dkpogzYgq{9KiVtC4Rt(vZL?eK$Z0n2 zBxe{W9dpwjw2HZN_FV8}o;3KAajfgfaXdDKq{|f{er%QGasm8EucURhcF?b09A%KA z9DUrMx)@?|f6WG)v+`kg?=4a#Wr; zAI$U=o3XO;IB(e8$33pPQ6Fr#&#)3m0I}(a9 z0QN9M4XryOl}X!R-?xLo!S_GbzJ<|QZQv;kgXKb@iN{{Y`u?>AGY9sQ-oLX4j6^ZB ziN%a6rwU(n!hks-9&kE}`Bl>Ogp4fi*vFG1D@VRE4miVdJ?r290N|i{1l}kA0D^V= zU7p5xtxs}|hHyab^scHibkWO* zqwQVKwl92Hr|DYP*|kfxwY$dlNs9S{9QN<-dhuK4?pZ7nNbN4=R>L4mW^Mlf?BEW4 zYvEll#+r<>?KhfZ7r|Uf83UY*lixMb{{V062sdfBI3yGMyP&-1C6tE1IrR0dU3)E# zWreov`j5aGb=9t|sXg|Wt3oEddC{K9)G!JL?Cr~R_7&JY!YstdmwsXA2HruF>&oyk zUmt1yDc9{_h_(C8BcPCzblGA-BLjay`I@yKj66u;UK!^JC+@~BoD#%wf+YTZDt@!w z2i23=pIBb&FkAf09wq2xnkGa{^aY6H+cgwEBC(a3BfPa)4hbG$41G`MUnDn=yhkUQ zX@0ts!*DR`E$q?;T=l__h8Y+hl-c!-N+v#bn4uNa9k3AC>~g1$Dt@yb!Sy*knf2s) z-K^4;H#VWAV4!)cgU8;yY+`Bx& zn@^wzsK$M1{{Zlk->mNN!E|3|-YqfDwsX%;y{P)sdjrAGq4l!rk$l2eL~rh^bI0(3 zo=$oEE1CGSt}U;CHIFvvY+E-nK6e7W_T!Ry9D3Ky@OaNr*aWa$KApyz^DLfvaayT`l-aNm! zcTuitk}K}YdApVS5c%zo!nn^8>QU-?^z+_sXKk^TWA|{q2fx<5eA23#Ngr3kG#n=; z$TaI8H(SzSLzb6Qw1}K%1l%Cw*1nw6FU9_k3r6n)&*FV=hK#Xdmn|137{(JAubey? zXBF>{{5frg3qG%AHkSF0C0573O8P56PbD?li)0d^Msp z^8*UW6dpq-%Yapsf-rhlpm>hSHJdr_tz>&k`Q!<3*#TDIk+y6ek;$AoqPqgWLGBNtS&&R!N~T^BaTIkINm1AlC0go}MDDH||N7G{4z%z*?S^vR-NWmA%B+ zQug=K0FC@xQHclf;-S0!i##23GyR`a@h!4_)da-fH>L{b(DP7Pd`z25RE@9NWr@KG z@p8Y2>&I%mzZvEdMweF+%7L)#RHy**FnZ%0R#H15nBt(V8JQ3J3TRTs{{Uq1POA{x zxIC7Tu7MjOr})0b!vO2%*hsijo=FaUFl(<*joXTl(7J=b3!H<{ zl6rK;X(IUBFPkdwwQ&7L;xY8&kOvs0%xetS6CS4lar+l)w&=z!Z%UMG%5P?bxyMWu zIrOTd_A&82&A59z-2l6Dv9FGPnezJQJXfL3@vzGQjL&Gq<#%AIY~vttfz3;4@tWQk zPuq%03CQxK8@S++k?oJdlC{pIo?;hc%%c5}d``LZrqi~Aw7Sj+2eHAy$86Siz56nF zn?SaTYq!%%PauUh+-K%F#z-CTYu4_5GwJdpxk;SIyA1541wNze(zE}7xsHk zHSA&~j1v?w;~B}uPbWNQupCn4UCzo}L0KzGCz8+mK6skc4>sE*jDQizZ>JoJ&A<3f z;)??7E|qx7ga+Fi9A~C@uWq>b)2G4{&bYjpV@<$_)SkH74&lZ+=bFj5_}2^SHw-6s zUCoDLRFyabDi0)oS~(YUXT%i}vWeqs;NK7`v{w3lqRS=;2^(!}bnSvc&(fJ6gEi6) z-9GOa=Z=40ek^Z7a{9Lh?CXKFcB}0Sz=mOw% zz&Z8lPmu&O`iTT|Vu! z*fz@XT0&wjPVAv5Ne4Z7tW9MtHA~r6eJe(g`61+1(;+3ne1gQU9Qsn_hhayE>pxHH z%>15fo{c1f4ahr&2>R5q>R2Bnx!dU3uhU&aN7HOCCup=i30uil4BC8LW2XEMe0~-4 z*TqX4O;h4np7xcZg}sLO|;f#vY8}- z}8J}=>c@POVb}Vz(k@?ofui;G&4O%6OMzqVvBLc;M zeDuiA2cD*dhg}g;;@)R>Cv)eU-w|ADcMmn}vP&zRvz~KM&8kZ>1#-+6rF&KX0ED!= z8C6ok*J|*1`~I!hgUw;VC9+UflulTxGjwmbLSaj6kPH ztxpo{Ss!k5jQ6hM-p<~5@gz}!&&uPBeLL2cpKGVvS)`I##L$vSP@{8k$5GePpRvC| zM~Pv3sWf@rr;6`%`M25JNfd*lD-eE_X8!=<2CJ*_sb5`O4@Z@lSD;G17nz6Jbhm)M z7^=4%ejJXOq&i-Oepp&Z2@IodW7Gxa9He^r`0f zhp1dx3s<<5TZZ0a-SU?8KBm38$Ki*7(a%Lhz4-JceUoX3`fXHy2U@2^^dr3F*aX={DX6(@B?8)3jN(HdNe5@<#4X z2b#Itoc9>!rQuT5BX9N1&Dqpv&2}C=)U@L#_I1s~LgR7MznqVwUWhi8cr>p;;h zT@ixFwrBzM+Q4A@*N2GADPg6{I&SCCVRJlAE(%lt)Icl0>s@-E2jBRIR@Q)7-g!z6 z2JGMtyj2)A3)l(r9HfiE0#L3w=ZxmRKnH@foeIuhGs4~;Yjtg=SgcSmW7D9{03GVm z+F46xv1uB1mmGYvBo@)DWS^!-w{R<;`)-7E_GYtqx{~IVM}JfE>+Bk?r?<S3V)T!MD;iX|vDCX)6=XGxvDpcdyW8)aA2~!?F^RZ4Vlxc>oL& zMlqj$wVQoxE@o*wH+?0OO2o7*t%v0I&Opc}pZ4rm!vh+aYPEHpMtn12@I%IWixsf& z=CbSnKk@9!IqAz_8q~D?nZ6;)7`_G3`(LakYL#WUz0f+49xb?8)&5KvrwpTWfa5 zBkie>KMHg|vsa8<6L+X+(5V5KeYm>?IOk|iahm#zc({+tnlW(~3^&K~XRZM4k6!go z9SXu}<#vUhS75OxnZln^JCVuutp5PEruKq0`n63Lw3WS1EB1Z(MX3B4hgF+Zz0x%Y z)MH((ZMn*Y86c7e2P3cdb6$rgsRjMZrR;{?g97fLG69a>gn~NORM6jAU5KEOh;=`^ znNA4fl6n!IgQ(3*_L$yiR{qst!vOnE6rPy+9-#N>UQQ;wu`}nE=Ja978yo%|w);F2 zn?Wp*Pbg=TA1?4a4@?dK^sR-u7itFo03;v2Bp);5(00ckon?47-be8Ca@YeRGnU)D zF9(go&}STV&1l^SZ&f0@Unr6?N8Vt)Hy^KmTJ!2^bwrx?%e0ZCh0JGg0Fj-?=r|Os zc_3deQ-#VAlKA-;A5rO!hNE{ndWHzH#}jdo z1|}Tjj+?W<_dfM%E0u~Mnye@8^6_Kj1bg)9*0a+{v72;@9F~$g{_#A`=&g_C&uYH* zmzs08n+Kh1 z@{>-|bqzxV5(JE>fsbL!pMDKy%=VW8Lu9HROku~$6pl_k&U*E&p8;CU7l}Mibz-*{ zch)`|j^5rg%#uwsxKK0GCNrO)^{=VnN={g&{Ew023cQ##9_;Y{0NPIX`$yusK9uU~ zZ=%>nyN4vOmQsB%eB6(%cfSTB{>|{SO87>O10%YUKZ_f&=m#F>n)08EcLMk0Ux`r_ zo+~TCVw*?&vxXSr!Bfsd1{``&D-w;YEIAlX{=0 zC3UI$N2h8={@@Ff97~Wh6r1timi``}jcdbhZtdOJA<4@Uazc#$e0uh-AHy258=R0J zjaV5MXb0K4_Bs4(veIXdQHK`n=@@LVa24Aio){iR4@&*G{&h*R<2VZsn6V>d92}CP zxCgyw>1^l6*G$EvY3%pM@`*A;gYKvIfX~x8=C>o$SZLB;>$AtFX^Fdh*9AZw2>|Cg z;~2+m)(?a3HSdYOB=bLJ+bHcU;*7^PiS@u@w}}4$5P?_*lniyi9N?OK$t_J|P0iZI z_lmEy&jDGR?}?hK=+=&;3wCiO)a0B3k#cfL027*SpP_iu$6g-0y|tDfgr5&%gM8Zd zqZ!v z)xJ;{=uLQMiSK?Qe%a7V;}6;^#L(FIH%wNROY7;*pW)3hJFG|;8>umYg&R+Hu1Qt7 z=)!`EJzvLPw}*p2XX{Jd3-%GvUjG1Ixs{^2@t(GgJ;c*7Fh|1oD;d1ARdFaiu_~$0D`S} z7xs3ulSKW1v@1^*_@N^<^LYONS+zf5x8vp-b(tdr1OV%RcI2@lz7+U{@hikX82%z$ zc%$PUxvBV@#MdkgmzR?n2?YGf7$o^A(CkcS139dmj)=y{_mA2S_S@6Ed*U~+{gb>i zs(1&(Hq4fiU1}Gm>r~bl9%jibEmZbZ&T>!7USPH-lCLbUEAEk=Ld`chB)R00Pf~l= z3#YG_smh4uKy^`uAg6r)0QI{LE4fI`oTvnk3aH(;VQ|26l6^m|WhpXR>QmO6_r%=7 zS7^co!EU|%M?a-T$>qY%WD1DiKU}CE&+F2!UTQL=vNSQHyQj!r9&v%ku|9|ERc=^Z z*}6x*F&6^x9Y=UHZAmJreukTKh|3^2$CZyhtoHFNChv6P8W0UIeH zfIV@?uhyyPiOC4UUjUw@>uXOplZkc4r9 zPeaBlqxdX5?LSe5%X9sjK>czs-A+4mf$71m6i7EW3E2dpTpWVTbGfseFR&E{i0o4P zOT9~lR9~{Q0)zlTQbT=s>E4#=f3d?5xJ)C?P#o|Mdf;|FGf%vTktmpj3ao&FFs+V8 zao3!4O)F|Uo((piZlNU-T#qqB7F8H-ct6+hs?Bd~C)gTQ+`y*wU!S?@(D(eRYllWJ z$jBvGaCVM*DgM1GDG!*6!!d1O6-miq$2F>E=8c8YyeJ`(M=~5PK0>1e0Muj zbX%Vh=@N}NnV!~FbqyCT z>W^@?aBs@8Zf}+o^gViY^{3z8-lK(EIbu!cAj+ghc*5g8yz%Q#vb&iz8NS(Xc8M?y zQFe{K-Fo%{u$+l|8`pA%iQ^JGx~|fwhbT`&pHEDB)txHVSy($mZ)lT$%VwCnJ~|RQ z1D=3-VzZ%+;>{#uq~7mW0g;9c;h`Qg!pjFr+C)JNYW;ZUIM%1D2vzvN2h-MYU@GbpNuR7g@u^P z7>QMZ7@Xjr;$`cePaIcw;E#m*XM~`Rd$08S(l-Z`kcfR$dwcVqXbxh=uM6uegG{@M zG!B1x6BF|{R3!BPbH*|F)(6CG3Oye{u{OeQFwRls0C{cz&wsi<3D9>+NKDUl62XKQFF(*g;#h!~rofI3mHTduyj+E>{0EB1A&%}wl&pDSz&p2}W7{2lYqap( zLg!J`_IYfxX%}4_Ba#BPFgxUQu3Gy)Zx3qw-M|>y3Z6Z<2ldT$$DzYL*&T$V?8og2 z`x$fBr#(H-HG!#aTd2G1E{#Qy;LyVqH#+>v7I(aGS2$Yah9d!KIghp)_GybSUZ z56{BxE5r=uhQM zNSSJSr|iD0`lpN`WgAu-BEYT*B*}r-9YH7RE7d$HaII-9Zxn@KQWbXw2iP~U@831$ z-?JcKCJ z4DnkTGkf9Aw*C|G!ZDbOJxqOyRKRSr5w*^Hf;Rhu?Oor+Z4~Q14|(EH*BU5BIM01Ilc>z)_Wu2~XD?-Os%*jFk_ zvJsD$ka#`o(3a`(Q;LGGfboAX7m{VfzTZFskA>2PvRX`3kb`<+ZjRFPC|5S zH(rOgO0nWS1$;fLURf51&j}@VrdDNRm2CY9U#izp@N-B108PEWlm+slSfiA-c9+iJ zG2a;HwkZuAz1`w?e$M9N5bI~9$GvgF?N#{{1K*5e*EQmYRhv+~nt6Qo6T4iw$K2d^ zZ704D73n_~^$20nt+em?82&*k!NW#puobNp-$e(1m>@uuZ*D5KE65@_d2@Jv%n9DaVP=HZdR z#@+%hdgKff?rUF5@ho?KCe<|IlX0d5l^ur?E3+-Dz_DoqZD<6fHZi#=7MK(n~DxY(OU z^UP$C?UCzTMV;ykkXv&W%gP;b&$;h|fu8=A?7l3}qwxoaFDwy*Pb_9wOAy7F0?CYV z&Oomj(&Lixk)M7z-iiv9C#WN^&U*S(=q^)M7}XLpG6m`e2pf)aKU3DauY{WT(!5UA z7i>J8N<4Xh{Kj?3OrKl=0QAjsa3SiFD;W>U7m~Q`p5mhycNTYxEubP>S(a#upgV9* z55Lpg(qNXSq5NLbUr_MC)U1*>z0#RxW>m|0Y(lUDKXf0Po|&&TNhF%+yksKn-Gpo_ zXZVljfnLpNsKeq*8(EQ+?X?JY$r(_}bHgioj&t}|kzHx8qH5PRt@1U4vYntYJp83c zU8HeMO2Touog@d#j5>p{NjpdZo1i~XbI*FulHK6Ei)?3hHz{6J^Ugk;R>YRX#uo%8 z00Fw-_XKwBRIZ?sdzO+vFJmbT+2jvTr_<7@HZENcBiH^FL-8~AoYpP1F#v)qh<7{6 zVw!xwncIMS40`0(-CqEI;F{hZ^I_F|Kj3W_Opi@i?q9?@>MKiPJINZzcES%oGxNto zTu1B+;hhUf__Ogd#d@cQZM98bK-8=)(^R`;wYAeCdo*GvypWQSmctc^S=zmO;uq}; zt^8WlBh&mW@_4LAbdRUZ_Kk0&N3`d3T50*N8+LId6qrZa8Q! zBhocr8u%~ZW|KCtp~+!?Jfq8h73)nTT4`hhYFowtlJ|ETRuu@?#^K+^JZJH5#Xq(0 zh+wer)t&aR#(yr__g7_(?%GJmZ#z%3MiE(n2>G9MfltlNcm59jj&D3$;&I|Xj~d3K zsOmccg_dQK;Zysn7vzO|VF2k~o2GbgPVjfc9|+laKFTdR(%w7uRfz`YB~zDfta|*$ zxnoTl&a+lHUxuHtZk?j)53PJ$y`NgvuEMp*l6IZsZiQu?$!5nGRUlWe+gQP+Ev2@L zY?d~V%%LE+!l3Keb?xuPYe#IeNy#dzOA&#eL;WhH^g_~GK&NvHgizZ?PEH3OjdUp3 z<&@lulG{I#BAtyXjhCJ?kaN?$W%vPIejeyjTL*ox1U&qtf<`m?S4AWx+iIyTh8wZZ zL%{W{Plr)?zYes2EVq~Bw&1z!%rXbpuhOWJ&xer1q=@ax$liRPD)EDyo+~%vv}SLH z9waD=Jl!UKqX#<)!9Ih(y=(YqY+4GlmSt(C9E=sioE-kOo$)>eli`<%JdjmeOrMs{ zK=R4_^ZC%XCQ9e$g!`K7Pn8K+&7oj3)ksi51JJH{^sb}8PDhAr9%H;4sKW*Mh$Yu< zM{M=Yb27m9H~Lc)c~vdsO~J4gScAy)>ND?FN5s7!;Y!=q;jyM4yBMww!o(6MRUk0@g4*UYq zZFOIY8k|-(`t6J`#Ib**+)nQ0k~pp7K4X>{IaRp+ga#-uKwBI@LK->2z&vVv=0ZC zwAL-QEcVu-Ek|5TkaDUCv$4XmAKtUR3BsIL<(KVQ{{RIP@%QaTt*qLNhr`z4%)~== zCDx;GqnCwO|^XzQ4@CdDu5m%rKjlTZ%V^b+{s33CS`AB%_jCD1e zcRLp>eiT!x@sNiDk^o`#}F zLu#oea2bIk)Q;Y~QWpD}X)fu}dSv$Cilex<0<=;smnz$MP}l_Z;Tw?4r@6otrK;)ay_!#vL~1kt0M@En z3@U)MfZ@Hfz^Ob}ITwnAoS4*~%B!Ky)#YSnn{S^Hkb3p&Q-5YKVgUyoJ?g7IIs7U_ zyO1E-$B%lIV@Y#8ne9KZzK~CgJV7$~izU8_&KwSznK(W0K!8Z{C zN%^wFf-}>$J%xOU`wePlUmEzH6Z15l9&kN)nGSyp*VKLn*2VXM=1EyR$YmrIOlNZN zM?LUIzcms$r*`!j;2W2cTgGKEkswSmlhcL4@1JAZwEROUc!~uZRdz504s*}z{&=W9 z8(hWaNtI)}9N>)loO^MKxvj=L<_@@U$7>cDe@-#zdiJc=o0+6?`iz^TkX#|$4nT9r z>Bs5TvmL@@ZctTwwpbre*8;kEts|au<}O&_R2&|0&p+oiM(Bd&P^(w8t0_+3NZk1WZCbCHvb9=Ol9L0!&*M0P3`F!A!I z4U8|LJ-b&kpVz5d729&4f% zVne|ne~;Bca89#M*I97gd&4IctVHLBb63eaAKLntmcp(|Kk=8E!}U z!S=5W{fezGHJuLn*FuhKySw|m#|nX#P{c7L;4enWJPdQd%~k!aKj5fd4*iU*+e-LB zHkI)Y;-f~&HZYq+@LY?=ZWt0TZq)w(%M?2kjm!uH)FX1ObC&-Ag5>_wT7SU*0NLu_ z;Ej#TOXDvc$z!khrrXQRdRCbUX)Ns|ag1C|GOWy;?TrW{=3M?j-2VDTZVuy;an#pA z@l)cix$&RJnx~1rCTkb^?z^nrHQnv??7n38Qa4t1`T(E+01B!A00GZ#4cEV|bR}d` zT(%t)J^ofBoDrPW*tFD@9DoA(dC!;5dt((9h*LaR<+I2&X|~AI$O??*c;F5VF<#}r z8ZyPMI&TNbh7g2saw7+~OjQeSF-BFTRUG`XF#Q3o9~T(Mif??_wqwg(qxgSzy{j@P ziz{F^8R^vhDYTJ%s={3A6Txz#+V1NCf9I=wzfNl1j<={NVFmsCN=G1FNVy(|=B&vF zm2s8?9^c|>-K@;zTe9^hsI2DQv?ca6WAPTHZwBjKOH)t=c)XQy^!d1@PZ(=9u_Tt7 z-n5K>f(`5NJ-OnlOC}+Z6&!#nqRF|ow?4`IZM&}M%T-}?RQnf5KeBG=hLlj z_%q^Ph%WW}Xr|Tmi-h^u$LH<`YB2`~(}P?gC0Oq3oO4>f47g<0;$T2A#VHxi2ky_M zY~$29P0N3c9x06wr--#t^5lTy{5h#1_|M{$aLM8gNHOOuQ;+<1xkY72kop17;3^|< z9ezwJ43H1uQ_5+v*xdYa@iCRmy7l9dKyTf}$o~Modejnpb@5`zp*5L-LH__eBIEx6 z9qU|#t&_*`esswQEz`H>R-%cq-RXZCyia>1a9-+-CA+W^C)wi}A5ftFwbYGigPhLM0>AJkO$n3U^qYD z&vvDOwrhyn|hAFjyTBo&3brcqdrd?HK4Niw(7&g zBI;Nza6ygYY;2iaVUfdRGO);RT!Jx*=6*Q%0`lubT~pzmxYTFzT`jHTCP{ALi2m~1 za6jwd8DI}GN7Ez{I&`*6xn?W}&WZqG*!!MIsJu6>MWEi#rfTxax?_}+&VdP%)UI~S zgmsoMIv%T)=Zfi+ZgN6;pCo_6*|=EMpHH!xKfH!A$PcK`P;a#CIG4 zxO8L2;atu)I+4;z@nt4`$3=w(cv$XR3NzCLcc+ht@yq_RPT7v1zB~_aUrOXsGYDgq z1#`zrenViKjQjrpTFIiB)y?r13#m&koN(OnIV66Z`qY-5Hi$E^uyVh|Oy4jk(EIhS zQUD6)lfgdUg-WVa;YkO+DHjCRtlYctw0~urWvr{b1vr!6x&E~1JX;Oya|W`KGYmxX z{{VQ50gA>E0cgxvWUx>@&st*27AeVM2t@z^p8m8QRP0&R{8Xh>%Woi3=cI!?e=}LF z;>&O`_DTJ*AOj!$dV^Gy7-I7XrE;DVvS@EE zH!wTxTrXZvAC+1PxWwcEjtEQQtNqgI=@n!^bduQt(8cBGG)c({(*k_ANQW;iZBH z@`Ie7Lo${F0|1UHTDGX0Si7%Wc{*L&GB)E247ktY#C?0$&bGz1ABuM#b0PBQ2+o}3 zk3u`1nf9-s{8)eDpVT(YGvyKn-Mfx6gXv#7d^C}7ymNDP6Dcy>7DUE&fzLj@u}P(*~XHO^=#vZzQm}g|`k_d1k?WI6t0o zUEH_LaeV_!rQ?dwj27Hj5C(F4^VYe~8u)POC66S==W`U^ewplRLq@nRZP=HSb)n&T z80bM$&IMX}SQ;I8{!E)s?v=h!IARY@Jx^YGRtC8zmjs?(*GR!sIL>`|^sSqWNL?jB zxf}q$djpL7^saYYmG`z;iEQMM0SDh5Dy$@|W}~c1Bu(z)=0Y1e`c&R`lWz+)GC}!w z4yUKmsjld`e5dhbjDycLYU)+l634W(NV~E*&Oet*MQ%rJa>nTaB#<_q-8re0vr3p; zHtxMP=f59J)g<$xl&HZ7H)W0ou^Fp+eC-^ifB=9v3&QpQdWwBT%2$mR=4d2sT%K_ zN58^c9ORP==WNT+a7i7&t;>sXbErBi8%w=~S#h+lPzx#iv);cmbbVUmPrVYuJh8k@ z<|8YR$lZz&$UcN(zJmBS`*!NORis)^#p`>I73pcVIOZ~J)GZgdjzf<(Blu)K`8*2w zjAsqX4a$VH?0wz?iQ!dp)>eJbr!_A>PF=UQ&QVCj(egO<>r~$2N10@a10BaCouwF_ zo`ejVzu@l|=^qpHS#N$C>XsfLw8kzi@>2EyPJev~`M4Yt#&J~JM2k|MQ>Dlv^2lE; za;wK|cJ27r&q|!>OO{H^`f7EfT0GEqMWL#IJeQ6;sNx{0BRB^n@zi(bvh`03#dUKj z(k@=z+=no;9iF`Xb5(CI?rilOURvBBP*0kpYPs|$zqTsM-xp%>OeA8UCw5`U`Gdz&|V;3FzV zS;-rT>4Vr*$#pE>&~s&`+s7J7_ zGTE&xfNhc!7#UuF0o$SJPHR6l=-f&OMfp)c>5pGurE<>3(IOVjYj76S793!afDifg zr`$&!>pSf9d>-p3rFE&-8AA!JTSIO;`Nmd);CEeKiB#^QPr+n)V< zcc@C}qc-xwdj<&%t#cHuyX9fHcjxLql}wj{^<1o`6$j?P<8k0|>DH}z557gVcz|UK zu<_-PJNgfLWRD7>rmG7alEzpD8{Gc@wVZVHt4hIfS!98hHjEH}DR4UAaM|uT#wj6` z*uqlARYX8ZiN;T+cXk~5Qb(gmv&PzF&2WHkfVWSJlA_|BbD2NNf=cg_~Y@dX}&h;njW_v zk>P7O{9)q4s*u=NW#WT_mYu%p4*c`Qd41lM;%^yfHy6JWwW}`x_#zk#j_W$XcXGKo z-611q1EA;HysO1Ow_IKrvzx;ouvUw2rdv$Rmp&)dAT1@suMF1kwjM%2KfHfp0Tuf! znfMhdT$`Uqd|~*l;r{@G8cKMB_SEqWuBE8$&Y9uMW9BYT-9&(MGj#c@!u);vTYOOc zvvmQX>8pF;uLy=jx6!o65YIFU#|?2gA#LNp0S-GmqPI5s$Fd@E&!JFDdDGKjz}ML zb|SguBfbzw`wz$e0JVq0PuU|+ds_<|ABvtcws7!idVILh?e0Sywba?npd4p*Nh{L6 zH~p`FY!4rP*f&P&BG$+V)DQt< z$S0$Fds5zbuE$r=QcTTlEOP9SN%v&_?$i47)0)M*8*-su^p*{5a1-St7#SVc>7QzR z2_zFQnyN?2GrK#v_3mmIu{>LC3~n6Y>~P*|HhTIFzg$#_D@M@?71dNQY-6bGeFYy8 zF6h&SG+j&KJ+jx2wIz^c=$r_|)GrhCifsxo&#igUhRa|a}o!hq)vy5XM&m31R zqiT<)={iaBT2XfG1FIHKB&pyoI5`lfQaSbHVC9 zmEzNW)-4>N<?CKsO{ad+QtNjN*5=OMEumQ&GO>~mCp?_vw@xcL zL5TNwBavlxxp5oIxbzF} zP@+Vop`GIWGgkP4;k!GH5-Wr=>JveMKGN&35*%mc0FS-SdR6}b27C?YEN`QjIXK_7parjkB4-r_W%MH%OnM;M4 zND?+VP=7P&#a!9WnQdZ7f}~MEi5i7fA1dH*0^|Px*Tq-`lL16vuw~Bu{{Z*adw=z+ z8x6P0k?FHRI~}+R!z6YX&j+tHJQk7yX1Ga+`GF(mRU^J}gOAS@m`YYDYL1cV;#*YT&V7IS z^}~E<@dlc{1C-oc!47UA!?P7qH{=YDQ;vJ{N?RIHf4q&(3elCBLqx=6obJk}xb-|# zg|`qD%$ZZTA;IVS-{3k5scUep1dXRMOoVV%wiyLm4Ro7T8Dy*X0EF_WuA1 z#WUIE>`SCwZt*;67~8rT2i?lZ3Y>wC*vBXFta;^hz4G7=%oG9&fsAp+KJfz?=~D~y z97zS5d)EIp^~Hs+FwK*jdci zf;b}uOSwE_raigjRQgT*wc-B&iEQ@ngJ}N%S_uH2hNZib(XR}F;wcMlpudOt#z$dU)_ir-Y8kfJA)QGNGG^C1NE-tu(8);^3~1(`@AR~xbKS2{hjot)$BZP z4wfS~1`7s2vTh)wvka-=a8Et!XI4IB%RCMOhWWRD2?Lz_4tVchujIe(a6d54p?p-> z?M60&$ywz2lkTY`ai5rh>D%)>yQQSC1Db=s1~4btv>Hq*n7`N6|+TvgoQ+5mu+ zjQN{`5)>Y%AEy;Jh4q_{4QjTxc3b?&CfrM z?Qa;}c`U63sWxx`bC5pv4^x)UKEk=yRcVaz?ZXe_{w{DZI%Bm;@w$+y3ZZYE$T%!| zj(^W0qJ>bGR*)PFf>)_02OfX{%~A_pjZhlSP3sexh&U{G0P~;o&2?V}v_-hr=hTdB zVzrOTMF0gdNzUw!;YVM7Ynhhut!&k7m(qhwRXI9juXPFcLB#8!g6Yj)vJuzG)$qeZ# zNgBpv9$7}`aK~>!TE7x+n^pLYbL9}RS+TZEebLa82m9Ne}7DV zW|jJk_3r@qh-*F)w7HOmy0dX>I|H4&2gpgrITgV8$HV8tzB#Mx~uj%yWiS67S#4fjNNxa*Aql!d|?Ryg#)M!jQbj? z@l!@HYgSr>PZ(R}5INoQi2%q09Fj-!HP854#7UuelG^U*AQ2V}6|t0mmGhs#fGgHK zOQnr#!neA73_RkZ;@UtqubQ7S`{3k^d(*YR@~HImSwDCOm>1>TI2`pD=xZZXk~y!W zP%^j&WPL_Y-2idvpRHU;B)p3^Ac99A90YEM^#`pbm88+$%Ht?s|Ss{A-z--BaR+hYiCH zB)wgwbH|pXkUoH(Yq2fnxR8P)z-)9F1CgGlxof8}d`a-*>@LZ5bfI(ea~B}`a7Q)9 zwk@4ZgLLIKsRNy=Fz27pRb69a-CBf2ZPP?s3{C)Ua(f;)BCoI!x!aTG9F|<=vB(G3 zsp{6xaJFVFrzY7qcTYFj5jP4u?*N9t0&>YW59Yyh~+$q70&(? znNL3FJ-)Tk%cn^4FtOc9aE&vB0R2f|Ma-0B|;wAX0KSR$TgG8K(tK{Fi4&4rC{ zNDRb&H8N#J4sOV);Y$a)(;sYZ&exLVvGRZk#(h5?D#woeJD-M{`)b;jkD*yLq}I)= zYWFK`V{FWaCFSRLU%0!QJYZLp{?K2y$AEujj|M%>?y=$9%R=`XH62HK>GDped5+Z+ z_u8XyN0$&0u^8MiYw~;c&Hn&`+W6b!uD2rmAiBP?K^&3)0B!29MECLUU|4DPYny#J zHst|TX}04m4>gmh`W}@W8{S(Q-?b0zlcf9*@jj{H?+i<4t80E8lvoW-^!cHRd5CI{TSxC>t{{RxcKX{MgZmBizi8Tw^XPlkW%P*U7!vJmbFajp9tTo-R$ax&FUKwY>dJK-w`W8s z!jiO0-W>t;OH=?TE)D?3dYt?HY4TqAQUJt`7zP8W2Q?puu9YjGl6;2a(2cig&s(O-1TuxY~H@{HddWG3!<& z)1**-R^Z_A(E3$~G>0*VAxgI+4bc14+`e>sC+r;GXZWY8JED-HsIMMC70xqiJkuLAv(VLDd3tlYxEWrjOa%tl7mcg{Vs04BZLRESvk zu4V|NNKDwz%mEyMjtKXtl(jkL`JK+I;k3qEd8CP^Lmo)qjN>^Y=xXPQTQ_Cmn_zNK zu=%*-0|(QdKM_^F7+~7mJ4YyKq{q(RDgo0A+aUh{jZfkg*h;QW;mP1_!R~uwC#R)m zNZoq%^vNwzge51B&0Iz>4?)wRXZ_@e8zf{OyYK0YdUIW;hr(LKuQ^gs6TC4v>(f2B{K&62(DmzmH&FuaSnbU6 zDT!rpFx@epj7b~{>wHOZsakkmd%1MIPSVv7hMwjVZyRLiyS_Kssr%jGwvMsnzVvEW@k`^Jyu_&-j()Wx~XvqKRu z#yHD7&GJS)nSu1KJK`VhDezmsz9+Hp&%}R>Iyd%~u;S9_XckgyHo5|m%4EN|j|ibk z{PCt;MoGpi^K0YB{1gk~&+Q$gKAG`X#`?X^g2lFImOFIqB^0(oeUjWNI2>cl-}u*) z=-Pw9s9WWVgkT2V0(axn@TAh*?T!+CPuk57;O4cc_c0v+ zN2}XjXdf1A?jRC9{{V$NN`W5da<>-JvN8>Uk|q290Gr<)KVg}^AN)P>7mB_Vw!3#> z;Mvzn@os^t>5XBl_!{m^`ElOF&6#3uGj$rQLD(-KmIv&Y`)kkpKgc{U@gmyy#a{{a zE4c1;Ukyh&f@?XWebL|P7YIYx-^AIG9yV2W;jz1V{*m1LR@46gY)^*T2D9To5$VbC znq3xu_&|Jr4a_Sa#Z3w}-*e$F6_rIuwM2ygVizjs%!r&whe)+zCkF*)eiqMc@XE^I zhEueI)E`1S8U>W0hU8(N*1Z$sw}!O2ekN*{ehSlN(DY4CXT7k~<&enwTujF{j!z|^ zZP9bi5p&5k%4zlu1gaR9LNHsXTE1g0ZpK^@OO@e>1B_I@QLGD{+^3n9qK=b!2PswF)_`Wc#ro#(qg_EHXUx1MSi z(#oKbWnu?Bbjkk!3b}tXMR6iAQ0jL708CT|e0WwPE;!9cI}+Tk(Ez{#%oKMx$F(GT zW0CiP^5g@al_R&4Du8}sGCfEC0AJdoVYQ?nkOy(dHA?215MJ8tkhEtx{c6vL6Eoer z9ll+ptT1|F z$Vx8c#xalPJ6DaE>ok2XN2DaiT*#%${KOIY{uR@F1^Aji9C+W#)sjhcZDB>F>}qzp zt1uyxAH)tAd#J}Ixl4(L*D8l^Vg@sw=CiK;a(5Gv{6J%Y{vXb65qq4}OlgJLNwTYq>^Q7`&jgxt0E$ixiy(^CWkiIQ1 zjC?o!fv&wxRz#!MVM%KDNF~>qwYC3b>7A)Wf<=SuEYz_yoLE4_Z4o9$mK`227PL4c~)ENvou7PQVCP{+pr(bwr3J{WnBg| z@qU9IfvDSQ)7{4mkwPwHB0GrW1igzKV`QCB{{Rd0^skmaIeZ~+hgzIh8egA2gMM9X zC7DXgZpwapOMrPv;^b{Vc}DMA`e(!%MsMM`vPn0jWn2Ta?9XC32XImd+=_=(xeBDS$4QErtPR|~2u9$C@0tb+gu$5Vg~GF^_!buN53PJZ~yDZt{MM&G!5 zbBfvV-+*;50r;}>N%2%4XTP$2u2+d;8wWfQ`cgSp zvXIQ!A(xTIzGx1EpNJwUL5v1%XkM(yUnmWr{GQl?>aDT-M3m8Y!5rUMovbV|?a7 zeGfgUOA{UhP40a-t6JO!B(*zu<@h-xEP9F|Dq%tn;nzRs@~d`Za%A2f2X*5FIS~aJ z>N0u{%9Z6-+9chUBazpdn$9woH*V@dW<*n*bBxq#8hE8C6q1x1zjm9CCjek~CxPxo zWj$H6HCHvXj|R7kEhU=b?!wLwFk0IStbe6Xju8Rx&n?a}1_`gH{{Ukz8+g~je+G!w z{57S=@cPOrh}G^ce2qw4Pd48s+Sy&CxMq~?NQ7XL56#HWd+_JL{uuq7JU6EJ2J^!H z4DoM{b?Zp~0O2Q}#D@^*_BRT|X__(xJFm9xxVfB?N{H1sBg^@t<7dQ#@TZ6^{1u|< zdNg;w5@_rn#AyqiV&K3C!c1EcAq+AVa&p{^ky=G7SiV;#eUsuj7hUkir#FUW{?=PK zztZ5gnOf?__K%Y8AWK5{!xe4^t#}{6{x4QjH=0;T`NGqPTPsA%VhUr>lXgH{+wtos(qS~j- zJHcFS`cz8AS&FL|!Oj)B_Tr~Z6=Q~Crw1R%`(}p6WKC`(X#&a^$mgd}$J^SUIauzH zLd-~JbF`Ktf!neAQrIbJhm_cGz=NJgu1BX_nxm-P1(zk8aRh+9Njzukf%L^vcOj#a z_@gV_Jl7kThT5t##@wIGbJn=qRm5sv0a>{8uCw9{TXfVUI4r=P%18KDI;;DLnEa)A zAdU_P{{X7APeG`TvYszZw-u*|bf_(UI#^sp;B1dy)01?FMsO}6=trw2NzQO9 ze~7*y_))4& zb@1m`z0#zY3p8=KFx;>AUN*=h+yH$DuYdS=`&4*O;v~sy@jX+)I>eYCY>mt5SF(S2 zk~0Cw=YJmNzCRa|*2C)$d44C_U^Ds{rOQ*@k<+fA`c?3YRaY>^o3~_=MmWIq^*ymx zG_6h@Rf_46n3;~$GO5}K@0086TAm}(FEm?Cz9qDZ=Gx>3j(ER&Z#XA|9E-uvr}C_u ztvPilT1_N`PxsFA+dlc}k81LqTG5{DUsPS2RFc*-x4BZvLdL{ke7(-@r1Yq+ENyNf zm;E9@%sy0*ZQJe-eAX-x>Xz2Sa9fmCWHCPv*9V`&KT5F-*4mBLym0xd(zr!{9nX++ zyWgCjrAsdNJKHTle`mngkx2}N2bPLI)+pO;|ISO;+y@aZe>X3RJETwoh18@$IH3BIO7z_VU$XeKb;$o zm^zRUfO-Mg;O3Uaa}XU$;T{#$BmLU|!OzMUt^v<)ty{F;s6%dT*(54K+DPgRjJ0Du9CGF0aldi`S#}Uc|ZNbzL$RpgJ z%920~pYbhsU@}=G+Eu=Ubw0nP1nw@6qvu<*dud>f)#Ux?=j9kDa{Kh_=~ccf>uqoQ zG2BfM*(L9Xt}Yc>x4)TnKiwdAZ$CbwovF+$w0pS$lt_?CDy(CbZKoLenxp$zO(v1> za9YHWB#}d;>3bk-E3lKymuWnYk}z<2z~a9D0EU+)5_0N(dBw9+#!{!`c;~_0K1sZ7 zYZ!=0i4g!+Ilw&u&Nv_(n)(k~)LI=u(k6}|6JQ1RV;S%2E5tqp>1OA|s!U5FfE4lb zZOG0BdY+v#*1ccFx|}xtBD}S>%a|DhNJ6m$j#rL{Bz3MF@?W|~e-6Pq&G{NK&0(vm z#j9GeF#vg9SoF%U77zLXB4deU;~~#IdRNbX9e-|pGr||LczgC`xU$tR_LP4T zT-)XaagY`WK^^mgdSo7J$A4>Y+Jja7raWae@5OCYPiqp9Wuj@CQPcFBG|1!0a!ilF z`Pk=<0_20|P>XF!Ye_9*muxMGhn}i&*LDc&^sm;HRV|Ol>)@q_{vnU!9dlOkUb%C9 z0(9>GuXr(hT7380U=rLF<}^Qg__shwh`y3c>o9QHJ9f zBfVIc#FzGJs}%DRxnrN3oN{>_=A;@#g#7Xi&U1|8-;+r`j~d%%c9bt~n+FH^cjBG9 z4VTm6PO0|WFSQ#<_C&#V#1|*8BzjkI;g5(;bV#I<$|l2Z-5jR?^U-n7TJkx9rQ9k= zAQOUD85#8aE75!m;y(_Zi^9lQgj3Vk`qE}HIv)~iQ22vIiBc((Y2-}U-Sh+bn#|IC zEiK=h_Iw$`fH$zpcgMNy#dP{EoR|7Tw16|01&KHXdtjb~Rrw>+>|lt@BejZW&KMkq z^%?5N*V>|589fer!K-p~$cB}uO=i|t<-mN%qnxr3+yS4!SD=p?>OyGbo9vP}$t2r= z$Iu)cW1ie}u1CW$q&l{%6|Az$40l_Ek)6ufP;w9P4#z(Azq!Oi&G}>`lq-S9upR3b z>}PATw~aq&;oxZ`4`&7a>!8d~x0NS9C^9|?3-sq5>p$Tq$186Y{8M|aZ%UTNNv#`; zBC^H`0rKGCn4hO=^Pi4Im*ONg`eK&2xUq^t5i-m35CY?_NYCR*@S4j10K;DtG?mm+ zD4tO0$j5f=$%3cf2R~YBM?`7GLg&BulU0Mnmdh=lnqNBtOg5A`$;jw92kBm8tL(7x zHQ_HfZ?q7sK_ugzow3mUE72{~ww-XS4$mu`5Z-AG!+R1qtPAf2B%0jD;&~#9XGs+k z<{%I{dk*=g+GjdE7vinqu=tOzA}I>j1h#m|WmEX|{cD(t@HB+J2-sj$=&fq+%geb`g&Ih4C z(!C49KMFNxZ8G|M89%cox>S*uhmCq~#xvi7Mk`yG$?9;icwO(V5<7UNyOK@LxjSaOTBODxJ= zhoPl6if`Tqit6E|48Bqjp-Bgz7#w@o8S#F^&G6G!BOsBE!>Pw!YoLx% zC88LYu3Id3Dz5H89Z0Oth%uzU4?IO2U`FD>wlU;~>NfhGJN`7<(U(R0@%27=l3Dcf z&to*uHgd_JC&V3dO_&I^8D&MzQsov^`ha_ir>H1IjjkPId}IX}5;6JK@X=i4 ztdnDOzY*%1O}hU8XWrgI8vubW;NF=Ho(HxoLA-IS-J%Unz!WYu&zqPdDS3`2sa_=jwI;B>58 zdlS42F;>qc`*;5U4{FuZB8lO+OfXHn6VCp9dw-2K7*z&jELm~XZUU2cC8BLVTEDb- zmd8=PU8**S<}I;@O`zmwrEl7JpHM_TY>O+LZY+Z>kMeU^QACnPzFK9|ECJPz*Wj1!6KU`(#Jc#_vsFSACAGXuX)W3&W+ave zcsqat9CKQ}DgCQ-d!0ggY`h(=Sldo_h)$ynyClw7`J52GgC4oB5%G1Xn^dy8-*X(& zY4Kz>26Df2j>F~Y-m-?Fa#_CLcW{xR!4ARMvCkZTo|XDOS)X9A*m%>aJyG%4+?uu` ztDIn(`JVS}`&VeB4?n}cB2aK!%a+}V2iUO3x6-D!{it*Ye=KP}DN?LkU|VyM>e!P9 zKGoom&dDOAR}&nJ5ZKAjVfp6PLt$ z6aN60hXcrKulaVrAM-w|@K^1h;Xe;(HoAX_G=CbSTdOYEEMt*kOz?_B^TEwj_@Db* zcuU1G*e-;=EsD+(Wtna?W>dHvDczhm85!wcJ6d=r;tk5gG@lB1`fcCp!gy}#NU(V2 z)i$X5u&mz^#p2%#d1>Q~4^h*U5~=pvMvOP8+q)we&q3>2M?A}WgBD3Mtj}iB=PfRuENzlG86c0T74uA5 zv+7nCHwuX?cCi@>fWh&ca7n=D)~VU}+T~((f+<-SBWVSI9;!PN?bfzg#sXjR`5Av> zVjujve}DV~>@SBu8onRhc%RPkSB^9YZEdi`NMwy}Tpy4rD}jU8HQD&9_MPxGwuyBo zhJGOUKT*_W{nP?G(ga1a8Hp>{6Z%)hIv0!eJznnC*H6;jCZ0t|B0A$rmS~C8=N7NtiuyiTo zCr$A`ha^xoscl7CNf>f)4?O<>c-EqLmd5>eS>NdM!y);aE6Cj!&;k$4efw9)_PUH0 zw`i-S%qO{GGbDRC10)^lGxVtKH7z?|xL9M;{?~OR!Zb)BCT4TMj{tq*a52=?{c{T4 zm1zCuFD$CQ%lnVAZSNY{qiZLKO>S05%oCwxU~-uR@(CP|O7=ewq`o`R2B8g$T}O0H zz1^{7EgO-BUJoFXkZa=&7xo?ao#G8sPq5Pd6nKj7P}GO|CAGZPesrLX#E{bsn@1;c z0B5dipuYbAf@pks@JEA>iD&p3@e1EcS;eBy1>KmI;mm3gd2W(Tw z6l8tULC;VtnLiKwWo>vPPY(P?2LZu~3&tqD0r?34cI%qn73j?-sxQ38rdcRS$6vXA zjQWjqi;2@~T09XCkh4N@k}>IwXa4}#UcKqML5mW_LF8AUSa zTA3k8#xX6c3=xoWJ;A7{i=j=Zy0O2hq%w-r+AiPWXVw1z6TCeihqXr3Y}5-qM3pIw z2&cy&gU~l5dy3}#Giw-|&1liqe7Ap}0~~XYpdV9TKF#}9{7cky=Yv}Kjqw!{RSPA( z-h&*9*gOJFplpNq)hjRBZ^ybsdARXzs1hJaH$ETCSR;~L!Z1MV&lP^!EA2165j?W2 zc31g7)gPrl@J(4&{D1K-)mTV8y#{iKFbF2;Gsn~N74@WkQ_MsJ$U!@Z8&Bow`ilJh z{{Vs}d{&#{hmC$RUuwGUm#xhmmxry(Ynmy2*WWMOnkTWU+`KT6W|!td@m_)bn>Mms4Xwll~^Qfwr@wDcP|8C(@m5rb#5&jal)Y+>u+lPlx{8Oq!Lq7dOnr(xs$CX!%vH2Vfu17sp2BYPPzx zQX7~EK5pUiFI~Cl#}yuhrNetTSrtrgl}69ZPvcTVk9q;iK>}?hnZfD6!1b+-4@rhw zr#Dc-)@c)E^M)McV0X#mH4c7cS?qeB?B%1|s(77r^mLjVD|p{0FT*(lJrrad4z=sr z^@KOpR#!e^f?){kq>%XPbK9Eo{{Y!)$|$@);|sZbwGp+4+K%vx7UL*TeMWQ7wRJkr z#}5kWnhCeN)fVddCL$Aqf_alA+706`~?J7?St#B<>KwaHQu4*0DBUst&#rE731=0WtV77 z{{Rom#X&ZXRqzMOdSa~6MJ2K8`hV^9<6jI(B)<(UJTc*E%VBQqG^p-xQFzMv_Zz{_ zJnYXujd`EMpNl>z_{FHb&&2-#5NqBcl^i@{P`r7PAb7$?PQ)I{pbCL>LxofWo`=)k zp1LzavP^AmqXk265jN5R>(i&bOr>Md!c$G!+MM#*%2X^&+Z3D(VSg%Ew6|-55NEp& z>05ElXEW@#ng(N#2bu|E?g8ee@>1SzepO?hdK#A5=q)xdqSIPM3ag%Y6>8T-k_m)> zF#{*x@~zly!yJGBAb>a|4^dWPgk@EiEJw@FB>H`7Q@Na(lMRcxF2u0*%M)5$gJSmtu77R^C6|T*blpnlv#VRRX!uX}cj*f_UKMkFQ~h_0QQu z_IdF?#UC8r_=iHYn#;mJ4sB)EJX7KulribvAGKIqDVAa|XOy^Dt=BS2TOe!&t4OwT z*415_-?fLsOZ{i|bNE;B3qjC@mxXm}ty;|A#dMblZ{Nwemf4(PjLV7Lff!uu&P9CW zVU7?P6e!!B&D4)TEA%V=3ZdcaKY?GcKkR+*qee!8TOB7{@jkR424~c6q_;ah_-3`I(S^pBDY<4Feq~X~$UNuMrB%@2`&Ip-#u=5SOfVS!E}#8+iAkeKd?U51 z=`OX4$sC?;9IyvCMGn3E~BhlL2c$q<}!e>F6PIu_2Z}3 zv#-E{@znnS3FsakfCTV)t6Dv&`wpnU;2Ur{>cj;AHQg|ooJ5}u^)ijMy%nC_J!W{GW`NywH z6KM`!MpIh+tUv^VgU4Tbu0{vV^sB}^b=rC4XNsqBm5}bw<5w4O8qu8LdGw|*!RD1E zWjr3Vgp<~^O5oA4;Ke^~b^|yZ@$X%;voSaXk}^kZR~g`k^6yyV)0|gW$$_;97&y;N zeR0~nY<9Izr^!{RF^?-Nl8g@SPq(%zrOxII;Es6f)KtPYGW?`&J#)=hpCBBO&u*K4 z3c@PKts>upJZGqUJMm?Xx8cWV?)3RQ#M*JY9f|({JY;vTx;#Iq+WcVfuAQiOX;4LV z=1rspe>6pKQ+3Uu0DQZ!(#A4-^uVuxrv=pWoOS1qYW9EFtK)k3C&p8FSH%-e7LTvE zjb@Hrrp{5y$iC`ENBcP(@GI29)cY*?UL(P&#a4>c`Ws1>JIER1XE`J&af9wi>_U~ zXs3koD0PN z`JUaCnRlZ$I6QJqNZ}vUK1l!^%QqAd`dn(mk4h5wfQ{iRe8m2}PUy zL{Y}1DR$?n0CoQWJuy}%RD#6{9RBdBVe&({8-q(?1Dr` zI)hwzvs<27WVn`Vn};(<`{a?DM$0pIC#gN^9}d{btZEQ_iZ*pD%m#S@a(VZ_%~#XJ za;4KT`Ir!-{{RptHM4e1>7=hDR}zvAKqHLt)~@JREe^2*C^!%Ie-716Gssb%{C`@t zq%O)*!1sLqn$5pVrbnYO`v5CPfotw zYBgJs(uDKs=n!3Eya)*!6S|_mi4S{Qef8+Cg7mN0^oDcIQsEg=zO~=w-(x{afQfS zo^m?#>)NqdMB3D)hVTX$=YmEC?|Nz2mW&UG%wp4`M&!JJV?5^_eXEw#B?i-IVi+jL zt8@BRuZ{H|K4@Vh2xMnCJe+Zy)+VUKZ|->A$FQy9wj~u~K<~GnNFPe?JQk0-VxgES z0nZsDrb(_A%la2{p+ILS=(0&j6dhsX19kF;`>I#<3D^vlx0G*XgcJule+^I~SEw#a-K8=ew6@ z_3(?9dc^z3Us*IO)v@tit<9Ckm{b`CM2n1)tT-dLH5Qj|9iFSEwv8;0EO#4}b#25D zI(r^K?TYX(gWtA3x!~(m(tL9Sek;(1&@JyJ#nre6tTUcZ1c0x>^%d`b3^m^md{OaL ztp5N9b#$J1t>=*G*9+xe+pY#vY2!K03h+S4;=WHAmsP?hPL31>KI!HKfIRx|=IO$d;wU9*XDMXQeU<3T5clO5}1yxDk$_c2#5?D^q74QRd z{{VcSezcZWiEnGUqG`bxaKti$j>FTQmEt`a?Gw#*k;xdkiXuYgJhjMPdXJ|gKT3vc zd99l^C+!yMyeK(k$ME~{o@vHQdxR@!%+i2P-k8DZ$6v?Nq7%xb#}o8FaEuon@%|Km zTU~l9i+Mc4ZFc7Yxft$!MM-o7>>7AkHV!2Y7dh$m6k8hRz|p~=D!3MuTvwtA1&nKCa#>|-k=X?Y02Cro_f3z>ZX06H_ByVojQ_5cnC z6wr8H$iO&&sFMf_qn(e%JcM*M2SVjimTy z{>;9*e6aoLlId40dvOTkxcXP<**sh@3HLuS&t&JBHP}C9?H(JgMBHZvEWYUeUBqLK zM;vjQ^vk&IukK6gP)EK@t1!-3WSpN~eR<7r{{XYwM`*1y(Etn+OaW{;Awa-!#u$_M z0qI>_dWtQ?hIt<1C1H}kc#LO^bHT3h@ArpaU@Cnu$so*;Z9|28 zHZk?}`d8{OT#Co!c$$iGy4cV<`$J~7Gnl7>Hr|Ay?niE=TyukthP8BW5t&&VP1Ee` zrgk25u&GzM3)#uw@$2|j5VMlT`Js^`PME5S=UmpQtF^`Kk`|u{!l`p1A3}R|t5$ane|5UR&pxGcV~ZyMV(10_W7I=8=iaTaIU3RSY=>hP?#k^ z1pWYjPkO>coVSfM_e<+3EtM740}y!P1=w@O?_f_A#l4xc_?zL!yZzJ4FO;lUvaulN z2iK){{{RuRIi^b)h4tl`+R8kz84o<}&s=al4}NRUyh&p%hlzYUJh#`EjUJ&Am5?rC zC5A9K9ed|KlqX|eZ*s@BBF3`M1BKlnAno}}`~5SHJ?g7l$v&%XvN=Zhik*i9obWJx zKU$XZbc0!oC`-*V#6~s^%n865&q4ZE1^YmFr&I9#u8f`?)Fp=Ac^xH^08zt*AfaQ( zBio9*oaR@??-~yac&008pb}htpU!5^BP-LP>B#9^$ArEZ_>bbP>dA7`MQFql@&d4c z2RIyOImf+vhr<5=2iW+x!`c?T;~m=0p)Ht#R=IFX1d)i`dK36|#do+bE>~*C_#lIU zfxyN(e}z(&fy+aT@MpnIAHjBH$q(Can+2wkepEQd)a}>5wRHD(DRFHs-~%%bH)JQw z2qPFZZ(w_Zo?|ni``%~DLFtcU-la&CI~g+KMETcmBOGz`{JE-AFr1qmsH&MaAu+jA z^N*WwC#U}as;bxpZ=JUnjFkw(8(8(=cIbU8Ui#F@WY4%pB249ZJG*{8Mt$mqjDQ`X znl$RffIe&B{M&g_TKcF6! zdiQLaY@jqqsg=n+2?T;Y@z)rtut(;QB|cJp?2*nu>F!7CLK`&hWZh*in#&-K4j0QS zh0kwMP%HU%m{uxd`GXEh^u|4Sr|&m0Tr}8H;O+qMIOFJjs=RYaF74rW6(`FKIUPFo z$F)_AHZ!F5;NnT3>v<}A};0kQljM{`oCW=F_WW-8? zkAKJdQ0!vHaG}7+C+?Gv*Yu@p5vwCdL2v|!r(%{YPaKi?4u-3E#wC}+y1a95CG4dr zpndk*c>}rNQ?)ClvaymvV-W&!?l=P-a(jJiknxwsSzwZAJUOQ?n$QSM#O_=+@rO|# z9Y;f))97nTElD0H4bm~)lI4&U3fT+CeEknS>G0c|sP;#(+i@Yl$|%QAu6qxyBzj_` zqBIP#qTx24syGB6Zl0B?rrMa2H;W07M$GasI6qqFP(8_2(1TCWL{|`OjrkxFSDu`O zC$|-6#kzEsy0!AY-G)ZMJm;rRYH~ZmBXnY9g^TVCNB|IX&#iC#Ow&A%7wS>j6Xf~1 zLSBVAa|s+w0vR( zK(EF@93I>sx_GOeR>lkp4U5#CpZ$MY&5o(@lQ&Uy@Xu3qxdVrG?hDu&B38&6)pQQEyv!+!_0 zZ;BS$b+?9NwM0u`(%jx%$7=)`VmFx>j-fqH)*H9AjK5_U%`!4vK;~c+j)0*Ew(A2K&OH&&+4E(|;<_04%djs7}a_?q*Z zu+sHOd~Ga*m@Z+G=eD`>iX zuD5DzRw=Gu&5W~WaVn$&Jw|J)(tqHaFnG@2(chFud8#j}^twU?zZA0QZXfwpt@?T9o zw0hpO>lppqHs&=NU7-gaW(19#@NiGFhQj+VdRnuVbLR9rDD)2pe$Uz_t7&0xr|X^} zux5Qo-{1cLp=n%v)9V+?aLsi&cX_X;Q5nRI7 z?*LM94v%Oswork`n#0U-)buq=!aoQ+Rr^b8+6=xV`yYpV6Q$fdwwf)HG*(bKRy&zb z&2@4~EYm)DCjcDh>7N69KhnM&>2GV{YkiF1`L{A0%PVALpJVA>npZicQ03^vXF)rCT>w(g_O)ajid_!`Ulgz5Nz&J-? zoH5!*KQ4LvE9h_9{?WvK76u~ZNpgS>o16oWah!g2;7CyTo&IS8{gF!!=L~W)*S`Y0 zqU{?Ve5K6pcfSlgQ>y7+E7D}L)bHVuF5oI+lV~S+SI}054PW;PN{3uLb>){5H0p5p6-w6U}q5$lrZLt;hp|>x%YM8_R7tlW8o3 zZT8wubJPC-*I79;qAbg{@dUcZg?u?Z;IS7|Np2qID@2LeL!LJv85!-`x{HehLm*`Y zDZxE~>&Kw3U%?h;`@p^!kyH;NctcGg0V7b^InO`_a!qyqJ@J-{@Ukm8d_g?kb?cF5 zXK!!kYMP)V4fd9#WWZ#iS~$9VzPj~ z50z{bovW7W56B)D)C^Zqfr37K9-I(!$?Ns%d-beMQe);F#|I~;tzGby(K@}dzaW+v z{{VoTezls_oo}+(f*Y|TFHe`>tz1im+yv?hlb)P`-|1NPuZg~4o^U-yUWR|07$=j* zf6j(yC2dW;VpO;mB^4L_4KwoKkC@Xf^!cu>UF~9skGqmU=9gce%!^6~fVL`&j^HzM zp540EWSWDj6-gZw@<8ZM`4uhLgsu}$!;ocgJS-XWgBYNz@Zp*>U#eG_3Dkn#rA?ED%dTOM{5L_54|Lo_&^y^Kp%xN z1|mWkf{uE6(#bP_0LBj)JwFNyvnJE6ZJttZrD#)TLE2w&_Qz_P?mKl=8gm&}__qvT z{xwYtZaZAFu)zNS>s5e-Bai05$?MY|l@3}Kp>oHE%YSRz`RkN@$Bx(?tEbR3Yrhg} z5!rZV%3JHZvJxnxOym9I(MP$!td9r?kBKc8QWG0dxXd8Om`2l`x!@e*+P(MTSH>@f z{s@8<(XISZ;mH{Qo!%39Ex^J1(x&W!NjUA&xogXs$4w~M$Fu#5yjiG06uvl~9U?O2 zF%`RN5-N5iMn>Lv?~V;&d_&Ugd>yV@=z2Bv^2Mh>g7qeWppI$r^Eg~?{YdCVdrAGJ zyd5R1cJ1PwQWXPp{{Y0Mcv*9g_PJIWKZusk0@j=d@OcEaybmN=M^!73jEpdg>6Uop)pW|Vh&O_rN&J-m~(+$5`8 z$sXw2k@FYy$5Ga_wEKNOT*Q{b8+C{?yils4Y;-*scNwLuwlQ(#JKJp%C$N`f(obuALQ5D25)svoG1EQk4_DHr z(IX9Qb@GDA>-0YLHlgAvfsdwrYK-^tNS4DQP6Xfk;(ijNv@^1fQH$$@sPiFnv>z~ zhMpmhP&d-bKFe?CM$wLQ&kdg4DnA}+pYV-a>0?iM{{Yh9^JU+R2ID(%+v`+|u)#Bu zK2%^nRRe-eHf_$qV_%ilh?ga8YyfN+?bf> zCm^4ganyTN-wymh*Zd1?FT6Rb+*?j&Hn8L@$|4K7hSvmRI2fpILp_)=DRu)GQI;*} zG1U8e)_;h~=~|>#a28`?yJh(Z+cD-$1Mh+O8i}rL4?_uA(4RbaJu<`gwbiu^Fvsx& z!ha7uQEv(sl1)QFjbt3h(eg4SH@H61wgnUJ*{4((W0K;uV#nSna zTSel@^;_ppEI!t^E9Jxn;J}6_X~7%}e8r((JKVx%vNx8=EOJW& z?A7`&@n7PvgMZ+vJ~#09hrAo`_r`uQ*Yx;t1&@KAd*ri{MF>3EK2(f+r{|QY!jKOY z!#KKaG@JBSKF1A>o^1(GoTgQZ>6C2+`+< zS@D(BK}$4DZPcZ%NMr|OhjN@to-6Cm+2h7u0{CI@KI_F_vhTyaEA~wI3w0NkpA-CD zrj2vrM~_J|2%AT?xem%XFCEOLMMWwS9Aj^EVwz0(D)*%)8|-{p`yhY87H)Nm{{RT; z-?xW|2Y@a7U_{;?@CB@jzBln~XCOO5<8F~=7{=0FP75LiIEjd_TK@oois{-f!Viaj z1o&C-OGWVafP4{et&LYi@P>%fODB!>Wki9si|Hl(^tLv;6;k5l2`(g1$f}DOli2R|*t- z=iysP{{U%E_$XMs)a0L3i$Nml^6GaoOLHoWF8AX*K`N>^QP2$4UtJCwlYPz${tIuX z4FbpZebR33MaH9T;hk1nsa*Wh%O%aOUA;GLYyr>=SHTlEma1mK`LIXz`te^=f5BtE zFpr5}ww$(BGKbUrC#1!sTJ0wY`@G3U-hkw$e+*a3^Rmwg5th!vK_`NJ53McqIh)wX zd7Xre#4^Zv1m}04su~-))~(iA4&}I13DcbM&*xIi&fB--78xVCKJ{NmwGsHj&3JOt zi2{Syy+Zey(3O$WT0nyKRclncja`d3Bf0#j@Rpe+%U!exOcE9hGmX4pel?30p(1Z% zj61Us7>s0|c%s_oSnbM(W%Ag#!x6`Nol%?I%GWItEkbmPO~F`*^~iQbdOY_4TfVt_fW2HT!WcwQ7W^XK_M#Ynd@l>wx3i-EMU#yv4llI19t z$Q!bwBc^**n?vR4H)S!CBx66B{*_IgMl(>iwVOl^ilK>lJY z$qVWHg)Wm1n|~NVlFYx%bgsH`<##-M-Tvt#?yuS3;zD@0z!0~Hi%orDX14cGJfyY$ zoQzk@L5^j&bG#0vPjYy_aiKSbq`0%bc`mX0%W2Vw7g0NINe8H4e*y@vANVh=-gs{B zO1#i#{{TtTl*t=AVkQB}D8r#f1gXy_arCdCZDF?Yx5N7v@a$*Gc_f=khj%v2q_xhT zSoTwvk3Cm`z^_7$UUg&OvABO_JEfyJdn<*xziA^bsz?N6O$%JYU6oil zz#N7r)Sdw&uWF~H$}TUZWCL{4U|=1kFfmu>jgtD`YHoPZv%n>Z=nt>fx7_pIjEh#% z)9gYy5FhroWT$bGIv;v}gzuX2*ZU^<)L+@|lSsKdi)rOx9w`YJ7W09IC#Db9v?M`u zV8TUZ1Cm#^LC!(!e@dk`i1X=Dyg_$3F|rTt{{VE6(mT4ZKS(o2kmTQ2Ao! z!u~!|{?-2Epn-x<-DUn0?TY7=PWVpe9I)&^zeE@tfyZBOcNZYuTB(dvVR6Cye=5n6>(7@Hu{($(C-J0dv1uh}Z<$U$Yy*yi>q)3sx1P-L zs6EGVQ5nL@<%UUnGaal!g~SK2@D zN*x?&uKxi#^2wH%wE1(_WpKrr6iiu(Kh37zp`*G%IK9zGTLe)mw*Qs?4_!Qs99=bd8Qb-g8rlW`nxy`oUS2{Nf3 z(A8>f3XU?mKNHw843U%5jw;@g%@otKkc}Jk9Tdk7t7{N4+Dgy8a-q;R6}A(K@Shv_S5o*};$Q6eJTIeZ z4{@Zvr4xC-Ylh`;L1mG;V+D3~2d!mNrz5qGqr*{#DwnjCMISDwgrqXhlN?M!@JgvT zsO7hkEUbviM*w2Cbx$5@*GLvymk37+st^(Bz^p5)*)Ev0?9ASz=B_-?aaN~FH&J)| z2`%wFw(8jfdanbg%qcY~e9O6u4hxZ-bJWxHh|HH(;j^$m;epTdsIL$x-JF)m=dW75 zosTu{Rn8b^f;l6vG~mB64nW=M+JgB!uI%*BZ}ZJ7oMUR0AaFe@$!Rj)p5+C@FF1gV z)K=GX*s(T}%NP5sKtEAZS-<)f*(k(pRsCweo5(AXj&uELEp|hJucvt1QPar{J6uNG z?38W*AAY}$Zb9*9bdmkO!CPlvDpI?>`f-ZljJpDr1cAm!dI0D^7r#++ynzxE=m$8@ z^P`bIgf-ms%{#}sZm$H)bDID_AiQ?TiI^-c(6mCz=xDIn!T8+L5 z$pZ{>I@d*S7utMI689<`ZcGzSU;D!eU4m1A%*R3M%>}PW?O^APJ zFPo8r_2#`3N{wRhles&5$7MMkN2vAdTpol2>L8%QW2Zs%uSK=Uo1B5%`gJwtzZFwvxsX?JY!W-*3iit_CKzncZr-I- ze4}>K26BD9tHQn`-HXo=lNrJiaryQ9Yc;u@IO=4~K4{QxH~?UE=AGhZ3T@N^8CT}x zr_z;yYtXTRFhCjS@cwk3Fp&QMXoTSHL5y~-V)Z&;w7Ew_gxu>E@%77!^|pawwrW9as2z?Mgdq>}JcK~~n-n(xZgKy!hfg>w#U=9u#~}hK&DFHa9$a(-r(AP8k6qoZ*7=Q-!nybOLtPP*o$qx=u2%ea!Q zCZS(ceevf-eKdwIDJ4=u?F1J39{&JeT83NcED3#15FwFvj4u8BdiwYJ*OGiF{j$72 zo%#{6Uw3 zIUEi^#eAMC1y>0!T8R5xE;5!bJk;fJ&}uPDr}>E9a>#SFQ#*qD9{2-;RqbVXZrJJW z$udd3V`a*@^kwhgui;QOofNlu(j;i-TsM}@@<>j8U{7(}cFjd5ye-~HwcB|kc!urZ z6M@(3lU%EPPM4}QuBC@jW|LJ%ig0&FDnSr)i2Kk&G^|vk*M4a#tf9{d@PVBcn6Djem!26L|js zNV>FCBHG&S>R0L@%wAY0)DJVSY}bW;(eh3I01J8>XLBr?evPN;@`YcKWyF#`3FkPK zI6k%R-T|6V_(*l_$sMo!OReH8#Y%%M#@(SuCnXmrfnPrSY`*(LoC0{~`te^Soz%TmA0zE@7;@qHyR$Y=5}S51YL@ShxrZQR{{WuUR-UDM zZLAf2dK4^x0CoTuBc@M&^jC*wduNJj9~JHO?Ze}jz<&ZTSa~%^)DnuInURT?^>&WbEaGQnnm=m zM$MgzF~RA8M?>_cKD>1}OkN=tml$B!Xb?%qxC1=$J?r%zYoCtPnS=iT2s+=~7_?n$ zK-HcSM0;+U)udeUl$Vj%^~le9p2NTz-kWni?LFk!gCA#_IiusC+z%(8r88LYwYI9# zI>Qp~0rsnIPEQ{x>4FDJ(9!-GOBKNK65`qf`AnM#LEH{Hrp>d_yS`xk> z{?)U;UPN%JDzF54+goW8Ej|m0XCur-T%(Y1%-QY-9dn-4o`k73^ciRH z@tLH558P>bj9jW4d!%cyJMLZyImSTdsCcJA@mGX2=^kGJ_~H@ryH78LZ_+deq2BO- zMstSm?_3Xvv`br^W_e*I&B5He2u~<>!wyFnU}f9ULe(NKE}xM>6W7SM%#lf<%F}G44j3)1oKf{YIZt4qSm_9tEb&WRm?X; z+sZTFWPw{J+;*cy(5`$d@h3^W@NTiK=`u3Q8!n%BHKE#3zEk9~hRMeVBdvOEhsLjo zwibxD+R4|gmNh~(dkbwx%p;7skps7;H*~D-Mecb20E|-J?%oH4ndOW*-4mp^)KLhozBKVbi;i!B*jV+gm6vF84vED0g0kS}68D0VD>&7Xq%f6O9 zhVE!=buAL&`aiVWHR=)=1!5UlbDygNSa&`d@Q;i1XdA|wPPu577xxLW!&8*YFK@iy z1Clpj^v(gUn_9inCx=V8(2eDTEycCM$9C&4${9}5>+778+O<4U2iPZXE*R%)d$Z;T zB|~R8!S1>I=}KIx=4w36BFDqu3wTn_+S5z$--uVknszv!S+$aQA}lgYw-Dr_{{VQA zfn6=X!8`3%cV7p1@8C~}!jctqj~yf2KlgugBnlL=~7RAX1LvF?ck-%b89Q*aF&wb(urSc`5T?ZR?O5%ANxXh21B!SLPwQ7~l zdB|Jatt#yVdgh&REDsuiHH2PNr~9WF+Jy7T>rU|2neg9IlqZPwZ;JjNkg-H>vuWCe zkzAjhquM6V%Z;IiaaU~NGufn)1LishX4(`;aB^|moc$_{sSVcHwwGjIFi1e!1Ajk5 z+|@O6E3x-K4YZA7%^~m?kGwytnMr8Isi)7O&C``==G}sL;C3~SuKXwQ7lW-9U3ShX z?cJ~@)30LGW61stMt6?=hXbu!x$yn1>Z3GL$183vwBWh_0B0RL<36>O4}?yL#!Ui8 zwwaFBVf(j~k^aw6Mmaq7q>)_L(T>r~U)r&MZb_-z+wikVZ)?6t<2_2OfGcA;!&dSC z0EJcLi%UD-jP_S+Dc`9{7L##lCI`$#vH@kMyMlq5( z9OsWgRo*L2I@)WCg9H}QDRy}P3ZM>n=uUER*PfMDB}bX)8n1)23+q8Q!{3NnHlrYu zYFTQ!O!`gRq5kU<(YFVXKRV?+R|cctcRsDeQffC$=K7-83p{*~9==|2o~`btr%t zW-LE+;Z6ns83#XFw!aFzL@fT(9*KE83cozCv~vQZl6I@^2wrQGJV4LzV)Q&355n`06hGJ&u- z#^KF+CyYEF;k*0EXTA7~XQS%3*3ewGpD%^)B#J!SsMz<3CcwvU1PpRGtdxhu7VG6) z-%mR1D9GeUM0q5y%ssPRKZ^V_Z>vjhE%mxAve;YY^YWqCKp}I}9sR3l%SKCo`|y44L|!5XH8Cf#35)GULH{`M^Jdu~!e^sc2o z6IxA)w8noq03n%&9YG+DdBrks0$yoXNJaFo4(*#vj6)u|#z-A;(>08xZO40@wu@zN zKC=>Pmj=ogeUmyS`6E(5ED-QW9S2J5wVw$1COc6d!@n2!&TGUaBpU9M1a_>Wt0Te# zgT_YekJ6#H)AdVx6@ekSgv~JY*5j4wdV_3V&rSOX5VR+Uyc&x(HTjZ*Ef( zTrW+qCvwO5n-~MWYdKV~9yOtSD%CZcxT5f;q2VoZ=43dtw$@c|81_*cCqJ0yt$hpd z-}V%bOw;`T0NN1Fl1RH#O4BYn9Cem;{{YZe80V8-#o$kb-Uj#+qlEBvlp0eqX5#kg z{Oh~?o}{)&1oQxmV*`rfyk+}C$)-pwJ{8%UyMrN;HgqJGQ_lc=#Gg(MYo1k@9l}`n zBSq2L+g)D{Sy*Z8sT@}}Nc&VG^f=^Wxz9D`zBlp4gW}oWOZXSzUj*xSY=KJ5u*AVj z5%Qw|4Hk#vCvs?6vNTre2ECVEqw6;!q0$0B^DteJA9OR!0{5g9#FvVl%u_Uy!+*)m8 zz|I_jz|S02o1cPOM5P|vO*5;>yEeL{?gt&QCP2+~BTKTlg`mHIJg@-;K?G-O1zOW=}bZaqx#iYYBE)>Q-6WrQ21wO`kS7C9&3& zd=Z0j{>#<17PrC7W5g4QBlc~_ob%7+Tasv6g_f0YZy~>u%qeD93|3Q~iU{LApOt!F z!v6r-Gg2Z;Bjq9x)S zG)VJb0Q?ue)h}gD3gcRa-ZG1Ks_QqBNoQiDovMmY&nKcM%*27lYw14;{3h`4z@)dg z*KIY8M_Sh56Q+i*qNX zV)71sf0cEp=yT4idlp5yrNx9csv?dF9}&kGRYlrH039m)mYc2E2=`zN5Zphvy)ynE zD)P(C1)}qCaoBQ6&#r3Jh^YJH-trzsIAQC@b5xFbO8Xuq`(tVDx?hGR0hj$EW)cIP zt+W72j-v$e?O#4TW=|3ajD-znw5tMz7)VC|_4m)MeIxr_X_Ef{!ZV@C5`5olU@%8N zDdQ*e&3y4CjIFMx+kDf$-PJ;{UcKQuWI-y;Jfb{ zc-QSo5tqpQ>E3=+<0pF)g&$lFDk|u%X-zq3k5>3C;r7yg99Y^yvSH7l`n~O?}R=S(k^^OE!(BEd~N>#f{%D7_FM3D z_L|R$ycwMaIL)@L5R&>m?#=RPRzwEXZp@s0ppgV>cbtVHzaakrZ2tiGDhG|fY8myL zKMzl+_+!Jm=#e#Y*Pm$B{8705?Lzbbb`{7Lutn#orip z%}ZX_Z&71+mKBN^;#I=I3Lx7IEBrC20DF>2;`IxgC$}+yHNNs2aXbG2`seFh?pHmE zag8NtiKfl6-G=NSCjmwP_8!AH#ag?SrSM*yS&ly0ayoVCS=M;9gsM4^9#w$*!mLI! z;QLtIlIwjlH$4GW$MUJ>Hb*^vtGg~ZIXTXF?Z;};@T5cgRu#@hLFwxTLkyKxW=8&ho=KeaEMu`qeZ(TW4yO9oX^p z$9jV5U?aB~q}Xl0XEvmv)Hn5X->_V%h5Fau!!07{u%8^+SG^#Nxe!U5~)Qx^>ybDqFsl4>h;-zUs62P`|aTX+Mi z>>%y$ip8^{-44U{ebOzwLGiD{78=#M-dbK=JTpNd!b%KIa7p(9zOG-{cft3cHIIdC zcNflJx+<{)#x{eFe=aNK-`Re}FTZGi2thIZ+_#PiBmh8$LxY|>0bgj(;jKCkHu~}y z?Jf3_T1iF-^czo14*b_1B2MVm3dr*>5q`^F57GpeH!=8@!rmoj^A_xwfCrKbWEIXw zucdfbj`W`oTI=^C!52E?S|B)kwet?|?&OWw>&g5p-p|ABYvZ<~aVLc=bqg;HM2x}V zxyRdCe}ii_&<;I^HN^hVKMwRCg>x;Iy=M0J*H+;J#v1vEN+tPGku!XE|_fvc6$zUo(*PdC?b@3F7j;yE!QXU>sl5i z8us~REfO#dg;G?I019!){PFIs~W1x93!dR0RV!1G29VZ8g{P+i6m3$FL0AY z&1~qt1lK%&J-xq#v<-7yYm%u0*=e&pj9B4v z+jbSn``P?y*|V~i#*e|2Lusy;EybY7&JH>J`&3^VZM=y*Jh7bO$hq7-NXPZ!z3bs8 z{1dO@=ZEYyiTrn>cyqy4b3%wNd{^RYO)wvulBlgCkU1pn9fv&Oej@(N9}8@}HZDFV z{?i`|q1J67Sgmy53uxMpiM+$XAl$>T0Pnbn*I}b6TlL}hUy(}ShqT*?VAO|NVj+7l;H55Q;g?=II7VRbclaukJyjm z&+RLy+TDB$_-Eq}5?C@cv1-p}{hOih!7;nv-5B8tFkj_jP6h$!dnkY4ncfcgL9S|W z{@b6lm%=ZH^H>;-&XwWGr}4LlT6ZkcL~U&XByKP=%vnb4o;vINQ1ITr@s`1CziH2p zUN!MnpZ0j8lSR?vne3UPZ!ri*WU~macuy-l0y+Q};pgn-;N2?H2)q^Ws>*kajrz}w z^+|6Pq|YpxTp=K3Irbx<;F>OrjYSk{d@u2L?62Wp5W%E=$KSKp#t+)V#tU}B8_yWr zy_Sy@h61W%(loSU>$n!%a2NQPumdCCV)&u^N%*qIO7O?WKO1~K{hj_DqQ@k^4E`0x z4x6oC+kCDN+Ud_M@k1ued98H2aLPbt`Dp2}U*BlUrTCA;n&7gGMV&iCka%{*3}*;L zc3UNI2OqqVjyO3PuAjg*7Cr>9p3~vhpQdP*mkwo;D+_T5b~z-wDCCk!BE?~yWfW24!jkkHlZV2z2>o{MRj>3<+JvswI3;$5B3Xi~b^;R`4%} zJR_lQ6YA55;t{z4SDc@G`W}_ue&0SYi{VGWKL>m+(AZlYN;JOIQ4ZDeQw3GNt&i5O zBuZKzp8o(Hd_{TUFBks+XlrckdwwOoxF-acmO|&B$MnTUJaRsHHIIR_aW^H0$tXYpme$9RgzDa!T8M&hC>%;nIHY3P1?0ipkbY2j zC%sjU#Lu~b03L%mHDX{ALL6{=^~FQ>DI6AwPCmbOt}e)=>_#kGJbfw4r!x$L#XRY= zk}w#OGB9ZqOSzoCp|OrfA#99f=DF- zP)1LFYSf{Bup>R%<@wJ~ly;|aqNT&{8^JvAM{!UQ&0DrnByAh+802wPoi>xtB8Awd zhJl}2X!h+=#xSIu(*Vv*S_E_+2;rQuAa3k>aa|!K0vO~e#_V9$4}v4byEfHk3`ahd zvg`t$z;Y|a#p_X@S(U3$UZY)0XUu%y9(oLag+(Hn2o2mEXRSYS<%4hl;+Y{2!R4{R zCz{1>cgTgo!8siI^O~Q-cICAQ_NZ*So_e133xE`r#(L+bD))sT2KFrA{QVAi;GW;g zw~IVH;ro$3i1=%zZqe-(S0Sy`;YT5f<370kYtz0L_?2`Wc6%K{=j?VGzm!GOV;V)` zoI`Yt(~RwH!v#+`0=N$V#8*p)%Vn2sv|)DfyW1zWNUod9jH3rq-fVkWdTvqE?%efId%BakTY@o;^%7bgROM!TDdG(t<3_x=gHgAd+V07WR}jg=#KVjn z^X?nCHI1n-7YiIp1fEy`_H26ldRNvTwD-WtJX2)%`Y>DVZo=8FE$$XAhs4@y=V2@V z06%c@jf{o^Cm8{LTfRu!Q%OJ%3r3842Fm1q9Ov<_cN4ZU(&lsBY#v*c=K~~vg*J*{$BOa_-g!V zx{a)_y+kBA2zkKg1JkyBX{}kRmWS8>0JWZkx(9;1TNSjKxbXusCI`*20?2oI;{zw& zvOi+)h#Jqs9cB$f;qJewcyq+?Gqie*fnf4Nc~qT86Gga?V}F!_eQGZkc*%Y|{9@B| z%{oY>g44m57c<70^30^dg@`@E@$2&rwZr@~@dej}zA@Zeg>(@jg)PD znxV@1`=j3Fp?ML$@y#Kj}`boQ1Cv#b)|U1#^*}Z zY~*OCw!2RzSlBUAHns`FDH$0Yb+4+tcl#~)Zt4*>lcQ^zW~pj6M}MViG2O)HA%v#d z;0a+W#hYvo&|wBh6;n$1#qpa)(bGv!5cp%_e}^q5TYv1I5ZT(^%`%P>DPX%)x?Bts zADhN`&o#P~Ww4cb$4j3r=<#`1Aj+rYRzEkW9mm$04ZquEL}FJtIqCd&qv)?(Fg=)AoI!$oN=C zIq%;UQWf*$Ah-h=2d#D=5k4GvgW<)c%J}O<)wFXof;ish*_Iix&K6OWV~p?{HO3@C z0R>wpjDTvO?ykqqUyc?{9_4|_GAide3p$IwS_-fL~V9=3@f*NM+(1F+Ws3ehE zE;4xQj8U<)A2BwA;mfZR>H^b9Re9VJs9PJc$;Z8FX}Tt*rc9$`Y!v*;-zZiL7g4b{fU~V0Ef?I+5eJg6q!uRkaOL1=}lpkr3a*BVtPk&KY zF3=&9VFI$Y||S_jytKPS>u&4w61!Na6s$FHEGz* zyPivONQBoV=*zM{Qm$dYC?=`VL@vz+mNtryRZTDs{SLfn&($` zh9+ffVD>l_ziIxrsucqxJRicLxl(Qj4A@c$B=+^E?HV;qtMJ=NbK+Ezb=Z-qW+xw| zdL-_uv9A1*#3(<)eg2(mlkm)B%sF$KnI*oY_V;1!%Oe5Q9@Xi;1%GHi6Z|5-kNy#>vX*kVX{@Eo+D+pVGk9QRR}{$@tySYWSieJeWjAzD1LS4Tx0RZJ|op(E_C zho7|Hg+3-smYU*A;hksbB=}J>+nJkK(K4~gWpgnspmp+?f=3)+H(a15SZebm-0wv1_MEa=?(mBQk9YJqaB8 zn)zj){t|Bx-rW44>bKW30-)r1le+?{dSDPvYw8b$I-t=059&Jao8`ym>N=ar$pd6< z5|NIi6z|f$Tlj5iUh7JN>&tQ?5V@Ny--RZ?c8#O1p?)Dm%J4o?GoDXRPkQJyzX~XUjo0r<{p69WovDG)0m~EX zT3W>MX*zZ_N4AP2DiA8HC@^@(a!ED%q*rtCDbD*DdRBoHHwq9*4DznUjHo3KKuPcK z>BVhZT-fNrWS;OVr_4~ycW%xB!RSciHOFfnH(4Zx-%J+6Y=`%OS$7lnil58tS#jzq zJ@UQVhjKs)$0Q8nIqi>A(xZ8R`$GTvmsN{4)iOyTzwO*#qZy;lU(l zBfVu(MzK~neN(_v-0QM^qC*bG20}(~J^OxDt!>~)qIOu>{H=-$BkTko{{V-jb(+SA z+I`!bsT7GeH(U>53F;5?s~cEhh5ef}fn+SRM#YBX zyane9D)+)Was9JskVs-zg~sLi$Qa4S4;kZ=)6$vaSZ!=PsUivv3Nc}pVh;r4*Yv1< z8r&tniR>C62l`1#4)6o6(}mA`@j()nho!fMRpTuc#FN|%fMrk?M(#8Gs!JujOBfQ$ zWRVnkVG3mDINP*ylhhA--?r0U`L>wii0@F+k&KM@9Wz!mJsKDwYlv15(a7k9K>{Y+ zMhDZ5ezlX-$-d?x(r?b8YpH5zk&7FVwUxrQTo6V(oO*FrJ|DcghJ$k)jPknPPY5jj zhamnS{zA39SqN<;1d1j^c*x!c6~PB1{oY6;@WnRMNwc*x4LaH@cer+zRg4@;PdO*3 zG@gK&<^KQ`W^E%~7ZN)~5?jY5!}S<1u@@M@$;ij8dGCugHt|lMaGc9vS97}s4#ajR z99O&iLGb;)wc%YtE7V=yN`1xU(OYoOpacvbTJtX!*(JY%uAo(cR|F7K3QjwYryWf- zsiJ7~jeknDpW%hI%qs)B*ugUX>*q`|mg(F9$770@#yXrfQArGz_ZKqG>hS?8szfje z-JVGt5(a$*XX!3AFM?JxSngpqmGcn7O{x^JC(w?#^rv{?MAsG*+{pvI#AvL;A28`O|9qnK@b9+W230b*RC9+O&`rj4aC>Q3&y$mpMG1gD0;Q)dX@#5rqKmV$YVz zJaT%RXPV=_8BSjM_)h7z;T6?~&fRhMdyE`p``2E{gk8sMyW3(nJBjFX>Hw;WvClaJ zPQGF+J5fpW$tU{fxv3&MLj9&SB~Hc}!jse=e!2Ik@(tPuWD*!zl+5JK(< z+Qo)9ob4TVXY#@ATE|nCOndHVM2Pusn3JBT?w&rMtyE-5LheZRg~AN;fOCPLZfVew zcOGVq3dTwE4+M`)j^4FaW)AKoAeO*8)R3*}xc>n4Rq}|L_b-+6D>((+F9m@;57Qaq zpqNTo+jNfj+`Q#f9{BX=8?D<$osv|LNF`MylwG@O=dal z{2rfUw3>A$RwXBuM=iIoRy}=>tx0i7l7AX^I$=)Qj9Yh_;46k*tC4}#bM4M}txYCRv&=UkDB~ND zcI-bh$*S-{=Bv0?*vbgq!(^U64E}X-OWR~bqCKg~;~P$Ml1G2>sBXr*x&_MlvL<&P zao3EGUs3vEwPse8t>l2h0$Zs&PE@Hm@A`df2m>?iRz}&JwlYZcVm&Kr;%19Y)8$DN z6BATy~2_6-_wcm{%O&>{@mL)NDa-*O{KXedB%zl`!Y0`WN;lBsy%MOR2 zSjA}$18$5-G@x;ob_9}7Jl8a;$GK?puLFM1UI_4?h3+r>UE<#h_=8@CGa@a9s*P!E z>H}@S`K6Ia;~)X)T0ao~0BbvA3qjyW&DG?fMzha4h~qo}6?$jBb6h9JopVgO@c@TI z({$K`C}Wdtq9b)6a-*IJ|r?ClWGWeFyQ4gg&zHh;=ND7KMC}IhStjtf%ZSNKz5gV zq;{7bf&L-Wo;r$$SokO56}nWp@TP?-3=rnbeQ-(V@b67;gB}c-es2!x_)q{S3X${! zryO8*ta*rT=X0bXO+w&a1q&iZ!PjX74Z|1*j(8;1`TRF^3Mqq6WiEsFYz7aw$4}&I z%`LtRcvJ1NrLKW%8i>P_46KX}akzZkkErQd8c)Gb3PAyA^y}ngA8{}4IqS*X_#+wV zM&?dhorCE2CQuEm?g84sf}$)A;CIh@TfH)EPwYjbSmhIjj&Rw*!+fV7c${?iu2g&( z@WshP6k4PN5Uxh6a2O6xUHtaNMK{4cCwv1>y48@)B1a)jQg4uT4UO1PPw@_GN_5=i z%8cbSmD$!dlX5Q^ZY|_1Aq$P9GaU2;{yi$>b~=xV9z7pSj^gh2^^7q=X3S<`w}2RZ z)5j-_0oI@J$Kgu4-KT>tE<`rK9YC{9KBqgIshLHb<_~QHU90IS1Rr?q)>{dhT^Klq3~9C+IIMbLad@dCrc zdc~*O8%fnXUejt`C~R#>^?3<0T3Q_CZPBvH!9a4gC&%B~Ct2}Ew3d26)Aj!V5m;u^ zPJ+e*CWGMk%K_zS@U8{b*za)sBWE2poxjjm*Tb1hM`iYi=Yd8Y{BG7k~iBhzv7V67#Q7t-oTNbK1`lF3i;OcN%1AVH>fbU z+BpSxXFj;%zLWi~ZT{Eb{VXQXhW&Pt!ECNL&pkonzHHYoQ%%(7yPVs{Z=~B|{_^3% zSm|Z?RGt3-=b-~4A(Mla01=*q?5<(T-0Y1TDI>DHvu#bMj9g42hBzZL-CedgSRo(l z82&(VP6c|lgZoqXSKuGREB#-@vuHXr8h4y$eQtLC$`Tqb4y9=3$tUxy;pHF;_^_e8H zLpj*_akyX(53uy>_)t=JInNa732$tzr|u*$+=S<6UYP4ycGI8uMWWgZ?z>g5eg1Cr*vZb=%K+U0=}=b6HcDrjYJu33j8k5DSD+@+mV{Jnd19kcIFD^odaY-mT!)U9`nDUm~cGm6jG zvMwAk&K-x~7>co?J2smGmJt+z)!R;5CBASCb&OpBBR zj1V!+Kp5;Go&n8G2m0Ti000ImTe>%n=&=%SIATil!0rD4>Z!_-7jPYOkxYXmpPQ-3 z=k@wi)_frTA_?QMtQyeX`kn9WxQjpS6X6K%(Pvk?lXPwaEB@k40uNr?dso&U6uuc* zUwk~jIzE`T*D$W|@WjZndy=Pt>&F7VQvH&nH@~!>gcTMEH{D9Ak~Y;R?DF6f+rK`z zud|@=8N9NRJ54fJQfQhNF-;Y~9wT&GmWQ8sOJC5gJP~7Wq+ea=mv)e} z(}h`G=2hVQs&=m={Kt$}ifdZ`0EAmy)n8rJ^^Ipw)Db{voD1uB1d_;PB?|JmImQ7M z>pu;AB{cpZ*8DlDr0kHLj)Y;ENgxA{UY>^}_OAl?$)Llb__lj%RkE`R#TpBKV}Zw2 z-O5ZtbF49k?C&#cRoM#_r}ja={((jo8ir!Td2>D49w~*wXb|s}QYbW41B5U~pe^ z;Hw8-`2^M_#;F_Jy2h~Dxk6+yL^&hSA8+SPZC*Pm$p_A6R#|hvJa9n=l09oCV#Z@XK7?%^CX>#V7%akQOO|iM{3y8qVSD`Nep^l zi2O%z%n5Xq+QJvnRYvB|sqJ2|`x|^K@V||GKd5UyDbtPKucTdzWZuOP?~iym9)N+9 z=zVM1yhEaCo*hV6K+~YN0F3NX$0T*SscVzs!JFoVQ@x${W02_Z50{V@s9<5%9>7<4eXvZxc=S0 zyj5nnk|8R^j_T5GVo3MmyF1T<{usX&lIj{ot>fE7u}Aiz(x%bLJ4wdkPbVIg)7ekw zLh&xrsho^toPF*`@~E%bolJxW`Gy&W8F=ImT3V0VGPaZ9s|^;|e`0C&wuq0zNo!`t=m1GAyNjzhYqw7JN zcQpJp8bvsHRLF6*F(BL%-yWwuYroQ`VYBVBJ4v%^G@O+Be|!2@6XA`}0*(Sbm4lsBF+rQ;N?sU2k-a%4BhS*y_FHQma{{TAbw1>i?vohdd zmFPJ2{NJTl<}~Gw zS0tWK}N<7&YQ~2$%Q6|1GA`(?d#~hvCTJ>K8__%xy{fu?ZUe)od_^N-g z*nHSvt}w(A$RKB@UiI@g*jCEjV+;sft1{=4j(GR>?^czCCV7v>V7C4#h_sFS%XMMq z923dp9^$yGyQs=ISu$JYD!h~Q#dJR#rcF!74FnIkY4*{;`-V2ZEXqEBisfw4^!tG= zxhm>0$jCmtQwZFOE6tn*Bn*x|l|G4ZS6YmO+!Eem0B)Zl=k=&c?F`M0ulf@Cy&yp+q%R^pF2n$ zJAM?Fv9KCDK`g93W#iu!6igOnDskJtCZZRyGjJrwQc1u+jYlogsKDOD4l%}kDpX#> z)Q|@$9 z<$S7#(EdHY8neQ0QvQRiT=+Z0T6V4B)>PE==^8+U6-&hIB7 z5$M*jcu>k=I&$84eo}TU@J7TJL3@uMazD&pR7OopYnp zuI@i~5Vr<45~++F4sp-&&OPg5+)20*w{F%dHuXFMoF7_mkF;o{7MiY|XmtBq$=WIG z_JJmwdb#tVEB)M(%6qG1QE3@PNac16aH_+D!OndTf?QQUB z{6DB&c&AFVi%p7ap<%6QsgwPcf3y{N{a}??GM)xldfc+HJ*ABN ztPed2>T8INq>tr%VHY?Zhp*>ZNnGhnu^a>dQcgh1oN#@QrCGN*Nd%;pW0Aq>+M|l- z#cUPX`U8+SKGkzhzKhKwQpAD?$A8AT+8-_1PT|a#$r-?H*xpZ3*ngh2&{-cT)J=dD zzF~~m_)`Tz>a0n_xWU~z5cH{A)JDSCGJ%9E* z)l*IQ=w!V+g~pRLn3Q1c^9lguKpVgF{{W5-YWK!{F!*cYk-4x8i!6mV3~n13XBpt< zInRDgd1r?8S$sFDi_1b$*W@qP<;t9XmF_rO)87^83n+W$`F?n9lx#eeBzF29{)W7>_I)VQv-H_kT(N10$kUT^a*fAcM8Q^rT zZ^W=$_<>|^5L(4}A1ci}YUQ)raT(*(S4Do!h68Vy2z-S&&$d3jKRUy|W@#|PZqdp} zK4#$XKSM&$e8&@U;H!H*RtD0VU))>Bu(Yyn@a>>&lDt95T6$s=!=GZ^Ijqo!-xZ)OnO$V!01EFYKWJoBGH*owrvn8$ILys1i( zSIfXs*unic$9k@2H8ak%9aF@f6Vo2U;pd4S{{Tvzw#lSwnU>l`JyhGuO7+j&Dcd;} z=iVW_(eL#!{{RU;g|4(4jDGR7xe6?&KYPlQm0zNqSFCuR-X)mIs;4|-RGw@TTIcs zMd3CL;Ei)rwT?GC77La{&rAf))9KQwO*g4(ZEVgf!W$n}A(}IO(AeT z%Oe!X{wy%a&!=iqNxPU%rP)sZ0K}JiM~CJ69FE0gM_ApC%=FIRTz9J4SH+v1O&SaP zYkx8DxfvV*+ds~a6555*K(s6soG=n~aC-hZBk-HljXx7nU#c_8;zO+C_x_PQNZQTzvG&v*b7=ujoy2v6WYbF3=!8J{{ULX z)qGlRuVrHZ8GfqO94>86)qH23pP~F}h0LL+B}R7=2dJw`BDs1$6Xl2&mNc%i?vg}6TpO+y1H0%wNXyeS)pg=z1Cq4RRsocn3 zXWnp0B<8PaGMKKUl^qF=Cpjzaj-Bf^OgoYePkfA30cS%{w}71dqPlMi#cy@u1Oa|{ zl)2BRqkn~RmN!P)P1w)#u9xAkd+!m+C~l&5Smxg?PkZTdk4AEKNvD<=Ta zTKT&3a>?>8)o#A0@%65+;UAf%c%xF(En;aT(sV29k}-|PVyFSVdBCWa4wYuP(cMEZ zt%r+@WurdLzPn2g_$TW;MSjzB;Q5#o8wr;7RSI+5lH@7L=DbhgtR?(VWMEUsQqd?p zk{5x`Q~phRr|n;&kB7grb&rP#PcqEt+FLwla;b!UtS)*M1$%M9#dz<+OLIN#(?rb} zo(4qRyMWw1dauxWiqjO;?1;cc*|vICy{}KF+eZwllR{tz%#B7%jz}GcUNg^L)oRyJ zxw*3g&4}%61(%XI&fNCL>(aDu?^@RJqmn7a9$IYMJvF;q2;6YW7J(cB<| z{#dZu2q*4={qFVozBT(wvVLdkm`Es4f?bKCx{?q@yFI@>Ltr@dqPdv7OLt`KmsYJd z(pL-!JRYNipL#2gl5c4_tH8>0MWY{3UBUC)!cw`P4G2F;zM5j(zZYinKI|bgM>^ z-p9^J*AhqwV#BTp_UZK%(dlU7G{v;WMO@*2P1(U5`ubz8XyzfS8kYKCOFcziHp*eX zax>S0zd$$wn-+rwznaZ(2Ebbc9vBWrM||>sF7FHA~Lz_cK#WxnV&E{TQZVeg{y!?dv1KfLh*BP#O z+S(_PG-za+QS%pISPxJKe_WqRwWD|=Uihsyn{cf5`^th}Y!PyKBe#B)>3#(G1Eu&* zQ8u#B>Q{@2BT*hr&)Pm4_Xwk(pHOjBNuSE_;%FcprsOvw%d``=#UU4IVk$ zjtDvJl27BsUo-iN>xG%)y5WJ8|34RCbc@g_sX=b_@7)aI0f zX2}r|{MBqJ$l-@#JCEnY?yIEFv@XK%+uU*X_$-=4Kb z3n_QVXU1b=v9ZDb06poJ_NVw6gMxlwaB_R&*ZI}kcphdTNH*;toOI)p?niO&S@Run zg|;o}Q0|Re2X^t3yX8Lk>?*y@md$?Xhi)4=Zp+hX%Yewo<|^n0;eZIve;QoIh|aNQ^3~#E91uEiqk>5XqUX12vnxc(8cc>#Lnv%x z&;WYpuQb(%%g2zVR44$j`JDCX>z?%<<8Y|XT2)qJ7z3W1j(?xMNHS{+Smld*6O5Ak z{#*}#Q&;s{Ea`SWQ*V8aA0%S|zW28saC=pqBTRU7(D84KzwcWhHU@fqG1IkL)>|GM z(?~`~j^cG}s^RK|F!&`s3c7s_=&n6vrpZ0}PD+0K4n! z`PG;wSRpRQgc-m99!EU&KEAc+{{RU80B22e$Hd=wi6zmrLn5oZ#6@v(MoS2R`=im1 zeAZK)w=_Aw0C-1I@s;?s@P&)s-0a;T4e~+&z-b)tsh`C5ub@5^{13A5EQxvIfp4m7 z8h#D2R6a$pag&Vw=MB+~c0LyH<*$S^QKtAt${QP011K%h-X#<{9iy0QxnaQ6iUTY9EhLFjYT{d(YWTwlg-6+xx=R^ZvZuu2JSvCFV9 zAJ4DgMRi*B(9tx>XWwuq`J#;cm`;Z$C)1C{zIphStxe+HL?xm~5(x+pw4s1ves&Bv z&U+p*IIL0wl<@C_Z+vB`-6gM^E5?PH+>%+aNEsh@JYe_fUr~4uPi+Um_G@V>!eq3C z_M(qYa-)HQImcS!J_Pt_^otoj+YCXajH~Zl@AMgNpRQ}R@V2Il;oUJJj%JN*6-Fc4 z6b33eJwBB(dK1iS8{4ar{(Px2%Y(EG5%eFAO1eCVqY=!g0Kg58m}AqvJJeQC+R9PB z%B}<8Ziu$l9mhjk7mI4F57}cxkT6Uk;2sI}8LTxCPT63S#HhDO5XEXrvc?aXLk_2* z>;4sD?!_;yqZ1<;<2*XIA$j0~*w#eBG@Vj6idQi#PN;)F-W&nnw;k!%R=TV$6qblaro4wc30- z_&+zqAFxY%XQ)M`YF8^Ag^iq8zt;%ltSV2-A6?To%C)2Lx8UE5{6*qxXmuY3Xg(m- zo)dR(qK$M%2A>k=7aF6o{^C5Z5%R>TYBp~E!iPS(6*V{sMc zqv9FY1N$?>(5L#S0m_*O0dQF4<%iH=@Uft-w=qlF*~r+{wGAKPTy3Xlu;@2_DDdEU zZW`iNJ{b6TxCF~93>*9I0UyPafv`4Di)vmb)_yg3n^m*;X+FI=Yb5^wYwMTnBh`FD zos6zHwYBB8z?j0Gc_bI;9t+n$Xq)SJ8s0w-_&-T@7CKyHy}h73nI2a8uCCiTXY0w+P6*Bq}M}q8Y@ZU2w&vN9-XsPb@f%y?%iBQL}cNI zDnTFPS0%kL$%aBopO!#IN7u0WR!@jECH~2}188MOJG&4%pK(l^ok2l`+@P_+ARKMT z>Gk&au767c+sD2kTY|u}P`C=b2IOF$^U|zI;uMn7DR-mpK;CBDZuv$sJwUw6D(wX%5H2Bc#J|>k%G1#QI5nBv^_i_M$90D`AeqVmm zU$$lUj4t8Qz8pzuWoM(v?P(2|52xvJF*}+K!~G`coOzcr0yDyamaYf(iv6iPN&887 z=Kla!@h$$Pbv5#NH&=HuV&eWW_hL{EE$x8GOLPDXlG$Q&=a&Gzk&qA$a1>wzr zC0g=pl=UfLqfb_~C5qs%mTS4Ep62M8C!O7-c^I7KnEmEGGf5=R8-n3-IA9xa&-m0( z41aRc@BB{S2rZA z0LDQa<+<8EzJ|JQA572TuL+@MEf$*bt`r;(J%|FZE`os<%ggbD*FCe3=UPMqPK`Oqn$4Cr6FC5!WE>81I{p={q_`L1Ai-V3b8Q3+3V;hR5B> z9RC2GDu$hof5tHn?2s3h-UdnI=~#C0xBMWINEL`(P{+F&{{WUCQLs2IW1kn$+M#E$r;XS zD-c@sK_`|S2T}O@)vpn0GsSd_w)2$RjD+JgUrex(^$148pD}(`Q|nE8$hx+KtTm&= zr_3lz6VIn7wMlOxB$*h<#z{YVq`9*(%`lQCTrnJi2U@RhZa3o}#0EP50G?^=bGe(^ zyool4qBM=T`7(k&l2rw`8;;UQUjC=ruImb;!@4%ozba3G+FHIbJKJ*L;B+-+2pfBl2wt3n`qKN1p0BsE8L!B zjemtc7`^d-#4RUE@cc7e>KD$@TgMamZtfAAhRDIfo^mVLBlsinM@NQPt+dY=TR|3G z+8tCVOma(Yn+Kuw`d1PAEH{_?LwH(K3)~`HOS(Az^A9EYA58VHqx@Im>3$$;=fj>K zOZ#m#CdQ{EK4UWyKneo(0CCr)V^efgWRD2ZX7P*Oz2}9e@nYOg407Dt$279Yd#ex# zBey&bmFJ!z(RC|*MaH>rsYf9##r!fv?UTt0;2x)(3|HUF;temr{u4Hy5!5G=P*xZt zK+tYIx8wqO##nVHrF^yfN9&$2@gKz-yRV40i(;)9TXllqT|(%i8^CFEwHpCzDyij^b{GH*Wah2j5gqK}Ba#~hk9>j9R+ZJw#;xb7jYr_O_$Jt{i8U1r!f#WBV zSt4mbB(7sn0NdD;-_z?w>!Gnl4NYwXw*@QZPCnr`D?2-e%aO+avP8P{B(K<2`z38ROoXV^MP0 zir(l)JMMJ(u%~Z3hH?Q1um1q5nRy{d!!wW%Dx~fW_0Kf76N5j=wMIBaA2Go6?e+XB zCXr-7WhCbX!l5J{-#|G0>65UQXjxT)sKMIAwmHvCck9q}semr=rOJV@ji)@Eo_`T}kDI-MVcr{8uNqH;1+4Ba|~?^k-Q>#9BqX`BXMRR1qT`T6qe@5Lh9nO(4$V1A~8iY7mpls&qBH24*xj_uG9 zw$e~B+c>KR62OC!qdCC-bm49P01~Z5;cV=;$IZdPUWq>RCcen)>=v!>gZ zB~Z6L&rD;#wBAD5u{xbIWhLP!S=q;gGXDQIaGc5HZm!fUNhDNC~%1A?p5xc>kg zdQ^$J^gTfYp%D}W5112ru(D0=iBS) zTyw8doUXPzDMB(@o^OBP>&+>hZbC3#GKV~ooK|B(ce2VmjEeLN`zd@ws~EJXYd&1~@zXoUk9L|+9@0Q2}$?UjRb zy*C_!Kc#8^0B1JQmBNwK4oyZ6*d|tvH*60~k@WSf{jKyhP$0a~?(gl>WO5v@Qa0kC z9ut^4iR6YpF@Seg$M)+wG4l?|23b!eA4BO;L8<+r{{VS|x3K=`}{hDQzA$^69 z`@^MNW2wBaXKl*Ys@9;S(Y$g1GOndqeL?5&t=|IPq&_Cn5=@hIc^paBuLXq8#4pT;X&pZi*1lQNwORBQg7Z$1qn6WaF4o$_4oc*7J;Cg8Ua{j3 z+H1kr{s+~qwEOG-0Jh%SNd!atIz(1x7|Ssnf!@4A^I5jkuCL+Iousl=REeER5O(vN z@}oKHR-oh1hXnLz=r6<1i59;Wd>aLbr>ME@e(>8K38q2XR0G2@Zb%Sk}yK@ zKwfQKX*1}zQo*QzS}ArkxjSWEp@GLjIUkjHXTgu!55xWs*8DI1nl*c-7O`nsg_OEn zk=yFF@y zW(7&XU@Os$OQesUuZNX6JM7Fo6zpL8!Yqz*2?0u+=LfcWRm-+nEK0@;Az+_>Ac5Df z;m>-lp@`KXcvv>%B{rU&^XPl=SDrn#sl+Xr06SA5hh96Lc*QfDmcxoUjw3rpjKd10 zuvi|r_V%u4T(+A?)~&BJozO{dD3&LVP0WV}YmD{oFnWS(tc`ZYuPg^77Tw%u`t-$6 zzq50B0+PXBB%=;b9ZCA*9>$@o8^WWB=Kla0J{{lt){?zhUcl;xo zgRv=j9yvDhx%tL1xSa8mUmN)Iz!%;I@iqR3;&fOqEFTUOe6uOZSrGR}7$X_(I~x1( z*5ksr&wDH%YP7nIqQAD3ffe<;j6840Ac9Kz5$|44`$qf#9yHQ)`+o~b9o(yHE#HOj zWEgAce)DNFH$dn)LQZfw&Ko(&9nh7}jib7L7C=KU03OHisUf+4G+=zgleds6?f#n6 z@_~ft#U3|Zt_qwLV0jD(#yeuG$8ICQWGYX8L+@BgSk-xnE}=X?{h}~3G1nRVtD^AD z`)W2R_MpV06k*1BH-YR5spkqFm9WoCeN}Jr#Y|iW8uBbH4Oxnf{)|5sFlWtVE zJ$nBDoY%HmKq0!+3_?~qS#Yrq1a68C6 zo-^t5xUE4hymmD&trapR*5_Xmo^x}VI5e5gFaWJNu=!6Va=%`RX$%}LhX?lSIK z0*RY(Ic|E6*&W4m_m=@vVaC|9Sq}_z^!6N9{nLYQb}<_(vMCJQ0y!ifQ=Xofu5SKJ zzwhH4$=u9xpl7E&>VW5bLn_2MW@V8}0>`Ny-GHo-B#3gRFzSSmdBG%bPhe|XS)F4= z@>~`qwhsf2qu5qKg=AypGPwh=?dy*G^q^_jmg03(jX(!#k+p_P^U(cs`c-d|35TDV zNF-w?k?&S6V|5{B+6phs#PGhOJ!&ZsFpylQt^$ro0|1QmJkSnCr-zpUX3DnZ&gK~h z@g1v0G}tuwC)Y?>@Pd!KY*OSX~Uf}w-Kt}_ds{3+OB8Dggy!Sx=M6px+?^V2=) z?oIU`gL;91)2FRlm3+M&2g*Fj82sHwYM>=K8;K!#^u=4fn`W10n{r$;usi@W)|$|y zR@@kcVm`g|j+An^K8KT0tgOV9TyfJhptCa^A5wk(l$te;z^k?{y+O?@>C#-o7m&&V zsm@8`J?Z${2{<9P@O`UB1$f~_Q-A>L{Qi{VCROZWzKw8%ZUbpJ&U@6q*w-y)INCS* z*2|Kka3mGvcg;u@mew7l1Iq)BNj=S9GZSV`k)}wHUYXLTY!otbwQaJ?`AtUY5sP&-c2Pd)SRO*@G_Oy%R8ab54iJwMJ_2cDl#df}~) zJu}Zv=DknhEw7j1?0`2)<;K&D6*d3P!RFTkUhHkb*^2^(`P+Bth?A2Pvp{)?%A!Gur)u&cAaw zV1D?5*u)304Ivo(Yk~L!rpbMK62r`Q_fT8yR=_|cUfq33_N|}Wr&(*S9e64nmhv=9 ztLb+inN8K$WZb^EfycE^`!{IMa}+Z{5n0jRb&(S+1ZvC(Ju}w>r{!F=z9Z7YUy&GE zx9xcPAH@Fv6X{({>I3ROgkEU5^zC6+Y0JXjk z>bCm5tYCT32gKGyfOg2AczxhG86LIr99I%*Y}f3@X1$TFH}x`kj9<50?#*1%@9+FC zuScr*F8b?B)M5SF&2J{gZZbm-jK0SsrFi)4jyQ$SPeyy0e-b=9_I0(1^22r*a%%3p?oQ^PhaoaU+ z>sGV4k@KdA2~Z1KNL5=I+*w@UXOEP6Rv(DGW2fn!dAz$Z$_UvEszXW#-2sOHXRqO3 zb12RsMugOARuYJM`b(yde*lK1>5iZ0F7vfVi2KZS88 z#5$LZ=Nf&2qG40aSc?~MPB}n29)NphyWa+U2X@&fi%hoa#aUtmdCkZjM;$*d`KyeM zNodTSF85UUfNquuJgB3Dl#f4g$m5S*oFBrve+7IBv(t=n_>xm3j=_uzkL@&9rM^bsg`gY`Wtfci5U_p{{F31GqXa{z4+!5b38>=sq<(S`~kGSo(hvIm4B!6)$$ z4<7yc{{TwQwm`lo))Gd@cp+>P{CGQo9rMRdJ64PlM=?dhhQSC_@EiJ7C3KI*lCUwL zpH3SZOe)G_bJM>&kI>bblInAatS(Ha21uJMr>;jrF~&V>p3*kk*g~84l~rJ%j-j-P28CQH`Ai}^NxgW>v>F-?LmW^!#M+>`{V*ulTai3njx=_Hj^RbRaMMOSR z`9ShWJw|%%JuBuRYZAy2Hkic4P$4-{l1JhO2h>;7_L8>MfnsS3t`1ZYwDtT?r>`~h zgjP@g00||^T0tT5=aHjD`N>`6VBme=NvnpMo5k4npV{KhHTZ2LK}rFr%exD}LPO*p zy?uMu!`>M+ohBC8!tLgbm=n&-l>mAX*WRjp6Y$2P;jatc!>(C1zn?IgG%^Cye-Pkw z1Ja-3IZc+e1O^9F49zl~;AAj7gV_4^tv4~Lt2gx6Rd4ZZ%0p$dw4ZXm{Wz^j6dRUS zEWa>2HvG$+w-=DI1KK7Zjn9^L5C7%EOjY2&YomOd4hYi%JDQq)m`DyjX_5IHipPMP^fUMtM? zeRlg+yYoClb0yS@e|A`%iJrR`qJQ&U_S))oDdvkmN_H+;SP zvyO+?t}$A=(Q6+K!}c%^ZUYkEHZrI6IPcoIeNV-Antzm%M1nTly?`Y3IUP?v)HZCR zV_r4}b#u9x?cu=4!0E+l#R*&$SpHH=?m5Xl2OYgJ>0G25p32_(AYfQTU~@=T4d{O$#lZ zL66GV`|BETcMhC!Uj5*o2-*BEvD5UQ34NkyQW>N&vx6nXrNL<&uO6Is6`e}z2zEG6 zho7?z*Tel%Jw|P3!*`mTe=rwXV_Zc69hWRJeb0WC=#zMN#+MS4sQ8b<4IxkzogPh% zgTX2#`EkcS)pSXLi`dVY<1WR%@#%m*m3l2s)glRU!WSc)4sp}Jw-x5fvzFs)u~oDW z8bW;3);tW;Aj*Z(=i4?tK$C!eymzV%b>iJV`bL!aGFjq?NZXoaS5R@!pak$a;=4;Y zV7!Mmmk>!CugYU?7g|X+~ z7CtWO`klgQ*UO_LjI&2&JHHv^ox`EX>GZ6>1NcJo#9E{h=@xd<`6rVs-dN6kFnP{; z@mvRo^|-uauk4r2f@_%!k&zZrbAz;OW$nwbw2k^H)c#fcBwPxsZ{{Us_G7l&IJ@0N8 zIlypbBx9c2tCh=}Kzoii`qrMFZNGx`D9FOUm#D)ksqWd`oPVAvE<97J1s+d@JW0Is zh~$BSHgY)+gO0fT>rT(aPd&oHZ*I=}wy6)iFwZBa1Eq8x7w~=OjJ#16jo^6F=U1OD z+t7%tTaRjbLi=5CD*_5QnI7uhDh)%7G~OEi!Udmvh(yh9}fN% zXdVUd489`1)Fij?g{!@_--$#%UZvvehapXljGVBDoP#QixA67dT%X3zj_(!Co|`t4 zr&(R;vU!>xgID*ue})GJJFQHw{CwUq!z3r}&@cw1QUU&ZO}ZuM)p1)dZN|5RISl|fRiB-u^0m0{|rFrjx^^<3Rt?dALw+SL=Cz6BZ^zEPJUB`*F z0b`+E2}81oSRI`001|!At#~$t;wgceWRgH9*ho1g$Qj2S@!Q^q6Bi@ZFFaDLkF|hC z=-l9(@^SU`tX*ftF`GNFG=a82!ys;7x_x{0{cDdtBc5(q)sjJ;m~T<^^r&w&39ew3 zVOeBpVv!a+{LS+8_c$M=CaekE>|4eSaizl2yR$SZTxXsX4xR8gtl{Es?Cp7Cw6nO> z^_@Z^C6<>QfhLt#C(V{d!odjsDIWu%9OAHa3-c$3w^-fj_OWPot0uRs-Z)(|!;7$x zWqf}67)*PiltG#yVmJb9k^E z{QL8?VDX<{dR;@tI!V$m8p`T9+$beLCm@_01KZlM+}LH6$$ZG~l>>lAK=-W~_U#U# z%kBHP&TvLJ?g{T$dUuKR-I$hfAIrB6tcTMFwQ38^F-lJ2FcXto;c2Fp&DK> zQ!bC;^X~q^z!f~Vq56(#xo9*cmY*)YfA)JA zFK;G9^8{8lQrt{fbRJx4NX`y^hO;y~81;Jy#mAo=y!R$EI@`M_d~q2#!nb|BYeT@l z7ko?bpT*Z2pTd2ARPg4ZEN0!VtR+;L)1Q>HD`W2xFfuZ5Mr%Jr@dl-$>2}drYB%u1 z4d>cb5@WF@$v$DpAinN*9GsI<-PzR&{D~2GlR-^0TKgr$H&K*{WKnf&@HB{W1d1FC zsUYFTLBYW_YeMj}C&U&n=Ex!YL}al%rbzuqKF5Jt{y6xN;!lkJElqRczPqXThf|8i z9Wp8JS}@St#7@YNMvAJdxriA4BUZFX5=~0gl^I8zfwC}82+lsV)3ULRdd_lf7+SxB z?4s1}R?7B!*qz^Vm>LF5l5it@lh0q$vmx*;y~;k;VEGx{&UoxG`qx`=WMtH?{IFF0 zrPn=h3lq|()2%%6#fc?)?fauA1M#Dr=jYVHzW8>FqiH|Bh2LbLGDZLgcTAqR{VJ&V zXB)5~<8XR5%yk~WUbW~K`f@g%q?tD;+ai&-189F*md{R&B~r_|K+e$FAfHk1OPpNi zm^Z@X5=g*8Nh9T4oM*N@Dk1Q}xe%i67{(l&9@z%HLi*ktJ6|(sgl=A2t1-vQJxM)> z(z;#h6;t816rWS3b>o6=7uV(O|nJCEg3<#DMio;jd=Be|Pbu@KwM zBKf0tmdZc!L zj=g#H6=5PsX1S6qv*m~&VOg`zN8~>Wi8j@XQa*Rrd<`a-I$J?9$nD7t7!Y&YKjcw) z;k(;wRksEsHr@v8_Raz6>}%F;yeU4XtwlOT9Kn@=JMq-@$ESb7rf&_crNRLc31DrT zlbn_0oO|b*6iW7%Jc1vBnw{Q)FRX9;J0hbU*5^|Rbf51=Q-jFpd8{eCDS2$gUfqKO zx8?bP^u>Jyo(fC**%rzLk~L;xxyg^G@pZ>q%D&QUzS(mgjSP2E=gOAj%mUupOo6dT z&gl+#jdF9x6{W0<+|lM=2%wus_?@BLT$wD3PSM9J5`hb=C?xu2uzf4-?}t7Tw(us7 zmfBVJn{jgAJ<(lS5JC1XL2MfGZ-rk1H4(3ASGvq*-W!Y9%Et02yqQ&jA-aeYjBVtR z$-%F#ZGH}0U!}{o6-Bepl&`hAJNgd&t zi6AZzkGZ=Cpt4w^hgBUi;c!6ucdW079}Q;IubSt?_i1{t5pQhw@Gabo zbGYpo7#tk?R%$Ja+9kR9jJ_~Yq{FA_r$t$A9ZSlH8si!Jo3oF^R2qJ#jiC)(#E zFwQ=;`U|c27CT)&@s5+>tCmQfK#yXIpYG=Xk&jMmKSlUyr+AY`wVze+zlHb8idHn! zkl-9`!()T(&uZC4qJ6Ac@BoQt46v1vS2!I0KW{1Xt({=fEuv zcV9Qc{uNh`dN6%CHzCg(NEqmO`qoAF?AhVV>0A3l!rm5=HXxQ=HAuicFaY3m7@@1~ z3ZiG3e#6#behun!L_@;xQ1?-XE0;M?%bncugZ(S0(Yynv zd_K}<(>yt4ZDS0V4RY&m7>x@MGIovzF^|f*UmC`%eiej^$RIJsGt}d@bInG~()T(q z4qGk%0EX^hYz8ovDmr8is(pW26rtizk*H$Ql^H9>GBcC>>gA4uf2^U8PO`eW zAvXP7yQd!Jf=yow`D_!+kVtrDT>k(Mp|0~qQtC2Qe8tJj9-g=z4@_5{rnRE@ zKHXp94~;w{pkWk?f3^#)L5Mi{ZJ`C5j@jnA%@5-bfs;mp^TAR0gT<{T?Xum%x-GUx z8@4v-PkspL(xO!(1$K8~GW2-t{0=xfeo_;3FJ2``D4S@CYQt84nQJHOg>d7k=Z-PDJbn5j7@ z3xQd@L~M6MB*ewE?YaA6cz;ju^Ju>fAk}ncE zC$Zjj&yMy@f&$N=X%d0XGrBh;9>bdQZD;mpwM|m&czadW9>OQr%Z1j^iB-4Pf&Pu>vx2>`1RxAG21Y%PrY4bY1qRGIZo~#U%d#vo5g| ztb+d7ZEOPYJ_`2TgTeFykxFRtb+M8*z)(QR#xtMu=~G-59!l6=m3{Je5&2`iSWB8P@_wX(3)A5E|uN?0K%--Ewnk{RIn!MNZdEt2#~7h zSE6d)2|P=6sa;%Z z7WS7fb3C^)v@(ehmyo$2kTdtcN~bTveRdPLS`}gm3J5KLI6qE!s%ufIx}1ieqF+xc ztkJ~ngPpB{2fb|Hcvv#VSV-GpU8)##9rO6st+&Gceh1w4Qpm0d&Nu{*UdElN{4Unr znnkz7NP$B(RJH~W>(kbu({0?^IFy-X8Qx2v$N%eBj_uTq7KGK10aG=7$9@&U9ZNU2Wvh%_^YjJ-X7C+ z3#&a`!*?SeWQ*3Xb$-E(NqIq@V`x7WAwczQE!r%Q7qTExVY z97Tyy&pZqcd9HQ^X(J(u<$mgs$*!{I!R(?~jB+)|+!O)HY+|skG)tR6Ccd|E9ESmj zz{&NlN>aZu^iaeqGN%^zDk2pl8&5x&riCDIKvH`4HD)-&07~+EgN)N243C(Bo-KU(qs*5BDIp4XAS17@P<;(^ap_5IZ0iPB?G7@; z{p|7jS7qZ1as8Tye9h)egKKhAj-RG++PTTC_ehH( z1|cI+_qMwXe+c#BzLfoxJau{EtqRk@&2to9s6V+a-cPzjUO5#t%3Ksl2~vxwZ3{ z?Gms6V+0Y~@b&(6r{RAe>AwUH)b!EuM2ZkPiw-aW^|p%-PQ$ z{c8ONzp%OSR-J8SV#+*W;q-RVXP@U?QrO^4rcKA)U;$H}!1l#_o%=w1Dzos$p$@g+ zRDbwI_1Pp?;$jr(cWTTgvSmDtq&Cs$2<$5fD`<7bS3G3M(*dzTUOV>wwJn>7q$39f zI}DM;LF{R1(KW0Qc_o#c06;kn zlhBXOwcyl=LN1gimz5_O9)SI74I;qJHKbtg20XC<@qlyhNa{Yo%%cp>5EaHa=O;Ck zwmKrTJx0+)S}l$GfY8SA4d7&wMnhzDJbr?`GvKDWTfv4YnPf8ENs`{K#NdwHb6+`l z7Vdj(Ovh_Hf(fEv$VoA<_Xnm4&TH4c7I@yvO4X7d66#Rs{&aZr}92HIQy67*#%= zMvq}%2l?(7&G5rfp9TEx^O zj6?gZ5J}#kV;LNC>E9x>PUIY}vPhK3%mCa|?(vVy_53P?QyX{`85HDjgPil#e?Fa! zUe#Ir?UD0=p1Dvzr>#*}c~mNg0iP-e;2%;ufA#5r`a+bqj+7?QE5T<+zVf4lu_Na}OQ zyd(46*Ty{N9I?(DtrV;=bpfPmWdp09O$pag&^MHP%k%>%=!3L1Va~0DaI- z;k(lru0P_x{D>dm>qBLkds)~YX4OBJooThl#HrF&Py%WtuGVgSlFN~OZF!6(#Li`qs^ ziZPH+Znf_^CY)@vD^To7NR$!4!x7YXBi@O$jOVEqqPt@t5IV6q!ycSt(0_$tUG0~6 zKn~-T$UOGv)BJ0p)I&y}-C#Llx!>2fQCJ#_wCqOb!*Pt^Ncz`0+=QAaf+oE3)C6KT zbN86%2Nm@<>_?*|r20Ml+m&oBwQXfi>}8QeNJ;1h9mYGKrF^w&#cy{JfT!ipvFl%9 ze#`n>>E0BMD^x8i_+mIoD!~kw6M)2n#z{O^L>09nr@f)ce%2RqTz=4=RotQ5O3*Z| zHfCT_L}!pVEzR04M&eHSCcgldv3Bku1B(NO*73Ti{9q-}S z{{U&f9^P8UL=CM7BUdD_TYGqI#^OEUY+}3b79X>I%UY_Lo;fb9WRDG!0z8Vi1a%~5 z-ngdurh3%9%69TTbJKLT(`@Y$D1=KKD1#>>Xc*g{!>vmsJEUh#z#o_ZFiHNrR)~aL zNgAG9kO{}kbH^QrZ>2|lW0VCz&dgwX zioVe*OySf9;E+`J_4lHex+Pi1MRV1)-x5oIt+lp>lR*=<2kw4(2=vB&T=D&Dq43AS zIW;ho_>A3HMo!f8A|_PhA%YQ~@UK^o;pU6sa4vi~Yb4Xg-#n}WsBYmDXK4O-%|m~x z-ICH-#>A-F(!7PwpgBEHy?C;3n?vYnW2nL!Bbl-A^@oOA%g`;ht}L;OKJPt(HtIYF;nvl?Q%%$ zIvUb4(D18CPHsp+z14(nNqCqLr*BU9_oqDDE@O%~{HVz)TW%TG9l+`;eXP<+7I&d- zfk6bJ>UVRHeMME6H=PT{-eJHXC?}6!r)=?5+i1xM_D?orGWms+I}9#D=bZK@KbwEyw-+nw=69r zYv;;QKvg6rcqb$E@O_U)j45!KoQ04CJcBSEvMXazXz9^-xrGX7Bdx+$isLI0~dWI|15# zMn1J4h4lM>25NI$X|~YZ-d?x|Iq#meldV6Rh(KSN_ysw}4}SeR`&Q3} z)(gEqP)SRbg+zp*ARc)Iy|^Drr*)^s&^z7B8 z)}*Jk$@I7u?ZPm`u6DC+<(G~DJr7UTv^-@5jQUfvJh`;nxSmGWBWNC-{c4VhB!K?_ zqo!0G1P35-j@>h#^P1?j{RQvW!?ynbX|=E}B}AV3UoHhkag!rZ{51tsjFv75HE9fl}^o8u({l@dKTbYEoUQ!)|k(mhtq!Jcm4g90d4GD52G2cRd|aw;ou z(Q5Wj9n29T`QLdk0__Eqfz%U@2SO^vwzs0+s+8BX4Ww?5ZR$HH?Vfx7l+8}}PF+(? zxwF@_c_B$!HfSyv5wTyDxIZvGIO4duUGHFa=v>sTrN6M><_36_yKX|I&}WQyCyaEg zX7dcO{GswUw%~B1*FCU!sm=U1QHf5Yr##9Cl~U(d7uRPwPEX7M9tINXS1zNbC4lyjjhAX=~+N z+QhQJm|3xvD}om%p*?DE3-}7>M$wYm+QLIdv)8*{<#u z64@YzjJ@WaLaEY_!ZQ%W&f92dT<^uLeav>vgnd{D5k(%!=R#`{f#G1>y!XMs}~7TS1Gwrj#Tc{(OA zJr7~1y{iFAf8y=(PeaXE_$lxr!{Hn0Q^^ccYWv#{ zk+#e-pSVwR-1R2CPAgeH&g(14U4HS-GCrOE0HteXv6SVdk%{Ao4cCG-b+`bRfwD;5 zyVs7!rj!{xFKskiSPNL2apNQ9rKDBSe)*0~Lq@#I51A&9ianyYk9_vMU3(_(|wM&peEAS|ViZaDNvyrGrVGEg6-JOuS?e2qPoY+v%F{ z?**AJ^gB{ALPQ&Xa(UgHb?N%oeerKw{?XK=g(M^QY*|uG+d|xT;7Fk8^U*b)REiTLi5Qe+!08|I+kPnDm$LS zw=J|QB+?&H)U`vU_-$nSCC067Yv9YO;5b?HZlOuU9I_@`+tAIR&M?wYj=7N?9t){ zy1NidrCs=|Nnf*R`YoyXTTk%%^+hA(lK1aP&cXpxA2mwpXpc_~fxo>oNB#;c{{RIi zi{Yb5;BSIaX-VQ837!aSZCP&gp8`vaNMwFfP}TBtB*%1cF)FzsxBhMFy0zZ9sa#$7 zhVJJ6_UX*`7q?Ti*B4HDypG2uz4PggFN8kcK^Tt6ssILdRE`@1vHot7E5ej4n0egC8v+l6BvlQ(k z1Cz)(>G^S9gW+2o__ItiBS@)ooM!?>EI9nT)>f~i!)>ZxX5JuUx|Cx8lpEWRr~s18w8N|1Qxy*AixOO2}E zGo$jHBaI?yPT1mhd}MK!;~dq9tnOrVSA-)cb{PCIT?X+8Z*p(DeEZ4iv;mXrfyvD+49z`85jLHr?^0L^5W96FAb>r1Cz{gm7sGv1 z;w95T;C(V{{{XY8l4-X2aKbx@Bs>l~9#5ruH^a|?o*F(F)3s098(!3WJ*8VT%|4Qv zb-=ilS%5}2DnE1|o&elTSU0Bv2`$GxnZ@%v@3u>R13~~ zCYp$;~!e9f2~A! z{e~p75y`ehM|lLQN%@<1LMhsHy2*2I<}{Iz+xCt(4Ep~7Q9@~LcYk=%e9^MFA^0Q% zkWcyTTE-&1j&@B_=F?J0rMs0B;YJspzN6N);PaME zcc~7K_6>F@^!P>or4&V_Q6N;eQU3rfBxCmz7|A^P16`lPFM?OzJiLokH=8Yias94s z@LjQnk57TKv}ZrQaB>Df!30{0LCvP8CuOB-KM^%Erub&ka}>~l_Bf%L9facj$TgSHD@n8d2v!>Ng)R<^@1G>5jkByejSf%X6f(jLI7R7W8ho z;QdG9E8VPhD=^?C)uc!|zUkbz1pIXWBTv1(VXf%ne)J8_| zuBE^OI9z-2j`b;-N=KV`-%OGGKQzk|n62Pu9##fMh_fuo|vc_+wBByeiR*xw~&1R{Cd{S;By-)a3oSmz{>g)j)JJ& z#T+pqaQ<73%mZW}VtVsgGf2wE2jjIVs9M2mv7|79P;s;Za=%W7yw}Dsxz~3jR|Cy; zT$so*5;?$bJxH%o_^t5YRPoUByd~ocj|^NCRZQv0a~NTqNx==DTsJ>j@UI$v$bS=c zDZJ}n5a|9ckjiW+1p<&q_f3sans0{c@mZX0Cm7T5PNp0ySdXHPg>S~JZKtv zH`!swTFd_SSWs7~N+?pj9#p6UP``e&i`u2$?Bp(Y{< z;~y&r{EvArmDl^5w(*>Fsl~d!0Wx7nQ{NppsjMw_%A!?}s{?>K zpXpQ2t&31y4ex=L7IA!H@Xy*IhAU6)D7^J#1vYcLclWcvAob0Cg`rw_V^8oHy_3WG z8>?Jgm5gb_cuz5k<15o2;a?Z%!d*T|ZZx^x*5U|WXyi<8jg%4_oQ@ApE7Lp=@$bdD zr^9<|4NqH=;?<%3;hGgPlHWEL$WdM<0$6T{vRwYLC8pfje`R!G9{=jLABbJn?k zh2A=wO^Dj-UKfK>hGyL@*_l&r2N^89*IBoa6W6fJxi8r#Jqh}(K?Z&mG_dY(8P ztJ*$1TE%bS%RLW4@I9`XW8v*m89%p6G#8SGwqy{?Zo??7a&x(fDyIuvEOtlA45XCZ zmOprad;1#t3K~;Umgn=m##O6DS`D_BW1D{rMu?HV!m7A)w3a#UM{i11@cL}p z=%vU!mFbhf`f*)Iv?zea`^o~vm*&cjqaFJigxdVB5nK{-o0x&qzpZR}E~_w;Kt+xz zRS@o9m}Arvl?R~CMk$HmD2J8h#;Oz($iczmzg+jOm2C&vS&)MXToxyh>;d-fDrT`{ z424-;La5$JE$R=`{{YoZE0OIRIf#543}nh}V^aHoM&oumU=G8d%D8VAcoN2c7HPh0 zC>}d@WoZ+6UA%I74CEhE>t44lpoL@`w>ExYLC3czzkf>Oyhmnb@%@TU&XBdF$7+B) z(Z)_#^vM-=CC!<(-T=37ujBv^EtEJMXCv^0Y_7S~Pleq6Z4V5^}f>J7dt-De(Ht$)iP* zS$dbo(#JfGI`f?UYfeRA_J&dTcCp65%H$pa3Gv{{V%prCAnsLl9!hyT}Dt{J7(=`M$ZX zvs?IEABnVAu)8}&(txgrK1R-0pVG78v`PN}XuB9CBt;ZIHpM&-ES_`9@>0EB?1|gv zC@yjH4h}p0Ju8O~8>u#XS&dg2Q@2EXZK!F}=z6uyrQ%|1S7;<2;Ny>P=T)XaqvsjO z{+X{}{i=Kd+FkvQy=sxIz34WV0wdBz1f#hA63PhAa-zJ5ugnN$Cp|#wY9|*LW9l;8 zSJo)0Us4%R$13&%`=|Q;HQ0D+)eWSjfFpL$`*X7ZbH{4rknFhWxP#NNHPmSNMZ&zv zy@??k0fsvP)~-6E&deuztmtjk-W6!%0wMPE<2-gT_GZ#Xi!=zNu`SsV*|dsPxGH01A># zOSO?!Mll%p=WsY&^(WS_HC?C{m~EOCKz?8H(mH+UbJgFn?_yBacso-kpBR@ zKKf&h7;#@~+G$c7==8l(b-&cKT{uZ=dSco&O*45A%nv?niltT0bI=TdUz#5ktlz_$ zj9+1p+uW>4EON*4GB)#u81x|fb+592V(*R@9~}N3X%;#RXudS?bka+ss?V^n+D!Hg zUx$iR%c$%~?v?1_s&lSax#H${OE*?4L)y-pwiS*Gb#;+|QiNhJT!YCc&{ErIk=*Mt zw6R0yJV>Od>Hy>Ek?U6D)a<-Nr|Fu-06!^gLEDXo5KZ0C8@Nin&lo=sW#*H9@pgywt8_nk5bqF@^h? z1oR#8&p*<-RJM(x+8IXS!xqLp20yR0Q-ax+;^4ZsFOFo!>0!s)>~WDF?hpF3zseO`C7yP ze9G{J0kMKcKe{XE+nYlQDF-M(DhT}#uTR3bABZ|V$AtVt9=+jvVE1sY``8_~$21#& zWcLgSC2_&QHJpx`bI|zH$G-wRBjK%KZLaLRe{pYd7`n2&({(!;V!ecciAS2fK9zvp z0`NqI;JSn2ZIiePCRudp(FQVE-dmTk2w7a+A(qFw12L!M^PjOhibvr3dtqvhP zA*2r?O))hvVn+kdWW2 z1+s%@ny``PZpY7@cLdip;{N~&>4oK=M82|uQ~;y_z*axq`tkVJnO6~MSo^HMhiYPI zs>;nAUY+5gqb!o7j$g|tcMKNet}9B^Dnz8bdyozQ`AGVIUbWHqdj9}K)U=Dk;)^KO z?gR>sB|BR^z!lio{1@hB0ucOKP#Sj zplWh>a_O$L3#*$;h74qq7xLOc@7a%FNH`Ux{{RgItyxDic(?32<*ah3lkG4Bn2rHu zkuY);o(RFkb?xvs!w>~FwwDKU5{K>X#E+>zHF4fM_(z~v_%{ClQqtkPOW(H$t;^p# z#)*J7w0#apKQ~@!(#FBP%yS+F#?hrI%A9TF^((i6-HY0Ejv=X#OO)g3QU~svyI*dB?wM z=7dWuq1_Zo7#k#vVb|zKHR?t4E1#F*D0>=`gXns0uWJ7QYIV3*jGn(C`9U0k{&_W8 z+7%BO`LUcLllQUEe>&x@ylbmLY>>-;Eb#-v%meHmgTEfRtFU;@q;2!W0aKF5e)r&b z?^4@2+BT$&yrEPO923(SBef()60;ALNc-5`x7!`N)E2%XvAZKT4GWQ<-sCGD<2^H0 z?eTVZ*-niPGUSlN`xE_Y;K-6R)x>s?kC$j891-*w?fx~ZqypM>vKCc4$@c)`q5L{l zEt-ps@U~r;ZC-JZdh^>H*F;d;XuvU0ti!ACV8MC}bq5@t)x2GfX(NP+%|Eszl1Bj~ zl(6&zcTww~e_F%ww}G`yYg#uNbS)wk+qZC5Q_v1;rL;%8)rc%sMQ$>F@yF?12BD%y zDAUf>-cI>STqukPoPD zL;Y#324m@-6q{bwV6wEiMl%*wGM%apG1Juctz+=o^G&&EZe}YiZWC)M$UQTkN}EZr zS+zKamf}$;AZKRg9E=fOqhqYatpv64LvEFK2yaN+BrW~d^;6%t#Y-(n@{5m#*Fk}4 z6`B&Ix#}`LQBK!B7wR(K<()!IaT&%y82NdxQP#XCE{_amLkzG?N0THZ5g^^1DfH>q zpW<8N7@y6>;cD0*1XW|t@P$}EtB&uIOEgs^**?x+A_}_{{VyqW#c#KY{%y_OgtQ$kV4Nb2q8L z*m!pH&J57tBYfW2HSKX~7Dm_I|I)h>xYYcaw#}<3!bAR{PS8csEuddRsTF)U67ao?v*d*}Jn7;REc z3U%k8?MWmm>`2Q4&IuzP*rcCQN|q5cmyfq|G5J)UKKC5w>tCRMvj>IN^8Vh&7m;0c zZ8FJ$ZK0!uMDk>}P!u;x_;bK|Fx9+Qr&=}}&Af>)%2=^yUPvC8>0ftz7}f2(DdEe_ zdiF^K8d7We+_L163R>EU0_C$AuKJ!{GS6zFnU*=W`%jV;VD zK@%dMmv9QKdE>F`)3;jnkJ^6eY;;``(%}%?i;I$GVhc)(8ma@Hm@Il%40WB)O0T&| zo-g)5@3JrsK?8XQ8OCrwN`KhVFo99tGo9J_htT?iR^fG)&O^ChWLV1#cI1zxGHmSM z0)h}>RZq=<=zaO-y&Lm0!De;ZiP#x{d=7;2Gw~ELK1inGzC)|O7UI5d53Riw&tYSEqJh#iv2pn_Q zA6~T60>RVEBX-~x=QBWw|~o<}_X2A#ABqG2zRRF!sq0bKXTe`=EqWF})4)&L>N z!9B71Wwg{l_1zUAZz!>PQSg0DQnIuW^s9S8v^2HVQ)HC%y`wLD-*8l?0GGY*8#S zNHCsR1Ng~3$nHIQ)^)?SBmizQ9l=)_>Bdh?*5{V6NHG*K`JjF5u?NulA8LwAm-886 z8&s)bl^-}962Ni?wE|{cy_|)ldy)_YAcDJc+z*zhc#}^SZ=_2j?0D~^IV;pSDn@>U zV!9WU$uq1!dv-9xI2h^&(-n*2#ER!hRfP1)nmee3YbM+hvNLkL z@TWgs1yb=QuW8|cBfoc^>BeJ*CFCx6F4@BW06OM%uZ_a?zbmJY+$@+Xb`w&Ac7IHgbuXZJ6UgG&8iUgZlmko;7QU5hFwm{{Sr2Go88YPrvxmT1>_b zuNY{VvCDn)>(i&8_N1S2HFKiUjEiA^9ID|O*n}$wHt@Lz1fAUR)2OGXfi;--`8JnotUxY`r<3Rj{(_~*wu!6~G<9i;AyI~4p)jYa zkEaLJ;;s0$#dQrYPX5s+{r zz*?rKqFdWNv%xGcxje@Suww@x6P*2Mz0AxTeJ0uhk$EtQKo7fUKQ~Sfr+;qMZsyoS zu*y+FF4E0{*dsl<)}N$MtLV%)f8vV$t>22%w`P6vPTD)yNjxsLH#I3jN-vnq^k8RH$X?c1eF z-wQ7m<8RxnqDe=}&odU=(>cdE&1h)f4DL|erOo}MQM5%=jqDTMfyYk2ol?|h3+a{? zjIZ_xk~o1Sw&1UPsm}oORxQK`(Gtw4epLv}s(>600q8$dT_oQG=7&j+^HR8yD^e8} zN3dw(a!&wAT#WbpYc6kwu2EM_yt6)2f6GZq6&TMX9QCEjg<`Z}r>nKt6rTDpAc)X#QeJp`7%H}at?hywbuMM{f@8vapAjdZM7RsJ59YitiY5UGhgcdz_-*7%OGvHnHr#8MB;jrB&<)ZvbR=L7dje~w zjul-wEe?54`B~$h0`MvEqg-p=G`qS@0yi&ld6u5%Q;>hlD2dBEa6#HQ1CI6XYiged zBGUCQh`Mc!--^*b*P{4ZSVP+A5fvgU%hf}$&(jO_$2m3E{7?8ful~ljdNt3-jXT1V zd`7;tW8u#ZSl^+&%f|Dxa9Irh7JpL8EXZAw`_ZM}r;x8)h@>C+~;-ydop+4@YW0Aj~1#{?V`!2Vo{==5oGpxFj1x9rR2NZgeJ0OWQV z&(^%x1klUwMcRU3E)kanhMV6Zpd1jXV#on3l=GnN8 zRz>FfRhTeXt=HzuV}bX-GCyp8_$cnL`$c$;>qqcxTE?01(mVIRk4@Bd2bTN97e@>I zp{hs*UPb^iTb#!TAyja?FsoTw$ESnAJE^m({{VuFf5A)T{iXG-OF;NFeXCz+dXgge zgT>dDhRap)b`YVqjuvd``d>R%$$tL;%<^QjZ}}cATkO`26}qfJPz1}OBIAy8>5l%D z>VF7yU3=rcvo*JZyf34cvT$a(o_r)~M;|8L%s|QGJv&!J@#9DEr^3GyuZF%6_=Ub9 z>-HA0uZXV_#w#5P(&VY%Yi7h5WMphBvyuaFFhK*)bvc>qN`;mB9!K#OTetBf(|wsz zDN;ED5I}68$r$Jl>6*cdRAq2r*vQ9e+Q5)UZ^NIVEOMk7vw5IX)q!d|SNKZf3W+i%qm?qhPanMTj701b#<3tnYg>SySb9W*j%yw$dk^ z5iEof95CdbPa~S^be%Tq#QG)0d<&=M6=WMTjy7X z%4^5HduBialRJRY9uFh~%{#kXmaJf2J;tNqI|(eUJPqQn3V4s<>`(DG#MizEoN7+64I@NtOk70D3$tSdSQ2nK85udw zDwpjU@ngWcZ;Gs}{{UruCtZCHPPABWHBS>v&v)VrurT*uWQdEsJQamfRUIkmAK z$?kcsnR_hv@voM-X;-6w3CIABa6hd#SiZYWO6-_C+(^pDkUI6wG1|HvGvX}w(2JYx zKT35;B3S^0VN{SAhI@tFLFt@Vs`&o^#NP^hG2u;n`v=4xG4bZVeIDHo&GdOROI;#j zqY~cA*cWQ2KO}#9jxmxYO}3DG9WQg|L?PJ{#YFl9gMS z11{~LXCrsN86(n!@ubNsE%uS6$n0~Sn|`Mr{Wz_g4;b(8hOE{aEsP~+wr4LcQNCle zZO3M-jEvlDU}$=>!61@or7N_Ij(2`J{A;T4_lhl>SJTX_`Adj^${nmXj{Uj8s<8Nm z#_GsTspxi&cMSZ+cK|zjde^)D&L6U#mGL55U2Ebsjn0!`$}a8gET<1W=|h~z!2aoY z1J~CToa(4*Cr_!w{4w}R;y;bw5VdtdxhriA-6 zaX+<(!wp;FUXy#Md_Im*THwM-xhiw}p@nV+4;ARroNBA189~Q$ zGr|7=34BfBZwaS}G#?G>_Z}W!oL``i$|^bBfru=m1BU>q1FdB)pLHdgzKI>prG}-0 z1pfeM^R9Ik``awj_|7>p5#_I3@NxIYj(#Qh2Iux~zSjH$X+MrN8Dlzbn`y0D&7*0y z^5ZM^t9QhPDAVQ^h%)VkVlqha4L`!ylHbFqYVT&+!rO$B>L|8I5&m+BjsB@~#?-*T z9dTVzjkPd~a=q1$H}D_82<;#T#?X0o+q~4$l20{M@K#H?`p+T2C4T709OE_VS~M*# zn8_>jk%$W227X))m;;Os)n?|#?IPdh20KYCq!oOgFnZ_t;;Ly<&u?O$bP>ym+in2^ z0Ayq7o`$N*_9{x~zdC~qvN_>^QKpjD=A2we_5mn{-t_Xi`Ff>z=%G^{d>89h9@I5biCrIc6C7zZ~(7YMkUl@)rC2>^Uuu z^PkS38jN#7S_xxl_Ygw3VeiF5CHO=Pg?0i|ggN)%_2RISvmAFBBd8A102}WG$I3az zGwtbArT`4PNh0TQ1Oc239QtF92TCq)i5u{Upnnf4Gu)5E>&<1)t9*lbXV`X(I0PJL zuc!D@YUe~-M3Y`m2Hzq>7*X>e4w!UV(_n z=bC-?ppx9}1!R{eBsP4^4C5K#_2#Kbsb(gKHtZ7nRD8od!SC(IH7y+wXU~5WJ_C4u z-^ZGa9uKu`GAS)%n5CqpVn!tVsHY$U*B+zZxEucfh1%YVvdyPQE~5-tB)|cbcIG~$ z{VUqMXQ{(Cj&D54VAz(C4Y7g>zUDa3bM)>_V12z~Kz!6zz-{WqNbR4)^sHWoWj1*P zGRR~rfUFJ*9ta?FpYg3792dHOGt3*8pd1nGdvW>KqH9(*9x9y%sc!_*CI^_fjf(aq zhBK2~#n*;o(XTez&i7Hu9Jcl55)X1X$G^2g(B9*8%S4gxl0=ZlHN1cXToSu*ap~9e z&20QI@Z;EN5#H(c@!8#5NFdttZg~|4%J@8B>DDt{7$h*kAUCTQoE^%Dxj`i~FUL|Zw zY~>d5$N+H~`vuQD;NbdmMY`L`J;lUmqIob~jyFiaaCc+BPAZes=bpE@?|v)s{lCP` zX)p9ky zNUj)wM&${R4}71ee$^VxzD`)6+@xS0#POd)+NBaNmR?c!kOCBBFwZAGn5#d_=M{uJ?}4Q_AE8W?T&P{6%%9 z?HplUhs(?Dz#f_Yzm0J-T_x|tNCUDNBe7_XIV3ch$NoE?Y>Lp1W2squ;=XppD5pGv z82fu-rV=n{((zI@T)xuZcw+%V*Z`f=E?AAjImuzj$G5F8ZkUFR+~g18?t4?oR9MCs9OXye+`i}O{HYDm zTm@!gc>}N~jEY5($#EcN^BGvSGqp#~0N|)Tohqc;M8 z07Py4GhmSALc~iB%z4RU->(L`j~VJ>&%+n4;{;ns3q>E!>$HLaJ^FoX7s0Z}ABXHx zL}=D15;CJCE&$;AdyjgfCfTR6YCV`w|M9B@v4wL0Ca z@0KD$qh){t2h${W&M8AJ+Ovl~8D8U#)vI!`p^PzQP)c%n!K@U6GoziBZt#c-CsL$GN{K4?^2?qk;^{J+X1axhOi1}=A2N~nj918aI%7dAEyT)_M(nQ{ zToqx#2c8Z^eWaO%^Jc|mgn*@nOnm3^@9$qSe$<`24EuZFj{Ezlag$&IuFnIo1t&2Yp2!f*|su1IoSoTnv@{b}$ z8FzyH4O~lcC9+CD#x|3l39fE#Q{2Sil}R?u7AV%6#rEOz8@L(j6r5wH(yCtg z(O&UnR=7AJf`rLGL+#eHqPAtdj1ahyumK%Dqxn?UmgV&Thy(dRkOb0qaU(r=$n~QD=|C30o;R~YRBUseGx7U)*@V~5R%JwqKuiTy zV%X1qrnEi<{9L;DE%74LTGH;Ow~R`^XkQHc(Q}w^W9}_gqS5CI^0AzW*%5-jtuIQ6l^h2%6|3%$?j`D!ryD&05+35;1kCf;Qc>Z zyKN{W?*K>`aHA{r{b~&cG#1Y+s;nMa8E|+9Bo)c;$6nPkITg!<26)sc1Ri()01v)B zD>~xDOK~Z9*tBsBph2^ecsT9Q`jBf^&C17?QdU2hw@$gh{{R}KE!s_L@J6GgXh?0P zbCZ$kdww+yT)4Y4$h>Lby*I-8h4z=@IAfo|{v>ZMQ6Avda_4$Thp|QjraKMi$`QkM9mNc4VSvO2s4(DK704M+q4)x6Vi^AGn-kmAa5@@H2F%-!)k{Ff7 zHh@Uv4c$i^)()rRcktc4?zMNMOty)BAlB@|t6b>vDwV>o-70bjKX<3DYUhW(DCkI~WQOKFgtTL>OCE&dA1!6I&Y!JBUTGqlOqfnnVIcS8uT0mUJS=3a&!wZr zIfV(jlx51_W6L!k5_p49E3;FwfH4?~D@}oU>N)57;<+1-6zbRaGQo3wEV08lDxhIY zjsfTKuTk+Pk7MDh<%>~!=u%=DBOF1)sW=#Hb_j6uu1;#ksNXY5i z9`#Ve!aWXLR~2S>zv9=EC~BT{<=oQTyF7)mPh6k>098_JW%7fQ&N}*a$R5A_dezip zA8ffXu~qY%ot+NunEq7>iCqZ!(G@>;eedCUClhcBF8f_UlBh8E|cQf(3jP=er=lp1i0K*46iNkqhfVlc~uXD2f zn!Fzl4y}FSd$|S!s>>88PduD1N9WfSvt#fp;r5yyTYnGgmogz3d+kN80}iD^=L&sD z?No_#N6(RK7usFM^t+TY4Y(i>KBK={>NLNK*Sf8<+UoX}Pb3!X?=(DeG56D=@z9F* zD?b2u2HMeD9|&l&ysNmhw!7p!@)#a)I2inCb&W4bio!VbO&d+q)H|B+86cL)B=yca^WWOGPR25QLKsL^ z7TeB8Aht)pKTPm>spnYY{{U1~_TX>Cx z7K}r)1Ozlj0cCxY`EtR+=XK*JO9-qpo#H|z(FqM?M6UoQ`j(GRu zrC-!+R9LzgvwA+6-Gr+K*z5qr$3c%9X)PuE@o$TifPCSPfj=;+{GgZ^Rzhm$83Y# z6W+QX0_n*fq9(yC>69c8&w<+mjCI9y*ZM>{j0ls(8NvJP*ep*Z@#s0g>zYDt$Dirf z=>#!Da8AaMNfP=vJmc}>6?4ZzJ4kIWnplOM(>M}u0LJ5=EU7uhe~YzfUwB!qwLR9N zPc_t*B#xNl2OgYce>(I30E#+8Bf$=$F*ssW$h?K^f;w?Yq{kU`FWBnV)9Nc2o*$q6 zVNx;2x4&P)uWFaDO|fK}+{7?&89;D9h@Zot;=HZ2cDG}V>A=o8&U=I3`crOg-I@~8 zhuP7A&whv7H4X(cMVO zM<rqb|Zy+7StAW(3X9lT5rg?oCh&Tm_ z#wg`0og1YZCi$Z(sx#AZZ1nv907|qzLIGTYbIIsEzZ&Hxvy&$>KL!qa52zT@(A{yfC$&06trL?FBCURB%^i+5u-5ucAk3I*1Ds~rvAuY zHlJ`3N#IFsR4N5Vn^L?Bg(IfngOkQ9<3HJB#1|Gn6KvzXSy?C3Z^n7VN6X*l6VPo4 zeq+bYj`j9G$4jNP{flnyT?8jw*L*pmK#kOkWH+xFBfiDxJu}mq)8T_En!M5DKMk}u z)I3vZ1Og?Jc|KNOZu$vlx)Lu!`Ez%8nVMh%+4Y&+l>XTv&B^ z-0sF&G?{MRLkx3nmmyOnLC#Nn=hOA1OQ#GL1~?=Ei1We!0BG}%QSDXju3BqH*gye> z8*dw%w>gSKs!%PJ*cYYWhB}5YrD$>8^ya&tk_h5zrJyhG1L#GKrGrx86x|0 zAe(E2^`u=3QCo*C4d5yjf)a-Z zJgFnEQO#JezPP-*Rg+SV)n-0hNX#&xTVPs{)0txHIZ*2@pW5U6i6~4%%=lw__q(0d>#0MqIf4#)i13)J$05iCgo=-}P$yN^>=m;^aEBRx3JZ>?nbk6f_ueStdT2vwDY za74M9cLRk{+qd51tukXCZH*J)si1{RUE9227Djnn%K=aEzb7A0O5#2%B3fzRWz+RL zIo>(ro?j|qDu$F0~Ct?ezUD+%3O8XOzqvJeDL3XY21> zHif2XkKtLR)b5tURfU~W+EM>8_Hj@>>mGAC0g2V(1ka)&; z=Yfj3CxtXfEq2d+BR21wINC_#1CE&QS+F&;=~5(@HokOnArT1zZYTYccpqASm@ytq zYzNDQaexTqanye*o0@VYjfwm_qd;9HyS!Fa4gRr4M;sH5JAM^r3;ioe@ZPN^lN_3; zfnjEZ9$O8N*dvU0_5jv4y#ot{H!;M;)HAGYft+#mz#V-lnp~4uX?o)#Zu2adGH=+V z5^=|K>pvU3aiw^B!#ZA-YkR6pRjwpwWQ1pyWl@|A=L^Z`I^Ld+Fkdh$=*Jeu;~25S;{Z^RZ? zLVM_Ah4C}mPS*1%+J5VT7;)%xU9PwA-$3zUmVbqwG`80zZKit}W+{CW7SHbkaKwDW zaPQA1mabk!zFt*r$szG{hE$B(S}9Sy1UYPa;~%N1Ej(2#Te}Nr&@%?Z4b3Kg>EpIf zZ%VDD{3_RUTf){_9n;Db?MY`ssy%xQ08b?MuSf9T?1}Lw#F`RIplN;{zK%u`06b4) z14IDeGP8}m@wcC?OLh{6GdW!+#MfG#@I;r&kIP~hFYgtxj&a94)V=`H&%_TF+30#z z&BXKHPM>I*1dMvtdm>2ks2FZfC3o#jysS~bp^z?8{3m5Mjr?agTnQ+im<)4A~c zzq8+uBZFqI;NKF+jQH3#F=6UHat<-r)~|*B5ct4fMv36x6(~g_Q#vT)*Cn{Gu|MG} zvYiz8hQ;lziQFY?hS=MA;BoaGyH;Me`%m}-z{tY-+VjL$5*9>Qd_rxS-B@ITyBMj# zBPXXA6{@J%;Z1cuQq(>ic#}tj$*XvOU9g3IU}u4&PzP)S=z5L~Lk*HarQT(wl6H;8 zK`eMu#BsnRXCJRM>^>v$zr)Xp(*b+n&yPy`Lq@tcjI8cb6zD!%y^6qfERk>fh5~i%|e8+93Yubl~Rpqep z1?HWBD#DP>EMtrVftANSYadY3ZXturywUZ5%Gd$4`Mq#Ja=)i~{R+}PBkJ}x5!vao zh;86sFYHl3i5kW_WaE+BKh~wy{8a?<{ij&dJjtWNh~jcmWgM_^fyZo)YQ4SLmnraH zhEiDc&oXN(_y*(m?PX7w*E@bw+P(MSckJUNno#ji#mJ>wNmU-hN0E7+Jo7c$AK=C| z$JCYFeFxFj9w+dft&u(@@MY9;aUpvhZg?5juJ%U^m>dpkwebG{!_N+CS{09pJV)Wr z8C%Jz>Ij+^iFK(Z-2Nq$9teq45gtG%KPg<~0bY&{o15m6XC@)JD?ylk0{Be^yJHuM zJ}z2n3*q;gJ8e5iwgI&d6I?g?xGkd?!ki2qGCJWwHSc#*>VF6PL|SW2F8=`I1ePJ} z?Io2PL-=W?up90jh5?-8=3|C-1y>7`ORDO(zXbe6a+1&C?OWqi`f-}-NmPGe{4Uc; z$&ufnkbnprGqPcDqmP>J?=JrUXdQB22z(^C)aUTM=AbUMZBq3Q+WcE`F`LWgVU>k> z^5EbA273YPuX{rZaE%!1b6*$qhw8zwrSR8?H9Z{a zH|=j@Gexy7U&?%U3AlmRrDfX1<#?Lp1Oy96ceXND3~`@++4@${gIk={swqEp=ybYH zk8OAf((a=;U9IL2jqkzf>_;{ASHiyzUETaC(FL1Yw2@nqVOdoq>x}%z1apo$oY%_w zTg5y~Nkb`OPB>sk2lU7Ductl_D!;?>n$1oO|~MA6Rtj)Pp$H5)i>rMa}2 zgFGSFFlC1=$ZU1(T5!o4TQQP7+>&$mlb#42@_$O_^>h*0LiAED1RS1Od)7%~SY)p+MdQw-D-pqE#Jl{wTsn*RI^wt)T zBv+DMc{4VA%d5E#O~vEn?wQHky9?EsybI#yo&Nv`*Nx`1vPNrrTWBLzRUl!PE7y_@ zcJXR9x)R-85K)}F5V028Gse(371XD~n7$)^&p!}+Wpsi&uMYi=a&0A)_z z2iNhg3Y8R95)$Z*s3VC-LUCEB>(2RyEHx0w58LrN6 z2I&mfS6>A@Z{fXa%IOOzz71`AZ@2|9$qS#op0CGVmE`x@rJG}HLNp{1wT3aD=T*j| zWNtx{&`PDS+m}3Nj!5Jhe5-o|rrNVTOT~UYli~jWi>!3d5a{|=v8LKuLk^*6$_!Vk z%lG4P_go%Tf$A`Nf%#c8*zwbv;QU`_b)$Sn)Z>OoT1!nzU9z&~DOxEykleD8I%kki zdavO7;5{B+Z8G~WmK8(D%l#JZi#_VA52&UtvfOTIBJZ<5tT^mu*el2Mi7j_!EtkCLOdjWf; zOfWYfYzK_>E8nILYjVTkcZ7UTcDCLY@!f^EX%s)(EZtpK`};u|z{%PO&IlFd)_0NH zNRJr``2-RH3-!-h>@<&v`lW@kn~Sq^r0IxNwVPdc!Pc#(T6rrLru$W!<>oGf9s1WhYQ`ok$r7$J zj=XyN4r%U6-1-aQ{{ZZ}@atUgm`!`*?up^+yXIDVYtIO37k2jLc~IBZ@8toWn}8>p z!14FQF9CRw?)1HD!oTp3ohsq&to6MTMwM=YF<(03Cc`qxjo@>%9@XZ0cZjdy)73O< z>Fw>U+#f1EssTM1jBa=Y`%<#6X zF9pk(p4fvTNK9b4;1(a4`evU!kuKXF&Efw5*`vdE{tb%fO8E2er%lyoJDSJE7I&IT z#&+jqcbS$qJ+}lug?k5qV))&r1;L#WLVe$(nzwrQb=*r z37@TeN2}|$ws$-9`=bKmB)q0Ar#;BURf|#5FZDR))S}TRX=G5%Dn#Y^10jgZW2ah| zX|H(=w9nC74~u>@)+W8N@W#LUGV8jQn#Moun{OS>1?mJJFbg%hsQ~as?i-5p3vc)+ zPm6S)6UV3cli{C*?7WFpq@E3CNy1}4bcHHMZVwsFe7EDj6xm&C7uG8@7eQ`G7Sp;q z5Wev&-agZ8?JX5<9v>E8>E?M~fh_S`$f~lj&dYe0EJ)7LP2g14njGHJDeBLR zJ}dlH_>J**#0lYV6=*l!0<(xLms&iDBo}uqbNk8WaIBGIjsRR|?{uy2gg>)~i1nQ% zFMbf{mpYE0yu&uRZ{#()u;JsdNn}#Y2Onr<=y*P!qx(sGA@F{a@z!kv;Ca7)58FW! z>dmQml6`kmzq(cVhNE#gK2s`%#k5Swxyd`w)VyTNZ1wF8(<|+j+_sdIQ?tB zjUQzckq&B4Q?Bqw?0b3POWzCGYnnygF4#>x5?mz0(`yD`?Y!ngkV|u)Q%v~x@atLA zzAbpJ=6x4ZhQTksTc#=Gta}%3(i?U$fzVg5{>%OtU1!Bhsa*z?Y4(Y3jLG*@6VUWM zak%&1Y^|WKaF#C z;wRE(Szty~cA26p@{AHm=dh&iTr7G7zYM%hoyYyTs9%+e*G$i%Uj0J0+L^0puJnCphA`PZoHZ-JK!urIo7B zdA2yN(gEklqxfI|aJVh|#{oyVtlJ$k%7tZ^K(2-Ss9`{`+T`-UbG}2)T>e72s!!SO zbkc`8^w*330BY?hX;&HrfxU>BW4B{rDNmCJ8|93H8lmY7WbXblL9P$}7H@^MH)vYp zRcQj@n&RE$c|gY?k=yIQuP#f3B$&`}m{w8p@zj7v9MoE2Xmu$THvrGHIO<9I_RqI^ z;hkwo>dwf~j8&|9jJ_c7qs=FsCgg<(EcTm8Tx4=o`t|x%S#P`=@J23f0vG4zvIm~H z04M%DYmK|OK5U8)-2-k;ea%t5lg?x|_-PD-A&Cq0$?s9^Cbdj%oF7BIp6|i4La8m( zLf!Dlk7R*zdB`Cud% zcNspMR)^Y+s6J|{GmMOYc=R|tf$Q&0Vkg|6tJ8fBvQG(kNJ4+&cW#{FRpL;@`>^OS z+>BHgUI*~0+rL}0Og19h8o39i3wHyP>w{duxNBI?lo4^2^9tvTWE_5!2jEk54&$4?pe?scAoVGjXr88Rnmo*&+`!x8H^7}~s z*tYwAoZ5xG<(pr_xCNda(hcdHe8bn=R!r6_dlk@y?2DKq@&&|O;aPK(^Ar)iG6v;1 z3^Fn^UqN__;;y&<00mz0{)MajN%6-SfBIn`oWM4on^s!B`@ zCkil&5hx-GPf{EwIVY*Fu!HD)&#V5)3w8 zoQ6m!THmy_zTbeBmo{u8ywr&^$!#HtgA1;wYh^~#0LC~K;kFvp<*KH2EoEDP zc4{-=pF{KW@9R(6Hea$wsyFOm<5%46EKP!=Xw`PAp22ev`i#_L_B!#j8%4j6M4aI3 z3ALE<{{TF?4_{j1wBHlzJIVgm*A8DO4xu*CaoGzTk7Hh&;0;qy@@{6i)HN9y&_p*~ zJD^;S%y0lbhjB->XjRT`oXIhg5smf7*RE{sbZNBxM^TPDi#9Ap%ko5rk~`paHQ}Ed z{xf*T!_r$F3&r~Vl1U*}*>{9xDsl3aBR=(|I*vwipssxdrT9Z%&@{safuMXtEf7_W zuBFo&1KERZVBd}@V?Pj8kNimP+q7#Q2~zb7W9Ul4f8-UK%u z8NKYme6N^}iEwFNiF5F(}cIxJ=|=x&WsNMmYm&b)3xSmqs^i^qG8h;|pmb zS-dwWljZ@M-Pd{RfC0uoQQnb$B>0Lj!TdFNOk;8V%bnfM7t7sSto{w47` z_#4V>_CT`2hP;^FW|!@eMsP_Yu~mTM*CzhqF0D>(sGN#meg zb*?AGKedmKZLD5x3irc?ygDwt2nzfZ49zAS4U3Y9Iqjn zgxU_Eskh~fMI(86$5z|W{{UK%K0PcMH(E}m5(D>wHVEK++lNk`_2d2^{{Vu6c>BWI zirMP#;HNHvNmX=tmjIpvVtkI780}q0gMV*bZ^ct3u9I`%*>7%(;vodlxl!|N2+Vsa zJx}4%q1BVsBSn@aypKaaw2gwZD(PCJdyY4GdrAN^jGPWnL+?bNwAPsHzv#EXOo~Y; zt0z5k&j4fTS$`KkJbXa-L-3l<#oi(C{{V$AwA-ywG~t;gLmZ5S)Pe~mc*j9kKjCQn zRsR5nM3dt^&w>6PH-uJuSoeQv%(rLlGx;dKOGZOtPDu@bJ5_T^+Yqo3?p;sXBSTP3 zkln_m^1r-5M;(D|V~%;}wL;&t29PSbSl8hvDHQEkuenIi|x z-I1`40NvB2Dy`{aC71b?{A=;MPt-J9yGwPIjLKt05~kt`k;CT-YCjJAWzw|WIyml{ zXdEi2ZJX83IV9(|OdhrMXTfjTZqwqQ{1cbQKOg*hm);!JJRbV2u=rJUi)Z_4SjZy8 z(n!0N-HUKOQO91V=Ff^>v=4_q9gPM_yb+@6b8Au?Tbpk_4f-SCFk7kPR*5Crz?jRD zqmT&Zh+-V>mqK1$ZOF9$0FHVT`3rGy(tOLfKykEv;CpfD)~!kLn?P%P+uz9@xKg8R zC*)v2Bh+Wq@x^=R>^1u@cxU$L{hq!nd`6!4L-56?!uz>xA=9AJ8(0&+8+a6Bf@UD7p63p=}?gV(m=OH^SLkfHK2xhuQ589bUx5zOqCqW;e1>Q5n6^P?F$0wy_X@3%a6#P}P)~vh>@c#Ek)~#cQ zW#!aq`prutDXn( zgf==PRvP5d$1RCy;%6swAvr(@{^%U%+O6te4(+TjzHte+xQ`&BVM8g$B>IkiwMN6k z`c>zRENwhm)^@ftJ6p+nb9Llf+2spIBfs#BuHJYhfUhc@XBvsEp69<`3GHz5gXyWf zo;0y^S;h6ZO`FV&#AJ8l-#D%#<508l*N5lQEM-Y`02=DgYkb03)SaL3HOTx2dhf10 zCGf)6$8h*^4-)A5rlR6F)=fV8dy6=wk@l=DFinXeJZ)pwAat&K$JbvBz7t>C*?7VA zL3&J+M6smO6bkqtmBHYH#(mEf>AAm#$A?P{;MCJTU~6AC+yJF{0}MGI{c6+GtyV}3 zY*7i|`i{Wjw00j`e-CTGIXP-pBV|8TD8AdUls8sYS+kqb9s>2FL5*fDTn`u4I zy?OOpPn7!VQ}&QjCyEnjz%lup1<2@s3UIO_;h2VXBk$v(H0U5yI6YJDlk*y$X@@Uu+5 z@U#}`<1YuSvspl2CjQF00{#vxwyCUATHzgpd2w!q~s1bI6cU%o6z{@P2Xd2 zndefXP05TO;obHB0P9t2NmS}rZgOzT8NlTHpn?Z}xXmP5Vu;!8ZxpJKJiV9<3Bd2^ zP-z-<#BFe5x=6>J@{FAN5)XXj@!Fxg2|=0@#;jy42xJ2Q5OPT9KPuyXEO=b%`b<)^ zQT?XQUGXqr2qy<19#jGj4_fP?&?GS``KtI~l;kMtM<=hZ>C5^F{$9o8u#ad zN2WXv;x~cU!&AdHnu6~{)ptu_at7fdb#6}_WB@(0>t9-U$HCVgAJic62ZGy8j_Xf3 z@?k=$GLwef2|pX{q!5mbZ7|;SIg4i8Z1z{nXz#$~q|{rVl)ES|i4GA7lpR-s|lfxde|dp8Rrn z$Gv6v)8VeQ;VpJuH(QQP@PHCUfU396w{o^fIUoV=ShpSz)@&{c-0xWvA&H5YG0#Qg zlaBt?$v9h6t~Gg)+h1SWUri0pm95C(AtB>G>cb5Dst-)(uU?hH=xSfYHlBN_FC#H7 zG62WwYB@ArQaL14h{)f>RtL^czAAf7H&lj5BoQO+Cm00e{{UQPx4mR&*_Sb<(b7WgAq9lyB~LWM_gn1L%0F@qAB`%2jPH*7Dvn(Pot-$Rn>A3;ikFhkmDZ zFN1`07qq{gCXI?H;f_GhBf0u|)g4pAzv)&HCBmOFV$wKVw0KjD58^)cgKP1ANNo#G zVKbfFJTAX5JxLwUe0o!LUyD}KYA`jXnR^;XmuVy_uFb|VgZ2CFcE7OtCeJhZT0|$#`ighUQD2%W?2Hlc!J06+!_O0oDGT2_+5pid!6~JIHqDCFh zToIGTdBtv=JMi1Q{{{V+x)y_%dMmv7hZz#u5M+Ld=4mrp*8~E4CRavcMkj4O2 zAO#sc`;IY>rCNQ7aBHErsHAf|OA<0HtXKu>k(-5E@bM8I=07~xsU*PBP_Kl@U8URJS zXcz)Quw1gb^$rQ-n&7XAnPc7?4CChA$mflx(4Xf=GaZhD!nT`*%)=#>0x!%noZt`t z09Q4;_GrP#C`ic-(Q$*gbJX^%ZwuR?wwa?e%26 z_s?&}sXLJ(td{O%wVE)aDZeE2P<^@%FrhgxGtDS6e zvCsS6iT+rwe_ZfXmTpU;{oVVb>@$v6zpv800BP?su!nq1es(A`w1er`^F+E#b4tMc z`R8#QXWO?l8$|L)(ApLz-)kc=B%%42(}Vo|>Aqx;5+&WcKg75`pM`pD_l6^V8@O4lsln)Q+v87e~cJgEo&0I&Md zqUt6Dx=m&&iNAZPQhPw;Pq^m%-DYh&U#Q6SV0kXh8MBrxuOgr0zoGxe!8{{Y!z zShv(~bl(Ts+T71LV+>JT31*Tkk`#f^@!!2mKzW^qj%JG3+G|oxab%zko3c|K)SvQe zq+f+U@RMk1s{B5jT*PAEHNC^C$fLgA#PQJ8O;7fF@n47DKln-XTkSmE5k0AEV89O|eLmg$nc z^Ur?WYhZjiXtC$avE<>h4pWo&g*|>BHuUnYQHt;~r_<83zhX|y_Hwp;L&h51k@=tK z-W|D!Y;C2Uc8(dnYvHiGQcwgWz!%ZsO#**ruDbzKBigH>zO+75PgVShf zRderN5&IncJ(}}f*1Xc&H5>gePl@rllq8QlxgO|?`Ey?5{{RIv*U>yz@Pj~y=ATLM zD{2y`P^31Ycx1@{cNU}Y%@rkR9TZijdB4F8CGLr6ml3pxBO!C=xp9;p;C1cqUNhq> z*t}=)hsBzNbGSEptos{o6!~rC1N6jWf$fU-pMfQ;lGTuc1i{p)B(B~{fI1uu1Mg9I zJN9Mxb7ys^ORa03D~|6`npyV?ZPvEI5`o~ zHHDre^R|H4APgUvp4~c{vkU}GMA6L6AONT!40O&w?rYP2Bz!2*JRNi+@LsQdsG?h_ zGERf59ywJR0D2BHS|1F*W_kW1+1%a5;s|ueZRAu6_K!4Ap~qV8Xz_WE zn|?U!Noi|gVoQ0W_oSSR4n{cYeQ2+3`1St)1pT@32Z(Ja(EL?v^Ff!*jF{yA0C#vJ zzp)fiW^ER&x#`bt?C&J9sQxj%M%5?%pXvG4=&aJ?Pk63mkVhhJA{fgVM^ZMgN=q~s zR`RlLDS$}9C67;(o)~@|Ij>#)n|>Wy{6+Bgy>D>AMZ2uA5`>uW2qT_{r?(aJwQ9zc zd8Ey$VdY+Yu{>tZTYFp8cwv@lRBTbWu2&-&LHHhPvC;fNq~6*n@%_G(b`9d{-gk=U zX6|yTF@+t^CaN0^dgsL#R-PHVg`V1JHhHEvnjjdi4&l!ur+&3hUGUbsqgyT4iDuIo zWH?~5115PqjkwSA{41gjPSQpbjG)|Ey%xQpukQ4{TTwQu#6($INU@&0jIi&|=UMk< zW7H)70EBYsuM0vZS9pR2IV+!=x2F})S?klrWJns?a8o3_L*yC9%Z`KEuT7&{>)PmR zyY{mQX!3&^tdF=5KtG0XI~vg|m@Ug1ew(amw=rJZxrN{&QMT<9c>|#5uTz7?YHEHu zi&~e>*7TTUl!6-UOB_;T*scZ#eAh2+qIhZo7sYq_ymHMVq*2@3FPSEK43K#sZa$pX zjQoGOx`O7{?DrR=O_Ah_?CU1jRe=B;j$N2@o}5#0Hj26F{x0~z;i&JL-@{+qPcjCH z?jAj;r1~*AVUC9t%-HyY;bpJdruehrKNa}DQ<*jk=zL{!rAZor!U&`J8?FX<_2Rt3 z%I0}u5=inH{{Y)Nw`YuxQZY+4m_iu>6Cm79a2WcN>&0U>`W^HlqP9IE>s|ewbt_g` zz8Cy>(l8cKk<$nxII4m%zB z^{x_P0=rBLGY!hXaKN5V`27uTY5Shu85?VaRZz#AV~pqY$6u{AE^QgSq@P1Z*W;G2 zU{cG%TK=2iYin}f>kpqb=1Boug*hN~U^;VDZT>Q@tEdF=2A|=*RSw^s11!=vLU)jI zJAr^PTfYx}4fuD&+7t5raw%T1xxw}3KoefjnNl_!Qw zliigVC5(}ftHv2I$^7VpvoWaLwPz}PwYLY$j3WY7w;ThXo9V_eT7DXzP`sWP{5_-S z+TG%&VvX#>+$bRAhTJzCckNZv!{pk>8!WQhL<1E(0iFQIwkxOjZQ*5y#F}eqsk&B} zDwyOTl3OKs>&7_zD!I`LET#RQ;(rY4R`GbE(*FQWYn;s#EqKN=5a5EL$N*;;Zb`=# z>wgIU0A!mlixEDp@lQ=rqcLQ(R<(#-U8^YE%jT|8c-nE+y;jfmaJK&dgs(`~{vulm z9?e~??01|q?hG1X-#ie$qP;IuwU<+j%_#+7LRWC$^!W$(aa=g6{UT`3QA~-DV;*3T}`}t1ix%$@4uA>xfG&3dB-~gi3#tuLLbm(cys#_DYv4NoY z7fsOgi0$+%G=ew^g^@-akb4u)C$Ffh8upVLcsp1M^E6Ft%!AI{OCE4>$lxA2RJRru z?$L{@a8!(L0|YN(y!Q2|Z>+5bg{i7QjHcPiXvPU3XPkWp<5?!#usK^+D_R68G&{d{ z3gNdB0^oiJrD`pyD$?rg$P|ZI41gSC8DrQCgZb7I-(F~zkX+b!Ht$hGY?CCS^-)oZ zD-sm99=wh{E71NLT3=ehW#X@l{{RfUb9tlP+z51S8q`58$B1rE`nbXt+#}9dvB1Y9 zfC;Z}1A@J$SME4*6|e5Z>3$M?Ewt0@ZTwg9Lr%K8ivC5l(6lHJwdaX0vz5Ys&mn?I zz#DSSg$BLWdzv~>t^r8Hz4J&@0;&=c^|rmg;CBv=pO6f9|BnXI?@uyLP8jv-AYDem9x{1 zfN{sAJHX!$^#1^dIzrfZeM`6l&bi0UGh_S5u;(7!R?#xaGVjWQMp&L3p1J(G*F+(0 zj!Knoe82G`z+3!M*T7MRynLREk~8@GS1D--Zxdos=7+Qg4A@+6$2jD3_}6dog4JR8 zx34m70!xJ~%6R1mO!Vh9#K7qXi4~#?7?RUuhn(YoM)%1Cel@Ae-Ojs8g`hx2@D;a| z$1U4~*nc|uH{hfOPlj4>odX1UM&JiLoN?)lV!m+D=0Chv9asX~kTKBui7Y>x~6%|8is>+M^`3?r6Avhg>I;f7Vc*Kgw_j}G{DBs=2S`_-1=auwsT``w&>t}4-|*~n?MveAR!McCcCjjXvBp?~lhdfrdX~>$bXGi( zlEA6t^O2h2sZ(7J;83ws;41EZ%ao&iLbKz#MRXyjP;-*x;0P zb}#F2EH<{Oug4dk9g?b-B)@zU>V3OcGdc+ZZ3Hnrj|1Ae-xcZ~+SgWdd1SL&?N`P# z?tMAUbGLeZx<+y47dRLvzoGZ`q}|2JTJY|X{j;d5dC|hE!HkS|7{-3^1Fd_l zQ~NY{45-Ulc$ZYSk^tD+W?wN|1GylR+nVuRCf#k|-)w{uzj&Ubp$8tOy8i%*e-ZxQ zrCn$;3FKIH6~2oqKn&3;k`LxFSX53;HPGG_Ia5at&_J@Z_evQ{^{pvy+E$H@2H)WaA6i`)TE(iw?He31AS-fyQ}|Y@dYO6^H0>%0B*n_S ztCRPe-}0^PC_`^92BvY-VuMXD&kE*9E@Q{m(coFOqR)WcBfQ_4gm#JZR6Xqm^hyWNt=f104<1~E*wS7*#NQj>gT#IyieWvTl31NSz~JqYP(Rnn+ynB00Rtl^xcCe3GfVxQ?OxBp zam_ZRcob?HwbhVo+l;P1c5(ZthiKQK$?8p7_^a{TN%$+^TWRifVR5Kj#pOjB+o{}t zglDtoBk5cfYu`u{DK@N*tK#RyD{q6|8kVE^z9Ahf_RE5N4v{n3g7@a1d-Pr>aT&kH{ws)gT^1)-w@`Rw5a4Q5Sc@%T!D|2 zayxQ(>t9m%W5O1{4>ZW_w6w6dSdgSnmb*NzG6>t(ipkb=kqNYnUxq&q^zVc^G*+4p zjbnBZ6(whZCMAi+S8(G#wbkl+E|;oI^S+g&O58V=_Aw2dV4Q`=;rP=((j_tdp6(`G z;JAZm7+jKac?bUhuTfn|cV{Atqiz|7RhA-Ey)Z{#rE>d5-r{YPf3P$Qk>zR{7J%_* z%=1p48Ic>g4~}|PmVxkdNYp$-VEd~H3{fQ$qUfu7|0dje`Tk6!T} zwWry9I?%MeV_CR~jF4PT){vNi&zUTM5e#7GbDo&M$-qAG;SUYV`#nRY>ff|IpN1@? z)nY9iM^T@9#xhOBtFSZ{TR>G)i6=b*gI=~14=FxrXpU-?9?0na8GIJB@GY!b=ZsRu z$}4gj!p6xXUoKymu(pi+jOQOc)1NLp9Awr--nHUS+QVCiNcdrNG%pERNMOC!E%K=x zY=3(Wp2rOGHzBSM&g7E2Mk=0{ruc{U%JDVcrQ=g`p!_yOTX-$jFCz0^ML#N-&k$PU zg@6nJ$t8)$z36rj={jzmVWHYXWnpK8f&`2zMuVpwpbkmqy{OaB<8!h3`{KU^Sokl; z_xewUT0v!`>a$zhEP++tH6&%R)Z~-+)b{WhLmxxy-nBk2Adllmh)R}i z+VrY27k4TN80tU-RT~(3<8Yr`Vv}p)3^j z$;c$0bHU=iQTXW0zZ$$|6@s7bMWViGt}j(2tU zJwH15NA{uCBk;G!4;WkB!7bg)x|H8%vxY#D-28}eN#Rg`6C7X)T?ZeC;(Sx8!=l+d z+N6mMnhr_%i#KEd{pKX_z0XSX%@ z^W`bqlY)EKocvz>psn=z`dzQMlvDN0D8-*;}niRtZJmU;;pIYF?;#CTAly^s|g2B4;T-qXs#Qy+> zgW!L~j}v%b%+zmhwAmwu;_B@LcM=ASHd#Ob1CxbZ3<1S*si`awh@uDgeM1~)>z;@C zS84wM1+lW#Z@=KApA)0d&ZBW@9M%mi7LHNcLt`E=6!JP8c0Bj5mgV?m;&#+Tnxt1# z&k47c9j?62<8q9iNF94~j%&+>NmYuJp68<|Dt_wddXI`eEIyyB-06NA)2G!gp^tR& zql8O!$mE~mC(v>0RlF(jvqseAd%b$;G`EW?V!3h4fsPq{PXPMXR=42&Ys3C9)NlMD zEEh7~Kq8fHT%b7X^8v?RgRNufUj!$H{uaHyww1tkxp5n9CI0A->HR4;avrAljJ`U> zrQAZk6T7pzk?s@iP31eNhdhYK8=D+%1dN*X&wzdnyZxqLSbvAJ+xdDJ6WzVca$x~h zAut9vVRM7u2E0-)g42yUI4<>ET3bjYjTYPq2nQugXB&w099QXA{2Sfy#?!(c5%}!a zP4?E7TT#As3}6D%Q?+>a>MAQ$RH1flMwhi`=M?_{v~`TgMwMZ#T)2=Va$y!XZ1u@K zeznm21=jDiZwz1D_>O6BB^rdBPTpfGo&e*32TXRZcj4#3eHt$TLv4O-eah9BNxXfE!R9|oANV~v9lwzLan3q=W~y9V2fwpI zV+_(Z;8z5Ubjaz(XfTwO%|J};69fb{;v0YN&pk)~0A8d?(#XE)Fp7k>Sb>qy0q#Mn z$$WxDZ@i%6aO?oc1a=`=Y%Oq%C{t+X32h(8i^4Gzh-L8HU3&2^*M?H}^W&SKH20PPz< z3K)UKZ+s~Dp|1QK_QPd*bMo}(A=s>{WZNTm6Sr0Oa zV-Pvoz%ylV6CM4&m0wh!ZL~=0M(I$3cy3Mz{#Cy_z1b^6(Y#0T-{8Ey8-ibtKe8{w zog++p#A~as1$h4eR?!PeatD`f3?TFL+Oq8-kt8p3<9!+!)Q0LrasWpiFhS>v`Fll%32rw?BWW3cA1MC-fb{E* ze;V{J55whncIra70fynXATM+O0P6fId6lhU>3vUK_}lR#;3vgn4bO!VqUzE%JA%n4IO~CcIp-Yn zTT*t>7|LAC`a8k@0Ps*~{2zY}kL=g*i@_cYTe(bWsOlf_GQEmCbFwu70opJ=Vh3Dt zgPYWC8y3XOem6j92R? z!;b@LS`YjiDe*tWdYzmyYg)Cot!^&)C6Y~8#|p2}La*1RYw{D}b+`5h#EV;~u4b~- zEUrxU^2Zo|B4i|nU`WD&l22?`P6APyzn|n7l+$SarTBUK8GI!8k>HO4XrCWG7kC3* zyu9%Jj-5WIY|n40BFLqhVRaS>nOaT8OqL|JPdTs3F9m2;HXpT*hx{YrL#Jz+MW>C^ zK)Z_Zj?F^cY7Jy0l~(|a6p(>{N}d2Xuh^|CO7X9Nei%>UJKu}GBCyl+9Rf{E-Do-n zlMbGOD{nJ$NhEV)03Hd?Q(u<9wg>zZ+UwwF?0ezAia!xNZ>Q^e{{W19Lbf*=Sn%^( zT|Bo@HT06pbLO4<0dKmhqbxe(A4Q5$T&^dXhvwIq`V02B_;2HHfSyO`@J7X zPYdcZ*g@f42g5(vmij9)2?UER`Dm}6Wtm)*`B1UwK^0r}iueoS&mVumE2a3$@$t1^ z_(-ho>|)cJ6^6#$Mb4ycS*MEJZIJnA9Z1h374Sq~7<^%_Tmj-A7I>QVUT-jqtwvjx zXDA~iyoH0hqjwau6ISNs~;@WR?qV{J~)!hrz(E!TVU--jZ+OkH1k3%jxD z(1nv{8f)nCU8IrR z+%%`mng&Cd@^DI$22ZAGM{jkT&NkfpTf}}1(Ek8ykAqL)&kT5y+D$9r{e}MkjJ0dq zNCnCz>~M(etsFKEC03l4TW(M#%4+6X{suWYp-#&-5aUIiogy9ms@BhB+R` zkF9U`4@SJ!JVR~$gQ!cUUIlM1aXZ2g4En=`K@`FxT3NAOSLSNtOvUNO*g9cCZ+M?6!a>DHFaRp_{{&mWu_omBp*c8UTYNbI{;=5G&vh*~9kj(saLwvD^Gj(k^t35^J>< z_qI^A;eZd4F(fDhV;JQ@@0!*9qd(xW_g@M>YD?`a;Ju%P{8jMt!?7)u!p#Gux}>2? zO>qp_-4h0Iils=(HbCIlwS$cc3CZf&=hpU7B z-gbcPPc*cQLXN~_XYj8Q{hcS04~Z8`XL5X*tsYyFMof(!-Ms!M0=GZlqP``Q#{U4c zRra@Qr`~AeSJUmT-p1lpdy8$!osyI#cMNladiAXT0NJ+M7`1DQ))}~45TqUoWRK^H z@iA?4NyPUsX{f87!L4gwYKO|YP?07J5Ka%Of!NkQy``TM7@7x-WeOT4`=N+CfhVWR zM|#n{mLns1akB2ncX5KlvHbhgdU~zilGd7z24gGEK45x(`s>E2Ck1qSG}kk+#Q5j- zviOT-;h8)ZM~CFoX4UL<2`#O(@V6KD5nQCOi7q#uT0prt;0$!Hs6XJhe+YbE;K;lw zr1(EUeQQJ2m2a7Qr28(CPZ5JQ}dXBfc!EB5B+!+Kwdt+kC8UASqq zjabj8T|n{!6GI@`xs%Wm4n3>!yW$taYoCOEH`jbIu0H$E58unDNx6Y$2;aMtBm42} zVdxsVvurQb?Ip2UU4DDPoaUhrw|(-E0`%|4ztXEuAK0!-u32Q^@N>8xm7%M|lGw&q zab-N?{QA~^kjh2<7O3$}CSxtPpO=ou^Q-z(wYAYF4o*gW zdFlOXv4BkCIZB<}50q!>KdoA|wqxa!!*V+F*QH-JnjFns)U;T{t+e7r;Ys9Y9-TAI zL3JAZ>a1Dz<#X8g;-i1ug)y;-ar0vw^WL3vA(GvUXK7^}4o_a+*EC+_#wQc5u@?-| z0(TRG(zBg`Tpqct4Q2lT(xgqKjQucuYdyfm2;UA;fOm%(^{V+nqgiVr!;nFxc!PbZDYN)k!~!d06Bp$*6qpp zl=SJxE62CBUiT3g#Q3<(6rr6XCTWJ*<}g_cvn-E=i8dCta!7- zi>XbmcS?qP9l;J7r|b^@0XYqwKu zasL2J++naXIj&~^0K>X{^luE?nmN^jqYSDk=PEt3pVFFlEogl8<4*+YT1EWc9&JSG zmrx?ycymyY4ceueKhF!E^1@gQ^~MRw&3WFT;%lidP$cFpBWEO{8Yw`^prsDAqW&`CcskS3zKE-ueg8^K>6{1f2&@gMCQ;ay9_I&;oi zYpo~6U)a~yDnZ(@Lm?2%K?9i>3}k?M8($Rl{{R9-18|g+2g$1pSyi83a&;^JVbE>zcL4cKb!_ z&W$ePf^rWdt$9zyUyq(4__?ZhgID;GXQkh3{w73*>sGUi>=8j2lt|Ir+QvMv2vv`^ z&@Sgk9^LcOd#?^z^4MjBjUkUoP7`DwgDcdXxIr z6!ZC#vxSTtl1LfB$9j@Gp}c&bDLaPI*B{h+9<`nIGHT|;UM;>iCP@SjoCkRnVZa#4 zJ-Q05W#b#T-bN8yZI)8Nu*NaRU)S)>Qn+TYwK7fSZA|5{!t=+=>C-h8jPcxC;?0Mb zl6QbcIp+hR^!F8NLb16wizh0nAH}x;GPdv*B|u%f_VLp_{{WR| ztBgbn2{X7H4uEtX)cdKo#$+n2+1vuT^d6p{tviK_Z{o*_HCMN^FOsOiakQSR>4Tc5 zFN)fG#W7kz({5FU0qdSe=~b66ZIwoKLP-TSei{91IfEqZ&dwAj0LB#OsUxxJ(uGadG^FPKNooB+i4^{Eey&8|n-p#(StFv;)9Kj*b%LnKfuI824;Smz(-wtZ@> zv6!&0lt;r8jDR!g)`r5!=q2%l5xG~gUB@cRoa7!x-oxuq$>WIRfxN9c2^sQLbAsd^ zjK}W`cRrPmZy-lQDc&=OBOqt47v83c5#V7k!Uw|flHcMv`qE9-GHW6T+H|J}T8# z4N=T4d4@S;1ABDZuh5Qqaad_;k30O^Pb|kIriSsc#D=1_mrVe-= z4@%NAY>7cw^}QO_<3>TUSmC%y%cN{qAg}RY@IdX@^{s#G0X@4(tzOy0v$xI_i%i($ zWRJU&4m~kmbKt)a#h}82S=0Xjw5-f!Jg2y5jk(X>iN;R=5w*DHy4dxbJz{e%haZ(3 zt%Z%wWQlm;hp!pWxUPjWfvs#_Rztx>&mf>Sa(iYl7MovyP=hql+xy^C+);9MS zSCUTh%QH4Sr5FfDQc2+R*Qa{)Zw_s=@TQ@CbOdPgG)42t+kj86Bl?k9_OR*KR(CfV zI9Veo>^#hc}^R)b}kAH9RrIms%Bz$2H-TA$aeX7mm zQVADw#v^{X8-O|NKdmt>g|jYL?cuSvBRx8H6-q#ncfyu7`nI(k5omB z#F5XYYoWaGrLDERw-F;TMI>&M1bVK0an~JdFTvI&bx-tk40ZxG^o-=^{m?Pj)Yo0B zLT)@iaFCGRV)<~DPnk&|WRB!>_02@3X;|73Qjal-u6!X7+i3UDhAnkyXWt}>5nnkQ zN$H$`J8_!x`@ae5+AYQGT6C9dad1>`f_92W0G9b=1Tewl@~^Laap2f(d@FBt3`r1J zQXW(?oG9RWfzM94_OA`pE@H9NFAvDh(*wAS>|Avu{ocJkm9(Q~VF~j_?C|IDhlp%0 zjFI17+)l&GWw?B_nB$~Zg>aoV$RL-v+ED@oL>u5VaJ zdlpqeY`VU|oOB0}Fc%67(CaOa*EZ*2bn^{W=o zRi4^(KWn^3g}lH8!v;anVCRlF$3s)asm*&i-E!@mf*px*&mfcEJ%1{w-4)E4>ff_c z+`}e^CAl!E*Y33`CN5+7E$n2EkE1vQ^yd}Rf5Am{XVrgen~QBqUp`#}!rBIlK5(Wv z($S`oSPnq{07(bb?xg*gyde7iq2MbPRGD>sCsA4QPUJVbj4(tA?~qByZk?;2{jPja zJaPMK{8!X%Q!t+vT-qpPCvdcmD>lLFfY#Ch>yJv>s#dY48S_cDZu~Zdtn?VJG_e7= z@+4>=&cv0-!iRB^268iwI^ws!9ejJ&d?l+|_c(&#vNrucG1jwu zDJ_?&-RMfth^cVA5yx}HJA;~p*ua)HcUfXzaXyV`B^?u zf-&z!MbqkZ#yTHJ+uO@JF!Odz8w?D5y!FT)$EADM>`5}muj;mqye#msa9btD(T+WM z=soMouRIMcy`Y&VhUs2FAxn4jw)Od>W&R!x4mmw*t^J$)V-JA7B1J9J$0Tw_;Y=;T zJ8(*lxKY>ZUnh+H?JijEdf9bY)2^j0jQ;=^_-9Vjz9?&rExd8uLvuLZ#N}A1Wn={4 zoVV#zekQ=Tz7>LNM2xFQgp`n%z!^Loa;|(iRZx2s<2Cbpp>FEiV&P%*Fz#G+63=DK6@%Yzv9-@UfsXc6P;^TVL zYpXFd-2(07NmVW3NyhYPm@I=H-7(*(=xZ}n_@M6O0u`z}A7X83o(7CNrIE{7A`!yW1s zGsXd$GuLvA?PJh$)1E7(REpN-3MRFdsIu!a-|Dl;a`QBE$nQBJy(45y%;$MK;KZmp{i@R?U_?G^AX(P9}MAPCyhxtQC z{6uGhbH`ql$gjd!B(;b8Ur^O9CUQ*Cr^-HFLJ2Xqr%*fRiaoStvpQ)-OJgbvOG`g8 z-$a^Qs3QS<@_-j?Wc2mVU!_HKfuaz^q9tZKdCxfKpIYd3-3rr4meq9l1W?MS3W`e~ z_K!a?>CIzY+QlZ)Jn5N^e|SOZ#|P_Kw{xj08S~8Os0*o5axssajAK9KX12UPIJwdR zjh+0a2%E5WHWO1Iq%Qd6m==_UmVu?!PWo~#4k&Zz8bJ*g9 z?WoS<;m5=)FAc7%Z+?8IGwwpbe8U{|IV9)s70Ucq@otsk9}w8Om7Y6T-WEb|A1#oh z95B!E9%|Y6X=~#|ySlrYdwC&~=9VLX$&BEG!1g_BQ^P+GG|vv(EZS9~Y7(Jc(oUvE z1F0KN-8emkT%=}>LfwSO#7DP&LaLHm2aFOsj+v=swhft5Kf0LXKE02r{{R|>;xnh- zOpg)r{N@+~X*oI0I}w`DvAaZ)J5ekvJiv(KF1w^*&kOgPjFZPq)>kU`E?DXEOQ9%L zxZiB-NM^%ibKAB}Y502FFNy6w(71=q!vpH^z*23AKn*QDiWPI#t)msD% z4Y|#2_CJh1(OM+;6H4c5!x533 zbHEBRcszSowtNjf4EQ?m>YgvO*Dv+v4IE1zk8sdh5(goIm3Q^@uUGgR@NZA}MWjo0 zr^YU|3y`TT+`Czkcx*(!!T~rZjGFW-eQDueHsNNu-I(Jk7u_V_?c*8Ge#X4&xY*sr z7keXte~el;h)fgBKC1&q$ZOp?c()HwthwvQPBB&2Oq`RQKG@b~r~)Gc4_o;-al#9!pMj`e2w zPfYLuAO5QKFAjVS@bB3nw(zB%{MA=jjZV^jU-QHE@T z$Q>&yTK%3p6X5xvy`INX)*^~<%VPc}xFhD^BOSwZZJwi$dt$j`UJ`bT6syAfnsZwD zNZ-3%-8*cJ zwh%ZjP6tj46M#6r+onD_9v z#m^Vt=-&#wL*nlc>3ZCe%dP6#z0(;yS$2o!yJZ;JY6!$|@R%9KF<$TCPlwiD5Bw=5 zj);pR%z>wwh%Ga4F`q$>D!0LJ1zLDFz_w>ajZBwNZjyZNc`$LtdvV&j%}UqH(`S*3 zMxr7c0DOlZsjZT+&r+q?cHSJuS%Yq6JG0-8K=h@M7e!`GpTm*J$n_rMjMcEI_DCd& zSQd>&;m&eD{dFD0MM{8jOL2pOJu6tN9If9|=AVvmEBsj1Jha@BZIJfHRN5)t9`6rG#Va_5dQ#4*Dg;1 zRZcd?^5vNPpaMx1gI3j@6ySE6wv^gVk8NqDX^XG;lf=v*&~%LLd)YCABkunIS8j)v zW7U05E5(0puiEFsKeC6ypAwG{_^$5aIh^U9HSu1NDP2p%7fPpZhP*n;z{FQ+6I>|* zC09Fx<)hyHss8|KZ4dTd@W+g1@kfcm>+xF07mvJOrm&Oy8YWH9_;W=B<_-%LbVy%ppG7PA2gC4S&11S z3gyICRMv;Dg2E@OIUm}K_LA{O?QiiO4-kApw}(yBG^kCNhrBnZu{w8#tVTA$Zlnyc z0ZfvSx>p%E0abj_G*_N>AvcTzoObVCg>~S0kx(>fLhx|hV;qck_0QIp)4}r@SdavW zqad&x9zp*A>wDLaDvoaK_7qeVk;>|JFZL*r_K_q&^ZY>j`+8BM=u+N94;&B_XXb2Y zrh9wWOXEEdX%ko?sA%P~Ndp3ZdC3Hh#~jrk4_^Tr#v{a`nx&Ht?KU%%^IIm+nBMNcdx(`q5SG4^z%VkF8_ibOBjQV?0_O8R^MGbF4D`BR) zE*K#h2O#sG$Lsi3RQh=_ZU^Si%t#z_oc$}b@eDv)*?EBwh{`X&J-rXLP-{rqWhK;% z@(2e%O!w_Ws{4l_ook^;W563#M}9~oXRoI_s4Iq zwNGKEvWX-FZwg9~4$wQ1{J%P%;=R$a@xV+VIV&-A737`aztjk@sA z6OnKTQVNC#gXxcYevhIj_KE?OC4%Dv0AP>KwqVTiu|;eZz}|XwJPMmmwq(1F;K_aX z?eltL*Xz@ok806M2*J~QFos4bNGeKyv`%^BzxdXiS`-jkw3jaoaG?y(D+Ek*#^e0y z`h0g9hOG^jg%tM}mvea#THB$LY2-N@Kpf}k+nW0`_GbN!?Y+W3RxTybi;}g-BNdEWATk0}<0m~j`qu>U zGN|lx+V>*(z2fZy;pUMs)3u)$!K=v`5r4$yM&$4}Z_mryHRqoU{{Uu9PvZux+Q*Kb zcGKf-@utIT=3w}UUUCr5Q$d#h5%2(b2)TM;nY2Gf^T4@*nlGlWU~-OZH0eRo18CTRT`aVBwxS zxP0Q%6TKw6P;)%zk1o}IRQu0d=YV`8tbWlxG?QNaprOCEutZ&2(?qzNbee>Y-@CcI ze0z)%3KAA_F-^)DD|);>1s)ZwQ5%wQjtXx>{!472P1Aj zpL*4@hCwt1ROHB|OB@_$uekpJ3d_-zUsAgk>PncSP)X)9p1=OTTGnEkYe3SlOt;OD zPuKOwO5Ep7v*7;#jiKWB(c%v)Ail9C=WGLi4ZAS32Z2NV|J7jc3Bg%~Jh%i>k#yO9O zzqZ$pyif3^@4^~ZyK|;!x3lh=09>wBO7KUF=)&7d(jv65 zjvH%e)NF+Y6$t6T;B>|Z<6d2SLw@X8>|wBqE1E^*f++mW&_X1P62oXM&IwRJ>AqTR~(G}J%_Dy zUk?5t-TX4~<%fuLLbKiJgu2Hhtb#>hh8x%Jk~{OjuO|@)RuYQpdh{j9B`47KpZF=} zs<;0D@KO(q4`m|F3|H1s$0D{y1(Z979maY33h>t3b@vy{ZKrQ+AFp4nS@?(JYmbRP z5Ot3b-$Ws~)@}vN%9EKC{Gmt8KrBE2bpBP6_t}Yqf~9^^M^Xn`bl~F^7G+jSQf#?1 z5~uA-RY%@pKKHlz=~cALfcl)_Q)_u(VY-|iJ*kEBA%8M&Fs{%E&hKH^@sm(k+-}vS z+DY1@C_1;P8UFw|s!=gEmR3~Spn&buZg!k{_3K}vAMir4_J4-|032>6jhAc0!{*Kh z*j$Fk=k%}60jMNWIk=qptl&hFILj6w1==|zk_R00uU7aA`(wrXBHH-JNAYCZ&xh~4 zTVOn^JG*zWl44Rs^L)92vqpYxvM4IsP7emT@lcgmsK>e2hN&1fn>?f8jPgtH^Fx+o z2{T$o&I=Rs5t1|8lU+QsI$TC2V5AR`l#!4|PCvxg1*3dj@Rot1TG%g$w0PsSkIIb& z!pR`U00mdS9Stql?G@nIXObn=-sq^#)Pc*n_1oBI@cb*OQ+D`HSxZyAn&H_%i+Dx= z0Nwia^dlci&7R;5LfA*JppfJeNk2yF4^ORdT8HgD;oErR7EtRqEzwDYCOcr{@M|vf z_MWjbtdZz?gzIkM$d%SSfzWVIO!cM8WP2==6nEamzyu8ADt&mUwMm%hckH`K`!vMM z(Rf3HgXz7S*S69@$6Jz2nW`76kMr&UTo1-SkZ;U+I$@`bwK5c-E^%XLu zJ82u=u~g;DE4`1jf8eFAmj3|oN)Oro#HylQYPvufZGlQy$tUPnpKRj337X_dz2j9y z+*mrd5qHnA?T|pUzg~Co0mDkAW#8p$9l0D*CT6x5l$vwu@61caC#v?e$3=cv<<2C4?1pfePUxGU4kEV~{PlUcW>s~e1JU?xwUTGd5 zFxl96vh7A^mfF~vTTg^KyM^4WMq4GAgXvbD0`UI;?St^oSkyizd|{WJ0Rcb@(}Db5fc3Amzu=yK@J+7`d_UAY zJE?f`S*>;768KW~EkZ4OO@da@ZoI`)eWzSovHi(~=E}+himVy1GPUAy{>WFpFZj9Q zSiffL8Lz$+=y#x>5TJFi(d;9_%+WpLEVqgg8fe)=ESuB@$2F936l%^;rz_j9PrTBe zDx8~1oY%u20qcG`OULkrktV3xOd{g!MKntALd}5WJ1HX|@G?#g0mXMZg`TIJ4+h7>pM{=1_|;*ozrp*N?e%RkR)}gZZ<{?enleF@ z9F#{1<^0M=AZIn4s(aQuXmx=8yWo#a;Auj6vB<-E1l(9K2OVqgFWIwQ)8_co;K)36;Qe#MT9=0Oi|cviORJl`KH@h( zFRUlByh8C?yChyvv@8{g=!fR#{{U<+5MOxD;dEXB_!*+jYw)+kD(P*fYGX54PY^+B zEUq2aJVAoH0N@_xx~Sr*!cnHx+v;)A#PX=dPgCPh2Iv}Aq46fv{4~}VQMConm8eG6 zH#rOQ2+;Ke^aSUquV1s*6T`OF)@+uM$e>=z0+tg=k{C;z?Kl8&^sXnso(R)^9bD-W z>d-}fuU#~R-6YQ>RuUwE95Dk3%a;NA930nGZLLSAPcp!&@tNm&EvNnIjawmKa5-a> zkVhD&R?^tl>kd*$Gw&~m-x2h!KmHAGhr`-*&uyt{(rI30wD7zubq&U@vP#yj-|LYS z^2ko!_4(uBPlbLN@$bXEa`#cTmJMz>4ZWS@3{q{*i}y}`bpePV@J|)=FU4=#Vo!)4 z@JoLO{200N8#^Kr{>kORRt_2d$tW3McFOH{hys#;1C}I=oLBIl?QP-j+KWN(CxyRg zKMp>x;g1N5(G9a|WJNXQ*+3^Q4j8Bf6du@ zv)ft5TmD+CWXK=y4Z|yg^K{K^{Cxe2yczpKX!@P~o|^s@@eR}uDb{pbP>FU%SzhW6 z5=G!;hSu~Vy?A2WlDUdW>T!M@{{Vt;d{TATK0jZT}R>#J_}7a!+T?Jmh6bFD@awNSl!0J22Kb)t1MkeN>G!w(GY5mO1EseS6oSct=V8)zhc5p5(e)**+wZ zww&>T0N|YRdvjdysR!^q4&^^+dq2c&SlawM_>-qv8zqZh@TJ|1aRk85H!qf;1;|%C zb?4f-AKRDq(b2zX@7NFFPs4pK>%mJ4N)c3wjewELN#5hfL zvDrd|Cl{gP+RetN;Y;Y_)!}P@FqBR53(fj#k2d`#13@s_#*V#^AZF(hxMo+Q!m-3 z)=k7ps~?y*M936^px}YeAR4XV-xXN=UifrxJa3`+Uq($Lc-GYTZ$*O3P`wN=%jUT& zmMl0Ulb>EQ^|^dk;;g5OJbA7>Q7WeNX=Q;_0-$+u?PlZU1JIgXJ4gQjgfGJ%*#=pr zj#=ZpLUfs8l5mf|7=QJDFdQ~GttV3Ge`Jd+7FNv!mT0-!tf%h`F~jGaS2ghO z#fk9m$C_@hd!^gzXHRx>Wpu_k=G=^<(hBK&IC zyb1A&Zw^^_qe8d0g8IhKQ5U8Mk|mu`$f^eLvMyJgXRUn){{RG`{jYorq<+yq6Fw>a z(B3E0{u*h2@UBLmZ!V*7UVTbacBXi&(FW<{b+%Gtj1q9872#jCx5ljt_LKd%ek6GN z;e+4F;lC2=OFo}9^dD!qmI&=2gLB4yWci|g4h}KLHOYyDV@=Dc*M_Sp)a2-9O{jpu zq%6vxbVz-8+DCkh^{cizsJFO$Iwt(-0u8ItR{it%@bd;CEG&PthIS#QI{zN#Bxdy z4hw8n!1cv_WBW#a*}fa`pTvzrSMdg|X%3NbsOhcy#>`Md8?2&FP1ro1aC4rO@in%z zl1XlL5ClZ+JYWOJCm)Ee6XG4Nv#j`{+rr)-X1$A6h(&IjvJ|1o1pfdC8RXUF^K_~v zw^uXFX{walKS4Zk{{RIn@Xv#EMAS6jhgTjbT|-oRRF_Wi6_X4z{_U9*`HIdy?pFsL zM;ZA8_T>1lVez~6lkqo*^j$7(3f^fgAd1pyB6(0Px`r;$lOE-ey5U)dFiG^u@Mr9U zr}%x^U2nt^t6jhlEsRMBj#5u0o0h@oI`!tI@b|zuJU8MC%{tEN%Hqa5H%FF05X>Jq zAdUkD0G#%(TN{g(A#$_D!b90jGs-gQa28$1c;Qbu2l`Yu2w=IC$UahjZ1KCc52a{b zMq}P(^2O8-hh#b4RFH6c0(sA+MSRJBWL?f#7?#M#UWXOqw$_KxEmhHk$QEVt*E>!J zJ3$q*du5m{<%}oHzjPkI<5^aq!!ym0On)~{-r232hWkdAl0%c_F)Y8_$>SeiO4jBx ziIpSsx=ic`uVQ|k>Oxq=-~ve)`A0v8`RPoMeV%>Gxsxa590B?C=B1xylqzHdMIwce z1DujOQMnOEC9lF`xh&0`@y}n!-m~rpCp@1~>00{a4ARK59l?I-^&Yj6GT}i7HR@4! ziaL2(L^#Daklb~r5y|B9NDg>x{{TGJ$1@zQfq`Dz`wV{2*M9`QEm=nl(ZO$fa=7%dXs_7b;-6h4DBZOBwnNasv?SWkujL!@y9oSIeNFj;&91etf@n0qW!2bXr z?7lGg8uP%v6eSAR!Z;?~ ze3JPmM@r5Jl?MofRb8`lFg>0cve7?g1q_ea8Mf!lH z)tC|H9C66%I@Fe>V~FuDgCp?_+R#YX?Fljk*r2}kP)Hp55$+F4kGwB+ z4aJ_j;bxI_Jv@!Bha2(^S00399QFFpT9wb5d}-m>63WY6@IYqp=Bm#tMqx3@rpg=V zx0O#QLCD7iNFx=Jz7g^@8-afo*fj40$>STHs$FA=d_*>=e^o4F0RWNjnwag$uch|1&1 z4jJ%RjU+{O0bek2`bk&|@xYknf{OQnvA&xQR#JTH~1mOPwbk~j<7E}^2 z+|H$oHc5Yfd{>yH+?~$J+Sf%d6JALUjWWj_!@0m`Ry$O685!YyYn+c;yV32z^Cv~* z`D~fPAL90|ruyuCm5kuIY_htXWDdKBr+=+ZB2dLtl0X>g%VVj|duNK!#mMEXJavBy zKbtIbut1}F;PvA^ywrL&t#t#-C8!0NvGYDQoacf0{VTQB{1nMuoJb9*gcHYicxYcKLMUD6cVR;WHrWQ6nwTXQt#pSJ=>5R%RBNC%1;z-z#tPft* z?q30Z7wP{14gN4ity1kcb63^(UP0xuJa)T2Rp|iZKpelEO!xzn&3N{$;imBN zXtvT#G;&$^e$qKrMpVnNl2rE?Va+~h%V)8&_m$C=rTB_Qnc>#j1Qx>#%Glq7*0dj3 zvz-gYa2b1K@&N9AM_S1~8fa|U8QNx>k{xh({*_8E3r>W7@j!FAaxe%TbB|F?CJk8W z?{8Mt-KVz0HgJuc06nwmRUq*wdqrnKybbsyf^pFPKApN&ZQZ=qdTdKNxbm2@DEYPn z$K(AgGVbAQE#$nM%n}&dKohtFJm;~+T2~R?*{qA<%RNSS*%ke{x&_pI&CHEcqaiBIWjjRBph?dKd09;*Yg=lBBW&S#q+lr^!2Q5GgWx5U0ZYggmQUtSY@BD-yJNZLy$+HVF+!yoTWaKzyFllIj{cN+ zvO{|qidXX^9V0k(B=QD&uS%%e#1Xo$%v@w`4f2!RpF!Ic=rxpiWZi*;;DeCE+tRvJ zjt*CIelLhOns0~ArQB&OFuS@*yE6_+18Ez5dC#>^;E#yfUH<@w?qX|zW(a@LTQR(6 zIXy?s>499Xsj0@E9+9Km2}6d#z}?UfTy?G%d3S9=6PHkO-+OL51KYPg^;@G@J071i zqqa9Y?#DZFr|Nr*cJ-uXDK=%5L}dNu;BD!H`E;*3u<<o`epd*HPikVr^pn z*51W;O>uP?WkNw=yk&vU@Qj=exW`K1M2ux6nGco}6-NYt_36_&A4>Ee+3v<&YvP8G zAdYNXGftQTmQkI=cOU^)pqtpu)Ra|^sQw~ZB78Bs%9)Z!^JDpXwlJjaIRgOk+con4 z0FJEQH=gEo0L>`io)oCTVtok574?_JYhkARBb>jT9@Rq5016zCNWkgFNgjf}V)(hI zrkkK>t$CRmWqF7TgPr84Ju|dp^R4P7eGXbu(DU1wGYRY9_5Bo_P2x09Nd`u%6PQ5s6Go!>Syj)jN5PfzDmZts`-StOK}8(RuJan%0+ zd$7f3qkWBej-TNti}fFeFLO4H2J1Em^D?oFs_z)j@UYJtTdr%^w&7?X6lR#8*-IGXjN>6Y~R}GlQR)bRPAy z<4@UoYn$c2_-e_gyQvouGPjh+(NFhtk;u;`twUz7hD7LTj(>eI{g%1#%>f!v-Uxar1MYGuxW_KTmy6 z!Wq;2Yi%HfomiqA!r^nbF}F}Lp2sz2_-J~=AiTL~uQxL!kg)-njv_I?I0UN@3E*Rq zS=iY~>Azsl2i;r#(f$z8ZjQ@MI>$hFYTOQh*uCe{`9f?|6uF)gB% zeU+qPj>Mc-!=DOtDQzwEC|LP2#bpXhw3C9ds`KfSo@*NNR(z{(KLc$~oGKcm!uW@y9gSzh`d}=+a8o_V-Zfa7qQe;C=EsC@f2&9m#?^ zzeid z01^1VSJM0~9+}}3l{82!jPXe%YM(g-{H@M&^9&zPddc`(;#)0d@9cgug_)A&R}K^{ z#s~s7^ydJR`d6gy6l}_yO9(n*Xl6^)qTXWd+H)rQ+ zYLF$})9P9+t?aYP(s_=%OnE2d1a%ZuKOT5*Sn&3>FWX}?MJpUn5{8Y~eFi@+I?-H? zZu%W@wU4;8{Z*ro9X|d@-dw5}WGG7da7GFAuGhgI47DwPQ;jVpuxX59SNje6ODe_) z40bOds3$qW9`$#|UMP=4f(Z?yMgo*?BkZ!s;~5CiB8D&Y$6if&pO3yN_^aY7UEfW2 z;eQ5Lq$zFWNY7^1aiBlCc~lZvx|JB~jN-mtScNrs=pNBMVs)N4@lS+wtLZF!6*jZt zJzGylj%l?SK46<)yX6_nslsH3?uv-wl?W(b?H!oS7O^<|2?(lboN%xWw^Zg>|l7Y6)bP^KRV~ z7LKvPLFh{+Y!3T!#JOV6=1&7VNXtg_+9F=u-$t%}6 z!L2P5!y1%2m8P$8{)G#v5y=5Ymjr(ZBzogLE3W;VmqK`EO*-CteMW4|hC2~(WRXZJ ze$ZE9uR+&2>(;eCBx>4DuVJQLE}yDgYGLIQ-fCAct*V5{^426f)rSD&V1jYYX-^d7 z{hf(*EuqDKZ^Nf8#L`?_+-`9kN+Ogs&}@Uf*|w<1Z(fx^Pj&GQK^KDO@f>$C#B*Z} zqTE?qGT}?R9BktR0CGvsAR6VbJ|Mvq{$gqC9L>qO^NhVubR%f)IO$%c`#pHtX|!EJ z>i0^vyoP5n$0Nz)qzqI3S|X3$&c13q(3{RK_&@jp|lUnk86wyVbcG~xg?KIt1NR0DAbpaNzMej0>>Nq@eT^EV` zV4D8`izl+u?mw|1j@(8~q!P4Ou7e8Fqn=9>%W!Z9rE;I}kjJCy4B7_!%dkwFt?k}u z@|^5YK`hzMIKaWI{l3x5)hW_$*O}}Td)e;qHuu3xdO}lE2irxD4u8UUitTxwjTiIx4=*MPT zPK!)nZOgM|nc82O`e6S6cLUa-i^5(Z@eG#Mnoor8+r;xoBZ?4_?vQQsFxYLJDv~m4 z>SAXt6R|&8pL3z`x9rp5&ldQ0F{XHH$FR+EQKOYE4D;O$n~N1);Q_&H4oDp16<Sa}5KfxjwQU}j zXEMcOm7h-~KIfbmee;wg50}>!(0nEE2D9;JPgc?Gbxjt+*B@xV8sw}cE6GyW0JkIn zy)o}xix*ZmyEKL(Nqfx7@CDYL<3XqBpA4*|o(r32hVsV7)gy}4+i)fP*w2)wk;{E6 z*fdWC_;2Blhrh9WGvTGP)U_DZZ!RL7T{MTFS71VhUT|^fYtWNU)2w_A4v*pMd0}kE zBZuuQ<@TOSC>-tQzd5XFudJ-K`4Zbrxr*Ta?9RZvakBse2*5lH4}P_S#80a-Q+Kt@ zPY=s&XKANNC-(fZ!w1>J2qW60aM>BjIp}d+Mu+0hKJF-WeL{UY)SN8OYx76n%OQPF ze_G|Vtu)7?T51}Oq!_}COoii*e#sjp)tGG~8P9wHipjnByWxxLsn`2nGck@>FQ&Z> z1XhC}0UF~HF#wXveE_VRZJRoZ+nu+Ie0ihYT2E!DYySXkl3*TtXsz6vV4Zg`T#`>u z#=MVL_~otJYL|B26#m86;z$}FvOISyIOr6~v@vorTap0C&q}YX_)o+ao-ebrit}94 zbio>3Tg!Al#J5Qx$YZfX6WH!Nfs9wD{4MZ}uYfNu<WfpO)I1_!Sk zVw>Se8qQnzUed;SqP$}w+7^sT(!{Ntk-0(0=zH|$t;zDVf--AEK3#iEy}y!sTRSv@ z^?bCqmgy2W%7OE9fTzAjM`2UwOC8Rt>7m_=SsFd+;`w$n;~#X4bqD%Yy+R>*;d@yk zIwiH-nPVNiJ3}DP$Vusp4!wUGOKmdx!Z>EsrL=+s{{T=GQSKCl-JQ6>1o8DXf{$Y5 zI}54!I(N9cOO}#ZrHxkP%XF`~vD9FU9DY^G_>vnfCd*RO?WdQ_S5Reagi(=(jFZj| z27g-VbqzYlShn9Sz3dV}=1q0JA0q^gjlYKLk&Xp(-Y)PisMZ(K+Qcqlwzu7jhe0wZ zUKry5=Nx@K>%R#Ux&~?e8*&o?$T6=XU!~o48M#eI8 z#~!uO_$T51k*sMtr-(iyJ6QO0NNJk>^vKXP%!g2mO4kp4~)7i zi|GQ|d^+$;uaxmAOhs2Zdh4Kb|?P-`UsT z+IN*%2KVBk~pLH#SJ>;^r7yMuEWHlahLRf+{+Z#+F<~hyacvXIW&>$EdS|vjtt9$mS~&7|6ja>mt}w$m z2R?)Pb5@xRA31)~umt#$z@lO8QHcPYkUxjeAL(9Z(==N4o>3!d6=VT(h1<6|uU!46 zv|F_Cj5pTNOEt1u47fr^QUJh;J5-71wD3KHj%HxI$#Bbn0OYwKe4v{6pW}r3hm1ALI8TWo@eFq__N24> z6z5cuXCFNGd%xFANjY@^QE;GQyzFK&6jiUO>R{;mSu5yQ{iy!{Y1`l0i{b{K9fqBK zp!g5N&m#D5LA$y)Q^k{qz0@Ww#_Ld@CFGfzvACj>^E2@}t*nDrNfI(~GK??Dw*!JR z)A8eq&$6`%smx5WMfPX%$%(*ae&Yx3;~D;S>en9)WY(Rcw6(syxR%_^w)VkYq}-zn z>(?3g>0T9VM>D*c?Y1(Xu3&sv z(>&cD!v-vteJn8yyID%g-90+;J*yMJx=@@rmNL$)8BPW<>*x>GyZ-2looL&Nh! zZ*??MTgsb)WF4}QLbpIcgseWp9MRow5y_4j4hMckTWFZ-$Zm9)ys*RMUBeqx z9P!TK{&85p6f~EQ!JZj2ZU9emxLgr{M|1V*?OuZpmL_G{v0~2T3gG1SALsg3f5jaU zlfZfyh95J_)Gni9eqn+G1>>RWa(d>7Peu|}vE=^%*yKc4XP^fd=fD2|uC;U>CP{DN zjWF)mVh66yBKe61g6ByO-Htp(tMmlghR+fpRmei4zPId(ZuO7tWvU4`&xs&5> z4I8!7+kiH^7Air&J%@g^i6(^a6rN52BO8d}zY6rddrUGxXZCp)%nHjX+k=ky&u*En zW=$?jt>Y0)gN9%VWS+ner&>;IISSf7jKN(US%hn}xl#u1zz<*YYUjmo3$Cx@NhNgJ zvRT`FzGnvsw}aoIKGnP7`z8}E;Uc-tLa=T?{vvqCO49MpjT88q)%>J+gJ(Ge zZO3EMsZ`OEC8|8$PYH-6GD;LaM^JIssr@lpJ`?zHsCcVdTYV17>h54r%jCk+3wYha znH+(IKwCNEy?Up?pMZL&#*Jw$d@~@i)8H((dX%VID9j1QHLIO9F5&vhkI zS7uFfGNmse+B_=u9-OvE@6KzBk9 zJqJPW`eLg52=IhHAk{BT-TtDi)1pU{sKRTwV3=_@qysgyk#V2D`?mLJv1mzNQT)50f%yO zbJUu(`#XFyT_3~g;?Ee~oomI~=Klb--pGoHYJ=qv+oFxJs)YamI0LCXpGkXCL6w^f zNjb126YcN3CE^MXfe)6lbV zqFVV5akG}&$svjSYOS0l{v&EE+Z9fo7~lXoZ_gc1*NUSXHp%=y9{pQWc|Z)y9x!s! z51XL;4Rc=-d}a0vR*t~tLazIX1S*W=ufsz!)6 zWt@|c54Sb)U+t0mR%m_$@QuyS#7p~)D?~&NmQNb_`nGuuaIMP3z#W$34=)9p3=O^SJ8UECs z9M|y-yP3E=kW+cnEpr$4*U_VD;cOWu~}y6PXa zmxeZ-mp9Xak+m%j(tfRu4P?#xOlfw^B8yJdCcqwKnT>PbBj)euYsxG&kFzrkR?alZ z;1%R?{&}mv+g7FA8z@Qs_6f%yPtv(vIH$4Nw>=fVY9L`PX`qnt<$#jsJCEdRYfJIp zi?!_zEki@mv?a8jA2B@J^OCtg!g0^HwRrd2A&@za(N}Vn3>PJH{OZStd|t8J+d`_+ zNoxy25tNYNo}hZ;@f7LOrtfrbO-1}n^i5adSB*6A?L596v;+kq517mNlaOnc)&4hl zw%c++tDsN;2Hpf!UVDNMHA;Ub;sD0k*BwXz0mrGVy=u*&fsMQ&BT@5ia9bUFb*AG4 z^hPyOPeRP!7W_?kzv)`;pmL*t!FqiFs`ox4)wKX6mr&HEnCA-9yEF07VD&YVq#_4`&sh6(mMf)7j0~bHmQl4@Sl!I77%>=b z2o>{H^G5AD7c>7EVOW$@ShA|4<3eJt9ZiLQ7f zOtbMn*`O$)B))`z;z;+F3ab8Q8+aU7&EK`R!MS`v@YdhqhwSO_m%%;=){L@iF==wUYZtR*0F~P*Rzkqv2Fqsm4BTwZ!~<{gVCzcn{&cdPa$&d`!~3 zOg>@aFB8jgX&#{x$gIXYcy~aOJPZme05V442q1gs?LGTJ{C)kDd>-0w#Jv;F(e-^= zOPv$M+G%}4_R`&DBR8!N5X&So0wVjNh~$%s;C=|{J~Q}~l1HOj=~{N3YGAlFdgiAU zwxgGgm`MUkujYfbgC`qFIri?WjK{5KEj6{au@!Mu*09QR@ z)5KP`>0@a<+esvIS&OBK@2$L}<-l>Y2>BRZgEhkZIQaGBy%SUMJA6{mqp_dFYj30f0B73jaoRSS zAD8AlD!VeTyzVmsq?`lyL9TUI6N-nml-knWjH+U4${g3w_rHs0!auc-#9xJ94}LFr zCsNcrY2sT=Px}yf%gNIr(&4p)lFNT!O3SBQIy5Z<6Dl!`v}!U3$-lJ!0PJb1e%rnv z@Rp7HFZ?m^XTyziz?u{{o;tSs8fha-wY`-Ez1+8oe62>(2%wOy#CU%xik01!9`)gi zIQ7kQ!CE)O&jQ?hPrmTwnbhyRM$tz*_;c-#B!bBM_M2fL)Awdc-1}oFc z^BOpKB{_1tb-Q1k{`0)C;n;iys(4Gq{wUEj+sm1?`wMop zu-2|zut>$+Y$m!#ibq5b@+LgO1{S?XTkwy7ei_(3=BeSE9Vf(BdNsV3_r`fOE6E3! zxasYGau1OgoWuttGkxXcRtM}u`#5W#v$w0_`l*`ihMQV9RpMSwREo$Uidr1_IAJ8w)!;I_K7B; z8yO?FW}afV5X3?@@)v+f&q3r=RV&t<{jV~=PMwj#iM-_H&woSJhmSNZQ{hjKygT9@ zHuf(DXkx`s3B8{>i_y#=D|;lg0X9imvtT zD?o-jn;Yx@01@A{rM;wZBeXMYki&8}s|Q3yRL<5JB%IAk4+s2g_+q-2k>C^HofE}c zGTdIzr)y0wh&4%JlzFgQtie_rGPx|IZI^L7K*sLhz&{iw(LNhoYyKV8?|c*Ch*e`< zI>$=3kww1mF&U#mRu?j>ec%87lww-&U{kqr6)9#;I zxG?8q4>6pP_Vo-;?%R1J@BtOM`3AZ2G# z&alc_D}R+s2;&j1LEF@t^WPnh7I-Axwf+7ZKefT`*Qz zIxC_1vfzBf1JI2Lwv<~sZrbI!wejb~8fS#QDEMjB)k*978J;ZK9G>os3q4y91p~nDof3zp< zVc>h4O(Gu&UFshf^*EOLTkT_9(SP9;p2|jjwt^?Nj6C>>~(!DwuS*ICW zVyVJysV$Ee@UM%mwY_b$Xf;N=Lv16(%^t|$NXG@2_y=vo;N*9$O%PaXT2`%Z;i;_P z{?N9Lbhe%32^@&SD-(~n0|G$l&MON~_?360mQM$bDI(VGRx7&#e%~O-B4jJHZVtO} zr=b}G*KKnPOj%)*01$=UTa%R@poqw_ft!V;a7Zy zK)A}4+qiR%m6NS}KGQrU;pjD=3&JQ$IRrZU@^;MsHfll(R1Xin$L)Ji#u6lONmLlj2mj{vlUJvU}SCL~+X-#}%A-`H`K71O+4J?ObM^;;m~_(Gq_WO&kw(bXq%T z{Fqt@g7ELxaU@`4k;gS2v*P$QD{E^VQsBSZ<2KK4JYr8doq{3UJqrRs^!Kc4K4r>n z8jddL&G?z)Em^H~iKU+SO!9*@&85OiZz`q$ibhZ{sxWdeGCJ13!CxEAt?D;VeQf%L zp|}0=LqdW}rimf++t~Ez^(ls*Mv5li6Ye#|AfxrU; z{{Yuq)#WJ4?D`zP8yfdgm6_w$dTZIvQC(ysCvqI4em{>&pH0`btv23E9XwlH+O)>u zpt@XaVa8FqsX63ht#>!R8~Zw>*HNm)I3-v{Fi1S{oYgPv>u1$xc0cPQTnvnJ*8}jX zql$2P9+c@Sk+U*>AAZpKN5k(KMS1Z9!rH#4EsFshHoCi5c`||zo46x+gbo5Q+H;!p zFBSgR{yEj5)E`OvMxWu|7(pb~_OeF}^~_d^0-g6ecLS1sasm0U2YTe^hT3RuR$0DT zqGa5}62Nj45<3yrx?hI6Y5xF)ZErrsR#;()a^rwy1%U&RoZ}wV>eIx=ve9gL^)Q~z z-?`(~{{RrQi;GD^i`gVd@eFag?anv^lk%@lp8QrNmx$xkwOQ`GOQ+b~EOx$CyhO7F zAmw-+bCNS(YJ5^}0(?o)0gJ2=b?pvMCwQ9=_yN-;G}jwGAr8 zEhO;+U&EzE2Ay|m>m*UnDh#WvWsU$0y#6(#@GC@XDkT=d|cgQZ(W3XB&hcMJ@0M^1i&^R7!$)y9kQ zYg2tk5ev(t5+XP5;xddW1HNz%b`@GkxMem3ejG>Ag>9305^@bWR+L zf8B$U*-&`M&jSbXIjQ3DH2w@(HE#~XZ7Yac89db7*e4{b4o4u2_o!!y(N)<$cn2V` z4UF_1{{R!~RMI7BF0C3@{pu2%Msmle9lo{9q|;35oK)iC&a%(;htOh$KH1@`qRN3u zhT$AZk9Q#QPp7R=wEd&}9`_fY+puaj%y5Vj(WeZfj5fpWN8w&gszla$i^fC7V{W8; z*~d9Gg>!7cvnV+0k8@s>8g^{(ojW$VowtlN4IfwWE8h4KnCaJ88$6>M#NLdj{{Yok z^V!9BZ#D@@P;M9p3_s3mKf=;HuQW2T#DEN*0iL)8cnVc!>k8%DLg-Gjj z(!$T4JiUrqbBQhx1BE{$`-8=8+u60WD;)cR#!7&A%KbfSpN>Hl%d4G?#~peft#r}c zeZNPwn(9T4SmZIbRB{Iy$9^hhbZ;o=QMk3*%^BPQ;2dZ1sv5<+ww6`U?}Lt<;GF*e zkzGcwq)DS*td^6RqLBfOk5k7?8phU@mMK*a-^m9V?bILAh|0`}!&8pCpLjr^86!P^ zybo_`&%BI6@7HPMV05dOvA4}AA#iZm?Nm&jXagA?ho|`0sY_(d+q$t#sRxeS)13oF zxOE4bkTw%x8OJ#k0hJji1A*Hf)zfpG!sGywFn>y3pIVWiDC9RBWP8&9>z=e+j$0dF z4*Y+0@Z-idy0)68K^|hbgE$v3HaEt8qmk&rPip-@_;2xOd_wRxmGKwD5GJpvcwg_p73u`X4);U_G+-u-zY_*7|%F3S`i37V}KLRlL*hV_?E~Tx4N~ z-p5bIt0epNOW(Y}2$f47z+jKhKjhUv1l-#AcU86U){8W6;Xf5d`p1H9T25kqO~#(Y z^w>!%ynMU?^3>XPP5t9BbvE*{I=>rO0h|x5RF9OkjcAIi1&PoV;c_##@a@y-Obz6^ z0!H(arHH{NqMuLm+N)+rLw%g?nq06^Aj^@?(Vo43T9$CG@};D+ZDsR3#@d4_I$^q~ zJv;GOne!Q%CC$Y43oL5@Np2W9knY^%mTVEo7$2_{pvv>3J0wxBI8-@5`1fk1;p--U z55||Qv547a^5bAzo_WV(TA~J(j@LOk3~_=0`ug_tqSh)hJm*)Kd^qu=>QGxP=AV3~ z-%zw-8ad*|7%yVL6ONqmUUTDLg_hnMl0OYv+`L{G@iPmL3F?gM3{(8h+H{P1s;ZJR z+avgLecx2jV$|(CsTF1n+~r6pnd#3T{d)6>^j$Mm(zRa%d_`Ge&^5W;ZLX2PlTN!r z40A--!muhCeaF2IRMR(v?9ZMg)8(|hoY^c0Xs~advZtr09;g}_BpTL zX_h=lKw#q_f!KE(X1U1?<<;IK^WkXN2i`Hs9GrGO)lwf2O=hx9GA=i40lRkV)O4&I zY*)0o-{}iyb*)>rqXhFp&aEn=1>Ql=E$PNc9k{P(v+!1dWpi<_TKKv-^!H?*O$SCl zG;GI>;h%2c!z3#4k9zsn!#*UqzO}lzm069Z*_4Lb7o2n)^V=2GXde*Q?JT|^(_w3v z#?f{s2{2Xzqk+$_0=Z98~t&g}j<>rElT;m$1{W z(IkvXKKUY%LCzR+mpl@FwJy7*-j57v@Myjz)h4^Swne+qV!fB_=zA1R*dUKlf_WGf zls(4HV_MNsM;ohZ7P3aE1(Y_87$nLai%HH#bH*{Bg57T3+1fjnvX$R3P85YIv9cKmWh8YNBNSD}DlWlO7Z_-K^Pv1E z@dt@DN3qg0tDBk8{JBYy5JtoROSvE@0f9b))}`?`z&&F3K-A#U^$!T&>M3nBX3F1D zCRr6#ff4+GNC(%EUXS8CyB%iUD-znDi<;^QJj-n|=tB+Ep~?`3Ki(2SS7OA0+<{X3 zLikg!_yfW=PvXx9_{+oA@NHIOc$W=tGT=m~%G|11_JM=Wd)8lHd!Z~-dl7t2Nc=(j zNce8j)g7R>)qFn;E@BxeZ46AuBx7hLx%Cz7Kk!!H6x-_X_%lz5#JISc>yC)Kc7mjO zg2KF8Sn*fI4+Z#5uXUL;WYVEUlIu^NATQBag$z?>ag&hSf$Qm9@5C)jSNQv^X^x8a zH{vl3t)0gI04`Ku4(<5FT?qi>oYqoPUj{T!1JoU~xb*{g|9tH6u-^)LT^viu^^t+$4+z6$PRDxhWXq`&} zTLc}r?kihS@rA|j+bleL;cYt7eKk*!Bv#%`wprxHS~5_p9uFrK>V0A_NMfHUE9f&)+F8kL^Pk2OwZ$K8CXfN)iq`eB1zjwWMaze5sv2o8volMFs95 zTn(tFh4%OL&uaR2_5#tziac*~sLOX{cWxpOq%6*t4JQYBjBRxvKJW-{Kx^Y+eHzWO zDdH`kx)@}ir}VCmz~2#dzlU0=y70B@!W@q_+)Bb5kU84HNFed|h6we?6|8F6>Sa19 ztq;||+H%@GFX4j-OivuL1@mKbl~r8fSJdEj74tvs7YWm5(QT3_lgiRyIAU^3<%4n1 zfC$fg*B`2W-`AfOJRziMULa5Oi+}k0xsgWoV4-%qb!6Hw9COn(AI1-l+E>L-7d7sf zlG@svSmTO06gKu504X1P{{YqAx_Q&p97>adIUAdgG54r0pyioY3I;gNdeuagu5|^> zh|+}II3bZnGEd?D6)etBktCjQVUkpnxci?$=}qw9H@+i9M04}3Wt3rvJQJT$pT?>P zcCq#^?8%_TrhGQG5D5axcO-1gbI&+Fnf3IqQbdx|GAyJtjAIIpcV`5K^ceN7Tj3p< zwD5I|cBVv7p<8q0k_RATsOPPA0b9vo0h}Yo!-fFK$m)GRop!B}<<0xYJLAs}*?8s$ zi^PykBe2~VR##PE21zFelk*;W*N1rT_H1jP8EDsfMx{DMWa&M^H!S<42N?UKATT^v z(7J(*?*dPmH|+&T>bT&8(DPhhk8htr(={v0msrKUyAskk0EJd3sOPZfsl{hfDMhq& zP@8Q%;|Z=9qw4 z%B~l91FnBgyjRknwJy(wKk!f8FT+<^6L^Ef`W28Ypze;!$?u(+v;E}?dYq6w$Ic%P zEz8Yx@30g*FhKqyi#&!`{=$iHNi5R%kE@a`@f{C67nWwuIL|N^y|3Dm2HS?$s+@WGr+h9Jg~_*0CdGa#u4jU{k#`C0N2`Rw&EtZ zi4niN>ZQY^hd9T-y=7`vw*dMK=MJ}ta3(i_qpSWlJnrlif$SU-xBFpw|;Pv;wdcQ@=SK<0C^fN zk&;MN+(@O=r_|-wY$3n!&if5M)%KlSM5_#>0q08TkmLfzm2wV11XX)S6``fb!rt;Lsl1~q>Doz(c@D+Ec8tV;l`I2iBw*(?nGcI0)MH8YO)pFT07-cpKW`Dq z1YHWHzDeYd;^%fxrFu+$F}3i|hAr&$D;f10D}@g^w?=tw%KrcofC-HbF|=S{fsAIK zb@4k&@coUwrlFv}+b$5gG1J%gfw8oObjqH&>@YoRI(3qj%%>}(k8Ll(up-*tXnLa? zr)FD;P={5H&Vz zy@ZT}hm_#39AceH*S*NS)s7>=ei`vruXrxC{WRO@Yc56Jp$h4+?jZc7q$IclJe43H zdg=TV;f+_}qdnG(;vWG(ZsQiwy2$#BHzB!QgsLv!Ndd82*81JQj5W))ky@g9P4n^twlvJL-(zdG2GCl;97#ibw!`E0nwN&Gx&i z-)SEYucgw4uP2x>rxupoM42H0z#MV`^&n>znXUXM(tJf>ES4TH((NWmWsv#zKpBqU z%vX_sGxC6YS7Y$c;LeGr+b*|d;yLf0ET6W|Ya?6<83@@9=h};gT>PiMIXS51wx(Mg z=DqN$@8QMtS04~H{aInUw0m@(?@dt3H?HQ27{Oz^JvN;CRXqnq(Qh>I6dIq4E+q5T zUn8S6N`c+1jR+YhkEDE^a1tktbz}HX=W|WRS5!-7%4q z&sz1*hrbVxh^*qi@r9fCM@d3$2Ac)pxSvrY=3+@1L(fspF;wMssc7Q94}3aXjYh`q z>%`w|&~#Gvg2MPa!FXK=-po&!WlZA^SwSuAN2~ZxM$<0ziLERlhQm&?bZE$P_I5|k zL|gy^5zBIE*D>i++QkL-n|iAQKb7T(;)p7oVVkHWdgr}A#=bbw^otp;G*oSIt>6(c zNBdR1xK+Z2*Z=`XAI}wx+?!S}rl#^U+Ng^_zO&NeNAltm1(3==iIlqofsBkC*A?*- z#+tW>ZXl20;;y4=mkT6}@qL?6NY#OJ9^wRmf==&#^~89m;+4OTZd*@+8v}Tf6lj%8 zsyAOVaLV8*#s@+=(>x#G%}z~2`$JW`TfodVT`T#EB7jr`X*p5qKLJ%3wzVeq8L6(L z<0)e{`b~|!r1$a&AiMJX+hSXG=Wm-W$!*86HP`r8!AqcO0&fv%HX6XSw2~!wl$iH! z060tl%sOu;xiz`)_rjK%d^cAf6|%FroKLc8W`OyxmB|g9?@$ia#~jw=dak1iV@!(P z5XFIrS}d06m>5;ucwvsGp{+SW_ae5pf9x0}wziwixmA+Z$V%@e=^ygX<{uy&@K1b$ zR=iJTsaHN!E+6!ZtS zMg}VrQt@MH_d*MpZlktYGaQAClP>#sC;S#aQs>nW#3Qt+tteE!@#8OwV$GA0Y&1Vy-y>0o~K4%QSyxS&$n8q zH;YX6Hpz2uE97F`m~0WF92|l7v5vT`*}PQxVgCR|CF6-$5M%*IuwTcgZ+dZ}($IHo z=m3Xay=CzbTcZ!}e$TzkB$Xg+4bUEYH0?JP%6ua_qWyQ<~88>r``ml=nM-h29pj@mGh}SJ!5+(mXY#S_{2P zP`Dmi!?i(i9Gq_VBY-&SYtZzc?8D*xBjSh0eLbyw8K+Mg_!Gf@XK{0{-G9pq$>Hi) zwhU1?`37D7ZJ|83!df51ZxehM(mo@6Ow@cSrhF6dY@cY+Y;K|1AB-i7h$nR)Gs0Wv zRp{qyV1bjh@hkR;)uX?)@js6>ojYIno2l9a)2!`)Hhu@RkuY2!BsJWF0Y_CIuhv4E zj)vH33WDZ)kbGD8xvLL|+KYIK`sgK)KzG;2q7+C)Trm2z)7v!Wv9h+VHtLoy>-2c?y}G z8wANK5_iZ+$tR#S=<&nm9>y&h5&6Q5fzIp*57MU$$xboogfVpD19AtrzJxKNU&1wsUg6Vk* zc9sCP?32bb>+SDWmCkn~C*k{>j|eNnwmp+brX|4u1JnW0c>31tx`+0BMG;`Q7!Jh! z*FJ<}J?owLaXPM@bT%phc`#SycMwK+?~e7*K!z#gj!5?`nA&$|cs|3>@l=33I@2eF ztr`54wo!oUHxbSPl75^YL+wuxJ-oRRC?xJFkOZB`^%(yE_0?Yvv5Ug6M-#eRICTTO zpE>KEqtnxh-_f)~a<>hs?6K1A5YKgUBWz1(#!20thxyeZ^0s&gS<63Xd}@eP!+Ws zql|7l(6b-mV2E;9pQrx-X+IBmO6S13cf~J`Hy$Ou(JiKHUx&U6(%=VB@x}O3%Pg^D z{aWm1%aD($NjP3T^h}G8w{gJG{(~7Y%f_Pkh{nT<9htOSBiK`#hNyro=%^o zM%sM0TQwWK4J3{7;}Ib!*>n!W3V9&(=B+bo9|k@qi|-ofOBaXlt@m16*lIFaVpSWL zcb(L?&dj(21KXd8#W`afoSyxSl$u%^zY+fcvVJ06>K-ES+}d@nq?4I7C~YEhZ8&Bd z0CE*WU=RoxJ?p&iU&VE}eKywg-QLd?urg-qFpDQhYB#IGfAf%Mp>T(q(5jREMW$6Pre0K@o&N%Lc_wgdhOn;;mPdu+m?8(RU;30 zRGh}k=6UF+45tGi9xE89%gEi=nXO8$t&@8lZ^Z8u!QzcTFT|PdZ0=)~L^oEJ4IDcZ zZ4t1Mj>H)Ipr2aeZ!MnI^`g3DlWQNICoHT_q3$|+XEimC$GcAz!xDKzMh;RHw z_M>+#qgpaUEC^YGh715Hp2LyI718Y)spJ&#v4rHMwalvn8`~C!W!zf|;X;PU@Adxx z>r`J5;8EZ$GtZH5xAK9oZ6o(Uob%65!!?!QJHN5$*Lro-^G`09b1XaVETyz!fsVj8 zj4;RX0zs~(e-8lpKnA~Cc%#6jFEs|Xdp$-X1XiDE#`wrN0|Xr79<|t=ley@+iN-SM zdHk_Nh-8d5Tmk_&E;@tt{*|ZUYdGDQBgjH^^IkRPIW44u zSV-x-I2@iaQg}l4SugJ6iyH`y*B>!pexA6+WR=c^Q8jdLc#buhZT1Idg(D{y|LW(PS!^n=AUGkBQ!yIwxUcKO7*{=8E?zw4mtTR}6cFM{W znrOz`oA!L2u~i~Ns>5hXH47aa&Cre;5ZV<-BmhZcdvA` z*AfULiRHCO?TC-aRw?Bu#uR!5$6tEqt5(ZHIm|Q}Z9FY&ZKwEV*|gg`MLR8uZ8G3s zvHtTO=bE{xJa@Vs)Ua)p7T#UNu~MzD31F5d0wyUYYJN9+c8rt=vvvA_><04SmeV`I^^uXtjO7__F zd9D!29A09n;fTvI>7ReCc@OOKqNJwK*`b+;bY8hFw~mcb0W&I`umd22@{h0QRzmlR{vTHwHMEE2R2yR* z1_3;0y<+P6gnCzwbxW;ARkydc(^5(9T~1J$4?sCB*eK+jU{>CW_V!*Hg6jT8jtH~5 zRt1WNd<0bfCS!o0WSoKCz9jzuf}#Ha!9#6-WYaaLf-n5Ph|;4*B8z14cwjn^gsXhA z>MW;lQWQ2|a za7!da6oGK^^MHRE{yqNCej@##{8w|U`1bB+^Cfv;w=$PVOLaLsvz%p|^*sWN3d#79 z@fT9~iQ*aW{7rK`#PZ7W4>op~sdg)xbIZH&9K&OTj(ZU;~DYdKqKZ1&=joDu;CiiZ__j*HmU zp5*GDT#37e7~FC=^!E0vQ_5wTw=hsh&ON)$F(q@w*2*mNXe_v{Eg=A}Oem6$g(Khv9 zyS`;P7#+qyq_$ym(mVnCKKSqA){_>e@Z-Wd_PM6de;%Lq>sW!dONm?}31lQJA)JH` z`%tk1c5BnV34X$UA=G?ps@wd1@VAL{4L`&8YiWA3%$6)=GMJhM;iYLy45CKAJ~O*( zDLbFDhl+e{`$}uE{66s>r|~_09_qI0o+^XFYaCx}j23v!%gBNiR*))y{{SE->yOb- z2mEue z40rW!7tdv9_E_$84L?-Xrbe-XS!^Kw(7tDXomX+hk(SBZz)~`L*DY<~4-0q)O1|(H zhix?dX4hCKFFZASc5hMz$bUIu2W)byV1`rMAYfAZ?73q;TVC26lB)>lkzV&ikHB6r z@s^F@+f5f-lj04YmEucVjV}KH?AnH%8cbw+WdIVzUmq-tprdp+H9Fncd`$7p<=(le zc$38%*0-kGX_|!5SREToo-i248c)ZcKG`-C{6TroO5-&h4*v19YafK(8JECM1_C7Cx2rA*F0jaY&J>;)#TaijRc@9nK~ zcXMy6ELOKR7k9031--OVj9fxpfr(BEkhljUt#nh&xl)SN5~?{y#+QO_ZagWg-Pn9Z z@Xn!eq}|w?(Q9$!KA)wFRotFaqwZ+gk&j{yJ7&H$_?@m_{9gF);wx{0*4ADj@Mnvf zFB95Y!FrQlX!i>mB3jEUx6C7Sc60@S+_)rH)jk36=7XqR=~o^J)P5?*Z9IJ&oS2Yi)gVtr+G- zWwE@1K(VM+KQzFclfeSLoGovxQPkBgdVHsp=-v|XXM+4?qUg4Ac&__S_=6DDbvWR& zouGDw#7tf|kTgh*BJCT10A!LY-n=Pk;$ICev!?il(mU9#V-Q`wmjh2EL1YZ3X>y=# zJp$z6$vr8*4n7{(UB@qubq^JIlTm|6)9b^SL~j#ehd-fg zV`J97w9}=~{7>;R<58PS@W!L!uL|pTR#qC;q2buz)URS`H>@zv^6haKl^JINw<8h5 zR3qbNkKsRtdgQ(dlc~;PQS@GhGmybBl`9Zv5QQz0AMcNA_f&#NQ6I zj|co9)LX;88t|*5>N@_tsN3EBs80*E(tU{|5EE<2nc}Yj z-OZuv9vPnU_d`oPTJAkHwOu|Nrg9yYBvAJN?PQQC8wXMia97_Bd>;P*v&W7u{vv7m zwWLj;>RRoMvg@}tw$j~1pjmy3$jsL9?o%43HnO=4IK_8T#L5juNa&?rag0+xIrLu- zL7+~$zr;NX-%HbEMV`$qjF1~*(k|0%4js{3DU-?(gIQk^d{LtK!UH$M>$ygyb0o1{ zSl&CyD`TX~A>+0JgPwV>N%3dG-yi&C)Q#q^qG;N7jSbRi==b;EX_rVM4cnxTC!Bv2 zXK7{!2a{es@dx2|_C~jKd@Q#1R(egLyfSJRr_N=IA2$8CcXr8CUchAJ;=LPRbEB5; zQ#L(j=fdXJ-fcfsvo9c;(B95Wa+Vuef*+87yasVw8g_v_<&2N4+&aq?qC2S@4ys7V z1P{8TbZ*~`S@>0>YdVF!)%S^D)fNl8qMyFCRYo8J;X{qf*d2glITh7vdc58xw$yYz zYe=-x=DM>oSzJa{(ka3D3(jyzDhOgm02t&*xWOEk&F4Oe+V_jC>eL@Ib7C9wV z!Z-wZgXz+{%TFCYg8VvemR}A}ZQ__C(}Z`H&n?BDEYe7Y8)!Q)3F99vd3CyJx<`oS z(tKkKsSCoY3X&YEM%l*Z!QkZd z;1fJ@{pzYk&rM-oQxut3%<@GHheMJi|+2)bOqT@!6+9tcZi6@p=U*S!8FRtxxBJozPlH6SVnpokKA+?O0ERG2Ihtj!m7L%t@GFTa6Qys*L4^6Fs^W!-kFe}pZZ6;3@_+C5Pn_Ee(^+ZLEVQvmWjA2Rp zgkuei^Ilw{@b;5FzX^?4pLHKG$>J-U8{Z=2MKJ>eDI}=D;~i_a@aK*$^gjt`sbV46 zij6d~D8MQS+DG#~wd*>E!Cfy?xJfT`&-AH=*gV^D9Hfwc)n^0)f^p9k&f9!K_)TC9 zuCuAZX*5Y3Q(MbpF)J#9Bs;d?;EZ}#r-QEwiqMa#SeVT;(Q*1YS%+BTV_d~osF>T=7aL*cIs>NgBbi0ve?#|ofA z4jh(~j`%t2n&_o^(rU*&St@Z_nZFS{bh`flgrL;jplhr7ZDhG{GK%IPt`|LyGmhA- zpM<_9do)&_S)?`+uE@^{@w|a|5_)5C`c-cOYmH&3Y1W=DwTxNlcA@8$zGYm-Lbfr< z$;J=Xxt{~Iz2}9m+f|*D$hVFJh%S80u*moS0PEJyo`;(%&i724$5TmR;w@GQqB2Vb z$U`DFM3M#}Pq)i~_*b)NYBenu31h^cC?&>DSYQ$X^gXM?H7oDz>$@vk$r?Ca)=5?& znPeHu7ANu*?>`0nC9SuCZ?)#o^$TwcN38zdnpV-BM@YK0zL`>MPu{?BlaA^~f2DHz)z&Qnw5&=DW2SlJ zS4Delfg(2oGTU+teHdqq`d2yPn?S9;+?gr4r?vB%6Z4lAZFLnj?X+xClm4Ec%M+Mwhx=cQYT{GcRNQdHoN zT7p6un2=N+)Z)mLNT04pjrYIy`O`MaMrW9qaVNMEI>1qoP~eu9&`a;PX5u)vC0%XJHbfO}UN7%yJxpMtw-_=}y*U&Y3uK z8HqBlxM6`RN|EbUwM!+^@31ElK|D(}tjc#qG%bP(Fzb#-}BJ=H!WcECo z<*iNhHj6X^TLOVc^OQga!Pk-8deZ6sEwr9jOW0aiww6G{ZVo??v|Jn>3HxWGAH6|v6Vat?b|f_Q~|A7^U11SUOF$y3NbXY+>QHWFBJ1~Nxr zdRLohH!W{G_S&7nWk)hHq?tnMa0>y)UIFi#?*1O=)*ldcCQIE?I}3YQ$}AJ=A{nHV z;DZU^$=B{@n&+A$sn~cA#FpBYs?m7+PFvr!v}F)l$kRgK#^~FzgX@4mCcTqM@m{H_ zYj)R~eY!rAr`j0rwJ2jintB7dkp!o7kFcGw;DB;YdRK^elR(yfA6i4GYMObK$?}xP zb`mx`;1N1^AJi_d?`)-p=HXHs3rNdMiEuvS64(wm9#e;7jn90rrL*#@OImR#n_u@+r2>3Hd*L3-{?+0l%R|fbhhmfb00o|R1DG~A)rbs;w zD>-4{?BumZZQ9o$@aM(3F16K99mAt(+6hlB@5{*%z;0LffrOFgsqAxI?yKUK@n*AP z(RhPIzVPctS5UZ~=Mia*jmYs5sPd^?u0Y`P+M$y|@W+QV_)mbp;U|jy z;P1pwpOwkMAa3NG1Is?3{M!`Br%Dz@RuOlZtYYLN$ zlI0h)=Go|J%O-;l!>R5(Ijh=5ZKs&@oe^%dhG%$YC7$L9*+G*TBu;nkbBys^7mf9; zOX7~Xe|@4`+T7XOTBWQO5XBr!5(xIR&a2g%1nxYxdFHbq_@{rQYm;Ai-&DPO31l!@ z#b9J0xi)W2yPDn=@P?h@IGbAWeuZamr^z7*E#>m9i6aa9u-Qi>5Cd>e;ZM{)7wEn( z@w9qp!U!+4=`Q|8TdTFXh893tLd1N;41WndM?fnQ&%>TAw!f0f+EEADz>4BEVDU^? z2?9(HC9nbA)Mo&U)xQtx-X`&l|Zb$;4whrSmSWqSNd=nQkXk4AG?7Se+5a?*U~alkZff@ehJ@k1EsRew`19 zwI-PP^ZkwVyS|uEW&4e@pd5A2y?c$PgZwd}_y+FR;x?A|zAe6jHJR)+iLR}soJe=hOb-h49nsjFYw>G5k?J>|lQu5G3Br;;`c$Cog~Px9cN_#HD> z97N@G-rbDVSu!1K!2S=^{4H$`m2dF=D{WF2`zen^Y4v!vU~MwPF4mWKe0<)O<~}O$ zzlS^}p+eU3YTw$U{cWA*oaq$!J6Ojr8*$X5e8BPAz1r8{l+xVYYu*5tO9`o};6U-o z2AD7zBw)P8;E)&&xb0nU#eV^48m0BNpW>Zg#9FPj)KN6|`jzA=*5D1#GI>g&cASC1 z$ZmNRoN=x#bIG()uWi}##mC1@Ls7H)E!D4vn#4ooiz~eyCAW-Y0~`kgV>`EXJu8;f zd?hp%t97S6z3fsAd86s0O}CN=?O^g2dsq7^SfJcnd|AYZeqY{o=DVSdg0i`^aSAp_ z`I|_+Yg_4>H*g&rc*Zh&3{;vgkFIoB1W?WPh!o{fjtI|O9^BOTo*9b5Tf=WNN~;-H z!Q?jXI`tjv1N%G~@$+B~a!2_!?m}^CG<0(FtDd*uuZS_~cI4ZMS~)Ns1ANi(*1K

&72g39)Vy8rYvYjc_k(;l;VJHP3wdnkTRUZE)FNor-KU)- zU}W4u^FF*1YmWF&@Eb|^YaO47e`v9(SzIs^X<9UX9~!K;=;(g*ZJYq7e($;ia&umQ zd{X`&(QfDP&XX0QYS5VATSY{ZLq=hdGzo-R8!N!dsXcnvCMKkm*DlQXtjaX0&Bh}5 zuE$mQsi61){CB6NrN);UUf52Be4C=q9qp!I1F_p0leA!dVzBl90Ev3$xp$*!-X^_^ zOuM_(E-oyZS-j2jvO19iFgq8@B>?(*=Bevnv}C^wEUfe!og2cQB}*u$xwN{w)nsS4 znpJdZ9H-r6`N4>Q0T|!`T$Pu^eN*A@!Hc*Kr(&0OaX}hcUnui+D@W*4crWKE-1x}I z=RK)I4=Gu{k>abiaNibxXLaz8i>;#Y{CT*g* zj~ssOh8eSif_fV7`pn@^p4)xLL}xBk>~Y_+*8mhj>%Q#&0OPNRI@}tDq2NyuH;FIz z!=Z@GZn|>uzUE!8n0B@ZCzj|rHTJE)#7zrO_)3yTFNZuv)?OPLCy6zS-8H4wY_DdS z(8~nq;!H^_ZcG4z82}uBE6% z_RV&)ESE19!q|;=Z`uh29CuemDD_waW`_BKuv{G}(0d{{XcT z8AC+2_b`Tite`g3Y;JZK&QBFt`)E3o_gd`sIdL4*PDt?o0Er*7hmGX$J%)whonG%& z)*Xx7L8R%gZY?EG^-@hcOXe_|G98W^X&ju9pGo*-`zp=gN$rM>tz7t%$2T^KHlgAB zy+i#GY*-aQ7hySfMlHRD&;~GgIKL9UE!=+0UkLmoCyamLAMk9Nef^D&v0_7XE3IQt z(IN302}jwkuo%UtteYb&hm})_KsXh_jKox@L!Gvh(&=CPwDc**mORqXDdsd$fGx0hbL(Dbc4`)=n*%Ocs^M=h*j;AsJzub5d%#5XV}o(JN0jC8+^ ze+j%z;V*=qDzu(o7HVF3n)Ae07J8%>7TY7Zk6hE$e8>qeB$2?S!wtmkhR2M!aY~U8r6eX{gGu)4c+Mx#drrc%JV9HrY)*mI^kpufN~CY z{ulUT#s2^wwW)jqp!__SPt|lwMVnpJ=4R8Tk{M+y_M7PB0gOA;soS^^11<%9vvsBa z0K&@9^{p?#8jpv3Pprh2TAzomX4Nm^)AfsWW*2&T-2hfc18WGvlN&JP1ChmiUie?E zYF-=gU&PCQ7ik_6k5^dqe;fF28-m)(Ss|4k829E`OTMiJt|0 z8}<(!_%FrrcwbnEYI9y`2-h|`g}h12ytdge0H-bH>;oC-GhHlyv?ibMW5V+INA`ZT z@g}LM==V2wE#ix7SgviQ(_~HZ+`t%OVyqDnwuDs#kVwJ$@Ah-}srx{DBGaSspY12` z=TNcmclJ`+X@=S0(Zu$k`O{rqK$A%n?#ecfcQ)1rAQ&3-y|m#MDaTL5=t;)zNcn&E z7Vvk$n?D81;vd=rLcj4hiu_G`J->#oEaIN#!q&z(6 zBj8QX#(xL=IFsWIhm5>4qq@s|Yoy(Hf;jKm)?|_hCRBrWlW!^`?CaEUypgG;cxKnY zllYRu_IkL}^bdtzHICHykHeak!|L1h3%MFt@2zIu2ApP*<5rA@jD-Lw0OyCi@J^xd zpW=nbf;4*{5m|Vd^r-YHF$k>32XiU_%ERNX*?t0EjPn9Po>Wvh%fv@KiV#}2`w2HX?b$K zXO|&wHY|n;cM9t@{{V`5SHn9`1Z&bz67PRPgm}8P9X{AL1wc6O4RQ(rh#xD^r5%dntD&xvR~y zU(+;=Mq%f|5>;V+Buf&-6y=7%rH1AV8{nUcKM(vp`zm~2@$ZCuFRj_?ml_7EccVP_ zPaKesC~tN1(nS?PWx)3rTU_Nej3w`+2ID{-RevdgPo-rP-f zC+{P@jaQWN-{e?$jY($c)rIk!;e`JHvlhSbd&hbvr{Mnp6>1+6yftg%yBnQj{Wk8_ zR3J%dduhBzTml>bKy8NrZ3Oq=Y1NJ4Q(nfjsLiJtYI#Pj@wzQrN3pl@O~m(d#R@?+ zq;4&Y@yJ6Qfq>k97fR^QkF>pWU7GqWDqTTkg_3BE{7EAN7~K+=`G16DE;0poUl6}* zFZgZG8+dxh<3EUE@a?XH;d%7SZAGmiiakPie>vx!f&pz8%E!wD?EnDBIIlAJ&HE{M ztKsj3^p6tV=vutr4>h}3ue4ou;bVdu%R+$p>lkAqLQfuKfk`f-71_w0u2QA7jfU}c z?fsHiYgRhfhji^{${HQr>4jh$2h9`6gn*@oQGy3wTI+lgJ{@Sfyc77BS<~)yYl&i0 z6@$LJZ#0NWW|H1D+Zy+x?nkQek-tV}9rPhivdgMWb3< zcuPdmZMn-byZ-88RA3k_7{j%DiVBoYVBL4(h+OmxnFVOQYfGd_4q= zvxt@{ZzNOq-zl%b#*J9OY@gix;*B23^rMl^=K_cQ`G0B^7 z2bCO=(Dkg7dt6$hk?{t#1pfdNZW~>jQn-p-`F8LVX)L9a_eEIXDs>ngan$Ca@c#h8 zU4O>j8;t3;_Dy+nAd=iPiE3UKJ3Q$mm4+e=2*AnUoEqsLTeZ`4eKS+nbWJl`)GeiW ztf$m$WptfnbrHzYrvX%-kQ^RJ80NHmH{z{p!f<$oTd1w|3q2^k*$o}Msir%lDx{>H z+X)SY8R?$2tCNaO3gvTJ%=7Ti@ala}O4qOK;q%#SZ>Nsj-Ta|W;S7Y}I3P0M;Pn`; zf5N{L4wI`vH1_&j7I!XP=X)P9m~3Docjx6T^AU{X=Qysv#oi~;^(&n+-@_UgJKljfMf}l1ZR#7VfeG-eVO=gsCY{IMUzmtxREBdpH;O;ZuF;R8>E0i zg=S!@g5#k$>s|DdlGPnl<9$dx6@PoEtkyb>$A+%$V7HcH*YY%L9BxmT1b`A1K=e4^ zRZTYE!#e6&e`nex_u75LpJ@9)f3xb*xeAPoPs)e};D-eMwT2i@dXPo(@C)b;-W5kWtKHBSh5p3_%dvc(w*1o!$rEB*x{vzo!X`U;$z0mXvdtENd1d3a0NxbMT2t&GMPvG7Pk~zU0O>mE` zO*}EdG?EBo{{U96jHoC3zys6Py$&xA>l%KYtLj%)pJkgxnn>>8@?11gkK-JHBtsY^ zbAyq^d7ab6brjP{wi)G=vc!sZl|S9~9V=RG%SLGn%X0mtv?*sVnf7TUBb3e>Bb*L; zA6_Zzq}_SL`#w=Dk&F?vj(d!rKN`)@?rp5DgKD;>>KqUNa)f(|==9Bc*2dA7Ok1g6 zW9~u~yv%@iH-4G=Q<`Y0M$FsMG>uy4Qqu;vrrgP5C5`3#JS}hv5&(U%<;xZ!eo@}O z)c*j2di)Zf;{O1H^&b-aIkSVo@aUS$>6fx5t0O^h_ytl+7gEv60sjDJCmfN*d}Z*@ zgK#l;ZKC3e~Mlw{{V#ceLwyYO+!z%w`*(7Cs2;<<1&K<<(

^H2(kwX?oqZ>upNjeQJBVZ#m4V5|vOw{{VYCMl+vW^IOru z;jotWa7gQ`nBp$tq(l9sc44uGR*BAD;oD?Nrw1VQe@;91s~V=6rRmmjOBSIj z-as46mR7>2s8s_Wk6J(BBU>9}p3d^oQQPGT!0rD4fS#V?rx~tqTJa6%h{=xD=4M#_ z@Cq1=91J!vI{rDR#bV=14Y#SL8x1P5)USDQHPzRfEZJr|fp$1@MoAd;?Ng$_s3Dq3 zQ0(6F9!7cN*Bpw=Hu9OG8kFxL$&ODr{HQ?4KVAh&EM-X~DA7z~UE5+i^PgOF{=F;a z)n_@~p5&=0M?&VO7S)W~Pv?b*uw0ZmC#rMl*08=Jcq{%Fcfvmyctc&@>8|OLM`H3y z&-QDjUGT_?dNMkUeQR1s;qnN9C$*OXLi3%$`xWP)>PMwIEo$palGb^&x!shBW0lSk zm~xCj`MNoH{pP%D|32DwJ^`nOKadIdhzn zeg2-6?%%fm0K(?@cl%6uoY`A>8h41KU4F_n3J@j6OMt_UC0QFCer{{Ve#(nJ**PJ= zJF&E$xyT(W&#Mo4pF={ToD&l2Rq&syyM8{G^4014_ERp8t$m|VbFGnH-}XR#P3 zKK0J_I#<21#uDZ%qku+0JA3{gjXvJuN3oY6IA53MJOD>;=}*6y*=iFjqsbCV!5t3- z6Tuno1ud?kpJS02IuO92Va9z=XX<8JH<5R|{{X=@V&pzbOijg>b_-&rk8sy=>|*M}Mb-56dRa`RkS)t3FGJZ*AlA z7i6k1%Zv=?wK{b!gyVh6ckz9WcHX!IWM|XXv+r$DrVRfn4ShR+mA|p<8(d*YTg4IWz|qj-)fgGiTl4t%(87!q>mNsdF^aKwNG ze2*CuM(m+*I4n5H?ZNe{o(%D={{X|U6WQxt8VWCLcQ2IZDR&#GSs`)ItBix3fN` zTa4ngZD(jg{_LSchXj%V`kuhooctK^bUz>d5otDF1HCeMzrpYwW5Jhl%F#Zd0w@w$ z%KWzF8HvHqRc^gKCr|MWr^J5>Soo8}>hP`jc=a1*T>k)O-J@aRZ|;!UQ`>=x^xmrH z#7+%6HK}Ghi5!Mx+vc+d$ot385;s#MYjNdA6oH6y!8s&? zKOWxoxauyS_osL(xkCarpF`+#)3svwV)fTcg=|q&7*$kB7$B+SU~*KPpT`EaZRbg@ z3PH5C7!b-&UON8(jbsT}Y?f&)J!)?mICaKz3F?^Dvxws2*@!=aAV&PYgKAH8Z%%slSB#A_dcM>+_^!fh)*{M$3n?;^Y4w+~1Gs05% zBgc0$THaZoKSI@!cf1k;KpEmpfO-o5>^yyu1!Fd)%Ieo$M9XoWuE6~+X9cUVl#%%)I#Xk+z zVEBvR(TQ!mwIABB43~mVa953qGN0TH#cD>^@L))Q+bd zb6L8kopc?VDI;Lbk%k8#`+f$lX}V6M9pbb%P+SHiGYP;a0Ofh_YJ4t!)A@PKQYo^oB~K_ z$peF)K0kya}13Y)E%Z+YZNw0p(3P#tAB#}|d zs}c7@4DV31G#^ibL;?M;+^`)1{oJoop-qT!3zi1ssM}64irakMB-xi5Hmv?aPvYEGe zc07e%CB?Lb zqPc82jIUAw$Sc%i^sZukW;yj2Ycjr6u6DxA3**z@8PC0GdGOxA!YrhU7b?6AXRjZP zX>L?kDbZSZl--$bbqF3i>0ul0U{wh#Hw3belpF!T{VFX&*53YGd0G~U-Hb}b^4L8Y zi0%BdS$7gFR*~CUl{@lITMNM8RM9SHIykUNtcn_hwgC1 z{{Rmo7_NRBB}>+i%4rck>Tl;CQ`hTN%8(lxuZsGcyf86H>PE|5S2o&o=>Me02RNgcp7~>!ihcpkFhRa z1^{eGTQoGf3qozjIDReH;0wlX}xDKZSuQ|t{_NobYzG&L!U5fne zh@L&i^YpHZN4T-N(BmUd{uJqViR>qI;`$AWZjuI(uUheJkJO2Q$9FBM%mEA#FlVF@?>rf&!>BBY7345aa!63jPu=cV@so}{fv%@ZzteQ937fi?DzVbm$+BSA7}EJgp9Z>RFwc@HPrZ%!B!p{ z_=^q2<*$t|6H|xnhSgvbHPRA6k)~s`Msm1Newq^mS@<`?(Za8JZX{x&ve;n224j*&NCOprNAUIUjBjJI(pu|NxC&;t^KaG^ zQM-mf-*rIeJd<1h0BX1J?ubr-t!X-CfiCh*cc?wY^Gl4CQMW9kuHU+In$1*qvKvR7 zc(3+v@b-b>{{Zb}n@RGZb#LCmBy8*4V}Af=IO)ZBx5bTXOVVB9o5VgAYe^;!mX@$# znDpFaTq);`^)nokvZA(@BakC7r&55kk^;M0qx|79EMe2DiS~WEkHHeirE87<5bP z>)U}JhhVw#tea1q!8PM!=L+%RcIWZ>=DiNz_DJw=_6422mbc;q1Wrx0wbk(QZCvNf zWR(DsiO)tnS8w4T2t>0; z^2GDosg_A#3@)Gefgi_#w*-&nN;7GS&9lq&Z`m(FwtJ=U)5$ubi6$StbcQm(861;^ z_0Ln!70ha1v&MqAmr3D`YhJQQW>XZAPRyAdNLS~cNaKNCpRQb8Lh>6s`^#Z|6w4G+ z$cZlAppUxP^c7ZUqI-!Yzq)AHe5zG;k}wBB`jcC!9WjqX%=JIn>dVAWzr{W%@f5{^ zpt|#dOO*#`WnG~0j(Tz{W8nAf!ENF-*De15;cDLL3uCD5bh^|9vR?xdFqj4nxw*q< zkC%box@UEWun_&CB?JJyees^BpTe>{HwDm?7iM6XM4H6GN`uN5nw~P?!yBTNp8Oin)kE_@VyDN(uD@j$F7LGVA zQ16tKAyGl=lY)N}UfH1AYCp5*gETvD3|Jo#d|C0N5!vY)d0-Yc+Ba{1`DYAS-6Wiz zFf-D=*9$^8T52}b@EoO$spO42FACo2dXAg$Z}xh)GWfeyjA|Yx*S79W63n*QE)PHJ zTLmGHJRV3O8qoN`toUC;@Eza6AA@&|;m?Jh0*NK@&bEwNdC5D5ofM${^6KS|=^vK) zk8%xcYI=R=?7QIf_-F7!?k!*A2aJT8mx%m9aNr9SZfCuiw-LmHDH8O^A6oDUbnAbL z`mUegzlI`V@aMvl8GQMrJGHyVC(hLFr5}8==VpD+agFWGq3HXxVn^YldHYEGTTAZ~ z*~6xIe@L|!+Gdd&2Dj4e69PCDdTuxc+quZ-1$&+35uFxYk%;41m~99)r~|V0=svZ~ z_dJoVj;ETfq({F*wrm_c5x4=fkU+*ge+t#J zQnrK{c!2IzW5^if`yBKg4I?u*Q=7?#Mz>&4fYGiofu2r3&U#m$c=KFoBVibf<8y9L zl$?K4o}H_!@lK|;(QJ*ADh^3Ih~uB9`Neq$jI}dydf^!45J)_poE&$imB^F1%HJ|- zK0LKH3p|2LIkx4n+W}L8agL*&=C`zn%(k&fzE)BP1xaTaz&IZKVzLgL*M1yjrpw{pfd~dkndJEsXeKygZe^Qu?JAGA@@Mv@ z`1uFz1>+Gff^F_JUjg`8ria1WH09b@;gQQtsNJ*kE&bb;npb?k&$RQrw-svIXnJ(0 zdo`)a__M_tw~u^je|_T1h?aYaOG;KD8mjeho(UlR;7QIZ&F;5#dw(>#gBO{?!Z$r)u4?YulYN7=F%%FPN}Z zDa#L-^U3du=5C}uQbQ#2JTYV=72s#7z~{AV#o~*XvPj+-CozqwI}#)dob&JL=~*OM zXIZg-?6wxSu|2!8vlPmc>`CqqUrM>BwfgB1+sSeJfg$-MAtQ5xjIbGQIs;teH=AcG z&zTEjf_`tPAI#OQD_**?gr%g2Vn08ZD((RH>+kw;LskQBJvA=nSdGfZs38h1*?)Fh zuMBwU>r`(wUp4%R;jnQV64Qh^V0s3}TpFU2i;IG9Uw-!9#Gb!V+F}6MtB6Cv?M03YfqxfVG`Wm+%J--6U!0dfa%ZYRBrVHqDu^VHTugA7_4M&jX}uV zN&f&MsB0HLXuWSa=2akJT0+2f$LX9??QWFmXt2*1bbb?V;MwcX^s3w}biN<7i&eEt zjZ~~|q{awRyFCVd{cC--y-UNM91G#g>#aTIlgW}53emc<_1xg&JoK)2K)a1%QF4R_ z;O;-e*w;;I;rTTkF)iVa<&4rU7{txBNI4}>I2;_(*v-dMmx8n_pBPGQ1b%y!!TCan zqtD(4-x$ZOeOvoE{1T7C&laJmOxF9*Y)g1lEWJj@3^Rl2^{!{&CYj(*huT`dh;<3x z{!A(V07R9DL!X(jy*&u+Ug2Zo-v(OA96lrQ6}_#ClOapUX0?qN3;;<0f#`j!%EaP% zpDaeA@&rESr*~=c7{$ooL>}(&;o}CGF_M>Gszo9EW>ve)jw;g?=b#S2~m0 zTkAd_zmnoDh*D#hW#owf>NxE}i$ZaBFJk8L%sO=P-^UO>Oe~0xF=6wsTzl@%B-XZ$ zms)$c27NfJXXTIu`ElHL@~;$lr~Vh8 z#49C+#^+D)kAaDoA_)jMJH|-IU#HVOYwMI& z$2=*`SHejQK>gV;tMd+VkAJU9@_*X$#yva7x+=z}bh>uc+mIvqh}r<`IqU0M8FO9S z@t+SLBFzi|09In446Ae04*l!je`FADz9?EMNx#jGQM4SD=ttC&Yr*tE8Z3;_%5ga= zj@VT`g!*;%uWS9BJ}l{<2Yh!O?ajT!`m8o) z!AFOQbkXo{;69-C8Zm*S*W`k6B-(s40PSlesBtarz-`wODLW8|$KJ^N*2!YIk}V1)Mqi4P+tQh9OKfXlH9?`AOoD7 zZ72T#uUq#TXx>C>&fuNjH{Cvi=}ewKH4&W)1jo$7ARnRrRpd#%&u%Y65L%*q%DD`B z1JC15`#EAhPEG(jzUVcmntYtRDt0gTPv81fv)Vk$jvW||x#Q)}aZx9ss-2AJkc^dF z0!ZX!A9}Qr$np^$Hj$HqfzNNL;;x`2TnOVRuqV`o#bSIFbN-8s`d)%y9)-!b8By5rRymr zrMH=Jdo;_x%qOaCI7J*2jF#_N9}xUerT9T)(|lnx_jAo0ZKcVb?P$t(N(fZJ-Hrow z2M3DtB?(lhkCn|K%~2(>$N0+5%i_kPta#JJT9CPqNw|*Q{yRmAJBcGk9!n{cjom(C zFmZ#@x&Hu){wQyY*OvBP4wqND)il^K99MC{B>K0`7_pKskxF9#3<3fAS0~~NzxYaZ z0Psfk@%j7i*~pF%8NdzY4gmuP9WV`gH^9Gu*MA*+d#T0XFBEuVNwo0I>@hOiK=WN{ z3`k^iZyNz3VOx9e1A;N!doWR6^tv8;jkP$B6ZnSiPlC|tn$Lr^Ej#-@=ghj*E*0|k z3_u4BjhlutxFC=*$2ILgu*dCB;D6cY!zaSOv^I^cc;CamA-bOS<3rMP*dw@Wk1bLO zR_VBsF#-9_sbK`G@`VWj7#kNyf+DC1vYWhx_r$rszoKuHOYa2!ZB1nN$ zUFI^~2wRhtmi2nc!^@i0n8y_Edi$|MQ(KO!>Ik~wv5L$&)QnK%!6^uwis}YxN zqrH5!Tq9LIq%N-gQO={z?z^8TH-P>!{>R=3_+_VjC5r3DT3?FvTkRrU67Na1vbVJR zCBRL_c_i|$E*!}tC}6qS&S}50H|+=eLwM)n>9+XI;lCA#w4V%KczZ!*>QaKCL>7F3?kNYv-TzpH`yno>Dh`t=rHAR{$O)pQpy3$_u zNzw^re=jC4AhT_WnUPAianyBVYDT3VO&gzHzj4!AKJO}9p6B3y2YBjlg*u(Kvp5+hPoH+i)Ul-o5fc));C&~ z?N?E237<`2CA&11k+2~o63Zyu#4wL;0LT^U*Wa}?`la{8FA-^4PmHyT9R_T@OWy z;eW8>NHusZ#N7R%Nhal!0OhbgM_;aAjX!FQLs#&Zh`uade$85)?}w~3*6~gDt)O^> z-`i=k2-*R0s9W6mMlJ&vRE|apfv_`N$LwS9Usw30@F!gH&+Q4~XVa}@)$MHIvAgjp z(j^v`G5Lno;;C{2d@%a$ zwxwY%jM4_NdY^WH6(>2J3tN3)qfeh1*Z6~;eW$_3hG`T(fki>qg>os zMPsP=jtjf%O)@41;9Fa$bVwwXHpq7eA1{1Y#visv?1H}nei-V%6Mh$X-$?%egm+Hy zM0Q{BjOq6GH)l$+xfw^A@!S&_lq&6&6oW8SI0C(h{{XewMcMW`RFv9FNBW+R@cZMp zh5RA=I%yskyU}Iv&yQD1T@n08t7;)_^-1id-(=9+axPsYIPzq}vk`;NPh;?>_EhlS ziLJgNP5Vpu%JV_-BU}r)JbMnKELP|*Lv6Ey*UbheTsN8J3$vfIpC{@y}s3r{k5I-gD#zEG;oiaH@OG~zzpR>7RsqrIK_UNcysoD@FtJ&CJ20W zW8w`i{`xEZB0FdC3TrW5-CRPZV`p(BK(Cu2V2XCK<$|acd%RP;H6hz0=ymY!$r}*Xa4{ezKg8tmNpNs_-jU6%S}62v`i(v?9c$V(q2T-nMyuc z!y#N?8h?yG;E=x+eg*tM(`>#Pc$ZDqG+!0y(rOxhul=ODOjk-H4+M91>njj{c*RTP zD=TC!Mt+OYb!h$&c%8N1goq9q0gJaTK6 z_;vdvYd^K+kB2TlZA)wI9{&JVlKRTSN4nL2vh1gt>E)I?tBZ(P{KjHJEDMbMs8bjt z(ZObvofR9mZQFPIypD=ksPZIp{{R6$;GLRh!k-3O_}BJ@@LiSN?}eiN#s2_=Pg%N) zP=j5+omk0xdhi$WVI`NyjBextagYbBdGuVpue+Q_yYft#qA2`$_vq zFhS=Bj_&OvP~f0%-tEdcjGhpYUkU5q1iU8tM~5fy)cS$B*R|XGOFP!`QYjV^Rwk1q zG6z30kTJ6v0P$XpIZCvnQc`+e>S(QQ0SquNPptjBW%(x_0V!dTgmd7?(xRIYdQ&&z?{ z;w>d_bmOmTR~Avnr=Jhps;;FdZXQs;6=fqEM+5>-9V79dh;Dp+;yn*Y@m+?mrO9P( z`hKLLL@BCVq4OF*!~q^i`=dC`@`^y;Pan3hn5Dq#FQFi(h89Sbf z;cKZp8Q?n)5ZzweH}-&u#pS&FuOm>!4ZO>oFu(}U#@@BT__F6xk{NZ6gwlP!#==## zy@ATf9-i+f?!32RzHDX5#?VA~1CHIt!!LunXO5m94cmBsKuvQ`x0g`8{?oi4XM!he zFO=LfWtZkt_W;Px8Rz~Zd=l`_hp)6dU2DYFk~XQQ1LiKGhTlp)ZeB3xyHSFWRUfGw zp7o3rIknVE&FXmt=f(|TtYfr_Yni57gm#UeHqW*9f2--q``O^*jB{Nlias;y@?70m zY2F_2{)RQpDXeuQfp9Ky@kE~-Qxvap>ocr0D;d0eq8%kq01Pnq>k33 z1)@674t!JHso30DXhLmC0|{OvLp;&!ZV_>ek%DpPeQT%iw}`dx5M0^Xc>c!QPr9CNiJ{kCb2>oYqgnj}3T#!m>5ay$!{^`M;Ld+DRs1ai==OrAS2MEPT)z zvNEGRYtdry(&|45BD1yEt?q7qNX7lcA7^V549xopCv?S^1I$m9thD z2ZHr%rG&AFpY5}pn36NRvXg>N>;O98@l}t+OZy)Xe{Aaa))HLbL-w7}Kq7lrzzZ1% zBVhn;8R=H_pBVUa#CHcz(Y0xQ!lFoREoChgy@Sd7*;!YV8>KCRxZTE2O3T_dtjPAQ z=*-P$;+3|qsax3mLbumqxYOc$IpK31#4RiQr_3RS=+os23C=Q3PAS&f1iItt(Q6Ri z_=8KhSG6|Ud;)7%ksM)SQ~}vkf?4tgTfI`&wT(Z(*U`sicr`}y6vZjCDHg^bG;$=L zGn|fG9=J7T_u}$svfF9*>#Ep@ALhT(E(-mMCK(1X$Cz`shTwbEMsjc6G>oNxbmIJd z@N51N%!zhRY!<8y-x>S2-YHY&rF=4@lIW!I0ZJq?@;^sQHH& zBj`tJ_WuAF{BpVQ--|5nJP8%N3~XCZ8qM9963q;YwS@8D1!fzAF9h&LI#-YDdNsC} z6{Y8guhQ|8iGT%6PN##kjuRNcJx*)Ur8hYH`<=Ap=O24<{uc2g_?%pDPk9zWv!y! zwZusO063Zn2k)Z_NNv9`4aX!<!I!jweoiPR zvL=D&r&HxSqt{Hx42I!VwDD2*tyE&bRPVky*R0DH4#0?heNxb-ZfyPgaJ2^ zl1V(D<(kUWHCey3Qd!pGWciU;#8-O&KJmv;J!(x7OZ`yJ+ZSr%Xz8hS-;mcU+qS!0qIABvqw?XO=kb?wT8M&cr9=J;4O@ z_Z;&|*36buODt_9ags6)a8GZ~6v%HOyNU@~dwX{y1YCUENbA7u=zVLd=L>dciT?n> zLVg`b;va?DPl|MH_i}h@=j=CsIe7)W!(j^X)n!%5^keH^7vE`yEA<2rzrtAOB!4>n zHt`RFbnlFQ7}mTtXN<0~r%7+Q2@JCyV{OA3!+>x)8vN$E({3#9?ya?C@^5TzB(}Ok z$CWBES6p^Gl!7Z7itO|-HEkCbbNBjwZc;*kh5&%Wf^(Dg{AzCvT)u;@$8~Szxd>ul z<8boZgZfqb>vs~c8(H#j82!WUdy1mAqFlVI$pjbg?tjlgipFueJs4H9Oq0dhU)g0K zEUS=NWaI`z(Q)7F*0HSR6G120r1L&)qvi)bxCg&LbLn07nX38z7qz{f67%WO`E%vC z+Bgh4=Z+=mtsnMw#NfKiS*ARyX(yo)#8lEo0(1*=g!}7d;L3BcB$dGFKzBE zSNPEFbvfAB+@$^@wuK47-sTg=Q<^;fZ4!M#<|uUNgHI}w7kA#kcSKIR&I!5P(J-(*3FWq%Jc!o+m zV`*%DUyWwR88S-*vE|}Cj{f{skZV?JYwkgI(%MdBwK29Ap&!%K)=`<7R?Y_ENF9bx zZ^pLfK&pI}4Ywyf5B~sOs<(&!*=;Jo+eXbE3F94yr9nQJ@OhJ3l6DU>*pB1t?OVr| zUZ!p>2@FC}xiU88SROG~<8un6WmSG&pyL4jYb;%~OtP@dPs1vlWcyZ)wZdw4d1V91 z`3cT)I*;)D>rPjHBhSR>(QYX=%a$dTm$z=X#Vl@05F6$#_0Oe7s8v+saaF+dC)iTk zPJGD15T|x?(EUv#lp+Gy7G*8JqL#@V_oebcxKNk@urfyqew6u}%ZqqBUo3bWXFP*a zB8I_rc^u;-b|`v*>tC`z#=HLjg#J3Pv$wq#@mySsy)sE$2(52=ZDM}vPQSZ7vxC&v z-L2v)4-fc`!^gS|EPM~~DnVu9D>)YfNz}$8^UmHQ$zLt|5)h80pUX?#ldB}C85kA$ zj(Pk&EA0>1BleTiynEq`?+pB65#DJYAra`_C4yB9i#w;6Z+o{t^3VW{frW6V)YpC< zqnhPs&F45iMykbW)cRXg)8+8>^Vz(}qj51f&(9W48$P|b^sMg?T$Iu7WI=-*c|^zG zGIKdfqyC%y4 zY=Z#lKo-CEZbHbU?Z5q^g`}9-w>w07}iKXqktk+gi({+eqAbaDk66?wp*k{LOLxCDN~a7pz-r-UW^} zHp)z~d4)iX5LsAv$jJm}o@>2|-|SYF={zj}j18zxTWMZT=T&tpXm2bfjg~c8RAE8r z++&W%Jq0+j)4AlI6|^Y4H#&S$_-$%lm$pT0AE zH-q7|<(1!uGkf8^eayBqu4MAnfnysm=m5?$jxpZ8qtdko_)+4iMf_&tM!zo&{2Mob zjBs64jAZ2GdvV&hKOX!&)BX=?-|&rUt0mXN-xboQc3 z>cc)q)O7o4wRz`)CtoDw;YyeG#yJ?OR{Dgu1&ds)OS1|=Cj+l<%jv~>H^hGd&G6^N z_c}(iJkv`VX>D251fDG55Jz6Tj-ZdFay~24VAJfx`eZiiA&`k9N66{-xb6B1;;RN+ zS(Rt6N~B9X%0S$x@qncdc4ht{@7}ca4Py6IwJ&odS1SyARpJ3mVB@X_Bw%uDp4W_b zw+hh0wvn(@@{p1N91M3Pp1rF_M2b_V+*)X}c}~B)cwdEn*-{7p09v`6O*c2JHOY`% z$t}&hMyjkBk^9Cg(>;$~oK_{`9Y@QPM-#fMU*W6ZT_6^3P6n|n6xsM@J za05NTZuQvwI{1Hct?83p#FE?yVUkG_G?DViK=St~;knNv7#JS3w%D|iGi@#njg$#I zZu@>%(oBH8xX1IZgW*<>;r{>;c+T5R_?dHkq3HKTyxXe~lH5eVWqhE(u2_%@9-W7$ zBYUVWjdyU@aZPUa?n4P={{UCc3b8(ij2hJVb);#35j;x_ekax?({$cm;q6gcSK7O_ zuH&?4k-K&aPIrFu*MkU2WMQI8tk>*Q^GN6 z(rVgYf&4Xpqxg8Gj8XV>v{p9z6qzQGB_(H^?m3$sZ~(%Ret7tWuXtNc(QY*V0EW|D z>Q=XH6ozd<40i~a{{U9N9j}AWwQ?5zE7ZLI0JG`0H!#~y$fnh2XyTlomuXONGmyT# z*Ph{4t(uXWjHRk))0zZ69Qfa;-Prs+@W+Mx4H5F5OGqbc?M77lyLW94tlY6Yfx9H) zxX%^*1Mv5QwY&W*##$Dspo=JEk^u6^mvXS%f&0&xxf$hw1d)pJYhM-3;hzwB{vDqG z07BF)cf!)aDO2UJ8{d1Gq_-Ny$9 z9V?OXFT)7?V^Z2tf=?{l=1&H+B1jd=FCG+r|CT(-I^+S(ZI z{>N=|Zy;2;K+G0K$OsE2-;{6&uE^JoMRc?@jZ2tXexnYp0@>Y91;m?=nFBUt^aOxA z59ykz6i=khcc!kf96@bkX=@YBPBi==69Bs*L z%&J(qZlQ7;IOCeY@xO$|tMD^VvP~_mbw<1@iR4D?vZ-Sx=0aW6uN%n&Jw-yqLCK~H zNbuY(s>>XbJZUEcB!zG~f&O|^(@T3PBztzbcKgwR)Z}tvUtGt6;BgRFP8d` znI?U4{{RG_TYYO*j^-x2o@i~gJGj1e=2)!-vZ8VS06i`-&vt6^@AxQoz5f6SH|_KB zd+g5}+v)nNauO>`D|mt_IN@K+;PJVQeMA2M1i$cI)|cZe+dX&6n^d>^5Rv!C z$-31ckp01p-c6L51CA@=KZ#x;o8l+NUmojGO!F?e;|*r$b3HOMW%h4^5O|1w6$-rC~2~zdhOlvk@IEubOV!F z$>4|*#^%hz)|!o<$}L*mZQd>20U-HuF#{!6Jeu;cb<{5vx#&u2Dls|6_*HSG>5p?G zGs6Uj{cM4vd>(=S0KL%T^Qbhx4o#_F7`7IH2b;RxHv@s5a54UQu8zmUzu7u8){Cdz zJU2*QN4R+#2RyWEpOp3K*S&K(ZjUaHsu(A{p3*iXk1ud$KS9^9$5L}%f3&%3S2|mb zYTEBkw^`#=xPXY2(KaloI2*k=$vx`>#Gel?wQIk$X*U+LMA!l!Fk~EYf_vw;UiCfc zNN=DpwDDUP!$_zLr*hj{x93^8U@~#Bzy9B(Gw2xnLMRY7w(zV9$)a9#3 z(E9I+Ei83NB!^s*?m2c#62Uu%g?Ah)A#JGS6Y`D*0Iz@ePo-PGhthj!WQNhu3B>S5 z8&KFjS&sGKoczU4AZEPx;J@ts2AQfhv*YPymT`uT-SmlshEt!Nj@)uM>CS7}XMHWA zBI5nvXxGaNG%s%)C-_te7YBpRI|}nL7P=XSO}W%H2eHtmYo}H7Fm42D#A7Eceq+hTdf?VYkBv0l6MemowWXsMB(&E9 zcpPUNh7LeKL04h%MwNG_U7Iw}iti=lnUPAT_qXRc;O7IO2a4uYk*~7scRmpCgZN@A zok{iUn`t4ol52&v)6(I#D9a#L$s`fZIL2{aC-Ga_M@5qp*8vZdxRcC{?~; z6i5&-c2UmZ$4=E#_JH``aq#{qq1K^!M$Ot=MRYu+a4-NtjrbjXIIlUB-RqtJu+_X} zVXSFZo+Q*Arq}N5{L^&tj7=O62Hm`24)TF;cqY3j;cf4;nr`|N_;*v+ylU4MR=yC->US3s+PB>* z?B6RfIU}|`tI0eM@bkmEhm|&+sp|TxT*v#Rk~E1-eYc=F!N*MWuWPV6np$b`>C0-7 z-bNJz#-47_0)e@BAxP=`=&v0Krml5MZEI~{ZM0!(zEha47SZ?aW0+>6$syMySa%$c3bn%Ti9z2>G`jr#xc0QZ`W@+V#wqfhLmj`q3R* zWUinw=O8i88G;;kXl-Ml8Xdj#>-I~#iJ_5IpKZHt zj2~QZ06ptFPe}A%9qMq~xSrnoNrq#(Je86uijqn0LjzlyMartY5nk9u8XulukGYEs zggplw4xg=LYO*vQIkMd&Ni5n;%x@BbD-b1(h7@v6PkwndtOWEltvo_vM_adM8YZ?yTlnIb8`%N%v*j@{}c&~+%TRy&O@>1G7GdC9dl zV4dSVM;P}!RCZ3cm`i;+>r~p=Xkm8R2_0ESP&4;Wr!`SdO<7!t$wyYpz8U`jiOt)^ zWDl5I1)MWM7!CK8$mfCAy>*@*v1wS@J8A0$u#!mp+1@LAiA!hZCkF@9)~Z@~aeO_c z#Tgd@OQiYV<{^m53ZU?~1EB6}(0&4ZFSPiDadoSB?NvM>qe=FO<-1QW?NX@RLCMIB zE(@{X;12cmnQjy6(B^*=JRDXb*PWKex5JGh-{9ARFMc5WPt&}eLgqiRX*Me;cg&>5 zrXh|bkd;*K0r#&+@V1e6`yqHTKOB5jjCiBtFOH&3A3)O~D*pguk0e25Y`yl6o@qOf zdI5nK!fSgUi&}-(#-EOHjX&Yff;`9Yy`|C(mr^L&`ja60#N%Wu?nusf;(jOmO7RuN z{Qf=E?dFHaelds3@a=*pp8f~XWCd1Yy#D~DTwt7z7jPWllj+~0IqUy8YNOu>%-iKr(pttY3h?2;%Thha$eewvOIwhFMLsA^S=;4p_0t48)Shsm*um zYc;u@(k{Wh*FE^{is+`Sj4Mx>+o8-~BzC_QbS7Y`(m={($>%+>@4@^lsJl@tO|SwE zR3B4QBz`r~+*@LHDokK0+75WfzkjV+%JpOX zF5~+TPj+B|pxR0fBO}-ORja$7vT2|UjAScp#!p~_|g4 z)04a}LU<#N-^}K>yjQCoQdTQGYx051U;<7+$L4eS)V~fsA5Y`Y7)7U9FpaV1O6bH0 zP<4>@$vgqmJkv}{H+DtO2KYwC-%I}A@ropRCXSM|!^pc~Y#}8Jc3cjfNj0bNzvDKu zrEA(R#19*MKfczyNv_-<5BwPY0#s2{CRnOY9#S;8ewvzkB z8i$7bY2tkymrn53p2pF>A9!|rC^r)!+`6Ui2_Z_D;$5qPtkQE4 z0D_?Y)hpxQ5b9qDyc^;ud{1F(s;;H+6UC6RSiEVjME?LKrLgB3eS;`S(E1=TtX4BGpiJ?Jm@wV~5CyZjJn^n`Vw8W0$23eHvP=n+Eo^#w0`Bb|F z%quMx8-wN~s}~$BpsSPg9dTA<@a@fox0vdU6pgfzk+k;QD#o9rHnWIf7-k{BAh9E$ z>CayEucr8ORhIZ6CDevHPB#Jfc@2&@>T4#&baPkwdP8(K=3S}_9-Fi1JN+v5kKvK2 zjoNJJq#cB^?D@S3>^}>A*Q+*P>^pnZv zwUZ76Xy9Rh92{eu@@vpqON-cSV}i+~xJD*0j1>q9OAt>Z9*5M|n~25P^1z2;fwPL< z1rnGRFuM^IRX8Ugj^qQ_^rVtC-)(g{s|= zu$PlB?iI0&5zSE-DRH8z-usl#xZjy?lov_>~w1zR!83?kpiga z7U|v;@C18$X z!Hy<&J0MO@4n{Y&-mBp+!z+zm@paD@sSk0Mw1#}M+o3y}Rz2jAj^-zvlbqMp;pr+- zvOMV0_I~uYW_QBBhO1%rpki;et0<5u10!z;2Vf2W_Q$01v07bR}YE zElI6x5-0!|CmnD&`ud)=^Y87X?P=pJ4d7s(@h>NCG9>-r;8)U;D>hlSFpnR6VVBqG z{cGnx+m+$b^=$_CQjAM#mgOReK4~sxX#&R#Nz}8P40Y!OekE@w?*uTArSKHQ=pETm2y1CFZH9JUbi2mx^#M zGI zcZ{`0)9hrB$f+#Ed5p|h>VGY!GyY!XT8I{})Y z`dVBl6SRegESMNS?Q_>SuNl<4KAte;k12@ST)7PqPzNBKDI*>Ig-dl~B;PbZ;eU8e zILH|0wN0GKnIgCIFmR>UEI=9BeL2k$AvSE6Hg_>QZXwj{#l~cUSb$N2aDO`0wb6+{?IuCwU=l|h z5=U=Zmmo$ync;||W^*FO2*5H7?Z=?2H<~j;xT!4=#&{f#y+v-=XlwR&WOXt)+E|RL z`;dRnN^QM{pwhbCO1o5G?E@@F-9O>!O5-peP7%Z9paDw)$`0M$ojrf0Z1_&e;=aNJ zRoRwOpE%>7KArRJR&Df|e6Y6(mJIkg86&C5AC`S8)rN+^?vNrd1NiaZr{X{Q^nls3 zL^oS+=OIouwlG_dx_{55ZCH8sGN;&P^9By@GYZPSqqnHXu&#SeJ8iKDW@TJ9bHM4w zf1g~|{{V!%AF25FUK&@264YHxrOCUS%S4PEZe{?GH)FS2%1+AUxuv<^d_M6HgFGu? zpkMgO^*w)GOZe}6y*ZXN(&Am&z$j2ac6`8K+6Ig0m zZO4njw4dyasA>C#Wp&Qb>Y(L&jN>(wA!&15^09HJB;EBqH%_s!i%@^<*&a>9X~L3ld*FN5*S`XOHa~{`8|#_}! z!f%4V5d0k4{+Z(s4c+OQe}V+MRQG-!)-7z(beZkuXt&6|OtRuY>RWJT0arES-VXTB z@W;a5Chb@K1p6JXNM?vfiCS>e$#Wn9-Qn|TL?F~ji(%gs? zsoWz-<{N=4ggr>be8=$<_K5gz`!aX~!u}Wilx-yOKZ*4F+nc#{9}-(z%>}S!c-iDj zV;=eUmJzPt6**vd2T%4d__;TYJ{?`_Ul}!zh?csCfVDk7)4-a}kYR?_!v1M?Tu#@Q zE9D0SpD{MS?%b-TNzXnvFZ%QoT7Ijb=R?{f?XQZz9=u;^@N?t7pW&?+!y43{A@Gvg zJ+RgUa!%lW^)3stqwhnv%1x}L2`qPEetrFu{{U#;0{Gv=I!1-AYu+ii@rJWu_IsOF zu|sP!MB%qwTo5CSDuzTmxWE9C*go6g?~2zS5&Q!`hbQk>mbwYr+-S>OWOc$a)b<}#hd1{9k3SK?pnho*cG(6q}BfxafP@%#Ap#%p5;v}1kY z3ufDumJzvU4<7Z)?ZZdTOK}(~5RD(J*3sYZGf61>IqrH-?KgL!j~46j>6bPhHTYF< ze$^JE11vg@fU!ui+}ljxhLSks$wmqbWq{!~A4>5@?C+&~Fi#TrgT(r`g?u-Aq}Wby<~xoO7SZEl$uBbwZ}{hI#(YX1O$TAh}qqj*=w`d#OX?SIjp*8100 zOPfenIGN0nEwoGKZQ9Kk%Mg{{PcOWbqbn}m4Jpy)NyVFA7WBw|B6v^3ej4%Qn$L)S zD%rslULn+Fwp;sML&}gcScFoh@#8Z>i5yC!b3Wo)zU2L#zu^Gzr-Dz0bgc*b154Bs zJ}%Sr`ynN!p?4Huy{*`}`Hk4xyATip@y09RAJ{wMzK`LL5$gUa{i7@`wB2&<{#Vg; zjekx1Cx&#pi(I^|1mOPw$K%hxa==@1#8{9;dp3*vXKEj{2ZVfAt9(E3R+5_bk@n3; zTx&S)E^MuBn}{yVj*QnAj>^ulzQ%kIF@sp-`XQlXh&fwnJ8`N8y7-AcX4=&kT$dMw$ZzBMV76Y11bK*vq;-3q>$B72Db>QpW zP8~x>OAGsEZ8r6zC@yX=K6GWmh>lEh4a1xfkNY=xYeex+!+lEY;RV-^ygBhEAv71d zUy3{~>8I)sv*wP`W%9#$s7}(QvGWoeipJAE5cr3{`tF3k2eoZyMews~Nv!L-JK048 zTM2_t=Gz%mN}=Wpxn#gpz){V7l`1@y8m&KhY2VD^lw}voCvzXeo)*{jy>?5F_)jjp zS>db2Z8G;w)NIlre-lfewW5?#vp8d)m;!j)-nRZdXgbc1@h?x-zCJWsm%_FXzlU_V z-G0w!sG$o0c2_&VM{6nNXj$KpSObsq-!TT8#ZvAly+lwE&n zKav>D1ZZ;$e(@NMq;DOT+_E2J%$hm1mlDj;FI9%)tle-4J(%<92{huYi@mGcPpA2}mZwvfAbQhjD)@0Uo zyGsd_hJxx%j69}z_{*?ufF4F`>2Mcr)u+sKQH*0NH=%>$&)Om{_*R-%gnk`(ieDOQ zx||a09v9cVMuz)O@f@W9k{hYf7C*7z7E>TszzREO#{83yEh8cO>40+<%igjN66qQs&anPv1(rpd@yybD@3@ry@2>aKM&~=D%x1u$ew6! z2-_-<5QpTc>ygU*8S#>Q7}4&a@TI?p=kZ>#zS~1_iS*c$%qCE;E)>sf0dYgOEm@u$X0vRptaU?(!l*ued zb6;Kl-(M7dCHT+dUX`qTCbiW(7h-%FZ{fJFv}d)7OS#ZAmr!a@%1Yhb7-Nh?$f^}( zbDH=j)AoYZ28nyB`1iyQ;u#sz3ya%}*|jU1wL6+Pj_;Nj(|-y$`A#|O(}Sfeb17ZF z>cjRjlHT_^gRg4;01TPMK!qG)<_e6e3+(QNkNdu5`kPbz2ULW|er)fS9Wz=-h zt81q7?J-Wjc#=C!FHq2yd)u37qhGU0ERVP}N=`#D&el-C0zd|^H7^$U zgT?EmUU+80FSV__$vk#2ksn>HBaHma+0Q%<)tllk6|ah-Z7bpqm1$+FY045i^tEQb z-5UI`uqWk1l3N_})0)Xb_qhpoJ1I3iV^Z*jsdcDpb4#So41-IZp_O8U>TgsZ9j0#&uEvOucK<;2KCPt z_=m+B9+%?%K5I)|BSg1q9(k-QoO&8nNE2oG`xyW-a7^(-sAy+&exy4ub zrSUfV$NnOU-^8n>F0U&w)Gy$ZYTV$Rs`20~Y?#L!kO4L4?8EH}B`k}a7d-KvymcP+ z(d>Dwgf;RvuTGfI5}i$;#wcj9$(2V%b85Vonzde+tm> zkA(Ff6zVAsg=%hOjCri2j1UOVUbOv$R7&;{NcKMpcwGEQ_<!_V}QBmAah()UN*h^Z zLeej<{6`*_sK+*$tz3q;vb(gG?EYvuE?vVe{{WB>4nQDnH9y3k9e9JoekDyi#I2)= z;*JU7z0>UDhDlT}?%hh9DP>$7fPHFxlGl|7vsQegTf$T88jbC(-IlLw1=MEl3tP#y zHPZk#zT<@6|I}Zv;d_H~KI%W}ePHc|i^o1x^NmySDCTR#iK6}_yt16R}S8UFy%A+nd4rVEoQ zCr~?J9MVlK8x&=28KLlp;8wBwMf_&A@UOyqTU{Gmxml(AHl=i7hs=isz-3m!+n<*h zJ57D9@Dt%@#edn)!FE>~kB7VmsA!r6mzzDjx{BKBcC);UFC|Cvm`p;2d^;%HfV`eQ zJNQH5Nx$J_=?S4~I;N8)tlnHY+<0rvIyT+HuSrQ_2PCls*XTFHABZyelfnyO;+Kb3 z)O7S)Tg#a(sl8oSP2$8m}HGZpOi+jdi#3fwz66ynsd9k zTH3?ysuKE3m>F9VG86Oj(U&~u)}*!2qx0nQFO(F(+R6LI_ZZ;dkUM6GXA>-D>4Y}& zQSM6l9fO)drM(kq%9ov_a-;9IPifvfJ#Y;FZ>~CU~?0m^GJh>ymZNT-w z`=oUOzDE75JRAQ22*1buW@ur!O+UmzHJC(;hA$w*!_=QK7`OZ4zRk8#sLIf3wGZE3{keV|Twi=3vGFC*w@LgpcjV4QhF$iPVNMUAkRj)%G)gy2-i-NX zkB@I{qn242FhjQu$tM`jKAygnN+`#ip;T=HuiiNRgy$Kpd!4?1SLevUJxXz&o&Ny+ zb(?hxM<4Ew-Nr;`mH_w1Zhu=afX5<|#xZ~&J^sFx%FS{jB70_UGCVpG*=5HiLG9PCxvr;8)sox9b{BJ^ zn@v(89mqLH9>ce4DO7alZslUBD%3f;qZ&_!S5w0g6Wb^N;ZES$^gg|FP+xp6)tXRk z8px;$9}?{)v5by5{{ZV(XZE?Ln-EFz6O67^KtYt8X8dcPq3d4p(x4xO)-^KY=xmB&Y08mVJzwNf(a2je3X0 zBD#-)uHm?|)vvWUE`0Fmwc@sA=Ppljgn|~l*F$xh8FcB0btqCBH~ zDzAIfW^SKw(>(B8oJBAI9l0TgLMt_;n@rU6DPr-q9FdU2*0;Q!u_2#&$d9!85HZi! zj8zSO)fa53#!l8GGlRxYv85$#0IvIPLn#Ck^8wiV)k{mcRTxC5AMWACamS~v zCCeKt-V}}JfzxTvdY0yW()o)U0y%2hD#;Ngb1uTu?T|?X!)m^H{^|NxL9J;)1&*c+ zNG~B+E(A-pe8dfZ`6m7B~+(8G7hVS@L>{4eZFUbv#-{<*KhI^}AxBAYGufbLy zPQ+0RXZN0A`N!TJ*RK`5&mc!HEGi#rsp*8r9mhYNF`0s%N!^c_aeJ3&%TJpuwt#un! zz&Dn!fg%j_VZ$lU45QYKN_L9MPDvq4WcBo}QNUS2cHsK)#dJ{7+{Y13R;J-CkJc{( zc%u9EfcRIX>RtxAj`QLVfFeuH8u5uiuW61li03~uGJzX zDapC9B%ESZ8_;wTCVPtemt56sJO|^=GsGGjte*@%CtWK@+jc>vYEmXQcGx655!6Tz z9GdkW);<>#hxQWkI*S>$%8NX2GHot-`LWa-=eMaT5hQc$_uxqev}KPe!0Z}Y`V1kUlN9Xn?O80dc*=bAao>ntjY&d>4;lBu{8p1)sO z&hasC_(g9#gbi;htZc>b7?&QMeJb>@$7gDWV$;cT2E|jvL)E$JO=bALRQ||2b{Pba zM#K^XSYg0k`N8B=4&}&Zky%B_0wyi@v4TMZX+1#BFlp*U^E9)V)pwTK7mRy){VEt# zHOH4TAXa5)vB72QgXx-{I73F}BQ&WQ+)F6sbI_5|N38{>bAB=K+;>)TM$$&DwE0pW znW7}~$MGI>_;b>^4FcCq*Ze)Hd^-5Le$k<82X31r#D=z;?+vUu1y~1CFmgEK73r^T z#Slb6M{$+MKtba@#d04Id<_o0Yb3UyeXSGCh2t3rS2^h0gsd?8)V{pb$uIN!t5BZ+=Hw@oydYeZDC8 zLsZtZn@Mz^7-%y28s3}<6TGqTNlteu13Q4uI#g6jNOrcT&9~Z3)uqhj#TbVqMy}W? z?dk~hsqAbnZtmflGb~RMfJz^_r<{S`(-pO?-7VIfMdWe$b0bL{h<6+wgfRYnMH&Z; zg~&@U5q*PBUnB_bg{cGu;42V*Vfj}LMP+j0?##=JNbSo10A`71b|mG-#$I?}2Se&b zZRvjz?!FyZEuV*8(%LKS^WKwgTH^2cN|`gp(Z|c!`_@*grCdhp_EXwjtf!fTy#V8t z9S^Xso54EGwu^rpekHQ7)bys>CW(n;+87+D>&`ak(AOiME~PV~_&EAS*NLRRv5U{S zmKXao%!=@%H{bIW_+V7@@pbV_nqsR?$2=;aklty3S!CQMc zT&U%S3ZGup%xS-~=Dnl%uI#SfnI|Y^o_|`E!xeXvRC&53NCOe{Ut9!~5GSoh}KC@@eS=u^6K~ zvqX0tfq3D01a%zIOA#k@I8E$%#m~db?}*oTb9hePdyP&fSGcxWR4j+Pt4LQ0YX1O& z{3G!@;qIySeIm=mo*esgB1rJ83P@JSWR$T0E^k_chcW}vb79jZmFEO%E@ zSZTgjp4SrF%F)RgBrlfZhbL*n91fjp(5D3j%9*59wH@Kk;G1O9?XPTnU2g6o^KC5+s|EmM51IOmf(Q##?mR~(nWS1Z-R|!-mF}&4vJ5PK z@boz2rw26?Nuh3flzu%Q6fa?qOVM>Jm5wt6GQ}E5(>5?8${d4_<2WDQBB%IS@XBio zwX^W-+LnarEVEtfcQ!@DF$5vwjTka9$X%p#89di5;U9@wR)!ij+j0JB~X$XDlY!fh}=hI}~` zvKE$0IA@edPU7qpoHyg2$2InTk*p_zKj5GL02HrM@hxw)y*I?-%~oQvz0Pf{V_5Kb zAxm@EE;EYxC&6(f9w4@r6!~`G$+G}QwNUY&!>?0{`n0)e!YuW07PFDk=(?rOhox(J zj*&gQFLQl6LXrkKi{*`(Vp03eyGsQ)1lKQr;GHW=)8ADdC5Od#GQXT+irwvYA^D4W za=G%Ku-nEywcPwJ_-mqkRQP_M@SSQASzRaD?;w(E{{XUOCXtMcjDL%OG0<_vWq8Z> zT+sYS;v3n#9jxk-!C)CAiei_MsZvy`&z0Ud2WZaFbJL3Xj8-BFw4*0uYTv}uqA~m< zsowac$8X`t&HT4S6@qD%O|me`84DhR1e|g`39g4l_z9|bkHlJBdj9~5yew?|)`h2v z^`Y5I$M=R7W2LyHJHNx6>wtFFQWv$z^jM8i%08C^Y9tT|a9r(p| z-xWN29Cr6!9`McN7rH&6YqNBAo2H$)Wiu%xDCj^q9XeN(OFG=&r1O_>zypRMy*cCc zt?A9Rc6vB_&0U*!wu4TLqzH7-DU2iHR)Gprxad%DLVr23O&(05erK{?)*~qfkYLUvhQqap0Vt{}{5^@{# z#b;f|C6biXt>j;u2YK29V?3VU)|nGTh|3nxfC(jUx*H04KA?53B=tUb(3V|7;!;~w zx3gJ^-MQjfaD?QX5!0dd70dX^ZFQ|0=Tg))TMa(mDb1(u;)7@mn~bvVAnd^GGn@li zUlqP3Tj>^ND~sD(CkVz_;$qas9X;!- zyYS|Ltj(oO@6U3WsW zw2}*JV;pMISb(F-j4LqCI-tt&dTp4%RfK7kCBi$ zk@8R8!2S4mr?TMY~XgzFe{<(zL{fb;q4fWGf0kD zJk>7hODS1dLku3B@IN}1%TSun!_wQfovA>imC8cVq-&3uV;wpSXPi{u5A@Fu{{Ui6 zn%IcCT)G6ACzlvu^C(V$=Q!TeuGBymZ2%3yK|kgfNK0F&-bYTQ`cMGoyY{%fhGE|G6x3?;e2 z`NriQnK`N&{obc(FppDRKgr#=v@Wwa;{zac1m_=}L?orLtWJFCa78I()b)06;uB7; zr;HF3uOE$A7jnI}7UJgC*s8ABV~jL}AG}zu@2|ZQP8i7Xh*UC-#Eq@V>G@RF`W~gP zSqses+3_adqO~7HBpeAF_fe?sa8Ld8U-c8!<=@@;Mn@+;=po z&hk0sBQsIeHKqbtd`OIuHurh0j_AlZ2Z!NF^y4+@9}R8wtE~v17V6r3Y@;@?GG!Qb@>LAE~Do6{(&I zmY10y$G?pFAB>}uQP-{GPlLYTB5iCj=I{HMOOLQA2NL%@lEj3$O#g&vTDT z-Y`p6bYd#$%8eGdO-6D1i6Wj;oEP2P;1lcaY4OiI4=I92RbjIXeq+x$$83s{6^QL* z4uKR28z7O_=KlaZ)QNDmgUo&yu_Z%ijCVh-D@~3WGn4VqXm!sHN#(LIxFOk>2M_6< zqozG8rD5jXNRtu~zCz^kIR5|&%lNUf=GRM=!llw)Mpf7`+zG*7PM{xZ+P-&=;oeY= z&YOc1#z-CdP(fEm)P;F>F5#6e0xL!HKbb121G@k@ zAZM?&bTjMH+G%%Cz#%cmaL7vl!>A;Y>JNWP;B|d!>hk(j(QV^{$=xeTTo(WgvB~}c z=~CDjGFx2g8nLstLw9yvVu~<9SqbTk^#?zddVF3Vy|ug3eiD2jk)rX3ieWc8{;LX| z+7*`qNq1oFe17f~KY5Pq5T_Wjc(r~QcupS`YnF2Adi~m)4-e^nY8kKQla*NWjI(vg zKPb;?=;LwwI{Y!zbRQCUiY+hV2aGJF@lV8G8Wsy5gLHV*@03Wx0H_UZYZ>LAe3)R5 zQ7PG2>%-I5=O6oM{?z^q{hPiH#Xp7Z>@_ck9}9Iq>|YOPGR!vk{{Y3Q^PrYaciLG# z>E?Vk`OxQ>$ZyEs5qP6q@vn@vzZLvbzW&$oM~W}y)b&frWXoRMKO|!(%RswP5NB#C zuQ<(mN9_~)K{xGr@wN?LM$-QPvAhT2TPZY8185fq%56JL;D?b<-nqDCN!`!S!l~s> ze4E8OZO?`DFSmG#+Umy6NmXN-XqX8f8QQJgh#4I#g1ttxJKU6XF?>bh7<6B>+}Tu3q5S=gh^e zrQ0xvZh96_cI4!i!SwX1Q`tp*c|2N;zMpI&kzZgmOiyOcp}L8I@!mcw#=E<6GJVwvlOf3tCTma>+DOMqzgw1hcBv{;%NLGw}(dyiedkPf5;U~C~XhN$< ze}#}QE06LkYew+ntWr9(e=2Xo07B=UbLm!o&2MK4i7n-pZ#PFxQAdYixAJ4Is!KI$69CDV$`pvoh`0pxsw6$b^f%Gw_#Q| zIT!#|5|cnBmWzAw4_J-#$P!n-lgf%H7%KUUc#T0hJ#m`*1NMCVmh3(a_(glXCqcnCFws$eAOBU$&dCFJi zCk!!T%TT*!HUE-xgt{TI?m$YX|Vmgh?3kaJLFx=0OPOm z9x7XiUPOT+pK(i|UPVH?fd?H=(2-5kujI6UpJ}oni9<+F05w6%zLMF>;Yi8J%~&%m zSC*37$pbN*6-PJ+gU&sDKBm0%tV?$paj4!|-4m$GcFrIR7?B4HlZH7Q`VXyFy0eE- z(G)QCq;SN!w=Jeq!~35A+Bh$#sxuu!?+9G-9w6|HbLJN<;I3`pD)4V(~ibI^?ND>7Y5 zM4i&%VrGPI`GCrf$31b_RPt)&FZ`pr5=d;|AW_ug)C_@+`K=;^RKK^41aikH8BL_@ zBoU9#{4rJ9A#ZCh+96aBfL3641X4OU?f(GR8Lf%##oeaa?bFZsnM$_R=dm4l9D&oV zaeg`Ym85tXX0!85_pz%9BT_cP%rk~3j9~s1)k2G{H54gJm0Vqa#g{%7jyn$qM0I}< zYQ$Pv+QdW4Beyt+4vt1S^sij_A^SU7&7 zmLLJOSl7^c{j44%)pYLxd?<~y-w$aPijZ$Op2peoWVxJ?^Il!`B%R8Q*pr{B!eQY; zHi^dd)tu%2jdk(AUeq;z6Ok^DWpxpeQ3$uZnl=JBp-w+>00C5g5e1K0_H8>sZ!x7+ zCTwOlRAgui?Vq@RjT8 z#JO)M;I0Ao=cn|oI4tCwT(ynkJKia9#S5Oq@#&6zIHqK`)X>p%Cf07ift6MO(@!jf z?1m-fi!k6Q9<|^f@KT%q01f;!_z9`}Rn_h1mtXMhkJ)?+71hs`ZKbWlc~7idMmdss z2{GHiL1xGUXl7;lN5$t(@c#gXuiIUo5#gN<;v=g{>$VROUdBAnuq$LAvmy^Nc{&Vj z=aFBB{{Zk(&)e@){k(oS++RgzLHHMA(UN4;3i=3AD$RFY`O_*tz@;+-p0yVX^iLw~btzWt!6JQ7J`oRY^Rl20{L#+J>lYnz#x zIPE%>cj-=m)o4)blVn<6`nN$qbUlna0!i zM;QESF{a4gU)h4VfA44I#|P?v!n;eoER_Y>1c6u&mujDXLEf@16j@9}aIoB%Z{h*H zKdl#JHDfKbEB!JLI^ZeE$pa^jc;m14sp#|C^8~B8#^nJyQ;y!>N& z+mp(i@q^fUj`___wsYLe6jO*4E_qSdo`CvhhpwV3J=)?3s%)NB!98#%E#uORYD0=8DgM~*uWz> zs!~ARieC=?8S0-Dz93n6Z@^k@?zgJnMDxdIro#6ZQpUYqQBTS{Wv~aWc6S~uJ`K^Y z{3+p03rNt?;^WKKuGBHV)EYJ)DUkfpFl5@nPe51RzVGk{#BbSS_8iSUst%xFyTus2fjx@ zIjV@1gs;)NWvOSMR_)GAgTkw^? zf_@?RYr=jY)%3qU?mzfQbWgI}vlnRAYsu}3D3Ri5+sIG#ZJc@!FYA;jxWZD^y_T&n zL*{2?E6JZT_%rtIzwz>Ti@;yA?}R)R@Yh1rt-ReP*X=3xeJU7o*E3B!L|WoWcNPjT zI}h(yw0_PX4fGF*mfjcBJT>DBZxdelw$=41bZc7@BGv>UR%MCg%RvwfiW_o*=NytV z=D!fW6?iZ9c=2wr;okyk{{Zlf>RuAJH=6#91>(sZ3piy#AD&s6KxJ;bfGdy&1#w;l z_%EjXJ<)W(6?`@LpJ(v?@B2FA{yt`&TWe_Y8YVX-)g>XuOc)_p2EhOt-nJf%X=s{% zKkKmxMx(LX{{X>Db>9!$>ethm-^0=Au`ZbUC6=VupYV>~#DP&KmgI>L+(hB_qZt1H zb{GXDmic?behb#VCq9~*H;24Ks;#`@DK7NeX>M~0vhHbQj1ZdvIh5g3Ad_FKKMFr< zxU^4pAFzAs5NDGj>YDE|OVg_;>7dA5)wE%Js0 zfxZ#lNjTe=e%lvH3eQc3KY=x!3-)c-JPRI)pm=ZLrQPTkUMw2YU777}BiptSA}^bA z&Y?`Q;6y>j?)+zpzAIUN%X+r0;J6dS8hO0a^y@)6vPf^_OLl3ap4QqN=11HE%HMfF zz!mq7hw#hc{{X{}h!(yR@!gHatb8e_2q2$NwK3Qmi)c#TCF-<|1fh4TtEk>wk}y=` zj?uqhjU&J><8O*q+IPgSAN{^4ZLTzJHSL<~Otwcy2?fQ>iqK)D3Qptl;15dksAdqW zCkpP`=)0WU%1x)x`G@w6_>1GO+xOtLhLPY8hT1p6-woO{m%btKHnTLkdGTDuRaPlO zjKq*&u?io|!nOtoZ)KgRk+#P6keZLc#wh7n_8R{9zDTV`0KKvZ@ScOM_$$Lw*lT(v=92ns`m{gZX84LjlW>^}xHUllfwtX{mUB#;4Ry4)pT*krki6Q4n6ncbo4+r7khBcT zDB7gSv}Kh>YqiikUGU@fMe%QsbaCRHcH_goEm-v(CD&3qos=tXi5gvA0IFcSXV}EJ zDk6zG;N!BDZIfEPf33~oTIoA#c_;i6x5hdjgMK90{50^Ur>W_lAn~oepW$zc{tNg|Qj@^mC-EJYi+u6L zGuEPmV(`}6r~-Mgc1^PPSKE0+FujA7pLk!4z&LO4R~+kmc6a%KM$k3x1Jvl zM3&E_p}q2c#eHZLi3O|SO2~JjA;~>Y!`>bL0D@?E%i(v$uLO8<+u}vt%#!N=0PvCc zcJsqAUS6h*@jPrUZ!B3#X?HDx$s@5LljhC}pRa6xXgj~zPr*MJ{tbT0mN&jF*L53c z=Urx7Q>yA(#-poF(cZ-+(uGu+W?wO6kQHAv?!ZjfHZnBQQKI#K(=w?VR^?31_*3xz z0KvZ${Bhwg0{n6C*NA>6_>h4h=hiI*??8~Bp@;Z#2nBl}dkdh2&~+8(EADR+lWc>Kk6nmw~HMh9VIz!??u z&xSrad~^MSzB$-<(@*gnx*v-CFKsV`wT})>aTcp}V{0k>XvSAe`kUep#%~dR&i)Cze~0J7-w-rEhyEId&fEvKENBH3K6sC7d|<=pW`pZ31ii~VdC)GeVxv$f8u9EhS^|H#Upsw zd9DPgLnzqFiUHu(_rTu)cyq%rcuT+^vR;*`d_eJP{gQ7O=^AmfZ5d?KRph_7Yxxv; z_ao$gv$-ZijNvyj`8Vw+sayOR@i&ciUjpBFe_mgTdh^Mw{5g){ZgsB>Ne!!9!xN-z z&2MbSdj9Om9D&gz0aRz2IbxI~l6=p0*5@5OJCl>^a(TaOO%vj0jqdfY6zF&U8u3Pf zXw%K&EfZ6o=v!@o#xD~~mvk)BLn&6=r1B3XRMPx9_*3xP;-A1PF9Up5@MNAc@gIm@ z>HIgUL9H#F@=b9&$!oNh+dKJ7xz=6+5(fjHk-j1L-@&PKcc^>@)HP_e?RF^_RMH*> zw>D6i*UYv_K*Omq{olR`!2s|*7ex5WAHY8e#o^zJUk~)XTUylZMAq89#rrkt!7_lc z#5}R~LWn=sBV-T>6}4=(bZqH6Kg8&rCr$HpKGM>^Wsetr&3Zy=T3>_wV-JILNM7?? zZ6@YDR3sii33TK?nIyk2m*l8ocLE8#@e8$1eKTXQRAM?Wt77yY3wegbKl)}`5#l2n@zBHTc``qgvIz8tIl^3ZCy&k}G>(3h2#as(6~(Fif$`1CRno zyzkC;Z6^Tp+Z9D2yr_PU&{wHdFF#V+UYg@6UT3b(TZ!Ou@B)?rg{{UZ~ z%UIfX*w~TwAXHUFZG^9US33Uyv(LqgF9QDn!Xu{X6J6=8sl|J9rrHSp(k~j^6j_dW zDHbq+u%v^G;=S*~k=uMsxV+b**0eolKML7hSV^tw0IO@4Fv<$UWf~|`B&0Bn*X{wp zZQOYlk^5LSlLd{hjI^tJdkY)8shE_P&OT{xkh;2`G7>-%wn-{R1$s2A)K`QfvAknzo^)Fw^)Nou(jWFV`7nG`%XoFEn%~i;4JK=NoM=m zDly3#%5$rwh@9n7*&=;MRM0fv126m{t8r{CwQ+kb&z9V7 z?ySPeaXGpdGNex@mAY9;IABHqOydl5T#t;er1)_hnkRzgg5@Q+*?D&?NY8m8Y=lsA zgaC3!T2O81C~KoK{AFV{nSF9~9S=!stF;pcx4tb7%!S;8Ib)HMeNA1_J{)WQKJazT z?u7&C)_Qadx^=8^8;SK>g>WQ_BA-4~{KSxPQ)yGj;*Smg0AR=Aq&J#%@Vl1c-r*u4 z2*W8XbMpdKN8KD_7_R>S$2#TLjWwGq@7eb5Z85$bX~uYT{{XX{IrQL1%wXI+$7~;* z$a&8P2D%iyj+HBPJeSA543A6kUDd9ys6nk?M3Bif+7BrUush?!AKn$)_w$44#b9c; zR+?;vZ60}NkQ|b0 zD+R=t&?I3l6lA6of~>eBKQ=noTcUV+=Tx(UQisD<5f_in{{TQTsaU}InUE2&K<5J_ zo|U)Z*gRpc_-U`cAL%W9;V%nbBog@$LctvK<^`33EJFfG1Pp>rc7F%{42?$qUl90* zQoNr?H!@3edKqJa&UIiG8-htttd8F>8&#JF85Nyswt+5piNpA>!ghLIl?J7vi+w`y zT)b?Wl)q@UmM#o2tVDdk?&*+oisif;@S5XY)hE93rJc+cRs99zhNFT|0I6&W%Y*ItrYdi#n}S!kP!gzY_ld zZTLr778+b>CDyTMVIF0qYE@5?sq-=fRL<~(ndOx{C*yauhg1ImK$I&r!KJHWz$5UHAF7Xwv zgRe&(g=1+ahi}50FSaAdl0nAjZg*}EyC&d~>Gwb40cAF1w@LMf1TO{1INs6me_| z8qc;e;GN_d26-bj^N02(jihQRY2sfMHmhNHfvwijq)4C*lB`UG>|Bkb9=z9g;NK5w z-Wbtg*L0SPRJgmh5ldntX$HxqFvq;Al4Ey51nG=z?kgI!?)67*8l@H4aOo5-`?ts*Lc|Y69Wh!~es!&% z`WxN8?slqRDLic-Ph&zwbKJD{4Ry6{EWdK6a+1Sv9Y$L@!5K9*#;p#WIvcxL&_e$J z#N&;pfE%Gaa5@@`N}6j3&z~fatm}q|f~^VY0Kh+(sA2IS(2fJ=yS#oy;n8Id$E^38IHp5 z&$f0$F)W`c8?lc5gV56IUJd^MgxAA*r-%GQ6}sB%wle9>A~(sI7v(LVx_52ntj*$R z(qt^jgT@#YUcBSe`BkIgtLfwyHg?vh?HGS7+~DMN!RR}Fbx5Q0KJv!%Ouf0Z)dnv# z>E71sBPKVDm3_zRr}XVv@*ss+L*=sE;IS-0P=4qtrxwp6R zeXM$@Mm#*@Y*z?7ZBnS&{{U{hSgB}b`T@b`@ z*=1}Glyu{OYg-<90gdJ#n01R$Ig)gooNT1>kT2$6!9Z)&Bqu zy4&iotp5NhxL+-u+W_a(^u~D2a@FpSM-68AS=QTKi@ONrj6B|A4 zH_3T%9{GVJNN~!dZ%q9KQScrt?r&_bfy6Q&C@~6*7-Zxge;-=XxxTa0^tnd6cV%lF zYx}_?6b+MrzUS#(w581y&kq$(*wk@2KOX!*o-YU8$)w)BwXCs8=0t%Ta}F5@>bdnD zeQ{nPr`=oJqRFR;0JUwHVhfccJmawBej>Y%j#KC`T$sE&qg&~t02ctoadPAwyGPI` zp*?xxyvs?RJvUchv~vW@<;$L+9{&KIE44vNEf~?M>}n|^uDH35$zof-l_w*1{G56Y zKLc6%^L*ysSQSx*4?lQy2ae;`v~}G$$D$-rvq>2L09H@;{Xed2F6!j!I(#xTIhx;w zaM=d9X~x>4>*GFTnhCVAX<(0H<*>Vzv64o36;>CGZB|$TM;T^a*}?T5#;$*8wUkkf zqinx6@9um50QIPoOiOFFA(awAyJLOTKU%ddA30Yk>hPPZQ1K}_B!xWfJ%3SEW02oK zjD>?D{QitRs?_%(Y~;3_ml?`3w;+FoL#MjTqBg=6_Qv7s?OR6b269&%?Xolz4B(BY z9cx2JzIzQ-X13iM0vhj$V3qgTe7 zY%ps==E;Du)j(z4$CmwBf8Z_oX0dLVqc-&+hp!xaS8Ju({{X^g;rG#^R%@-_X|V+S zqCls54)|f)*P7$5?V4p&l#ezHf*bfpOlQ;{FXTIH@7h@>cR0`)%i+lN<1 zRUV9?r|Q#ax~vy^WYWQPYbwnQv79tcrz+}wK>&}Xex3fp-ybv|kDm^%yfg6$p#IG9 zY;9+Dm?+v#v9pJS=jBPj5+NNV1QU~Amu0s(&vRa%`!M`rZ-iboNp(h(`wLWLx73w5 zbWqujbR&@QJ{%uF!@YV^(H}8ZkJb}OAFE#s^()K$Hva&@zYwHl@t=VRMU`B!)hvJI zlUiT?l(tUPt$Asx@e4~GsH zQMR{L{{V^Yi>PLJher}dH-nr844~$_Gpgx+B+;zAL*Zsww7ql*qh$vONa#Ph2OUmw zD;AFuacSyEnP_E_L}^`yDaJ@-7ze5MIn83#h$OHq+vD1IjB?A=o=C^HrC*k2 z5bcfSj5?Uf3_)Ss9CoU@a)?tgM}h`2a(8F-p-oGz)(jdGUptIByroC%lNUQOX7=L zUy5G`p@FsSKGZ|v9W({brEaG#SmP#0)VWYT@IOlKyhC8uUM6)ra~vw6!j=daob~U= z>0Hi}d#HRV@mw07pKl$;pE88Lj2wbT)MF|+1YjKC)h$hTN6kMPyai#Z=@z~#@NtUc z!`ho2;SSSlBd`HTA9Q5&?0&W5-Yn2yj&mLBT*ovAY2aml-W|B@?_Xs6P4I1(!L4Kd z5>E<87NzjB#)Q75Y*TbPEV2g7;A8GH91+=$dRNY08h!{x@S^-fr`|~>mwCEdH*_q7 z9zrYs022X@dLE*(ohy>Aa2h-ocUn|XnVoMK`EelWBWHkd>)6s;YBuqfU6b2+QizC= z^Mlcs^B=&|}W#0|#(D$jIsRteb64dmEXfy$vCm@i1|moc{nm z^}|w{M(RnU=sy5y_FA`tEoJ`HySToVSwhU@I-iHH^hnfP$^D-)F`3)u%7y@B5`JM`J#XFA<+g?` zU7Nli_{(#x_$Ko}(r(j8oXYnPc$Nrn753oemyoADxa6AW{537L<%gH1`R%Cbkq%5t z=U=3!=6^A9ki~f()#kn!yNklwrTzLcyq3_Ew~k3lZ_gNgpLk<}qw8MPr2Kb2De%XK zuCF{PpxA$8S$%@W+eTuOC?qpnGCG{eyc5abjDyWYm6NcnblP0{evzYGcz;Fk?~An^ zX7I@OHtTVH1IKQt3rpuSd1GNC^>2z-(Of zc-6k^bsP+l)YdnNwBHeUn^==vJ~Y(ix3iDty^mRcwpx?-mEgD9sknd$$x<T<)df+m8bMvd`h4iFMetN0fwnt7~>mLCayKi)!W605VPnK_eotqw#Os z@7CMJx{i@$W95{NS*)IQy~`Z3vJfF*`1S2rH07~NW7_<8;A?THm+^&`nJ@O8vL(Ks zVHuY840E<;$x#}N?p)x5fnIyBd^6O(IOw{x8U^N=q~7>t7T)60eNsz!?ohT6C8kIz z#xi(*nQMBQUZH2{7vGU&xL+D zytmRWBE7bWq-#f#J=+obNLSPjho?ENbo@fPGPKtX=UvKGOpIBFm;J)OP6vEfr3!PF ztlri;-3vsrvukxCvve3%dWjq{qBb;;@?_Ia-k$J9b zzZ*0w8*BUPdwY29XCYh|(IU2y##8u!!2EftoepM`?ll{qM}E<_-(mfqbp1BbS~#^0 zJ+32SK?(M~Qb)-H{fO6&_^$yP%4vEIv3(YHT3Srt;3ilMXWIt7L-vc+ZSB4nct*+@ zl0$C>nWhrTT1~e0Z79Qk5#Gl?Q(i-JolC;ntPn#i%{s=RV{OF;m@|>wA8z&R$?VTh z2Or&8buQ|@GS$2jt7))!N_7`dLvEr~Rdt8E77vg}I8%=M-_cyvV(3a-bPa^8c2##V17$^_=z(E-+(*$*@ zdKR?$0_MX~U^$B7*_X^^Ui%lZ#~)6$^H_>8l=+$}OP-{e>HZ1TeiM8*)LMBPTGlP? zmPriDJ;jt$xLgZ;kusObIXEC-9<{*uzs1t(y2Xa4;l+nbv6e@c&dDV=g4`+Ez?nJu zLBacu4OkoO|hf)eLpR~!~2q0dijX1Z-3#TsA3+wFJzGfKGB z4d__lk=Uca>QBicbt-slA4=x_BWnX%)hCiU8b`QeBd}mllju7SZrQ1VJq$gThHb{Z z{hvFF7-5m5IWFiKPB{5<_2=nDWQ)(Uai20iz^+LD06hI@t+_mo&PCY$eDLpw?+9@f zyfND`-HVy`0t$e44pcW#2VZ)dT-B^JEjC+AYkezLyou3fuw?UMjRDC0;-06B^Tv6v zn)E-~%UqL5mfu!uXVh;QQqD(kw#r%d`ID99a58a@ymY2`+SgUpZ?x?{M!dV$F7Jth z$hU~CwZz9efRKQzw*=#H&PQIAz~JKS&yRJqInRza_TDY{iE6hx{)?vAG>sJNX|mp1 zRVTbyIRNA-X3KGrP558%3gYj?amnzj#qX_Y+rT2$!QywoCv37{N8FIZ9FCRfmUGGB z4JkEAyeoY@__;+!Y1ZZ|Vxwy_m(j12cS?FugWVgfjvWOr z-+6av-nKL!+sa!jBzd$8n`;ZEW-l2>Hwr(90nY^T4i0mUD@TW| zQqyP_y0hIiO&?rqnP%0cy_;)=EiL?Wgz5k#TL&F8jEb}H>sYkYygRJ!mhrCPylI#! z6;K%z1%2M7eQU^N{jdBRYXq`*qBeqCs65q@+SJ^X91$FWM+`{Ddt~#)bJ2d*+J2sI z{{Xf$^9*{ELx@DXlPS1lu+JDH<@LoMRh**qEj?^~8-IHTiZm(Xd)X}#)b49by*Np~ zfH(P}ush&$jC9Fb0x~i;O&AbAS!n70%Ksn931mrQvU$9zlJQH2XS)p zvoaNU#z{gtG55wBv8{W*+Z)6B=8o2OmYR}1!y`*9j54xr;WQ2;4osmu+^)PS%t(reH>Mv!-*-1$8=0Si5?zQT)S-ptw6Xzrmog_OZ?~^KD&NFE+Vj9a4R1fPv@LT{ zxYwgdv#vnVT-ndNCPj&|UP%#vUYl31QCmuc=B;7#Cek`RcT>@BFD(;Jvx?FvoBbl* z)>iX(1B^Q{z-;HIT=QIa#jlB)XTt3VP1RvbmDFuDNN%G^Z+1w*Sc56rFuPT`_pS*3 z)?O69)Ltz*N%bq4cgW+)4fcc7wns)Jle^zF=l&}3t(LuiHoxLq+t_uhcZsyyXe09y z+slwLM#YBRrvR2CB#c*H2P>Uf-RxyvqNc5L(e1o-;~x>+NvU|E4RI_Xxr!FlXVWfH z(%4MJeA9C$?wx=*Ql|j64l`Yxnu`1^(HF%Z6d5k{7z^2H5Jt@;nt?6*r$~@tWMD?( zqksij@bAZ;iJ!D@gd~632T{;${0XMnn{#bpqZ2GXO+Gxhx8H_KSp60;wWM$V09AH=5An3#C-`j-fV?TE-obUP zT#LPK?m060-N`v%?Zz$8akO$s9lH6BrQ$o^i#|Cz*0!@+$$A83O2g&{J%=Cm{4vk+Xui@Yj=5>{6Ej^^<`IDACX^({%} zVWE6A@W+;-;_mWNQ6z>o{yDe-+X6Vlxgl~##b5AL587(~0L8u}zW6iYeOYy1FIO7h z#NBe)iHly>QCG>*?N9vp*q~I#F!CTL<`QS!KW%^8Q&R9Yk)-RN52v@#z99J5N}kK% zo}F~ak@!o)#CdlfAeJT=OS`qicFN$DLby?xg?@7Bx?~z&l^5C8?lqSPk`P(tVoN)n z-!n5YC7k555=pN_C21+WMNfO`Sd*Kw)%))@7@KHtO85hQntWwnIu+b;&QPnfu68al zoSq5qkzW4*VWQaC{>%OhzVXH1gnU-_*9jelho{_2ZLM3t8G}zNBH~v@8Jq&XSaF@) zXTm%wpiQscTc($#&wC@j!5l;vc3^O<&xA~#g^oK{wfqtNo$owF;#hSdBw$zHpGQlj!DY&+PM9d{5NTP zeQR@Jt;aNQM{{c?ui`kg`5=vf+i+pGjn-(SWh@CJ9F92xkAeRHW_?rQ2Z^<-eM0F) z(#)}>nsHmGWRS1?v~UQGN(}M*Soh32k#QC8YaV&=7XA%Q>}0jlw7V!Kv|lZ><=7`+ z&AN9Rh$Z;Q9l^z6%`B4X2{L(eJ*!}zM;YkHzB9#rN8%rV-WzH3_tmt24BqOH#?Wea zZ6ueF$uf42dE{M=+w-zf5h{QBll#!Jn z=LGbrg+(DoYIjJ-&~>}p=#^%T5(&3_`#xYm#!2dWdiJ8$BXegYSIq9HHv=HUWDmW& z_-OF+d3uett>dahW&rG6(9Ikt9%ozHN*?U^CQxD`wmFtME{|wx3WJUc25?0xc8>Zfb*pvB%XMv91aCZ_g0PH<$thbF| zw;|Cai5xfldd6J(gYxn*{VE-P-osJQ+(Th+4a97WQEd>Vz~79JdK_`}=9elY#827- z!PeIEPTG`AlT1}3EP64^e7$(;4@z0TXs-rKW9CKT2qA^oteatH3I+(?060_B`Vm_2 z_N|cJ#TUK=&^$)z_N@<3Nw7qZ_HYcC^&=e{KU~qu zG|UM;IQU1z@xcYQyQSSUOhPbSrdH1bCmz@aiT*NpU}{6m@eQiYZp{|vnL+j1!M^W5 zTvnaG!krf0?mz8q4@E5sE5(a_trK=pgPe6IJa(mz;9j5NooHKVej4!o&F$ol%+f-{ zBK_uOQPCHZkdX~&tQfyqT(vM&$(L$&edpQ>GWYV~gpoAOO`pa`LpA1dH=&jfYg z=eVrDgnthI0JeNZdE!qMXtCZ}z0k4H^w^vCn)asH+MhTfV2FZbkb*knr#^>s@c#fx z(>ySq9Prh&b~-hJNqKv95(v?k8J1S)GDdJuJu743RI%yu{{X^q;z*X#OUqxecq2`b zKjZ_Z{Gx42MFZ!!pMs&V0LBJ)XX>z+DB+`itn(p>Sc;Oj!jAXF{sfQV$A+}e4g51r z67$Ad)~ObuuIh2x7rEB81OpL358bo20S4p2DhFKGws;4?L%|vhw&^6dxA*h4)}whZ zGT+=2^E-Vpf$Rn=gZL5Qo4qIE9nPoXt7xIV)HJo8(iR8(65WZ~0PDTEXFOz@_3L|a zEx3{i2=dh9&<=z8*P#_*)s>x*N5oMqdQ7Y~hD8iZ1A;>X$n`a&BmjKzv+i-f40i#} zFn>S7s(6YLG#l-uiSlrx8NuvN_|~ccvJlyiZ~%aCSYUPiD$a8oMUTkwp1g$Qgo%j< zrw2QKm*tA=W6*CjnIp2$Z$87S$z*T!oj{DYhqSgEUHQoSOrtTxoRV0aaa24BW^|t% zU+WiobL#U-(AsHQR0J&A)$uQsX-%y~jaqZIKnUXYWX*xd_IxsXkrK{2m$Bm944sXZ#kk{t6)< zj{H$^@JHZ9tv=tErroN8InSx$ug?t6Y#_82^N(G)+uw1|y;GA+ zI9;Tpl1bPyxW{jE&omj3>Y99W%CaTdXB_06#Gg-2Jt-}8m?erOTZP zrH})b#yCCk(A4ng3u&kw!JaiEIVF6}-0|t09zCl^OwQ^_=T?Y=U12GG>E>XMWAK~QGwn1jgPtzXbY!Jx|;Xn?fEB+nvR|bx@(0uc(grPoQ zY=#->$4t|-y%I~YG>vl{Y8WH479;9O)m45bHy)FcwPncpMyKw-p zAoGsERYun4)^Czo2ij(HxMUf6J20fVm4RUp{{Ux zT(^KUJwH~08NSZN^=M;lbYA9Ddb4 zExqt3!o4Eg>y3MDsAo~}2}BPCph&XO!z%@5elkL)K5W;|KODbnPY(QK_*vsm2%JPET|NUIooHl9=84`WG6~29cHxEsxn&`U^goW;rm_1w{1)+t!@CVL zLeQ^%B579o7P&S24XIv50b?%PN!7fYWoIg&0L0^tYvip@T-1IY-N9$!d&#sbsF=OY z#i>@BMsNURf8of_9`%kF3r?l0HScu)05j$%O*ek0ym$jZ@C-WhXdkr=rk`nlqJa*d z_Un|m)o-MlHo2biX(Ex9MRnK^NbU0}9dHMZe$iUQzY#2aJ>oq*bgd^zWJ^`kA=FLO zvdJ1V8@G>WSh5*Vs^@Mol1*@W&VzHS3zKrKG|0^}7Es0!#$;j8XOHPr?ff;RSVeCy z#642x)(1?(4Vw9_BIFz~A9S9$>6-MZQTLRa)R@t;=08Dy;FW(CG*65F00tuXQ>5wM z6wp2({56#LzrpC!ODvxdyg?#O5qqfEc`>wh*nynx{oJb9+!r2Wb7$~Pd?%_$@gKtR zc!%OfkE&nlnzHz6&V3(JwbbOjk>!NTyL5K;l5UMyFdI-E!;11B+5Z4j@Grwp7uopd z#B%D8_*YDhRJSnQ$hY!dGbx2J2@N8QHtZZJ*m>K>)!z=hbEN*)_nHQu;CMW7@QX*5 zE5Ui?t+K3e8pK#GQ2eNJhS0H z$187yKNGwQr|P%XwtoyY3&5JrmvhOECoa+{W^KymK$$E~;>72g`|rU202w?_b@3m; zo)P#Bd!zhJxACaewR>$I$5mgqTcx~!GCQ{pBaEtqlrPQ{1JI9{J`eu@!9C*rfb`gY zHGbO~hk<-epy+zY(!48WHO!LOCZJkEvfZPuW(XH@0(Pv5OALi015Nm+@t@$Aiab~1 zzlIv7r{R4|S!rXNShus&t?abxE3&Neq;iIFB)enA(BW1vFofj!HL|K$%F&v7S>3HK ze?F|m(~O>n(O}MCo7tp*V;hPO7$M^akza#5974EiltNR#bA>~{Tmh6`+<}9zA zsKFf9m3%|^=im?7uSwPJehk>?z8lfCe+yk`+J>p8%M|0oQbBT2B8~|Jv9$6Qb`dB5 zlmUxnMQMM*KK}q|%N<+cUGA6hFTlFD#2*^?3PiGpP`85O_e;69xKBFoP}J|)urFk9 zkrlpuqbe{-uE+K*)I1UJf8oc3{8{4*9S6f&YDKH-+91*`nWwW;$27w*Eu(pe;&tB4Twr59{&BB;vVV%! zH*J66?-gqoI;P(WB=&#lziMe!;7N{E7s-{yL$B7(7$(Tf_btxBa^{ zmhmTud{3%eYLeLaJ+1GCl?ihm+naE)m=!^l2~EL=JBS9SA6_)08Cv@7eShJCqxU(j zeuTaa_`9!s67d)94Heve8qHyg~4C*?(uBh#zQ{eFzJsgH^u=9(rAGSz>sV*vlIY$3HMQBo=%s z_&ejj8~E$RH+9nNm%(p+x9f^=j}zMYrZLlZwu)f=BaSOqu2E_XRLUh_!7?~cC8Bh(jpnW&y>i& zFdc^v`!HL4Q1FlKBcXT)_J7qi{{RSlQ1K?9{v6b!{?ay9kgJpD$9RJb(D@O(jt9)h zqhZ{`KTLc;_)qb(;_r?v{v7;H@wS7YU-;U>eNrt?SdKYh@g=pR#v-27K%!fD6f7>0 zg07t9$r(O3;&0e@;%$$_Z9>Drw{v)lN7QDwSUhj1+iEfCmnbp~+g`|~RSLnkVpb$B zNdSuXaP_0{O|MTb{%G%~Rc_hsKNr3y*nYuZ1wJDD2l(|h{{V)(U!}45qwvGWJ`S{= z%ll(dme|_cM%LpkVFJP)-0wMP*oiP3=KSIC{{V~bv@Z~7+N0iG#eb%lq_>sjWN$54 zFo_#EShyf#g$IGfeQ)to_5<9p-=fv-dll)Zpxqaeq8o_001hcK*&V@%*rxlj2=AZ!|<%q6KZuvodjT%epk-NoFhc)sMiP zf8l??3r~rEw$7vB4+y`Hbvqve=-wW?nCjQsd{E0OHRJ(Q#?33Zl&cMqM5=Ny!lMx5 zP3!%9h^=JLk3VFe7W_Q@psz3NzA5-`P4Q-_qiO#DVbgpwCFJnMBBEt3{P-}T6q6ZQ z0l^`G%K&*R&xrbmhQ2Roy6?izf*uC&UyHmRo@ACO6qDQBF%1x!OIHDMJk7&#;HtI` zF<)f()qD%!j}<4tpM|#iPlN9M8hBx*H=2Aasp@*{%1cXme{iZJ2s07#y8iLGI2iJ; zf_iqd@z(FbTBJJs`tFISA0xyUIxtI1nFX@#GcyzBIz}Z>#WV9SJZBz4#I-rkRZZJ} z>#51k)SbQ-dRM~#0D_tq#orA0!^ihO6m^>q8~hmXwbcG0Zw5kQ)bz&kc3bbboBbAK zxeX|h;fx=VS0JY!Bz$)GQI~a50AbOr|ki#%V*-Np98}Mp0#9rKYf1jE#pac*6b&1 zS6nbwEDPmIgV*8z00de1rd=-1_rjWnp{Y1=G;qUjEzO;`1sBg?Jh*@bu)DCLy-IXc zZBwDuN*0aNJx}&`@xoeo7T-C|*9V|8)%@YISR=gW&n>{AZ|G*?dCOURm#M z;9DqG)Xb3}eC&447Cf91No}IL4-b4hwefzfb*1=HDQ#uD)UFUiYZsY2!w_cUemtc4 zNXnd$b6MJi_ajKK)Yjui@cx%?Ftfdq#?e-L8D>lmv~J{rxyJ(p_sFga%j2Y)W$m@1 z#2(5Gw(mW&6uFW$B}}n9{mEG|^ApZ~wA?3C;V0S7dme*#tPcigAl{24xrCcbh%Gg7 z8s6I`=GdDPb1)xtf&d|j>s%+qe;8=~B=~6vvHJx2mA3%!VrB4q|wwe`? zGThwXfo}=BVYt5hVPr^#GJ5V9^%8h9N8fL8bz!UOcA9;jo|6lYAp%}Tg!!@{ZV$`y z;j-I^>MMiz5An|T;J%>K>DIP7<(=BPUTGSXMoTN4p+#p=)qp4YA8Yr%AhOo({1K=4 z5D9Olw{Pt$caXyb6TG=Fpg$~Vpb{8oh6A@a%9FdX%{nc&W7s|k_$Nxx{3mteeHJSj zbYm;p#{_FE_ZD(95f|EqcErI(Tkm|NWPw~yi+(o5o(k7IAE+hW#0|9|*ytcL2|s%? zr~rb>1_#W&GAkp+w;GRx=ht*-RyaYLEiT3jdy_0I?T3BEP8rHL1eIZ{7A2(_Ms-<4O8gVM4yn+dI2GrfHt^n!;qMsh3$EPinu6TRKHII4#$%W} zd9Kl}Glsz0034iju2)RgO^%@*)sjmK+sLxR8nI(;K@22Q>KFn&4Q}i9cK#sM?zIg@ zGDYpf%Bv*XCT5W2nLW#7gWtVWVeI7Jb5xvOrx~covs?L#B5#gBs~OJixa*$d^{aXo zuO7FoX>j<`;pNlpV>all+kB{ib_xjp0BHO5uGxGo;r(;L&UCwvCi>p!Tgz!W7rBuz z3tUFZcBlj&lLS{kFT+S9(qg!V_J1;OGkj877{nkSk&B)jIOmR?E3P#oYcqJwTE+qt z)h-+{7Upn5uTTl-55K*AzxzMylK6wgULQXJS61-1#7#d&ZDVm?!-th%wWglov2n;J3|EM&5HI<2;1J; z=+>56x@ys>~fqDNs89WPcsOKrkP;3>xpPp1Q?tw`~i-IdIYAteZq5wwoKFR<@f zx8)_2t3a_0xkhHrM^JD&<2@=GvCx^+_(wvM#8;-{R7+^I%U1cWi8z-BkeL2e(MRIV zHqTOMJSn2tEJ1 zrV0-z7C*dmoG(0e>+MQfj_0vx_p)l%sP>w6hiwbXv_O_{yqFvf*c@~4mk;Wqmfw}w1+aJoY^th*%0%0Xl7jmM> zo!H|n4@2~+zR!PuB(B!~0Bdlg%)4m7ZZLN!7z7c(2iG-RyTy2$qc|#6Pw@vl44#-H z@~vW7=fAgiginlrXX|ZFSd?7&F7#eun|5uc0y#m)ASo#RnOgX&(jPA9!{yC@cP>Wp zo}iy>b6=#E`Zd0}7516q0Rgeq?Ig0eXV1taU7-8mk(&JD)jT~vgY|2zCiSCxtq$@_ z3D^=ALllJr0oX7A`{&ZI#K&fK;b!d7OIfxFF4V(qZWnha=s(Y;MdV5LZHgj|cmuyZ zKpvmtR_{mJ8IH)n3{H1#9e-M=vT|bs=0EDrag27y^{zQ1)2Al2HKy03)AgGzX=EjL zd3OXTVC&G54+Qt;y=wTQ;+Kc*{5O6h^P!gA$}QT&2}Z_4MjNYS^dr4s=;9mIHkb3r zEv821FbgY=g>%MzkJhubZw=dP9uc|wXxBVLuT3}Ew9P8jBf)%Stz7Fm{q4og&Bf%B$j)V-9&CsE%m>O3u<6>dZf*_As-tDLg2Vj& zb<%jp!?(T-)~;>!dl-@J$%06kgo=k9Hz~m&cdl~HWb<7cY-|)@73Ifo>0aGCTIY$( zdIy7bVd5VS#pkdxg%HWOe-Q73_*OsJzQ?MvGL?n6I5_v`)0(aD?(6It+_u_=0l6P0 zJ4iVOx(^dr`M0r3nMISFHy9xL*PV!uvZ(E|KA$YF?WuCT(Ul{C6I;lo)&68EdS;Ny z#>yD(_YwC-@Rz(sa2*`SY_elQ$8n=GI-6V-l z#=|Z87>@tVv<2$)(-HEHfCJcKFyf8aM1g?OGl)w>N<` ziy)zI2>U<^7s{KXa5@I+J@Z&!F@U0@9_mzc#cz0TQ5TwI(ND9=b@C?|$q0G#J&5c_ zy%*$n`_6jw{iIHE`NYU2iGaxj-blHL&Rkd6-c7NM1RD@PZ&sA z+5kWpB#eF)%-`TzlkbZ3aLVZ%^d~h&1zV-*hWq>*1KzL zd6{}%(YAe+{{RH&{i^PK3#!^#-n_S0ejQz_ZaHmBNhkM^0oCMzkD8dt+6s=QzR9qM zP53qOH0hdE%vV1RJ|{C?Xw%0kn@u+UMG`b9dWDb!D*KlQpcVNG;a?Kpct6B;I=_Z) z8rM+MCQF-nK_d>QjN_6IAdcXX-oH%0WN(SOAMH2re&fMDD4*Guf`Ku5>+8dtF*UCyg)*j1*JOcsLoy zQR`V3awXQY1QE6sp=T0q;j%y@amGQx7{_c={v7y^QSqmTwJj6k95Kh^j|4ci)X_mt zw8OL%nmyfPkw)OdJmq?WP`OKudQcUaVU1OH8~__6{Jy;7@Th3<8aHh`-#$Mt2nv-z zdU5<-^`Mc3d1c7*)eGf`&PN0cRap14rsKEH@MHIy(H4_Cw}pU`GDhRZoPdCU$_F{6-u(C zi?<{IUz`Bh`u>$1?;qStN~-WOKo00N}5o{pDe=dVsHKw2n? zm5~9R3a8Dx0RI3EN8KD}apd%-u4tL&{uaN3!}^8KgnlGL_Kyu~o1idAGA-G=Hc!f| zexMvzoOq+*<9HumxcGDNS({SPHAOP`Z&sat;N{X1e&}exzyp#1uV?Z1h7-hEYAmr! zB#MQUI)Hc_kViQuoOH((ffkFVd~on2{sZ`#CB?n;G4ImvR$ty*G6Utw8+8u6`ekcX zu7hsJ#-1|p_N(yw#MgRc@-kdowpo!*$zyI+;%@45)3L~|U&NjYgtyu)mN}z!Eic$dPrzY?u=9|-(WxN9GXUK5Y^5-NpT_zN3MN|?OGZyi>?~@$*)W? zbXdI8HvPPCJ--fX#>B$%*tD)otZNf^n%OOEENx`6wQbY+Q3QBNz%7x`aodd7b>Y7o z__TeSQk@zZUE#U@&M2=KY-RAH zdE57qxE;k|_$%Yaso_lt^#1@3+Xy0<0V^O$Bvu&=Rb~VyzTUmMRrr5sjcZ5n_=?*4 z!Vf-kE2OqYNBgmT5)b0$G{6|+w|rMU8o{YXE_Dq@%CZq_U_+hOVH7f7kpq5vw|1Ycdn1X-Yc~5{{X`6UK=k9 z-bUKOBq}usn)crQBe`5*~f)0G(Q7q9vS}KL8{&)Vry&brSmkBN1BquFG3s;HkLg|;N(#sYis`imF+L!GOUI%{{SrJx42TNj4vmXT{eU8A4jmiyPL=U1HHY{ zk%G3VYvjpmA!Y~7k`X7E2036BxbKaAEAdvNuUqMV5{$;@M~P!Llgc7#*Jf3Y04x{| zyp9e!S6A@A_J`87&j((ed%{}(0QTGI*D(J8YUzciD{gj&d<=-fe1x+MHgTS4_Lzvr zn&B>J#^)LFTf({*g71_55gjtt*49bq-G*i(4UNY0pQpz$xmzYP3I)3po#015cM`oqO)i*WXugk&Y`Ckx7= z{G@PqDI@qu$)x?7JTH5rcq8Hq>M+Y^ajEJW9)^LJ4uw79{KeAYtjDzZ|T|oJNREk612^r_$N(OW;rq$q@F^={{RX37d_5KYlradn%Vd^ zX|7~-Llwlt`DABoXC+70y$ZhTJ&Yyo6UXj;BI-JC#6`ckmgLD}JBTJ%1;ksA$Qz-? zM?E;Mn^o~5_{HrmZiT(V!-SLU){7L|cV}|}jpvh|Ks_tVdmCE})|qLbI(XZ|-YB_2D>1sTxl47o#sET+5M1>nf!@5VTvswk)undNPtdLO zEkog+p?l!(1=++9{f_rpbn^V(01G;khJI9>0vG9Af_z4u_G!Nlw40~aEuBP{u(C|^ z5y9sNa4K=0!;UK8@Lz~7?8ILPFJ#m-Ipqx2_j8C|85wwH4}k2TZ7uCw4z;H0o(Ay* z);gqZrfOFB4q>0}7Cd3l;1kz_(!9=Hce$KmuFJZ&i5pw-RF_^Oig9vWt?Y6zjLP}i zakLC$7~Rxjwsp@1cz?t`4Hq5{Tcp&jotkK_ZbXtK8Ng!Q2p`_gNb6MeNNhZHrs`5_ zQtj~+ipC$a#tzlno#lza4nfH4-naf1cugVx$ngfdC8|wqOIX;nW^sDU#>pZaDuQwc zAdn4Ary6SP)l^jVJjr|kaj5CZb0y`Cm8os1J=?HJjyfPtP6vLR(O#wTli~b+4)Jh< z#@A6nsa(L9E+chlt(EdbL09g#Qb7Y4_oBCjX}G4AhTm9n*5}doe-5>e0NN&_Z{p1x zNVvRpjqIXw>4_0{ z2n0}tSAQ%qb|jtwCcK94#(P#_W2S0)gcg#CQ3Mm*z5pLK6C@1h8SDltMYWA?-W1hO zfh@F(GTwdWr>WVrvZP>gspgeooabl+o&l#iGj$ti`DC`aN8%60?Q`OFjCx2Gzu6WS zM();IJ9manstSDWkA?#!ut!`GRTA66ej(7|wb6gFZ+t?}_hf;lTar!~Oy};L9QxHA zBS4npS9q;_MQ00J!qUd5s=K5)Dvkm9iQ_owo^y)Y_=T+Mo(Ixwmh)e*e-ch2xw!t$ zu~KZ5@S*2XusW4of;k6(YgtfHvPg9y(jlt;&K@Q=ZF6T}kcGC6Xzig39h{NnluH}P z!^>9Np1(m{*M&YDUu&K*mrU^u%IMNrysdK_*Be57zz~=xaXopHiVEUmBShS1wv+M#C<6je~fyE1NMBo5Dj>ri0t((A6pY^qcYyRUE9wK ze5|?1+0OuU&U;q09H%KlQMI~@mPcGIEj$~j%?70=p#;`{BQKJSZk!*LNx}I@JQL3& zHFI6m^xug#_HAWvqj*wHE!ooMdzmCREW;UfBW~~s7#v_%B__3fsM%aJXpS!kl52w@ zd0QCdl6e{Ho=sS=)6TzPJ-yBSy_&8ik)`>ONY5Yvlb=u4yHz!?h_r>#^q&@6j}dAI zP}8Hi5<9^c$#6GvszA=u&meKdb-LG!u6`YA_tShkj=|!0RZ@1J-M`FZeC`JTfyYui zR{^hR$)Q|@(ykX$48ddwrGy-JKg0;-MBTW;C~IWM4E=H1}+%4lM#_Yhys3d zp6B>;^{uGkeWa|2oYWSj?+9oqp;>vCpsmcKZ0gv|Yn+4w^(MU+!9NZz{vq66L8ng? zHj%_`E+&OHN3{TOjh>F@00HmCa#|;buRKerL1E$hc_h2LaFC6lE=yx`6Wb>|_RqC_ z347t2zlMGs(mon|AwfTj{7}GLGAJtyP5!>(RzG!d@~J()PjZb2(@Mt#>Pn-#H*I_- zpS3r{5#ZeknLG#K?;>vyT-y@Mc_>}WWRKCtal0Kk&r0ZiGyF!i@z${(h2ha?d?(?S z7Ud#A9D0S+d?X``7~{uIUu~!U&R+`jkA`0do-13KV=buNz=0m#CI`*9>%@+7 zsyi<=%6L0Ojpw(D)nf7>Qntv&*5E4#O!(>z-+nzo)!g#BofUvNq>DWq%$q+a|uI zHn$s{j3>%|7DB^odV`;T=|#wsyDJTkYnhG%9tarkfPS9znhPuIH>iQ+G9*$)!{s>n zfzQ7Kr=?g}Ji`fR1%M}ReqG+D+zNwDA7=3d@)8_PYL15`c5PxXefj!Q+=(lf$#j{_ zhjGZ-5AkRG_4KDh8%Bz(HjLl}8OD0#_Y~1_EV9T3%mqIv9ldkfuC0gJEg0S}*`+wb z=lxbW+{5YLzGw!tvB!K@lO7V(ZSc~UWo2H#bv&M*O5l7;txb1jWeiA?RVv_ zByW`!cXC;d00ND{M&>7rb=%z!#tZP%;Mhq#Y2xd27dOcs^QOW$n(AZxJ3$Jc-ff^$ zzBPEmz`wKK!KwT&bp`du!moz@R65e34{`AiU3|1!5_7s-z9zen;X>hEiitq8@Yloo z&%wV8Txy;rk=NqS#IR+SaT>^;9J7rJmQu$CJ7i!^e)OyXuaLiMZxiTW5VXw;`wnda zKMH8YI8vI&r7D;(rppFKd4r zz9eh@Hu%EuYThRCJ<*o#B3O%L1gsX8=K~Qyn2i(w4h!Hj5_q4AzYz6!u11-v+({JX z97rxVD_bGxtB?pd=QY&p+SmLbmsYEFr)ihBs=H^mmUEOwJBci#DEQ=Yo@>tad%Gyo z>Q57CdbFv2%+UdMWMEkQxRP_dh~uwp*PQBeJDRz3YEbY`h=z@OYBWI0D4k+iu%tS( zfO_;LPbRQ@MWNnl-Xql2j-qVsE+#G-;ff#*c_Vf)&!#x9V$#25?K{ExMw_U3?_Ii< z@d_Md>-09qu>oL4SU7WY%MmS z5B9E=roKZ763{RvRl=1d{JqKOYW!5O);=d%z5cVR>Ao=4?Bx3`_1)_riommFRBcr; z0L*d%g;Gah#uJ=np-+}eW0%wZKWe@X@y@fW>6h2?L##nENp55XElhyrVBQ!+ptBu` zg&VL1Pjlj1?E+0+UjUC0!QrTq+(@U~>Ms>PQ@St3MGuX=~#v4-8uABI4d# z4J@{-k`Ixu*|PFPbB00=K|GE@=cNsIOh{!CL#sikc`fD0i)>()7g9l1-NEid4iDv7 zHn%@%F0q(hHx@g7Qa2|kidbT_zzQF=i$3KKWaY` zX;S!>!t%$%x?cFN8Kg~@l4VBtgH7d^esBw4wq|ee{mJGVi@DvKX#pzdt)Ds zT(mG;+~zo84}x-ljibLEzNVv$k0?pGn0&bM*CQUhbDr3y-0BgmxRyrR>OfSF?sLMC z-!LwE2|V$CXlF0B1g@-1Ae| z+?_|nDIAc^B15K3$_r;ZSuhlyz!Ui6(xjhDg3ty@E?PHosy73{>^S*I6`wIJ^fw@g z&1RQ&u)=mpw6tu*o;fb0e57abs(Qtmqd%Ik?I2?Z41;jTBcL6Al@6Rujkax`R*6xI zxNXWw@9q!jPVq|_G{Dvq1%SpG(;y7w5J!G0wsL-LRb=OfUQTJ}1^OJwhGuCAe6 zlB5p3c<-OWjYsB*?j@H{klyN-sOlsLWZDQ~Glaky&U<>A?R*d5xpX9x$@5oQ)ItXG zz5if zhX;ky-Y*$=vKCDhr$q~+*@OH2Qs5p`D&(r4yv0WuIQks33Cg+Vw>+G5oo1;+W6r!+ z;C~OvqU)0UOLspGz8{$HykByRUA#f4f*#*Qw^jM2`L-EUaCd~k%K>-xZt#Am@q@-U z9y<7?W*}?5vqz?ZwQNA*D`g!5M4WNKIX&wm<9@4Q@iXEEh2UR>M(BJr_pQ+p)tXa$KEy?+t9I3CNJ{@>Xbgc^AZ5M_Lcel(-A8zel=HX79XhW7HIt(E` zFRMw6K97vA@da!E0rbb~UCeK?7Av1A(1LNu9{&JO>s)7tmEriQrnVRxoi07|lVGPU{k=r=DI2;NH(k4$&>_O6e@`XpMuppU9b zH2Vu!eEYkJepR-KMp=%2=m2#+&1B!&PprcBRyNOdaeo^Hw1>ho z+uUBnz8LW2s}{9%85uSGO&5RI12G`mM1h)i>{q@Bq}`Rx=~L%v9xwZ8{B^MXll~OT z@q5J)YeP`HiYp%v=#X8TNp#&dN5FYl;HA~;0E(mLR3)-Guf(s6{yxB^+Lmi#3%+cft2d$e$=2nw#@ zyKfm|(?6)L$47gsOUUIbxn%3TLEbua6>q?P9<$MGp4(6=(oO-HV*r3a!j0Y74D(xU zr>dM>fdXtj5Zqfze$8)gfreRRa&gZ?QGdcgaVUr*?RF%x z2=F=dZ*KmTxp!+7)cjco5*#K;8RHz|{Pd<-XqMhnEyN=rY#39O^<19c&a>ttQy*N@ z?i=@dy2##X44?s%ft=@{_Z3FV!{$rF94bhWakw^BhhBRD{sz0tUk8bgmwgS`hi@^< z$~SC2KMpHKT_a{K^xZnrWGS@o7{lkksN;%vxUX}L(>yn0X(#$k?ZP4Z%mRf2jP1pB z_Fe_Bl2|Th)Fyj<>O%<*NCS-HrAIe~2BWe)LK|CfIA@76N9XBX4~MinZ6{8VW4xK6 zZb_GD0Q5UXI0yd#)k@=uRV@@>f1)ULKQ>R@UVHlV$*l-GGK z@I;IDOSPRL7}^sH&m4OGJw;o!n{;t3_R7E(1vD3b`TGN|mT1_nJ3 zT#l7ieG*tm7BQDjc-o>!h6hhlPfEWnyfL_u%Bz#OfTXtv(0cLuS4S3trUaR;5teQ+ z6sZ^;!SC%tL^fsoC-9uwhr~MtmffB-SDH!WiaBu0{;zOwR3`m_iBr?3HSZn___t-P zY8QG|zZZqBb*no_?-K57G_be5zGh!8&cZmCAV^DQQclspQa z$R8=kIIlk$LDjl)vOJ8&Dqj<_G`>52(4GQshwY(gcZLmj#R_a?@I~gIEczo(7@1(d zyCY*(8(}Ro%wK zQb54ZQU}sMv{%6ma>qiq@Xv?*H+N|~wvVXj)|Yc7!|LNW5aCN7K34gNCk0qw^~N`d zzu=Z8&*A5a^&MMRyV5n!32C3(`pt#ajL_Wa5X2*AODjYT_PyKB&Q93OWM?N8=wT%a zG~)?9^z~_+sf|Sf-h7h4j~0QVeRYzbhU?InFu{QNzKe z4~E_+vAOX*xi;~WB0$Am<%E9*PH@M7N$Jij(QdpMp=uF}PXuaK`jy?m^V;@k4ZKq# z5CrXTbLGZ&D{N550QIgTRPct8;p_X0-xuG>;s|c!@@>te62onF#~7FGS;v>dVF%1c z4lC8Buc2w9C&k|uue@ukTU~1LeVwg|`y^2Vi*QfM5eUG*ILsQk+HZ|y12NS?D=71ezD<#oxL%WUL$qm+bhctvRhi&DrtDrym%UkWeS2D*RmhqhKX2SRD$mg8Y)}+|Vy==x>FqS@$rHlcGRhMv!eSVFUHMwy9i^O(bKV!VNq z+kVrx{{RZSTYIPKKeWe*Z#171={_scVQ&SXyL&xf!|Ua=_f0rYvqkcUP05#XyGdM( ze0}0ruWVtu)C3on))%)gHL6_h^BylVD)MIx*(8upCpqg~7sYRm`me_w6TsGfKD5%T zzu^n;>CtSS-5frpv4Q(d(>W#Qd?;c#IODx%N`j{-yX~PdjpV$KrN3t%irxXZ_><#L z4)_=1WzX#A;O%AgPa0|3{mPe(k`xhX`doGbLXxv9H_GF1RRny*?eHIkKeaBm;LUms zXT?_bekGpr);J9Mj_vv@5?V=N{uOh*m5Cgv1F#k4amzLR&;b@Xae&HBeOoy8?b4ED zeX{+P%+~WR)+3+DcJ!;A8gq{<$yDosng+~7XCS)oD9zbQU4EPuOPW&*w{f#w0g})x`yg?U^JW=C)I`ZGgaX}j= zh4f2Eqd^QZD~W+(jD|H`h$MM3NWt9F{w>>S+K#p3PZ^6(iaspx{phlmd;4#+>DrtR z5U);q!lUq-sor$}Fdlm|~ctm&1d(SnzXQeV6RJWqshSKg1sxd{?C2=sysA zRD3ZOwJpkNNv25^vjn)ixPXS31c;$ig;@wgo=Eer1OCz;Ao!)Ec-L9B_{nqd)Jdhb zzPF6!y^ZvlSJfACWaZ4cq^?5FX6#h(v8 zB-|y&v321cUct33BU098jW^jBl$4TDvUv(y$U##XI#gPd zgJ&nD{Ac((@JHj^mp`+1ouFHIAH|Iqg5=h9Yk4KmB9b}8H(I^LluSgCw51GQY1+Uu z@VRRAJ$Lrj_*G%4_=Ce=7H(zm?t$Qaa^pak#1^(uJ*SE7Jhl)et&}^aoq@r^s6bzK zG1J8CKVZ!-TZhNG55jK|-T3#%p9?MKi&F5N-I9}ase;;fKe4PRqjo022IP1&*!ZO;X=Xi0V3)l;UYwp_$aD zo{I@d7jN!?Qox5&Xu?|>d6)xT=527b`L6Z~~; zW#PR>3tbb z`&?e@pAWn-;M?21C&Sk|8cF4Nr%Q@?64jCjx0o9}Tr6@ja0yXfiThN18Tjv`cml`5 zzp~x8jQmk9o25RH<9#lDRc%vQ(j;RbOS?(fTg+~Dyp1#fNf{(4Ib&Zt{?XsGZ-agX zc$)Xczq8-N-voGy<4;&LX*G>!N@?^}xcfYhGTPY}UALf0=`KL~nd^~W?pWnkj4Dap z`FS1mY~ZGzr`p<2;Ll6uxu^4C&a z^(TF9zsTl}6PA4K?t4$d3+vC?JICH8)VxJ5qoZkX>5{&ue`#>uZN$qXOtz-uA-2k{ z;m=kIF^-k?pX{ysQfvPJ9RC1jty(YG`{4GG;ctnWYR7lr%`3wi6X~{k{*z&I1M0eq z-b_*nt`a7W31derOLC_;ugbkI#yY2lEp;nT4eB?RmfFM*ZFdY$`@5K!V24wXPCMfx zu@(9u`!Igco+ACM`~~6NQ^dMukA}Pl`zClJ?5}O%oladhQq*ttV)iYmM%#R~xpD(M zc-Y8aoVG`yUk^*!w^3dzTYp>MW4h3cIiASnJUig;h~Ks<=-v_ik0J42h)A?bxUN^Pl%=8aMA_3Wq6)6Jj4f&|z+ju`F)&TL4sbUR4@&dvPmOPFBE8OsqFoq7kwVuNVqYV0$4rgKfOmEv8pPM` zAiTEwMu=4cjnYO_EP2N#zffx{O|ZzC=JGjJRX|gnio3YZeFl40)ak9>@+tL8n-+iKolqDjP!%vZ&m>}3*I6*lwv6YF)+a3VB(sC8?w09=CUkCW!-@=|STm5?2UBe8kB$gXDLwKFz zm2v?>2?ctb)j}M_LZ34|W8%f;gQjTu)Hip9C>%dZwz?(sINJJ}#uiS+ zk!dxIq}zF^mf3^D42tW17HXFM8u4wl-;1r;Y$T3Ld8LvcIK-@^ZjF05#seJVCb``* zeMWsoJ9t%=RReHk$sg^IdFfjc_yS|?C{crwRuY;+jwQ$2KK zPqR6P)Mc{O#JXgXp^ASx0uL%fWm_NK;2hMN&bfQyJz`tUc4=;|r8#$y<(tq}-^7mt z+W23^lUsOd>|a~NipBiE%@dK9jf(I}^dxbbucP=={t}y* ziqTD5LsccEjO#JvvY6UQ82$BAj1NG4YkNg~J5tnQ8nK@@83JZ-1O#$3p1nF%nY;sG zr&~ibnvJBe%5n)T6^|qDjxb2zfzal*Ti{*9`hA4j9qpE&^Uos7VzX@d(ScZ^kdK+l zWRP);RuXZ2Or>YLDr%n#n#OOp*m#ddKWn!)HtlP3xuyW^e1U@*&OTF`=XJ~dNmkm@ zeMnv+#vn+cl(AI}kc>KmlbY@RFX-vxuM)PS;Ee)J12Ke>&6NaCEMO@R`D1GngVf}j zqPJm;yoL9P!D>$Gvrb2L2sr{{RzwQQ`Xw%NZ8(_f$4FQBA2EUos;LxS4KW z<&Bi1We7Wn0CI6%rT6S{;?E3e$5_zJdi{=k5$7%Z?=rsBAqNed_BG;vvEPP19{AJ2Fa3$5 zcz?k@C;rfnRIq68-uqB0n}lc1y8vE8CoY9^fXs&kSJUUj5=}IQ{w28#2cA^zQrN~q zWZ-0H9OH~v1}4f{9=;y@wqjYuJeCM8?d4-5bz7w)uLyI4>P~-^OwAHlMm2a_D%d2* z3{Q{Y4cPwxg+*xdY4)?5co`#nBanfl8Q_tgp!#*IR_kEascmA{j)|8M%N`e#*BScz z*EQ~Rrcs9dW4zct%%HChA2|f@Kl=51Pqnm?+C?*_7C^}x8Lf_f3 z!tuD<T=Yn&NXhkM@zwJl+U+JH+W|N`ac;CZ1?!RT?31_yBTO0JX@+5}`<`4Jx z4cz|#vx@R`{{Vu`{4$L;pNGCSMGLoKzqGhqbCJuAr@eGv@KaBRcV7}eWE+_*A=EGR z4-RW~m(W{7ZqmNTCJA<`g2V-Uwm8LpWNJSQyhEn%I*x~}L51I$blZg5r+|4u!S%0C z4MLq*DOlyLR#BCa`ah%p0KsMc5Q&jBZwdTOh9yz+s##nFVcgM!k5EQy z(?4bZ02Ifec=}5_+uL{`)#CDyyvw)G2QiEj-z9VJig>IPB~9|JcP|Z!lxD7d1$%6{ zVL1V1Ks)3U=tt*S+NHbM0dWW~j4NQ0NbXOkuc+p?ZvokoxM7{R;FHEj`R22)Ad=-w zXabo&Y$@eQ7$c6E>zetAXnid=eM*-eb((_%pd=Ek!;katT?dD>=CSddGhJC-Y}Ith zVpV9`BC5nPkpBSPVx(>djEca6Y__cmA!m*DVCOi;KZSZuhpOH9kKz5hEZ%JX9FSW$ zRLiV9d1u@VjGmlU9@p5(Ozd#_#WzgwzaIP_xQA7S<6FJa?c=+Y&2y#O-J@MvqOMGm zCm2EUjP*Gc4(bK5TczeFZhm6w&h1ha{X|LZDZ(b(&5D zxHwklu0?gXdW&j0eYCdho?OGtK!1U{GXA;6at^PnTE_%%?I4n%efQ@$&uZE5sDVTa!b@cim)Q|FEPqqhNw_7zimGiykOT}|HJR%G)5Dszy>AFs7nw!Ubr zE_BPWyUHbyF*HaP3nwrwsG#GV@c-~xCC z7~>@4(0v6t%V`s9=wKNZNDOkW^*pKcBc&EleX8I0!)l+9^PlsdT3rmu9mJOM{{YJ# zKqDcspZ@?|T)VVgF6>B(Ue@V)=NntU(yC6+l?AR;O+3YKFnfbjU%9jd!@M%!?gyb2dsu(?O!V0=;!wJ^ zqK3VVFa^p0F*2zBA%GZHZ7pMDc^JwrFPR*_i};!)UYmaIf6w_9&T2>f81+2&>(aJ$ z`5Yt^f+(}mQ1xAn-4f7_pem_mp(VY!oM1Qmr~RvveGqaP_@dp&8A(Ze2cUl0an7c zcqn<`SCSXUC!EvcZ!m>CgTWZiYXrGn&g@JhTAPDM>=%f!>Zo43cX`pa2_Uc?O>9W^ejYFhT``Fp>2QJ#Z3tQ=G{T?tj>BPip!rPtt8Z1^i?G z0EBeBE%5K+BO9$6<8hE$UANCAuUVX>r>4~2u%ej5jsswf^2a{;!2+wnGr;AeXC7uY zfB^%Z-iNknSSwo(Esp5b$^p&~CqDf;nwtTQrA&_$rJw#jCv&;U%zK}YkaYl7lfaW) zGDjnQ;$m>P44pY0zola6#pBcB^ILqI1f|9a$^I|!t<65w=0M8XZXJn-noz355ZQ}b3^e<;aqcz8i^Tr`56FkZdXV3R0lv#2JdAUYdixyLn8`bh zI$L|SMUCX%E@X>)f;t8C2ci8dlD!pcv8QLLtKscsbZ4F|C(N^vZNmA;0h-1mg3l9Y zzj6K*)@k1i=C<%AqpxYcJku{OWtJI84LP`spgUupP<~wCZ9qB5=NYdkwwmW!*CB#C zh}psNBwgD!5AQ1v&!1}D(4^7rZ8a?u#QrvyNNeXripJkfd&6);a3|Of+>$vQ5#GGD zPEy#`*DTz8MbOlw`k#ha?p>D-*Ceu%yzRii9Os_3TS(Ki9Y;dEyh-&7WJDp}Ru2rs zo*N^l7#vqep!^2a?|erEr^DH7yhEtKjc_bA4I1jo;%L(ZvRcZyb@_tjm?_9Psr+~0 zTi*nHL!UzUlVxNsEJ`)qp@ds~l0pM2n9m&u&ph>{?M>N~q>mqW25DT$6r-qZ*(01( zT2!`?OdD0R7g6K_+sMEjhu65TXT114`px|7rTAtt^V_w=O%BNI_K&>bi2xql{uRP} zRQP#k@bbpSDeOE?r0Tb7UT81GGFr}qg7)%6PT|lH&A1cD0E*r+jI>2LCUI-8Po-+f zd83hOEE1Q2V<-1LPFJ1|dU{v1{>}dY6zB2JidVyb5iaa5E%mshvRQAYTYMMGW6fc= zo=DCPQ~*wE#RixzB~fZ#X?Gu&Zzs@IjWH4OlEN+#KyZwK@i&&86EUL*JwUdQly^on711GN);$9%}wvn&jJx4;BqL`$=O>Po^7u*4_9i!N zBg#K({dIg}`&szbOJM5SbXs3uMxy2RtFa)j%m;D~J;$Ycm73MF=qdY=O`ZqgsdSAmSQi&IuXO@^$fibw zh5%reUPu_`y7+z}rnr`q_^Zmh7D1LM7`r=@lZJfs1o4nb?rO)6e`j5LLe{Kf@ZN)U zsWzh+D%K3wDD8sBa}Sn2J;3y)_#@$!$A^4itMMmExLEBKo$Xpt6pq|u=I0#t9dTYp zCQ+BYa-%59Eu+2oZ{mBe3V30)$MD17>XOV%0^arft98lR9t8|nIplZmU0=g*ANW_r z5?w!tJU<<&c~xe#xPTuduwq>|jn28o4{mFZ_?HHwr_8rj8h)*$&veTx#L~uL$-o13 zyO0YE4X#1TSm6l<^I*S)NG`ZYosbbFrzA!4fn}j03GWe!_iv5jcnoYUbA%!#>Pg6S=1$H zEs^ue`DXz1IY2XxwT*r8C;kzi9$zF{kBC0NV}G~9WwKb3WnbM*6E-mewsNXBf<osYaUDS2E)VJkB#*^pY2(EMGeHomhqK?Ilv!3b|7E^djmyf_>aU^I_9}` zd21S2$vcB3vpF7H0fUToJ#cf$G*_~vQYj^KsxswPXQ%%F!e6ZD(n_8h)o--;?n;Li zlQaz?j&Q{}AAuf~nc{70Qq`=YI>q*>e+v`1+}ym|oE+tYF&WN1>RX`GMYy)nuqajI z1G&$>Gv5_L>hwzp5zNUEJzV61IL13?AlJJ%tDaO>LALjf@&{Za$CgY8!O)+9l;k1k%c{_+XKS5ZA?WDRX7918kOAVl$_B9LKt1xL}Z;+P4 zx5`F;TEW3y<8dyvTIkf`f}{n4I+ zvaJ;qhma~4<8vJ6o}hbY^sWB@5BZk2W6W*n?}8hFf-pJn>x$7t&Tm4Vk9Ttov-ulJ z%a-|uP5>O|r#x|6dQFd?rQRl{vxuZ3Mk?9J;3&ZSc&l*f%Pd2Dz$|}pVr-SjH@{3_kbc`~cS#bZ;s8Jnmh`0?Bh_p&jj+} z>hKW`nP6TmB0H%u6DU75%c$hL9Pm12YpY`uvAX1TnX+wVER z5u)QI6M=z_G4EZkhjiO`B0zWUM=Q0X+aWl~!9543&{kK2!pET7sy)gbD@?PrWMEJ+igU^Xs2ut~3~Z<1IMB=QmP~u9+pX5`8YtK!=jQplb_emQRxB?3V`sB`ZT5Lc zWb2F!{{Sj?v7*%4vD4b_X;{d+(5jImg~oI95!`W)!m0S1T#x%Ci-(fp?nARBvWkO` zygr2f6?;*;@_}T+Z{?#LcIw1*6~*|!R(rNvco&vzCLbn1f4z?0{RK_fTKXKuu^Vf* z>u)4lbmRNqLl&)UQ+I zd!>)~)f@M5jB@;ez^y-xb6)&J@pYHNUxqTzX?Lx}E_Lh6a?aXjni~z4=p~f??Li=n zl0NCLIQ_1EJL$g%v<*Jb;q9i5o)qv6)OvoCr%5JLU)Ez^+{6jt;IkX0ldfc5#V}@d zIaSSR!&8&}sXu8)kHrt+zY`rzHP0MD_P-K6p(*`?r6?xTM}lPlE4dzgG&I^rU^BV4%f0z{<-8q_b}Xy5w&>61#ntti+m@p_>)kZ$B(F3OMZ$4+*-_*OK*lHiFM^W z0sJSN^{*1MbtlZunO(ClN!NA#Q^h`Y%V~3JHh;eIUklq? zuNlGNJKaU6Xzp&MylBEka(0dY7(EClit^jP6G?yKNt$cJDYlX0f_3@Ss%ISF2H=lO z@@sQL_^GJsT1+}`iK36hT1}IA(Ls2MO|aTiF~~5(0OKb-S0zO)EIv`*F!7ss1H`7n z$5qp;t*oY5Vvt@t#O}ZnuOVP1PYpBZZ~ z`0D%n4^Yxl8)A}v;s_NcJ3z@myp|n@;ZYwkTT_nl&cCl{_xI9xLTzTpMU;r-n%7T~ z($-XSzXgKjK5v)}z>c-d-Ak3l@9H;DD!M@?%xQyHJ`MCrx)fR5w%6|iaJL!!6uVFp?2}e zO01G3Y`#(x$YY;cxvhL3)I33`>9!gzjJH=p0R&hfqLmc37-y6vaBzBLS6}h#;kKqU z3ojFDdX}qoVXFad$#HpY_F)pPBULdubCnz`00s{OiqY^VhNAHgg!HRulf*FG+Nro} z?K1F5F2LAUSPv&}3%jQkYQ5Fa`R}R7_$%Nw{ojY>);=Oy>Uv(4w8Lv2*u~w{gce7M zn3WNojtP(q;C?uouY;9soxCiESh19cjr^bVh@)(fXJr8cj1YGEX1#mGo(9t=_J>jE3hB{D za5)5yayX|N&Pzi`yWDTU&kHuOsjS+8kL>YBoU3x2WllO3Z|@Fz*Vn!W(5^HM3KOR9 zl1QKqJjk|$-~tACY>xOGSB`$qo&|aI>woO&Bw03%ic}K`&Nik;Aoa=m8uo1rJQoN#i4v(0A`xR-4$nT+z0>l6P?_i5GqY1*5-G|!f6#dV7&6Dj5sp$fFAd({_ z`;ehK50p8`Is9tHui7Giovm=#D#9`kPK4(J`EyxYP&F*AUgfSKXj0YUhj?HEM)97! zXRln*2AM7UFnSTw4Jy*xgwU8AeVN{Yk9*`xJ)G z>Kl1X5=5oNx}!K^LBfO3gZc{ABDKv4tz&kSKEC6_I!Z}jBmM!0DuROiIlj9GI@BBrsyqAXNX-<&WWbeA%e|vW#{{Vhd z$REOrqqTiJ6|_bwoMO4Uk$evDJbG=(nkR{#O}pJN$+)j0*+)mFa$8nJR>1hbJd)FngcJ(zi~= za@^*$*$jUWbRmW;_L8A&0x`JqJx@bje7n>%xeUrl!RkQu{PXm#Xy~sGi@ZN`B$4f9 znHg0;8%g^1>FZs-o^<^mOw@cu2vk+>bQ{{%q$bYf$G3VTo=T2KBM97_F$ohBw3LpDiKkPs7F8=eyF9iPp z6g+Ga&MhuA^AgeAZ?@CKV+6x(5cBRNBobF{er>h*@VECmjrHC3w{df*YPyBQmp9sl z%-&@Bjl-~KnoMvDb{qvz6ab(B<>nZdNm@Iz>2j1Au`7<6!BI zeSPY>MB{XBlDH@D1AsXlJNja#n$k(;1&n)Lu)v;&rbqLsp|XvBSD25RYVCd7hI)WG z$G=MX*FLAxm9H&flHPr+`F;-GU5{VOJ-wnt#!)vT#=2plcdk+5qg>I&u1GxJy z1Qr3q0l4-Ackj(iGyw_+ofc>j?zAz^Yp5gz82kUDYc4OCbt{ennHJ}=yBNlP(`{D>iW7^TOwS` z9G+0gD!^^WaxxJbXO(FZ(0>GPLlo!fzCKU+gP4m2q_hh%YWK7!uM- z)L z9lTEWUj;l-A&GFy46qPST!J43v)ol%zu3>?oq&?+=ipDoPqHY)k_h3DFRoY2EHl6u zA6osaPZ8*s(tV!8#CjsMY^=`|;i9)W$lH_i9D*_idFfkTAn}Yh4D;Lg!p*O2;y)x> zf)}{YU=@JQF^)P8Y80c^B(*N*;k$eW_@SXjpWD9%{v+6klq$~pO14fq0E~WYde(i< zgZ0ZjNT-OjKNH(soCLO)MV)4oJq7}u#CPC(*Y5X)zB9pTZT2l{<4zK7Z}fw3vO3A! zmEDhU`S!1f{xSHoQ~v;ln9`=P)MdW&rhhGj;X{IY`CWM(&swi(3u=k?yPpEuN8;~> z8r0f_mxMkbXzO^Q2Dz8R6SPyS5xHY&A}R|7Bjq{g6{oLj@X4s$-b3ME71)U#Qf)5Z zN4%WONhO_wE+LqVC`iUm(nuMv)c*hxd{b>J;l<FONw@~St9gV5DYgds% zM{{u*c6k~eSR(BQt_cGln?JX|{1gLI@mIp%4QL+*zA5-V9Wz3i()tk6{{U`C@sW#{ zlqmZ-oDLJ_C>sZp$37;4t1G5>*x%o7eCG$n%dZ)D^HTATiuC^g8#bS%Lg@gs)DqiJ zh%d;eC6q;j#yBId1RDB}_EOh1&xhXx?{)nf;#G#Zp?I3bJe!Su)5NoA@Cgcilq@A= zb&!pY^2owMN#_;vzrtUE-YnF7S)#?`J5K-`eOAg%W@Wm)ZD!^rNraKxNdzhi$m(0m zF7LgRlhX&#eg%9})?@g!;ZF^G16@813s;)zKNQ7fVw!3#<6N1YuCAu}V_2h%u|x+P zuUrb_$I+`QJha`V{eCBjH9BdedH3z}@Yle<3A`(zPw)>z@!hA2ukQCn3>rj|_+sMT zL=4i~OclP)(3NlWRoWF;mR-A8e1Wh0K-BdeHd`H7PcE8S#Fqa6WdwaL{4>4f^~5qje$5yht_rH)0OJJb9Qy|15mWmTH{Z)iESN%4inwcWASWS!v<%9m%$1rQLs z2k@xiW2weXd4>Jtb4wrCRzlDo3w10G7aoI-o$J^BE=Hawv0JMdHOTatEkxE=THJ8Q zHRQzLs;nVYARKT3J$=uX>XtBAP7=xGS9~i6j{-1yl6`##rD;oJS}#iy_-jy})9ts= zN+NWK+L;_@4<{K>&=G^yvvjR;eKh$^NWd8sb2fuM&VE)aY2PC`Jyffl&8d&&`Pw=JCd&qCYMJ9!LWo+m! zBe{h`ExzYQC?qN!6!X+q%U%$$SagfMQ&W%rCH8EV%&8XdHg-FfCO()MAajgY+`qHG z#jl6o4}WAyEOdV!_{&T2=8@ufr?~K*rwms*X0@hBsWr@T+r+1Jxh!ML<-~*y!E!4q zv2u&C6N71=N_V^F_XRZKD_uR`w`2d{?68)v@h(@@k;mM?}B_I;u~#O z!}8u~ab0+~U%B!OH&-I|H}VYRO>&JFmns!gAz)kO)%c&`4-|YC&~=Sd_H?zr)%+Xr zPU_Rfdgig=Ju$C!UkTh>N{;4IlApDu_y$%WZVToNVBvli_(l6dX}%`?qVMki0B8xk zO%KEULsiu^2>damYF9C7a7}%1?zWM^8-=%p#M^Ti1Qi+F4lC{-j$gFjg8u;Emr;1P z!@mZ!jUPnuFN(CC2~LpOv5jW zQcsrmN5QZZ8q|vR{NgF!3eKJ|OW*>$;`JyQILk_fm)!IOT{D@*(+@L{#ln zQhs62*B`LQ?X7e12ljT+JUj7sP4K6P{4Ldl{Uu;pj+|2t&E3uA# za0TLUs=PUNx1dTq(Q&!;ZolEb5Bw_d+#V0{r^G!&S@@r#cy~(It$r%r_^4@`Q+>MO z)(5q*1*5rpHc1(6q(&P`Z*0g-et-VfKeI-gq5L=TN5yCHe8030hP+l}y3{;Kx>xoD z<5>G+#c?;;or`&EwN<2y05S#`9FM5~0BnKqBTxOKBKT?XGvUD1d^Mw3TR(-hdke9q zSl??=+-|wjY_6ruR`J{_TkS<`V|wLl?skA}M1 zG_cyN@GPTHu$390Xr@pVqf?c2EC()2!O)arc)j(upM{F2PVu}?mA)o?Le_j$Wi5uU zajZuWxl7i!mhOACytr7zV&+DfnT&!wAYyn?wQwttmh<~TgxZYE^UB1zJ-bx;&x)?D zo+B00y2c4#P&2?|-xwIpZFmFW7l}SEO%xvwwD#5Y3)x;c?Jd50fq*y7B9HZOjl*<| zLau$qda5n0O}SfImV7th?KkZjecz34Uf)Z&aOAF0t|A9(d2i4VNav?o`=7v{whw^* z4gSa;8t@m0ye(3!GkF$u8Bmwn6*Yp>Mp(fk;3V?|7T` zAn>Qbe+o^m{4wz^x8pAu=oWTgZ_sbXWEJ@A8kV2@joCFTJ`SvL%C4fH|e$c)* z({(Q!LwVs8ds|5y-udd==e!aq0(WDdnC&V?aey(!a#V_~`?su29F<>lbbT}b00m$1 zM}|B*`%ZXj!}de?iQ%6b_!~g*orT7UEwt%-JX7BJg5+M#7_`@m8`rqFw*{k~ebOx8@IcRSN$JH?(EMJLX}Zpr1Q4Wp^szMeGY}p)V>^gk z4huI^*Bn$g6HB3`y~IruqV5*UIrA8y<2!o};(qMXWp-bCXU-niUqp3Pb|1y!){9+6ce5}tiOqH_;Xy- z?X|xF0jEc_SzPIoNtu4ovF?)R?;NAEV}Lmyg=t!RYrWL|66@MFt9G%y__w!Pc&yYz zcLF#qxxo1yK+fWFdI8>)qs?m-$mOxdYg(k&4AHFeHL+9}FaESI-QDy#z&!>l0{TGO zvX)aO04xUuzrweox3{{QPb?}caw8n>_xJStDu$zOUsMvs6pZ5v=)AX1xUFF%nQ@Yi zhiCBX;B;vIibk5KUqtXDD- zJ-m*>I3_p@QTWd0&d^3V?Oe}?X8y_6BAe{i_r6;cjvIlxBFsOC1Jq|Y^%VU|&g3n; zcc~hHNZy>1bIBld#(H)Xudaq|>UTPY?b~Tr@8OLhG}Y2C7AU5kZ?sRR#!xASPn3ck zvfIhyr=hBT7Vx9n_)2SwO*=!@uDtl}MDkoYlt&bb#wd`04(t_f_#}0#%P)#|Iv0ku zJp$Xxy0^c0yxW1D@<$omBf$H?k5YSaT=mwucJkV?&lp=7JnMBGASL(wqy69wLQ-zR zT-Vg=WLSJ_<13jX3pTf|Uimh*Ht_jKjNEP5KIRX~7rryeHCF4w{{Usw^=H+d-dE5g zadQI?E#r|}%P2wWLkwf7!K`l-{7Jd-b>+3xwssaeowdVGFKkfT$mEblaC)g33=To8 ztvkeW+UnBY+^XH&IcW<{Ooz-TJI+p7vy+l}BZ9p zE(`&|NqE5eaB=K0UDtwsEzcg0dud}0#fFTRu42??fZlzDWQe42N^y>P!xOuwTHwAS zPo}oJ4X=eJ`(>51A(mpmysZBKJMP*7jW5&Y%i zA1Do;2Tn2AekxScR%FTxsnmQw@m=?abc;&~Ot8VKU5O!*)q%Q47>!YPe5x6?l1R^5 z*6|jDt2V3T_@_^UP1W@0lHXB~NAoP4H}68^1GfczjdKUYdK~^8(X{zA;ig^MIi77= zDKj+A6o4_0lorFB=LJSMCX{%}+FcTRtIb1JPZLjgrfCeW#_}>S&g_0x80ZfppyINX zK5dEQzQ=FyvfOAsHjh*AZOx3q0ZDFeEk*sRZXig)9F6609Y`R8xdy*T{snw*(7aRN zc;fJ$r>94Cq?Cg1ZHcjwxC2Mpvu^T2a&WPe8Do#)#~H^T zO8PhUI{l#Rd=0H>x@M)JzO8EC==V}XA-B6moIrw0HL(-qBD5_+Sr2_+pF z_s*l>9R~jZQSkbWH%n`MA~~S9uzN`5ff?j7hmUam)Tt&)y5L}*I%A}=()Aly{&5ji zyndpjt5ElzuQ02v?h#A7(Y z<%dCBuT$5LbabM7g_|Ztaxef5wC6qZ>HTRhb>ju!CqMmq&yP`x z*4}e9sugVRnet`poUr^)y;<@S&NvxvBJy1Wzm@YUXQHt0pVG4^a$G}s3&|DpM0h0| zaX>TBe|I>}JNi`cUJKdV?G3e z!fwaQAGX)+ckv70hwT}0qWBNQH`-mUpQ2e#5fV0N<&;RqMck)%8+bmQJ$&ZV{tBh> zw@;BJe;M7}fB;{$+FMACj>HIoAo6 zIIjX}mwOpo=Fb>B5nDfY)@MAQR((}%{{RJs_`_)KuXEwcmT(n~-hpo-u}Z9-VVl z8glG5 z1Y~w2^UZRfv#*HPS@3J=_arphJggaTN%G_+f#%75(nWpxwB=6tR;N#%~`9D~~?yw~DC!Rs#wCXuLket9Ifu(W$S zdwC=ek@E&zw+Ec}$3jJX+515Fv&0@h zzmD(4Xwd0NBMmk=RTY&;0Yi~K5AU8?0C7AE=s)1spnesvBxg<^SsY9 zB|zJ-`w{PvPP5mI)x9m$cDE}f!6jVbk5Uh6!q;@< zw$y*oFwjZJ-Jg@5#+4cKUN2^LN+bM18MV7v(6DIR4&UA%O0)Khd(AH3yx=ko@dy4a zoPVEs&6fH_xG`!Qn{wfC&-wK=UfuyB$!m4AGJVEwc>e%A){33d=IAF9&YccrV{ae| zN8MqQ^vCtBVH)Z-e|V&UHafltARp!JT-To^hnOK@y-8k9M;%AKSkwGXJSn;`j$4KS zFnW!QjE)B?eL?O$>tgbBm~Y13 z2Bmq0y>-x^EBA~mK}}f9@hy^S`lZF+hoCUpx6H9;20V0RLwHk9;m?Wn4~Bj-vDZ8?BK@|(#ETmYrOKWj zH}zKpsUMGO{WJZV{9U1b(|-kI_;;&cPj9DccCD!RUj6p@`c#p&=YuCWlHOhdkKn-M z17Danj$@pK%Cepa>TBBn0AzoRw?7X2VwyG0`|0|2uXMK>ecsh0P1KkDRE$sXNJhpT z4o9h{PP@M=JUrVk=8v?B*!>sycjBwhh<+Em(|mDk`hSf4B`MRjOK`w>yFd#t<1DT= zx}Qev(zWd^@iRO*SebFyf5Jq{s8j_ULgZ z8N)Pe#gy}y*pb@19Yoq+Y1aDBha~fKy-h<#@wdqv5!>60eQTmf`2Bj2LQc{?>+J*; zJay~+e;SWmpU8&rOtGq%30=xg{yhg?dsVotq*4GKdSs2GJrA)Jk>dN+{=}YUcZ*_# zW?U1?1sexWNf{N4kY2+yc?^1Gq-+uP#Jxb=JANj%mfeC!wlYRb0UK;Py8zw3r=?NS zQEj9OLRFXg;whVxjBjsXp(XsE2{{ULdsOWRP zDbiD3)7~qU$@4hQK78c$>F9c7*9q}D#jozHpfEEQ z0LSZ%H^Mj9I?kV{Yd$d5RNBR;o1q<@lp8j*P(c%UkRxz+Wr*4{kz7xNz9?wEE$~*W zrF>vrN?~Fny3*3xcJl);DJ;)4guI1FQ?=OS5=Krj(tIcVraVXR*2dOfg<6M)P1%js zBQ1<`&1ggx)z0^D{;OiY@;urQ#t#9KgroQ_)<8cdpgEMW+02 z(&O;Xscm6#t=W%ImQk$cqYDVy76TCgs@y&L-sA8G9ob>Pduab z0CuhKhd&Z^sr+N5f5J6nv+7pG(kUT`G{syMa@&p%-_GVEoE+yAPY)!Nqq+%GlGf*2 zrhF38JU6Gw4~e9-n^L^EmJ2(ZdBC+_DL&=PgYuTa7~>6G*TGF|LGbPVr*-4|=`^dT zCKm9erJ1;8a@@HCmQnJ7++wEqfR=s*@cr@dY@Q&B>i*!{Yf@g$s~bqUBXn#A52Frp z2RN=bLhx1Qt!ZVc`PNHob#vrLD_rH$UD)}T9;Z0ZHPaV(-IW*a>U#d0;>q9Q10b=R z;xtH1KiT$DHLGl52)K`E{q7g#4byQWs5R)GAzeHE5ky-ZH^eXtt??T-wOCb@5K4z( z%$YdH85M)@YvWF<;M=C~&8LC1-xl7Bceb*-ng#RW-Jh8xVy6I*S83sZ^u=`^Bh~e9 z5o$VR#hrxOHLJ%QR<`rrIg;U{P^IJfa>SpRm;j)0l551pxpS^nr*j#tZgY3v2ViM# z-&FFn`-m*Q)f;L^ZK07e1EgrVXCSa2KP&jxt^6%Ze-3<2@ZFSi!V^HzG{um?5%LHx zaWNrJ-2}&;dEjQe%Tf5t@cQRi)Vw*bCGEF}HA(!)wY_#0DP<}RpJufCts*mmcX9&} z&mdQNHT3ZFd`Z>y66S9WSs-;30W>k$o2NGPb;T2QMoRG4~ZW$cwDZ( zEO#jyxAvsZa$7k7%_B*la(5h_hP?+^(=D~14qSi2LT87|l}v8~sx(9bpp1+VaskdT zGh9c2bb+S9q`<|K>`3 z1-Eh!w`#wo{9n4e@Cx{UPBP19B6*sKwX|P0;AHJA=Zt_(NdTUMHQ>~zCeubVVC|vT zYd;w6ydPyJh2);z>q1$Z?3cFC`E07)OSgTXbipCBgUxcD7QVc)@df6$@RwfFA-S{# z_v)7_k&(&5u0HVW4suO-2Cu5Tm#hraOcC~@JLD)G209KurE2&yS<-ZuypzNlcAn91s2J6rbJ<5->B0-kukcT=YGKqoLjSlj5$W@l#Na4~Q3uaVnrglvP=0 z4a9(`0a$h;^EJ`@Ewa)sJaU>&t*P5+*BYX&yS@Cy?Iy{`&g^+7qVhR4=Q=ltEj&ke zV!E!67UbdKVGwy3Oq4TU{i~=T1JC*=r z@bC4mrq3-hora4w&6Cf6J(O`F>E_}_!NV0D&oxHxPV%K809ciP5)qyN&+;|b_)p<% zy8M?BHSUdKq!YUGCBjx5mHVyari}_9{p!BbvNuqD`g9f1*!&{ZbbCm~ zr*93Mpe%uP8z1O?ZSK^z*I8Qx0viCIUOVIKT@bXLk%XPK zIC)`@P`E_VthF<7aU#VFMw{MNBqE}&F_tF)dYb!R;P>ohp!_@VU5q|5Np&9)U87v; zlTL~}raYy(WB5}&eREvL>^JaET{}&S$9_Mv2|JzM9krBh5h=>O>#4&AIUzDJfxEqZ z3t?<^YsHGr-K3W3ilk`#%1;N5qtu+&qlTiRtdBDnigJ9gdKkYA{{Up|3*rxoVY1V$ zW{yN5uI`8Wt27;0V}jY>4|?yl-`OL>UmJcZX}<~n6OBUCMAO}M4;bp}CR)nfa8lMi zr#^hl27BVWjehEX+3(@DpP+aSB-Q+H;+wH;r&}X{Zf;wR!Fq_H4Y>UccCDgI`xyKo z)4U<@x>$9ui=PlDbu*M!Hy6wRmhxf_Ob{p~bB+{at#r3zd?hY;sYvq(HLP-YifATjBGYY$G1xBN13P@ro=6zyHRN_)8yazg?W-k&Y*~D_hzT}y zRrVO?-x#j<_K)#Ci=$n`@YCTOtEgD`e(2x$r^GFXxbZfy+`Nx3S6I$?=nfYjEpYb} ze`@M8UEa#F%^^Y2jBP49wnA?3gC zp~h>`LnnqU3+gcFdb-|Z+FXd*H-V8rD96{F{Wz~P@YU_SaNS#n8_nyKj42t;2D$q{_vYdw%R4$X}I1$r$?mwGLnuq&hn**6&%<|Hp8pKAGw!zd()5!fOa+i;PJ#-r06m*3xt`cJ|a z244i}Qrt2GFk?G`IUEkXF-1qtN# z9A`eDROpP)xJs(LeCx^MxX7x$AfN25rb|8wrN+k~ZO%dCJ%>356f;=rPvTu}IO6i{ zl2kI_vz6Vr<1LSFz#qcAzvCaol=wH`DRr$v-fR6%<%OP;ry`Fs?s*##M5El1k=S!x z<=nRJ^W5uFh;20Wc_orY+L#>V`v5auCE;%qX`U><)P6gBUy-5kPlWBIkHU84hFmsL z?^Zlz=aq7j*B8TEkrE*0;&weFD$>FT(nM_D3-pH$B|S!{?rM0#@93 z0ds@8y(jj^`2Ba|U2|5`JZ~ymYknjtH;R@Cff`Pk8Q*E7gPuM|4Jzl7%yEYp`2PUM zemp)S)LtDSB(~F0@dRRDo>77_Sbv;XpI)akv*>ohnn>JF65h{ysNC4YZP?ElkcRUP@wfX~zDF<3QpG_@UPsJ!|V78=Mu+4_Fzk`%}@u{i;lebdxq z@uthROT#viZkl|1_jysfNHN%wc_X*hv28rTa?;y2H}oOP7xm|+YpBt@U8dRie$owg z%k3=;FACeJ2&|<1tj(O9e!i8@xuu59;)J-=WO!ko5X-efuHuRZ%n2Oil79-h@h0Hk z_>w#8nGvM9w}MhbC_gG}4S|jh&_N@p&2t(whGbTqWodT-za%Lc#yIa?mb>vfZw7si z+rwI3m=fyD2A1S+na1`Q^D*-;psBGure>Yuo4Xx;JBvA98<^ChTqLDlBFaEvj`+@N zpw<2)_@*n1XpR<*YKE6mt*nin}QB4Z3m!QMtjJ9C~U#`YVTNxTu;m6v---Z|ikzRfxl3BF$)GwaWMu6Fg zEzr0`$Se_1?#>s1&o!&#==GlmY4=cg*GbX!4HHtml{`y7dvD{jOH>&CAw#d z@BaW~T`C=4#1QJ5rkfm=+7_8L%H;DLj_Q$-p7;#eKBBW!V+gc~jWrXd_&=z4x8OI! ztx#Injds&ox%)~_b2O5fEsE`Dkz@yEPynPHgY~Z+u+s1RN%00-Z9e49FuO5D8iG8B z{sERa8%6=orhC`W-w@t^6!>=j!L_gWNA40OD|>e-b7q9+E~);pI_Crd(~9$-+56$V z`lpF5R((@W)MAe4s^7w{kxZ;k=TQAi3=z2XHOtDOc`l}^D(9m7KDY7ymjnXOOwra~ zFvJX>G)yoCK?lD$^fjqts`$k$t)AOOvS_8=fs#%E3_$~TCmC*g^se4rE^QhpVuImJ zF1r;1pE5OG`??T#=h~A=zIk*;jF~a#ye$}Q=nisrw_%=t6I}C^(Dp|qcdPi&#cXXf zDXMoAC{P*g55Ngx7q z+Pz=H+NkjV0EqN`Qb=qsGdrq5dZt(ziZbQ90yrSjd`h~L#xvSqjVj*XQHm{>t)~DW zopL~8nfu47Bhs2_jVE)37YIt_v)tgWdFQ2U=^q&4mc`w?E8-a) z(bb$3WdQIP_vxR0I#v4{R#lQqc9t^=ki2bVJ%_eAIqAiBJ__(1$BH%CX4dX)hLV=) zH1R5s_cCobjGoGRv0hK5Yf7A|%|a_vIlpHfV;A9Wmpb@fJ#WO;hSF=~b8Q2z=eK|y z1}Z;^`1~vD4}!l4bt_on@P3;-`ya_*<}Hd26K|kG7#6D z`~>i|m9CE$k34&5Z?xSIBsyN6s&lStOhUtL80gq$PzHHF?wa=>iW;T&?D_ES=Rww< z4R7KNF!pJh433{`K?7<32m;+E>Qk z8)zOH@UER{XW>5s*v0lM6$O(>vEW4#;{eZcR7m9VvF%)Z)x`axeNV?|nq)>#vCQHX zR3#(BWl?eWK?ID~O>5!9;0x_q+UD!+HPH1jWXqC~gck z;2ngXSR8Ocu1m){KZq?g2{c~@PiLoGTfsK7;*DZSmNVh~6e%nOpYqOG_LWi84acz0 z=g<5VPxkb+{iJSmuZG_ZR7K$p0@mDX5!q%72|S=0+f0lRnWKwx%QK7zmuh^$T}Bw1 z%8WUrci^y(5m7516Z=X2)0e-sf5z+29(az%@;gg`HLinaIV{#zeqnDmUEKNex9?@> z22l=ty~l&p6&m3sf&@~jvBI1y9-}08#Xi<(XT6Z>5d*(05U~XD`sa+-MQx^8+*+gC zLS%d#fHxIyules^DPFs)E@pkTDr%HeVsiG-EzEnovY~+|rX2JfcCBk|H7(}bZi*EE zW+ggv*!J|T$F|ssIGYY3~-07Z2t~%ncL!?GzjNH4sOu2Q)&OQBWnX^M3E#QVX z7evI85-<}1ewgTas?bd)r96pYGD#h=3mWagRX@aY-1qdW`u(BNuI?3*cl|}*YX*ud_SO@r+DIv&Ws@4F@2*s&eA&L{41u>{4eH0WJ{N67m$mUSM?v@ zDu{YB15DE1-sB>F>7S7DuiWF0rZP|Ciq?+BVf&Ht2`z=eKBupKwS9EPo)*~Cv~D=# zoQ!e&{10OLU^yB6oOug`#-N>DsjR>$Oq$ zPa!1s%WemroK~%#krmYCucMpgOqYs1z_9w@dsKEeklE@-{v_!y${4lO`5@z$DRtrrDqPJ0Nd8w~F6u+Ep^&B??+tRhPdmV}Y03mI13#iAMRW%7fe%W4g_;#sn zBxlrt5XEa1&&W>ZF{2CsIOiwQwC+4Kr5+}Aw{#$^%6?!nGuN@}ifSx}W+kiYP{AVF zc!yVxIS%#>s7r^)>x}ouTG6%EbsLQ)+RwvYA(f%HyGJU_Bh+JbT(pS&M0p`WEy>^x zrm*jAH%}~f_Zo%aDTeanE3|e{*ywpY)sf(7t^z{#%#Me7MwkG&>KXIg9-XsUSHn)a z(b=4p{{VTSXAk>Dcv>wp#9HOI!`u74M&{~dwAL?v(Cs56g$u8lA!Cw+lE`u!0Ajv$ z_@$t~fILVfxwy8{t*j$iV2;5R=delt0M*HG%(yZYQ=}3LPHK;p{A9wTjPi zVJdEp2ORWXO6LUQliIvP;*Y^CbHzRmxYV!p9U}K#@k%v>;`u(o9klKDXNDKtQYeu= zP|R3v8;Q=YKoSK4BNdkB9o#!wKTH_<*)hLw7MTS=vmqi-k^7c5%;^da3uWbHu(ek5SRI zC(|u$;MMG{E+N04dq|gi-wBm*!zv6Oam{*gTPLZDrkm9ts-Lq@#Xk(&{8;#_;13>r zU-*Bfd=vOlsak)<)6$K;opY<(J-l(**y-_XmMNKMG701xu*wSU4}|##;s@vukr8pPxznvASZ_;{iXa5taw29w@#N) z(PPvlfXRDqtcvmoqmhhbGN<1PTO$B~ajfvMe)J+`JS-%xqFV4T!@GZrK03Ky6wj(@ z*A}+I>e$-F9F~zjM#!04I0XIGKu=ofJU`+|6UI7!h3>5{FD)&vqzkFt!?Jmu&&Zu@@Ql{hwlPf|z22hHslI_WGh!7dk`UyvKQC@;Kf@mz zr10O0W4K*OwP~!S@~y5Qw<^*oJ4>&aNZwSj3~~cwu&8m8Rx?z+>phRV{{Uvc*sH^T zwD*T}zZlxDj(k7heO|*+he_ABzhwBOrYeVnRVEMz){#=imWKWkkB;s@+UrTBNpzCK?DYMTE5jwaNvr?!sUN(_;O^TjG_Z7x(}%QlkG{Js67^sNfo-{IGTth5^~6T})Oj2Fauy@l<* zqiNzi1FlJ+45w)Z3#K6u7K+^3P->0hP4w^!^z zr~cQ!5_MmQf3r5b;co?KP}|$y+E_>7%bOi5Q<~Nyt#NI4AKZ!Zh(JaPV+XG%^WXM^ z{{V!}(^zPJDCkE@e-G+6I&!=gvNe~OToVFZV8R0fy!(a4X_}5$kupEY&}>?&W!|N=EWI zaVN|W3<5Ykcy9ic(`mo7kB$5x;|u+3!d@cOZFL*lC$hP_bxCHHIUSwLGbzh6J27tg z!Q+bOEG*))u!6?d%G~=wb#1`_=cwv&Si%-sm{N<1cQbSgIGbCv{{V!xc~-@*A#1gd zcIS)CUo@#+Lj>J|JL4FyasL2 zaz9NzAN*sp7d|5Jr@?!rpL{7v{f;@eLP>zXdHtive1(c}&+ZY-eKWp5@~HZ;YC^;r~>6>A&* z3OoB>d@lHz7lduT1dU$u@%$&ifutvjH?SiHwD}ojtB$;yCaI>t-L`bQ^OpJw-(Xm zHe()O&woOFYrps)_WlIdw9gl7P|2z3`gP!uw3x1Bw{1&kJ8it^fpqg5Y7(P6cMgne zSAB%;v_6E=JaeRcFuC!jqx(a6mr&IHAuh9|>Fs%Nq}^OWEHSOx21DhPhTQG}_|7;r z^4G=>4On;s;%2v^_$yX}T+-}rp5Dg#8CGcS?YJ>Gbpc7(z!IPh%Gj@8zVA5Bq%*t*UWmAlWy~bo8xA6LOTIb zPAzL=C~c`)*5XS`#gPnZ$}k7DZCTmf_>%tO`tn!4=6?e zvz%o1t*dxiTZfYV>7a@X0NXb?=lF5bszu1%@bAO?WKF~zgSXB6FYyOh@OGfL-V(i(sYhFcU`$i43gTcfxp2pVK(DudWG{|h3HUGj zCCg*+Li@w|cZ_^V@lV6|Ev0I+y_!#;$6zFTiEyVDD=SJsUaU$2OI0TJHG}AU1F2Zr zL1}9}h1ix`fPBb=MNAm!&v0tiou%9jIgFO>(76n)+yme1UEjo?0LQKTSMfslBUJGI zwW8_Q)7-(R=`l6FpFB?ODhMN#?~XCJ#uV-;umVq7#)n9f^Fe#rCX~j_x+uWh0LTXb za>ROmHI(OV4CgyLBFBQE(!4coJ@1GSF0Y{lBZfsLAPSMWz#R3?JwT^;Z%Z;Xmoc40 zn4pS5aUH*z6r+AjavNqaYsY&2pW(ec-53hqe)db?knUAP zz+vVdH;jM=I@bjuw6gGvYt}c-r?u>EwpK-r!>z*o_}xJP6KNY*gPdgG)=Khb5pGPc zuIj^Ei%{_dF+&_y_p#c2jcvj#K(2hky-Chg4!*T(<6nd{p9Wb#JSXBCJybN!9P0#| z{(mSw_}l;_UP=~T1AM(fu0G#Jy1KKzdnx0YEi8@X!bv#*Fj7G7-!T1a3sJk4W{GZH z-^f84f_POKz#iReqBN6tI%7#n%vi791=|h*Kg0((q)ACu0Yh%!dr@b2U?XaS^{Emg zk2V%kNhGKr(zSXP^eDN>8TxTgmJ=Q^k6iXNTpSX389tP-<>Mruxzi`5TJC9mE;cgj z%A9tqmfm8786;yNGuEp?8#`c(4!9<++uHe$mPT>Y3VBmeCt@VYE!nOjk{}qWlFPfO z$G@#!*KI79SZH)B*>5dljeMyYaKM!Xl>H7yYKPg{(&3mL?58DhkbbzWEhkme;++l9 zctc@HRo%3n3uO9wR!zQ!TD^ls^9o7j!8Fmg%(#uD-g;vIWY?yAJ@M9~@Izd?dr5Tb zYnQP$^IB@we{Dky#T}%MFyr@tAstBoupfH4UkiAG{{X^z{OzRQ$P}H9ZHQSOJm)Ks zj-1zLdE(7FEjsQ!cK*&wyU3#34y6oelEb?P568?0e1q2&&narO99jBDb*t%K0QgO# z>(^SW3*qsn+O!kc$kz}}9J@qq5&On7zXNtkfz4_7W5rNv+H7}z8r9;uv4VF}Qb2Z) zdF#*;dLGsAW|8|q_`~7iTHMDS)|KH~eaQ}+5+%%Q3g9@gNrwsv1bo|9IW_fv!5_E$6ib0}ES;Jg~^kyEwrkaKXnF!7E*~deEz)N3GesI*quR z&RFjl5(k#}i9zS)$6sn=Pit=)#djjHl;tB0f)0A%e>zyT`1R{ZZq0<2Q(cwM&L7Gp zauv3W9D31ze-(_1s%Mrte&G?RC)KmnMnz`yI*~4&HN}B4>F>ED7%|GFLLR@aI`pO1 zwdu=VF42ic%d%fw_DR2O&B|+Rv>K{E0xDN^v_X9`liA}QlRq_%nUhP=O>2m$MmJS zGCx260N|mzR4@Bzd_Wg#6~B{lYJe*oIQt|=aQc=b{sUel{vNk=4HVz(um`6f=Zf|} z_$Y6IJV~y8*IqK!^j!~K)NC~uw2?0D?Btp}{gyF;$_QL->Ds&&>%#i=n=rr8HTZUN zcj@yC5Bui2<3du^GoD(PpTkPbc1%XmpOv_#Md4SQaY%`|m5n>y+aj#C_o&$; z=eLk#{vxWbz9LPpJ0Z^?xgY22R~j`sGH!Z*z=@{ths6ltmU#qvwYxx6u6}+tk`K^~ z`WpHO$0AyQ>I$#VkVnhdkH@uqZ6A!Jw!4CBd!#a3o$(fbx%ype)Sk9F zKLT8hdfxL*oKBB(5oFrlW(*p@H`x7zb_`{YP$< z@9U+{pSNOP32MurYtY9{W3$rv1N&pp0hOH$V#pSY?r2`S;=u^Uf*$OIVulT_WVshPbn&iWL?Eq0fO`IkyFoaCAG`RZZ~dT zS2)jNGgP!!5Ie-oSq@5!;|Ko$tz8%9gRwT$sp1P`XL%Hs%Kl89STFJ&s;%v_==Zyj zzmsseLJl+au7^mNU-|ZzY=TtFA?xOW+OzdEj^G%s21@XQo)2%%x2IL6pwX10)VHEq z!K>*kW#1brl3M|ZApZcKD?Oo+Wq9RQJG1;FKF1&7Ptl$9tDTLxt>+w$rCZvQTuEZT z5)i1%_i#=z+#K|zlT&GIXKSM#;sRx8=j4JpJ*rz54ZrZ^a3kMqrTE6ytB4QeK{rZjWAuN}q>GQvXAE676tF^uE$t!SI=mTCwK zDh>(ba@JMlpV@Cp{NFdsGHU71nQ}{Vc}V989ock3vA4>@IoqE~afMP-fLT}!15vnf zAoFs{*dUSmQhe&eYaN5~6|K87IV%pH$j3fo&OzfndR3pZE#{o@%l9326+O7Atis7| z`EW{(7pcWXDjPYmDQ%DPoDN27K6iAVL!NL_x@X)!@K3MW(8Npl&U$sNTQ?HIN&fQZ2cRGx)%soVS6I^j z0BPTXFW_6fOV7NsialGw+PTk|(c>`?=bttf{nM{f0L}rgQk73=lj?jPYnQwwM{k9l z_55<^_w(7_7u+ydj(pW8?=E{E(D7NmC%d=)%87o?swBFNT2kEOJ%%xlT7Q5%Q+e?p z!P3FvIH9ree}-rK9<6N0EbM~~j^{slPfyOM>z4**upCJgmmzY)IXEY`Px2|fPbS9B zk8vZzA_rGZ+rs_cbN%kW<681EnA^+Falv7M&t1TD{3{nrb0Ez7ixNX9Il%`Xg=s}6 zkfdyFj5ruRzn>KiSPKSIEb3UG0A&jGBN)jY+M4mPV&DM8j=c!_QLs8P`x{ z_)^IdTQhK7c9P7;A$nvFe@e>0RxpHgM_rCb2d?g?KK01>nlH3?#@(BH7_Hf|Mn>}E zI6ZKEdUIWs$z@=$IBc)(FQ})R(;=irI{Bxu&Z6g~@~UleFifqQ7I0^P#74I3Q)0IX0+ z1ad|JuLJng;EPX*ejJO(pAH0RvNQdu2tpPqGs_YE;heW_`KR#^c=oHNS!fr?bVF?# zHV+dth)?%75DJcQ?OmsaJTZTJ@Vi^pw5>kQPYgpR*{+8ogOHuHp-iN14I^Hyzf1IIEIZ+$1`EWh!&#i?`-5SPM zDeE?}SS&EyY)MxezHF-Js)9H;ImgzI3+gvM81W=Go*uopveazL6Es0cWIw}$!3TkY zJ7=vXt$2nA*`XV_-pu8<6X*|4wVQu<3~?z7l^F-Sdmm4&OM`nIcDk|YKMy=Z;=hO= z5MjR3H2FMTsaji1GjxE)7dRqW7;FVc$_dM3J$bLAZY=a`uLJ70ek}1X!=DandL$A@ z{g-p5%Qe*Z41tj*ok)!Ngak$@@`b=AzEtq%#apYG<+0Ya8SM1?%Ts7VpWQ0tY%Z9_ z2R}LFb*}Em;r!9wT-#{AHqkXd58fMlds(h-i^Hli<<%7%<{~egnKRIO8sVuHmZv13 z(JhCH^!T)ctazf+#I~A*D!WoCJi8^q3<9ykFU&qx80nB}uF?EoVdEI*8cnpGAMpxX zPVI54-Z{CBHBljoCu8N7kN`q;$2d8zhfUM;pBvcQ==xubbWy7$CQ0Fn87{=dMiUBk5l`{>xSms(#S^5_WBn+Rbr!D?1zoj@nX4 z_sL(SdykGTCDVUoUk|10=3RGOwJwr#fFPFakZ?Zhl=bJHwd`SODiL;Os+x^dmd6F* zglP3M=NT0ujPMjU7~_uocdNe`ykX)b_+4+|O&&{M_(ui8U)`%fJos)IvbdQ2{B}Tc z2ONSiSHU*qSzkOsTg;2fL;O$A0Y}%aYtXz&;<)?=;Hy>f&Yfj>rAZ05M7X|Hf<`J_ zgU4QqM__n7S1vYuuvS+)u`iY=`R7*gwyUD()~Geh8<^~|qx;@s{WMjgTMt;1H!kOlI6DkeF<2fzU z*B{|f!6wHdLK`O=v%u@r(!n>Easx84?C0)|KU#+iHhU4Mq^^zK5?P|u5=&PrBXb*} z+VHMYx_2MLP8pQc|UerXkEMH z0~@z7>T*XOg1W5(Oee(}f1LK==Z<7X!A0DKSTnJ}7#ZiB{cE(*VAAbNTiaT+x6baX zGDWz!InK~W9S=Qo?O#6eRTZqyI#5ZolkgYpHQ_7kY3}bN@P)0SphjIp8;P6c+;Y7D z>A~+^XN3M9-sxIw_S(WhH->KjmF?{_o5e9{_fp#UlGp7J zKz!KXyg(8**@O+Se8az{YZBwe8mn3P38-8w1r;4oEMbl?Kx}j)1L!N7b*j}?lQ3~? z<~(8Wi^Crh@9pih-3IQ|F~%##r~Q?*d#IynFE5L} zN+6Nj3!b~WCjIW<1D{@h z4@%mNNmJ?xS!#Iwm+Zx)MAEhG<-&r%`K!Szj$54aNB{#{{uBL_G_6lqf?MD12qCam zmgL5EwbSF}hi_B;?32Lt2D?jL7UJVr78dsMEyg!I%^u-`IbgZY2kY9sA4`a7a3mUc znuUN_S)7)*bB~#c@BD`q^jTylR!VPU%*WPL*DC5_B{M82U1+mV@LLP@cbSW(Dl#S1NM^*r_XU?BIy=WkDEo(!ySb<$ewZ+o;VUWb3;Ulva;iSaMuU5iDez->&;;Qbu%s8Ao0X?Q1}ym81{^dF9288okm z{w}@Nd`T&n;g7=mz+Mo$Bk@MCxDm#T2oDTQpm}2;x2Do7$UYl*ds_IF@grFA{{Y2% zq`1^>WND&DP0JDM8ZLMV8l9kbx-Z;Ti2_{ZKjJP-?U~&#WF$Y@gtI? z;Nv`!4{GM*i^`Eh0AvKN3w+y0^f~-%ru`2pb8YH%KMsB=_@l%A4b-$>4eJS~X_r#S zw`jJIG?OHX8Gw<2ZKQf&`_$T2l(EkZv@WE_8Azs41mRu9Ga0nf}yVuZP2H3ZP zAOt8_rD((L>OaSf=7B`&;*A+WkbV3HBcR9f0=e%RTupSg!9R2(nG3dfj0WVNQ_};v zHNUG%u(Ij-l{4}&;hTfdcggS4yyy0o@#NnMeifhiNA244#d_@VS!oujjrUhi$_3A4 z>fCSvJq0H0biz8T7+)E!?tf?xiPrxB3A_tDvFSEtFFap$3E3)Jk_uTPV**Lakiha2 zapQwuI)2{2wbq*+qV~QAir4-T4**~P0A*-4=)bwwb?C;z>lxv#Y?t_f#`JU5Mtx`F z*0n$Ejqn8cJHmRo{{V%D_n>L%ESzE1+g>2i4+ghl{n8Cm0yp5J-?}h7(*A-f}JqmQ}k;;5P@ny!htlrz| zH`CwUPdmw|UP{}fx}BRW}=YXNsF!hB+pb=stF%r`vw@uVb)yTt<2{p#99A#~nDX2Q5v~ zCh$~IwyV1#i(5$%X#gsLhX8&eqjb1}!YRy9BvBj_BQM?~j!#kEo#6|Xw$;h z04X9L;#_vf{3(&k=AlTovoQ?#?S#L(ueCebRhj%$8OYq~=4%~J0 ztzU><8;Z_7HW4+w(j~D#(2~h0EuI+n=aKDMKWcq4{S?H)RRG3Rb@#`=O5E2YlKVu{ zrivh?1Fi;lDBzMw{V~#l9;Q~8p}})9!>LN}S%dR1P3`TUUf+duehQxd07&r!dajP! zJcjbiM7iVK9zyZc-moSwZ*Yu_xCroy7w+e%KjU4m!JiFkKNEaPnkJDA-NCv-^2=@l z$zu>8w1+$qf^qI~Nwk&OQ9Iv;pR;0oZ1MfpzbU@7(CuW3OPK)AohRN9pw0l`a62A( zuc5qQr9@-v;d=D4L*&FB(5+u}yK zWvlq2MzObOuBSm2(|xF{G9g@Hmlz$m>DM*tp8@;_Z)s#wD89(TMN>3V23Gk)ZrXY& z;c$9agZNupxA8W*E-y@tAZ1lXLx<;~PIiW`roJ5N`el}u^1#=2cM_0}uWu$c0B}wh z1eOF2^^I221e<47sIy+!gQ&tTZs8o4USk;QaqaEzS-Nbi_A7;*t>AelX4$t5xZnk2 z>Q7Hvo<9}D$QlhzZe&rHa|;P#=kB-5fsQ#e+dXqnid*A#bz~%4pD~P*;qu5bKqHKF zt~Sj%8Xe_Cj~tN+#E7_X%s?k6B>If@^{dm_>VGuQO(C_Jl~|-|3dVSB=dUM&+M=-5 zZ7)RMVZ5_-jD}+zgUcQAPp?Xt-`g~%3#+?ySrARI&Ia+Ea5Iyh)grN5P?>D6yn{TG zSlVAHk&Yi3`EsMbP&3a;m+iLmvq5Dbg`r)<6R?iiAbmaR9~nJ^=o0F1YBpj&wZRI5 zjj^)2jiI_OMt-@+TFQd@+BhbeZ!L^g>_KrR=1*b=L7Y`2-ob9BwVs^XmZxV1i4?LS zMH0x&%*uHT#QF~1Mn)^xJ`8wr4;E_H9v1NR-0IxF zv=x`a_ZqIF7#fY7F>Z<(0dWM4i1Crh-H=DAub{jK@V;oY+kXMtUA308;;Rv<_`6U^ z1b^5X8Xuh*vy_%x7}K7m+oIRgWw>WX9@1O0%&S-0&yj47hv8NJm*I~HX`c{`HzOAT9^1}lDED0SkR(>D&UA$4OMzOz@WfPpc93UVb9Y-Zb4sdHH#h)28KM82s zhsAFdU0UgW74U2qQ203ACL@iKGxptfR6GTZa}*^101?Lj$DU8Ue6C@N_S3XphuYvUzgDKNxL5_cw%vIg zP`)=2umVZte?MxQN4rfuz=57p+&Q}12X^t5J5rs@CAP>|LioFHI7PCno3}WG& z4nXSI9S5MRaG0)J5$xmy4Zq)!j`;qxSO~l;XKoi7p7>=ey9&f-o^jlf{Wz|-!~Xye z?=`3-nB2v0XbCF5Y4cfe!&r zZ6uFg*{YRgPe`1Si<`eg=C2n20KpVK33zhCEA0~B#J3t*m_;JPeA8aR9>0cb zB479s&SN)iFV_)&vOXtx;iKA5*`c?~2FL|i z;~=TWLJzG$q<_H`{2e5&b$^Q9B27Bi62^8Qk@3MoTbySjHTFf%g(aPu;>|$5jN(}% zTr}(#JgSfj5I6_<*M$DnpBK~NUxMT%e%|*GGDQ4&@yN%7nQ#cf$oWr7=%tC3M`nnX zG`45RpA&y&FAn@Q@oX9|!e18NYfW<_8Jbe96hm$@cm$9*#diJ+{{VtuYhMx!Hu8Ah zTQhzGLl@a1kj~qB91aKrC)*X$e#(Ed_OIiuLhoJGbZKs8x?wYw8^yd`P66sWdYl1Y zU-(zyP1dhzr?-Kvt}J4+#IRpSC>tbGfN&4Z&T=u+Jet;Zxmq*!S5EBs@_+auUyCoV zw^{hNRwxyG#hw^~%)d|u2qQf><2B5F(?9S@Ehphu!d+5djUO5O5#g9`t)!PtZx^b^ zVKu}_=H~5z4dpJ)(gh=OjAUlNQ@lIkOQ~&E+sCol!GGlwA&yXBnL)QIc@>8a|&1LZ)dMQb}cZRgNV9 zj4@>F!_G5yM=eNl>d(bb+VfBNeQ)u9SMc}2pB2gCFAsQirWU>{+Z)?>g6>1+&ooh| zF#;Li{1-VoHL@&5pbZ~QfXX>79CXGfmyElPI;`7Y`)3~D*v zaHl!X73{weKV)ANTl_WDynPRbEj0fC4_QuSnWWU!wJ*KpnN5Z;(eEJe+lulRn&
ZyFX3BFOU62ew+@!qej&Lxme>2)BZ@g}vIHsTI4VE|V^$bEiq(7a(Bf@3 zq1k*V@pr?$YruLpgM3A;==$}W+02^LUfYRhx(k<>S=}Sz+Ax?%*skyi88{}m{{W8O zF0lBq@ix}y;;xtD-yF@T*vA%&7NXZSm$nuVlD6=q^N?;KL}CkqRIy{#tJtr<;Ge%5 zKW9%9{7_~rA*RBy>ZAh1bIo?Yu@AxT27FDM#JY#X!v?Kw zq}VixrhjP5V2H8Med{?FTe0ZAnJvL2i zSRZPe%*i1UnZl~M&T>NI>MPUiv@1Um_>0Hh7V&S1{3B_1@bYQa_D>Cd{XA1?3v9$i zLZc!UR0IcRc3=h*Ar>+ z$~iX@vVjzCeo#ryRO6wqGSYlmuKYcM?&Cr62C=2;_co%&VPSI6w2-ucj8eJ~&k1Ex zS0EjuAdV}q_^a`4{thpUz8w4{yZc6gtz6s9cc|XOy8JnX8f#UTjK;D9jl((Idh=dK zrg)FfyFYRe_<@S&a;g3>J$?P@!Y#!yQ|7W~*j^F+p{{OMO7Ne;zaDtoPVnW>TTO1_ zN#6F`TfX@m#>m8kx0#wk%@~Xf9t}Qi=qwwbH`U|ZaOgC{|N2lJE zGQ#pg${hi4(kLLDjFJWgbKme!&)Kd20BJ9Z`j3XR>+4?*X&M%jKZ&)SM(zB;e6~h1 zZ5J{k!t%#A-p)d!?fJP8e01b88BpQvK_Ohn_^48i2W0qF?Q%KJv z80J{xLdPq&x{*tYk63BE0kC=Z^eM;~$PbF7Y458*M7j#M-vCbvCe;7NXiCeY<7DEJN;-EN)!n z<;$M+=t*gFrN>K?Uie8TjtFdC&f4$D7al^*=1VMj)bJK6usd%c+dmj)zt;d%eqimH> z0P&n2!o3T? zzYD%3{?yvH_VhNm9En8i+c9!PtOhJvV_aGUTAaS>pO@n9{&yi^jsOp-y zwD7gGlU`1IxKiFDB#(f2MFT8Ppcy>{ef|3ne$D#t#7~5NBYz2N+TVcu8-JxuqTa{n z&X;yREwqhqqlo#qHZk2U5v~H{Z%EXJAXf3yR#JSv@$hHGn@A z2lm?`zF(1i!6`r#;$JWh0on$6&2!Rta{Ag4CC#+KB;gn?;O7~@$LC$wi@Y6RvcY?! zJdmcKOvg(%K5fOCH&~uV0KBUEgA%HEIRd)dU-(135BomdO{vd#zZ50bjje{7tthv( z(c0Bq-j`5fXK9PZ6Fc+IK~LH{w2SAvXz@E$HuoN4k{UCd9=ZPjCbh0Ld2EG~>6b2v z3;m`bzw*XFdXM&o0nJ(0q_VxT)1O2l8JZRoBM+DmN8WE!$sXR7jelq@FMOckivUz- zmdzLDWVYnagI>3|ztV=Isp=P#UEj)D=6knhX~-WbF66U%XD9krPMriYY4STv!c<@* zL(t^&f%K_U#0j)1NZ>*i#u$r9a549T z^jsVdT2E$6(k+zqFAD96rqn-lT}PGXE;kd?8SkDd9a6&LJA{sXk-R`4RAG?KpS{~P z(fF6bZFwcX*k*W|=;dR(kdthg`FA&C>N?g;C;I~GD7B3}cHBs+vIpF(3BhoCn#-B9 zB_}OQpWD%o18G`LhZWQ}@yl}BqRN0lbMu1>?(4Z!6(gqr^H=XQ4NlKT({(*vZzZ+5 zl)+{lUESr6QGA{0!CKq08@;d;2t_+lYGrKYkp!64p~X6$ZhUz?KI!) z%ZGyE9ZECiEWP7cvAoH_%KrcldeqbWS)=%GPt`2v(x8U-PlT8*CW=WmJFv=>0}9wG z!;z9WuS4-?$2h-eUk_?tD3eXm{4?XZ?;wiz#TPzUwx3RgLPrzh=S!tn(OyIZOrz#1 zc7^gk7JN_EJW^%VTIR;qJx=6Y+*?^&i+g19%Brks$yokCah#G#?@7fiNpQ2eF??_0 zSv8xtO;YIJC5&vg@+@LK=*Mx~qmaabk?qpBz_aQX2g_5q@<$~fCD2L{{RZ>ya(WYY4i;@ zQqtnIhAnpLTYG6{m4h&aOGzfhBJ6Pi4(WOaBN&t~b`AE-0gZ0KL z#PLS947R|tNAvlrI_Ia;-nX^wPfO9?NxAT>qWjF#QEy|Jm=(EV-f2=XwK5d1s3y7l z{{R);-bk-7g&kuNv5p{{@%&5&R`;n~(svfGQ!|D}IZk-`eJQr6C7IWS%AUQ=Z1{>p zs$IsX>?PuaZ<^d~Sv&LFBcU~&EvlPEWJL#&kbd$103T}Cn9(#t9ERTJPqq+QM@|T1 z=}eCG;%D-hfhSy33JEep0NKXeezcLMGt-0h#a+6V(lqS#XN6D+8ym8~e~nnSf<0E` zv*tMSx?C=HkMCpCn$LzEs-{3f9!bSnyI6`DZKT*-XUosvMt`MZ(%Bd_eT{1kROuI@ z-pc6Vm|}J6hx^J;w+6nj{ffQ^_{-uKhSOWK)inEm4Qnv!5zBFZVwZ+1xZlf7vGCYt zV#f!zIL>S2j{)cn;%^n{mPG81?%+nxzm*sy_C0~^UrT<=f3{`6!9RsJ{uJ>Jfv9Si zi+MfHnKh)*$8K6f^CiNT4flaNkQ0myS3OuIA2UixC#m*lgZ>a(X+8&wNbzcTds8Mu zG@oR%Xk$r88{RZ#CNRWgfP0X0Th`hQj*oEfq+2oxKoW>!K<|!>-n?}574v_9KWsg7 z#@;Xf)VkBgli;gDwvKHyS#=#!dxlKqe77#D#{d$9j&cQipMbS{uNUZ+nwN$wuWvN@ za+AH(Z)0-@P(+YQp@9SssQfF>lpJ+up$=Uvb+)#Tc_c}r7j-YV?R|k;(;YkhrlVWS zt9co3Qfp}#ebkj)aB+f11P?)3_A}2E@Ocm9g=4)5;Fauq9B1{dGkY!F<41DrC0r0s zAP(5aMfR+ub;M&{%@C2Sj>kDvZ@sgQpO$&7Y42{PmPM9f45f%f3O-*#Jw5$vV%jj% zX7Uj4$yZUqJpspTe_GGD2{f`qvAY*Sf+-YW6Ytda=b)i7(=+a;y2wdlnY^>Oxd84w zaqb7G?NME82_?b*07i0UTofd2C#C`J4J_+*4ifiy0E`7WF^)b_?lZ}%8vdgei>E_- zaL~v+&nQ5Iw5^azlh_RUQs%NQF>`iD32Wl1{6*qDeUfPr?e!Y`^+)V zPHKU*is5s2X=yZo<1cR+VV=j1IOEfr<<7P7Zq7DquL*b(?V2owx7AuQqnu!L{4DXLYLifjJ>0z>`Gv~c_mqFobZ;JPrut4wyrK{{S`q zVQNr%NANWx@U(_;A;Xl&#@wkRk@Wi3UH*uwT?(v7zaf(+aXmoCuV1cf(ykUeY2}cr z&4|tp4gll(% zJO2Rn>s{PyJ_5Iz+Ixq+(Pd~|m@6`{A){}h7(RgUQCP*aO&J8Fqj(B1fybac_U-kl zba@2YympgHZQ<0whD066IR`l4_5CXw+f%A3HD-8^?P;fv5qwVm+=lwnNpCEpX0{Gq z>J&xEk$@j65?BNN$*(fD@E)_TSYKS|8aAmtrju@NwHt(lm~5i!x!mvu2sqA9rv|-q zk@B+o`ebwKQTS_Hc9tc&Mwg9}amx>1uX^#PN>TThL+-G()oM|Ygvjx( z?ZK0VQh7P;j{g8!tAC}frJ$DCSSmhTP=GaJx=(|7UdFipW+6q z>T`&RwY^CiMEj(F80=5sQ0eZwO2~7!IUsX`)A6pj!`)26Y`Z?1*ER?Dfu%rM3iqc? zeHO7`rdGu1!N|@?9dS?5Zsv|~lc6C&Msf!u*V426O{TV&s)k+uRQPoV?=RQ+)WhDF zD}IJ@WKu&DT9IM@LTBONNVh#{VPON9nPe8`!` zHxEkcr7hP|H!IpXwN3$$1Hk8wDIVSRcu0kDG+#C`l77FH7Snl37>u$Kc<5>v^*Ivs zOKJi-j9~Hz`qrs7?zaIq`Id}M3m#57gX>VJ44E7bkKdYeIXB`$6nUd?+tEoLl`yn{ zWBt=OW;nq-6YEy})v1($W?N~|`M}_x?+%!)3%DY^v-wyuuml`*{{TEzTiUd8k25&x z!>9w+h$U!T`EGW0&uWQ9OWsVvNU*l-uq zVbFufVaPR9t2j#M4m$}PT_*;Q)z2Gi(dxFkU&h~s7NJ0hS$MZki~}n|8*A?vJEVct zfzL%b?OGlzSa0t%U01``FtnMnO0yj2vgzHQ?W{Z|z!-cBjQoliF&A zD-RMxR4Q9tGMM4M+rSY{xQ)kR2cb3V{vPnmf3yDp#Y5l?S~(ZO+N?86;d!O|u*4Zl z+Xfs0gn*-|P!A(D?5Qb5G=6tpjHpe*T@If_hwTdjNK7jvyGy?TbCJ1^Q-R*L9ys*7 zlMuRwe=p_CFXk!8?%z(Pvn^o$%fGmW@T*M-!C{i0aK!Ye$k17UWsAH$4$ahl~kGc;PC+F7ECE!R^K9!UjN$O9eD z2R*a(prq_tniB6JyLiV{z~yo|&N~XBt7%c)*)qzC#aDK7lb+0daa&_gQ|5WlfuEEi z{vU6r@~DNb=Es&nL7$O;E1oiayJDrbjT5=$x@Gm(!T$gli?|ZvJu>VMw4`bBDJ0@l z9S(8{9rlsMa-SQ#B0p#E7O#(d7aPssj}icNxKkx8oq<1SMeMJhKo|##^`8@XW<7IH zk~vg~$lDx>#|zs8blQKX70P@$@g=u}^;!HOuZJF|Rk=Qm@Z@I;By0w+v=YimcYe@~hqcM1A zWjQS#IZt9nGhaz-J`4WB!D_` z_4Tf5ka1^SDP0rUTRf7g#H{QFcB1Zf$6Nu|>0d>7FX4;)H}Hm?s`!q_MAN+W+&A3= zenaqBK>q+L#ev_Gj+OJpj-dAQF^W-c!y9A^)Q>~!T|S@VX}n;%R*T}8p}LJO^A*8! z=0?)tcQ9@k^aD7?c&;2pCs8DaQZ1!p-;I}mz8?6Z`agz*+=<{Q_ZKspm-7h)j8YyB z-g3Pcpy^&O@p5S-*6yx#NK#9i>3qp0bzdy701c#aI3JBq;!hH4-V?mJ(jlHm?5$6;rDkofaMtSnY;hI&fyMy`(-n;>E}L#$LYy29G zKD;rnCH<5%Q2q<}iG6yKV*X7RK!_@5f1i2`pZMz@o|WkT0Jc^9a{N#5rk)P(>|Y7R zaD`KqYrCnPfzPjyIrpzeWUO63da20#Kiu}qHTENj+yGRAjk)CKxA`^Zcb+3R+P&Dm zb&@%69$zX`z69AJ+RNL3I5^~WuR{LSZw+`B=JG~tLXPG3oB_zr2P6#swd6hyp3(yE zbA27H#k&6KB|zyZ<2fJQ$FJd7&0QTe)#7h_S@A^r{;nmG7~`~MR*eyZ5;4ckjtL)y zag!>B+`E+=k~4#mjQ0EmbeXw8cPG#+-Yc0*F}tHD z`nMreuc4_tMKqdbnvbO<@LM}>ZPFPFu^)Kn@&~3X(>@#g8PRmxYg>DdvCYH zV;!T}%YO*uEJk66-_$lh7{TkBq4AsHW#5B*DRqDTg?praID1Vo};JhMPbjaK9a^O5{fgqN$RRc z-9L>L+NsH-lUZthw^&>4@dlFmimKV9?;NrH@N-Pdw^~Hnu(OS%zlU^%yweJtsU=r}57(ZR(rdc4p06dR_IsN zEEek0<xr_qAz#}X((2Rq}UX@S#Qs&9!ig+fGuJed|rgsE&$DkaXcdBOUWw=oj zv~ol~Otw6{_ubnS*LY4jBa&;V?r#K+6{5I`LJGEjfR1tc8tcO0o+fH23I4;g7b z3;1igF9CQlo(n@4&GyNV?V9dP{{Ryls`n>zcduNt(jwBd)U~k&7@-?jE(kvV0F7dN zCiru2@Z-ZU*ue~D;l}x}ysmn$9e^Y8u9fXdaKrCogV2wsKs~FeN0i{JK5O7M@pTJF9t+b{eldX#q|!Z8Jx zo`;cx*aOe6705^mPvm6e9G{oAJ9_;pt*OhoQ^WBszO6X&fO8OM1BM|_2L$pt#~t~t z*k_Je7s@gMV<(=3=bn8lA_Nxtx{0LoB!(t2!ec1WkVnivz3GF}wk)@^1w|jdlLsAJ z82rUn+l`}lOSmDS7>QUua;iadk&OQUoErE40D*1g_&RgCQ;FS*vxX{j-?t;BeEFfv zzT3@_ojl$HCoD%yeRw?d^{;mL3L4`@xU+;AaWb6l!r-(ZR`B9Uat6Vi?#cAVN$JIS*M)plr}&Eh0AKj`@uqWc;Qs&$TFqDzAB}8&6nH*q;E`(B;(8=0rQxOSf6c~^9f>`vzQ$-xKH zfxxV*4Jv1uhn)j6lA+ndFh0C>J-sWGHOY2cA6l;Ma35ZP1EjB%Q&pm};oTdhvR?eRb|R%qHCqoF9r z?=~~fy(PA-reA4|XQt>{QVW^3c@f()&Q(tJK4P5Yjt{MKH_%Po#I@9H=kcn^3o^9Q zVoxj&EIR|n2SLvxu{Edv00{lzYlP74ClRpy=a5O*FnA<$pKjF49}QV0{8u_d>Oyp# zUOOeUX5G$lzo@{^UZ7UKxvE@myiGFpDK1@D6KthpOq>NR>)4*76epo2SjM@bXxdUi zplWt;LvrQ|q@OG#VSuJFp1k8A_2Rj0Z&$d#@eh}9g5G;ZA(4jHQU@TMel?}2YPXso zv$WKfYk5pwVq8ZlW|f0=Zt4dW((2wJ)I43`dksIvH#XPA$_=D~0`fxr41lNJU^2Kp zMNO>k2QQ%9yzYM6Bt)DsY;D6Hi-Y=lcdK4CNo}+X18!ar^DrwBEC(3--(KGJ&};q{ zx$xq}q-#=Xcav;uiz|c!7UYwZkc0lPfLjBndezqa1h-!bh1RTP(xnI|)8uK9milv) zaLLtEoP`~IYODtp;2#a@J}1^K?fgG!d3kp*AZ#0iK%5t1e}HF`+P>HQpMD6(@a7?= zXadUXS=7&&cY4#CaKwDxQn3CIKQmcBvbVuoAB1)`z9Z8$9a8I5*0krcp2gV+whxS+ zKJeX!!Qc+{>WkrX;5}3?k2F-(66!E5k)~^CmNr)X;T?Ad!Suo6xUn@I`Buh|M>TnR z_QGi+pJvB>p`01dR>(layly=G!wGCrVD)(cO&|lfx;r5#^!&{5{tNWQXYm3spRF+%T5Q~8r zlY$Ep&Rei=EJ9q@&%y_edg@g9?`O9!3ys0$=#Bkw3)Fi-K1e2UJc*`y+L z8o$E*Ur*Mfw9;;-)@|pvm9RjFN4K4X4oJp1&u+Ds@gu@9{4wz*t%Uc{B-grCrleq) z493o^8wBTa<#W$-UY+nB(KT43)Gw`XwRq#U^4?(+1YDj~*|>ah&1U}5zC6+FJ}plJ zcsA2jG3d5&MR9l;kPy;kKm!GK=Yh>-%W|5z%-Q%l%~y;DADfzA?fMi z-wtXTeAjlaJiR(EFtdiva>NfPD`NwYO?n-tfiLy{02^3+jvD}M5X$$ZN#6wYn6q54Ii)JLmEr0`zj#wNT!0;Ers~r|HHA#Q8V|4~!I@uu( z$Z`Up>bb$^u4~u+H0v7YhQ1GLwv*`Ec(-e9vdZ8jZI%ZSGZG2KcwV6?hFS0L?lj0n z!+fzts4UEQ$d3q44%~I%b*{WE9(st&5u_cDcFNHu6S7 zn)>tLU5xtHhh?sKt5d!ERQANIQ?KtXCT?W8nfjR+k^txcz{P!3Asjoo~W# z4UY==RtQzv;(6wl=KAGW2byBXac@QF0Q3W;FT@9$_TD={5c$#;VA(kB&1!gN^}Cs&{QTHjH*aM@D`8B#d;l$lD2=zf*!x-PXJh4j61#2zWLmr=LV+TI&0RLjk&-Z%QFV8>S6RZeJK)rEN60DUyvk7R2~Jrgd{Ns1I*Z&EJ#0^y5^y~!Z#N8_YBP> zsVuh!P0~#vV$CBl<(Zh0PfVQG7Ga2Rhb&&Fx0c~kYNV0K2ySg89(Mvj5GPOq@_F~I z3tKsDuHk!CSp2XU64@ssq0a*%sX^t4C5k!s5OAy2l=fkdyT{?dtjV-_#-MHQo>o}U zwp*RxXRo02ua`cM>TV1(O48h1LKVOchCbOtKo7RCd*w1h@8zQq%ZwEm z=)m%M!K=qdXuOH;BD*d&Y5#?6i0a(rysW{2?JawzLT20=P zR2Zd{{o#b*AH$~~(xKUC11xj~d$(vE)V!O#rR7P_JfG7iis-b91GpvCo1Z9kCmAQM z2fuGhgG0JmoGYEV0Bp`rUhCL@TI#gRHyL~Ilzhv)$ zR~r7I7O$xIS5Vd-Bn=c%Fv_VT_o}~mj-7e!U!Z>ryn8RgeHJo)68OXIjHh!!5-Q^y zWpX!;y?t?3Bl(lSyz@;_ZM@)3{xf2 zFx?%x7Lqh1judnRb}%JpYzkRJX9>TVRSEk;zR*cHAd&2HJ6F!Le$n0nT`CwgF9LY#=E+f& zmg7%$MLFG;0OKRBM@rtf{lB~)0~MP@@iGKZ1cOhJhB)JB=kn|*Nf7S#J=rJI^b0aC zF5!w8R3_=?000M4SoQCk=e56yz7E$d9@1@E#_MZ^D+?DW-H6&hGhQQm`)&9V`q>l2 zS`M#0wCq)jSg{yxbGK>Ec|7tf9&g(3;r^HsO)y=@Z*JJJCrpt)iP{g!(V?tq7B*}$sw|Rh!_392eIOjZ8@qDVtcDARyd?3^8d;=U`VvkVp z{jKCmjP}lx#$*Q^mL!Z2SP(fi*-fYDx^I?jyh(ljowblO$qZZh1Q4VZEuMJ5uRfdh zj`)9dryWDX8s>>?wxN+MWPz2Ke+XvAcXtGHny)YIbKyS|>5;|a&lBkucFz04M+n~@ zINW3-=1g#KGw)fsxiMPDs%icT@b$V0b*rc?q>$z_A!8!}{nE@%-lXx~y!-Zn*1jM7 z0{xwSDEOzsdS8XLEpG87)NWr`~_+@dZ>srh<*Y+MJ)8AAYynbMi z!4yd>U^&`OK4Xv-M>!oBetu=jWmzs(+4+O}dVa$CkNgw&;gGWZu>4y#rQxkY!rb_4 zRPb?!Pt`RoTjrNzY4Wp`jaWzX6S06OK)~JbWuJ>YQSgITvGK--Bsv$3{5PoEG1hdL z5;xPX)-$xLOstI~E4lfXm2R2lzfL|n{?0ltz|VmH02cl!f5Aa~ae06HLHtU!p4Z{0 zg|$1mC7(pNX&tQ^+9#4nNEdu!R5*qh;UMI0WBHx?PEBvA`0ndS@%Fg}sjdSHteQ>K zw`0vQ0)pWJgx*0a1`g13oEr6GPmUgymvul*c_`&;i{AT#U;O%F_9~u5Ac+18f z81Zha9;>TqI+f&C5M50ZtH#TS!HEMPVH{;saLzjCgTDBK9pvpknQqa{SO&|Ki)Y>1 z6C@Hq0F&=lXYhJX_ZOOtwxw+bl_UeiI-$0}(qWQ88WvCrhH@Mr{x)23l1C${-0AZ8 zrtS?M=4;(58Kf4IT|#Z$kV)E^%{LW>RhLZ}>0arN_jt5l?L#Hda>F zkiFgf^SBn;eX!@un>`bD0QL0Zxy$WRF9dkT-si(#VxCPd?I*Tyrb}kn+zfG)U&zFEO4l|1Lhw^T&fRI0uj(oyN21CdN zML1JLrE^2Yo-v=q-ZZ<_yhS3 zoiOKN+CexR`A?1fWWF|7?|e^Un#YLmZdT`1)^9Ew?epAp5Hw%~`2wnpD8@Qez6iV4 zektlY&G+`S_SYIdfj!%@T`jA9g3Wx%A_QZ50V0GQS*v&B&%mD+_#46cUx_?l@c#hB z9uBd*Hju-pUc{egnkiywA(2=ylXRmk^9*2PIqNWkOGGF|tr4~GkKxb7ja%W(&&9t2 zX!rWYhwy1)xEJth$!&3@TSGR$&@2Q`vMCsEae@@`SQB0~;@wwN_>JTJM^V)L{ZC)< z4yP@|@WBaruI{cS+*UMDOS?$;0CGvsB-g#`{{XXJi9Qp4#NHP8)$n)XR-LNpKNl_T z{3qhQH%GOe*84?_K3dBDLzI#UUIkpPz~{>Qz^!;khjj?_3)IxKYrR6(R@0|Ti#xkn zHW;K(eqhItMsf%l2DO!=WX^{hXnmpkA%DR!d{gmT!1p3uUqHUsG|gH)I@iNC_p@p9 zE#=H1q_(@eSlUSBNZ1n^E>V~qk<-zB9{&KrB-g~B4E$f=FO6|{-{FUibS*$$X<8M% zji#wQ@es=z-5i!rIh2UzcSYcq99PX>vj^=%;}3^F0e&R-Q{k4U5@R?j0*Q1BjV4AKj54`DENb={?J}A@hz{#ol{QItz(~0 znKi{4Y?B+dl3hY{XOdE&Y>|Og4DoCnmf)!>vF2%})tX=Ca#vDH@p`RKj6Nm)&R#eD zpZt9xF~oTwha>}x@GCD%_;ap&K-T`p;VTE$<(lO! z=bq9wxq{wl7$|AyMJp2SIVG{cJ#k;AJ}dpZbbCz-$6Nik{tb9@Q}J%7&8cdx)<`@} zXJI1wsd&YL!nVy6WT=aF{k~Znffepw9Xe(QpVIz6 z>0cIqWJ{e!+rgGz7+Z}?P|z-{WRqT7X^-12EzQ(ruBKT4RaQbmw5qH(D6gG=XYg37g8FE+Tj+G~t8%7DA|;Du+$#V8z&%LF&x81JG`aj| zrzX97JQ_in46+qwc$XlM0&-i8yO)qo@8PecHJ|t>b={wh^gkPTU`H>AbV%L}KF(Wp zxC+TMVP(Ic<&x-097;+t+Hf(96Ixqaq#Npy;g|MPXnzrIbU%s~7WyUqtd9wJJtt|?e&iv z_`2i7o;{9heNV2&=v;?=ZG^J+|O+A$i2`Hb?g&hWhzcpXnsOw~LwqxgG7 zxYo3`7ppX~`FHjbHL0Fij772fNW_7aJYbS* z%{6UST~p80_4I*mFQhIOHS*CLjoT1(9C6ycN5`KPyb*Kot52W9LVZ(Sm0M00w>FNE z_l$_3 zUu3zSNtlN=k~0x-$ix=meq52$6~yb4Ec%Jqn2kva+jf^8ryWftqnmi#L=o0SRc3C0 zXQ%0k)ijljqSDar{t{SQ>zdp;J-(4Pr>aRRwVYQnD%(P+-fFpJ1-aTm1BS>Q4Kw0i zt9JVP>bi!T4T5SiPjM)MUpLKFlgea%+tt*sZ1GtB5%`5a!@Y9bSJETKyJ;&JM5tOQ zK~k7xByKxcfIk}R2aL6k99YjR_R*wP^P)REaR{J}z@v`GYm4v4)J9=RAKj%tRitz{5a zU9FP21C}1ORF*Ns@FS#clmz6dan}d2=Baz?~R`URF%Hi;Rf6S(U${0!{{jDwFsSQd776WU242=;@6({^##cdoPHuZJ~1 z68)fQb~=s7Lmjb_&JiQ;bA$wExgckt9Y__OUwAh?v*2d0;>mSut!v?yop}`6O}tNf z`V{Ntq*E4&UP#}Ta_UY%zyiL^_%*M~;`=)v7HPMaaZRg2w%V_~`n%QmM?8d>aVI{zGEKYNS!BQ}5-n88> zR`Ab??=Nh%Fxpn7c5W`L?f?>6Goe{p85f_%4bV)5OWR3EldGbc(=brfd`cyYxWxQ68P)|GM5)8?;)w9=*-p7Mc zF_Pls=5=I?X&VN4>9C*2^`=b|+pZb6w0R&BFoP!}kGwPMP|7G@S}m(EPnstCtP=!# zdv)Tt&y7AYx6nKdB=;rW2GlKWi=%l-8Fw6#dvW=i?`}1PxDxG-HOLuYM%fn~^Zs#O zDf?%eDL-euVkQ!_&nERuWQJ8NagRX1T+-zBp6_!=ROFJ7&+SNWr6nbNuPDgsdi@VL z^rU|=V_o9uOZ>RNJ+r{|<39EIvp%J$Y4fnQYsgd`;BIKh_rN?KdUAN%T(@x0>KdXE z$Rg@cN8`G;c^i97^*^_1^ojaF(}j?;dE3e3F&~$|1EzhdDVWCLnns5Kq|3r_&#r6p z!Y_)RC$|`jTh~w%y8`-LAAh~pu3P+k@s)~?BgDGs9YAZxfBg$Nsd*(uw2@0Xp!y%6 zo^eu0xKkSOmP{Oxk^cbJs<#)gtVB<8i|2g1xlnsxe~o-6Z~IR8>e3M$J|@*feEgz~vveij`BU!x(ZrS(VnR?e6Q%LeN!dDVB zXOoTy1JGlqUTYfW)GVbFF{2MKU~VAeImqCVn)2`1kK>-B@ms?FDYEgc!MoJ7kqzWC z5RsOJkCw}Y194I_)A*~?FQ*CQy&ope_Su$WY-TwgoztW}DQehXHWwnmaHb0waVh01)7~+#xZ?XY#Y!oPv?{acT z{Cea0RCd=!IAvMz-dF(!Fd0rr1KZ!Vam^j{-p1AXSl#%OMAfxv1bSYq(Lr@7K2pH0 z!YLWspj6ygpGD`PtY6wQ_A-BgmsXw;*0rw=!Qfpo_DQVuEk{ucKCtpeUPn|TmMnhi z;Bk@ZQuuHFDh~~6+BD2c!p8pHSdGOSJLAdhPZ|FJXnNNv`&53?dgq9AEh9&t!x{wl z8YhOAOqW|4d*132A#e+p;cdQEP*?-Fs3eN?^2)DTS3G>?gK~{kw#SNmX@NWy4X=ef zD?XojqeCFoRzyH%d1X_>N!7qW6gL?hVU&pC-qDyA~I$^tM!E7iC;$9ki# zeWp!9WYnX&Nrv6aEPEtDjHoI{9Cqj`-G#Nn=@DLwS<=e&+9+RkMC`mUTy??DeJj?T z?Q_LREld6!zW&quMw$vs9n#_#bqH2e9$$cbqj0DSfg;t@tlS{gOidzm6LaH*0K4qySBy-c4sU2_owL6uAyRv>02M_*p7<* zK?M4Wn)28J{$@gf(;SiY_4-#DUd{5e=v(I0&bf%|s~y}j0{I}89e>X}RXs#Ko!~4m zRfg~HW9wElNn^3TlGx`DlA|A~9=)qWT(E}v-5vpgx#`o_ALr>^JpRsVFK&d%T^W|pyG{i@4rE@W0K#z-7<+){Xn{?Tt7 zg}}Ijk(S9}?N;nAl2PTc>UmM^#WP;hJow2f!QnaS{5|VP&eaz(6^zIx7fK}H9Axp< zt32Q7E};VMJ-upsB4L+kP!+$3F;*ynlmK>)zh9+vrjrvzU^5s;#^Kaw^UX*t ze3=l+3r8+G^&kCiYAcw@ZOyevKPen;sp9h{h>3>-k%Q1vdMz1~+>&UT(Y81(>PIIP zSi-Wn+HeOW{{YqLnz?MvBtS|zRUkHde}zLes3^{biv8Bez%`s@XJa`;ZM2OlB(zzD;;mbuZXjJHSsK0 zzr3GJxF2KHZ3rc9tla+b3U^`ml=Tcf&3=*mEW3mDs`wn<5xCTlc%Q@YL#g;@Sl$QP zqB$1x2L2}__fn5ToD7QmwRsAH>UeLa0QCIp=r7o3*Zy)~%pd2<#n9tadA(;>Wj7uWVO6@fTjO(?yTQ&xX;~-ZH!jBj)^1BrQOBm#ju^DaLLK)I_I99E4`~981D8R z8*Pn?bU$>k1M1(6FP5?)AS$?0jh~mTLT(Mrs$KT&0fK>&Po{rbv1mb%?<0gKC$0~2 zYbLBa5wxus^BtN)8e|NB0^_E8aa`AfEYjmfgv1my?9#HF4T{9E1m~v!{Y7tU*M=Py z_E^IMGhmfb$zhJ8+<#i7abWSxSrAFa=0ku6dJ*4_{{UK*xoO>=WoxC_{?NY- zuDlKLQb#w|(HSgn3x$yi93+TTWR&0>92LfE#e7wyU+Y>0{{Vo#EJ5XXx5F~VZ0<4? z-k=~yI-lYU2n~adPjEo??};7>n@rRq)jT#5)_Y>Cp-D0ZB!h+Njx&y!sy`My84v9x z;2TYQ!6|QN@dLw$5IUkZ;&AT>$>m%w;7>!|w~Ge4pA7i#MZ3~9`VNK1bI^0;#jp5mfsA>6Zxn18ZfDQ$2_qOJ^*nW|H@9M0)J9y5n?oL>KK;gP zf5p-LuKoPWIPGP&QTBuYE*NzrdhH^)`QlrGK|7SbJ%7&?mgU~(y#C5I@>u*h(q3J= zHGds5$++M;TWQ6|UOra^{{a1Uv-?g?*FUs}iD8+EZ4%#4(lSN{BDG0W06HApIVaw> ze`W6tJYEU-Ri@q}NOie&9e)iNE9FTtTcfc&g2^Dj&)rkTYl!&Eua6b{bn%v@2uTI! zh_2)L2vXit2sj7I(j&|dpyZ^etTVeqJ=MN8bqRWSH1ladOay*m1HUMVn< z?TC;vxfu=E{{W48-^XbhFAmwowI(Sdk7M%l{x#(DtXFKCkgv;z8R&D=XQzLyWNjyV zmF$F*z7Q9XeAw-d=ilpBKeF#7!612RFsE?ndvo+XX)gACq87JzL6L`k!;#bcim?^* z>r=?OiHwYAel~&^rhQ4MYRt@gXqPbQ@XIuUC}+WlmJQExpd9w&HR^v1J{$Oc_R39K zJMXt@x@3^uESFO)otP@&)gCs>IAWj>cq5K8UT2}{dRD2ZFZRx(b!QwznKnXPvk$w0 z{OhLpm3gLHEv&j*T3)Bwl}_K3axt{~=cufzUD-vM)V|2}--raDhAs5!{SH8{X!iNSC1QrFNHT12I)rN8RRa zUJ1`!=kPUKNRCUrRxj*QeC7vg1DvoPr_fgCh%W5)T?${c*~BiO+GCInyRv?DVb1RO z9Vc42rL7D#;n?!TEi^!iw#5-6q*AP`$0Q6P{a^KVRuZcRJS6 z!{$Fxd_^HmEs0POO1nwBIKz%GI8o60R^_bXT|jKOEAuj$1gD|u2dF-s>yhy!nvS92 zjY2=QSb)&C?$XTfK%C$Z-0tbmO4qQz)%6JCG0Ue&mk6)rwX}-pN`k*IKDZq#TO&xn6b5346;zh#+4*5)7*fU?B)wa%dWA+RBhL>$mMK z3HcgB=uadJkPUS{5b&&?CfBXB>n+)0C7g^Gg*&!-0fGA0*yZ?7s>5B+md9egvr(n8 zJD-3b4`T5)u==*K62+%!jk!?=%PhG4P<20zdI!NT46p4;@ss`%{{Rri@9_7)mk%D1 z0a4`ZdYXZ{W^eiCoQ(efvx?+CBTaMSZC^zAN${MTTitRn+Lh`#L8RC(GRXUXjes~K z)N{>rf3zpW8xIS3TR`|b@IGOruAyXFd!%3+N7EPmecSEnG`}!Xf4om>?Uatp6%I)A zKBa$*f3yT25WHP^6cTKQ$SlcS6l^AB~0j?w9SAwrR zMXKF+!^cy-<@TX5oV#Ft@SdP{3OGPI0gm;{Xm^(1v@>08r=moE`hnevxy)u&b#&$K$6^TFr8 z`lNj9WL2#jX&l$<&0pIIdt;~|KKwgK{>|5mqUpVl`0N`UM zxyKc+3}7PT3`=lSoPAHdW6iK@c1Zwtc_orK^1D=$4t|Fm)}#%!K4z0Dq~&?R&mW~z zR~@cv=&~)Oq0vf4igyF^88gRDy>VX8qImuvfFB069c#o;o2^du;*QeFGDBV5$acj9 zWB7|XQ=Zx8yxYJ!6m#k?b*yX-J!IzQdDUgA~){gE7c^pKfI9r z?oVJV5wyDS z>Pv3%h6rGA%%qOw`tm=Ob5bmpcPk1^H>aSHx1wWVhCqOw42w z&mmO6836YU$8W;3kqs4e9~WI|y7X6CT>eXtVshWbk^^l$zaFNb)}ge~b)8JbG_mfy zW&Wori}uU79yq?+7%M9tT&Qjd z!02nE@uF(JJ@|KTV`ZgX>Pe*BnGlH7Bx;e8RJQQm z0UKnKD#Q*4mQ-g41B_&f^c(LR>DrIL$$UK(t%=jLtH|z>K`e`O&cx+Jd}MQsx3D6I zuyUNG9wH-*<&A>r+ITS;wBg(cOb1zUZoMUh`U0W3acJv&#m_&4^z zk4NzQI)1ZnHSAXKtWc-+d0DMr%jL}5wn~Bc*@ZaoSX6>*Qt77MioYE`A9%{=$8y_z zBD2;Gi>hgGSiPf_xVN@)99%^E!68m#V}p}}j-sOQ&xP$~*RdRrB3?<2+FnZ4D((+MiB%SK*h6JS*d`5M18t znwF(&tXj`((OsctjoXkwL6TKQ(d*RLoA^p!iJkc*V!#s2~lZxtV8g5!6()=;|Tzp3OXRciMcf&q9 z@kWnnUC(^vMC`6AYk#+09KrzAATix-&@l)J#WSuRoB?3S$y4RP)H=X zkp>nOR6rjfpPL^qeAmzSUmC7cRF-)(Z9Y_y@Lg^kO8ND3p1zpIIH>P@OL61vKF({c zKG#qF&AFB&c$>{Xyun}r9XK5N_4KOtRw+RGOX63HylbE?p{$GB?-SlfeI3P~n`N6( zr@|Nazr0_aNd>-T$ZU=)mGRfd{{Rwry4KkEod%KS#uB~)QcLA?=*Y1k<)@Y8tpV63iz8{ z(yV+X;q5<1(7aLN`Q9hE(XEmJplSFfYq!bExm0CV!5idUj00R3!LJhP8kCy$x#OFg zXgo9F>oYa|=h>AEtW=eRsn&z^^BXMDYAc_^S+e7m5{9PYdYr zfD*_N%062?PFhDjI3GiX!$Okgwx^R?tfuUDpAI}5rTkX-r=jTH5{fHdhyD+7VWU8& zdfmDWvt6+MHzYFT@NiEx_GXoD3=J594=UO}k~L$(uT1-K$v>5RoBKOxw%!`?kB6=7 z)JGMgfrR-$;DsLeIsI$u_~Md1%BV{-4q3XNUv6u4ex`EwQbcg-km;5aiKPguJb)o@ zo7?jo=DefD*Nd#{ffnKkhUH?V^Xt_0C%%2FvhhZ*_FFsMt(IAzetBWQI3B!rt`EXi zBURVsn&m^qzn(e3>(lBgtYmtRfP6msuZlb|r|3+QPjEkcz?rR z53MDO#QrdbSuSr#*(Qaf$NvByH((rWB}k1){wB@{2EHZ#0D{SW+Zun4bgd8IpTSuz z?7TN)VGHY4_EKg&I?g6nv(pO$fhEBoXq*B_Q5rDBfYelygj;837L%z_Bfx$#e$W?x zw7{{U=h*A}s%l-#Zq zu^mU#u=N$m=~qbY=BuXE{owNsK^}u0^PJWH01s;uzM}xOBzdj6H9#^lJ7@9h*1meP z=DeBp6qh1VM`hvtF|MuH-(5)qt~}zAsbIiuTx4_TJ9VvJ_(!bnuF~RI+mzvC83bpX zf!pirSsF4+1=`7aF0LXfpm~kAJoAJ7E3LKEV}=w9Z7Gi|+gxO4_)8yOrFlzZ(A=KW z!uBkPtd{Xc_Zz_Nh6 z^(20kC5C~0YjmGuXeG9ZgRmw;Cc)bvWA*l~o5H%4qd{{Qh@z0mk|UJDTg^-YRQhxL z>tx+qhcanVOA%ZG6zoC=sPzLqDrAeYwb{?<`eZSrCrO7-S>-}mA}upUr<1s_>(5SW z)PH9$*~a_g#=Z8d=dyh+2?K_i9Hqe>l{@XmdGElc{5J61-w-wNr^r9EY~7V5x{5rI zbIL9T3xEO7p*?Hw57}$>Y|=E1O4e1ly^7w|Rqd^%omv@K5OEC$Zs6%|JSAs$H6%JY$IA3&n2a7yQe|@6dC5ugGyCEb;0zg4Now5#bj8_$;_=f3p z@i&PeyVeSP&W&^wsn77K>UbP~I)0P!(?Qq#KMm}0$$cF0tY#@>M0-X*!zMa68S9G6 z*IwgNzk9ig+r=nY*=&FJGLE^;L=Y(5Y>DFk7QF8~GGOzH0+->Ld;;Aett29ZbTI)9~(gG42Fsd`0 zF(()#=O=-R*nfvNRuE4mwv&G9=yxf&jU|+DaI4TB-Ewn9n+Bs23v;_wgx^DHZ)yQk zB3Xg4n*i?i_pc89vwv!D2l#u!cRFu}t?sWiG%TuOw+RrL2GFQT$^|@}0Qlhd5)5V0FbQJCf0nKZU$KHn9?TlG5ELg#7WF1!FlR z93~V2p3Zs2MWy^5(r*6Kb>ZI+>Gusi{(j4Rh#UpuD!?3f$ZoZ%XYmJZ&8^F?n|}nx zHHKZ!G|`@RnAJ%}2L}~)>&5bFlPs`bL1lj`nWEEWDziul!7g~t)12gIiXjV<*~)6a z2XxB~NVE7O!gkj(uxVNDeDdl~LZL=8>C=k*{r>=hoBUt+N#T7^$E18dyV87XWYf)~ z_^VOy*|oFPH5HBEOD!x;{$TlDSsHlME+QoT>mMrZSwl`Whe2(KB}d=Yc-6T}au>$*k7wy|e2&eA-QHNC~I4#wRZvm@_Z zsW>DLdiNiVz7_FT#QRM<#r`(b&xw3BZK7W3uv}inChILO!dZN~booO)su`F^Bj-yo6WEWhRI_XjjmV>l2>5QU;ykZwOe#}(^~3rSH3y% zHRpx3Z8}Ta+l@0;kPFCU!#w_5i3Z|1I5<4#+ZBaxVJ(d5c_d&0+lq(5eD?l^yRQZK zT=?Hy)a)%T5XjbTcB~MS8pbm2QF&ki91i4EzBc$}seC%K(x&*7Vus^Wwt3=3D)K_1 zfZI7-s6Q~^6M$<$a+Llg-|I5ydN!Y}L8s{x`EyRoZE?DLkVx{($Op&~PSpUAdhuRs zcM*aC<|@3yg~`X^^{=5m2ly-DF1M_Bj(^%&{80_&m2RG1mv19Nlf=kBdK_W*q3DF* zf(|Ng6?_r!=f-~u>pn5?HlKg+^2=V;ZEgH1WvB#udy7PeY{i-~e39lx>>T{3Z~(Sy z)va=sHnl!*w7QxED}@TAoMZ1EKeqAl@9eb?!>^BC z9@Kn$bENpH%UQP6uXWe8RI;^%#MT>QUD1|O$Ru8w+NY;?jj=;glL1j8TfVE6w3Jq2-_c3LFSNFZPMo5AL)yewTEVI@yeI-b?-e**siV;R40Zv=R&#slI> zo5$B0%Ry~rtk2}y-5B=2GLZ7f7C$kPIDth(3P>Q=&>s>%W>1FRJN=7wF9c}+01vzm zrg*Et8a;*Ht???xC%DvDNeZ-WF%GiJbu@%4#84oO$=}8*pU1!2W5K@!z8HwU9m!_@ z024eJX{0ZPEOgN%`ev1@+>Bg(npXqPjyrwDnUDuEl?6yR;HQa&XZyR|>8kupocaC- zt2|%gpX`tEv*Qnq;g?<1?R-t4YTB)rf)9ywJ14r*%8~>yxd$q-mu34p{KW1&hU4vD zg;4x#{f&MdYVlq8wttV87EPykbHQm9q?XpYd^&u_Tg^5>K3F`^$RiRy?Ti<59u$68 zd>r`iuXs;Yu<+)k;tg9)@Vs6vkHq)-YiiQkSq)AEVz+X6f9m8{SeJMQ8y5pS*Vw=C zRtp_-_Cffw@T<@-|Uxfbv;G*BN_1*8s+pFJ&ejuMr*HgmY9q`Vy4zi0S z!;CemWftN|toDf9f=aV+agW9S0NM-V--v!NTWFeZjWjJA!?r#T)7ML})3mz=w1Z6{ z^Ej0cK75j(4p@Vj@CJ8h(!5#wd;CYTlU~<6C8y~=2ekNyeWmL0;GkOHp{zeWEF0jzqVN z6Dy>X89_Xaxz82RNqZZsXlWR#YRMi6r)u-~!${G*IccX`{{U#c=G#K0P)yU1n;5r7 zXW9WL1KPB{5?^?K;XlQ{JL8stcdXlJQ_dvPqcF5@eG34wT&tar2IXaS0Q5i$zX#?W zGgrPcXm|er0&n~~r06=r%{G^Ay1L#it6SVG*9Fw8B$+D8A^Ea#mNn;^--&;<1TaIr zZO|(}m~zh{B(oOxB=xSOmgv`(+a9O!Gvg`!qda2TjrO0V={L!z6La`wnf;b+v!Zq4`q1za4ILXJ; zkHWegGCvXc?#}MhO=)it2ij*1Dua%lSd5I1x;-m59ZY2%NBGmlT9lK`q+eYuw&}Ba zL_SHFa;?uKjE-wd;q}#|9vs(fHSI`gP--@TWK*|1^gTP)(0l=> zLYJ1`5H*PO9b`t6*u`;!1C0Lw%U4oyk+8v2-w=P2Y z3a1LE1+q!+(yxBYKN9rMgMYMNfc#(MeK~cl6T==Ou+;CY{J%8aTSq#X<5eUA#xmtW z<8T=SWKnHI^1~F7sUSM6 zn@9&7eigg$qu|y50L709_>x};-08+I2Ix)V8_PS3hDmM{&GOnP02q1mh6r)E9w?BS z*F(&&OGR!Wh!*IDhYGxX-1nwi*{p^|gL2Hw5m116{+_kyW8ux7rv-(rtO~6Z#jfre z<8R8qV4d6|q2q5-dg8fldeRZ9O{REBBe@oDBMZ2nak@}G_&ta9=}@Q5q7s$vWa@Sj zTv@tFbqg)9^H+J=&z`EjwVp3bR>+Xb#3Ol%hmfp#k@#Y!eK@_Uy~~7&Pu(Zxs16i?ZC^JqCi(5?GU#$@Jy53MpQV$hca51c9I zgYQ@TIpX=eEw0*Kq&D||VYykvQ!Y|nr|z~pQ+n(Txokk59K30613@?XAO?IdF@w;N zOp{42s@a(>+ zd3=09dn%iIbW!$rE%Bc*-@6l#6m;)U+=+J}*6*#nLE*c5tJ{eeSB7u1NgDyONP_&V zG1G6|_pByqBxaIVCPv_ra!=Ivts8Z;)hx3Ey3CuJP{)m+aKQ8jHC1lmn@x0hw`G9@ zH_Q$?{V6N1f=QCu*-fg?vq(u@p@6i3PEG*%h#C4-cD0t%%aUctkqa&k?D54tZ{kZu zj@=|ngSlOS`CJpg`~^h_mQ-Zlx63&L(A8`-jjc;Te-6cFE@p}D*%s;JMaV@XC<*J9 z=i0p&;rEDR@D97BY90&m5sLo+S>10eLO9kN5OL+SvN6F>{^Y_zkF@*lT-NVZ{U9(cx`kK6!?ckSJQQ?JvUpH!%vyYW#o$b5MDVJRb8jJI61Fd z@aKx3SMcq<=BaI~X?GV9;#&*EM!SYZJ6KA}O0#4WxEvA9d>QZ~Oz|&=o*4cgUhCRk zv8Ua_bxk_K_o=a&lgqsOIm$``FgXB`f%LDsE%jErk8R?cn~P#&Y1IH1P1%m#1CRkD zu{FV3>Diu@C896d-pOlvcZs%0rzIpRQ`n5)jO6-^)RIn60c2!}LX}q92$P(Vk51K` z=`_JU(9puz``^Nt>zsSml)5bT*5Tv1RaqPzpnmQ{-zTUz2c>eo&V;N+V2@P0c&Ga$ z3$VG&yK~bx_o~{3j5g6naQD|C;$wpmRYoU`qtx~yt4uBBwm)l<#y1j`XdYiRm5(3~ z?{R~U)k9I$V44`C4A(nJI9Qu(ZH}it`T3}09@?B&7M@B5!;Cy-w;nmj$6ri)8uLHe zqAT04gU&3U_hR-k71ssQPu*ia#lOyLyeRWPUc|zZFB~@+^#`tf{p;h;+kfLXjyxOj zS6R_*yiItzG|6YELuCk$?CPaP(z!ywi4mKV*0rHc)SiS*+AQO>4}m&!ODMX$)S+P` zCdMklBa$#l=OB)A#wv~9z&i-e>wQyFT=G?;UOD=7`qx+R%f#0nH1I5UI>gUC*P9|u zKGD6~Io#Ob=C?IlZ`|O7#zJl*C3x$O;{)@rcKr`N`W|xMv&=4lMXXG4e~JN>@ADk> z?TV_Ov%HMWzhAaYpSdNY5iBh$B~ zGc{w(&+O}R(rs;C!d!BsTbv(kXMv2x}Vy#>8&P7EpC!BVv(R_ zH%h|dU{w&t z7oou9AI`Hr+VDT_(|%54AoeG}uOF3FxW1Ar-RM-8X6Sl=I}^}EpT6_%mAm z$JedyZf4p6DKj_RSlEo@_Zi#t#c257L%54ty0q}jcJ_C78&WH&Znl`;5G@sY>q+n!OeCTk0!O@8#}TGnQop;#b54>^=$iN^QB6!u$qwT z(N*cVv*!N*5L{Ym-XOSrFHF3;zFU&=&vsr!e{M^;&SpLno)9rr8r`p>W zbn-2eF|!k$haWFeGCLo}wMUw53OJECXn~~Expa>lJY8MO{2>rBODI?p#F80 z7@xxT_8N_vhHGZd7v^VEki$Rjl0LN4O>#b?gyl|ZYoN_q3H&*9*1?Iiz1wpb2Z;gb z!?FJW>sFL=z1^~vR$zzbVsV~1;-&HZ(7TcdR}7KH3nS`6L4l%TP{#B`KsO+}PfH7PEcJRZc zSJoli@OF`DYK*1?`hk7~WfAU?GHkN2na&)mf44rB*`7Bs_HI z2lcHOpU!a36=XmGBaQy#emvIF_jOwd#`+avZ?!~x(f4{BcJv3Ewn2Z5#=NK7L*!^m)ta4at1v?&8w*Z>hcydE!86+6TbtkAfs;MqkyBWBd zH<5WHh}~I!@E!BTC56S#pLY$`n>@DH_R_4@^F~Uv5-G~E`+^7SQ|dONDaeH5aK~QW z{?!z%u}F*WW3lP}J?ltKq?}ADQs+)GKSh6F@7jXX#I}MT5=U+{4;W4To2%KC2H#H9 z*>;v}o*}syBR|Aco=tjh!|gib;8(<3--cc%n&tF6z}J2hyljIk9PWXbo?bJMbCJT6 z*1t183H()y;b)5^lUnm-@b0-E*tM8rBruDelP);-}xqE5c zDTr+Z=Q1uhI6uOF#-;`1Rx$yH+KK_mQU?RvR#(Gch^_IX!0CN;57~T0p|jcQ))O6) z!*LnIMxg%yx=8FtAoEw^xOY@&wiUsA4s+@J>e@W7BPYi*EIt&wib)u&MX+u4W&mVU z^mGE=DDFgz(S`p2TDaOVj2~aGtyl5GG#WY~gq509OqI{^ZW+fUWMZ%B@&PLOW6Ox3 zB~Q%A~_NZ#W%@|y-m{m{CFxVaQz$fv|OOV9A(oP2@y8CLnKpsBpWx zcIZ7Sa9Tr!%REGF0QJE1>+AVcjcPVnOT{UOs+ia1+nvqNUuuLxJo3s3L?a**z{Os- zjz6>$a?(i{R$zD`v)d!5TxOs~D(=Qmqzqw4ABV9VW})s;k*w*qvqK|YAd)x8BP8Gx zo)6UUPfGHwMhmZn9yk}eP-cKIGe;TS=cY#rM?eQd{q8zfwa+h{N-2&uZ{0GYa0WUL z!+~5E#T!`UyVGs$lr#^zLGuuE&PE4ZaaR{&_dMtJkMKijcXrbA27ypG7n?oe;d9R!|@kIweg?A2yL$P`}q9ZsDqz2H~u4o)sA^n$TjqT z!=DvP@TbKR>7F3ibi1V5T3@?vHuI2rf~4*Tu>@D0{7dj7e#?G8`$dFLKf|vU+!etE z*Gip+NqlD!uow;QJu_NvM#su+rCdP^!Fg|S8E&zQ^jao2|FUY+s#!HuDbZ!KhwZ7%)S?9!kvWBGo4!x&V;s01EK z?Osu&Xm1sl~TWZgX`!klMziJoBJjMaM485s>Yct6cWV#Rk`CI3qzo4mq$##it5%0SrN+Z zJ2G|-dYof8>Q5BD7KcRD)$ROKXRgUL#vqDI8@S+xFyn4y&nJ`9^A*UWX&p+UXW3r> zEoHR$iSW+NmL+ctcppo(xN-AC42&kYIR5~E#5(iOHS-pSsQ&3Ti)_2e4cxOwI5^MvQ?d&iDh3~q4G3#GBcn?ZZJ)NXc zjkd7Hff0#R+MsP*^4yN~rm|+Vv{x#8cDq@ki5Wx2@*gdgi6a99gY_fxuPnc^xUhj{ zzlgMR4d~2vs}EfI=e2z?qiPy2{2@C0z9YHP*7;PJY;SGaN4Z{q)jF^WN#GOHX*I}r z7VqJXxAwR^TjC8~%*r;wZ7qW$L6yP8{H%l={Kp()jPqRXqD`*A@zi;ucb z7(DUqS5Ck72quc&)+ZMcn8QEbjPc6*)&Bq+Tj_SXy~KVRc578~z%y>f2?GRrfsx$i zv7xqWyN~pBXOV{DGlP#z(4RJ;xhd3k+9Q;CE+cdDH_9Ai?vwp{SEKw%@cxIVcx5gN zS{tCzM9|sEl_=@EaUGjHgYC~+;OsPrq_?<|X`Tj1_pZ_NliMKmUsG0W;%!4j32qx? zL$3h=W0U%f=kOFb-o#2bX_-*mn<+`ReU7AUB=SC|rFHgD=$fvH2llPy=AUyYcbj+{ zB#;~rFVlm_J!_1b(8ntyu#;mPv}Yjk)Bgb1SG3D#)eu26tr5ofi=2XcFSq#9vj(h2 z(93l48(Cmtu2<$^9sud}qMJMtSjfpZS38bKT=V{atrUpmKT;=wW=B}#ki3Mzs17l? z4tIVZ(-i*z3rd&%9np&BLk+xZA=*`gD8L_2mygz#KQ;@9WMxJoML1>|=hTh~?fBF_ z3tgTOwn>E9w|j_z5@Z0fl2>o(n)#S{of0%|r8=C4$=DoA<)1JCfu0U=f#^@tw>$x$ z8yH3X`$V^;%G)Bg{{SUBme27wAP$)3tLRoyOQ?~ov~6nwiKLC20N`Y+b^wFUImRoc zvAwgoL>9M*cBm>afDH41f4T=1^f^usUu!k!cv+??uiZhGEus(%Vo=lYgaY6m#ES2) zd~v7#&R+~~HN9>hI{HZV!vZc|c}V#p8Rdw5#d<8 z0pYugJ5auS@y9L1pz=lt+s|Q~4}P`i7E*&ACwvth4=fM4?_PP~4P8#I%J~L+MiG?8 z7_5Nz=sCtKt+my158Z9J&JW9;Ng4L7l&q|BN!_+|uw86}=Q}`Pc=YYhwMR7J)8}R? z0d2(ke~n~~OcheZj!qPEdSsL9PM1*-t3{r6 zK@zh&DU4_4Ip{|N8Sh?GFiT@1Ngid5&I>s|h$o;wmlf*&0JIyd>tQ-(McBiTPbaq? z{Qex*lU)+AN~&Y>&<~lAzB%CJb6Z5ut1@oE8kLxorpRYk2XSCnf)CB#f_bg|Cdy4~ zQMQ8CPcBJvggTr6I+pYsa%-R0S~%?^mQvy?X`&01dS0MPH_ns%zv|oi^3~n0Q?^r=TxqS~m+14Qb@$yFw zz~BS?OucKI{kDELcyr;mgd*@(n#R|{9t?us?^cH2bBpOy=C#v+QI=xBNhl{LDh@$4 z(s*8NL-uO;HGATZ8Ai8X5xjLec{WlUtXC3^_V&Q_*$T0iPA~}eug-tkpW{}c;@=)N zhvAFKwM`>IxtXtT5eokRY-(=j&$wpkwOc5h;|02mR~{;&ryIS`Lkmxxo_pi39O`~N z*ROSd6-Z>%HJRGxLK7QFKP*UlMuQ4C=sC|dM?kZKd@^b!u2XSmQO@ifk%Q}0ueB*P zSut`6WpYZZW9k6U1GQe$FK~Ww8i@$=Ioe|#KOywZc#XL`v(vIj)bXQ1bE~wvTymJ2 z1lq1P;{)c;f5+)nG%KlP)lnmnV-5do}(P+9jc~* zr~SPeW-N*h)or=wuH&9CDp@3&uAdH{tQe!2u1F&vDH+crE9?04TbiDv_EvDLnr)w$ z!~~n>Sz}?-ka~|=#Tqs2jRcUBERqrOsQ`n=zaNcHBg#m7wzw}B%IN1NG1%j{&U)5t z8o8+*_3(pq5=zBbmJ;3h zaV%TW)D{Gl+M_(LxC1p~#Tr73)t3HKY)lc5;Aerr&vJ297jZap*uyYdn?Ub7`HFFj zlr7wSc>QXeb}22)i5#1^_%?qZ80f2)w5NDJ@pz~ZmR;Y+<1 zNgh4;oH=+XhJjuZ08xs z?dksj*Qn>##-7P2wsF>|Zy{BN$!+)>oC11u@7}Iyx-HJJdXb5wlFbMb$T(=R>7PnV z3F8p?v&zJ(oG45w$QbF{oC@fz{>!Cl@cDU>oaS7vB_xi&mIoawWjzfj(pR}t#Cn3+ zX^U%XERsBN?GF7BK;s{d25X=2;XR6nTb5tn zHU`z?w_nP!vva>gWYl4%=2U6AH}e8#_(y)dJ-zF-@HQ+oAYDw1&P=-$kbMXqo3v_}VA3}~erOqmVw!0sjD3 z2m`Lw0F&xXZhp`o0^jyxyU~6Me{3$XeWSphBk_gwTaViHD}v0B$lt}tc{XPV7BPSb zs(M6zUY%<4$jykAi>mT?$4_6Z7?6JlDs%&fD!)-p!fzOa|0AE%J_iNB;n-x{ula0K)oprkkjEm*Nw&9vkqy z2T{}|+q6sci{g3hSxUtI@cwm*R|&Xt!#-0<`A$+oNzf@;0B`iL`7YkXYG^wN&f)D z9sbE)GV#B~%UD0*JotxbvB#pMn;-1*ZaQX*9x~rLhL&a@brwb-3j8>+@g?@5cQx*_ zHPrgfr88Y#+%21dH1GF{pi_Vk$_HQ+cCWENZ|~Z+_x82@rnNb(@1(i#r-Y}uwXmPa z*%qyRyKU9#f^+3%e$Njd>f&MxEP&UJ=%V5XOIqJc3lq3teb9Q0cF*b7yew`tU)lCP zp96#Bij(Sj-ji#n>Ml~pPP^Kz%gYgsW6!B>e@g6p58&yvtGMrcOLG&nOddN#P3ew7 zEdIaU9V@JlPg$NPxQclM(d>UP7e62SXacZ3@kJO$6cLx6GXUS&*2 zGO|4w(X+c6FC})2*v#1s3vFENUYO5JV?27+tTt@p2J=)Wa-2iYncM*0na9_qQ`7YM zRhTnpZ}67;j86m5@z%CwTlcJvE z1Gl&1Q~v;HT-iX4q{Rt??qWs-vVF10Jm=o6*?4^UZt+7R$v@sNo^$*>^iSw3dq(i$ zy_=?^Wf+XO1ntiLdZ%n>zj|O{==T@;gwd04aus;;ij9rmgZTCJuDikB9`P56^^1Kz z!rd**xtq_BDHf6L<=syh?e1}ky`pGC#Colkm7`e+F76z{xR-9`JfD@Yp>T7P(;QdU zKeDgvjco+UXKyXN+*fDHxVoNU^GG@sVt7R-1J@+b4qeWZ_EG(vtUkj8R|#$*S5`Ai zA<5_FosVYp>^QHeG)OFTy(-{%UO2Aev||dFm&+$SoyTuHVzT@<`#PTu-oBf6twn7+ zCL&m)A34SshHMkZQ;x>Ey#wJK{sYu+Ce^Mq$)kIH(!+VEfS1Gjr6bNU$lQ9LYQn2` zBSy?wC!Xh12JUYzcw@pax+sKTe5gi1fk}wqU&jhm* zfP3P)Tbm@lTPd`C8^cy?`-J;044z2#jkxG@$E7>LT2kqEA8W9^`xJ>5E-tR;20O_E ze5$F)&H=^%Q?<7sH9 z_j)7+eDxD2kfRQM>Xh%0GvDc0llZe&yzuErt!!RYp#ERNKdJK|J=Vz8aIn zvRW*5n2O!qrFf%*%tYgWrMVub(>SdZOq;tpdz-hjyiuTP7ilq8iR0YT{i*)|gnF+4 z@;Uq}T|-{gbjfGC)b&H9!wQf1`GX?|_{by=m!SjeTqHV2VW{0|k97)cjM-a= zV}udF-Um1tz%}!??Q8LQ{5y9v7k7Hi{8u1b!*4u|AbEy%ouu$GF`r*r(gaC&IG@`S z#g{)4J|)Sf_-|dB=HF7e+i)OnE+~n>*ds&AvF8N!73n{-=j^3xr1*Xbbx|@~D;)XF z=CsVMg0ZRSMl+s*xZl}Z_H&a}nmt2Uu)jyVk>$8}!E(JxDi3jNXK@&*Cx#e9qLBjet+@fXG#_O!EJShtBnJ4dVCHlcHBs=GjfbF@dfKm;iD@6B`9 zHm$7c4=07~+r!qXtWh3sGC&uqJAV@qo-@I$%fibnhVFHh2nemT>|U6_KHW`pB$1S) zUDv#4f8vILd`YTm(dpWD=CrYb_ExpGa=2zlw_r04r@dv~!ynn@e-zwJcNOk_(r#DG zl2Nx9aOWf_JgLnx>FxB>9I#H8p;-RpU~%c6r1gG7n~-emVuDlk?H_EH({0E^RmS8{GFR@8;^Mv{w|@)U z{5aP9J%8dy@X*(F5A^HHJ5zTqvu>b83P!FEmkJObOkl7FoLAL<75s4xr-!Y?dIhGZ zc=JUCxVc9HJW8y|fC*G)0FnGe0C=yMJZs_23M+kX&%_!{)}O8FSGP@JCCn@!Nec|3 zIL781vZJ8fbJDbo?0J=Rk-Pggc!NgQzAX6eYi$R^1L1(t8%w*I=HV^G=>h@@0>OY{ z(lc$&P$28Yd6&e^cfvj@_=5$9!HrdPj{xb~Nr7)gvzu!fCy|WvNerjWbYtb<{o{gq zWYxcbUk|()p?p%dZ-{mmI+WTy-`b{GpMIaG+o)DoxMBb<%ⅇl2-s69C~+!^#1^a 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

PnGkES-)ffy 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 szY=fev)R{L820Ij!TI!7{(mm>j) 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%0A~sBa@F_*z~Au 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�x^ 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�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

JW|e2i8WZ2V0YY@ zk1p8GPXrH}kEM8|zYXS{nH;fX3J;crbJv1#>&;Y>aYa!|E!gZ+#TQq$_f~Lgm$wm3 zweA&UVyp@1`8X<1IPZ>XBxbXQG>A(p%-CnhQ_t}aY~%8-Yr}eDcx+sY$&}42ub2Cl zJ3#aUsOocFMZKdmTY|fmD8Z3B4*vj{uX6`YLKi$d#;3HZ(%AwsjI+lUK-;(-!>)d8 zbRBVu#MR@P=EKRla%bHF+6{IY#(b4<|Q-6fHrlH4?h1%_M<@sFUYUMIIm zHE1o2(WYZE2;E68PZ;#>J*%rj&pda>7lY2YJ9exkKw!T#haWK`@)@W!6rR?=e_}-t zna@UYs=59q9rz?*)$fUudA9Qe1!83(f+*fP43c{j`qaJ;(IixbS)@rNUKT)Em=TUo zbK8zZE>t_*>nybCFD{`oNKh(}RhSYzm(%)Fb=@xCShq&9wYzp#FtaL?kf)M=OjhrQ zY~@FjWOn(8D9X0>cE=J}E`Hti9XXZdr5Z1CTQ73%S% z(ME>wJIJbJ48!Ip9>3GMHRoRt^_dq*$dAfqBs^ygv>f1uNG6-|7nJzbQjI2(sP5RRj<4uTAl%iBE@Z zwOvLzk~Guo=eolNVw+71Az};D2Xm@J8}DUSDWC zSw=o$Se^#}P-v4#wSR6udm^ex%O5O*XzB?*-MOuO5_Ghh-*E`?$P~zll6wZo_ZZ@+ z-&r$2@Tc&CT#>vop7{0pbghpG*@&J4GRG1|HiO5@*n{p*e|oM~DPMD|mrRH49&~R$ zHtjz-8R|wyOy|8UQGKGyVQ|~Q&gGFn2L~fQzfa1o*xH-FIneA1LJiA>IS1~J{W{X! z>5TSK`RKDTZO!xSEAO|tAN^{RHm+ugA^Tahhsu(4K=Mbsn1RUwy*g4fKV#nW%`1HQ zL(nfAg;CTG>sl99S-D%Qj2Tf1ZwZzF4xsnx)|;lDj71vU| z&YG8(5i^;>v+hDr=V%>y>Nx9COA<>A=FzO?ELlu|Z&e_Kpwn#~^w@3fqU`QA=V*Lr`m~vv(Fyp+NA@i z=LB^b;GgiWJL2AXI$$#9Tj^02_fh z&#vzIt_$LXjj3sxE}JI!Ui-y5d`gKJ%7~cEdj0GO^XbJqAvV^>N2+PK)$f&*oRJun zq{tz7`<=RDKET&I;+--%cQOSZpzZ%-`{+NjP zk{~2P9OsU(u}+#^J3+!MSJ5 zs;4D}IuXaW9c!+MUgGK2F$UPd!NC&l>==D{=dE)Zg@x6W9#*GxF0Q6+(#aqMvlE3Y zv}XWO%7~2Rz04KSZSF?@04K?iVm-*f2jCukNBC7eGsDGgCHrBCi*9991eZDLPJUJc zzdRb~FD)3zNQlI##?y>Gc*rBEI5fw!xw+6~duZZYm2zO*Ji#Hz8;HpM9Go9YIT324 zyO=lHJ-xeyLp8d{K0uDy$m_U{hoJncHK)6@NfO&s)gki~Fe`HGRkM(C$K}Q|#{kz! ztOIWNl16!U?<5Vo&vTF9&tY7Qw-PX(ON);>HRnIx9ddZ%o(QDitZf?7?oz+_iK}Uz zAsQvE<;?M3X{S+^Nt^e|>icj{OdNyLw-os_2>u}bl{{*eTFO95q*sWtDv~pi(;)HI zvae@H_}MxlPO*;HKvbw3`K3PZ6idI+j`;laq|P{MmW!0c z1M5$>_|M}9v}Crt(TU&&mqvhOXD4%@44*;p}p8R@tsHL4E(B`|h zhHKogPcGe+Oqp$?CB6RuA4;FAQ+)|o%B!iTck$Q6)-C{#!Z!wZB|dhKPnH(xk%Ai| zuS{`@v!=;s6oO^&u7I)$afrOgmCqSD3^+Z3IO4FhcaGlb#yQi^o_R@)!tT!;=bjg- z^cB_E*g4tiT<_NI<~v*BL!=US4BCQHpUrOuG{C4aM|55)T^qE&l*` z{uk8a3J5ASCSw`TQn~Nz+qkJF@ppomWeKEsngXK+IB!dC&ppm?GyXhR0dDdg>|bX* z?p{gh)9J=4Ii#LcEjz?E9l@9HV?Mvn*QI!_w9`F~M0R(Y*MY8Kaea5<$o#b1i9&5f z@7v}B^dDODKZtr)f%Y+%S@8tEP|nn~Rc~{*9E=gb zao#Ji`#rVCljiJx2trG4>$^Si$MUVI;^ed@bQ9FVcziJGAk(}}s`LBD4Q8R47pCqr zgPxsuua>`R0cmUTn)v8?pZ1l!mX^$un2cFFIZ}t7J$v=9bMY;?iKI^@ivzWYUR8+e zkAF^;^Y`r!Y}Wq(5@UHu-940T&q4uUKP+=zgeK(|bKT)PLokZJMsevWGAn?ie;o6V z{=Id-2XEPaDroBvB_))?#YxI{;OgM2!FE2^_LN2eV>`qhc>y%YNi;cZt91?h|f!iCx2*X71Lb5~zdy-WFgiBY0|^?Rej zklb>^r(x}1m*!FA#Lao1&2{PWRFZwm7dA1^D0}k3(C7DrGNAAMFgsPBwA$Mp?{p+) zY&4&AFR;gc+3lJ~nHAW?+hkNI*j%Rn0QXN*#(fP_i%&31BD#Lz4(yJ0k}^g*9Fv@r z-ndbd*tYKk*77Bsff*Di$-#&d$0vjIA6oQ(*@o$_J|61nrA7P8Elxn&h`~ltfS~rs z&3RSUt8TW)mmos3V8$GN?lxYa=cgafiu51Zcf?TW(fGE;c&`>a$f3F)XHPk!>aUPb ze2%@V>3DK#HQaB|=)*fq_8l_y^iX`xV|c(USPv=BCA~4!9DQobL2;(vGfw_gDjC6L zKPV?VKpc9X%DDKonJ=uPwvi-@f6A&*$nFm$Dr1cONEoiaLGdJfSZZQ;B{*AgE*YdA zjHm9A*Pghqx#m42i7wk?BZUhfAeh`2$mg7U56JYWUKB7eh)ZoGpayA1=3&_5)6{-- zTVL|@tCJ*)iInD0qd8O8>+AJ3G33th|4zl0)$dOyiYi!m4O(#dB4*yBW73-p;azERT$u|JMqR(dg-n8Snq8kn@I^=jwXs?sy9jV1=*f}{vMS}Q;tIymL^g| z0mA@rJ^B;Vr&`sT;iZQlr2cN;szw%01_!7k``?99yn+;kP{$e!^2r%0#2kVLRp&Gf z8CRNL+w}LfzJ=z7btx!f7)QoKb^UA2bsYvz4eBo(w+@LWWK6LlM9<3D2ZFs0@4~$| zQM(UrU3Nzfb_p^_IOiUxuTxlBuCrx%Vl3ogF>uUTV&XsUo#&3f!_fLx64=@&6(`y) zU@+g@2_1kUSl9zMUK?oO_U5SD=%)OCtlA@ICHHPIpH08yR`Ojnvpv45@uZmxAS4am zr#<<>6_(l^tZ5pXc>y_RoXpIudgYhDpaQUH*=loMEVcV9-NSAk;iE-=IxrNVBOoa6 z$T%HH;v}R0Gsih60M<>gN5Vg~=9?Xd$GvTq5e#~?ab89O z>{TqgSYxI#q~otV*M#_W*G``1-c=w$CUM9;c;nx_eU<+J1s3q5HK&KQxwQL>caQ!h z_YUevb|AWfK;gI~4Du`Eja+|b_|I||aWX5PUEaR^E9-D|J*5=Uj(-nf{HroFPb`^3;g3$g=jmFSb?A>zmwqM)GB8I^OnrNv^^qm~N=$OL03-re zgX_<&c14`ccOZ`KVp$Oz%qV!s>N|h>szkevN!3w+kS|hjarHG;Nh7%4Ey+;oMhNFP z>MFIh%M6)yg)wT=%GDlQ{E92b0r3FR-X0)jas| zGGWFajsp(a{{ZV$kY9bPda~iO>DTG$PCJ>si@HpK?O3~EmyBnE5BOD!h&d}E0eazh zJvx6{p{CEeb_9^!2ORqTqOMNaTq=YeK|JQHm2;-}eepk5_+fH&9|2#@rRq-`LN0CG z$1FgP;c@dXJ;x%s>2)R4CYj_DdG8}nER!*3oyjD-J7kt5oRgAs$u$7o<}T2qIRJDY zN>piMkw!eo+o%L}>PIy#Bx!aeuA)$pZ;c4bCera1mo zm+;QI^024j3Hw?tc%ZeDV7ac;RjQN2};J4g+d7{{U=+vwhZx zg<<~CD!}u|#%t(%%`q+Xi6vB-(3T3vkn$czN8)SqY~Ky_d`y+JdY`6c7=?(#MfF8d z0wvANcJjvQE+!5XuN)FEc>r_xnz^D|{gDjUAq;YD0J#JO#z6PL{c4k53$t%7!p|FF z$mBoM6|bdP$M#!?v`vxAA^BOikllwpjyevNID~)q%%hA=E9`3udwa&dlAlhl0PcI z)o4bqnFBKAAqC4Y!6&9M>(`3b_zvlMchWLRqj?00$U6`*T>uPuYw~ zwd7N|Fm{wZ@=t2BrQg1ts@rN2vO=*ECD^5i$lLdU=m{UzoRj4=r@p2Kk9<6qJ|n%f zo<(Tn%+abG6-Ul~W%O)}4`E(hu>FToWDUAFNkuG9I zL>Y!v5iSHxfE~7vn1>y)kH);S#5yEGX=l_X5IoWDiKB^ju>^hd+m6Sf#d~>meJuK( zK0bn5A8UWX1ZV#MgfGS4v{#RBgwfh~3*l}els0iBt#HhzKXsLD<2mn<>0cgx)G)S- z@aOh&@T7>aU-)m~gcp~g*u1TAsN4zJv(y~I+kxtFUsC?YP^W-@;ECV24~TScGV1Te z_jXF@sxpLru{9HwurFVq59) z%F3YfK5LWtSJ={CT`_a+Pz)( zDtVBGa7yjlfLVa*eQ{hLz{3`s;w@VK>NmKG)gX>VLx~%9=LJ}t0yrOuuT7uCdJG~> z+D+6fz)JDOaz-0J#pvAf2LyJnGc~DcrP%MwDc+lxb01!brqg%XG%?6ma+3J++;kzj z{ypo`{8OPH+B5cMyc%#4>wXqNd1)IRjS)}vk$Un0>(mFmy& zL>(ro$D#4Bh;7B)lFEoyH_j2*0=eXmW5#%@BW1;cEx6pPhf+bv9+>WH*S~8|gJ0VVt={EuI#!CtXt8M?Re>BlN`6&cp_{nK z?bPS3HKv04z{akIL-xbQ|lg!=af@U0}B z?!huk+t{_Z7UIdIjivd@azdX@cq5P2wNbycbaJ8d!}HsaU!yi81&A6nCf^H5l;FQWN_Xl(|@pa zc@iA5^RS*&uYNmvR7~W^P>rCdILW}{pf%V0RPfuwX4h8Hy0yDuf-Xa+UBq?Iw`$;_ zIf#WNi5xK`f$S^Nrv0Q7W-oJME0SS3R#Mm}JPtekD&!3v!}%eWQGtR_Se{mYM4Iia1ID@n+1j;|GTcUXk1Vlez~mebMgjM(s^3nI z(%l}`M`;59P_e=l?VjVGylam5f<}$ui+w^1mYPco*rWjyVt`v|=ifDZLGh5d3|?5i z*(>c_WT0M2!6)YFgI&DWXXZ;or~4F^$nt%mT*|?gFD&Lj+|#W%{ZB(%G;>9 zOJ`;CA;Dmv{qvE@9sLD!SAHvG8{Xw*lrbbL0`LCLI`Arm&x+kwdd%Wf3xl`i1RfND z(;}&AS25n&_^VBu%1gW1BbCa;u`(3|Hv=p(MhV78T=QK?*0ilA$^^2%i6gdF^3ZM@ zKsY%E?tpWWJ!`-v)i3oObO|PN$&z&-bjiSA264$hhHFeFqj7d(xRQC)DM;Ep466J4 zZm#?_EiQ55XR1f4c$38GBmygYnC>OJkg7aqu3oQJdYF{{LCA7 zeB%eG^s5@Cl4P?eQt)4gLkaWYO7$JB_DH@HM+@Glj+=lW-6Q$KEDQ?Vg}6FQ;Zcgmbu#qmTv%l%d_?@nVOTQLh+>2%-8*S~$NQgM-(iXt) zR-d_WS8}n(f5Ae$e;0~;RcWKgEN^DFSw(C+<`Q@A9)?F^J%%g5CDCoCvUNp?5CT9* z0*s!0@!0-#Q{$)Y6LaDZj5_@G@Yr2iqy3Fpq+}9o!j{~lsbbs@O2D-E)pQGqbQP8{ zgjI&*^2Blr5y>18j!l0x_=Sm{H!_k>Na%k~a5ht01(nmBVXU<}FZe~Q^($xla>61i zr)VyU?Vf;+TRy$3*FR!!gLYb{$16>K>29L6@WY3PaNiSNFg{#vTRU*Maqc*;5wQ5e zC%w0|eKz__ySEU-6i%cUCxsq_oD2&63iuQ7y2s$(!rLnbyMk>&(BEGGS$EFB7a_e- zPTqI|y7((8t%pw;QFkOexuE+-1pxA-am-6o2j+5SS5Mc(lVh$k+ur92LzsS zeQR&cOIvR(qK-+V&g6~oNF(w!=N}6-f|u(Mc}1nf8?6M7lA9cc0RI380E7Pk0RDuRZ1~HA^pEYelJkoL; zeb^+n~%?IPYeEoOGMgxnWd1X3si z1xQhcJmloyW7@uO_$A;K*NwUvFJgO{FwUe1VVE3j&t5<{C-kqkz65wjP0}>A`!s8F zb0^PnaUykWkN{#%dLEs6*Ho86Wi?H64)E5oYAsCPY@Xt1m`IUFx?Jq-ZY6~xG^xyKQ4DJGQf5A&(@Pg(x6=`#N6j8 z0;0z0xTzS)KKbuZ;?p>)RgFVMi?}X~6(5ke_U}wLdt+H7TztT9?avhC*#ogmy2wdw z&yWwG6+`<%&q@fMYDWtLlxZ`tdk?Q})ur?^O8X-0+O@nZ``1|5{GhPFKZkMeRPSY5 zxLP=F;d1`~F(c+6(k; z(m_ze1NeE}{!L$xOuf1>$@ZxPVM{jblI6Q?9RTg#ou)>%8qqf`7&j}i0>^?GM>~k> zNF%RIRINhsN%t;Y_=3{H0QYP{V*!HXZs=4WT7uV0pUIi5WGm*dbZ2sRE(QVg#c3_2 zz3L34Yy)IvdN4gl)7F;a!DeJ{HfX{gh}aGF80NR+IlZD=6>gyxrDR5qIf(;sPnEro z_|r&Nv4-;Nu;u#PqA1 z*?ukAUtPs%aT`vS#m)=>NT3NBanu}pXRliHFWL{pS6(Nzn>tRLWJ@ejh^5@jLEW?g z{m?VG>U@mYt_Xse zV4!vkr<45a(LrMv+ki<2*0+l|E2qp(qdjR23fy~p(r+I5^zU14j%RVgn~ptxw1#CF z%MLo#Yu#o$H4MossRWi(;D4M{T`k6wdlqd;Wz2&OoMY0a!1Ss*b@;oHTg!AZE>1`| zJ=Ej4tKDmOyP{^S^%Da-xdf?QK%v2Lw+x66}sV&DbSyIsu+B?_XGW z!s^Uv6G5q6M{d)jd1SuU3^Q#7MUWRE;6tal4P=>7B!o=zVMJZ--tPdAu(g zy`{W{V5=*Z0k9jDk(Biu@!#IF#XS-_>1}h;H2q3FRp)zCXkIX;H&+FYM^*>e^sBbs zTNIM^B{QeWB_KO8_ah&4AIhnCXTtXOR#3bVDzsx@z`$G+%KB%XD|Q=yvnJ?NZrh9j z*U%3^?O4TMbBeU0pSmEnN$pxTAG>c%jz6Vlrli+ejEjG0$}OJ?!~#QS0D^kudE@C? zHl_J#ks@Z~u5x{{dQ)Y)f;o^DLhr!mJvsaR=$2GjNMH!MrQUJyY9-m6( zHEYXRbpTq$VY!8VNs9ce>w>Bml;% zyYBkq-msdvtr@62R)-^~=ndjsIi=K=-cc&bA5#QT@66S>bJCrv?iq&V-?zJOvxo2;hIFSJZg*j#?Jb}%6C&k@rPal5SJ~!12?DpDy z`dGvxa;RgrjBm*t939;Hf-B)4h#o%FykX;QYg=o}f^{qDrB6C``6Ap^R36v>AI7zH z9X9OF+7y$7Q$1&2{{VuBc$>lAFP(e=qxfG)g6hgCLQP@k$gP9U_hMA!oQkfW@KfK3 z(p*V#e%=w7LmtIe(-qeM!NHIRA-B<&gF9FKa|@OS(a9vfX+JMCY<`UY*IA?=ppRYh$4=bj1V z3=Y6zzBj+sQb$2@WXm6w$-v0Y03N>GD@M=6Y%X@d%*Zh3p~xHok6fN}=~Wy<*qLA; zeu-#b@KUc2Y1Y$EFT+hBO)>-$+ugc6fD9g^?_l&ljaifa3P<2wMdDlk0EU;6NfKj! z+x9bK9G)<7+nW68hsVt5&O)1X1n;)aMU+_?`hL*RNR~P;W)m|Hv+a0ub>Rmw@JC8%q@DCN_KNNp&Z-rMD zLf^r@2=PszNwzsUjB-b}up66jZ>@Yc;y;ORZEYa5XLSp;@Nn#N&N0`nPCbQkI^T{i zFBlo$a^SWXs_;JX^vAYFII8xDmxJZl`ZxBE{i?hVtb82t9hZZbR?~HjY9Fz{*E?oZ z61Yd+LFg3p2R}-K#NV{%gRHd};8$jq4v+vLzGhY?Ys!JSd z)~t7K4ZZ&Wg!B~aO>Kq4GfGv#4Y-Y^0XX@6GIBp!wK85B{ZG+}zi97;_u72xY2sZ* zB4gUCai_YKAmg2*_3et(wD|Gx!uE8IUme=TD-8bn-HGS91Nd|AU!3}XiyiIDZ`vZy zL$#f=>EE{$>u(fFZqh-4Z?ui2fNUPzdXdTesB^hLRI}Xu6Vbjc{5|n4)#!f}S=qr9 z<~wgOizLyH!#h~_JQ2lT(|l{-sovOWUNrEs?qdmACNZjD5<%<7VPBjd@RzdNZh6`u z3bHD;2wzNe2Pg5T$Kva!h;E&kRfio8K+bXNijH(o)nw1onQy!=a}<-|xQ%64E^gDzP)WeRIN3jEKHUlL6zlw`@n zHr?C4pWrIOc%kjKMHRxs9_`Wrkmo%HdtmcTR78DNN9kO?AGecPk}W@2(q=I#?hAUn zliMWmoOa3jR{`-)Ley+NF?=A>;$@Oc&lB9;58D`Gho_!Bm=ln_V?@@b&Nh~D{q=w@I9d~E) zuYo1_!QxA(LR@Rw&BSF!bvEdB-CZv!_a)$ z13j~kYA%WTw61;0qWE$3@3gj&i>oDFapgdOksx^?T^O3Sd0D&3-LBhF7n#*#=4E%Qby|OF3*#2#t94j`_?S~0JiVM z9WLI+4Iji37;Tec0}AcNI1Dk{u6RE6qGI~Ik@cjSQ?>Ie00uH+V~h`eJ;qOZg3H44 zS!wD0pKq}kv&yJ`@eBb!s2@*S`CilZ?eX57C!G$ZX>%bPcTEC-HueM19&z6_CawE= z_`k#&8rkdr0NEZ}6`L{J2zTJ;1+$(HIrbFpFJjN2yhC9Qti;CN=JRCiEjQlc!t{1mjyA`@!B!jalOF8D1EJk{t??eb+4N=U)tI1z9Z|}?7A+VZm(@^?UFMgR8WAD zNF7_|Kb>}d82z}ebiI1sdHgw~I$LLKa!lKD-Tg-&UezcaHjk>jJ*CYQmor9XcLZ%s z!)$n7qqkfPpQUTuXj9E>8p0@z;Y8uR{L-f|qETc8zZri2MVj>NgPpv);*e(Y(*!a)E)2f%wz0pRP=i8vt&yHpkyV+4vh5k`&B)37b-e|nxK%Mtm59jGGZ2HG$J~2Y58_P>-N=z6A}cWt@{-j1<<|B*_xf$dSUfc@nbdL$E8^LvNFUf$#fdSX}aC6B$ zax2fgC;MakEPY2t7jtU%wpUDA?dG*$aZu z;x{+9NT>p|X|`q@jBd_zlb$hMmX+~?;Qh_DiGPZERh`ZQlXq(@VkbW{XV7=a^y3xD z_$$V`4!vP@b7A6rB1<{1?poeK45cnp&0?}E1vm^oV0-79^K&TkK^~@4?#@Mn;U6*N znY9_4V&E~i1eF~IbASmxl-Ya{=d6xzH!8O2KXk3P=rS?~=iFCE;p=7bjnIq2x~_w& z$Ph?iOO{7O&N4w>ox9eAzY8^(21SjF{QL4RRm6UPa5I5k1B&Wzwh2f-bCLlQ(wcF)palFht}6a;GOb{43Vs_R;G#kkDty0=))VN7i$RwfQgYvNCbKF&ELnvWC z&H>2>zD+XqWS-s9F_sE;f%A0DG_|?=7Ao_jG`gmJ)9{v5fpvI%+_l89%O6kxDYcg; z++-f7IIfRSv-33efx{M$LF%Zrix*O^7b5j6XeTgNq=!RL5hDVvg#Wp@GB z2cRCcHs!QYebk8Sm7Cp0%Ac5?pF>K|DDQZL!FFz#C|l zfWRbl8Q=l!UR{nBI_lml$caxX<)R{F3&SzS7!%z80J1w8>HZ1c%VXnv_?ec`bzLyT z>%+H(Y2|Thu`+p#KX^t#2o&;j&>zZ~bz^zr zYqNi+*-vuvxgn8*unKq^y5w=!(-mT5o*h)hs$VRoAj!U2Hkn88xaQ4If>1YHG|_}|Tlkb5LR1>Tw zXK7o8XIPNn`uqD;G;_K$smu&x1(rjWWhVqHdiNrywsn(Hks^vXt=MlH)P*VAAIhDs z7bd;&W~gF#VUcYah85zB%2OnCC#mW>bmp^luMe2~i7u|Ey9dcx1Xu0o<$)F zwsx-}hzsAR;aUib9-}C-m_-{M#x;-cU;(#q^c<7inwL|Q6fQSV@!UpML1U>;a2xk* z;6WQ6xCHV~w;2`9YCjM)O+Z~FW<4>3tPhO&s{Oe=209VJuFB3Yv_xdvy-Nuc$&Jp~ z$K5^fPc_c?@50geiYJ#%Wsda##DRfe2Sv|gjPiO4iDD$SX3(UW&qJy#x@2+9ak}yr zQ7bIK;N*7i*V6|zqbf&lc5N;T#G!~qW0RA~$?xx)Prsx;EGDs=^kLRJ49( zO12Jh(|}J*^{R`gfpGr-YJ0RHjDeH@h4{$y0~Mpv^+2e?04CD=(^+|#^6BG^eVV8tV0g5SL=Pj>D* z1L|v=@pp(}(%sZq-6z{fNZwK-FTf-MyyPA+QrmcjP^)eh&_#`&UhgarJCo25J9Ofg z#cdVsmA##X*2q~_LP-WvNXGz=yN*fg?rH&}#6N325d1*+BdBTC6V2vYA=HFUM#M4k z$D;)#dycjF<>PomSlZozgA=JEZ`=e9zWE(1^&3_2jQ2JdwpyxeO+p!Mm89BL(bsPa z+dYkbZu~~@?7C&vt)<*He#tAsfc@;LI63X=ezor9Q@k8sL(ax4G|Vj`VJ_05AhKl$ z1pff~u}swT^3FWD0DR*Z;Nz!Wl|w+f^EBA^9FW8k1~}?Im9=#jnE=^`b-@RocUP{o zIAn8=8{0qc)Tz%n=bCP)yQUsW@XL{qK^-yuYW3~3(YX!@Bn%Jk^PG=*t$Q07QP47+ z42<%;_x)=^E;7$}07yFY=OdB)s3qdvoUj?(0OWh-k^;HI45>UQ@AMTk(fP7v&NI$O z81$f*sSckpiu6cJ05H7s)b#ovO6nE7=r??t4vnZla}0}#{?BDdU4P5sn<)A>0A3flWGmczsI=b_NFvN_LVu@ zHvoUHrfS}Y;s)@9?W!ybFtbxIf&S~`qPP1bWFO9yhZk~qE@iY0ziXKRTxW7OV~?j= z%DBVKb}IaxLXt=o`a%By1s(qYf>C@3{g=OCuMGT6_*3ztTVIG;{FYLm1M84lm%Hy|r#1E8$A zG)7tkIG4jy_<0 z{VVMs*|WtT@UZ>{X(@d)liz8Pe`emiobCugiPyQ@gmveGUn|6zZfGjKosX>HyjLWp zOS##}Z714a1S`m`hZsA3y{lJ7o?Cr739icTjemHn)m)BLj^uY0kP%YX_a86=B&i@^ zao?N{!`iwFI9$gSw&)ay!bZoa$2t9ao_XfJDr(xFX&pj0^5jUFRxu(83YG&rWCQL` z6x9NF5D>tj&N>cp!9K_HrMgIrP4+fBl!Y7DaKPuEuRSTEE%zbG3L9$$ECI>tqx?-{ z)YMVDNwxm}07hN8!w>$q6&zOU?xvT@CRrruf0;2(lt@J}xU+$>3d;eQY6{{RxT6F11ReUnL& zIWh+dOuC8?e!lqpb?~k6@lKOzt6ivuU0lAd>%8G!cWIxK_lRjvYKFXV864Yg*e&g@Z|G()pkOt{4!+9OU){SI_1zp0m*R zupaFgl(hSwvEGq#e6^5lmvG#qoPa;TRF+dsVd6Kt(;H;=9#baf;zCI~eZIZ3SMGc! zuDFfJl0sxv2jwTO?4JGeOz`EJHMP{Ka?;B85-DShrraZJ80nGLxFgLMbav?_W_O>p z_l6<(vHLh_el+m(X5#+`mLm=R`9opStcTL>ZNks$Tg-u9MDx#^*VA&?h=+BPtd^9%eulXv-03FsNBGMob&C9+K3yO z-V1{pq~HfuhS*+mV(+ zd{>JpU7tgH825Hx+1Jy>Jc+d6t0?)7PYh3C?M2n8)HLRgQi%*~?XxHDu;|zwaw^x0 z?S%FTBy%W{PZ;2kI)Vq`#bjx>seuzemoogy7-ycO^A^+rebL+KZ4w;O^# zQcnmEIXLU@=~^Bax>zqJhI1kpUy*|4Jx)e>^!zIQy2iSPm3rl2mLfo20(!CjSf}{c zLtPG4xP!{_CQ$06OND< z<)u-CI0taYTz2*E(zj**0Eza8wnGqUhC;9;?oo_@Iv(Gxa@q>ZZ>Y-^(UC53<+<20 zzK!YEiX*I9O&yJu(AKn*BfB}b43ih&%3KMK30T{FPbU$~kNFrkUuuFPi+4nA&s3Yo<68Di3*QzYPHD}$0p%z&N; zUOlr~MRY+Zt6X0X_%J1p+BJ3y6~hqI1rkZH0tOFJmKgcFdeyss57^p4BRO*$;2$#* z70)GCjGSY)VOP@CpoSA30TKCSOW-y?hyjpBd!Jq^rli-Ayk_J<31okIVw> zR_fgF4gtyF176qhhU5Ep#hPB1rO9kO#Wxel3FI?l0D6Fn^d}Yc6TD)g&MIo}n8ebw z<6)xOUkKJ8-@b6T1sHGu{$1%W-YF$%WVsgRMLWNCUv@iWbkDtYdj9~2e$DXa?){~X z>4%ok1#%-8e3HYerJ=sY_axVMQy zG^)wFVzUkBugjj}sp-Pmx5kAmY3`~D8!sIId00_tjrUpk+YnbrG+^api zGCHJcH~Fe0$p?VyI^=*cp1juIjs759OW{koCKmJFc}57tFN}W{6%VIBH$hpu%0pTs z#=mI)03S`E{0`NB;TX6wYMv;&k4v(0PSNHz#oP$_iDTCv%Do5UG`8QfAMA^w_;Sd7 zl5G;nAPhj{pa6yd@=UH9ccuk+jQYZSK>eieJ8;&KCgIRkoN~@i3)>-IV9xw zQHo#qC^yA9yiH@IX;I~k-N>BzQI|eS1NW331G5qrsN0(2&aq1chLqdcGuPql3(WD< z=tXYP;TGB@v)GC5?lkGX(xr<$TiMCvXB`et>r8{gHdnI#>MJlL<<8PRQT$oYw_l}l z_OlyyZ?!UoQe$qTW;^4t>DINpI3G~DiqpfgyWd^NB7z466tQdu8Tya#HT=Owjcnf@ z(z|khsr_k)amg?|(v_4~=zRwfJsni}HnuPr*iSb6$mb__?v!(b)0`T|{hIz5Y5xGT{{X=qA3>B!YkLBD zmv<#q<+-?gv!38CasfTK71pJ}wY$V}2Z~UvHaK#@e{{UKL?z-BKhvc{M6Qbq3wUk75 zDb9Bl2Y@qE=VGQ7AP0Se;-NAk0)?GYH=PQ7rhV!KyP$%U|;H^JRw7&4< z-X={$Ns@TlE14OKMJPwy7?$MVoNgQu*1nMN*|yQ`UE_k*1-O0A@k#!$j*M3rA3;uX z*2Z&<xQ!_NCFH)_<{Cd_^_9b8p-l-aH;j&Osz} z?^fcPIVa4Fk~=6Wzyh3}wJp_)-&-=m{{X$l(B$K(=clz!`kbxVC1W(&B=Rzurk+87 zcSs1wVljb}`P9~M<)e;yreaAhnBWZXGCvBE?j*5+Q7zrTI3c|Ur_fb4@hq^jqL?8- zSS!j8-o{s_pzBf0k*>2|>M?w8tFPFnHYH*<5`CecIVvJKe=T#=f<}Gm()jIk=AERl z&zBQ8C33Q+Gxv`;J$v-#tX*o>O=&mwrJveoomn;uQ_8ac02X=!o=s-M;j0~YK-1>D zyt}@d81^bk-ddK<*2=GOf-#qya!F${4r2l=(hSz#8UWn#@Y*l3cd#2gKq>8 z-#)w=+|jg$@f3UYu;MZQ04$%Yb~*G1(ug@XVNMW&Z=rcSM|X5?2AgV(u!2L0mBSIy zLXJjw#VwuAr>j~6BSjRB0Rzk1<%85VazhVFtsSTQBYK)eXDRZw0Fkq7j11!httQgBBaQGY%-IPwlmn4z&$#O>+B~Nlg2uH zYp<{_qR|s$Di`v+pEP7JVlZ&PbmV6>E$C}PKJ}U4A0M@(ytmnAwqhsTuNtXFhYSZN z{(5nO0l^gi0D^i0S;}v87P(D9a3sOq$l?GBLG`|tMG{9GtGufZPfi1IVedgB#V8%=9h(Ik(=I-@<* zS#m9*`zkR5Bap=4{{Xyrs4PT~Ts)RWHI0C1VRzcnC69y5@5>=v zedHVr9_OBG=6`{n7t?QVP~IDf=Tf^;2E)qz0}?sl`VqkPud+TD+S_Tm2J2lq-o(h? zJ469#m~dH}87GePR`;i7E^bI%-?O`U8Gmr-IRvo4&;I~ku4J&mz@#Jdv821IXE3NTDMx< zeh|}cZuN#pZJ>>%ZMk;JsdmZ#0Cj6h&rFUN^8-mUHzD2k6a7Aw=HIr@iBrOVvcHVy zc;uE@wDz^PNR+dgWg!rtUP%nV@y`{m9-W$DDz2kQ{PVu?9;K#yHSw2O%uoF$XVF!InMy?>EES&WAQ)5mloa$(!4)+;hz`?BJmN|rkrSZo7zOS zFr~Yvmy7~LfwB%%cCVH{Xl))}8~jYv^&jjX7mF#C1QN@j-Y1lbp+YueAbiD+(sR#h z?V}cwO&H2rws^+1@zcd;P>Nh>z`{w43qO^K>KQ|G#{eFc0{+oHA%alNWulFlDnu-R zx1l-YdseOYfk{W2_Sad9U^|4Gbjh^m0gE~S-k9rISAP%TieKKFn{_}L+DKpICc$f?iy0IplNcP=97U~o5R{% zv%+B3bjcmEsKVhsXY?aH_aF+6_rUv6nP<0X#v5^*4CLddq3J|@(P)USelN{By4~8z z&+!KU4s+YBQy&x>F`u&SkQ{@%B~E&e!=R+O@MA{qB$_U~F7S5x=jp-ss`Gd*aE|gJ zWgo?ngU%|^Et@(=h|^Tib&W<0LUf2)<7A&Xk&Z$Sp=|S1{8{3U?4Prnn4AmP#K5a$ z;{XQd>xzOc5=##ZYSyt3Ccp9rmyDNxkm(P((i0r%OJO9Dm+&#xk;i^o>$DIwHv%HSaY zXQnGOctTL`<)h>wIBwqgqAv+tlZHc*3w_)leE$H4wGE2aHV==j=MB0=!N(3a1CE$I z#(Af~<118|i%l2}{7=z+N%XFIUkXl&cdIDr{p0KisK4PGoU*CLaR`-!B#MYPBP6+86JjX5n0DR~2s*a#k zxzu8WD2XF*d1Ty2UY}mI6JKwb4UPn7Ia7e69QUpc+fSLSZQdtxuMlnAa!AO{ESh}k zq!Q{Eugr1up>JT(or_+pM!R=)BXoR|@ARt{TECRQ2P73d9N_-|lj&SJv$=tOStN`% zqo3(aEq1J-9z@-qH+2V|w9KTfvFMQN#Q{}Cj2Futy-&aEOLM79bYco4NZE@JbMzSR z?TX+U;`D?5kuK76f_VJ@0HrJ%jqRr}TudX+BRL&0imqU}+sk&cD-_toU~TJ@p6A!v zqica4#Q=iLP6*)-)88E{jZIfjwM7Xj$R)wrIY0esbehfcq0GD?$RR+d>|CDt+nhRU$) zG3%alSvt+j%Ly?t+)h+8%GU`;ip2|@fWCa3@a2MbDSHD{PV(}??nXiuAG+|mbDok zi%A}pIVP@Y#qrC;cG0H$n|JcnP_TmzOB@k^Il<3bqvD^98rh0Ki>ESqeqYX?c=utB zocF6%{{Rc6`w^B+MPo*9BVxspNEro*Imf9TD>uad01l?Gx6Joa6;KsHi9mJR#_aQr z*%|IJ>s-nb-o~8KJhR0=9sEF!qF1mRgCi;{0Gag0bH;IwmEpg&KgB!06Zj`fve$IY zF6z{39%`17M3MQvNc)BQmut2 zkf5I5Q`pz%x$HS{O#X7t*CsN4td8=*q_|gEP{cuEO6>rHk&+4ERX?_{xQ$|wL}>YC z*}S;wa=*o#_5QUn)FQT-VqzD_1n*O~uV6hrsvEf^vYuUz>?HzR0hYk(0qjTr0A9Rn zYI#apnwoXQ@JNqsAjHqPRg`4?3F-7cm1DzGl=z3?$!-h~c^ZUC=IlFm77Mo>LFYTU z#Z@~k@0yBx@g&x_rYE&)JB5}ek;4~Y!#sB26VI%mKsyd~ys z30g?{hsD-c8jb0OFWtSf6CAQa2?P^?ARR#m_0413Jd#D`c~LN#2xz5YlziZf_Qh(g z&z~WZY3CBWVnTt(-o|_PIUkX%`7f7B)dM6@8+DV+c%;h)&jt5-1CPSLOpThk>how@ z(RW8FmL-6>0RlhF8{Z$-y*}dAtu1#zzH=*n@dg!9iRS}9%hsPQy52(a`H}wdODJ3d z-FX<`@+!`mr%kHcGHFl<)&Q%wAS(=VGuZo|tx%h}PG*(uw_K|;1qeZKb`S1?JBotA zn^TbewP7H-qOL-+j&YIejd{Wp%l|Ia_^*#PQ4rks z1mQ^MYL4fx9qXLGe>&vdMi>1d6sztGyL(OM4f42%(BO z047AsEV$rgb~)tx*UsO!_k!*GN#Okt#K`hJ?wNencXAxEq)wa`$?8~j=Yfj!a_XFw zZQSF<#_+n__&&w4a5JOo5-e4hYAuTH07z>dgx&U5kzwZ6toRTgI?9nc|Ck zr2wR<<>Ya>!RPcK;;hehkj6LUWxjFUdF}o+^s7_Kn<{D%Y>So!zz6UihtjkBvZ6rh zN@TZAzd_!$E-mA5!V?-2KZlhZb>op${>3r4Cg0~-K2`^+anyQNiCoCYNYS4-QZd(_ zJ$b34RhB+jGZW}>kMrK7o;hN>WRPHk)b#v)>GtUI#>E#n1Otwr;wkcu_8@)Iz=231)zk^v_pgZTS<)h{T-56$wZAZOO4(=JxZ^&}vkMn9kU(aJ+- zNS5z3U?PqDa1KB{fj;$fMYtLkqXon4X)WhVg(nOHMsl1U4jY<^OL63^j5e%$z8vI7OkHw95Q`Y9Uj74m>Q?titocxhT z_YrvW8YBZ2GnsIJGGg`Eb>oDtA{Ds_!eY?W}WfQ`pw$!@m{D;ExySy3L%XJB=pcE;=8WFD^1Z=qr(t&o#rCVScefQ9UfP66jZp z>2vNIt9DJnqlgKKByw9Mj1lg7XSH;X6n5+8GsPMq0f@<1@CO9?=kTmkG&-b~V@ZvC zsiu!)xh{ny!wh4d{{W3{f`zVQVum}FWsz8MjQz&XQO8>RwzO>AdmpI6X{({Kz-^vo zmBt2eI`hUj?t9g1r;x_tAg{6U%KX{)9=QVotxUkejR-6ul~97X*fE@AzTN;7*HpN; zMe|%Fh}@OfGmpK`Bbwzl=1i$`GOepgZOh80K%*mT4hjCgw8=I?OpGEiMpYsUl0y-b zpF`HHI?EV2+2)Q>xnZ7}1HOMshfRdr+q^c)ujI+)BW&2)7~~V#hDiYR7^@}AQSgap zwh}1aDodQB6_E(%Af7P5^Yk^d@pHq{_~+psscYfME)qi+7VU*qX=ENy1P*$>IOnHY z%2>d?wvtlJz(0Y3HuSorx^fvMT0LK3S0C-^@WQzX)#hPW1jhL}$zSA7d zpJJ-uFzJ(8;o#k9wcN`SSCWL=?0rN300n*VS@?1B(pxPqXrph0f3t<%gf^kD)|VQb zki?RbIRh3f4^n${ugKG4d^6$r?cjM3Slg^h02vz)00*JQJ%xUcf5Bd8bvHM;4 zhRqm=yhY%zhA;^TZRrqO>D52Fte1|b{mk)So)@bgqkSEu>e#!UJ7q|~QXS<{o!sYw zc3=}}Tmv-62^x^Z1kp!_S~YyDe6u=@$q;*DXB+(Pma(kh@C_ZZx8OR(}iM)NQ9X))ztBvudB}rQ)vy;K@I0qx1E6aRE zHTIdR1(HVE$|T&w<`04MV?72scdTx7_0^uUqI^Jy!=5d))DEL-14SrlhSwV+WAp7B ze(@k2^f;-1;G$jwx7W454|wN8c1ye4A#16!u2OKU7B=IBWi83{etHV=OTQ9b#ER{4 zD<)4R$;#sxBd8qr>t9j)9Pw0N9=~S2d&An}Tg|9i+B%aN-{ovfqau;PkPlq^mD@%8 zT2iF@9J7B{uL{Wc@@+I(Nh-}6w&F@Ff=ae}aqH z3Whv(aU_7@_fofOPBs06xr@^Wm7|3RQ8m`w`Qj&OK@`4$j*=pvoK}RQY=o%O7z~OMm!B zH91=0L5OiKbWq!OwwR27RU0VodM~c{9p|K0DBqEYexo|pE1kp zS~Ka_(*+IzaJ=J&z`*Or`OQ|af9y?S*w2|^$IKT14tXOzv)}7m{wdR5HI_@Y^Wubn zjf1$yj-$|L`qm@arNbDDnD&4JGjI>5(ylVn%!cf5>o#|Kjg%i@HZza`5zNLiQ=C5; z$3ijq(NOqu@$aE{uh(lw_ez7v>G^b`g%tWDK6CmdlTWplFE2|nN|J_GlMHY%%8uub zao($V6H%T&2I;nq9FCUA(3aXV&-@NKkCdw51($M>r{Ln zB#>HNS~m9)UP_a8Ibs+9M?3;K>Nu}OGxK$#H&m_Th!BTqPna0CFgfIb^fj^J{{Ri{ z)ndE7nWi@BzBtkHqmVE$*9SjNb68(wx0+dHk~NWA5oK78LC6^#=LDW>UrLHQEiKbZ zf+cXqN0vDYygBFy9Bw@ET@+)?%<9U>*pA98o5o~El2;C~;|i~ycpWzZ+OV~$Ahy2! z_`q1qvh0k6gb;VOanlNU9qWF>!?EfTBFOSbw=#gPMqh6)&O+o4!?k$N?I+{r@K3@$ ze^An8G0S|%PO=+|KbYj98T+KNl6rTqb1kOa`K_WnyiC2@cOw0X?cd@b#2*`cL)6t) zE13?LX3|Bx7(fSl6W?kKuTFidwzarV6nMh(R=+b53z(oO7|9HNP;tRsxyT;Eli`%geRD;5PjAFfw{OC zJw17^LZrEyY*f=$M$d_~*=;->tE?g^66)7#%dqY%oU*VU!#s2P*FE8g;)d2AIm#dF0kN!(A#frCHA;vD*2t zCi1y09x;r^+;!)S^{gXx8ydB#)c9O17TCC%W{U5Sh@w4*8OJ;YBa@DeRD69V%R@cX zMQrrwe%SF0;n)mt_}~njuTFWclGnptZl5&9c@>sz%Cg73V@=$V(DTsdyu0?s@m0@) zz7FaMr@h+i8uaO>TO!B{Zg&gi;Qs)7Am`BJ*F`9EO6GN?XxQ_w*-OBUtN2^SzYsMx zhFG=zLTO@>?Y=-1^dL4*rbzX#2>7?-)$y;yJDKD0L^h(>Ewo5ckU~c%fyw#H zbT#(R#k~R#+1K_r(!4cs98DIRr-){fG4liRlWH2QgL6j-2F?I*@;J^yfz+NdN3DLU{2ur@7s4L{X`USL)S_)S zNsr5bmGX%LmXbm_W@g-dvMc8JQ!7|1PZcGs_U?QBA#oqpq_7mFqTl?D%|FF(-S}qK z+fBD$v^Ba$<&gl5hX-=>I6a511!BCm){q7^tnTw}P-O^YE6F3S6m=kuI#rD_&GfAv zXo!wW%{KOSRtuJi8TWyo_ge<9wwGlzV&Yks?SVo_q?RaH5)>;89FDo`UrA9m&&%V> zO=!0xuxPa#xg?5l3~#p#W9oB*$8&-{mCpQGnoTc8^5tjL?dB!Q?NvJg#sKsusja&$ zX6H=baXgSq6aa!UJk9tUSAm>=FQsr_7B2O9^yHrEC}IkWvni18jJ`_|hU4<%y;Un( z#+vi_9wYJBUu)>)YvU|Y30bm|?+x-`ARJ?`{4v_NZ-h1x=$f=wA&tGe&aS3k-bCba zjP@ru0QWVS@sjl+zVg?WHx9Byg#Q4eoxp*&oP9ffHM8)KKxo#=IY1XuTt<-@h>|2H zkj%N@oC@?KE=wafcF(ETNWRy6GPCNI0@gbVs2|UfRh4q3O2)mwETabicdqvKO-2aS z^$Betj@T@0vbUDf@G^K9C)01zvivh9uc&xx;hsBBDPdx^(ZjoQ@yv`!>OpP1{*|VX z%c$E$dvhSYDH(Ny5xIdpE>9|*4o5zD=cMEM?9(g20t3m zwYj{uv0-N|``ufD?H7JLR%!c6)s@SuC+C28=XjAVY2ImOVfH zbtCAq>Ni4IWb)p18Qi;q-d`%Cz3 z^b0xeb$g`?xXjDvWNaXT^0yplx&W6WYGD_%~;5;pi;Jr6`67Hm$LZaFdm&bsIKCaZr`c2}`M*bO?8&+}p$kHZVX+k$=gG;oTMh-d>I)0zZu6cn+ z%yIRqx`ZNNnK)>iNIAzN{F-&jtkFir%8Z8Kj(w|0`??w0_9a(4zj=&y!KVq;oT?C6 zMo8{I3Z*2ic(JXk%NX6coB@mj_fOWWSn26!xTfZ2>g;mO^*@auYQ(L%v9|-BY4ibs zO%j5{DFluWwP_D@fy{RYo{Pv8+ag5&_@_tepPCU(dxkGyl)?wY<|q`=b|(0 z5^V%v@^ir%13y~$kK>!9`qYu6u!R6h#C`cQjAI-S7e0rMmG-a28xwos=|pT1qgHL| zaVl}aM(7TEo-5%$i|l{lCHXK{%o2HpwtSc&N~qwG(C58p7P*ePTEy)>1o&#|@>j|U z5q7k(Bw-w>Z@IV(g#ojkqc!!*CZRJsE zHPmKP7Uz#~!BNTiy5JHD^yG72R(M_+{{XYYO(7pBRaR0+0CAsF>sd=#n$^+y^h*H!l5czOUPUD)D6ez&p4&Ic# zr~@4;no(kI;6_D3acdlm46B`>fs@<4Pe@cT=e0}sgq?`sjYYbI`=DTbE9Q^*DObhq zN8!(fJQHEy@ow6lv95_1&2AAOiJgg2$?5?2BEFpq#e6OQ00k@5Eqp`!OL$LBc9kX3 zG%2T%(XqGBnQ%WSPv=f>v>QhFZ+fanDgOWsKjVGK(c0-nqf+UzA{S}wi=Mpl*(CL= zG5**-D7A9;T1}nZ%tWw3bm4)=LC(+!@9kcAEM1p(+8rYbcJCu-_s?o&#+YDGR!L*p zcPVK4cKJts-FsID?>ZjRQ9T0V_SEq{9L=FyOx+walCE=}GN-oyj!idG{j&83vl$^{z&oUXWNzGd0>BP- zf%sH8)h$MwdYtFRFWPA@r}Qe6^cm~#T*t#-jG6;TB0dSTmMK_Z zeV!Lh!>}y5BcGwgWqef9t}dXL?54?!J1nKyfm{xD@!0 z;Bk?W!RT-~J!(CzW!%@mb;A+ZpTqR6kp!!7Og5}! z1Lbs?P6zjoKgzU@F1%H>FqR&b&HIf%_I=fCcIqDlyf%YqNkp0qOqoCP%nnX{dsmA5 zVfcCbG(?vTp!_1ybh(poWQR-gvcvn>-~rST$2I8smZx!VWaiQa5)uaaK3sE>+n4^GF8_|M_*!9imr_P!N1sTm+4 zjK0L`!yf0RIn8|U;*W+u3+}u`jiTG?w(zlU-I$6K+++?hj)$kMd$)?Bjcpi8myjH8 zGI=FcR4)YQr(vGvyi-uopqpNjX_4dV&LdW2&N)%&aoCIzUGyu|lDlRzr3KL0@c#h8 zzk`=@K_087>XJ8@OGPM?bLXbsa7SJb8Rohh583D7Tp?r{EY{9chW*sp4W5}D3CAot zb*yg=S|yeh?%*C~0ahm}2Th|LdG@Y_OlH`%?ZjXvLlXG`M`As=`sSOhQ@IM9I~<>i zehB;zwzdtYS?U(%HT~Y}nbC2aXK_7!&t5CcwSR>F01qxTDWcM^HK37hF-Y?;+z?3x=N#6w ztIpc8XG%BF=cM>G;OQ6{buCKYY8D?p^Nb9VcAot}=hC~+hu^XX!%r33t7^U{)?$&| zDhO^86l0FXqdE3b)1j<4@VJZ}iyWJn62Zv`anHUF0Q&Z?NBCjksYGTu;c0|{RIlxRSR@~vH05F=W3Ffi)jZwgRVwD8l(RJ4yV-Q zxC2kuVwymAIoP0pM^V5BBO{*m=}TfuAulLW862xK6l~`!&*}aZab>%| zlixTZwJkm~c)Lu44XDF3Q7&B`95kKs8$9FuDXhXva$Xg5XT{gQum#nmaIL?IG~Y2m zMN69rEtfy{*CY&a-=3A3s(!=z)TJ8I`@^70cH~a)-;La3n){kh+8b8;Fgm7>rryUI zD;&eL%0cQwX9pPP>rJ=#qv73VBHD+6^wdeAWoaTra3ehNz+yAkxUD0Zr2XVi)g|2c z4^#b#JX5E}pdAw8K0^e&!$<9cznIU`x$D2#$6L~sjn#xwM#pLxr5m{&aDM2ozx++& zp8(!j+(5n?z0=*0GnD<<2ckH2Jadtc$2qSv)-=BXYC5CIr%kA7-fNHD$j){#{^F2v z$Oo^lt#rp6n$*SNrE}z~PuaU))m4A7H19D1+Qnx~XCP+{>-yraUjD}(Jd)l=)4U<6 zOp%gU$0Q^u{_p|w?~e8MPs7iLJ{8m&)=0I%9I>(79n^(8yX1Vh&IfL5*StCKdd^69 z+j!4UXD_u?qD{MxL6Amq+;ycad=M-wp2y~8{{ZZZ<9ij&?}W9>Xr%uDS0t+tSMQ7m zBpwOmdR8-h0oID`8a||0g5wb2k&NfmXB`jHzgKR5XRF)cEKvBDM7dc;K$gs~QR)bO z2t6yDx&4r}>+NvOHSUFSQW8e zRvq2FGyeeU=AnOt`nH{LE>}s_7E5UsP_Jm}#D@7sdUAN{#yPLm4Hxz`@g1abwb%9w zI*en#sIRX+A^Z;4 zwCzITRnpQ-;aqv(ka9rJY=P(waa@kC@K3}CQ2zjlwv96709Fos{aMEu>n%$16y+NUa__+Z%|1nh!NY0It64!ngS}rCQsc zOHV3w@IKl-zaz)(d^(vBEbuG;00=WC?nfUfIsX9bRhfJss~fnU1}l)tCR2gOzti)t z)jbQt9tyv-`#gF#hAyO>v${*CqPsA`51|#YXYgOZ8qK6;Zvc2QZ!aNPw75y< zlfmoM_34mno9pmCepqR4eo3DONF-l9)G<-RGT?iAU=H+0;JH#JEE$n`J8;||v6n(m|V zMWl}#%2nOK-hcoOdk(}7nXf*yqd8pZNu{Z_wlFg+fWt8dYl1k(Z0DgT9DXLa&l_6# zws#96#c=HyjIWwPrcWb1bNsliMDY>6W{B|#!>KKfM+D;;!RS7f#CYFVmhR5xIOH1( zHuM82$j&kkCy&;$io3ASAo2CU7wU~EC0U#+E_fUO0O{Bgdh=dW@zTgo@JGZxbW^mJ z@kb)fxGo5hbHV-|zksho@e`Y?jJJ@HB8(W=lenI8e^0`=kBNb=z8v_D30wVbjNmH} z%HJW!9R^MZ(z~L%nqaDO;%UD$e6=!*xJ0mpa^P;y8_7Mh)1@r1D}w2kW5G~4BiMRX zcrLPuv}MZht0xerpNCQmo!s8i~W@EB9FnkSCw+^ zme-GN!<@pK*@6{3V+3+Kh%@qTkqA;qa#L(!Sm(Jt@lk1_TR3EUlt*@9w5y$` zrWlUkj{T}_N$0q;1pM&^22@e{nnH1G=y9jQ%wY_Ax=FnQhujmn;OW zApoeyAxEb;^{pvN(oEVfTb}XZ$*y&;321YodCjTm@yRR91ckW4C3DA5sI4i|>r9Sy zmN5(yMk8hzl?h$~xA_LJeh1GcrSS7cSmNE}#XYogM!8l+Vs^1ShXVlpD`j<$D&3>J zwrSMEu~P&`l5>-enCqJTLk{_=#rH_{BJPnkkYv)NwS+}&BF-2_u6JzXl?)HdRv~#5 zc?}!J@(uDGx;T_#5s~+g zr_&~>TR{XT?H(v^v!sji`P-gJ4@`m1IT-2ErBI%1Z>7r%6wYv)HWQozI~;S*S|zXy zzSXW4W{u=)H)Fk#(=6@Vr(y^-K-`@{9zAGG@e{E~8ALq*E7O78aZ_upZf6d@OxH05 zje#YIQhSlW>%sM=TU68@HJBp8YEN%GCc))mqY4@^5(WdE z#CC2nPhKl#-q84;PZQb_yMnXFBK*-hgU4TE`PLK}Nn@7jnq-npy}V8uLUX{$>Ny!0 z>yJv=(`;_-E~J*y(cl^88JH&W+zrI%EC=(V%H=j=>Rt}iE}rqAkSs95&$t!I_0RXR z4{uIun%1q>D@SJv?RQEttXr8&`d~?ql~dc>y5*q z1aYWwe&^(@T)))~Fe# zNLfUQo=TqUgV=FN2ZrF*U6%Id6&S*KC<%;XpeLpQ&M|#=d+i{X)Yy=R@`r#Gi_A|?vQiG)4gp9YAZl(%Tt}U(M^=bElmQO zh?Z1IBMmVbATk{D--^V#&}7t`GF%85fC=X=OoZ^GkJmWrJu7ZY?JoZSP*u_;yw$HD z&yvVKR6&9XVlX!R!x;CfI-aC$?u(+u9CHCPBS^wV&Tv>B{@w6;W|ff#J*mZeqA7=6 zj!RwZ<;UhA+P;91*!$O>d}q@S#4m(CBGRFO?p5Jw;lgEurWi089+>s#7_Q?|y?ssQ zZAN1`b|Df;7^vLbFpv01>J3Yw+Sx7RMFOnG@zy_^a-dSBdCwy`&QC&qm2@S`QZLNT zuCZwR!uW@wiF`7%EPE%kmnBLSWj!0|^!BVf5%$X@0Ogo+4@~;wxUWw5x8RTL4;c7^ zM3Eg9&gN@ojpQuxagpq~hA zXxA7l0LdeR=s(X&mMB*T4ZOF0`1bupIU)hr#ux%}6`LhbufG)8;yz$1R}2UvIsCmn z>vgGvGqt-vH4<3`IJ9*~6_I4l(raNpYu7YYLl%jY_a2sRwyJndwvM(}*RCLsormHrScP5{4 z_Nz(dMONJm*dAnMU2t#?axe%r!7S)wA>nf3nw3WpKKc6UC+ z{gr%8H;n!h>4_xF(`b^lk=-5{LJiUK4^pfSdvvc>mPe6dX3I7MmO;34!RkLTUoHN^ zJ}x#N6`M(yWRYw3l0j_~%2mAB^B^mp2`U^D*8l-uQy@<`#~T=o++Z;rdSjqI)%lKf zh5EK7rL)xiKPbh0YY!LKVHHKLA-BT;f;SSoRP`g@tyP^;Qe2SE8|5VDW_TwZ`gf~M zDVkD8&*We%c>wY3J$}>$Z)++EPpMY8j9~u&dcJ+O5?o6Dd60*4Mg|#n^MZRE1M6R7f58&8SgpTn zuOE1_aBXBEi`t*7Y^Hjz(VLu`pB9z`^wu_q5Y@XT#N%oL8aL_;T%aX(eLw z+m)2fF;EC4i2-@)4=3>Ex*cEP#k|&U_IYFyr`;t~qWg^dWO^Fpya#s~jIF6yrJVVg zT)H_UEr5T6gY$ML73x|I<)X^%1#%PXVAsIOCEEocsfl! z-BQwUrs8;Q#^4m9y8*_3iy0U_`0rU?6g&$l(qB-vRhC#EYqW}Yga-!=&;=aegYDA2 zV_4DchO1#6%4KD|5(Y*ey;VcI-_VS4kyAzC_)H8JbHysSl%ZnsDdU{<$9klZag$Q9 z@>Zv(OQy(RcF37oVk)GNxaTdNeE{~&dPnSo@it$E9~Er>0JJ4AS>LyjaLfwlCv0rY zI%J#^+#juHd_eFq@OOxAts#wkh}liJB$goZG5zkm{xyStZ{^r79z|%&DKHGM_xJYC zd}6hw?#WoHtJ*=M(!Xm@hKb;BigQV09Id5lvHhwS2n!LOha7h!pdTpouOe$)WPynh zw}M9BemJkF{9dX1ME=T_db-3V)%-q;()oEuV6U`>1cFs|qhtNN*UXP7y_h^v%GWW< zVwrbt!vWVF0s3^WJ2AuZROVYV*vWA|+Lt7ru_e;(MyCToH=1Njm1Y?uJRAYnJpmmn zB5fPXx^W`Nk^_j9uyQ&n$^5W>m2%w4VXC{Lt|v^dKt?$L`ef%Fja{5u>T0v8XhUUZ z1#+9X36Aa1{yf(LN3(OAvUXdd^COuL%Yb@=!3Xld?ONA*oM_%`vBxUyWJP5h0gg|n z2lJ}>ov!6cpmxU6ca92rWOpMUPH2wdB$1&!srio^w;XV)JM^MZY-&jx`VH8D-rnPE za5p?C=OAEv5ywi0#kNxDene-Ued<(sUCO=DC>4I?@hkje`h|WInKTiEYuD9<+BMY7Flo4v$ZOyojHgO-wRj^cdJ5O$Zm2rBU zX<@9(7ulFb0)_c}zc&YrgV1yJ;<~K{{{Z_pQ4cFF#v?Maf2{-#gRVL2>sCG@cyTZ7 z-bf>4k(jnN;E|3%9=*W)MNNd=&JC93U7E^km>97P=)X76`g5Krs}?rwVU1TP>JA1^ z-OsOouX-z9RAPTd62Mw;o1>M==l4@9g&F=V9tZ1+q2Z|k@dml}*8THJpDO|v8#!_8 zLV=Ul6|ZNa-m<$uwjs9#-70wsxjd3idV5uG3u+H<@doMjM)FciC0C3Mq1g`vp1|d~ z?~&_Wuvb4km7-tLqw9=+knss3uj03_6&Pf1g7~mecZn!K z!oKC`2RH+gdFPLMgGbQUQn|aH;t;m+I_!xK!y_Dq1dewPZZV$qY3&^g+#^8(yy(de z%;j)%_-6puWi1X`uI!6Y)vhesIWFLm29cU141`G87$kaR^O3->3HXa?{{Rbv_K)~~ z;Bq5-dnrz>s+X6BjX4Fo7Q%sya#(xUviPf3YqqtH>Q?gXgtJcJl|WO@%>ChjJMqPN zuk1T+ej$8C@u$RXYDi^^QMr9G&7}i!#SqTr#{dAJV}r>x^w>Bmba{^^a&xI?vFYCv z%WD24(Dc;vVKAtD(AO~k7p*^;a z20d%fdrv3Inqxd|G^T2?}KfLwjupk#e((`@wUt*zsbBy9311d;Q~Pu(8F z7|0cz<*C^OtXz{#T|(Sg>v2OXUW4W*+0>Q1-4H;A;!elh;r zz6bEMC}+|9CltEn>LhByBOVnOckwZi!8!D=YXIj!7{Bo*veuT%bE!%Dizr^^X!eZA z0$?sjKrzWZK(8tNf~|(7b@314M~H-~+QsWwTVc6tdvaWz=b&dK0y^U!mFPqFbnbIY z-<^(A{t7?i?%fGX%zaRcBTWNb? zx6?Fa7y6M0FC<~UNY|(&upD|1O8jd)Z#vDDHLM}I`=&vQj|}8|?@7!0N6??}Oi$TM z{uS55)$zxPqPex#JVtlhq>(S31(D?j{^j^%?X(`1^^8|>HM=U#vH&*ukCkj=s^hQe zS(*)$jcEn8t8lh5qNy=Pqc|A@Z)F`g1B_QiXW=^-oXg}19KV z6=aXgF_@=Tq^DKhP2BUV^tsc#d2-rymF?tGq*Kf+)6HgJ0)otV&m4ejt+Md-*06$2 zMkye0Hz<*S$;tc5zJU7kU1G!$aDV~nPsM8R@x9r|@snvJb9zsL#+@rP^DNtQ<^JVE z$DV%of30vI8gz>rYb&uOznbqHfw!@3xz1Yz6(3#?L0-FgAc`W*jt2uheXHiL+K(qdNBA5MWJD=g9@A3GdujG-Sc4=0?SIH{_g ztd8h4)b(qhi1xOc95(h=pJiY?poT!6Ssj4t0mpustG*c26J7A-oRLB;!opHmBf~6g zryM_AuNXbWThTri=#dz%Zza0bWb%w&WR10CQU*a$fO>W6E2Z%6m!j!0PQD+vw}b({ zRgHdT&q94_J)3*83D<;Hh{v&oF13dH4XmwpRKJ|i>_!A_+^z5EIj6sdH7RaP(OpMu z?S@rjzvny>Lh;k5TI(WI2t0*ommCaZ9C}p^C&W-+>Qh=;toe&SymjJCV>tQ}D@8?h zXEVf3TO)(<9+w`IJ*)VF_fVQOnFh(=A~s#yPG7MA=R8+`X`ou#!lF3ib%}8hBXNv- zG0CR*p2`dT9^wr~KRzpjDAALFCV1=Gnc?kj3!e_#PVz>DqX3UEHVW`YM^XsEs*Ds_ zH7ZJ^Qy+O^WKy;+!I&^%yRLg@x7W2tXTMIfjUi&VJ_vkh?{uI z7v&rbr>=4SdeYoOHOxC*(%sl#5%Y2M=~ZsT-=u@>@yR23$jV|F+`|JOU&o=W4PyJu zzGG>165#GJvzFP8q^SG9jzw$QctSYVKebJDb>)MREBvlW&R7no>smI}QQL78QKoqL zR1A+wQiEfSNWtA|aeACu<;Cb*9X#9=$VZlC5h)|@aoFde9jfh_)wG|mt>^ZAyUy+B z6;jcT0otdGG34i`71T(zOwi? zV{@n9LfYIaw#gDe%_O26VHb&M~T z4nS8qa6uy{oC^Bm;ctYs``E0m^^H?b4yYMrwTsSlL;L~czzNt5r1kcvQS(S2xfgTP z?HV19x?Ap8&Ku^+=cY63#VyZ>Y;2Xj)pu@%23bsik@$5rgq{=A?lm@(S9vawxDi0i z#x-Nkc7O*_j%#u)5*36*us{GimDLqW9>ffF8KNzoY?MQ z<9QjT%YS)0vbNh*AniB~N4sQ!?SYzo#pHT@(j@LwNQa^Op?N3rtX~l7aK(QNa6P*Y ziyJWRqk}r7I+OGS=($nQ)@ zRKx=k{{ZiEOKwszvLY~?U>=?5xU5%}{_A1#Z4T|Efbsw{*m0loYa3ee7PDz>=G)rA zAD8n=yvRt#N`t^3UVfF*x6N2SF^!i`#B#Eb!+|M`zIecFarp3Y%|%H`Jq;<^O)DI4 z?FFvN-W#`q5frgq6DbU><&*#(SaG;@1HF7rpGmCewA?OujZ9xQdq{ofrsggdIMiBUfZ-jD)TH%mwrr!C_s;K1m^^2 zfJo;Zs;Dce$1JZ@VS{pGmw;@pxWM(CEwTd_&E-*Ttp7r&Iha-D!5(wrj zSx50U0?|9FKqHO;%?!rl9P~x=)Q0SJWQd z+22}~Vye@iQ6a{7!94pMR^MvDO%d+y2)LE8465p?Hm>2wKVM#Jcy#JN3b@J7a%v=> zx-wNSz$AS;Q=(h}xRQEg(le<0%m?FDB-Y^bc0^icBOpelvOc4a)|%0fmCJ>Sjw|!0 z_LcEa@rUhCJT`RB1dQE2bRId9AH+`X~gKmN8Y)7Pv%=P zz>zWr+{{nPGt=^{g4_qC)^_Q&*MN5^dmTkp=?=1O**Vex0h_yy_(@ zbO0zrDe2#w;;QP_*8_jqO7cz)O5-E$JA9) z>sen8AewoVE+Rt;WMx-|9RVKxr>$;$M$+e+IS`jT{m`JD*~UW-oOkKPSMXkyBF=*7 z#Tz4ZKuOLx2k`xKMUkQCei`2~ZD7)@YFUv7IUd9L*2%Xi9vjVcKR$c?PCJv2%BpyG zN0?eGz(&ZA0~{&Oao>*qwa^_FSiVbx8f9`Bj&Q{AaysyTIyq4fbC&TApCN$BhLEyk zcJ|IcpVGVw;zg8}*K*AWkxVC$lH~L0o}^=-_phWpLjaoEMGX-lILmu{qz`;ohI~fw z?Y^(8k2-62KPXjJATAE#NgWMTVwh@pw~C~BqB02|_l>mf`=DbbkNgM@O?h3sMh#j- zlgyEWc}!JD?{a!)->rQE;(rZT6?lxLY=+*)bZl^=&5?+3dVomX$9|Z_ za*)~Ei8mIJ^5Z5b%Q7%L5uT(G(!J;4^tOwqMv?;Ht_wz)+B%ibP&178si_3jg-&hA z!-wHjyn*9OdzG8aO`zN{45SnHdJb1P{HnwJAz88ejZRFsb;ZD6m#G-XCph-zy=eHF z(&h4v<{29wyN@_xG1TL*{&kdf-8^3#g2qP!YR5kaqXhB?EI9sE$0}(Z9?|tY#y^A- zGku~NH6i8_+d``hXScY<2>h!`$KYl11ry4wWXRlG5;qwHjyC#!b=}x_^48)PFhgd_L2Vpf}X?htH+mK75F{jMe!!HqA^`o?@^rFS^2v`Fvqtp6}$0?zJ5jOw~|!%H2b9EZbZ_E`BXKRNd2%}P#ODJ! z;2sZ8!m8eQlTeBVBIT244Ed1q+2DXZxW{_s`kcF(`(%0diaaY}r=vzDCLmovU_m$- zAnqTK>CJg{=AUN;^l)y%#C*8EVTJ>qeNV6BUc2I5YWnVWXS$KN48}y>7=zCp@;Jfh zI#&d`Y$muQMth3%TRjTbN`?H`EtR8CWRq_MDCiV$y}kJBTrY#PYgly1ztQa^9Z)in&pj}H zmC~+_8^E4^oeQ%KoH1OeJhnmSsq0x)!%ABk(ythjYuDCs!3;|p#$+2xpO*(XCnK&w z2cCM@7jNQYV=9|>xkej;G;@%RgM+jK#~D9L-tjkvAc6vZ%F!AB0C>J!jl%(r*eAak z2Dvxz#lPC)iQ4kkR%{km`}iFQBLgQDF~Z2(>k+ZHFOD@IKYSPWe2^95xNu0%9r^8C zpN{?`YS7Ctvek743G&GAGwfrx<^W`s86V+W6L=-x%Uf+uXqF`h=7bV`d-mfVxvqc4 z-VoF+tfM0O%6A*Kd5Fj(xA&`>z4T%+skA4q6xUE}m2i{~*Sd6-G z@@MKzpY1jFnB^3uwd*Eu>KhWh*8mJLF(T%2UWD&AOsSMcOC0H#PHhPO2*D96AR`3@Zh_5cKq|6xE0TMUU+P^9k%Y`ToyvCagGO1!z6of zYti=2BbC#>tojea-w1qM-@c1Mvbaau2ib4Jkf7iY91M@fy6^Z_{wazO(D-`v%o}i6 z?h&vLUWcAN4_fix4EUnr#@v0L{_PnC;IYi?qaK^MIUklQqlebI&A^SWdIKv|yS$I}Z%&8f=nJec}CRG{C~Yx-FBQHh_8jY1TSUtbvnJ(X}X8 zk+B-Z*k}8=3z1xuUmZL_q*?iiuIlNy{LJoTC_p&l^BCh96=zEQr+iZtv7NQ~<&2qmBvRn?OuQ5tv2FMI5mc& z5QV-}`y_$3^Ojr;ao?II{ir-%q>GJy>F@wPV<_08s8FldJRe++YoGBa?H%I@T4^EH z?hKnq3K3O*;A{sNY5?sUt& zN5gv5b6Q;x_EUhZXD1)Kk_PK6S{y0Kp21rudmXYJn;y^vwX)O5J~ko>4T1)YOK%Q zu+qIKza!K?XB|o6zSb?Gat!e#pee@Ut$_LJ0N@koc(1B-8|d$D<8Lj5fdV*a@EGkF zIOqol*1ksloG;*i9?u2zL(6+Nljf7}GP3Op@6S)BYwE8KPM0>8QbQU@T}tga1cAm> zXO2Po*U0fTJtHIWt~sRRjcn;yJ-+Yk^B>FmqEF00_s2cIS{69|#7(r!isTU6c#w?e zuS|1;Rp%)Ld!!QEG^{+v$IFa$81Kia#Xj2UrH)6MRaS`$mB=B^a1J{99E$kX?tD8| zGt$kjZyejUQXou`{{VZ_4gCG;)!nL?3#d#f1%Mp!&N1JLu-2ylt1e&nY;lo{=Op@{ zUdEtHXI*-4Gij1Q5Rx|*10$&P{{Zz?kyh0O^s(x{vxUIbd;_XmeXi;;YkXKaATP`T zAot|AAB}d`a!+ECM+_@%@@j+_F%ad`oD;*pXc*!pqK(XBQl)&V<4XW zE7Gs5=8&1-be87TzyRgeLDb})dS~&k({kFL(+vmYdemLuicJ((cS>dR332kujDL5I zaKQGhDALBp;u&qxcZFXvQa)z%8&4o|MQ5E^H7H!dQRYSSAyxkXmWQDFV~|1gr{C*^ zU{sA-;f!B9NVt+W&q4g@tXk>zw-d)crEw&Y$aXiDK1Mx>Y-ew{=Zx0Bhx8_x zAWOfq%oK)X!$^g&cn7FBu z8d|@YU0Nl{W7y<%6*kEo{HX+icjUJ~=b<3>Ju4H#{vkSKUuL@!f%lcbBgOU7!+WkPzs~Kq!4j;nzG?Zb>^ZDu8B&AG5kdTla*#d1gO%CmbFsQykxCDqUTa za9S_~haEB39`#z~md--%RYPtnia9`fH>bWSE^aqVGt6AgAzYLM5s}Ep@Z+x@wJu4N zirSrp)uMo3>kNcvHIqbzRmhyBA6rA%R!v6GDcqaM{XmZwv+kuT9D z-1}6NZz}@W zke#eChR0qpTsMfkEvQR#Brweon$=mMAL^D>C+}|R4my5REe#^{v4bRIO}CDHR%W$B z#6mX&1}AYfyMgV#aR%X&{lj=HIo$ zpL}u%>yNEa)%?90=4rIhZsCU9Z?l$i#xc8&oZ~(E^UXw=qGvaA=UHiU?+^iZkl-gc zSbypA>ixMm}uqfxqt#1_#y#Hz2kC6CQg$}`VSM{a77{{T<8 zNZ>5MksKm0ccwT8J;=u%wUydq-1%Sj;PAb*m&IFMOHW)TyJlu#{62cN8yNe(;Q9*r zV^g&{FODu^KvFA{<|qW<0y+YEoc6E0KW%>s3!jD7`pZi<+BAE`^P_eB>!amyoOH=2 zKU(;U;(fA5dt-kBk(Mz6PInI6el_*keMeS`Z18a~Pf$L+#WBJ674Y(T~l^T;SuLKD9J50>E!T&By^s;}rR9Sln+#Er!U!&T@S}r2%V^ z>6y2>Lq6*>#i-|$gAfA(AbnXkSc z{>>2E=vtn?umsFpj`GJquzn4JOwpa6FgJu}UG!yKMmu7t4T___S4fO)YWIh|qd zz>$vs07Fz)GbO#&udl6IJG;B9m66P>Wt7Mya@&b^Cnbr=&r*8TC{d=HETr$oSg6SK zCWr(E1#2IhX*?}SuM0a!-g?Dl60Hg^rb#@&gw?V^6FK&=dW%F>w(8L8{0MH4jf}>*o+T3J-<)q zPKbS~G;64efJ(U!fE&I&Xg1~`;Y5wN?IVDoo`*fhJ-^1j8SZ_`(!^ePwz?;4jGT}V zZO1~{@1IJF-XW(;A_YYeIg&*=RR(p1(?zHtboojr`dePG(c*1s`;AjQjihSJVFhv5uoB!SDDc@9oR+ z7feG9_Lbp8@XeI1orY0sEW-o7TJ-uDXT3mR} z^4ih260pH$BeUC_afY^RV(D+DDbqjTmA@Py3o2ar&*JBYwDoiRa9Ua0T+6}g z+hcrt;PkJwp*~7;l)E1vh)#852=8;oQsCLoh(m9QwuM#)M_O6O=4r*~u8VxG#1d@LgOcZVFk=G-wRi480&B9pTY*MlU zVQgohZl8d~9LB2lvC)3c8f~A$-wylbEC)WweY+he630>7GLq-*tLjoH~p*(N7h<+!Lt8WZMz*DJOOt8@R~l zt#lu?u9Chx_$#9Li%qmvlHTFG`GiM%W-d2w#t?v4X&qE|#c5V9y(@J?z|~k>P4-Vl ze1GCZc2RSth5^BCi_SCDXDpXHg361ya;G6jQ^DwY@9I5k%7jm1O#I_3=gM0M>)-B={_QOBaYfa+hcNKj~wGT!N*Qd z=~soz85!bsa)ae*7pe63{*`>L#9rpHnoC=cHb;~+pD4-!k<@#2$@Z?}!P?w*?&)yg z2|0HF0G&Q!J^FFdxlJZTywOU|49OA&bwW8g`@=o4{HW5Wjz}asRe~HeU}am6yboT4 z9&0A9QfA+X;cIPNPV=NuyX{b+esX#o4yWAlisgK9q@|(XJx7bR3pe10ODO8=v9_x4ku{!fhEkAXl(^ zX@rWwF(1o^9ep@G#%r;%F={$$iDGIu|6zu}@aOPk2#xY4bpScY*Vo0G5cXQfAT z@#ag7T0KVZL$$)Iq>%lkm^e5Aha3Zrho%K^(P4_LE*ulcKQ?3m$k4*5&TgKA0)5#UiWZc6X?j5nmJ?g`L)V5!0 z-GAXbrepH5M|PP!?#|=i#PHN^ctYH(0drlrm}Bo}(K?w-+T@6;DuEIV^d{91?3o;aA1a4}38A z1!LhIFH62%Qr6w#mO_9;^0_8PQ`nG5U#B(0T>RV+b|ZOX9FR{vKArvPWpE_<#AZ10 zxrAinw^7!+zONM(6m$DlozGbKb^AehW5Jfnnyfm!L`X^U;SQv*zzx`T1HUKhT||Gi z--U(4e`!a4RRK}D&D&z2+_|L+B z3qNFC8^Zn&@g|k4-r4EVB)?;C-aO2vS(vUfmy_i<&*5J;2!u>Fg~0(>l;Dn|@afNd zQEO#wWWd|7Ld2HZF|?je26*SaX;Td64phmdicp_3Mgw>POS2`!GX%T8pUgor;Tfbj zEX~F_C-twpKV`29ct`efgGtk@JVBtzEb%$iFP8c*^vj3jpc%@l5wsG0tK%m~<%O1F z(x}Nezz4A(PW4iM2-)1i%QO&!Cn2@wXC1&E^XU9@hYF|Uy(z>76{)ZtSZQd z1jV(v{vnQp9Q5monlA=g+boS`=PB8-oi3$7pztz740q4gyW@~lhuSe&ib)9KaEChAbt^iItf*&A*fuBQH;MDvr~PDo#N}`VWdeXmm_Qh;Z*a-uWI;r z_LlKm&vsCmb}}>`OON$x&78JIeSjU$CcJXf#a<|}RuK5B#YEf;Fnv;KREF!rG2`;& zQ#CzzQPl_<<@M#`A{6r;W@1#F}Hk!`X zWZfc!^Gui|aoey2el_)%!;LdgnJjNKxnQ$|C?W(nN!7XlNc+SL?d@L$+xU}L(yiix z$5*|KLc!4nFr;y~W1;U`+GofA0Ezkv2((WcUqY(D6%a(@rvw%mW6#pEo<~``^g32; zMaP$^`cBp;N|#kst`)d06Cwv3THm z)TtKZyC*-Td|7Az00m3&DmpFS!+kvo3{U({N*2eUG4anBIQFdzU-&BB!yz*KJh&(^ z^De6x2aZ6>^UiVfrTv>-eUUoQdo%2iyGInp>(e#zEw}s?j@(2)wSF3SmM6~ABEGkf zdS{Y2=C48j00ms|>PW*<@K20m1NhU(k}>mb#zTTVc^xS{1$FibRbslIRZ62AWK}&| zM~_#qnhS(NC5@v5jNlQ9`LZwgD#wEjznOL6j~PSrV1sKLaq0@W$@c1M>VLsiJ{TB* zp4-Lnxlq9$NMK1lK#)_xahk!fd8*5Urt*$XYl+g+|ovV52+ zou@cC80lX${8#Z0*lyC(NQNIS+>$(^5f!n30^>OVFJ6MZH^d*e2Z20E9;<2L`@a#} zM|n5et&3@{2h6{`R`w_OPfoSro-^^5jpH3+X0o}xw6c)-sJ>a;?0E#1`V8agSw{m_ z58-E|u~3v%K_8N)Y>u&i)V7I z%@B>$A}JXIo=0B%=Dtn%Bk}(Lz@8G(<9{6M*7kSNHt0dJl$FTjh5+%E!5w+ediVPu z+soj@)~f#i@Sk{oF)u6&vU84ljQ%wb3sK7atj?|?Jho2fr&%TBnxizZJW(PQ4ANz} z^cA9wFP;DcU|w_Acd_*AUUO^vUwkOLi3Oj;UkH$S{{WDrV4to|YWn`uUk+uIBz`^c zrqNq zQ)%6{6#+^1&PeGfv+|h6F_kxF;aFEN$AStA)t`6*&ivfBjXW!v>?cVym2vm>ugW zQyg8H^RLI>2-w&i+AL7oo2K)oDHr-kBRrIIf(GVn4(E=w^AFk`JV_ecPd(X|U4(4L z@D2&}P6z8>N&eAOOBJ2Tvyx50n%opzmIH6f*z3+n9r5Zb=Y0>uYbT7Nhf$i{l4-C? z<}7C(@6RV8Ji+THDQ=`Vp+M)c|NTfC2NYMEIiB0$TH+guzLJas)d=DvWm zlwDfn3=W+!$81-Md>PQ;(=^L?U^gSsr%3mti|yW*Jnh@cI~=kFZ)bo}dLC<-2Ma(fC#j5O%j49n9akPlo{ zf-}~%g(S{NO}h~J4g4iW52k5W+^UdWh$rcfrAtL?$W7SCh&thbIrXGSN-i^yI&spZ z9MbJHxh@wxi}u;^zM1g<0QPM09R4h663Y1_)0jqu+5GtyJ)jRzO?-Q%>0by%yf&I< zqvE{|+88ihot&u{3W}@`8+rUI+rQwc{wg2viTFFh;1V^BSM9Tnz$+!X z%4_B2(V&@M?NOI=g&?uZdUNT;apGz?O39wK1{Z^D^fTc<0Qoz7HSrxG2nmTVEzrD& z&}0HhIXwDQ^L#GT^=&#Y_(FVnpR%tK;tgc-F~T;Q?+SRfITgR*9=~)}!!&avZanoF&*NO@#C!YgI_RVtwy_ZVzo~I!GHd~TN1mNX!)S9oZqfe{I_TLZqAI3M!`;QFj=HYnTlyV0d zAm^d??^`#16Y(CO81sBF;v@lxDlK;y{f-I8dgS~s;~x{03m=H}XvWeoT!7jB_V4m5 zqL1Qljcu3+JX5L_+rV#`M@#~7lk_}QEL>Z$4ud)GAGW7w46)6l_=?bxwb|^L5QK1g zXZ$+X&wmkhiR08Jju`JzcQHBBpE5Q^eq+-F1Nrr@fB22@yT;l5jo21r*z7%*~!^R#d zx&Hu!h6(O0t!;OCd6E)boEFaqj-%f-m*f8c4Cy*PzGKoYcOKrqg)+|G8E#_=*T;Ap_RLkiag*EY zTw;7wx0ZPt{z)e+tHr#DM%LJ-G7;VFD zdUQNhp9%b3)8V&_O)4ynj0qTlAt2KDD}jAz6#bL`6KvzzPE7u+Pk+2arEr zwVQ`7#JY{@aqxb~`W>T*bl({Gq-?{;CbYLP;C~L#GD+j`#ct?-1EKKyg9nJ`oVN&O zv|NVlM#3-$rEJOZ4hgO{-?U0ZgKDWCdl~#rHk|Ya-jXjG+qV6|1a1io&6dGEPCA_b z07FpK)qzxLl_mIa(A!CIsQ7_aD3G(F+T#Npg*oq7{ua_>@n40f)Zo9gwX;bXcFhYj zjlK9ieL$^^XT`dC(=R^RF7)zW%zSP?boI#OXT5r_{1VIH?w{ii2I$@(@vJttx;}`9 zQ7}&qA$bgpW8OcBK>6D}cBtrUN?2u8>J@QLnz>itkNgv};FV0zi80ao4SXR9^~yDr#RBymz4Lkxev$eL-!O1xzaKh27b4{5wM7co-tTDSzO) zKeKOz{w03iemB(aba`~Ey-w!VL#rY(3%QogH6_RxknCJw5`JEWy$(oWQOky@JY1S* z2Eaqf7p)_>Wb!rnB|KW7gITKs0yuXJsC3sv7~sPT63 zR_3H-@dgCPm^sYSvAAN$}*KX)iM!mlH2Bfe<;|t+qg| zoM0OL2Gq5iZ;YA+&Yj};<2vh=y|bI7k;*bQvvevzu2cdL4 z(D>!O zNf&>a8lA*QFid~`ypjGzaeuY;m1S%2(#7PL%ecGL?Jc3o63kjujNtnd$f&iRr780q zhMDjK#2y;3id%_%Hqf@&hTFLsU915C#?ga<2|bS(HK%Rx{{U8o+vk$PWWzSWC*2)- z;B(ZI-o2B>x=p>6#Bhlte7FM_(L}1o)`|~XP?B^o=>bml1Ume$|D~)2M~<$l6vIv?_0u(k(8^nSxGMj=iO@9 z#y)eruo>Izr`OkttF2sWm)l<3O_f<=VnC61@<0KB_sI0cS5Fi{aV$hU8;;o&#@I#c z$v(t%H8g%9vtmq>tYTR{ey%rm40{3V)0(MJT?vjRNartp8Tf-*xC?8b%O>18@?BX* zPZ&G9^Hwc?XFnclCl>w*@eGkNe7g)dVtME!$m6DKx$s802iug`yE4fx!i1G&Bb;Ng z>T-DPUf1D&5XT*m24sojJHB^2N$3et&U4s(Yd>b=p1bT~KSlrqoNyv&vO!={nps5)L@UP4b0>GPy&C0gd1Q|->w>UKI?w_J?ZC-j6 zY4ra9GxQ(9T9vN9;SDb8C}J%wj4~3FjnSz=fuCMF<29>i4UAXrEo8Qg%NUL0`$=}d z&PW9Mk&#h;$)6DPqx(L1Ml0V6*lIVreS+Ibb0VybJdu(aj~T{4i10;viu_5_B2`&@ zC8i)?8DGm#6ONrSext2;)ujl{s~<0kqbOCJeA(s~))uP|n3rq1Kp8{aaCyMN&mB4g zRPOZHWg;o>04`N_$8epQr@dyU0}e?heDkhow)m4}>MF&R50FSX?g8NT&o!H*_%%h& zV$~TR0yZ)gGHpF@dJg{ppKA867JOo}hF~M`r-#Xfm>~n^=a9n-h40s`b6Ri5D6BOC zBJlo{fTXj z;R%`v;@_-BjzIxS#x{_1xO1N0cDtVq{C2aEqc@%s&_Xczc8nvEGsp{{Y;>-TJ}&7K z?r3}yqB#q>2ndbG9X8{DNaLEqRbpzPD;`H5!>Q%6Pa|70mfa@SMQo68PDfIC$9mTP z0EJ?$6T;fH&?w}2ffFn`>?`~ysL1PHk9YB7Lbr^O;N2u-1~~|<6buZ2Ffp8Db54)q z-hm~oabEZ{Oo)Upi1D;9B;ezb-y9QAs-`|k9&JCut65}+?3c3%Wo^wG!Pbo$Wp~8tSdrOy$oDPU zt7=|8@NS_2Gx#njS%^jkMPf?x&QCv4T1IiXJd$UI_^;uuhM4laDRC#5ptBiwd1QCU z;Dh<`isUBntTRmmG;FcUDwCX&2XF^r?e1&ZJb&U}1YE?%9}C<-*E_=`Q?M?*ixAl0 zj=i&9btbvsw7&DAwA6znZ5U*o$U;cV`V4dj89di@DMh0RCYnAu@x6!qBmOhh?NvZX zH7Vmvt^%oYMh1Fy1J<*mAfpHxB2_w$FmqjZ$4IQ3;}?j3;T!u%v1_o_;%~j>7?gld z`^AXwgItiaR&l#%?ofaRM?in2bXgy^Wwm{#5|i>rSMV9k9~AVoc3^Kj%UHl~o<}NN z0(}nC`B>11k@QV>=n97>TzG1#Y7qm<;lJSI0jK?^j0nfuv76sWILvDq|pq$Qy{{ zV>!sjL0@9{B3Ul9>7z-RmIo@ufepyZ7SB&l#=dWfBApb``JW%twjwj`Zr(JDB1Xa! z5Fn;OVgcabXQq48Ed*D3VoA2#yfW=J+C4h(Ohtz;`~s;Z_KHmS(z7yo>XkeBnUA z+1QUtXh%i+I9?{7@xEe0LH(g&GzDa0u{m5g&!NtKzlD2k#-sL_7EK;sw80Q1SOXkG zo=DH$UcA@NJ_fpbABnm>%*9eQpI~fdWl}MLp1*kWp4hKwmAMNvVaYyHs~m3x^!j)F zEA$M8uQnA&vFc%^%><22LKlkeO+lhXhFmZT!P^+lNF5aQC%0OzXIW%P*chad3zhyP zJ1&?fB;^E9AoKBM|+bTQm~Px-fi$mIOtT9+zkCI*ly=R zYfXtH)f^VKG1@46NZ>wC18=WAMMrfU*7xl!uMOP95r~)q$Ga2TpH9_MP?k3-72!tm z%9V4=0zqtN>D*P7xsDfGt2DZiq?7k$hR`xO!Rk*Wel*jzpiQSd#~Wlx<_>cbCh)~^ zj(X$XtlVnBu4IsiBDot(k`2J1&T>yrQ(1p&aIBW!X0{E$20|Ph;kPjCNAV6ZU2TP( ztU?ZyUscNyoJ z((u-#HMv?TSId?q-pY9aLEx|T_v_ZNu5RruHO8A?iG(vU%3pE$It;k#2R#i<_F0== zifuCH60LE9z2x4SDS3f!w#*<%&W%EOswkWOwu;mKJyr zTr@0_1^Ile2oCNramdIR&0W&Moz`l(Y z+zgdm1jdQQ9@snX`9PgAC0O=>z;(3w5P+mhMQ&PX;#~B9Eid+iPJdUj`%012DPs|Ci56B zBe}J;iZ$~cS9FR!$z#bF;;{8k6@85aS9g%T%8};Cu(LWMkClsK8_JW%Y*ub1sT|kD z&kp|p!hP`L#2OBzV(oExWh@d*oJgAiVimiPM;}rv^MA*74XJogf+UUN0%E&B+Q8s} z-ydF;`eARXTVHsdD0DTt)4&og9nbngo=GdwN$Nhe@Sn&300Y0n{{V~LDADdWCAgWL z7m@NvySYAxaXIf^?ol^q26@?pZqrAT_-=1ENKZ2uG3_UgJ$N676q>f5C9^1y{NH$W z$j@K?y=Q0<{e`aWC0{MmAmHVQ&j237-`H14cWRoRlC3k6(T$%d+qWF`?lIriz2tdP zIV+oXL7q9t9=vhZrC30` ze>~RKBIQ9FM-u`HoN@<0=Qye1xRDeECuqO{h6v}s_|%_g^3_X?tGI9vBahaS233)R zryFtiPEWRJ3?;aEBWWet7`6ro=jrS{Ju2pmOC!N67AV;V9EAfp&rXLGRpS8^ebNRP zIO*R5`cb8`TiztH1GF~M3GPoMdW?PosXHPb=Eb@DGca-r#zr#O9@+fOMSBVaOhyS( zNe8JOhy3=dS1TBpGXg@5?0SL+e0@994XU;hMqAV#McWRIT5J&im!YF)2|}4 z{A;G)XdWg0&GAi@?v<%qtZderg^adW5ysdm%@nGxRE%M0X|g(NSOqZd;T1IVwlQ_aL*VF?-xBNZLY@+%RBWs*OT zXCw{=KRRh&a&~2FZPvF;%p+$loVT#*2jlqluV?*={AivT_^dSB=P3_}?S9N3fTCEp zO%NI9sg!;-;(_xtqCx_e^1v(49Ovm;-XGT{@ZPIssM+Nv(@M*2L_pG zd^|&->H4H>vPF4q4a)f~gpC|-3VlH6L8pi#kgp@jZ=Y^*TPLXX{+0PPNH|Hw^gmUE z)kvu>q<0Vq=W@hEuaFD!cV`15Jd^yW+$FbhHdH^zeNH*R&(}Gj)n45B-dm^M4UfD5 z;Ah&N%2}3KCyFST?H*|)^y)w?)EPvW^6qX$j5g>`T)DQN2OU)N zUsI4lxXMS&=K%FU3cs_pSV!i5On7_5PzCJ>-uz(C_N$pLI(7rj<0Cl5 zeE}Ydx)1yli{XEeq1VNq5H+oOc^`6_yojZ=j2!SlEC6B0$~if&owO@CJSX6bXcQ}^ zm8C3EkiR^>TsuK6z{$pNeQWMNjvoz%n zT=8E)im0h!r+%k{gr@6bAd)^b)?+pr+|ofU#1Y(uRUwLk*yXwDkT}N%qqWp-E$#>x zQ)W_0k~Z4mhd@Z_o_QGjYp3zWj5n5XT`-T#z+;yV%rHjKIvf##2jN`yjcMeu3mSd> zqdxrMvDEj?eAPLrtDjF=9?jXB{ulAh`WvUSy10gECk2FH0PPxWQVGsT8TyRmX0>hp zCuSzhSzU9GtfaOO|-pE?c2N}o=d&N-`ccpzR~ zMs4FEw(JP&#^dV0-ag)b0&OI) zIUdjY4Ae;IgSs~DekN+kDDrg~l*5@7-a#NB@<_-$=lYBa^gn~XByWno9`O%_yiaj& zJo>G^A_W9NT%F=VdC3ei550K3u7`OW18Pewc_gCx4h}uJ1P`rgcq_zG_&3LvcTil2 zrncfnDtx(ODm=u<`^~hIk=#|#lZ^E;#KWEsx#m7G@YJ3k@h+{WUt0N1Z8<3toU*86 z@{)6tkl7Ul=9O=#cy-n%NX}80C|SPl2nsk{92}hRE8Kr=?*d0}uGsjqKq>Z3SvNZX zBM{5Tl;m&}fQ`GpPaIc?T0{sfW%s27FnG`J0Rz*mabjcas%f)5?7I{7nhN`^&Ixq% z(KXb2^n}29+QT5P1+nYcpVGQ*Pr|VMo&Yk4<6Q5S-}f9Hr<2a*?0wH%3Xf@Xvc?99sYPk6F7guI zM>fTXCu?(qw;YV|pKR9E+>+Sb36!g&{H_TA5&hyi_2cM8W_YhhHW%{C7;h%wgJW?e z4tgI$!Twddr(4CU>5H_d+HxV<8!XH@EJ^8}C~Yy^hf%PHP_%gwQ(V{7Ri71>vSR;fxNI{27kG?->!W)r`Ssp+JB{&XSPuz4gUb@ z&Uh(~0qLC5TG_>^SxIYlve`69c9ITY#{q|KGyWA@OVsDHyJ&So8{8w1CW$a4TwrAS z@yE3`v<9qp@ZLdvY_jT7CjcvBoHjd!95Eb|(9vA|h5OqhEECMTPB%mI7xW|$K^Vt9 zx=~#1GLv18*{Gv+#tdpRmQX=LN3J{L^QM^0N<(c>ha_k5BOcz~wPa{FXoRh#<@V?T&)b~}MPVpK?tT+yKvm<9Vz|yp8;(k!Z}6u1DkpCxP?iMb zW1nJA(x!brbY*|D&A0FW0I6-=ImUbYP}XwCAQP)25s$cc4{|ZUtr0Rzg|HBe5UN8Q z{pIhp{{W3Fj>VKZkV6r>c?Um-V@_*-E+fHB!v&GP@bvWm049|c+yOF;tbdER^r~7D z&_S6(Ffp)Ef;Q)NbKAG2Ezrv=$&eHk&g|nj$)KX+_ez`O$IJ!>@A1c_1v0A8d1V_a z3m&ANi~j)Esu2vfGXDT-#WZ&=zFHCFjzcf6q0gzQV?q<|mCqw1B!k+M%QDK@`L~`( zZd)AzJ-Gf=FpbzNo#Y%a4F3QwJpk^1r314Ic58q{GHw|P*ccyE^zBIdV`5l03c&oE zah{kXudN$42WVBcIoe4)jCLc^mt#jDF&yr|=lH&upv|Trj6sG)UC+rp5re_}d8r^) z5pK8Juw@3`=ifZ%+LR548#fME@xk>UPw=FPN0{YE2M1^a05=?fe-F;DbO5L@OC6zp zP530AWBAjMgBt8z&Abc->OIG|W8Rdm9Rh~VLC<08J@L&s;|PSn;OzqiTY!IuKb=cf zEPR`!iamz_DL;H*k~*Azo}DRKvx0?u&47YIJ4d)+alZUNdt$sjl+lh>RAKP>yu5SC^t zK0%GFHzNc79mu3mN};&lqi;hznmRF6&^Ogf|E!!U4cK6LXcp6ez10KVJ zhw26~^gPpH8|6EcWky)B#z6J-$fkU#=XiB2axi+1y!&U7`A{-dW{P4ZC*{Wlx{TnQ z^~E`%^5x;mmCGs)au4$0{E4SC}9?!(0jz%v9YslXp9 zfsTZB{!|QbR+2p1%)5!kbAidmGJcf5D!U|Z4^y?iQ~v;cdYWyrn4MbWZw=MD79EO@ zYB!k`UfESqa&mG*dVM?p07?LmM8!PKsfEM0IVZ3L_c)|Hs-Phii69e#2B0X1JkZgq zBl!TcC(Klw?I(`C_~>YetdOV!2=GOe?cW*34|+LJdr5U<7Z%V+r+Str0l~rD`1)p=x-G0%07q>KupsWh zZReml>^*&ILh8_`n4^4X*=^vC#D0I$m4FI>;5qq&XC#x(Gx%{!k#--oXs&!Sr?}rG zyg(KG;J_zo9OU-~t3%+;CsnWl3p-3CqySJMD!dVs)O73htxT-3pS3BGK-zalkqIuOTfraMV?c;b;HPd*IycsiNcInFF6Knv4K#V3t$H^}*ecfBki0KLrSt3g7DuFdRSjt-#p5xZl?RbnlZ} zLKK~1Xu|C$AZI5W{oMZmT0^(@MK(r(NbAdFe=1(e9f$4ax|z0`b@Xf`(mX}ti(p+e7tF}lP z1QVa~3CA6(KB-OgMSX6kbEAXyf%v~`xov(Y>$3#lERkECx$X&!mi76wj+K5t+LPlN z7ghL!e<4z!d6rhVBN*oqb+AXcROjCO4YJ{YD!(q=A5Nb2 zl(1BK#HEa?bXvE^zldHS)68Bc@jSPtTnQcRq7HfFU?>3Rr?zV*+s3-Cn|=13D(2ZI zB$2)?+q2o1r>W2Q)j4hUGWi>k!5g#R(4Sgs?n3CQ3$Z70T#|c?_WF9#S#=9rl@cQG;6 zMe$Ehh_(L!hWs6TM>!Hr7UAjuCxKQW{{Vubd_;v;?LG(atm}=%#-TiWv(5n8dF@^* zh@M-!Vmurk<+0Qc=fyaayXGf!V<3Ukp2z9hm-bZ!vJbD!_o#p1sh%#0AMKwFwAsqz z=C;;b3z5;4q6a@r)!TpgDz2>Vrf-H*l=Am5k62Pc&p=FLHS?fdfC$_uX8DeI@5!f4 z6iYGl9g3<3Y;p%*lzaD~<&URv|y?oGAZzz1vly>Sk;GdwUG^$Fb_XWrtfwdI$C(wV5 zXZ@2$pw?kNsO-OK&yH#PPy9{LwcS3)TJZgbiKfYI6jug09#@gWJMB_NFsi*l^sXq_ zmy~&zw^$LdZK|WpJZ;;@N<6+o{K}((Li7H8s$Hjf5vF#1;(GlKeNACkAj8#nX4Lb_ zw3jSagC4~$7&BeY93Pzgm?IrW9^GmYVDYY7P`rNNym6eLKrz$Y_o-x!M5+sd(ynv2 z^FM*4Z{6oC#~^SQ?vDKZd)6<8@W)Ee>vkix(xf*#q`sF5PY8-h80dS0k&;bU)O5)t zf>pJ;9q!zvB!>H75VR~cBy%MshNg5`6LaB)v`HszaO-7xu^9Ot0=R&RzVJL(_n z6i5|sWqhtjT!Fi{zCWc=@K3`(6={qlzSDJ^7X)M#Nl};T z8@76S*RrV*25`ke`CDsecemG{#-$GHBYf@=M?T+|_2P+e#SZMH#MN8YDCTr+9{DZ7 zzI*5y4nA~71pDCs0QIY0OFO1sbr+5>eqykLmdDM&JmdOSkIgf}YndN2FU+o!@w_4mr7%v5K%kqGFdUmhWvEt24;jV9PFmr|>PUFz_$>xXgRpv^( z>(mqG#EsWI$l!f`mC;KmjSq#Km2;zj9XgLRIHm={jos`I~6{h40o^C$vi^yGYKNFmw8lR)-armbU0e8bAN9%!_3k& z84-{vQ>Q>e9d3Ynk*PpY$?5E-13V3GoX0zoB-9(lWn`9s?a5fG{%At#U;ELqW?Bnpd#{Fm0 zJ|FmU-dlMVL@167aw!b508Sg`8RS=2C9HQ>vt2w9p}8ApF^#Jy0AS;<01j(RGCoD{ zhk`Bo4t|wXaQ?v0lzli?;x6pH6M0`;Fg8m%*T-P-HOU3uTJhs$y zxJ8^VW2huZ@T(Tu>$m3Q{eL=#O#OlU4W&3uE5#l?AZ`H9HM=rrhTHOe+#ZMWuR6X0 za&4q^LolY2xyNb#Fq}p5TnU7)y@_6S_FgzDKb?5j?T_PIjYm@OEvDlnXJ4|70~R5O zxQ&ZrI8q1eUsy%^CFpQPEOuTh@gk6ZUp5FfwyY(1*ghPvJ3%Ts5%m?$^6I@2(Hz2(>Ot|JUz*=u%r4Cd3x|HY zh#cqF8S7qss(8`tqnuB4{{SH*?m*4d1ZNx`E8l!s`#DGAo5q#=Su|3d62IB% z#|I#g3BWk#rE>a*>|G_{X%CN~%Y2(>(L-$mj!HNOueC?^eO|`D+BA2$@?XTS5nNnH zERn36)k`QZmfjBlu)z!49eJ-M*ERc?Z&d0*(nyFXzF{enH*L?Ls(H^{{RGz@h+os8q?yhf`n3K9LeF^o>v** zneiFVvt(BA!c|LSIb&%*w0wlVHJu}tK_Fp*s~BFJk5%oSxIL;!{CRXBaSV>izcZ^j z^8xFCeSNFx+n@L&ca3FM7M~OR2C7HP=IJ*$Tn-d3o6dRXKZQXr{1N-&Oo;|QAp9`8 zKnoOQxQOQ*VTe1vZh8&|J?j3gQ?Z}cY4<*Ju=s&{Yj+b(aLlhFyJk2Y&G;B>u;EC+$Mvq3U-%>c0L2(2X0Y)m!wZ0;Zr9WrMwBkR!{~$ZuujT-n~G6&fYkJ-I5;;Ih3C;h_2#)m)i~Z zdk*=pHl|xSOPa?HYnfr*Dx;+|;@!_Clfl<_O(ctTXv-Pe8)G2PP5?c7^Xp4{;Tz<& z&zoZHB9$TCfc88C_zv~zr{GVHEn{J;ctcT$M~%^on4BOd9DvQ(0)AD--mt}c&|igRs1F5)$+k1TTFCf zGoDU3>QAmKeqRgthC3L?_7{kwhvs5_#V%d?6Ob{t9sR2cnPi*M8q>@nZCS!hP-Ui; zbpb)chD?U-l0TP9g&xt_4YcTsGXlm|03jVg9eR5D*LK=Qt8H$nbESBLbFp7COGa$^ z6;KF2UbL3_RmAZVHHGj;+$DLm*)rVxyNOOn{CKQhTTyCn9Bn@56&w)Gs4Z@7%Pw-P z;YmGDUc#l8%Qordd2S1BM@AR~jNpUR5I+j-?!sK4Y4pRrvWizvcU8w21TJ!U;MGfu zJ8vn{dmDBE3V|d=1VbEUkfEwA={mVn-4c1A<3=pzse<-n^4tk4E#F zTgf3+n{W~<;5T+4=YlXe?d@H3u+<~FFrFft*`GIjXtI*i;$8CWc!kVSOreisk&mF* zKRV?nvU`X`uDKu_=YXgD_xvl+ziH|8eIvzMT((#GWwTvc6n`@46)dD20$b(#+4UXz z*9~Q^Xw3tCqfyeyf4mLSg*fMfob~+cwNhzpeyx$_G-rc?=T}Hw4rS9dOKFFcq6w6) z}no*%e9pz4%`uvP6!=GJR11M8?8PVo#Vf;D-g($u2UK60XfGx z`~`i5@S|0?y7Jl^s2)qpRP#2z?2@WRaqW}G0~O+D^c=9yL*%&baIB#yv#gOC>JqZX z)43zdJFrxLv^}^!rl7c)qNu^TnwTx$PbtlyN@M^)e zHt+^T4B&$!8ACLK9B1(F_*8-wdDZPiQ6>kKy@p5Bp5K)dmO}4q_J1x=1MOhMb|>@X zA8beRv+ue$6OqNkMqrH+IV&w%gB$5jLRjs z^AboH$F+M6!=`in4Q(}&+)QP)d83T5-r)5;a7TKcIG=2&mm8S<^&|aZ1E4*Duc1-Y z>r*k}x3kjHPxwc)-yvgA8QyTsCVGq>ht%|?v(q8eEbcBZcgXSyFq?5>5B zJvly|DvidTw^7NpBa%QH1&LK-+i@Ma=M@emDO|{s=vrR+R<5LKNPf{J!3_K!WL77) zrZ6#8v~^uSQb)0Qgi9%4p$tgqK^@7+Jo;3vr%hxCFk9k6u`zryr~5(rf%N0otuK`& z^~*rpCRkXfnb0r;u<49($MvPkQXM9*Bv)nh$yzWtCOk5{XYPZMjIIgCZ+eFI2(<(! zRJ;?pR!^Vj7|t-DU}6yz+?GSgfC??tZtG@z;J|PIQyp^vyar%TTPN6 ztt+^BKp9MLZv77<{{XL7Q%_4&d2eC5jz=YfXB)Hndt_4OF6TCG-pb}?vAJfpakgx} z(2P%29-M9C@uikIHo{aZjqLJm1RH3{>R9kjdE+&5?@3v$!Ih%7a@bFh;FHeMI-Gy? z>W#*aBti)ud2d;x+WU#y)BRpLU|^A-=SiyyJI=N+EKU#+L5!E}+odT}0tR24zGX=Odv!^*nP}o+(?M8d&X~-B>y4 zyZ1+tkfd|G06t!w>$AVGjyT2?B;+>f447WuFA70&89KbagVvS6%)d9d^40rO>h zAMmJ>v2kY_1X{MbvAw0l>aeo1B7EDFMsc-?q+^E~VqU4N>jow>MC=q>Ui} zypWOuKc++DX#VbN>Rer}sT5ymo_W=nMlcna4nWQ@Mh;FppIYi?mrhH{*#nZCLK2Sq9(XIL6R_ z1OEVhdsfDi6F!@8xOY&y!-e5U;~wAF8LNL5Gpf55SC>xM0FW}SNC!Pf)OB3`bg}8~9I@LgAHD|!bJHEq zPo*meuF*M=Gyeb!{p0s>^z`pd1=OFBM&%#_(1G9E*0fEd#;9ZgTX#(G27OPhMwTr$ zOxsJ8JPu0wjMGW5Y`qA1* z^c`X?PVVflC(9d_GCDGrRLY(XF<)kX!E=A$uR0&?{{SzA{0rdU3wU1YF9GU@QMmDC zv{IM5o9y#jn^;4}KXZx8H_S%(z#TF_JMJ%T^w=|}xrv5D73+^dkH_gyUI{LqAr9t_ zZS-E@D>9|ulImoEnOZg4RGy#HrxgOsUP2chZrtHBjlH?_tLEL( zG>>);SsQ5^yW{ETez~SLobtZr*_;x@{Gqe_Aax&FrKy`}p&V!>CNv+sU`fx)fDXHR zp1+kS-eP#k42Ax12n2d}s}k5b*a6znk`;LYy?`BfH1ndmoD&->61W_IaoqkjPRtYR zeLedkc&GjnABED{ToRW$41zXT+j2(}_+DVn7)-9UOUBfC46vjq-k{DyYMSU|Zxffni?M?Cj01(3?btBu8 z)K}(t<`3%li9U?|J0!)r_*kd9D_oDW%OHhS%Y`LC0oV)<52iWBDS|0)q?rg-Dt4@Z z6Q1C*ALKm+U5?A_N<7%&FAvHKjmLLhM^n2Q{3<(p2%~F%vWz%8H?DU{o_98Sk&->d zcui<}+{X8VJTN?6F<}{7n6@ zwQVMOC%3WC{0Z>8WNZlyHPhTn5hU;$JJrhLq0f5rpZF)IgO83sZ-0auYpY3YJVu&? z;UnLaiWwbC`T)qdJ+sY8{{RIy@r|av@T20UtES8Lq49V2kGXgZXh9I@b}4PQIr)Om zr@6_%$;a30vMBP_K8M2oHt_VmBk*RSrD?n6yw&0wMVh2VjFQ|igcQaTLw266iLuaLiG4+F#TOZLb3 zHQ`I|J9f9@oiB2r;yCT5H|>ymsTQ1`xXpWy#gB+<<1gA{;x~&p{{V@vjI|jXamq}I zGeC^3(+wO^k?t{FJVSV3xmQ+akXm@xC$dMId`<9>@b8K>TNCzmj^V}4uzX4KKO}>U zaND!#kSoq6xwW#pnj5<~<@-5yF|%Q$!jLdMMnS=^dicNL*1zzThN8+EO+H4Anoc*Q zop&h4(hkBJyd&Zcj?r7&UIk|Jr29E+0O(lqNbW}m+;iH#X9HK7DEeG&B+iGx-Y&D! z?JeQE(-&%4q%mLxJAmt)XWZwWYoe3I`frr-K7ng95w+Qvk?)WXJgCDCmB8pXaoAkJ zm}X~3+Sv!ELCF6A^_%Rc!tflv&Hx?qM@~jK^vy|eb~jUA(4j0JMt2bmE3Cmm z91H>vsr3A6jmL;QITWfbG^uRNDkI9UVb4;awhl6Rtn0{`CRu0lonugjHBd9gafA1d z{{XMGP}S5d-{|td7jeR~?l6;pRPo$*?NtrQs@Ey)miG2P8a@hZItGsfi$0GR+N>j= z24@kj=0KfJ<=(vdSISReK9_wgY(#Hv{#z>KDIGxPra>Q1diU?y_r>GF-aS&+K5EM% zL3IEdPat`0eR>r<^d~jS{?>mC2Y@~$&3C586HV1r&uUg809FNp=QzTh$)9E7o-UlH zO+KjCDz2#2bl+3WuY4gUp`@*~x`*?XWQ38CftDbX)aS3gaF%T)mHOOXM!PO05X`$u zsX5@2>M%bl^v?`P(!{oxgh->9_7JR%p2zsGPd=4_3iOxXhCmfT>2d*l&hUNar)><(;Ayk4~HHNj-`3?jXvQ3^3|?4hO#;?j1Nj{NuGrSJfQhxH9CzzGs|5s+9+8V`~hb z;p%XIrDgb%$U!ic02vhEDL4e@qJh)c*7d!-GNsj>#9Jm;5Dsjq#)b9J-^Hudr z1i7`_ZO^iBuU?*;{=K$XX5_=7$Y-< zVfLm{Ky{@har7I&pj&july9NUbQAmuMBuPNM9^l zbn$W1XhWU>8%{cU*X3${*S;={tZ>h#?NVKHYzQQrkl10n*zti^EkA636I$Iu_mJs# zDFPJo$}*CKf>m30%BLL$YL#ME4E<8I{{VuP>S2kSz#bfS3%%lo`ejghkKsHK=nY@C z{{VuSCDf?${5{i)%@~j*I=gv*6OZCijC1dfwfSRl`)ca(-Jk63GRf^6VNz#1;{;^j zuc7JfQbGG|YBttW33Pa3yj&Z3Vz@qBW4f}i$r$cB(e08K)Q{E1{{VuQXq${2Agbumpv>izGK31L$+lLyG*Pf7_z;K&t*8 zv60k(q3`4h8yr41FS0gNa+mnR3GrBcKuMDR^) zkJbBs_$ar5<3hTZh5S`+@sOoF*j%>mjBt7kbU3S!f5Ae28%?+E+GmUGke)odXyhS> zC2|{*M>zbe@^;(y<+dhIJ4e0Vz#rYsA1#0jC?^@n-B&ID0B#*9sgzi1ut@BD#CDEQ zJxYK_Cj+l@)~nk^^&{$x{bh&t_4r|R9Fn}AEVf0!V)|KNtWOvK^Vg>&cdM4)w%@{w znVlim^|;))S2O6-fH?cO#~gEm*1sj-{kHTMGK-r#^8~~asEd$6Cmgo}wg)F8wOohx z*znt=i*pvRjkq*!VmV{e450j=amem?quRu81thdb>qV#SkMNT2R@>tzJ5`3q(q~<` z>$u~NwPxG)s`ybm<@|eKA_oDbwUrc+*Ca2>f5N{et^WXQ?+VE(%YA))9Evs^S-1=^ za=Z+I+b7mbU$>d?6<= zYc_I7%E4!ONQ4uB00azYsrMCTAKG)lt+ZQfnsfO?;Z=_I$>#+1>UsKhqnGwqsUrZ~anIvdVb^qxQXlj`68L%i)+JRn2)=G{#!ozcRrwV! z?E~P8snzGzw6qbZQ@T}cr02Fd>~MSM6=8lccuHn?;MH_#7F;MpIxh79k-I158P62? z)9OdnW!U|E7Kp=bwf2c91SnO%i;m=HcPIR6VWCTMfmQ8YV+SqvsE-)ykli`2$a^n} zo*fdD(ls3^71?&l_QX|01Lj6v0p~qA6|HCSA55LZw)(xL!DV2J9oBjbazlWsI3Rb; zJE47DpRA+9cZnp66b3{qw{kkZ??O4`aof_7d@-t{d5>!-Kma60SPx7A#z?Qq$UY;# zoo@Oci7sY)bC*D*08Cxgh~b5Tv<`?2P3w!U1p)=>cmp18>C z*YmH<8xPtq#oBOZxAC8fA>Fg)8pO=E1oMQ;5yw({fm+ah)L#(o0)+9$jEtmy>^<{K zykNIGvPTCzU~yK3>?D4RM`v>rZ&-pH=(K(98WZxLIDyGhI9wjs>M27xowgl{yn+S`9-ThDz3bt-Z}=!r#e=-b z;?3(B8~p7y1^IpUFUyn9JwU6vcl;E4;<%86)-*|iu`!#CCL-)P7z7dZ&N>k)vnt1xez%>gW0o*bB;A!r6XP=knz&&~N%>v{;y?h}A@4|ng*yJyqXkLyldvh81$ zm4P@_IUt^+*W7iln4tdvf}=c(0M-5*>8T@tS!33u3)~TcoH^pOEdK!DraEQOD|PVV zOh*uR@^!401pL2wLFR#SGwAh3IoiTdPB!D_UfsDrT6o`;`#@G8V{qw=t5P_<7z^)riK0f_@RCj%MoJL0@b&;ANG@X}~P-e}%A zg&*bs!34}X#xkwI`qicX0D^{mCAmb0Q;WuS?!fRg@hMJwlx})|4sqU)Ds1*x+hkIW z-eNlZ+zcoKlb>%vLMGfvDacT`8T;8CK(8sc{k?t=T`tSLOT}p*atInEj&K0r0mwb` zR&Bp-UxRlF(c5^ZT7{LAGfm<9h4PE=GI7_odm1bbn>{yjvX3md!W9P{M{IhLNQfj6 z%O-NT9FDl-KT6=B{jh!z&mdU*cN|V!D*4(~#A}aM%Je+`Rd(0*q4-UxN(H~f&kmEg zu39;i7Rl?z5A^1Nax=CvO6q<Fk1>vJ^jC>a<;#;N5eS>`ZvU% z1(M@)x7zlw>DME-JbU-8NIofe7Uos^FT_6tIs51aq=SL?nC|J1PPAI%P-dXTyE|@> z6geP|(>{kZk-*{*@;Z&ANw}Z8#xiQXuZz4lKGw4Fmx82-?l}I~iFXX}+@1ynO$_>F z)F|3ViF`3}yCgh%v?P(9L0scM(t$XN5cw`;UqgdA-oHzyw6l{)xd`wk$A-f!U{E@N=O`eD8K{U|4wQ$8cO zmXmkPp;kaT9Cy#-6DKs$5L@K65$TOBD6gf&S~ z3fNxm$u0Z6zybb$S}$<1og?B`XLf87Mg~AQ1CiWPGPFc-7+Cqvd15&HxgxY*!g`W0 z0@`^)a>6*h>uiEd+TT8WR6fQiL&p(A0xD;dp2;*=UaBMOY$mlx%0FM-n z8+mLP;33XP0|a&5=sE3HVA8JRkbk1xuNdYc2d_CEfYdiOuGc8nFMH}{v=cn>Lb4^qX`8?!u6cV6%=knv)rjyKZAD*N%gDi4#e!t`COC)SA z7jsIg!{k6g4t@Kcdx{LXSj%{vkOQc04%g4fe;z$(ck->q!<2ksNI4`N<@f?w8Z_$$}uI^ zl{}Vj!krp#cV%!?uJe#f05gC-y?+`bQVz(S0W0^1A5;070jrHM@g6oG;uttN=nWuJ zk+I55hXI)65HdJF-W2X~fl9F|R1uQRjxp{2eJRE)-Y^TqWAA4hhtt^5M3U~{*DskKT(~vX{sVg0?kWWx??mm+hV@@|2#IA&rQPn|R4x-Twf)>NDT14$H9bWqco$?KvPGzvteS<-}P`u{gj# zF7b}1*B-R4`{e=JNpQIdkD0m8=a0}(qGr<=LE6tbPDThEboc(W2UcY)s&{Z#KX)Ct z>M6;RcCK*41Dpl`((h>o9}IE`l5>IlyHM;hONM1q0pkRZO!xKU)0%$#1@d8a=uS^04l*bci$WO5V~|Nf&~u;g z9Ac0kHE|+rMFB_$E0271H7bqJ$YpFWZO9{UyOEy$->pX?DoY;L;ziuV;2iV$4l~UF z+X!J0$mTWLr7%=-4sr(_ew6o&PZ$>=)D_4n@{j(vr`DG_i(pN=c|NK5ibZltvjZRz zD93Y?%Kc~yCN?DkFbPrs%Mv!^`h8C{xOW6Oz?VD@2<^wd1uCl-$IJV`Fb_lQJ-br8 zV0^KbCp)%!AFuMo0@y^iEiUOox;M#x^8h&Mjh*URDLa86L_uCS=%fODKE3nb6iC=ovO8_yE-*HX4oNjER>BB@ zeZ`cV1~}Sr>OVS-0+s&&NZ9O7H!#on^z^D)3icX|zc-rgxMhJPlgDBO5k$dV?r@_U zBH#kVkI0|!H7&HMD(=IhD8Rz)RXpRKrkZ06B7Mq<5IX|K2`AtD_n?v^45mWDFb*&X zIAT32ON4osWva#$ozIN&e;(uY6f?H;X$fDO<=x+oqaTQ;H}0Wap!osXPa}7s=dLsU zMGszu5lJBt0)PV`ARH2KP7Xi9hKO6f>6MEq=hQE*J5;g7nD?MNh$ruGpbno}XhP!{ zWO;^nD`cE>$vyLr)}fR&2vQkN;Q85*I)TSO)4e-s3`~o(W9BX~w14{PF6S0-puG(5 zxDY@D1Jgg(ihQy#fW5x+a^R2%EUIuoBRxk$&lG~<5N*+41W7322<1n&q0Ka*Nff-B z0mi@wQPV!%`Szx1(9F6us_KR-o7kZSW1Fh5RthL)O|VcOE3}q(*Yhy`9L@%{d)DO_enHm8bnwR-`q*v^v9{sG{thuwHtF| zabNBqeD$Zwx`{}RL9*Ef-<|kVf;b=Jz^AKBl9r9o5dQ!<&I*ITUfU2OwP9k`Mb_(3-X7ykr}@j4?o18nHHKBui) zO>*`*K})B?9x^zMy>ZYV@Tvz+NN!%@TV?ZJJ%T`aQaJ0}`_$Ia38q%Ki=zR9_f(Hx z&%at+k?cNZiIZNqcU6u<9AgR!pdR~y{7*jhB>K$KOCw!J4BL*R5HeHhiX((Yp)Xz)ol0SSVr=Te)Gbm<|9tpz?59iYW(CNYS z9Bb5zykybOUVJ6^d#TMM-uy85bt|yi<#ae>E&j`K(Bhl_01BVLPaLq={5|kxye>;L zDW@u@bF^a|dVhs(%L_D%<{u~_>x`~FG5GiIPLnb*+KQXODirbf9<-hwoYkci!dQxp zS;?H+d>Z(BJ;qOgd?mQ9)(d73Fvn5{2aZ0K1>eB0hSxU^+K0pM3*tNzhz>aEfK7EV zM=4L3Ww&vGf(AeRbn-l?1ac~|EI9xcY#uZ1S<5cM%l=)jxX;?lxy4?7%^wTzQ9jr3 z{{X{mT{j(})De;LoFCJrB!9CP!kLvfcpFX}6#*uYanH&KJvr%Jv}+_t+uL9x=E(cN zdj4Q$lgJUWG6VAwyPl`6aodhRI?7pQ7yf;(xN5AQQ-Htykvi=bGHpz6kh3MAGcE{Xa&Q8#`6RQJdKvV#)iUlg>H}*GiztBD$T!8?bm~#~gO2 zO&0ScoME{<9owU4jUUt6vG$0Yv%1oUaA z3ofIoqOL!8h51i#ryO<}s*n3Ncy{tpE!L^7Z)e(7c7c)5=hr`huHj6xGOp)VW8Vj0 z1G)U^9x{@%kg`5F5+NXuQbFre^%^gDjbke>v~aS1%(^_qRvl+kK~rxa-a04O%<#AlY{I2p$WxUTY8irzuBh(NPkwKF`hG(=eW&!*oCB3 zRE<@5+<WQI~Dz<$Uac$uJD_f0uD|`2b`Xq*VR5r^4R%%o=lKip~o0K{*;Ym zV+_i~vnXxDqaMn`)DP)OIYkIG&`UI}C1!qAc!T~3i}BY~@cqTCHXaGPl%k|;b>)gM zM+LX+C$J-m=X4+VA>ZvI;p|7WLVlbSIlfS z;l>v^Bc7S)b5BVfHctnatj^v!=2{7l^xz9a%9<_Xy>QB}mRDLqe{{RGN{i7j( z%QwTO+aEbiM%{|PAnn6sj1k5wDo^+%XYCzrvmXhyiDiWgkS;B^?l}cV?{LfqxE|)e zY=qZB%>*pK#z+U1C^ODE>C&ZJ`}J}fONieaw5?v`OQbtCT99V60;7?VP#8#egVJ52yK7^= z-@gCzy0CliKId@G^Sqw`YV#)NvgKa(Onz6XBzi``@!EN-9}p8XRjTvn1;Ik(@is@? zSVw}J_&67$l^pMW^iqbDw|(t9ocXX?&>agt`Pb#i;BF0!S#wX-_s|S{)Xy-+-4a|Q z)Av2lFZWg6W1O8FoU2(cn&#~3r#&6nuXSf&(R z4>+<>la@cSiw=97H4bh=1%@B!4se=0P;}0>TUE#8QMHpn*#N}^+aE}@u?^hQG2uQ6 z=?mitXummieljhVhj%PQY;WwPGRf2j{V1GxR=sMyF=}b?L>ik?8HW?60qeL39ecTY znsq=y#qe7CZ8Wm$cVY&SILm!P@cqM&YuiBG(o5sY38k;2xYrPyDOO`+f@v4+p(N@-p<*Dw^($uXTV2Ywe+_+!B)g_fut8OBTxx z(-ged<;PGQ?BRVB4c!n)(3Hx$3`|Q?6mEGwf~CHbU?LOaT#wSos0+GTsFYBt3q3#& z_o-Y@9fgh9J6DDr=jGUQjxSOJ!c$DGxLgGHULqcN<^RxUj%|-;f;h{Syy?<5u#uTC zuIPreH>&_!9Oq6c@`t){#_8|Ldim|`67BiN zxiU&%f9$s^(=!vl2bQGaA3x`k^&AuGPBgn>E3U7lmP%G~mhSP#5pn+&@_3xUBY+vZ zVct93bM=>k`s9>~2T8j8lGkF`L~@mFRB+8-!s&U8_X0HP_8T@BW+ZL!bP`*Mkv|6U z&uEctRHec3x$XDMlBP*_{g}sy64P;1kmH}6L$2Y|lE{jWzXln5EIg^WUoLlYsz;rI z(=I?qp&Pd@7y{_H!5_VGch`;KV1OS+DH&rA(K4idJI{n}&cXqAwaW)PQbd=XdalcS zMXMAQ=S1W(ovu^`i^S4(&@ozhVkr|Y;bpJy!cp42?s;gnQ;J9f)5H zm+Fh+QZ%@+D-IEkT(noO_vEkvIXCfc0(Vo?to_lm>6}tDRjJZ%8N_Pn6+}^bCYN;b zYL!+^k}}N{B4I=yeqm8RFU};2nt2m`CE9d)=<%U%#rDwdc#|#r9Y@iCCdDcGc7Vxg zPG&6u4A4-xjy>zE4}PZk4HU^%qiubmINTievj_>0vD5A@9TK}jb**+mL4ra{x1I`% z0Fubce>IK!2~w%>a{K$Bk0CrdlqwJTxM7=! z5l|S857*Y3{UYtgNB&8+v}Y6BHn2l==NuzK$DkUO&$+9f1Oc-LBH(AIYw-*%f`z?J z#!or(ddB;dVO)Ng)VQGEGGHf1zg?)OSIcdwAUTDm+#{t-bqb0J9eyk?2#&}JbQ zqf}uS3#rt(4*q(3VOzS;XKeRPEY5>QPYCay8(0T-U~m&;a)5rx`JFD==C{AnfNK1~ z0ArLC{$eY%5YgEl1;ys!VVl{m-s?1>*O~lAkPS`Y=2B^~d<-F46gIE~!u9j+FdH~| z+MOF^2i*mFeu$0I#|X!mVO2Pq$V1>X-9rY3R=9Kl3UWAq zgC%6O@Ur|Q)+QHHss@y2ke6P6HB+3`>OpT#@v=?niBQTunpR*JAp8F3sqj?tU}b3y z3?%d-LZ{ErrUGbj{CN$9Xr#S2kg>(G6m@L#Zi9<@1#}YdYZb0Gy#e6)@*DG7><4y4 z7hy@v&!^ua0}pc&{E70V8+Q;c^*m9$C&3-1J&wEo?&=+h=8xA&Io@N=%&a#bH@nwM zlgl0q01b=LDu3B-=TQ39Tjy-HB^-JpmLpzd#JW$;J{z83&n}C@cc1J&)HVzmEFXRcoK)_5&rw~QM~dgeUpb+ z%uMxUs~U!Q@YK-2*tYercj)sDhJtC^NUMH=Bi%1!L}oF?GHB{oYxPyXa%42lbl6HJ z{_T587VP-Y*e7ISA(OuM#qZTrb_4$+Kg)3Igg4!3mF`_Alx1!@$`8#Mjl6xd!ytAn z05w;I))%Tl@S+X&T&x(wc!@mU_QcOic@b=)X7^nRv9-PaR=DC5J^d_u&r6YAVCD(Q zF{H%>w89mpRQj4}98FcYPTN}<`5Hu{*zMr3pzX^~#3cG~9IP6=-)g$YZhkdMh8b4c zDvdxk)je?%DgS%8Oy>NQTho1jon0JoC|*UXMbU3B5>p9liD;33J(MLpaL}g(ykuW# zS8R5>>L@Kr8K$GCNZl>dyqrMRjW#j zheZg7`??2N(gFHhNivl8vwKUyrz%>w)Z6W`^_z$$gP3W8Ml%S8|GhK+G+QH8pFPe6{Sv>r)01mDDT9bv}j+j4|5?nW+tc-6W3wpN=NsEfI zALjPE%Ms4qEEo~Py%B6?gW@W|r^VpkQr?wXeQuv&@{ENx*%Ze}Ch_ZnGPkRDO|eKI zW8kk-30LBey#W8hR6HS}(rwU=$nr}v~+#43fe+3N4lQzjT21LYOn}@ z%_%t?khUD!*>P2l1&n)R35aayVOm(3uU zO5PG8>kp_A$1}0f0p2~!!`}rLAV?BpU&5r_x0eNX3Pb6ZrQD4jS6)Wu<5`RF{1#Y@ z%g)9f*Cg)yge9SeeLxGtET6Q_Mz0%iB+b~K_E2am5?zhHmZQD8nL`(ulP|v+b!kS} zOZs(SQrqVcLPQr9T$V&`NCrSZ;`M!DF!nEPzqMxtyZox^(1uOKDgmvN2ljTQKNX*# zsTS9#yRan2=djl~hE{48`cr4&A%ZCh?pkwm!5`WN&k~%r0B;80=kfXFz z))`uLN$uJm?&H#arH3s&XE6()Z%B>CG0w=0#w+~QgZqis#XUdXbaPDwN3}we&4N2Y z&Tnx)2f44aoM9mm5*gY7Njtc$%4qJm)lVzJH0AJy86XfMqtVzw((H;9`|O$h1Ekq>V(byz z$p+;jwPY;Na1bQmwVoz4LyMo!Ms4P~#?-I!Z^}#!XJPl!-{Z zy7CyivP?6lIU2Az^vpHtxAW4wW_Yrz4BeBkp}eI8s7E z=y0rkTe>XpCEJWp@&*3Lw*1IYN47*VqL%E15O%$fEZloQ@WzP^nqo2zq#oePI~cW z3^VelMbKt1pb%F)I=H89Q<+?In_D-{%zHOb=UT@!tYFKE{PU;3aFcz2B6`p=z%yLUvevT2@TE{KJ zO&<|bBbfL@Pe_C-{CJC)TspD%mEZ3*iPhfw2o;8gDOY;eA)H1xHzE@8J0)x^E%T?- zNGFJ?PFw|%JOZ|f)g^oHOACC;K(pPbkJjTD4G=sHyufHs`FX6pScwf$=K3-Iae43K z2RRR6WAF>Vn57EQ=8D>JnZ2L=XS~6xzli!lv?l4OSJB?K18nN*fCh*P!9~C7_SVGC zU8p=maKwL`%a1UP=f}Kuj}{DB(iRh;*}*136VLxb$j4T%qtB{}vJhwd*i=RQnvtL2i0mH=C4u@r?`N@al2H>ZVq^I1r_Z2g$v_Um zC@$M;X|b-u>)!pNx^oEuKH~+fR4V34QJjE2;?t;N8{CUUgx4|g$y5jn(^6=0XyzHiwKiu`lHoA z&VR6jZizr)oHwL<#BuKbR4o&0r3}Z18aXP&aCVNfpS{g8{=(s=vfB~Id>QC?L!Ga2 z2~IL!92}}%3=(73bM7d_+>-KHm8V~3^T7|8VIhNTtF#n<#n z-;T;u4jwCXbzXw&K?uVy9E|D1#=jxODt>P}{Q+E0U}9)t6E19|vQN>!`krq?{V=Ka z8pKNswpG^R0Ahne5}p||;);?1H?wyV;5iIdSP`I|mKhL*`gir!mwuWBk{kS426wog zYnuO>kP2v`ER=Wr*z@MQc!dCT<|BSnoTO7cv7J4yv#}BNBt8Rkqx6M24bK3v*uY+h ze@V*-UOKryYt39|xltL*eUZ7sG0j7n6cGnUBITajkm}JBhPwclHH!Y+fT>ZGEE>z$ z(%MLT@^*g2MUNdH-Wn#(C60Dl&mJf*y36+vGb9Mql^RrlzZ%u1kp87K1Gj>fQXe;B z1a8UCdIIcP3*UOktD%zC;(+-skCegF{w=|4%^eKhu4I4I75h*o`LA+I|L&w*-c*O| z1Z{rq3QwR9-F<0o<2(Tvv|HQqwLdu0uxc)V7Sm5XJf4)YTp#XNu&s1_%F`6zquY<_ zAX*uaCim}kFug6+2pQyTs9{kE&2*U)W}cJ0lX8>rt{$^>7!->Z-xUN|h|$o6TSp`; zdqlXLe{qAzj8_@XtXlF?9YbOBekuA1D{`d=f1<@YNh`!{T=G|`Je1_7Vx|)}WTI)2 zfx*VToeC7@66C?=QB=alOnT<8lx zx^Sh0!f$G|4y^AZ0^y|w?TkUzxR%yP83wjLX{!&_0tDE}x(_Kf^5`vyBMg|$Xeg{*^d9{ zb5GFtFd6I&kGrX$UNY= zo`IE2##Kf8>1>;%Q5ty}!H-OyZPV~yOah)TaJ>^P6}VvjKHe4U@esTna&PWwWArA} ztM5x>Ub<)&yIKpltiakF^eAE}?_zl|R9PLY=^9j``b-yfnrU~oTt_*`$x!k_N52qai2)C*EqHfE*3p=TPVZZD?d1D>d+e`My-i`P zZLK+#UhHZ9E@6#LB$W{x*cIEf{`ODnmb*HhSMjwBsUNc)!xljnhc`ec5H-8S4P9K} ze~Y(0shlg4F&fwMr17ahH*2H8Acyrtq4}a`Z|%~tnlr@^u#)Xxh`GK2#iX>~=&LHZ zsHx}mGR7$wlGY7&wyK@(Rgxi`C#=Hb#LNdF?pGE6f;$bpUwbm=pDxNLtC0BYd*UZF zZhsED=M3AM`z_oov3K;;ZO82>-u6(IcJ*KPK)~v=q~}kFgY& zODuPT0iRq5LqE&WB@M)ith!9)FmYyC218Q1c2_|BDnv>hKbz@WglkG1Hp`O$!u?Q+ zrp52D5o|sUj?I@;W2%#5QMYEVZeKS~7R2_}vQ6>vSgneV%D|8i7Jz3mWT$hczS2nc{430T zjPqt0>&+$JuELgmLj2RCVKu&)#0`2f{D=$7L9tGPFQ~TF$k!%xQ&AB)N7h%zuWnxi zch*u~T)9#&qC0g*CjdD;-pD*!7wl768y%Pn(x`A1Q)pIB+2+a(Pd><z{szHG+ktj46w=1IENe0+oHK zyT)r#B=CltPJ~ickhA+{c>Oa7ze5-GEMMHSUqnYyr=NDSg4ZqQUo1(Lz$WycjB}OZ zBU+*0PL$g%E%5DZK<8W@vB6-f_`Np)MBtOD)}m|2knvb`P@OnCXdZSPXP+y(3IF@> z5~YkSOIS_qmssp!qd2Ak@2Mu|7%8gGW|l53WdOows`g}43!z!_Z@&DtJN* zy9i9+F}=2?mbMat_I8&3h;of<WMceDl|C$(tiMH<1*;y!fFJrU$~YV*x&qJQHF ziK(7NHP=FNfu@8t0}(u*#w*|y{+hWWrXS4qHP3E5>8k~5Zo$><>b~LNuO=KZgg={0gW~+3#oX!OiF4x)i0`s>F60~&*!4ghJj2#GyzS%(z?&S4v~LS z4HRP4w<<9jJehidb$v(@^^Maknx>Ruh0f)VhkggdRk!#8cohRt(E7@DP)nd~>*XuJ z?T-lUN~~VrS8x-_0ZhsD6MvqQ;m)mAE~7&)*P5;zk$%IiXR-Ypr4tumu1tK3>ba1=OUVr@x$-d3y<>3T@;^2ItDfCE zb7sFB`bd59pG(-`4%pQaBl7)2_uSlrAOyU`r!=?M` zcyPr{aYe#w&;0v)%yKYom90@?{FSfHz)!@BFUtKab(TKKe=iKyAKEay3t}*2FG8q* zshokGzhl!*)^O`kliS(tT4{I0iR*qaNziLSfq#bu7@wOXj*S~I*6#z@kioRr!L7A@ zgwViu*n@}e7GZ%pZqeuMdPaX8x^c+qS8pZ}tFz~bdYvpq+gfkC>nkQ5I^ zE3CyjGyzku$(K9;4e9H7G^f^g=laKIr&Rp9i0`~HDUla$mW|9qOJHbEvBzv!QIP%} zqwb%-LD6_Skj$5HXXh{1JagMk>fon()iJn&fu4BqtxdDF*CPBac z{6)2iTZ4EsP<8o((voEM#ZR)9GR<7f!UTlkq#=IQQP|Sfc}CJj|17@!3xJDCB*|I) zk_D(=flY~>jVobv4w7Eah|dWj{P-rR+RbxvwM5!+;kXAym)PKY%+bkS6j@vI2HXb! zBJD`U%B$dWW7l=mfy|9s^1P~!bq-#u%;kQX7fj;!S#6gKQe>YDYXM##nYd$*em%5o zvCa2RD3iT;TK}Svzdt)^*SVJKRE!IiX;kfJ6#g(Pt)eMkhu)a`B>UfMkcnexv<17) z!I<0{d3)3)?fJWQG_AQV%m?KgaybQAWFkaXSReph=MopW!fOAuC7+C@u%hx1J~?fH zZtaC~|Fvvu{H9B`3?Awt$Y;IuI$CwH^QNM?uR)1r|KGBL>jm>Bf(SEZz zYnT}qquiK4z-GYx^ml9v(;h)aie09q|M}7L2zSy&Ww(-%3sCg$<6z4{;g*!eDV%l)c*&pyfQ*0+apAoB^}#eU{qe1eDY z($%Ob7T*+>6(ptoWF~FHR3FOF@Z!btV-`W8pJD}FZVoqP-@|N4qSweEhm?`KGVqxq zl+azAsC=Jr+)j9SpR`jqc2*vi7$jsUXl8tyKvin@Y>_n~kU59j8hgK=-ResAF{1oc zA!pYHbLBEEvdFnWomy3{h7Wg1A&fpA@`BoG-j^q{dm4_Un)1%^?&-vKDnW@z}~;ZeFE&ac22jeOrb0P!y)D`9-MVmQ*8Fl{7T~4r>qVy{d}R> zdAKNTu>Cs53O|Zf1xWon(F`h+#^FTsvyQ-?u=cqUkYW=3#J@!b>%HnyAqo9C7FQLT zX+*BX&gl>IKGcwyyq>#N^G_y5PUuhUaRj7I9IqH&AkisDUzrP?B#nwaj!lbQI&7Nt~@l9;24LiP{lJvpVQR z@Du(fbHMIm^aW|vL{j(cm!0Zh)ikgSTB_Mqz;F27H-4Z?4zVSCgR#8I-NT=WBYpRo zxmaarDsJden8d}nf*OZEuxQt;NuG?EjkCGpTx5K`pQfQoBNxS zZ&;@qDNmQ7V3L%6k?4vZaff;7$0HH1nR!UG_=8d_BibhhX4aYWVYE>5om|cBESWvut9O zO%LHthLXkO_Aqf$skQ*#&GI8o)w9lHae_;+3W4Q0OO2m}PR~0i--8^j6yH$HCRV-C zM1*Tiu17DM9P8VD7?XY9%&G+>Z!FGRQarJ%=WFD!=M=*2*F+*}PgEDD-lRr-uBv}e z^ihIBQ~0XPwjo9V@Iii-<>}mahmP_0an$$vkdMQoruOurN1QF)4k{j;11Fc`x(_c; zYWaB?RPk!m0DO_GscRNbRjxo|x!<=^J`I%b!AyY(Vl4kDvlNG3h?_>=oa#r!Xc8%8 zpY477Y`|LZHg|jO=^LSfK|*a z{6f+jx!3^tdTrtYN;3zEri+=S#8 zOUzuwi^#`%V2iZAzr<^y;S)(FU#*hb`UR*&GY0_RrjvwE`*Uqwwq)-^byOH-#c*DX zi-XhH9TATQKqHyl5gd&KxVhqDSU8YwlT_UBMepeNd{T|Aw&M2MON>{;o3ip6zk*aH zg80WaK=;{d4(5W&PtWukLOB}ZMo!Z#f1lEvh2UrPRacYP0RI4px4b`Y}Qxk(dQkDAg6A<|t~lhZPj zJhPeoI3Pm7B)->P!$7Ffh(%Jn=o$rf4Hev1&gNK$XK4McJ1F}H*FMhu+J(+? z@8&3vD)fY-gamleiC@ZA{9QSHLu!!v=UG!~{L;O^L$HaLiPZOWF&){(FFh2w^MtrZ zM<)tz=dXGCjyM!PIosXo`|P;iGv_#d;c|R06F~2?R4v6!QM;30;cWRLZQ>mj4RF)r z@m`|)L}vQ9h^Do%xt%X1jD~t~Po<#BqoLDB(9LXso?{KYPl3Z)O;yefYq5occ zT?yLS_sQ6~*yo)=R`S^|ah$W{E1=$&;hQYn$!4ZIlHi{&=ZSc@%au<6xU<8$tOJXE zf-sr)YOZ*3km^T5-Tw2Pm&mqY)uc)le)ZmAo8;f;x?`2=Sh34RPVy zCfUd@g4vOvDC{hjZd61)nwYR=Q4#n0e&?#RxHiG{6=UX;qMB~H&N10t&)(-8(XcrU zmgvDPwV|KWyTVfe4=;3d2$iULXzfY#B2&W@p^c?!Fb-?xhs`{(wYbZJMMT3(>#xZ8 zm@FHiCu1}rxD11fv+h^BjpBbIS%oUk9P3WNMI)8YME z=DL@qilQP;lBxREk;L)cfWAN+Hwd{S-ID4XGr%k_UO4P-oG;-ZVWnv5%OlC9woQD3 zS3|v?e-nCi>o`S~s4~4CQux<)9A!fvv+T61?}*f>vk-H)!)TnHk(`U!PrEXw>c^uchE97oN4^B^hFYlKPg#CLgG0h?nSqUOqk9(_TN`6F6WdV(=$U!h!|3u`mM| zLe`97q=n7>FmoA{`){CRe@{Ac>Sew@d#lEXw_+0zr1J^qa!Ws-$#0Dui~6p*{iem> zchW1-dd3W`s9s&dD}^y{$cxDw(lXrvn0Ur}_9vvJc>c`hU;hsWO*u4qh~*^4?3bsX zFLnb*pR#*$muak&3IS18ZDTQSoDAPgRQ2tN#j~?KVj5&>m3G>4y=8BYibr(8L7y_5 zya*68Gm+8yhTitp$+JoH3Ei|;c6*!(n|=EFZRXz@O_{{*cP5(Gs%ZSv__r4x*(6V> zeev=hG{Rvul@?OccGu9iryOOJXtaiBh_hVcmugCvjY`bZz|PFVleYX(OOFgQkcsm#7miugM$D>9y5aRL8U^G@{r01zu>c4V{J*s9?8V62N3ZTV(58nB50Y&AdZr)-A}$KN4+u?2lstn{}| zx91R#`uMDv1@Weh7l$v?%aT4H#3D8E^sFb@F;49okMChH3Fmj)mT@=ZbXuH{s4qku z+1~dFlFx9m^6lj(6wA+Fz8K0kqU;>pbzhy*6Rt(*OU_SVk;&QTIH;<*;H$m3vg;Se zpwUI_h#`N;G!ESnd|&Q6#bLC0{#bU=2lym&Oi^iyO86k=cgW}Kp?~H5nL~n~L)-y< zkJ%dn>~fwo_j38LI zuu9(+@Tu*S5A#2nxq&wgIuRMdZL%gBVw!oL=Qoo@DqQB={X+rUh-2`1+T z1|l#QpU@#L>q_}tiCDUt$V-|!0bZN9JLh)p(Mj=>ewlc%C5IFW zCaNRwY=8-i7)Ljx3h0vJp+X3lV=q5KPmm^`6?~azwhhlmgo=#FXn==+bwA+6-u|bz zp_xy*X!R^gL>UHIV2TvX$US{bPX;MdOUgLV9ldUqlB=n?vPRtxuD7)az5cpcA8PJ1 z#bteV0B>;;7x<;@B+t*Hz>!oSqix8mdIpoB9;Nvpq2V$9DPD>Lr&?fc6L*Os=<@QW zpb)lAzB87jyykI;!j=4v6NgGDy4Q*Fkt`At;DKr3YPGj(eN20*(SZ~n9}Ul@oA<~?g6Fwv$WR3Cw#!G7>l?g6 zvH_!l!J8P^Q6pGzDs;|=24FZ_-tCAKu|G|ezM^9Q%Shfi*Q zA(=PLR%VeAZ{^`;88>^MB!1k@5B0S}%IHoqW!r`B`_iOTwcrBg_`Zg3_IZ z>vYrsFn}GAkjar5E7Ie5?S&{+2Luj`a&sTq@+uG8rs7WSU6ribJ+ehatdV@TnGSuQ z^EGHlW_fXOrjmk!(79$`V)7k4EB7?VM$FmKCboDC#HXYamEB@Nx2||n*?5VE7@YYk46WZfn&0i4?ru3NXjD{xt6ZPMP zYD+@62fo_Gx6C;DJ}F9u=WnFTv`KZhTY$X6D43$rpP~bkQ)g__Vh#`&h|{~jea6i@ ze?1qOp!GBc-)b9Q@mGH>maLl*XcFH`iM#Fu*E<*C#wD`VmD_)6Le2%)-)qBY9$N^B zTW-fam%HxR4bIU?i?CNK-KP$5Iq|ZmwEX2+%p2td`a|@weN&GwPmLG8N7qI-SJt4s zssUoz6$AMupl60kw)DL%OvRS5q)}4%SUO+y)1a7$xDp}A!}uqSC3|7W>2crPMcJ)+ z2jYuvgB)Kd*iQ1Pk`&Zi@n$XY%L#{TJzD0Jwgb|fRrTob6=~d09Om$e=GQt_;NbM2 z)ug8$p1Flwt=tikZ|#qR%DdsOO5|uFJx5R4?b->4?Ll9a+j;wJx z>fAFPMKK4x{`MxuJfiKH;O0pJV@Pr6QFCd#%k;r>&MZ@x4n@r!E{E};;AGWaTdQJP z!?@bM2?)h)Oi|2^easTH3#->Dmg9hvj8KVpGk(y3nn5On<_E8&181-V>{G3i2t!+w z;3z0d+|QF_Z~X-o{2Hj>-ehBSfCDYNb;yU*7X;{~T)#4c72UfJibr`h15)k-OpbHn z^A|o?kut&5tz6j)M=4gM)6-ZO+q5r|xzv5=K}h5McMNg-sfPnnZ$iqOvCN`L#wuB*wtCU3rjr%kdv`gmLJMBK9a6RiGwf8&`H{EShrg4Mi|yY|NIN z)hZ;%ocBgO*d%!~8ELh3nz>Nv2~#rj8dptFOD|X98;@~qUrYKQ4%udkcWHw6kGYx* zYR7-TQqA)4^Ibt>MEj{yV$`|mFir4Nc_FeV_by~_6NLJin>wzln}Tl6JB=Y<0Y_8V zJY5N`+?XLVYCH^Xs11)nN{$W;}vW*MsAY(jaw4K|Os@RNYl zt4WHUF{Kdfy;HAyu3&$L-!+0~NgQKzoxJ?zVhj>sxGNdDRg-KjIq87+nv>ig2U*(Q z^ut{9H*c{sAG;T>%DH|T<-u>vOsGeU`yi!W*PBZTSq+Uaz*Z|v)n7cmdgG(O`YE9gTYYFRLZg11q znsy|=_DLcWeygoZ3$$2mbagv^WMadPw3S@9jQ_av9OxcHZLw<~0@>S$T9?VKQ*_aq z*aunbGJKpL(pY1Q#MqR~+SgSY-h4S%%c7CH;nZn1Te&#*^Y{+u?X^G@cOa;^3c#8eDF`8Z}DN_92oKb^Y~C~`z_l}?{xCQWVf4o zY|=AnP5KUeZdn{}@r^n=>|jg^ZC#5~8u8OUhXzL2!)dbu~TxF-D zG-TcUjRl0kTcYk4DO|_o&_tN3Rmd(YWt5GdXWtMeGF%-f)y3?}R84=-8sIa<5WhN0 zRE_p;!=19R!wus|t`#TB1?~WLn5W}^U{zOOKI1{Q{xv55un@f>oGmx<^$V}f@FmK> zXXd{sZ`nrm0QFkb^RRBPVkMIADEsmXq?#=ChF4zLenX3Hv4YCjP!}XPhPy@F{{#Kw znmFxhKWf9^zpv5dExee2a*cvk72n_Aln$Gh2opRpHpw_tLM}hINz^^{{c7c7mhCu+ zNNqVEq4~i;;Gx3ssNJLRU;X1vHW|9xUjGGlm|v!~RN7E*?iGiRNs9m_MXYySc#$)i zI6hOyM=jT4=FTV9`=GEJEH|+~mRFJM^d_3#e*qhHADkKrQ+}D7*?BUm)BKQwRw*^} z_x;0P$*G%odzngy6eqG192c)%Eym0v(&WxWDkBlxU^q39Vgu-XN&EQs4A>4cSHo@U z?(gN50i)m>*a^LxLeZG^kAlXRR*7FTIuNHXIH)xceJc^_NeFk_Dg9IoS>uTn>u6yk z;5pC2)g$m(QhXCg?sQL-qBPC%m^qkOg=JXqd-qy-Ej#xk^hNe|p)2u_oC%%AZ_3v4a&v&qN54=VW zxVrZ^TYDZ)`!f zhlp9c2DJ{<=KQ0s!w;cE@WvxL^*lA>s^AQQe zLuQ(Lo;G7BHQpJc2bMe&zk#)|Z$)*ncncr2TyHT+rK5{V>8GMt_2SOa(W@?E?4AW^N5#mSii(T%P1*QeE?{1ak#4hs(0O;2n7!Ytl1*hZ)z7AxD`z>)P7! z&&n1=;y-F4+ z;(lOmq0~$ewlFD=hYKr)2B{%4+)m&KKvB0)24x?F939{j}VR?Nu~bAU?~FqDU^H6U)*F%}yXb#OdRXoJCW{ zt|P@n;ndIHCGr|TIQ6kRbUcAa0XKzn0!9n=TRcWubaG)XnmBx80XBL%^85L!n)Cqa z>)HMPD(2g9BIjOs?=ts`KDSB7z$GLB{RgB^0QGsCPvtQDmhE|p+v4R(Y%Z1c{PS9e zYn$_Ks&hB7`-y9zcf452`!*>%^^L818H2Q&bd;)W^Xg5Q6{ti&=0X4d16F!T!21U_ zp>TKo8Jw~ z%K-*YZt?G?d8%(&R(t7vP=wg$dQ8%^0AD0%JDpb}!HzHzTZ#b(C@33Wqy)WVD4fy3{Ny^|`9Xqu#(C&9a0}RRfBx;|P=02$7_J zeX4)+x39&>FtJPB3W;kY9X{yb;r4rmMlv)4~Aqz6d@J-!PxYPzF2KK*Dqi`DluQ>9!h29kM5C4=Zb<02?nn!burdEbeHcb zi4rmOkJ$2|dV|uW9z46GiML$zy_xKHP$s{T3S{D887@Kg8cf37*aO-bOv9QiwHmb| zsBx&Bc$kGTz!#Hwxt2KG%5OLaUHQK6SHN^fNaKr|8*i`Yu6QomKYp6Dd@%h=#=070 z+*7x7%hN|$vb@S4=`9LvW*6J3?X~}a8U85nd;U6+^fsN&@`8Q$MzuR}!~7Mu^uTtk zAj(KOYsdBPIsktv?7w3v?>I%AA~$R4iLXiG;n4;}6kz*ZVOCosCu_1~(0Y>R7yDTy zsy%FB3x@Aq{OPQ2O;qF#g`xr6=f0%K<=yN~2p=1l?bxAd?tVJD{YAIif{Lj2XTrg{ zOQAJe@se=Yx!~e3JM~wez(DUYRZ-^P-rQrz4ugT`nKBI z`P|AVs3&eaO9Ff}p~T)OHvDSO#Cg3y?teJyzlU()*!Wp=B8|#=f0&Z7iv^))lD!%8 zvgfEs=3V~Ma3^=L$B1FvA)q9!Z+oFQ0FN4IP~qp{mBvo}CArNax}z39ZY^+fwrjRi zCGKfchb2rP0Eo#fb!!RCGPt>rziWUg&$)@#>P{}enF}Q{7S0Q))4K(@4h}{gWTIXL zt>zdpMTW4z<}Q&bNAH6zR+YDsZITUvNUk~5`;osUyzFOo6-4PZpE3q&AC?h9WKi5% zgDNna)3q}yKF}z!!2qL=KAqOoA~(;sGvZ)i0KFWN&>jL+2!1ywnCmq7S zhie#dkEe%`nozO!eD>s&sfc2|&r=~ga+taft7XRanM`~Clpeu1ARpKgBMdWD;&yJc zse-Ao?b?^@v-{|?jU0`Z>gJ|Gj*DE6mWu;3x!-WWc?QopJfr>guXCv$w}mE=*hh$m z!;Y0(=u+ZBaDNv#NCT=#!8OcPEz>7RtP0l9&!uR4XR$FJ6Ss$vn+_p%iWFmB`B;=wPhG0beHw-_QOD zb|dB(fRw)9S!fYYi-m461=s^m9i{4q$R|_cvURT~jurCB`&;BtfleEb*&6?eWLbYz zC9qFre<{9+KWY|^At9>ZhD&yTlRU-|`aR*?ua28Qqfazzshj% zBewwW>g+)stzp)yHTT3%Hs3w;eXE%$KG8bz7hKbzKx+Ni^)R8)lwun&cSZPogJ;QB z(#HCP+#l)Vzo$#FxIdV1d3v2sGkjwr*~6;!<3Bv{?1-xVQWoH1l>ww0@TVW)WCMFc zW>s-OMNxrO^%lflU;G0g;Oj?b{BpSbmTL)$5I4{MR->qE%;|kWa8HIwbcpZzhDZOD zZ6kP@XUk)-F`0GT?DN%iA>}D)^}{LD@j|}gjE;OV z1rl7AUVWv$asZiEA9b$v=m|18npUuzs*9RuE z(M2|J-7ztY_gMxx#YsWu4x<)Lu1?b9tj8yvfbp4(84i#^=ye8KRHhsC1<^t>v)DxEVoNc21&z<_T>F*~DRj=!*tM?8!fdO4|AyhgTu zSa=~+$j@ZGrP-D8*83mGP1hr8Ol-|_IvS&YYD6tj&Dn4+fZl24ng@ybh4x#>At&H7 zaP9lwf$*SrXQm404V~2v9(V8Neau-oBC*)ytrEn%9}Jo%z>-6p)tK@{EW^UeC|Gof#K_( zg{=KYjNylVy=I9UEh&pa?<(XZanJpIdml+RAb`1oi(Ieo+R}Sf*!Y%!K_QeUatK>4 zK`MyP&PCw?ld_+y@MZ4eMlss=fN?*gHrCDOXbR!%`S$_MEF`>mV89E0en1z(nSl7w zhqF|QdN=4TbuUom)OITErTnk@h=A{p4 zx@CNl^32+lhb7T)+9smSN3{HZID)_(yF&}l(8<@I(GF*PDaV+lGd#6M5e+7EG1~xX zGwy>#=z)0_S2c`hR;EY{&+nUUPkImxGu#-Fub< z`JcV~b-`PILaF#u>q#Jsj%O!JEtfRW=WpL+7G(MY3!UHecK-556uS!x@t6-p!5xFRZP7w(x+sN*kg(@}K~! z=Sr*!HEL1VAmTs#dzW%VX&)lEj}0nTP>ei+d2Q&XKW0bx*P2H>X~Us*#>FX(@nhOG~G!S+BMXq zQS>!Mh47UQ2rGw8gc%oR^oR?-SjHrhTFD2vi2?eE%mZra(KPn`?tqbn;`~8kmOzfB zo@;DeIL7H;jjd> zYQ<>nS!ydQQ8~^z&$6*4Z9kzeN*Nh9_+Sy!+p?R2H1;Xf_XnKZj|1LT0Z1 z1Kh2J5}6nJ4?i$`FVNhtpm^x8syWTwNc*LOA9htP=N3!#i(nZNaoZ_N0X4N+CcOQg z@RFjT#6f9*L);-lIo1t{d(L7^LIaOnS(99Aba8pQyn%u;_8#wSQ-Wk^ zL>8ugx6yJr8C&-+?gztRMF19osWk-7y#8F=_0s0-H?O6TXEP8JEvO%cCf<64xTfh94FPstyjA`;d^6 z&@%z4=yDoiOo6fJsJyp3_Y_^=y!6R&<-l2obMT#a?kf&Y^|0?HmBX*MG6KrCsU`^nGJ! zbS1R>DNi^Ph^&R6UcPsH*eVD&y7QJ?O#GL8)WnsjMWV>{ED9bvUpRi0**aFodI+>k zR-2>K)w1X=a-H?JaQn3J&G=?^lkh_I;97_43cBuHdnMnGEB~l#>fB)7S-uk*ZeQ!5 zIY`21k{SHMAS?Jxpan0W2#w-Z`VSz6W?z4<9J>~=F&Upze}41M_GCqOHN-QUcSgJ! z@;D6uU-6O@TPN|0*SH=3OLm(tBc6=tGAV_ZddcN`G zpr1{l9vey9we#nZP0BANtlz}&rQe+D3s*VW*F1x{k0QpIMC7~mE4i@lIX5)0=q;hOwL~{aOrZ$p+vMcfW!S_HDA6l9eYw>`|}a2Sg{jYgbYeS zF5b0yM2ImPYY!>*g;sBqZpOD4>((}L@-6#Y_iScdp=u}6ZSEKkje8E=)BX=YS(>I7 zFe2}F7PW@#k~@-v2Bn?hg|`WXz21uXulmx`A2U9?b33Uy1P=imZN|UWQoL$Dx-U#f z^4vB+y-bYm2A{!0Cqwbl#QPozDq2+s@^%s(v-mE*;k0@wp(6oLl)yoLeJUV4S8dZ?wPaj7pD!IPi}^-5s;&u5ZHOJW&>t zITz<$DOXRw{#eGwHO;W`VL9FZbUY*x5wz#&2r} z4^;oTo#6+&_dtB?mNE7Amlgps?}`IGhIl#&0ezC#!&#&+XY;m2!d?08q{YkiLepUS zIR&{~!CUV^2_wtNH!bz6Mir&;ny)o9t||k_`~#9+_!L;-hwi@Scf&aj!f9+Sl4A9~ z?VxL3e?HaPwz_2>Fu48xdd-=nbSv-I=YOv9&~PB$^j#1H51Eh|8OAaW%Y?2juY;z#5VmPhhh!HZe)Oaa1s?@y48 zb!QP@`|QhJed}%f&OFMh$k`hQsX@~y%AG#i*}YUd6LYkTaeg&(FX`--M;1xE_m|6& ze@=9*y{ZX#;Jh>|axvl#cgt7dsJUaO*tnAv*K50Y`pAoJ7Sx?S1Z&vmZB+)8b(x%g zW(Vn_6r|bRbB;G0ooThKE5FLyJd}5UQnhaFZ?c-}ku#U~KJC1)#1a~wJPktlI1-Y| z>rF*MKEDy~$6Sy8odf2iooz~O>nv_}D*rX*PfWeB*L8+;8}3{_DwW@x;G}IfVF=JG zD83OxYT{LDnvTW9lW|_Xmf{;rn5w{Sku)YqtMG$6*W-rTd65qNqC~lN6SR7=>w6SC zr&;<%T-zt(J*k0MmIOGKJ<%grh8P%ilCzg2c=ByNZ{S_Pz;BPoZ?iv#!r&o_sHQ$i zD2al{TGJ;?gn!d%TJh>1`jkX`%C>V40HD>>QfJO}zoa@wZ#}hOl%R)c_+L6u4X-2& z5lPDCpSDAl_xq#?&VSQ(_`>O*TEF80uzUQcWYd<(wkbfB!hmQnTaw>d`nRu>eh~w*_(6yWL1jzQ1{N#Ro4=sx4KhT z5#jwGWd-WX=bZin_}bb%h+Km?fE=MoMd-h6g7^OeXhffc3~iYJ-IIOr`)+==7>mRr z!fFQJV-)YtZD~h}!o5^Goo+_9bU2o5lKs~}u){-93a4wXMx*9;K;E`}eRCDjoMl^v z+2X?dN!=F|7tr#a-sgIUCsP~>0|4hWP!VB)d3B%lqjIP}Qwfj1p{)10QWans~yQPo>1dGC^Ekwo>De$?;_#D{)+`oN-ZCDSqr;`!$-b1O~^9 z(y0?mN$39PiF6x2BHWu&ntW@abYNsV5gaS2smRBdG>)D4ZBd6RZ1~rJ;+x>O)ojK3 zb&FO!bZ`)i*p9XNSu~^3tUQWHS}bC##jjbU|G55X&h>gaeZ04kGr-5X2HSjvpQ?Ur1%0^nwwbMbE#kQ#ux(5gPIEd) zK@;d6|+yeZbL;;E(8IsK8RH{Xa3; ziM^nyKSHd-tDF7K!v}*kJd5#)2!JQBFz_FT8VsS6U~?4GRyMLQV;XOqPBv65O<@mx z(+mT~i$4i^gTH)r*1zz2e)A!tNH<4yWUww3hpgq|n8~HuO)G-Uy0nddH2MSUTopoF zppu9=c{41+!82@2NdCJNW zM<}S`LBy-qR_jkkOYR8dXLNgNB4y+GVYzJPjCOGYGfITeF1c|%n>1U*(3Vnuq>E_y z#;ChSavl?cf`%gx6dE=pkN5k9R!Xks0w=W_%qNq<8Zik)1Wl%fReDAP%45A@Rgfjp zca%T=4ux~-ww*kTT*_9CukOu{6^jG?LQv3`5*eF%jFEJFvt zE*b=cid@%A!F3ed`0mu<_|GH;R)iGGjSztm zO(|Ofc)L&fDgHqO$p3a{h!0;yAV%Rz;+H`S{l-mGk0vfb%`5L(*6iy-|ia(;19FRrLj=3@{scDw;>qf7s_ zpVstOTN@}qR}D7I=3*d-^Xi#M(EAVY`=~(YAZXK9NR_uE<4dQYshwM|S|+WE>1yW@ zk%V2WzDm#_Yc2LJ@8Wdl~pFaI2P8x@=`GPNjNV*sMB+PFcSQnr71;lv?rl0ilaKd4p2j$X(hm76^4*T z5E@}}I%%4FMFc`dzB zW}&_B^lP!gz$yE3erW3rGUbW5-kfl(-}vKpGlXlV2z4@M)Q4}jT>i&r68|dV7+>M1 zEt2l$!nSoFDhn9)1pZijQnE)oUEV)W#+^p}nzGAXmMd+_iFqiU%`lntaW1 zO)gBaxNAlO*lz6xP)_P6!EAJ^;h{A!C?Cbw5a~rX`67wX{S}!T+E| zusP)ioM%h!lY5`z4SH04fve_ut{3=c6+Gjc0#7tHlYG^@acy5 zssg?RZfR*7Yl97vqtkQ{P<4F>UZHx!$6MXGhN??``Z$9|9Nc~BxqOl1Fn#EpWSq=w zOYA&egB8_l-8Zw4-ctc7F+i) z>^MO9K^fo0Sq#)VDlB0va~Yx%z{Ho1 zVp2ADpMucdye&>~xzaO;lih!!PlZ;Z4B4?ZdF-A5H!n45hoP0JT z5fpB+f8RTt?1(ajxP3a^oj9V5thk{j;m`lYXQgT!5^r46s097zzT+6TG%uubct>?S zT6s{iI=iC?R>bl~S9P(sMZe;21f76*%4Fl2Hqh5S(#2?%MtXJu8u{uj5J7xUAZ;U= zR&*W(en|N<@C=D8sX2owX1Jt0sq36kMHtAPb}f4oU+d9)Z+;(XyUehA?dE9nE}E?0 zI1!w3ekDu&EcsWNop6{$3T$iqQ>?gMYqPC_mJ@MaM!Wsi|1Atp;+Npsz8ZryH&5pW zDC>U9eU06Qt$^GXQm{Eba(Y8qVfiff90n=~b{fmmug}vka35g}Ur@?bG4*onKXLxG zVtGlbBEE?2nMWdjUdMEX0VY;vIc4AMZf-mmtIDjoMQO&Fi7(V@lZ_O#rAE7H>ZeRD zG%gufLq4{HLtmy0b?j5CmPv`dBDJo!a|oNsjw%Uo;{&4NUrnDIyFd!g1wO6Gy>eh^ zb$)P~4@dlX4qb!$nXa!G)ll-1>53)JRT{r?&BFLYNdJ1MU9EM1s8LbcPrkRl@@}1S z`E*0=VNR7QU!ULfoSO+DD&8G8JbBz_<~UWEvG$hBHs>Y|4E(gKYVvSCR3T=F?)&-j zg@k)`L@YI9^#`Oj!;Si-$ ziw`0exaOneeQ0sxsO*go09M|N!>-NH@L2yfXaNnI_}!jfu{^0cn;^;yb$>qHfY9X-Ztwo7A7Y71EaufzI_6tPpa0GI>H98JH)dez7#h*= zyp+FX&%5V!TnzK-u*;$a*W$gK%Ll%=dV`iTNS=kd`R)?F`@AvoM*C=KEG^Z!G%9Dh zQo%v4=i5tfnrU6FTd|=y!ZQa=l&&IpzUgX_QY2WjUhY%jq~0*yR^{SwDJUlRtvt<7 ze&zuhrAIyNwuhVw%l`o`N@Xmj8kbVcBuEY{@^;SFjjCvar9+>~GL%mEI$GI$w4^~d zg@H$44U>?OtGIDoyf}BxtATLt0dggnLEY6lS=1h8{=KtMW#2V@ZMqPGVvHW-d-dW= zr1WJkXVJo==dNdbm0hKUzPx8FcB>7Nt#>mF7uVz;*u!`RcSm>!j+bNSl`5gKkFc7!{Cmee?UCu2thF^$df^ZGiOyQkg}f{C_m z-22cgD=FO-f3Rj<;m<`t4!=R5>W{xZUAKMdj03)A&o$4U!L~bb`RX~Tjvj0KbO8~k zqZqaO)nCV7XvNu+7OEaVna*R^aF#|c$&&a?b{|Kqvm=3q7Btf`Nr4CouQMhXJn>a7 zvvWX|w@~*#Dx|NH+R3uN(QJv}HOX@kcP1^QMDmPFePC2+cZw~WyFrnLTDbBn04L1i zoA*dMJVWhb36@O@>~k;{zqsH~r;-4cHoScY4Cm+p#n&6@lGY#?z%!T`1Um}@41{)# zTM4{9F@u|WnB z_(>ksu{2DgJu_-1?JH|9u$~B9c#8IS5}>|fphBeY*AFC1k`kW0g$&deR+b;v{re^) zng{@I;Fc^tPcmi|=t)irN~YQACGAY%9+A(eT-r#Ei8an$4Xv#Z<)536BBQp~=15&T z(sEgRUMZCq5{;|x&wc&w46z7O1jR3yV@#4s;w?zf*53B4`BR00ZGR42Wni5uk+V&- z6Zh!C@HYdC4R2a?x4mm(iyPW19Erz zDd$e2NS5QnkKWH>PTFL(nrKnZV-JM+DqUpl3tx#YK4e%kSBOP$&tkpsnhVd7 z$qzQuWOFl&~KvdB4*KqnXc73+uLt#O&T@PLwXHJKIts5PfI5?HC7_WFT~&0 z>+1E!bK9|V{;f|jpn}d$rB|+F}p=V{*_eddg%2Cx}@XpKb zSVEZ5DuD2_!w}l}4cR6Cs#-T*Db?hzh~HrZPnJ}OXJ%esUwJQI9(bqVhNg^tFoIq8 zL>1MjP0aqkfr&Z5_E6{Hoo>Baru0Cyze*i{97n**R$*Ow+SwZWp=196vL()LsagMv4u~mlJT@EOHdk)Mod51O6S)g^x+nQH9l*T*@LuCH}UPEL<2$d4g7Kg#vCab?{iumjgfIc~IhBXoPD`y(_o}@A|(OlGVt1Z5Wg4-Y`EBJZ#$^Emq;qzo~Ffn{su%4^ep4)oqO^%%azL{*NS;pvAX(Aip_J|?h8#*UP0^VSpV=NG!GfrF^*51eXjUl{y3(>q4>WA z?RIpJ+@QX2>D!vF2D78 zQyb4_x@lO-Lv!C*jwe23k4^eQXDf=`wgrm!%&lFEdH8o;J~BW()Rgvn-h6~s<<6O$ z=dQL{0K@)`X4}@WN6YTu6wtFKu;%wu1X0H5=>Cjm!{AC`k>xPtCBU(F8>u$BTY)So z{j$lGm#v|y6w{~d7$v$tj#&5hEZT~>nB59SdIUgz2Nd{9WSi(E2LD)@Ps%B6blce2 zHLyFgDd`=Evk8W{QHjl}eQ{7&y5LT}=5yk6K=xI&|v_D4R&au}r~U&tMn1T>o7FWLo41{gqR#H8^T^nqL7Mvplwd} zJsYQMfIdGM=hL2MK1kk=!X5SoKs~54Aaf`;@2mao_@WuxJS0~X2Sh%Qw3yEAW>Ph2XY`Ro8?a|MpG0(>o087Cb3ad%F9=&f z6mitsO(x-qRNS_pm#94nD4m7ckZ-bZ)gY?v!D)-$RfZgyFVk&}#oef7=g;crtSk2b zZnU(flPqbK*L~1iZ`8s_Y*-*s9wT5i_l}$96G5&lTa5r;j4>a04Q_$Ht<3xL82xc4 za{%JRikc`wx2qt;;&3a-gc6oZ67jJb+AUT80MvzK8^+!csZVu2h)0u+x}i4=_(&hb zpaAf%)%4d3VO1IuQG%E6LH_|fUAyTNWOTMN0^PmjX-6Xh51CrS!(_)( zmfw3u`VGy{!ZYu`_jUHVg;Cyz3LLar051-KT%xShq9?EZnN)9*dWD(l)81qc(EI>l zj^6Q-JJ8wuw>;CV(l>pJq!Yc~!jogQzLZ zT?M_hu6C=FJ^qFcsg`rzlZyKo9Bob0mra+&mFO}`^gUHI>+6OVXe>yhndTGU zsFsq8tL|%9&?-DPzmLhP>2UX6$=%BoDp&=bs5xJbZ0u$qm$$uOa&()%wxH_$<-0 zT=lEK;4`>umzq>>fZ|^VgC8s-+R4)hr^u(|T0o8)_9VvwMZ}q0XVZSdJL^F<=6CHD zW`#1O+EldF%t-k_MOHR6#0sw$Ywtb&C#kGpKAe7j5Vi39>LqEX+TDw>dy;@d@kB0i z^z~)e*)=aZ3wT8R&?imjP)Uf4@}3F^F6rVL6eVT31=9K8iD(Mi5PAT!j1#J!7Pq{d zUV8(dD*ufNEdOCsH9fhVye}nJ=}A!KchZ_n&m6YzH=ad%6c2sPhyydFq>p046Iyam zssFDb498e5Q+Clfz!|{|xS;Z3Q=tTEe61VnS=Ei@~PXG_x5ezdW`q!&Jiu;B;G9dvp=sv8Rlbs5TAecs}$=h*LwX zD8BW9hbYb__Z9yC1p_^rql2gs1T(2?x?lR{l`0IG=G6#{T{|oq=sO;O9dd*NlffaF z$%xq}R%AzapB>sLj@{fT^KxPec@zGH@R-h3oMUmTU zv;oiEQ-U(obW9WNm(F3-)ZYbNm~!&(LxACPIZqU&i1fjI#lsvQqCF`wAvI=-T(K#e z@gg7ssbW}`FIONg@tB9mk__`XsrfYwO;Wc*Fy}E>&}z~@W%NnQZXf@EirD|;$Cu653bQ8SMD3^0|m8E!G49&{10j)0r z@d)HAWk1}ioz3QFjA>G8NH>uzD zU@G|KU_2cM8u)qsG;s4dbSf8j%3t03uyVu}=#cO%O_?9*VH9hRx}tpjMKmq8z>p7L z?hE%>7>~Su2F)&@zuRUAC%pRs{&x?1E+U%bH`BK5&{|pHk&3fe z`$t%LTP>!?H?vf-hT=2{DBJX&X z8I3B&h?_sNP8@%+4ExgN3M~lkEvDeW=TR2w5gqo=Ud<xvX?{H%N_yUB=EE*j7|*Q;A>)TH|7w}1Xa-oDM`7b6n2GSAL$ zkRa`b+OX;(Af^9)47WZ>lDj&7pBC$@C7@!I7_W30e;ZMcAg>C^m{DNKmL4ELj<;Wo z1Op#2)|98k?Z?aiVdR20tzn@p|H#f03ecn->w!_Gs-$ie7%BtKHVaW=aZyBK#{ZP) zC0qVeevQ@ny&9Ts+=va6Dm`$Yi~sY#jkyeqG8bPuRm(`t%h0n(kM6h(Jy zN4!!A(}0OspUNW0oQfz;{O8NYgf(0(Z`?-woxSfhyZPaKaEA(~30g#asX_O=-we^o zOPkkJub4~NO!zUT^YYuRkD%R;LoY)^X9a}i*y&{~D6DrFkMVrObjWE?I4s%mmQvO%`LqKWvW%2_3Fiph2;Hx*^ z()v~5dUeUgbk_1THjM<``}gl;w;RKD-$2cKj*Bx_KQgR-tF6Xyxme09pRP65t5wPD z_B_V-&#m|@=DN)J|Ei*V8K;g8d*My4(0u{52rf{ka+GXmB5U6pUC>0YI~JGH_|7C8 zlE057AluGYbCSM{x(^{shTB8p@(MCeF4_UydE0&ZcdU5UIL>VSkXEzd^gQvGa#Tg)hCKQpc_`W z3HC|M7&MPHLQr^hZN_-|yiBlJdVjs&;GrT)iV*XBxV6etN|y!XvUlG-Lax8GfzUT* zu2c?(hlh8K%H(vY*H@KEz?5AN!peHGajOtMS=DRL<6*Ooi~?{79c;WpUbsJ_`hhC; zt^PF`mh1;-@CUz-1`i&941-0f<}e}tHXQDuxfb1-q+y@jZ=63_igM9Fm2pbqA6@nZ z6>A0RLhjgEH(TI3jwQ|#2MClZIui^{@n?gZM}<{leTVA3C9`qO)NReXqrrE{2|ac0 z1E`noL<9(kjlEc7|9SH!lpFONYa^?1#1}q}z1H`Qlwj-mwA1TG#eOBOX(xV9JJM$K z&Q81x&E?|w6BnLUh!KB?Y20>P+XZc1lC)Lhj_r|E4^xU}m{w|*TQ9w`3z@2%C8MAB zNdeabz=&I3JSO+^35!{8C`^oMSf&I73)A8NHTV{7$!7F#Z6vZppNAa(2O!(fiQ-iZ zC9b;R05&-xG^a&y?pu#KC@RJp&!z(ZqRWM>rg&0TfWrgq%K*hS5O6~w?W5#AczjHxUE2AoToAaIU%Vn z*KMemhc}I^n%i}fF|ij{_l+BItF{rt0y#1l7&YcWHt2nc5VAwMwwzoc27upYd=WA(qf(-j9eWm{eqEgx4DP}n9Lxpb2CN%HnYKEnq z-d?P-dz#ykYDc7@%A=*CIt(4j@E+; zI9{}=^MV4PE9#|qV{iR#7Us^fY zeE<*JjG>fVSan}%DO}q^S%Ta*o*h2@oIziv0z+ap&sGbl?{Wc4Gg1FyJ!A>{`CT8p zGY{^eVHKDz@(>cvfbi84*-#3bbW)>Qt@_2} zkkNcBLkQW);6J1TSPb!|JIXcXM^XZwJOsR>-uTfgqF)g-9^=6}|5n@EUe=G%ck^5? zS%-0P5PLL0ku*Cy;ja4rva@Edd7V-{91olcVZx|LGZeDPs?EALr9l{O$xL zIFT*fOP4d_HzEH7ubPo|kqNH7mXNh_uNt0Wm1|r%Uk#z^W*NaBaArCs`{%k4a@C!< zPpTr)!q&q4a){nVQu8`)tv0I$yR#jQn~!6ulilP+c4X+D(VI&yT-k#cv($>Ez zHWYN}CKE4)UW&P=y#p~4oSp+;Exb|&zqCOu3rfSzsz}{4YW>n;dsm@np9ty4U7NdV zRSb&pMh`E`!t3#Z@^tDviPZ*d9!2aP)BV0kqylqNH=Sq=(?OWp;EoSyw&*8zY*(O$ z{;QZ9)|Dd1cU_A`iVPm-!KgIrVG1W^%7t$4?y9pty~$S1bsi1r+&t4|HO`2p2?+tR ztVH_xdw)j|lI&8=;PH7Yg2n*%1z<;;#yw?@TMGXmny?;k++xtK=9je7fh`7rrGnRG zf$8j~N*9b=!$q4cQAAc0cf6|svwqQKyoR-p;5y9pgK?WFf!F-W&$uYhBi$#+CjKUT zYqsO<6m%aW?d*qIH$DJeBy(8aaUD(qbIoP-Y`o^xctSjJz!w0fL~3K_9P;zZc;lBBl0lpGiHE5 zk+Pw(mlO(*QI~oU2KJ-57|%2w`4d3sO5dYkOovw)aIrZv`}h$0P@;$m-*7)kf;2S&O#-InJQD z5)T9(n8=tY0~Hh@H}%8;qUpOyqfClXPlVgL+Sa{ys&yxFZ&O`BpA-6LoK zgjIn&DF4Z|eod_c&HF=+yiarT7ZX`kIlY>fl2qC|3Z^%j`~9JtyShxP4GhXEa{zie z7so~V9hI=e}#R>o68 zOO0S|%@tQ04dz#BVnTbggz73yP_RW&J%Y^O9#4T5%mJr7c>PAF`t#jbcJgpXL1ugC z^*7ApeWngCwQlyqgy)_E2K_SC0&{Dye==U5)0QaQtFR$53A)G|+B6Z~#ndF#%{d&h zCU>RvO2pO@J+Qc>urYc5vT(GMrffjO*wSqpskNf6-&Zx<!Ou=$}ICad9R5b#e>9iYD}*C zm4jXr!#k0Ifv;s?l4&ZCGy`Tr}4 zlAt-`?LqZs1Et3As%W|wB_UqPV0!TdRBFz13H9cH3eB6+?4+@VPnlc*-BCNLyhvs` zTsc_?Z&JQ819vo}i|99jNJh(u&RM&sU;U;UVp_=QPa7Y>G)2Ay56bOt|ITr1qFJ=H zJfKCJ=N9l(W`RfPMLGprbCxYVnVTy*t@|Qny_RZw-fV2nBKh0(NVBd|ZHkn0eu)l~ zaLF)k55nZso6gTR!(WHISA1ULT&RxM@25;~e(}BUHdY!N+h2}@TzgI_cvF&Q`suG> zQ#SumitDOD&OLB$qc@$tN?{V7v;4vyjC`(cQ$#G5L>x%A_UJJG89iNNB9u z{?2dow9b}RgjShc7JA+Gl)2%zP<3MO@zDP6tTc|GO7)gSkXd6`>ht!6bygz77YU*0 zL^VXeEYtWNVl`1=wvjGF1?7?zatvzIXbu-oroAH@hS|isA+8+Fc?HP#*tjaB2@QdW z{E%qt^Zk1sv?kvYgVRJRQ_EM~v}6tZP6p*i3k)2$r}NI~w=eT}LC1qc$F+)8%dtc; zvh#PyE7Ezpa7)iA?#CToOdSBCx*n91JDM@}l24Gwe#dBqZeddw2Tdh=$;TaPhzrUj zWzoE71a581>N7L~X#Inqr|+nleW~(1=m)yo$e_=w{Od^bn&I}nMGfYz{{ZP|*um%% z^|1$Uqtg@wNVd5__#)@gmRxL?$6L<-0JzX~ztaot?64D_14SB+s^ygsrxbi}Pa6*x zKy1JUKQtVhC~G5UzwoEfSm&mp%JmrpwA%F#spJdL&V-bj=ULgC1!$2qO=9`!wj$g0BV0&MKsaU6vv$T1_giAXqapEO6$lKkP7mBJ3)2hY&p*H4smpWM81uoHW7Ur3~hMxDm)TcXTKp^jPqNZcW!ht*OV z>7R2n$n}sD-V;v;$LzdXPJ-7YR_A6As3jBUrIDkuV<)=*x>5AB)QwyhOg{o&nN~mi zr~6v@?m!bYe7VG$nIyj+e(`@IXvCFrkW2~sWR5B3(S>S96Ry$D&hOwHEJRSgCiHFD% zh_A-mmmciU`a)ol$WVMaOhKXVlYs-CyE@{e-*;E7g~_8h-YicQGT(&gwDhM3oikTO z%l$yD+k{{Sp;7LJrvpC`W{Iur2^l26?P*~ejTd)N+IfX_Qfwd|`|m4_jemZP`sCph4pY~Mise$=Ld7*Q9= z-v@6_^8I|zpo0cL=r=!*Ra1L-_;qrwVSKX z<&k<>m0A&bs{OVpepZu~13Kf-(c<<9dlK3Y-cQ!W-v~cU!n^Qui>csiR~;rD$dqj_ zj+PJmv{rWB%q`loxP-jHaZYSdQo@E3nkTV@@TBbtZNAU?CB_Yv$zv__P1?`JXhmb) zwB*KLDBWjGoGoT&IS3co9cI7>rTIqJyRX{*MaD3P51T zl~H~#hbP6e;ddEa+V-{QA2(DQlj9z<&h7dT9S8|vtA+dz5JfyR`pKM_%dOqwo+ze; z#5Xva07c;WZ{2!hr5=XjI-qH?QKFew?_d7l%e1nc^$~cec<`7LN5d6c@XpKik zWckL>i#BQpQc=*FHoR8LvrUT|mmEtKM1%OSq<8AL_L&GzTvGa+2PLJ}4ov!Lww<*rn08Z@z#?N0|o0PkAp6QMJQ4(gi z%sugt^}nl4hZXz8kgU&uTOuKknY={_dxalkm^b#(kQXC3kL9Dqwb&o+EI+@f%-fdP z$u{gb5k3v#`H)woCKGkOBX2{*%E!JXU5tbfwi zW;dbi2>~>@KGgK9lo!&{JNqF=S5PAz|5J5zOZ-+eB^e>KrFwVrQQeP_x9nu23d15$ z&BdeRFRGB}P808|-y5;<*}?BG^qa#)<(C-8hZx7yz+UY2Jv-VmVVH$-uD$w{DzEsJ z#y7V;rp-=4&CsC+TLYzl-*dfW_!|je^X%XPH6A%JYdh;tiEBx@?$6X0Gb4l}A3nE& zCs{P6rGdZMvHKAYPrs)4$b4tA{ctx$rij;-eL2}LoCy2z=DTNtGih=jjj;>lU(=}8 z(lgeiYTRH1sr6)L{|Q-pCE(kKNp0G*YjtR9YIQV?>tBjV#{pds;G+!#Tv&OI_8`Wy z3~HHV2b)L~6UDCajmJ(}JWLr_WM+KxFdlLfu)nUlxuJvlSo_uaS)ZnX5fE4iI6f(j zt&o^O@CPsfJfnr`RaupcBXZpmX%$FFV7fLjSE^nZ+Zzs})321j?PRr1)%ukZTzoda zzrhy?nwZG_%@F8{=Az9Y@z~W%ky)x`88&sfY5j9FmhSO%z=ZBxQMCpSBh($^=os0o zW=7>my;w%X7HI9v2>I8Q8ZYO;+V*SO;+350KrhrB0a;5JZ3Ai7lZ(9t|DxRj_$|hg z(?K@3jb-}2@bITNDcarun4=*$5Zs2t5ks^8B6#WJpVEifJ!!rfP|0}+3!2Z8{USVc z;&*OOW#otF4>Y{<9+kZYMkevZmc`wawbNcp1d#2|#T-FA(anac2J;_yq~5TltPaW@ z&h5z>l6pCZ0Yb;`I=M84k`@Zo z&GUCJb&fgwu9^2=+9uvkPAdl_sVE}jd#)L;8Cp>BP~dH& z<~`Odft#k?IUqSe%U0DIxL-sXZ}xGW;ud{x>_53$u0z0b{G9*3W;{Iyh0E;1s!M2U zQg$=ZhcZIU$-^6ZtFAQtYAw8#Mv)hLZrO~00JhKFlg7)Xu36AgtI@<=av!$bEFMNN zO!jnV7k<^ZqGMD(@v_i`U{Z?{USQXnE)t2XgE zEu49wgR8a2&}rCG|Ca)nYsm9nW8q3hlJ0H|9PqVuy`htkaD2r?TyB!`&LmJkYD0^{eLb5n@ z2j6sFJ~ZvTz-M#A)jvEnOX(8m{Qv$hb82LBi--$iNz$OpG(u7$G2dn01V7SgQf>lt z^x?If;>Gm~`TRNQ__iMI#Y~+)Tb%c)Np}@VcgDf6SOT0jyU#H9g!W9`dRjiJehQL* zXhKMOr|TC>DA~kSyk6I;6Y~wbN2Y&-kOp5vUFxATyq#3bW9>mX2Fy#`K3D6GA+ z8hUPdWMvsxxh$V^V-1Beaz`C%XFJd=#bOTNrU%MbrqX-zJJl<8*s1e*fPBO^1B~Q> z=s2r>X$_Z*xWGnI0R-bXC)=qayqnnc8!oKH2ntu{k8;R!`4&C;Vw4p`j6?Ugk;pvv z$vuzw)kqz|LvJ7s6P%3X^MEt_s>CueOuO!8=uZWYem|{fpHwT7>}{bWISZ4tjHqn> zp7kVih~zHLHV>8Gpg27Tw@Qd0bwzLsK61~~a6Auj_2#CAZO056MEk{X2H&Zzd4aM> z5CI&BrTnQsc-hFv>-cllrHMXeal3M{V9NOgdFVR##wr+C$uJh`rvQ*ZQ5!3cV=R&IR(C4pI$m}ds2L^yY_)2F=Ms53}A8JBAg#*-aA5Yc;s~F>z=gk#5xF@ z$O|wV8FvO5#~lIBf9p*#B8`s3DO@ovf*U*%KOWSwugXQq8{KymEL$TuAbRxtGe^u+ zzsf{?2=CZ^dr@!)D6?)1`#~{)M_hIMDY5`u2?`b`o!kL|+tz@1D{@m34t9(Kjyca9 zpTyJW%!ti!PQW+=2e9FPE_>CDj1dNiWaOzIA!CgCpQrVtfE6G~wN#QrdYt5g?N34s z#Z{S`Y1^>i0($(2z9=hS2Jr6l~XAqlhP8To+q z=iY??g4rq#1A)*E-o*VqX;TloDCj}R+IRpS-{U|@q#__ojJtFswm$9;Oy{OL=7m58 z=|Uuck^_y{U~&2LntG!~%JB&c;E-Fl9Q}K7O^P)Up^WYF`ty=ct`Be4fhiymhhe?^ z#!^Ini~j)DBvaf6ky%g%`=GL5uhe=_p(Z7r1{h^Ku-^6zG*%u;4o9c1BKD zt})-WFdw@IVZc_#O85T&4tvyTCfSZ-U6SE4zvuIzrO5eFR~+LxBkAkUAO z1Cj?B&QH+e^Pra4m@-Ptsz~)6Pi#^q!72-o0U(k&^b#-MJC#dJ9M|0~+vf;|RZWsyx{x11A>yKX4rc$6Xs7>URIl;#q zk?4C;tR_WNQa*fb1Y_~~bBaya1PkUw!NRiOpup+RUOg#4)+}CD14+1KE&_kG$32B8 zMpQ0@KbSJ0@sraZUw-sHb1Uv|P1*a$JoD*Gm<191%wi~?-^VBFKR>MnL}*n2VhH=a zSC8e-;X^1n*uN=kj^(-FM}+J4nW<8Y+;;mdBIV;XvY}u z)}E*kWXrv{>_!Om^c4~=SOsmYSm2&8d*}I6)tP_}ttUM}<+$hvaZ}DmFsh+8jI@FJ z@5m#sBirA-5<(+PD&Pgiax%kr86W4R5vwtatdF~lHv|Fe+xgP0dB@qnJHA(9Ib)Bz z{VJmF2o*}mNOWTx0!ZzF)6{028ml6W#ALFuL7b9v!KN`TfWW^eUItFn*Pit7L}|O` z+kpFl`9~dpDx$A&-lbV&W&w(}F_N6}58;lK!<%I%aKLZkJODY|2dzFcG|X04E%Kf- zpT|D9Kb@c1Hc5G$M8J| zN^`q2Hhz8F5wrpi`N5{L8Mp2mo3ST_BiGPSq$I>2F^4U<oQpeD@AviV|s?aZu@u zk(}ornW2@Ua3ppl95+DQeF-0r)}F z3-kw3A=(Der|z5%G0^^9ed!fjAVrPL!C6X>2OSCR{b}+sGI@$wqi?!SF~?EUo@gKk zMe|-joHK6uj(c&}9E^T6t}!qKtagA@Y(ck?-}CmSNMwRGEDjuXA1?&-&(!p%D;VQW z0YzQuo=80N_*0{hy0#mB-UdB7 zW}1I_yMRf~201uBwIcauVq?xR_jh0+^v|X!70AqhM<8byBZeQsM^b$S5`3r>pdjs& z48#}g4nL(h0pypM=eP%rqyGTa)7p~?nGB8(T)*Bq_4Mh|lXeE|IiMT=0CZ3?gTX&| zV;IM#KOVH$oqkU&s73ikLC77(d;3zXXUz*LgOv-%V0(UMf%BGJe6gICJw|&U#*Sfg z0^1qlRgkNdILeNk@N-KfN(z-L-#IyE9r|<>G+1d-0nPvoyoO?XAIpjnn-Uk1iDAY7 zTwvoT_4?7w9K%5fRh3uR0U;Ue&5zR_ z$J&KHXl=|v#&S;pj(P3CsczzK;jrPJL@cG$9E@O&#}txA1ZN&%mHrL*W9+|5a-HWO z3^)KB<2dAG(JO*kin0<2A&B`-dzwNVie7NgkT7t}1~N~-e@bevoa7l@aOa!`!Rv#c z#-0fP@zF;FV<+GAq#UkfE>sR*fPW9iv7iJjsUwNZZ7IX&Ip5D8N+y6t?Z(p~z;5K9 zdR7H)2?ykG11KH3@_LF@AsC|*$;UnW@%|!!BWS$W`7q0mlLzl-)7pbJXDSPuJ45Qtkr|LK5o`R?a}l_rUb)PIo0RKx4t& z%fTa@pYzQuO!G)d0I|tZoDzGFud(A9q{7V#F;!*2!-0(FkMJ0w$V_vA6ux7S!yASU ze*=!Di5Qsk7+^39HysZ_j{NaQlCb{(tc>6Tou>c*Mn}|Ass$^!D>9MO*N*Ia(ggkH2q@up zk=KrZ0qdOeK&@eBe<-wyrJd09Im+}P4_|tFsgQo@vT?$mLken=tnUcflgJ#Co)0J2 z`cssm2?@zVv?~V2aC`fE(@w=H3nBf$Z!2yN)n(vg`DdC^P@<9M02`2*IsARPQaJ9F#b=}tI~Mcjmv4n}_Ot`AOgS+>zcdD;OC8Jvztz#RAX$9kDmL4hkU z4g5t<&7Ab~^`wY|+Od@ZTXHv0#2zqv{VAaNKoZU$_?IMu-=9qTQUF34EQgSZI6zJm z5IM-D`CeV>&N2eAR^hSR^XC-j90iEDWoA>8k&JWt{xpYltf%g>0(02@AJ&W52Dvb- zW7m;^%&=^HKYp1 z0eK1(l5vy9Pt*C)dw}I3Wg;RlK3oCF8Rzw+C3kFKz&jnh<-UXRq>zUN_JGB3g`2O} z)RK4|u}y`E5riX*1Uq_T*ZaPi^{cWIW7VC4ozcj+ML7^Zx(@g9U>F&ePNI zqD!TBc8xZI!)WSM=by(sQ+&XIvyi}*E&WHQTw~gjL3B8{K!LEk_}l0+>D#3+g;|QU zVE`nt2OI;QO%h}@k0X(=^Ue?d0IQmQK#fXp8MYIQk?Z(Rpu$Wg!tpgntkkxLrou;H>!NiCe7`1PX5Ie`i~GCRfx z-pUMu4^xBFr6}6bZFCq?7kAyyx%TPDYHsrEcWnTVm=VJcoSwp*k_g?EFk@rT@tk8h zKZyEKWIkcaRi_yRU5Cs^DhM2XN%W8rC>wwa=i3C+&^+<(RmcNz0A~X{RB}kOKz8kM8;zv$0qu`Zr2-x~ zk%-*xhq=xVATD~4JJJ{ns3UnOpfLj;{{ZAui7s5s&6FdPgSd3b_RkrnG1z1b0ScQ* z$K4p?>67@-1Jex3V`eI(?NSLC2dDo4TBC)DZ=_v=#b#o2AS<8UP4F8~(& z`_o<60-tonjNsz~wtqS=U{|o5?T!hc29#EI ziQfTmz=Ms%pVRBpwJBpUWsWq3O7cm`>w`{{T;|Jz2>fV{bSJ z8=wQPKAHUSROAGHQhB3ndjc?G#f~}-p1;nLMvWUXYyq;w6P@GN`BI7esM1B{lx{yU z#yjWJ{3=2`nUqLdcI1b(!> zVe=e25UMaAI5^HZ0;7zA@q#ghE&w=UN#{PIkOY`SAUc-sxo}1YW8aEZj7hW{N#AOZ zZ|UBh8+^#^f+8ihb=#ij)|N&DbyQ|m+;NTL)OvkAC;>K)CPkJ-ja-s2bGP3V#KdUj z*rss9BLkkfJ;f|%$+#f`1!f!(-v_VcbNEy6Az>1ehjLgG!Sp`Hs^uwYF`LW4Qn(_9umL-p(L%_XRYIwXO-=459dc}dG-AF21HxCtgojp-iTs-8f`IX$TYY+1LK4Yau| zatQwb_4KL9+^dCUDe~h#HgTLBbUE!v2vM1&aun?2Y0fkB^*jo9nT2p!O0Wbnosj^dlX!OXRF@OW4kOGR;{$kesS$Seuuvl2IB)6~?vgrV9FfIL&56l&MmY-DBw&tlp2So$58n-p zz=u0Q8E%<5AD;%D?XVF@H$%BR(}pT?Hi6TRVogBnBvFqydxYQ?8Eg)N>(A*{Wdu3P zD+w1P2N+-KD!axvGbYq%fXg0n&N=@8J!+G=Nfa(^io|0jK33;x19AL%jPqF6R^!fc z=wZxiha6)W_) z)68thq%we@unV*tZpWzOKDg;!9-V3BLJ7We6s|fqeo>*jc z4ewg|bYewkQ0!02qdzdn;YV&c=BJsFdyq?O9j>(ziccl)S?p_j~xSy(Cgh<*q@=dk{? zY#Am<)j>H0dKM?Qx%{e2Sw3$lusj?A%Sd|Db&OGKnHFwb0L2h@rW zmPvF?nc+9*CAj4G_svHW5EUVbO5+D0?f@L)tw;;1l^=0>WqbEpV;z zJAc5qKGZA*c?-(BI0P5#kFGiG)7F#am7|UKFVDS!#(j7`qmj)uQJzNtWQ>4>a=GMl z+M0G1{J}!KlNmD+cia;`{=K>UDgIBHGAt@dkmGU;ag35l=XO7(A~MS(sR5Ix2k##E z?eFyzp(K)Jjy7h%+!S%1Go1DvI@P97mh1#!V_-($3p(}3ucb!Nd5&F|A)kObBoc9s z!#JnPe85D+j=PYY4368ryyBm^ndNAKNf_Ygs$;09b|H+7F#YU=Ngz2qWDH>Q+y4Nq z%^PqOqcS@VNX{7a`AO!_DG}sSd#<|yz{|9j)#tv=OtohJL6>oCBEul;F11& z(RL=Z8w>+!Qb-$iuGS;#^*ujYjK1cO+lew$<-jLzZk@sO#ZNx;#z4+~eXWDkecXRq zY}4#--kbo$ke@F-G3;?g*&{AhP>t&BpK(lm@-i`wJ0Hr3{{V9dNL5)5Tu4-41KS6o z{*>8d%7j!^X>!aPjmNeJL4lejocSmbS;S~r-M;K#oMDHqGt;F+-hkK$@Bxx1c+Pf( gkRb<-Nj-D=QBXNXW9E#KdZETZ{{SM2%IwJh*|4{J?*IS* literal 0 HcmV?d00001 From 5738f0cfb75bac61ebd984d31a430018ad705c03 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 24 Jul 2012 13:49:19 -0500 Subject: [PATCH 159/695] Added an experimental glass sphere filter. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 15 ++++- framework/GPUImage.xcodeproj/project.pbxproj | 8 +++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageGlassSphereFilter.h | 5 ++ framework/Source/GPUImageGlassSphereFilter.m | 61 +++++++++++++++++++ .../Source/GPUImageSphereRefractionFilter.m | 10 +++ 8 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageGlassSphereFilter.h create mode 100644 framework/Source/GPUImageGlassSphereFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 0cab080f0..9c7f2ffca 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -107,6 +107,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SWIRL: cell.textLabel.text = @"Swirl"; break; case GPUIMAGE_BULGE: cell.textLabel.text = @"Bulge"; break; case GPUIMAGE_SPHEREREFRACTION: cell.textLabel.text = @"Sphere refraction"; break; + case GPUIMAGE_GLASSSPHERE: cell.textLabel.text = @"Glass sphere"; break; case GPUIMAGE_PINCH: cell.textLabel.text = @"Pinch"; break; case GPUIMAGE_STRETCH: cell.textLabel.text = @"Stretch"; break; case GPUIMAGE_DILATION: cell.textLabel.text = @"Dilation"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 7033287cb..8536cc9a8 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -57,6 +57,7 @@ typedef enum { GPUIMAGE_BULGE, GPUIMAGE_PINCH, GPUIMAGE_SPHEREREFRACTION, + GPUIMAGE_GLASSSPHERE, GPUIMAGE_STRETCH, GPUIMAGE_DILATION, GPUIMAGE_EROSION, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 867f59111..2ab51e21c 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -564,6 +564,18 @@ - (void)setupFilter; filter = [[GPUImageSphereRefractionFilter alloc] init]; [(GPUImageSphereRefractionFilter *)filter setRadius:0.15]; }; break; + case GPUIMAGE_GLASSSPHERE: + { + self.title = @"Glass Sphere"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.15]; + + filter = [[GPUImageGlassSphereFilter alloc] init]; + [(GPUImageGlassSphereFilter *)filter setRadius:0.15]; + }; break; case GPUIMAGE_PINCH: { self.title = @"Pinch"; @@ -1055,7 +1067,7 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } - else if (filterType == GPUIMAGE_SPHEREREFRACTION) + else if ( (filterType == GPUIMAGE_SPHEREREFRACTION) || (filterType == GPUIMAGE_GLASSSPHERE) ) { // Provide a blurred image for a cool-looking background GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; @@ -1122,6 +1134,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_SPHEREREFRACTION: [(GPUImageSphereRefractionFilter *)filter setRadius:[(UISlider *)sender value]]; break; + case GPUIMAGE_GLASSSPHERE: [(GPUImageGlassSphereFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_TONECURVE: [(GPUImageToneCurveFilter *)filter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, [(UISlider *)sender value])], [NSValue valueWithCGPoint:CGPointMake(1.0, 0.75)], nil]]; break; case GPUIMAGE_HIGHLIGHTSHADOW: [(GPUImageHighlightShadowFilter *)filter setHighlights:[(UISlider *)sender value]]; break; case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 4e01b831d..6ad3830f3 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -35,6 +35,8 @@ 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; + BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; }; + BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */; }; BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; }; BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */; }; BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; }; @@ -299,6 +301,8 @@ 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMaskFilter.m; path = Source/GPUImageMaskFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; + BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGlassSphereFilter.h; path = Source/GPUImageGlassSphereFilter.h; sourceTree = SOURCE_ROOT; }; + BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGlassSphereFilter.m; path = Source/GPUImageGlassSphereFilter.m; sourceTree = SOURCE_ROOT; }; BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMedianFilter.h; path = Source/GPUImageMedianFilter.h; sourceTree = SOURCE_ROOT; }; BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMedianFilter.m; path = Source/GPUImageMedianFilter.m; sourceTree = SOURCE_ROOT; }; BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage3x3TextureSamplingFilter.h; path = Source/GPUImage3x3TextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; @@ -689,6 +693,8 @@ BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */, BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */, BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */, + BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */, + BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */, BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */, BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */, 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */, @@ -1047,6 +1053,7 @@ BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */, BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */, C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */, + BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1278,6 +1285,7 @@ BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */, BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */, C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */, + BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 0840ea08d..bdc9c8158 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -109,3 +109,4 @@ #import "GPUImageHighlightShadowFilter.h" #import "GPUImageFalseColorFilter.h" #import "GPUImageHueFilter.h" +#import "GPUImageGlassSphereFilter.h" diff --git a/framework/Source/GPUImageGlassSphereFilter.h b/framework/Source/GPUImageGlassSphereFilter.h new file mode 100644 index 000000000..809a4ee86 --- /dev/null +++ b/framework/Source/GPUImageGlassSphereFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageSphereRefractionFilter.h" + +@interface GPUImageGlassSphereFilter : GPUImageSphereRefractionFilter + +@end diff --git a/framework/Source/GPUImageGlassSphereFilter.m b/framework/Source/GPUImageGlassSphereFilter.m new file mode 100644 index 000000000..6fe4446b9 --- /dev/null +++ b/framework/Source/GPUImageGlassSphereFilter.m @@ -0,0 +1,61 @@ +#import "GPUImageGlassSphereFilter.h" + +NSString *const kGPUImageGlassSphereFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform highp vec2 center; + uniform highp float radius; + uniform highp float aspectRatio; + uniform highp float refractiveIndex; +// uniform vec3 lightPosition; + const highp vec3 lightPosition = vec3(-0.5, 0.5, 1.0); + const highp vec3 ambientLightPosition = vec3(0.0, 0.0, 1.0); + + void main() + { + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float distanceFromCenter = distance(center, textureCoordinateToUse); + lowp float checkForPresenceWithinSphere = step(distanceFromCenter, radius); + + distanceFromCenter = distanceFromCenter / radius; + + highp float normalizedDepth = radius * sqrt(1.0 - distanceFromCenter * distanceFromCenter); + highp vec3 sphereNormal = normalize(vec3(textureCoordinateToUse - center, normalizedDepth)); + + highp vec3 refractedVector = 2.0 * refract(vec3(0.0, 0.0, -1.0), sphereNormal, refractiveIndex); + refractedVector.xy = -refractedVector.xy; + + highp vec3 finalSphereColor = texture2D(inputImageTexture, (refractedVector.xy + 1.0) * 0.5).rgb; + + // Grazing angle lighting + highp float lightingIntensity = 2.5 * (1.0 - pow(clamp(dot(ambientLightPosition, sphereNormal), 0.0, 1.0), 0.25)); + finalSphereColor += lightingIntensity; + + // Specular lighting + lightingIntensity = clamp(dot(normalize(lightPosition), sphereNormal), 0.0, 1.0); + lightingIntensity = pow(lightingIntensity, 15.0); + finalSphereColor += vec3(0.8, 0.8, 0.8) * lightingIntensity; + + gl_FragColor = vec4(finalSphereColor, 1.0) * checkForPresenceWithinSphere; + } + ); + +@implementation GPUImageGlassSphereFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageGlassSphereFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index 079fcee00..4db7a5f78 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -52,6 +52,16 @@ - (id)init; return nil; } + return self; +} + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithFragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + radiusUniform = [filterProgram uniformIndex:@"radius"]; aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; centerUniform = [filterProgram uniformIndex:@"center"]; From 0361708a027c09259de5d3f72fbd6fc92a87895c Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 24 Jul 2012 21:23:05 -0500 Subject: [PATCH 160/695] Remove CIDetector from GPUImage, add to Filter Showcase. --- .../ShowcaseFilterViewController.h | 7 +- .../ShowcaseFilterViewController.m | 199 +++++++++++++----- framework/GPUImage.xcodeproj/project.pbxproj | 4 - framework/Source/GPUImageVideoCamera.h | 19 +- framework/Source/GPUImageVideoCamera.m | 102 +-------- 5 files changed, 164 insertions(+), 167 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 952587841..732789d5a 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -97,16 +97,19 @@ typedef enum { GPUImageFilterPipeline *pipeline; UIView* faceView; + CIDetector*faceDetector; + IBOutlet UISwitch *facesSwitch; __unsafe_unretained UISlider *_filterSettingsSlider; + BOOL faceThinking; } @property(readwrite, unsafe_unretained, nonatomic) IBOutlet UISlider *filterSettingsSlider; - +@property(nonatomic,retain) CIDetector*faceDetector; // Initialization and teardown - (id)initWithFilterType:(GPUImageShowcaseFilterType)newFilterType; - (void)setupFilter; - +- (void)hookForFaces:(CMSampleBufferRef)sampleBuffer; // Filter adjustments - (IBAction)updateFilterFromSlider:(id)sender; - (void)GPUVCWillOutputFeatures:(NSArray*)featureArray forClap:(CGRect)clap diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index fdaa2015b..7b525d6f0 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1,7 +1,8 @@ #import "ShowcaseFilterViewController.h" +#import @implementation ShowcaseFilterViewController - +@synthesize faceDetector; #pragma mark - #pragma mark Initialization and teardown @@ -26,7 +27,10 @@ - (void)viewDidLoad { [super viewDidLoad]; - [self setupFilter]; + NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil]; + self.faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; + faceThinking = NO; + [self setupFilter]; } - (void)viewWillDisappear:(BOOL)animated @@ -893,7 +897,6 @@ - (void)setupFilter; filter = [[GPUImageSaturationFilter alloc] init]; [videoCamera setDelegate:self]; - [videoCamera setWillOutputFeatures:YES]; break; } @@ -1142,76 +1145,166 @@ - (IBAction)updateFilterFromSlider:(id)sender; } #pragma mark - Face Detection Delegate Callback -- (void)GPUVCWillOutputFeatures:(NSArray*)featureArray forClap:(CGRect)clap - andOrientation:(UIDeviceOrientation)curDeviceOrientation -{ - NSLog(@"Did receive array"); +-(void) hookForFaces:(CMSampleBufferRef)sampleBuffer{ + if (!faceThinking) { + CFAllocatorRef allocator = CFAllocatorGetDefault(); + CMSampleBufferRef sbufCopyOut; + CMSampleBufferCreateCopy(allocator,sampleBuffer,&sbufCopyOut); + [self performSelectorInBackground:@selector(grepFacesForSampleBuffer:) withObject:CFBridgingRelease(sbufCopyOut)]; + } +} + +-(void)grepFacesForSampleBuffer:(CMSampleBufferRef)sampleBuffer{ + faceThinking = TRUE; + NSLog(@"Faces thinking"); + CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); + CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate); + CIImage *convertedImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(__bridge NSDictionary *)attachments]; - CGRect previewBox = self.view.frame; + if (attachments) + CFRelease(attachments); + NSDictionary *imageOptions = nil; + UIDeviceOrientation curDeviceOrientation = [[UIDevice currentDevice] orientation]; + int exifOrientation; - if (featureArray == nil && faceView) { - [faceView removeFromSuperview]; - faceView = nil; + /* kCGImagePropertyOrientation values + The intended display orientation of the image. If present, this key is a CFNumber value with the same value as defined + by the TIFF and EXIF specifications -- see enumeration of integer constants. + The value specified where the origin (0,0) of the image is located. If not present, a value of 1 is assumed. + + used when calling featuresInImage: options: The value for this key is an integer NSNumber from 1..8 as found in kCGImagePropertyOrientation. + If present, the detection will be done based on that orientation but the coordinates in the returned features will still be based on those of the image. */ + + enum { + PHOTOS_EXIF_0ROW_TOP_0COL_LEFT = 1, // 1 = 0th row is at the top, and 0th column is on the left (THE DEFAULT). + PHOTOS_EXIF_0ROW_TOP_0COL_RIGHT = 2, // 2 = 0th row is at the top, and 0th column is on the right. + PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT = 3, // 3 = 0th row is at the bottom, and 0th column is on the right. + PHOTOS_EXIF_0ROW_BOTTOM_0COL_LEFT = 4, // 4 = 0th row is at the bottom, and 0th column is on the left. + PHOTOS_EXIF_0ROW_LEFT_0COL_TOP = 5, // 5 = 0th row is on the left, and 0th column is the top. + PHOTOS_EXIF_0ROW_RIGHT_0COL_TOP = 6, // 6 = 0th row is on the right, and 0th column is the top. + PHOTOS_EXIF_0ROW_RIGHT_0COL_BOTTOM = 7, // 7 = 0th row is on the right, and 0th column is the bottom. + PHOTOS_EXIF_0ROW_LEFT_0COL_BOTTOM = 8 // 8 = 0th row is on the left, and 0th column is the bottom. + }; + BOOL isUsingFrontFacingCamera = FALSE; + AVCaptureDevicePosition currentCameraPosition = [videoCamera cameraPosition]; + + if (currentCameraPosition != AVCaptureDevicePositionBack) + { + isUsingFrontFacingCamera = TRUE; } - + + switch (curDeviceOrientation) { + case UIDeviceOrientationPortraitUpsideDown: // Device oriented vertically, home button on the top + exifOrientation = PHOTOS_EXIF_0ROW_LEFT_0COL_BOTTOM; + break; + case UIDeviceOrientationLandscapeLeft: // Device oriented horizontally, home button on the right + if (isUsingFrontFacingCamera) + exifOrientation = PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT; + else + exifOrientation = PHOTOS_EXIF_0ROW_TOP_0COL_LEFT; + break; + case UIDeviceOrientationLandscapeRight: // Device oriented horizontally, home button on the left + if (isUsingFrontFacingCamera) + exifOrientation = PHOTOS_EXIF_0ROW_TOP_0COL_LEFT; + else + exifOrientation = PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT; + break; + case UIDeviceOrientationPortrait: // Device oriented vertically, home button on the bottom + default: + exifOrientation = PHOTOS_EXIF_0ROW_RIGHT_0COL_TOP; + break; + } + + imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:exifOrientation] forKey:CIDetectorImageOrientation]; - for ( CIFaceFeature *faceFeature in featureArray) { - - // find the correct position for the square layer within the previewLayer - // the feature box originates in the bottom left of the video frame. - // (Bottom right if mirroring is turned on) - NSLog(@"%@", NSStringFromCGRect([faceFeature bounds])); + NSLog(@"Face Detector %@", [self.faceDetector description]); + NSLog(@"converted Image %@", [convertedImage description]); + NSArray *features = [self.faceDetector featuresInImage:convertedImage options:imageOptions]; + + + // get the clean aperture + // the clean aperture is a rectangle that defines the portion of the encoded pixel dimensions + // that represents image data valid for display. + CMFormatDescriptionRef fdesc = CMSampleBufferGetFormatDescription(sampleBuffer); + CGRect clap = CMVideoFormatDescriptionGetCleanAperture(fdesc, false /*originIsTopLeft == false*/); + - //Update face bounds for iOS Coordinate System - CGRect faceRect = [faceFeature bounds]; - - // flip preview width and height - CGFloat temp = faceRect.size.width; - faceRect.size.width = faceRect.size.height; - faceRect.size.height = temp; - temp = faceRect.origin.x; - faceRect.origin.x = faceRect.origin.y; - faceRect.origin.y = temp; - // scale coordinates so they fit in the preview box, which may be scaled - CGFloat widthScaleBy = previewBox.size.width / clap.size.height; - CGFloat heightScaleBy = previewBox.size.height / clap.size.width; - faceRect.size.width *= widthScaleBy; - faceRect.size.height *= heightScaleBy; - faceRect.origin.x *= widthScaleBy; - faceRect.origin.y *= heightScaleBy; - - faceRect = CGRectOffset(faceRect, previewBox.origin.x, previewBox.origin.y); - - if (faceView) { + [self GPUVCWillOutputFeatures:features forClap:clap andOrientation:curDeviceOrientation]; + faceThinking = FALSE; + +} + +- (void)GPUVCWillOutputFeatures:(NSArray*)featureArray forClap:(CGRect)clap + andOrientation:(UIDeviceOrientation)curDeviceOrientation +{ + dispatch_async(dispatch_get_main_queue(), ^{ + NSLog(@"Did receive array"); + + CGRect previewBox = self.view.frame; + + if (featureArray == nil && faceView) { [faceView removeFromSuperview]; - faceView = nil; + faceView = nil; } - // create a UIView using the bounds of the face - faceView = [[UIView alloc] initWithFrame:faceRect]; - - // add a border around the newly created UIView - faceView.layer.borderWidth = 1; - faceView.layer.borderColor = [[UIColor redColor] CGColor]; - - // add the new view to create a box around the face - [self.view addSubview:faceView]; - - } + + for ( CIFaceFeature *faceFeature in featureArray) { + + // find the correct position for the square layer within the previewLayer + // the feature box originates in the bottom left of the video frame. + // (Bottom right if mirroring is turned on) + NSLog(@"%@", NSStringFromCGRect([faceFeature bounds])); + + //Update face bounds for iOS Coordinate System + CGRect faceRect = [faceFeature bounds]; + + // flip preview width and height + CGFloat temp = faceRect.size.width; + faceRect.size.width = faceRect.size.height; + faceRect.size.height = temp; + temp = faceRect.origin.x; + faceRect.origin.x = faceRect.origin.y; + faceRect.origin.y = temp; + // scale coordinates so they fit in the preview box, which may be scaled + CGFloat widthScaleBy = previewBox.size.width / clap.size.height; + CGFloat heightScaleBy = previewBox.size.height / clap.size.width; + faceRect.size.width *= widthScaleBy; + faceRect.size.height *= heightScaleBy; + faceRect.origin.x *= widthScaleBy; + faceRect.origin.y *= heightScaleBy; + + faceRect = CGRectOffset(faceRect, previewBox.origin.x, previewBox.origin.y); + + if (faceView) { + [faceView removeFromSuperview]; + faceView = nil; + } + + // create a UIView using the bounds of the face + faceView = [[UIView alloc] initWithFrame:faceRect]; + + // add a border around the newly created UIView + faceView.layer.borderWidth = 1; + faceView.layer.borderColor = [[UIColor redColor] CGColor]; + + // add the new view to create a box around the face + [self.view addSubview:faceView]; + + } + }); } -(IBAction)facesSwitched:(UISwitch*)sender{ if (![sender isOn]) { [videoCamera setDelegate:nil]; - [videoCamera setWillOutputFeatures:NO]; if (faceView) { [faceView removeFromSuperview]; faceView = nil; } }else{ [videoCamera setDelegate:self]; - [videoCamera setWillOutputFeatures:YES]; + } } diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 159a94fc4..6d3560adb 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -23,7 +23,6 @@ /* Begin PBXBuildFile section */ 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; - 6BF3ED5915B5C2CC002F9E9E /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6BF3ED5815B5C2CC002F9E9E /* CoreImage.framework */; }; 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; @@ -280,7 +279,6 @@ 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianSelectiveBlurFilter.m; path = Source/GPUImageGaussianSelectiveBlurFilter.m; sourceTree = SOURCE_ROOT; }; 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVignetteFilter.h; path = Source/GPUImageVignetteFilter.h; sourceTree = SOURCE_ROOT; }; 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVignetteFilter.m; path = Source/GPUImageVignetteFilter.m; sourceTree = SOURCE_ROOT; }; - 6BF3ED5815B5C2CC002F9E9E /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHazeFilter.m; path = Source/GPUImageHazeFilter.m; sourceTree = SOURCE_ROOT; }; 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGrayscaleFilter.h; path = Source/GPUImageGrayscaleFilter.h; sourceTree = SOURCE_ROOT; }; @@ -520,7 +518,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6BF3ED5915B5C2CC002F9E9E /* CoreImage.framework in Frameworks */, BCB5E77914E20BAF00701302 /* CoreMedia.framework in Frameworks */, BCB5E77714E20BA800701302 /* CoreVideo.framework in Frameworks */, BCB5E77514E20B9700701302 /* OpenGLES.framework in Frameworks */, @@ -825,7 +822,6 @@ BCF1A32914DDB1EC00852800 = { isa = PBXGroup; children = ( - 6BF3ED5815B5C2CC002F9E9E /* CoreImage.framework */, BCF1A33914DDB1EC00852800 /* GPUImage */, BCF1A34D14DDB1EC00852800 /* GPUImageTests */, BCF1A33614DDB1EC00852800 /* Frameworks */, diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index fe2536ea4..50cf167e7 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -3,15 +3,12 @@ #import #import "GPUImageOpenGLESContext.h" #import "GPUImageOutput.h" -#import //Delegate Protocal for Face Detection. @protocol GPUImageVideoCameraDelegate @optional -- (void)GPUVCWillOutputFeatures:(NSArray*)featureArray forClap:(CGRect)clap - andOrientation:(UIDeviceOrientation)curDeviceOrientation; - +- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer; @end @@ -32,12 +29,8 @@ BOOL capturePaused; GPUImageRotationMode outputRotation; - - BOOL _willOutputFeatures; - + id _delegate; - - CIDetector *faceDetector; } /// The AVCaptureSession used to capture from the camera @@ -52,16 +45,8 @@ /// This determines the rotation applied to the output image, based on the source material @property(readwrite, nonatomic) UIInterfaceOrientation outputImageOrientation; -// For facial detection. - -// Implement class -(void)GPUVCWillOutputFeatures:(NSArray*)featureArray -// forClap:(CGRect)clap -// andOrientation: (UIDeviceOrientation)curDeviceOrientation; - @property(nonatomic,retain) id delegate; -@property(nonatomic,assign) BOOL willOutputFeatures; - /// @name Initialization and teardown /** Begin a capture session diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 6904a5cac..a738d166e 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -23,8 +23,6 @@ @implementation GPUImageVideoCamera @synthesize inputCamera = _inputCamera; @synthesize runBenchmark = _runBenchmark; @synthesize outputImageOrientation = _outputImageOrientation; - -@synthesize willOutputFeatures = _willOutputFeatures; @synthesize delegate = _delegate; #pragma mark - @@ -47,9 +45,6 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return nil; } - NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil]; - faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; - audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.processingQueue", NULL); _runBenchmark = NO; @@ -395,8 +390,8 @@ - (CGFloat)averageFrameDurationDuringCapture; - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { //This may help keep memory footprint low - @autoreleasepool - { + @autoreleasepool { + //these need to be on the main thread for proper timing __unsafe_unretained id weakSelf = self; if (captureOutput == audioOutput) @@ -407,17 +402,20 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM } else { - if (self.delegate) { - dispatch_async(dispatch_get_main_queue(), ^{ - [weakSelf grepFacesForSampleBuffer:sampleBuffer]; - }); - } runOnMainQueueWithoutDeadlocking(^{ + //Feature Detection Hook. + if (self.delegate) { + [self.delegate willOutputSampleBuffer:sampleBuffer]; + } + [weakSelf processVideoSampleBuffer:sampleBuffer]; + + }); } - } + } + } #pragma mark - @@ -504,82 +502,4 @@ - (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; } } -#pragma mark - Feature Detection --(void)grepFacesForSampleBuffer:(CMSampleBufferRef)sampleBuffer{ - NSLog(@"Faces thinking"); - CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); - CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate); - CIImage *convertedImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(__bridge NSDictionary *)attachments]; - - if (attachments) - CFRelease(attachments); - NSDictionary *imageOptions = nil; - UIDeviceOrientation curDeviceOrientation = [[UIDevice currentDevice] orientation]; - int exifOrientation; - - /* kCGImagePropertyOrientation values - The intended display orientation of the image. If present, this key is a CFNumber value with the same value as defined - by the TIFF and EXIF specifications -- see enumeration of integer constants. - The value specified where the origin (0,0) of the image is located. If not present, a value of 1 is assumed. - - used when calling featuresInImage: options: The value for this key is an integer NSNumber from 1..8 as found in kCGImagePropertyOrientation. - If present, the detection will be done based on that orientation but the coordinates in the returned features will still be based on those of the image. */ - - enum { - PHOTOS_EXIF_0ROW_TOP_0COL_LEFT = 1, // 1 = 0th row is at the top, and 0th column is on the left (THE DEFAULT). - PHOTOS_EXIF_0ROW_TOP_0COL_RIGHT = 2, // 2 = 0th row is at the top, and 0th column is on the right. - PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT = 3, // 3 = 0th row is at the bottom, and 0th column is on the right. - PHOTOS_EXIF_0ROW_BOTTOM_0COL_LEFT = 4, // 4 = 0th row is at the bottom, and 0th column is on the left. - PHOTOS_EXIF_0ROW_LEFT_0COL_TOP = 5, // 5 = 0th row is on the left, and 0th column is the top. - PHOTOS_EXIF_0ROW_RIGHT_0COL_TOP = 6, // 6 = 0th row is on the right, and 0th column is the top. - PHOTOS_EXIF_0ROW_RIGHT_0COL_BOTTOM = 7, // 7 = 0th row is on the right, and 0th column is the bottom. - PHOTOS_EXIF_0ROW_LEFT_0COL_BOTTOM = 8 // 8 = 0th row is on the left, and 0th column is the bottom. - }; - BOOL isUsingFrontFacingCamera = FALSE; - AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - - if (currentCameraPosition != AVCaptureDevicePositionBack) - { - isUsingFrontFacingCamera = TRUE; - } - - switch (curDeviceOrientation) { - case UIDeviceOrientationPortraitUpsideDown: // Device oriented vertically, home button on the top - exifOrientation = PHOTOS_EXIF_0ROW_LEFT_0COL_BOTTOM; - break; - case UIDeviceOrientationLandscapeLeft: // Device oriented horizontally, home button on the right - if (isUsingFrontFacingCamera) - exifOrientation = PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT; - else - exifOrientation = PHOTOS_EXIF_0ROW_TOP_0COL_LEFT; - break; - case UIDeviceOrientationLandscapeRight: // Device oriented horizontally, home button on the left - if (isUsingFrontFacingCamera) - exifOrientation = PHOTOS_EXIF_0ROW_TOP_0COL_LEFT; - else - exifOrientation = PHOTOS_EXIF_0ROW_BOTTOM_0COL_RIGHT; - break; - case UIDeviceOrientationPortrait: // Device oriented vertically, home button on the bottom - default: - exifOrientation = PHOTOS_EXIF_0ROW_RIGHT_0COL_TOP; - break; - } - - imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:exifOrientation] forKey:CIDetectorImageOrientation]; - NSArray *features = [faceDetector featuresInImage:convertedImage options:imageOptions]; - - - // get the clean aperture - // the clean aperture is a rectangle that defines the portion of the encoded pixel dimensions - // that represents image data valid for display. - CMFormatDescriptionRef fdesc = CMSampleBufferGetFormatDescription(sampleBuffer); - CGRect clap = CMVideoFormatDescriptionGetCleanAperture(fdesc, false /*originIsTopLeft == false*/); - - if ([[self delegate] respondsToSelector:@selector(GPUVCWillOutputFeatures:forClap:andOrientation:)]) { - [self.delegate GPUVCWillOutputFeatures:features forClap:clap andOrientation:curDeviceOrientation]; - } - - -} - @end From 11ac41fa0ff48ba48b8092d83b57d2fabc631023 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 24 Jul 2012 21:25:19 -0500 Subject: [PATCH 161/695] May have finally fixed the black frame issue. Fixed the sphere refraction filter that I broke earlier today. --- framework/Source/GPUImageBuffer.m | 7 ++++--- framework/Source/GPUImageFilter.m | 4 ++++ framework/Source/GPUImageJFAVoroniFilter.m | 4 ++++ framework/Source/GPUImageOutput.h | 2 ++ framework/Source/GPUImageOutput.m | 18 +++++++++++++++++- .../Source/GPUImageSphereRefractionFilter.m | 2 +- framework/Source/GPUImageTwoPassFilter.m | 8 ++++++-- 7 files changed, 38 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index e4db8a145..d616e0f0a 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -40,6 +40,8 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; -1.0f, 1.0f, 1.0f, 1.0f, }; + + [self notifyTargetsAboutNewOutputTexture]; // Let the downstream video elements see the previous frame from the buffer before rendering a new one into place [self informTargetsAboutNewFrameAtTime:frameTime]; @@ -98,12 +100,11 @@ - (void)prepareForImageCapture; #pragma mark - #pragma mark Managing targets -- (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; +- (GLuint)textureForOutput; { - [target setInputTexture:[[bufferedTextures objectAtIndex:0] intValue] atIndex:inputTextureIndex]; + return [[bufferedTextures objectAtIndex:0] intValue]; } - #pragma mark - #pragma mark Texture management diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 8a65a3b6b..38065f66a 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -287,12 +287,16 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + + [self notifyTargetsAboutNewOutputTexture]; } else { glBindTexture(GL_TEXTURE_2D, outputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + + [self notifyTargetsAboutNewOutputTexture]; } // NSLog(@"Filter size: %f, %f for filter: %@", currentFBOSize.width, currentFBOSize.height, self); diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m index 24b92959c..e47e9a1a8 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.m +++ b/framework/Source/GPUImageJFAVoroniFilter.m @@ -338,12 +338,16 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + + [self notifyTargetsAboutNewOutputTexture]; } else { glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + + [self notifyTargetsAboutNewOutputTexture]; } GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 8bbe319d2..409ee0701 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -38,6 +38,8 @@ void report_memory(NSString *tag); /// @name Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; +- (GLuint)textureForOutput; +- (void)notifyTargetsAboutNewOutputTexture; /** Returns an array of the current targets. */ diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 8ad6bfa25..10b40d55b 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -83,7 +83,23 @@ - (BOOL)isEnabled { - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; { - [target setInputTexture:outputTexture atIndex:inputTextureIndex]; + [target setInputTexture:[self textureForOutput] atIndex:inputTextureIndex]; +} + +- (GLuint)textureForOutput; +{ + return outputTexture; +} + +- (void)notifyTargetsAboutNewOutputTexture; +{ + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; + } } - (NSArray*)targets; diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index 4db7a5f78..979f9263e 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -47,7 +47,7 @@ @implementation GPUImageSphereRefractionFilter - (id)init; { - if (!(self = [super initWithFragmentShaderFromString:kGPUImageSphereRefractionFragmentShaderString])) + if (!(self = [self initWithFragmentShaderFromString:kGPUImageSphereRefractionFragmentShaderString])) { return nil; } diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 496535cb7..8c24a2cb4 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -60,9 +60,9 @@ - (void)initializeAttributes; #pragma mark - #pragma mark Managing targets -- (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; +- (GLuint)textureForOutput; { - [target setInputTexture:secondFilterOutputTexture atIndex:inputTextureIndex]; + return secondFilterOutputTexture; } #pragma mark - @@ -163,12 +163,16 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + + [self notifyTargetsAboutNewOutputTexture]; } else { glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + + [self notifyTargetsAboutNewOutputTexture]; } GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); From d256c887c42901226c638e932fdab364a081cb05 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 25 Jul 2012 17:03:43 -0500 Subject: [PATCH 162/695] better name for delegate call. --- .../FilterShowcase/ShowcaseFilterViewController.h | 2 +- .../FilterShowcase/ShowcaseFilterViewController.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index ae84d19fc..ac911b999 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -113,7 +113,7 @@ typedef enum { // Initialization and teardown - (id)initWithFilterType:(GPUImageShowcaseFilterType)newFilterType; - (void)setupFilter; -- (void)hookForFaces:(CMSampleBufferRef)sampleBuffer; +- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer; // Filter adjustments - (IBAction)updateFilterFromSlider:(id)sender; - (void)GPUVCWillOutputFeatures:(NSArray*)featureArray forClap:(CGRect)clap diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 60f9cd7e1..34d2647c9 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1189,7 +1189,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; } #pragma mark - Face Detection Delegate Callback --(void) hookForFaces:(CMSampleBufferRef)sampleBuffer{ +-(void) willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer{ if (!faceThinking) { CFAllocatorRef allocator = CFAllocatorGetDefault(); CMSampleBufferRef sbufCopyOut; From f5f70d06f8f9f518fd97f939eddf161dcd37ea1e Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Wed, 25 Jul 2012 18:05:17 -0400 Subject: [PATCH 163/695] Fix for imageByFilteringImage: being influenced by device orientation --- framework/Source/GPUImageFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 38065f66a..94e899927 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -206,7 +206,7 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; [stillImageSource addTarget:self]; [stillImageSource processImage]; - UIImage *processedImage = [self imageFromCurrentlyProcessedOutput]; + UIImage *processedImage = [self imageFromCurrentlyProcessedOutputWithOrientation:[imageToFilter imageOrientation]]; [stillImageSource removeTarget:self]; return processedImage; From 81061586bdd1ea5222b48cc458b2d5e90def913f Mon Sep 17 00:00:00 2001 From: Phil Menni Date: Fri, 27 Jul 2012 19:39:56 +0100 Subject: [PATCH 164/695] extended movie writer to optionally allow the AVAssetWriter fileType & AVAssetWriterInput outputSettings dictionary to be specified on init - movie writer can still be setup & used as before, & the default fileType & outputSettings are used in that case (as set in initializeMovie) - an extended init method was added that can override these settings TODO: if supplying a custom outputSettings dictionary, you currently need to manually specify the AVVideoCodecKey, AVVideoWidthKey & AVVideoHeightKey values. Could look to auto set these if their left empty (or is there any use case were you might want to leave them empty?) --- framework/Source/GPUImageMovieWriter.h | 2 ++ framework/Source/GPUImageMovieWriter.m | 34 ++++++++++++++++++++------ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 4e2891191..890d6dcca 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -18,6 +18,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; CMVideoCodecType videoType; NSURL *movieURL; + NSString *fileType; AVAssetWriter *assetWriter; AVAssetWriterInput *assetWriterAudioInput; AVAssetWriterInput *assetWriterVideoInput; @@ -43,6 +44,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; // Movie recording - (void)startRecording; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 867f90035..53b475cbd 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -36,6 +36,7 @@ @interface GPUImageMovieWriter () // Movie recording - (void)initializeMovie; +- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; // Frame rendering - (void)createDataFBO; @@ -62,6 +63,10 @@ @implementation GPUImageMovieWriter #pragma mark Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; +{ + return [self initWithMovieURL:newMovieURL size:newSize fileType:AVFileTypeQuickTimeMovie outputSettings:nil]; +} +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; { if (!(self = [super init])) { @@ -70,6 +75,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; videoSize = newSize; movieURL = newMovieURL; + fileType = newFileType; startTime = kCMTimeInvalid; _encodingLiveVideo = YES; previousFrameTime = kCMTimeNegativeInfinity; @@ -109,7 +115,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; glEnableVertexAttribArray(colorSwizzlingPositionAttribute); glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); - [self initializeMovie]; + [self initializeMovieWithOutputSettings:outputSettings]; return self; } @@ -128,6 +134,10 @@ - (void)dealloc; #pragma mark Movie recording - (void)initializeMovie; +{ + [self initializeMovieWithOutputSettings:nil]; +} +- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; { isRecording = NO; @@ -135,7 +145,7 @@ - (void)initializeMovie; // frameData = (GLubyte *) calloc(videoSize.width * videoSize.height * 4, sizeof(GLubyte)); NSError *error = nil; - assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:AVFileTypeQuickTimeMovie error:&error]; + assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:fileType error:&error]; if (error != nil) { NSLog(@"Error: %@", error); @@ -155,11 +165,21 @@ - (void)initializeMovie; // Set this to make sure that a functional movie is produced, even if the recording is cut off mid-stream. Only the last second should be lost in that case. assetWriter.movieFragmentInterval = CMTimeMakeWithSeconds(1.0, 1000); - NSMutableDictionary * outputSettings = [[NSMutableDictionary alloc] init]; - [outputSettings setObject:AVVideoCodecH264 forKey:AVVideoCodecKey]; - [outputSettings setObject:[NSNumber numberWithInt:videoSize.width] forKey:AVVideoWidthKey]; - [outputSettings setObject:[NSNumber numberWithInt:videoSize.height] forKey:AVVideoHeightKey]; - + // use default output settings if none specified + if (outputSettings == nil) + { + outputSettings = [[NSMutableDictionary alloc] init]; + [outputSettings setObject:AVVideoCodecH264 forKey:AVVideoCodecKey]; + [outputSettings setObject:[NSNumber numberWithInt:videoSize.width] forKey:AVVideoWidthKey]; + [outputSettings setObject:[NSNumber numberWithInt:videoSize.height] forKey:AVVideoHeightKey]; + } + // custom output settings specified + else + { + // TODO: do we need to check if AVVideoCodecKey, AVVideoWidthKey & AVVideoHeightKey are set, & if not set them here? + // TODO: or is it ok to either ommit them, or rely on the calling code to set those values? + } + /* NSDictionary *videoCleanApertureSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:videoSize.width], AVVideoCleanApertureWidthKey, From b35141ec87861a8b7caaba2331745ef0ff9fb5e3 Mon Sep 17 00:00:00 2001 From: Phil Menni Date: Fri, 27 Jul 2012 20:48:15 +0100 Subject: [PATCH 165/695] exposed the count of filters in a group useful when managing dynamic filter groups (for things like looping through & automatically setting the chain of targets & initial & terminal filters) --- framework/Source/GPUImageFilterGroup.h | 1 + framework/Source/GPUImageFilterGroup.m | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/framework/Source/GPUImageFilterGroup.h b/framework/Source/GPUImageFilterGroup.h index e61736b96..efd104f22 100755 --- a/framework/Source/GPUImageFilterGroup.h +++ b/framework/Source/GPUImageFilterGroup.h @@ -13,5 +13,6 @@ // Filter management - (void)addFilter:(GPUImageOutput *)newFilter; - (GPUImageOutput *)filterAtIndex:(NSUInteger)filterIndex; +- (int)filterCount; @end diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 6958ffa54..7e36e0f23 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -34,6 +34,11 @@ - (void)addFilter:(GPUImageOutput *)newFilter; return [filters objectAtIndex:filterIndex]; } +- (int)filterCount; +{ + return [filters count]; +} + #pragma mark - #pragma mark Still image processing From 019ef2e862a1bdd2d4128c18b8cb9ea3e465a152 Mon Sep 17 00:00:00 2001 From: Lev Zelenskiy Date: Sat, 28 Jul 2012 16:07:49 +1000 Subject: [PATCH 166/695] GPUImageLookupFilter --- framework/GPUImage.xcodeproj/project.pbxproj | 8 +++ framework/Resources/lookup.png | Bin 0 -> 2095 bytes framework/Source/GPUImage.h | 1 + framework/Source/GPUImageLookupFilter.h | 28 ++++++++++ framework/Source/GPUImageLookupFilter.m | 53 +++++++++++++++++++ 5 files changed, 90 insertions(+) create mode 100644 framework/Resources/lookup.png create mode 100644 framework/Source/GPUImageLookupFilter.h create mode 100644 framework/Source/GPUImageLookupFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 6ad3830f3..c27e99ab8 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -33,6 +33,8 @@ 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; }; 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; + 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; }; + 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; }; @@ -299,6 +301,8 @@ 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSubtractBlendFilter.m; path = Source/GPUImageSubtractBlendFilter.m; sourceTree = SOURCE_ROOT; }; 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMaskFilter.h; path = Source/GPUImageMaskFilter.h; sourceTree = SOURCE_ROOT; }; 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMaskFilter.m; path = Source/GPUImageMaskFilter.m; sourceTree = SOURCE_ROOT; }; + 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLookupFilter.h; path = Source/GPUImageLookupFilter.h; sourceTree = SOURCE_ROOT; }; + 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLookupFilter.m; path = Source/GPUImageLookupFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGlassSphereFilter.h; path = Source/GPUImageGlassSphereFilter.h; sourceTree = SOURCE_ROOT; }; @@ -575,6 +579,8 @@ children = ( BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */, BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */, + 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */, + 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */, BCB6B833150400030041703B /* GPUImageExposureFilter.h */, BCB6B834150400030041703B /* GPUImageExposureFilter.m */, BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */, @@ -1054,6 +1060,7 @@ BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */, C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */, BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */, + 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1286,6 +1293,7 @@ BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */, C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */, BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */, + 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Resources/lookup.png b/framework/Resources/lookup.png new file mode 100644 index 0000000000000000000000000000000000000000..ed814dfbb648c1f43d737c302f94aa8ca04c27e9 GIT binary patch literal 2095 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&t&wwUqN(AjMqlVtXr>wlMb-ud_Qw*BjO ze~Hm~{lB_BgMA?*g9|5v!xRR}DEEhqi(+tvF~0D}kb4?f(V!tt*hO=GD0;j2 znSYTWPfsGk_H$Ls)ENv8vf{}B7%_k|ugJBscNEbzy_8=2=a*mc@>|nQ`_n*A`x9aN zmB{m7SQylHP?rCo*_YUCNX7JW?$-Q=ocVX-41TABJnczDYPEVja~{J179uhY5jnk5 zL{8xpUDL~z$lt~`57*x2PW!*+_V@e$V)eGy|0{oAPB^7q+4;}@B;$`xA~FIIMKY1u zkeEt>$co_An!j`JeYo_Nbu+L8+x%w!6JiR1c`rE`d GPUImageGaussianBlurFilter -> color_balance_lookup_2.png +// 2) Use you new lookup.png file as a second input for GPUImageLookupFilter. + +// See GPUImageAmatorkaFilter, GPUImageMissEtikateFilter, and GPUImageSoftEleganceFilter for example. + +// Additional Info: +// Lookup texture is organised as 8x8 quads of 64x64 pixels representing all possible RGB colors: +//for (int by = 0; by < 8; by++) { +// for (int bx = 0; bx < 8; bx++) { +// for (int g = 0; g < 64; g++) { +// for (int r = 0; r < 64; r++) { +// image.setPixel(r + bx * 64, g + by * 64, qRgb((int)(r * 255.0 / 63.0 + 0.5), +// (int)(g * 255.0 / 63.0 + 0.5), +// (int)((bx + by * 8.0) * 255.0 / 63.0 + 0.5))); +// } +// } +// } +//} + +@end diff --git a/framework/Source/GPUImageLookupFilter.m b/framework/Source/GPUImageLookupFilter.m new file mode 100644 index 000000000..cdab242ad --- /dev/null +++ b/framework/Source/GPUImageLookupFilter.m @@ -0,0 +1,53 @@ +#import "GPUImageLookupFilter.h" + +NSString *const kGPUImageLookupFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; // TODO: This is not used + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; // lookup texture + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + mediump float blueColor = textureColor.b * 63.0; + + mediump vec2 quad1; + quad1.y = floor(floor(blueColor) / 8.0); + quad1.x = floor(blueColor) - (quad1.y * 8.0); + + mediump vec2 quad2; + quad2.y = floor(ceil(blueColor) / 8.0); + quad2.x = ceil(blueColor) - (quad2.y * 8.0); + + highp vec2 texPos1; + texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); + texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); + + highp vec2 texPos2; + texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); + texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); + + lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1); + lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2); + + lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor)); + gl_FragColor = vec4(newColor.rgb, textureColor.w); + } +); + +@implementation GPUImageLookupFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageLookupFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end From e6057f93d9a14f57db7b6c6c5e467b3881dcea65 Mon Sep 17 00:00:00 2001 From: Lev Zelenskiy Date: Sat, 28 Jul 2012 15:48:53 +1000 Subject: [PATCH 167/695] Added a few effect filters based on GPUImageLookupFilter --- framework/GPUImage.xcodeproj/project.pbxproj | 24 +++++++++ framework/Resources/lookup_amatorka.png | Bin 0 -> 36390 bytes framework/Resources/lookup_miss_etikate.png | Bin 0 -> 202596 bytes .../Resources/lookup_soft_elegance_1.png | Bin 0 -> 129208 bytes .../Resources/lookup_soft_elegance_2.png | Bin 0 -> 2199 bytes framework/Source/GPUImage.h | 3 ++ framework/Source/GPUImageAmatorkaFilter.h | 17 +++++++ framework/Source/GPUImageAmatorkaFilter.m | 29 +++++++++++ framework/Source/GPUImageMissEtikateFilter.h | 17 +++++++ framework/Source/GPUImageMissEtikateFilter.m | 29 +++++++++++ framework/Source/GPUImageSoftEleganceFilter.h | 19 +++++++ framework/Source/GPUImageSoftEleganceFilter.m | 47 ++++++++++++++++++ 12 files changed, 185 insertions(+) create mode 100644 framework/Resources/lookup_amatorka.png create mode 100644 framework/Resources/lookup_miss_etikate.png create mode 100644 framework/Resources/lookup_soft_elegance_1.png create mode 100644 framework/Resources/lookup_soft_elegance_2.png create mode 100755 framework/Source/GPUImageAmatorkaFilter.h create mode 100755 framework/Source/GPUImageAmatorkaFilter.m create mode 100755 framework/Source/GPUImageMissEtikateFilter.h create mode 100755 framework/Source/GPUImageMissEtikateFilter.m create mode 100755 framework/Source/GPUImageSoftEleganceFilter.h create mode 100755 framework/Source/GPUImageSoftEleganceFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index c27e99ab8..a2a1b69f7 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -33,6 +33,12 @@ 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; }; 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; + 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; }; + 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */; }; + 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; }; + 96781B3515C39E80005FA0D7 /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */; }; + 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; }; + 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; }; 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; @@ -301,6 +307,12 @@ 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSubtractBlendFilter.m; path = Source/GPUImageSubtractBlendFilter.m; sourceTree = SOURCE_ROOT; }; 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMaskFilter.h; path = Source/GPUImageMaskFilter.h; sourceTree = SOURCE_ROOT; }; 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMaskFilter.m; path = Source/GPUImageMaskFilter.m; sourceTree = SOURCE_ROOT; }; + 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAmatorkaFilter.h; path = Source/GPUImageAmatorkaFilter.h; sourceTree = SOURCE_ROOT; }; + 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAmatorkaFilter.m; path = Source/GPUImageAmatorkaFilter.m; sourceTree = SOURCE_ROOT; }; + 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMissEtikateFilter.h; path = Source/GPUImageMissEtikateFilter.h; sourceTree = SOURCE_ROOT; }; + 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMissEtikateFilter.m; path = Source/GPUImageMissEtikateFilter.m; sourceTree = SOURCE_ROOT; }; + 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSoftEleganceFilter.h; path = Source/GPUImageSoftEleganceFilter.h; sourceTree = SOURCE_ROOT; }; + 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftEleganceFilter.m; path = Source/GPUImageSoftEleganceFilter.m; sourceTree = SOURCE_ROOT; }; 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLookupFilter.h; path = Source/GPUImageLookupFilter.h; sourceTree = SOURCE_ROOT; }; 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLookupFilter.m; path = Source/GPUImageLookupFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; @@ -711,6 +723,12 @@ BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */, BCF1E53E15669907006B155F /* GPUImageVoroniConsumerFilter.h */, BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */, + 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */, + 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */, + 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */, + 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */, + 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */, + 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */, ); name = Effects; sourceTree = ""; @@ -1061,6 +1079,9 @@ C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */, BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */, 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */, + 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */, + 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */, + 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1294,6 +1315,9 @@ C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */, BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */, 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */, + 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */, + 96781B3515C39E80005FA0D7 /* GPUImageMissEtikateFilter.m in Sources */, + 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Resources/lookup_amatorka.png b/framework/Resources/lookup_amatorka.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2cc8ac2f0c4ebd95c26b17ca59a47ca4c36a3c GIT binary patch literal 36390 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 V#`AB@xp)BF%uFndpBp*f`xj2m*0KNq literal 0 HcmV?d00001 diff --git a/framework/Resources/lookup_miss_etikate.png b/framework/Resources/lookup_miss_etikate.png new file mode 100644 index 0000000000000000000000000000000000000000..e1317d7819b051663709c484c7b8c773e95ed6d4 GIT binary patch literal 202596 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 z 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

03m0W9-p;;K2 zs*=rRiJj5t)z6&;Hh8d93CnW6S{ns`B?bY%3l@P>$sn)xy=V8x4GR2ME$}#+xrh80 z#1R^V(?>rh1$$iRpBYGe%~Ws$wOm~INGdgrY;llHk`i>GGUDAP`cJyYln?R9a|nkz zyzCS=E;KD*0&q+{@)d@qD?7m--;;2<6eG!CaHl;0#mi48$nYy)l=N?p8~s0Ls=nwa zD5-q2lK3h>3iwQ|=y^#PJ{k)Ro1smys92q;;00At+4Tog;J$3&YHnEJuD(H0Whnm@ zn#V2HN818KnDr;qzt^>|y%U;zXh#?1p-cGC0sCTGGx3ojF1!*X#}+59;ZC^ibv3$D zEQu1tY!b4v4B=0L;ZGK;fs+>`VUp*%#IA{^C?d0bvKwAqk1>W#~d!w4bG` zr9&{Nidf=hkR{~Q{seKm2(t(FJsrJ-B2?SCQni?*YnyWArUmM&a#`&A;-&X1h5r6M z1`dS7R&tRx)B)c0uUxY3KARzz5Fte#>TlpjRWGrb3}FYx`p8w2>r{5@@tX<7hC@he z82+9`@KieT6}GE#902d18zTfKJ`D|?!QhtsY_pzl9X312u>;GxkS6RwV)^-600u;t z?i#2mFn=5VRVT!CNd!PBAIYrI`iyA9e8(Pql(ort~3Y;zbNf(jXnw^`Fg ze9_yNKv7vR06@j5$skB;u52%0w#rdEOJ77C!Q3)8XLXLN1dLu==;-i^7 zAd~h5i}ReWlfle93OlXm9k${av<-hZp~`TC{Jd#T`{%{Ak ziMcv}(?B&N!2F<-6#n~en#(;1QNMr7t~jSR$lq>tbLa+i?3FOPmW5n2jt-P=8Oj^1 zWv|x^0OzAfze)593Jgyv8sc`PkeaUS88I&{e1M=g~LBQ42aH(@UI*X zRK1PnRs}7eMM8^O3gj`@dWB!x2{Le!Y$#l2v~dB~pL;dLCd3w@PaF4>(J7LHmqH41 z%O-XEGme_%KcppOi3>zLg1?F9S{IbJe@~`rL=SK>6`1=RKz9I{EMtFE^8had_EmEk zHS4FAK+pF8v;h&!&`kHYyaw&r!UIoa!eRuhJq7ko6tI<`wvCHbq!&caDu`b%kmDvL zMYper7Zl20938mQAP!gAc!%>iGJzKm=j|<$0z;fL*|kkqzCoVVAcFd0cjBa{!1Tl} zs0_&d8qD;Ml85OJV8SY~4`B7s7eOl4u{B5w`rFez1qMzYx!>kgTSp+<0HMiGn78i3 z`m9VEsr~Ipk;d{O2$o9HXLX!6y>t#pXGn$E)yrC1QbQ#g^`C#^BT^O%!3_<_n09XKdc%c*fYe@3eXnK33Kz~E&&DOE?0CQ^L)DRa$ zR$WC?P=7IhuMmD`0D&8enmBd{5*8>xE_d&&zqKHCGnKpOT(89Sj*B*Ke`Nt<{KbiQ zTN-89ZWi$G3Q=Jj4X~g~p|duby`ukaO!=Kaj^H&vt&FSEzzhB&PcuL)@S0JuzcZu5 z714rDldH;VZD|HzhC5F8O?Pu6v^UICI-dX z$&N!z2Ahw(@D^DMaqso^Cb_<^uoJRM|IKJx0NL-;9i+Rm=V22EL}~iEWRSrKo@0cQIs`Ph zt`vHA;`c((K}Y!lD?(Y#0Km4zbxd42A_nRaH0XKF{-BTs`ElkQN53VwCYlzbcRhF& z+|ldduM_@iofkyZZ4L{(G^F}d1v2{EjlPgUemR6*iu4IEcEC +6EY7dr56a7qsy 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 z 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 WB=3q literal 0 HcmV?d00001 diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 32ed1c896..ac7d949f8 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -111,3 +111,6 @@ #import "GPUImageHueFilter.h" #import "GPUImageGlassSphereFilter.h" #import "GPUImageLookupFilter.h" +#import "GPUImageAmatorkaFilter.h" +#import "GPUImageMissEtikateFilter.h" +#import "GPUImageSoftEleganceFilter.h" diff --git a/framework/Source/GPUImageAmatorkaFilter.h b/framework/Source/GPUImageAmatorkaFilter.h new file mode 100755 index 000000000..1dbe096d7 --- /dev/null +++ b/framework/Source/GPUImageAmatorkaFilter.h @@ -0,0 +1,17 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImagePicture; + +/** A photo filter based on Photoshop action by Amatorka + http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631 + */ + +// Note: If you want to use this effect you have to add lookup_amatorka.png +// from Resources folder to your application bundle. + +@interface GPUImageAmatorkaFilter : GPUImageFilterGroup +{ + GPUImagePicture *lookupImageSource; +} + +@end diff --git a/framework/Source/GPUImageAmatorkaFilter.m b/framework/Source/GPUImageAmatorkaFilter.m new file mode 100755 index 000000000..ce1f97e1a --- /dev/null +++ b/framework/Source/GPUImageAmatorkaFilter.m @@ -0,0 +1,29 @@ +#import "GPUImageAmatorkaFilter.h" +#import "GPUImagePicture.h" +#import "GPUImageLookupFilter.h" + +@implementation GPUImageAmatorkaFilter + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + lookupImageSource = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup_amatorka.png"]]; + GPUImageLookupFilter *lookupFilter = [[GPUImageLookupFilter alloc] init]; + + [lookupImageSource addTarget:lookupFilter atTextureLocation:1]; + [lookupImageSource processImage]; + + self.initialFilters = [NSArray arrayWithObjects:lookupFilter, nil]; + self.terminalFilter = lookupFilter; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +@end diff --git a/framework/Source/GPUImageMissEtikateFilter.h b/framework/Source/GPUImageMissEtikateFilter.h new file mode 100755 index 000000000..de1706472 --- /dev/null +++ b/framework/Source/GPUImageMissEtikateFilter.h @@ -0,0 +1,17 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImagePicture; + +/** A photo filter based on Photoshop action by Miss Etikate: + http://miss-etikate.deviantart.com/art/Photoshop-Action-15-120151961 + */ + +// Note: If you want to use this effect you have to add lookup_miss_etikate.png +// from Resources folder to your application bundle. + +@interface GPUImageMissEtikateFilter : GPUImageFilterGroup +{ + GPUImagePicture *lookupImageSource; +} + +@end diff --git a/framework/Source/GPUImageMissEtikateFilter.m b/framework/Source/GPUImageMissEtikateFilter.m new file mode 100755 index 000000000..63fd9b339 --- /dev/null +++ b/framework/Source/GPUImageMissEtikateFilter.m @@ -0,0 +1,29 @@ +#import "GPUImageMissEtikateFilter.h" +#import "GPUImagePicture.h" +#import "GPUImageLookupFilter.h" + +@implementation GPUImageMissEtikateFilter + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + lookupImageSource = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup_miss_etikate.png"]]; + GPUImageLookupFilter *lookupFilter = [[GPUImageLookupFilter alloc] init]; + + [lookupImageSource addTarget:lookupFilter atTextureLocation:1]; + [lookupImageSource processImage]; + + self.initialFilters = [NSArray arrayWithObjects:lookupFilter, nil]; + self.terminalFilter = lookupFilter; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +@end diff --git a/framework/Source/GPUImageSoftEleganceFilter.h b/framework/Source/GPUImageSoftEleganceFilter.h new file mode 100755 index 000000000..596e1567c --- /dev/null +++ b/framework/Source/GPUImageSoftEleganceFilter.h @@ -0,0 +1,19 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImagePicture; + +/** A photo filter based on Soft Elegance Photoshop action + http://h-d-stock.deviantart.com/art/H-D-A-soft-elegance-70107603 + */ + +// Note: If you want to use this effect you have to add +// lookup_soft_elegance_1.png and lookup_soft_elegance_2.png +// from Resources folder to your application bundle. + +@interface GPUImageSoftEleganceFilter : GPUImageFilterGroup +{ + GPUImagePicture *lookupImageSource1; + GPUImagePicture *lookupImageSource2; +} + +@end diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m new file mode 100755 index 000000000..3d373c4e4 --- /dev/null +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -0,0 +1,47 @@ +#import "GPUImageSoftEleganceFilter.h" +#import "GPUImagePicture.h" +#import "GPUImageLookupFilter.h" +#import "GPUImageGaussianBlurFilter.h" +#import "GPUImageAlphaBlendFilter.h" + +@implementation GPUImageSoftEleganceFilter + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + lookupImageSource1 = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup_soft_elegance_1.png"]]; + GPUImageLookupFilter *lookupFilter1 = [[GPUImageLookupFilter alloc] init]; + + [lookupImageSource1 addTarget:lookupFilter1 atTextureLocation:1]; + [lookupImageSource1 processImage]; + + GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; + gaussianBlur.blurSize = 9.7; + [lookupFilter1 addTarget:gaussianBlur]; + + GPUImageAlphaBlendFilter *alphaBlend = [[GPUImageAlphaBlendFilter alloc] init]; + alphaBlend.mix = 0.14; + [lookupFilter1 addTarget:alphaBlend]; + [gaussianBlur addTarget:alphaBlend]; + + lookupImageSource2 = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup_soft_elegance_2.png"]]; + + GPUImageLookupFilter *lookupFilter2 = [[GPUImageLookupFilter alloc] init]; + [alphaBlend addTarget:lookupFilter2]; + [lookupImageSource2 addTarget:lookupFilter2]; + [lookupImageSource2 processImage]; + + self.initialFilters = [NSArray arrayWithObjects:lookupFilter1, gaussianBlur, alphaBlend, lookupFilter2, nil]; + self.terminalFilter = lookupFilter2; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +@end From 85aaf385518add532a391ce7725099d2edaa87ea Mon Sep 17 00:00:00 2001 From: Lev Zelenskiy Date: Sat, 4 Aug 2012 10:11:46 +1000 Subject: [PATCH 168/695] Added NSAssert that fails if the appropriate images haven't been added --- framework/Source/GPUImageAmatorkaFilter.m | 5 ++++- framework/Source/GPUImageLookupFilter.h | 2 +- framework/Source/GPUImageMissEtikateFilter.m | 5 ++++- framework/Source/GPUImageSoftEleganceFilter.m | 9 +++++++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/framework/Source/GPUImageAmatorkaFilter.m b/framework/Source/GPUImageAmatorkaFilter.m index ce1f97e1a..8ed55e04d 100755 --- a/framework/Source/GPUImageAmatorkaFilter.m +++ b/framework/Source/GPUImageAmatorkaFilter.m @@ -11,7 +11,10 @@ - (id)init; return nil; } - lookupImageSource = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup_amatorka.png"]]; + UIImage *image = [UIImage imageNamed:@"lookup_amatorka.png"]; + NSAssert(image, @"To use GPUImageAmatorkaFilter you need to add lookup_amatorka.png from GPUImage/framework/Resources to your application bundle."); + + lookupImageSource = [[GPUImagePicture alloc] initWithImage:image]; GPUImageLookupFilter *lookupFilter = [[GPUImageLookupFilter alloc] init]; [lookupImageSource addTarget:lookupFilter atTextureLocation:1]; diff --git a/framework/Source/GPUImageLookupFilter.h b/framework/Source/GPUImageLookupFilter.h index c9695778e..f14870489 100644 --- a/framework/Source/GPUImageLookupFilter.h +++ b/framework/Source/GPUImageLookupFilter.h @@ -3,7 +3,7 @@ @interface GPUImageLookupFilter : GPUImageTwoInputFilter // How To Use: -// 1) Use your favourite photo editing application to apply a filter to lookup.png +// 1) Use your favourite photo editing application to apply a filter to lookup.png from GPUImage/framework/Resources. // For this to work properly each pixel color must not depend on other pixels (e.g. blur will not work). // If you need more complex filter you can create as many lookup tables as required. // E.g. color_balance_lookup_1.png -> GPUImageGaussianBlurFilter -> color_balance_lookup_2.png diff --git a/framework/Source/GPUImageMissEtikateFilter.m b/framework/Source/GPUImageMissEtikateFilter.m index 63fd9b339..831ba0524 100755 --- a/framework/Source/GPUImageMissEtikateFilter.m +++ b/framework/Source/GPUImageMissEtikateFilter.m @@ -11,7 +11,10 @@ - (id)init; return nil; } - lookupImageSource = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup_miss_etikate.png"]]; + UIImage *image = [UIImage imageNamed:@"lookup_miss_etikate.png"]; + NSAssert(image, @"To use GPUImageMissEtikateFilter you need to add lookup_miss_etikate.png from GPUImage/framework/Resources to your application bundle."); + + lookupImageSource = [[GPUImagePicture alloc] initWithImage:image]; GPUImageLookupFilter *lookupFilter = [[GPUImageLookupFilter alloc] init]; [lookupImageSource addTarget:lookupFilter atTextureLocation:1]; diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m index 3d373c4e4..30abc3a90 100755 --- a/framework/Source/GPUImageSoftEleganceFilter.m +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -13,7 +13,12 @@ - (id)init; return nil; } - lookupImageSource1 = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup_soft_elegance_1.png"]]; + UIImage *image1 = [UIImage imageNamed:@"lookup_soft_elegance_1.png"]; + UIImage *image2 = [UIImage imageNamed:@"lookup_soft_elegance_2.png"]; + NSAssert(image1 && image2, + @"To use GPUImageSoftEleganceFilter you need to add lookup_soft_elegance_1.png and lookup_soft_elegance_2.png from GPUImage/framework/Resources to your application bundle."); + + lookupImageSource1 = [[GPUImagePicture alloc] initWithImage:image1]; GPUImageLookupFilter *lookupFilter1 = [[GPUImageLookupFilter alloc] init]; [lookupImageSource1 addTarget:lookupFilter1 atTextureLocation:1]; @@ -28,7 +33,7 @@ - (id)init; [lookupFilter1 addTarget:alphaBlend]; [gaussianBlur addTarget:alphaBlend]; - lookupImageSource2 = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup_soft_elegance_2.png"]]; + lookupImageSource2 = [[GPUImagePicture alloc] initWithImage:image2]; GPUImageLookupFilter *lookupFilter2 = [[GPUImageLookupFilter alloc] init]; [alphaBlend addTarget:lookupFilter2]; From 435d10ccf9700b9aa5cf9be81f6281098c9887c3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 3 Aug 2012 23:35:13 -0500 Subject: [PATCH 169/695] Made the FilterShowcase once again iOS 4.0 compatible. Incorporated the lookup filters into the showcase and fixed the GPUImageSoftEleganceFilter. --- .../FilterShowcase.xcodeproj/project.pbxproj | 22 +++++- .../ShowcaseFilterListController.m | 13 +++- .../ShowcaseFilterViewController.h | 8 +- .../ShowcaseFilterViewController.m | 43 +++++++++-- .../ShowcaseFilterViewController.xib | 75 ++++--------------- framework/Source/GPUImageSoftEleganceFilter.m | 6 +- framework/Source/GPUImageView.m | 3 +- 7 files changed, 96 insertions(+), 74 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 180447ffd..55c044783 100755 --- a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -8,7 +8,7 @@ /* Begin PBXBuildFile section */ 0D69488E1501F71900206FF8 /* SampleConfiguration.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D69488D1501F71900206FF8 /* SampleConfiguration.plist */; }; - 6BF3ED5715B5C2BF002F9E9E /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6BF3ED5615B5C2BF002F9E9E /* CoreImage.framework */; }; + 6BF3ED5715B5C2BF002F9E9E /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6BF3ED5615B5C2BF002F9E9E /* CoreImage.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 83AE9FD41540F3CC00F7FC13 /* mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 83AE9FD31540F3CC00F7FC13 /* mask.png */; }; BC982B0714F046AC0001FF6F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B0614F046AC0001FF6F /* UIKit.framework */; }; BC982B0914F046AC0001FF6F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B0814F046AC0001FF6F /* Foundation.framework */; }; @@ -27,6 +27,10 @@ BC982B4214F06BF70001FF6F /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B3014F049950001FF6F /* libGPUImage.a */; }; BC982BD114F1C0F00001FF6F /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BC982BD014F1C0F00001FF6F /* WID-small.jpg */; }; BC982C4114F1F6C80001FF6F /* CustomFilter.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BC982C4014F1F6C80001FF6F /* CustomFilter.fsh */; }; + BCF9D9AB15CCD1AF007E7FBA /* lookup_amatorka.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */; }; + BCF9D9AC15CCD1AF007E7FBA /* lookup_miss_etikate.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */; }; + BCF9D9AD15CCD1AF007E7FBA /* lookup_soft_elegance_1.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */; }; + BCF9D9AE15CCD1AF007E7FBA /* lookup_soft_elegance_2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9AA15CCD1AF007E7FBA /* lookup_soft_elegance_2.png */; }; F2F3361E156585C400B0FBB8 /* voroni_points2.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F3361D156585C400B0FBB8 /* voroni_points2.png */; }; F2F336271565906000B0FBB8 /* dotletterstiles.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F336261565906000B0FBB8 /* dotletterstiles.png */; }; F2F33629156591CA00B0FBB8 /* curvies.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F33628156591CA00B0FBB8 /* curvies.png */; }; @@ -84,6 +88,10 @@ BC982B3E14F05DC10001FF6F /* ShowcaseFilterListController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShowcaseFilterListController.m; sourceTree = ""; }; BC982BD014F1C0F00001FF6F /* WID-small.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = "WID-small.jpg"; path = "../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg"; sourceTree = ""; }; BC982C4014F1F6C80001FF6F /* CustomFilter.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = CustomFilter.fsh; sourceTree = ""; }; + BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_amatorka.png; path = ../../../framework/Resources/lookup_amatorka.png; sourceTree = ""; }; + BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; + BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; + BCF9D9AA15CCD1AF007E7FBA /* lookup_soft_elegance_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_2.png; path = ../../../framework/Resources/lookup_soft_elegance_2.png; sourceTree = ""; }; F2F3361D156585C400B0FBB8 /* voroni_points2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voroni_points2.png; sourceTree = ""; }; F2F336261565906000B0FBB8 /* dotletterstiles.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dotletterstiles.png; sourceTree = ""; }; F2F33628156591CA00B0FBB8 /* curvies.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = curvies.png; sourceTree = ""; }; @@ -114,7 +122,6 @@ BC982AF714F046AC0001FF6F = { isa = PBXGroup; children = ( - 6BF3ED5615B5C2BF002F9E9E /* CoreImage.framework */, BC982B0C14F046AC0001FF6F /* FilterShowcase */, BC982B0514F046AC0001FF6F /* Frameworks */, BC982B0314F046AC0001FF6F /* Products */, @@ -133,6 +140,7 @@ isa = PBXGroup; children = ( BC982B2714F049950001FF6F /* GPUImage.xcodeproj */, + 6BF3ED5615B5C2BF002F9E9E /* CoreImage.framework */, BC982B2514F048230001FF6F /* OpenGLES.framework */, BC982B2314F0481C0001FF6F /* AVFoundation.framework */, BC982B1D14F048160001FF6F /* CoreMedia.framework */, @@ -164,6 +172,10 @@ BC982B0D14F046AC0001FF6F /* Supporting Files */ = { isa = PBXGroup; children = ( + BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */, + BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */, + BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */, + BCF9D9AA15CCD1AF007E7FBA /* lookup_soft_elegance_2.png */, F2F3362A156591DB00B0FBB8 /* squares.png */, F2F33628156591CA00B0FBB8 /* curvies.png */, F2F336261565906000B0FBB8 /* dotletterstiles.png */, @@ -274,6 +286,10 @@ F2F336271565906000B0FBB8 /* dotletterstiles.png in Resources */, F2F33629156591CA00B0FBB8 /* curvies.png in Resources */, F2F3362B156591DB00B0FBB8 /* squares.png in Resources */, + BCF9D9AB15CCD1AF007E7FBA /* lookup_amatorka.png in Resources */, + BCF9D9AC15CCD1AF007E7FBA /* lookup_miss_etikate.png in Resources */, + BCF9D9AD15CCD1AF007E7FBA /* lookup_soft_elegance_1.png in Resources */, + BCF9D9AE15CCD1AF007E7FBA /* lookup_soft_elegance_2.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -317,7 +333,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -345,7 +360,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 174a001f3..30e795bf5 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -44,7 +44,15 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return GPUIMAGE_NUMFILTERS; + // Disable the last filter (Core Image face detection) if running on iOS 4.0 + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + return GPUIMAGE_NUMFILTERS; + } + else + { + return (GPUIMAGE_NUMFILTERS - 1); + } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath @@ -85,6 +93,9 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_COLORINVERT: cell.textLabel.text = @"Color invert"; break; case GPUIMAGE_GRAYSCALE: cell.textLabel.text = @"Grayscale"; break; case GPUIMAGE_SEPIA: cell.textLabel.text = @"Sepia tone"; break; + case GPUIMAGE_MISSETIKATE: cell.textLabel.text = @"Miss Etikate (Lookup)"; break; + case GPUIMAGE_SOFTELEGANCE: cell.textLabel.text = @"Soft elegance (Lookup)"; break; + case GPUIMAGE_AMATORKA: cell.textLabel.text = @"Amatorka (Lookup)"; break; case GPUIMAGE_PIXELLATE: cell.textLabel.text = @"Pixellate"; break; case GPUIMAGE_POLARPIXELLATE: cell.textLabel.text = @"Polar pixellate"; break; case GPUIMAGE_CROSSHATCH: cell.textLabel.text = @"Crosshatch"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index ac911b999..c53973d41 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -21,6 +21,9 @@ typedef enum { GPUIMAGE_HIGHLIGHTSHADOW, GPUIMAGE_HAZE, GPUIMAGE_SEPIA, + GPUIMAGE_AMATORKA, + GPUIMAGE_MISSETIKATE, + GPUIMAGE_SOFTELEGANCE, GPUIMAGE_COLORINVERT, GPUIMAGE_GRAYSCALE, GPUIMAGE_HISTOGRAM, @@ -99,11 +102,12 @@ typedef enum { GPUImageUIElement *uiElementInput; GPUImageFilterPipeline *pipeline; - UIView* faceView; + UIView *faceView; - CIDetector*faceDetector; + CIDetector *faceDetector; IBOutlet UISwitch *facesSwitch; + IBOutlet UILabel *facesLabel; __unsafe_unretained UISlider *_filterSettingsSlider; BOOL faceThinking; } diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 34d2647c9..54b5bbd24 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -27,9 +27,13 @@ - (void)viewDidLoad { [super viewDidLoad]; - NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil]; - self.faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; - faceThinking = NO; + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil]; + self.faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; + faceThinking = NO; + } + [self setupFilter]; } @@ -54,10 +58,11 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (void)setupFilter; { - // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; - videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; + videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; - + facesSwitch.hidden = YES; + facesLabel.hidden = YES; BOOL needsSecondImage = NO; switch (filterType) @@ -139,6 +144,28 @@ - (void)setupFilter; filter = [[GPUImageFalseColorFilter alloc] init]; }; break; + case GPUIMAGE_SOFTELEGANCE: + { + self.title = @"Soft Elegance (Lookup)"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageSoftEleganceFilter alloc] init]; + }; break; + case GPUIMAGE_MISSETIKATE: + { + self.title = @"Miss Etikate (Lookup)"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageMissEtikateFilter alloc] init]; + }; break; + case GPUIMAGE_AMATORKA: + { + self.title = @"Amatorka (Lookup)"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageAmatorkaFilter alloc] init]; + }; break; + case GPUIMAGE_SATURATION: { self.title = @"Saturation"; @@ -929,6 +956,10 @@ - (void)setupFilter; case GPUIMAGE_FACES: { + facesSwitch.hidden = NO; + facesLabel.hidden = NO; + + [videoCamera rotateCamera]; self.title = @"Face Detection"; self.filterSettingsSlider.hidden = YES; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib index cc018863a..36ae59281 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib @@ -2,13 +2,13 @@ 1536 - 11E53 - 2809 - 1138.47 - 569.00 + 12A269 + 2818 + 1187 + 624.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1884 + 1900 IBProxyObject @@ -42,7 +42,6 @@ 266 {{18, 374}, {284, 23}} - _NS:623 NO IBCocoaTouchFramework @@ -55,7 +54,6 @@ 292 {{219, 8}, {94, 27}} - _NS:9 NO @@ -72,7 +70,6 @@ 292 {{173, 8}, {52, 27}} - _NS:9 NO @@ -104,7 +101,6 @@ {{0, 64}, {320, 416}} - 3 @@ -146,6 +142,14 @@ 10

bENm=Z9l!bd6Rf^4a1MxHGAU<=wE`K;2(6O>Plk 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

+ + + facesLabel + + + + 12 + updateFilterFromSlider: @@ -226,60 +230,13 @@ - 11 - - - - - GPUImageView - UIView - - IBProjectSource - ./Classes/GPUImageView.h - - - - ShowcaseFilterViewController - UIViewController - - id - id - - - - facesSwitched: - id - - - updateFilterFromSlider: - id - - - - UISwitch - UISlider - - - - facesSwitch - UISwitch - - - filterSettingsSlider - UISlider - - - - IBProjectSource - ./Classes/ShowcaseFilterViewController.h - - - + 12 + 0 IBCocoaTouchFramework YES 3 - 1884 + 1900 diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m index 30abc3a90..cb12f9af1 100755 --- a/framework/Source/GPUImageSoftEleganceFilter.m +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -20,6 +20,7 @@ - (id)init; lookupImageSource1 = [[GPUImagePicture alloc] initWithImage:image1]; GPUImageLookupFilter *lookupFilter1 = [[GPUImageLookupFilter alloc] init]; + [self addFilter:lookupFilter1]; [lookupImageSource1 addTarget:lookupFilter1 atTextureLocation:1]; [lookupImageSource1 processImage]; @@ -27,11 +28,13 @@ - (id)init; GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; gaussianBlur.blurSize = 9.7; [lookupFilter1 addTarget:gaussianBlur]; + [self addFilter:gaussianBlur]; GPUImageAlphaBlendFilter *alphaBlend = [[GPUImageAlphaBlendFilter alloc] init]; alphaBlend.mix = 0.14; [lookupFilter1 addTarget:alphaBlend]; [gaussianBlur addTarget:alphaBlend]; + [self addFilter:alphaBlend]; lookupImageSource2 = [[GPUImagePicture alloc] initWithImage:image2]; @@ -39,8 +42,9 @@ - (id)init; [alphaBlend addTarget:lookupFilter2]; [lookupImageSource2 addTarget:lookupFilter2]; [lookupImageSource2 processImage]; + [self addFilter:lookupFilter2]; - self.initialFilters = [NSArray arrayWithObjects:lookupFilter1, gaussianBlur, alphaBlend, lookupFilter2, nil]; + self.initialFilters = [NSArray arrayWithObjects:lookupFilter1, nil]; self.terminalFilter = lookupFilter2; return self; diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 40d4ac301..50c0360c6 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -349,7 +349,8 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); - glUniform1i(displayInputTextureUniform, 4); + glUniform1i(displayInputTextureUniform, 4); + NSLog(@"input texture: %d", inputTextureForDisplay); glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); From a3674b580c49c9542e7890a44118b290bd787380 Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Sat, 4 Aug 2012 23:16:25 +0300 Subject: [PATCH 170/695] Adobe Curve File support added. Use [[GPUImageACVFile alloc] initWithCurveFile:@"curve.acv"] or [filter setPointsWithACV:@"curve.acv"] --- framework/Source/GPUImageToneCurveFilter.h | 3 + framework/Source/GPUImageToneCurveFilter.m | 136 +++++++++++++++++++++ 2 files changed, 139 insertions(+) mode change 100644 => 100755 framework/Source/GPUImageToneCurveFilter.h mode change 100644 => 100755 framework/Source/GPUImageToneCurveFilter.m diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h old mode 100644 new mode 100755 index ef2cc8e59..a64c323ef --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -8,8 +8,11 @@ @property(readwrite, nonatomic, copy) NSArray *greenControlPoints; @property(readwrite, nonatomic, copy) NSArray *blueControlPoints; +- (id)initWithACV:(NSString*)curveFile; + // This lets you set all three red, green, and blue tone curves at once. - (void)setRGBControlPoints:(NSArray *)points; +- (void)setPointsWithACV:(NSString*)curveFile; // Curve calculation - (NSArray *)getPreparedSplineCurve:(NSArray *)points; diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m old mode 100644 new mode 100755 index ffbcab8d7..4eebc905b --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -1,5 +1,110 @@ #import "GPUImageToneCurveFilter.h" +#pragma mark - +#pragma mark GPUImageACVFile Helper + +// GPUImageACVFile +// Snapp +// +// Created by Omer Duzyol on 7/15/12. +// Copyright (c) 2012 Creaworks Interactive. All rights reserved. +// +// ACV File format Parser +// Please refer to http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/PhotoshopFileFormats.htm#50577411_pgfId-1056330 +// + +@interface GPUImageACVFile : NSObject{ + short version; + short totalCurves; + + NSArray *rgbCompositeCurvePoints; + NSArray *redCurvePoints; + NSArray *greenCurvePoints; + NSArray *blueCurvePoints; +} + +@property(strong,nonatomic) NSArray *rgbCompositeCurvePoints; +@property(strong,nonatomic) NSArray *redCurvePoints; +@property(strong,nonatomic) NSArray *greenCurvePoints; +@property(strong,nonatomic) NSArray *blueCurvePoints; + +- (id) initWithCurveFile:(NSString*)curveFile; + +@end + +@implementation GPUImageACVFile + +@synthesize rgbCompositeCurvePoints, redCurvePoints, greenCurvePoints, blueCurvePoints; + +- (id) initWithCurveFile:(NSString*)curveFile{ + + self = [super init]; + if (self != nil) + { + NSString *bundleCurvePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: curveFile]; + + NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath: bundleCurvePath]; + + if (file == nil){ + NSLog(@"Failed to open file"); + + return self; + } + + NSData *databuffer; + + // 2 bytes, Version ( = 1 or = 4) + databuffer = [file readDataOfLength: 2]; + version = CFSwapInt16BigToHost(*(int*)([databuffer bytes])); + + // 2 bytes, Count of curves in the file. + [file seekToFileOffset:2]; + databuffer = [file readDataOfLength:2]; + totalCurves = CFSwapInt16BigToHost(*(int*)([databuffer bytes])); + + NSMutableArray *curves = [NSMutableArray new]; + + float pointRate = (1.0 / 255); + // The following is the data for each curve specified by count above + for (NSInteger x = 0; x Date: Sat, 4 Aug 2012 19:10:16 -0500 Subject: [PATCH 171/695] Incorporated code by Marcelo Barbudas that adds an add and divide blend, makes the darken blend aware of alpha, and fixes one issue with the tone curve filter. --- .../ShowcaseFilterListController.m | 2 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 16 +++++ framework/GPUImage.xcodeproj/project.pbxproj | 16 +++++ framework/Source/GPUImage.h | 2 + framework/Source/GPUImageAddBlendFilter.h | 5 ++ framework/Source/GPUImageAddBlendFilter.m | 58 +++++++++++++++++++ framework/Source/GPUImageDarkenBlendFilter.m | 6 +- framework/Source/GPUImageDivideBlendFilter.h | 5 ++ framework/Source/GPUImageDivideBlendFilter.m | 55 ++++++++++++++++++ framework/Source/GPUImageToneCurveFilter.h | 16 +++-- framework/Source/GPUImageToneCurveFilter.m | 24 ++++++-- 12 files changed, 190 insertions(+), 17 deletions(-) create mode 100644 framework/Source/GPUImageAddBlendFilter.h create mode 100644 framework/Source/GPUImageAddBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageDarkenBlendFilter.m create mode 100644 framework/Source/GPUImageDivideBlendFilter.h create mode 100644 framework/Source/GPUImageDivideBlendFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 30e795bf5..db4e291ec 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -133,6 +133,8 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SCREENBLEND: cell.textLabel.text = @"Screen blend"; break; case GPUIMAGE_COLORBURN: cell.textLabel.text = @"Color burn blend"; break; case GPUIMAGE_COLORDODGE: cell.textLabel.text = @"Color dodge blend"; break; + case GPUIMAGE_ADD: cell.textLabel.text = @"Add blend"; break; + case GPUIMAGE_DIVIDE: cell.textLabel.text = @"Divide blend"; break; case GPUIMAGE_MULTIPLY: cell.textLabel.text = @"Multiply blend"; break; case GPUIMAGE_OVERLAY: cell.textLabel.text = @"Overlay blend"; break; case GPUIMAGE_LIGHTEN: cell.textLabel.text = @"Lighten blend"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index c53973d41..e1851e849 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -71,6 +71,8 @@ typedef enum { GPUIMAGE_MOSAIC, GPUIMAGE_DISSOLVE, GPUIMAGE_CHROMAKEY, + GPUIMAGE_ADD, + GPUIMAGE_DIVIDE, GPUIMAGE_MULTIPLY, GPUIMAGE_OVERLAY, GPUIMAGE_LIGHTEN, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 54b5bbd24..0587ff7a8 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -717,6 +717,22 @@ - (void)setupFilter; filter = [[GPUImageChromaKeyBlendFilter alloc] init]; [(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0]; }; break; + case GPUIMAGE_ADD: + { + self.title = @"Add Blend"; + self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; + + filter = [[GPUImageAddBlendFilter alloc] init]; + }; break; + case GPUIMAGE_DIVIDE: + { + self.title = @"Divide Blend"; + self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; + + filter = [[GPUImageDivideBlendFilter alloc] init]; + }; break; case GPUIMAGE_MULTIPLY: { self.title = @"Multiply Blend"; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index a2a1b69f7..592640f74 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -240,6 +240,10 @@ BCC94ABC151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */; }; BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; }; BCC94CFB15101EB3002F9BC5 /* GPUImageTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */; }; + BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; }; + BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */; }; + BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; }; + BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */; }; BCF1A33814DDB1EC00852800 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; BCF1A34614DDB1EC00852800 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A34514DDB1EC00852800 /* SenTestingKit.framework */; }; BCF1A34914DDB1EC00852800 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; @@ -508,6 +512,10 @@ BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminanceThresholdFilter.m; path = Source/GPUImageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTransformFilter.h; path = Source/GPUImageTransformFilter.h; sourceTree = SOURCE_ROOT; }; BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTransformFilter.m; path = Source/GPUImageTransformFilter.m; sourceTree = SOURCE_ROOT; }; + BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDivideBlendFilter.h; path = Source/GPUImageDivideBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDivideBlendFilter.m; path = Source/GPUImageDivideBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAddBlendFilter.h; path = Source/GPUImageAddBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAddBlendFilter.m; path = Source/GPUImageAddBlendFilter.m; sourceTree = SOURCE_ROOT; }; BCF1A33414DDB1EC00852800 /* libGPUImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGPUImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; BCF1A33714DDB1EC00852800 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; BCF1A33B14DDB1EC00852800 /* GPUImage-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "GPUImage-Prefix.pch"; path = "Source/GPUImage-Prefix.pch"; sourceTree = ""; }; @@ -658,6 +666,10 @@ BCB6B86D1504234A0041703B /* GPUImageHardLightBlendFilter.m */, BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */, BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */, + BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */, + BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */, + BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */, + BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */, BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */, BC982BEA14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m */, BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */, @@ -1082,6 +1094,8 @@ 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */, 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */, 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */, + BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */, + BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1318,6 +1332,8 @@ 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */, 96781B3515C39E80005FA0D7 /* GPUImageMissEtikateFilter.m in Sources */, 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */, + BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */, + BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index ac7d949f8..ccef2d0a0 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -114,3 +114,5 @@ #import "GPUImageAmatorkaFilter.h" #import "GPUImageMissEtikateFilter.h" #import "GPUImageSoftEleganceFilter.h" +#import "GPUImageAddBlendFilter.h" +#import "GPUImageDivideBlendFilter.h" diff --git a/framework/Source/GPUImageAddBlendFilter.h b/framework/Source/GPUImageAddBlendFilter.h new file mode 100644 index 000000000..b14c60c6e --- /dev/null +++ b/framework/Source/GPUImageAddBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageAddBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageAddBlendFilter.m b/framework/Source/GPUImageAddBlendFilter.m new file mode 100644 index 000000000..ee5cb5e79 --- /dev/null +++ b/framework/Source/GPUImageAddBlendFilter.m @@ -0,0 +1,58 @@ +#import "GPUImageAddBlendFilter.h" + +NSString *const kGPUImageAddBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 base = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + mediump float r; + if (overlay.r * base.a + base.r * overlay.a >= overlay.a * base.a) { + r = overlay.a * base.a + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } else { + r = overlay.r + base.r; + } + + mediump float g; + if (overlay.g * base.a + base.g * overlay.a >= overlay.a * base.a) { + g = overlay.a * base.a + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } else { + g = overlay.g + base.g; + } + + mediump float b; + if (overlay.b * base.a + base.b * overlay.a >= overlay.a * base.a) { + b = overlay.a * base.a + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } else { + b = overlay.b + base.b; + } + + mediump float a = overlay.a + base.a - overlay.a * base.a; + + gl_FragColor = vec4(r, g, b, a); + } + ); + + + +@implementation GPUImageAddBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageAddBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end + diff --git a/framework/Source/GPUImageDarkenBlendFilter.m b/framework/Source/GPUImageDarkenBlendFilter.m old mode 100755 new mode 100644 index eb83c6559..732d9b023 --- a/framework/Source/GPUImageDarkenBlendFilter.m +++ b/framework/Source/GPUImageDarkenBlendFilter.m @@ -10,10 +10,10 @@ void main() { - lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + lowp vec4 base = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 overlayer = texture2D(inputImageTexture2, textureCoordinate2); - gl_FragColor = min(textureColor, textureColor2); + gl_FragColor = vec4(min(overlayer.rgb * base.a, base.rgb * overlayer.a) + overlayer.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlayer.a), 1.0); } ); diff --git a/framework/Source/GPUImageDivideBlendFilter.h b/framework/Source/GPUImageDivideBlendFilter.h new file mode 100644 index 000000000..ad798e294 --- /dev/null +++ b/framework/Source/GPUImageDivideBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageDivideBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageDivideBlendFilter.m b/framework/Source/GPUImageDivideBlendFilter.m new file mode 100644 index 000000000..ee4e75207 --- /dev/null +++ b/framework/Source/GPUImageDivideBlendFilter.m @@ -0,0 +1,55 @@ +#import "GPUImageDivideBlendFilter.h" + +NSString *const kGPUImageDivideBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + mediump vec4 base = texture2D(inputImageTexture, textureCoordinate); + mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + mediump float ra; + if (overlay.a == 0.0 || ((base.r / overlay.r) > (base.a / overlay.a))) + ra = overlay.a * base.a + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + else + ra = (base.r * overlay.a * overlay.a) / overlay.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + + + mediump float ga; + if (overlay.a == 0.0 || ((base.g / overlay.g) > (base.a / overlay.a))) + ga = overlay.a * base.a + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + else + ga = (base.g * overlay.a * overlay.a) / overlay.g + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + + + mediump float ba; + if (overlay.a == 0.0 || ((base.b / overlay.b) > (base.a / overlay.a))) + ba = overlay.a * base.a + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + else + ba = (base.b * overlay.a * overlay.a) / overlay.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + + mediump float a = overlay.a + base.a - overlay.a * base.a; + + gl_FragColor = vec4(ra, ga, ba, a); + } + ); + +@implementation GPUImageDivideBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageDivideBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end + diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h index ef2cc8e59..87de3d755 100644 --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -2,19 +2,17 @@ @interface GPUImageToneCurveFilter : GPUImageFilter -// The tone curve takes in a series of control points that define the spline curve for each color component. -// These are stored as NSValue-wrapped CGPoints in an NSArray, with normalized X and Y coordinates from 0 - 1. The defaults are (0,0), (0.5,0.5), (1,1). -@property(readwrite, nonatomic, copy) NSArray *redControlPoints; -@property(readwrite, nonatomic, copy) NSArray *greenControlPoints; -@property(readwrite, nonatomic, copy) NSArray *blueControlPoints; +@property(readwrite, nonatomic) NSArray *redControlPoints; +@property(readwrite, nonatomic) NSArray *greenControlPoints; +@property(readwrite, nonatomic) NSArray *blueControlPoints; + -// This lets you set all three red, green, and blue tone curves at once. - (void)setRGBControlPoints:(NSArray *)points; // Curve calculation -- (NSArray *)getPreparedSplineCurve:(NSArray *)points; -- (NSArray *)splineCurve:(NSArray *)points; -- (NSArray *)secondDerivative:(NSArray *)cgPoints; +- (NSMutableArray *)getPreparedSplineCurve:(NSArray *)points; +- (NSMutableArray *)splineCurve:(NSArray *)points; +- (NSMutableArray *)secondDerivative:(NSArray *)cgPoints; - (void)updateToneCurveTexture; @end diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index ffbcab8d7..451e0209a 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -86,8 +86,22 @@ - (NSArray *)getPreparedSplineCurve:(NSArray *)points [convertedPoints addObject:[NSValue valueWithCGPoint:point]]; } - NSArray *splinePoints = [self splineCurve:convertedPoints]; - + + NSMutableArray *splinePoints = [self splineCurve:convertedPoints]; + + // If we have a first point like (0.3, 0) we'll be missing some points at the beginning + // that should be 0. + CGPoint firstSplinePoint = [[splinePoints objectAtIndex:0] CGPointValue]; + + if (firstSplinePoint.x > 0) { + for (int i=0; i <=firstSplinePoint.x; i++) { + CGPoint newCGPoint = CGPointMake(0, 0); + [splinePoints insertObject:[NSValue valueWithCGPoint:newCGPoint] atIndex:0]; + } + } + + + // Prepare the spline points. NSMutableArray *preparedSplinePoints = [NSMutableArray arrayWithCapacity:[splinePoints count]]; for (int i=0; i<[splinePoints count]; i++) { @@ -111,9 +125,9 @@ - (NSArray *)getPreparedSplineCurve:(NSArray *)points } -- (NSArray *)splineCurve:(NSArray *)points +- (NSMutableArray *)splineCurve:(NSArray *)points { - NSArray *sdA = [self secondDerivative:points]; + NSMutableArray *sdA = [self secondDerivative:points]; // Is [points count] equal to [sdA count]? // int n = [points count]; @@ -164,7 +178,7 @@ - (NSArray *)splineCurve:(NSArray *)points return output; } -- (NSArray *)secondDerivative:(NSArray *)points +- (NSMutableArray *)secondDerivative:(NSArray *)points { int n = [points count]; if ((n <= 0) || (n == 1)) From 8b20560ebcfa669bec684929d4e058263caabff1 Mon Sep 17 00:00:00 2001 From: Tom Corwine Date: Sat, 4 Aug 2012 20:51:11 -0400 Subject: [PATCH 172/695] Added trailing new line to files that were missing it. Removed erroneous ; character in some method's implementations. Added public methods in GPUImageVideoCamera to allow checking for existence of front-facing camera, setting a fixed frame rate on IOS5 and above, and changing AVCaptureSession on the fly. Added public methods in GPUImageMovieWriter to allow for setting video recording orientation and custom audio settings. Added check in GPUImageMovieWriter to test for missing required parameters when providing a custom video settings dictionary. --- framework/Source/GPUImageFilter.h | 2 +- framework/Source/GPUImageMonochromeFilter.h | 2 +- framework/Source/GPUImageMovie.m | 2 +- framework/Source/GPUImageMovieWriter.h | 3 + framework/Source/GPUImageMovieWriter.m | 65 ++++++++----------- framework/Source/GPUImageOpenGLESContext.h | 2 +- framework/Source/GPUImageRGBFilter.h | 2 +- framework/Source/GPUImageRawDataOutput.h | 2 +- framework/Source/GPUImageTextureOutput.h | 2 +- framework/Source/GPUImageVideoCamera.h | 12 ++++ framework/Source/GPUImageVideoCamera.m | 71 ++++++++++++++++++++- 11 files changed, 120 insertions(+), 45 deletions(-) diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 5ec212c15..ec36da581 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -123,4 +123,4 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)setFloatVec4:(GLfloat *)newVec4 forUniform:(NSString *)uniformName; - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSString*)uniformName; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageMonochromeFilter.h b/framework/Source/GPUImageMonochromeFilter.h index b67c14c18..66a0e7732 100644 --- a/framework/Source/GPUImageMonochromeFilter.h +++ b/framework/Source/GPUImageMonochromeFilter.h @@ -10,4 +10,4 @@ - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index f66cdde00..8ad82c73d 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -96,7 +96,7 @@ - (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieW movieWriter.encodingLiveVideo = NO; } -- (void)startProcessing; +- (void)startProcessing { if(self.url == nil) { [self processAsset]; diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 890d6dcca..3fa22f054 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -45,6 +45,9 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings orientation:(CGAffineTransform)orientationTransform; + +- (void)setHasAudioTrack:(BOOL)hasAudioTrack audioSettings:(NSDictionary *)audioOutputSettings; // Movie recording - (void)startRecording; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 53b475cbd..2c3b01122 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -4,6 +4,8 @@ #import "GLProgram.h" #import "GPUImageFilter.h" +#define degreesToRadian(x) (M_PI * (x) / 180.0) + NSString *const kGPUImageColorSwizzlingFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -35,8 +37,7 @@ @interface GPUImageMovieWriter () } // Movie recording -- (void)initializeMovie; -- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; +- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings orientation:(CGAffineTransform)orientationTransform; // Frame rendering - (void)createDataFBO; @@ -67,6 +68,11 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; return [self initWithMovieURL:newMovieURL size:newSize fileType:AVFileTypeQuickTimeMovie outputSettings:nil]; } - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; +{ + return [self initWithMovieURL:newMovieURL size:newSize fileType:newFileType outputSettings:outputSettings orientation:CGAffineTransformMakeRotation(degreesToRadian(0))]; +} + +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings orientation:(CGAffineTransform)orientationTransform; { if (!(self = [super init])) { @@ -115,7 +121,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr glEnableVertexAttribArray(colorSwizzlingPositionAttribute); glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); - [self initializeMovieWithOutputSettings:outputSettings]; + [self initializeMovieWithOutputSettings:outputSettings orientation:orientationTransform]; return self; } @@ -133,11 +139,7 @@ - (void)dealloc; #pragma mark - #pragma mark Movie recording -- (void)initializeMovie; -{ - [self initializeMovieWithOutputSettings:nil]; -} -- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; +- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings orientation:(CGAffineTransform)orientationTransform { isRecording = NO; @@ -176,8 +178,11 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; // custom output settings specified else { - // TODO: do we need to check if AVVideoCodecKey, AVVideoWidthKey & AVVideoHeightKey are set, & if not set them here? - // TODO: or is it ok to either ommit them, or rely on the calling code to set those values? + NSString *videoCodec = [outputSettings objectForKey:AVVideoCodecKey]; + NSNumber *width = [outputSettings objectForKey:AVVideoWidthKey]; + NSNumber *height = [outputSettings objectForKey:AVVideoHeightKey]; + + NSAssert(videoCodec && width && height, @"OutputSettings is missing required parameters."); } /* @@ -205,6 +210,7 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings]; assetWriterVideoInput.expectsMediaDataInRealTime = _encodingLiveVideo; + assetWriterVideoInput.transform = orientationTransform; // You need to use BGRA for the video in order to get realtime encoding. I use a color-swizzling shader to line up glReadPixels' normal RGBA output with the movie input's BGRA. NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, @@ -219,7 +225,7 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; [assetWriter addInput:assetWriterVideoInput]; } -- (void)startRecording; +- (void)startRecording { isRecording = YES; startTime = kCMTimeInvalid; @@ -231,8 +237,9 @@ - (void)startRecording; - (void)finishRecording; { isRecording = NO; -// [assetWriterVideoInput markAsFinished]; - [assetWriter finishWriting]; + [assetWriterVideoInput markAsFinished]; + [assetWriterAudioInput markAsFinished]; + [assetWriter finishWriting]; } - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; @@ -552,38 +559,22 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; #pragma mark Accessors - (void)setHasAudioTrack:(BOOL)newValue +{ + [self setHasAudioTrack:newValue audioSettings:nil]; +} + +- (void)setHasAudioTrack:(BOOL)newValue audioSettings:(NSDictionary *)audioOutputSettings { _hasAudioTrack = newValue; if (_hasAudioTrack) { - NSDictionary *audioOutputSettings = nil; if (_shouldPassthroughAudio) { -// float ver = [[[UIDevice currentDevice] systemVersion] floatValue]; -// if (ver < 4.3) // Older iOS versions complain about using nil settings for passthrough audio, so I need to check for that -// { -// double preferredHardwareSampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; -// -// AudioChannelLayout acl; -// bzero( &acl, sizeof(acl)); -// acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; -// -// audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys: -// [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, -// [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, -// [ NSNumber numberWithFloat: preferredHardwareSampleRate ], AVSampleRateKey, -// [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, -// //[ NSNumber numberWithInt:AVAudioQualityLow], AVEncoderAudioQualityKey, -// [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, -// nil]; -// } -// else -// { - audioOutputSettings = nil; -// } + // Do not set any settings so audio will be the same as passthrough + audioOutputSettings = nil; } - else + else if (audioOutputSettings == nil) { double preferredHardwareSampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 1dde7456d..6ccb085e0 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -38,4 +38,4 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (CGSize)maximumOutputSize; - (void)endProcessing; - (BOOL)shouldIgnoreUpdatesToThisTarget; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageRGBFilter.h b/framework/Source/GPUImageRGBFilter.h index e514c512e..18966b1b2 100755 --- a/framework/Source/GPUImageRGBFilter.h +++ b/framework/Source/GPUImageRGBFilter.h @@ -12,4 +12,4 @@ @property (readwrite, nonatomic) CGFloat green; @property (readwrite, nonatomic) CGFloat blue; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index 6cd1c2a3a..17d4864b1 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -29,4 +29,4 @@ typedef struct GPUByteColorVector GPUByteColorVector; - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; - (NSUInteger)bytesPerRowInOutput; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageTextureOutput.h b/framework/Source/GPUImageTextureOutput.h index 9fe5e6459..d9bd5976e 100755 --- a/framework/Source/GPUImageTextureOutput.h +++ b/framework/Source/GPUImageTextureOutput.h @@ -12,4 +12,4 @@ @protocol GPUImageTextureOutputDelegate - (void)newFrameReadyFromTextureOutput:(GPUImageTextureOutput *)callbackTextureOutput; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 50cf167e7..13349f5ad 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -36,6 +36,18 @@ /// The AVCaptureSession used to capture from the camera @property(readonly, retain) AVCaptureSession *captureSession; +/// This enables capture session preset to be changed on the fly +@property (readwrite) NSString *captureSessionPreset; + +/// This sets the frame rate of the camera (iOS 5 and above only) +/** + Setting this to 0 or below will set the frame rate back to the default setting for a particular preset. + */ +@property (readwrite) NSInteger frameRate; + +/// Easy way to tell if front-facing camera is present on device +@property (readonly, getter = isFrontFacingCameraPresent) BOOL frontFacingCameraPresent; + /// This enables the benchmarking mode, which logs out instantaneous and average frame times to the console @property(readwrite, nonatomic) BOOL runBenchmark; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index a738d166e..d3c375d35 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -11,6 +11,9 @@ @interface GPUImageVideoCamera () AVCaptureVideoDataOutput *videoOutput; AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; + + NSString *_capturSessionPreset; + NSInteger _frameRate; dispatch_queue_t audioProcessingQueue; } @@ -47,6 +50,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.processingQueue", NULL); + _frameRate = 0; // This will not set frame rate unless this value gets set to 1 or above _runBenchmark = NO; capturePaused = NO; outputRotation = kGPUImageNoRotation; @@ -112,7 +116,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD NSLog(@"Couldn't add video output"); } - [_captureSession setSessionPreset:sessionPreset]; + _capturSessionPreset = sessionPreset; + [_captureSession setSessionPreset:_capturSessionPreset]; // This will let you get 60 FPS video from the 720p preset on an iPhone 4S, but only that device and that preset // AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; @@ -200,6 +205,9 @@ - (void)resumeCameraCapture; - (void)rotateCamera { + if (self.frontFacingCameraPresent == NO) + return; + NSError *error; AVCaptureDeviceInput *newVideoInput; AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; @@ -250,6 +258,67 @@ - (AVCaptureDevicePosition)cameraPosition return [[videoInput device] position]; } +- (BOOL)isFrontFacingCameraPresent +{ + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + + for (AVCaptureDevice *device in devices) + { + if ([device position] == AVCaptureDevicePositionFront) + return YES; + } + + return NO; +} + +- (void)setCaptureSessionPreset:(NSString *)captureSessionPreset +{ + [_captureSession beginConfiguration]; + + _capturSessionPreset = captureSessionPreset; + [_captureSession setSessionPreset:_capturSessionPreset]; + + [_captureSession commitConfiguration]; +} + +- (NSString *)captureSessionPreset +{ + return _capturSessionPreset; +} + +- (void)setFrameRate:(NSInteger)frameRate +{ + _frameRate = frameRate; + + if (_frameRate > 0) + { + for (AVCaptureConnection *connection in videoOutput.connections) + { + if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) + connection.videoMinFrameDuration = CMTimeMake(1, _frameRate); + + if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) + connection.videoMaxFrameDuration = CMTimeMake(1, _frameRate); + } + } + else + { + for (AVCaptureConnection *connection in videoOutput.connections) + { + if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) + connection.videoMinFrameDuration = kCMTimeInvalid; + + if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) + connection.videoMaxFrameDuration = kCMTimeInvalid; + } + } +} + +- (NSInteger)frameRate +{ + return _frameRate; +} + #define INITIALFRAMESTOIGNOREFORBENCHMARK 5 - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; From 1abf1cb27f4fc7f5fd2eaf2c14d4caa7bf111341 Mon Sep 17 00:00:00 2001 From: Tom Corwine Date: Sat, 4 Aug 2012 21:15:39 -0400 Subject: [PATCH 173/695] Merged in changes to upstream repo. Added comments to clarify frame rate method. --- framework/Source/GPUImageVideoCamera.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index d3c375d35..ef928fde6 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -306,10 +306,10 @@ - (void)setFrameRate:(NSInteger)frameRate for (AVCaptureConnection *connection in videoOutput.connections) { if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) - connection.videoMinFrameDuration = kCMTimeInvalid; + connection.videoMinFrameDuration = kCMTimeInvalid; // This sets videoMinFrameDuration back to default if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) - connection.videoMaxFrameDuration = kCMTimeInvalid; + connection.videoMaxFrameDuration = kCMTimeInvalid; // This sets videoMaxFrameDuration back to default } } } From 533ec0d8237156fcba55efb9c141fe8bb108c97f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 4 Aug 2012 20:36:41 -0500 Subject: [PATCH 174/695] Fixed the playing of video directly in a GPUImageView, which was due to a bad -enabled property. This is now handled correctly in all input classes. --- framework/Source/GPUImageMovieWriter.h | 1 + framework/Source/GPUImageMovieWriter.m | 4 ++++ framework/Source/GPUImageOpenGLESContext.h | 1 + framework/Source/GPUImageOutput.h | 6 ------ framework/Source/GPUImageOutput.m | 7 ------- framework/Source/GPUImageRawDataOutput.h | 1 + framework/Source/GPUImageRawDataOutput.m | 2 ++ framework/Source/GPUImageTextureOutput.h | 1 + framework/Source/GPUImageTextureOutput.m | 16 ++++++++++++++++ framework/Source/GPUImageToneCurveFilter.h | 6 +++--- framework/Source/GPUImageVideoCamera.m | 6 ++++-- framework/Source/GPUImageView.h | 2 ++ framework/Source/GPUImageView.m | 4 +++- 13 files changed, 38 insertions(+), 19 deletions(-) diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 890d6dcca..177dd0d55 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -41,6 +41,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; @property(readwrite, nonatomic) BOOL encodingLiveVideo; @property(nonatomic, copy) void(^videoInputReadyCallback)(void); @property(nonatomic, copy) void(^audioInputReadyCallback)(void); +@property(nonatomic) BOOL enabled; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 53b475cbd..d41541998 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -56,6 +56,7 @@ @implementation GPUImageMovieWriter @synthesize failureBlock; @synthesize videoInputReadyCallback; @synthesize audioInputReadyCallback; +@synthesize enabled; @synthesize delegate = _delegate; @@ -73,6 +74,8 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr return nil; } + self.enabled = YES; + videoSize = newSize; movieURL = newMovieURL; fileType = newFileType; @@ -141,6 +144,7 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; { isRecording = NO; + self.enabled = YES; frameData = (GLubyte *) malloc((int)videoSize.width * (int)videoSize.height * 4); // frameData = (GLubyte *) calloc(videoSize.width * videoSize.height * 4, sizeof(GLubyte)); diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 1dde7456d..b1c251c60 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -38,4 +38,5 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (CGSize)maximumOutputSize; - (void)endProcessing; - (BOOL)shouldIgnoreUpdatesToThisTarget; +- (BOOL)enabled; @end \ No newline at end of file diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 409ee0701..980a7f6a0 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -73,12 +73,6 @@ void report_memory(NSString *tag); */ - (void)removeAllTargets; -/// @name The state of the GPUImageOutput - -/** Returns a BOOL indicating whether the GPUImageOutput is enabled or not. Default is YES. - */ -- (BOOL)isEnabled; - /// @name Manage the output texture - (void)initializeOutputTexture; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 10b40d55b..8e19adb15 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -71,13 +71,6 @@ - (void)dealloc [self deleteOutputTexture]; } -#pragma mark - -#pragma mark Status - -- (BOOL)isEnabled { - return _enabled; -} - #pragma mark - #pragma mark Managing targets diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index 6cd1c2a3a..2f2d37ca7 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -21,6 +21,7 @@ typedef struct GPUByteColorVector GPUByteColorVector; @property(readonly) GLubyte *rawBytesForImage; @property(nonatomic, copy) void(^newFrameAvailableBlock)(void); +@property(nonatomic) BOOL enabled; // Initialization and teardown - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsInBGRAFormat; diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index f38048ae2..9ee1d05dc 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -34,6 +34,7 @@ @implementation GPUImageRawDataOutput @synthesize rawBytesForImage = _rawBytesForImage; @synthesize newFrameAvailableBlock = _newFrameAvailableBlock; +@synthesize enabled; #pragma mark - #pragma mark Initialization and teardown @@ -45,6 +46,7 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn return nil; } + self.enabled = YES; outputBGRA = resultsInBGRAFormat; imageSize = newImageSize; hasReadFromTheCurrentFrame = NO; diff --git a/framework/Source/GPUImageTextureOutput.h b/framework/Source/GPUImageTextureOutput.h index 9fe5e6459..8a02ce466 100755 --- a/framework/Source/GPUImageTextureOutput.h +++ b/framework/Source/GPUImageTextureOutput.h @@ -7,6 +7,7 @@ @property(readwrite, unsafe_unretained, nonatomic) id delegate; @property(readonly) GLint texture; +@property(nonatomic) BOOL enabled; @end diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index c58879d1e..3067c95d4 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -4,6 +4,22 @@ @implementation GPUImageTextureOutput @synthesize delegate = _delegate; @synthesize texture = _texture; +@synthesize enabled; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + self.enabled = YES; + + return self; +} #pragma mark - #pragma mark GPUImageInput protocol diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h index 87de3d755..28bdc60dd 100644 --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -2,9 +2,9 @@ @interface GPUImageToneCurveFilter : GPUImageFilter -@property(readwrite, nonatomic) NSArray *redControlPoints; -@property(readwrite, nonatomic) NSArray *greenControlPoints; -@property(readwrite, nonatomic) NSArray *blueControlPoints; +@property(readwrite, nonatomic, copy) NSArray *redControlPoints; +@property(readwrite, nonatomic, copy) NSArray *greenControlPoints; +@property(readwrite, nonatomic, copy) NSArray *blueControlPoints; - (void)setRGBControlPoints:(NSArray *)points; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index a738d166e..09f807466 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -289,7 +289,8 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; for (id currentTarget in targets) { - if ([(GPUImageOutput *)currentTarget respondsToSelector:@selector(enabled)] && [(GPUImageOutput *)currentTarget isEnabled]) { + if ([currentTarget enabled]) + { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; @@ -345,7 +346,8 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; for (id currentTarget in targets) { - if ([(GPUImageOutput *)currentTarget respondsToSelector:@selector(enabled)] && [(GPUImageOutput *)currentTarget isEnabled]) { + if ([currentTarget enabled]) + { if (currentTarget != self.targetToIgnoreForUpdates) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index c5c8a8267..73097034a 100755 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -23,6 +23,8 @@ typedef enum { */ @property(readonly, nonatomic) CGSize sizeInPixels; +@property(nonatomic) BOOL enabled; + /** Handling fill mode @param redComponent Red component for background color diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 50c0360c6..70dbefae6 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -38,6 +38,7 @@ @implementation GPUImageView @synthesize sizeInPixels = _sizeInPixels; @synthesize fillMode = _fillMode; +@synthesize enabled; #pragma mark - #pragma mark Initialization and teardown @@ -79,6 +80,8 @@ - (void)commonInit; self.contentScaleFactor = [[UIScreen mainScreen] scale]; } + self.enabled = YES; + inputRotation = kGPUImageNoRotation; [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; @@ -350,7 +353,6 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); glUniform1i(displayInputTextureUniform, 4); - NSLog(@"input texture: %d", inputTextureForDisplay); glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); From d2b32fec48176dcb96dcc671b27c9fb38151147e Mon Sep 17 00:00:00 2001 From: Tom Corwine Date: Sat, 4 Aug 2012 22:21:21 -0400 Subject: [PATCH 175/695] Moved orientationTransform setting to startRecordingInOrientation instead of passing it into the initWith... method of GPUImageMovieWriter. --- framework/Source/GPUImageMovieWriter.h | 2 +- framework/Source/GPUImageMovieWriter.m | 21 ++++++++++----------- framework/Source/GPUImageView.m | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 3fa22f054..7cf5e7405 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -45,12 +45,12 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; -- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings orientation:(CGAffineTransform)orientationTransform; - (void)setHasAudioTrack:(BOOL)hasAudioTrack audioSettings:(NSDictionary *)audioOutputSettings; // Movie recording - (void)startRecording; +- (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; - (void)finishRecording; - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; - (void)enableSynchronizationCallbacks; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 2c3b01122..d28d1151c 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -4,8 +4,6 @@ #import "GLProgram.h" #import "GPUImageFilter.h" -#define degreesToRadian(x) (M_PI * (x) / 180.0) - NSString *const kGPUImageColorSwizzlingFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -37,7 +35,7 @@ @interface GPUImageMovieWriter () } // Movie recording -- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings orientation:(CGAffineTransform)orientationTransform; +- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; // Frame rendering - (void)createDataFBO; @@ -68,11 +66,6 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; return [self initWithMovieURL:newMovieURL size:newSize fileType:AVFileTypeQuickTimeMovie outputSettings:nil]; } - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; -{ - return [self initWithMovieURL:newMovieURL size:newSize fileType:newFileType outputSettings:outputSettings orientation:CGAffineTransformMakeRotation(degreesToRadian(0))]; -} - -- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings orientation:(CGAffineTransform)orientationTransform; { if (!(self = [super init])) { @@ -121,7 +114,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr glEnableVertexAttribArray(colorSwizzlingPositionAttribute); glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); - [self initializeMovieWithOutputSettings:outputSettings orientation:orientationTransform]; + [self initializeMovieWithOutputSettings:outputSettings]; return self; } @@ -139,7 +132,7 @@ - (void)dealloc; #pragma mark - #pragma mark Movie recording -- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings orientation:(CGAffineTransform)orientationTransform +- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings { isRecording = NO; @@ -210,7 +203,6 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings]; assetWriterVideoInput.expectsMediaDataInRealTime = _encodingLiveVideo; - assetWriterVideoInput.transform = orientationTransform; // You need to use BGRA for the video in order to get realtime encoding. I use a color-swizzling shader to line up glReadPixels' normal RGBA output with the movie input's BGRA. NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, @@ -227,6 +219,13 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings - (void)startRecording { + [self startRecordingInOrientation:CGAffineTransformMakeRotation(0)]; +} + +- (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform +{ + assetWriterVideoInput.transform = orientationTransform; + isRecording = YES; startTime = kCMTimeInvalid; // [assetWriter startWriting]; diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 50c0360c6..340e5b867 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -350,7 +350,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); glUniform1i(displayInputTextureUniform, 4); - NSLog(@"input texture: %d", inputTextureForDisplay); + //NSLog(@"input texture: %d", inputTextureForDisplay); glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); From 5b9a0287df5cda75915b63aa26dafb720b1b03f5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 5 Aug 2012 17:03:12 -0500 Subject: [PATCH 176/695] The pixellation filter now uses square pixels. The GPUImageGaussianSelectiveBlur now works over a circular region, although this can be overridden. --- README.md | 13 ++++++++ framework/GPUImage.xcodeproj/project.pbxproj | 22 ++++++------- .../GPUImageGaussianSelectiveBlurFilter.h | 4 +++ .../GPUImageGaussianSelectiveBlurFilter.m | 30 +++++++++++++++-- framework/Source/GPUImagePixellateFilter.h | 2 +- framework/Source/GPUImagePixellateFilter.m | 33 +++++++++++++++++-- 6 files changed, 87 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 3d86c7aec..aa1cfbd90 100755 --- a/README.md +++ b/README.md @@ -82,6 +82,14 @@ Documentation is generated from header comments using appledoc. To build the doc - *shadows*: Increase to lighten shadows, from 0.0 to 1.0, with 0.0 as the default. - *highlights*: Decrease to darken highlights, from 0.0 to 1.0, with 1.0 as the default. +- **GPUImageLookupFilter**: Uses an RGB color lookup image to remap the colors in an image. First, use your favourite photo editing application to apply a filter to lookup.png from GPUImage/framework/Resources. For this to work properly each pixel color must not depend on other pixels (e.g. blur will not work). If you need a more complex filter you can create as many lookup tables as required. Once ready, use your new lookup.png file as a second input for GPUImageLookupFilter. + +- **GPUImageLookupFilter**: A photo filter based on a Photoshop action by Amatorka: http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631 . If you want to use this effect you have to add lookup_amatorka.png from the GPUImage Resources folder to your application bundle. + +- **GPUImageMissEtikateFilter**: A photo filter based on a Photoshop action by Miss Etikate: http://miss-etikate.deviantart.com/art/Photoshop-Action-15-120151961 . If you want to use this effect you have to add lookup_miss_etikate.png from the GPUImage Resources folder to your application bundle. + +- **GPUImageSoftEleganceFilter**: Another lookup-based color remapping filter. If you want to use this effect you have to add lookup_soft_elegance_1.png and lookup_soft_elegance_2.png from the GPUImage Resources folder to your application bundle. + - **GPUImageColorInvertFilter**: Inverts the colors of an image - **GPUImageGrayscaleFilter**: Converts an image to grayscale (a slightly faster implementation of the saturation filter, without the ability to vary the color contribution) @@ -138,6 +146,7 @@ Documentation is generated from header comments using appledoc. To build the doc - *excludeCircleRadius*: The radius of the circular area being excluded from the blur - *excludeCirclePoint*: The center of the circular area being excluded from the blur - *excludeBlurSize*: The size of the area between the blurred portion and the clear circle + - *aspectRatio*: The aspect ratio of the image, used to adjust the circularity of the in-focus region. By default, this matches the image aspect ratio, but you can override this value. - **GPUImageTiltShiftFilter**: A simulated tilt shift lens effect - *blurSize*: A multiplier for the size of the out-of-focus blur, ranging from 0.0 on up, with a default of 2.0 @@ -210,6 +219,10 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageMultiplyBlendFilter**: Applies a multiply blend of two images +- **GPUImageAddBlendFilter**: Applies an additive blend of two images + +- **GPUImageDivideBlendFilter**: Applies a division blend of two images + - **GPUImageOverlayBlendFilter**: Applies an overlay blend of two images - **GPUImageDarkenBlendFilter**: Blends two images by taking the minimum value of each color component between the images diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 592640f74..7e86c25aa 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -599,8 +599,6 @@ children = ( BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */, BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */, - 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */, - 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */, BCB6B833150400030041703B /* GPUImageExposureFilter.h */, BCB6B834150400030041703B /* GPUImageExposureFilter.m */, BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */, @@ -612,11 +610,9 @@ B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */, B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */, BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */, + BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */, C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */, C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */, - BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */, - BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */, - BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */, BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */, BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */, BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */, @@ -639,6 +635,16 @@ BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */, BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */, BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */, + BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */, + BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */, + 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */, + 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */, + 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */, + 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */, + 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */, + 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */, + 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */, + 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */, BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */, BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */, ); @@ -735,12 +741,6 @@ BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */, BCF1E53E15669907006B155F /* GPUImageVoroniConsumerFilter.h */, BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */, - 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */, - 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */, - 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */, - 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */, - 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */, - 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */, ); name = Effects; sourceTree = ""; diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h index 99adc6fd2..3bf8e6200 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h @@ -8,6 +8,7 @@ { GPUImageGaussianBlurFilter *blurFilter; GPUImageFilter *selectiveFocusFilter; + BOOL hasOverriddenAspectRatio; } /** The radius of the circular area being excluded from the blur @@ -22,5 +23,8 @@ /** A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 */ @property (readwrite, nonatomic) CGFloat blurSize; +/** The aspect ratio of the image, used to adjust the circularity of the in-focus region. By default, this matches the image aspect ratio, but you can override this value. + */ +@property (readwrite, nonatomic) CGFloat aspectRatio; @end diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index eaf2931b9..ea0634f28 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -13,15 +13,17 @@ uniform lowp float excludeCircleRadius; uniform lowp vec2 excludeCirclePoint; uniform lowp float excludeBlurSize; - + uniform highp float aspectRatio; + void main() { lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); - lowp float d = distance(textureCoordinate2, excludeCirclePoint); + highp vec2 textureCoordinateToUse = vec2(textureCoordinate2.x, (textureCoordinate2.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float distanceFromCenter = distance(excludeCirclePoint, textureCoordinateToUse); - gl_FragColor = mix(sharpImageColor, blurredImageColor, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, d)); + gl_FragColor = mix(sharpImageColor, blurredImageColor, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, distanceFromCenter)); } ); @@ -37,6 +39,8 @@ - (id)init; return nil; } + hasOverriddenAspectRatio = NO; + // First pass: apply a variable Gaussian blur blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; [self addFilter:blurFilter]; @@ -61,6 +65,19 @@ - (id)init; return self; } +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + inputTextureSize = newSize; + + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!hasOverriddenAspectRatio) ) + { + _aspectRatio = (inputTextureSize.width / inputTextureSize.height); + [selectiveFocusFilter setFloat:_aspectRatio forUniform:@"aspectRatio"]; + } +} + #pragma mark - #pragma mark Accessors @@ -92,4 +109,11 @@ - (void)setExcludeBlurSize:(CGFloat)newValue; [selectiveFocusFilter setFloat:newValue forUniform:@"excludeBlurSize"]; } +- (void)setAspectRatio:(CGFloat)newValue; +{ + hasOverriddenAspectRatio = YES; + _aspectRatio = newValue; + [selectiveFocusFilter setFloat:_aspectRatio forUniform:@"aspectRatio"]; +} + @end diff --git a/framework/Source/GPUImagePixellateFilter.h b/framework/Source/GPUImagePixellateFilter.h index 916482168..c101dd533 100755 --- a/framework/Source/GPUImagePixellateFilter.h +++ b/framework/Source/GPUImagePixellateFilter.h @@ -2,7 +2,7 @@ @interface GPUImagePixellateFilter : GPUImageFilter { - GLint fractionalWidthOfAPixelUniform; + GLint fractionalWidthOfAPixelUniform, aspectRatioUniform; } // The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored. diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index 96f3604b8..16328cf39 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -7,19 +7,27 @@ uniform sampler2D inputImageTexture; uniform highp float fractionalWidthOfPixel; - + uniform highp float aspectRatio; + void main() { - highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel); + highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor); gl_FragColor = texture2D(inputImageTexture, samplePos ); } ); +@interface GPUImagePixellateFilter () + +@property (readwrite, nonatomic) CGFloat aspectRatio; + +@end + @implementation GPUImagePixellateFilter @synthesize fractionalWidthOfAPixel = _fractionalWidthOfAPixel; +@synthesize aspectRatio = _aspectRatio; #pragma mark - #pragma mark Initialization and teardown @@ -32,12 +40,24 @@ - (id)init; } fractionalWidthOfAPixelUniform = [filterProgram uniformIndex:@"fractionalWidthOfPixel"]; + aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; self.fractionalWidthOfAPixel = 0.05; return self; } +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } +} + #pragma mark - #pragma mark Accessors @@ -67,4 +87,13 @@ - (void)setFractionalWidthOfAPixel:(CGFloat)newValue; glUniform1f(fractionalWidthOfAPixelUniform, _fractionalWidthOfAPixel); } +- (void)setAspectRatio:(CGFloat)newValue; +{ + _aspectRatio = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(aspectRatioUniform, _aspectRatio); +} + @end From c1d1bb78ffa7b34be5faf1271a99b289ab39b4d2 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 5 Aug 2012 19:04:31 -0500 Subject: [PATCH 177/695] Added a polka dot filter, based on the existing pixellation one. --- README.md | 4 ++ .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 ++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 +++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImagePixellateFilter.m | 16 +++++- framework/Source/GPUImagePolkaDotFilter.h | 10 ++++ framework/Source/GPUImagePolkaDotFilter.m | 57 +++++++++++++++++++ 9 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 framework/Source/GPUImagePolkaDotFilter.h create mode 100644 framework/Source/GPUImagePolkaDotFilter.m diff --git a/README.md b/README.md index aa1cfbd90..47f2b242b 100755 --- a/README.md +++ b/README.md @@ -255,6 +255,10 @@ Documentation is generated from header comments using appledoc. To build the doc - *center*: The center about which to apply the pixellation, defaulting to (0.5, 0.5) - *pixelSize*: The fractional pixel size, split into width and height components. The default is (0.05, 0.05) +- **GPUImagePolkaDotFilter**: Breaks an image up into colored dots within a regular grid + - *fractionalWidthOfAPixel*: How large the dots are, as a fraction of the width and height of the image (0.0 - 1.0, default 0.05) + - *dotScaling*: What fraction of each grid space is taken up by a dot, from 0.0 to 1.0 with a default of 0.9. + - **GPUImageCrosshatchFilter**: This converts an image into a black-and-white crosshatch pattern - *crossHatchSpacing*: The fractional width of the image to use as the spacing for the crosshatch. The default is 0.03. - *lineWidth*: A relative width for the crosshatch lines. The default is 0.003. diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index db4e291ec..81449c852 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -98,6 +98,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_AMATORKA: cell.textLabel.text = @"Amatorka (Lookup)"; break; case GPUIMAGE_PIXELLATE: cell.textLabel.text = @"Pixellate"; break; case GPUIMAGE_POLARPIXELLATE: cell.textLabel.text = @"Polar pixellate"; break; + case GPUIMAGE_POLKADOT: cell.textLabel.text = @"Polka dot"; break; case GPUIMAGE_CROSSHATCH: cell.textLabel.text = @"Crosshatch"; break; case GPUIMAGE_SOBELEDGEDETECTION: cell.textLabel.text = @"Sobel edge detection"; break; case GPUIMAGE_PREWITTEDGEDETECTION: cell.textLabel.text = @"Prewitt edge detection"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index e1851e849..b269209c0 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -31,6 +31,7 @@ typedef enum { GPUIMAGE_ADAPTIVETHRESHOLD, GPUIMAGE_PIXELLATE, GPUIMAGE_POLARPIXELLATE, + GPUIMAGE_POLKADOT, GPUIMAGE_CROSSHATCH, GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_PREWITTEDGEDETECTION, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 0587ff7a8..a7f543ca5 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -100,6 +100,17 @@ - (void)setupFilter; filter = [[GPUImagePolarPixellateFilter alloc] init]; }; break; + case GPUIMAGE_POLKADOT: + { + self.title = @"Polka Dot"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setValue:0.05]; + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:0.3]; + + filter = [[GPUImagePolkaDotFilter alloc] init]; + }; break; case GPUIMAGE_CROSSHATCH: { self.title = @"Crosshatch"; @@ -1167,6 +1178,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_SEPIA: [(GPUImageSepiaFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_POLARPIXELLATE: [(GPUImagePolarPixellateFilter *)filter setPixelSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; + case GPUIMAGE_POLKADOT: [(GPUImagePolkaDotFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_SATURATION: [(GPUImageSaturationFilter *)filter setSaturation:[(UISlider *)sender value]]; break; case GPUIMAGE_CONTRAST: [(GPUImageContrastFilter *)filter setContrast:[(UISlider *)sender value]]; break; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 7e86c25aa..6b07155a8 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -276,6 +276,8 @@ BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; }; BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; + BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; }; + BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; }; @@ -551,6 +553,8 @@ BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOpacityFilter.h; path = Source/GPUImageOpacityFilter.h; sourceTree = SOURCE_ROOT; }; BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpacityFilter.m; path = Source/GPUImageOpacityFilter.m; sourceTree = SOURCE_ROOT; }; + BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePolkaDotFilter.h; path = Source/GPUImagePolkaDotFilter.h; sourceTree = SOURCE_ROOT; }; + BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePolkaDotFilter.m; path = Source/GPUImagePolkaDotFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; @@ -701,6 +705,8 @@ BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */, BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */, BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */, + BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */, + BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */, BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */, BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */, BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */, @@ -1096,6 +1102,7 @@ 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */, BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */, BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */, + BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1334,6 +1341,7 @@ 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */, BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */, BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */, + BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index ccef2d0a0..6226b786e 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -116,3 +116,4 @@ #import "GPUImageSoftEleganceFilter.h" #import "GPUImageAddBlendFilter.h" #import "GPUImageDivideBlendFilter.h" +#import "GPUImagePolkaDotFilter.h" diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index 16328cf39..c6d07d122 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -13,10 +13,10 @@ void main() { highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); - highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor); + highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; gl_FragColor = texture2D(inputImageTexture, samplePos ); } - ); +); @interface GPUImagePixellateFilter () @@ -34,7 +34,17 @@ @implementation GPUImagePixellateFilter - (id)init; { - if (!(self = [super initWithFragmentShaderFromString:kGPUImagePixellationFragmentShaderString])) + if (!(self = [self initWithFragmentShaderFromString:kGPUImagePixellationFragmentShaderString])) + { + return nil; + } + + return self; +} + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithFragmentShaderFromString:fragmentShaderString])) { return nil; } diff --git a/framework/Source/GPUImagePolkaDotFilter.h b/framework/Source/GPUImagePolkaDotFilter.h new file mode 100644 index 000000000..369b77371 --- /dev/null +++ b/framework/Source/GPUImagePolkaDotFilter.h @@ -0,0 +1,10 @@ +#import "GPUImagePixellateFilter.h" + +@interface GPUImagePolkaDotFilter : GPUImagePixellateFilter +{ + GLint dotScalingUniform; +} + +@property(readwrite, nonatomic) CGFloat dotScaling; + +@end diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m new file mode 100644 index 000000000..42946ad27 --- /dev/null +++ b/framework/Source/GPUImagePolkaDotFilter.m @@ -0,0 +1,57 @@ +#import "GPUImagePolkaDotFilter.h" + +NSString *const kGPUImagePolkaDotFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform highp float fractionalWidthOfPixel; + uniform highp float aspectRatio; + uniform highp float dotScaling; + + void main() + { + highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + + highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp vec2 adjustedSamplePos = vec2(samplePos.x, (samplePos.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float distanceFromSamplePoint = distance(adjustedSamplePos, textureCoordinateToUse); + lowp float checkForPresenceWithinDot = step(distanceFromSamplePoint, (fractionalWidthOfPixel * 0.5) * dotScaling); + + gl_FragColor = vec4(texture2D(inputImageTexture, samplePos ).rgb * checkForPresenceWithinDot, 1.0); + } +); + +@implementation GPUImagePolkaDotFilter + +@synthesize dotScaling = _dotScaling; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImagePolkaDotFragmentShaderString])) + { + return nil; + } + + dotScalingUniform = [filterProgram uniformIndex:@"dotScaling"]; + + self.dotScaling = 0.90; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setDotScaling:(CGFloat)newValue; +{ + _dotScaling = newValue; + + [GPUImageOpenGLESContext useImageProcessingContext]; + [filterProgram use]; + glUniform1f(dotScalingUniform, _dotScaling); +} + +@end From 9bd4ca206245bc406ebc39d1ab77fdd751d4cca5 Mon Sep 17 00:00:00 2001 From: Johannes Schriewer Date: Mon, 6 Aug 2012 17:50:37 +0200 Subject: [PATCH 178/695] Add support for operating on CGImages directly instead of UIImages --- framework/Source/GPUImageFilter.m | 22 ++++++++++-- framework/Source/GPUImageFilterGroup.m | 22 ++++++++++-- framework/Source/GPUImageOutput.h | 5 +++ framework/Source/GPUImageOutput.m | 46 ++++++++++++++++++++++++++ framework/Source/GPUImagePicture.h | 2 ++ framework/Source/GPUImagePicture.m | 26 +++++++++++---- 6 files changed, 112 insertions(+), 11 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 94e899927..e25a0d476 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -197,21 +197,37 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio return finalImage; } -- (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter { + return [self newCGImageByFilteringCGImage:imageToFilter orientation:UIImageOrientationUp]; +} + +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; { - GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageToFilter]; + GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; [self prepareForImageCapture]; [stillImageSource addTarget:self]; [stillImageSource processImage]; - UIImage *processedImage = [self imageFromCurrentlyProcessedOutputWithOrientation:[imageToFilter imageOrientation]]; + CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation]; [stillImageSource removeTarget:self]; return processedImage; } +- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter { + return [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; +} + +- (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; +{ + CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; + UIImage *processedImage = [UIImage imageWithCGImage:image scale:[imageToFilter scale] orientation:[imageToFilter imageOrientation]]; + CGImageRelease(image); + return processedImage; +} + #pragma mark - #pragma mark Managing the display FBOs diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 7e36e0f23..115667d8c 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -47,14 +47,32 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio return [self.terminalFilter imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; } +- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +{ + return [self.terminalFilter newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; +} + - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; { - GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageToFilter]; + CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; + UIImage *processedImage = [UIImage imageWithCGImage:image]; + CGImageRelease(image); + return processedImage; +} + +- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter; +{ + return [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; +} + +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; +{ + GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; [stillImageSource addTarget:self]; [stillImageSource processImage]; - UIImage *processedImage = [self.terminalFilter imageFromCurrentlyProcessedOutput]; + CGImageRef processedImage = [self.terminalFilter newCGImageFromCurrentlyProcessedOutput]; [stillImageSource removeTarget:self]; return processedImage; diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 980a7f6a0..c65485870 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -85,11 +85,13 @@ void report_memory(NSString *tag); /** Retreives the currently processed image as a UIImage. */ - (UIImage *)imageFromCurrentlyProcessedOutput; +- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; /** Convenience method to retreive the currently processed image with a different orientation. @param imageOrientation Orientation for image */ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; /** Convenience method to process an image with a filter. @@ -98,6 +100,9 @@ void report_memory(NSString *tag); @param imageToFilter Image to be filtered */ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; +- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter; +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; - (void)prepareForImageCapture; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 8e19adb15..73734805f 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -235,6 +235,32 @@ - (UIImage *)imageFromCurrentlyProcessedOutput; return [self imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; } +- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; +{ + UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; + UIImageOrientation imageOrientation = UIImageOrientationLeft; + switch (deviceOrientation) + { + case UIDeviceOrientationPortrait: + imageOrientation = UIImageOrientationUp; + break; + case UIDeviceOrientationPortraitUpsideDown: + imageOrientation = UIImageOrientationDown; + break; + case UIDeviceOrientationLandscapeLeft: + imageOrientation = UIImageOrientationLeft; + break; + case UIDeviceOrientationLandscapeRight: + imageOrientation = UIImageOrientationRight; + break; + default: + imageOrientation = UIImageOrientationUp; + break; + } + + return [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; +} + - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { return nil; @@ -245,6 +271,26 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; return nil; } +- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +{ + return nil; +} + +- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter; +{ + return nil; +} + +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; +{ + return nil; +} + +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; +{ + return nil; +} + - (void)prepareForImageCapture; { diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 0c2df936d..786666bdd 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -10,7 +10,9 @@ // Initialization and teardown - (id)initWithImage:(UIImage *)newImageSource; +- (id)initWithCGImage:(CGImageRef)newImageSource; - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; +- (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; // Image rendering - (void)processImage; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index d366db432..b1544d4ac 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -15,7 +15,21 @@ - (id)initWithImage:(UIImage *)newImageSource; return self; } +- (id)initWithCGImage:(CGImageRef)newImageSource; +{ + if (!(self = [self initWithCGImage:newImageSource smoothlyScaleOutput:NO])) + { + return nil; + } + return self; +} + - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; +{ + return [self initWithCGImage:[newImageSource CGImage] smoothlyScaleOutput:smoothlyScaleOutput]; +} + +- (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; { if (!(self = [super init])) { @@ -24,10 +38,10 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly self.shouldSmoothlyScaleOutput = smoothlyScaleOutput; [GPUImageOpenGLESContext useImageProcessingContext]; - - CGSize pointSizeOfImage = [newImageSource size]; - CGFloat scaleOfImage = [newImageSource scale]; - pixelSizeOfImage = CGSizeMake(scaleOfImage * pointSizeOfImage.width, scaleOfImage * pointSizeOfImage.height); + + CGFloat widthOfImage = CGImageGetWidth(newImageSource); + CGFloat heightOfImage = CGImageGetHeight(newImageSource); + pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); CGSize pixelSizeToUseForTexture = pixelSizeOfImage; BOOL shouldRedrawUsingCoreGraphics = YES; @@ -65,14 +79,14 @@ - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothly CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 8, (int)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html - CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), [newImageSource CGImage]); + CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), newImageSource); CGContextRelease(imageContext); CGColorSpaceRelease(genericRGBColorspace); } else { // Access the raw image bytes directly - dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider([newImageSource CGImage])); + dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider(newImageSource)); imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); } From 2c8ba12ccce4022d3399c6f27af70d04dc410854 Mon Sep 17 00:00:00 2001 From: Johannes Schriewer Date: Mon, 6 Aug 2012 18:12:50 +0200 Subject: [PATCH 179/695] Bugfix: Missed out one function to make CGImage processing work --- framework/Source/GPUImageFilter.m | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index e25a0d476..13133a2ad 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -143,11 +143,10 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) filter.preventRendering = NO; } -- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; -{ +- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation { [GPUImageOpenGLESContext useImageProcessingContext]; [self setOutputFBO]; - + CGSize currentFBOSize = [self sizeOfFBO]; NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; // It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache @@ -159,7 +158,7 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CGDataProviderRef dataProvider; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { -// glFlush(); + // glFlush(); glFinish(); CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation CVPixelBufferLockBaseAddress(renderTarget, 0); @@ -176,7 +175,7 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); - + CGImageRef cgImageFromBytes; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { @@ -188,12 +187,18 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio } // Capture image with current device orientation - UIImage *finalImage = [UIImage imageWithCGImage:cgImageFromBytes scale:1.0 orientation:imageOrientation]; - - CGImageRelease(cgImageFromBytes); CGDataProviderRelease(dataProvider); CGColorSpaceRelease(defaultRGBColorSpace); - + + return cgImageFromBytes; +} + +- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +{ + CGImageRef cgImageFromBytes = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + UIImage *finalImage = [UIImage imageWithCGImage:cgImageFromBytes scale:1.0 orientation:imageOrientation]; + CGImageRelease(cgImageFromBytes); + return finalImage; } From ca940cd5b80677e055fd8245a26b0daca55c0d00 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 6 Aug 2012 13:35:45 -0500 Subject: [PATCH 180/695] Added a local binary pattern filter. --- .../project.pbxproj | 4 + .../FeatureExtractionAppDelegate.m | 11 +++ .../FeatureExtractionTest/LBPTest.png | Bin 0 -> 2764 bytes .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 17 ++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 1 + .../Source/GPUImageLocalBinaryPatternFilter.h | 5 ++ .../Source/GPUImageLocalBinaryPatternFilter.m | 77 ++++++++++++++++++ 10 files changed, 125 insertions(+) create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/LBPTest.png create mode 100644 framework/Source/GPUImageLocalBinaryPatternFilter.h create mode 100644 framework/Source/GPUImageLocalBinaryPatternFilter.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index 2d106c3cb..2b6cbe9d8 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ BC18E0C8156C835E00AB8026 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C7156C835E00AB8026 /* OpenGLES.framework */; }; BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C9156C836400AB8026 /* AVFoundation.framework */; }; BC18E0CC156C881700AB8026 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0CB156C881700AB8026 /* 71yih.png */; }; + BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC46D52315D03D9C00CC63CA /* LBPTest.png */; }; BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCD9A355157EC35E00C41504 /* 8pixeltest.png */; }; /* End PBXBuildFile section */ @@ -65,6 +66,7 @@ BC18E0C7156C835E00AB8026 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; BC18E0C9156C836400AB8026 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BC18E0CB156C881700AB8026 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; + BC46D52315D03D9C00CC63CA /* LBPTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LBPTest.png; sourceTree = ""; }; BCD9A355157EC35E00C41504 /* 8pixeltest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 8pixeltest.png; sourceTree = ""; }; /* End PBXFileReference section */ @@ -134,6 +136,7 @@ BC18E0A1156C822E00AB8026 /* Supporting Files */ = { isa = PBXGroup; children = ( + BC46D52315D03D9C00CC63CA /* LBPTest.png */, BCD9A355157EC35E00C41504 /* 8pixeltest.png */, BC18E0CB156C881700AB8026 /* 71yih.png */, BC18E0A2156C822E00AB8026 /* FeatureExtractionTest-Info.plist */, @@ -232,6 +235,7 @@ BC18E0A5156C822E00AB8026 /* InfoPlist.strings in Resources */, BC18E0CC156C881700AB8026 /* 71yih.png in Resources */, BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */, + BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index c796f1788..c2ce86a7e 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -56,6 +56,17 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( UIImage *compressedImage = [packingFilter imageFromCurrentlyProcessedOutput]; [self saveImage:compressedImage fileName:@"Compression.png"]; + // Testing local binary patterns + UIImage *inputLBPImage = [UIImage imageNamed:@"LBPTest.png"]; + GPUImagePicture *lbpImage = [[GPUImagePicture alloc] initWithImage:inputLBPImage]; + + GPUImageLocalBinaryPatternFilter *lbpFilter = [[GPUImageLocalBinaryPatternFilter alloc] init]; + [lbpImage removeAllTargets]; + [lbpImage addTarget:lbpFilter]; + [lbpImage processImage]; + UIImage *lbpOutput = [lbpFilter imageFromCurrentlyProcessedOutput]; + [self saveImage:lbpOutput fileName:@"LocalBinaryPatterns.png"]; + return YES; } diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/LBPTest.png b/examples/FeatureExtractionTest/FeatureExtractionTest/LBPTest.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1d551e21e363151f8a34c449d8100721f5dc42 GIT binary patch literal 2764 zcmb_ddpwls9)D+Kh}4#AB-4ybtDS2_-Wfxg7RjYSvC=fg$Y3sJUQ9HnX;T(^vX(AX zoJ7P5xusm@a>^Uu!bGxI+0_xJt&e$Vs$J7vqEFyw|wZfaS9t=IkS_He&(f_l?v@~<;) zFVS_;iTB&$QSR5dy2j#_Q%iO#$k`FMyvEpIISlYqYR+ zTVuEQSgYl*ZlQWLf?O>N!c{WpDhAS&es8YPRa8)NY2l9y!JU3wQg|g{b{Y0`#KegI zVV^f=a;lhDmc`50z4WS$x4TU-@P1iRe5rmjk1|@BiX2YkX=uLMc_N^$*)|WinIaMZO4kqVGJ=qT!59+sx z^V8_*;X5D4_BNG%lhzDJCk58!wmg)mN$koBtMgP_+Cl5}S$Z#Ac7<{;UEJJ#DcyI6 z=38PKX-|^$OU||94XGwgORq+rTiK+y?PlAM`N6`V=zYt(WvbUQ^t*q^>}?-`5C;2Y zcGV#6F=ADZe2e;Z@JzpP(_$=Z=aYAoW{{inpo&hs8@+9aTK1aGuYJGzbs;VL2 zfV!3);B6qQEjA}c5sAs zJ0&+X)NW)c`4-~Z)a}vQ&`@YPeEgriiJV5OV(!g~hACN531*r@gOm0~C!9EUYb>&1 zu?TH!yBpSFrZvoa;M>|w>n=H;^YqoBRsfg~YBT zT`(0}ir2keE4C2h-fmBTe6OP3n))BFO~$I)TzgiNX(o#)qBFF66a0g_LNhm7c)Hz+ zd8q#=b-H@`GTEqDr;5HhCHG;?*vR6SElb`S*BC$=r6I26F_`Cz3^pt?L!3q2z3KIH zYyqU_+mo4cfo3JWDVsp&M(#fI=tP1D%t)|sihq{qexq?0tk z+kwaHvl7)NuhtAaIq&okk?aW;_q{P5avA7_D%(Vo-@NZwP)R1%hO?Kf4M}v=tX>;y z+|CyW7lj$E(^gy?i}_BzLIBWIj5W1kK>8U2#U&zVd-*^K-kAr0d@&Z^`5r?l} z0{~eBDux^u#6XHTVO$|7vPI1?K*d-I<50*s3KVLK@^SS*I`9N6Bt(UzTElIAsJ!z~XTqb1S4| zB?{75LS9&eGQBsK4N(Z>Ir2jIQ?++02OftnUI$~v4wo!KPxaFd@ms5lqSwIb*^JdHx}Uk&uo^6{TF5{BcGeCL_rU> zh!y5TWph~EIqR%8ka2$+n76#SxC1YYC-CGmm@K6m3!#PVxiY?gRc2n`?=~fn`EjT7 zBLrb{`#g||V}-F4D~5y$R|tRHf`Lp>7!eS{VnQGK@NQ4fbz=)-A8sB@#(mEI+uEr( z@gJxDhod86@IP;+f(^Rz0@*?PsSJokA>s){41N;^Z{nqFL)!lqBUQ^N~5hvNu z0u@g~{WiE%LepqSMCrlplb6e!VZfmynkQlX+ceAriO7M`qVVX-v+@f0OwgL<-E}Ws zhQeD9Gi|L?s7I`Y;-aJomP3h@u3EoAZ9;u!_)H_d`sq3?$uFV5d-pp%-_sa#DqSv_ z0PY`^#2t&`l=XKRZNXfqXiFr`I!3EB!0hws9Cft^KTUP;U?S8FXmwZJV{?^LmepBB zI>VCX<%PxffuBaQH>M?TYJs6UQT{1%p!;N2V_YT)jTxs!tF){9%NQQjeZH~72npm7 z+Xh(nWeHiYq(G`qnP}w~g;~KAB4DP6*@K`KtW9^1R-uGE{p$Nv&F4wV{}1P_Zq!R# H_I~?2I$cSK literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 81449c852..0318de648 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -129,6 +129,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_PERLINNOISE: cell.textLabel.text = @"Perlin noise"; break; case GPUIMAGE_VORONI: cell.textLabel.text = @"Voroni"; break; case GPUIMAGE_MOSAIC: cell.textLabel.text = @"Mosaic"; break; + case GPUIMAGE_LOCALBINARYPATTERN: cell.textLabel.text = @"Local binary pattern"; break; case GPUIMAGE_CHROMAKEY: cell.textLabel.text = @"Chroma key (green)"; break; case GPUIMAGE_DISSOLVE: cell.textLabel.text = @"Dissolve blend"; break; case GPUIMAGE_SCREENBLEND: cell.textLabel.text = @"Screen blend"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index b269209c0..f61ceec1b 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -70,6 +70,7 @@ typedef enum { GPUIMAGE_PERLINNOISE, GPUIMAGE_VORONI, GPUIMAGE_MOSAIC, + GPUIMAGE_LOCALBINARYPATTERN, GPUIMAGE_DISSOLVE, GPUIMAGE_CHROMAKEY, GPUIMAGE_ADD, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index a7f543ca5..be7a96eef 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -469,6 +469,17 @@ - (void)setupFilter; filter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; }; break; + case GPUIMAGE_LOCALBINARYPATTERN: + { + self.title = @"Local Binary Pattern"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:1.0]; + [self.filterSettingsSlider setMaximumValue:5.0]; + [self.filterSettingsSlider setValue:1.0]; + + filter = [[GPUImageLocalBinaryPatternFilter alloc] init]; + }; break; case GPUIMAGE_BUFFER: { self.title = @"Image Buffer"; @@ -1243,6 +1254,12 @@ - (IBAction)updateFilterFromSlider:(id)sender; [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:midpoint - 0.1]; [(GPUImageTiltShiftFilter *)filter setBottomFocusLevel:midpoint + 0.1]; }; break; + case GPUIMAGE_LOCALBINARYPATTERN: + { + CGFloat multiplier = [(UISlider *)sender value]; + [(GPUImageLocalBinaryPatternFilter *)filter setTexelWidth:(multiplier / self.view.bounds.size.width)]; + [(GPUImageLocalBinaryPatternFilter *)filter setTexelHeight:(multiplier / self.view.bounds.size.height)]; + }; break; default: break; } } diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 6b07155a8..6c7650eab 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -278,6 +278,8 @@ BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; }; BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; + BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; }; + BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; }; @@ -555,6 +557,8 @@ BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpacityFilter.m; path = Source/GPUImageOpacityFilter.m; sourceTree = SOURCE_ROOT; }; BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePolkaDotFilter.h; path = Source/GPUImagePolkaDotFilter.h; sourceTree = SOURCE_ROOT; }; BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePolkaDotFilter.m; path = Source/GPUImagePolkaDotFilter.m; sourceTree = SOURCE_ROOT; }; + BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLocalBinaryPatternFilter.h; path = Source/GPUImageLocalBinaryPatternFilter.h; sourceTree = SOURCE_ROOT; }; + BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLocalBinaryPatternFilter.m; path = Source/GPUImageLocalBinaryPatternFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; @@ -887,6 +891,8 @@ BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */, BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */, BC0690F6157C5075009274F9 /* GPUImageColorPackingFilter.m */, + BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */, + BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -1103,6 +1109,7 @@ BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */, BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */, BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */, + BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1342,6 +1349,7 @@ BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */, BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */, BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */, + BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 6226b786e..5edb64b2c 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -117,3 +117,4 @@ #import "GPUImageAddBlendFilter.h" #import "GPUImageDivideBlendFilter.h" #import "GPUImagePolkaDotFilter.h" +#import "GPUImageLocalBinaryPatternFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.h b/framework/Source/GPUImageLocalBinaryPatternFilter.h new file mode 100644 index 000000000..431dbbd4f --- /dev/null +++ b/framework/Source/GPUImageLocalBinaryPatternFilter.h @@ -0,0 +1,5 @@ +#import "GPUImage3x3TextureSamplingFilter.h" + +@interface GPUImageLocalBinaryPatternFilter : GPUImage3x3TextureSamplingFilter + +@end diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.m b/framework/Source/GPUImageLocalBinaryPatternFilter.m new file mode 100644 index 000000000..cc1489cd7 --- /dev/null +++ b/framework/Source/GPUImageLocalBinaryPatternFilter.m @@ -0,0 +1,77 @@ +#import "GPUImageLocalBinaryPatternFilter.h" + +// This is based on "Accelerating image recognition on mobile devices using GPGPU" by Miguel Bordallo Lopez, Henri Nykanen, Jari Hannuksela, Olli Silven and Markku Vehvilainen +// http://www.ee.oulu.fi/~jhannuks/publications/SPIE2011a.pdf + +// Right pixel is the most significant bit, traveling clockwise to get to the upper right, which is the least significant +// If the external pixel is greater than or equal to the center, set to 1, otherwise 0 +// +// 2 1 0 +// 3 7 +// 4 5 6 + +// 01101101 +// 76543210 + +@implementation GPUImageLocalBinaryPatternFilter + +NSString *const kGPUImageLocalBinaryPatternFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + lowp float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; + lowp float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + lowp float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + lowp float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + lowp float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + lowp float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + lowp float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + lowp float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + lowp float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + + lowp float byteTally = 1.0 / 255.0 * step(centerIntensity, topRightIntensity); + byteTally += 2.0 / 255.0 * step(centerIntensity, topIntensity); + byteTally += 4.0 / 255.0 * step(centerIntensity, topLeftIntensity); + byteTally += 8.0 / 255.0 * step(centerIntensity, leftIntensity); + byteTally += 16.0 / 255.0 * step(centerIntensity, bottomLeftIntensity); + byteTally += 32.0 / 255.0 * step(centerIntensity, bottomIntensity); + byteTally += 64.0 / 255.0 * step(centerIntensity, bottomRightIntensity); + byteTally += 128.0 / 255.0 * step(centerIntensity, rightIntensity); + + // TODO: Replace the above with a dot product and two vec4s + // TODO: Apply step to a matrix, rather than individually + + gl_FragColor = vec4(byteTally, byteTally, byteTally, 1.0); + } +); + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageLocalBinaryPatternFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end From aa5ee87a377e717c617275398a6d56e0bba6b07e Mon Sep 17 00:00:00 2001 From: Johannes Schriewer Date: Tue, 7 Aug 2012 14:32:36 +0200 Subject: [PATCH 181/695] Bugfix: Make pipeline work for CGImage processing --- framework/Source/GPUImageFilterPipeline.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index cb339662b..684aae2a4 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -151,4 +151,8 @@ - (UIImage *) currentFilteredFrame { return [(GPUImageFilter*)[_filters lastObject] imageFromCurrentlyProcessedOutput]; } +- (CGImageRef) newCGImageFromCurrentFilteredFrame { + return [(GPUImageFilter*)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; +} + @end From 2908999b320714a97fe5223d0f51237554392e48 Mon Sep 17 00:00:00 2001 From: Johannes Schriewer Date: Tue, 7 Aug 2012 14:35:58 +0200 Subject: [PATCH 182/695] Bugfix: Make pipeline work for CGImage processing (missed out the header file) --- framework/Source/GPUImageFilterPipeline.h | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 739440d86..1f120b4fa 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -20,5 +20,6 @@ - (void) removeAllFilters; - (UIImage *) currentFilteredFrame; +- (CGImageRef) newCGImageFromCurrentFilteredFrame; @end From c242527c47f14e8825a2b6250fa9b7930f215a3c Mon Sep 17 00:00:00 2001 From: Tom Corwine Date: Wed, 8 Aug 2012 16:14:07 -0400 Subject: [PATCH 183/695] Made change so a CGAffineTransform isn't applied to a movie when using the startRecording method in GPUImageMovieWriter #366 to insure the behavior of this method isn't change by my addition of startRecordingInOrientation:. --- framework/Source/GPUImageMovieWriter.m | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 9987858f1..58a759b0a 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -223,18 +223,18 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; - (void)startRecording; { - [self startRecordingInOrientation:CGAffineTransformMakeRotation(0)]; + isRecording = YES; + startTime = kCMTimeInvalid; + // [assetWriter startWriting]; + + // [assetWriter startSessionAtSourceTime:kCMTimeZero]; } - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; { assetWriterVideoInput.transform = orientationTransform; - - isRecording = YES; - startTime = kCMTimeInvalid; -// [assetWriter startWriting]; - -// [assetWriter startSessionAtSourceTime:kCMTimeZero]; + + [self startRecording]; } - (void)finishRecording; From f3614c8687bc08197875dcd53d9d9a806119d325 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 8 Aug 2012 18:13:54 -0500 Subject: [PATCH 184/695] Tweaked the comments in the tone curve filter. --- framework/Source/GPUImageToneCurveFilter.h | 1 + framework/Source/GPUImageToneCurveFilter.m | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h index 069dab117..2aeb210f8 100755 --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -6,6 +6,7 @@ @property(readwrite, nonatomic, copy) NSArray *greenControlPoints; @property(readwrite, nonatomic, copy) NSArray *blueControlPoints; +// Initialization and teardown - (id)initWithACV:(NSString*)curveFile; // This lets you set all three red, green, and blue tone curves at once. diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 0e2df29ce..09e0ae1ab 100755 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -4,10 +4,6 @@ #pragma mark GPUImageACVFile Helper // GPUImageACVFile -// Snapp -// -// Created by Omer Duzyol on 7/15/12. -// Copyright (c) 2012 Creaworks Interactive. All rights reserved. // // ACV File format Parser // Please refer to http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/PhotoshopFileFormats.htm#50577411_pgfId-1056330 @@ -157,6 +153,7 @@ - (id)init; return self; } +// This pulls in Adobe ACV curve files to specify the tone curve - (id)initWithACV:(NSString*)curveFile { if (!(self = [super initWithFragmentShaderFromString:kGPUImageToneCurveFragmentShaderString])) From 0e9132d15bf2f4a6503022f2ac9015483c4f1e4d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 8 Aug 2012 20:28:44 -0500 Subject: [PATCH 185/695] Added an @synthesize to prevent compilation errors on older Xcode versions. --- framework/Source/GPUImageGaussianSelectiveBlurFilter.m | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index ea0634f28..d388efc4b 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -31,6 +31,7 @@ @implementation GPUImageGaussianSelectiveBlurFilter @synthesize excludeCirclePoint = _excludeCirclePoint, excludeCircleRadius = _excludeCircleRadius, excludeBlurSize = _excludeBlurSize; @synthesize blurSize = _blurSize; +@synthesize aspectRatio = _aspectRatio; - (id)init; { From 4d7dd89d6023d6fdd2b04f0765fe741aa6f89691 Mon Sep 17 00:00:00 2001 From: Steve McKenzie Date: Thu, 9 Aug 2012 11:25:00 -0700 Subject: [PATCH 186/695] Call endProcessing after a target has been removed. --- framework/Source/GPUImageOutput.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 73734805f..ced8cdbad 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -141,9 +141,10 @@ - (void)removeTarget:(id)targetToRemove; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; - + [targetTextureIndices removeObjectAtIndex:indexOfObject]; [targets removeObject:targetToRemove]; + [targetToRemove endProcessing]; } - (void)removeAllTargets; From 663f278402994ade27a7e5d59d8761caeaba7853 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 9 Aug 2012 13:25:06 -0500 Subject: [PATCH 187/695] Added a quick fix for the tone curve filter by Marcelo Barbudas. --- framework/Source/GPUImageToneCurveFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 framework/Source/GPUImageToneCurveFilter.m diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m old mode 100755 new mode 100644 index 09e0ae1ab..d41eaf55c --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -281,7 +281,7 @@ - (NSMutableArray *)splineCurve:(NSArray *)points CGPoint cur = [[points objectAtIndex:i] CGPointValue]; CGPoint next = [[points objectAtIndex:(i+1)] CGPointValue]; - for(int x=cur.x;x Date: Sat, 11 Aug 2012 19:52:27 -0500 Subject: [PATCH 188/695] Overhauled the way that filter properties are set, which eliminates some redundant calls and is necessary for my next framework change. --- .../SimpleVideoFilterViewController.m | 11 +- .../Source/GPUImage3x3ConvolutionFilter.m | 4 +- .../Source/GPUImage3x3TextureSamplingFilter.m | 15 +- framework/Source/GPUImageAlphaBlendFilter.m | 4 +- framework/Source/GPUImageBoxBlurFilter.m | 8 +- framework/Source/GPUImageBrightnessFilter.m | 4 +- framework/Source/GPUImageBuffer.m | 6 +- .../Source/GPUImageBulgeDistortionFilter.m | 19 +-- .../Source/GPUImageChromaKeyBlendFilter.m | 15 +- framework/Source/GPUImageColorMatrixFilter.m | 9 +- framework/Source/GPUImageColorPackingFilter.m | 8 +- framework/Source/GPUImageContrastFilter.m | 4 +- framework/Source/GPUImageCrosshairGenerator.m | 12 +- framework/Source/GPUImageCrosshatchFilter.m | 8 +- ...geDirectionalNonMaximumSuppressionFilter.m | 22 +-- .../Source/GPUImageDissolveBlendFilter.m | 4 +- framework/Source/GPUImageEmbossFilter.m | 3 - framework/Source/GPUImageExposureFilter.m | 4 +- framework/Source/GPUImageFalseColorFilter.m | 8 +- framework/Source/GPUImageFastBlurFilter.m | 8 +- framework/Source/GPUImageFilter.h | 20 ++- framework/Source/GPUImageFilter.m | 134 ++++++++++++------ framework/Source/GPUImageGammaFilter.m | 4 +- framework/Source/GPUImageGaussianBlurFilter.m | 8 +- .../GPUImageGaussianSelectiveBlurFilter.m | 10 +- .../GPUImageHarrisCornerDetectionFilter.m | 4 +- framework/Source/GPUImageHazeFilter.m | 8 +- .../Source/GPUImageHighlightShadowFilter.m | 12 +- framework/Source/GPUImageHistogramFilter.m | 16 ++- framework/Source/GPUImageHistogramGenerator.m | 4 +- framework/Source/GPUImageHueFilter.m | 17 ++- framework/Source/GPUImageJFAVoroniFilter.m | 8 +- framework/Source/GPUImageKuwaharaFilter.m | 4 +- .../Source/GPUImageLuminanceThresholdFilter.m | 4 +- framework/Source/GPUImageMonochromeFilter.m | 8 +- framework/Source/GPUImageMosaicFilter.m | 34 ++--- framework/Source/GPUImageMovieWriter.m | 6 +- framework/Source/GPUImageOpacityFilter.m | 5 +- framework/Source/GPUImageOpenGLESContext.h | 10 +- framework/Source/GPUImageOpenGLESContext.m | 25 +++- framework/Source/GPUImageOutput.h | 1 - framework/Source/GPUImagePerlinNoiseFilter.m | 14 +- .../Source/GPUImagePinchDistortionFilter.m | 20 +-- framework/Source/GPUImagePixellateFilter.m | 10 +- .../Source/GPUImagePolarPixellateFilter.m | 19 +-- framework/Source/GPUImagePolkaDotFilter.m | 4 +- framework/Source/GPUImagePosterizeFilter.m | 4 +- framework/Source/GPUImageRGBFilter.m | 17 +-- framework/Source/GPUImageRawDataOutput.m | 10 +- framework/Source/GPUImageSaturationFilter.m | 4 +- framework/Source/GPUImageSharpenFilter.m | 8 +- .../Source/GPUImageSobelEdgeDetectionFilter.m | 14 +- .../Source/GPUImageSphereRefractionFilter.m | 24 +--- .../Source/GPUImageStretchDistortionFilter.m | 11 +- framework/Source/GPUImageSwirlFilter.m | 20 +-- .../Source/GPUImageThresholdEdgeDetection.m | 4 +- framework/Source/GPUImageTiltShiftFilter.m | 6 +- framework/Source/GPUImageToneCurveFilter.m | 4 +- framework/Source/GPUImageToonFilter.m | 8 +- framework/Source/GPUImageTransformFilter.m | 20 +-- framework/Source/GPUImageTwoInputFilter.m | 4 +- framework/Source/GPUImageTwoPassFilter.m | 6 +- .../GPUImageTwoPassTextureSamplingFilter.m | 7 +- framework/Source/GPUImageUnsharpMaskFilter.m | 2 +- framework/Source/GPUImageVideoCamera.h | 8 +- framework/Source/GPUImageVideoCamera.m | 37 +++-- framework/Source/GPUImageView.m | 7 +- framework/Source/GPUImageVignetteFilter.m | 10 +- 68 files changed, 342 insertions(+), 478 deletions(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index cad165b4b..973f17f37 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -21,11 +21,13 @@ - (void)viewDidLoad { [super viewDidLoad]; - videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; - videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; -// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; + + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + filter = [[GPUImageSepiaFilter alloc] init]; // filter = [[GPUImageTiltShiftFilter alloc] init]; @@ -72,7 +74,7 @@ - (void)viewDidLoad // [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOn]; // [videoCamera.inputCamera unlockForConfiguration]; - double delayInSeconds = 10.0; + double delayInSeconds = 60.0; dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ @@ -123,6 +125,7 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceO break; } videoCamera.outputImageOrientation = orient; + } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m index a212de217..94135170f 100755 --- a/framework/Source/GPUImage3x3ConvolutionFilter.m +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -71,10 +71,8 @@ - (id)init; - (void)setConvolutionKernel:(GPUMatrix3x3)newValue; { _convolutionKernel = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniformMatrix3fv(convolutionMatrixUniform, 1, GL_FALSE, (GLfloat *)&_convolutionKernel); + [self setMatrix3f:(GLfloat *)&_convolutionKernel forUniform:convolutionMatrixUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m index 29177139c..0cda9388f 100644 --- a/framework/Source/GPUImage3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -73,8 +73,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + // REFACTOR: Enclose this in block on image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { glUniform1f(texelWidthUniform, _texelHeight); @@ -97,20 +97,15 @@ - (void)setTexelWidth:(CGFloat)newValue; hasOverriddenImageSizeFactor = YES; _texelWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(texelWidthUniform, _texelWidth); + [self setFloat:_texelWidth forUniform:texelWidthUniform program:filterProgram]; } - (void)setTexelHeight:(CGFloat)newValue; { hasOverriddenImageSizeFactor = YES; _texelHeight = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(texelHeightUniform, _texelHeight); -} + [self setFloat:_texelHeight forUniform:texelHeightUniform program:filterProgram]; +} @end diff --git a/framework/Source/GPUImageAlphaBlendFilter.m b/framework/Source/GPUImageAlphaBlendFilter.m index 270bd5721..5aba674a8 100755 --- a/framework/Source/GPUImageAlphaBlendFilter.m +++ b/framework/Source/GPUImageAlphaBlendFilter.m @@ -45,9 +45,7 @@ - (void)setMix:(CGFloat)newValue; { _mix = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(mixUniform, _mix); + [self setFloat:_mix forUniform:mixUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index dc8b7a1ab..6623f1916 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -84,12 +84,8 @@ - (void)setBlurSize:(CGFloat)newValue; { _blurSize = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(firstBlurSizeUniform, _blurSize); - - [secondFilterProgram use]; - glUniform1f(secondBlurSizeUniform, _blurSize); + [self setFloat:_blurSize forUniform:firstBlurSizeUniform program:filterProgram]; + [self setFloat:_blurSize forUniform:secondBlurSizeUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageBrightnessFilter.m b/framework/Source/GPUImageBrightnessFilter.m index 21c626bb3..08eff6347 100755 --- a/framework/Source/GPUImageBrightnessFilter.m +++ b/framework/Source/GPUImageBrightnessFilter.m @@ -42,9 +42,7 @@ - (void)setBrightness:(CGFloat)newValue; { _brightness = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(brightnessUniform, _brightness); + [self setFloat:_brightness forUniform:brightnessUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index d616e0f0a..8c8447ccb 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -70,14 +70,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; glBindTexture(GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue]); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue], 0); - - [filterProgram use]; - + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index f6724806a..2bb2da86f 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -69,34 +69,23 @@ - (void)setRadius:(CGFloat)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } - (void)setScale:(CGFloat)newValue; { _scale = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(scaleUniform, _scale); + + [self setFloat:_scale forUniform:scaleUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m index 2447ea69e..b86b278d0 100755 --- a/framework/Source/GPUImageChromaKeyBlendFilter.m +++ b/framework/Source/GPUImageChromaKeyBlendFilter.m @@ -67,28 +67,21 @@ - (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent colorToReplace[1] = greenComponent; colorToReplace[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(colorToReplaceUniform, 1, colorToReplace); + [self setVec3:colorToReplace forUniform:colorToReplaceUniform program:filterProgram]; } - (void)setThresholdSensitivity:(CGFloat)newValue; { _thresholdSensitivity = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(thresholdSensitivityUniform, _thresholdSensitivity); -} + [self setFloat:_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; +} - (void)setSmoothing:(CGFloat)newValue; { _smoothing = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(smoothingUniform, _smoothing); + [self setFloat:_smoothing forUniform:smoothingUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageColorMatrixFilter.m b/framework/Source/GPUImageColorMatrixFilter.m index 2998f819e..c0d056212 100755 --- a/framework/Source/GPUImageColorMatrixFilter.m +++ b/framework/Source/GPUImageColorMatrixFilter.m @@ -53,18 +53,15 @@ - (id)init; - (void)setIntensity:(CGFloat)newIntensity; { _intensity = newIntensity; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(intensityUniform, _intensity); + + [self setFloat:_intensity forUniform:intensityUniform program:filterProgram]; } - (void)setColorMatrix:(GPUMatrix4x4)newColorMatrix; { _colorMatrix = newColorMatrix; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniformMatrix4fv(colorMatrixUniform, 1, GL_FALSE, (GLfloat *)&_colorMatrix); + [self setMatrix4f:(GLfloat *)&_colorMatrix forUniform:colorMatrixUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m index ca9e4389b..e67264e47 100644 --- a/framework/Source/GPUImageColorPackingFilter.m +++ b/framework/Source/GPUImageColorPackingFilter.m @@ -72,13 +72,11 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { texelWidth = 0.5 / inputTextureSize.width; texelHeight = 0.5 / inputTextureSize.height; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glUniform1f(texelWidthUniform, texelWidth); glUniform1f(texelHeightUniform, texelHeight); - - NSLog(@"Texel width: %f, height: %f", texelWidth, texelHeight); } #pragma mark - diff --git a/framework/Source/GPUImageContrastFilter.m b/framework/Source/GPUImageContrastFilter.m index 355822097..ec58d74eb 100755 --- a/framework/Source/GPUImageContrastFilter.m +++ b/framework/Source/GPUImageContrastFilter.m @@ -42,9 +42,7 @@ - (void)setContrast:(CGFloat)newValue; { _contrast = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(contrastUniform, _contrast); + [self setFloat:_contrast forUniform:contrastUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index eaee1c161..2cf5a08f4 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -70,12 +70,10 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; - [filterProgram use]; - glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); @@ -98,9 +96,7 @@ - (void)setCrosshairWidth:(CGFloat)newValue; { _crosshairWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(crosshairWidthUniform, _crosshairWidth); + [self setFloat:_crosshairWidth forUniform:crosshairWidthUniform program:filterProgram]; } - (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; @@ -110,9 +106,7 @@ - (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent colorToReplace[1] = greenComponent; colorToReplace[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(crosshairColorUniform, 1, colorToReplace); + [self setVec3:colorToReplace forUniform:crosshairColorUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageCrosshatchFilter.m b/framework/Source/GPUImageCrosshatchFilter.m index 077404240..30fad5200 100755 --- a/framework/Source/GPUImageCrosshatchFilter.m +++ b/framework/Source/GPUImageCrosshatchFilter.m @@ -100,18 +100,14 @@ - (void)setCrossHatchSpacing:(CGFloat)newValue; _crossHatchSpacing = newValue; } - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(crossHatchSpacingUniform, _crossHatchSpacing); + [self setFloat:_crossHatchSpacing forUniform:crossHatchSpacingUniform program:filterProgram]; } - (void)setLineWidth:(CGFloat)newValue; { _lineWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(lineWidthUniform, _lineWidth); + [self setFloat:_lineWidth forUniform:lineWidthUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m index 6328a24fa..698d7b50a 100644 --- a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m @@ -66,8 +66,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + // REFACTOR: Wrap this appropriately + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glUniform1f(texelWidthUniform, _texelWidth); glUniform1f(texelHeightUniform, _texelHeight); } @@ -81,9 +81,7 @@ - (void)setTexelWidth:(CGFloat)newValue; hasOverriddenImageSizeFactor = YES; _texelWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(texelWidthUniform, _texelWidth); + [self setFloat:_texelWidth forUniform:texelWidthUniform program:filterProgram]; } - (void)setTexelHeight:(CGFloat)newValue; @@ -91,27 +89,21 @@ - (void)setTexelHeight:(CGFloat)newValue; hasOverriddenImageSizeFactor = YES; _texelHeight = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(texelHeightUniform, _texelHeight); + [self setFloat:_texelHeight forUniform:texelHeightUniform program:filterProgram]; } - (void)setLowerThreshold:(CGFloat)newValue; { _lowerThreshold = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(lowerThresholdUniform, _lowerThreshold); + [self setFloat:_lowerThreshold forUniform:lowerThresholdUniform program:filterProgram]; } - (void)setUpperThreshold:(CGFloat)newValue; { _upperThreshold = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(upperThresholdUniform, _upperThreshold); + + [self setFloat:_upperThreshold forUniform:upperThresholdUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageDissolveBlendFilter.m b/framework/Source/GPUImageDissolveBlendFilter.m index 1e2ee6c45..3af97701a 100755 --- a/framework/Source/GPUImageDissolveBlendFilter.m +++ b/framework/Source/GPUImageDissolveBlendFilter.m @@ -45,9 +45,7 @@ - (void)setMix:(CGFloat)newValue; { _mix = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(mixUniform, _mix); + [self setFloat:_mix forUniform:mixUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageEmbossFilter.m b/framework/Source/GPUImageEmbossFilter.m index 17d1d4fd2..6ba48cd4f 100755 --- a/framework/Source/GPUImageEmbossFilter.m +++ b/framework/Source/GPUImageEmbossFilter.m @@ -29,9 +29,6 @@ - (void)setIntensity:(CGFloat)newValue; _intensity = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GPUMatrix3x3 newConvolutionMatrix; newConvolutionMatrix.one.one = _intensity * (-2.0); newConvolutionMatrix.one.two = -_intensity; diff --git a/framework/Source/GPUImageExposureFilter.m b/framework/Source/GPUImageExposureFilter.m index 6825412be..baffa18d2 100755 --- a/framework/Source/GPUImageExposureFilter.m +++ b/framework/Source/GPUImageExposureFilter.m @@ -42,9 +42,7 @@ - (void)setExposure:(CGFloat)newValue; { _exposure = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(exposureUniform, _exposure); + [self setFloat:_exposure forUniform:exposureUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m index f34d73267..7d9a721df 100644 --- a/framework/Source/GPUImageFalseColorFilter.m +++ b/framework/Source/GPUImageFalseColorFilter.m @@ -68,9 +68,7 @@ - (void)setFirstColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blu filterColor[1] = greenComponent; filterColor[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(firstColorUniform, 1, filterColor); + [self setVec3:filterColor forUniform:firstColorUniform program:filterProgram]; } - (void)setSecondColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; @@ -80,9 +78,7 @@ - (void)setSecondColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent bl filterColor[1] = greenComponent; filterColor[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(secondColorUniform, 1, filterColor); + [self setVec3:filterColor forUniform:secondColorUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index 7d0653ea7..b3e3ee58a 100755 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -140,12 +140,8 @@ - (void)setBlurSize:(CGFloat)newValue; { _blurSize = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(firstBlurSizeUniform, _blurSize); - - [secondFilterProgram use]; - glUniform1f(secondBlurSizeUniform, _blurSize); + [self setFloat:_blurSize forUniform:firstBlurSizeUniform program:filterProgram]; + [self setFloat:_blurSize forUniform:secondBlurSizeUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index ec36da581..aa3109465 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -115,12 +115,22 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; /// @name Input parameters - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; -- (void)setInteger:(GLint)newInteger forUniform:(NSString *)uniformName; -- (void)setFloat:(GLfloat)newFloat forUniform:(NSString *)uniformName; -- (void)setSize:(CGSize)newSize forUniform:(NSString *)uniformName; -- (void)setPoint:(CGPoint)newPoint forUniform:(NSString *)uniformName; -- (void)setFloatVec3:(GLfloat *)newVec3 forUniform:(NSString *)uniformName; +- (void)setInteger:(GLint)newInteger forUniformName:(NSString *)uniformName; +- (void)setFloat:(GLfloat)newFloat forUniformName:(NSString *)uniformName; +- (void)setSize:(CGSize)newSize forUniformName:(NSString *)uniformName; +- (void)setPoint:(CGPoint)newPoint forUniformName:(NSString *)uniformName; +- (void)setFloatVec3:(GLfloat *)newVec3 forUniformName:(NSString *)uniformName; - (void)setFloatVec4:(GLfloat *)newVec4 forUniform:(NSString *)uniformName; - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSString*)uniformName; +- (void)setMatrix3f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setMatrix4f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setVec3:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setVec4:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; + @end diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 13133a2ad..e8f802746 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -55,6 +55,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad backgroundColorBlue = 0.0; backgroundColorAlpha = 0.0; + // REFACTOR: Wrap this in block to perform on image processing queue? [GPUImageOpenGLESContext useImageProcessingContext]; filterProgram = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; @@ -76,7 +77,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glEnableVertexAttribArray(filterPositionAttribute); glEnableVertexAttribArray(filterTextureCoordinateAttribute); @@ -449,11 +450,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; - [filterProgram use]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); @@ -525,70 +524,123 @@ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponen backgroundColorAlpha = alphaComponent; } -- (void)setInteger:(GLint)newInteger forUniform:(NSString *)uniformName; +- (void)setInteger:(GLint)newInteger forUniformName:(NSString *)uniformName; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - - glUniform1i(uniformIndex, newInteger); + [self setInteger:newInteger forUniform:uniformIndex program:filterProgram]; } -- (void)setFloat:(GLfloat)newFloat forUniform:(NSString *)uniformName; +- (void)setFloat:(GLfloat)newFloat forUniformName:(NSString *)uniformName; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - - glUniform1f(uniformIndex, newFloat); + [self setFloat:newFloat forUniform:uniformIndex program:filterProgram]; } -- (void)setSize:(CGSize)newSize forUniform:(NSString *)uniformName; +- (void)setSize:(CGSize)newSize forUniformName:(NSString *)uniformName; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - GLfloat sizeUniform[2]; - sizeUniform[0] = newSize.width; - sizeUniform[1] = newSize.height; - - glUniform2fv(uniformIndex, 1, sizeUniform); + [self setSize:newSize forUniform:uniformIndex program:filterProgram]; } -- (void)setPoint:(CGPoint)newPoint forUniform:(NSString *)uniformName; +- (void)setPoint:(CGPoint)newPoint forUniformName:(NSString *)uniformName; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - GLfloat sizeUniform[2]; - sizeUniform[0] = newPoint.x; - sizeUniform[1] = newPoint.y; - - glUniform2fv(uniformIndex, 1, sizeUniform); + [self setPoint:newPoint forUniform:uniformIndex program:filterProgram]; } -- (void)setFloatVec3:(GLfloat *)newVec3 forUniform:(NSString *)uniformName; +- (void)setFloatVec3:(GLfloat *)newVec3 forUniformName:(NSString *)uniformName; { GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - [filterProgram use]; - - glUniform3fv(uniformIndex, 1, newVec3); + [self setVec3:newVec3 forUniform:uniformIndex program:filterProgram]; } - (void)setFloatVec4:(GLfloat *)newVec4 forUniform:(NSString *)uniformName; { GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - [filterProgram use]; - - glUniform4fv(uniformIndex, 1, newVec4); + [self setVec4:newVec4 forUniform:uniformIndex program:filterProgram]; } -- (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSString*)uniformName { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; +- (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSString*)uniformName +{ GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - glUniform1fv(uniformIndex, count, array); + [self setFloatArray:array length:count forUniform:uniformIndex program:filterProgram]; +} + +- (void)setMatrix3f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniformMatrix3fv(uniform, 1, GL_FALSE, matrix); +} + +- (void)setMatrix4f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniformMatrix4fv(uniform, 1, GL_FALSE, matrix); +} + +- (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniform1f(uniform, floatValue); +} + +- (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + GLfloat positionArray[2]; + positionArray[0] = pointValue.x; + positionArray[1] = pointValue.y; + + glUniform2fv(uniform, 1, positionArray); +} + +- (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + GLfloat sizeArray[2]; + sizeArray[0] = sizeValue.width; + sizeArray[1] = sizeValue.height; + + glUniform2fv(uniform, 1, sizeArray); +} + +- (void)setVec3:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + glUniform3fv(uniform, 1, vectorValue); +} + +- (void)setVec4:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + glUniform4fv(uniform, 1, vectorValue); +} + +- (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + glUniform1fv(uniform, arrayLength, arrayValue); +} + +- (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniform1i(uniform, intValue); } #pragma mark - diff --git a/framework/Source/GPUImageGammaFilter.m b/framework/Source/GPUImageGammaFilter.m index ec66074df..1e74ac123 100755 --- a/framework/Source/GPUImageGammaFilter.m +++ b/framework/Source/GPUImageGammaFilter.m @@ -42,9 +42,7 @@ - (void)setGamma:(CGFloat)newValue; { _gamma = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(gammaUniform, _gamma); + [self setFloat:_gamma forUniform:gammaUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index f941b5bab..860df5da3 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -95,12 +95,8 @@ - (id)init; - (void) setBlurSize:(CGFloat)blurSize { _blurSize = blurSize; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(horizontalBlurSizeUniform, _blurSize); - - [secondFilterProgram use]; - glUniform1f(verticalBlurSizeUniform, _blurSize); + [self setFloat:_blurSize forUniform:horizontalBlurSizeUniform program:filterProgram]; + [self setFloat:_blurSize forUniform:verticalBlurSizeUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index d388efc4b..6eddc8c8e 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -75,7 +75,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!hasOverriddenAspectRatio) ) { _aspectRatio = (inputTextureSize.width / inputTextureSize.height); - [selectiveFocusFilter setFloat:_aspectRatio forUniform:@"aspectRatio"]; + [selectiveFocusFilter setFloat:_aspectRatio forUniformName:@"aspectRatio"]; } } @@ -95,26 +95,26 @@ - (CGFloat)blurSize; - (void)setExcludeCirclePoint:(CGPoint)newValue; { _excludeCirclePoint = newValue; - [selectiveFocusFilter setPoint:newValue forUniform:@"excludeCirclePoint"]; + [selectiveFocusFilter setPoint:newValue forUniformName:@"excludeCirclePoint"]; } - (void)setExcludeCircleRadius:(CGFloat)newValue; { _excludeCircleRadius = newValue; - [selectiveFocusFilter setFloat:newValue forUniform:@"excludeCircleRadius"]; + [selectiveFocusFilter setFloat:newValue forUniformName:@"excludeCircleRadius"]; } - (void)setExcludeBlurSize:(CGFloat)newValue; { _excludeBlurSize = newValue; - [selectiveFocusFilter setFloat:newValue forUniform:@"excludeBlurSize"]; + [selectiveFocusFilter setFloat:newValue forUniformName:@"excludeBlurSize"]; } - (void)setAspectRatio:(CGFloat)newValue; { hasOverriddenAspectRatio = YES; _aspectRatio = newValue; - [selectiveFocusFilter setFloat:_aspectRatio forUniform:@"aspectRatio"]; + [selectiveFocusFilter setFloat:_aspectRatio forUniformName:@"aspectRatio"]; } @end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index a208d19a4..f56c4b4f3 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -267,13 +267,13 @@ - (CGFloat)blurSize; - (void)setSensitivity:(CGFloat)newValue; { _sensitivity = newValue; - [harrisCornerDetectionFilter setFloat:newValue forUniform:@"sensitivity"]; + [harrisCornerDetectionFilter setFloat:newValue forUniformName:@"sensitivity"]; } - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; - [simpleThresholdFilter setFloat:newValue forUniform:@"threshold"]; + [simpleThresholdFilter setFloat:newValue forUniformName:@"threshold"]; } @end diff --git a/framework/Source/GPUImageHazeFilter.m b/framework/Source/GPUImageHazeFilter.m index 716134c4c..525fb7978 100755 --- a/framework/Source/GPUImageHazeFilter.m +++ b/framework/Source/GPUImageHazeFilter.m @@ -60,18 +60,14 @@ - (void)setDistance:(CGFloat)newValue; { _distance = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(distanceUniform, _distance); + [self setFloat:_distance forUniform:distanceUniform program:filterProgram]; } - (void)setSlope:(CGFloat)newValue; { _slope = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(slopeUniform, _slope); + [self setFloat:_slope forUniform:slopeUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageHighlightShadowFilter.m b/framework/Source/GPUImageHighlightShadowFilter.m index 6ebfd6c27..50cc3f2ea 100644 --- a/framework/Source/GPUImageHighlightShadowFilter.m +++ b/framework/Source/GPUImageHighlightShadowFilter.m @@ -53,19 +53,15 @@ - (id)init; - (void)setShadows:(CGFloat)newValue; { _shadows = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(shadowsUniform, _shadows); + + [self setFloat:_shadows forUniform:shadowsUniform program:filterProgram]; } - (void)setHighlights:(CGFloat)newValue; { _highlights = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(highlightsUniform, _highlights); + + [self setFloat:_highlights forUniform:highlightsUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 93f8ee628..1404c4a65 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -147,7 +147,9 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - [secondFilterProgram use]; + // REFACTOR: Possibly wrap this in a block on the image processing block + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glEnableVertexAttribArray(secondFilterPositionAttribute); if (![thirdFilterProgram link]) @@ -162,9 +164,9 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; NSAssert(NO, @"Filter shader link failed"); } - thirdFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - - [thirdFilterProgram use]; + thirdFilterPositionAttribute = [thirdFilterProgram attributeIndex:@"position"]; + [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; + glEnableVertexAttribArray(thirdFilterPositionAttribute); }; break; } @@ -249,7 +251,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [self setFilterFBO]; - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); @@ -263,12 +265,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (histogramType == kGPUImageHistogramRGB) { - [secondFilterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; glVertexAttribPointer(secondFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); - [thirdFilterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; glVertexAttribPointer(thirdFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); diff --git a/framework/Source/GPUImageHistogramGenerator.m b/framework/Source/GPUImageHistogramGenerator.m index 50089b94b..6eb1a8199 100755 --- a/framework/Source/GPUImageHistogramGenerator.m +++ b/framework/Source/GPUImageHistogramGenerator.m @@ -63,9 +63,7 @@ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponen backgroundColor[2] = blueComponent; backgroundColor[3] = alphaComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform4fv(backgroundColorUniform, 1, backgroundColor); + [self setVec4:backgroundColor forUniform:backgroundColorUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m index 6c3556275..218d66944 100644 --- a/framework/Source/GPUImageHueFilter.m +++ b/framework/Source/GPUImageHueFilter.m @@ -53,8 +53,10 @@ void main () @implementation GPUImageHueFilter @synthesize hue; --(id) init { - if(! (self = [super initWithFragmentShaderFromString:kGPUImageHueFragmentShaderString]) ){ +- (id)init +{ + if(! (self = [super initWithFragmentShaderFromString:kGPUImageHueFragmentShaderString]) ) + { return nil; } @@ -64,14 +66,11 @@ -(id) init { return self; } --(void) setHue:(CGFloat)newHue { +- (void)setHue:(CGFloat)newHue +{ // Convert degrees to radians for hue rotation - hue = fmodf(newHue, 360.0) * M_PI/180 ; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(hueAdjustUniform, hue); - + hue = fmodf(newHue, 360.0) * M_PI/180; + [self setFloat:hue forUniform:hueAdjustUniform program:filterProgram]; } - @end diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m index e47e9a1a8..fdebb73d0 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.m +++ b/framework/Source/GPUImageJFAVoroniFilter.m @@ -381,8 +381,7 @@ - (void)setOutputFBO; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { // Run the first stage of the two-pass filter - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glUniform1f(sampleStepUniform, 0.5); glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); @@ -393,8 +392,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (pass % 2 == 0) { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; float step = pow(2.0, numPasses - pass) / pow(2.0, numPasses); glUniform1f(sampleStepUniform, step); @@ -405,7 +403,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // Run the second stage of the two-pass filter [self setSecondFilterFBO]; - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m index 6506c7a60..14bbcbd47 100755 --- a/framework/Source/GPUImageKuwaharaFilter.m +++ b/framework/Source/GPUImageKuwaharaFilter.m @@ -104,9 +104,7 @@ - (void)setRadius:(GLuint)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1i(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageLuminanceThresholdFilter.m b/framework/Source/GPUImageLuminanceThresholdFilter.m index e4331769d..4f7509510 100755 --- a/framework/Source/GPUImageLuminanceThresholdFilter.m +++ b/framework/Source/GPUImageLuminanceThresholdFilter.m @@ -46,9 +46,7 @@ - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(thresholdUniform, _threshold); + [self setFloat:_threshold forUniform:thresholdUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m index 648b7fb47..329fcd5ef 100644 --- a/framework/Source/GPUImageMonochromeFilter.m +++ b/framework/Source/GPUImageMonochromeFilter.m @@ -72,18 +72,14 @@ - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GL filterColor[1] = greenComponent; filterColor[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(filterColorUniform, 1, filterColor); + [self setVec3:filterColor forUniform:filterColorUniform program:filterProgram]; } - (void)setIntensity:(CGFloat)newValue; { _intensity = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(intensityUniform, _intensity); + [self setFloat:_intensity forUniform:intensityUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m index 3101a3cf2..9265461e2 100644 --- a/framework/Source/GPUImageMosaicFilter.m +++ b/framework/Source/GPUImageMosaicFilter.m @@ -75,17 +75,20 @@ - (id)init; return self; } --(void)setColorOn:(BOOL)yes { +- (void)setColorOn:(BOOL)yes +{ glUniform1i(colorOnUniform, yes); } --(void)setNumTiles:(float)numTiles { +- (void)setNumTiles:(float)numTiles +{ _numTiles = numTiles; - [self setFloat:_numTiles forUniform:@"numTiles"]; + [self setFloat:_numTiles forUniformName:@"numTiles"]; } --(void)setInputTileSize:(CGSize)inputTileSize { +- (void)setInputTileSize:(CGSize)inputTileSize +{ if (inputTileSize.width > 1.0) { _inputTileSize.width = 1.0; } @@ -102,15 +105,11 @@ -(void)setInputTileSize:(CGSize)inputTileSize { _inputTileSize = inputTileSize; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GLfloat inputTS[2]; - inputTS[0] = _inputTileSize.width; - inputTS[1] = _inputTileSize.height; - glUniform2fv(inputTileSizeUniform, 1, inputTS); + [self setSize:_inputTileSize forUniform:inputTileSizeUniform program:filterProgram]; } --(void)setDisplayTileSize:(CGSize)displayTileSize { +-(void)setDisplayTileSize:(CGSize)displayTileSize +{ if (displayTileSize.width > 1.0) { _displayTileSize.width = 1.0; } @@ -127,18 +126,11 @@ -(void)setDisplayTileSize:(CGSize)displayTileSize { _displayTileSize = displayTileSize; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GLfloat displayTS[2]; - displayTS[0] = _displayTileSize.width; - displayTS[1] = _displayTileSize.height; - glUniform2fv(displayTileSizeUniform, 1, displayTS); + [self setSize:_displayTileSize forUniform:displayTileSizeUniform program:filterProgram]; } - - --(void)setTileSet:(NSString *)tileSet { - +-(void)setTileSet:(NSString *)tileSet +{ UIImage *img = [UIImage imageNamed:tileSet]; pic = [[GPUImagePicture alloc] initWithImage:img smoothlyScaleOutput:YES]; [pic addTarget:self]; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 58a759b0a..a3fd39dc3 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -113,7 +113,9 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; - [colorSwizzlingProgram use]; + // REFACTOR: Wrap this in a block for the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:colorSwizzlingProgram]; + glEnableVertexAttribArray(colorSwizzlingPositionAttribute); glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); @@ -402,7 +404,7 @@ - (void)renderAtInternalSize; [GPUImageOpenGLESContext useImageProcessingContext]; [self setFilterFBO]; - [colorSwizzlingProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:colorSwizzlingProgram]; glClearColor(1.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/framework/Source/GPUImageOpacityFilter.m b/framework/Source/GPUImageOpacityFilter.m index fa60f2552..401a2e672 100644 --- a/framework/Source/GPUImageOpacityFilter.m +++ b/framework/Source/GPUImageOpacityFilter.m @@ -42,10 +42,7 @@ - (void)setOpacity:(CGFloat)newValue; { _opacity = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(opacityUniform, _opacity); + [self setFloat:_opacity forUniform:opacityUniform program:filterProgram]; } - @end diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index b8d1cb3fe..4d4c27054 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -4,20 +4,22 @@ #import #import #import +#import "GLProgram.h" #define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical) typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180 } GPUImageRotationMode; @interface GPUImageOpenGLESContext : NSObject -{ - EAGLContext *_context; -} -@property(readonly, retain) EAGLContext *context; +@property(readonly, retain, nonatomic) EAGLContext *context; +@property(readonly, nonatomic) dispatch_queue_t contextQueue; +@property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram; + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; ++ (dispatch_queue_t)sharedOpenGLESQueue; + (void)useImageProcessingContext; ++ (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index b34e7413e..6a69f6d76 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -5,6 +5,7 @@ @implementation GPUImageOpenGLESContext @synthesize context = _context; +@synthesize currentShaderProgram = _currentShaderProgram; // Based on Colin Wheeler's example here: http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; @@ -18,6 +19,11 @@ + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; return sharedImageProcessingOpenGLESContext; } ++ (dispatch_queue_t)sharedOpenGLESQueue; +{ + return [[self sharedImageProcessingOpenGLESContext] contextQueue]; +} + + (void)useImageProcessingContext; { EAGLContext *imageProcessingContext = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context]; @@ -27,6 +33,22 @@ + (void)useImageProcessingContext; } } ++ (void)setActiveShaderProgram:(GLProgram *)shaderProgram; +{ + GPUImageOpenGLESContext *sharedContext = [GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext]; + EAGLContext *imageProcessingContext = [sharedContext context]; + if ([EAGLContext currentContext] != imageProcessingContext) + { + [EAGLContext setCurrentContext:imageProcessingContext]; + } + + if (sharedContext.currentShaderProgram != shaderProgram) + { + sharedContext.currentShaderProgram = shaderProgram; + [shaderProgram use]; + } +} + + (GLint)maximumTextureSizeForThisDevice; { GLint maxTextureSize; @@ -94,10 +116,11 @@ - (EAGLContext *)context; // Set up a few global settings for the image processing pipeline glDisable(GL_DEPTH_TEST); + + _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); } return _context; } - @end diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index c65485870..b393f54d0 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -1,7 +1,6 @@ #import #import "GPUImageOpenGLESContext.h" -#import "GLProgram.h" void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void report_memory(NSString *tag); diff --git a/framework/Source/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m index 02a35b756..5d1d51982 100644 --- a/framework/Source/GPUImagePerlinNoiseFilter.m +++ b/framework/Source/GPUImagePerlinNoiseFilter.m @@ -127,27 +127,21 @@ - (void)setScale:(float)scale { _scale = scale; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(scaleUniform, _scale); + [self setFloat:_scale forUniform:scaleUniform program:filterProgram]; } - (void)setColorStart:(GPUVector4)colorStart { _colorStart = colorStart; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform4f(colorStartUniform, _colorStart.one, _colorStart.two, _colorStart.three, _colorStart.four); + [self setVec4:(GLfloat *)&_colorStart forUniform:colorStartUniform program:filterProgram]; } - (void)setColorFinish:(GPUVector4)colorFinish { _colorFinish = colorFinish; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform4f(colorFinishUniform, _colorFinish.one, _colorFinish.two, _colorFinish.three, _colorFinish.four); + + [self setVec4:(GLfloat *)&_colorFinish forUniform:colorFinishUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePinchDistortionFilter.m b/framework/Source/GPUImagePinchDistortionFilter.m index fcbd1b556..4f4a75fc9 100755 --- a/framework/Source/GPUImagePinchDistortionFilter.m +++ b/framework/Source/GPUImagePinchDistortionFilter.m @@ -68,34 +68,22 @@ - (void)setRadius:(CGFloat)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } - (void)setScale:(CGFloat)newValue; { _scale = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(scaleUniform, _scale); + + [self setFloat:_scale forUniform:scaleUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index c6d07d122..a7a77584f 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -92,18 +92,14 @@ - (void)setFractionalWidthOfAPixel:(CGFloat)newValue; _fractionalWidthOfAPixel = newValue; } - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(fractionalWidthOfAPixelUniform, _fractionalWidthOfAPixel); + [self setFloat:_fractionalWidthOfAPixel forUniform:fractionalWidthOfAPixelUniform program:filterProgram]; } - (void)setAspectRatio:(CGFloat)newValue; { _aspectRatio = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(aspectRatioUniform, _aspectRatio); + + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePolarPixellateFilter.m b/framework/Source/GPUImagePolarPixellateFilter.m index 1a64a8d34..390a7aa7f 100755 --- a/framework/Source/GPUImagePolarPixellateFilter.m +++ b/framework/Source/GPUImagePolarPixellateFilter.m @@ -77,30 +77,15 @@ - (void)setPixelSize:(CGSize)pixelSize { _pixelSize = pixelSize; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GLfloat pixelS[2]; - pixelS[0] = _pixelSize.width; - pixelS[1] = _pixelSize.height; - glUniform2fv(pixelSizeUniform, 1, pixelS); + [self setSize:_pixelSize forUniform:pixelSizeUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } - - @end diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m index 42946ad27..bad7e1a30 100644 --- a/framework/Source/GPUImagePolkaDotFilter.m +++ b/framework/Source/GPUImagePolkaDotFilter.m @@ -49,9 +49,7 @@ - (void)setDotScaling:(CGFloat)newValue; { _dotScaling = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(dotScalingUniform, _dotScaling); + [self setFloat:_dotScaling forUniform:dotScalingUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePosterizeFilter.m b/framework/Source/GPUImagePosterizeFilter.m index 17bbec6cd..5a04105ea 100755 --- a/framework/Source/GPUImagePosterizeFilter.m +++ b/framework/Source/GPUImagePosterizeFilter.m @@ -42,9 +42,7 @@ - (void)setColorLevels:(NSUInteger)newValue; { _colorLevels = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(colorLevelsUniform, (GLfloat)_colorLevels); + [self setFloat:_colorLevels forUniform:colorLevelsUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageRGBFilter.m b/framework/Source/GPUImageRGBFilter.m index e71bb4aae..c981f8805 100755 --- a/framework/Source/GPUImageRGBFilter.m +++ b/framework/Source/GPUImageRGBFilter.m @@ -50,28 +50,21 @@ - (void)setRed:(CGFloat)newValue; { _red = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(redUniform, _red); + [self setFloat:_red forUniform:redUniform program:filterProgram]; } - (void)setGreen:(CGFloat)newValue; { _green = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(greenUniform, _green); -} + [self setFloat:_green forUniform:greenUniform program:filterProgram]; +} - (void)setBlue:(CGFloat)newValue; { _blue = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(blueUniform, _blue); + + [self setFloat:_blue forUniform:blueUniform program:filterProgram]; } @end \ No newline at end of file diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 9ee1d05dc..6907e6970 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -82,7 +82,9 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn dataTextureCoordinateAttribute = [dataProgram attributeIndex:@"inputTextureCoordinate"]; dataInputTextureUniform = [dataProgram uniformIndex:@"inputImageTexture"]; - [dataProgram use]; + // REFACTOR: Wrap this in a block for the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:dataProgram]; + glEnableVertexAttribArray(dataPositionAttribute); glEnableVertexAttribArray(dataTextureCoordinateAttribute); @@ -217,10 +219,8 @@ - (void)setFilterFBO; - (void)renderAtInternalSize; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [self setFilterFBO]; - - [dataProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:dataProgram]; + [self setFilterFBO]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/framework/Source/GPUImageSaturationFilter.m b/framework/Source/GPUImageSaturationFilter.m index 87c0510c0..31929e7e3 100755 --- a/framework/Source/GPUImageSaturationFilter.m +++ b/framework/Source/GPUImageSaturationFilter.m @@ -48,9 +48,7 @@ - (void)setSaturation:(CGFloat)newValue; { _saturation = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(saturationUniform, _saturation); + [self setFloat:_saturation forUniform:saturationUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageSharpenFilter.m b/framework/Source/GPUImageSharpenFilter.m index 14a9fbc23..83399675b 100755 --- a/framework/Source/GPUImageSharpenFilter.m +++ b/framework/Source/GPUImageSharpenFilter.m @@ -88,8 +88,8 @@ - (id)init; - (void)setupFilterForSize:(CGSize)filterFrameSize; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + // REFACTOR: Wrap this in block on image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { @@ -110,9 +110,7 @@ - (void)setSharpness:(CGFloat)newValue; { _sharpness = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(sharpnessUniform, _sharpness); + [self setFloat:_sharpness forUniform:sharpnessUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index f0d906555..39aa3987e 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -83,8 +83,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; + // REFACTOR: Wrap this in block on image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; glUniform1f(texelWidthUniform, _texelWidth); glUniform1f(texelHeightUniform, _texelHeight); } @@ -98,19 +98,15 @@ - (void)setTexelWidth:(CGFloat)newValue; hasOverriddenImageSizeFactor = YES; _texelWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - glUniform1f(texelWidthUniform, _texelWidth); + [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; } - (void)setTexelHeight:(CGFloat)newValue; { hasOverriddenImageSizeFactor = YES; _texelHeight = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - glUniform1f(texelHeightUniform, _texelHeight); + + [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index 979f9263e..c4815fc58 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -100,43 +100,29 @@ - (void)setRadius:(CGFloat)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } - (void)setAspectRatio:(CGFloat)newValue; { _aspectRatio = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(aspectRatioUniform, _aspectRatio); + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; } - (void)setRefractiveIndex:(CGFloat)newValue; { _refractiveIndex = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(refractiveIndexUniform, _refractiveIndex); + + [self setFloat:_refractiveIndex forUniform:refractiveIndexUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageStretchDistortionFilter.m b/framework/Source/GPUImageStretchDistortionFilter.m index ef96f0130..967e13811 100755 --- a/framework/Source/GPUImageStretchDistortionFilter.m +++ b/framework/Source/GPUImageStretchDistortionFilter.m @@ -64,17 +64,8 @@ - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } - @end diff --git a/framework/Source/GPUImageSwirlFilter.m b/framework/Source/GPUImageSwirlFilter.m index 1c1dce63f..6004a85b3 100755 --- a/framework/Source/GPUImageSwirlFilter.m +++ b/framework/Source/GPUImageSwirlFilter.m @@ -72,34 +72,22 @@ - (void)setRadius:(CGFloat)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } - (void)setAngle:(CGFloat)newValue; { _angle = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(angleUniform, _angle); + + [self setFloat:_angle forUniform:angleUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageThresholdEdgeDetection.m b/framework/Source/GPUImageThresholdEdgeDetection.m index 0de89abcd..d95f80022 100755 --- a/framework/Source/GPUImageThresholdEdgeDetection.m +++ b/framework/Source/GPUImageThresholdEdgeDetection.m @@ -70,9 +70,7 @@ - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - glUniform1f(thresholdUniform, _threshold); + [self setFloat:_threshold forUniform:thresholdUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index 0e4f30258..7bfbe1688 100755 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -82,19 +82,19 @@ - (CGFloat)blurSize; - (void)setTopFocusLevel:(CGFloat)newValue; { _topFocusLevel = newValue; - [tiltShiftFilter setFloat:newValue forUniform:@"topFocusLevel"]; + [tiltShiftFilter setFloat:newValue forUniformName:@"topFocusLevel"]; } - (void)setBottomFocusLevel:(CGFloat)newValue; { _bottomFocusLevel = newValue; - [tiltShiftFilter setFloat:newValue forUniform:@"bottomFocusLevel"]; + [tiltShiftFilter setFloat:newValue forUniformName:@"bottomFocusLevel"]; } - (void)setFocusFallOffRate:(CGFloat)newValue; { _focusFallOffRate = newValue; - [tiltShiftFilter setFloat:newValue forUniform:@"focusFallOffRate"]; + [tiltShiftFilter setFloat:newValue forUniformName:@"focusFallOffRate"]; } @end \ No newline at end of file diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index d41eaf55c..25a655322 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -422,11 +422,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; - [filterProgram use]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageToonFilter.m b/framework/Source/GPUImageToonFilter.m index 1e34db745..88c032065 100755 --- a/framework/Source/GPUImageToonFilter.m +++ b/framework/Source/GPUImageToonFilter.m @@ -85,18 +85,14 @@ - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(thresholdUniform, _threshold); + [self setFloat:_threshold forUniform:thresholdUniform program:filterProgram]; } - (void)setQuantizationLevels:(CGFloat)newValue; { _quantizationLevels = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(quantizationLevelsUniform, _quantizationLevels); + [self setFloat:_quantizationLevels forUniform:quantizationLevelsUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index f39ebd74d..02f0c922b 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -141,11 +141,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * filterFrameSize.height / filterFrameSize.width) top:(1.0 * filterFrameSize.height / filterFrameSize.width) near:-1.0 far:1.0]; // [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * (GLfloat)backingHeight / (GLfloat)backingWidth) top:(1.0 * (GLfloat)backingHeight / (GLfloat)backingWidth) near:-2.0 far:2.0]; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - - glUniformMatrix4fv(orthographicMatrixUniform, 1, GL_FALSE, orthographicMatrix); + + [self setMatrix4f:orthographicMatrix forUniform:orthographicMatrixUniform program:filterProgram]; } } @@ -165,15 +162,11 @@ - (CGAffineTransform)affineTransform; - (void)setTransform3D:(CATransform3D)newValue; { _transform3D = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - + GLfloat temporaryMatrix[16]; [self convert3DTransform:&_transform3D toMatrix:temporaryMatrix]; - - glUniformMatrix4fv(transformMatrixUniform, 1, GL_FALSE, temporaryMatrix); + [self setMatrix4f:temporaryMatrix forUniform:transformMatrixUniform program:filterProgram]; } - (void)setIgnoreAspectRatio:(BOOL)newValue; @@ -184,10 +177,7 @@ - (void)setIgnoreAspectRatio:(BOOL)newValue; { [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:-1.0 top:1.0 near:-1.0 far:1.0]; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - - glUniformMatrix4fv(orthographicMatrixUniform, 1, GL_FALSE, orthographicMatrix); + [self setMatrix4f:orthographicMatrix forUniform:orthographicMatrixUniform program:filterProgram]; } else { diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 096a86c6c..83bc74eca 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -76,11 +76,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; - [filterProgram use]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 8c24a2cb4..687e418f3 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -33,7 +33,9 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - [secondFilterProgram use]; + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glEnableVertexAttribArray(secondFilterPositionAttribute); glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); @@ -222,7 +224,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // Run the second stage of the two-pass filter [self setSecondFilterFBO]; - [secondFilterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index a81befbe3..1d87ae9b1 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -23,8 +23,8 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade - (void)setupFilterForSize:(CGSize)filterFrameSize; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) @@ -38,7 +38,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); } - [secondFilterProgram use]; + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); } diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index d5331ee49..b1f2b618b 100755 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -75,7 +75,7 @@ - (CGFloat)blurSize; - (void)setIntensity:(CGFloat)newValue; { _intensity = newValue; - [unsharpMaskFilter setFloat:newValue forUniform:@"intensity"]; + [unsharpMaskFilter setFloat:newValue forUniformName:@"intensity"]; } @end \ No newline at end of file diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 13349f5ad..480f89ae2 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -34,10 +34,10 @@ } /// The AVCaptureSession used to capture from the camera -@property(readonly, retain) AVCaptureSession *captureSession; +@property(readonly, retain, nonatomic) AVCaptureSession *captureSession; -/// This enables capture session preset to be changed on the fly -@property (readwrite) NSString *captureSessionPreset; +/// This enables the capture session preset to be changed on the fly +@property (readwrite, nonatomic) NSString *captureSessionPreset; /// This sets the frame rate of the camera (iOS 5 and above only) /** @@ -57,7 +57,7 @@ /// This determines the rotation applied to the output image, based on the source material @property(readwrite, nonatomic) UIInterfaceOrientation outputImageOrientation; -@property(nonatomic,retain) id delegate; +@property(nonatomic, retain) id delegate; /// @name Initialization and teardown diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index fb1f39afc..791b361df 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -12,16 +12,16 @@ @interface GPUImageVideoCamera () AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; - NSString *_capturSessionPreset; NSInteger _frameRate; - dispatch_queue_t audioProcessingQueue; + dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; } @end @implementation GPUImageVideoCamera +@synthesize captureSessionPreset = _captureSessionPreset; @synthesize captureSession = _captureSession; @synthesize inputCamera = _inputCamera; @synthesize runBenchmark = _runBenchmark; @@ -48,7 +48,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return nil; } - audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.processingQueue", NULL); + cameraProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.cameraProcessingQueue", NULL); + audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); _frameRate = 0; // This will not set frame rate unless this value gets set to 1 or above _runBenchmark = NO; @@ -104,9 +105,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // dispatch_queue_t videoQueue = dispatch_queue_create("com.sunsetlakesoftware.colortracking.videoqueue", NULL); // [videoOutput setSampleBufferDelegate:self queue:videoQueue]; - //[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; - //this should be on the same queue as the audio - [videoOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; + [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; if ([_captureSession canAddOutput:videoOutput]) { [_captureSession addOutput:videoOutput]; @@ -116,8 +115,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD NSLog(@"Couldn't add video output"); } - _capturSessionPreset = sessionPreset; - [_captureSession setSessionPreset:_capturSessionPreset]; + _captureSessionPreset = sessionPreset; + [_captureSession setSessionPreset:_captureSessionPreset]; // This will let you get 60 FPS video from the 720p preset on an iPhone 4S, but only that device and that preset // AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; @@ -137,7 +136,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD - (void)dealloc { [self stopCameraCapture]; - // [videoOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; + [videoOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; + [audioOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; [self removeInputsAndOutputs]; @@ -145,7 +145,12 @@ - (void)dealloc { CFRelease(coreVideoTextureCache); } - + + if (cameraProcessingQueue != NULL) + { + dispatch_release(cameraProcessingQueue); + } + if (audioProcessingQueue != NULL) { dispatch_release(audioProcessingQueue); @@ -275,17 +280,12 @@ - (void)setCaptureSessionPreset:(NSString *)captureSessionPreset; { [_captureSession beginConfiguration]; - _capturSessionPreset = captureSessionPreset; - [_captureSession setSessionPreset:_capturSessionPreset]; + _captureSessionPreset = captureSessionPreset; + [_captureSession setSessionPreset:_captureSessionPreset]; [_captureSession commitConfiguration]; } -- (NSString *)captureSessionPreset; -{ - return _capturSessionPreset; -} - - (void)setFrameRate:(NSInteger)frameRate; { _frameRate = frameRate; @@ -519,9 +519,6 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; } audioOutput = [[AVCaptureAudioDataOutput alloc] init]; - audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); - - // [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; if ([_captureSession canAddOutput:audioOutput]) { [_captureSession addOutput:audioOutput]; diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 70dbefae6..e890462c5 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -113,7 +113,8 @@ - (void)commonInit; displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader - [displayProgram use]; + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; glEnableVertexAttribArray(displayPositionAttribute); glEnableVertexAttribArray(displayTextureCoordinateAttribute); @@ -342,11 +343,9 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; [self setDisplayFramebuffer]; - [displayProgram use]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m index 1b2a03680..4eb094528 100755 --- a/framework/Source/GPUImageVignetteFilter.m +++ b/framework/Source/GPUImageVignetteFilter.m @@ -49,18 +49,14 @@ - (void)setVignetteStart:(CGFloat)newValue; { _vignetteStart = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(vignetteStartUniform, _vignetteStart); + [self setFloat:_vignetteStart forUniform:vignetteStartUniform program:filterProgram]; } - (void)setVignetteEnd:(CGFloat)newValue; { _vignetteEnd = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(vignetteEndUniform, _vignetteEnd); + + [self setFloat:_vignetteEnd forUniform:vignetteEndUniform program:filterProgram]; } @end From 74ad3f694f6363d76e9034c563b662c51cc50616 Mon Sep 17 00:00:00 2001 From: Steve McKenzie Date: Mon, 13 Aug 2012 11:13:45 -0700 Subject: [PATCH 189/695] Actually update the bufferSize when using setBufferSize. --- framework/Source/GPUImageBuffer.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index 8c8447ccb..ce7fa8314 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -158,6 +158,8 @@ - (void)setBufferSize:(NSUInteger)newValue; [self removeTexture:[lastTextureName intValue]]; } } + + _bufferSize = newValue; } @end From a944ac814cc9b78a57b6750867baf0c0263693d4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 14 Aug 2012 11:35:48 -0500 Subject: [PATCH 190/695] The framework has been overhauled to be multithreaded. This leads to up to a 40% performance improvement with certain filters, and should prevent blocking of the interface when processing video. However, it may break things. --- README.md | 2 +- .../ColorTrackingViewController.h | 2 +- .../ColorTrackingViewController.m | 38 +- .../Classes/DisplayViewController.m | 2 + examples/CubeExample/Classes/ES2Renderer.h | 1 + examples/CubeExample/Classes/ES2Renderer.m | 23 +- .../ShowcaseFilterViewController.m | 4 +- .../MultiViewViewController.m | 5 +- .../SimpleImageViewController.m | 4 +- .../SimpleVideoFilterViewController.m | 6 +- .../Source/GPUImage3x3ConvolutionFilter.m | 2 +- .../Source/GPUImage3x3TextureSamplingFilter.m | 26 +- .../Source/GPUImageChromaKeyBlendFilter.m | 5 +- framework/Source/GPUImageColorMatrixFilter.m | 2 +- framework/Source/GPUImageColorPackingFilter.m | 9 +- framework/Source/GPUImageCrosshairGenerator.m | 45 +- ...geDirectionalNonMaximumSuppressionFilter.m | 9 +- framework/Source/GPUImageFalseColorFilter.m | 14 +- framework/Source/GPUImageFilter.h | 12 +- framework/Source/GPUImageFilter.m | 427 +++++++++--------- framework/Source/GPUImageFilterGroup.m | 32 +- framework/Source/GPUImageHistogramFilter.m | 83 ++-- framework/Source/GPUImageHistogramGenerator.m | 11 +- framework/Source/GPUImageKuwaharaFilter.m | 2 +- framework/Source/GPUImageMonochromeFilter.m | 5 +- framework/Source/GPUImageMovie.h | 1 + framework/Source/GPUImageMovie.m | 68 ++- framework/Source/GPUImageMovieWriter.m | 92 ++-- framework/Source/GPUImageOpenGLESContext.m | 14 +- framework/Source/GPUImageOutput.h | 1 + framework/Source/GPUImageOutput.m | 99 ++-- framework/Source/GPUImagePerlinNoiseFilter.m | 4 +- framework/Source/GPUImagePicture.m | 51 ++- framework/Source/GPUImageRawDataOutput.m | 50 +- framework/Source/GPUImageSharpenFilter.m | 27 +- .../Source/GPUImageSobelEdgeDetectionFilter.m | 9 +- framework/Source/GPUImageStillCamera.h | 3 +- framework/Source/GPUImageStillCamera.m | 64 ++- framework/Source/GPUImageTextureInput.m | 25 +- framework/Source/GPUImageTransformFilter.h | 2 +- framework/Source/GPUImageTransformFilter.m | 75 ++- framework/Source/GPUImageTwoInputFilter.m | 14 +- framework/Source/GPUImageTwoPassFilter.m | 232 +++++----- .../GPUImageTwoPassTextureSamplingFilter.m | 38 +- framework/Source/GPUImageVideoCamera.h | 3 +- framework/Source/GPUImageVideoCamera.m | 175 +++---- framework/Source/GPUImageView.m | 216 ++++----- 47 files changed, 1112 insertions(+), 922 deletions(-) diff --git a/README.md b/README.md index 47f2b242b..ee20f50f1 100755 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageLookupFilter**: Uses an RGB color lookup image to remap the colors in an image. First, use your favourite photo editing application to apply a filter to lookup.png from GPUImage/framework/Resources. For this to work properly each pixel color must not depend on other pixels (e.g. blur will not work). If you need a more complex filter you can create as many lookup tables as required. Once ready, use your new lookup.png file as a second input for GPUImageLookupFilter. -- **GPUImageLookupFilter**: A photo filter based on a Photoshop action by Amatorka: http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631 . If you want to use this effect you have to add lookup_amatorka.png from the GPUImage Resources folder to your application bundle. +- **GPUImageAmatorkaFilter**: A photo filter based on a Photoshop action by Amatorka: http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631 . If you want to use this effect you have to add lookup_amatorka.png from the GPUImage Resources folder to your application bundle. - **GPUImageMissEtikateFilter**: A photo filter based on a Photoshop action by Miss Etikate: http://miss-etikate.deviantart.com/art/Photoshop-Action-15-120151961 . If you want to use this effect you have to add lookup_miss_etikate.png from the GPUImage Resources folder to your application bundle. diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h index db25b6aaa..469abd8aa 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h @@ -17,7 +17,7 @@ typedef enum { PASSTHROUGH_VIDEO, SIMPLE_THRESHOLDING, POSITION_THRESHOLDING, OB BOOL shouldReplaceThresholdColor; CGPoint currentTouchPoint; GLfloat thresholdSensitivity; - GLfloat thresholdColor[3]; + GPUVector3 thresholdColor; } - (void)configureVideoFiltering; diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index 1e5a837e6..423a01620 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -19,9 +19,9 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil [NSNumber numberWithFloat:0.7], @"thresholdSensitivity", nil]]; - thresholdColor[0] = [currentDefaults floatForKey:@"thresholdColorR"]; - thresholdColor[1] = [currentDefaults floatForKey:@"thresholdColorG"]; - thresholdColor[2] = [currentDefaults floatForKey:@"thresholdColorB"]; + thresholdColor.one = [currentDefaults floatForKey:@"thresholdColorR"]; + thresholdColor.two = [currentDefaults floatForKey:@"thresholdColorG"]; + thresholdColor.three = [currentDefaults floatForKey:@"thresholdColorB"]; displayMode = PASSTHROUGH_VIDEO; thresholdSensitivity = [currentDefaults floatForKey:@"thresholdSensitivity"]; } @@ -54,11 +54,11 @@ - (void)configureVideoFiltering; [self.view addSubview:filteredVideoView]; thresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Threshold"]; - [thresholdFilter setFloat:thresholdSensitivity forUniform:@"threshold"]; - [thresholdFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; + [thresholdFilter setFloat:thresholdSensitivity forUniformName:@"threshold"]; + [thresholdFilter setFloatVec3:thresholdColor forUniformName:@"inputColor"]; positionFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"PositionColor"]; - [positionFilter setFloat:thresholdSensitivity forUniform:@"threshold"]; - [positionFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; + [positionFilter setFloat:thresholdSensitivity forUniformName:@"threshold"]; + [positionFilter setFloatVec3:thresholdColor forUniformName:@"inputColor"]; // CGSize videoPixelSize = filteredVideoView.bounds.size; // videoPixelSize.width *= [filteredVideoView contentScaleFactor]; @@ -72,7 +72,9 @@ - (void)configureVideoFiltering; GLubyte *bytesForPositionData = positionRawData.rawBytesForImage; CGPoint currentTrackingLocation = [weakSelf centroidFromTexture:bytesForPositionData ofSize:[positionRawData maximumOutputSize]]; CGSize currentViewSize = weakSelf.view.bounds.size; - trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); + dispatch_async(dispatch_get_main_queue(), ^{ + trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); + }); }]; videoRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize resultsInBGRAFormat:YES]; @@ -89,18 +91,18 @@ - (void)configureVideoFiltering; GPUByteColorVector colorAtTouchPoint = [videoRawData colorAtLocation:scaledTouchPoint]; - thresholdColor[0] = (float)colorAtTouchPoint.red / 255.0; - thresholdColor[1] = (float)colorAtTouchPoint.green / 255.0; - thresholdColor[2] = (float)colorAtTouchPoint.blue / 255.0; + thresholdColor.one = (float)colorAtTouchPoint.red / 255.0; + thresholdColor.two = (float)colorAtTouchPoint.green / 255.0; + thresholdColor.three = (float)colorAtTouchPoint.blue / 255.0; // NSLog(@"Color at touch point: %d, %d, %d, %d", colorAtTouchPoint.red, colorAtTouchPoint.green, colorAtTouchPoint.blue, colorAtTouchPoint.alpha); - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[0] forKey:@"thresholdColorR"]; - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[1] forKey:@"thresholdColorG"]; - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor[2] forKey:@"thresholdColorB"]; + [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor.one forKey:@"thresholdColorR"]; + [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor.two forKey:@"thresholdColorG"]; + [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor.three forKey:@"thresholdColorB"]; - [thresholdFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; - [positionFilter setFloatVec3:thresholdColor forUniform:@"inputColor"]; + [thresholdFilter setFloatVec3:thresholdColor forUniformName:@"inputColor"]; + [positionFilter setFloatVec3:thresholdColor forUniformName:@"inputColor"]; shouldReplaceThresholdColor = NO; } @@ -254,8 +256,8 @@ - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; thresholdSensitivity = distanceMoved / 160.0f; [[NSUserDefaults standardUserDefaults] setFloat:thresholdSensitivity forKey:@"thresholdSensitivity"]; - [thresholdFilter setFloat:thresholdSensitivity forUniform:@"threshold"]; - [positionFilter setFloat:thresholdSensitivity forUniform:@"threshold"]; + [thresholdFilter setFloat:thresholdSensitivity forUniformName:@"threshold"]; + [positionFilter setFloat:thresholdSensitivity forUniformName:@"threshold"]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event diff --git a/examples/CubeExample/Classes/DisplayViewController.m b/examples/CubeExample/Classes/DisplayViewController.m index 0639ff673..ffc82368c 100755 --- a/examples/CubeExample/Classes/DisplayViewController.m +++ b/examples/CubeExample/Classes/DisplayViewController.m @@ -47,6 +47,8 @@ - (void)loadView [textureInput processTextureWithFrameTime:CMTimeMake((int)currentTimeInMilliseconds, 1000)]; }]; + + [renderer startCameraCapture]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation diff --git a/examples/CubeExample/Classes/ES2Renderer.h b/examples/CubeExample/Classes/ES2Renderer.h index 642b0af45..e264914ee 100755 --- a/examples/CubeExample/Classes/ES2Renderer.h +++ b/examples/CubeExample/Classes/ES2Renderer.h @@ -38,6 +38,7 @@ - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotation; - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matrix; +- (void)startCameraCapture; @end diff --git a/examples/CubeExample/Classes/ES2Renderer.m b/examples/CubeExample/Classes/ES2Renderer.m index f3a0d9445..5e118158f 100755 --- a/examples/CubeExample/Classes/ES2Renderer.m +++ b/examples/CubeExample/Classes/ES2Renderer.m @@ -79,9 +79,6 @@ - (id)initWithSize:(CGSize)newSize; [videoCamera addTarget:inputFilter]; [inputFilter addTarget:textureOutput]; - - [videoCamera startCameraCapture]; - } return self; @@ -89,6 +86,11 @@ - (id)initWithSize:(CGSize)newSize; - (void)renderByRotatingAroundX:(float)xRotation rotatingAroundY:(float)yRotation; { + if (!newFrameAvailableBlock) + { + return; + } + static const GLfloat cubeVertices[] = { -1.0, -1.0, -1.0, // 0 1.0, 1.0, -1.0, // 2 @@ -466,14 +468,23 @@ - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matr matrix[15] = (GLfloat)transform3D->m44; } +- (void)startCameraCapture; +{ + [videoCamera startCameraCapture]; +} + #pragma mark - #pragma mark GPUImageTextureOutputDelegate delegate method - (void)newFrameReadyFromTextureOutput:(GPUImageTextureOutput *)callbackTextureOutput; { - textureForCubeFace = callbackTextureOutput.texture; - - [self renderByRotatingAroundX:0.0 rotatingAroundY:0.0]; + // Rotation in response to touch events is handled on the main thread, so to be safe we dispatch this on the main queue as well + // Nominally, I should create a dispatch queue just for the rendering within this application, but not today + dispatch_async(dispatch_get_main_queue(), ^{ + textureForCubeFace = callbackTextureOutput.texture; + + [self renderByRotatingAroundX:0.0 rotatingAroundY:0.0]; + }); } @end diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index be7a96eef..e9c9990e9 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1265,7 +1265,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; } #pragma mark - Face Detection Delegate Callback --(void) willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer{ +- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer{ if (!faceThinking) { CFAllocatorRef allocator = CFAllocatorGetDefault(); CMSampleBufferRef sbufCopyOut; @@ -1274,7 +1274,7 @@ -(void) willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer{ } } --(void)grepFacesForSampleBuffer:(CMSampleBufferRef)sampleBuffer{ +- (void)grepFacesForSampleBuffer:(CMSampleBufferRef)sampleBuffer{ faceThinking = TRUE; NSLog(@"Faces thinking"); CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m index 1bc497e56..aa77367ce 100755 --- a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m +++ b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m @@ -45,11 +45,10 @@ - (void)loadView // For thumbnails smaller than the input video size, we currently need to make them render at a smaller size. // This is to avoid wasting processing time on larger frames than will be displayed. // You'll need to use -forceProcessingAtSize: with a zero size to re-enable full frame processing of video. - [filter1 forceProcessingAtSize:view2.sizeInPixels]; [filter2 forceProcessingAtSize:view3.sizeInPixels]; [filter3 forceProcessingAtSize:view4.sizeInPixels]; - + [videoCamera addTarget:view1]; [videoCamera addTarget:filter1]; [filter1 addTarget:view2]; @@ -57,7 +56,7 @@ - (void)loadView [filter2 addTarget:view3]; [videoCamera addTarget:filter3]; [filter3 addTarget:view4]; - + [videoCamera startCameraCapture]; } diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index 38a84ee96..0fcfdd23d 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -81,6 +81,8 @@ - (void)setupImageFilteringToDisk; // Do a simpler image filtering GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init]; +// GPUImageUnsharpMaskFilter *stillImageFilter2 = [[GPUImageUnsharpMaskFilter alloc] init]; +// GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; @@ -99,7 +101,7 @@ - (void)setupImageFilteringToDisk; if (![dataForPNGFile2 writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-filtered2.png"] options:NSAtomicWrite error:&error]) { return; - } + } } @end diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 973f17f37..daae31ba5 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -21,9 +21,9 @@ - (void)viewDidLoad { [super viewDidLoad]; -// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; - videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; @@ -74,7 +74,7 @@ - (void)viewDidLoad // [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOn]; // [videoCamera.inputCamera unlockForConfiguration]; - double delayInSeconds = 60.0; + double delayInSeconds = 10.0; dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m index 94135170f..605ff2ca3 100755 --- a/framework/Source/GPUImage3x3ConvolutionFilter.m +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -72,7 +72,7 @@ - (void)setConvolutionKernel:(GPUMatrix3x3)newValue; { _convolutionKernel = newValue; - [self setMatrix3f:(GLfloat *)&_convolutionKernel forUniform:convolutionMatrixUniform program:filterProgram]; + [self setMatrix3f:_convolutionKernel forUniform:convolutionMatrixUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m index 0cda9388f..089848794 100644 --- a/framework/Source/GPUImage3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -73,19 +73,19 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - // REFACTOR: Enclose this in block on image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(texelWidthUniform, _texelHeight); - glUniform1f(texelHeightUniform, _texelWidth); - } - else - { - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); - } - + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(texelWidthUniform, _texelHeight); + glUniform1f(texelHeightUniform, _texelWidth); + } + else + { + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + } + }); } } diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m index b86b278d0..f8bb2b5a7 100755 --- a/framework/Source/GPUImageChromaKeyBlendFilter.m +++ b/framework/Source/GPUImageChromaKeyBlendFilter.m @@ -62,10 +62,7 @@ - (id)init; - (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; { - GLfloat colorToReplace[3]; - colorToReplace[0] = redComponent; - colorToReplace[1] = greenComponent; - colorToReplace[2] = blueComponent; + GPUVector3 colorToReplace = {redComponent, greenComponent, blueComponent}; [self setVec3:colorToReplace forUniform:colorToReplaceUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageColorMatrixFilter.m b/framework/Source/GPUImageColorMatrixFilter.m index c0d056212..d247f5b8b 100755 --- a/framework/Source/GPUImageColorMatrixFilter.m +++ b/framework/Source/GPUImageColorMatrixFilter.m @@ -61,7 +61,7 @@ - (void)setColorMatrix:(GPUMatrix4x4)newColorMatrix; { _colorMatrix = newColorMatrix; - [self setMatrix4f:(GLfloat *)&_colorMatrix forUniform:colorMatrixUniform program:filterProgram]; + [self setMatrix4f:_colorMatrix forUniform:colorMatrixUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m index e67264e47..825bc656a 100644 --- a/framework/Source/GPUImageColorPackingFilter.m +++ b/framework/Source/GPUImageColorPackingFilter.m @@ -73,10 +73,11 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; texelWidth = 0.5 / inputTextureSize.width; texelHeight = 0.5 / inputTextureSize.height; - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - glUniform1f(texelWidthUniform, texelWidth); - glUniform1f(texelHeightUniform, texelHeight); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + glUniform1f(texelWidthUniform, texelWidth); + glUniform1f(texelHeightUniform, texelHeight); + }); } #pragma mark - diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index 2cf5a08f4..1216ffcc2 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -51,11 +51,13 @@ - (id)init; return nil; } - crosshairWidthUniform = [filterProgram uniformIndex:@"crosshairWidth"]; - crosshairColorUniform = [filterProgram uniformIndex:@"crosshairColor"]; - - self.crosshairWidth = 5.0; - [self setCrosshairColorRed:0.0 green:1.0 blue:0.0]; + runSynchronouslyOnVideoProcessingQueue(^{ + crosshairWidthUniform = [filterProgram uniformIndex:@"crosshairWidth"]; + crosshairColorUniform = [filterProgram uniformIndex:@"crosshairColor"]; + + self.crosshairWidth = 5.0; + [self setCrosshairColorRed:0.0 green:1.0 blue:0.0]; + }); return self; } @@ -70,18 +72,20 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte return; } - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - - [self setFilterFBO]; - - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, crosshairCoordinates); - - glDrawArrays(GL_POINTS, 0, numberOfCrosshairs); - - [self informTargetsAboutNewFrameAtTime:frameTime]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + [self setFilterFBO]; + + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, crosshairCoordinates); + + glDrawArrays(GL_POINTS, 0, numberOfCrosshairs); + + [self informTargetsAboutNewFrameAtTime:frameTime]; + }); } - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; @@ -101,12 +105,9 @@ - (void)setCrosshairWidth:(CGFloat)newValue; - (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; { - GLfloat colorToReplace[3]; - colorToReplace[0] = redComponent; - colorToReplace[1] = greenComponent; - colorToReplace[2] = blueComponent; + GPUVector3 crosshairColor = {redComponent, greenComponent, blueComponent}; - [self setVec3:colorToReplace forUniform:crosshairColorUniform program:filterProgram]; + [self setVec3:crosshairColor forUniform:crosshairColorUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m index 698d7b50a..c27b5ad09 100644 --- a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m @@ -66,10 +66,11 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - // REFACTOR: Wrap this appropriately - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + }); } } diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m index 7d9a721df..475313eab 100644 --- a/framework/Source/GPUImageFalseColorFilter.m +++ b/framework/Source/GPUImageFalseColorFilter.m @@ -63,22 +63,16 @@ - (void)setSecondColor:(GPUVector4)newValue; - (void)setFirstColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; { - GLfloat filterColor[3]; - filterColor[0] = redComponent; - filterColor[1] = greenComponent; - filterColor[2] = blueComponent; + GPUVector3 firstColor = {redComponent, greenComponent, blueComponent}; - [self setVec3:filterColor forUniform:firstColorUniform program:filterProgram]; + [self setVec3:firstColor forUniform:firstColorUniform program:filterProgram]; } - (void)setSecondColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; { - GLfloat filterColor[3]; - filterColor[0] = redComponent; - filterColor[1] = greenComponent; - filterColor[2] = blueComponent; + GPUVector3 secondColor = {redComponent, greenComponent, blueComponent}; - [self setVec3:filterColor forUniform:secondColorUniform program:filterProgram]; + [self setVec3:secondColor forUniform:secondColorUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index aa3109465..81f9190ad 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -119,17 +119,17 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)setFloat:(GLfloat)newFloat forUniformName:(NSString *)uniformName; - (void)setSize:(CGSize)newSize forUniformName:(NSString *)uniformName; - (void)setPoint:(CGPoint)newPoint forUniformName:(NSString *)uniformName; -- (void)setFloatVec3:(GLfloat *)newVec3 forUniformName:(NSString *)uniformName; -- (void)setFloatVec4:(GLfloat *)newVec4 forUniform:(NSString *)uniformName; +- (void)setFloatVec3:(GPUVector3)newVec3 forUniformName:(NSString *)uniformName; +- (void)setFloatVec4:(GPUVector4)newVec4 forUniform:(NSString *)uniformName; - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSString*)uniformName; -- (void)setMatrix3f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; -- (void)setMatrix4f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; -- (void)setVec3:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; -- (void)setVec4:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index e8f802746..0fa8b5b32 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -54,33 +54,34 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad backgroundColorGreen = 0.0; backgroundColorBlue = 0.0; backgroundColorAlpha = 0.0; - - // REFACTOR: Wrap this in block to perform on image processing queue? - [GPUImageOpenGLESContext useImageProcessingContext]; - filterProgram = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; - - [self initializeAttributes]; - - if (![filterProgram link]) - { - NSString *progLog = [filterProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [filterProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [filterProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - - filterPositionAttribute = [filterProgram attributeIndex:@"position"]; - filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; - filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - glEnableVertexAttribArray(filterPositionAttribute); - glEnableVertexAttribArray(filterTextureCoordinateAttribute); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + filterProgram = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; + + [self initializeAttributes]; + + if (![filterProgram link]) + { + NSString *progLog = [filterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [filterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [filterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + + filterPositionAttribute = [filterProgram attributeIndex:@"position"]; + filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; + filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + glEnableVertexAttribArray(filterPositionAttribute); + glEnableVertexAttribArray(filterTextureCoordinateAttribute); + }); return self; } @@ -144,52 +145,56 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) filter.preventRendering = NO; } -- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation { - [GPUImageOpenGLESContext useImageProcessingContext]; - [self setOutputFBO]; - - CGSize currentFBOSize = [self sizeOfFBO]; - NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; - // It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache - NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; - NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)currentFBOSize.height * 4; - - GLubyte *rawImagePixels; - - CGDataProviderRef dataProvider; - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - // glFlush(); - glFinish(); - CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation - CVPixelBufferLockBaseAddress(renderTarget, 0); - self.preventRendering = YES; // Locks don't seem to work, so prevent any rendering to the filter which might overwrite the pixel buffer data until done processing - rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); - dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, paddedBytesForImage, dataProviderUnlockCallback); - } - else - { - rawImagePixels = (GLubyte *)malloc(totalBytesForImage); - glReadPixels(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); - dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, dataProviderReleaseCallback); - } - - - CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); - - CGImageRef cgImageFromBytes; - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); - } - else - { - cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * (int)currentFBOSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); - } - - // Capture image with current device orientation - CGDataProviderRelease(dataProvider); - CGColorSpaceRelease(defaultRGBColorSpace); +- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation +{ + __block CGImageRef cgImageFromBytes; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + CGSize currentFBOSize = [self sizeOfFBO]; + NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; + // It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache + NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; + NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)currentFBOSize.height * 4; + + GLubyte *rawImagePixels; + + CGDataProviderRef dataProvider; + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + // glFlush(); + glFinish(); + CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation + CVPixelBufferLockBaseAddress(renderTarget, 0); + self.preventRendering = YES; // Locks don't seem to work, so prevent any rendering to the filter which might overwrite the pixel buffer data until done processing + rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); + dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, paddedBytesForImage, dataProviderUnlockCallback); + } + else + { + [self setOutputFBO]; + rawImagePixels = (GLubyte *)malloc(totalBytesForImage); + glReadPixels(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, dataProviderReleaseCallback); + } + + + CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); + } + else + { + cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * (int)currentFBOSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); + } + + // Capture image with current device orientation + CGDataProviderRelease(dataProvider); + CGColorSpaceRelease(defaultRGBColorSpace); + }); return cgImageFromBytes; } @@ -252,108 +257,113 @@ - (CGSize)sizeOfFBO; - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { - glActiveTexture(GL_TEXTURE1); - glGenFramebuffers(1, &filterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + glActiveTexture(GL_TEXTURE1); + glGenFramebuffers(1, &filterFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); #endif - - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) - { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); + + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + outputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + + [self notifyTargetsAboutNewOutputTexture]; } - - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - GL_RGBA, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, - 0, - &renderTexture); - if (err) + else { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + + [self notifyTargetsAboutNewOutputTexture]; } - - CFRelease(attrs); - CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - outputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + // NSLog(@"Filter size: %f, %f for filter: %@", currentFBOSize.width, currentFBOSize.height, self); - [self notifyTargetsAboutNewOutputTexture]; - } - else - { - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - [self notifyTargetsAboutNewOutputTexture]; - } - -// NSLog(@"Filter size: %f, %f for filter: %@", currentFBOSize.width, currentFBOSize.height, self); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - glBindTexture(GL_TEXTURE_2D, 0); + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + glBindTexture(GL_TEXTURE_2D, 0); + }); } - (void)destroyFilterFBO; { if (filterFramebuffer) { - [GPUImageOpenGLESContext useImageProcessingContext]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; - glDeleteFramebuffers(1, &filterFramebuffer); - filterFramebuffer = 0; - - if (filterTextureCache != NULL) - { - CFRelease(renderTarget); - renderTarget = NULL; + glDeleteFramebuffers(1, &filterFramebuffer); + filterFramebuffer = 0; - if (renderTexture) + if (filterTextureCache != NULL) { - CFRelease(renderTexture); - renderTexture = NULL; + CFRelease(renderTarget); + renderTarget = NULL; + + if (renderTexture) + { + CFRelease(renderTexture); + renderTexture = NULL; + } + + CVOpenGLESTextureCacheFlush(filterTextureCache, 0); + CFRelease(filterTextureCache); + filterTextureCache = NULL; } - - CVOpenGLESTextureCacheFlush(filterTextureCache, 0); - CFRelease(filterTextureCache); - filterTextureCache = NULL; - } - } + }); + } } - (void)setFilterFBO; @@ -464,7 +474,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; @@ -505,10 +515,12 @@ - (void)prepareForImageCapture; { if (outputTexture) { - [GPUImageOpenGLESContext useImageProcessingContext]; - - glDeleteTextures(1, &outputTexture); - outputTexture = 0; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + }); } } } @@ -548,13 +560,13 @@ - (void)setPoint:(CGPoint)newPoint forUniformName:(NSString *)uniformName; [self setPoint:newPoint forUniform:uniformIndex program:filterProgram]; } -- (void)setFloatVec3:(GLfloat *)newVec3 forUniformName:(NSString *)uniformName; +- (void)setFloatVec3:(GPUVector3)newVec3 forUniformName:(NSString *)uniformName; { GLint uniformIndex = [filterProgram uniformIndex:uniformName]; [self setVec3:newVec3 forUniform:uniformIndex program:filterProgram]; } -- (void)setFloatVec4:(GLfloat *)newVec4 forUniform:(NSString *)uniformName; +- (void)setFloatVec4:(GPUVector4)newVec4 forUniform:(NSString *)uniformName; { GLint uniformIndex = [filterProgram uniformIndex:uniformName]; [self setVec4:newVec4 forUniform:uniformIndex program:filterProgram]; @@ -567,80 +579,89 @@ - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSStrin [self setFloatArray:array length:count forUniform:uniformIndex program:filterProgram]; } -- (void)setMatrix3f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniformMatrix3fv(uniform, 1, GL_FALSE, matrix); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + }); } -- (void)setMatrix4f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniformMatrix4fv(uniform, 1, GL_FALSE, matrix); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + }); } - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform1f(uniform, floatValue); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniform1f(uniform, floatValue); + }); } - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - GLfloat positionArray[2]; - positionArray[0] = pointValue.x; - positionArray[1] = pointValue.y; - - glUniform2fv(uniform, 1, positionArray); + GLfloat positionArray[2]; + positionArray[0] = pointValue.x; + positionArray[1] = pointValue.y; + + glUniform2fv(uniform, 1, positionArray); + }); } - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - - GLfloat sizeArray[2]; - sizeArray[0] = sizeValue.width; - sizeArray[1] = sizeValue.height; - - glUniform2fv(uniform, 1, sizeArray); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + GLfloat sizeArray[2]; + sizeArray[0] = sizeValue.width; + sizeArray[1] = sizeValue.height; + + glUniform2fv(uniform, 1, sizeArray); + }); } -- (void)setVec3:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform3fv(uniform, 1, vectorValue); + glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); + }); } -- (void)setVec4:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - - glUniform4fv(uniform, 1, vectorValue); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); + }); } - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - - glUniform1fv(uniform, arrayLength, arrayValue); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + glUniform1fv(uniform, arrayLength, arrayValue); + }); } - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform1i(uniform, intValue); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniform1i(uniform, intValue); + }); } #pragma mark - diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 115667d8c..61f5bd715 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -54,28 +54,32 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrie - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; { - CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; - UIImage *processedImage = [UIImage imageWithCGImage:image]; - CGImageRelease(image); - return processedImage; + return [self.terminalFilter imageByFilteringImage:imageToFilter]; +// CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; +// UIImage *processedImage = [UIImage imageWithCGImage:image]; +// CGImageRelease(image); +// return processedImage; } - (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter; { - return [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; + return [self.terminalFilter newCGImageByFilteringImage:imageToFilter]; +// +// return [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; } - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; { - GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; - - [stillImageSource addTarget:self]; - [stillImageSource processImage]; - - CGImageRef processedImage = [self.terminalFilter newCGImageFromCurrentlyProcessedOutput]; - - [stillImageSource removeTarget:self]; - return processedImage; + return [self.terminalFilter newCGImageByFilteringCGImage:imageToFilter]; +// GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; +// +// [stillImageSource addTarget:self]; +// [stillImageSource processImage]; +// +// CGImageRef processedImage = [self.terminalFilter newCGImageFromCurrentlyProcessedOutput]; +// +// [stillImageSource removeTarget:self]; +// return processedImage; } - (void)prepareForImageCapture; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 1404c4a65..93698c109 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -128,46 +128,49 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; return nil; } - secondFilterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; - thirdFilterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; - - [self initializeAttributes]; - - if (![secondFilterProgram link]) - { - NSString *progLog = [secondFilterProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - - secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - - // REFACTOR: Possibly wrap this in a block on the image processing block - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; - - glEnableVertexAttribArray(secondFilterPositionAttribute); - - if (![thirdFilterProgram link]) - { - NSString *progLog = [secondFilterProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - - thirdFilterPositionAttribute = [thirdFilterProgram attributeIndex:@"position"]; - [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; - - glEnableVertexAttribArray(thirdFilterPositionAttribute); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + secondFilterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + thirdFilterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + + [self initializeAttributes]; + + if (![secondFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + + secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; + + // REFACTOR: Possibly wrap this in a block on the image processing block + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + + glEnableVertexAttribArray(secondFilterPositionAttribute); + + if (![thirdFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + + thirdFilterPositionAttribute = [thirdFilterProgram attributeIndex:@"position"]; + [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; + + glEnableVertexAttribArray(thirdFilterPositionAttribute); + }); }; break; } diff --git a/framework/Source/GPUImageHistogramGenerator.m b/framework/Source/GPUImageHistogramGenerator.m index 6eb1a8199..ff22be913 100755 --- a/framework/Source/GPUImageHistogramGenerator.m +++ b/framework/Source/GPUImageHistogramGenerator.m @@ -57,11 +57,12 @@ - (id)init; - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; { - GLfloat backgroundColor[4]; - backgroundColor[0] = redComponent; - backgroundColor[1] = greenComponent; - backgroundColor[2] = blueComponent; - backgroundColor[3] = alphaComponent; +// GLfloat backgroundColor[4]; +// backgroundColor[0] = redComponent; +// backgroundColor[1] = greenComponent; +// backgroundColor[2] = blueComponent; +// backgroundColor[3] = alphaComponent; + GPUVector4 backgroundColor = {redComponent, greenComponent, blueComponent, alphaComponent}; [self setVec4:backgroundColor forUniform:backgroundColorUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m index 14bbcbd47..e779c11c6 100755 --- a/framework/Source/GPUImageKuwaharaFilter.m +++ b/framework/Source/GPUImageKuwaharaFilter.m @@ -104,7 +104,7 @@ - (void)setRadius:(GLuint)newValue; { _radius = newValue; - [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; + [self setInteger:_radius forUniform:radiusUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m index 329fcd5ef..b7c953077 100644 --- a/framework/Source/GPUImageMonochromeFilter.m +++ b/framework/Source/GPUImageMonochromeFilter.m @@ -67,10 +67,7 @@ - (void)setColor:(GPUVector4)color; - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; { - GLfloat filterColor[3]; - filterColor[0] = redComponent; - filterColor[1] = greenComponent; - filterColor[2] = blueComponent; + GPUVector3 filterColor = {redComponent, greenComponent, blueComponent}; [self setVec3:filterColor forUniform:filterColorUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index 71db97e58..c1c552b55 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -17,6 +17,7 @@ /// @name Initialization and teardown - (id)initWithAsset:(AVAsset *)asset; - (id)initWithURL:(NSURL *)url; +- (void)textureCacheSetup; /// @name Movie processing - (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 8ad82c73d..220bc5d2a 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -29,22 +29,7 @@ - (id)initWithURL:(NSURL *)url; return nil; } - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) - { - [GPUImageOpenGLESContext useImageProcessingContext]; -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); -#endif - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Need to remove the initially created texture - [self deleteOutputTexture]; - } + [self textureCacheSetup]; self.url = url; self.asset = nil; @@ -52,32 +37,41 @@ - (id)initWithURL:(NSURL *)url; return self; } --(id)initWithAsset:(AVAsset *)asset { +- (id)initWithAsset:(AVAsset *)asset; +{ if (!(self = [super init])) { return nil; } + + [self textureCacheSetup]; + + self.url = nil; + self.asset = asset; + + return self; +} +- (void)textureCacheSetup; +{ if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { - [GPUImageOpenGLESContext useImageProcessingContext]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); #endif - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Need to remove the initially created texture - [self deleteOutputTexture]; + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + } + + // Need to remove the initially created texture + [self deleteOutputTexture]; + }); } - self.url = nil; - self.asset = asset; - - return self; } - (void)dealloc @@ -188,7 +182,7 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac if (sampleBufferRef) { __unsafe_unretained GPUImageMovie *weakSelf = self; - runOnMainQueueWithoutDeadlocking(^{ + runSynchronouslyOnVideoProcessingQueue(^{ [weakSelf processMovieFrame:sampleBufferRef]; }); @@ -221,10 +215,12 @@ - (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTra if (audioSampleBufferRef) { - [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; - - CMSampleBufferInvalidate(audioSampleBufferRef); - CFRelease(audioSampleBufferRef); + runSynchronouslyOnVideoProcessingQueue(^{ + [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; + + CMSampleBufferInvalidate(audioSampleBufferRef); + CFRelease(audioSampleBufferRef); + }); } else { diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index a3fd39dc3..20abe148e 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -66,6 +66,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; { return [self initWithMovieURL:newMovieURL size:newSize fileType:AVFileTypeQuickTimeMovie outputSettings:nil]; } + - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; { if (!(self = [super init])) @@ -83,42 +84,44 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr previousFrameTime = kCMTimeNegativeInfinity; inputRotation = kGPUImageNoRotation; - [GPUImageOpenGLESContext useImageProcessingContext]; - - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) - { - colorSwizzlingProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - } - else - { - colorSwizzlingProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; - } - - [colorSwizzlingProgram addAttribute:@"position"]; - [colorSwizzlingProgram addAttribute:@"inputTextureCoordinate"]; - - if (![colorSwizzlingProgram link]) - { - NSString *progLog = [colorSwizzlingProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [colorSwizzlingProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [colorSwizzlingProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - colorSwizzlingProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - - colorSwizzlingPositionAttribute = [colorSwizzlingProgram attributeIndex:@"position"]; - colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; - colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; - - // REFACTOR: Wrap this in a block for the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:colorSwizzlingProgram]; - - glEnableVertexAttribArray(colorSwizzlingPositionAttribute); - glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); - + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + colorSwizzlingProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + } + else + { + colorSwizzlingProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + } + + [colorSwizzlingProgram addAttribute:@"position"]; + [colorSwizzlingProgram addAttribute:@"inputTextureCoordinate"]; + + if (![colorSwizzlingProgram link]) + { + NSString *progLog = [colorSwizzlingProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [colorSwizzlingProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [colorSwizzlingProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + colorSwizzlingProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + + colorSwizzlingPositionAttribute = [colorSwizzlingProgram attributeIndex:@"position"]; + colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; + colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; + + // REFACTOR: Wrap this in a block for the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:colorSwizzlingProgram]; + + glEnableVertexAttribArray(colorSwizzlingPositionAttribute); + glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); + }); + [self initializeMovieWithOutputSettings:outputSettings]; return self; @@ -241,10 +244,17 @@ - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; - (void)finishRecording; { + if (assetWriter.status == AVAssetWriterStatusCompleted) + { + return; + } + isRecording = NO; - [assetWriterVideoInput markAsFinished]; - [assetWriterAudioInput markAsFinished]; - [assetWriter finishWriting]; + runOnMainQueueWithoutDeadlocking(^{ + [assetWriterVideoInput markAsFinished]; + [assetWriterAudioInput markAsFinished]; + [assetWriter finishWriting]; + }); } - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; @@ -284,12 +294,12 @@ - (void)enableSynchronizationCallbacks; if (videoInputReadyCallback != NULL) { [assetWriter startWriting]; - [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:videoInputReadyCallback]; + [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:[GPUImageOpenGLESContext sharedOpenGLESQueue] usingBlock:videoInputReadyCallback]; } if (audioInputReadyCallback != NULL) { - [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:audioInputReadyCallback]; + [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:[GPUImageOpenGLESContext sharedOpenGLESQueue] usingBlock:audioInputReadyCallback]; } } diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 6a69f6d76..22d84de3e 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -7,6 +7,18 @@ @implementation GPUImageOpenGLESContext @synthesize context = _context; @synthesize currentShaderProgram = _currentShaderProgram; +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); + + return self; +} + // Based on Colin Wheeler's example here: http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; { @@ -116,8 +128,6 @@ - (EAGLContext *)context; // Set up a few global settings for the image processing pipeline glDisable(GL_DEPTH_TEST); - - _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); } return _context; diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index b393f54d0..c4db7bf66 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -3,6 +3,7 @@ #import "GPUImageOpenGLESContext.h" void runOnMainQueueWithoutDeadlocking(void (^block)(void)); +void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)); void report_memory(NSString *tag); @class GPUImageMovieWriter; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index ced8cdbad..a4789620b 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -14,6 +14,20 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)) } } +void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) +{ + dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue]; + + if (dispatch_get_current_queue() == videoProcessingQueue) + { + block(); + } + else + { + dispatch_sync(videoProcessingQueue, block); + } +} + void report_memory(NSString *tag) { if (!tag) @@ -118,9 +132,11 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text } cachedMaximumOutputSize = CGSizeZero; - [self setInputTextureForTarget:newTarget atIndex:textureLocation]; - [targets addObject:newTarget]; - [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; + runSynchronouslyOnVideoProcessingQueue(^{ + [self setInputTextureForTarget:newTarget atIndex:textureLocation]; + [targets addObject:newTarget]; + [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; + }); } - (void)removeTarget:(id)targetToRemove; @@ -139,28 +155,33 @@ - (void)removeTarget:(id)targetToRemove; NSInteger indexOfObject = [targets indexOfObject:targetToRemove]; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; - [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; - [targetTextureIndices removeObjectAtIndex:indexOfObject]; - [targets removeObject:targetToRemove]; - [targetToRemove endProcessing]; + runSynchronouslyOnVideoProcessingQueue(^{ + [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; + [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; + + [targetTextureIndices removeObjectAtIndex:indexOfObject]; + [targets removeObject:targetToRemove]; + [targetToRemove endProcessing]; + }); } - (void)removeAllTargets; { cachedMaximumOutputSize = CGSizeZero; - for (id targetToRemove in targets) - { - NSInteger indexOfObject = [targets indexOfObject:targetToRemove]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; - [targetToRemove setInputTexture:0 atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; - } - [targets removeAllObjects]; - [targetTextureIndices removeAllObjects]; + runSynchronouslyOnVideoProcessingQueue(^{ + for (id targetToRemove in targets) + { + NSInteger indexOfObject = [targets indexOfObject:targetToRemove]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; + [targetToRemove setInputTexture:0 atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; + } + [targets removeAllObjects]; + [targetTextureIndices removeAllObjects]; + }); } #pragma mark - @@ -168,28 +189,32 @@ - (void)removeAllTargets; - (void)initializeOutputTexture; { - [GPUImageOpenGLESContext useImageProcessingContext]; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + }); } - (void)deleteOutputTexture; { - [GPUImageOpenGLESContext useImageProcessingContext]; - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } +// runSynchronouslyOnVideoProcessingQueue(^{ +// [GPUImageOpenGLESContext useImageProcessingContext]; + + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } +// }); } - (void)forceProcessingAtSize:(CGSize)frameSize; diff --git a/framework/Source/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m index 5d1d51982..8130efbcf 100644 --- a/framework/Source/GPUImagePerlinNoiseFilter.m +++ b/framework/Source/GPUImagePerlinNoiseFilter.m @@ -134,14 +134,14 @@ - (void)setColorStart:(GPUVector4)colorStart { _colorStart = colorStart; - [self setVec4:(GLfloat *)&_colorStart forUniform:colorStartUniform program:filterProgram]; + [self setVec4:_colorStart forUniform:colorStartUniform program:filterProgram]; } - (void)setColorFinish:(GPUVector4)colorFinish { _colorFinish = colorFinish; - [self setVec4:(GLfloat *)&_colorFinish forUniform:colorFinishUniform program:filterProgram]; + [self setVec4:_colorFinish forUniform:colorFinishUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index b1544d4ac..3694cfe70 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -36,9 +36,8 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot return nil; } self.shouldSmoothlyScaleOutput = smoothlyScaleOutput; - - [GPUImageOpenGLESContext useImageProcessingContext]; - + + // TODO: Dispatch this whole thing asynchronously to move image loading off main thread CGFloat widthOfImage = CGImageGetWidth(newImageSource); CGFloat heightOfImage = CGImageGetHeight(newImageSource); pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); @@ -93,17 +92,21 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot // elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; // NSLog(@"Core Graphics drawing time: %f", elapsedTime); - glBindTexture(GL_TEXTURE_2D, outputTexture); - if (self.shouldSmoothlyScaleOutput) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); - - if (self.shouldSmoothlyScaleOutput) - { - glGenerateMipmap(GL_TEXTURE_2D); - } + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + glBindTexture(GL_TEXTURE_2D, outputTexture); + if (self.shouldSmoothlyScaleOutput) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); + + if (self.shouldSmoothlyScaleOutput) + { + glGenerateMipmap(GL_TEXTURE_2D); + } + }); if (shouldRedrawUsingCoreGraphics) { @@ -123,15 +126,17 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot - (void)processImage; { hasProcessedImage = YES; - - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; - } + + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; + } + }); } - (CGSize)outputImageSize; diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 6907e6970..b3a16e868 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -341,36 +341,38 @@ - (GLubyte *)rawBytesForImage; _rawBytesForImage = (GLubyte *) calloc(imageSize.width * imageSize.height * 4, sizeof(GLubyte)); hasReadFromTheCurrentFrame = NO; } - + if (hasReadFromTheCurrentFrame) { return _rawBytesForImage; } else { - // Note: the fast texture caches speed up 640x480 frame reads from 9.6 ms to 3.1 ms on iPhone 4S - - [GPUImageOpenGLESContext useImageProcessingContext]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) - { - CVPixelBufferUnlockBaseAddress(renderTarget, 0); -// CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); - } - - [self renderAtInternalSize]; - - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) - { - glFinish(); - CVPixelBufferLockBaseAddress(renderTarget, 0); - _rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); - } - else - { - glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); - // GL_EXT_read_format_bgra -// glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); - } + runSynchronouslyOnVideoProcessingQueue(^{ + // Note: the fast texture caches speed up 640x480 frame reads from 9.6 ms to 3.1 ms on iPhone 4S + + [GPUImageOpenGLESContext useImageProcessingContext]; + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + CVPixelBufferUnlockBaseAddress(renderTarget, 0); + // CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); + } + + [self renderAtInternalSize]; + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + glFinish(); + CVPixelBufferLockBaseAddress(renderTarget, 0); + _rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); + } + else + { + glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); + // GL_EXT_read_format_bgra + // glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); + } + }); return _rawBytesForImage; } diff --git a/framework/Source/GPUImageSharpenFilter.m b/framework/Source/GPUImageSharpenFilter.m index 83399675b..3e41e0cb0 100755 --- a/framework/Source/GPUImageSharpenFilter.m +++ b/framework/Source/GPUImageSharpenFilter.m @@ -88,19 +88,20 @@ - (id)init; - (void)setupFilterForSize:(CGSize)filterFrameSize; { - // REFACTOR: Wrap this in block on image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.height); - glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.width); - } - else - { - glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.width); - glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.height); - } + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.height); + glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.width); + } + else + { + glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.width); + glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.height); + } + }); } #pragma mark - diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 39aa3987e..c3bc35acf 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -83,10 +83,11 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - // REFACTOR: Wrap this in block on image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + }); } } diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index 7339d6fdd..e970403df 100755 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -1,6 +1,7 @@ #import "GPUImageVideoCamera.h" -void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer, GLubyte **imageData); +void stillImageDataReleaseCallback(void *releaseRefCon, const void *baseAddress); +void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer); @interface GPUImageStillCamera : GPUImageVideoCamera diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 43ec6d970..63caff2db 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -2,19 +2,24 @@ #import "GPUImageStillCamera.h" -void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer, GLubyte **imageData) +void stillImageDataReleaseCallback(void *releaseRefCon, const void *baseAddress) +{ + free((void *)baseAddress); +} + +void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer) { CGSize originalSize = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); CVPixelBufferLockBaseAddress(cameraFrame, 0); GLubyte *sourceImageBytes = CVPixelBufferGetBaseAddress(cameraFrame); CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, sourceImageBytes, CVPixelBufferGetBytesPerRow(cameraFrame) * originalSize.height, NULL); - CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); + CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); CGImageRef cgImageFromBytes = CGImageCreate((int)originalSize.width, (int)originalSize.height, 8, 32, CVPixelBufferGetBytesPerRow(cameraFrame), genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); - *imageData = (GLubyte *) calloc(1, (int)finalSize.width * (int)finalSize.height * 4); + GLubyte *imageData = (GLubyte *) calloc(1, (int)finalSize.width * (int)finalSize.height * 4); - CGContextRef imageContext = CGBitmapContextCreate(*imageData, (int)finalSize.width, (int)finalSize.height, 8, (int)finalSize.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)finalSize.width, (int)finalSize.height, 8, (int)finalSize.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, finalSize.width, finalSize.height), cgImageFromBytes); CGImageRelease(cgImageFromBytes); CGContextRelease(imageContext); @@ -22,7 +27,7 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina CGDataProviderRelease(dataProvider); CVPixelBufferRef pixel_buffer = NULL; - CVPixelBufferCreateWithBytes(kCFAllocatorDefault, finalSize.width, finalSize.height, kCVPixelFormatType_32BGRA, *imageData, finalSize.width * 4, NULL, NULL, NULL, &pixel_buffer); + CVPixelBufferCreateWithBytes(kCFAllocatorDefault, finalSize.width, finalSize.height, kCVPixelFormatType_32BGRA, imageData, finalSize.width * 4, stillImageDataReleaseCallback, NULL, NULL, &pixel_buffer); CMVideoFormatDescriptionRef videoInfo = NULL; CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixel_buffer, &videoInfo); @@ -95,6 +100,8 @@ - (void)removeInputsAndOutputs; - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { // For now, resize photos to fix within the max texture size of the GPU @@ -105,20 +112,22 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) { CMSampleBufferRef sampleBuffer; - GLubyte *imageData; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer, &imageData); - - [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + + dispatch_semaphore_signal(frameRenderingSemaphore); + [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); CFRelease(sampleBuffer); - - free(imageData); } else { + dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - } + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + } UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dispatch_semaphore_signal(frameRenderingSemaphore); block(filteredPhoto, error); }]; @@ -129,6 +138,8 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; { // report_memory(@"Before still image capture"); + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { // report_memory(@"Before filter processing"); @@ -140,13 +151,13 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) { CMSampleBufferRef sampleBuffer; - GLubyte *imageData; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer, &imageData); + + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); CFRelease(sampleBuffer); - - free(imageData); } else { @@ -154,8 +165,10 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) { + dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - } + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + } } // report_memory(@"After filter processing"); @@ -163,6 +176,7 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f __strong NSData *dataForJPEGFile = nil; @autoreleasepool { UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dispatch_semaphore_signal(frameRenderingSemaphore); // report_memory(@"After UIImage generation"); @@ -180,6 +194,8 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; { + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { // For now, resize photos to fix within the max texture size of the GPU @@ -190,22 +206,24 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) { CMSampleBufferRef sampleBuffer; - GLubyte *imageData; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer, &imageData); - + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + + dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); CFRelease(sampleBuffer); - - free(imageData); } else { + dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - } + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + } NSData *dataForPNGFile = nil; @autoreleasepool { UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dispatch_semaphore_signal(frameRenderingSemaphore); dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); } diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index 939b52b09..f73bc8989 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -12,7 +12,11 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; return nil; } - [self deleteOutputTexture]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + [self deleteOutputTexture]; + }); outputTexture = newInputTexture; textureSize = newTextureSize; @@ -25,14 +29,17 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; - (void)processTextureWithFrameTime:(CMTime)frameTime; { - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:textureSize atIndex:targetTextureIndex]; - [currentTarget newFrameReadyAtTime:frameTime atIndex:targetTextureIndex]; - } + runSynchronouslyOnVideoProcessingQueue(^{ +// dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:textureSize atIndex:targetTextureIndex]; + [currentTarget newFrameReadyAtTime:frameTime atIndex:targetTextureIndex]; + } + }); } @end diff --git a/framework/Source/GPUImageTransformFilter.h b/framework/Source/GPUImageTransformFilter.h index ca93365fc..006289fe3 100755 --- a/framework/Source/GPUImageTransformFilter.h +++ b/framework/Source/GPUImageTransformFilter.h @@ -3,7 +3,7 @@ @interface GPUImageTransformFilter : GPUImageFilter { GLint transformMatrixUniform, orthographicMatrixUniform; - GLfloat orthographicMatrix[16]; + GPUMatrix4x4 orthographicMatrix; } // You can either set the transform to apply to be a 2-D affine transform or a 3-D transform. The default is the identity transform (the output image is identical to the input). diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index 02f0c922b..148239414 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -74,7 +74,35 @@ - (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)righ matrix[15] = 1.0f; } -- (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matrix; +//- (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matrix; +//{ +// // struct CATransform3D +// // { +// // CGFloat m11, m12, m13, m14; +// // CGFloat m21, m22, m23, m24; +// // CGFloat m31, m32, m33, m34; +// // CGFloat m41, m42, m43, m44; +// // }; +// +// matrix[0] = (GLfloat)transform3D->m11; +// matrix[1] = (GLfloat)transform3D->m12; +// matrix[2] = (GLfloat)transform3D->m13; +// matrix[3] = (GLfloat)transform3D->m14; +// matrix[4] = (GLfloat)transform3D->m21; +// matrix[5] = (GLfloat)transform3D->m22; +// matrix[6] = (GLfloat)transform3D->m23; +// matrix[7] = (GLfloat)transform3D->m24; +// matrix[8] = (GLfloat)transform3D->m31; +// matrix[9] = (GLfloat)transform3D->m32; +// matrix[10] = (GLfloat)transform3D->m33; +// matrix[11] = (GLfloat)transform3D->m34; +// matrix[12] = (GLfloat)transform3D->m41; +// matrix[13] = (GLfloat)transform3D->m42; +// matrix[14] = (GLfloat)transform3D->m43; +// matrix[15] = (GLfloat)transform3D->m44; +//} + +- (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GPUMatrix4x4 *)matrix; { // struct CATransform3D // { @@ -83,23 +111,25 @@ - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GLfloat *)matr // CGFloat m31, m32, m33, m34; // CGFloat m41, m42, m43, m44; // }; + + GLfloat *mappedMatrix = (GLfloat *)matrix; - matrix[0] = (GLfloat)transform3D->m11; - matrix[1] = (GLfloat)transform3D->m12; - matrix[2] = (GLfloat)transform3D->m13; - matrix[3] = (GLfloat)transform3D->m14; - matrix[4] = (GLfloat)transform3D->m21; - matrix[5] = (GLfloat)transform3D->m22; - matrix[6] = (GLfloat)transform3D->m23; - matrix[7] = (GLfloat)transform3D->m24; - matrix[8] = (GLfloat)transform3D->m31; - matrix[9] = (GLfloat)transform3D->m32; - matrix[10] = (GLfloat)transform3D->m33; - matrix[11] = (GLfloat)transform3D->m34; - matrix[12] = (GLfloat)transform3D->m41; - matrix[13] = (GLfloat)transform3D->m42; - matrix[14] = (GLfloat)transform3D->m43; - matrix[15] = (GLfloat)transform3D->m44; + mappedMatrix[0] = (GLfloat)transform3D->m11; + mappedMatrix[1] = (GLfloat)transform3D->m12; + mappedMatrix[2] = (GLfloat)transform3D->m13; + mappedMatrix[3] = (GLfloat)transform3D->m14; + mappedMatrix[4] = (GLfloat)transform3D->m21; + mappedMatrix[5] = (GLfloat)transform3D->m22; + mappedMatrix[6] = (GLfloat)transform3D->m23; + mappedMatrix[7] = (GLfloat)transform3D->m24; + mappedMatrix[8] = (GLfloat)transform3D->m31; + mappedMatrix[9] = (GLfloat)transform3D->m32; + mappedMatrix[10] = (GLfloat)transform3D->m33; + mappedMatrix[11] = (GLfloat)transform3D->m34; + mappedMatrix[12] = (GLfloat)transform3D->m41; + mappedMatrix[13] = (GLfloat)transform3D->m42; + mappedMatrix[14] = (GLfloat)transform3D->m43; + mappedMatrix[15] = (GLfloat)transform3D->m44; } #pragma mark - @@ -139,9 +169,9 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { if (!_ignoreAspectRatio) { - [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * filterFrameSize.height / filterFrameSize.width) top:(1.0 * filterFrameSize.height / filterFrameSize.width) near:-1.0 far:1.0]; + [self loadOrthoMatrix:(GLfloat *)&orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * filterFrameSize.height / filterFrameSize.width) top:(1.0 * filterFrameSize.height / filterFrameSize.width) near:-1.0 far:1.0]; // [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * (GLfloat)backingHeight / (GLfloat)backingWidth) top:(1.0 * (GLfloat)backingHeight / (GLfloat)backingWidth) near:-2.0 far:2.0]; - + [self setMatrix4f:orthographicMatrix forUniform:orthographicMatrixUniform program:filterProgram]; } } @@ -163,9 +193,9 @@ - (void)setTransform3D:(CATransform3D)newValue; { _transform3D = newValue; - GLfloat temporaryMatrix[16]; + GPUMatrix4x4 temporaryMatrix; - [self convert3DTransform:&_transform3D toMatrix:temporaryMatrix]; + [self convert3DTransform:&_transform3D toMatrix:&temporaryMatrix]; [self setMatrix4f:temporaryMatrix forUniform:transformMatrixUniform program:filterProgram]; } @@ -175,8 +205,7 @@ - (void)setIgnoreAspectRatio:(BOOL)newValue; if (_ignoreAspectRatio) { - [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:-1.0 top:1.0 near:-1.0 far:1.0]; - + [self loadOrthoMatrix:(GLfloat *)&orthographicMatrix left:-1.0 right:1.0 bottom:-1.0 top:1.0 near:-1.0 far:1.0]; [self setMatrix4f:orthographicMatrix forUniform:orthographicMatrixUniform program:filterProgram]; } else diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 83bc74eca..fca3a5369 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -41,9 +41,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad } inputRotation2 = kGPUImageNoRotation; - filterSecondTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate2"]; - filterInputTextureUniform2 = [filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - + hasSetFirstTexture = NO; hasReceivedFirstFrame = NO; @@ -53,9 +51,15 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad firstFrameTime = kCMTimeInvalid; secondFrameTime = kCMTimeInvalid; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + filterSecondTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate2"]; + + filterInputTextureUniform2 = [filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + glEnableVertexAttribArray(filterSecondTextureCoordinateAttribute); + }); - glEnableVertexAttribArray(filterSecondTextureCoordinateAttribute); - return self; } diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 687e418f3..8ee3bc633 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -12,32 +12,34 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade return nil; } - secondFilterProgram = [[GLProgram alloc] initWithVertexShaderString:secondStageVertexShaderString fragmentShaderString:secondStageFragmentShaderString]; - - [self initializeAttributes]; - - if (![secondFilterProgram link]) - { - NSString *progLog = [secondFilterProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - - secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - secondFilterTextureCoordinateAttribute = [secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; - secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; - - glEnableVertexAttribArray(secondFilterPositionAttribute); - glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + secondFilterProgram = [[GLProgram alloc] initWithVertexShaderString:secondStageVertexShaderString fragmentShaderString:secondStageFragmentShaderString]; + + [self initializeAttributes]; + + if (![secondFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + + secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; + secondFilterTextureCoordinateAttribute = [secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; + secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + + glEnableVertexAttribArray(secondFilterPositionAttribute); + glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); + }); return self; } @@ -73,14 +75,18 @@ - (GLuint)textureForOutput; - (void)initializeOutputTexture; { [super initializeOutputTexture]; - - glGenTextures(1, &secondFilterOutputTexture); - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + glGenTextures(1, &secondFilterOutputTexture); + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + }); } - (void)deleteOutputTexture; @@ -99,89 +105,93 @@ - (void)deleteOutputTexture; - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - } - - glGenFramebuffers(1, &secondFilterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); -#endif - - if (err) + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) + else { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); + [super createFilterFBOofSize:currentFBOSize]; } - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - GL_RGBA, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, - 0, - &renderTexture); - if (err) + glGenFramebuffers(1, &secondFilterFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + #if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + #else + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + #endif + + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + + [self notifyTargetsAboutNewOutputTexture]; + } + else + { + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + + [self notifyTargetsAboutNewOutputTexture]; } - CFRelease(attrs); - CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - [self notifyTargetsAboutNewOutputTexture]; - } - else - { - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - [self notifyTargetsAboutNewOutputTexture]; - } - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - - glBindTexture(GL_TEXTURE_2D, 0); + glBindTexture(GL_TEXTURE_2D, 0); + }); } - (void)destroyFilterFBO; @@ -198,7 +208,7 @@ - (void)destroyFilterFBO; - (void)setSecondFilterFBO; { glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); -// + // CGSize currentFBOSize = [self sizeOfFBO]; // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } @@ -248,8 +258,12 @@ - (void)prepareForImageCapture; { if (secondFilterOutputTexture) { - glDeleteTextures(1, &secondFilterOutputTexture); - secondFilterOutputTexture = 0; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + glDeleteTextures(1, &secondFilterOutputTexture); + secondFilterOutputTexture = 0; + }); } } } diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index 1d87ae9b1..74c1c8cc2 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -23,25 +23,25 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade - (void)setupFilterForSize:(CGSize)filterFrameSize; { - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - - // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); - glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); - } - else - { - glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); - glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); - } - - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; - glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); - glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.height); + glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); + } + else + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); + } + + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); + glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); + }); } @end diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 480f89ae2..12f6681c9 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -29,6 +29,7 @@ BOOL capturePaused; GPUImageRotationMode outputRotation; + dispatch_semaphore_t frameRenderingSemaphore; id _delegate; } @@ -37,7 +38,7 @@ @property(readonly, retain, nonatomic) AVCaptureSession *captureSession; /// This enables the capture session preset to be changed on the fly -@property (readwrite, nonatomic) NSString *captureSessionPreset; +@property (readwrite, nonatomic, copy) NSString *captureSessionPreset; /// This sets the frame rate of the camera (iOS 5 and above only) /** diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 791b361df..970ef75c2 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -50,28 +50,31 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD cameraProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.cameraProcessingQueue", NULL); audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); - + frameRenderingSemaphore = dispatch_semaphore_create(1); + _frameRate = 0; // This will not set frame rate unless this value gets set to 1 or above _runBenchmark = NO; capturePaused = NO; outputRotation = kGPUImageNoRotation; - - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) - { - [GPUImageOpenGLESContext useImageProcessingContext]; + + runSynchronouslyOnVideoProcessingQueue(^{ + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + { + [GPUImageOpenGLESContext useImageProcessingContext]; #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); #endif - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + } + + // Need to remove the initially created texture + [self deleteOutputTexture]; } - - // Need to remove the initially created texture - [self deleteOutputTexture]; - } + }); // Grab the back-facing or front-facing camera _inputCamera = nil; @@ -99,13 +102,12 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // Add the video frame output videoOutput = [[AVCaptureVideoDataOutput alloc] init]; - [videoOutput setAlwaysDiscardsLateVideoFrames:YES]; + [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - // dispatch_queue_t videoQueue = dispatch_queue_create("com.sunsetlakesoftware.colortracking.videoqueue", NULL); - // [videoOutput setSampleBufferDelegate:self queue:videoQueue]; [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; +// [videoOutput setSampleBufferDelegate:self queue:[GPUImageOpenGLESContext sharedOpenGLESQueue]]; if ([_captureSession canAddOutput:videoOutput]) { [_captureSession addOutput:videoOutput]; @@ -128,8 +130,6 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [_captureSession commitConfiguration]; - // inputTextureSize - return self; } @@ -334,20 +334,22 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; int bufferHeight = CVPixelBufferGetHeight(cameraFrame); CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); - + + [GPUImageOpenGLESContext useImageProcessingContext]; + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { CVPixelBufferLockBaseAddress(cameraFrame, 0); - [GPUImageOpenGLESContext useImageProcessingContext]; CVOpenGLESTextureRef texture = NULL; CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); - + if (!texture || err) { NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + NSAssert(NO, @"Camera failure"); return; } - + outputTexture = CVOpenGLESTextureGetName(texture); // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); @@ -460,79 +462,90 @@ - (CGFloat)averageFrameDurationDuringCapture; - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { - //This may help keep memory footprint low - @autoreleasepool { + __unsafe_unretained id weakSelf = self; + if (captureOutput == audioOutput) + { +// if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) +// { +// return; +// } + + CFRetain(sampleBuffer); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + [weakSelf processAudioSampleBuffer:sampleBuffer]; + CFRelease(sampleBuffer); +// dispatch_semaphore_signal(frameRenderingSemaphore); + }); + } + else + { + if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) + { + return; + } - //these need to be on the main thread for proper timing - __unsafe_unretained id weakSelf = self; - if (captureOutput == audioOutput) - { - runOnMainQueueWithoutDeadlocking(^{ - [weakSelf processAudioSampleBuffer:sampleBuffer]; - }); - } - else - { + CFRetain(sampleBuffer); + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + //Feature Detection Hook. + if (self.delegate) + { + [self.delegate willOutputSampleBuffer:sampleBuffer]; + } - runOnMainQueueWithoutDeadlocking(^{ - //Feature Detection Hook. - if (self.delegate) { - [self.delegate willOutputSampleBuffer:sampleBuffer]; - } - - [weakSelf processVideoSampleBuffer:sampleBuffer]; - - - }); - } + [weakSelf processVideoSampleBuffer:sampleBuffer]; + + CFRelease(sampleBuffer); + dispatch_semaphore_signal(frameRenderingSemaphore); + }); } - } #pragma mark - #pragma mark Accessors - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; -{ - [_captureSession beginConfiguration]; - - if (newValue == nil) - { - if (audioOutput) - { - [_captureSession removeInput:audioInput]; - [_captureSession removeOutput:audioOutput]; - audioInput = nil; - audioOutput = nil; - _microphone = nil; - dispatch_release(audioProcessingQueue); - audioProcessingQueue = NULL; - } - } - else - { - _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; - audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; - if ([_captureSession canAddInput:audioInput]) - { - [_captureSession addInput:audioInput]; - } - audioOutput = [[AVCaptureAudioDataOutput alloc] init]; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [_captureSession beginConfiguration]; - if ([_captureSession canAddOutput:audioOutput]) + if (newValue == nil) { - [_captureSession addOutput:audioOutput]; + if (audioOutput) + { + [_captureSession removeInput:audioInput]; + [_captureSession removeOutput:audioOutput]; + audioInput = nil; + audioOutput = nil; + _microphone = nil; + dispatch_release(audioProcessingQueue); + audioProcessingQueue = NULL; + } } else { - NSLog(@"Couldn't add audio output"); + _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; + audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; + if ([_captureSession canAddInput:audioInput]) + { + [_captureSession addInput:audioInput]; + } + audioOutput = [[AVCaptureAudioDataOutput alloc] init]; + + if ([_captureSession canAddOutput:audioOutput]) + { + [_captureSession addOutput:audioOutput]; + } + else + { + NSLog(@"Couldn't add audio output"); + } + [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; } - [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; - } - - [_captureSession commitConfiguration]; - - [super setAudioEncodingTarget:newValue]; + + [_captureSession commitConfiguration]; + + [super setAudioEncodingTarget:newValue]; + }); } - (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index e890462c5..530a0c493 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -80,44 +80,48 @@ - (void)commonInit; self.contentScaleFactor = [[UIScreen mainScreen] scale]; } - self.enabled = YES; - inputRotation = kGPUImageNoRotation; - - [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; - self.fillMode = kGPUImageFillModePreserveAspectRatio; - - CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; + self.opaque = YES; + self.hidden = NO; + CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; - eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; + eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; - [GPUImageOpenGLESContext useImageProcessingContext]; - displayProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - - [displayProgram addAttribute:@"position"]; - [displayProgram addAttribute:@"inputTextureCoordinate"]; - - if (![displayProgram link]) - { - NSString *progLog = [displayProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [displayProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [displayProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - displayProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } + self.enabled = YES; - displayPositionAttribute = [displayProgram attributeIndex:@"position"]; - displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; - displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + displayProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - // REFACTOR: Wrap this in a block on the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; - glEnableVertexAttribArray(displayPositionAttribute); - glEnableVertexAttribArray(displayTextureCoordinateAttribute); + [displayProgram addAttribute:@"position"]; + [displayProgram addAttribute:@"inputTextureCoordinate"]; + + if (![displayProgram link]) + { + NSString *progLog = [displayProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [displayProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [displayProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + displayProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + + displayPositionAttribute = [displayProgram attributeIndex:@"position"]; + displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; + displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader + [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; + glEnableVertexAttribArray(displayPositionAttribute); + glEnableVertexAttribArray(displayTextureCoordinateAttribute); + + [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; + _fillMode = kGPUImageFillModePreserveAspectRatio; + [self createDisplayFramebuffer]; + }); + [self addObserver:self forKeyPath:@"frame" options:0 context:NULL]; } @@ -125,8 +129,10 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N { if (object == self && [keyPath isEqualToString:@"frame"] && (!CGSizeEqualToSize(self.bounds.size, CGSizeZero))) { - [self destroyDisplayFramebuffer]; - [self createDisplayFramebuffer]; + runSynchronouslyOnVideoProcessingQueue(^{ + [self destroyDisplayFramebuffer]; + [self createDisplayFramebuffer]; + }); } } @@ -134,14 +140,16 @@ - (void)dealloc { [self removeObserver:self forKeyPath:@"frame"]; - [self destroyDisplayFramebuffer]; + runSynchronouslyOnVideoProcessingQueue(^{ + [self destroyDisplayFramebuffer]; + }); } #pragma mark - #pragma mark Managing the display FBOs - (void)createDisplayFramebuffer; -{ +{ [GPUImageOpenGLESContext useImageProcessingContext]; glGenFramebuffers(1, &displayFramebuffer); @@ -214,43 +222,45 @@ - (void)presentFramebuffer; - (void)recalculateViewGeometry; { - CGFloat heightScaling, widthScaling; - - CGSize currentViewSize = self.bounds.size; - -// CGFloat imageAspectRatio = inputImageSize.width / inputImageSize.height; -// CGFloat viewAspectRatio = currentViewSize.width / currentViewSize.height; - - CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(inputImageSize, self.bounds); - - switch(_fillMode) - { - case kGPUImageFillModeStretch: - { - widthScaling = 1.0; - heightScaling = 1.0; - }; break; - case kGPUImageFillModePreserveAspectRatio: - { - widthScaling = insetRect.size.width / currentViewSize.width; - heightScaling = insetRect.size.height / currentViewSize.height; - }; break; - case kGPUImageFillModePreserveAspectRatioAndFill: + runSynchronouslyOnVideoProcessingQueue(^{ + CGFloat heightScaling, widthScaling; + + CGSize currentViewSize = self.bounds.size; + + // CGFloat imageAspectRatio = inputImageSize.width / inputImageSize.height; + // CGFloat viewAspectRatio = currentViewSize.width / currentViewSize.height; + + CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(inputImageSize, self.bounds); + + switch(_fillMode) { -// CGFloat widthHolder = insetRect.size.width / currentViewSize.width; - widthScaling = currentViewSize.height / insetRect.size.height; - heightScaling = currentViewSize.width / insetRect.size.width; - }; break; - } - - imageVertices[0] = -widthScaling; - imageVertices[1] = -heightScaling; - imageVertices[2] = widthScaling; - imageVertices[3] = -heightScaling; - imageVertices[4] = -widthScaling; - imageVertices[5] = heightScaling; - imageVertices[6] = widthScaling; - imageVertices[7] = heightScaling; + case kGPUImageFillModeStretch: + { + widthScaling = 1.0; + heightScaling = 1.0; + }; break; + case kGPUImageFillModePreserveAspectRatio: + { + widthScaling = insetRect.size.width / currentViewSize.width; + heightScaling = insetRect.size.height / currentViewSize.height; + }; break; + case kGPUImageFillModePreserveAspectRatioAndFill: + { + // CGFloat widthHolder = insetRect.size.width / currentViewSize.width; + widthScaling = currentViewSize.height / insetRect.size.height; + heightScaling = currentViewSize.width / insetRect.size.width; + }; break; + } + + imageVertices[0] = -widthScaling; + imageVertices[1] = -heightScaling; + imageVertices[2] = widthScaling; + imageVertices[3] = -heightScaling; + imageVertices[4] = -widthScaling; + imageVertices[5] = heightScaling; + imageVertices[6] = widthScaling; + imageVertices[7] = heightScaling; + }); // static const GLfloat imageVertices[] = { // -1.0f, -1.0f, @@ -343,22 +353,24 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; - [self setDisplayFramebuffer]; - - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); - glUniform1i(displayInputTextureUniform, 4); - - glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); - glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - [self presentFramebuffer]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; + [self setDisplayFramebuffer]; + + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); + glUniform1i(displayInputTextureUniform, 4); + + glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); + glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + [self presentFramebuffer]; + }); } - (NSInteger)nextAvailableTextureIndex; @@ -378,19 +390,21 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { - CGSize rotatedSize = newSize; - - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - rotatedSize.width = newSize.height; - rotatedSize.height = newSize.width; - } - - if (!CGSizeEqualToSize(inputImageSize, rotatedSize)) - { - inputImageSize = rotatedSize; - [self recalculateViewGeometry]; - } + runSynchronouslyOnVideoProcessingQueue(^{ + CGSize rotatedSize = newSize; + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + rotatedSize.width = newSize.height; + rotatedSize.height = newSize.width; + } + + if (!CGSizeEqualToSize(inputImageSize, rotatedSize)) + { + inputImageSize = rotatedSize; + [self recalculateViewGeometry]; + } + }); } - (CGSize)maximumOutputSize; From 670d45315f59de31b7a57003ae86fb07c7b26225 Mon Sep 17 00:00:00 2001 From: Dmitri Cherniak Date: Tue, 14 Aug 2012 22:01:05 -0400 Subject: [PATCH 191/695] synthesize contextQueue to allow project compilation --- framework/Source/GPUImageOpenGLESContext.m | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 22d84de3e..22a5946ca 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -6,6 +6,7 @@ @implementation GPUImageOpenGLESContext @synthesize context = _context; @synthesize currentShaderProgram = _currentShaderProgram; +@synthesize contextQueue = _contextQueue; - (id)init; { From cf29a44c83f56f14d102035c6d50e27e21e31a8b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 15 Aug 2012 11:39:44 -0500 Subject: [PATCH 192/695] Fixed a couple of the warnings about not having a root view controller in the sample applications. Made setting the video camera rotation a little more thread safe. --- .../Classes/CubeExampleAppDelegate.m | 3 +- .../MultiViewAppDelegate.m | 1 + .../SimpleVideoFilterAppDelegate.m | 3 + .../SimpleVideoFilterViewController.m | 1 + framework/Source/GPUImageVideoCamera.m | 56 ++++++++++--------- 5 files changed, 36 insertions(+), 28 deletions(-) diff --git a/examples/CubeExample/Classes/CubeExampleAppDelegate.m b/examples/CubeExample/Classes/CubeExampleAppDelegate.m index 30d3a3b02..7606f8975 100755 --- a/examples/CubeExample/Classes/CubeExampleAppDelegate.m +++ b/examples/CubeExample/Classes/CubeExampleAppDelegate.m @@ -13,7 +13,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( rootViewController = [[DisplayViewController alloc] initWithNibName:nil bundle:nil]; [self.window addSubview:rootViewController.view]; - + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; return YES; diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m index a180fd812..ee3b8c0fe 100755 --- a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m +++ b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m @@ -19,6 +19,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( rootViewController = [[MultiViewViewController alloc] initWithNibName:nil bundle:nil]; [self.window addSubview:rootViewController.view]; + self.window.rootViewController = rootViewController; [self.window makeKeyAndVisible]; return YES; } diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m index db4f2fc08..d4e6252d9 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m @@ -22,6 +22,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [self.window addSubview:rootViewController.view]; [self.window makeKeyAndVisible]; + [self.window layoutSubviews]; + self.window.rootViewController = rootViewController; + return YES; } diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index daae31ba5..3e405b9b7 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -52,6 +52,7 @@ - (void)viewDidLoad unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; +// movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)]; // movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720.0, 1280.0)]; // movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1080.0, 1920.0)]; [filter addTarget:movieWriter]; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 970ef75c2..b1e9c6008 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -550,37 +550,39 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; - (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; { - _outputImageOrientation = newValue; - -// From the iOS 5.0 release notes: -// In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight. - - if ([self cameraPosition] == AVCaptureDevicePositionBack) - { - switch(_outputImageOrientation) + runSynchronouslyOnVideoProcessingQueue(^{ + _outputImageOrientation = newValue; + + // From the iOS 5.0 release notes: + // In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight. + + if ([self cameraPosition] == AVCaptureDevicePositionBack) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; + } } - } - else - { - switch(_outputImageOrientation) + else { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; + } } - } - - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - } + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + } + }); } @end From 9addf9d59e58c7164dd325405098de5db35d3dcd Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 18 Aug 2012 19:34:07 -0500 Subject: [PATCH 193/695] Added a Lanczos resampling filter, and a new section in the SimpleImageFilter example that shows how resampling works. --- .../SimpleImageViewController.h | 1 + .../SimpleImageViewController.m | 53 +++++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 3 +- .../Source/GPUImageLanczosResamplingFilter.h | 7 + .../Source/GPUImageLanczosResamplingFilter.m | 130 ++++++++++++++++++ 6 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageLanczosResamplingFilter.h create mode 100644 framework/Source/GPUImageLanczosResamplingFilter.m diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h index c44325852..1970add09 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h @@ -10,5 +10,6 @@ // Image filtering - (void)setupDisplayFiltering; - (void)setupImageFilteringToDisk; +- (void)setupImageResampling; @end diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index 0fcfdd23d..c3fbc5c00 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -17,6 +17,7 @@ - (void)loadView self.view = primaryView; [self setupDisplayFiltering]; + [self setupImageResampling]; [self setupImageFilteringToDisk]; } @@ -104,4 +105,56 @@ - (void)setupImageFilteringToDisk; } } +- (void)setupImageResampling; +{ + UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; + GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; + + // Linear downsampling + GPUImageBrightnessFilter *passthroughFilter = [[GPUImageBrightnessFilter alloc] init]; + [passthroughFilter forceProcessingAtSize:CGSizeMake(640.0, 480.0)]; + [stillImageSource addTarget:passthroughFilter]; + [stillImageSource processImage]; + UIImage *nearestNeighborImage = [passthroughFilter imageFromCurrentlyProcessedOutput]; + + // Lanczos downsampling + [stillImageSource removeAllTargets]; + GPUImageLanczosResamplingFilter *lanczosResamplingFilter = [[GPUImageLanczosResamplingFilter alloc] init]; + [lanczosResamplingFilter forceProcessingAtSize:CGSizeMake(640.0, 480.0)]; + [stillImageSource addTarget:lanczosResamplingFilter]; + [stillImageSource processImage]; + UIImage *lanczosImage = [lanczosResamplingFilter imageFromCurrentlyProcessedOutput]; + + // Trilinear downsampling + GPUImagePicture *stillImageSource2 = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; + GPUImageBrightnessFilter *passthroughFilter2 = [[GPUImageBrightnessFilter alloc] init]; + [passthroughFilter2 forceProcessingAtSize:CGSizeMake(640.0, 480.0)]; + [stillImageSource2 addTarget:passthroughFilter2]; + [stillImageSource2 processImage]; + UIImage *trilinearImage = [passthroughFilter2 imageFromCurrentlyProcessedOutput]; + + NSData *dataForPNGFile1 = UIImagePNGRepresentation(nearestNeighborImage); + NSData *dataForPNGFile2 = UIImagePNGRepresentation(lanczosImage); + NSData *dataForPNGFile3 = UIImagePNGRepresentation(trilinearImage); + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSError *error = nil; + if (![dataForPNGFile1 writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-Resized-NN.png"] options:NSAtomicWrite error:&error]) + { + return; + } + + if (![dataForPNGFile2 writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-Resized-Lanczos.png"] options:NSAtomicWrite error:&error]) + { + return; + } + + if (![dataForPNGFile3 writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-Resized-Trilinear.png"] options:NSAtomicWrite error:&error]) + { + return; + } +} + @end diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 6c7650eab..b1bcd752c 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -280,6 +280,8 @@ BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; }; BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */; }; + BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; }; + BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; }; @@ -559,6 +561,8 @@ BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePolkaDotFilter.m; path = Source/GPUImagePolkaDotFilter.m; sourceTree = SOURCE_ROOT; }; BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLocalBinaryPatternFilter.h; path = Source/GPUImageLocalBinaryPatternFilter.h; sourceTree = SOURCE_ROOT; }; BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLocalBinaryPatternFilter.m; path = Source/GPUImageLocalBinaryPatternFilter.m; sourceTree = SOURCE_ROOT; }; + BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLanczosResamplingFilter.h; path = Source/GPUImageLanczosResamplingFilter.h; sourceTree = SOURCE_ROOT; }; + BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLanczosResamplingFilter.m; path = Source/GPUImageLanczosResamplingFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; @@ -893,6 +897,8 @@ BC0690F6157C5075009274F9 /* GPUImageColorPackingFilter.m */, BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */, BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */, + BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */, + BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -1110,6 +1116,7 @@ BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */, BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */, BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */, + BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1350,6 +1357,7 @@ BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */, BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */, BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */, + BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 5edb64b2c..25e565a86 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -117,4 +117,5 @@ #import "GPUImageAddBlendFilter.h" #import "GPUImageDivideBlendFilter.h" #import "GPUImagePolkaDotFilter.h" -#import "GPUImageLocalBinaryPatternFilter.h" \ No newline at end of file +#import "GPUImageLocalBinaryPatternFilter.h" +#import "GPUImageLanczosResamplingFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageLanczosResamplingFilter.h b/framework/Source/GPUImageLanczosResamplingFilter.h new file mode 100644 index 000000000..5d7409f59 --- /dev/null +++ b/framework/Source/GPUImageLanczosResamplingFilter.h @@ -0,0 +1,7 @@ +#import "GPUImageTwoPassTextureSamplingFilter.h" + +@interface GPUImageLanczosResamplingFilter : GPUImageTwoPassTextureSamplingFilter + +@property(readwrite, nonatomic) CGSize originalImageSize; + +@end diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m new file mode 100644 index 000000000..397cf3fe6 --- /dev/null +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -0,0 +1,130 @@ +#import "GPUImageLanczosResamplingFilter.h" + +NSString *const kGPUImageLanczosVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 threeStepsLeftTextureCoordinate; + varying vec2 fourStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; + varying vec2 threeStepsRightTextureCoordinate; + varying vec2 fourStepsRightTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 firstOffset = vec2(texelWidthOffset, texelHeightOffset); + vec2 secondOffset = vec2(2.0 * texelWidthOffset, 2.0 * texelHeightOffset); + vec2 thirdOffset = vec2(3.0 * texelWidthOffset, 3.0 * texelHeightOffset); + vec2 fourthOffset = vec2(4.0 * texelWidthOffset, 4.0 * texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset; + twoStepsLeftTextureCoordinate = inputTextureCoordinate - secondOffset; + threeStepsLeftTextureCoordinate = inputTextureCoordinate - thirdOffset; + fourStepsLeftTextureCoordinate = inputTextureCoordinate - fourthOffset; + oneStepRightTextureCoordinate = inputTextureCoordinate + firstOffset; + twoStepsRightTextureCoordinate = inputTextureCoordinate + secondOffset; + threeStepsRightTextureCoordinate = inputTextureCoordinate + thirdOffset; + fourStepsRightTextureCoordinate = inputTextureCoordinate + fourthOffset; + } +); + + +NSString *const kGPUImageLanczosFragmentShaderString = SHADER_STRING +( + precision highp float; + + uniform sampler2D inputImageTexture; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 threeStepsLeftTextureCoordinate; + varying vec2 fourStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; + varying vec2 threeStepsRightTextureCoordinate; + varying vec2 fourStepsRightTextureCoordinate; + + // sinc(x) * sinc(x/a) = (a * sin(pi * x) * sin(pi * x / a)) / (pi^2 * x^2) + // Assuming a Lanczos constant of 2.0, and scaling values to max out at x = +/- 1.5 + + void main() + { + lowp vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.38026; + + fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.27667; + fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.27667; + + fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.08074; + fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.08074; + + fragmentColor += texture2D(inputImageTexture, threeStepsLeftTextureCoordinate) * -0.02612; + fragmentColor += texture2D(inputImageTexture, threeStepsRightTextureCoordinate) * -0.02612; + + fragmentColor += texture2D(inputImageTexture, fourStepsLeftTextureCoordinate) * -0.02143; + fragmentColor += texture2D(inputImageTexture, fourStepsRightTextureCoordinate) * -0.02143; + + gl_FragColor = fragmentColor; + } + ); + +@implementation GPUImageLanczosResamplingFilter + +@synthesize originalImageSize = _originalImageSize; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageLanczosVertexShaderString firstStageFragmentShaderFromString:kGPUImageLanczosFragmentShaderString secondStageVertexShaderFromString:kGPUImageLanczosVertexShaderString secondStageFragmentShaderFromString:kGPUImageLanczosFragmentShaderString])) + { + return nil; + } + + return self; +} + +// Base texture sampling offset on the input image, not the final size +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + self.originalImageSize = newSize; + [super setInputSize:newSize atIndex:textureIndex]; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 1.0 / _originalImageSize.height); + glUniform1f(verticalPassTexelHeightOffsetUniform, 0.0); + } + else + { + glUniform1f(verticalPassTexelWidthOffsetUniform, 0.0); + glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / _originalImageSize.height); + } + + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / _originalImageSize.width); + glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); + }); +} + + +@end From 00074d72af890536e36b76883576aa00731d04ff Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 22 Aug 2012 12:18:52 -0500 Subject: [PATCH 194/695] Per Joel Teply's suggestion, fixed the RGB dilation and erosion filters to properly take into account alpha channel values. --- framework/Source/GPUImageRGBDilationFilter.m | 75 ++++++++++--------- framework/Source/GPUImageRGBErosionFilter.m | 76 ++++++++++---------- 2 files changed, 72 insertions(+), 79 deletions(-) diff --git a/framework/Source/GPUImageRGBDilationFilter.m b/framework/Source/GPUImageRGBDilationFilter.m index 217f64d88..f05f96bef 100644 --- a/framework/Source/GPUImageRGBDilationFilter.m +++ b/framework/Source/GPUImageRGBDilationFilter.m @@ -4,7 +4,7 @@ // Radius 1 NSString *const kGPUImageRGBDilationRadiusOneFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -14,21 +14,20 @@ void main() { - vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); - vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; - vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + lowp vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + lowp vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + lowp vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); - lowp vec3 maxValue = max(centerIntensity.rgb, oneStepPositiveIntensity); - maxValue = max(maxValue, oneStepNegativeIntensity); + lowp vec4 maxValue = max(centerIntensity, oneStepPositiveIntensity); - gl_FragColor = vec4(maxValue, centerIntensity.a); + gl_FragColor = max(maxValue, oneStepNegativeIntensity); } ); // Radius 2 NSString *const kGPUImageRGBDilationRadiusTwoFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -40,25 +39,25 @@ void main() void main() { - vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); - vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; - vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; - vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; - vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; + lowp vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + lowp vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + lowp vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + lowp vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + lowp vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); - vec3 maxValue = max(centerIntensity.rgb, oneStepPositiveIntensity); + lowp vec4 maxValue = max(centerIntensity, oneStepPositiveIntensity); maxValue = max(maxValue, oneStepNegativeIntensity); maxValue = max(maxValue, twoStepsPositiveIntensity); maxValue = max(maxValue, twoStepsNegativeIntensity); - gl_FragColor = vec4(maxValue, centerIntensity.a); + gl_FragColor = max(maxValue, twoStepsNegativeIntensity); } ); // Radius 3 NSString *const kGPUImageRGBDilationRadiusThreeFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -72,29 +71,28 @@ void main() void main() { - vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); - vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; - vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; - vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; - vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; - vec3 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).rgb; - vec3 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).rgb; + lowp vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + lowp vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + lowp vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + lowp vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + lowp vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + lowp vec4 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate); + lowp vec4 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate); - vec3 maxValue = max(centerIntensity.rgb, oneStepPositiveIntensity); + lowp vec4 maxValue = max(centerIntensity, oneStepPositiveIntensity); maxValue = max(maxValue, oneStepNegativeIntensity); maxValue = max(maxValue, twoStepsPositiveIntensity); maxValue = max(maxValue, twoStepsNegativeIntensity); maxValue = max(maxValue, threeStepsPositiveIntensity); - maxValue = max(maxValue, threeStepsNegativeIntensity); - gl_FragColor = vec4(maxValue, centerIntensity.a); + gl_FragColor = max(maxValue, threeStepsNegativeIntensity); } ); // Radius 4 NSString *const kGPUImageRGBDilationRadiusFourFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -110,26 +108,25 @@ void main() void main() { - vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); - vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; - vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; - vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; - vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; - vec3 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).rgb; - vec3 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).rgb; - vec3 fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).rgb; - vec3 fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).rgb; + lowp vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + lowp vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + lowp vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + lowp vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + lowp vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + lowp vec4 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate); + lowp vec4 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate); + lowp vec4 fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate); + lowp vec4 fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate); - vec3 maxValue = max(centerIntensity.rgb, oneStepPositiveIntensity); + lowp vec4 maxValue = max(centerIntensity, oneStepPositiveIntensity); maxValue = max(maxValue, oneStepNegativeIntensity); maxValue = max(maxValue, twoStepsPositiveIntensity); maxValue = max(maxValue, twoStepsNegativeIntensity); maxValue = max(maxValue, threeStepsPositiveIntensity); maxValue = max(maxValue, threeStepsNegativeIntensity); maxValue = max(maxValue, fourStepsPositiveIntensity); - maxValue = max(maxValue, fourStepsNegativeIntensity); - gl_FragColor = vec4(maxValue, 1.0); + gl_FragColor = max(maxValue, fourStepsNegativeIntensity); } ); diff --git a/framework/Source/GPUImageRGBErosionFilter.m b/framework/Source/GPUImageRGBErosionFilter.m index 0d42720c5..4fae54186 100644 --- a/framework/Source/GPUImageRGBErosionFilter.m +++ b/framework/Source/GPUImageRGBErosionFilter.m @@ -4,7 +4,7 @@ // Radius 1 NSString *const kGPUImageRGBErosionRadiusOneFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -14,21 +14,20 @@ void main() { - vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); - vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; - vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; + lowp vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + lowp vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + lowp vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); - lowp vec3 minValue = min(centerIntensity.rgb, oneStepPositiveIntensity); - minValue = min(minValue, oneStepNegativeIntensity); + lowp vec4 minValue = min(centerIntensity, oneStepPositiveIntensity); - gl_FragColor = vec4(minValue, centerIntensity.a); + gl_FragColor = min(minValue, oneStepNegativeIntensity); } ); // Radius 2 NSString *const kGPUImageRGBErosionRadiusTwoFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -40,25 +39,24 @@ void main() void main() { - vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); - vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; - vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; - vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; - vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; + lowp vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + lowp vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + lowp vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + lowp vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + lowp vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); - vec3 minValue = min(centerIntensity.rgb, oneStepPositiveIntensity); + lowp vec4 minValue = min(centerIntensity, oneStepPositiveIntensity); minValue = min(minValue, oneStepNegativeIntensity); minValue = min(minValue, twoStepsPositiveIntensity); - minValue = min(minValue, twoStepsNegativeIntensity); - gl_FragColor = vec4(minValue, centerIntensity.a); + gl_FragColor = min(minValue, twoStepsNegativeIntensity); } ); // Radius 3 NSString *const kGPUImageRGBErosionRadiusThreeFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -72,29 +70,28 @@ void main() void main() { - vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); - vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; - vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; - vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; - vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; - vec3 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).rgb; - vec3 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).rgb; + lowp vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + lowp vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + lowp vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + lowp vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + lowp vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + lowp vec4 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate); + lowp vec4 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate); - vec3 minValue = min(centerIntensity.rgb, oneStepPositiveIntensity); + lowp vec4 minValue = min(centerIntensity, oneStepPositiveIntensity); minValue = min(minValue, oneStepNegativeIntensity); minValue = min(minValue, twoStepsPositiveIntensity); minValue = min(minValue, twoStepsNegativeIntensity); minValue = min(minValue, threeStepsPositiveIntensity); - minValue = min(minValue, threeStepsNegativeIntensity); - gl_FragColor = vec4(minValue, centerIntensity.a); + gl_FragColor = min(minValue, threeStepsNegativeIntensity); } ); // Radius 4 NSString *const kGPUImageRGBErosionRadiusFourFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -110,26 +107,25 @@ void main() void main() { - vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); - vec3 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).rgb; - vec3 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).rgb; - vec3 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).rgb; - vec3 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).rgb; - vec3 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).rgb; - vec3 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).rgb; - vec3 fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).rgb; - vec3 fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).rgb; + lowp vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + lowp vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + lowp vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + lowp vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + lowp vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + lowp vec4 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate); + lowp vec4 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate); + lowp vec4 fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate); + lowp vec4 fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate); - vec3 minValue = min(centerIntensity.rgb, oneStepPositiveIntensity); + lowp vec4 minValue = min(centerIntensity, oneStepPositiveIntensity); minValue = min(minValue, oneStepNegativeIntensity); minValue = min(minValue, twoStepsPositiveIntensity); minValue = min(minValue, twoStepsNegativeIntensity); minValue = min(minValue, threeStepsPositiveIntensity); minValue = min(minValue, threeStepsNegativeIntensity); minValue = min(minValue, fourStepsPositiveIntensity); - minValue = min(minValue, fourStepsNegativeIntensity); - gl_FragColor = vec4(minValue, 1.0); + gl_FragColor = min(minValue, fourStepsNegativeIntensity); } ); From 2a6eb565d6aa4c0655654acf385c79faf8deafa3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 22 Aug 2012 20:04:37 -0500 Subject: [PATCH 195/695] Added a cache for shader programs to speed up filter reuse. Fixed a threading issue with the tone curve filter. Fixed an overrelease of an audio processing queue. --- framework/Source/GLProgram.h | 3 + framework/Source/GLProgram.m | 5 ++ framework/Source/GPUImageFilter.m | 28 +++++---- framework/Source/GPUImageHistogramFilter.m | 61 +++++++++--------- framework/Source/GPUImageMovieWriter.m | 33 +++++----- framework/Source/GPUImageOpenGLESContext.h | 1 + framework/Source/GPUImageOpenGLESContext.m | 23 +++++++ framework/Source/GPUImageRawDataOutput.m | 39 ++++++------ framework/Source/GPUImageToneCurveFilter.m | 73 ++++++++++++---------- framework/Source/GPUImageTwoPassFilter.m | 28 +++++---- framework/Source/GPUImageVideoCamera.m | 2 - framework/Source/GPUImageView.m | 30 ++++----- 12 files changed, 191 insertions(+), 135 deletions(-) diff --git a/framework/Source/GLProgram.h b/framework/Source/GLProgram.h index 81a1a8d7f..b10ad72af 100755 --- a/framework/Source/GLProgram.h +++ b/framework/Source/GLProgram.h @@ -15,6 +15,9 @@ vertShader, fragShader; } + +@property(readwrite, nonatomic) BOOL initialized; + - (id)initWithVertexShaderString:(NSString *)vShaderString fragmentShaderString:(NSString *)fShaderString; - (id)initWithVertexShaderString:(NSString *)vShaderString diff --git a/framework/Source/GLProgram.m b/framework/Source/GLProgram.m index e17a5ddf6..7d93365c9 100755 --- a/framework/Source/GLProgram.m +++ b/framework/Source/GLProgram.m @@ -32,11 +32,15 @@ - (NSString *)logForOpenGLObject:(GLuint)object @implementation GLProgram // START:init +@synthesize initialized = _initialized; + - (id)initWithVertexShaderString:(NSString *)vShaderString fragmentShaderString:(NSString *)fShaderString; { if ((self = [super init])) { + _initialized = NO; + attributes = [[NSMutableArray alloc] init]; uniforms = [[NSMutableArray alloc] init]; program = glCreateProgram(); @@ -172,6 +176,7 @@ - (BOOL)link fragShader = 0; } + self.initialized = YES; return YES; } // END:link diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 0fa8b5b32..71279cc98 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -57,20 +57,24 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; - filterProgram = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; - - [self initializeAttributes]; + + filterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; - if (![filterProgram link]) + if (!filterProgram.initialized) { - NSString *progLog = [filterProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [filterProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [filterProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; - NSAssert(NO, @"Filter shader link failed"); + [self initializeAttributes]; + + if (![filterProgram link]) + { + NSString *progLog = [filterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [filterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [filterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } } filterPositionAttribute = [filterProgram attributeIndex:@"position"]; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 93698c109..661f8a027 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -130,41 +130,46 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; - secondFilterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; - thirdFilterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; - [self initializeAttributes]; + secondFilterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + thirdFilterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; - if (![secondFilterProgram link]) + if (!secondFilterProgram.initialized) { - NSString *progLog = [secondFilterProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; - NSAssert(NO, @"Filter shader link failed"); + [self initializeAttributes]; + + if (![secondFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + + } + + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + + glEnableVertexAttribArray(secondFilterPositionAttribute); + + if (![thirdFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } } secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - // REFACTOR: Possibly wrap this in a block on the image processing block - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; - - glEnableVertexAttribArray(secondFilterPositionAttribute); - - if (![thirdFilterProgram link]) - { - NSString *progLog = [secondFilterProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } thirdFilterPositionAttribute = [thirdFilterProgram attributeIndex:@"position"]; [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 20abe148e..5d38efea2 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -89,27 +89,30 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { - colorSwizzlingProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + colorSwizzlingProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; } else { - colorSwizzlingProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + colorSwizzlingProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; } - [colorSwizzlingProgram addAttribute:@"position"]; - [colorSwizzlingProgram addAttribute:@"inputTextureCoordinate"]; - - if (![colorSwizzlingProgram link]) + if (!colorSwizzlingProgram.initialized) { - NSString *progLog = [colorSwizzlingProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [colorSwizzlingProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [colorSwizzlingProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - colorSwizzlingProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } + [colorSwizzlingProgram addAttribute:@"position"]; + [colorSwizzlingProgram addAttribute:@"inputTextureCoordinate"]; + + if (![colorSwizzlingProgram link]) + { + NSString *progLog = [colorSwizzlingProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [colorSwizzlingProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [colorSwizzlingProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + colorSwizzlingProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } colorSwizzlingPositionAttribute = [colorSwizzlingProgram attributeIndex:@"position"]; colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 4d4c27054..4fdce446c 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -25,6 +25,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - (void)presentBufferForDisplay; +- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString; // Manage fast texture upload + (BOOL)supportsFastTextureUpload; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 22a5946ca..66e01db3a 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -2,6 +2,13 @@ #import #import +@interface GPUImageOpenGLESContext() +{ + NSMutableDictionary *shaderProgramCache; +} + +@end + @implementation GPUImageOpenGLESContext @synthesize context = _context; @@ -16,6 +23,7 @@ - (id)init; } _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); + shaderProgramCache = [[NSMutableDictionary alloc] init]; return self; } @@ -104,6 +112,21 @@ - (void)presentBufferForDisplay; [_context presentRenderbuffer:GL_RENDERBUFFER]; } +- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString; +{ + NSString *lookupKeyForShaderProgram = [NSString stringWithFormat:@"V: %@ - F: %@", vertexShaderString, fragmentShaderString]; + GLProgram *programFromCache = [shaderProgramCache objectForKey:lookupKeyForShaderProgram]; + + if (programFromCache == nil) + { + programFromCache = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; + [shaderProgramCache setObject:programFromCache forKey:lookupKeyForShaderProgram]; + } + + return programFromCache; +} + + #pragma mark - #pragma mark Manage fast texture upload diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index b3a16e868..155f12482 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -56,27 +56,30 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn [GPUImageOpenGLESContext useImageProcessingContext]; if ( (outputBGRA && ![GPUImageOpenGLESContext supportsFastTextureUpload]) || (!outputBGRA && [GPUImageOpenGLESContext supportsFastTextureUpload]) ) { - dataProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + dataProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; } else { - dataProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - } - - [dataProgram addAttribute:@"position"]; - [dataProgram addAttribute:@"inputTextureCoordinate"]; - - if (![dataProgram link]) - { - NSString *progLog = [dataProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [dataProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [dataProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - dataProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } + dataProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + } + + if (!dataProgram.initialized) + { + [dataProgram addAttribute:@"position"]; + [dataProgram addAttribute:@"inputTextureCoordinate"]; + + if (![dataProgram link]) + { + NSString *progLog = [dataProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [dataProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [dataProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + dataProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } dataPositionAttribute = [dataProgram attributeIndex:@"position"]; dataTextureCoordinateAttribute = [dataProgram attributeIndex:@"inputTextureCoordinate"]; diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 25a655322..ee587ef29 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -32,8 +32,8 @@ @implementation GPUImageACVFile @synthesize rgbCompositeCurvePoints, redCurvePoints, greenCurvePoints, blueCurvePoints; -- (id) initWithCurveFile:(NSString*)curveFile{ - +- (id) initWithCurveFile:(NSString*)curveFile +{ self = [super init]; if (self != nil) { @@ -41,7 +41,8 @@ - (id) initWithCurveFile:(NSString*)curveFile{ NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath: bundleCurvePath]; - if (file == nil){ + if (file == nil) + { NSLog(@"Failed to open file"); return self; @@ -62,7 +63,8 @@ - (id) initWithCurveFile:(NSString*)curveFile{ float pointRate = (1.0 / 255); // The following is the data for each curve specified by count above - for (NSInteger x = 0; x= 256) && ([_greenCurve count] >= 256) && ([_blueCurve count] >= 256) ) - { - for (unsigned int currentCurveIndex = 0; currentCurveIndex < 256; currentCurveIndex++) + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + if (!toneCurveTexture) { - // BGRA for upload to texture - toneCurveByteArray[currentCurveIndex * 4] = currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue]; - toneCurveByteArray[currentCurveIndex * 4 + 1] = currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue]; - toneCurveByteArray[currentCurveIndex * 4 + 2] = currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue]; - toneCurveByteArray[currentCurveIndex * 4 + 3] = 255; + glActiveTexture(GL_TEXTURE3); + glGenTextures(1, &toneCurveTexture); + glBindTexture(GL_TEXTURE_2D, toneCurveTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + toneCurveByteArray = calloc(256 * 4, sizeof(GLubyte)); + } + else + { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, toneCurveTexture); } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256 /*width*/, 1 /*height*/, 0, GL_BGRA, GL_UNSIGNED_BYTE, toneCurveByteArray); - } + if ( ([_redCurve count] >= 256) && ([_greenCurve count] >= 256) && ([_blueCurve count] >= 256) ) + { + for (unsigned int currentCurveIndex = 0; currentCurveIndex < 256; currentCurveIndex++) + { + // BGRA for upload to texture + toneCurveByteArray[currentCurveIndex * 4] = currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue]; + toneCurveByteArray[currentCurveIndex * 4 + 1] = currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue]; + toneCurveByteArray[currentCurveIndex * 4 + 2] = currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue]; + toneCurveByteArray[currentCurveIndex * 4 + 3] = 255; + } + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256 /*width*/, 1 /*height*/, 0, GL_BGRA, GL_UNSIGNED_BYTE, toneCurveByteArray); + } + }); } #pragma mark - diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 8ee3bc633..092779161 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -14,20 +14,24 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; - secondFilterProgram = [[GLProgram alloc] initWithVertexShaderString:secondStageVertexShaderString fragmentShaderString:secondStageFragmentShaderString]; - - [self initializeAttributes]; + + secondFilterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:secondStageVertexShaderString fragmentShaderString:secondStageFragmentShaderString]; - if (![secondFilterProgram link]) + if (!secondFilterProgram.initialized) { - NSString *progLog = [secondFilterProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; - NSAssert(NO, @"Filter shader link failed"); + [self initializeAttributes]; + + if (![secondFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } } secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index b1e9c6008..fc8ed098f 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -517,8 +517,6 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; audioInput = nil; audioOutput = nil; _microphone = nil; - dispatch_release(audioProcessingQueue); - audioProcessingQueue = NULL; } } else diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 530a0c493..7c57d7c23 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -92,21 +92,23 @@ - (void)commonInit; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; - displayProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - - [displayProgram addAttribute:@"position"]; - [displayProgram addAttribute:@"inputTextureCoordinate"]; - - if (![displayProgram link]) + displayProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + if (!displayProgram.initialized) { - NSString *progLog = [displayProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [displayProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [displayProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - displayProgram = nil; - NSAssert(NO, @"Filter shader link failed"); + [displayProgram addAttribute:@"position"]; + [displayProgram addAttribute:@"inputTextureCoordinate"]; + + if (![displayProgram link]) + { + NSString *progLog = [displayProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [displayProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [displayProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + displayProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } } displayPositionAttribute = [displayProgram attributeIndex:@"position"]; From f67cbd9d1394f266b2a63a09a0123958f5626e3d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 22 Aug 2012 22:17:30 -0500 Subject: [PATCH 196/695] The frame processing completion block should now be handled correctly for filter groups. --- framework/Source/GPUImageFilterGroup.m | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 61f5bd715..a21ddb1cf 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -110,6 +110,16 @@ - (void)removeAllTargets; [_terminalFilter removeAllTargets]; } +- (void)setFrameProcessingCompletionBlock:(void (^)(GPUImageOutput *, CMTime))frameProcessingCompletionBlock; +{ + [_terminalFilter setFrameProcessingCompletionBlock:frameProcessingCompletionBlock]; +} + +- (void (^)(GPUImageOutput *, CMTime))frameProcessingCompletionBlock; +{ + return [_terminalFilter frameProcessingCompletionBlock]; +} + #pragma mark - #pragma mark GPUImageInput protocol From 242416b713e045da85aec3e7e1f6dc5fcc0f636b Mon Sep 17 00:00:00 2001 From: "John A. Debay" Date: Fri, 24 Aug 2012 10:44:25 -0600 Subject: [PATCH 197/695] Validate the crop rect before assigning it. --- framework/Source/GPUImageCropFilter.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index b923f6c85..6b32aeae2 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -229,6 +229,11 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)setCropRegion:(CGRect)newValue; { + NSParameterAssert(newValue.origin.x >= 0 && newValue.origin.x <= 1 && + newValue.origin.y >= 0 && newValue.origin.y <= 1 && + newValue.size.width >= 0 && newValue.size.width <= 1 && + newValue.size.height >= 0 && newValue.size.height <= 1); + _cropRegion = newValue; [self calculateCropTextureCoordinates]; } From 04eb11d9c0d9b3fc4492af48dc4a135e358406a4 Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 25 Aug 2012 13:31:51 -0400 Subject: [PATCH 198/695] Fixed typo in README.md In the example code for adding a custom filter to a video feed, replaced "thresholdFilter" with "customFilter". --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee20f50f1..41db5c366 100755 --- a/README.md +++ b/README.md @@ -352,7 +352,7 @@ To filter live video from an iOS device's camera, you can use code like the foll // Add the view somewhere so it's visible - [videoCamera addTarget:thresholdFilter]; + [videoCamera addTarget:customFilter]; [customFilter addTarget:filteredVideoView]; [videoCamera startCameraCapture]; From 77a9f6dafe504275fb9a761c7797bf6b064896a7 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 26 Aug 2012 22:17:59 -0500 Subject: [PATCH 199/695] Started adding an average color processing filter. Fixed an issue with two-pass filters introduced with the recent shader caching commit. Added a default initializer for generic filters. --- .../project.pbxproj | 4 + .../FeatureExtractionTest/ChairTest.png | Bin 0 -> 632358 bytes .../FeatureExtractionAppDelegate.m | 14 + framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageAverageColor.h | 18 + framework/Source/GPUImageAverageColor.m | 326 ++++++++++++++++++ framework/Source/GPUImageFilter.h | 1 + framework/Source/GPUImageFilter.m | 16 + .../Source/GPUImageLanczosResamplingFilter.m | 16 +- framework/Source/GPUImagePicture.m | 13 + framework/Source/GPUImageTwoInputFilter.m | 2 + framework/Source/GPUImageTwoPassFilter.m | 3 +- .../GPUImageTwoPassTextureSamplingFilter.h | 1 + .../GPUImageTwoPassTextureSamplingFilter.m | 29 +- 15 files changed, 433 insertions(+), 21 deletions(-) create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/ChairTest.png create mode 100644 framework/Source/GPUImageAverageColor.h create mode 100644 framework/Source/GPUImageAverageColor.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index 2b6cbe9d8..a217a8e7a 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C9156C836400AB8026 /* AVFoundation.framework */; }; BC18E0CC156C881700AB8026 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0CB156C881700AB8026 /* 71yih.png */; }; BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC46D52315D03D9C00CC63CA /* LBPTest.png */; }; + BCB79DC715E9754000965D92 /* ChairTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB79DC615E9754000965D92 /* ChairTest.png */; }; BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCD9A355157EC35E00C41504 /* 8pixeltest.png */; }; /* End PBXBuildFile section */ @@ -67,6 +68,7 @@ BC18E0C9156C836400AB8026 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BC18E0CB156C881700AB8026 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; BC46D52315D03D9C00CC63CA /* LBPTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LBPTest.png; sourceTree = ""; }; + BCB79DC615E9754000965D92 /* ChairTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ChairTest.png; sourceTree = ""; }; BCD9A355157EC35E00C41504 /* 8pixeltest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 8pixeltest.png; sourceTree = ""; }; /* End PBXFileReference section */ @@ -139,6 +141,7 @@ BC46D52315D03D9C00CC63CA /* LBPTest.png */, BCD9A355157EC35E00C41504 /* 8pixeltest.png */, BC18E0CB156C881700AB8026 /* 71yih.png */, + BCB79DC615E9754000965D92 /* ChairTest.png */, BC18E0A2156C822E00AB8026 /* FeatureExtractionTest-Info.plist */, BC18E0A3156C822E00AB8026 /* InfoPlist.strings */, BC18E0A6156C822E00AB8026 /* main.m */, @@ -236,6 +239,7 @@ BC18E0CC156C881700AB8026 /* 71yih.png in Resources */, BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */, BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */, + BCB79DC715E9754000965D92 /* ChairTest.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/ChairTest.png b/examples/FeatureExtractionTest/FeatureExtractionTest/ChairTest.png new file mode 100644 index 0000000000000000000000000000000000000000..58f06c8d957cd1da142af6ce7ec99f27185e7380 GIT binary patch literal 632358 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

cAIAES*1F(FT6? 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𝕐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

iws*eG9$vU(ThF%~AT7Twh`f`vOkyZ(c*$(#XV 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 z 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�S4Dsx9{&%ZN%#zgU0!;NEQc&egl+#m7!j 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�$$W zRp>l~M4V6I%`?2u&kNVGf*II>Q+{^h!u8lrCbY&=Dmsi)m>bN4eeoXiOdLbL=x64y zIJWciIT{v)5}_es26%z13T_3m_xR(uHMpU5@5=wgQ#}GIA?|s4srVvcL6X%Pl5A_? zz6o?)G>#FW%yVXfbb`QVx zM!fX$OLQo!r9b?Q*#F2waf@)_)!vaf^4?Dfd900JAe1^bu^6xZAAc72=&p$5l>h)F z57cVBPXg9`eAKnOIW(Qk`|%scc{sI(xK##+r=sWTNZbO6)~>Pj9@%qb(Yb(35@M6o zIMU2#@(M~BgA7y#WDwRN;#{zc1^x+T-l6IJ{Rvnl?`*IuR8csjoP`RC&^&+X;R&3_z!@~2;mUw{1h_?JKWW<2uAUyJh}{*VL~ zvTJJ_`E9l$&w&YPscAiCyc6P*KoknIC>Zl(4({987AJOXi&Yi&&NYjh+C?lfU9>hQ zxyzi(i50sa-B+#wJ6&j4br7isa`-CTd0Iolh97Xk^%ZVRg>XT9`MJ!VADM;lE5!8@ z6H+i6e=C@a`S!Ob83@Qrx>>D|$D?OF_sOkxR6N6&{n9K^9c zIw|Qf_N^OBca?;yWg|0IxnrWK#7b}GB6vuJ7VhvcF0>V^S96V3F>2%l1Wil#u!U-{Y6zA5O_8sdI4L#Ii8^KcdGg2xFHS)wGIOcayenpoFG zIy5zrq9CIi!V@q+NGY4HfM+&Wkt3!B!ThqNCAjX(&r%s=AB4aE6-Ij8J+D%uKo zM{R2>_riSP3ktJK^i)50@_0P`!t=3V%cks$KF~LS5_KK#OMNu&-Ai*RDia=f^t5ut zn{?ZXv+Rimh25)`twx~$XPs-5&?OGsHJL}3vqzLpqga=q+{vFxOO2}+?J?z{r3guX10D-*E@+gn$6UtWoT1J9ot>V; z62|oSSi8=xfbTSZvN;t4W9aUM3WL4T?_y+>-qTZ8Si*V{r3X*N(tufxCs10~BWWm4 z47;xa!CJEOAJ0|+^m`{_a-)rrl!yIvvAc1jIyx~p_3*7*^CkG^1Pz)7;wP_tGk){8 z{vI&9mj_|A?S3fUdFKP-+%~fUF35_T>_Hi><5w6NAQb^~%Q##!dK$tMKlYl{OcthX zvJ%=rIl!u=@2Kr7trwh}p%{9IP9OyICvd-wU?GnX2c0BddXwZWwH<{(4RJ`@IMxu$ zHC9`6f^yNNv2pV*4sPBQ6)TC);I6#Zbs0tZnOhH$Gi!1_37pR-!XKJt3j7`u6Zk*KmzWxDGHm#>>7?n!MB8*X&x3I_EXwE6efx%?W8;I|E zwcb@o%nG;pg=?$kY~Xgf8vWqMA94KHJZ&wT1pmcvjyAf3!_G;Po!-g^58 zNQeH%XT~CJQK^!qwP1{AkYp_hnWeLyJJCc(oKax=4lbug+&-3^ByqEDiKf`aLQ@y; z5^lPmS+`#o79DT-PSWV}6XO^5Y)4rwVkf;b{)Yus!D} z*8TC5r}Ajedgx6e&+-zOV?Xt^ZOzRYlXXodODeQ|EyJBHQ?mA0+|vVM$U-I2TF;M; zU5an~^ib@CIaICEVli3C(1A*@ox05C1_&};c%H6Dvw`&iCZe()6lnF(r%K^ zV4|j3?)DU4hVr-oUe{vHKl}K0I%AE*J20R5fX-3SW!MS_@v&g;1?j4ZGoFwTjHf(d^vVJ@+d;4j`-oFxOJbyJM6fG(9{EBXRm5{)SD2+RB}(H zCzU8m617w_lbZQyS*qx&=qpqtje((Ygvcm8yIWF73I9Uy6!{qLi!>w8)7zpVlrC@{ z#>XfFhAs+Tl}$|)mf)$MiSzE2%CtgGdel>-qHb%*q(Lv|p9-D$=e&g}cjVkPl*+(W zs~PU%S&*kWKlvA?Ezck>j*^)C)G^qoyI866K=IcQjn6msEbmkgaD2U*OcR)R@)O3P zz~fn#%cbJ-05`oaEoJ5$Nah7O@?f+T zn5Jjx>NZtNvYv1aF}Ye8YaLdg@lNA)#znQf6gCP#$4D0w5VbDY!vbuj*Rh2bWsR*s zVi~cdp*VNqSj@PbNNmtHmV35s%F-keLm`?OJIs;u002M$Nkla8VK zWP;X1)D=Je%qLKGIJITuD%)3;jM8VP8ydpZq9R@9ytC$S(@bh=Q$J@1>^(@rnqX{ zZjQ{{85COGUhbVSIKv+b61#JG?yBxSnTJf*`45BpU;C54j*V+g=CTZlu!S&99FmTq zao5beW%%Ncj72>4Gk}-yH0ftxh#mpJ+vkk3-&(%HQV?c>6mP~+BvzxqZr!#yX6_o} zR%s@~8rbRykbS7oiod=JWe3K~98@UNs|t?R z-45{4_J36<1PwG}sBdY;O012e?|+!tkj=gznXN_NC{N3Ew1na)v~o zwr$&E`;Kk#){lP@Jzdv`Clfd13~c)q3ybf4>-+JuAH7a%PM9W1UV3%hPrWl~Au5Ex zbrr0H2>=q0W%epl;;Vc@H|t$+0o2UD<)cOHoos)uGlXY|!2aG(a5Ud1U!WX^Mh}a( zW=J$!9naz3e+1WNV_ii&^0DVgK;;0Bk%1TN-0W(O)qTp110h!oJx51#ly@PZV+1iIR(%vu-30w+#LkE@9@DU4jW6U!_=Hr9Bg+O74kGT6L0$1E0` z$sxE~vOh5QJJt*W(IWvpC}9~Ls_r0Ax-VUfuG0sxZq{<>jlE-Km|6`2Q_O~ei`*cU zfaVd2C`sgOev}mDAOiOe^S^_ZI>L!8B2%6T3&Pn%!6cv6SYyU)EaPdwnra5PbqHbI z7M2zP5s*UHE)M}ot>3+cP;@T#lv! zBxek_#GA*@$EVJ9#U5(jrbjr*2;w@hXJh={fBBX8joZ%M_5J(JOw;lAYy zK6O7+Tj0H8C4w;(nx$#bOKGY2RM3u(^4S%vS6A;W_1S*skaHeaiL$7mlG&GZvv+*q0V8Xu zK@^WIi^}*R*B70j?#IQh{@Ai>2caTdmm~se@wz4%oPtZ&t9W3WPZd%DnBEjlWl{OD zWK5x`rRC28`-*KApQbY5I^LZh{_y?Su??$Z_HCgG}$2gB(pShkYzCZ zHjygfm5dB!0)C>x=6T9&6>D~mg{L4DDn3`pN{{JHV6T!#2^{uQ=3mQ^ou>~SiSFay zi!c1@-zTAP8;Nlfl!4%yTu;Ahvht6x<8S<+Cw?5&`wFrn30x+8+v>OChKJ@z{8^kHkHuv*#G7x$Q13OuBs8;u?rasT!C(fx zUKX2i%wdq+<TE#xLX9Lv|C{E6s|J;YPCV{c}J?SNqX5bmV(h`+7!h^sZ@Kwu{ zeG{kk;E?~5iYDXeu9e@IiCkEddOXa3v8}3ni1q8y!$YIc6%$s`1j^@I?XVEjA9;-ZYIcq z=^n1a7sxykhEb?hEKG2_4Lzo7o@aU3#i|vI(|~N`!h6#LapBKnIgBZ+EtmhYTAaU!l?Ji(c? zZF${YH-pX5ZR<00e4xr`xoI+ak$w@Vt92>d-K5my0kYrA7!_pcW@D3dtxX{WMkm!2 zXQCe>?8VjDj|*myAKjkzzt)vK!8LZ@(uHXJPU1p>rklw48+up9SMNV)Sm3%m_*@Ix z#0-lJtOlEsaCz}C5EL-xVACcSSEv*Dy+FEqU0D)^VT|UsIDG}cw zv(|l(k*XxzXTOBG@r^_f_G*QQ3v;zx#c@?olu_IU!FqVO_p5C(25WJ@)DW}#6vF+` ziA$+)xW@zZ2VP6pqg~rc5F!RWi{Pn*2-;g3GjsQM|NB3PXAbO%kA3_z9F$F+?>&Sp z@s`99aL2ZC$t-!e#3qARfzTDEtL{gyy%8V2|2ofGq#*xcN^+W53;t;c#%uiT{i$ql z@6j_?;ux9cwOC-cnTtX#wN>`p^$6Q!9O9-gaKig#5P%itkeo%3Nn81y0QXMI)_h(j z`|zcin0~Voi?I-O_8CO!saZCQz1aHBAGUGcS-3Lf%(AAlHrWw^6tmI)qUkEb%s6Z zGPSdt%AkoSEz~K33d}=gjw2QE$XNEJBB#qtCa+)$}%7im)X zOP{(dQy4vfTMA;}A{~e?!puqr=jVK6`ZC+Z4V81olQvp8JjKMdLx)Z!Q{H>vQL<+* z#v<@}?7(BOYu~;oh1c|SU*T+TEM92)(A)1g1CHt26KnA9G_*Fy>8_#p=!f5kkA3Qs zwAgGf#s^PFN5+URgO`-x^^Brq4E7>yaT&AkT9LU&2n+FL3IEcFae}T?WaBr>PClhq zKtbl(H7T^#-1u}Cb5-KJ_i;$f?M0M0Xzm(y)wiccV;zY*6J!LRI(a&-oIA^jK}`tP znP^$NDt2sdi`x?e@zCCFgiV%5Go@As_HBvfC7epMzCNCN>3I%Bsf+8EFSBPHbia<% zhBobra$@5*hA2nk6fPASX+nM~yq&YNOn$*!#ZRwMG0t_dw50?sF5-L3?yTr=9}5FQ zZ=7;KS}{jRJeDur;$%2!+iRuKRVWAy$`7t)@I=1rp9N1S3`CV#=a*Ki$gN?PbB0zJ zUxi3dL-I9gMZSX!ajvdM?LsSGJd{=yoQdmvGmpHvi%fA1>B-<;*CwrajbrPsmTrZQ z_xqy)o3e)FJj19ex1LfZ&!|H=1WVz2w!YLmN%$2RVOX-7q|>skWI<=6cP>;%LejE_V^f9mU1UsTTlUI2bQg zFuSQvuN>xJ0>N^ann50~>?iycOm5x(SOwNRY^biOjz6Q_9dS;IpQz5T%pex9+6!H?g zJ#Wpk7bL?9n3^D6*_QX?_3 z3ipbCTB$N9-B!B5#DgPbL7yTERTs4TtG5DBCca4^X%#caWDLMVxVR1#5pmLM{V|jw zk@}eoP(0C1mqf)SgqCs+-m8UIPdT3I-=%9KF))VWM9GBKyzuZ@9)rkW{Ks>WsBtp_ zCw2jCyC}DtN9YfE!NG9!~n??f+|&Wpt0uUg?=@15ZAJFsO*Zk(qey2X8?q_lUzj620A6q(@G~ec;?I3{{8pada62?c5CzVYV!@x#CRgJ^8ogkau`K(36@!M^B1XutT( z{@A;-HC}vfKN;%>;!B@>mfr9kaqQhUGWMgR<9R|qh6lnpYXTwiP0PrYD}Ilc%(UNZqtHQE&-^FD;uNvtP zaN@tXlS-X1XYbvE^d#^;C(i%%_;`!-<2YU~eek#x^ei)lx3Jf+lTX_D@HY6VoUn(5 z3aYp(O^SQ+{4_45&3u-;+VBw1WxVt*!B5LsvmZ#eHu2DC&~l$e`M6&Khxo#a`(8mQ zXL5x`Cd1P$l8aDN5a8UrfVEfPkA8OmAu~s)x+xNmc$h%v^R!sm1UFJwnaF?QLQg#Q z=)=+4wuwcrAmx834uAAM;}b{51#6r!1NvAJZkj}^^(w$zpkpR7v%aEq1%`&8b<@4Z z-)fcux6s`9jCmz+6WBn7O_D&hY||CTwF*t=u53%UGwZ*F0KAQLGpwa-Yz5{sM6-oK z61*npmNPgyO_>FZ4DIyZJqqxvac5KTpM9j+sIjq8l3?hA48rvG(v%)IN_|6p9*(W$ z<6LzK=Nv#N%d&haC}qmJ`qkQG9*JNu2;*GBKzp$awPRUmF^le}NScW-}q zDiPX*6*EY)y(ElF>&TZ{tqF5xpP77H$-OVtKnV?$B3R`}2zsjWYUEwTIn_Zgq=Sg1( zWIoeUNTrnhEMQOw1SSDv6gI{B^$dBvOvXbm#4md$+wepU-B5=bzi?P!UenoZV!MnRrrI#tH?WXZq8A>m&dvvuFoHhAeAdEOKHQG-WBgx*eaAV1O^@`jKu-1 zLp?si$1xO+ex6qE&qvYI1b=2od8N1_E&Kd=6hvX=J@Q3k%+AR?gH(jMNw1dpEbJBJ z?t_&f;+Z~K=W2LT-1X)7>4jvzh6F4JGc=OVWejPYuNbdbzt2^^I6?PJ99Owg`P4vk z?mQ}$VrfO3mX5_4WtA@WvR#{+Ub!(vou(Q$gE>jfcj1@`8w{wVw|RwvWQp0$a|8YfflLhpF|_J8_i8gR?h%cHNaH;x{97cH}Byl--V2rq+R zeJOlgmq3>RxhVo6iIfYRr+{}MOb=$wLU^M)+>R{H-8pz7lfqnup~&tw(ZTpuv6&_U zDA00~WXcej2$wE)Hd*V(xGG$i)vu;5 zP=Q!wMm0jpSj_R0U9qmctvF{GLD@hZWd-pLH6aC!!p~$IH&kS>EXmqg|1Pqi3t==v zLRGq~S$hg=;Gd^8C1w;ZW|2yUZY5Wx0eJqM?HIZR_JOu|RL53@n-sN~#Sn}Q)58IaIm zU-0hh19?=QaB{CC?j=URqVj!#qY!rT422I11Sb?c;*j5$gNI8m3AA835-UI8k;xq5 zjtU3AvS@yY z1K(u`hYS7QgD7-=iBG~?3t9mx-C1Ih%9?bM%ac|LZQN^ED4#PXo)eS(q~Rq-QsiZ5 zVLL|Q_42dq{`TNA>BrjaW~|E&IwkGi+yWj+S9-j7CU8)ZR1sHMxIQ!$7wBL#JlKW% zb|ZL(Ws6d!Fm;{^C~0|#VP-Pb1JI=VTL#Jc6sXQu+D|&=Gw(6REPiAH5unzhkP%BO z)x_ExNgQlISk6OBYnwRX33}_gaEa|GBZGfe%u=#7My|m-AJC zP89YkQur%sbHo+V&lbQ6-)8T zeUc~noqv1wuQZ-n+u)e%Ol8C0tk)N&MgC6MBtDC$;*`9oEW35R^uefIhnNo@Jf34ikv@(pRIx5R4JJpaG%!5#6^UJ&KO(&AldrlT$!ozQ z1){=FS~8U5dfhuvA2?8Tfw7<`@s zdAvC;Uhf>_alWKQoBL>Z_`Z^gmlVi}CkQ+4vvxd_y|`Cg^ZQ&6pL>t{CQnIuBLTBE z6=~mcOFq*ziO+g~jRj}U%>!d5t7m!S#2Vu85w z(?|IrCn2FpV2eD=8rEtoygM+Zs{?3RO|`LOODmh%9BpK@wxI!A9DSb>mP!iSEqk#! zfMph!`={c2ul_~+&VT+}Xv1ak=YRI+(bsbY-}o99&t^fCs|32x6{;>5Ao^A&ERfv< zUouCa0-#u!bLH=JRVEV1^!NwYEvx~q zOM@j`5M3qiQ<>8(%5FqlEpeH*YcAaT&Y2mz`|b^E_BBa%tR*?Rw`YiP`7BFXbajXv z)`ePwC^RfH(q*H2+jf*5`6Uc8Sp-IFJVPWD1~UAq$#M3U9@P-&|NWy6h&SnuET^$@qXXsw(8Q_^{&mgZ1 zN*qW+lTi36aKya_e*C0>WTGlZ{>=sX8ShwwM8|LLb1$?;#2>LsCM5BRBOWC@_w2)~F2d#(v4YLuhT397m+3u6DmkY>zQUm9Eg|19hOFHN4gcD;5#**~K zeMJjJ-K5lu0&^|dK~6dwMyVdA1hAJ5Me{W9K`a;f6E`^zc=v8-o5mpEv5Yyb5BHHd zWN0aI8G3@Q3dXL*>)t51v_SZrYovIUHEF}D3-NfCWGdH^`@%f}!Nj;-dp2itmW#(v z#>vBnIJ0;i=gN{)RNqLvdS$G`P2SUWg`}(d(cHP&A*j>urMp#UG;i4&XO11EXLLPf zljJ#&6@230!PvfMZ`A9ehi;aySsVSFr@Okflh(IuD8HgtG}gJ6xN~uB;#D$n-mAFr zXYRQ;oEXR7!h+eeZ^k^u0mFN)$Arlh$ukm9y^iax@o%i*P>cq`LmYRv=c!L;7q9at z&T$gYXngecyBs{x6W!;3#Ibjqleg63#VX_Qi8(?H!x#o#U6<+p)lW>m4X+2!fH$wl zRlSmjSsp2T_ zDnqg5qkpy9KyS`Nxgh;Zvhsf4ixlD*GfR5X z`t=#^oj54%=_s_}W>g!g$ z!i@4^5`-?2%xpwJD1<%Au8t!2wVa2#V{3an^3ax8!4YP=cWh=O8)NI{c6vl_jfZx1 z(yDDY&Li#^>v9N+%yKaJ1-GFls*cn*E|Ui|T&{8b(;W$#!Kw#Zh6X|P#7 zTVfP>1w>}np-rSFCR=1dYDsdui$-?3i zy{$(%w#wr3-rjyJXpY(fk;bVhoyDSNxMWPCf$mQKP6Xy}5h;%jW3IwyCGLC!AeL*{ zo>AnJVd?6y|FUzH*(Xu~M3obf$D`UZWB{Vr&_C-_VZJ8EsB!u{Elm-qNQ5YjL+>1< zzR<%Q%E?Twj32&zA|Bm|Re&JY6=>|v_Ig_Ct+>4gU=THREwS(MCumzb$iWZez)%9k z(nA?>Y#EcAtFUt&#%Ak?-R<1Ik+?gp4X>R*fg^DUqA3I-o&*@+f>s;?kt!N!>jtve&C(=zSTez2bo9js>m$3@P z?}1=uj`9KpgX=XXAzi`DGu^+;!R~WcySw9G{a@ zRLX_1UBZN23Rifxim2f~4U2Sl^L+QiSr)ibTwCx8UH;(bgZatxWlN4HQy1^OQ~0}2 z@&#p->q;IbZ{kN@@3qF;70${R<(FemGjCa68kpSg%k>*0)=T1i<)2npl-1X+dPT-0 z;TA#-q65gx1ub<2@tw8F@Eo`kWc9qyabgnH)toYd%cG9&Q>(F#5#+S19Eopy<9oP( z*2Uqo*W&;D+P{u3fB8$S^)7uezZL)8SN~4z*uM=#D;AiVh#L&GN{qgK&Is8cF8evs zX5#<|6qY9J0GJmS$n1MhFtWRh6Hh>~$tD9VF%}uNh?Fi%ZslFZUY4FKQplBZlX$k* zIgZb8b3KkP1MxYqZXP5j__x(MB{tha?x*c9abgGX2y%nAW?^;!@2EKkAPM@!8? zG`=yq3R$15r@-FSZj3H*k=blNGgn3WLUTqlWAid$27#-KRBJL@q%lX6Z>)#*dh4Vu zb{A1ZQW4P>ik>zkvY4@L!kpg=6Zb(2S*EFWrhBmx55)+_e5nK}&_{`T@7viN^xJ1ifaxaWe)m>% z@g*!BGnq=FlF;D|_qcBNTv|-)5ds4`&_*HL_%jJrWynE%o_HdyBuX(}_swGs@GI}l5IFOc?vpOKxA@J35+4dLj&t;%u$I|4b@4}Bm$}}?`n``b zDU-d9(rt$IhDMq~aG}jtJW)&`Y|@nB4PA4t)$VhKLR18`e8o{cMrO$3UCn0+Q=j1+ zz1BPw_f$pFx%%5Z^kk@=l>Xhv%39UXKzE{vICpUX*DN6}6oHne#<&MbQ-|@by&BjHfcYjo7yhgf7LB`s|OYz3PxgZ6VFqbC*YR0aJ4i36l z*F^7gQarx#*WZf@vh$yQ;W^IDy%h5|Mq)ckaT}hg_ka326R5!>*~Wb(@!G53kGmwJ zJ^bk2Xrb!l?3EdMD}SG}n%ARPS5d;YIyQ84#JN*P60X~~Z$o*x9Vd<*OF^zjMfmCt zb}mUvzR8z!L6vww^b<#%pI^Xih=&{Q4m zB=>D-r51T%IzI92{#eJcxQ*3i@ylO)Iok1*ZEUZJ$7udjwXTymI0`-?HN9eG;M|Ip zHCfVWp2o7}TA3=Y;2Zo?MM%qEH@k6Xl{f{e`(|>lQb*iU`E!1S0Jm|Kg?l=6YFr@-+pl$&7k4t)4NYYFt~`?zEDyqf{0Mb7l2uj z8NAGnE4ai)Ny6Dh9jI2QNm353#-m2QK)vE^kKm&w>%yhsc;$cmQxLhH2K8O>%b$56 z8z@}4c8yHh!||)X@pt2?M>@G5w=1=gTZiz_{Wl|+#}Ah z3M+a!Mew#wWGc*g$)Aqk!Sx}_6HyXSKxzrGMTlgO0FTFd703Zn02s$uq}ExjRs@m( zB-;VV%SaXzNM5cbT@69oDz0$t;bs8Hr7#T{&{78|;U|ENYgE%h)A+gxE#(MbldY;L zWzc0~0z%KkSag#Cr@KQ9NhDDq83(mqw1L=ZJ&h`C`6eMKSY%WZhKJqDm`tqDlGVb# zcXK+m=(Nn;P}ZRE7vV+9OoRbp6yCbf9IL$Ccra&mq6urE-iB!|@_8rwcuYAlErKpe07mT}R8KYgNno=tcO7#KN5k0|T4WTlPYX1-NN_ ziukv1KjAft1CQ;DGp8>`fA7`UNLMbKx!AdB8btLpF8uh6$4$OimjtAHIyGGhzYi?O*O$MSCokb6@xb*>MF7RNH5z~Oy9u(3a{ z&rXFhAFXgzcyrCtl$=jup3K-W_~E-`Y=B6i=~{fKB}57;v$egbR7S^h?(n-Dp;v}N ztD@+$9mi`tSiQ6a20#o?HesyVYqa>i&bf)o{27b;~wPwQ40^60(L(>d`3T78ni@D0svzCY3aq78Y|6|5f^I(4(?AkHT3=9?1ySYHRztn4u)=Wg|#&6P?@gAN*q85 zoJ7cO+_gFmeC%l&RNSUCt~1`n8}z{+yb@ph?cXC?x+$&`2d<=7fiK}N?#Kgd{ps9= zSz1J_RUze%XyNC=*>@^YX;}eS=^$}|Z=`c!Al-?pD|ybURW+2k-HX5VOP`DtTxf>+ z@@4m9+atTl^qz{Q9h7zMe<7}PU5ITv+8DkfUijrN$E$z&Y6_+%k`-4G{#%Co+-I#u zaMf*S!$nQS1AKF^x1S^Rjz<%xK2@xw1u+EeF{xP}iv{O?xlZvzI&faDiI15}k$@$( zi?fBbZvq{3A%+5AIE2(nm1EyW*-!RJV=u##;CCU6^==T~ zMoF`Ij>?8(+K5NP$2^4<{4Fo@pdK5Z7}nASU494c&4I+ka8QSn=3toMcc^PvFvIxPvXKK{rQih33v4@h2YzF?j!MLO}zQ`Tk*k1AI5jS z{qJ!TZG?a-s9B>3p5F@F6qYQ4t<5B%8qRvGuI6+Mw6t2ZQa5py`6WVf%@|hYAnoM3 zIa?7@jcVNFD@gV!1;Mh%D@daTBXg1Qr*#5keU9-b0do%k+@&1qE_0s4suJPVlC)ft znXzv6f;r(DPV27VC?cUuk|9VKGd{z8RU#I>RhO-zG@;OJb=5iNT7-?`mX$-4Ag+fp z>%NsxeWrxC5@n*Sl2(yiZ?~gKka=PfifpA`jqh#Unq!+zZo1?KnP*j~q7@K@-*)tuSMv?x%{W zb626$!gXI1SpKM#n6zU*cj4)^ekM)dL2;>X+8OgGDnEPuuhU(-29MCAk3NJA$r;&a zFJyN129(wdM}8U~(r{#5Lt{Mig)iW?eKFpA{WbD1s5-fLl!UUGSg{4e3Sm`_CrRP3 zYxh3jk3qv+7icYNndy>prwh6eydZ;f1!v`f$tRho7M_A9l~C5jN5%ClP8?AA^B!R( zUP&wVY$$R8z&+MjhQ)f2IeU=B$3Fh)XlU6QPyO2e5Wn^Eu6X&APsRK19Zp=jeX%R1 z$f4Q2$*>rm!5DXZj6+W7y*z_=a_!oN*tmX88WnX_4gAK4TP%s|J=fVM6#`t@C~O{u zoAk{51h)HDgaCAtn=`{+fVYNW-7oiv>0>adJmMKLTv2X_fa`z{N#tOj!0;MEZMkPO z_kbnJ16}?tKEDT#aQzxT8Z0&{QINBT1%oKuI>cajo(SWQEJ$EqADp7e{tRulh7f=R z%3+M-6uqxPfRr%dGZe6IYik7PoU~K3E?U-8q)&0T694tT`ZKKJ4wy0hKe4jZf|9sc zOj>13O5$&(zJXf9-pVsbFEsZ1+$dr$g;SJU%FDX*zZAL z5|`KeMaC+Bj+DBfDCh-!-_7KS#pnpKg*rEdehp`5>_BNw?L06FJD&4GfjS?!8saRIfA$rx83Y4$KRnmRP+8g$3=EMu{(BcZRLAf zfuhyb5L@GcnaO>V{k}Oh#$0XF#~#Q~Q5t3uBx;XZ+`_n?+UO$Ttq=&h(Qo2Ty+xOv z`v~__xYx{tw#-S-KrJrn64tN6;Y-N7io$v8@ITh2psS@Nr%Xk-8;4csr)$k|c~*|cTQiFj z85lsu=Ds_od*Gl@--EvjIxObH^Y94yoyt@)F|HLyj6EqJ^VtYP$1CcZVF2O~b1DF2 zNsEk+XK-E4-|<*OTF!WvJh2Rxkl&S-$!zWP=GfvI&(lQ=A4pg^v7CeT#PfMHp$DL& z1OHqR5l+Hd0ch7bdrB{Z(5As3o3j{NaQ}VpJcXA6NP%urmRY3YX90IZUNX4 zn``WM6UtwG{qpGe^iJKB=W7vw;3BcowKTH$rQiB$3|u-J2cFoD zg;*2+>JR@-v=Jszz$heLZ~pdg@Lf-jj9dl7keKUDzQX#7J_)(Q$wQo{a87ro{7`&@ z(d)K%p(^s?zX@;iD7K&e;^$*>un*U3b(}bTJ`TVCVSMT{FUR!QcpM?zHF3KtYU$0t zXJ0EJplcjGN&d{E&!mD}R#{6D+VZGsSQkI~?ssDA?)}lWp(ScLT5<)k=HByXIQRzo z#L&_!l+_>XjRGXmmU(IoO2>uQNa0%;JkpEq+su4Nkw~1C2H0c!K)6>5V_zy?(uzjX zB)t4q(0m7lrk?ovspH4f!|}iT!(Y!>{O~9T7tmhQcE+W6c9sEyR^}@{4Uh*@&M9Q~ zc*Yn!tQWU*b8}1Lj`L8luLIxq?b#OHU03lu(*OImMv)Cb@W#N0GtrU->PEhE$Da9w z1gGUA8bxD;*OA40t#Uz+BM@P~?a7bm1b^MDLRr!+ZN5?wBDq10vq`TtcwuZ%a|?WQ z%_;(hiRM^)R=BLIuYJYC!DVLrm$atb$)pe-tkhSil);c~M8Dj`99)AkY#UKX5G|Ad zWI_qZw}lQ@bxkcvU}w&pX7VKVVEO2BQWrAOfPKZPL5Q)b_C{VqLkYVeH8pyok!R}` zjV9Cx-NZGxW$k`s@{LXX*J53_6TsiphOj3AXj6MLNnsml1kgyfZZ+1FLbqTat6WW7;W9zIXlP^%qM}74!k>k) z9|gk`F^$g-a%Sq)o&h$U?oepscFK}@D=b7(g|Bfi6^mq?Ox5+e7cwLnmdsqn%XApW zy)lq;wJ}S&EtxaJ_#gihw%`@QStKk$aU1CEi`U;ioq{&A=&^Qe6Kcn+ zJQEkZF$U}*95%8ShxBM90y?DsfUU6dOHX$3r63fS#XI*@eDHU^L`c4uHE7K)$Zga> zB}%?<-Tw0$ZxIg^nTSLha&ROkIAG_g8A2*I5lS8vV#ct?a_SurUss_>m`Jt~x06Y0 zDlUmz&YkBtznn90FP`QaoR@zWuVl>p?dN{#?_%n@(Q}xbqn5s(dwm|k2JK0ghIjDY zB;gzXG@IL1=b904hE!xmmObej%Oo!zqQa9gWWLi)d<$HiA?eO@Om9#RUp%dVuc4(n zlqY+nuO=KaHi{w!{i-O)yllH_$Ux86l3QP9q#HRIx{G3UHV=`}3v_r(ij z2M@&NZCjJ+m(shpk?iUIt5@RU@ptjoG^AH-5m)IX7P3uZJZ$}PcYn^s>891oeyEU( zdsyQep~)Itr@RRgXPpXP6$N+(dm*38#8lV7 zdp~!Lt|!+E9=g8t3W)2BV`ja4%)Ot(8gAzZ$wv78I6W8U;ib}9Bk^hF^)h74ecb7j z%=0!lTr`pakARRKOLGs9@<|I~;X??A?KMf9Hnif2=M**sr&?G)R z6&|{xkTz@H6U{trubva9G*n!RGSMu2Lwa_a8ypzQoErPH-vn-Y5R<0hHC{YEOnENG zp*Szi3KIpmFX13f2!nFX=t9dxAn~OOx<^8d5Z78PeD-D#!-TovEmsb=h`SZk1ujyUulw_^M_iQ}@6>uS zb5d;$hZTgag{m+FZx{>BjX9RUG^*G%5o)OkfLV!l)sb7K(m(?VTU+W%F(!2zSgHBy z{uKd7)yS@0;aD~_ScH}bAc!EUl8!4Ja9lB55i`knCJ1iglyKIP)J?7HR>C&^ev6IP zV<0k15SawRKDl=yq86`l4=u8B?)O;0HI($M-mocd-d~BAKS~*%bAlfQC3tY2|ebWtUc)?bl3uyeh;1A+a`RU;^@yzzdsDy!^IC(BR zeQo6w5wC?Df$amKn!;2>=RYaKm%o5#dM$WPGI2h-3jt*OSLV+~3t!NL=@tUc{ql!f zQl4nV<-NdNZs6Z(4I;>V`n~ddF>+%*UV7={Fy&f0rH!SVv+K%8OwIu$;9k6D9{m3Q z{!)!1IX9~C9!P{TYrQsFQ|_k=V@fb-!zBePE`b&mu5vU*pS`J*Tk*>vPF@F7RJc1| ze2Td)g@S*VyLNBkW}m6c^EPLg`VtbxBVF?SlEPIgIE%83!u2nVmdX zEipt$Wp;`KE$$A)+7=Fafo7!mNtCCp8)~BUOP@fYnve6GptNSkbMfAhqtS5jOl;h= zIqB`4w?2rb_Rdrq7f}kA!IN|`8cuON;<{y)IVtwRy_DwDd%@mn728oS;m93^{G>(s ztS3VXUKRgz-SWL55@VJsL>*f;#r9nlnStFuO)gBsgTqs5=x}%M7JcgHqN8Iy@oBP~ zaX)uoyvz}Jdk`SCap~|!RHcl@csm!xWeMgA zV(o@g(tx`|CJfif$25XeMsA{5X6YcXxIqv7fy-Cp#m~J&^6^(`Z#;$zybswyjWsps zQ;v@XZt1PZhvpnQTi4vzG?uyrtN@e=6lvA43J5)8k`PgzYl0U}ONDbyjFtlN^wIgTnc72yGJAtwibdsTq+p;<=GBC=-oT zE+m?2Hm(LMOxJ{cKxZISgZNs870c0((6GIKium(1n$LZNo?4OCn}S8b>jtUatmJQS zFop9N7Sizx*Z3=9&(<~wm8?C4amRYP27%bVJjh#k$Z%{L*wPs)C60)VLhYk-1Uk#G38&HAD9G#Kbr* z=!xuzbQ>Y){uF(vsjtKUSwN=0YoV~$#b-nGF_I#Nhi=4Ed(l`C($<+)0vl~gs4tG4 z8;VE?-N$K${KdtZ&0o_hou z!J{HE!j$ZsHp%f~o-?WiZxWs1gsGb(wM7L=<~aEe)6|nr#rdv5G-P6tK@9c(=T*z& zSD}H+#QpI(mLSR4#CM5T;VMISUCH>&f7(3t^?od=(IG7Rc2!iTi784y zEuW!CFJI1yRFo4Aoj)3PZSP2e+v5H5`1TLq&61}I)|KH7aLwilT1HwqDhqmqtRRuD zW&H9B*I+Q|^^+)#_fN@Ee2d;7Mn@Ytpp>+OTq zIg=erZIpW7A(F>Bwsgh_?&=PDI^RO^>A?u%0q}s1fSbgz_uh-AUivh`AHg#-8Rsut zhL^6QaY{$L`^L{uOg6@?6^-$&Z@fwLjOrMUwSxHbh87azGQ@`R4^md zabA2;X-)SxYm}$@Oyk{P4ER%(v?A~6fo8St4Y??QeXg%G*JPcmM!E07*naRN}YmN(G+r70xEtdapPsJ<2Flm<;`V;d9TTFpwhyzw?lX zkLY3W;i1DZi$})txaBA~_U%_iV>pME5vjQeMv<04GYiW2C|4{nfdyTsPF`jp@k4AP zx;3QhI<|uRX6#br-rtX#W0+>}>)8;fmPHD1pHXOq5-?yAkZhcSKVv{VWD<>{ybOzX zoX@c~9KVYu_#U4&e{(XnQTLWs6w}Z$Dl#GIKE+rzme5k3#;Q`oT!q^T5CvXS5`L=D z;?y{?_S8aHUzKGFxX;^(g*1@Vr2EX6=@`Q7)cGEoj!eX{(^r%6BvANYXLB6^e>z#A zs5rO9h0<(NVCJ%Z{yK!Ar;Y6BT#s9P6YG-g*^LJ)$c&1b z#%xH=8ien%#iHy&LX|P9)vXkv**FEW&n-c)DKx>rn7VH!G!{EneD=J?owA`rmwZc} zW4o5vm+{~={OArXRS?4hWDs+>{Iu@1PCUTDWAMg_Dc!s|mD-`m?&&t3wYqcL<|tX< zL?#&Ca^s7*wv87bJAFA8m)BwSdQR_5G_J&=gII6gp^gv2vu@Z-X4l%VrV&OopGj$! zw%r3a%s~Aw{xfRDu}Vh&{(llbKp0;>^-+w?u8eaRx`CYxrGz$_#G=WzmB@|fDma{< zLf6myr|XqJ@^eM%k`Pu%sa@Yis1{eMH!#ive0Q95^$J_?x^PtiCGbw_lMZHpQ8NwH zx2z|*Z0s6B0Obn?reeW%P-}{Sq-H+qRXkw2i!@#*8+;|gM6!_q-Lb{#=tO!WZqAXA zaT|{Z@t^@tSsJA*Z9t2f1MmB;Q?p5F&wuIrP$tbWj!N?7E0@wL(XHy*g+b9W5EUMJPX(8GYD}zdY+~Z~Iks;! z2Kuhze$9mdr+ZW`tc?=-E;nr8K!fJCxO;OkHtnX-2l#&M=<&G8k&(Jgg|#^W%W?Ap z;>3aF@BouqeJLDtJ!`0F%&5?)G^aI)#ReEzi_D+-;dPsZcU2LtShDzCn=n=p-nnB3 zIC2a3_%&KnB1qqUD-Tv^>f97Vm%2#OtciyG53%v*2Y~A-roIQLnHt*dHURL39CycjyXRHLbA9?yY_Ms$>pE%F#MIJa01NzVT=@t4p zPQaJ+%!wE7yULW_5^=-MYv!rs0$D*Jbip&O*Q$3_z84O8GL|eJp{IhRwL1q*l$Fu_ z4!SbiUB%y%zV0rp%-kRMzshh9xT7*Ed{Y=BU#x@yY}tbJ)~dPWed}2Jgq{y*_dZ1G zd^HNP`(P^Y7-SeEh6hzLRTMO)yiP^b*tQid%CF=RT$8d9d{s%3Z%Yk&QdMTTj5D!k z;>e+s^han+7r26Y5(Rv@eh08ecXBs61Htx`?!`t|EsZewB>YhYZEkss#9Z`h#P9viB*k>^u_ zh;A^SlGG)D*i7PRy8kSfS)mIOf@x?Zn-LV^sj6`*&_%l38(=R|q(upggpEwij6H?KA_|M;RBfG`qlJWo?CZ_g zX%PTRk;}3H97st73K!3Fw&BLw=Cyvx4@?_`(H$ev%h)GrQebm}G5XFW zh`4^wwc>*rs^X>Bh+pEH0~b&5(g*hgCz<642`-;|{!ucBDUBclxCsT*Ow3h!P}mDg zZSuTd#+ieLR4#AaH|w8R6xSHDtl-`?_|azX&qWi8+FhCqR8*kV@7sui2s6N)c)t`n zGIn{b8!HU_!&`CfdJjT+I!>SM&VJoN&+h;Ct4ReDS~Z(gcc2sl>(oZ_aKNJr<#LYMn?u?=T1&$ zBJpq;g3rborG%Qy$B>5QYq0r*{Q|Hw_RY-U4YrCkK}z9B)y0bXr~xP4H}~Gk1M3D( z9C<6=eB(;!rzl=k@yRE*Mgz=W_qTnbRfeq^aGz!B?!WX|g(7*AwQ9{}2^HUoYrd!^ zN?xmQHjH(jJ$H>V{1nvi1L1BS!6f_6fW*_sv&R2d{?6}kh{RC*@H_v2b*zj>!P&9C z-k4y$4bAIyZNz%cSHH!czVqE5BUr1lGuT}`0PFF*)#7=uQ&!LQftaRoiiXD`ISdzZ z123RBbne(5m1|y%_l{r5B(^eeTC|Wqi383tc{+1)&rRM`R+vNN-18dN>h)>aBcP-& zy#j@T%yPJvTiIvB1_)Y|dpluO5Hj%`ZO;Ud4@$qv33;1JW*z&iRSJ40|Ea*kmf;~3 zT0>xWD-iC;1aZ%K%2!55=uM9MxxKX+&nBnafoHBs7q?cs{LpLV7%NC9mhX!Ly4~mD z<^E=il4lu;bq$t`ijvOJh3MH-Nt&N4!UyJnkfg#|Sod5!1L+=S#}%eYbm%p#=M3P#{CyO?El?Y{Alo%K)$Q3kAQAr+^uk!HON%ZEQ3|zg_&4AT9|Wb z0fLb3pEuWx_b29kxuflNhfCH6_twzFx-N7xartmilaG0Q*oGJIFZa=M zI>u_x#K$m}4Fzb|a<~f#>0G2w9~r9z!QQy_gIP(}YXw=7-GyRE_uSX1KJ_i`bg1WF zdVTrgpZ#gB$9tAnkDhFf|Ke3IgP3mRZ{fc6%V(hR58-v$z^Szk99x&AYe-_neVRuh z67uOC5Zs09(4PT&Ij4J7cQ>@oJRLC>$t{<&4!G|qFRT=G^B1DOacOt&(Rz+k+A!lA zd9H+8F5?r;RgC(2xJAK~xOL?k9E{$3Us_TEqQ*5FI=KFbUdN}GQ*XYs9Jv3fjDr-> z#xY%Zp6qRn?P2fX0Ob*|t!V>q$Zb|s7T6s@VYMuqeFyGcKKiMx%Qs&>8D8Yhjed_E zeRbJY>)p!~hFet%G^WZ63f+wkW`WyE@(5r2?%KwLQqQMAqhoLZzlo2wZrpu5gw2J8 zbysLvb3+czUnrFJ2VeNprG|0KGavrYBxe4lU;KCCJ0)Gdek>*b;Z8YvyAz)dT;%#qFyETQ;=z6W4bwzy1%uP~7?A@(X{Z1~=b-VcB))@bdld zzOa1jTi;sledc39PE0p}3x44>_>Cn`kqffmC8?GH;CneNljPVsWO~Dj5pdCf^^Y9s z-p$Dl?~P%t;KD6`IT!8T_~E{?w$*e~#_bdDitc~*si`C+<6Yr^2cXO0$vuFAXJWCZ4E%mA~0EL;ktISDONg6CP$fd)`(4~51J zZ_xEv-7rb4BAdIqtH!e?Yc2+ZeE7IyL}O66Eph8S8eMkF8u^YwQRBXCwLoLtsU!HFF`C zm(nD}CHwBx*F)Ac%y*9O9Czr|gplztfgNSgZI4M3SY@5H?&eW>&U6ZkDS;6pG9Srb z?Qx&7vWxSyFV?a%m`PT;kfn6+P?_3w>v`e%?-fTZks;)=5t76(FLz6)-&NdJ{jb_y z%O6*$O&X@fLQW%XJ>mz}Ddz3CL~&Fw-W1Fqf8xp3nOihX%sTdEaS+~{LlEcx4p@zi zGVZ)EDk5kFXp1d2dsEDz7e)YCSKx$v;me+gg-4)4<{H++^(?u|C2pNhqdt1{)#c?= z%X0Gd@8mAcwcp&f=fXR3ZwJWdX4~I6!BhO6;2HSkb`qbqH(ZDh<{JCuzxFfBUsU#V z?Mg=~mLKrUd!Jc;^Y^|8rP}}I)9;m-O~Kro==`jogB>@XIa&xsEV@%w6NDXaex-V6I>9_uOo17`=x1 zU|tEL@l?bBt_Ab67tZvI;2d)hpCi03UrI^Jg4!Cc+5`zVoH8#5b=mhw5wap88jFq5l{E z*Z)^B(UTpgdUW~8|Isfj-}u^hmw)sRf3I?%gN5_XFJJwqzqfqy=YF~*wXZBsKJnmk zf7aUdDkC=Ty0;AQFL!40*=6^^dxp=Mqxr7fk>HANhqrSMa-UAmbZnzN z14k#Yp)Z~$2IcAjiYKKI9XzzVa?bPNe7qz4+#0{(NyO(VOA>R@?9E`AdN9v5-{Cdk z&AMl;GyI&eRQm#NR!eyGJmLQk8VqNYY^$kHzpDjbJ4c(HffEB{6%9`B1wL{|@aIE$O8Rj%h8DlB=gLWlufmj6N zBdOK;Zp{9RP`fU{d$DWPuyQ{h?qGvgUe2n_GPsh4-}9Z`=^)>V509=ZJFWo?QAn_Y`YB9PG;^ zO!!}F{kPsNJ3EDkTk*LU-@5Z%B}OF}9W0q@M~qKrGd0J`xGtCKfA#E^X;50x=1W2~omh1cN+-u7mfWH3A5&5ZL`q`Q}nq{|qJ= z@z&;~bJnI#8^SOpao)n13FKVS!dm+a&%B%Ru0zu9_`$XE2h`ER_lq&($)t}Kl}Hsr zuF1qZ^+-;DCM;fmDGy0rq_bH(qjWVB3eJke>WNc^6X5t89KTuK#?|J7_n3=)xpH;w zA<(S}h3F}mTpXpGWfXs6aa3J_Z&94LWvyLJh~iMUW7@o5m!rYS;b=?=tHxbD3;0Ii zsc=FfC_ybF+Kb>JobX2;L$&jSj64^-`BK*%dn=xnWq%j8GuROo}jeq+WmQ%-4zD}L2RP(;&D|NQM7CnCCsYA=t|Ng%f zPfdADITkW}<@I{i$D?+%ckg-nnL;hjK0lYMe_wk@U{PjyYKAMc-qj!?7tkACeLY+U z@9nK^;@G*+t$+5R5ytImto9V|qIwY6s5Y)ytoL*R@!WD>4K*lL+UXjPD|sWUW_Jm( z@lx$0DLC3bQs7RVIy1_=-r7!w(gS-e>fRIlJTH{r)!=x$b*!aH6aWI={s_bfgW>$Nk|pq3H+atP zp1-NXwSR?$wfgCq`Y{RuwFi%I31}uD@C;Zc29IY_{^&(>P*>^%B=vu1&b%E1PUuD5 zW7!69S_&;0!IDy|#j$3b*?_g}nehTj8#*0=dcU$n2$0nogF@&Sqs?7ijkzKchM0qT zTAGq<UQXn7U%16K3QlJtGx z8HNYQ6eccTNPDrlkLuF?=w@R+5aEqCURmD%!H+LbKKY)hQ9O{V_fVOrhl-nczdNfz zR^SNlUF1BiV&0RIdsRfO# z$LhA_o8S1_^78loxD#m}=(Dmy`-~e49yyf$L|NtPmXF3rUO#$#&RCYV@9b4R{Uaq_ z?W&&qxBlDT>6DbC%QwIM{SnY`7*2udYUSD?6ND-K>+RrE*9|V;nKQWd-@t2KPXE7) z$ODjBZWmDW*6*l$luHS31i;DSNFRUpy~__i^H}gdH=Yz4zD6P=Oo6F;xz@cf&%G&s z`?7|_yR6;jQlu!VaM~QrYc078c7%2R)IRS>!?DXA9=7g zj1MgT$$$Rq%f78wJ2>S%%jI_yQYm*wswI8o{=Lgb-v9WbKg~bjK z&%`6ug5Ijk#0fg5-tGL`_UGMjOr7JV@M3pODb_f)P*e4)-G^s@`zRN!!F!0}?>S1* z8v8_<1}25({kR70tiM+tL5ai&SvFkcDiS6>%x#^u8HZ@kDW+Lh0gQ6<%oC5!sbXLM z)^k&rFTVs$cmidgCB}U{;{-!Ydn}OXO=1kM)+EssdXo3Rx^)i$qSpE7$$EyhM!2IC z=7E$Qv>}dFteqtd?@Z5dSSt zW=C=bhQTWejJ<_3!W!^^(xbnhGx9k7~~Cpt*1F9O>YE>l09Vi1tn*R58v4jTq}}g?2G3w03sr1EKDSJDN7h zXFfC@02gz^m?ODyC0tj_+PzoXB>kYx;busrHk4-XJYq-$F&yJ3PM{zgf+9Q&!B{Lr z+B=u|26JhwCN%<3guC^Z^x{H3&wo(`GoJYpIF}e%#)*$sioXsDF*kB zEJBGOvc3rtui1xSzo~Ujre%z0#BhSynanz4-R|DW3PiQ`Bv{O=zlR~+`TSPa%EsJ_ zTgre=m!GlCH-NQYw9bgIduNnzXF-qnrWOnl-4k1n71__LiI`#`nHM@mB4w0!fq?=N5Z+V^UFa%TC`S6|QC7F#A9{>5uw zNWHy;MDa5 z`D_aTw$dRFm@alaYTXj<#EGKSHB+L7W#~xS?bd2E1!cPB>zx`h< z&wlzx>c72dd8at=>y;ik|MuzkJ+*wgumt`gtN!}6y;IGhk&;F^8v9TVxoW`}uI}#5 zO+p!-;d{Z0GO3&n5A!!%36jHu?W50Ev;xMyj-d&iEL>Z$J*dBFdPYcF&O~% zgrP}Lif-OSTPcjuAG&v_%ZVyH_GA&GA?F#tAKEqN5G9U_y8_vVJ27h1T6ZfRSZP@Ln%gh~NQ>c6uwK z!`yT?LF8P#05nZRnmdN?^YPt{y|{NYTCN>SLJhhX>YF@=hz__;59X?gM0w_=#NC*M6FQg{e!tAd}o6GwB|;2pHJpQmw7k>yjz(hjE4W9S_GOZ#ABM5$b?f z7qk5KUhjP6)~Tt`Jt86D5OA8GuWEwj03iC zpW?)ba<9F(9DKH>4DK#*_Qtic;R~q@ua3tu4(g{7{+ApUy;}2>R;A2w`@;hskhG&! zxQ17^Q}8Hq+OEpeVT6%=V!OOqlnTnDkcyuE-0|pttmUq|nQ`LSMDm1^u=oB#EGbV6 zA~+7U@ZQ=YBb1f-VrmkhxK%bM{YNM^eSUj&zr**smM|s|Z3^K^DF94(6k@n5GiO*_lRBrLcgXgl1^tUInW zmMs9-+;JOMvr1^$bn_)>cgKvP|3RXw0nbKwW(%%YHSHK8^+3`%oWWoxJ-t7gUcxQm z7gDi~!ODTro-H^pnMN}V@h)?^8H0gLSBhI;2oL1;d*ZQ&Iv@D$3I3}GJ%8bH$e)Y6 zxp_9lf#xj!EFpoFi-0j5Yc{O|Q}WYBHulf`{4b1VH*jO=hKv}K7v!`jLo|Jk2)IX9 zTRb8eL?+W>ijf)t> z{^6R-5t2D`N6$kMPk(!1qzKbjVBrgUW1SGq=kUBI_+MYcVK_g7&GniOmA zM~eeYZT(LepO z<%tx@Tf9BZ8SZa}f43k@1tP8;Dl^YVEQywx4S=~~JgLx+0zm*1iwav3>+{G4eGYMFA zc;dvaqcH=V4Tgvq%f#*?idFkuW8Cg*wJu3O5c>J;8&9VmnYv;E)+1={J)!1#G$9(2 zt~~DLR+%J#n3-d(GIfS{%}J7gO|hZdnim(Alzy&wOlit7+W4J)$Lc*Fle?U|2W$|O zGK-YC4kw6-w3-8D!|vIq*~6xiY91WrXkReiRL1%PpZ;VGHy)XeI8!d;xvd?MQ+2$T zkVeo!7=*|&;qe&e4v~W!>k0$E*&4O_!{BIVMW%)sxPOhwhb7$$(i;=J8#;eCzj0NoGneK`)p~+lt(77H#20JSyC?#lDne{);SY4p`>`?nzL`+mwI>Cuf5*$~ zIG1v!UVHZ)=7TXkQ2n^MKXv4h<$wF{{q^Pl@}K|x<@xGVy>#Neuiot3l{`7<0c_D5 z`UD#m6#!BGMmY>_Vcy`_xT)<&*TVI?IC;7_yyNA(?4=WLz8kVXxP4W?bkz{1z>nIF z*;h(2*gGzewYx3c?AGCT@SK;;I=Z_~qWi2dA~>vCa~f z32k5Snbo>s2@%BF=T-t3Pavd>0S;)8;>2K?Fje~t7Rvbuxkzv3ruN&q@n+{<2fdhi z-n+))A-j>FZGyni^+GH0S)Kpzh}A0A%LE20no z)&%hH{^3`auYLdJ<=_8nKUsY=C8mh+G{vvU%Lv(WM zvJh9Lapj>reyakR3z>4zoVkB_78xCA>Y>UW83Y>o?2XUC2>i@X6A3?cNz=diW;rA$ z?N0cUA=aG6d)M<-B#h9=8)d+T+ z=gaanpxRm&G|!<}>4?X`1XxXm=Cd&>;8lCv{B!ok=lZ+$%9N5vAAO|x|5-dQg}rB@ zbFygjZO9fdFhZM*8PmAjjMb?-9eU~Z<}?3OuC!xfS{R8sRf6SeTEOYi)bFp?>gzAR zSUqx@NMo~13GdCDv~Ogkv93d;Cacj0L?`%YVhEK+;vc4cvrI>G;W~z(1kKfuij{D?JXH04mSsEMi^r#q6F7)PetIdU+nrjgHT2xM4 z(fpd{G+PK!XxEcL7crp$kP9%Q&531=wbV0>>sv`wfneEHlZj_P@Sf#2KUa-d&oFla z#9WW(-s3Jh*ycX;(0Z!To?_lyG|mYQ1cPLlrL52m^;CW0iN^;ijAKKm2JaGWjytrz z+9AtWYa!KW!95G2jaAj$eP+D*tl#5KO(F38jbIyQ%~}Rd2yN~m$Wt!%lnGoN=1}sm zr{3OqS!+DCaKzztes`Wf&r4h8I?U?~-_~%ma?1KwkvnRY_=@4EHIq)J%k}#x?IB!xOV6E)(s{~oU(w!RYDxsK9M)&_N}b5>+i;(t}Kt&zHrB;>m4C^ zX8C)+_Sv3&dHKv|KD8Vxx$4Bp3(KRm|GU=x;-Q$S*D&zb>MwilS(D|R#YE|pCvmnt z;*z{x&Ev&l*qYDa89!Phk&pcC|NV0G`03?q-+g8I`~T#N%gaaCcr!7*C)}4bv!z5Y z!VS(+l-7hRJOIi~k=9s0U z4Wg{~w~xJ9JpG|8sRUg6L($;+6)xcYvG;1{XZ+xNy^cr@pgB8%FGTORDDrXkGvtpU+r!<$q=>+rr}!^nPbT>XKK>)TCI4EN^_@9;svZW9)s*Rnm*4-w7nes0L5|@XJUS2N28F7&%13FvVTe)>05C5Rif9#yT4}S@$%d*&OK2 zWdZ5UVM|D-9EnhqIjCgeNUmm*>5*zUm6*_+oT@~5_~0{X)nzGav$mstgOJ9LvA8tF znJyKNkVJN==X~UoKbFN4>;r?O1bjo%1LPlg z5EG?l)lS#F_P6oi0wzar?I=FQb-cbH-ukj9;7PlenZ0}WVJ`9I8t5fN@ z({j=Gt+(wMSOOTl7{K-aVNOuVzkUxs^tITXzu@CM12gM&y0V8?Us1m1@PQh?w_k|N zK8=uwkgrxd&J|69!E?<7SXJUp8gQKKRGq=&2;KA135MbvTrY$RUR-}>#^q>VwQZ!N zwt&Iu7hig%#szB^E-*V&rsX~NC|ydajLClUg;$pU&HwSgT0Z{7o)UEGn>+`T=OJiR z&u5YC%EK}qspbLi?H8*>m$!8J!5>-l8^Zlf8~07Jkyw{Lw>@T*0ZPQ_6Gw|d?^>R? zuM>FQ`^n{B{n<}1-}>I0%U8em^76&b)jjs+YgX3JzkEo=eRT?vDX!18W-S|a;=>2J zazYCBvG@KakimJBnf`Wu^tzW>XDJD4r32JhnCK1eg6|{~wU-1jb!R=DXx&?b;}@O) zE?_r!)E5}3=QW+Vm*B_4c;$}0Q~pI&2C3#{xH{6aqdm)lhOf@J)stRQ)#>7@O7d>? zH-!rAiM3MhQHyM8II=B)Wk2kWCO14m@OPVPiSFNbs2=Pw@h^YzkNZ0zgeNsOaqdwR zn`=>o*4rAo_h$J9!>O%5K|63N_Ip>sz^}NV;rpTD_fI^0pVgMJTgRq5{0^UHr4qjA z;N3E?2^~UtctX!&%;0bKY?SI?<+&d0_EcO2-&y6rK2$zo!96&)!tHbOc(T%PjXkBpzNTVV8WkeKr3@o22{U z!90pDz4}&ySa~Y=G30`GYn)g=1IxH9_~_hO+LR;0*BAsc9%)@G=Cs}v8MI^mYk6Vt zkN3jA8zt1;C>;9CqxUVpA9|rLO0~_}>;wtCYusc_Kyps2gO>peg0JpN!E4%nupME@ z-+#UOHxFp`qg_DQW1Z9Z^ixkQk3R9_^5sANvs|PPg-EN#voW4+ff$b7tb^<=0VD2< zaoagY4n3HMu0-Ohgfoj`Yvls0bO^EviWG;mG|Wp@R%>~Wfcr(U|h`5!dpj$eDrg^yJv2s1eMeLA) zHAz4qKG$CB<6=CM^+CfY2m?wUg1RDYKhQb8o!C*wlnt6zhotAL!-D`4)oA9DR4{OH zPA%%5`N$_b`Q-jtr#`yo?$CM&KSbFgtiyikkBayx0wV;C8!QQ2LQnR%-@e1N*Y`2- zJ|{$cPB3HA!V;|doiPt_J8W_UR=BdhdT6h&eCdnJ=YR8WEl>U6&!mkOS8uGQ7HcVn zlqTw#JPeR&>Y`($ZNOFj!&B9a%U)|cj8HcQ9dAYv(8VBxghz7Xm2r4-1`X`U~#J{!FLQ{gNaJYjTV9DZAqie6xEx4UK_ip>e6D3TO`}#)gc2w!H%Dc+q?hM;^bKT#%b#AQO^D$_yX?$Ulx7vHWN^f|4OKs_y z)aaOP4N!+V&>tQFkoo43_ZWY~JB}YRL5QA9{NE z(l?)99_svKGI#TpvfKo;Cy3rnkU#>B5q6|8*}!2xcaWH%aoUdWNAqe!A?2;yJ=1_c zZSZWamZzV5BI0@}pwt8Tz~K={YM^enInaI*eFoDLa6QK|N5BUJjO|tk?d(WQTel$Y z1cx$P7!m_g&BrE#>wI`n0V!YeNX*NVh}9?<8nR$9Kw)49gqWSD;Ta zMRQ_lPh1%sVlw_-T?`N|?Iqw7P+$h3Zq?3?6$&9X6qB;C@8&_!CB{0v@>Pr!=>m^$3&idJjU?Tjn z!kgC!!z8isSQTFK61)(Dd1Ep-;2U+AIuuvmzA7i)mkwK zYX$c$B_JLt)+L)(GL^krU9sU)^rd8m8~#L%J}#7e2G-W>hr*~Qx$IssFYa)A&k75) z;d=GTwY_}e;Uh7y-ODfit3S2;pZ}AuH)c%>I!5ta?Lj5{jVGuzq4&Z2;L6j*r9H=5 zT1|M&jmS++hz;&H2Z{wR2B3@cje-`ws4avqn`1&3ieW0(!i@HYzk3gMvd_WFO5Xp_ zFtE$jWa6AUO{uy4_H)lI|K)Fd9@yvg)PuFMjkbo_&YqX>CMG@>jkX)h^6hHFx%@AM z-|zq6hnMHR@x2lpS7Cl+0bG!F!?o8x5azz{CY3j3Wg^SJ?ZW;3Tw9Ir&^ zaPwRf+wdD34bSCv;JuV^pHI9#xQ)9Sy(T+keuFVZnS#SJYGS+~lq^T(3LTs&!<$l0 z34Gtvs{jT=IZkzRQ+w9N1W1|)%M&mxwlPN-h+$yYXh@*)5>fzcj#ywO`EyS#St5bP`F6iqyWq9#XZ2k z&t2*>FNg_=ywv7ikC18O5Djo9xZRvQNX_obT)HPhv6)PNLy&b{WzoS8ylOd?oLMG^W@K zlk$|>Prm&1nBeyFPBOB_8TW-wi`RNp@Sq+ zJSCNAT`A+AJ4-Bh@Ve(<61+m(U0{VNNY0ZKq`MEsq|^v3ct^CV+*enPeY;Ca$?B35 zfzhfs&=pOY-VgoYGZFB$nrnnd+m6lQ>p8rJ2Dk`kec`>i>(X>Kg+gO|0$^A4C)o*J zQy?jv+=3EP-~fI=fxiHy6nw#n)dfPbYbl)Q!0BW@-zx6Y79h(d40B zo0og{bll!OA6!0EJu)lmrPtnCKKt1}F3~AvuY1G*@utTgelU88A7n5*`p|tN2wpjU zZu#5)@&9W1)F(c?Y}j>V`JK=G?(*_0uXM1$2bVwp;#Zfi=Zzs`->tdGu`};9&l*zr zIlO;4nfKtn`}QrHgCjR8CLkkU41N+v+j#i2Dz>=5fH;rD^-4;_niDp`1nu6uE%Q}~ zfeSQdyu0ML_TYS0(%zJQ2~?U**yoes2VNyk$=$3e23RSjAwal9H9*-@sU8^1uGjeG zdhzy~8}uDmLlYEbJQ6d%o8`PAI$DKoO8m?#5#9dcf732fVrzIZf-pgIy5=6|%H9TF zyvMw(T|Un=Gb&UD=O*bi3y+5f$*}y;jxwdYAuV}8=z$U^Ayux%mgX2$tn|_K8f>sm z(f_(O)JRC?B`W@`KKek45}bVV&11=mRbi3+-i0aadsF&SYTFAuR({Q)a22mxy?hDT z1pi%6fbLimi*N36=-JEj2}Hc|?RV5J$NQ|C7c>4u&Jn)W#+wuPhu;YeSTnpQ+|6%q zv^IuTxJ>yFdj@Mti)I~oBAJLb@rJ9x>VbO?ERQ{q@UN8bK;D{?<|15-qX%ARadz`+ z9rbY!@*=2g5SJBg9^zp{C>Uevf)QA1zyNot)!WxQ&E}Jz{M7QZzxY>|U;S@>bNPX? zG7x=BN7 zPS!-oK?_o z!+RDt>D`S3AM21sD3M42U&8_x(W==u=inQ%e?=aH^LJ0_a7 z%(Al&1OUP8xvXr71PD^u!l^XB;|VXy0!HcD-6coSD0gM4vQ{zq)ly1B4}q|hNw>G| z)(9Z8hixMSoX--{*EX%;htUeVmZh}o+Rm7LOeN;CZChQI_8$p=$|ee96dpKr?1kn0 z8-L#Xcg>*|V>QM6R(D!^UGmHQ_jS5c+WhQG>mroTpMSjl>$IVY(O^~Q|tWU z;~hg8!EUHV^_`=y7UNel82+_R#Jj#$#<&Vf^M@^zA9%XrY*Z0!LfTepe^%wsRS+`L zYAlS=dm4+edyE|z1;%sk+&+6pt6t-It4kiy^{Da%2<_mMSHpY`*FShVF2$J7wqF;| zU0+^5McK%T=s7!bsqM)!LrUhhqtXz2drRp}7Q*>jZ(dIDUN1pSjzY7HNv+DL!zw^P z8OG7$@(8M-bP5wPuum6vKe))}m^p6w5vWHjLQ9g!&H>SiD%F?o- z(!rsZTz2;y>b;~E+1~A8wB<}*F)qq0WtLWt>0x%P#7iYd%I>CMP-fsS*ax1$OM9R< zdc1da4@Vz2a*K+Q-h0oz%fp9*L5j)4#j%wO{bzsox0fTK?4J7gp6je-?K!dY+vNv* z>G|W!|Lm`Pbom>9^KUNqcb@O}zwxDIYiaj~x8GPk^*{WvqnP;_dU|HH!Z*QPyX3*{KXfRdmnkCHjFO={=f8kB)NaM`8e7Xo)RQHCi9AB z@GFU7V*0`b_Mi6vOaen|ri@gNpJGhGyqbGACYb_T8`=c6`q%9t*sU7s;I{helgt1L%DWPDI^^kj&DgN_&ab6#;25JEH_pXM<``gi zy=cbW-jSVavyBxO(X1ZL%04$ihG2Eg*SP6i*f>)%*?hRvg@y14hQ-zBN3N1n{wPCd3&HHIKfcNeJe0D5 z7M%Jfr-tXr`L$fmclp

NO8)i~XUPcnvRVJ-jQ9JDh5Q=!ERT^P0rq0z+=-sJU$4 zaclX+N1t7O?H~W{av1GEB9pxtBnSqCj6on&h(;r@A@QyL&qd85i}2GZHb!Xt>=4ci zAxg3lujR-8=C{7JeCXK^EkF0uKfZk7cR#;8{>;NQ`p$in5E8#yt=fbKbG)Zue1hJy znK368+Wt|@I3F|#sz2G&LN6(7CwSNRn zd(<=DJ(~;eY#FgfS3yPio1e@|F&WnK-WrDx$}AZ_Ykc26HdfDNVT}i5ey7O9F}G#) z?GDxwZjN{Qio+GQcSPXrj)0psqA|r&FaB9$^>>64Vh!;?7A_ro%S|=#+)`3Ra7OUr zq7Oe1vk%YqXAQmg$ub|sJ%a(^;@H1SJ^yoG_}cQ7fBa9EBZu}4(ZIL6Lik?@|WFFi=N(+G9$b5JH0tK47}m zXYYF?mbtuJo$Js~{fe(v!%BGHD67^So`3CF9j-poSz02_3rY44}M_z5C0cG+YzEWmp}RZA1wRoll|HouP&eZ^rx1Ob@JHmz0pzG z;OE{wkxTmMl=3|L1CK4g@XP<&D9=Cn;~!l9)BouIzWmZJ|7?oh*#zCSsegVak z&vt;tS4*)zzU&V-qUutII3%5OYvcCy7 z7CQm0dPUv{SpnZJU(@xfuuo&5B{W6xK@hB1KlmK{B!~$@iUtGavB#d6L_uDL@4fWx z<*hf~Y}KtfMe<-LhK>B_{#zMUo`1f)1wE;Q*tnEg_4bi>YFzKhx}k$$X&=4kts#TR z($INc#Y$BnAiJ{2qpfxO<>vsMBftTu|@-f%gWW+sn6VZFl&Adj^4B4|(n;s<6blnvKal zYECwY)wv4QHIsH?UR}2(>lov~2q8H_hFF9LtrB6ZWe>SetpkACjMcrIYm6%-4G$5y zPkaxPwaKm_SZ%CL9;&)?9U$Lzp;1i6P1~H6r?4*)08u?z$ZJf`FTH@cUx^45XT%P z6JVTP)^jm}nr=oX-sx=Ow{q{inG5E4-Elg~t>hRPhpal;qhldP6!vKLDWOXHlF zlF_GW`mO`_CWK;k{X6mUSC;F?zg@?oG}!KC>C?IirsePO_Z(U5>l|wpm)jEj z30&@^+c9VzqwLwvisldO+qyjc^wZ1RHKPB+KmKy(H}4yUFR=n%!qxR>RYJf#RunM$ z)%V^Y-ucsCfYi%A3?9$-UFUQE-MuhoOSppJIzFAM^OJ)CqMo|rE*=Y{@mBmZr{Ep_ zgCQYE%a$bQS*-o}ylbrYcEVC7C&iM7MH^I!R1?GN*~4^9wwF1$&X2i!kSFlE-1W$) zX*4%qPYg4q?nFu(?S97S8Qj~q6Z)9KjMMsdw7(eInV9jLZ@$xk0lTU|P}+1Re4v1v zJ8L0^8Vq=oBKg*EJ>gQ{-JVOCSVKW5Aif(tpy5%Do4YU;OVWK{B*6x*f;V?Oi$gb| zQ9PneeCO#W9$r57p{HVAJ8Q*xV)^dt)jxOpzxQwc{POcZ{mHDvESEERfwGX^c<0^v zpBK+72jSagUVrK9FD?J=fAibRfBj$n?$p%pD@;HUx^(ib<^9h*R%3)mms{sgEDzte ze|hrJ`e2yelo@Eb3@ zlKT=~OjstEdJWGA3h>|htqHs(-T00YYT@pq{8L1PVDPQJ2)AU$Q^Geb58i)I$`N{w zeuD9r|MWY>vhTS1(La85hX+t}?Stxz%e@cWVTif)SjnXZoIbq#n-;GeD*hgzkU__+XEf4B;CeGniKau zF9N&aqG#e^43M~c*7!hW#v(@(MOO^aM+tHCzgyF<)+jz`; zw9Sdx_N=f5Qb0mB2Eq-02M{zVF)5JP8IWl&;%YS5&Bc#tUDmcSB=c;{jL-*oE#N$7 zm|234H9(_d9Z&bIun2+^^nef9Fuhd>%hV&pxkSaxBr7;=W3^m!)D40K+CUX^3g!g% zc5dk4+<@ID;JzTS`Gi^DN28St`Sq0mPw_aM__{Qg!L!HDl zc+@&?w+@+}u0@0xKTibVD~tgl)yid_L@W~G))*Q1>8p!zI01@9w_)qKo+s`F%_w{8 z;t6i=5a|$df6!J}B=oBfJge)unZX85yPlZ9yzVMsO=n&Nq%nRShP5|$Ppidg0u5vD8aQmu z=4svL#LFN-=gv&qm)6xh#*JzA?Z4zC!dxu>N-oBU8@CTPZ=9O_rW6E_5xi>9&(?ZT z>(*O6b9;ig}`y2np^7nuJA1@D={eJRn8MNh;!EFu@zs>j%N@e7XE|FQ3E099cp+~fu{gYBa~_wK2gHNJ5kkq_ z@EMDinJqWU7(Xw?hqE7WUH+HO{`P5H6-h(F!V@L#}jQLEHAl zc!XHAtYd$+tZ2RUHJ8bd?*?=O*WeX}F^78dczgM;K9_f+*Zy5wtC2sxyszUJH*L&) z93F3NE(1w!A+PSGWR46;Fw3gnw^vKo*4WsVxToc z_rSj0xqZ*_@=M>Z6Ucj(_y6Gg>mU22`gIoLNrS;eSd&~%Gj7ZRVL}E%5W@H#BZb6} zmj+3r3bb8CQ(4Owss(ZetjIijl5z4Tz=lX0ccUoifvhkDwR@L2v z4M+*D<8cUqFm&s+261@ZX-;PupFDA5I`o_`lX>FMUAHq$P;$t9rSk8+_tD^01g6nm~Vns8&XXuGe6k0vTEw)uB0MpRv1Yx*Lk&S9hE+BRl=ZT-brLqK*Ce{Uqcl!!ZSdNi6?o`C$9f*xo8aAEjq$6?<8_9+ zx3iJ$$KLWC4mPf_)psgI8MTm|3iD0#~yuP`M`T0Pe|-tzWdtSg^tcIr*h5TUl*xem4Q*% z;fzp0w*&9Y4PLJJ=1D7`WldQ#D>#tN#jYDgBnGYQ=;f^X4?g`wYdW<2tzZ3}84)zd;5FUcxig9pjSk+dn3ypQ`l+Aa%T92!qDM?dg=!Z!F{_-dFxPeNiZf-woczr+PMv91mZWA4ZROeV_Gw_^(Wk z&^BLtv85K3Z~@(sDG~(_v~TunPiw}LDbw)L_2xNpDY|4};gjSEzJ8aN1hP>S;2M55 z9@uajd>!{F#%z4_Z|!*a^>QT+=EZpWJ&!D#jvUqay;kPPn(f^X9K?ojbFxU|t}V>g)c957v`)f1 zA>T7-KHej^*{r_vo>GBvPEY9s0VaY$x@UTxwu!7^8-U>u#)N?qtu^^)g(E@{`;d4c z7NWU6t!{tXBtd+%6xDlb>Obo%_OPQmNQo21IC1i1zgMf-TEzq>ogLzbT!cI;8{)3> z&z;m`F~L!Wf)MSDD;uMp!g`FoJq8!Zq{)dBNr2NnV4{=~=UI;O)829A+h!IYMkxM! z|HF?KPrPS2`t3hmt{i`%M49{7SW8S5jNU0u%q?e+A*OC<+*uxEewe=fpyh6kFlfB~UpTsa?OQLD`CEKHcc{4;Y??9vb>qVw>%a5otZDGr+6J#N zi(u=D_KIM;d*4`uhUq%@7=wFhU@&wLakk$VJDYb)$tY{4HU%POD>w?Fh_xepFRo&+ z#~@~~KE5%;c;~aOxw}u}k!Ua7yC(N^kLy{3?XP%~`Cwp1pDt=m-Thp4tcccrKKz4Qu9=z6Lcu3xHyBa?*Yb)Oc=NxM1#mTnc0sa^pJLA9f-Ih^ zDO@LOOme0KDR2_2#dOgpB~JFXGOAfu^HB2)7~|4|CnI?61)jkbD_3A;XamOHONzAL z;GlaH{Cwo$BhwT5&%gBL<^At_dUyJN+}4Xzr`njVyw-V zIHZIU5EMauq$vmzd0uObAuU1E8FF_Tb>`Ks!c> zy7S4ZJgd0amIZui`Jtzyv#i2ze&yTCy$|JLzXPLjJGVc0Grl~EXh4H=lb;e@4J=zb zp-LIM91pwP{aRUabAz#Y5GI2)-JtgXm1IXf3Rt>psHDGBj?q8dVePSSSD~G!DkDMJ zXIL~s?%m?*a1VXKSupn`3LB-8Kqq*WOReAwevN zNYfKLHE)@DJ|h^FS$S_G38U$d)EMF~)-{@9&)=2MdEuo5Rmmx0Vqyb`joagmH{Xh( zaZ%B%SVR~`R#Jos(&oqQGMZTMvn{kji01my5JS+ZQR_Pv6{}R77eN?nh`k%fb$Lfy zoD5fcZvR`D`^F2<^TqX8piUfl?D5B!EAMs`+BZL+R=#iW1GBN02-|Us7(oaz&x6Pq zuRT%b!7XH5_{Ih0G!#iGt3^UMtnMF5T@zov_S`GQ!CAm**ceuy6RJI`=S6tU)m@N# zU~*@_?&4K{+CbPczwPA^M2j4uX`o)SX8-H8cG_7Lpxap`yZ0Vi9<2%f@tR5adFhQ4 zDNr$=n&_V`iHHzZpX-@o@IoGA6{XPl%pQ8YNw-b&TvizTB_!@LQ5U&>tm`f`KX3w9 z$_Y9g<)MM}W?%m`e&1Wyz$G{gBgvvzd(UbT#bUJw6gC*pdiz=FC#5UA-I0RBjkdva z;|UbNrZ&tLLmL1Ed&-s0TsJ#RMc#k}qmwbW6P2}`N%*S$mc@Iftld*timYZ{i?azw zUAF85rEn~%p2gDg+%tVIEH)Xr&2DFOHFVdyy!X1CN6QIMJ4y(1-~?E$ecV$>gOfRf z72#pZgXiA#0^=~ICGiYeM7HTTv=U{F-SjwSWr{T*Qco-F4|$^Ox={j+8J?v1s$ z-7!ZJ{=m~6N)=BxW25Uw$_yQ;d%6_jx7k_~SJ~tK^Y$u$WkFq#4tL%vY$9rVVJ5%?r+Zn7> zU5G1>G9BJK^LXN(jj0}%OrUHjF+y{~i;RK~KKrq$OIP8rrvnSD=X`YZ*n6HCUh~yI z|D#~y&;;dOS&k_Wt9M~tn>}Vyu14ERKQ0{FXpwlK#SVS>F1X(|4H$cN1t6T=YGJvjC!@rp$Qp-KYuis z#wB>24~!9Qi^=Vb=_6`o4_9Io2$~C-c7{P=LW7jem9QNxs_)Hp7$Ykalj>T>zR`kq z_Kb4@hRANvotB>`!}3Dz|>Iu-58S7f9MXX?5e;4sO;$gX(Sb z%8e2B?5)@HQ}4NdIo8Q4x@X-ill4+DuJe^YTqw>X;S2&H3~Ld)=I&E-w(d{6fVjke zn-@>OXnJ=x%$hw%@8I2?5v(iBnHa-lx<>4?5Y`*`*iZY~4|lct>YJ_icK2|ZlvZWS z?^t_f^p)7~%J;q!;sw*KSuV+1_fdf6x|En*J7j!kQG~c)h7f4Z7$QbF?I4lzA7_`)FfpON`AYA;RP? z1R_fw;kXj6OIOQ!@H*IF#;0CCxjg#Vlgt17mw%?YU0z-

h1gc2t2RP%eG+=4eM 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 z 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¨6VW%vWF=MX*{IgkHk2e}oN-PbijK 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 a2mU`>iJ4_DWrlJ90000 Date: Mon, 27 Aug 2012 14:11:59 -0500 Subject: [PATCH 200/695] Completed the average color filter and created a solid color fill generator. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 20 ++++- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageAverageColor.m | 84 ++++++++++--------- .../Source/GPUImageSolidColorGenerator.h | 17 ++++ .../Source/GPUImageSolidColorGenerator.m | 81 ++++++++++++++++++ 8 files changed, 173 insertions(+), 42 deletions(-) create mode 100644 framework/Source/GPUImageSolidColorGenerator.h create mode 100644 framework/Source/GPUImageSolidColorGenerator.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 0318de648..83bea7bea 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -84,6 +84,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_HIGHLIGHTSHADOW: cell.textLabel.text = @"Highlights and shadows"; break; case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; + case GPUIMAGE_AVERAGECOLOR: cell.textLabel.text = @"Average color"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; case GPUIMAGE_ADAPTIVETHRESHOLD: cell.textLabel.text = @"Adaptive threshold"; break; case GPUIMAGE_CROP: cell.textLabel.text = @"Crop"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index f61ceec1b..e3ebb7658 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -27,6 +27,7 @@ typedef enum { GPUIMAGE_COLORINVERT, GPUIMAGE_GRAYSCALE, GPUIMAGE_HISTOGRAM, + GPUIMAGE_AVERAGECOLOR, GPUIMAGE_THRESHOLD, GPUIMAGE_ADAPTIVETHRESHOLD, GPUIMAGE_PIXELLATE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index e9c9990e9..aa4386cd4 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -311,6 +311,13 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:0.2]; filter = [[GPUImageHazeFilter alloc] init]; + }; break; + case GPUIMAGE_AVERAGECOLOR: + { + self.title = @"Average Color"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageAverageColor alloc] init]; }; break; case GPUIMAGE_HISTOGRAM: { @@ -1169,10 +1176,21 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } + else if (filterType == GPUIMAGE_AVERAGECOLOR) + { + GPUImageSolidColorGenerator *colorGenerator = [[GPUImageSolidColorGenerator alloc] init]; + [colorGenerator forceProcessingAtSize:[filterView sizeInPixels]]; + + [(GPUImageAverageColor *)filter setColorAverageProcessingFinishedBlock:^(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime) { + [colorGenerator setColorRed:redComponent green:greenComponent blue:blueComponent alpha:alphaComponent]; +// NSLog(@"Average color: %f, %f, %f, %f", redComponent, greenComponent, blueComponent, alphaComponent); + }]; + + [colorGenerator addTarget:filterView]; + } else { [filter addTarget:filterView]; - } } diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index f19fe4819..f10e64c0f 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -202,6 +202,8 @@ BCB6B8BC1505BF940041703B /* GPUImageTextureOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */; }; BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; }; BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; + BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; }; + BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */; }; BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; @@ -486,6 +488,8 @@ BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTextureOutput.m; path = Source/GPUImageTextureOutput.m; sourceTree = SOURCE_ROOT; }; BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCropFilter.h; path = Source/GPUImageCropFilter.h; sourceTree = SOURCE_ROOT; }; BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCropFilter.m; path = Source/GPUImageCropFilter.m; sourceTree = SOURCE_ROOT; }; + BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSolidColorGenerator.h; path = Source/GPUImageSolidColorGenerator.h; sourceTree = SOURCE_ROOT; }; + BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSolidColorGenerator.m; path = Source/GPUImageSolidColorGenerator.m; sourceTree = SOURCE_ROOT; }; BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMonochromeFilter.h; path = Source/GPUImageMonochromeFilter.h; sourceTree = SOURCE_ROOT; }; BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; @@ -665,6 +669,8 @@ BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */, BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */, BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */, + BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */, + BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */, ); name = "Color processing"; sourceTree = ""; @@ -1124,6 +1130,7 @@ BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */, BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */, BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */, + BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1366,6 +1373,7 @@ BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */, BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */, BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */, + BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index ac1b3a5f5..37529e350 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -119,4 +119,5 @@ #import "GPUImagePolkaDotFilter.h" #import "GPUImageLocalBinaryPatternFilter.h" #import "GPUImageLanczosResamplingFilter.h" -#import "GPUImageAverageColor.h" \ No newline at end of file +#import "GPUImageAverageColor.h" +#import "GPUImageSolidColorGenerator.h" \ No newline at end of file diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index ab05cf4bf..ef4070499 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -96,14 +96,19 @@ - (void)initializeOutputTexture; NSUInteger numberOfReductionsInX = floor(log(inputTextureSize.width) / log(4.0)); NSUInteger numberOfReductionsInY = floor(log(inputTextureSize.height) / log(4.0)); - NSLog(@"Reductions in X: %d, y: %d", numberOfReductionsInX, numberOfReductionsInY); +// NSLog(@"Reductions in X: %d, y: %d", numberOfReductionsInX, numberOfReductionsInY); NSUInteger reductionsToHitSideLimit = MIN(numberOfReductionsInX, numberOfReductionsInY); - NSLog(@"Total reductions: %d", reductionsToHitSideLimit); +// NSLog(@"Total reductions: %d", reductionsToHitSideLimit); for (NSUInteger currentReduction = 0; currentReduction < reductionsToHitSideLimit; currentReduction++) { // CGSize currentStageSize = CGSizeMake(ceil(inputTextureSize.width / pow(4.0, currentReduction + 1.0)), ceil(inputTextureSize.height / pow(4.0, currentReduction + 1.0))); CGSize currentStageSize = CGSizeMake(floor(inputTextureSize.width / pow(4.0, currentReduction + 1.0)), floor(inputTextureSize.height / pow(4.0, currentReduction + 1.0))); + if (currentStageSize.height < 2.0) + { + currentStageSize.height = 2.0; // TODO: Rotate the image to account for this case, which causes FBO construction to fail + } + [stageSizes addObject:[NSValue valueWithCGSize:currentStageSize]]; GLuint textureForStage; @@ -115,7 +120,7 @@ - (void)initializeOutputTexture; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); [stageTextures addObject:[NSNumber numberWithInt:textureForStage]]; - NSLog(@"At reduction: %d size in X: %f, size in Y:%f", currentReduction, currentStageSize.width, currentStageSize.height); +// NSLog(@"At reduction: %d size in X: %f, size in Y:%f", currentReduction, currentStageSize.width, currentStageSize.height); } }); } @@ -163,7 +168,6 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glActiveTexture(GL_TEXTURE1); NSUInteger numberOfStageFramebuffers = [stageTextures count]; - NSLog(@"Number of stages: %d", numberOfStageFramebuffers); for (NSUInteger currentStage = 0; currentStage < numberOfStageFramebuffers; currentStage++) { GLuint currentFramebuffer; @@ -176,12 +180,12 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; CGSize currentFramebufferSize = [[stageSizes objectAtIndex:currentStage] CGSizeValue]; + NSLog(@"FBO stage size: %f, %f", currentFramebufferSize.width, currentFramebufferSize.height); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFramebufferSize.width, (int)currentFramebufferSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, currentTexture, 0); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - NSLog(@"Constructing framebuffer at index: %d of size: %f, %f", currentStage, currentFramebufferSize.width, currentFramebufferSize.height); } }); @@ -241,42 +245,42 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); currentTexture = [[stageTextures objectAtIndex:currentStage] intValue]; - - NSUInteger totalBytesForImage = (int)currentStageSize.width * (int)currentStageSize.height * 4; - GLubyte *rawImagePixels2 = (GLubyte *)malloc(totalBytesForImage); - glReadPixels(0, 0, (int)currentStageSize.width, (int)currentStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels2); - CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels2, totalBytesForImage, NULL); - CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); - - CGFloat currentRedTotal = 0.0f, currentGreenTotal = 0.0f, currentBlueTotal = 0.0f, currentAlphaTotal = 0.0f; - NSUInteger totalNumberOfPixels = totalBytesForImage / 4; - - for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) - { - currentRedTotal += (CGFloat)rawImagePixels2[(currentPixel * 4)] / 255.0f; - currentGreenTotal += (CGFloat)rawImagePixels2[(currentPixel * 4) + 1] / 255.0f; - currentBlueTotal += (CGFloat)rawImagePixels2[(currentPixel * 4 + 2)] / 255.0f; - currentAlphaTotal += (CGFloat)rawImagePixels2[(currentPixel * 4) + 3] / 255.0f; - } - - NSLog(@"Stage %d average image red: %f, green: %f, blue: %f, alpha: %f", currentStage, currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); - - CGImageRef cgImageFromBytes = CGImageCreate((int)currentStageSize.width, (int)currentStageSize.height, 8, 32, 4 * (int)currentStageSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); - - UIImage *imageToSave = [UIImage imageWithCGImage:cgImageFromBytes]; - - NSData *dataForPNGFile = UIImagePNGRepresentation(imageToSave); - - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - - NSString *imageName = [NSString stringWithFormat:@"AverageLevel%d.png", currentStage]; - NSError *error = nil; - if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:imageName] options:NSAtomicWrite error:&error]) - { - return; - } +// NSUInteger totalBytesForImage = (int)currentStageSize.width * (int)currentStageSize.height * 4; +// GLubyte *rawImagePixels2 = (GLubyte *)malloc(totalBytesForImage); +// glReadPixels(0, 0, (int)currentStageSize.width, (int)currentStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels2); +// CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels2, totalBytesForImage, NULL); +// CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); +// +// CGFloat currentRedTotal = 0.0f, currentGreenTotal = 0.0f, currentBlueTotal = 0.0f, currentAlphaTotal = 0.0f; +// NSUInteger totalNumberOfPixels = totalBytesForImage / 4; +// +// for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) +// { +// currentRedTotal += (CGFloat)rawImagePixels2[(currentPixel * 4)] / 255.0f; +// currentGreenTotal += (CGFloat)rawImagePixels2[(currentPixel * 4) + 1] / 255.0f; +// currentBlueTotal += (CGFloat)rawImagePixels2[(currentPixel * 4 + 2)] / 255.0f; +// currentAlphaTotal += (CGFloat)rawImagePixels2[(currentPixel * 4) + 3] / 255.0f; +// } +// +// NSLog(@"Stage %d average image red: %f, green: %f, blue: %f, alpha: %f", currentStage, currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); +// +// +// CGImageRef cgImageFromBytes = CGImageCreate((int)currentStageSize.width, (int)currentStageSize.height, 8, 32, 4 * (int)currentStageSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); +// +// UIImage *imageToSave = [UIImage imageWithCGImage:cgImageFromBytes]; +// +// NSData *dataForPNGFile = UIImagePNGRepresentation(imageToSave); +// +// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +// NSString *documentsDirectory = [paths objectAtIndex:0]; +// +// NSString *imageName = [NSString stringWithFormat:@"AverageLevel%d.png", currentStage]; +// NSError *error = nil; +// if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:imageName] options:NSAtomicWrite error:&error]) +// { +// return; +// } } } diff --git a/framework/Source/GPUImageSolidColorGenerator.h b/framework/Source/GPUImageSolidColorGenerator.h new file mode 100644 index 000000000..3c1e19c9e --- /dev/null +++ b/framework/Source/GPUImageSolidColorGenerator.h @@ -0,0 +1,17 @@ +#import "GPUImageFilter.h" + +// This outputs an image with a constant color. You need to use -forceProcessingAtSize: in order to set the output image +// dimensions, or this won't work correctly + + +@interface GPUImageSolidColorGenerator : GPUImageFilter +{ + GLint colorUniform; +} + +// This color dictates what the output image will be filled with +@property(readwrite, nonatomic) GPUVector4 color; + +- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; + +@end diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m new file mode 100644 index 000000000..e717d0cf6 --- /dev/null +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -0,0 +1,81 @@ +#import "GPUImageSolidColorGenerator.h" + +NSString *const kGPUSolidColorFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform vec4 color; + + void main() + { + gl_FragColor = color; + } +); + +@implementation GPUImageSolidColorGenerator + +@synthesize color = _color; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUSolidColorFragmentShaderString])) + { + return nil; + } + + colorUniform = [filterProgram uniformIndex:@"color"]; + + self.color = (GPUVector4){0.0f, 0.0f, 0.5f, 1.0f}; + + return self; +} + + +#pragma mark - +#pragma mark Accessors + +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + [super forceProcessingAtSize:frameSize]; + + if (!CGSizeEqualToSize(inputTextureSize, CGSizeZero)) + { + [self newFrameReadyAtTime:kCMTimeIndefinite atIndex:0]; + } +} + +- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; +{ + [super addTarget:newTarget atTextureLocation:textureLocation]; + + if (!CGSizeEqualToSize(inputTextureSize, CGSizeZero)) + { + [newTarget setInputSize:inputTextureSize atIndex:textureLocation]; + [newTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureLocation]; + } +} + +- (void)setColor:(GPUVector4)newValue; +{ + [self setColorRed:_color.one green:_color.two blue:_color.three alpha:_color.four]; +} + +- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; +{ + _color.one = redComponent; + _color.two = greenComponent; + _color.three = blueComponent; + _color.four = alphaComponent; + + [self setVec4:_color forUniform:colorUniform program:filterProgram]; + + if (!CGSizeEqualToSize(inputTextureSize, CGSizeZero)) + { + [self newFrameReadyAtTime:kCMTimeIndefinite atIndex:0]; + } +} + +@end From b1293a6f1a319af1a2f9e37544a3d39a48c2643d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 27 Aug 2012 15:27:01 -0500 Subject: [PATCH 201/695] Updated the ColorObjectTracking example to use GPU-based averaging, which makes it operate at 30 FPS. Improved the precision of the averaging filter in certain cases. --- .../ColorTrackingViewController.h | 1 + .../ColorTrackingViewController.m | 20 +++++++++++++++++-- framework/Source/GPUImageAverageColor.m | 18 ++++++++--------- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h index 469abd8aa..07948c227 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h @@ -10,6 +10,7 @@ typedef enum { PASSTHROUGH_VIDEO, SIMPLE_THRESHOLDING, POSITION_THRESHOLDING, OB GPUImageVideoCamera *videoCamera; GPUImageFilter *thresholdFilter, *positionFilter; GPUImageRawDataOutput *positionRawData, *videoRawData; + GPUImageAverageColor *positionAverageColor; GPUImageView *filteredVideoView; ColorTrackingDisplayMode displayMode; diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index 423a01620..db520687e 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -70,7 +70,20 @@ - (void)configureVideoFiltering; __unsafe_unretained ColorTrackingViewController *weakSelf = self; [positionRawData setNewFrameAvailableBlock:^{ GLubyte *bytesForPositionData = positionRawData.rawBytesForImage; - CGPoint currentTrackingLocation = [weakSelf centroidFromTexture:bytesForPositionData ofSize:[positionRawData maximumOutputSize]]; + CGPoint currentTrackingLocation = [weakSelf centroidFromTexture:bytesForPositionData ofSize:[positionRawData maximumOutputSize]]; +// NSLog(@"Centroid from CPU: %f, %f", currentTrackingLocation.x, currentTrackingLocation.y); + CGSize currentViewSize = weakSelf.view.bounds.size; + dispatch_async(dispatch_get_main_queue(), ^{ + trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); + }); + }]; + + positionAverageColor = [[GPUImageAverageColor alloc] init]; + [positionAverageColor setColorAverageProcessingFinishedBlock:^(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime) { +// NSLog(@"GPU Average R: %f, G: %f, A: %f", redComponent, greenComponent, alphaComponent); + CGPoint currentTrackingLocation = CGPointMake(1.0 - (greenComponent / alphaComponent), (redComponent / alphaComponent)); +// NSLog(@"Centroid from GPU: %f, %f", currentTrackingLocation.x, currentTrackingLocation.y); + // NSLog(@"Average color: %f, %f, %f, %f", redComponent, greenComponent, blueComponent, alphaComponent); CGSize currentViewSize = weakSelf.view.bounds.size; dispatch_async(dispatch_get_main_queue(), ^{ trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); @@ -204,7 +217,8 @@ - (void)handleSwitchOfDisplayMode:(id)sender; { [videoCamera addTarget:filteredVideoView]; [videoCamera addTarget:positionFilter]; - [positionFilter addTarget:positionRawData]; +// [positionFilter addTarget:positionRawData]; // Enable this for CPU-based centroid computation + [positionFilter addTarget:positionAverageColor]; // Enable this for GPU-based centroid computation }; break; } } @@ -235,6 +249,8 @@ - (CGPoint)centroidFromTexture:(GLubyte *)pixels ofSize:(CGSize)textureSize; currentPixelTotal += (CGFloat)pixels[(currentPixel * 4) + 3] / 255.0f; } } + +// NSLog(@"CPU Average R: %f, G: %f, A: %f", currentXTotal / (textureSize.width * textureSize.height), currentYTotal / (textureSize.width * textureSize.height), currentPixelTotal / (textureSize.width * textureSize.height)); return CGPointMake((1.0 - currentYTotal / currentPixelTotal), currentXTotal / currentPixelTotal); } diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index ef4070499..6fcfe4c3a 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -26,12 +26,10 @@ void main() NSString *const kGPUImageColorAveragingFragmentShaderString = SHADER_STRING ( - precision lowp float; + precision highp float; uniform sampler2D inputImageTexture; - uniform mediump mat3 convolutionMatrix; - varying highp vec2 outputTextureCoordinate; varying highp vec2 upperLeftInputTextureCoordinate; @@ -41,10 +39,10 @@ void main() void main() { - mediump vec4 upperLeftColor = texture2D(inputImageTexture, upperLeftInputTextureCoordinate); - mediump vec4 upperRightColor = texture2D(inputImageTexture, upperRightInputTextureCoordinate); - mediump vec4 lowerLeftColor = texture2D(inputImageTexture, lowerLeftInputTextureCoordinate); - mediump vec4 lowerRightColor = texture2D(inputImageTexture, lowerRightInputTextureCoordinate); + highp vec4 upperLeftColor = texture2D(inputImageTexture, upperLeftInputTextureCoordinate); + highp vec4 upperRightColor = texture2D(inputImageTexture, upperRightInputTextureCoordinate); + highp vec4 lowerLeftColor = texture2D(inputImageTexture, lowerLeftInputTextureCoordinate); + highp vec4 lowerRightColor = texture2D(inputImageTexture, lowerRightInputTextureCoordinate); gl_FragColor = 0.25 * (upperLeftColor + upperRightColor + lowerLeftColor + lowerRightColor); } @@ -104,9 +102,11 @@ - (void)initializeOutputTexture; { // CGSize currentStageSize = CGSizeMake(ceil(inputTextureSize.width / pow(4.0, currentReduction + 1.0)), ceil(inputTextureSize.height / pow(4.0, currentReduction + 1.0))); CGSize currentStageSize = CGSizeMake(floor(inputTextureSize.width / pow(4.0, currentReduction + 1.0)), floor(inputTextureSize.height / pow(4.0, currentReduction + 1.0))); - if (currentStageSize.height < 2.0) + if ( (currentStageSize.height < 2.0) || (currentStageSize.width < 2.0) ) { - currentStageSize.height = 2.0; // TODO: Rotate the image to account for this case, which causes FBO construction to fail + // A really small last stage seems to cause significant errors in the average, so I abort and leave the rest to the CPU at this point + break; +// currentStageSize.height = 2.0; // TODO: Rotate the image to account for this case, which causes FBO construction to fail } [stageSizes addObject:[NSValue valueWithCGSize:currentStageSize]]; From 6c433ae4b57d803e4eb98c25e8651bd63c9cbfe1 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 27 Aug 2012 17:06:01 -0500 Subject: [PATCH 202/695] Added a luminosity extractor to go along with the new average color one. --- .../FeatureExtractionAppDelegate.m | 7 + .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 20 +- framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageAverageColor.h | 2 + framework/Source/GPUImageAverageColor.m | 2 +- framework/Source/GPUImageLuminosity.h | 16 ++ framework/Source/GPUImageLuminosity.m | 262 ++++++++++++++++++ 10 files changed, 319 insertions(+), 3 deletions(-) create mode 100644 framework/Source/GPUImageLuminosity.h create mode 100644 framework/Source/GPUImageLuminosity.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index 7a3794f69..11bb467d2 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -75,8 +75,15 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [averageColor setColorAverageProcessingFinishedBlock:^(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime){ NSLog(@"Red: %f, green: %f, blue: %f, alpha: %f", redComponent, greenComponent, blueComponent, alphaComponent); }]; + + GPUImageLuminosity *averageLuminosity = [[GPUImageLuminosity alloc] init]; + [averageLuminosity setLuminosityProcessingFinishedBlock:^(CGFloat luminosity, CMTime frameTime) { + NSLog(@"Luminosity: %f", luminosity); + }]; + [chairPicture removeAllTargets]; [chairPicture addTarget:averageColor]; + [chairPicture addTarget:averageLuminosity]; [chairPicture processImage]; // UIImage *lbpOutput = [lbpFilter imageFromCurrentlyProcessedOutput]; // [self saveImage:lbpOutput fileName:@"LocalBinaryPatterns.png"]; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 83bea7bea..260a2cc25 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -85,6 +85,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; case GPUIMAGE_AVERAGECOLOR: cell.textLabel.text = @"Average color"; break; + case GPUIMAGE_LUMINOSITY: cell.textLabel.text = @"Luminosity"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; case GPUIMAGE_ADAPTIVETHRESHOLD: cell.textLabel.text = @"Adaptive threshold"; break; case GPUIMAGE_CROP: cell.textLabel.text = @"Crop"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index e3ebb7658..08542b44e 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -28,6 +28,7 @@ typedef enum { GPUIMAGE_GRAYSCALE, GPUIMAGE_HISTOGRAM, GPUIMAGE_AVERAGECOLOR, + GPUIMAGE_LUMINOSITY, GPUIMAGE_THRESHOLD, GPUIMAGE_ADAPTIVETHRESHOLD, GPUIMAGE_PIXELLATE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index aa4386cd4..6d3fc1a56 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -318,6 +318,13 @@ - (void)setupFilter; self.filterSettingsSlider.hidden = YES; filter = [[GPUImageAverageColor alloc] init]; + }; break; + case GPUIMAGE_LUMINOSITY: + { + self.title = @"Luminosity"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageLuminosity alloc] init]; }; break; case GPUIMAGE_HISTOGRAM: { @@ -1188,7 +1195,18 @@ - (void)setupFilter; [colorGenerator addTarget:filterView]; } - else + else if (filterType == GPUIMAGE_LUMINOSITY) + { + GPUImageSolidColorGenerator *colorGenerator = [[GPUImageSolidColorGenerator alloc] init]; + [colorGenerator forceProcessingAtSize:[filterView sizeInPixels]]; + + [(GPUImageLuminosity *)filter setLuminosityProcessingFinishedBlock:^(CGFloat luminosity, CMTime frameTime) { + [colorGenerator setColorRed:luminosity green:luminosity blue:luminosity alpha:1.0]; + }]; + + [colorGenerator addTarget:filterView]; + } + else { [filter addTarget:filterView]; } diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index f10e64c0f..bffaa754c 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -204,6 +204,8 @@ BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; }; BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */; }; + BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; }; + BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */; }; BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; @@ -490,6 +492,8 @@ BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCropFilter.m; path = Source/GPUImageCropFilter.m; sourceTree = SOURCE_ROOT; }; BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSolidColorGenerator.h; path = Source/GPUImageSolidColorGenerator.h; sourceTree = SOURCE_ROOT; }; BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSolidColorGenerator.m; path = Source/GPUImageSolidColorGenerator.m; sourceTree = SOURCE_ROOT; }; + BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminosity.h; path = Source/GPUImageLuminosity.h; sourceTree = SOURCE_ROOT; }; + BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminosity.m; path = Source/GPUImageLuminosity.m; sourceTree = SOURCE_ROOT; }; BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMonochromeFilter.h; path = Source/GPUImageMonochromeFilter.h; sourceTree = SOURCE_ROOT; }; BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; @@ -669,6 +673,8 @@ BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */, BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */, BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */, + BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */, + BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */, BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */, BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */, ); @@ -1131,6 +1137,7 @@ BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */, BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */, BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */, + BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1374,6 +1381,7 @@ BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */, BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */, BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */, + BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 37529e350..a6f951a14 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -120,4 +120,5 @@ #import "GPUImageLocalBinaryPatternFilter.h" #import "GPUImageLanczosResamplingFilter.h" #import "GPUImageAverageColor.h" -#import "GPUImageSolidColorGenerator.h" \ No newline at end of file +#import "GPUImageSolidColorGenerator.h" +#import "GPUImageLuminosity.h" \ No newline at end of file diff --git a/framework/Source/GPUImageAverageColor.h b/framework/Source/GPUImageAverageColor.h index d10c5fb37..263fd5a47 100644 --- a/framework/Source/GPUImageAverageColor.h +++ b/framework/Source/GPUImageAverageColor.h @@ -1,5 +1,7 @@ #import "GPUImageFilter.h" +extern NSString *const kGPUImageColorAveragingVertexShaderString; + @interface GPUImageAverageColor : GPUImageFilter { GLint texelWidthUniform, texelHeightUniform; diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index 6fcfe4c3a..d7d04aaf6 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -180,7 +180,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; CGSize currentFramebufferSize = [[stageSizes objectAtIndex:currentStage] CGSizeValue]; - NSLog(@"FBO stage size: %f, %f", currentFramebufferSize.width, currentFramebufferSize.height); +// NSLog(@"FBO stage size: %f, %f", currentFramebufferSize.width, currentFramebufferSize.height); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFramebufferSize.width, (int)currentFramebufferSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, currentTexture, 0); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); diff --git a/framework/Source/GPUImageLuminosity.h b/framework/Source/GPUImageLuminosity.h new file mode 100644 index 000000000..820184e23 --- /dev/null +++ b/framework/Source/GPUImageLuminosity.h @@ -0,0 +1,16 @@ +#import "GPUImageAverageColor.h" + +@interface GPUImageLuminosity : GPUImageAverageColor +{ + GLProgram *secondFilterProgram; + GLint secondFilterPositionAttribute, secondFilterTextureCoordinateAttribute; + GLint secondFilterInputTextureUniform, secondFilterInputTextureUniform2; + GLint secondFilterTexelWidthUniform, secondFilterTexelHeightUniform; +} + +// This block is called on the completion of color averaging for a frame +@property(nonatomic, copy) void(^luminosityProcessingFinishedBlock)(CGFloat luminosity, CMTime frameTime); + +- (void)extractLuminosityAtFrameTime:(CMTime)frameTime; + +@end diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m new file mode 100644 index 000000000..b5c194aeb --- /dev/null +++ b/framework/Source/GPUImageLuminosity.m @@ -0,0 +1,262 @@ +#import "GPUImageLuminosity.h" + +NSString *const kGPUImageInitialLuminosityFragmentShaderString = SHADER_STRING +( + precision highp float; + + uniform sampler2D inputImageTexture; + + varying highp vec2 outputTextureCoordinate; + + varying highp vec2 upperLeftInputTextureCoordinate; + varying highp vec2 upperRightInputTextureCoordinate; + varying highp vec2 lowerLeftInputTextureCoordinate; + varying highp vec2 lowerRightInputTextureCoordinate; + + const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + highp float upperLeftLuminance = dot(texture2D(inputImageTexture, upperLeftInputTextureCoordinate).rgb, W); + highp float upperRightLuminance = dot(texture2D(inputImageTexture, upperRightInputTextureCoordinate).rgb, W); + highp float lowerLeftLuminance = dot(texture2D(inputImageTexture, lowerLeftInputTextureCoordinate).rgb, W); + highp float lowerRightLuminance = dot(texture2D(inputImageTexture, lowerRightInputTextureCoordinate).rgb, W); + + highp float luminosity = 0.25 * (upperLeftLuminance + upperRightLuminance + lowerLeftLuminance + lowerRightLuminance); + gl_FragColor = vec4(luminosity, luminosity, luminosity, 1.0); + } +); + +NSString *const kGPUImageLuminosityFragmentShaderString = SHADER_STRING +( + precision highp float; + + uniform sampler2D inputImageTexture; + + varying highp vec2 outputTextureCoordinate; + + varying highp vec2 upperLeftInputTextureCoordinate; + varying highp vec2 upperRightInputTextureCoordinate; + varying highp vec2 lowerLeftInputTextureCoordinate; + varying highp vec2 lowerRightInputTextureCoordinate; + + void main() + { + highp float upperLeftLuminance = texture2D(inputImageTexture, upperLeftInputTextureCoordinate).r; + highp float upperRightLuminance = texture2D(inputImageTexture, upperRightInputTextureCoordinate).r; + highp float lowerLeftLuminance = texture2D(inputImageTexture, lowerLeftInputTextureCoordinate).r; + highp float lowerRightLuminance = texture2D(inputImageTexture, lowerRightInputTextureCoordinate).r; + + highp float luminosity = 0.25 * (upperLeftLuminance + upperRightLuminance + lowerLeftLuminance + lowerRightLuminance); + gl_FragColor = vec4(luminosity, luminosity, luminosity, 1.0); + } +); + +@implementation GPUImageLuminosity + +@synthesize luminosityProcessingFinishedBlock = _luminosityProcessingFinishedBlock; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageColorAveragingVertexShaderString fragmentShaderFromString:kGPUImageInitialLuminosityFragmentShaderString])) + { + return nil; + } + + texelWidthUniform = [filterProgram uniformIndex:@"texelWidth"]; + texelHeightUniform = [filterProgram uniformIndex:@"texelHeight"]; + + stageTextures = [[NSMutableArray alloc] init]; + stageFramebuffers = [[NSMutableArray alloc] init]; + stageSizes = [[NSMutableArray alloc] init]; + + __unsafe_unretained GPUImageLuminosity *weakSelf = self; + [self setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { + [weakSelf extractLuminosityAtFrameTime:frameTime]; + }]; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + secondFilterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageColorAveragingVertexShaderString fragmentShaderString:kGPUImageLuminosityFragmentShaderString]; + + if (!secondFilterProgram.initialized) + { + [self initializeAttributes]; + + if (![secondFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; + secondFilterTextureCoordinateAttribute = [secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; + secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + + secondFilterTexelWidthUniform = [secondFilterProgram uniformIndex:@"texelWidth"]; + secondFilterTexelHeightUniform = [secondFilterProgram uniformIndex:@"texelHeight"]; + + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + + glEnableVertexAttribArray(secondFilterPositionAttribute); + glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); + }); + + return self; +} + +- (void)initializeAttributes; +{ + [super initializeAttributes]; + [secondFilterProgram addAttribute:@"position"]; + [secondFilterProgram addAttribute:@"inputTextureCoordinate"]; +} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + if (self.preventRendering) + { + return; + } + + // Do an initial render pass that both convert to luminance and reduces + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + GLuint currentFramebuffer = [[stageFramebuffers objectAtIndex:0] intValue]; + glBindFramebuffer(GL_FRAMEBUFFER, currentFramebuffer); + + CGSize currentStageSize = [[stageSizes objectAtIndex:0] CGSizeValue]; + glViewport(0, 0, (int)currentStageSize.width, (int)currentStageSize.height); + + GLuint currentTexture = sourceTexture; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, currentTexture); + + glUniform1i(filterInputTextureUniform, 2); + + glUniform1f(texelWidthUniform, 0.5 / currentStageSize.width); + glUniform1f(texelHeightUniform, 0.5 / currentStageSize.height); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + currentTexture = [[stageTextures objectAtIndex:0] intValue]; + + // Just perform reductions from this point on + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + NSUInteger numberOfStageFramebuffers = [stageFramebuffers count]; + for (NSUInteger currentStage = 1; currentStage < numberOfStageFramebuffers; currentStage++) + { + currentFramebuffer = [[stageFramebuffers objectAtIndex:currentStage] intValue]; + glBindFramebuffer(GL_FRAMEBUFFER, currentFramebuffer); + + currentStageSize = [[stageSizes objectAtIndex:currentStage] CGSizeValue]; + glViewport(0, 0, (int)currentStageSize.width, (int)currentStageSize.height); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, currentTexture); + + glUniform1i(secondFilterInputTextureUniform, 2); + + glUniform1f(secondFilterTexelWidthUniform, 0.5 / currentStageSize.width); + glUniform1f(secondFilterTexelHeightUniform, 0.5 / currentStageSize.height); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + currentTexture = [[stageTextures objectAtIndex:currentStage] intValue]; + +// NSUInteger totalBytesForImage = (int)currentStageSize.width * (int)currentStageSize.height * 4; +// GLubyte *rawImagePixels2 = (GLubyte *)malloc(totalBytesForImage); +// glReadPixels(0, 0, (int)currentStageSize.width, (int)currentStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels2); +// CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels2, totalBytesForImage, NULL); +// CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); +// +// CGFloat currentRedTotal = 0.0f, currentGreenTotal = 0.0f, currentBlueTotal = 0.0f, currentAlphaTotal = 0.0f; +// NSUInteger totalNumberOfPixels = totalBytesForImage / 4; +// +// for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) +// { +// currentRedTotal += (CGFloat)rawImagePixels2[(currentPixel * 4)] / 255.0f; +// currentGreenTotal += (CGFloat)rawImagePixels2[(currentPixel * 4) + 1] / 255.0f; +// currentBlueTotal += (CGFloat)rawImagePixels2[(currentPixel * 4 + 2)] / 255.0f; +// currentAlphaTotal += (CGFloat)rawImagePixels2[(currentPixel * 4) + 3] / 255.0f; +// } +// +// NSLog(@"Stage %d average image red: %f, green: %f, blue: %f, alpha: %f", currentStage, currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); +// +// +// CGImageRef cgImageFromBytes = CGImageCreate((int)currentStageSize.width, (int)currentStageSize.height, 8, 32, 4 * (int)currentStageSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); +// +// UIImage *imageToSave = [UIImage imageWithCGImage:cgImageFromBytes]; +// +// NSData *dataForPNGFile = UIImagePNGRepresentation(imageToSave); +// +// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +// NSString *documentsDirectory = [paths objectAtIndex:0]; +// +// NSString *imageName = [NSString stringWithFormat:@"AverageLevel%d.png", currentStage]; +// NSError *error = nil; +// if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:imageName] options:NSAtomicWrite error:&error]) +// { +// return; +// } + } +} + +#pragma mark - +#pragma mark Callbacks + +- (void)extractLuminosityAtFrameTime:(CMTime)frameTime; +{ + CGSize finalStageSize = [[stageSizes lastObject] CGSizeValue]; + NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); + + if (rawImagePixels == NULL) + { + rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); + } + + glReadPixels(0, 0, (int)finalStageSize.width, (int)finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + + NSUInteger luminanceTotal = 0; + NSUInteger byteIndex = 0; + for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) + { + luminanceTotal += rawImagePixels[byteIndex]; + byteIndex += 4; + } + + CGFloat normalizedLuminosityTotal = (CGFloat)luminanceTotal / (CGFloat)totalNumberOfPixels / 255.0; + + if (_luminosityProcessingFinishedBlock != NULL) + { + _luminosityProcessingFinishedBlock(normalizedLuminosityTotal, frameTime); + } +} + + +@end From 5baf9b55171fa460fc5339d2f1dd689a1e48428a Mon Sep 17 00:00:00 2001 From: Andrew Farmer Date: Mon, 27 Aug 2012 15:36:37 -0700 Subject: [PATCH 203/695] the GPUImageToneCurveFilter now can take into account the rgbcomposite channel together with the separate r, g, and b channels --- framework/Source/GPUImageToneCurveFilter.h | 6 ++++- framework/Source/GPUImageToneCurveFilter.m | 28 +++++++++++++++++----- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h index 2aeb210f8..a03184e93 100755 --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -5,12 +5,16 @@ @property(readwrite, nonatomic, copy) NSArray *redControlPoints; @property(readwrite, nonatomic, copy) NSArray *greenControlPoints; @property(readwrite, nonatomic, copy) NSArray *blueControlPoints; +@property(readwrite, nonatomic, copy) NSArray *rgbCompositeControlPoints; // Initialization and teardown - (id)initWithACV:(NSString*)curveFile; // This lets you set all three red, green, and blue tone curves at once. -- (void)setRGBControlPoints:(NSArray *)points; +// NOTE: Deprecated this function because this effect can be accomplished +// using the rgbComposite channel rather then setting all 3 R, G, and B channels. +- (void)setRGBControlPoints:(NSArray *)points DEPRECATED_ATTRIBUTE; + - (void)setPointsWithACV:(NSString*)curveFile; // Curve calculation diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index ee587ef29..eb5005781 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -128,13 +128,14 @@ @interface GPUImageToneCurveFilter() GLuint toneCurveTexture; GLubyte *toneCurveByteArray; - NSArray *_redCurve, *_greenCurve, *_blueCurve; + NSArray *_redCurve, *_greenCurve, *_blueCurve, *_rgbCompositeCurve; } @end @implementation GPUImageToneCurveFilter +@synthesize rgbCompositeControlPoints = _rgbCompositeControlPoints; @synthesize redControlPoints = _redControlPoints; @synthesize greenControlPoints = _greenControlPoints; @synthesize blueControlPoints = _blueControlPoints; @@ -151,7 +152,11 @@ - (id)init; toneCurveTextureUniform = [filterProgram uniformIndex:@"toneCurveTexture"]; - [self setRGBControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, 0.5)], [NSValue valueWithCGPoint:CGPointMake(1.0, 1.0)], nil]]; + NSArray *defaultCurve = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, 0.5)], [NSValue valueWithCGPoint:CGPointMake(1.0, 1.0)], nil]; + [self setRgbCompositeControlPoints:defaultCurve]; + [self setRedControlPoints:defaultCurve]; + [self setGreenControlPoints:defaultCurve]; + [self setBlueControlPoints:defaultCurve]; return self; } @@ -168,6 +173,7 @@ - (id)initWithACV:(NSString*)curveFile GPUImageACVFile *curve = [[GPUImageACVFile alloc] initWithCurveFile:curveFile]; + [self setRgbCompositeControlPoints:curve.rgbCompositeCurvePoints]; [self setRedControlPoints:curve.redCurvePoints]; [self setGreenControlPoints:curve.greenCurvePoints]; [self setBlueControlPoints:curve.blueCurvePoints]; @@ -181,6 +187,7 @@ - (void)setPointsWithACV:(NSString*)curveFile { GPUImageACVFile *curve = [[GPUImageACVFile alloc] initWithCurveFile:curveFile]; + [self setRgbCompositeControlPoints:curve.rgbCompositeCurvePoints]; [self setRedControlPoints:curve.redCurvePoints]; [self setGreenControlPoints:curve.greenCurvePoints]; [self setBlueControlPoints:curve.blueCurvePoints]; @@ -401,14 +408,14 @@ - (void)updateToneCurveTexture; glBindTexture(GL_TEXTURE_2D, toneCurveTexture); } - if ( ([_redCurve count] >= 256) && ([_greenCurve count] >= 256) && ([_blueCurve count] >= 256) ) + if ( ([_redCurve count] >= 256) && ([_greenCurve count] >= 256) && ([_blueCurve count] >= 256) && ([_rgbCompositeCurve count] >= 256)) { for (unsigned int currentCurveIndex = 0; currentCurveIndex < 256; currentCurveIndex++) { // BGRA for upload to texture - toneCurveByteArray[currentCurveIndex * 4] = currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue]; - toneCurveByteArray[currentCurveIndex * 4 + 1] = currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue]; - toneCurveByteArray[currentCurveIndex * 4 + 2] = currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue]; + toneCurveByteArray[currentCurveIndex * 4] = fmax(currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0); + toneCurveByteArray[currentCurveIndex * 4 + 1] = fmax(currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0); + toneCurveByteArray[currentCurveIndex * 4 + 2] = fmax(currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0); toneCurveByteArray[currentCurveIndex * 4 + 3] = 255; } @@ -465,6 +472,15 @@ - (void)setRGBControlPoints:(NSArray *)points } +- (void)setRgbCompositeControlPoints:(NSArray *)newValue +{ + _rgbCompositeControlPoints = [newValue copy]; + _rgbCompositeCurve = [self getPreparedSplineCurve:_rgbCompositeControlPoints]; + + [self updateToneCurveTexture]; +} + + - (void)setRedControlPoints:(NSArray *)newValue; { _redControlPoints = [newValue copy]; From ff718ab66ca9fadb46d6ea59fcd652657b7cc477 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 27 Aug 2012 18:11:24 -0500 Subject: [PATCH 204/695] Added a threshold filter that takes the average luminance of a scene into account. Updated the documentation for the new filters. --- README.md | 12 +++++ .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 +++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++++ framework/Source/GPUImage.h | 3 +- .../GPUImageAverageLuminanceThresholdFilter.h | 8 ++++ .../GPUImageAverageLuminanceThresholdFilter.m | 47 +++++++++++++++++++ 8 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageAverageLuminanceThresholdFilter.h create mode 100644 framework/Source/GPUImageAverageLuminanceThresholdFilter.m diff --git a/README.md b/README.md index 41db5c366..f1cb5dd27 100755 --- a/README.md +++ b/README.md @@ -108,16 +108,26 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageOpacityFilter**: Adjusts the alpha channel of the incoming image - *opacity*: The value to multiply the incoming alpha channel for each pixel by (0.0 - 1.0, with 1.0 as the default) +- **GPUImageSolidColorGenerator**: This outputs a generated image with a solid color. You need to define the image size using -forceProcessingAtSize: + - *color*: The color, in a four component format, that is used to fill the image. + - **GPUImageLuminanceThresholdFilter**: Pixels with a luminance above the threshold will appear white, and those below will be black - *threshold*: The luminance threshold, from 0.0 to 1.0, with a default of 0.5 - **GPUImageAdaptiveThresholdFilter**: Determines the local luminance around a pixel, then turns the pixel black if it is below that local luminance and white if above. This can be useful for picking out text under varying lighting conditions. +- **GPUImageAverageLuminanceThresholdFilter**: This applies a thresholding operation where the threshold is continually adjusted based on the average luminance of the scene. + - *thresholdMultiplier*: This is a factor that the average luminance will be multiplied by in order to arrive at the final threshold to use. By default, this is 1.0. + - **GPUImageHistogramFilter**: This analyzes the incoming image and creates an output histogram with the frequency at which each color value occurs. The output of this filter is a 3-pixel-high, 256-pixel-wide image with the center (vertical) pixels containing pixels that correspond to the frequency at which various color values occurred. Each color value occupies one of the 256 width positions, from 0 on the left to 255 on the right. This histogram can be generated for individual color channels (kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue), the luminance of the image (kGPUImageHistogramLuminance), or for all three color channels at once (kGPUImageHistogramRGB). - *downsamplingFactor*: Rather than sampling every pixel, this dictates what fraction of the image is sampled. By default, this is 16 with a minimum of 1. This is needed to keep from saturating the histogram, which can only record 256 pixels for each color value before it becomes overloaded. - **GPUImageHistogramGenerator**: This is a special filter, in that it's primarily intended to work with the GPUImageHistogramFilter. It generates an output representation of the color histograms generated by GPUImageHistogramFilter, but it could be repurposed to display other kinds of values. It takes in an image and looks at the center (vertical) pixels. It then plots the numerical values of the RGB components in separate colored graphs in an output texture. You may need to force a size for this filter in order to make its output visible. +- **GPUImageAverageColor**: This processes an input image and determines the average color of the scene, by averaging the RGBA components for each pixel in the image. A reduction process is used to progressively downsample the source image on the GPU, followed by a short averaging calculation on the CPU. The output from this filter is meaningless, but you need to set the colorAverageProcessingFinishedBlock property to a block that takes in four color components and a frame time and does something with them. + +- **GPUImageLuminosity**: Like the GPUImageAverageColor, this reduces an image to its average luminosity. You need to set the luminosityProcessingFinishedBlock to handle the output of this filter, which just returns a luminosity value and a frame time. + ### Image processing ### - **GPUImageTransformFilter**: This applies an arbitrary 2-D or 3-D transformation to an image @@ -128,6 +138,8 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageCropFilter**: This crops an image to a specific region, then passes only that region on to the next stage in the filter - *cropRegion*: A rectangular area to crop out of the image, normalized to coordinates from 0.0 - 1.0. The (0.0, 0.0) position is in the upper left of the image. +- **GPUImageLanczosResamplingFilter**: This lets you up- or downsample an image using Lanczos resampling, which results in noticeably better quality than the standard linear or trilinear interpolation. Simply use -forceProcessingAtSize: to set the target output resolution for the filter, and the image will be resampled for that new size. + - **GPUImageSharpenFilter**: Sharpens the image - *sharpness*: The sharpness adjustment to apply (-4.0 - 4.0, with 0.0 as the default) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 260a2cc25..c522f1821 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -88,6 +88,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_LUMINOSITY: cell.textLabel.text = @"Luminosity"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; case GPUIMAGE_ADAPTIVETHRESHOLD: cell.textLabel.text = @"Adaptive threshold"; break; + case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: cell.textLabel.text = @"Average luminance threshold"; break; case GPUIMAGE_CROP: cell.textLabel.text = @"Crop"; break; case GPUIMAGE_TRANSFORM: cell.textLabel.text = @"Transform (2-D)"; break; case GPUIMAGE_TRANSFORM3D: cell.textLabel.text = @"Transform (3-D)"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 08542b44e..f053d01b8 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -31,6 +31,7 @@ typedef enum { GPUIMAGE_LUMINOSITY, GPUIMAGE_THRESHOLD, GPUIMAGE_ADAPTIVETHRESHOLD, + GPUIMAGE_AVERAGELUMINANCETHRESHOLD, GPUIMAGE_PIXELLATE, GPUIMAGE_POLARPIXELLATE, GPUIMAGE_POLKADOT, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 6d3fc1a56..ec35be6fd 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -358,6 +358,17 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:1.0]; filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; + }; break; + case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: + { + self.title = @"Avg. Lum. Threshold"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:2.0]; + [self.filterSettingsSlider setValue:1.0]; + + filter = [[GPUImageAverageLuminanceThresholdFilter alloc] init]; }; break; case GPUIMAGE_CROP: { @@ -1243,6 +1254,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)filter setDistance:[(UISlider *)sender value]]; break; case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)filter setThreshold:[(UISlider *)sender value]]; break; case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)filter setThresholdMultiplier:[(UISlider *)sender value]]; break; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)filter setRadius:round([(UISlider *)sender value])]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index bffaa754c..4bfffe494 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -206,6 +206,8 @@ BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */; }; BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; }; BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */; }; + BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; }; + BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */; }; BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; @@ -494,6 +496,8 @@ BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSolidColorGenerator.m; path = Source/GPUImageSolidColorGenerator.m; sourceTree = SOURCE_ROOT; }; BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminosity.h; path = Source/GPUImageLuminosity.h; sourceTree = SOURCE_ROOT; }; BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminosity.m; path = Source/GPUImageLuminosity.m; sourceTree = SOURCE_ROOT; }; + BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAverageLuminanceThresholdFilter.h; path = Source/GPUImageAverageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; + BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageLuminanceThresholdFilter.m; path = Source/GPUImageAverageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMonochromeFilter.h; path = Source/GPUImageMonochromeFilter.h; sourceTree = SOURCE_ROOT; }; BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; @@ -653,6 +657,8 @@ BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */, BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */, BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */, + BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */, + BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */, BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */, BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */, BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */, @@ -1138,6 +1144,7 @@ BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */, BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */, BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */, + BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1382,6 +1389,7 @@ BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */, BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */, BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */, + BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index a6f951a14..11ebbb59e 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -121,4 +121,5 @@ #import "GPUImageLanczosResamplingFilter.h" #import "GPUImageAverageColor.h" #import "GPUImageSolidColorGenerator.h" -#import "GPUImageLuminosity.h" \ No newline at end of file +#import "GPUImageLuminosity.h" +#import "GPUImageAverageLuminanceThresholdFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.h b/framework/Source/GPUImageAverageLuminanceThresholdFilter.h new file mode 100644 index 000000000..7f1ae4640 --- /dev/null +++ b/framework/Source/GPUImageAverageLuminanceThresholdFilter.h @@ -0,0 +1,8 @@ +#import "GPUImageFilterGroup.h" + +@interface GPUImageAverageLuminanceThresholdFilter : GPUImageFilterGroup + +// This is multiplied by the continually calculated average image luminosity to arrive at the final threshold. Default is 1.0. +@property(readwrite, nonatomic) CGFloat thresholdMultiplier; + +@end diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.m b/framework/Source/GPUImageAverageLuminanceThresholdFilter.m new file mode 100644 index 000000000..eb2796f41 --- /dev/null +++ b/framework/Source/GPUImageAverageLuminanceThresholdFilter.m @@ -0,0 +1,47 @@ +#import "GPUImageAverageLuminanceThresholdFilter.h" +#import "GPUImageLuminosity.h" +#import "GPUImageLuminanceThresholdFilter.h" + +@interface GPUImageAverageLuminanceThresholdFilter() +{ + GPUImageLuminosity *luminosityFilter; + GPUImageLuminanceThresholdFilter *luminanceThresholdFilter; +} +@end + +@implementation GPUImageAverageLuminanceThresholdFilter + +@synthesize thresholdMultiplier = _thresholdMultiplier; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + self.thresholdMultiplier = 1.0; + + luminosityFilter = [[GPUImageLuminosity alloc] init]; + [self addFilter:luminosityFilter]; + + luminanceThresholdFilter = [[GPUImageLuminanceThresholdFilter alloc] init]; + [self addFilter:luminanceThresholdFilter]; + + __unsafe_unretained GPUImageAverageLuminanceThresholdFilter *weakSelf = self; + __unsafe_unretained GPUImageLuminanceThresholdFilter *weakThreshold = luminanceThresholdFilter; + + [luminosityFilter setLuminosityProcessingFinishedBlock:^(CGFloat luminosity, CMTime frameTime) { + weakThreshold.threshold = luminosity * weakSelf.thresholdMultiplier; + }]; + + self.initialFilters = [NSArray arrayWithObjects:luminosityFilter, luminanceThresholdFilter, nil]; + self.terminalFilter = luminanceThresholdFilter; + + return self; +} + +@end From 4c1b11b7d4826dac189f9c264967b30b5649094a Mon Sep 17 00:00:00 2001 From: Taeho Kim Date: Tue, 28 Aug 2012 14:54:42 +0900 Subject: [PATCH 205/695] Update inputCamera property after rotating camera. --- framework/Source/GPUImageVideoCamera.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index fc8ed098f..eb4cfbf1a 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -1,4 +1,3 @@ - #import "GPUImageVideoCamera.h" #import "GPUImageMovieWriter.h" @@ -255,6 +254,7 @@ - (void)rotateCamera [_captureSession commitConfiguration]; } + _inputCamera = backFacingCamera; [self setOutputImageOrientation:_outputImageOrientation]; } From 2cb7f3241b40af0f0cc1edf5beea6040cfd19313 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 28 Aug 2012 15:30:34 -0500 Subject: [PATCH 206/695] Added two new properties on the camera inputs: horizontallyMirrorFrontFacingCamera and horizontallyMirrorRearFacingCamera which determine whether the camera should be mirrored in those positions. Fixed a potential issue with movie playback in the Simulator. --- .../SimpleVideoFilterViewController.m | 2 + framework/Source/GPUImageMovie.m | 4 ++ framework/Source/GPUImageVideoCamera.h | 3 + framework/Source/GPUImageVideoCamera.m | 70 +++++++++++++++---- 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 3e405b9b7..a8df66a70 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -27,6 +27,8 @@ - (void)viewDidLoad // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + videoCamera.horizontallyMirrorFrontFacingCamera = NO; + videoCamera.horizontallyMirrorRearFacingCamera = YES; filter = [[GPUImageSepiaFilter alloc] init]; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 220bc5d2a..01a1fefff 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -234,7 +234,11 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(movieSampleBuffer); int bufferHeight = CVPixelBufferGetHeight(movieFrame); +#if TARGET_IPHONE_SIMULATOR + int bufferWidth = CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) +#else int bufferWidth = CVPixelBufferGetWidth(movieFrame); +#endif CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 12f6681c9..e580d5a23 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -58,6 +58,9 @@ /// This determines the rotation applied to the output image, based on the source material @property(readwrite, nonatomic) UIInterfaceOrientation outputImageOrientation; +/// These properties determine whether or not the two camera orientations should be mirrored. By default, both are NO. +@property(readwrite, nonatomic) BOOL horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera; + @property(nonatomic, retain) id delegate; /// @name Initialization and teardown diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index fc8ed098f..629ae6ec8 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -17,6 +17,8 @@ @interface GPUImageVideoCamera () dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; } +- (void)updateOrientationSendToTargets; + @end @implementation GPUImageVideoCamera @@ -27,6 +29,7 @@ @implementation GPUImageVideoCamera @synthesize runBenchmark = _runBenchmark; @synthesize outputImageOrientation = _outputImageOrientation; @synthesize delegate = _delegate; +@synthesize horizontallyMirrorFrontFacingCamera = _horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera = _horizontallyMirrorRearFacingCamera; #pragma mark - #pragma mark Initialization and teardown @@ -546,32 +549,57 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; }); } -- (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; +- (void)updateOrientationSendToTargets; { runSynchronouslyOnVideoProcessingQueue(^{ - _outputImageOrientation = newValue; // From the iOS 5.0 release notes: // In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight. if ([self cameraPosition] == AVCaptureDevicePositionBack) { - switch(_outputImageOrientation) + if (_horizontallyMirrorRearFacingCamera) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; + } + } + else + { + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; + } } } else { - switch(_outputImageOrientation) + if (_horizontallyMirrorFrontFacingCamera) + { + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; + } + } + else { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipVertical; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipHorizonal; break; + } } } @@ -583,4 +611,22 @@ - (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; }); } +- (void)setOutputImageOrientation:(UIInterfaceOrientation)newValue; +{ + _outputImageOrientation = newValue; + [self updateOrientationSendToTargets]; +} + +- (void)setHorizontallyMirrorFrontFacingCamera:(BOOL)newValue +{ + _horizontallyMirrorFrontFacingCamera = newValue; + [self updateOrientationSendToTargets]; +} + +- (void)setHorizontallyMirrorRearFacingCamera:(BOOL)newValue +{ + _horizontallyMirrorRearFacingCamera = newValue; + [self updateOrientationSendToTargets]; +} + @end From 74d48b879b4debdb3960c16b1e71b9fed31d0cbe Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 28 Aug 2012 21:49:00 -0500 Subject: [PATCH 207/695] Made the PNG and UIImage still photo capture routines account for the glitches from photos taken by the front-facing camera. --- .../SimpleVideoFilterViewController.m | 2 +- framework/Source/GPUImageStillCamera.m | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index a8df66a70..7a741e2bd 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -28,7 +28,7 @@ - (void)viewDidLoad videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; videoCamera.horizontallyMirrorFrontFacingCamera = NO; - videoCamera.horizontallyMirrorRearFacingCamera = YES; + videoCamera.horizontallyMirrorRearFacingCamera = NO; filter = [[GPUImageSepiaFilter alloc] init]; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 63caff2db..29e60669e 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -121,9 +121,14 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) } else { - dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches + AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; + if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) + { + dispatch_semaphore_signal(frameRenderingSemaphore); + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + } } UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; @@ -215,9 +220,14 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi } else { - dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches + AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; + if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) + { + dispatch_semaphore_signal(frameRenderingSemaphore); + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + } } NSData *dataForPNGFile = nil; From 752c2a3ea59d083a5fe797ce6b25a7cd8424867c Mon Sep 17 00:00:00 2001 From: Jon Campbell Date: Wed, 29 Aug 2012 14:35:24 -0600 Subject: [PATCH 208/695] ImageFilterPipeline now loads arrays properly. --- framework/Source/GPUImageFilterPipeline.m | 113 ++++++++++++++-------- 1 file changed, 70 insertions(+), 43 deletions(-) diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 684aae2a4..8fe9e5550 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -2,8 +2,9 @@ @interface GPUImageFilterPipeline () -- (BOOL) _parseConfiguration:(NSDictionary *)configuration; -- (void) _refreshFilters; +- (BOOL)_parseConfiguration:(NSDictionary *)configuration; + +- (void)_refreshFilters; @end @@ -13,7 +14,7 @@ @implementation GPUImageFilterPipeline #pragma mark Config file init -- (id) initWithConfiguration:(NSDictionary*) configuration input:(GPUImageOutput*)input output:(id )output { +- (id)initWithConfiguration:(NSDictionary *)configuration input:(GPUImageOutput *)input output:(id )output { self = [super init]; if (self) { self.input = input; @@ -27,19 +28,19 @@ - (id) initWithConfiguration:(NSDictionary*) configuration input:(GPUImageOutput return self; } -- (id) initWithConfigurationFile:(NSURL*) configuration input:(GPUImageOutput*)input output:(id )output { +- (id)initWithConfigurationFile:(NSURL *)configuration input:(GPUImageOutput *)input output:(id )output { return [self initWithConfiguration:[NSDictionary dictionaryWithContentsOfURL:configuration] input:input output:output]; } -- (BOOL) _parseConfiguration:(NSDictionary *)configuration { +- (BOOL)_parseConfiguration:(NSDictionary *)configuration { NSArray *filters = [configuration objectForKey:@"Filters"]; if (!filters) return NO; - + NSError *regexError = nil; NSRegularExpression *parsingRegex = [NSRegularExpression regularExpressionWithPattern:@"(float|CGPoint)\\((.*?)(?:,\\s*(.*?))*\\)" options:0 error:®exError]; - + // It's faster to put them into an array and then pass it to the filters property than it is to call [self addFilter:] every time NSMutableArray *orderedFilters = [NSMutableArray arrayWithCapacity:[filters count]]; for (NSDictionary *filter in filters) { @@ -55,42 +56,68 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[theClass instanceMethodSignatureForSelector:theSelector]]; [inv setSelector:theSelector]; [inv setTarget:genericFilter]; - + // Parse the argument - - NSString *string = [filterAttributes objectForKey:propertyKey]; - NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string - options:0 - range:NSMakeRange(0, [string length])]; - NSLog(@"Ranges: %d", parse.numberOfRanges); - NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; - if ([modifier isEqualToString:@"float"]) { - // Float modifier, one argument - CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - [inv setArgument:&value atIndex:2]; - } else if ([modifier isEqualToString:@"CGPoint"]) { - // CGPoint modifier, two float arguments - CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; - CGPoint value = CGPointMake(x, y); - [inv setArgument:&value atIndex:2]; + NSMutableArray *parsedArray; + if ([[filterAttributes objectForKey:propertyKey] isKindOfClass:[NSArray class]]) { + NSArray *array = [filterAttributes objectForKey:propertyKey]; + parsedArray = [NSMutableArray arrayWithCapacity:[array count]]; + for (NSString *string in array) { + NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string + options:0 + range:NSMakeRange(0, [string length])]; + NSLog(@"Ranges: %d", parse.numberOfRanges); + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; + if ([modifier isEqualToString:@"float"]) { + // Float modifier, one argument + CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + [parsedArray addObject:[NSNumber numberWithFloat:value]]; + [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"CGPoint"]) { + // CGPoint modifier, two float arguments + CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; + CGPoint value = CGPointMake(x, y); + [parsedArray addObject:[NSValue valueWithCGPoint:value]]; + } else { + return NO; + } + } + [inv setArgument:&parsedArray atIndex:2]; } else { - return NO; + NSString *string = [filterAttributes objectForKey:propertyKey]; + NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string + options:0 + range:NSMakeRange(0, [string length])]; + NSLog(@"Ranges: %d", parse.numberOfRanges); + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; + if ([modifier isEqualToString:@"float"]) { + // Float modifier, one argument + CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"CGPoint"]) { + // CGPoint modifier, two float arguments + CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; + CGPoint value = CGPointMake(x, y); + [inv setArgument:&value atIndex:2]; + } else { + return NO; + } } - [inv invoke]; } } [orderedFilters addObject:genericFilter]; } self.filters = orderedFilters; - + return YES; } #pragma mark Regular init -- (id) initWithOrderedFilters:(NSArray*) filters input:(GPUImageOutput*)input output:(id )output { +- (id)initWithOrderedFilters:(NSArray *)filters input:(GPUImageOutput *)input output:(id )output { self = [super init]; if (self) { self.input = input; @@ -101,58 +128,58 @@ - (id) initWithOrderedFilters:(NSArray*) filters input:(GPUImageOutput*)input ou return self; } -- (void) addFilter:(GPUImageFilter*)filter atIndex:(NSUInteger)insertIndex { +- (void)addFilter:(GPUImageFilter *)filter atIndex:(NSUInteger)insertIndex { [self.filters insertObject:filter atIndex:insertIndex]; [self _refreshFilters]; } -- (void) addFilter:(GPUImageFilter*)filter { +- (void)addFilter:(GPUImageFilter *)filter { [self.filters addObject:filter]; [self _refreshFilters]; } -- (void) replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageFilter*)filter { +- (void)replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageFilter *)filter { [self.filters replaceObjectAtIndex:index withObject:filter]; [self _refreshFilters]; } -- (void) removeFilterAtIndex:(NSUInteger)index { +- (void)removeFilterAtIndex:(NSUInteger)index { [self.filters removeObjectAtIndex:index]; [self _refreshFilters]; } -- (void) removeAllFilters { +- (void)removeAllFilters { [self.filters removeAllObjects]; [self _refreshFilters]; } -- (void) replaceAllFilters:(NSArray*) newFilters { +- (void)replaceAllFilters:(NSArray *)newFilters { self.filters = [NSMutableArray arrayWithArray:newFilters]; [self _refreshFilters]; } -- (void) _refreshFilters { - +- (void)_refreshFilters { + id prevFilter = self.input; GPUImageFilter *theFilter = nil; - + for (int i = 0; i < [self.filters count]; i++) { theFilter = [self.filters objectAtIndex:i]; [prevFilter removeAllTargets]; [prevFilter addTarget:theFilter]; prevFilter = theFilter; } - + [prevFilter removeAllTargets]; [prevFilter addTarget:self.output]; } -- (UIImage *) currentFilteredFrame { - return [(GPUImageFilter*)[_filters lastObject] imageFromCurrentlyProcessedOutput]; +- (UIImage *)currentFilteredFrame { + return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentlyProcessedOutput]; } -- (CGImageRef) newCGImageFromCurrentFilteredFrame { - return [(GPUImageFilter*)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; +- (CGImageRef)newCGImageFromCurrentFilteredFrame { + return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; } @end From 5bd364f8f96527132c42b4f526766cb16f4f5199 Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Thu, 30 Aug 2012 00:51:10 +0300 Subject: [PATCH 209/695] Filter pipeline now supports NSString modifiers. --- framework/Source/GPUImageFilterPipeline.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 684aae2a4..2b90f95d8 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -36,7 +36,7 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { if (!filters) return NO; NSError *regexError = nil; - NSRegularExpression *parsingRegex = [NSRegularExpression regularExpressionWithPattern:@"(float|CGPoint)\\((.*?)(?:,\\s*(.*?))*\\)" + NSRegularExpression *parsingRegex = [NSRegularExpression regularExpressionWithPattern:@"(float|CGPoint|NSString)\\((.*?)(?:,\\s*(.*?))*\\)" options:0 error:®exError]; @@ -74,6 +74,10 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; CGPoint value = CGPointMake(x, y); [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"NSString"]) { + // NSString modifier, one string argument + NSString *value = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; + [inv setArgument:&value atIndex:2]; } else { return NO; } From 4311bdc0dc1f5aba0cbc9ba02528d16a91dd654a Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Thu, 30 Aug 2012 00:57:18 +0300 Subject: [PATCH 210/695] Checking nil for ability to process filters on source picture. For example; UIImage *outputImage = nil; GPUImagePicture *sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:NO]; GPUImageFilterPipeline *pipeline = [[GPUImageFilterPipeline alloc] initWithConfiguration:filterInfo input:sourcePicture output:nil]; [sourcePicture processImage]; outputImage = [pipeline currentFilteredFrame]; --- framework/Source/GPUImageFilterPipeline.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 2b90f95d8..8928cc49f 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -148,7 +148,10 @@ - (void) _refreshFilters { } [prevFilter removeAllTargets]; - [prevFilter addTarget:self.output]; + + if (self.output != nil) { + [prevFilter addTarget:self.output]; + } } - (UIImage *) currentFilteredFrame { From 59be6c9607b47c09edfed5e7cb3c155c05376ad7 Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Thu, 30 Aug 2012 01:07:25 +0300 Subject: [PATCH 211/695] stringValue scope changed to avoid ARC auto-releasing issues. --- framework/Source/GPUImageFilterPipeline.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 8928cc49f..2329353f9 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -57,7 +57,7 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { [inv setTarget:genericFilter]; // Parse the argument - + NSString *stringValue = nil; NSString *string = [filterAttributes objectForKey:propertyKey]; NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string options:0 @@ -76,8 +76,8 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { [inv setArgument:&value atIndex:2]; } else if ([modifier isEqualToString:@"NSString"]) { // NSString modifier, one string argument - NSString *value = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; - [inv setArgument:&value atIndex:2]; + stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; + [inv setArgument:&stringValue atIndex:2]; } else { return NO; } From 6a92b9b21b2eededc71610a917a64bbbf93c34b3 Mon Sep 17 00:00:00 2001 From: alariccole Date: Thu, 30 Aug 2012 01:23:20 -0700 Subject: [PATCH 212/695] Adding filter for adjusting color temperature. An ideal addition to this filter would be a way to set its parameters via a pixel lookup. --- framework/Source/GPUImageWhiteBalanceFilter.h | 17 +++++ framework/Source/GPUImageWhiteBalanceFilter.m | 75 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 framework/Source/GPUImageWhiteBalanceFilter.h create mode 100644 framework/Source/GPUImageWhiteBalanceFilter.m diff --git a/framework/Source/GPUImageWhiteBalanceFilter.h b/framework/Source/GPUImageWhiteBalanceFilter.h new file mode 100644 index 000000000..00ed280b5 --- /dev/null +++ b/framework/Source/GPUImageWhiteBalanceFilter.h @@ -0,0 +1,17 @@ +#import "GPUImageFilter.h" +/** + * Created by Alaric Cole + * Allows adjustment of color temperature in terms of what an image was effectively shot in. This means higher Kelvin values will warm the image, while lower values will cool it. + + */ +@interface GPUImageWhiteBalanceFilter : GPUImageFilter +{ + GLint temperatureUniform, tintUniform; +} +//choose color temperature, in degress Kelvin +@property(readwrite, nonatomic) int temperature; + +//adjust tint to compensate +@property(readwrite, nonatomic) int tint; + +@end diff --git a/framework/Source/GPUImageWhiteBalanceFilter.m b/framework/Source/GPUImageWhiteBalanceFilter.m new file mode 100644 index 000000000..bb1a25b3c --- /dev/null +++ b/framework/Source/GPUImageWhiteBalanceFilter.m @@ -0,0 +1,75 @@ +#import "GPUImageWhiteBalanceFilter.h" + +NSString *const kGPUImageWhiteBalanceFragmentShaderString = SHADER_STRING +( +uniform sampler2D inputImageTexture; +varying highp vec2 textureCoordinate; + +uniform lowp float temperature; +uniform lowp float tint; + +const lowp vec3 warmFilter = vec3(0.93, 0.54, 0.0); + +const mediump mat3 RGBtoYIQ = mat3(0.299, 0.587, 0.114, 0.596, -0.274, -0.322, 0.212, -0.523, 0.311); +const mediump mat3 YIQtoRGB = mat3(1.0, 0.956, 0.621, 1.0, -0.272, -0.647, 1.0, -1.105, 1.702); + +void main() +{ + lowp vec4 source = texture2D(inputImageTexture, textureCoordinate); + + mediump vec3 yiq = RGBtoYIQ * source.rgb; //adjusting tint + yiq.b = clamp(yiq.b + tint*0.5226*0.1, -0.5226, 0.5226); + lowp vec3 rgb = YIQtoRGB * yiq; + + lowp vec3 processed = vec3( + (rgb.r < 0.5 ? (2.0 * rgb.r * warmFilter.r) : (1.0 - 2.0 * (1.0 - rgb.r) * (1.0 - warmFilter.r))), //adjusting temperature + (rgb.g < 0.5 ? (2.0 * rgb.g * warmFilter.g) : (1.0 - 2.0 * (1.0 - rgb.g) * (1.0 - warmFilter.g))), + (rgb.b < 0.5 ? (2.0 * rgb.b * warmFilter.b) : (1.0 - 2.0 * (1.0 - rgb.b) * (1.0 - warmFilter.b)))); + + gl_FragColor = vec4(mix(rgb, processed, temperature), source.a); +} +); + +@implementation GPUImageWhiteBalanceFilter + +@synthesize temperature = _temperature; +@synthesize tint = _tint; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageWhiteBalanceFragmentShaderString])) + { + return nil; + } + + temperatureUniform = [filterProgram uniformIndex:@"temperature"]; + tintUniform = [filterProgram uniformIndex:@"tint"]; + + self.temperature = 5000.0; + self.tint = 0.0; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setTemperature:(int)newValue; +{ + _temperature = newValue; + + [self setFloat:_temperature < 5000 ? 0.0004 * (float)(_temperature-5000.0) : 0.00006 * (float)(_temperature-5000.0) forUniform:temperatureUniform program:filterProgram]; +} + +- (void)setTint:(int)newValue; +{ + _tint = newValue; + + [self setFloat:(float)(_tint) / 100.0 forUniform:tintUniform program:filterProgram]; +} + +@end + From 2da7ee83696c36e1a591f7336feee3bd079582d8 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 30 Aug 2012 15:52:25 -0500 Subject: [PATCH 213/695] Added a generic chroma key filter for setting keyed areas transparent without needing a blend. Added the white balance filter to the showcase. --- README.md | 12 +++ .../ShowcaseFilterListController.m | 4 +- .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 28 ++++++- framework/GPUImage.xcodeproj/project.pbxproj | 16 ++++ framework/Source/GPUImage.h | 4 +- framework/Source/GPUImageChromaKeyFilter.h | 30 +++++++ framework/Source/GPUImageChromaKeyFilter.m | 84 +++++++++++++++++++ framework/Source/GPUImageWhiteBalanceFilter.h | 2 +- 9 files changed, 178 insertions(+), 4 deletions(-) create mode 100644 framework/Source/GPUImageChromaKeyFilter.h create mode 100644 framework/Source/GPUImageChromaKeyFilter.m diff --git a/README.md b/README.md index f1cb5dd27..84a7f2f4f 100755 --- a/README.md +++ b/README.md @@ -73,6 +73,14 @@ Documentation is generated from header comments using appledoc. To build the doc - *colorMatrix*: A 4x4 matrix used to transform each color in an image - *intensity*: The degree to which the new transformed color replaces the original color for each pixel +- **GPUImageRGBFilter**: Adjusts the individual RGB channels of an image + - *red*: Normalized values by which each color channel is multiplied. The range is from 0.0 up, with 1.0 as the default. + - *green*: + - *blue*: + +- **GPUImageHueFilter**: Adjusts the hue of an image + - *hue*: The hue angle, in degrees. 90 degrees by default + - **GPUImageToneCurveFilter**: Adjusts the colors of an image based on spline curves for each color channel. - *redControlPoints*: - *greenControlPoints*: @@ -128,6 +136,10 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageLuminosity**: Like the GPUImageAverageColor, this reduces an image to its average luminosity. You need to set the luminosityProcessingFinishedBlock to handle the output of this filter, which just returns a luminosity value and a frame time. +- **GPUImageChromaKeyFilter**: For a given color in the image, sets the alpha channel to 0. This is similar to the GPUImageChromaKeyBlendFilter, only instead of blending in a second image for a matching color this doesn't take in a second image and just turns a given color transparent. +- *thresholdSensitivity*: How close a color match needs to exist to the target color to be replaced (default of 0.4) +- *smoothing*: How smoothly to blend for the color match (default of 0.1) + ### Image processing ### - **GPUImageTransformFilter**: This applies an arbitrary 2-D or 3-D transformation to an image diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index c522f1821..99913924a 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -75,6 +75,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_EXPOSURE: cell.textLabel.text = @"Exposure"; break; case GPUIMAGE_RGB: cell.textLabel.text = @"RGB"; break; case GPUIMAGE_HUE: cell.textLabel.text = @"Hue"; break; + case GPUIMAGE_WHITEBALANCE: cell.textLabel.text = @"White balance"; break; case GPUIMAGE_MONOCHROME: cell.textLabel.text = @"Monochrome"; break; case GPUIMAGE_FALSECOLOR: cell.textLabel.text = @"False color"; break; case GPUIMAGE_SHARPEN: cell.textLabel.text = @"Sharpen"; break; @@ -83,6 +84,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_TONECURVE: cell.textLabel.text = @"Tone curve"; break; case GPUIMAGE_HIGHLIGHTSHADOW: cell.textLabel.text = @"Highlights and shadows"; break; case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; + case GPUIMAGE_CHROMAKEYNONBLEND: cell.textLabel.text = @"Chroma key"; break; case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; case GPUIMAGE_AVERAGECOLOR: cell.textLabel.text = @"Average color"; break; case GPUIMAGE_LUMINOSITY: cell.textLabel.text = @"Luminosity"; break; @@ -133,7 +135,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_VORONI: cell.textLabel.text = @"Voroni"; break; case GPUIMAGE_MOSAIC: cell.textLabel.text = @"Mosaic"; break; case GPUIMAGE_LOCALBINARYPATTERN: cell.textLabel.text = @"Local binary pattern"; break; - case GPUIMAGE_CHROMAKEY: cell.textLabel.text = @"Chroma key (green)"; break; + case GPUIMAGE_CHROMAKEY: cell.textLabel.text = @"Chroma key blend (green)"; break; case GPUIMAGE_DISSOLVE: cell.textLabel.text = @"Dissolve blend"; break; case GPUIMAGE_SCREENBLEND: cell.textLabel.text = @"Screen blend"; break; case GPUIMAGE_COLORBURN: cell.textLabel.text = @"Color burn blend"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index f053d01b8..a1f83ad27 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -8,6 +8,7 @@ typedef enum { GPUIMAGE_EXPOSURE, GPUIMAGE_RGB, GPUIMAGE_HUE, + GPUIMAGE_WHITEBALANCE, GPUIMAGE_MONOCHROME, GPUIMAGE_FALSECOLOR, GPUIMAGE_SHARPEN, @@ -52,6 +53,7 @@ typedef enum { GPUIMAGE_POSTERIZE, GPUIMAGE_CONVOLUTION, GPUIMAGE_EMBOSS, + GPUIMAGE_CHROMAKEYNONBLEND, GPUIMAGE_KUWAHARA, GPUIMAGE_VIGNETTE, GPUIMAGE_GAUSSIAN, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index ec35be6fd..1d3c0f9f4 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -232,6 +232,17 @@ - (void)setupFilter; filter = [[GPUImageHueFilter alloc] init]; }; break; + case GPUIMAGE_WHITEBALANCE: + { + self.title = @"White Balance"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:2500.0]; + [self.filterSettingsSlider setMaximumValue:7500.0]; + [self.filterSettingsSlider setValue:5000.0]; + + filter = [[GPUImageWhiteBalanceFilter alloc] init]; + }; break; case GPUIMAGE_EXPOSURE: { self.title = @"Exposure"; @@ -764,6 +775,19 @@ - (void)setupFilter; filter = [[GPUImageChromaKeyBlendFilter alloc] init]; [(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0]; }; break; + case GPUIMAGE_CHROMAKEYNONBLEND: + { + self.title = @"Chroma Key (Green)"; + self.filterSettingsSlider.hidden = NO; + needsSecondImage = YES; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.4]; + + filter = [[GPUImageChromaKeyFilter alloc] init]; + [(GPUImageChromaKeyFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0]; + }; break; case GPUIMAGE_ADD: { self.title = @"Add Blend"; @@ -1166,7 +1190,7 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } - else if (filterType == GPUIMAGE_OPACITY) + else if ( (filterType == GPUIMAGE_OPACITY) || (filterType == GPUIMAGE_CHROMAKEYNONBLEND) ) { [sourcePicture removeTarget:filter]; [videoCamera removeTarget:filter]; @@ -1244,6 +1268,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; case GPUIMAGE_HUE: [(GPUImageHueFilter *)filter setHue:[(UISlider *)sender value]]; break; + case GPUIMAGE_WHITEBALANCE: [(GPUImageWhiteBalanceFilter *)filter setTemperature:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setDownsamplingFactor:round([(UISlider *)sender value])]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; @@ -1257,6 +1282,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)filter setThresholdMultiplier:[(UISlider *)sender value]]; break; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; + case GPUIMAGE_CHROMAKEYNONBLEND: [(GPUImageChromaKeyFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)filter setRadius:round([(UISlider *)sender value])]; break; case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)filter setAngle:[(UISlider *)sender value]]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)filter setIntensity:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 4bfffe494..c1d2ed0ea 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -130,6 +130,10 @@ BC982C8414F34F0C0001FF6F /* GPUImageLightenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */; }; BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; }; BC982CA014F35C2D0001FF6F /* GPUImageToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */; }; + BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; }; + BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */; }; + BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; }; + BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */; }; BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; }; BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */; }; BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; }; @@ -420,6 +424,10 @@ BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLightenBlendFilter.m; path = Source/GPUImageLightenBlendFilter.m; sourceTree = SOURCE_ROOT; }; BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageToonFilter.h; path = Source/GPUImageToonFilter.h; sourceTree = SOURCE_ROOT; }; BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageToonFilter.m; path = Source/GPUImageToonFilter.m; sourceTree = SOURCE_ROOT; }; + BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyFilter.h; path = Source/GPUImageChromaKeyFilter.h; sourceTree = SOURCE_ROOT; }; + BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyFilter.m; path = Source/GPUImageChromaKeyFilter.m; sourceTree = SOURCE_ROOT; }; + BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageWhiteBalanceFilter.h; path = Source/GPUImageWhiteBalanceFilter.h; sourceTree = SOURCE_ROOT; }; + BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageWhiteBalanceFilter.m; path = Source/GPUImageWhiteBalanceFilter.m; sourceTree = SOURCE_ROOT; }; BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePolarPixellateFilter.h; path = Source/GPUImagePolarPixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePolarPixellateFilter.m; path = Source/GPUImagePolarPixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStretchDistortionFilter.h; path = Source/GPUImageStretchDistortionFilter.h; sourceTree = SOURCE_ROOT; }; @@ -683,6 +691,10 @@ BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */, BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */, BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */, + BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */, + BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */, + BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */, + BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -1145,6 +1157,8 @@ BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */, BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */, BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */, + BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */, + BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1390,6 +1404,8 @@ BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */, BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */, BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */, + BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */, + BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 11ebbb59e..40388fe38 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -122,4 +122,6 @@ #import "GPUImageAverageColor.h" #import "GPUImageSolidColorGenerator.h" #import "GPUImageLuminosity.h" -#import "GPUImageAverageLuminanceThresholdFilter.h" \ No newline at end of file +#import "GPUImageAverageLuminanceThresholdFilter.h" +#import "GPUImageWhiteBalanceFilter.h" +#import "GPUImageChromaKeyFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageChromaKeyFilter.h b/framework/Source/GPUImageChromaKeyFilter.h new file mode 100644 index 000000000..a3d073c86 --- /dev/null +++ b/framework/Source/GPUImageChromaKeyFilter.h @@ -0,0 +1,30 @@ +#import "GPUImageFilter.h" + +@interface GPUImageChromaKeyFilter : GPUImageFilter +{ + GLint colorToReplaceUniform, thresholdSensitivityUniform, smoothingUniform; +} + +/** The threshold sensitivity controls how similar pixels need to be colored to be replaced + + The default value is 0.3 + */ +@property(readwrite, nonatomic) GLfloat thresholdSensitivity; + +/** The degree of smoothing controls how gradually similar colors are replaced in the image + + The default value is 0.1 + */ +@property(readwrite, nonatomic) GLfloat smoothing; + +/** The color to be replaced is specified using individual red, green, and blue components (normalized to 1.0). + + The default is green: (0.0, 1.0, 0.0). + + @param redComponent Red component of color to be replaced + @param greenComponent Green component of color to be replaced + @param blueComponent Blue component of color to be replaced + */ +- (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; + +@end diff --git a/framework/Source/GPUImageChromaKeyFilter.m b/framework/Source/GPUImageChromaKeyFilter.m new file mode 100644 index 000000000..9e032922d --- /dev/null +++ b/framework/Source/GPUImageChromaKeyFilter.m @@ -0,0 +1,84 @@ +#import "GPUImageChromaKeyFilter.h" + +// Shader code based on Apple's CIChromaKeyFilter example: https://developer.apple.com/library/mac/#samplecode/CIChromaKeyFilter/Introduction/Intro.html + +NSString *const kGPUImageChromaKeyFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying highp vec2 textureCoordinate; + + uniform float thresholdSensitivity; + uniform float smoothing; + uniform vec3 colorToReplace; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b; + float maskCr = 0.7132 * (colorToReplace.r - maskY); + float maskCb = 0.5647 * (colorToReplace.b - maskY); + + float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b; + float Cr = 0.7132 * (textureColor.r - Y); + float Cb = 0.5647 * (textureColor.b - Y); + + // float blendValue = 1.0 - smoothstep(thresholdSensitivity - smoothing, thresholdSensitivity , abs(Cr - maskCr) + abs(Cb - maskCb)); + float blendValue = smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb))); + gl_FragColor = vec4(textureColor.rgb, textureColor.a * blendValue); + } +); + + +@implementation GPUImageChromaKeyFilter + +@synthesize thresholdSensitivity = _thresholdSensitivity; +@synthesize smoothing = _smoothing; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageChromaKeyFragmentShaderString])) + { + return nil; + } + + thresholdSensitivityUniform = [filterProgram uniformIndex:@"thresholdSensitivity"]; + smoothingUniform = [filterProgram uniformIndex:@"smoothing"]; + colorToReplaceUniform = [filterProgram uniformIndex:@"colorToReplace"]; + + self.thresholdSensitivity = 0.4; + self.smoothing = 0.1; + [self setColorToReplaceRed:0.0 green:1.0 blue:0.0]; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +{ + GPUVector3 colorToReplace = {redComponent, greenComponent, blueComponent}; + + [self setVec3:colorToReplace forUniform:colorToReplaceUniform program:filterProgram]; +} + +- (void)setThresholdSensitivity:(CGFloat)newValue; +{ + _thresholdSensitivity = newValue; + + [self setFloat:_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; +} + +- (void)setSmoothing:(CGFloat)newValue; +{ + _smoothing = newValue; + + [self setFloat:_smoothing forUniform:smoothingUniform program:filterProgram]; +} + + +@end diff --git a/framework/Source/GPUImageWhiteBalanceFilter.h b/framework/Source/GPUImageWhiteBalanceFilter.h index 00ed280b5..eafd65a0b 100644 --- a/framework/Source/GPUImageWhiteBalanceFilter.h +++ b/framework/Source/GPUImageWhiteBalanceFilter.h @@ -8,7 +8,7 @@ { GLint temperatureUniform, tintUniform; } -//choose color temperature, in degress Kelvin +//choose color temperature, in degrees Kelvin @property(readwrite, nonatomic) int temperature; //adjust tint to compensate From ce09ed4110cb039fc8ced7ac2643359699a7ace5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 30 Aug 2012 22:23:35 -0500 Subject: [PATCH 214/695] Fixed image capture from filter groups, which affected still image filtering on tilt shifts, unsharp masks, and others. --- .../SimpleImageViewController.h | 2 +- .../SimpleImageViewController.m | 2 -- framework/Source/GPUImageFilter.m | 6 ++-- framework/Source/GPUImageFilterGroup.m | 35 ------------------- framework/Source/GPUImageOutput.m | 32 +++++++++++++---- framework/Source/GPUImagePicture.m | 2 +- framework/Source/GPUImageTwoInputFilter.m | 1 - 7 files changed, 31 insertions(+), 49 deletions(-) diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h index 1970add09..239e6b5bd 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h @@ -4,7 +4,7 @@ @interface SimpleImageViewController : UIViewController { GPUImagePicture *sourcePicture; - GPUImageFilter *sepiaFilter, *sepiaFilter2; + GPUImageOutput *sepiaFilter, *sepiaFilter2; } // Image filtering diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index c3fbc5c00..f3eaa007f 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -46,7 +46,6 @@ - (void)setupDisplayFiltering; sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; sepiaFilter = [[GPUImageSepiaFilter alloc] init]; - GPUImageView *imageView = (GPUImageView *)self.view; [sepiaFilter forceProcessingAtSize:imageView.sizeInPixels]; // This is now needed to make the filter run at the smaller output size @@ -85,7 +84,6 @@ - (void)setupImageFilteringToDisk; // GPUImageUnsharpMaskFilter *stillImageFilter2 = [[GPUImageUnsharpMaskFilter alloc] init]; // GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; - // Write images to disk, as proof NSData *dataForPNGFile = UIImagePNGRepresentation(currentFilteredImage); diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 77b0b65a9..b1f2dd472 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -222,7 +222,8 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio return finalImage; } -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter { +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter +{ return [self newCGImageByFilteringCGImage:imageToFilter orientation:UIImageOrientationUp]; } @@ -241,7 +242,8 @@ - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation return processedImage; } -- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter { +- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter +{ return [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; } diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index a21ddb1cf..706554e02 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -42,46 +42,11 @@ - (int)filterCount; #pragma mark - #pragma mark Still image processing -- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; -{ - return [self.terminalFilter imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; -} - - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { return [self.terminalFilter newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; } -- (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; -{ - return [self.terminalFilter imageByFilteringImage:imageToFilter]; -// CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; -// UIImage *processedImage = [UIImage imageWithCGImage:image]; -// CGImageRelease(image); -// return processedImage; -} - -- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter; -{ - return [self.terminalFilter newCGImageByFilteringImage:imageToFilter]; -// -// return [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; -} - -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; -{ - return [self.terminalFilter newCGImageByFilteringCGImage:imageToFilter]; -// GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; -// -// [stillImageSource addTarget:self]; -// [stillImageSource processImage]; -// -// CGImageRef processedImage = [self.terminalFilter newCGImageFromCurrentlyProcessedOutput]; -// -// [stillImageSource removeTarget:self]; -// return processedImage; -} - - (void)prepareForImageCapture; { [self.terminalFilter prepareForImageCapture]; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index a4789620b..b5ac83c7a 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -1,5 +1,6 @@ #import "GPUImageOutput.h" #import "GPUImageMovieWriter.h" +#import "GPUImagePicture.h" #import void runOnMainQueueWithoutDeadlocking(void (^block)(void)) @@ -289,12 +290,19 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutput; - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { - return nil; + CGImageRef cgImageFromBytes = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + UIImage *finalImage = [UIImage imageWithCGImage:cgImageFromBytes scale:1.0 orientation:imageOrientation]; + CGImageRelease(cgImageFromBytes); + + return finalImage; } - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; { - return nil; + CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; + UIImage *processedImage = [UIImage imageWithCGImage:image scale:[imageToFilter scale] orientation:[imageToFilter imageOrientation]]; + CGImageRelease(image); + return processedImage; } - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; @@ -302,19 +310,29 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrie return nil; } -- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter; +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter { - return nil; + return [self newCGImageByFilteringCGImage:imageToFilter orientation:UIImageOrientationUp]; } -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; +- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter { - return nil; + return [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; } - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; { - return nil; + GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; + + [self prepareForImageCapture]; + + [stillImageSource addTarget:(id)self]; + [stillImageSource processImage]; + + CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation]; + + [stillImageSource removeTarget:(id)self]; + return processedImage; } - (void)prepareForImageCapture; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 7809eb2e5..0eeb333bb 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -149,7 +149,7 @@ - (void)processImage; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; } - }); + }); } - (CGSize)outputImageSize; diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 05d5c107b..57a74e4e5 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -218,7 +218,6 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; if ((hasReceivedFirstFrame && hasReceivedSecondFrame) || updatedMovieFrameOppositeStillImage) { - [super newFrameReadyAtTime:frameTime atIndex:0]; hasReceivedFirstFrame = NO; hasReceivedSecondFrame = NO; From 09dcd465f2e41797f182108558389e5083a08cdd Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 30 Aug 2012 23:17:51 -0500 Subject: [PATCH 215/695] Fixed a problem with the selective blur filter, and others that depend on aspect ratios. --- framework/Source/GPUImageGaussianSelectiveBlurFilter.m | 2 +- framework/Source/GPUImageHistogramFilter.h | 1 + framework/Source/GPUImageHistogramFilter.m | 5 ++--- framework/Source/GPUImageLuminosity.h | 1 + framework/Source/GPUImageLuminosity.m | 5 ++--- framework/Source/GPUImagePixellateFilter.m | 3 ++- framework/Source/GPUImageSphereRefractionFilter.m | 2 +- framework/Source/GPUImageTwoInputFilter.m | 5 ++--- framework/Source/GPUImageTwoPassFilter.h | 1 + framework/Source/GPUImageTwoPassFilter.m | 5 ++--- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index 6eddc8c8e..98c478568 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -72,7 +72,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; [super setInputSize:newSize atIndex:textureIndex]; inputTextureSize = newSize; - if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!hasOverriddenAspectRatio) ) + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!hasOverriddenAspectRatio) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { _aspectRatio = (inputTextureSize.width / inputTextureSize.height); [selectiveFocusFilter setFloat:_aspectRatio forUniformName:@"aspectRatio"]; diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h index fc0ea0718..6016d5e6c 100755 --- a/framework/Source/GPUImageHistogramFilter.h +++ b/framework/Source/GPUImageHistogramFilter.h @@ -17,6 +17,7 @@ typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogra // Initialization and teardown - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; +- (void)initializeSecondaryAttributes; // Rendering - (void)generatePointCoordinates; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 661f8a027..0a7779992 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -136,7 +136,7 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; if (!secondFilterProgram.initialized) { - [self initializeAttributes]; + [self initializeSecondaryAttributes]; if (![secondFilterProgram link]) { @@ -186,9 +186,8 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; return self; } -- (void)initializeAttributes; +- (void)initializeSecondaryAttributes; { - [super initializeAttributes]; [secondFilterProgram addAttribute:@"position"]; [thirdFilterProgram addAttribute:@"position"]; } diff --git a/framework/Source/GPUImageLuminosity.h b/framework/Source/GPUImageLuminosity.h index 820184e23..b2d2458f5 100644 --- a/framework/Source/GPUImageLuminosity.h +++ b/framework/Source/GPUImageLuminosity.h @@ -12,5 +12,6 @@ @property(nonatomic, copy) void(^luminosityProcessingFinishedBlock)(CGFloat luminosity, CMTime frameTime); - (void)extractLuminosityAtFrameTime:(CMTime)frameTime; +- (void)initializeSecondaryAttributes; @end diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index b5c194aeb..b17380c52 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -85,7 +85,7 @@ - (id)init; if (!secondFilterProgram.initialized) { - [self initializeAttributes]; + [self initializeSecondaryAttributes]; if (![secondFilterProgram link]) { @@ -117,9 +117,8 @@ - (id)init; return self; } -- (void)initializeAttributes; +- (void)initializeSecondaryAttributes; { - [super initializeAttributes]; [secondFilterProgram addAttribute:@"position"]; [secondFilterProgram addAttribute:@"inputTextureCoordinate"]; } diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index a7a77584f..28071abec 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -62,7 +62,8 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; CGSize oldInputSize = inputTextureSize; [super setInputSize:newSize atIndex:textureIndex]; - if (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) + { [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; } diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index c4815fc58..45b9b41d0 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -81,7 +81,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; CGSize oldInputSize = inputTextureSize; [super setInputSize:newSize atIndex:textureIndex]; - if (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) + if (!CGSizeEqualToSize(oldInputSize, inputTextureSize) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; } diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 57a74e4e5..81eca4ecb 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -66,7 +66,6 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad - (void)initializeAttributes; { [super initializeAttributes]; - [filterProgram addAttribute:@"inputTextureCoordinate2"]; } @@ -94,8 +93,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); - glUniform1i(filterInputTextureUniform2, 3); - + glUniform1i(filterInputTextureUniform2, 3); + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glVertexAttribPointer(filterSecondTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation2]); diff --git a/framework/Source/GPUImageTwoPassFilter.h b/framework/Source/GPUImageTwoPassFilter.h index abb027481..722bbc8c7 100755 --- a/framework/Source/GPUImageTwoPassFilter.h +++ b/framework/Source/GPUImageTwoPassFilter.h @@ -14,5 +14,6 @@ // Initialization and teardown - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString; - (id)initWithFirstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString; +- (void)initializeSecondaryAttributes; @end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 6d008a231..363ba6475 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -19,7 +19,7 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade if (!secondFilterProgram.initialized) { - [self initializeAttributes]; + [self initializeSecondaryAttributes]; if (![secondFilterProgram link]) { @@ -58,9 +58,8 @@ - (id)initWithFirstStageFragmentShaderFromString:(NSString *)firstStageFragmentS return self; } -- (void)initializeAttributes; +- (void)initializeSecondaryAttributes; { - [super initializeAttributes]; [secondFilterProgram addAttribute:@"position"]; [secondFilterProgram addAttribute:@"inputTextureCoordinate"]; } From 223ff9b3ad391fda8f9d4515c05e68006963ca57 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Sat, 1 Sep 2012 19:02:12 -0500 Subject: [PATCH 216/695] Fixed bug where calling forceProcessingAtSize: will change all subsequent forceProcessingAtSize: calls to undesired sizes. Can now also access the AVCaptureConnection of a GPUImageVideoCamera --- framework/Source/GPUImageFilter.m | 18 ++++++++++++++++++ framework/Source/GPUImageOpenGLESContext.h | 2 +- framework/Source/GPUImageStillCamera.h | 2 +- framework/Source/GPUImageStillCamera.m | 11 +++++++---- framework/Source/GPUImageVideoCamera.h | 4 ++++ framework/Source/GPUImageVideoCamera.m | 12 ++++++++++++ 6 files changed, 43 insertions(+), 6 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index b1f2dd472..37e2f08a7 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -832,6 +832,15 @@ - (void)forceProcessingAtSize:(CGSize)frameSize; inputTextureSize = frameSize; forcedMaximumSize = CGSizeZero; } + + [self destroyFilterFBO]; + + for (id currentTarget in targets) + { + if ([currentTarget respondsToSelector:@selector(destroyFilterFBO)]) { + [currentTarget performSelector:@selector(destroyFilterFBO)]; + } + } } - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; @@ -847,6 +856,15 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; overrideInputSize = YES; forcedMaximumSize = frameSize; } + + [self destroyFilterFBO]; + + for (id currentTarget in targets) + { + if ([currentTarget respondsToSelector:@selector(destroyFilterFBO)]) { + [currentTarget performSelector:@selector(destroyFilterFBO)]; + } + } } - (CGSize)maximumOutputSize; diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 4fdce446c..955b28e81 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -32,7 +32,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k @end -@protocol GPUImageInput +@protocol GPUImageInput - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index e970403df..542ab6c8d 100755 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -6,7 +6,7 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina @interface GPUImageStillCamera : GPUImageVideoCamera // Photography controls -//- (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block; +- (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block; - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 29e60669e..38b27081b 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -88,15 +88,18 @@ - (void)removeInputsAndOutputs; #pragma mark - #pragma mark Photography controls -/*- (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block +- (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block { + NSLog(@"If you want to use the method capturePhotoAsSampleBufferWithCompletionHandler:, you must comment out the line in GPUImageStillCamera.m in the method initWithSessionPreset:cameraPosition: which sets the CVPixelBufferPixelFormatTypeKey, as well as uncomment the rest of the method capturePhotoAsSampleBufferWithCompletionHandler:. However, if you do this you cannot use any of the photo capture methods to take a photo if you also supply a filter."); + + /*dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { -#error If you want to use this method, you must comment out the line in initWithSessionPreset:cameraPosition: which sets the CVPixelBufferPixelFormatTypeKey. However, if you do this you cannot use any of the below methods to take a photo if you also supply a filter. block(imageSampleBuffer, error); - }]; + }];*/ return; -}*/ +} - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index e580d5a23..2a6d68d4b 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -110,6 +110,10 @@ */ - (AVCaptureDevicePosition)cameraPosition; +/** Get the AVCaptureConnection of the source camera + */ +- (AVCaptureConnection *)videoCaptureConnection; + /** This flips between the front and rear cameras */ - (void)rotateCamera; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index bef218641..f230a6a05 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -322,6 +322,18 @@ - (NSInteger)frameRate; return _frameRate; } +- (AVCaptureConnection *)videoCaptureConnection { + for (AVCaptureConnection *connection in [videoOutput connections] ) { + for ( AVCaptureInputPort *port in [connection inputPorts] ) { + if ( [[port mediaType] isEqual:AVMediaTypeVideo] ) { + return connection; + } + } + } + + return nil; +} + #define INITIALFRAMESTOIGNOREFORBENCHMARK 5 - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; From 46fa7df8a6935aba3f3a4d335656ab34d3f308c1 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 1 Sep 2012 21:52:31 -0500 Subject: [PATCH 217/695] Added a high pass and a low pass filter. Fixed compilation issues with GPUImageBuffer on older Xcode versions. --- .../ShowcaseFilterListController.m | 2 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 24 +++++++++ framework/GPUImage.xcodeproj/project.pbxproj | 16 ++++++ framework/Source/GPUImage.h | 4 +- framework/Source/GPUImageBuffer.m | 8 +++ framework/Source/GPUImageHighPassFilter.h | 14 ++++++ framework/Source/GPUImageHighPassFilter.m | 44 ++++++++++++++++ framework/Source/GPUImageLowPassFilter.h | 14 ++++++ framework/Source/GPUImageLowPassFilter.m | 50 +++++++++++++++++++ framework/Source/GPUImageTwoInputFilter.h | 4 ++ framework/Source/GPUImageTwoInputFilter.m | 23 ++++++++- framework/Source/GPUImageUnsharpMaskFilter.m | 3 -- 13 files changed, 203 insertions(+), 5 deletions(-) create mode 100644 framework/Source/GPUImageHighPassFilter.h create mode 100644 framework/Source/GPUImageHighPassFilter.m create mode 100644 framework/Source/GPUImageLowPassFilter.h create mode 100644 framework/Source/GPUImageLowPassFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 99913924a..3e87afcbf 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -113,6 +113,8 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_NOBLECORNERDETECTION: cell.textLabel.text = @"Noble corner detection"; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: cell.textLabel.text = @"Shi-Tomasi feature detection"; break; case GPUIMAGE_BUFFER: cell.textLabel.text = @"Image buffer"; break; + case GPUIMAGE_LOWPASS: cell.textLabel.text = @"Low pass"; break; + case GPUIMAGE_HIGHPASS: cell.textLabel.text = @"High pass"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; case GPUIMAGE_SMOOTHTOON: cell.textLabel.text = @"Smooth toon"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index a1f83ad27..339955036 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -45,6 +45,8 @@ typedef enum { GPUIMAGE_NOBLECORNERDETECTION, GPUIMAGE_SHITOMASIFEATUREDETECTION, GPUIMAGE_BUFFER, + GPUIMAGE_LOWPASS, + GPUIMAGE_HIGHPASS, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_SMOOTHTOON, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 1d3c0f9f4..a8c862ca2 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -523,6 +523,28 @@ - (void)setupFilter; filter = [[GPUImageBuffer alloc] init]; }; break; + case GPUIMAGE_LOWPASS: + { + self.title = @"Low Pass"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImageLowPassFilter alloc] init]; + }; break; + case GPUIMAGE_HIGHPASS: + { + self.title = @"High Pass"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImageHighPassFilter alloc] init]; + }; break; case GPUIMAGE_SKETCH: { self.title = @"Sketch"; @@ -1281,6 +1303,8 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)filter setThresholdMultiplier:[(UISlider *)sender value]]; break; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; + case GPUIMAGE_LOWPASS: [(GPUImageLowPassFilter *)filter setFilterStrength:[(UISlider *)sender value]]; break; + case GPUIMAGE_HIGHPASS: [(GPUImageHighPassFilter *)filter setFilterStrength:[(UISlider *)sender value]]; break; case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; case GPUIMAGE_CHROMAKEYNONBLEND: [(GPUImageChromaKeyFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)filter setRadius:round([(UISlider *)sender value])]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index c1d2ed0ea..e8c825f79 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -162,6 +162,10 @@ BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; }; BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */; }; + BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; }; + BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */; }; + BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; }; + BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */; }; BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; @@ -456,6 +460,10 @@ BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDirectionalNonMaximumSuppressionFilter.m; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageWeakPixelInclusionFilter.h; path = Source/GPUImageWeakPixelInclusionFilter.h; sourceTree = SOURCE_ROOT; }; BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageWeakPixelInclusionFilter.m; path = Source/GPUImageWeakPixelInclusionFilter.m; sourceTree = SOURCE_ROOT; }; + BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLowPassFilter.h; path = Source/GPUImageLowPassFilter.h; sourceTree = SOURCE_ROOT; }; + BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLowPassFilter.m; path = Source/GPUImageLowPassFilter.m; sourceTree = SOURCE_ROOT; }; + BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHighPassFilter.h; path = Source/GPUImageHighPassFilter.h; sourceTree = SOURCE_ROOT; }; + BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHighPassFilter.m; path = Source/GPUImageHighPassFilter.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; @@ -935,6 +943,10 @@ BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */, BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */, BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */, + BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */, + BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */, + BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */, + BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -1159,6 +1171,8 @@ BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */, BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */, BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */, + BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */, + BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1406,6 +1420,8 @@ BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */, BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */, BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */, + BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */, + BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 40388fe38..2fbb03a49 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -124,4 +124,6 @@ #import "GPUImageLuminosity.h" #import "GPUImageAverageLuminanceThresholdFilter.h" #import "GPUImageWhiteBalanceFilter.h" -#import "GPUImageChromaKeyFilter.h" \ No newline at end of file +#import "GPUImageChromaKeyFilter.h" +#import "GPUImageLowPassFilter.h" +#import "GPUImageHighPassFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index ce7fa8314..634968129 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -1,5 +1,13 @@ #import "GPUImageBuffer.h" +@interface GPUImageBuffer() + +//Texture management +- (GLuint)generateTexture; +- (void)removeTexture:(GLuint)textureToRemove; + +@end + @implementation GPUImageBuffer @synthesize bufferSize = _bufferSize; diff --git a/framework/Source/GPUImageHighPassFilter.h b/framework/Source/GPUImageHighPassFilter.h new file mode 100644 index 000000000..263d8df1a --- /dev/null +++ b/framework/Source/GPUImageHighPassFilter.h @@ -0,0 +1,14 @@ +#import "GPUImageFilterGroup.h" +#import "GPUImageLowPassFilter.h" +#import "GPUImageDifferenceBlendFilter.h" + +@interface GPUImageHighPassFilter : GPUImageFilterGroup +{ + GPUImageLowPassFilter *lowPassFilter; + GPUImageDifferenceBlendFilter *differenceBlendFilter; +} + +// This controls the degree by which the previous accumulated frames are blended and then subtracted from the current one. This ranges from 0.0 to 1.0, with a default of 0.5. +@property(readwrite, nonatomic) CGFloat filterStrength; + +@end diff --git a/framework/Source/GPUImageHighPassFilter.m b/framework/Source/GPUImageHighPassFilter.m new file mode 100644 index 000000000..b07c42c60 --- /dev/null +++ b/framework/Source/GPUImageHighPassFilter.m @@ -0,0 +1,44 @@ +#import "GPUImageHighPassFilter.h" + +@implementation GPUImageHighPassFilter + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + // Start with a low pass filter to define the component to be removed + lowPassFilter = [[GPUImageLowPassFilter alloc] init]; + [self addFilter:lowPassFilter]; + + // Take the difference of the current frame from the low pass filtered result to get the high pass + differenceBlendFilter = [[GPUImageDifferenceBlendFilter alloc] init]; + [self addFilter:differenceBlendFilter]; + + // Texture location 0 needs to be the original image for the difference blend + [lowPassFilter addTarget:differenceBlendFilter atTextureLocation:1]; + + self.initialFilters = [NSArray arrayWithObjects:lowPassFilter, differenceBlendFilter, nil]; + self.terminalFilter = differenceBlendFilter; + + self.filterStrength = 0.5; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setFilterStrength:(CGFloat)newValue; +{ + lowPassFilter.filterStrength = newValue; +} + +- (CGFloat)filterStrength; +{ + return lowPassFilter.filterStrength; +} + +@end diff --git a/framework/Source/GPUImageLowPassFilter.h b/framework/Source/GPUImageLowPassFilter.h new file mode 100644 index 000000000..be5c397e9 --- /dev/null +++ b/framework/Source/GPUImageLowPassFilter.h @@ -0,0 +1,14 @@ +#import "GPUImageFilterGroup.h" +#import "GPUImageBuffer.h" +#import "GPUImageDissolveBlendFilter.h" + +@interface GPUImageLowPassFilter : GPUImageFilterGroup +{ + GPUImageBuffer *bufferFilter; + GPUImageDissolveBlendFilter *dissolveBlendFilter; +} + +// This controls the degree by which the previous accumulated frames are blended with the current one. This ranges from 0.0 to 1.0, with a default of 0.5. +@property(readwrite, nonatomic) CGFloat filterStrength; + +@end diff --git a/framework/Source/GPUImageLowPassFilter.m b/framework/Source/GPUImageLowPassFilter.m new file mode 100644 index 000000000..dfc6a1b96 --- /dev/null +++ b/framework/Source/GPUImageLowPassFilter.m @@ -0,0 +1,50 @@ +#import "GPUImageLowPassFilter.h" + +@implementation GPUImageLowPassFilter + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + // Take in the frame and blend it with the previous one + dissolveBlendFilter = [[GPUImageDissolveBlendFilter alloc] init]; + [self addFilter:dissolveBlendFilter]; + + // Buffer the result to be fed back into the blend + bufferFilter = [[GPUImageBuffer alloc] init]; + [self addFilter:bufferFilter]; + + // Texture location 0 needs to be the original image for the dissolve blend + [bufferFilter addTarget:dissolveBlendFilter atTextureLocation:1]; + [dissolveBlendFilter addTarget:bufferFilter]; + + [dissolveBlendFilter disableSecondFrameCheck]; + + // To prevent double updating of this filter, disable updates from the sharp image side + // self.inputFilterToIgnoreForUpdates = unsharpMaskFilter; + + self.initialFilters = [NSArray arrayWithObject:dissolveBlendFilter]; + self.terminalFilter = dissolveBlendFilter; + + self.filterStrength = 0.5; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setFilterStrength:(CGFloat)newValue; +{ + dissolveBlendFilter.mix = newValue; +} + +- (CGFloat)filterStrength; +{ + return dissolveBlendFilter.mix; +} + +@end diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h index e70706fe0..2995415f9 100644 --- a/framework/Source/GPUImageTwoInputFilter.h +++ b/framework/Source/GPUImageTwoInputFilter.h @@ -11,6 +11,10 @@ extern NSString *const kGPUImageTwoInputTextureVertexShaderString; CMTime firstFrameTime, secondFrameTime; BOOL hasSetFirstTexture, hasReceivedFirstFrame, hasReceivedSecondFrame, firstFrameWasVideo, secondFrameWasVideo; + BOOL firstFrameCheckDisabled, secondFrameCheckDisabled; } +- (void)disableFirstFrameCheck; +- (void)disableSecondFrameCheck; + @end diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 81eca4ecb..b223e9a1c 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -48,6 +48,8 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad hasReceivedSecondFrame = NO; firstFrameWasVideo = NO; secondFrameWasVideo = NO; + firstFrameCheckDisabled = NO; + secondFrameCheckDisabled = NO; firstFrameTime = kCMTimeInvalid; secondFrameTime = kCMTimeInvalid; @@ -69,6 +71,16 @@ - (void)initializeAttributes; [filterProgram addAttribute:@"inputTextureCoordinate2"]; } +- (void)disableFirstFrameCheck; +{ + firstFrameCheckDisabled = YES; +} + +- (void)disableSecondFrameCheck; +{ + secondFrameCheckDisabled = YES; +} + #pragma mark - #pragma mark Rendering @@ -192,6 +204,10 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { hasReceivedFirstFrame = YES; firstFrameTime = frameTime; + if (secondFrameCheckDisabled) + { + hasReceivedSecondFrame = YES; + } if (!CMTIME_IS_INDEFINITE(frameTime)) { @@ -205,6 +221,10 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { hasReceivedSecondFrame = YES; secondFrameTime = frameTime; + if (firstFrameCheckDisabled) + { + hasReceivedSecondFrame = YES; + } if (!CMTIME_IS_INDEFINITE(frameTime)) { @@ -214,7 +234,8 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } } } - + + // || (hasReceivedFirstFrame && secondFrameCheckDisabled) || (hasReceivedSecondFrame && firstFrameCheckDisabled) if ((hasReceivedFirstFrame && hasReceivedSecondFrame) || updatedMovieFrameOppositeStillImage) { [super newFrameReadyAtTime:frameTime atIndex:0]; diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index b1f2b618b..64765558d 100755 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -47,9 +47,6 @@ - (id)init; // Texture location 0 needs to be the sharp image for both the blur and the second stage processing [blurFilter addTarget:unsharpMaskFilter atTextureLocation:1]; - // To prevent double updating of this filter, disable updates from the sharp image side -// self.inputFilterToIgnoreForUpdates = unsharpMaskFilter; - self.initialFilters = [NSArray arrayWithObjects:blurFilter, unsharpMaskFilter, nil]; self.terminalFilter = unsharpMaskFilter; From bc1c59a195167863548423459f9ac9e13d201c0a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 2 Sep 2012 17:11:16 -0500 Subject: [PATCH 218/695] Added a motion detector based on the high-pass filter. --- README.md | 10 +++ .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 44 ++++++++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageHighPassFilter.m | 2 + framework/Source/GPUImageLowPassFilter.m | 2 + framework/Source/GPUImageMotionDetector.h | 18 ++++ framework/Source/GPUImageMotionDetector.m | 88 +++++++++++++++++++ 10 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageMotionDetector.h create mode 100644 framework/Source/GPUImageMotionDetector.m diff --git a/README.md b/README.md index 84a7f2f4f..1ede1e1f6 100755 --- a/README.md +++ b/README.md @@ -232,6 +232,16 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageRGBClosingFilter**: This is the same as the GPUImageClosingFilter, except that this acts on all color channels, not just the red channel. +- **GPUImageLowPassFilter**: This applies a low pass filter to incoming video frames. This basically accumulates a weighted rolling average of previous frames with the current ones as they come in. This can be used to denoise video, add motion blur, or be used to create a high pass filter. + - *filterStrength*: This controls the degree by which the previous accumulated frames are blended with the current one. This ranges from 0.0 to 1.0, with a default of 0.5. + +- **GPUImageHighPassFilter**: This applies a high pass filter to incoming video frames. This is the inverse of the low pass filter, showing the difference between the current frame and the weighted rolling average of previous ones. This is most useful for motion detection. + - *filterStrength*: This controls the degree by which the previous accumulated frames are blended and then subtracted from the current one. This ranges from 0.0 to 1.0, with a default of 0.5. + +- **GPUImageMotionDetector**: This is a motion detector based on a high-pass filter. You set the motionDetectionBlock and on every incoming frame it will give you the centroid of any detected movement in the scene (in normalized X,Y coordinates) as well as an intensity of motion for the scene. + - *lowPassFilterStrength*: This controls the strength of the low pass filter used behind the scenes to establish the baseline that incoming frames are compared with. This ranges from 0.0 to 1.0, with a default of 0.5. + + ### Blending modes ### - **GPUImageChromaKeyBlendFilter**: Selectively replaces a color in the first image with the second image diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 3e87afcbf..ecaa88528 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -113,6 +113,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_NOBLECORNERDETECTION: cell.textLabel.text = @"Noble corner detection"; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: cell.textLabel.text = @"Shi-Tomasi feature detection"; break; case GPUIMAGE_BUFFER: cell.textLabel.text = @"Image buffer"; break; + case GPUIMAGE_MOTIONDETECTOR: cell.textLabel.text = @"Motion detector"; break; case GPUIMAGE_LOWPASS: cell.textLabel.text = @"Low pass"; break; case GPUIMAGE_HIGHPASS: cell.textLabel.text = @"High pass"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 339955036..218b521ca 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -47,6 +47,7 @@ typedef enum { GPUIMAGE_BUFFER, GPUIMAGE_LOWPASS, GPUIMAGE_HIGHPASS, + GPUIMAGE_MOTIONDETECTOR, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_SMOOTHTOON, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index a8c862ca2..c0ae94c31 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -545,6 +545,19 @@ - (void)setupFilter; filter = [[GPUImageHighPassFilter alloc] init]; }; break; + case GPUIMAGE_MOTIONDETECTOR: + { + [videoCamera rotateCamera]; + + self.title = @"Motion Detector"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImageMotionDetector alloc] init]; + }; break; case GPUIMAGE_SKETCH: { self.title = @"Sketch"; @@ -1263,6 +1276,36 @@ - (void)setupFilter; [colorGenerator addTarget:filterView]; } + else if (filterType == GPUIMAGE_MOTIONDETECTOR) + { + faceView = [[UIView alloc] initWithFrame:CGRectMake(100.0, 100.0, 100.0, 100.0)]; + faceView.layer.borderWidth = 1; + faceView.layer.borderColor = [[UIColor redColor] CGColor]; + [self.view addSubview:faceView]; + faceView.hidden = YES; + + [(GPUImageMotionDetector *) filter setMotionDetectionBlock:^(CGPoint motionCentroid, CGFloat motionIntensity, CMTime frameTime) { + if (motionIntensity > 0.01) + { + CGFloat motionBoxWidth = 1500.0 * motionIntensity; + CGSize viewBounds = self.view.bounds.size; + dispatch_async(dispatch_get_main_queue(), ^{ + faceView.frame = CGRectMake(round(viewBounds.width * motionCentroid.x - motionBoxWidth / 2.0), round(viewBounds.height * motionCentroid.y - motionBoxWidth / 2.0), motionBoxWidth, motionBoxWidth); + faceView.hidden = NO; + }); + + } + else + { + dispatch_async(dispatch_get_main_queue(), ^{ + faceView.hidden = YES; + }); + } + + }]; + + [videoCamera addTarget:filterView]; + } else { [filter addTarget:filterView]; @@ -1305,6 +1348,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; case GPUIMAGE_LOWPASS: [(GPUImageLowPassFilter *)filter setFilterStrength:[(UISlider *)sender value]]; break; case GPUIMAGE_HIGHPASS: [(GPUImageHighPassFilter *)filter setFilterStrength:[(UISlider *)sender value]]; break; + case GPUIMAGE_MOTIONDETECTOR: [(GPUImageMotionDetector *)filter setLowPassFilterStrength:[(UISlider *)sender value]]; break; case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; case GPUIMAGE_CHROMAKEYNONBLEND: [(GPUImageChromaKeyFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)filter setRadius:round([(UISlider *)sender value])]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index e8c825f79..8e66c451d 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -166,6 +166,8 @@ BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */; }; BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; }; BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */; }; + BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; }; + BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */; }; BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; @@ -464,6 +466,8 @@ BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLowPassFilter.m; path = Source/GPUImageLowPassFilter.m; sourceTree = SOURCE_ROOT; }; BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHighPassFilter.h; path = Source/GPUImageHighPassFilter.h; sourceTree = SOURCE_ROOT; }; BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHighPassFilter.m; path = Source/GPUImageHighPassFilter.m; sourceTree = SOURCE_ROOT; }; + BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMotionDetector.h; path = Source/GPUImageMotionDetector.h; sourceTree = SOURCE_ROOT; }; + BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMotionDetector.m; path = Source/GPUImageMotionDetector.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; @@ -947,6 +951,8 @@ BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */, BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */, BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */, + BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */, + BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */, ); name = "Image processing"; sourceTree = ""; @@ -1173,6 +1179,7 @@ BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */, BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */, BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */, + BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1422,6 +1429,7 @@ BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */, BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */, BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */, + BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 2fbb03a49..f7822f392 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -126,4 +126,5 @@ #import "GPUImageWhiteBalanceFilter.h" #import "GPUImageChromaKeyFilter.h" #import "GPUImageLowPassFilter.h" -#import "GPUImageHighPassFilter.h" \ No newline at end of file +#import "GPUImageHighPassFilter.h" +#import "GPUImageMotionDetector.h" \ No newline at end of file diff --git a/framework/Source/GPUImageHighPassFilter.m b/framework/Source/GPUImageHighPassFilter.m index b07c42c60..511240d8f 100644 --- a/framework/Source/GPUImageHighPassFilter.m +++ b/framework/Source/GPUImageHighPassFilter.m @@ -2,6 +2,8 @@ @implementation GPUImageHighPassFilter +@synthesize filterStrength; + - (id)init; { if (!(self = [super init])) diff --git a/framework/Source/GPUImageLowPassFilter.m b/framework/Source/GPUImageLowPassFilter.m index dfc6a1b96..541ba75a1 100644 --- a/framework/Source/GPUImageLowPassFilter.m +++ b/framework/Source/GPUImageLowPassFilter.m @@ -2,6 +2,8 @@ @implementation GPUImageLowPassFilter +@synthesize filterStrength; + - (id)init; { if (!(self = [super init])) diff --git a/framework/Source/GPUImageMotionDetector.h b/framework/Source/GPUImageMotionDetector.h new file mode 100644 index 000000000..013291457 --- /dev/null +++ b/framework/Source/GPUImageMotionDetector.h @@ -0,0 +1,18 @@ +#import "GPUImageFilterGroup.h" +#import "GPUImageLowPassFilter.h" +#import "GPUImageAverageColor.h" + +@interface GPUImageMotionDetector : GPUImageFilterGroup +{ + GPUImageLowPassFilter *lowPassFilter; + GPUImageTwoInputFilter *frameComparisonFilter; + GPUImageAverageColor *averageColor; +} + +// This controls the low pass filter strength used to compare the current frame with previous ones to detect motion. This ranges from 0.0 to 1.0, with a default of 0.5. +@property(readwrite, nonatomic) CGFloat lowPassFilterStrength; + +// For every frame, this will feed back the calculated centroid of the motion, as well as a relative intensity. +@property(nonatomic, copy) void(^motionDetectionBlock)(CGPoint motionCentroid, CGFloat motionIntensity, CMTime frameTime); + +@end diff --git a/framework/Source/GPUImageMotionDetector.m b/framework/Source/GPUImageMotionDetector.m new file mode 100644 index 000000000..e0b1ea1b5 --- /dev/null +++ b/framework/Source/GPUImageMotionDetector.m @@ -0,0 +1,88 @@ +#import "GPUImageMotionDetector.h" + +NSString *const kGPUImageMotionComparisonFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform highp float intensity; + + void main() + { + lowp vec3 currentImageColor = texture2D(inputImageTexture, textureCoordinate).rgb; + lowp vec3 lowPassImageColor = texture2D(inputImageTexture2, textureCoordinate2).rgb; + + mediump float colorDistance = distance(currentImageColor, lowPassImageColor); // * 0.57735 + lowp float movementThreshold = step(0.2, colorDistance); + + gl_FragColor = movementThreshold * vec4(textureCoordinate2.x, textureCoordinate2.y, 1.0, 1.0); + } +); + + +@implementation GPUImageMotionDetector + +@synthesize lowPassFilterStrength; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + // Start with a low pass filter to define the component to be removed + lowPassFilter = [[GPUImageLowPassFilter alloc] init]; + [self addFilter:lowPassFilter]; + + // Take the difference of the current frame from the low pass filtered result to get the high pass + frameComparisonFilter = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kGPUImageMotionComparisonFragmentShaderString]; + [self addFilter:frameComparisonFilter]; + + // Texture location 0 needs to be the original image for the difference blend + [lowPassFilter addTarget:frameComparisonFilter atTextureLocation:1]; + + // End with the average color for the scene to determine the centroid + averageColor = [[GPUImageAverageColor alloc] init]; + + __unsafe_unretained GPUImageMotionDetector *weakSelf = self; + + [averageColor setColorAverageProcessingFinishedBlock:^(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime) { + if (weakSelf.motionDetectionBlock != NULL) + { + weakSelf.motionDetectionBlock(CGPointMake(redComponent / alphaComponent, greenComponent / alphaComponent), alphaComponent, frameTime); + } +// NSLog(@"Average X: %f, Y: %f total: %f", redComponent / alphaComponent, greenComponent / alphaComponent, alphaComponent); + }]; + + [frameComparisonFilter addTarget:averageColor]; + + self.initialFilters = [NSArray arrayWithObjects:lowPassFilter, frameComparisonFilter, nil]; + self.terminalFilter = frameComparisonFilter; + + self.lowPassFilterStrength = 0.5; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setLowPassFilterStrength:(CGFloat)newValue; +{ + lowPassFilter.filterStrength = newValue; +} + +- (CGFloat)lowPassFilterStrength; +{ + return lowPassFilter.filterStrength; +} + + +@end From 202ce483fcc474a60d358bd068317a415de93f86 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 2 Sep 2012 20:52:33 -0500 Subject: [PATCH 219/695] Renamed report_memory due to complaints that it conflicted with other libraries. Fixed a memory leak in GPUImageRawDataOutput. --- framework/Source/GPUImageOutput.h | 2 +- framework/Source/GPUImageOutput.m | 2 +- framework/Source/GPUImageRawDataOutput.h | 1 + framework/Source/GPUImageRawDataOutput.m | 7 ++++++- framework/Source/GPUImageStillCamera.m | 12 ++++++------ 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index c4db7bf66..fbc95deae 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -4,7 +4,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)); -void report_memory(NSString *tag); +void reportAvailableMemoryForGPUImage(NSString *tag); @class GPUImageMovieWriter; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index b5ac83c7a..d0b0350bd 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -29,7 +29,7 @@ void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) } } -void report_memory(NSString *tag) +void reportAvailableMemoryForGPUImage(NSString *tag) { if (!tag) tag = @"Default"; diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index 442d456f1..8a89d819e 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -17,6 +17,7 @@ typedef struct GPUByteColorVector GPUByteColorVector; CVPixelBufferRef renderTarget; GPUImageRotationMode inputRotation; BOOL outputBGRA; + CVOpenGLESTextureRef renderTexture; } @property(readonly) GLubyte *rawBytesForImage; diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 155f12482..dff94c547 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -154,7 +154,6 @@ - (void)createDataFBO; attrs, &renderTarget); - CVOpenGLESTextureRef renderTexture; CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, rawDataTextureCache, renderTarget, NULL, // texture attributes @@ -192,6 +191,12 @@ - (void)destroyDataFBO; { [GPUImageOpenGLESContext useImageProcessingContext]; + if (renderTexture) + { + CFRelease(renderTexture); + renderTexture = NULL; + } + if (dataFramebuffer) { glDeleteFramebuffers(1, &dataFramebuffer); diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 38b27081b..bb54aee47 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -145,11 +145,11 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; { -// report_memory(@"Before still image capture"); +// reportAvailableMemoryForGPUImage(@"Before still image capture"); dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { -// report_memory(@"Before filter processing"); +// reportAvailableMemoryForGPUImage(@"Before filter processing"); // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); @@ -179,20 +179,20 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f } } -// report_memory(@"After filter processing"); +// reportAvailableMemoryForGPUImage(@"After filter processing"); __strong NSData *dataForJPEGFile = nil; @autoreleasepool { UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; dispatch_semaphore_signal(frameRenderingSemaphore); -// report_memory(@"After UIImage generation"); +// reportAvailableMemoryForGPUImage(@"After UIImage generation"); dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, 0.8); -// report_memory(@"After JPEG generation"); +// reportAvailableMemoryForGPUImage(@"After JPEG generation"); } -// report_memory(@"After autorelease pool"); +// reportAvailableMemoryForGPUImage(@"After autorelease pool"); block(dataForJPEGFile, error); }]; From 363bd5d30efe1bd664cd1c2a968d77ab86a38403 Mon Sep 17 00:00:00 2001 From: Jorge Garcia Date: Tue, 4 Sep 2012 17:17:48 -0400 Subject: [PATCH 220/695] fix: GrayscaleFilter respects alpha channel and added a synthesize to motionDetectionBlock --- framework/Source/GPUImageGrayscaleFilter.m | 5 +++-- framework/Source/GPUImageMotionDetector.m | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index 42c2c1730..46dd1196b 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -14,9 +14,10 @@ @implementation GPUImageGrayscaleFilter void main() { - float luminance = dot(texture2D(inputImageTexture, textureCoordinate).rgb, W); + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, W); - gl_FragColor = vec4(vec3(luminance), 1.0); + gl_FragColor = vec4(vec3(luminance), textureColor.a); } ); diff --git a/framework/Source/GPUImageMotionDetector.m b/framework/Source/GPUImageMotionDetector.m index e0b1ea1b5..1102f2667 100644 --- a/framework/Source/GPUImageMotionDetector.m +++ b/framework/Source/GPUImageMotionDetector.m @@ -25,7 +25,7 @@ void main() @implementation GPUImageMotionDetector -@synthesize lowPassFilterStrength; +@synthesize lowPassFilterStrength, motionDetectionBlock; #pragma mark - #pragma mark Initialization and teardown From fa8ea2fb829a64803eb26d056ede8e71585c4d94 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 4 Sep 2012 21:24:11 -0500 Subject: [PATCH 221/695] Added a new playAtActualSpeed option to GPUImageMovie to have it playback at the actual speed of the source movie. The timing isn't perfect on this yet. --- .../SimpleVideoFileFilterViewController.m | 4 ++- framework/Source/GPUImageMovie.h | 4 +++ framework/Source/GPUImageMovie.m | 31 ++++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index 019b942e9..ff2bbaf42 100755 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -25,6 +25,7 @@ - (void)viewDidLoad movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; movieFile.runBenchmark = YES; + movieFile.playAtActualSpeed = YES; // filter = [[GPUImagePixellateFilter alloc] init]; // filter = [[GPUImageUnsharpMaskFilter alloc] init]; @@ -86,7 +87,8 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updatePixelWidth:(id)sender { - [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; +// [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; + [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; // pixellateFilter.fractionalWidthOfAPixel = [(UISlider *)sender value]; } diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index c1c552b55..a9558f00c 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -14,6 +14,10 @@ */ @property(readwrite, nonatomic) BOOL runBenchmark; +/** This determines whether to play back a movie as fast as the frames can be processed, or if the original speed of the movie should be respected. Defaults to NO. + */ +@property(readwrite, nonatomic) BOOL playAtActualSpeed; + /// @name Initialization and teardown - (id)initWithAsset:(AVAsset *)asset; - (id)initWithURL:(NSURL *)url; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 01a1fefff..40d7e04e7 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -7,6 +7,8 @@ @interface GPUImageMovie () GPUImageMovieWriter *synchronizedMovieWriter; CVOpenGLESTextureCacheRef coreVideoTextureCache; AVAssetReader *reader; + CMTime previousFrameTime; + CFAbsoluteTime previousActualFrameTime; } - (void)processAsset; @@ -18,6 +20,7 @@ @implementation GPUImageMovie @synthesize url = _url; @synthesize asset = _asset; @synthesize runBenchmark = _runBenchmark; +@synthesize playAtActualSpeed = _playAtActualSpeed; #pragma mark - #pragma mark Initialization and teardown @@ -92,10 +95,14 @@ - (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieW - (void)startProcessing { - if(self.url == nil) { + if(self.url == nil) + { [self processAsset]; return; } + + previousFrameTime = kCMTimeZero; + previousActualFrameTime = CFAbsoluteTimeGetCurrent(); NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; @@ -181,6 +188,25 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; if (sampleBufferRef) { + if (_playAtActualSpeed) + { + // Do this outside of the video processing queue to not slow that down while waiting + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBufferRef); + CMTime differenceFromLastFrame = CMTimeSubtract(currentSampleTime, previousFrameTime); + CFAbsoluteTime currentActualTime = CFAbsoluteTimeGetCurrent(); + + CGFloat frameTimeDifference = CMTimeGetSeconds(differenceFromLastFrame); + CGFloat actualTimeDifference = currentActualTime - previousActualFrameTime; + + if (frameTimeDifference > actualTimeDifference) + { + usleep(1000000.0 * (frameTimeDifference - actualTimeDifference)); + } + + previousFrameTime = currentSampleTime; + previousActualFrameTime = CFAbsoluteTimeGetCurrent(); + } + __unsafe_unretained GPUImageMovie *weakSelf = self; runSynchronouslyOnVideoProcessingQueue(^{ [weakSelf processMovieFrame:sampleBufferRef]; @@ -230,6 +256,9 @@ - (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTra - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; { +// CMTimeGetSeconds +// CMTimeSubtract + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(movieSampleBuffer); CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(movieSampleBuffer); From 08633d48d7501df8c5ae27311baa4335ad2c5c08 Mon Sep 17 00:00:00 2001 From: Jorge Garcia Date: Wed, 5 Sep 2012 18:33:26 -0400 Subject: [PATCH 222/695] added Normal Blend Filter --- framework/GPUImage.xcodeproj/project.pbxproj | 8 +++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageNormalBlendFilter.h | 13 +++++ framework/Source/GPUImageNormalBlendFilter.m | 60 ++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 framework/Source/GPUImageNormalBlendFilter.h create mode 100644 framework/Source/GPUImageNormalBlendFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 8e66c451d..745c2cb2f 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ /* Begin PBXBuildFile section */ 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; + 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; }; + 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */; }; 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; }; 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; @@ -325,6 +327,8 @@ 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianSelectiveBlurFilter.m; path = Source/GPUImageGaussianSelectiveBlurFilter.m; sourceTree = SOURCE_ROOT; }; 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVignetteFilter.h; path = Source/GPUImageVignetteFilter.h; sourceTree = SOURCE_ROOT; }; 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVignetteFilter.m; path = Source/GPUImageVignetteFilter.m; sourceTree = SOURCE_ROOT; }; + 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNormalBlendFilter.h; path = Source/GPUImageNormalBlendFilter.h; sourceTree = SOURCE_ROOT; }; + 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNormalBlendFilter.m; path = Source/GPUImageNormalBlendFilter.m; sourceTree = SOURCE_ROOT; }; 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSourceOverBlendFilter.h; path = Source/GPUImageSourceOverBlendFilter.h; sourceTree = SOURCE_ROOT; }; 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSourceOverBlendFilter.m; path = Source/GPUImageSourceOverBlendFilter.m; sourceTree = SOURCE_ROOT; }; 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; @@ -750,6 +754,8 @@ BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */, BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */, BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */, + 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */, + 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */, ); name = Blends; sourceTree = ""; @@ -1180,6 +1186,7 @@ BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */, BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */, BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */, + 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1430,6 +1437,7 @@ BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */, BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */, BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */, + 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index f7822f392..b11ae52b1 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -86,6 +86,7 @@ #import "GPUImageXYDerivativeFilter.h" #import "GPUImageHarrisCornerDetectionFilter.h" #import "GPUImageAlphaBlendFilter.h" +#import "GPUImageNormalBlendFilter.h" #import "GPUImageNonMaximumSuppressionFilter.h" #import "GPUImageRGBFilter.h" #import "GPUImageMedianFilter.h" diff --git a/framework/Source/GPUImageNormalBlendFilter.h b/framework/Source/GPUImageNormalBlendFilter.h new file mode 100644 index 000000000..9cf04a314 --- /dev/null +++ b/framework/Source/GPUImageNormalBlendFilter.h @@ -0,0 +1,13 @@ +// +// GPUNormalBlendFilter.h +// GPUImage +// +// Created by Jorge Garcia on 9/5/12. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageNormalBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m new file mode 100644 index 000000000..6faa99579 --- /dev/null +++ b/framework/Source/GPUImageNormalBlendFilter.m @@ -0,0 +1,60 @@ +// +// GPUNormalBlendFilter.m +// GPUImage +// +// Created by Jorge Garcia on 9/5/12. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageNormalBlendFilter.h" +/* + This equation is a simplification of the general blending equation. It assumes the destination color is opaque, and therefore drops the destination color's alpha term. + + D = C1 * C1a + C2 * C2a * (1 - C1a) + where D is the resultant color, C1 is the color of the first element, C1a is the alpha of the first element, C2 is the second element color, C2a is the alpha of the second element. The destination alpha is calculated with: + + Da = C1a + C2a * (1 - C1a) + The resultant color is premultiplied with the alpha. To restore the color to the unmultiplied values, just divide by Da, the resultant alpha. + + http://stackoverflow.com/questions/1724946/blend-mode-on-a-transparent-and-semi-transparent-background + */ +NSString *const kGPUImageNormalBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 c2 = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 c1 = texture2D(inputImageTexture2, textureCoordinate2); + + lowp vec4 outputColor; + + outputColor.r = c1.r + c2.r * c2.a * (1.0 - c1.a); + + outputColor.g = c1.g + c2.g * c2.a * (1.0 - c1.a); + + outputColor.b = c1.b + c2.b * c2.a * (1.0 - c1.a); + + outputColor.a = c1.a + c2.a * (1.0 - c1.a); + + gl_FragColor = outputColor; + } + ); + +@implementation GPUImageNormalBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageNormalBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end \ No newline at end of file From d49c56bb9b56fd22bceaf99f4a3e75780ce08dfc Mon Sep 17 00:00:00 2001 From: Jorge Garcia Date: Wed, 5 Sep 2012 18:35:25 -0400 Subject: [PATCH 223/695] added normal blend mode comment --- framework/Source/GPUImageNormalBlendFilter.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m index 6faa99579..a1a8e87b5 100644 --- a/framework/Source/GPUImageNormalBlendFilter.m +++ b/framework/Source/GPUImageNormalBlendFilter.m @@ -17,6 +17,9 @@ The resultant color is premultiplied with the alpha. To restore the color to the unmultiplied values, just divide by Da, the resultant alpha. http://stackoverflow.com/questions/1724946/blend-mode-on-a-transparent-and-semi-transparent-background + + For some reason Photoshop behaves + D = C1 + C2 * C2a * (1 - C1a) */ NSString *const kGPUImageNormalBlendFragmentShaderString = SHADER_STRING ( From cdddaeaff2597b3db8c164db158d74a8e5fa6572 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 5 Sep 2012 19:13:20 -0500 Subject: [PATCH 224/695] Added normal blend to the FilterShowcase, although it doesn't really show much with an opaque input image. --- .../FilterShowcase/ShowcaseFilterListController.m | 1 + .../FilterShowcase/ShowcaseFilterViewController.h | 1 + .../FilterShowcase/ShowcaseFilterViewController.m | 9 +++++++++ framework/Source/GPUImageNormalBlendFilter.h | 5 ----- framework/Source/GPUImageNormalBlendFilter.m | 6 ------ 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index ecaa88528..252ef9fd6 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -154,6 +154,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SUBTRACTBLEND: cell.textLabel.text = @"Subtract blend"; break; case GPUIMAGE_HARDLIGHTBLEND: cell.textLabel.text = @"Hard light blend"; break; case GPUIMAGE_SOFTLIGHTBLEND: cell.textLabel.text = @"Soft light blend"; break; + case GPUIMAGE_NORMALBLEND: cell.textLabel.text = @"Normal blend"; break; case GPUIMAGE_OPACITY: cell.textLabel.text = @"Opacity adjustment"; break; case GPUIMAGE_KUWAHARA: cell.textLabel.text = @"Kuwahara"; break; case GPUIMAGE_VIGNETTE: cell.textLabel.text = @"Vignette"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 218b521ca..79ae7075d 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -95,6 +95,7 @@ typedef enum { GPUIMAGE_EXCLUSIONBLEND, GPUIMAGE_HARDLIGHTBLEND, GPUIMAGE_SOFTLIGHTBLEND, + GPUIMAGE_NORMALBLEND, GPUIMAGE_OPACITY, GPUIMAGE_CUSTOM, GPUIMAGE_UIELEMENT, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index c0ae94c31..b3b3264a8 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -947,6 +947,15 @@ - (void)setupFilter; filter = [[GPUImageSoftLightBlendFilter alloc] init]; }; break; + case GPUIMAGE_NORMALBLEND: + { + self.title = @"Normal Blend"; + self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; + + filter = [[GPUImageNormalBlendFilter alloc] init]; + }; break; + case GPUIMAGE_OPACITY: { self.title = @"Opacity Adjustment"; diff --git a/framework/Source/GPUImageNormalBlendFilter.h b/framework/Source/GPUImageNormalBlendFilter.h index 9cf04a314..ce5e22b49 100644 --- a/framework/Source/GPUImageNormalBlendFilter.h +++ b/framework/Source/GPUImageNormalBlendFilter.h @@ -1,9 +1,4 @@ -// -// GPUNormalBlendFilter.h -// GPUImage -// // Created by Jorge Garcia on 9/5/12. -// Copyright (c) 2012 Brad Larson. All rights reserved. // #import "GPUImageTwoInputFilter.h" diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m index a1a8e87b5..b6aceefc9 100644 --- a/framework/Source/GPUImageNormalBlendFilter.m +++ b/framework/Source/GPUImageNormalBlendFilter.m @@ -1,10 +1,4 @@ -// -// GPUNormalBlendFilter.m -// GPUImage -// // Created by Jorge Garcia on 9/5/12. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// #import "GPUImageNormalBlendFilter.h" /* From 58f88263619487e17eb5ff77fbc8f73c9fb0fa7a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 12 Sep 2012 18:19:35 -0500 Subject: [PATCH 225/695] Tweaked the corner detectors. --- .../FeatureExtractionAppDelegate.m | 42 +++++++----- .../GPUImageHarrisCornerDetectionFilter.m | 65 ++++++++++--------- 2 files changed, 61 insertions(+), 46 deletions(-) diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index 11bb467d2..bc5c19186 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -15,10 +15,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( GPUImagePicture *blackAndWhiteBoxImage = [[GPUImagePicture alloc] initWithImage:inputImage]; [self testHarrisCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; + [self testNobleCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; [self testShiTomasiCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; - // Testing erosion and dilation GPUImageErosionFilter *erosionFilter = [[GPUImageErosionFilter alloc] initWithRadius:4]; [blackAndWhiteBoxImage removeAllTargets]; @@ -93,18 +93,18 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector ofName:(NSString *)detectorName againstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; { + cornerDetector.threshold = 0.4; + cornerDetector.sensitivity = 4.0; + cornerDetector.blurSize = 1.0; [pictureInput removeAllTargets]; [pictureInput addTarget:cornerDetector]; GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; - crosshairGenerator.crosshairWidth = 5.0; + crosshairGenerator.crosshairWidth = 10.0; + [crosshairGenerator setCrosshairColorRed:1.0 green:0.0 blue:0.0]; [crosshairGenerator forceProcessingAtSize:[pictureInput outputImageSize]]; - [cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) { - [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime]; - }]; - GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; [blendFilter forceProcessingAtSize:[pictureInput outputImageSize]]; [pictureInput addTarget:blendFilter]; @@ -113,19 +113,29 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector [crosshairGenerator addTarget:blendFilter]; [blendFilter prepareForImageCapture]; - [pictureInput processImage]; - NSUInteger currentImageIndex = 0; - for (UIImage *currentImage in cornerDetector.intermediateImages) - { - [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%d.png", detectorName, pictureName, currentImageIndex]]; + [cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) { + NSLog(@"Number of corners: %d", cornersDetected); + [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime]; - currentImageIndex++; - } - - UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput]; + dispatch_async(dispatch_get_main_queue(), ^{ + NSUInteger currentImageIndex = 0; + for (UIImage *currentImage in cornerDetector.intermediateImages) + { + [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%d.png", detectorName, pictureName, currentImageIndex]]; + + currentImageIndex++; + } + + NSLog(@"Save corner image"); + UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput]; + + [self saveImage:crosshairResult fileName:[NSString stringWithFormat:@"%@-%@-Crosshairs.png", detectorName, pictureName]]; + }); + }]; - [self saveImage:crosshairResult fileName:[NSString stringWithFormat:@"%@-%@-Crosshairs.png", detectorName, pictureName]]; + + [pictureInput processImage]; } - (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index f56c4b4f3..474d5f473 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -141,45 +141,53 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS simpleThresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageSimpleThresholdFragmentShaderString]; [self addFilter:simpleThresholdFilter]; + __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; #ifdef DEBUGFEATUREDETECTION weakFilter = simpleThresholdFilter; [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; [weakIntermediateImages addObject:intermediateImage]; - }]; -#endif - - // Sixth pass: compress the thresholded points into the RGBA channels - colorPackingFilter = [[GPUImageColorPackingFilter alloc] init]; - [self addFilter:colorPackingFilter]; - - -#ifdef DEBUGFEATUREDETECTION - __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; - weakFilter = colorPackingFilter; - [colorPackingFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ - NSLog(@"Triggered response from compaction filter"); - - UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; - [weakIntermediateImages addObject:intermediateImage]; [weakSelf extractCornerLocationsFromImageAtFrameTime:frameTime]; }]; #else - __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; - [colorPackingFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { + [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { [weakSelf extractCornerLocationsFromImageAtFrameTime:frameTime]; }]; #endif + + // Sixth pass: compress the thresholded points into the RGBA channels +// colorPackingFilter = [[GPUImageColorPackingFilter alloc] init]; +// [self addFilter:colorPackingFilter]; +// +// +//#ifdef DEBUGFEATUREDETECTION +// __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; +// weakFilter = colorPackingFilter; +// [colorPackingFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ +// NSLog(@"Triggered response from compaction filter"); +// +// UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; +// [weakIntermediateImages addObject:intermediateImage]; +// +// [weakSelf extractCornerLocationsFromImageAtFrameTime:frameTime]; +// }]; +//#else +// __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; +// [colorPackingFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { +// [weakSelf extractCornerLocationsFromImageAtFrameTime:frameTime]; +// }]; +//#endif [derivativeFilter addTarget:blurFilter]; [blurFilter addTarget:harrisCornerDetectionFilter]; [harrisCornerDetectionFilter addTarget:nonMaximumSuppressionFilter]; [nonMaximumSuppressionFilter addTarget:simpleThresholdFilter]; - [simpleThresholdFilter addTarget:colorPackingFilter]; +// [simpleThresholdFilter addTarget:colorPackingFilter]; self.initialFilters = [NSArray arrayWithObjects:derivativeFilter, nil]; - self.terminalFilter = colorPackingFilter; +// self.terminalFilter = colorPackingFilter; + self.terminalFilter = simpleThresholdFilter; self.blurSize = 1.0; self.sensitivity = 5.0; @@ -215,29 +223,26 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); - unsigned int imageWidth = imageSize.width * 4.0; + unsigned int imageWidth = imageSize.width * 4; - for (unsigned int currentByte = 0; currentByte < imageByteSize; currentByte++) + unsigned int currentByte = 0; + unsigned int cornerStorageIndex = 0; + while (currentByte < imageByteSize) { GLubyte colorByte = rawImagePixels[currentByte]; - // Red: -, - - // Green: +, - - // Blue: -, + - // Alpha: +. + - if (colorByte > 0) { -// NSLog(@"(%d, %d): R: %d", scaledXCoordinate, scaledYCoordinate, redByte); unsigned int xCoordinate = currentByte % imageWidth; unsigned int yCoordinate = currentByte / imageWidth; - cornersArray[numberOfCorners * 2] = (CGFloat)(xCoordinate / 2) / imageSize.width; - cornersArray[numberOfCorners * 2 + 1] = (CGFloat)(yCoordinate * 2) / imageSize.height; + cornersArray[cornerStorageIndex++] = (CGFloat)(xCoordinate / 4) / imageSize.width; + cornersArray[cornerStorageIndex++] = (CGFloat)(yCoordinate) / imageSize.height; numberOfCorners++; numberOfCorners = MIN(numberOfCorners, 511); } + currentByte +=4; } CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); From cebdf0bed8d9f4530b41f8a1dae09f4f27dfba7e Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Fri, 14 Sep 2012 23:39:13 +0300 Subject: [PATCH 226/695] last --- .../SimpleImageFilter/lookup_amatorka.png | 899 ++++++++++++++++++ .../SimpleImageFilter/lookup_miss_etikate.png | 899 ++++++++++++++++++ .../lookup_soft_elegance_1.png | 899 ++++++++++++++++++ .../lookup_soft_elegance_2.png | 899 ++++++++++++++++++ .../SimpleImageFilter/test.jpg | Bin 0 -> 173206 bytes 5 files changed, 3596 insertions(+) create mode 100644 examples/SnappTestFilter/SimpleImageFilter/lookup_amatorka.png create mode 100644 examples/SnappTestFilter/SimpleImageFilter/lookup_miss_etikate.png create mode 100644 examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_1.png create mode 100644 examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_2.png create mode 100644 examples/SnappTestFilter/SimpleImageFilter/test.jpg diff --git a/examples/SnappTestFilter/SimpleImageFilter/lookup_amatorka.png b/examples/SnappTestFilter/SimpleImageFilter/lookup_amatorka.png new file mode 100644 index 000000000..0fed8e5c0 --- /dev/null +++ b/examples/SnappTestFilter/SimpleImageFilter/lookup_amatorka.png @@ -0,0 +1,899 @@ + + + + + + + + + GPUImage/framework/Resources/lookup_amatorka.png at e6057f93d9a14f57db7b6c6c5e467b3881dcea65 · liovch/GPUImage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ +
+
+ + + + +
    + + +
  • +
    + +
    + + + Watch + + + +
    + +
    Notification status
    + +
    +
      +
    • + + + + + Watch + +
    • +
    • + + + + + Unwatch + +
    • +
    • + + + + + Stop ignoring + +
    • +
    +
    +
    +
    +
    +
  • + +
  • + + + Unstar + + + Star + +
  • + +
  • Fork +
  • + + +
+ +

+ public + + + / + GPUImage + + forked from BradLarson/GPUImage + +

+
+ + + + + + + + + + +
+ + + + + + +
+ +
+ + tree: e6057f93d9 + + +
+ +
Switch branches/tags
+
+
+ + +
+ +
+
Nothing to show
+
+ +

+ lookupfilter +

+
+
+ +

+ master +

+
+
+ + +
+
+
+
+ + + +
+ + + + + + + + +
+ +
+ + + + + + + +
+ + + +
+ Fetching contributors… + +
+

Octocat-spinner-16px

+
+
+ +
+
+ +
+
+
+
+ + file + 36.39 kb +
+ +
+
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+
+ + +
+ + + + + + + + +
+

Markdown Cheat Sheet

+ +
+ +
+
+

Format Text

+

Headers

+
+# This is an <h1> tag
+## This is an <h2> tag
+###### This is an <h6> tag
+

Text styles

+
+*This text will be italic*
+_This will also be italic_
+**This text will be bold**
+__This will also be bold__
+
+*You **can** combine them*
+
+
+
+

Lists

+

Unordered

+
+* Item 1
+* Item 2
+  * Item 2a
+  * Item 2b
+

Ordered

+
+1. Item 1
+2. Item 2
+3. Item 3
+   * Item 3a
+   * Item 3b
+
+
+

Miscellaneous

+

Images

+
+![GitHub Logo](/images/logo.png)
+Format: ![Alt Text](url)
+
+

Links

+
+http://github.com - automatic!
+[GitHub](http://github.com)
+

Blockquotes

+
+As Kanye West said:
+
+> We're living the future so
+> the present is our past.
+
+
+
+
+ +

Code Examples in Markdown

+
+

Syntax highlighting with GFM

+
+```javascript
+function fancyAlert(arg) {
+  if(arg) {
+    $.facebox({div:'#foo'})
+  }
+}
+```
+
+
+

Or, indent your code 4 spaces

+
+Here is a Python code example
+without syntax highlighting:
+
+    def foo:
+      if not bar:
+        return true
+
+
+

Inline code for comments

+
+I think you should use an
+`<addr>` element here instead.
+
+
+ +
+ + + +
+ + Something went wrong with that request. Please try again. + +
+ +
+

Looking for the GitHub logo?

+ +
+ + + + + + + diff --git a/examples/SnappTestFilter/SimpleImageFilter/lookup_miss_etikate.png b/examples/SnappTestFilter/SimpleImageFilter/lookup_miss_etikate.png new file mode 100644 index 000000000..4f38bee66 --- /dev/null +++ b/examples/SnappTestFilter/SimpleImageFilter/lookup_miss_etikate.png @@ -0,0 +1,899 @@ + + + + + + + + + GPUImage/framework/Resources/lookup_miss_etikate.png at e6057f93d9a14f57db7b6c6c5e467b3881dcea65 · liovch/GPUImage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ +
+
+ + + + +
    + + +
  • +
    + +
    + + + Watch + + + +
    + +
    Notification status
    + +
    +
      +
    • + + + + + Watch + +
    • +
    • + + + + + Unwatch + +
    • +
    • + + + + + Stop ignoring + +
    • +
    +
    +
    +
    +
    +
  • + +
  • + + + Unstar + + + Star + +
  • + +
  • Fork +
  • + + +
+ +

+ public + + + / + GPUImage + + forked from BradLarson/GPUImage + +

+
+ + + + + + + + + + +
+ + + + + + +
+ +
+ + tree: e6057f93d9 + + +
+ +
Switch branches/tags
+
+
+ + +
+ +
+
Nothing to show
+
+ +

+ lookupfilter +

+
+
+ +

+ master +

+
+
+ + +
+
+
+
+ + + +
+ + + + + + + + +
+ +
+ + + + + + + +
+ + + +
+ Fetching contributors… + +
+

Octocat-spinner-16px

+
+
+ +
+
+ +
+
+
+
+ + file + 202.596 kb +
+ +
+
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+
+ + +
+ + + + + + + + +
+

Markdown Cheat Sheet

+ +
+ +
+
+

Format Text

+

Headers

+
+# This is an <h1> tag
+## This is an <h2> tag
+###### This is an <h6> tag
+

Text styles

+
+*This text will be italic*
+_This will also be italic_
+**This text will be bold**
+__This will also be bold__
+
+*You **can** combine them*
+
+
+
+

Lists

+

Unordered

+
+* Item 1
+* Item 2
+  * Item 2a
+  * Item 2b
+

Ordered

+
+1. Item 1
+2. Item 2
+3. Item 3
+   * Item 3a
+   * Item 3b
+
+
+

Miscellaneous

+

Images

+
+![GitHub Logo](/images/logo.png)
+Format: ![Alt Text](url)
+
+

Links

+
+http://github.com - automatic!
+[GitHub](http://github.com)
+

Blockquotes

+
+As Kanye West said:
+
+> We're living the future so
+> the present is our past.
+
+
+
+
+ +

Code Examples in Markdown

+
+

Syntax highlighting with GFM

+
+```javascript
+function fancyAlert(arg) {
+  if(arg) {
+    $.facebox({div:'#foo'})
+  }
+}
+```
+
+
+

Or, indent your code 4 spaces

+
+Here is a Python code example
+without syntax highlighting:
+
+    def foo:
+      if not bar:
+        return true
+
+
+

Inline code for comments

+
+I think you should use an
+`<addr>` element here instead.
+
+
+ +
+ + + +
+ + Something went wrong with that request. Please try again. + +
+ +
+

Looking for the GitHub logo?

+ +
+ + + + + + + diff --git a/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_1.png b/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_1.png new file mode 100644 index 000000000..7b6f4c7fd --- /dev/null +++ b/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_1.png @@ -0,0 +1,899 @@ + + + + + + + + + GPUImage/framework/Resources/lookup_soft_elegance_1.png at e6057f93d9a14f57db7b6c6c5e467b3881dcea65 · liovch/GPUImage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ +
+
+ + + + +
    + + +
  • +
    + +
    + + + Watch + + + +
    + +
    Notification status
    + +
    +
      +
    • + + + + + Watch + +
    • +
    • + + + + + Unwatch + +
    • +
    • + + + + + Stop ignoring + +
    • +
    +
    +
    +
    +
    +
  • + +
  • + + + Unstar + + + Star + +
  • + +
  • Fork +
  • + + +
+ +

+ public + + + / + GPUImage + + forked from BradLarson/GPUImage + +

+
+ + + + + + + + + + +
+ + + + + + +
+ +
+ + tree: e6057f93d9 + + +
+ +
Switch branches/tags
+
+
+ + +
+ +
+
Nothing to show
+
+ +

+ lookupfilter +

+
+
+ +

+ master +

+
+
+ + +
+
+
+
+ + + +
+ + + + + + + + +
+ +
+ + + + + + + +
+ + + +
+ Fetching contributors… + +
+

Octocat-spinner-16px

+
+
+ +
+
+ +
+
+
+
+ + file + 129.208 kb +
+ +
+
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+
+ + +
+ + + + + + + + +
+

Markdown Cheat Sheet

+ +
+ +
+
+

Format Text

+

Headers

+
+# This is an <h1> tag
+## This is an <h2> tag
+###### This is an <h6> tag
+

Text styles

+
+*This text will be italic*
+_This will also be italic_
+**This text will be bold**
+__This will also be bold__
+
+*You **can** combine them*
+
+
+
+

Lists

+

Unordered

+
+* Item 1
+* Item 2
+  * Item 2a
+  * Item 2b
+

Ordered

+
+1. Item 1
+2. Item 2
+3. Item 3
+   * Item 3a
+   * Item 3b
+
+
+

Miscellaneous

+

Images

+
+![GitHub Logo](/images/logo.png)
+Format: ![Alt Text](url)
+
+

Links

+
+http://github.com - automatic!
+[GitHub](http://github.com)
+

Blockquotes

+
+As Kanye West said:
+
+> We're living the future so
+> the present is our past.
+
+
+
+
+ +

Code Examples in Markdown

+
+

Syntax highlighting with GFM

+
+```javascript
+function fancyAlert(arg) {
+  if(arg) {
+    $.facebox({div:'#foo'})
+  }
+}
+```
+
+
+

Or, indent your code 4 spaces

+
+Here is a Python code example
+without syntax highlighting:
+
+    def foo:
+      if not bar:
+        return true
+
+
+

Inline code for comments

+
+I think you should use an
+`<addr>` element here instead.
+
+
+ +
+ + + +
+ + Something went wrong with that request. Please try again. + +
+ +
+

Looking for the GitHub logo?

+ +
+ + + + + + + diff --git a/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_2.png b/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_2.png new file mode 100644 index 000000000..0951d6ba8 --- /dev/null +++ b/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_2.png @@ -0,0 +1,899 @@ + + + + + + + + + GPUImage/framework/Resources/lookup_soft_elegance_2.png at e6057f93d9a14f57db7b6c6c5e467b3881dcea65 · liovch/GPUImage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ +
+
+ + + + +
    + + +
  • +
    + +
    + + + Watch + + + +
    + +
    Notification status
    + +
    +
      +
    • + + + + + Watch + +
    • +
    • + + + + + Unwatch + +
    • +
    • + + + + + Stop ignoring + +
    • +
    +
    +
    +
    +
    +
  • + +
  • + + + Unstar + + + Star + +
  • + +
  • Fork +
  • + + +
+ +

+ public + + + / + GPUImage + + forked from BradLarson/GPUImage + +

+
+ + + + + + + + + + +
+ + + + + + +
+ +
+ + tree: e6057f93d9 + + +
+ +
Switch branches/tags
+
+
+ + +
+ +
+
Nothing to show
+
+ +

+ lookupfilter +

+
+
+ +

+ master +

+
+
+ + +
+
+
+
+ + + +
+ + + + + + + + +
+ +
+ + + + + + + +
+ + + +
+ Fetching contributors… + +
+

Octocat-spinner-16px

+
+
+ +
+
+ +
+
+
+
+ + file + 2.199 kb +
+ +
+
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+
+ + +
+ + + + + + + + +
+

Markdown Cheat Sheet

+ +
+ +
+
+

Format Text

+

Headers

+
+# This is an <h1> tag
+## This is an <h2> tag
+###### This is an <h6> tag
+

Text styles

+
+*This text will be italic*
+_This will also be italic_
+**This text will be bold**
+__This will also be bold__
+
+*You **can** combine them*
+
+
+
+

Lists

+

Unordered

+
+* Item 1
+* Item 2
+  * Item 2a
+  * Item 2b
+

Ordered

+
+1. Item 1
+2. Item 2
+3. Item 3
+   * Item 3a
+   * Item 3b
+
+
+

Miscellaneous

+

Images

+
+![GitHub Logo](/images/logo.png)
+Format: ![Alt Text](url)
+
+

Links

+
+http://github.com - automatic!
+[GitHub](http://github.com)
+

Blockquotes

+
+As Kanye West said:
+
+> We're living the future so
+> the present is our past.
+
+
+
+
+ +

Code Examples in Markdown

+
+

Syntax highlighting with GFM

+
+```javascript
+function fancyAlert(arg) {
+  if(arg) {
+    $.facebox({div:'#foo'})
+  }
+}
+```
+
+
+

Or, indent your code 4 spaces

+
+Here is a Python code example
+without syntax highlighting:
+
+    def foo:
+      if not bar:
+        return true
+
+
+

Inline code for comments

+
+I think you should use an
+`<addr>` element here instead.
+
+
+ +
+ + + +
+ + Something went wrong with that request. Please try again. + +
+ +
+

Looking for the GitHub logo?

+ +
+ + + + + + + diff --git a/examples/SnappTestFilter/SimpleImageFilter/test.jpg b/examples/SnappTestFilter/SimpleImageFilter/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..adc9b12072e3d4d2b18e0740a0d59ba4bdffc9b1 GIT binary patch literal 173206 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
xcwFJi+nllR`MiE-Ig1HH8s=m{ieg3I0JZ8WY^ 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Ü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 Date: Tue, 18 Sep 2012 13:56:38 -0400 Subject: [PATCH 227/695] setInputRotation moved to fix switching targets --- framework/Source/GPUImageVideoCamera.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index f230a6a05..0ef9777f4 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -382,17 +382,17 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; if (currentTarget != self.targetToIgnoreForUpdates) { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; } else { - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; } } } From 7e37da4fa4515fb3c0fca88af5cfcd7d3ee40440 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 18 Sep 2012 16:30:54 -0500 Subject: [PATCH 228/695] Added a halftone filter. --- README.md | 3 ++ .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 +++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++++ framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageHalftoneFilter.h | 5 ++ framework/Source/GPUImageHalftoneFilter.m | 47 +++++++++++++++++++ 8 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageHalftoneFilter.h create mode 100644 framework/Source/GPUImageHalftoneFilter.m diff --git a/README.md b/README.md index 1ede1e1f6..76e9b3406 100755 --- a/README.md +++ b/README.md @@ -293,6 +293,9 @@ Documentation is generated from header comments using appledoc. To build the doc - *fractionalWidthOfAPixel*: How large the dots are, as a fraction of the width and height of the image (0.0 - 1.0, default 0.05) - *dotScaling*: What fraction of each grid space is taken up by a dot, from 0.0 to 1.0 with a default of 0.9. +- **GPUImageHalftoneFilter**: Applies a halftone effect to an image, like news print + - *fractionalWidthOfAPixel*: How large the halftone dots are, as a fraction of the width and height of the image (0.0 - 1.0, default 0.05) + - **GPUImageCrosshatchFilter**: This converts an image into a black-and-white crosshatch pattern - *crossHatchSpacing*: The fractional width of the image to use as the spacing for the crosshatch. The default is 0.03. - *lineWidth*: A relative width for the crosshatch lines. The default is 0.003. diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 252ef9fd6..c5c2debcc 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -104,6 +104,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_PIXELLATE: cell.textLabel.text = @"Pixellate"; break; case GPUIMAGE_POLARPIXELLATE: cell.textLabel.text = @"Polar pixellate"; break; case GPUIMAGE_POLKADOT: cell.textLabel.text = @"Polka dot"; break; + case GPUIMAGE_HALFTONE: cell.textLabel.text = @"Halftone"; break; case GPUIMAGE_CROSSHATCH: cell.textLabel.text = @"Crosshatch"; break; case GPUIMAGE_SOBELEDGEDETECTION: cell.textLabel.text = @"Sobel edge detection"; break; case GPUIMAGE_PREWITTEDGEDETECTION: cell.textLabel.text = @"Prewitt edge detection"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 79ae7075d..b71aa17e0 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -36,6 +36,7 @@ typedef enum { GPUIMAGE_PIXELLATE, GPUIMAGE_POLARPIXELLATE, GPUIMAGE_POLKADOT, + GPUIMAGE_HALFTONE, GPUIMAGE_CROSSHATCH, GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_PREWITTEDGEDETECTION, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index b3b3264a8..9d1b12307 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -111,6 +111,17 @@ - (void)setupFilter; filter = [[GPUImagePolkaDotFilter alloc] init]; }; break; + case GPUIMAGE_HALFTONE: + { + self.title = @"Halftone"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setValue:0.01]; + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:0.05]; + + filter = [[GPUImageHalftoneFilter alloc] init]; + }; break; case GPUIMAGE_CROSSHATCH: { self.title = @"Crosshatch"; @@ -1335,6 +1346,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_POLARPIXELLATE: [(GPUImagePolarPixellateFilter *)filter setPixelSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; case GPUIMAGE_POLKADOT: [(GPUImagePolkaDotFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; + case GPUIMAGE_HALFTONE: [(GPUImageHalftoneFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_SATURATION: [(GPUImageSaturationFilter *)filter setSaturation:[(UISlider *)sender value]]; break; case GPUIMAGE_CONTRAST: [(GPUImageContrastFilter *)filter setContrast:[(UISlider *)sender value]]; break; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 745c2cb2f..46dd3920b 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -86,6 +86,8 @@ BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */; }; BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; }; BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */; }; + BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; }; + BC4D03D0160919AE00F64358 /* GPUImageHalftoneFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4D03CE160919AE00F64358 /* GPUImageHalftoneFilter.m */; }; BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; }; @@ -388,6 +390,8 @@ BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePerlinNoiseFilter.m; path = Source/GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAverageColor.h; path = Source/GPUImageAverageColor.h; sourceTree = SOURCE_ROOT; }; BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageColor.m; path = Source/GPUImageAverageColor.m; sourceTree = SOURCE_ROOT; }; + BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHalftoneFilter.h; path = Source/GPUImageHalftoneFilter.h; sourceTree = SOURCE_ROOT; }; + BC4D03CE160919AE00F64358 /* GPUImageHalftoneFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHalftoneFilter.m; path = Source/GPUImageHalftoneFilter.m; sourceTree = SOURCE_ROOT; }; BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyBlendFilter.h; path = Source/GPUImageChromaKeyBlendFilter.h; sourceTree = SOURCE_ROOT; }; BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; BC56D8281579779700CC9C1E /* GPUImageUIElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageUIElement.h; path = Source/GPUImageUIElement.h; sourceTree = SOURCE_ROOT; }; @@ -769,6 +773,8 @@ BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */, BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */, BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */, + BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */, + BC4D03CE160919AE00F64358 /* GPUImageHalftoneFilter.m */, BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */, BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */, BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */, @@ -1187,6 +1193,7 @@ BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */, BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */, 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */, + BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1438,6 +1445,7 @@ BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */, BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */, 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */, + BC4D03D0160919AE00F64358 /* GPUImageHalftoneFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index b11ae52b1..2ad3904e1 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -128,4 +128,5 @@ #import "GPUImageChromaKeyFilter.h" #import "GPUImageLowPassFilter.h" #import "GPUImageHighPassFilter.h" -#import "GPUImageMotionDetector.h" \ No newline at end of file +#import "GPUImageMotionDetector.h" +#import "GPUImageHalftoneFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageHalftoneFilter.h b/framework/Source/GPUImageHalftoneFilter.h new file mode 100644 index 000000000..1860bc979 --- /dev/null +++ b/framework/Source/GPUImageHalftoneFilter.h @@ -0,0 +1,5 @@ +#import "GPUImagePixellateFilter.h" + +@interface GPUImageHalftoneFilter : GPUImagePixellateFilter + +@end diff --git a/framework/Source/GPUImageHalftoneFilter.m b/framework/Source/GPUImageHalftoneFilter.m new file mode 100644 index 000000000..caf0d51c9 --- /dev/null +++ b/framework/Source/GPUImageHalftoneFilter.m @@ -0,0 +1,47 @@ +#import "GPUImageHalftoneFilter.h" + +NSString *const kGPUImageHalftoneFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform highp float fractionalWidthOfPixel; + uniform highp float aspectRatio; + uniform highp float dotScaling; + + const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + + highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp vec2 adjustedSamplePos = vec2(samplePos.x, (samplePos.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float distanceFromSamplePoint = distance(adjustedSamplePos, textureCoordinateToUse); + + lowp vec3 sampledColor = texture2D(inputImageTexture, samplePos ).rgb; + highp float dotScaling = 1.0 - dot(sampledColor, W); + + lowp float checkForPresenceWithinDot = 1.0 - step(distanceFromSamplePoint, (fractionalWidthOfPixel * 0.5) * dotScaling); + + gl_FragColor = vec4(vec3(checkForPresenceWithinDot), 1.0); + } + ); + +@implementation GPUImageHalftoneFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageHalftoneFragmentShaderString])) + { + return nil; + } + + self.fractionalWidthOfAPixel = 0.01; + + return self; +} + +@end From 92680f197fdb0e68077f35c81183fd097c6f46b3 Mon Sep 17 00:00:00 2001 From: Sergey Gavrilyuk Date: Tue, 18 Sep 2012 14:26:47 -0400 Subject: [PATCH 229/695] more accurate init from acv file by name or by explicit URL --- framework/Source/GPUImageToneCurveFilter.h | 6 ++-- framework/Source/GPUImageToneCurveFilter.m | 41 ++++++++++++++-------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h index a03184e93..328b6ab5b 100755 --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -8,14 +8,16 @@ @property(readwrite, nonatomic, copy) NSArray *rgbCompositeControlPoints; // Initialization and teardown -- (id)initWithACV:(NSString*)curveFile; +- (id)initWithACV:(NSString*)curveFilename; +- (id)initWithACVURL:(NSURL*)curveFileURL; // This lets you set all three red, green, and blue tone curves at once. // NOTE: Deprecated this function because this effect can be accomplished // using the rgbComposite channel rather then setting all 3 R, G, and B channels. - (void)setRGBControlPoints:(NSArray *)points DEPRECATED_ATTRIBUTE; -- (void)setPointsWithACV:(NSString*)curveFile; +- (void)setPointsWithACV:(NSString*)curveFilename; +- (void)setPointsWithACVURL:(NSURL*)curveFileURL; // Curve calculation - (NSMutableArray *)getPreparedSplineCurve:(NSArray *)points; diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index eb5005781..0716cc3e1 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -24,7 +24,7 @@ @interface GPUImageACVFile : NSObject{ @property(strong,nonatomic) NSArray *greenCurvePoints; @property(strong,nonatomic) NSArray *blueCurvePoints; -- (id) initWithCurveFile:(NSString*)curveFile; +- (id) initWithCurveFilePathURL:(NSURL*)curveFilePathURL; @end @@ -32,18 +32,18 @@ @implementation GPUImageACVFile @synthesize rgbCompositeCurvePoints, redCurvePoints, greenCurvePoints, blueCurvePoints; -- (id) initWithCurveFile:(NSString*)curveFile -{ +- (id) initWithCurveFilePathURL:(NSURL*)curveFilePathURL +{ self = [super init]; if (self != nil) { - NSString *bundleCurvePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: curveFile]; - - NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath: bundleCurvePath]; + NSError* error = nil; + NSFileHandle* file = [NSFileHandle fileHandleForReadingFromURL:curveFilePathURL + error:&error]; - if (file == nil) + if (error) { - NSLog(@"Failed to open file"); + NSLog(@"Failed to open file: %@", error); return self; } @@ -162,17 +162,24 @@ - (id)init; } // This pulls in Adobe ACV curve files to specify the tone curve -- (id)initWithACV:(NSString*)curveFile +- (id)initWithACV:(NSString*)curveFilename +{ + return [self initWithACVURL:[[NSBundle mainBundle] URLForResource:curveFilename + withExtension:@"acv"]]; +} + +- (id)initWithACVURL:(NSURL*)curveFileURL { if (!(self = [super initWithFragmentShaderFromString:kGPUImageToneCurveFragmentShaderString])) { return nil; } - toneCurveTextureUniform = [filterProgram uniformIndex:@"toneCurveTexture"]; + toneCurveTextureUniform = [filterProgram uniformIndex:@"toneCurveTexture"]; + + + GPUImageACVFile *curve = [[GPUImageACVFile alloc] initWithCurveFilePathURL:curveFileURL]; - GPUImageACVFile *curve = [[GPUImageACVFile alloc] initWithCurveFile:curveFile]; - [self setRgbCompositeControlPoints:curve.rgbCompositeCurvePoints]; [self setRedControlPoints:curve.redCurvePoints]; [self setGreenControlPoints:curve.greenCurvePoints]; @@ -181,11 +188,17 @@ - (id)initWithACV:(NSString*)curveFile curve = nil; return self; + +} + +- (void)setPointsWithACV:(NSString*)curveFilename +{ + [self setPointsWithACVURL:[[NSBundle mainBundle] URLForResource:curveFilename withExtension:@"acv"]]; } -- (void)setPointsWithACV:(NSString*)curveFile +- (void)setPointsWithACVURL:(NSURL*)curveFileURL { - GPUImageACVFile *curve = [[GPUImageACVFile alloc] initWithCurveFile:curveFile]; + GPUImageACVFile *curve = [[GPUImageACVFile alloc] initWithCurveFilePathURL:curveFileURL]; [self setRgbCompositeControlPoints:curve.rgbCompositeCurvePoints]; [self setRedControlPoints:curve.redCurvePoints]; From 0d6138d8ad283b4b4b65dd64f00fd95b2d9bf891 Mon Sep 17 00:00:00 2001 From: Brett Gibson Date: Fri, 21 Sep 2012 15:30:30 -0700 Subject: [PATCH 230/695] catch errors returned from captureStillImageAsynchronouslyFromConnection to prevent crashes --- framework/Source/GPUImageStillCamera.m | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index bb54aee47..8f3a90801 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -107,6 +107,12 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + if(imageSampleBuffer == NULL){ + dispatch_semaphore_signal(frameRenderingSemaphore); + block(nil, error); + return; + } + // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); @@ -151,6 +157,12 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { // reportAvailableMemoryForGPUImage(@"Before filter processing"); + if(imageSampleBuffer == NULL){ + dispatch_semaphore_signal(frameRenderingSemaphore); + block(nil, error); + return; + } + // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); @@ -205,7 +217,13 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { - + + if(imageSampleBuffer == NULL){ + dispatch_semaphore_signal(frameRenderingSemaphore); + block(nil, error); + return; + } + // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); From fc2b4d7c670977bb973ad181423e9a215cdfae86 Mon Sep 17 00:00:00 2001 From: Sergey Gavrilyuk Date: Sun, 30 Sep 2012 02:49:53 -0400 Subject: [PATCH 231/695] silly bug fix --- framework/Source/GPUImageTwoInputFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index b223e9a1c..635a6d4b0 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -223,7 +223,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; secondFrameTime = frameTime; if (firstFrameCheckDisabled) { - hasReceivedSecondFrame = YES; + hasReceivedFirstFrame = YES; } if (!CMTIME_IS_INDEFINITE(frameTime)) From 0b962e60cc900f57c85b579b5f48fc27f268cbae Mon Sep 17 00:00:00 2001 From: Greg Pape Date: Tue, 2 Oct 2012 14:15:04 -0400 Subject: [PATCH 232/695] Pad tone curve control points at the end, if necessary. --- framework/Source/GPUImageToneCurveFilter.m | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 0716cc3e1..4c2b17531 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -250,11 +250,21 @@ - (NSArray *)getPreparedSplineCurve:(NSArray *)points CGPoint firstSplinePoint = [[splinePoints objectAtIndex:0] CGPointValue]; if (firstSplinePoint.x > 0) { - for (int i=0; i <=firstSplinePoint.x; i++) { - CGPoint newCGPoint = CGPointMake(0, 0); + for (int i=firstSplinePoint.x; i >= 0; i--) { + CGPoint newCGPoint = CGPointMake(i, 0); [splinePoints insertObject:[NSValue valueWithCGPoint:newCGPoint] atIndex:0]; } } + + // Insert points similarly at the end, if necessary. + CGPoint lastSplinePoint = [[splinePoints objectAtIndex:([splinePoints count] - 1)] CGPointValue]; + + if (lastSplinePoint.x < 255) { + for (int i = lastSplinePoint.x + 1; i <= 255; i++) { + CGPoint newCGPoint = CGPointMake(i, 255); + [splinePoints addObject:[NSValue valueWithCGPoint:newCGPoint]]; + } + } // Prepare the spline points. From 99ef54a351f2f51693cb57a95a315403bc287178 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 2 Oct 2012 21:43:42 -0500 Subject: [PATCH 233/695] Fixed pixellation and other filters by making sure they get uniforms and aspect ratios set properly before running the first filter operation. --- framework/Source/GPUImageFilter.m | 18 +++++++++--------- framework/Source/GPUImageOutput.h | 1 + framework/Source/GPUImageOutput.m | 14 ++++++++++++++ framework/Source/GPUImagePixellateFilter.m | 10 ++++++++-- .../Source/GPUImageSphereRefractionFilter.m | 9 ++++++++- framework/Source/GPUImageStillCamera.m | 6 +++++- 6 files changed, 45 insertions(+), 13 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 37e2f08a7..0e3645e50 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -603,7 +603,7 @@ - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSStrin - (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); }); @@ -611,7 +611,7 @@ - (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLPr - (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); }); @@ -619,7 +619,7 @@ - (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLPr - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; glUniform1f(uniform, floatValue); }); @@ -627,7 +627,7 @@ - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgra - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; GLfloat positionArray[2]; @@ -640,7 +640,7 @@ - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgra - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; GLfloat sizeArray[2]; @@ -653,7 +653,7 @@ - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram * - (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); @@ -662,7 +662,7 @@ - (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLPro - (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); @@ -671,7 +671,7 @@ - (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLPro - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; glUniform1fv(uniform, arrayLength, arrayValue); @@ -680,7 +680,7 @@ - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUnifo - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; glUniform1i(uniform, intValue); }); diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index fbc95deae..2b57581c5 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -4,6 +4,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)); +void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)); void reportAvailableMemoryForGPUImage(NSString *tag); @class GPUImageMovieWriter; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index d0b0350bd..0e4118822 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -29,6 +29,20 @@ void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) } } +void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)) +{ + dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue]; + + if (dispatch_get_current_queue() == videoProcessingQueue) + { + block(); + } + else + { + dispatch_async(videoProcessingQueue, block); + } +} + void reportAvailableMemoryForGPUImage(NSString *tag) { if (!tag) diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index 28071abec..e68d464d7 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -63,9 +63,15 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; [super setInputSize:newSize atIndex:textureIndex]; if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } } } diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index 45b9b41d0..849f62652 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -83,7 +83,14 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; if (!CGSizeEqualToSize(oldInputSize, inputTextureSize) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } } } diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 8f3a90801..a459bff53 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -96,7 +96,11 @@ - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBuffer [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { block(imageSampleBuffer, error); - }];*/ + }]; + + dispatch_semaphore_signal(frameRenderingSemaphore); + + */ return; } From 868daaf78ab46bee9f26d39331a062256551923a Mon Sep 17 00:00:00 2001 From: howang Date: Tue, 9 Oct 2012 12:40:03 +0800 Subject: [PATCH 234/695] fixed a bug in GPUImageToneCurveFilter that non-exists acv file will cause EXC_BAD_ACCESS --- framework/Source/GPUImageToneCurveFilter.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 4c2b17531..0245913d7 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -40,8 +40,8 @@ - (id) initWithCurveFilePathURL:(NSURL*)curveFilePathURL NSError* error = nil; NSFileHandle* file = [NSFileHandle fileHandleForReadingFromURL:curveFilePathURL error:&error]; - - if (error) + + if ((file == nil) || (error != nil)) { NSLog(@"Failed to open file: %@", error); From 372086aee4e69e749a654a798e55d6a96f6dff51 Mon Sep 17 00:00:00 2001 From: Joachim Bengtsson Date: Wed, 10 Oct 2012 14:25:55 +0200 Subject: [PATCH 235/695] UIElement: Send times for frames Otherwise you can't record movies to file with GPUImageUIElement as source. --- framework/Source/GPUImageUIElement.m | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m index 81f984261..02d60ea3b 100644 --- a/framework/Source/GPUImageUIElement.m +++ b/framework/Source/GPUImageUIElement.m @@ -6,6 +6,8 @@ @interface GPUImageUIElement () CALayer *layer; CGSize previousLayerSizeInPixels; + CMTime time; + NSTimeInterval actualTimeOfLastUpdate; } @end @@ -60,6 +62,16 @@ - (void)update; { [GPUImageOpenGLESContext useImageProcessingContext]; + if(CMTIME_IS_INVALID(time)) { + time = CMTimeMakeWithSeconds(0, 600); + actualTimeOfLastUpdate = [NSDate timeIntervalSinceReferenceDate]; + } else { + NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; + NSTimeInterval diff = now - actualTimeOfLastUpdate; + time = CMTimeAdd(time, CMTimeMakeWithSeconds(diff, 600)); + actualTimeOfLastUpdate = now; + } + CGSize layerPixelSize = [self layerSizeInPixels]; GLubyte *imageData = (GLubyte *) calloc(1, (int)layerPixelSize.width * (int)layerPixelSize.height * 4); @@ -81,7 +93,6 @@ - (void)update; free(imageData); - for (id currentTarget in targets) { if (currentTarget != self.targetToIgnoreForUpdates) @@ -90,7 +101,7 @@ - (void)update; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:layerPixelSize atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:time atIndex:textureIndexOfTarget]; } } } From 3dcbee2cc9409779e6d6c915b409b0bcb08dc023 Mon Sep 17 00:00:00 2001 From: Joachim Bengtsson Date: Wed, 10 Oct 2012 18:02:17 +0200 Subject: [PATCH 236/695] VideoCamera: nil on missing camera so client can react on there being no camera --- framework/Source/GPUImageVideoCamera.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 0ef9777f4..c911b7801 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -89,6 +89,10 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } } + if (!_inputCamera) { + return nil; + } + // Create the capture session _captureSession = [[AVCaptureSession alloc] init]; @@ -117,6 +121,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD else { NSLog(@"Couldn't add video output"); + return nil; } _captureSessionPreset = sessionPreset; From f5a2be05910980458f55ec52728630508852ca0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Zab=C5=82ocki?= Date: Fri, 12 Oct 2012 17:58:46 +0200 Subject: [PATCH 237/695] Update framework/Source/GPUImageVideoCamera.m crash fix, using weakSelf instead of self --- framework/Source/GPUImageVideoCamera.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 0ef9777f4..8042c009e 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -502,9 +502,9 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM CFRetain(sampleBuffer); dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ //Feature Detection Hook. - if (self.delegate) + if (weakSelf.delegate) { - [self.delegate willOutputSampleBuffer:sampleBuffer]; + [weakSelf.delegate willOutputSampleBuffer:sampleBuffer]; } [weakSelf processVideoSampleBuffer:sampleBuffer]; From b3eaf9349b6f1217bab18c273bf5e9bb1f496e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Zab=C5=82ocki?= Date: Fri, 12 Oct 2012 18:05:57 +0200 Subject: [PATCH 238/695] Update framework/Source/GPUImageVideoCamera.m weakSelf typed --- framework/Source/GPUImageVideoCamera.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 8042c009e..90edfb4cf 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -477,7 +477,7 @@ - (CGFloat)averageFrameDurationDuringCapture; - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { - __unsafe_unretained id weakSelf = self; + __unsafe_unretained __typeof(self) weakSelf = self; if (captureOutput == audioOutput) { // if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) From 3400cba6cbc9bc76c7a855c09e04cc934f83cf7c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 12 Oct 2012 16:00:42 -0500 Subject: [PATCH 239/695] =?UTF-8?q?Added=20a=20Hough=20transform=20line=20?= =?UTF-8?q?detector=20based=20on=20the=20work=20of=20Dubsk=C3=A1,=20Havel,?= =?UTF-8?q?=20and=20Herout=20in=20"Real-Time=20Detection=20of=20Lines=20us?= =?UTF-8?q?ing=20Parallel=20Coordinates=20and=20OpenGL".=20The=20line=20de?= =?UTF-8?q?tector=20is=20a=20little=20noisy=20and=20slow=20right=20now,=20?= =?UTF-8?q?though.=20Added=20a=20new=20type=20of=20sketch=20filter.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 4 + .../FeatureExtractionAppDelegate.h | 1 + .../FeatureExtractionAppDelegate.m | 120 ++++++++++++++---- .../FeatureExtractionTest/LineTest.png | Bin 0 -> 3895 bytes .../FeatureExtractionTest/LineTest2.png | Bin 0 -> 4938 bytes .../ShowcaseFilterListController.m | 2 + .../ShowcaseFilterViewController.h | 2 + .../ShowcaseFilterViewController.m | 26 +++- .../GPUImageHoughTransformLineDetector.h | 13 ++ .../GPUImageHoughTransformLineDetector.m | 13 ++ framework/Source/GPUImageLineGenerator.h | 13 ++ framework/Source/GPUImageLineGenerator.m | 13 ++ ...ageParallelCoordinateLineTransformFilter.h | 13 ++ ...ageParallelCoordinateLineTransformFilter.m | 13 ++ ...=> GPUImageThresholdEdgeDetectionFilter.h} | 0 ...=> GPUImageThresholdEdgeDetectionFilter.m} | 0 .../Source/GPUImageThresholdSketchFilter.h | 13 ++ .../Source/GPUImageThresholdSketchFilter.m | 13 ++ ...geThresholdedNonMaximumSuppressionFilter.h | 13 ++ ...geThresholdedNonMaximumSuppressionFilter.m | 13 ++ 20 files changed, 258 insertions(+), 27 deletions(-) create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/LineTest.png create mode 100644 examples/FeatureExtractionTest/FeatureExtractionTest/LineTest2.png create mode 100644 framework/Source/GPUImageHoughTransformLineDetector.h create mode 100644 framework/Source/GPUImageHoughTransformLineDetector.m create mode 100644 framework/Source/GPUImageLineGenerator.h create mode 100644 framework/Source/GPUImageLineGenerator.m create mode 100644 framework/Source/GPUImageParallelCoordinateLineTransformFilter.h create mode 100644 framework/Source/GPUImageParallelCoordinateLineTransformFilter.m rename framework/Source/{GPUImageThresholdEdgeDetection.h => GPUImageThresholdEdgeDetectionFilter.h} (100%) rename framework/Source/{GPUImageThresholdEdgeDetection.m => GPUImageThresholdEdgeDetectionFilter.m} (100%) create mode 100644 framework/Source/GPUImageThresholdSketchFilter.h create mode 100644 framework/Source/GPUImageThresholdSketchFilter.m create mode 100644 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h create mode 100644 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index a217a8e7a..0f6174286 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C9156C836400AB8026 /* AVFoundation.framework */; }; BC18E0CC156C881700AB8026 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0CB156C881700AB8026 /* 71yih.png */; }; BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC46D52315D03D9C00CC63CA /* LBPTest.png */; }; + BCA464C9162785EA00C0F68E /* LineTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCA464C8162785EA00C0F68E /* LineTest.png */; }; BCB79DC715E9754000965D92 /* ChairTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB79DC615E9754000965D92 /* ChairTest.png */; }; BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCD9A355157EC35E00C41504 /* 8pixeltest.png */; }; /* End PBXBuildFile section */ @@ -68,6 +69,7 @@ BC18E0C9156C836400AB8026 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BC18E0CB156C881700AB8026 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; BC46D52315D03D9C00CC63CA /* LBPTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LBPTest.png; sourceTree = ""; }; + BCA464C8162785EA00C0F68E /* LineTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest.png; sourceTree = ""; }; BCB79DC615E9754000965D92 /* ChairTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ChairTest.png; sourceTree = ""; }; BCD9A355157EC35E00C41504 /* 8pixeltest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 8pixeltest.png; sourceTree = ""; }; /* End PBXFileReference section */ @@ -138,6 +140,7 @@ BC18E0A1156C822E00AB8026 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCA464C8162785EA00C0F68E /* LineTest.png */, BC46D52315D03D9C00CC63CA /* LBPTest.png */, BCD9A355157EC35E00C41504 /* 8pixeltest.png */, BC18E0CB156C881700AB8026 /* 71yih.png */, @@ -240,6 +243,7 @@ BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */, BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */, BCB79DC715E9754000965D92 /* ChairTest.png in Resources */, + BCA464C9162785EA00C0F68E /* LineTest.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h index 349d68ba2..a0b7a371d 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h @@ -5,6 +5,7 @@ @property (strong, nonatomic) UIWindow *window; +- (void)testHoughTransform:(GPUImageHoughTransformLineDetector *)lineDetector ofName:(NSString *)detectorName againstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector ofName:(NSString *)detectorName againstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; - (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; - (void)testNobleCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index bc5c19186..e4934e224 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -1,5 +1,17 @@ #import "FeatureExtractionAppDelegate.h" +@interface FeatureExtractionAppDelegate() +{ + GPUImageHoughTransformLineDetector *houghTransformLineDetector, *houghTransformLineDetector2, *houghTransformLineDetector3; + GPUImagePicture *blackAndWhiteBoxImage, *chairPicture, *lineTestPicture; + GPUImageAverageColor *averageColor; + GPUImageLuminosity *averageLuminosity; + GPUImageHarrisCornerDetectionFilter *harrisCornerFilter; + GPUImageNobleCornerDetectionFilter *nobleCornerFilter; + GPUImageShiTomasiFeatureDetectionFilter *shiTomasiCornerFilter; +} +@end + @implementation FeatureExtractionAppDelegate @synthesize window = _window; @@ -12,13 +24,25 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [self.window makeKeyAndVisible]; UIImage *inputImage = [UIImage imageNamed:@"71yih.png"]; - GPUImagePicture *blackAndWhiteBoxImage = [[GPUImagePicture alloc] initWithImage:inputImage]; - - [self testHarrisCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; + blackAndWhiteBoxImage = [[GPUImagePicture alloc] initWithImage:inputImage]; + UIImage *chairImage = [UIImage imageNamed:@"ChairTest.png"]; + chairPicture = [[GPUImagePicture alloc] initWithImage:chairImage]; + UIImage *lineTestImage = [UIImage imageNamed:@"LineTest.png"]; + lineTestPicture = [[GPUImagePicture alloc] initWithImage:lineTestImage]; + // Testing feature detection + [self testHarrisCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; [self testNobleCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; [self testShiTomasiCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; + // Testing Hough transform + houghTransformLineDetector = [[GPUImageHoughTransformLineDetector alloc] init]; + [self testHoughTransform:houghTransformLineDetector ofName:@"HoughTransform" againstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; + houghTransformLineDetector2 = [[GPUImageHoughTransformLineDetector alloc] init]; + [self testHoughTransform:houghTransformLineDetector2 ofName:@"HoughTransform" againstPicture:chairPicture withName:@"Chair"]; + houghTransformLineDetector3 = [[GPUImageHoughTransformLineDetector alloc] init]; + [self testHoughTransform:houghTransformLineDetector3 ofName:@"HoughTransform" againstPicture:lineTestPicture withName:@"LineTest"]; + // Testing erosion and dilation GPUImageErosionFilter *erosionFilter = [[GPUImageErosionFilter alloc] initWithRadius:4]; [blackAndWhiteBoxImage removeAllTargets]; @@ -68,15 +92,12 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [self saveImage:lbpOutput fileName:@"LocalBinaryPatterns.png"]; // Testing image color averaging - UIImage *chairImage = [UIImage imageNamed:@"ChairTest.png"]; - GPUImagePicture *chairPicture = [[GPUImagePicture alloc] initWithImage:chairImage]; - - GPUImageAverageColor *averageColor = [[GPUImageAverageColor alloc] init]; + averageColor = [[GPUImageAverageColor alloc] init]; [averageColor setColorAverageProcessingFinishedBlock:^(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime){ NSLog(@"Red: %f, green: %f, blue: %f, alpha: %f", redComponent, greenComponent, blueComponent, alphaComponent); }]; - GPUImageLuminosity *averageLuminosity = [[GPUImageLuminosity alloc] init]; + averageLuminosity = [[GPUImageLuminosity alloc] init]; [averageLuminosity setLuminosityProcessingFinishedBlock:^(CGFloat luminosity, CMTime frameTime) { NSLog(@"Luminosity: %f", luminosity); }]; @@ -91,6 +112,53 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( return YES; } +- (void)testHoughTransform:(GPUImageHoughTransformLineDetector *)lineDetector ofName:(NSString *)detectorName againstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; +{ + [pictureInput removeAllTargets]; + [pictureInput addTarget:lineDetector]; + + [lineDetector setLinesDetectedBlock:^(GLfloat* lineArray, NSUInteger linesDetected, CMTime frameTime){ + NSLog(@"Number of lines: %d", linesDetected); + + for (NSUInteger currentLineIndex = 0; currentLineIndex < linesDetected; currentLineIndex++) + { + NSLog(@"Current line: y = %f * x + %f", lineArray[currentLineIndex * 2], lineArray[currentLineIndex * 2 + 1]); + } + + GPUImageLineGenerator *lineGenerator = [[GPUImageLineGenerator alloc] init]; +// lineGenerator.crosshairWidth = 10.0; + [lineGenerator setLineColorRed:1.0 green:0.0 blue:0.0]; + [lineGenerator forceProcessingAtSize:[pictureInput outputImageSize]]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [blendFilter forceProcessingAtSize:[pictureInput outputImageSize]]; + + [pictureInput addTarget:blendFilter]; + + [lineGenerator addTarget:blendFilter]; + + [blendFilter prepareForImageCapture]; + + [lineGenerator renderLinesFromArray:lineArray count:linesDetected frameTime:frameTime]; + + dispatch_async(dispatch_get_main_queue(), ^{ + NSUInteger currentImageIndex = 0; + for (UIImage *currentImage in lineDetector.intermediateImages) + { + [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%d.png", detectorName, pictureName, currentImageIndex]]; + + currentImageIndex++; + } + + UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput]; + + [self saveImage:crosshairResult fileName:[NSString stringWithFormat:@"%@-%@-Lines.png", detectorName, pictureName]]; + }); + }]; + + [pictureInput processImage]; +} + - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector ofName:(NSString *)detectorName againstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; { cornerDetector.threshold = 0.4; @@ -100,21 +168,22 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector [pictureInput addTarget:cornerDetector]; - GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; - crosshairGenerator.crosshairWidth = 10.0; - [crosshairGenerator setCrosshairColorRed:1.0 green:0.0 blue:0.0]; - [crosshairGenerator forceProcessingAtSize:[pictureInput outputImageSize]]; - - GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; - [blendFilter forceProcessingAtSize:[pictureInput outputImageSize]]; - [pictureInput addTarget:blendFilter]; - pictureInput.targetToIgnoreForUpdates = blendFilter; - - [crosshairGenerator addTarget:blendFilter]; - - [blendFilter prepareForImageCapture]; [cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) { + GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; + crosshairGenerator.crosshairWidth = 10.0; + [crosshairGenerator setCrosshairColorRed:1.0 green:0.0 blue:0.0]; + [crosshairGenerator forceProcessingAtSize:[pictureInput outputImageSize]]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [blendFilter forceProcessingAtSize:[pictureInput outputImageSize]]; + + [pictureInput addTarget:blendFilter]; + + [crosshairGenerator addTarget:blendFilter]; + + [blendFilter prepareForImageCapture]; + NSLog(@"Number of corners: %d", cornersDetected); [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime]; @@ -127,7 +196,6 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector currentImageIndex++; } - NSLog(@"Save corner image"); UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput]; [self saveImage:crosshairResult fileName:[NSString stringWithFormat:@"%@-%@-Crosshairs.png", detectorName, pictureName]]; @@ -140,20 +208,20 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector - (void)testHarrisCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; { - GPUImageHarrisCornerDetectionFilter *harrisCornerFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; + harrisCornerFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; [self testCornerDetector:harrisCornerFilter ofName:@"Harris" againstPicture:pictureInput withName:pictureName]; } - (void)testNobleCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; { - GPUImageNobleCornerDetectionFilter *nobleCornerFilter = [[GPUImageNobleCornerDetectionFilter alloc] init]; + nobleCornerFilter = [[GPUImageNobleCornerDetectionFilter alloc] init]; [self testCornerDetector:nobleCornerFilter ofName:@"Noble" againstPicture:pictureInput withName:pictureName]; } - (void)testShiTomasiCornerDetectorAgainstPicture:(GPUImagePicture *)pictureInput withName:(NSString *)pictureName; { - GPUImageShiTomasiFeatureDetectionFilter *nobleCornerFilter = [[GPUImageShiTomasiFeatureDetectionFilter alloc] init]; - [self testCornerDetector:nobleCornerFilter ofName:@"ShiTomasi" againstPicture:pictureInput withName:pictureName]; + shiTomasiCornerFilter = [[GPUImageShiTomasiFeatureDetectionFilter alloc] init]; + [self testCornerDetector:shiTomasiCornerFilter ofName:@"ShiTomasi" againstPicture:pictureInput withName:pictureName]; } - (void)saveImage:(UIImage *)imageToSave fileName:(NSString *)imageName; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/LineTest.png b/examples/FeatureExtractionTest/FeatureExtractionTest/LineTest.png new file mode 100644 index 0000000000000000000000000000000000000000..9db9b5b7a18afd57667092cb056ab903cba2e252 GIT binary patch literal 3895 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 Ls#l_O>H0qb@keJD literal 0 HcmV?d00001 diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index c5c2debcc..37eacd741 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -109,6 +109,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SOBELEDGEDETECTION: cell.textLabel.text = @"Sobel edge detection"; break; case GPUIMAGE_PREWITTEDGEDETECTION: cell.textLabel.text = @"Prewitt edge detection"; break; case GPUIMAGE_CANNYEDGEDETECTION: cell.textLabel.text = @"Canny edge detection"; break; + case GPUIMAGE_THRESHOLDEDGEDETECTION: cell.textLabel.text = @"Threshold edge detection"; break; case GPUIMAGE_XYGRADIENT: cell.textLabel.text = @"XY derivative"; break; case GPUIMAGE_HARRISCORNERDETECTION: cell.textLabel.text = @"Harris corner detection"; break; case GPUIMAGE_NOBLECORNERDETECTION: cell.textLabel.text = @"Noble corner detection"; break; @@ -118,6 +119,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_LOWPASS: cell.textLabel.text = @"Low pass"; break; case GPUIMAGE_HIGHPASS: cell.textLabel.text = @"High pass"; break; case GPUIMAGE_SKETCH: cell.textLabel.text = @"Sketch"; break; + case GPUIMAGE_THRESHOLDSKETCH: cell.textLabel.text = @"Threshold Sketch"; break; case GPUIMAGE_TOON: cell.textLabel.text = @"Toon"; break; case GPUIMAGE_SMOOTHTOON: cell.textLabel.text = @"Smooth toon"; break; case GPUIMAGE_TILTSHIFT: cell.textLabel.text = @"Tilt shift"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index b71aa17e0..b1feb0724 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -41,6 +41,7 @@ typedef enum { GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_PREWITTEDGEDETECTION, GPUIMAGE_CANNYEDGEDETECTION, + GPUIMAGE_THRESHOLDEDGEDETECTION, GPUIMAGE_XYGRADIENT, GPUIMAGE_HARRISCORNERDETECTION, GPUIMAGE_NOBLECORNERDETECTION, @@ -50,6 +51,7 @@ typedef enum { GPUIMAGE_HIGHPASS, GPUIMAGE_MOTIONDETECTOR, GPUIMAGE_SKETCH, + GPUIMAGE_THRESHOLDSKETCH, GPUIMAGE_TOON, GPUIMAGE_SMOOTHTOON, GPUIMAGE_TILTSHIFT, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 9d1b12307..b619e651e 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -9,7 +9,7 @@ @implementation ShowcaseFilterViewController - (id)initWithFilterType:(GPUImageShowcaseFilterType)newFilterType; { self = [super initWithNibName:@"ShowcaseFilterViewController" bundle:nil]; - if (self) + if (self) { filterType = newFilterType; } @@ -516,6 +516,17 @@ - (void)setupFilter; filter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; }; break; + case GPUIMAGE_THRESHOLDEDGEDETECTION: + { + self.title = @"Threshold Edge Detection"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImageThresholdEdgeDetectionFilter alloc] init]; + }; break; case GPUIMAGE_LOCALBINARYPATTERN: { self.title = @"Local Binary Pattern"; @@ -576,6 +587,17 @@ - (void)setupFilter; filter = [[GPUImageSketchFilter alloc] init]; }; break; + case GPUIMAGE_THRESHOLDSKETCH: + { + self.title = @"Threshold Sketch"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.9]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.9]; + + filter = [[GPUImageThresholdSketchFilter alloc] init]; + }; break; case GPUIMAGE_TOON: { self.title = @"Toon"; @@ -1381,7 +1403,9 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_NOBLECORNERDETECTION: [(GPUImageNobleCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: [(GPUImageShiTomasiFeatureDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; // case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setSensitivity:[(UISlider*)sender value]]; break; + case GPUIMAGE_THRESHOLDEDGEDETECTION: [(GPUImageThresholdEdgeDetectionFilter *)filter setThreshold:[(UISlider *)sender value]]; break; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_THRESHOLDSKETCH: [(GPUImageThresholdSketchFilter *)filter setThreshold:[(UISlider *)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_SPHEREREFRACTION: [(GPUImageSphereRefractionFilter *)filter setRadius:[(UISlider *)sender value]]; break; diff --git a/framework/Source/GPUImageHoughTransformLineDetector.h b/framework/Source/GPUImageHoughTransformLineDetector.h new file mode 100644 index 000000000..82facf2bb --- /dev/null +++ b/framework/Source/GPUImageHoughTransformLineDetector.h @@ -0,0 +1,13 @@ +// +// GPUImageHoughTransformLineDetector.h +// GPUImage +// +// Created by Brad Larson on 10/7/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageFilterGroup.h" + +@interface GPUImageHoughTransformLineDetector : GPUImageFilterGroup + +@end diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m new file mode 100644 index 000000000..9c7918829 --- /dev/null +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -0,0 +1,13 @@ +// +// GPUImageHoughTransformLineDetector.m +// GPUImage +// +// Created by Brad Larson on 10/7/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageHoughTransformLineDetector.h" + +@implementation GPUImageHoughTransformLineDetector + +@end diff --git a/framework/Source/GPUImageLineGenerator.h b/framework/Source/GPUImageLineGenerator.h new file mode 100644 index 000000000..6e7b97694 --- /dev/null +++ b/framework/Source/GPUImageLineGenerator.h @@ -0,0 +1,13 @@ +// +// GPUImageLineGenerator.h +// GPUImage +// +// Created by Brad Larson on 10/11/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageCrosshairGenerator.h" + +@interface GPUImageLineGenerator : GPUImageCrosshairGenerator + +@end diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m new file mode 100644 index 000000000..a1e07d0d8 --- /dev/null +++ b/framework/Source/GPUImageLineGenerator.m @@ -0,0 +1,13 @@ +// +// GPUImageLineGenerator.m +// GPUImage +// +// Created by Brad Larson on 10/11/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageLineGenerator.h" + +@implementation GPUImageLineGenerator + +@end diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h new file mode 100644 index 000000000..b9e025dd2 --- /dev/null +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h @@ -0,0 +1,13 @@ +// +// GPUImageParallelCoordinateLineTransformFilter.h +// GPUImage +// +// Created by Brad Larson on 10/8/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageFilter.h" + +@interface GPUImageParallelCoordinateLineTransformFilter : GPUImageFilter + +@end diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m new file mode 100644 index 000000000..338323950 --- /dev/null +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -0,0 +1,13 @@ +// +// GPUImageParallelCoordinateLineTransformFilter.m +// GPUImage +// +// Created by Brad Larson on 10/8/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageParallelCoordinateLineTransformFilter.h" + +@implementation GPUImageParallelCoordinateLineTransformFilter + +@end diff --git a/framework/Source/GPUImageThresholdEdgeDetection.h b/framework/Source/GPUImageThresholdEdgeDetectionFilter.h similarity index 100% rename from framework/Source/GPUImageThresholdEdgeDetection.h rename to framework/Source/GPUImageThresholdEdgeDetectionFilter.h diff --git a/framework/Source/GPUImageThresholdEdgeDetection.m b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m similarity index 100% rename from framework/Source/GPUImageThresholdEdgeDetection.m rename to framework/Source/GPUImageThresholdEdgeDetectionFilter.m diff --git a/framework/Source/GPUImageThresholdSketchFilter.h b/framework/Source/GPUImageThresholdSketchFilter.h new file mode 100644 index 000000000..367f4e211 --- /dev/null +++ b/framework/Source/GPUImageThresholdSketchFilter.h @@ -0,0 +1,13 @@ +// +// GPUImageThresholdSketchFilter.h +// GPUImage +// +// Created by Brad Larson on 10/8/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageThresholdEdgeDetectionFilter.h" + +@interface GPUImageThresholdSketchFilter : GPUImageThresholdEdgeDetectionFilter + +@end diff --git a/framework/Source/GPUImageThresholdSketchFilter.m b/framework/Source/GPUImageThresholdSketchFilter.m new file mode 100644 index 000000000..6d842c9d9 --- /dev/null +++ b/framework/Source/GPUImageThresholdSketchFilter.m @@ -0,0 +1,13 @@ +// +// GPUImageThresholdSketchFilter.m +// GPUImage +// +// Created by Brad Larson on 10/8/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageThresholdSketchFilter.h" + +@implementation GPUImageThresholdSketchFilter + +@end diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h new file mode 100644 index 000000000..21dd45ea0 --- /dev/null +++ b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h @@ -0,0 +1,13 @@ +// +// GPUImageThresholdedNonMaximumSuppressionFilter.h +// GPUImage +// +// Created by Brad Larson on 10/8/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImage3x3TextureSamplingFilter.h" + +@interface GPUImageThresholdedNonMaximumSuppressionFilter : GPUImage3x3TextureSamplingFilter + +@end diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m new file mode 100644 index 000000000..b1cb12318 --- /dev/null +++ b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m @@ -0,0 +1,13 @@ +// +// GPUImageThresholdedNonMaximumSuppressionFilter.m +// GPUImage +// +// Created by Brad Larson on 10/8/2012. +// Copyright (c) 2012 Brad Larson. All rights reserved. +// + +#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" + +@implementation GPUImageThresholdedNonMaximumSuppressionFilter + +@end From c93a5f7a3ff945c8e2b93fdb1a0178afe0b48140 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 12 Oct 2012 16:01:31 -0500 Subject: [PATCH 240/695] Actual commit of the line detector. --- .../project.pbxproj | 4 + .../FeatureExtractionAppDelegate.m | 13 +- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 34 +++ framework/GPUImage.xcodeproj/project.pbxproj | 58 ++++- framework/Source/GPUImage.h | 9 +- framework/Source/GPUImageFilter.m | 5 + .../GPUImageHarrisCornerDetectionFilter.h | 8 +- .../GPUImageHarrisCornerDetectionFilter.m | 69 ++---- .../GPUImageHoughTransformLineDetector.h | 47 +++- .../GPUImageHoughTransformLineDetector.m | 224 +++++++++++++++++- framework/Source/GPUImageLineGenerator.h | 23 +- framework/Source/GPUImageLineGenerator.m | 154 +++++++++++- ...ageParallelCoordinateLineTransformFilter.h | 19 +- ...ageParallelCoordinateLineTransformFilter.m | 182 +++++++++++++- framework/Source/GPUImagePicture.m | 8 + .../GPUImageThresholdEdgeDetectionFilter.h | 2 +- .../GPUImageThresholdEdgeDetectionFilter.m | 22 +- .../Source/GPUImageThresholdSketchFilter.h | 8 - .../Source/GPUImageThresholdSketchFilter.m | 64 ++++- ...geThresholdedNonMaximumSuppressionFilter.h | 15 +- ...geThresholdedNonMaximumSuppressionFilter.m | 85 ++++++- framework/Source/GPUImageTwoPassFilter.m | 2 +- 24 files changed, 900 insertions(+), 157 deletions(-) diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index 0f6174286..01f5682ea 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ BCA464C9162785EA00C0F68E /* LineTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCA464C8162785EA00C0F68E /* LineTest.png */; }; BCB79DC715E9754000965D92 /* ChairTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB79DC615E9754000965D92 /* ChairTest.png */; }; BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCD9A355157EC35E00C41504 /* 8pixeltest.png */; }; + BCF2860F1628A5140051E9C5 /* LineTest2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF2860E1628A5140051E9C5 /* LineTest2.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -72,6 +73,7 @@ BCA464C8162785EA00C0F68E /* LineTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest.png; sourceTree = ""; }; BCB79DC615E9754000965D92 /* ChairTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ChairTest.png; sourceTree = ""; }; BCD9A355157EC35E00C41504 /* 8pixeltest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 8pixeltest.png; sourceTree = ""; }; + BCF2860E1628A5140051E9C5 /* LineTest2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest2.png; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -140,6 +142,7 @@ BC18E0A1156C822E00AB8026 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCF2860E1628A5140051E9C5 /* LineTest2.png */, BCA464C8162785EA00C0F68E /* LineTest.png */, BC46D52315D03D9C00CC63CA /* LBPTest.png */, BCD9A355157EC35E00C41504 /* 8pixeltest.png */, @@ -244,6 +247,7 @@ BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */, BCB79DC715E9754000965D92 /* ChairTest.png in Resources */, BCA464C9162785EA00C0F68E /* LineTest.png in Resources */, + BCF2860F1628A5140051E9C5 /* LineTest2.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index e4934e224..bfab5deae 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -2,8 +2,8 @@ @interface FeatureExtractionAppDelegate() { - GPUImageHoughTransformLineDetector *houghTransformLineDetector, *houghTransformLineDetector2, *houghTransformLineDetector3; - GPUImagePicture *blackAndWhiteBoxImage, *chairPicture, *lineTestPicture; + GPUImageHoughTransformLineDetector *houghTransformLineDetector, *houghTransformLineDetector2, *houghTransformLineDetector3, *houghTransformLineDetector4; + GPUImagePicture *blackAndWhiteBoxImage, *chairPicture, *lineTestPicture, *lineTestPicture2; GPUImageAverageColor *averageColor; GPUImageLuminosity *averageLuminosity; GPUImageHarrisCornerDetectionFilter *harrisCornerFilter; @@ -29,6 +29,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( chairPicture = [[GPUImagePicture alloc] initWithImage:chairImage]; UIImage *lineTestImage = [UIImage imageNamed:@"LineTest.png"]; lineTestPicture = [[GPUImagePicture alloc] initWithImage:lineTestImage]; + UIImage *lineTestImage2 = [UIImage imageNamed:@"LineTest2.png"]; + lineTestPicture2 = [[GPUImagePicture alloc] initWithImage:lineTestImage2]; // Testing feature detection [self testHarrisCornerDetectorAgainstPicture:blackAndWhiteBoxImage withName:@"WhiteBoxes"]; @@ -42,6 +44,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [self testHoughTransform:houghTransformLineDetector2 ofName:@"HoughTransform" againstPicture:chairPicture withName:@"Chair"]; houghTransformLineDetector3 = [[GPUImageHoughTransformLineDetector alloc] init]; [self testHoughTransform:houghTransformLineDetector3 ofName:@"HoughTransform" againstPicture:lineTestPicture withName:@"LineTest"]; + houghTransformLineDetector4 = [[GPUImageHoughTransformLineDetector alloc] init]; + [self testHoughTransform:houghTransformLineDetector4 ofName:@"HoughTransform" againstPicture:lineTestPicture2 withName:@"LineTest2"]; // Testing erosion and dilation GPUImageErosionFilter *erosionFilter = [[GPUImageErosionFilter alloc] initWithRadius:4]; @@ -120,11 +124,6 @@ - (void)testHoughTransform:(GPUImageHoughTransformLineDetector *)lineDetector of [lineDetector setLinesDetectedBlock:^(GLfloat* lineArray, NSUInteger linesDetected, CMTime frameTime){ NSLog(@"Number of lines: %d", linesDetected); - for (NSUInteger currentLineIndex = 0; currentLineIndex < linesDetected; currentLineIndex++) - { - NSLog(@"Current line: y = %f * x + %f", lineArray[currentLineIndex * 2], lineArray[currentLineIndex * 2 + 1]); - } - GPUImageLineGenerator *lineGenerator = [[GPUImageLineGenerator alloc] init]; // lineGenerator.crosshairWidth = 10.0; [lineGenerator setLineColorRed:1.0 green:0.0 blue:0.0]; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 37eacd741..300cfb920 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -114,6 +114,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_HARRISCORNERDETECTION: cell.textLabel.text = @"Harris corner detection"; break; case GPUIMAGE_NOBLECORNERDETECTION: cell.textLabel.text = @"Noble corner detection"; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: cell.textLabel.text = @"Shi-Tomasi feature detection"; break; + case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: cell.textLabel.text = @"Hough transform line detection"; break; case GPUIMAGE_BUFFER: cell.textLabel.text = @"Image buffer"; break; case GPUIMAGE_MOTIONDETECTOR: cell.textLabel.text = @"Motion detector"; break; case GPUIMAGE_LOWPASS: cell.textLabel.text = @"Low pass"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index b1feb0724..88ec38fda 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -46,6 +46,7 @@ typedef enum { GPUIMAGE_HARRISCORNERDETECTION, GPUIMAGE_NOBLECORNERDETECTION, GPUIMAGE_SHITOMASIFEATUREDETECTION, + GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR, GPUIMAGE_BUFFER, GPUIMAGE_LOWPASS, GPUIMAGE_HIGHPASS, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index b619e651e..2a4c31d2a 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -494,6 +494,19 @@ - (void)setupFilter; filter = [[GPUImageShiTomasiFeatureDetectionFilter alloc] init]; [(GPUImageShiTomasiFeatureDetectionFilter *)filter setThreshold:0.20]; }; break; + case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: + { + self.title = @"Line Detection"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.2]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.6]; + + filter = [[GPUImageHoughTransformLineDetector alloc] init]; + [(GPUImageHoughTransformLineDetector *)filter setLineDetectionThreshold:0.60]; + }; break; + case GPUIMAGE_PREWITTEDGEDETECTION: { self.title = @"Prewitt Edge Detection"; @@ -1223,6 +1236,26 @@ - (void)setupFilter; [blendFilter addTarget:filterView]; } + else if (filterType == GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR) + { + GPUImageLineGenerator *lineGenerator = [[GPUImageLineGenerator alloc] init]; +// lineGenerator.crosshairWidth = 15.0; + [lineGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; + [lineGenerator setLineColorRed:1.0 green:0.0 blue:0.0]; + [(GPUImageHoughTransformLineDetector *)filter setLinesDetectedBlock:^(GLfloat* lineArray, NSUInteger linesDetected, CMTime frameTime){ + [lineGenerator renderLinesFromArray:lineArray count:linesDetected frameTime:frameTime]; + }]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; + GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; + [videoCamera addTarget:gammaFilter]; + [gammaFilter addTarget:blendFilter]; + + [lineGenerator addTarget:blendFilter]; + + [blendFilter addTarget:filterView]; + } else if (filterType == GPUIMAGE_UIELEMENT) { GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; @@ -1402,6 +1435,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_NOBLECORNERDETECTION: [(GPUImageNobleCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: [(GPUImageShiTomasiFeatureDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; + case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: [(GPUImageHoughTransformLineDetector *)filter setLineDetectionThreshold:[(UISlider*)sender value]]; break; // case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setSensitivity:[(UISlider*)sender value]]; break; case GPUIMAGE_THRESHOLDEDGEDETECTION: [(GPUImageThresholdEdgeDetectionFilter *)filter setThreshold:[(UISlider *)sender value]]; break; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 46dd3920b..9cbc644cb 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -106,6 +106,8 @@ BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */; }; BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; + BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; }; + BC95C4091622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */; }; BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; BC982B5414F07F790001FF6F /* GPUImageColorInvertFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5014F07F790001FF6F /* GPUImageColorInvertFilter.m */; }; BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; }; @@ -138,6 +140,14 @@ BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */; }; BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; }; BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */; }; + BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; }; + BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */; }; + BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; }; + BCA632821623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632801623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m */; }; + BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; }; + BCA632871623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */; }; + BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; }; + BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */; }; BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; }; BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */; }; BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; }; @@ -292,8 +302,8 @@ BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */; }; BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; }; BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */; }; - BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */; }; - BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */; }; + BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; }; + BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m */; }; BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; }; @@ -410,6 +420,8 @@ BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCrosshairGenerator.m; path = Source/GPUImageCrosshairGenerator.m; sourceTree = SOURCE_ROOT; }; BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStillCamera.h; path = Source/GPUImageStillCamera.h; sourceTree = SOURCE_ROOT; }; BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStillCamera.m; path = Source/GPUImageStillCamera.m; sourceTree = SOURCE_ROOT; }; + BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHoughTransformLineDetector.h; path = Source/GPUImageHoughTransformLineDetector.h; sourceTree = SOURCE_ROOT; }; + BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHoughTransformLineDetector.m; path = Source/GPUImageHoughTransformLineDetector.m; sourceTree = SOURCE_ROOT; }; BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; BC982B5014F07F790001FF6F /* GPUImageColorInvertFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorInvertFilter.m; path = Source/GPUImageColorInvertFilter.m; sourceTree = SOURCE_ROOT; }; BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSaturationFilter.h; path = Source/GPUImageSaturationFilter.h; sourceTree = SOURCE_ROOT; }; @@ -442,6 +454,14 @@ BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyFilter.m; path = Source/GPUImageChromaKeyFilter.m; sourceTree = SOURCE_ROOT; }; BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageWhiteBalanceFilter.h; path = Source/GPUImageWhiteBalanceFilter.h; sourceTree = SOURCE_ROOT; }; BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageWhiteBalanceFilter.m; path = Source/GPUImageWhiteBalanceFilter.m; sourceTree = SOURCE_ROOT; }; + BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLineGenerator.h; path = Source/GPUImageLineGenerator.h; sourceTree = SOURCE_ROOT; }; + BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLineGenerator.m; path = Source/GPUImageLineGenerator.m; sourceTree = SOURCE_ROOT; }; + BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdedNonMaximumSuppressionFilter.h; path = Source/GPUImageThresholdedNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; + BCA632801623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdedNonMaximumSuppressionFilter.m; path = Source/GPUImageThresholdedNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; + BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageParallelCoordinateLineTransformFilter.h; path = Source/GPUImageParallelCoordinateLineTransformFilter.h; sourceTree = SOURCE_ROOT; }; + BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageParallelCoordinateLineTransformFilter.m; path = Source/GPUImageParallelCoordinateLineTransformFilter.m; sourceTree = SOURCE_ROOT; }; + BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdSketchFilter.h; path = Source/GPUImageThresholdSketchFilter.h; sourceTree = SOURCE_ROOT; }; + BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdSketchFilter.m; path = Source/GPUImageThresholdSketchFilter.m; sourceTree = SOURCE_ROOT; }; BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePolarPixellateFilter.h; path = Source/GPUImagePolarPixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePolarPixellateFilter.m; path = Source/GPUImagePolarPixellateFilter.m; sourceTree = SOURCE_ROOT; }; BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStretchDistortionFilter.h; path = Source/GPUImageStretchDistortionFilter.h; sourceTree = SOURCE_ROOT; }; @@ -595,8 +615,8 @@ BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageEmbossFilter.m; path = Source/GPUImageEmbossFilter.m; sourceTree = SOURCE_ROOT; }; BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCannyEdgeDetectionFilter.h; path = Source/GPUImageCannyEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCannyEdgeDetectionFilter.m; path = Source/GPUImageCannyEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; - BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdEdgeDetection.h; path = Source/GPUImageThresholdEdgeDetection.h; sourceTree = SOURCE_ROOT; }; - BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetection.m; path = Source/GPUImageThresholdEdgeDetection.m; sourceTree = SOURCE_ROOT; }; + BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdEdgeDetectionFilter.h; path = Source/GPUImageThresholdEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetectionFilter.m; path = Source/GPUImageThresholdEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSmoothToonFilter.h; path = Source/GPUImageSmoothToonFilter.h; sourceTree = SOURCE_ROOT; }; BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOpacityFilter.h; path = Source/GPUImageOpacityFilter.h; sourceTree = SOURCE_ROOT; }; @@ -781,6 +801,8 @@ BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */, BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */, BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */, + BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */, + BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */, BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */, BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, @@ -913,8 +935,8 @@ BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */, BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */, BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */, - BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.h */, - BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetection.m */, + BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */, + BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m */, BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */, BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */, BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */, @@ -935,6 +957,8 @@ BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */, BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */, BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */, + BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */, + BCA632801623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m */, BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */, BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */, BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */, @@ -965,6 +989,12 @@ BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */, BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */, BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */, + BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */, + BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */, + BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */, + BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */, + BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */, + BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */, ); name = "Image processing"; sourceTree = ""; @@ -1125,7 +1155,7 @@ BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */, BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */, BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */, - BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.h in Headers */, + BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */, BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */, 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */, BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */, @@ -1194,6 +1224,11 @@ BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */, 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */, BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */, + BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */, + BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */, + BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */, + BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */, + BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1377,7 +1412,7 @@ BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */, BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */, BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */, - BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetection.m in Sources */, + BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */, BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */, 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */, BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */, @@ -1446,6 +1481,11 @@ BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */, 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */, BC4D03D0160919AE00F64358 /* GPUImageHalftoneFilter.m in Sources */, + BC95C4091622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m in Sources */, + BCA632821623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */, + BCA632871623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */, + BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */, + BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1499,7 +1539,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1526,7 +1565,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 2ad3904e1..d4dcc0716 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -78,7 +78,7 @@ #import "GPUImage3x3ConvolutionFilter.h" #import "GPUImageEmbossFilter.h" #import "GPUImageCannyEdgeDetectionFilter.h" -#import "GPUImageThresholdEdgeDetection.h" +#import "GPUImageThresholdEdgeDetectionFilter.h" #import "GPUImageMaskFilter.h" #import "GPUImageHistogramFilter.h" #import "GPUImageHistogramGenerator.h" @@ -129,4 +129,9 @@ #import "GPUImageLowPassFilter.h" #import "GPUImageHighPassFilter.h" #import "GPUImageMotionDetector.h" -#import "GPUImageHalftoneFilter.h" \ No newline at end of file +#import "GPUImageHalftoneFilter.h" +#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" +#import "GPUImageHoughTransformLineDetector.h" +#import "GPUImageParallelCoordinateLineTransformFilter.h" +#import "GPUImageThresholdSketchFilter.h" +#import "GPUImageLineGenerator.h" diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 0e3645e50..dc8fa8830 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -716,6 +716,11 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; - (void)recreateFilterFBO { cachedMaximumOutputSize = CGSizeZero; + if (!filterFramebuffer) + { + return; + } + [self destroyFilterFBO]; if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index 130fd31a5..c8e719426 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -4,7 +4,7 @@ @class GPUImageXYDerivativeFilter; @class GPUImageGrayscaleFilter; @class GPUImageFastBlurFilter; -@class GPUImageNonMaximumSuppressionFilter; +@class GPUImageThresholdedNonMaximumSuppressionFilter; @class GPUImageColorPackingFilter; //#define DEBUGFEATUREDETECTION @@ -23,11 +23,9 @@ @interface GPUImageHarrisCornerDetectionFilter : GPUImageFilterGroup { GPUImageXYDerivativeFilter *derivativeFilter; -// GPUImageGaussianBlurFilter *blurFilter; - GPUImageFastBlurFilter *preblurFilter, *blurFilter; + GPUImageFastBlurFilter *blurFilter; GPUImageFilter *harrisCornerDetectionFilter; - GPUImageNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; - GPUImageFilter *simpleThresholdFilter; + GPUImageThresholdedNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; GPUImageColorPackingFilter *colorPackingFilter; GLfloat *cornersArray; GLubyte *rawImagePixels; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 474d5f473..e766d3f1a 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -3,7 +3,7 @@ #import "GPUImageXYDerivativeFilter.h" #import "GPUImageGrayscaleFilter.h" #import "GPUImageFastBlurFilter.h" -#import "GPUImageNonMaximumSuppressionFilter.h" +#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" #import "GPUImageColorPackingFilter.h" @interface GPUImageHarrisCornerDetectionFilter() @@ -41,23 +41,6 @@ void main() } ); -NSString *const kGPUImageSimpleThresholdFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - - uniform sampler2D inputImageTexture; - uniform lowp float threshold; - - void main() - { - lowp float intensity = texture2D(inputImageTexture, textureCoordinate).r; - - lowp float thresholdValue = step(threshold, intensity); - - gl_FragColor = vec4(thresholdValue, 0.0, 0.0, 1.0); - } -); - @synthesize blurSize; @synthesize cornersDetectedBlock; @synthesize sensitivity = _sensitivity; @@ -125,38 +108,26 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS }]; #endif - // Fourth pass: apply non-maximum suppression to find the local maxima - nonMaximumSuppressionFilter = [[GPUImageNonMaximumSuppressionFilter alloc] init]; + // Fourth pass: apply non-maximum suppression and thresholding to find the local maxima + nonMaximumSuppressionFilter = [[GPUImageThresholdedNonMaximumSuppressionFilter alloc] init]; [self addFilter:nonMaximumSuppressionFilter]; + __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; #ifdef DEBUGFEATUREDETECTION weakFilter = nonMaximumSuppressionFilter; [nonMaximumSuppressionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; [weakIntermediateImages addObject:intermediateImage]; - }]; -#endif - - // Fifth pass: threshold the result - simpleThresholdFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromString:kGPUImageSimpleThresholdFragmentShaderString]; - [self addFilter:simpleThresholdFilter]; - - __unsafe_unretained GPUImageHarrisCornerDetectionFilter *weakSelf = self; -#ifdef DEBUGFEATUREDETECTION - weakFilter = simpleThresholdFilter; - [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ - UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; - [weakIntermediateImages addObject:intermediateImage]; [weakSelf extractCornerLocationsFromImageAtFrameTime:frameTime]; }]; #else - [simpleThresholdFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { + [nonMaximumSuppressionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { [weakSelf extractCornerLocationsFromImageAtFrameTime:frameTime]; }]; #endif - - // Sixth pass: compress the thresholded points into the RGBA channels + +// Sixth pass: compress the thresholded points into the RGBA channels // colorPackingFilter = [[GPUImageColorPackingFilter alloc] init]; // [self addFilter:colorPackingFilter]; // @@ -182,12 +153,11 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS [derivativeFilter addTarget:blurFilter]; [blurFilter addTarget:harrisCornerDetectionFilter]; [harrisCornerDetectionFilter addTarget:nonMaximumSuppressionFilter]; - [nonMaximumSuppressionFilter addTarget:simpleThresholdFilter]; // [simpleThresholdFilter addTarget:colorPackingFilter]; self.initialFilters = [NSArray arrayWithObjects:derivativeFilter, nil]; // self.terminalFilter = colorPackingFilter; - self.terminalFilter = simpleThresholdFilter; + self.terminalFilter = nonMaximumSuppressionFilter; self.blurSize = 1.0; self.sensitivity = 5.0; @@ -198,7 +168,8 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS - (void)dealloc; { - free(rawImagePixels); + free(rawImagePixels); + free(cornersArray); } #pragma mark - @@ -208,16 +179,15 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; { NSUInteger numberOfCorners = 0; - CGSize imageSize = simpleThresholdFilter.outputFrameSize; + CGSize imageSize = nonMaximumSuppressionFilter.outputFrameSize; unsigned int imageByteSize = imageSize.width * imageSize.height * 4; if (rawImagePixels == NULL) { rawImagePixels = (GLubyte *)malloc(imageByteSize); - } - - cornersArray = calloc(512 * 2, sizeof(GLfloat)); + cornersArray = calloc(512 * 2, sizeof(GLfloat)); + } glReadPixels(0, 0, (int)imageSize.width, (int)imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); @@ -230,7 +200,7 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; while (currentByte < imageByteSize) { GLubyte colorByte = rawImagePixels[currentByte]; - + if (colorByte > 0) { unsigned int xCoordinate = currentByte % imageWidth; @@ -241,6 +211,7 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; numberOfCorners++; numberOfCorners = MIN(numberOfCorners, 511); + cornerStorageIndex = MIN(cornerStorageIndex, 1021); } currentByte +=4; } @@ -252,8 +223,6 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; { cornersDetectedBlock(cornersArray, numberOfCorners, frameTime); } - - free(cornersArray); } #pragma mark - @@ -277,8 +246,12 @@ - (void)setSensitivity:(CGFloat)newValue; - (void)setThreshold:(CGFloat)newValue; { - _threshold = newValue; - [simpleThresholdFilter setFloat:newValue forUniformName:@"threshold"]; + nonMaximumSuppressionFilter.threshold = newValue; +} + +- (CGFloat)threshold; +{ + return nonMaximumSuppressionFilter.threshold; } @end diff --git a/framework/Source/GPUImageHoughTransformLineDetector.h b/framework/Source/GPUImageHoughTransformLineDetector.h index 82facf2bb..a318c6db7 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.h +++ b/framework/Source/GPUImageHoughTransformLineDetector.h @@ -1,13 +1,50 @@ +#import "GPUImageFilterGroup.h" +#import "GPUImageThresholdEdgeDetectionFilter.h" +#import "GPUImageParallelCoordinateLineTransformFilter.h" +#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" +#import "GPUImageCannyEdgeDetectionFilter.h" +#import "GPUImageFastBlurFilter.h" + +// This applies a Hough transform to detect lines in a scene. It starts with a thresholded Sobel edge detection pass, +// then takes those edge points in and applies a Hough transform to convert them to lines. The intersection of these lines +// is then determined via blending and accumulation, and a non-maximum suppression filter is applied to find local maxima. +// These local maxima are then converted back into lines in normal space and returned via a callback block. // -// GPUImageHoughTransformLineDetector.h -// GPUImage +// Rather than using one of the standard Hough transform types, this filter uses parallel coordinate space which is far more efficient +// to rasterize on a GPU. // -// Created by Brad Larson on 10/7/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. +// This approach is based entirely on the PC lines process developed by the Graph@FIT research group at the Brno University of Technology +// and described in their publications: // +// M. Dubská, J. Havel, and A. Herout. Real-Time Detection of Lines using Parallel Coordinates and OpenGL. Proceedings of SCCG 2011, Bratislava, SK, p. 7. +// http://medusa.fit.vutbr.cz/public/data/papers/2011-SCCG-Dubska-Real-Time-Line-Detection-Using-PC-and-OpenGL.pdf +// M. Dubská, J. Havel, and A. Herout. PClines — Line detection using parallel coordinates. 2011 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), p. 1489- 1494. +// http://medusa.fit.vutbr.cz/public/data/papers/2011-CVPR-Dubska-PClines.pdf -#import "GPUImageFilterGroup.h" +//#define DEBUGLINEDETECTION @interface GPUImageHoughTransformLineDetector : GPUImageFilterGroup +{ + GPUImageCannyEdgeDetectionFilter *thresholdEdgeDetectionFilter; + +// GPUImageThresholdEdgeDetectionFilter *thresholdEdgeDetectionFilter; + GPUImageParallelCoordinateLineTransformFilter *parallelCoordinateLineTransformFilter; + GPUImageThresholdedNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; + + GLfloat *linesArray; + GLubyte *rawImagePixels; +} + +// A threshold value for which a point is detected as belonging to an edge for determining lines. Default is 0.9. +@property(readwrite, nonatomic) CGFloat edgeThreshold; + +// A threshold value for which a local maximum is detected as belonging to a line in parallel coordinate space. Default is 0.20. +@property(readwrite, nonatomic) CGFloat lineDetectionThreshold; + +// This block is called on the detection of lines, usually on every processed frame. A C array containing normalized slopes and intercepts in m, b pairs (y=mx+b) is passed in, along with a count of the number of lines detected and the current timestamp of the video frame +@property(nonatomic, copy) void(^linesDetectedBlock)(GLfloat* lineArray, NSUInteger linesDetected, CMTime frameTime); + +// These images are only enabled when built with DEBUGLINEDETECTION defined, and are used to examine the intermediate states of the Hough transform +@property(nonatomic, readonly, strong) NSMutableArray *intermediateImages; @end diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m index 9c7918829..6edfa881a 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -1,13 +1,221 @@ -// -// GPUImageHoughTransformLineDetector.m -// GPUImage -// -// Created by Brad Larson on 10/7/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImageHoughTransformLineDetector.h" +@interface GPUImageHoughTransformLineDetector() + +- (void)extractLineParametersFromImageAtFrameTime:(CMTime)frameTime; + +@end + @implementation GPUImageHoughTransformLineDetector +@synthesize linesDetectedBlock; +@synthesize edgeThreshold; +@synthesize lineDetectionThreshold; + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + +#ifdef DEBUGLINEDETECTION + _intermediateImages = [[NSMutableArray alloc] init]; +#endif + + // First pass: do edge detection and threshold that to just have white pixels for edges + + thresholdEdgeDetectionFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; + [self addFilter:thresholdEdgeDetectionFilter]; + +#ifdef DEBUGLINEDETECTION + __unsafe_unretained NSMutableArray *weakIntermediateImages = _intermediateImages; + __unsafe_unretained GPUImageOutput *weakFilter = thresholdEdgeDetectionFilter; + [thresholdEdgeDetectionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ + [weakIntermediateImages removeAllObjects]; + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + }]; +#endif + +/* + thresholdEdgeDetectionFilter = [[GPUImageThresholdEdgeDetectionFilter alloc] init]; + [self addFilter:thresholdEdgeDetectionFilter]; + +#ifdef DEBUGLINEDETECTION + __unsafe_unretained NSMutableArray *weakIntermediateImages = _intermediateImages; + __unsafe_unretained GPUImageFilter *weakFilter = thresholdEdgeDetectionFilter; + [thresholdEdgeDetectionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ + [weakIntermediateImages removeAllObjects]; + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + }]; +#endif + */ + // Second pass: extract the white points and draw representative lines in parallel coordinate space + parallelCoordinateLineTransformFilter = [[GPUImageParallelCoordinateLineTransformFilter alloc] init]; + [self addFilter:parallelCoordinateLineTransformFilter]; + +#ifdef DEBUGLINEDETECTION + weakFilter = parallelCoordinateLineTransformFilter; + [parallelCoordinateLineTransformFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + }]; +#endif + + // Third pass: apply non-maximum suppression + nonMaximumSuppressionFilter = [[GPUImageThresholdedNonMaximumSuppressionFilter alloc] init]; + [self addFilter:nonMaximumSuppressionFilter]; + + __unsafe_unretained GPUImageHoughTransformLineDetector *weakSelf = self; +#ifdef DEBUGLINEDETECTION + weakFilter = nonMaximumSuppressionFilter; + [nonMaximumSuppressionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ + + UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; + [weakIntermediateImages addObject:intermediateImage]; + + [weakSelf extractLineParametersFromImageAtFrameTime:frameTime]; + }]; +#else + [nonMaximumSuppressionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { + [weakSelf extractLineParametersFromImageAtFrameTime:frameTime]; + }]; +#endif + + [thresholdEdgeDetectionFilter addTarget:parallelCoordinateLineTransformFilter]; + [parallelCoordinateLineTransformFilter addTarget:nonMaximumSuppressionFilter]; + + self.initialFilters = [NSArray arrayWithObjects:thresholdEdgeDetectionFilter, nil]; + // self.terminalFilter = colorPackingFilter; + self.terminalFilter = nonMaximumSuppressionFilter; + + self.edgeThreshold = 0.95; + self.lineDetectionThreshold = 0.2; + + return self; +} + +- (void)dealloc; +{ + free(rawImagePixels); + free(linesArray); +} + +#pragma mark - +#pragma mark Corner extraction + +- (void)extractLineParametersFromImageAtFrameTime:(CMTime)frameTime; +{ + + NSUInteger numberOfLines = 0; + CGSize imageSize = nonMaximumSuppressionFilter.outputFrameSize; + + unsigned int imageByteSize = imageSize.width * imageSize.height * 4; + + if (rawImagePixels == NULL) + { + rawImagePixels = (GLubyte *)malloc(imageByteSize); + linesArray = calloc(1024 * 2, sizeof(GLfloat)); + } + + glReadPixels(0, 0, (int)imageSize.width, (int)imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + +// CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + + unsigned int imageWidth = imageSize.width * 4; + + unsigned int currentByte = 0; + unsigned int cornerStorageIndex = 0; + while (currentByte < imageByteSize) + { + GLubyte colorByte = rawImagePixels[currentByte]; + + if (colorByte > 0) + { + unsigned int xCoordinate = currentByte % imageWidth; + unsigned int yCoordinate = currentByte / imageWidth; + + CGFloat normalizedXCoordinate = -1.0 + 2.0 * (CGFloat)(xCoordinate / 4) / imageSize.width; + CGFloat normalizedYCoordinate = -1.0 + 2.0 * (CGFloat)(yCoordinate) / imageSize.height; + + if (normalizedXCoordinate < 0.0) + { + // T space + // m = -1 - d/u + // b = d * v/u + if (normalizedXCoordinate > -0.05) // Test for the case right near the X axis, stamp the X intercept instead of the Y + { + linesArray[cornerStorageIndex++] = 100000.0; + linesArray[cornerStorageIndex++] = normalizedYCoordinate; + } + else + { + linesArray[cornerStorageIndex++] = -1.0 - 1.0 / normalizedXCoordinate; + linesArray[cornerStorageIndex++] = 1.0 * normalizedYCoordinate / normalizedXCoordinate; + } + } + else + { + // S space + // m = 1 - d/u + // b = d * v/u + if (normalizedXCoordinate < 0.05) // Test for the case right near the X axis, stamp the X intercept instead of the Y + { + linesArray[cornerStorageIndex++] = 100000.0; + linesArray[cornerStorageIndex++] = normalizedYCoordinate; + } + else + { + linesArray[cornerStorageIndex++] = 1.0 - 1.0 / normalizedXCoordinate; + linesArray[cornerStorageIndex++] = 1.0 * normalizedYCoordinate / normalizedXCoordinate; + } + } + + numberOfLines++; + + numberOfLines = MIN(numberOfLines, 1023); + cornerStorageIndex = MIN(cornerStorageIndex, 2040); + } + currentByte +=4; + } + +// CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); +// NSLog(@"Processing time : %f ms", 1000.0 * currentFrameTime); + + if (linesDetectedBlock != NULL) + { + linesDetectedBlock(linesArray, numberOfLines, frameTime); + } +} + +#pragma mark - +#pragma mark Accessors + +#pragma mark - +#pragma mark Accessors + +/* +- (void)setEdgeThreshold:(CGFloat)newValue; +{ + thresholdEdgeDetectionFilter.threshold = newValue; +} + +- (CGFloat)edgeThreshold; +{ + return thresholdEdgeDetectionFilter.threshold; +} + */ + +- (void)setLineDetectionThreshold:(CGFloat)newValue; +{ + nonMaximumSuppressionFilter.threshold = newValue; +} + +- (CGFloat)lineDetectionThreshold; +{ + return nonMaximumSuppressionFilter.threshold; +} + @end diff --git a/framework/Source/GPUImageLineGenerator.h b/framework/Source/GPUImageLineGenerator.h index 6e7b97694..4c4673669 100644 --- a/framework/Source/GPUImageLineGenerator.h +++ b/framework/Source/GPUImageLineGenerator.h @@ -1,13 +1,18 @@ -// -// GPUImageLineGenerator.h -// GPUImage -// -// Created by Brad Larson on 10/11/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// +#import "GPUImageFilter.h" -#import "GPUImageCrosshairGenerator.h" +@interface GPUImageLineGenerator : GPUImageFilter +{ + GLint lineWidthUniform, lineColorUniform; + GLfloat *lineCoordinates; +} -@interface GPUImageLineGenerator : GPUImageCrosshairGenerator +// The width of the displayed lines, in pixels. The default is 1. +@property(readwrite, nonatomic) CGFloat lineWidth; + +// The color of the lines is specified using individual red, green, and blue components (normalized to 1.0). The default is green: (0.0, 1.0, 0.0). +- (void)setLineColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; + +// Rendering +- (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger)numberOfLines frameTime:(CMTime)frameTime; @end diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m index a1e07d0d8..b11a7dc85 100644 --- a/framework/Source/GPUImageLineGenerator.m +++ b/framework/Source/GPUImageLineGenerator.m @@ -1,13 +1,151 @@ -// -// GPUImageLineGenerator.m -// GPUImage -// -// Created by Brad Larson on 10/11/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImageLineGenerator.h" +NSString *const kGPUImageLineGeneratorVertexShaderString = SHADER_STRING +( + attribute vec4 position; + + void main() + { + gl_Position = position; + } + ); + +NSString *const kGPUImageLineGeneratorFragmentShaderString = SHADER_STRING +( + uniform lowp vec3 lineColor; + + void main() + { + gl_FragColor = vec4(lineColor, 1.0); + } +); + +@interface GPUImageLineGenerator() + +- (void)generateLineCoordinates; + +@end + @implementation GPUImageLineGenerator +@synthesize lineWidth = _lineWidth; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageLineGeneratorVertexShaderString fragmentShaderFromString:kGPUImageLineGeneratorFragmentShaderString])) + { + return nil; + } + + runSynchronouslyOnVideoProcessingQueue(^{ + lineWidthUniform = [filterProgram uniformIndex:@"lineWidth"]; + lineColorUniform = [filterProgram uniformIndex:@"lineColor"]; + + self.lineWidth = 1.0; + [self setLineColorRed:0.0 green:1.0 blue:0.0]; + }); + + return self; +} + +- (void)dealloc +{ + if (lineCoordinates) + { + free(lineCoordinates); + } +} + +#pragma mark - +#pragma mark Rendering + +- (void)generateLineCoordinates; +{ + lineCoordinates = calloc(1024 * 4, sizeof(GLfloat)); +} + +- (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger)numberOfLines frameTime:(CMTime)frameTime; +{ + if (self.preventRendering) + { + return; + } + + if (lineCoordinates == NULL) + { + [self generateLineCoordinates]; + } + + // Iterate through and generate vertices from the slopes and intercepts + NSUInteger currentVertexIndex = 0; + NSUInteger currentLineIndex = 0; + NSUInteger maxLineIndex = numberOfLines *2; + while(currentLineIndex < maxLineIndex) + { + GLfloat slope = lineSlopeAndIntercepts[currentLineIndex++]; + GLfloat intercept = lineSlopeAndIntercepts[currentLineIndex++]; + + if (lineSlopeAndIntercepts[currentLineIndex] > 9000.0) // Vertical line + { + lineCoordinates[currentVertexIndex++] = intercept; + lineCoordinates[currentVertexIndex++] = -1.0; + lineCoordinates[currentVertexIndex++] = intercept; + lineCoordinates[currentVertexIndex++] = 1.0; + } + else + { + lineCoordinates[currentVertexIndex++] = -1.0; + lineCoordinates[currentVertexIndex++] = slope * -1.0 + intercept; + lineCoordinates[currentVertexIndex++] = 1.0; + lineCoordinates[currentVertexIndex++] = slope * 1.0 + intercept; + } + } + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + [self setFilterFBO]; + + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_ONE, GL_ONE); + glEnable(GL_BLEND); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, lineCoordinates); + glDrawArrays(GL_LINES, 0, (numberOfLines * 2)); + + glDisable(GL_BLEND); + + [self informTargetsAboutNewFrameAtTime:frameTime]; + }); +} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + // Prevent rendering of the frame by normal means +} + +#pragma mark - +#pragma mark Accessors + +- (void)setLineWidth:(CGFloat)newValue; +{ + _lineWidth = newValue; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + glLineWidth(newValue); +} + +- (void)setLineColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +{ + GPUVector3 lineColor = {redComponent, greenComponent, blueComponent}; + + [self setVec3:lineColor forUniform:lineColorUniform program:filterProgram]; +} + + @end diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h index b9e025dd2..69a6e4a9d 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h @@ -1,13 +1,16 @@ -// -// GPUImageParallelCoordinateLineTransformFilter.h -// GPUImage -// -// Created by Brad Larson on 10/8/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImageFilter.h" +// This is an accumulator that uses a Hough transform in parallel coordinate space to identify probable lines in a scene. +// +// It is entirely based on the work of the Graph@FIT research group at the Brno University of Technology and their publications: +// M. Dubská, J. Havel, and A. Herout. Real-Time Detection of Lines using Parallel Coordinates and OpenGL. Proceedings of SCCG 2011, Bratislava, SK, p. 7. +// M. Dubská, J. Havel, and A. Herout. PClines — Line detection using parallel coordinates. 2011 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), p. 1489- 1494. + @interface GPUImageParallelCoordinateLineTransformFilter : GPUImageFilter +{ + GLubyte *rawImagePixels; + GLfloat *lineCoordinates; + NSUInteger maxLinePairsToRender, linePairsToRender; +} @end diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index 338323950..b131aa50f 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -1,13 +1,179 @@ -// -// GPUImageParallelCoordinateLineTransformFilter.m -// GPUImage -// -// Created by Brad Larson on 10/8/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImageParallelCoordinateLineTransformFilter.h" +NSString *const kGPUImageHoughAccumulationVertexShaderString = SHADER_STRING +( + attribute vec4 position; + + void main() + { + gl_Position = position; + } +); + +NSString *const kGPUImageHoughAccumulationFragmentShaderString = SHADER_STRING +( + const lowp float scalingFactor = 1.0 / 256.0; + + void main() + { +// gl_FragColor = vec4(scalingFactor, scalingFactor, scalingFactor, 1.0); + gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); + } +); + +@interface GPUImageParallelCoordinateLineTransformFilter() +// Rendering +- (void)generateLineCoordinates; + +@end + @implementation GPUImageParallelCoordinateLineTransformFilter +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageHoughAccumulationVertexShaderString fragmentShaderFromString:kGPUImageHoughAccumulationFragmentShaderString])) + { + return nil; + } + + return self; +} + +// TODO: have this be regenerated on change of image size +- (void)dealloc; +{ + free(rawImagePixels); + free(lineCoordinates); +} + +- (void)initializeAttributes; +{ + [filterProgram addAttribute:@"position"]; +} + +#pragma mark - +#pragma mark Rendering + +#define MAXLINESCALINGFACTOR 4 + +- (void)generateLineCoordinates; +{ + unsigned int imageByteSize = inputTextureSize.width * inputTextureSize.height * 4; + rawImagePixels = (GLubyte *)malloc(imageByteSize); + + maxLinePairsToRender = (inputTextureSize.width * inputTextureSize.height) / MAXLINESCALINGFACTOR; + lineCoordinates = calloc(maxLinePairsToRender * 8, sizeof(GLfloat)); +} + +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; +{ + if (lineCoordinates == NULL) + { + [self generateLineCoordinates]; + } + + [self renderToTextureWithVertices:NULL textureCoordinates:NULL sourceTexture:filterSourceTexture]; + + [self informTargetsAboutNewFrameAtTime:frameTime]; +} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + if (self.preventRendering) + { + return; + } + + [GPUImageOpenGLESContext useImageProcessingContext]; + + // Grab the edge points from the previous frame and create the parallel coordinate lines for them + // This would be a great place to have a working histogram pyramid implementation + glFinish(); + glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + + CGFloat xAspectMultiplier = 1.0, yAspectMultiplier = 1.0; + +// if (inputTextureSize.width > inputTextureSize.height) +// { +// yAspectMultiplier = inputTextureSize.height / inputTextureSize.width; +// } +// else +// { +// xAspectMultiplier = inputTextureSize.width / inputTextureSize.height; +// } + +// CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + + unsigned int imageByteSize = inputTextureSize.width * inputTextureSize.height * 4; + unsigned int imageWidth = inputTextureSize.width * 4; + + linePairsToRender = 0; + unsigned int currentByte = 0; + unsigned int lineStorageIndex = 0; + unsigned int maxLineStorageIndex = maxLinePairsToRender * 8 - 8; + + GLfloat minY = 100, maxY = -100, minX = 100, maxX = -100; + while (currentByte < imageByteSize) + { + GLubyte colorByte = rawImagePixels[currentByte]; + + if (colorByte > 0) + { + unsigned int xCoordinate = currentByte % imageWidth; + unsigned int yCoordinate = currentByte / imageWidth; + + CGFloat normalizedXCoordinate = (-1.0 + 2.0 * (CGFloat)(xCoordinate / 4) / inputTextureSize.width) * xAspectMultiplier; + CGFloat normalizedYCoordinate = (-1.0 + 2.0 * (CGFloat)(yCoordinate) / inputTextureSize.height) * yAspectMultiplier; + + minY = MIN(minY, normalizedYCoordinate); + maxY = MAX(maxY, normalizedYCoordinate); + minX = MIN(minX, normalizedXCoordinate); + maxX = MAX(maxX, normalizedXCoordinate); + +// NSLog(@"Parallel line coordinates: (%f, %f) - (%f, %f) - (%f, %f)", -1.0, -normalizedYCoordinate, 0.0, normalizedXCoordinate, 1.0, normalizedYCoordinate); + // T space coordinates, (-d, -y) to (0, x) + lineCoordinates[lineStorageIndex++] = -1.0; + lineCoordinates[lineStorageIndex++] = -normalizedYCoordinate; + lineCoordinates[lineStorageIndex++] = 0.0; + lineCoordinates[lineStorageIndex++] = normalizedXCoordinate; + + // S space coordinates, (0, x) to (d, y) + lineCoordinates[lineStorageIndex++] = 0.0; + lineCoordinates[lineStorageIndex++] = normalizedXCoordinate; + lineCoordinates[lineStorageIndex++] = 1.0; + lineCoordinates[lineStorageIndex++] = normalizedYCoordinate; + + linePairsToRender++; + + linePairsToRender = MIN(linePairsToRender, maxLinePairsToRender); + lineStorageIndex = MIN(lineStorageIndex, maxLineStorageIndex); + } + currentByte +=8; + } + +// NSLog(@"Line pairs to render: %d out of max: %d", linePairsToRender, maxLinePairsToRender); + +// CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); +// NSLog(@"Line generation processing time : %f ms", 1000.0 * currentFrameTime); + + [self setFilterFBO]; + + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + + glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_ONE, GL_ONE); + glEnable(GL_BLEND); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, lineCoordinates); + glDrawArrays(GL_LINES, 0, (linePairsToRender * 4)); + + glDisable(GL_BLEND); +} + @end diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 0eeb333bb..9a568644f 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -35,6 +35,8 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot { return nil; } + + hasProcessedImage = NO; self.shouldSmoothlyScaleOutput = smoothlyScaleOutput; // TODO: Dispatch this whole thing asynchronously to move image loading off main thread @@ -136,6 +138,12 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot #pragma mark - #pragma mark Image rendering +- (void)removeAllTargets; +{ + [super removeAllTargets]; + hasProcessedImage = NO; +} + - (void)processImage; { hasProcessedImage = YES; diff --git a/framework/Source/GPUImageThresholdEdgeDetectionFilter.h b/framework/Source/GPUImageThresholdEdgeDetectionFilter.h index a00b0409b..2036030cf 100755 --- a/framework/Source/GPUImageThresholdEdgeDetectionFilter.h +++ b/framework/Source/GPUImageThresholdEdgeDetectionFilter.h @@ -1,6 +1,6 @@ #import "GPUImageSobelEdgeDetectionFilter.h" -@interface GPUImageThresholdEdgeDetection : GPUImageSobelEdgeDetectionFilter +@interface GPUImageThresholdEdgeDetectionFilter : GPUImageSobelEdgeDetectionFilter { GLint thresholdUniform; } diff --git a/framework/Source/GPUImageThresholdEdgeDetectionFilter.m b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m index d95f80022..0d10c0745 100755 --- a/framework/Source/GPUImageThresholdEdgeDetectionFilter.m +++ b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m @@ -1,6 +1,6 @@ -#import "GPUImageThresholdEdgeDetection.h" +#import "GPUImageThresholdEdgeDetectionFilter.h" -@implementation GPUImageThresholdEdgeDetection +@implementation GPUImageThresholdEdgeDetectionFilter // Invert the colorspace for a sketch NSString *const kGPUImageThresholdEdgeDetectionFragmentShaderString = SHADER_STRING @@ -37,7 +37,7 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = 1.0 - length(vec2(h, v)); + float mag = length(vec2(h, v)); mag = step(threshold, mag); gl_FragColor = vec4(vec3(mag), 1.0); @@ -49,10 +49,9 @@ void main() @synthesize threshold = _threshold; - -- (id)init; +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; { - if (!(self = [self initWithFragmentShaderFromString:kGPUImageThresholdEdgeDetectionFragmentShaderString])) + if (!(self = [super initWithFragmentShaderFromString:fragmentShaderString])) { return nil; } @@ -63,6 +62,17 @@ - (id)init; return self; } + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImageThresholdEdgeDetectionFragmentShaderString])) + { + return nil; + } + + return self; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageThresholdSketchFilter.h b/framework/Source/GPUImageThresholdSketchFilter.h index 367f4e211..fda589790 100644 --- a/framework/Source/GPUImageThresholdSketchFilter.h +++ b/framework/Source/GPUImageThresholdSketchFilter.h @@ -1,11 +1,3 @@ -// -// GPUImageThresholdSketchFilter.h -// GPUImage -// -// Created by Brad Larson on 10/8/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImageThresholdEdgeDetectionFilter.h" @interface GPUImageThresholdSketchFilter : GPUImageThresholdEdgeDetectionFilter diff --git a/framework/Source/GPUImageThresholdSketchFilter.m b/framework/Source/GPUImageThresholdSketchFilter.m index 6d842c9d9..aba7e1d04 100644 --- a/framework/Source/GPUImageThresholdSketchFilter.m +++ b/framework/Source/GPUImageThresholdSketchFilter.m @@ -1,13 +1,61 @@ -// -// GPUImageThresholdSketchFilter.m -// GPUImage -// -// Created by Brad Larson on 10/8/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImageThresholdSketchFilter.h" + +NSString *const kGPUImageThresholdSketchFragmentShaderString = SHADER_STRING +( + precision highp float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + uniform lowp float threshold; + + const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + + float mag = 1.0 - length(vec2(h, v)); + mag = step(threshold, mag); + + gl_FragColor = vec4(vec3(mag), 1.0); + } + ); + + @implementation GPUImageThresholdSketchFilter +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImageThresholdSketchFragmentShaderString])) + { + return nil; + } + + return self; +} + @end diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h index 21dd45ea0..8ddf93c16 100644 --- a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h +++ b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h @@ -1,13 +1,12 @@ -// -// GPUImageThresholdedNonMaximumSuppressionFilter.h -// GPUImage -// -// Created by Brad Larson on 10/8/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// - #import "GPUImage3x3TextureSamplingFilter.h" @interface GPUImageThresholdedNonMaximumSuppressionFilter : GPUImage3x3TextureSamplingFilter +{ + GLint thresholdUniform; +} + +/** Any local maximum above this threshold will be white, and anything below black. Ranges from 0.0 to 1.0, with 0.8 as the default + */ +@property(readwrite, nonatomic) CGFloat threshold; @end diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m index b1cb12318..1c2dce1dc 100644 --- a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m @@ -1,13 +1,84 @@ +#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" + +NSString *const kGPUImageThresholdedNonMaximumSuppressionFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying highp vec2 textureCoordinate; + varying highp vec2 leftTextureCoordinate; + varying highp vec2 rightTextureCoordinate; + + varying highp vec2 topTextureCoordinate; + varying highp vec2 topLeftTextureCoordinate; + varying highp vec2 topRightTextureCoordinate; + + varying highp vec2 bottomTextureCoordinate; + varying highp vec2 bottomLeftTextureCoordinate; + varying highp vec2 bottomRightTextureCoordinate; + + uniform lowp float threshold; + + void main() + { + lowp float bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).r; + lowp float bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + lowp float bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + lowp vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + lowp float leftColor = texture2D(inputImageTexture, leftTextureCoordinate).r; + lowp float rightColor = texture2D(inputImageTexture, rightTextureCoordinate).r; + lowp float topColor = texture2D(inputImageTexture, topTextureCoordinate).r; + lowp float topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).r; + lowp float topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + + // Use a tiebreaker for pixels to the left and immediately above this one + lowp float multiplier = 1.0 - step(centerColor.r, topColor); + multiplier = multiplier * 1.0 - step(centerColor.r, topLeftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, leftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, bottomLeftColor); + + lowp float maxValue = max(centerColor.r, bottomColor); + maxValue = max(maxValue, bottomRightColor); + maxValue = max(maxValue, rightColor); + maxValue = max(maxValue, topRightColor); + + lowp float finalValue = centerColor.r * step(maxValue, centerColor.r) * multiplier; + finalValue = step(threshold, finalValue); + + gl_FragColor = vec4(finalValue, finalValue, finalValue, 1.0); // -// GPUImageThresholdedNonMaximumSuppressionFilter.m -// GPUImage -// -// Created by Brad Larson on 10/8/2012. -// Copyright (c) 2012 Brad Larson. All rights reserved. -// +// gl_FragColor = vec4((centerColor.rgb * step(maxValue, step(threshold, centerColor.r)) * multiplier), 1.0); + } +); -#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" @implementation GPUImageThresholdedNonMaximumSuppressionFilter +@synthesize threshold = _threshold; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageThresholdedNonMaximumSuppressionFragmentShaderString])) + { + return nil; + } + + thresholdUniform = [filterProgram uniformIndex:@"threshold"]; + self.threshold = 0.9; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setThreshold:(CGFloat)newValue; +{ + _threshold = newValue; + + [self setFloat:_threshold forUniform:thresholdUniform program:filterProgram]; +} + @end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 363ba6475..a4f0425b5 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -211,7 +211,7 @@ - (void)destroyFilterFBO; - (void)setSecondFilterFBO; { glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - + // CGSize currentFBOSize = [self sizeOfFBO]; // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } From 066a080548b4007848ce0e82e4fbfa44a8e2dee6 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 16 Oct 2012 09:12:22 -0500 Subject: [PATCH 241/695] Fixed a potential compilation error with certain versions of Xcode. --- framework/Source/GPUImageVideoCamera.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index f9c96cb64..0d893e8cc 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -482,7 +482,7 @@ - (CGFloat)averageFrameDurationDuringCapture; - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { - __unsafe_unretained __typeof(self) weakSelf = self; + __unsafe_unretained GPUImageVideoCamera *weakSelf = self; if (captureOutput == audioOutput) { // if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) From f2e48c35919482699bdbda29f74246c8debf6860 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 18 Oct 2012 16:13:13 +1300 Subject: [PATCH 242/695] Levels filter Signed-off-by: Karl von Randow --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 23 ++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 1 + framework/Source/GPUImageLevelsFilter.h | 19 ++++ framework/Source/GPUImageLevelsFilter.m | 100 ++++++++++++++++++ 7 files changed, 153 insertions(+) create mode 100644 framework/Source/GPUImageLevelsFilter.h create mode 100644 framework/Source/GPUImageLevelsFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 300cfb920..8b025e890 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -72,6 +72,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SATURATION: cell.textLabel.text = @"Saturation"; break; case GPUIMAGE_CONTRAST: cell.textLabel.text = @"Contrast"; break; case GPUIMAGE_BRIGHTNESS: cell.textLabel.text = @"Brightness"; break; + case GPUIMAGE_LEVELS: cell.textLabel.text = @"Levels"; break; case GPUIMAGE_EXPOSURE: cell.textLabel.text = @"Exposure"; break; case GPUIMAGE_RGB: cell.textLabel.text = @"RGB"; break; case GPUIMAGE_HUE: cell.textLabel.text = @"Hue"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 88ec38fda..042290840 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -5,6 +5,7 @@ typedef enum { GPUIMAGE_SATURATION, GPUIMAGE_CONTRAST, GPUIMAGE_BRIGHTNESS, + GPUIMAGE_LEVELS, GPUIMAGE_EXPOSURE, GPUIMAGE_RGB, GPUIMAGE_HUE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 2a4c31d2a..5ef763b79 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -221,6 +221,17 @@ - (void)setupFilter; filter = [[GPUImageBrightnessFilter alloc] init]; }; break; + case GPUIMAGE_LEVELS: + { + self.title = @"Levels"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:-1.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.0]; + + filter = [[GPUImageLevelsFilter alloc] init]; + }; break; case GPUIMAGE_RGB: { self.title = @"RGB"; @@ -1405,6 +1416,18 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_SATURATION: [(GPUImageSaturationFilter *)filter setSaturation:[(UISlider *)sender value]]; break; case GPUIMAGE_CONTRAST: [(GPUImageContrastFilter *)filter setContrast:[(UISlider *)sender value]]; break; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; + case GPUIMAGE_LEVELS: { + float value = [(UISlider *)sender value]; + if (value < 0.0) { + [(GPUImageLevelsFilter *)filter setRedMin:-value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + [(GPUImageLevelsFilter *)filter setGreenMin:-value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + [(GPUImageLevelsFilter *)filter setBlueMin:-value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + } else { + [(GPUImageLevelsFilter *)filter setRedMin:0.0 gamma:1.0 max:value minOut:0.0 maxOut:1.0]; + [(GPUImageLevelsFilter *)filter setGreenMin:0.0 gamma:1.0 max:value minOut:0.0 maxOut:1.0]; + [(GPUImageLevelsFilter *)filter setBlueMin:0.0 gamma:1.0 max:value minOut:0.0 maxOut:1.0]; + } + }; break; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_RGB: [(GPUImageRGBFilter *)filter setGreen:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 9cbc644cb..a4076855a 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -45,6 +45,8 @@ 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; + B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; }; + B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */; }; BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; }; BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */; }; BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; }; @@ -361,6 +363,8 @@ 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLookupFilter.m; path = Source/GPUImageLookupFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; + B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLevelsFilter.h; path = Source/GPUImageLevelsFilter.h; sourceTree = SOURCE_ROOT; }; + B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLevelsFilter.m; path = Source/GPUImageLevelsFilter.m; sourceTree = SOURCE_ROOT; }; BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGlassSphereFilter.h; path = Source/GPUImageGlassSphereFilter.h; sourceTree = SOURCE_ROOT; }; BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGlassSphereFilter.m; path = Source/GPUImageGlassSphereFilter.m; sourceTree = SOURCE_ROOT; }; BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMedianFilter.h; path = Source/GPUImageMedianFilter.h; sourceTree = SOURCE_ROOT; }; @@ -675,6 +679,8 @@ children = ( BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */, BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */, + B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */, + B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */, BCB6B833150400030041703B /* GPUImageExposureFilter.h */, BCB6B834150400030041703B /* GPUImageExposureFilter.m */, BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */, @@ -1229,6 +1235,7 @@ BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */, BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */, BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */, + B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1486,6 +1493,7 @@ BCA632871623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */, BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */, BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */, + B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index d4dcc0716..3aa6898f4 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -28,6 +28,7 @@ #import "GPUImageContrastFilter.h" #import "GPUImageExposureFilter.h" #import "GPUImageBrightnessFilter.h" +#import "GPUImageLevelsFilter.h" #import "GPUImageSharpenFilter.h" #import "GPUImageGammaFilter.h" #import "GPUImageSobelEdgeDetectionFilter.h" diff --git a/framework/Source/GPUImageLevelsFilter.h b/framework/Source/GPUImageLevelsFilter.h new file mode 100644 index 000000000..0e7498bf8 --- /dev/null +++ b/framework/Source/GPUImageLevelsFilter.h @@ -0,0 +1,19 @@ +#import "GPUImageFilter.h" + +@interface GPUImageLevelsFilter : GPUImageFilter +{ + GLint redUniform; + GLint greenUniform; + GLint blueUniform; +} + +- (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; +- (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; +- (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; + +- (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; +- (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; +- (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; + +@end + diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m new file mode 100644 index 000000000..11e3b3bed --- /dev/null +++ b/framework/Source/GPUImageLevelsFilter.m @@ -0,0 +1,100 @@ +#import "GPUImageLevelsFilter.h" + +/* + ** Gamma correction + ** Details: http://blog.mouaif.org/2009/01/22/photoshop-gamma-correction-shader/ + */ + +#define GammaCorrection(color, gamma) pow(color, 1.0 / gamma) + +/* + ** Levels control (input (+gamma), output) + ** Details: http://blog.mouaif.org/2009/01/28/levels-control-shader/ + */ + +#define LevelsControlInputRange(color, minInput, maxInput) min(max(color - minInput, 0.0) / (maxInput - minInput), 1.0) +#define LevelsControlInput(color, minInput, gamma, maxInput) GammaCorrection(LevelsControlInputRange(color, minInput, maxInput), gamma) +#define LevelsControlOutputRange(color, minOutput, maxOutput) mix(minOutput, maxOutput, color) +#define LevelsControl(color, minInput, gamma, maxInput, minOutput, maxOutput) LevelsControlOutputRange(LevelsControlInput(color, minInput, gamma, maxInput), minOutput, maxOutput) + +NSString *const kGPUImageLevelsFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform lowp float red[5]; + uniform lowp float green[5]; + uniform lowp float blue[5]; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4(LevelsControl(textureColor.r, red[0], red[1], red[2], red[3], red[4]), LevelsControl(textureColor.g, green[0], green[1], green[2], green[3], green[4]), LevelsControl(textureColor.b, blue[0], blue[1], blue[2], blue[3], blue[4]), textureColor.a); + } + ); + +@implementation GPUImageLevelsFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageLevelsFragmentShaderString])) + { + return nil; + } + + redUniform = [filterProgram uniformIndex:@"red"]; + greenUniform = [filterProgram uniformIndex:@"green"]; + blueUniform = [filterProgram uniformIndex:@"blue"]; + + [self setRedMin:0.0 gamma:1.4 max:1.0 minOut:0.0 maxOut:1.0]; + [self setGreenMin:0.0 gamma:0.8 max:1.0 minOut:0.0 maxOut:1.0]; + [self setBlueMin:0.0 gamma:0.4 max:1.0 minOut:0.0 maxOut:1.0]; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut { + [self setFloat:min forUniform:redUniform program:filterProgram]; + [self setFloat:mid forUniform:redUniform + 1 program:filterProgram]; + [self setFloat:max forUniform:redUniform + 2 program:filterProgram]; + [self setFloat:minOut forUniform:redUniform + 3 program:filterProgram]; + [self setFloat:maxOut forUniform:redUniform + 4 program:filterProgram]; +} + +- (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { + [self setRedMin:min gamma:mid max:max minOut:0.0 maxOut:1.0]; +} + +- (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut { + [self setFloat:min forUniform:greenUniform program:filterProgram]; + [self setFloat:mid forUniform:greenUniform + 1 program:filterProgram]; + [self setFloat:max forUniform:greenUniform + 2 program:filterProgram]; + [self setFloat:minOut forUniform:greenUniform + 3 program:filterProgram]; + [self setFloat:maxOut forUniform:greenUniform + 4 program:filterProgram]; +} + +- (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { + [self setGreenMin:min gamma:mid max:max minOut:0.0 maxOut:1.0]; +} + +- (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut { + [self setFloat:min forUniform:blueUniform program:filterProgram]; + [self setFloat:mid forUniform:blueUniform + 1 program:filterProgram]; + [self setFloat:max forUniform:blueUniform + 2 program:filterProgram]; + [self setFloat:minOut forUniform:blueUniform + 3 program:filterProgram]; + [self setFloat:maxOut forUniform:blueUniform + 4 program:filterProgram]; +} + +- (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { + [self setBlueMin:min gamma:mid max:max minOut:0.0 maxOut:1.0]; +} + +@end + From 14843a8e05db6d57126e0f85115f49eea53543cc Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 18 Oct 2012 16:20:58 +1300 Subject: [PATCH 243/695] Levels: add convenience method for setting RGB levels together Signed-off-by: Karl von Randow --- framework/Source/GPUImageLevelsFilter.h | 3 +++ framework/Source/GPUImageLevelsFilter.m | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/framework/Source/GPUImageLevelsFilter.h b/framework/Source/GPUImageLevelsFilter.h index 0e7498bf8..71c84cf49 100644 --- a/framework/Source/GPUImageLevelsFilter.h +++ b/framework/Source/GPUImageLevelsFilter.h @@ -15,5 +15,8 @@ - (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; - (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; +- (void)setMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; +- (void)setMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; + @end diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m index 11e3b3bed..50170b4ce 100644 --- a/framework/Source/GPUImageLevelsFilter.m +++ b/framework/Source/GPUImageLevelsFilter.m @@ -60,6 +60,16 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)setMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut { + [self setRedMin:min gamma:mid max:max minOut:minOut maxOut:maxOut]; + [self setGreenMin:min gamma:mid max:max minOut:minOut maxOut:maxOut]; + [self setBlueMin:min gamma:mid max:max minOut:minOut maxOut:maxOut]; +} + +- (void)setMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { + [self setMin:min gamma:mid max:max minOut:0.0 maxOut:1.0]; +} + - (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut { [self setFloat:min forUniform:redUniform program:filterProgram]; [self setFloat:mid forUniform:redUniform + 1 program:filterProgram]; From cf25e1ee763e7df001f6a43877a630ec5185439f Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 18 Oct 2012 16:21:23 +1300 Subject: [PATCH 244/695] Levels: simplify showcase example Signed-off-by: Karl von Randow --- .../FilterShowcase/ShowcaseFilterViewController.m | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 5ef763b79..9c3d53c0d 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -226,7 +226,7 @@ - (void)setupFilter; self.title = @"Levels"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:-1.0]; + [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:1.0]; [self.filterSettingsSlider setValue:0.0]; @@ -1418,15 +1418,9 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; break; case GPUIMAGE_LEVELS: { float value = [(UISlider *)sender value]; - if (value < 0.0) { - [(GPUImageLevelsFilter *)filter setRedMin:-value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; - [(GPUImageLevelsFilter *)filter setGreenMin:-value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; - [(GPUImageLevelsFilter *)filter setBlueMin:-value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; - } else { - [(GPUImageLevelsFilter *)filter setRedMin:0.0 gamma:1.0 max:value minOut:0.0 maxOut:1.0]; - [(GPUImageLevelsFilter *)filter setGreenMin:0.0 gamma:1.0 max:value minOut:0.0 maxOut:1.0]; - [(GPUImageLevelsFilter *)filter setBlueMin:0.0 gamma:1.0 max:value minOut:0.0 maxOut:1.0]; - } + [(GPUImageLevelsFilter *)filter setRedMin:value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + [(GPUImageLevelsFilter *)filter setGreenMin:value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + [(GPUImageLevelsFilter *)filter setBlueMin:value gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; }; break; case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break; case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)filter setIntensity:[(UISlider *)sender value]]; break; From c0eeadc7a3eaca409af03acf49dce4bf674c4945 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 18 Oct 2012 16:21:58 +1300 Subject: [PATCH 245/695] Levels: change to vectorise the levels calculation Signed-off-by: Karl von Randow --- framework/Source/GPUImageLevelsFilter.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m index 50170b4ce..46cb78b0d 100644 --- a/framework/Source/GPUImageLevelsFilter.m +++ b/framework/Source/GPUImageLevelsFilter.m @@ -12,9 +12,9 @@ ** Details: http://blog.mouaif.org/2009/01/28/levels-control-shader/ */ -#define LevelsControlInputRange(color, minInput, maxInput) min(max(color - minInput, 0.0) / (maxInput - minInput), 1.0) +#define LevelsControlInputRange(color, minInput, maxInput) min(max(color - vec3(minInput), vec3(0.0)) / (vec3(maxInput) - vec3(minInput)), vec3(1.0)) #define LevelsControlInput(color, minInput, gamma, maxInput) GammaCorrection(LevelsControlInputRange(color, minInput, maxInput), gamma) -#define LevelsControlOutputRange(color, minOutput, maxOutput) mix(minOutput, maxOutput, color) +#define LevelsControlOutputRange(color, minOutput, maxOutput) mix(vec3(minOutput), vec3(maxOutput), color) #define LevelsControl(color, minInput, gamma, maxInput, minOutput, maxOutput) LevelsControlOutputRange(LevelsControlInput(color, minInput, gamma, maxInput), minOutput, maxOutput) NSString *const kGPUImageLevelsFragmentShaderString = SHADER_STRING @@ -30,7 +30,7 @@ void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(LevelsControl(textureColor.r, red[0], red[1], red[2], red[3], red[4]), LevelsControl(textureColor.g, green[0], green[1], green[2], green[3], green[4]), LevelsControl(textureColor.b, blue[0], blue[1], blue[2], blue[3], blue[4]), textureColor.a); + gl_FragColor = vec4(LevelsControl(textureColor.rgb, vec3(red[0], green[0], blue[0]), vec3(red[1], green[1], blue[1]), vec3(red[2], green[2], blue[2]), vec3(red[3], green[3], blue[3]), vec3(red[4], green[4], blue[4])), textureColor.a); } ); From fe2f55ad116c9663eefdd8cd246855dfe89b05ae Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 18 Oct 2012 16:39:11 +1300 Subject: [PATCH 246/695] Levels: put values into the shader as vectors Feels like that might be more performant. Signed-off-by: Karl von Randow --- framework/Source/GPUImageLevelsFilter.h | 10 ++-- framework/Source/GPUImageLevelsFilter.m | 69 ++++++++++++++++--------- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/framework/Source/GPUImageLevelsFilter.h b/framework/Source/GPUImageLevelsFilter.h index 71c84cf49..bb5ac7bb8 100644 --- a/framework/Source/GPUImageLevelsFilter.h +++ b/framework/Source/GPUImageLevelsFilter.h @@ -2,9 +2,13 @@ @interface GPUImageLevelsFilter : GPUImageFilter { - GLint redUniform; - GLint greenUniform; - GLint blueUniform; + GLint minUniform; + GLint midUniform; + GLint maxUniform; + GLint minOutputUniform; + GLint maxOutputUniform; + + GPUVector3 minVector, midVector, maxVector, minOutputVector, maxOutputVector; } - (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m index 46cb78b0d..26e4f8e90 100644 --- a/framework/Source/GPUImageLevelsFilter.m +++ b/framework/Source/GPUImageLevelsFilter.m @@ -12,9 +12,9 @@ ** Details: http://blog.mouaif.org/2009/01/28/levels-control-shader/ */ -#define LevelsControlInputRange(color, minInput, maxInput) min(max(color - vec3(minInput), vec3(0.0)) / (vec3(maxInput) - vec3(minInput)), vec3(1.0)) +#define LevelsControlInputRange(color, minInput, maxInput) min(max(color - minInput, vec3(0.0)) / (maxInput - minInput), vec3(1.0)) #define LevelsControlInput(color, minInput, gamma, maxInput) GammaCorrection(LevelsControlInputRange(color, minInput, maxInput), gamma) -#define LevelsControlOutputRange(color, minOutput, maxOutput) mix(vec3(minOutput), vec3(maxOutput), color) +#define LevelsControlOutputRange(color, minOutput, maxOutput) mix(minOutput, maxOutput, color) #define LevelsControl(color, minInput, gamma, maxInput, minOutput, maxOutput) LevelsControlOutputRange(LevelsControlInput(color, minInput, gamma, maxInput), minOutput, maxOutput) NSString *const kGPUImageLevelsFragmentShaderString = SHADER_STRING @@ -22,15 +22,17 @@ varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; - uniform lowp float red[5]; - uniform lowp float green[5]; - uniform lowp float blue[5]; + uniform lowp vec3 min; + uniform lowp vec3 mid; + uniform lowp vec3 max; + uniform lowp vec3 minOutput; + uniform lowp vec3 maxOutput; void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(LevelsControl(textureColor.rgb, vec3(red[0], green[0], blue[0]), vec3(red[1], green[1], blue[1]), vec3(red[2], green[2], blue[2]), vec3(red[3], green[3], blue[3]), vec3(red[4], green[4], blue[4])), textureColor.a); + gl_FragColor = vec4(LevelsControl(textureColor.rgb, min, mid, max, minOutput, maxOutput), textureColor.a); } ); @@ -46,9 +48,11 @@ - (id)init; return nil; } - redUniform = [filterProgram uniformIndex:@"red"]; - greenUniform = [filterProgram uniformIndex:@"green"]; - blueUniform = [filterProgram uniformIndex:@"blue"]; + minUniform = [filterProgram uniformIndex:@"min"]; + midUniform = [filterProgram uniformIndex:@"mid"]; + maxUniform = [filterProgram uniformIndex:@"max"]; + minOutputUniform = [filterProgram uniformIndex:@"minOutput"]; + maxOutputUniform = [filterProgram uniformIndex:@"maxOutput"]; [self setRedMin:0.0 gamma:1.4 max:1.0 minOut:0.0 maxOut:1.0]; [self setGreenMin:0.0 gamma:0.8 max:1.0 minOut:0.0 maxOut:1.0]; @@ -57,6 +61,17 @@ - (id)init; return self; } +#pragma mark - +#pragma mark Helpers + +- (void)updateUniforms { + [self setVec3:minVector forUniform:minUniform program:filterProgram]; + [self setVec3:midVector forUniform:midUniform program:filterProgram]; + [self setVec3:maxVector forUniform:maxUniform program:filterProgram]; + [self setVec3:minOutputVector forUniform:minOutputUniform program:filterProgram]; + [self setVec3:maxOutputVector forUniform:maxOutputUniform program:filterProgram]; +} + #pragma mark - #pragma mark Accessors @@ -71,11 +86,13 @@ - (void)setMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { } - (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut { - [self setFloat:min forUniform:redUniform program:filterProgram]; - [self setFloat:mid forUniform:redUniform + 1 program:filterProgram]; - [self setFloat:max forUniform:redUniform + 2 program:filterProgram]; - [self setFloat:minOut forUniform:redUniform + 3 program:filterProgram]; - [self setFloat:maxOut forUniform:redUniform + 4 program:filterProgram]; + minVector.one = min; + midVector.one = mid; + maxVector.one = max; + minOutputVector.one = minOut; + maxOutputVector.one = maxOut; + + [self updateUniforms]; } - (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { @@ -83,11 +100,13 @@ - (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { } - (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut { - [self setFloat:min forUniform:greenUniform program:filterProgram]; - [self setFloat:mid forUniform:greenUniform + 1 program:filterProgram]; - [self setFloat:max forUniform:greenUniform + 2 program:filterProgram]; - [self setFloat:minOut forUniform:greenUniform + 3 program:filterProgram]; - [self setFloat:maxOut forUniform:greenUniform + 4 program:filterProgram]; + minVector.two = min; + midVector.two = mid; + maxVector.two = max; + minOutputVector.two = minOut; + maxOutputVector.two = maxOut; + + [self updateUniforms]; } - (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { @@ -95,11 +114,13 @@ - (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { } - (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut { - [self setFloat:min forUniform:blueUniform program:filterProgram]; - [self setFloat:mid forUniform:blueUniform + 1 program:filterProgram]; - [self setFloat:max forUniform:blueUniform + 2 program:filterProgram]; - [self setFloat:minOut forUniform:blueUniform + 3 program:filterProgram]; - [self setFloat:maxOut forUniform:blueUniform + 4 program:filterProgram]; + minVector.three = min; + midVector.three = mid; + maxVector.three = max; + minOutputVector.three = minOut; + maxOutputVector.three = maxOut; + + [self updateUniforms]; } - (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max { From 3dcd34eb9193238a19b291293bcab18efbe301bd Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 18 Oct 2012 16:39:47 +1300 Subject: [PATCH 247/695] Levels: fix defaults Signed-off-by: Karl von Randow --- framework/Source/GPUImageLevelsFilter.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m index 26e4f8e90..ff98dbd72 100644 --- a/framework/Source/GPUImageLevelsFilter.m +++ b/framework/Source/GPUImageLevelsFilter.m @@ -54,9 +54,9 @@ - (id)init; minOutputUniform = [filterProgram uniformIndex:@"minOutput"]; maxOutputUniform = [filterProgram uniformIndex:@"maxOutput"]; - [self setRedMin:0.0 gamma:1.4 max:1.0 minOut:0.0 maxOut:1.0]; - [self setGreenMin:0.0 gamma:0.8 max:1.0 minOut:0.0 maxOut:1.0]; - [self setBlueMin:0.0 gamma:0.4 max:1.0 minOut:0.0 maxOut:1.0]; + [self setRedMin:0.0 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + [self setGreenMin:0.0 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + [self setBlueMin:0.0 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; return self; } From d05b56b6c391e662599780998720ce9d3a0b899b Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Fri, 19 Oct 2012 02:03:28 +1300 Subject: [PATCH 248/695] Levels: documentation Signed-off-by: Karl von Randow --- framework/Source/GPUImageLevelsFilter.h | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageLevelsFilter.h b/framework/Source/GPUImageLevelsFilter.h index bb5ac7bb8..d0948fbff 100644 --- a/framework/Source/GPUImageLevelsFilter.h +++ b/framework/Source/GPUImageLevelsFilter.h @@ -1,5 +1,16 @@ #import "GPUImageFilter.h" +/** + * Levels like Photoshop. + * + * The min, max, minOut and maxOut parameters are floats in the range [0, 1]. + * If you have parameters from Photoshop in the range [0, 255] you must first + * convert them to be [0, 1]. + * The gamma/mid parameter is a float >= 0. This matches the value from Photoshop. + * + * If you want to apply levels to RGB as well as individual channels you need to use + * this filter twice - first for the individual channels and then for all channels. + */ @interface GPUImageLevelsFilter : GPUImageFilter { GLint minUniform; @@ -11,14 +22,22 @@ GPUVector3 minVector, midVector, maxVector, minOutputVector, maxOutputVector; } +/** Set levels for the red channel */ - (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; -- (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; -- (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; - (void)setRedMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; + +/** Set levels for the green channel */ +- (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; + - (void)setGreenMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; + +/** Set levels for the blue channel */ +- (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; + - (void)setBlueMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; +/** Set levels for all channels at once */ - (void)setMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max minOut:(CGFloat)minOut maxOut:(CGFloat)maxOut; - (void)setMin:(CGFloat)min gamma:(CGFloat)mid max:(CGFloat)max; From 307c8ff843353ae4db646b4e2293ab01ba53a073 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Fri, 19 Oct 2012 07:57:54 +1300 Subject: [PATCH 249/695] Curves: correctly enforce bounds to prevent the calculated spines from overflowing the [0,255] range Signed-off-by: Karl von Randow --- framework/Source/GPUImageToneCurveFilter.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 0245913d7..f7261636d 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -436,9 +436,9 @@ - (void)updateToneCurveTexture; for (unsigned int currentCurveIndex = 0; currentCurveIndex < 256; currentCurveIndex++) { // BGRA for upload to texture - toneCurveByteArray[currentCurveIndex * 4] = fmax(currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0); - toneCurveByteArray[currentCurveIndex * 4 + 1] = fmax(currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0); - toneCurveByteArray[currentCurveIndex * 4 + 2] = fmax(currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0); + toneCurveByteArray[currentCurveIndex * 4] = fmin(fmax(currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + toneCurveByteArray[currentCurveIndex * 4 + 1] = fmin(fmax(currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + toneCurveByteArray[currentCurveIndex * 4 + 2] = fmin(fmax(currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); toneCurveByteArray[currentCurveIndex * 4 + 3] = 255; } From 118d7b77bf175e0a74485967c1af7d0a03423ab2 Mon Sep 17 00:00:00 2001 From: Christopher Luu Date: Fri, 19 Oct 2012 09:54:21 -0400 Subject: [PATCH 250/695] -GPUImageOutput: Fix removing of target not resetting the input rotation (issue #564) -GPUImageOutput: Removed redundant call to determine textureIndexOfTarget for removeAllTargets function --- framework/Source/GPUImageOutput.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 0e4118822..42f953e33 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -174,6 +174,7 @@ - (void)removeTarget:(id)targetToRemove; runSynchronouslyOnVideoProcessingQueue(^{ [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; + [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; [targetTextureIndices removeObjectAtIndex:indexOfObject]; [targets removeObject:targetToRemove]; @@ -191,7 +192,7 @@ - (void)removeAllTargets; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; - [targetToRemove setInputTexture:0 atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; } [targets removeAllObjects]; From e125152d807d0434c994c975ce37ad04e048a835 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 30 Oct 2012 22:08:18 -0500 Subject: [PATCH 251/695] For large images, now conserves memory by deallocating framebuffers the instant they are no longer needed. Somewhat experimental, so things might break. --- .../ShowcaseFilterViewController.m | 4 + .../SimplePhotoFilter/PhotoViewController.h | 2 +- .../SimplePhotoFilter/PhotoViewController.m | 14 +- framework/Source/GPUImageAverageColor.m | 4 +- framework/Source/GPUImageBuffer.m | 3 + framework/Source/GPUImageCropFilter.m | 2 + framework/Source/GPUImageFilter.h | 1 + framework/Source/GPUImageFilter.m | 69 ++++++- framework/Source/GPUImageFilterGroup.h | 2 +- framework/Source/GPUImageFilterGroup.m | 18 +- framework/Source/GPUImageHistogramFilter.m | 2 + framework/Source/GPUImageJFAVoroniFilter.m | 4 +- framework/Source/GPUImageMovie.m | 1 + framework/Source/GPUImageMovieWriter.h | 2 + framework/Source/GPUImageMovieWriter.m | 10 + framework/Source/GPUImageOpenGLESContext.h | 9 + framework/Source/GPUImageOutput.h | 14 +- framework/Source/GPUImageOutput.m | 76 ++++--- ...ageParallelCoordinateLineTransformFilter.m | 2 + framework/Source/GPUImagePicture.m | 8 + framework/Source/GPUImageRawDataOutput.h | 2 + framework/Source/GPUImageRawDataOutput.m | 10 + framework/Source/GPUImageStillCamera.m | 6 + framework/Source/GPUImageTextureOutput.h | 3 + framework/Source/GPUImageTextureOutput.m | 10 + framework/Source/GPUImageToneCurveFilter.m | 2 +- framework/Source/GPUImageTransformFilter.m | 2 + framework/Source/GPUImageTwoInputFilter.h | 2 + framework/Source/GPUImageTwoInputFilter.m | 23 +++ framework/Source/GPUImageTwoPassFilter.h | 1 + framework/Source/GPUImageTwoPassFilter.m | 189 ++++++++++++++---- framework/Source/GPUImageUIElement.m | 1 + framework/Source/GPUImageView.h | 1 + framework/Source/GPUImageView.m | 10 + 34 files changed, 427 insertions(+), 82 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 9c3d53c0d..dd12c260f 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -21,6 +21,10 @@ - (void)didReceiveMemoryWarning [super didReceiveMemoryWarning]; } +- (void)dealloc; +{ +} + #pragma mark - View lifecycle - (void)viewDidLoad diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h index 91e05da10..126f248e1 100755 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h @@ -4,7 +4,7 @@ @interface PhotoViewController : UIViewController { GPUImageStillCamera *stillCamera; - GPUImageOutput *filter; + GPUImageOutput *filter, *secondFilter, *terminalFilter; UISlider *filterSettingsSlider; UIButton *photoCaptureButton; } diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 7c4b5ba0b..07019656d 100755 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -53,17 +53,24 @@ - (void)viewDidLoad // stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; // filter = [[GPUImageGammaFilter alloc] init]; - filter = [[GPUImageSketchFilter alloc] init]; +// filter = [[GPUImageSketchFilter alloc] init]; +// filter = [[GPUImageUnsharpMaskFilter alloc] init]; // [(GPUImageSketchFilter *)filter setTexelHeight:(1.0 / 1024.0)]; // [(GPUImageSketchFilter *)filter setTexelWidth:(1.0 / 768.0)]; // filter = [[GPUImageSmoothToonFilter alloc] init]; -// filter = [[GPUImageSepiaFilter alloc] init]; - + filter = [[GPUImageSepiaFilter alloc] init]; +// secondFilter = [[GPUImageSepiaFilter alloc] init]; +// terminalFilter = [[GPUImageSepiaFilter alloc] init]; +// [filter addTarget:secondFilter]; +// [secondFilter addTarget:terminalFilter]; + [filter prepareForImageCapture]; +// [terminalFilter prepareForImageCapture]; [stillCamera addTarget:filter]; GPUImageView *filterView = (GPUImageView *)self.view; [filter addTarget:filterView]; +// [terminalFilter addTarget:filterView]; // [stillCamera.inputCamera lockForConfiguration:nil]; // [stillCamera.inputCamera setFlashMode:AVCaptureFlashModeOn]; @@ -93,6 +100,7 @@ - (IBAction)takePhoto:(id)sender; { [photoCaptureButton setEnabled:NO]; +// [stillCamera capturePhotoAsJPEGProcessedUpToFilter:terminalFilter withCompletionHandler:^(NSData *processedJPEG, NSError *error){ [stillCamera capturePhotoAsJPEGProcessedUpToFilter:filter withCompletionHandler:^(NSData *processedJPEG, NSError *error){ // Save to assets library diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index d7d04aaf6..4ae448350 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -81,7 +81,7 @@ - (id)init; #pragma mark - #pragma mark Manage the output texture -- (void)initializeOutputTexture; +- (void)initializeOutputTextureIfNeeded; { if (inputTextureSize.width < 1.0) { @@ -155,7 +155,7 @@ - (void)recreateFilterFBO cachedMaximumOutputSize = CGSizeZero; [self destroyFilterFBO]; [self deleteOutputTexture]; - [self initializeOutputTexture]; + [self initializeOutputTextureIfNeeded]; [self setFilterFBO]; } diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index 634968129..c3b4d92ae 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -23,6 +23,7 @@ - (id)init; } bufferedTextures = [[NSMutableArray alloc] init]; + [self initializeOutputTextureIfNeeded]; [bufferedTextures addObject:[NSNumber numberWithInt:outputTexture]]; _bufferSize = 1; @@ -42,6 +43,8 @@ - (void)dealloc - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [targets count]; + static const GLfloat imageVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 6b32aeae2..58f3daf8b 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -212,6 +212,8 @@ - (void)calculateCropTextureCoordinates; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [targets count]; + static const GLfloat cropSquareVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 88768cfd8..02b72c234 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -106,6 +106,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)destroyFilterFBO; - (void)setFilterFBO; - (void)setOutputFBO; +- (void)releaseInputTexturesIfNeeded; /// @name Rendering + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index dc8fa8830..946afd39f 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -156,6 +156,8 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) CVPixelBufferUnlockBaseAddress([filter renderTarget], 0); CFRelease([filter renderTarget]); + [filter destroyFilterFBO]; + filter.preventRendering = NO; } @@ -276,12 +278,12 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; glActiveTexture(GL_TEXTURE1); + glGenFramebuffers(1, &filterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { - #if defined(__IPHONE_6_0) CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); #else @@ -326,6 +328,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; CFRelease(attrs); CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); outputTexture = CVOpenGLESTextureGetName(renderTexture); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -337,6 +340,8 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; } else { + [self initializeOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, outputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); @@ -403,6 +408,15 @@ - (void)setOutputFBO; [self setFilterFBO]; } +- (void)releaseInputTexturesIfNeeded; +{ + if (shouldConserveMemoryForNextFrame) + { + [firstTextureDelegate textureNoLongerNeededForTarget:self]; + shouldConserveMemoryForNextFrame = NO; + } +} + #pragma mark - #pragma mark Rendering @@ -506,6 +520,8 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; self.frameProcessingCompletionBlock(self, frameTime); } + [self releaseInputTexturesIfNeeded]; + for (id currentTarget in targets) { if (currentTarget != self.targetToIgnoreForUpdates) @@ -531,6 +547,11 @@ - (CGSize)outputFrameSize; - (void)prepareForImageCapture; { + if (preparedToCaptureImage) + { + return; + } + preparedToCaptureImage = YES; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) @@ -691,6 +712,8 @@ - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [targets count]; + static const GLfloat imageVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, @@ -722,12 +745,7 @@ - (void)recreateFilterFBO } [self destroyFilterFBO]; - - if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) - { - [self deleteOutputTexture]; - [self initializeOutputTexture]; - } + [self deleteOutputTexture]; [self setFilterFBO]; } @@ -872,6 +890,25 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; } } +- (void)cleanupOutputImage; +{ +// NSLog(@"Cleaning up output filter image: %@", self); + [self destroyFilterFBO]; + [self deleteOutputTexture]; +} + +- (void)deleteOutputTexture; +{ + if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) + { + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } + } +} + - (CGSize)maximumOutputSize; { // I'm temporarily disabling adjustments for smaller output sizes until I figure out how to make this work better @@ -901,6 +938,24 @@ - (void)endProcessing } } +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + firstTextureDelegate = newTextureDelegate; +} + +- (void)conserveMemoryForNextFrame; +{ + shouldConserveMemoryForNextFrame = YES; + + for (id currentTarget in targets) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget conserveMemoryForNextFrame]; + } + } +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageFilterGroup.h b/framework/Source/GPUImageFilterGroup.h index efd104f22..16c1c3dd1 100755 --- a/framework/Source/GPUImageFilterGroup.h +++ b/framework/Source/GPUImageFilterGroup.h @@ -1,7 +1,7 @@ #import "GPUImageOutput.h" #import "GPUImageFilter.h" -@interface GPUImageFilterGroup : GPUImageOutput +@interface GPUImageFilterGroup : GPUImageOutput { NSMutableArray *filters; } diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 706554e02..e36ca9a1c 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -16,8 +16,6 @@ - (id)init; filters = [[NSMutableArray alloc] init]; - [self deleteOutputTexture]; - return self; } @@ -99,6 +97,14 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } } +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + for (GPUImageOutput *currentFilter in _initialFilters) + { + [currentFilter setTextureDelegate:newTextureDelegate atIndex:textureIndex]; + } +} + - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; { for (GPUImageOutput *currentFilter in _initialFilters) @@ -171,4 +177,12 @@ - (void)endProcessing; } } +- (void)conserveMemoryForNextFrame; +{ + for (GPUImageOutput *currentFilter in _initialFilters) + { + [currentFilter conserveMemoryForNextFrame]; + } +} + @end diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 0a7779992..bc2c9e211 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -215,6 +215,8 @@ - (CGSize)sizeOfFBO; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [targets count]; + if (vertexSamplingCoordinates == NULL) { [self generatePointCoordinates]; diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m index fdebb73d0..9ad471559 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.m +++ b/framework/Source/GPUImageJFAVoroniFilter.m @@ -224,7 +224,7 @@ -(void)setSizeInPixels:(CGSize)sizeInPixels { #pragma mark Managing the display FBOs -- (void)initializeOutputTexture; +- (void)initializeOutputTextureIfNeeded; { [GPUImageOpenGLESContext useImageProcessingContext]; @@ -343,6 +343,8 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize } else { + [self initializeOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 40d7e04e7..09257ec71 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -299,6 +299,7 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; + [currentTarget setTextureDelegate:self atIndex:targetTextureIndex]; [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; } diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 2e88921c6..50cacc09e 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -31,6 +31,8 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; CGSize videoSize; GPUImageRotationMode inputRotation; + + __unsafe_unretained id textureDelegate; } @property(readwrite, nonatomic) BOOL hasAudioTrack; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 5d38efea2..03f1fa433 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -573,6 +573,16 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + textureDelegate = newTextureDelegate; +} + +- (void)conserveMemoryForNextFrame; +{ + +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 955b28e81..9d0cf8107 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -32,9 +32,12 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k @end +@protocol GPUImageTextureDelegate; + @protocol GPUImageInput - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -42,4 +45,10 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (void)endProcessing; - (BOOL)shouldIgnoreUpdatesToThisTarget; - (BOOL)enabled; +- (void)conserveMemoryForNextFrame; +@end + +@protocol GPUImageTextureDelegate +- (void)textureNoLongerNeededForTarget:(id)textureTarget; @end + diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 2b57581c5..afef5447f 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -20,7 +20,7 @@ void reportAvailableMemoryForGPUImage(NSString *tag); Source objects upload still image frames to OpenGL ES as textures, then hand those textures off to the next objects in the processing chain. */ -@interface GPUImageOutput : NSObject +@interface GPUImageOutput : NSObject { NSMutableArray *targets, *targetTextureIndices; @@ -28,6 +28,12 @@ void reportAvailableMemoryForGPUImage(NSString *tag); CGSize inputTextureSize, cachedMaximumOutputSize, forcedMaximumSize; BOOL overrideInputSize; + + BOOL processingLargeImage; + NSUInteger outputTextureRetainCount; + + __unsafe_unretained id firstTextureDelegate; + BOOL shouldConserveMemoryForNextFrame; } @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; @@ -76,10 +82,11 @@ void reportAvailableMemoryForGPUImage(NSString *tag); /// @name Manage the output texture -- (void)initializeOutputTexture; +- (void)initializeOutputTextureIfNeeded; - (void)deleteOutputTexture; - (void)forceProcessingAtSize:(CGSize)frameSize; - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; +- (void)cleanupOutputImage; /// @name Still image processing @@ -106,5 +113,6 @@ void reportAvailableMemoryForGPUImage(NSString *tag); - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; - (void)prepareForImageCapture; +- (void)conserveMemoryForNextFrame; -@end +@end \ No newline at end of file diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 42f953e33..dc3ca2236 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -89,8 +89,6 @@ - (id)init; targetTextureIndices = [[NSMutableArray alloc] init]; _enabled = YES; - [self initializeOutputTexture]; - return self; } @@ -149,6 +147,7 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text cachedMaximumOutputSize = CGSizeZero; runSynchronouslyOnVideoProcessingQueue(^{ [self setInputTextureForTarget:newTarget atIndex:textureLocation]; + [newTarget setTextureDelegate:self atIndex:textureLocation]; [targets addObject:newTarget]; [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; }); @@ -174,6 +173,7 @@ - (void)removeTarget:(id)targetToRemove; runSynchronouslyOnVideoProcessingQueue(^{ [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; + [targetToRemove setTextureDelegate:nil atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; [targetTextureIndices removeObjectAtIndex:indexOfObject]; @@ -193,6 +193,7 @@ - (void)removeAllTargets; [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; + [targetToRemove setTextureDelegate:nil atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; } [targets removeAllObjects]; @@ -203,34 +204,33 @@ - (void)removeAllTargets; #pragma mark - #pragma mark Manage the output texture -- (void)initializeOutputTexture; +- (void)initializeOutputTextureIfNeeded; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); + if (!outputTexture) + { + [GPUImageOpenGLESContext useImageProcessingContext]; + + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + } }); } - (void)deleteOutputTexture; { -// runSynchronouslyOnVideoProcessingQueue(^{ -// [GPUImageOpenGLESContext useImageProcessingContext]; - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } -// }); + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } } - (void)forceProcessingAtSize:(CGSize)frameSize; @@ -242,6 +242,11 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; { } +- (void)cleanupOutputImage; +{ + NSLog(@"WARNING: Undefined image cleanup"); +} + #pragma mark - #pragma mark Still image processing @@ -355,6 +360,31 @@ - (void)prepareForImageCapture; } +- (void)conserveMemoryForNextFrame; +{ + shouldConserveMemoryForNextFrame = YES; + + for (id currentTarget in targets) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget conserveMemoryForNextFrame]; + } + } +} + +#pragma mark - +#pragma mark GPUImageTextureDelegate methods + +- (void)textureNoLongerNeededForTarget:(id)textureTarget; +{ + outputTextureRetainCount--; + if (outputTextureRetainCount < 1) + { + [self cleanupOutputImage]; + } +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index b131aa50f..872d37ef7 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -70,6 +70,8 @@ - (void)generateLineCoordinates; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [targets count]; + if (lineCoordinates == NULL) { [self generateLineCoordinates]; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 9a568644f..9fd72b42b 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -110,6 +110,8 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; + [self initializeOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, outputTexture); if (self.shouldSmoothlyScaleOutput) { @@ -149,6 +151,12 @@ - (void)processImage; hasProcessedImage = YES; dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + + if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) + { + [self conserveMemoryForNextFrame]; + } + for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index 8a89d819e..cf8fa5382 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -18,6 +18,8 @@ typedef struct GPUByteColorVector GPUByteColorVector; GPUImageRotationMode inputRotation; BOOL outputBGRA; CVOpenGLESTextureRef renderTexture; + + __unsafe_unretained id textureDelegate; } @property(readonly) GLubyte *rawBytesForImage; diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index dff94c547..d9c0d6ecc 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -339,6 +339,16 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + textureDelegate = newTextureDelegate; +} + +- (void)conserveMemoryForNextFrame; +{ + +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index a459bff53..1cb78296c 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -117,6 +117,8 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) return; } + [self conserveMemoryForNextFrame]; + // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); @@ -167,6 +169,8 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f return; } + [self conserveMemoryForNextFrame]; + // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); @@ -228,6 +232,8 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi return; } + [self conserveMemoryForNextFrame]; + // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); diff --git a/framework/Source/GPUImageTextureOutput.h b/framework/Source/GPUImageTextureOutput.h index d9307b9c0..445270ac6 100755 --- a/framework/Source/GPUImageTextureOutput.h +++ b/framework/Source/GPUImageTextureOutput.h @@ -4,6 +4,9 @@ @protocol GPUImageTextureOutputDelegate; @interface GPUImageTextureOutput : NSObject +{ + __unsafe_unretained id textureDelegate; +} @property(readwrite, unsafe_unretained, nonatomic) id delegate; @property(readonly) GLint texture; diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index 3067c95d4..562643c08 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -61,4 +61,14 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + textureDelegate = newTextureDelegate; +} + +- (void)conserveMemoryForNextFrame; +{ + +} + @end diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index f7261636d..a59ec0e13 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -40,7 +40,7 @@ - (id) initWithCurveFilePathURL:(NSURL*)curveFilePathURL NSError* error = nil; NSFileHandle* file = [NSFileHandle fileHandleForReadingFromURL:curveFilePathURL error:&error]; - + if ((file == nil) || (error != nil)) { NSLog(@"Failed to open file: %@", error); diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index 148239414..85c1cc292 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -137,6 +137,8 @@ - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GPUMatrix4x4 * - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [targets count]; + CGSize currentFBOSize = [self sizeOfFBO]; CGFloat normalizedHeight = currentFBOSize.height / currentFBOSize.width; diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h index 2995415f9..c6bb82e2c 100644 --- a/framework/Source/GPUImageTwoInputFilter.h +++ b/framework/Source/GPUImageTwoInputFilter.h @@ -12,6 +12,8 @@ extern NSString *const kGPUImageTwoInputTextureVertexShaderString; BOOL hasSetFirstTexture, hasReceivedFirstFrame, hasReceivedSecondFrame, firstFrameWasVideo, secondFrameWasVideo; BOOL firstFrameCheckDisabled, secondFrameCheckDisabled; + + __unsafe_unretained id secondTextureDelegate; } - (void)disableFirstFrameCheck; diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 635a6d4b0..e24dae357 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -114,6 +114,16 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } +- (void)releaseInputTexturesIfNeeded; +{ + if (shouldConserveMemoryForNextFrame) + { + [firstTextureDelegate textureNoLongerNeededForTarget:self]; + [secondTextureDelegate textureNoLongerNeededForTarget:self]; + shouldConserveMemoryForNextFrame = NO; + } +} + #pragma mark - #pragma mark GPUImageInput @@ -192,6 +202,8 @@ - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [targets count]; + // You can set up infinite update loops, so this helps to short circuit them if (hasReceivedFirstFrame && hasReceivedSecondFrame) { @@ -244,5 +256,16 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } } +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + if (textureIndex == 0) + { + firstTextureDelegate = newTextureDelegate; + } + else + { + secondTextureDelegate = newTextureDelegate; + } +} @end diff --git a/framework/Source/GPUImageTwoPassFilter.h b/framework/Source/GPUImageTwoPassFilter.h index 722bbc8c7..efb51fa68 100755 --- a/framework/Source/GPUImageTwoPassFilter.h +++ b/framework/Source/GPUImageTwoPassFilter.h @@ -15,5 +15,6 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString; - (id)initWithFirstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString; - (void)initializeSecondaryAttributes; +- (void)initializeSecondOutputTextureIfNeeded; @end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index a4f0425b5..fff159bd7 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -75,31 +75,44 @@ - (GLuint)textureForOutput; #pragma mark - #pragma mark Manage the output texture -- (void)initializeOutputTexture; +- (void)initializeSecondOutputTextureIfNeeded; { - [super initializeOutputTexture]; - + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + return; + } + runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; - - glGenTextures(1, &secondFilterOutputTexture); - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); + + if (!secondFilterOutputTexture) + { + glGenTextures(1, &secondFilterOutputTexture); + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + } }); } - (void)deleteOutputTexture; { - [super deleteOutputTexture]; - - if (secondFilterOutputTexture) + if (outputTexture) { - glDeleteTextures(1, &secondFilterOutputTexture); - secondFilterOutputTexture = 0; + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } + + if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) + { + if (secondFilterOutputTexture) + { + glDeleteTextures(1, &secondFilterOutputTexture); + secondFilterOutputTexture = 0; + } } } @@ -111,15 +124,18 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if (!filterFramebuffer) { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } } glGenFramebuffers(1, &secondFilterFramebuffer); @@ -182,6 +198,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; } else { + [self initializeSecondOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); @@ -197,20 +214,88 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; }); } +- (void)recreateFilterFBO +{ + cachedMaximumOutputSize = CGSizeZero; + + [self destroyFilterFBO]; + [self deleteOutputTexture]; +// +// [self setFilterFBO]; +// [self setSecondFilterFBO]; +} + - (void)destroyFilterFBO; { - [super destroyFilterFBO]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + if (filterFramebuffer) + { + glDeleteFramebuffers(1, &filterFramebuffer); + filterFramebuffer = 0; + } + + if (secondFilterFramebuffer) + { + glDeleteFramebuffers(1, &secondFilterFramebuffer); + secondFilterFramebuffer = 0; + } + + if (filterTextureCache != NULL) + { + CFRelease(renderTarget); + renderTarget = NULL; + + if (renderTexture) + { + CFRelease(renderTexture); + renderTexture = NULL; + } + + CVOpenGLESTextureCacheFlush(filterTextureCache, 0); + CFRelease(filterTextureCache); + filterTextureCache = NULL; + } + }); +} + +- (void)setFilterFBO; +{ + if (!filterFramebuffer) + { + CGSize currentFBOSize = [self sizeOfFBO]; + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } + [super setupFilterForSize:currentFBOSize]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - if (secondFilterFramebuffer) - { - glDeleteFramebuffers(1, &secondFilterFramebuffer); - secondFilterFramebuffer = 0; - } + CGSize currentFBOSize = [self sizeOfFBO]; + glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } - (void)setSecondFilterFBO; { + if (!secondFilterFramebuffer) + { + CGSize currentFBOSize = [self sizeOfFBO]; + [self createFilterFBOofSize:currentFBOSize]; + [self setupFilterForSize:currentFBOSize]; + } + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + CGSize currentFBOSize = [self sizeOfFBO]; + glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); // CGSize currentFBOSize = [self sizeOfFBO]; // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); @@ -250,26 +335,54 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); - + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + // Release the first FBO early + if (shouldConserveMemoryForNextFrame) + { + [firstTextureDelegate textureNoLongerNeededForTarget:self]; + + glDeleteFramebuffers(1, &filterFramebuffer); + filterFramebuffer = 0; + + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } + + shouldConserveMemoryForNextFrame = NO; + } +} + +// Clear this out because I want to release the input texture as soon as the first pass is finished, not just after the whole rendering has completed +- (void)releaseInputTexturesIfNeeded; +{ } + - (void)prepareForImageCapture; { - preparedToCaptureImage = YES; - - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if (preparedToCaptureImage) { - if (secondFilterOutputTexture) + return; + } + + runSynchronouslyOnVideoProcessingQueue(^{ + preparedToCaptureImage = YES; + + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { - runSynchronouslyOnVideoProcessingQueue(^{ + if (secondFilterOutputTexture) + { [GPUImageOpenGLESContext useImageProcessingContext]; glDeleteTextures(1, &secondFilterOutputTexture); secondFilterOutputTexture = 0; - }); + } } - } + }); } diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m index 02d60ea3b..2036a63ff 100644 --- a/framework/Source/GPUImageUIElement.m +++ b/framework/Source/GPUImageUIElement.m @@ -61,6 +61,7 @@ - (CGSize)layerSizeInPixels; - (void)update; { [GPUImageOpenGLESContext useImageProcessingContext]; + [self initializeOutputTextureIfNeeded]; if(CMTIME_IS_INVALID(time)) { time = CMTimeMakeWithSeconds(0, 600); diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index 73097034a..31673d393 100755 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -13,6 +13,7 @@ typedef enum { @interface GPUImageView : UIView { GPUImageRotationMode inputRotation; + __unsafe_unretained id textureDelegate; } /** The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 7c57d7c23..8125acbd4 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -431,6 +431,16 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + textureDelegate = newTextureDelegate; +} + +- (void)conserveMemoryForNextFrame; +{ + +} + #pragma mark - #pragma mark Accessors From 56cec4d61714549220c627da67c19a6a4e2a1d45 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 1 Nov 2012 15:01:49 -0500 Subject: [PATCH 252/695] Fixed a crashing bug with still images. --- framework/Source/GPUImageOpenGLESContext.m | 10 ++++++++-- framework/Source/GPUImagePicture.m | 5 +++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 66e01db3a..55fe12929 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -72,8 +72,14 @@ + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; { - GLint maxTextureSize; - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); + static dispatch_once_t pred; + static GLint maxTextureSize = 0; + + dispatch_once(&pred, ^{ + [self useImageProcessingContext]; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); + }); + return maxTextureSize; } diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 9fd72b42b..bc4375f9f 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -77,8 +77,9 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot // For resized image, redraw imageData = (GLubyte *) calloc(1, (int)pixelSizeToUseForTexture.width * (int)pixelSizeToUseForTexture.height * 4); - CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); - CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 8, (int)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); + + CGContextRef imageContext = CGBitmapContextCreate(imageData, (size_t)pixelSizeToUseForTexture.width, (size_t)pixelSizeToUseForTexture.height, 8, (size_t)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), newImageSource); CGContextRelease(imageContext); From cb992e1d46f7d18022f2ad2cec22aee1f6dae5c9 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 4 Nov 2012 12:42:39 +1300 Subject: [PATCH 253/695] GPUImageTextureOutput had the wrong type for the texture property. Was GLint should be GLuint. Signed-off-by: Karl von Randow --- framework/Source/GPUImageTextureOutput.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageTextureOutput.h b/framework/Source/GPUImageTextureOutput.h index 445270ac6..91bdaca70 100755 --- a/framework/Source/GPUImageTextureOutput.h +++ b/framework/Source/GPUImageTextureOutput.h @@ -9,7 +9,7 @@ } @property(readwrite, unsafe_unretained, nonatomic) id delegate; -@property(readonly) GLint texture; +@property(readonly) GLuint texture; @property(nonatomic) BOOL enabled; @end From 6e875a635f055b6dff84e1ce6da0c57a5af7843e Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 4 Nov 2012 13:09:27 +1300 Subject: [PATCH 254/695] GPUImageOpenGLESContext: change singleton construction so you can subclass Signed-off-by: Karl von Randow --- framework/Source/GPUImageOpenGLESContext.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 55fe12929..41eab43e2 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -35,7 +35,7 @@ + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; static GPUImageOpenGLESContext *sharedImageProcessingOpenGLESContext = nil; dispatch_once(&pred, ^{ - sharedImageProcessingOpenGLESContext = [[GPUImageOpenGLESContext alloc] init]; + sharedImageProcessingOpenGLESContext = [[[self class] alloc] init]; }); return sharedImageProcessingOpenGLESContext; } From 2b4dd13196315b74ae0fc9474e9b1aae5cc691fd Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 4 Nov 2012 13:10:37 +1300 Subject: [PATCH 255/695] GPUImageOpenGLESContext: enable subclasses to override the context Signed-off-by: Karl von Randow --- framework/Source/GPUImageOpenGLESContext.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 41eab43e2..a4e5021ab 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -115,7 +115,7 @@ + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - (void)presentBufferForDisplay; { - [_context presentRenderbuffer:GL_RENDERBUFFER]; + [self.context presentRenderbuffer:GL_RENDERBUFFER]; } - (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString; From 5e9090d4f00599ae6a327e559cf457357e36f88a Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 4 Nov 2012 13:12:56 +1300 Subject: [PATCH 256/695] GPUImageOpenGLESContext: add EAGLSharegroup capability Call [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] useSharegroup:[existingEAGLContext sharegroup] before you use GPUImage (ie. before the GPUImageOpenGLESContext's own context is created) Signed-off-by: Karl von Randow --- framework/Source/GPUImageOpenGLESContext.h | 2 ++ framework/Source/GPUImageOpenGLESContext.m | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 9d0cf8107..de552e12b 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -27,6 +27,8 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (void)presentBufferForDisplay; - (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString; +- (void)useSharegroup:(EAGLSharegroup *)sharegroup; + // Manage fast texture upload + (BOOL)supportsFastTextureUpload; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index a4e5021ab..3aa77a1aa 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -5,6 +5,7 @@ @interface GPUImageOpenGLESContext() { NSMutableDictionary *shaderProgramCache; + EAGLSharegroup *_sharegroup; } @end @@ -132,6 +133,20 @@ - (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragm return programFromCache; } +- (void)useSharegroup:(EAGLSharegroup *)sharegroup +{ + NSAssert(_context == nil, @"Unable to use a share group when the context has already been created. Call this method before you use the context for the first time."); + + _sharegroup = sharegroup; +} + +- (EAGLContext *)createContext +{ + EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:_sharegroup]; + NSAssert(context != nil, @"Unable to create an OpenGL ES 2.0 context. The GPUImage framework requires OpenGL ES 2.0 support to work."); + return context; +} + #pragma mark - #pragma mark Manage fast texture upload @@ -152,8 +167,7 @@ - (EAGLContext *)context; { if (_context == nil) { - _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; - NSAssert(_context != nil, @"Unable to create an OpenGL ES 2.0 context. The GPUImage framework requires OpenGL ES 2.0 support to work."); + _context = [self createContext]; [EAGLContext setCurrentContext:_context]; // Set up a few global settings for the image processing pipeline From 8cfbd6b46e8b2c720c204b7f24aff0cd72bbac71 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 4 Nov 2012 13:21:44 +1300 Subject: [PATCH 257/695] GPUImageOpenGLESContext: tidy added methods Signed-off-by: Karl von Randow --- framework/Source/GPUImageOpenGLESContext.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 3aa77a1aa..a90366f8a 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -133,14 +133,14 @@ - (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragm return programFromCache; } -- (void)useSharegroup:(EAGLSharegroup *)sharegroup +- (void)useSharegroup:(EAGLSharegroup *)sharegroup; { NSAssert(_context == nil, @"Unable to use a share group when the context has already been created. Call this method before you use the context for the first time."); _sharegroup = sharegroup; } -- (EAGLContext *)createContext +- (EAGLContext *)createContext; { EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:_sharegroup]; NSAssert(context != nil, @"Unable to create an OpenGL ES 2.0 context. The GPUImage framework requires OpenGL ES 2.0 support to work."); From d921ec2b0c853b7e8c8bcc2828ef07cc1d8acc9b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 4 Nov 2012 15:46:27 -0600 Subject: [PATCH 258/695] Fixed a lagging issue with live updates of filtered still images. Fixed a minor memory leak within the video camera. --- .../SimpleImageViewController.h | 4 ++++ .../SimpleImageViewController.m | 23 ++++++++++++++++++- framework/Source/GPUImageFilter.m | 5 ++++ framework/Source/GPUImagePicture.h | 2 ++ framework/Source/GPUImagePicture.m | 22 ++++++++++++++++-- framework/Source/GPUImageVideoCamera.m | 5 ++++ 6 files changed, 58 insertions(+), 3 deletions(-) diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h index 239e6b5bd..3421e5f88 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h @@ -5,6 +5,8 @@ { GPUImagePicture *sourcePicture; GPUImageOutput *sepiaFilter, *sepiaFilter2; + + UISlider *imageSlider; } // Image filtering @@ -12,4 +14,6 @@ - (void)setupImageFilteringToDisk; - (void)setupImageResampling; +- (IBAction)updateSliderValue:(id)sender; + @end diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index f3eaa007f..8a80b2cb5 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -16,6 +16,15 @@ - (void)loadView GPUImageView *primaryView = [[GPUImageView alloc] initWithFrame:mainScreenFrame]; self.view = primaryView; + imageSlider = [[UISlider alloc] initWithFrame:CGRectMake(25.0, mainScreenFrame.size.height - 50.0, mainScreenFrame.size.width - 50.0, 40.0)]; + [imageSlider addTarget:self action:@selector(updateSliderValue:) forControlEvents:UIControlEventValueChanged]; + imageSlider.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; + imageSlider.minimumValue = 0.0; + imageSlider.maximumValue = 1.0; + imageSlider.value = 0.5; + + [primaryView addSubview:imageSlider]; + [self setupDisplayFiltering]; [self setupImageResampling]; [self setupImageFilteringToDisk]; @@ -37,6 +46,17 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface return NO; } + +- (IBAction)updateSliderValue:(id)sender +{ +// [(GPUImageSepiaFilter *)sepiaFilter setIntensity:[(UISlider *)sender value]]; + CGFloat midpoint = [(UISlider *)sender value]; + [(GPUImageTiltShiftFilter *)sepiaFilter setTopFocusLevel:midpoint - 0.1]; + [(GPUImageTiltShiftFilter *)sepiaFilter setBottomFocusLevel:midpoint + 0.1]; + + [sourcePicture processImage]; +} + #pragma mark - #pragma mark Image filtering @@ -45,7 +65,8 @@ - (void)setupDisplayFiltering; UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; // The WID.jpg example is greater than 2048 pixels tall, so it fails on older devices sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; - sepiaFilter = [[GPUImageSepiaFilter alloc] init]; +// sepiaFilter = [[GPUImageSepiaFilter alloc] init]; + sepiaFilter = [[GPUImageTiltShiftFilter alloc] init]; GPUImageView *imageView = (GPUImageView *)self.view; [sepiaFilter forceProcessingAtSize:imageView.sizeInPixels]; // This is now needed to make the filter run at the smaller output size diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 946afd39f..3478cb266 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -945,6 +945,11 @@ - (void)setTextureDelegate:(id)newTextureDelegate atInd - (void)conserveMemoryForNextFrame; { + if (overrideInputSize) + { + return; + } + shouldConserveMemoryForNextFrame = YES; for (id currentTarget in targets) diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 786666bdd..65444d1b6 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -6,6 +6,8 @@ { CGSize pixelSizeOfImage; BOOL hasProcessedImage; + + dispatch_semaphore_t imageUpdateSemaphore; } // Initialization and teardown diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index bc4375f9f..6858034c6 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -38,7 +38,8 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot hasProcessedImage = NO; self.shouldSmoothlyScaleOutput = smoothlyScaleOutput; - + imageUpdateSemaphore = dispatch_semaphore_create(1); + // TODO: Dispatch this whole thing asynchronously to move image loading off main thread CGFloat widthOfImage = CGImageGetWidth(newImageSource); CGFloat heightOfImage = CGImageGetHeight(newImageSource); @@ -138,6 +139,14 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot return self; } +- (void)dealloc; +{ + if (imageUpdateSemaphore != NULL) + { + dispatch_release(imageUpdateSemaphore); + } +} + #pragma mark - #pragma mark Image rendering @@ -151,6 +160,13 @@ - (void)processImage; { hasProcessedImage = YES; +// dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_FOREVER); + + if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) + { + return; + } + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) @@ -165,7 +181,9 @@ - (void)processImage; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; - } + } + + dispatch_semaphore_signal(imageUpdateSemaphore); }); } diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 0d893e8cc..96e221121 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -162,6 +162,11 @@ - (void)dealloc { dispatch_release(audioProcessingQueue); } + + if (frameRenderingSemaphore != NULL) + { + dispatch_release(frameRenderingSemaphore); + } } - (void)removeInputsAndOutputs; From a8f507c005e9e5c3cdf979b420fc9e05bdcc5ced Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Mon, 5 Nov 2012 08:55:53 +1300 Subject: [PATCH 259/695] Add a property to set the JPEG compression quality to use when capturing a JPEG from the camera. Signed-off-by: Karl von Randow --- framework/Source/GPUImageStillCamera.h | 4 ++++ framework/Source/GPUImageStillCamera.m | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index 542ab6c8d..773e1a8a2 100755 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -5,6 +5,10 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina @interface GPUImageStillCamera : GPUImageVideoCamera +/** The JPEG compression quality to use when capturing a photo as a JPEG. + */ +@property CGFloat jpegCompressionQuality; + // Photography controls - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block; - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 1cb78296c..30783136c 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -67,6 +67,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [self.captureSession commitConfiguration]; + self.jpegCompressionQuality = 0.8; + return self; } @@ -208,7 +210,7 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f // reportAvailableMemoryForGPUImage(@"After UIImage generation"); - dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, 0.8); + dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, self.jpegCompressionQuality); // reportAvailableMemoryForGPUImage(@"After JPEG generation"); } From 9be019007c18d90029738d4618fe212cb1ab8fb8 Mon Sep 17 00:00:00 2001 From: Brett Gibson Date: Wed, 7 Nov 2012 14:35:26 -0800 Subject: [PATCH 260/695] doing my best to DRY up capturePhotoAs* methods of GPUImageStillCamera --- framework/Source/GPUImageStillCamera.m | 150 ++++++++----------------- 1 file changed, 47 insertions(+), 103 deletions(-) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 1cb78296c..807ead8dd 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -44,6 +44,9 @@ @interface GPUImageStillCamera () AVCaptureStillImageOutput *photoOutput; } +// Methods calling this are responsible for calling dispatch_semaphore_signal(frameRenderingSemaphore) somewhere inside the block +- (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withImageOnGPUHandler:(void (^)(NSError *error))block; + @end @implementation GPUImageStillCamera @@ -107,128 +110,77 @@ - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBuffer - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - - [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + UIImage *filteredPhoto = nil; - if(imageSampleBuffer == NULL){ - dispatch_semaphore_signal(frameRenderingSemaphore); - block(nil, error); - return; + if(!error){ + filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; } - - [self conserveMemoryForNextFrame]; - - // For now, resize photos to fix within the max texture size of the GPU - CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); - - CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); - CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; - if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) - { - CMSampleBufferRef sampleBuffer; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); - - dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - CFRelease(sampleBuffer); - } - else - { - // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches - AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) - { - dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - } - } - - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; dispatch_semaphore_signal(frameRenderingSemaphore); - - block(filteredPhoto, error); + + block(filteredPhoto, error); }]; - - return; } - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; { -// reportAvailableMemoryForGPUImage(@"Before still image capture"); - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); +// reportAvailableMemoryForGPUImage(@"Before Capture"); - [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { -// reportAvailableMemoryForGPUImage(@"Before filter processing"); + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + NSData *dataForJPEGFile = nil; - if(imageSampleBuffer == NULL){ + if(!error){ + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dispatch_semaphore_signal(frameRenderingSemaphore); +// reportAvailableMemoryForGPUImage(@"After UIImage generation"); + + dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, 0.8); +// reportAvailableMemoryForGPUImage(@"After JPEG generation"); + } + +// reportAvailableMemoryForGPUImage(@"After autorelease pool"); + }else{ dispatch_semaphore_signal(frameRenderingSemaphore); - block(nil, error); - return; } - [self conserveMemoryForNextFrame]; + dispatch_semaphore_signal(frameRenderingSemaphore); + block(dataForJPEGFile, error); + }]; +} - // For now, resize photos to fix within the max texture size of the GPU - CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); +- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; +{ - CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); - CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; - if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) - { - CMSampleBufferRef sampleBuffer; + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + NSData *dataForPNGFile = nil; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); - - dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - CFRelease(sampleBuffer); - } - else - { - // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches - AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) - { + if(!error){ + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - } - } - -// reportAvailableMemoryForGPUImage(@"After filter processing"); - - __strong NSData *dataForJPEGFile = nil; - @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); + } + }else{ dispatch_semaphore_signal(frameRenderingSemaphore); - -// reportAvailableMemoryForGPUImage(@"After UIImage generation"); - - dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, 0.8); -// reportAvailableMemoryForGPUImage(@"After JPEG generation"); } - -// reportAvailableMemoryForGPUImage(@"After autorelease pool"); - - block(dataForJPEGFile, error); + + block(dataForPNGFile, error); }]; return; } -- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; +#pragma mark - Private Methods + +- (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withImageOnGPUHandler:(void (^)(NSError *error))block { dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { if(imageSampleBuffer == NULL){ - dispatch_semaphore_signal(frameRenderingSemaphore); - block(nil, error); + block(error); return; } @@ -236,7 +188,7 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); - + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) @@ -261,18 +213,10 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi } } - NSData *dataForPNGFile = nil; - @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; - dispatch_semaphore_signal(frameRenderingSemaphore); - dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); - } - - block(dataForPNGFile, error); + block(nil); }]; - - return; } + @end From 82872b97c6551ca228f90d7764a464aa0b7cedff Mon Sep 17 00:00:00 2001 From: Brett Gibson Date: Wed, 7 Nov 2012 14:50:32 -0800 Subject: [PATCH 261/695] extra check to preempt trying to capture two still images at once --- framework/Source/GPUImageStillCamera.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 807ead8dd..584e1fa44 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -177,8 +177,12 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi { dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + if(photoOutput.isCapturingStillImage){ + block([NSError errorWithDomain:AVFoundationErrorDomain code:AVErrorMaximumStillImageCaptureRequestsExceeded userInfo:nil]); + return; + } + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { if(imageSampleBuffer == NULL){ block(error); return; From 2fc4a5c14e1f51a34aa00cddd1ad5830316fb9f7 Mon Sep 17 00:00:00 2001 From: Brett Gibson Date: Wed, 7 Nov 2012 16:09:54 -0800 Subject: [PATCH 262/695] GPUImageVideoCamera makes the metadata from the image capture available during the capture completion handler --- .../SimplePhotoFilter/PhotoViewController.m | 2 +- framework/Source/GPUImageStillCamera.h | 3 +++ framework/Source/GPUImageStillCamera.m | 5 +++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 07019656d..156e12663 100755 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -107,7 +107,7 @@ - (IBAction)takePhoto:(id)sender; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; // report_memory(@"After asset library creation"); - [library writeImageDataToSavedPhotosAlbum:processedJPEG metadata:nil completionBlock:^(NSURL *assetURL, NSError *error2) + [library writeImageDataToSavedPhotosAlbum:processedJPEG metadata:stillCamera.currentCaptureMetadata completionBlock:^(NSURL *assetURL, NSError *error2) { // report_memory(@"After writing to library"); if (error2) { diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index 542ab6c8d..84c7bc4f4 100755 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -5,6 +5,9 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina @interface GPUImageStillCamera : GPUImageVideoCamera +// Only reliably set inside the context of the completion handler of one of the capture methods +@property (readonly) NSDictionary *currentCaptureMetadata; + // Photography controls - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block; - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 584e1fa44..042cb0270 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -217,7 +217,12 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi } } + CFDictionaryRef metadata = CMCopyDictionaryOfAttachments(NULL, imageSampleBuffer, kCMAttachmentMode_ShouldPropagate); + _currentCaptureMetadata = (__bridge_transfer NSDictionary *)metadata; + block(nil); + + _currentCaptureMetadata = nil; }]; } From bb3f1683f251a192973d6f1cfb4b5f6206343eae Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Wed, 7 Nov 2012 21:42:53 -0700 Subject: [PATCH 263/695] Added center and color parameters --- framework/Source/GPUImageVignetteFilter.h | 8 ++++- framework/Source/GPUImageVignetteFilter.m | 40 +++++++++++++++++++---- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageVignetteFilter.h b/framework/Source/GPUImageVignetteFilter.h index 0c4ccac27..37be94492 100755 --- a/framework/Source/GPUImageVignetteFilter.h +++ b/framework/Source/GPUImageVignetteFilter.h @@ -4,9 +4,15 @@ */ @interface GPUImageVignetteFilter : GPUImageFilter { - GLint vignetteStartUniform, vignetteEndUniform; + GLint vignetteCenterUniform, vignetteColorUniform, vignetteStartUniform, vignetteEndUniform; } +// the center for the vignette in tex coords (defaults to 0.5, 0.5) +@property (nonatomic, readwrite) CGPoint vignetteCenter; + +// The color to use for the Vignette (defaults to black) +@property (nonatomic, readwrite) GPUVector3 vignetteColor; + // The normalized distance from the center where the vignette effect starts. Default of 0.5. @property (nonatomic, readwrite) CGFloat vignetteStart; diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m index 4eb094528..7acd937d2 100755 --- a/framework/Source/GPUImageVignetteFilter.m +++ b/framework/Source/GPUImageVignetteFilter.m @@ -5,21 +5,31 @@ uniform sampler2D inputImageTexture; varying highp vec2 textureCoordinate; + uniform lowp vec2 vignetteCenter; + uniform lowp vec3 vignetteColor; uniform highp float vignetteStart; uniform highp float vignetteEnd; void main() { - lowp vec3 rgb = texture2D(inputImageTexture, textureCoordinate).rgb; - lowp float d = distance(textureCoordinate, vec2(0.5,0.5)); - rgb *= smoothstep(vignetteEnd, vignetteStart, d); - gl_FragColor = vec4(vec3(rgb),1.0); + /* + lowp vec3 rgb = texture2D(inputImageTexture, textureCoordinate).rgb; + lowp float d = distance(textureCoordinate, vec2(0.5,0.5)); + rgb *= (1.0 - smoothstep(vignetteStart, vignetteEnd, d)); + gl_FragColor = vec4(vec3(rgb),1.0); + */ + + lowp vec3 rgb = texture2D(inputImageTexture, textureCoordinate).rgb; + lowp float d = distance(textureCoordinate, vec2(vignetteCenter.x, vignetteCenter.y)); + lowp float percent = smoothstep(vignetteStart, vignetteEnd, d); + gl_FragColor = vec4(mix(rgb.x, vignetteColor.x, percent), mix(rgb.y, vignetteColor.y, percent), mix(rgb.z, vignetteColor.z, percent), 1.0); } ); - @implementation GPUImageVignetteFilter +@synthesize vignetteCenter = _vignetteCenter; +@synthesize vignetteColor = _vignetteColor; @synthesize vignetteStart =_vignetteStart; @synthesize vignetteEnd = _vignetteEnd; @@ -33,10 +43,14 @@ - (id)init; return nil; } + vignetteCenterUniform = [filterProgram uniformIndex:@"vignetteCenter"]; + vignetteColorUniform = [filterProgram uniformIndex:@"vignetteColor"]; vignetteStartUniform = [filterProgram uniformIndex:@"vignetteStart"]; vignetteEndUniform = [filterProgram uniformIndex:@"vignetteEnd"]; - self.vignetteStart = 0.3; + self.vignetteCenter = (CGPoint){ 0.5f, 0.5f }; + self.vignetteColor = (GPUVector3){ 0.0f, 0.0f, 0.0f }; + self.vignetteStart = 0.5; self.vignetteEnd = 0.75; return self; @@ -45,6 +59,20 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)setVignetteCenter:(CGPoint)newValue +{ + _vignetteCenter = newValue; + + [self setPoint:newValue forUniform:vignetteCenterUniform program:filterProgram]; +} + +- (void)setVignetteColor:(GPUVector3)newValue +{ + _vignetteColor = newValue; + + [self setVec3:newValue forUniform:vignetteColorUniform program:filterProgram]; +} + - (void)setVignetteStart:(CGFloat)newValue; { _vignetteStart = newValue; From ef75625239ea0eb73d7681ae950e1008a005fa54 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 8 Nov 2012 18:24:15 -0700 Subject: [PATCH 264/695] Added center and radius properties to pixelate filter --- framework/Source/GPUImagePixellateFilter.h | 8 +++- framework/Source/GPUImagePixellateFilter.m | 45 +++++++++++++++++++--- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/framework/Source/GPUImagePixellateFilter.h b/framework/Source/GPUImagePixellateFilter.h index c101dd533..60482a828 100755 --- a/framework/Source/GPUImagePixellateFilter.h +++ b/framework/Source/GPUImagePixellateFilter.h @@ -2,10 +2,16 @@ @interface GPUImagePixellateFilter : GPUImageFilter { - GLint fractionalWidthOfAPixelUniform, aspectRatioUniform; + GLint fractionalWidthOfAPixelUniform, aspectRatioUniform, centerUniform, radiusUniform; } // The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored. @property(readwrite, nonatomic) CGFloat fractionalWidthOfAPixel; +// the center point to start pixelation in texture coordinates +@property(readwrite, nonatomic) CGPoint center; + +// the radius (0.0 - 1.0) in which to pixelate +@property(readwrite, nonatomic) CGFloat radius; + @end diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index e68d464d7..a23dad452 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -8,13 +8,30 @@ uniform highp float fractionalWidthOfPixel; uniform highp float aspectRatio; - + uniform lowp vec2 pixelateCenter; + uniform highp float pixelateRadius; + void main() { - highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); +// highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); +// highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; +// +// gl_FragColor = texture2D(inputImageTexture, samplePos ); - highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; - gl_FragColor = texture2D(inputImageTexture, samplePos ); + highp vec2 textureCoordinateToUse = textureCoordinate; + highp float dist = distance(pixelateCenter, textureCoordinate); + + if (dist < pixelateRadius) + { + textureCoordinateToUse += pixelateCenter; + highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + gl_FragColor = texture2D(inputImageTexture, samplePos ); + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + } } ); @@ -51,8 +68,12 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; fractionalWidthOfAPixelUniform = [filterProgram uniformIndex:@"fractionalWidthOfPixel"]; aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; - + centerUniform = [filterProgram uniformIndex:@"pixelateCenter"]; + radiusUniform = [filterProgram uniformIndex:@"pixelateRadius"]; + self.fractionalWidthOfAPixel = 0.05; + self.center = CGPointMake(0.5f, 0.5f); + self.radius = 1.0f; return self; } @@ -109,4 +130,18 @@ - (void)setAspectRatio:(CGFloat)newValue; [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; } +- (void)setCenter:(CGPoint)center +{ + _center = center; + + [self setPoint:_center forUniform:centerUniform program:filterProgram]; +} + +- (void)setRadius:(CGFloat)radius +{ + _radius = radius; + + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; +} + @end From 15d3c0a1ab72dbb3afeea0c704d9009c28143bad Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 8 Nov 2012 18:29:51 -0700 Subject: [PATCH 265/695] Added synthesizes --- framework/Source/GPUImagePixellateFilter.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index a23dad452..ec87fadb3 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -45,6 +45,8 @@ @implementation GPUImagePixellateFilter @synthesize fractionalWidthOfAPixel = _fractionalWidthOfAPixel; @synthesize aspectRatio = _aspectRatio; +@synthesize center = _center; +@synthesize radius = _radius; #pragma mark - #pragma mark Initialization and teardown From a70d8769ffee0dafb41b7c9960fc9b640c3cf4e8 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 8 Nov 2012 18:31:43 -0700 Subject: [PATCH 266/695] Restored previous default --- framework/Source/GPUImageVignetteFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m index 7acd937d2..c6a3546a5 100755 --- a/framework/Source/GPUImageVignetteFilter.m +++ b/framework/Source/GPUImageVignetteFilter.m @@ -50,7 +50,7 @@ - (id)init; self.vignetteCenter = (CGPoint){ 0.5f, 0.5f }; self.vignetteColor = (GPUVector3){ 0.0f, 0.0f, 0.0f }; - self.vignetteStart = 0.5; + self.vignetteStart = 0.3; self.vignetteEnd = 0.75; return self; From c942cb9b90221d22ec572529c2b73ffe3aa533fe Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Fri, 9 Nov 2012 17:19:21 -0700 Subject: [PATCH 267/695] Fix aspect ratio for bulge distortion filter --- framework/Source/GPUImageChromaKeyFilter.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 framework/Source/GPUImageChromaKeyFilter.h diff --git a/framework/Source/GPUImageChromaKeyFilter.h b/framework/Source/GPUImageChromaKeyFilter.h old mode 100644 new mode 100755 From 41dd71f204e9d366c0f0e45fd8758b31696f2841 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Fri, 9 Nov 2012 17:19:45 -0700 Subject: [PATCH 268/695] ? --- .../Source/GPUImage3x3TextureSamplingFilter.h | 0 .../Source/GPUImage3x3TextureSamplingFilter.m | 0 framework/Source/GPUImageAddBlendFilter.h | 0 framework/Source/GPUImageAddBlendFilter.m | 0 framework/Source/GPUImageAverageColor.h | 0 framework/Source/GPUImageAverageColor.m | 0 .../GPUImageAverageLuminanceThresholdFilter.h | 0 .../GPUImageAverageLuminanceThresholdFilter.m | 0 framework/Source/GPUImageBilateralFilter.h | 0 framework/Source/GPUImageBilateralFilter.m | 0 framework/Source/GPUImageBuffer.h | 0 framework/Source/GPUImageBuffer.m | 0 .../Source/GPUImageBulgeDistortionFilter.h | 2 +- .../Source/GPUImageBulgeDistortionFilter.m | 53 ++++++++++++++++--- framework/Source/GPUImageChromaKeyFilter.m | 0 framework/Source/GPUImageClosingFilter.h | 0 framework/Source/GPUImageClosingFilter.m | 0 framework/Source/GPUImageColorPackingFilter.h | 0 framework/Source/GPUImageColorPackingFilter.m | 0 framework/Source/GPUImageCrosshairGenerator.h | 0 framework/Source/GPUImageCrosshairGenerator.m | 0 framework/Source/GPUImageDarkenBlendFilter.m | 0 framework/Source/GPUImageDilationFilter.h | 0 framework/Source/GPUImageDilationFilter.m | 0 ...geDirectionalNonMaximumSuppressionFilter.h | 0 ...geDirectionalNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageDivideBlendFilter.h | 0 framework/Source/GPUImageDivideBlendFilter.m | 0 framework/Source/GPUImageErosionFilter.h | 0 framework/Source/GPUImageErosionFilter.m | 0 framework/Source/GPUImageFalseColorFilter.h | 0 framework/Source/GPUImageFalseColorFilter.m | 0 framework/Source/GPUImageGlassSphereFilter.h | 0 framework/Source/GPUImageGlassSphereFilter.m | 0 framework/Source/GPUImageHalftoneFilter.h | 0 framework/Source/GPUImageHalftoneFilter.m | 0 framework/Source/GPUImageHighPassFilter.h | 0 framework/Source/GPUImageHighPassFilter.m | 0 .../Source/GPUImageHighlightShadowFilter.h | 0 .../Source/GPUImageHighlightShadowFilter.m | 0 .../GPUImageHoughTransformLineDetector.h | 0 .../GPUImageHoughTransformLineDetector.m | 0 framework/Source/GPUImageHueFilter.h | 0 framework/Source/GPUImageHueFilter.m | 0 framework/Source/GPUImageJFAVoroniFilter.h | 0 framework/Source/GPUImageJFAVoroniFilter.m | 0 .../Source/GPUImageLanczosResamplingFilter.h | 0 .../Source/GPUImageLanczosResamplingFilter.m | 0 framework/Source/GPUImageLevelsFilter.h | 0 framework/Source/GPUImageLevelsFilter.m | 0 framework/Source/GPUImageLineGenerator.h | 0 framework/Source/GPUImageLineGenerator.m | 0 .../Source/GPUImageLocalBinaryPatternFilter.h | 0 .../Source/GPUImageLocalBinaryPatternFilter.m | 0 framework/Source/GPUImageLookupFilter.h | 0 framework/Source/GPUImageLookupFilter.m | 0 framework/Source/GPUImageLowPassFilter.h | 0 framework/Source/GPUImageLowPassFilter.m | 0 framework/Source/GPUImageLuminosity.h | 0 framework/Source/GPUImageLuminosity.m | 0 framework/Source/GPUImageMedianFilter.h | 0 framework/Source/GPUImageMedianFilter.m | 0 framework/Source/GPUImageMonochromeFilter.h | 0 framework/Source/GPUImageMonochromeFilter.m | 0 framework/Source/GPUImageMosaicFilter.h | 0 framework/Source/GPUImageMosaicFilter.m | 0 framework/Source/GPUImageMotionDetector.h | 0 framework/Source/GPUImageMotionDetector.m | 0 .../GPUImageNobleCornerDetectionFilter.h | 0 .../GPUImageNobleCornerDetectionFilter.m | 0 .../GPUImageNonMaximumSuppressionFilter.h | 0 .../GPUImageNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageNormalBlendFilter.h | 0 framework/Source/GPUImageNormalBlendFilter.m | 0 framework/Source/GPUImageOpacityFilter.h | 0 framework/Source/GPUImageOpacityFilter.m | 0 framework/Source/GPUImageOpeningFilter.h | 0 framework/Source/GPUImageOpeningFilter.m | 0 ...ageParallelCoordinateLineTransformFilter.h | 0 ...ageParallelCoordinateLineTransformFilter.m | 0 framework/Source/GPUImagePerlinNoiseFilter.h | 0 framework/Source/GPUImagePerlinNoiseFilter.m | 0 framework/Source/GPUImagePicture.m | 6 ++- framework/Source/GPUImagePixellateFilter.m | 7 ++- framework/Source/GPUImagePolkaDotFilter.h | 0 framework/Source/GPUImagePolkaDotFilter.m | 0 framework/Source/GPUImageRGBClosingFilter.h | 0 framework/Source/GPUImageRGBClosingFilter.m | 0 framework/Source/GPUImageRGBDilationFilter.h | 0 framework/Source/GPUImageRGBDilationFilter.m | 0 framework/Source/GPUImageRGBErosionFilter.h | 0 framework/Source/GPUImageRGBErosionFilter.m | 0 framework/Source/GPUImageRGBOpeningFilter.h | 0 framework/Source/GPUImageRGBOpeningFilter.m | 0 framework/Source/GPUImageRawDataInput.h | 0 framework/Source/GPUImageRawDataInput.m | 0 .../GPUImageShiTomasiFeatureDetectionFilter.h | 0 .../GPUImageShiTomasiFeatureDetectionFilter.m | 0 .../GPUImageSingleComponentFastBlurFilter.h | 0 .../GPUImageSingleComponentFastBlurFilter.m | 0 ...PUImageSingleComponentGaussianBlurFilter.h | 0 ...PUImageSingleComponentGaussianBlurFilter.m | 0 .../Source/GPUImageSolidColorGenerator.h | 0 .../Source/GPUImageSolidColorGenerator.m | 0 .../Source/GPUImageSourceOverBlendFilter.h | 0 .../Source/GPUImageSourceOverBlendFilter.m | 0 .../Source/GPUImageSphereRefractionFilter.h | 0 .../Source/GPUImageSphereRefractionFilter.m | 0 .../Source/GPUImageThresholdSketchFilter.h | 0 .../Source/GPUImageThresholdSketchFilter.m | 0 ...geThresholdedNonMaximumSuppressionFilter.h | 0 ...geThresholdedNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageToneCurveFilter.m | 0 framework/Source/GPUImageTwoInputFilter.h | 0 framework/Source/GPUImageTwoInputFilter.m | 0 .../GPUImageTwoPassTextureSamplingFilter.h | 0 .../GPUImageTwoPassTextureSamplingFilter.m | 0 framework/Source/GPUImageUIElement.h | 0 framework/Source/GPUImageUIElement.m | 0 .../Source/GPUImageVoroniConsumerFilter.h | 0 .../Source/GPUImageVoroniConsumerFilter.m | 0 .../Source/GPUImageWeakPixelInclusionFilter.h | 0 .../Source/GPUImageWeakPixelInclusionFilter.m | 0 framework/Source/GPUImageWhiteBalanceFilter.h | 0 framework/Source/GPUImageWhiteBalanceFilter.m | 0 ...imageDirectionalSobelEdgeDetectionFilter.h | 0 ...imageDirectionalSobelEdgeDetectionFilter.m | 0 127 files changed, 54 insertions(+), 14 deletions(-) mode change 100644 => 100755 framework/Source/GPUImage3x3TextureSamplingFilter.h mode change 100644 => 100755 framework/Source/GPUImage3x3TextureSamplingFilter.m mode change 100644 => 100755 framework/Source/GPUImageAddBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageAddBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageAverageColor.h mode change 100644 => 100755 framework/Source/GPUImageAverageColor.m mode change 100644 => 100755 framework/Source/GPUImageAverageLuminanceThresholdFilter.h mode change 100644 => 100755 framework/Source/GPUImageAverageLuminanceThresholdFilter.m mode change 100644 => 100755 framework/Source/GPUImageBilateralFilter.h mode change 100644 => 100755 framework/Source/GPUImageBilateralFilter.m mode change 100644 => 100755 framework/Source/GPUImageBuffer.h mode change 100644 => 100755 framework/Source/GPUImageBuffer.m mode change 100644 => 100755 framework/Source/GPUImageChromaKeyFilter.m mode change 100644 => 100755 framework/Source/GPUImageClosingFilter.h mode change 100644 => 100755 framework/Source/GPUImageClosingFilter.m mode change 100644 => 100755 framework/Source/GPUImageColorPackingFilter.h mode change 100644 => 100755 framework/Source/GPUImageColorPackingFilter.m mode change 100644 => 100755 framework/Source/GPUImageCrosshairGenerator.h mode change 100644 => 100755 framework/Source/GPUImageCrosshairGenerator.m mode change 100644 => 100755 framework/Source/GPUImageDarkenBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageDilationFilter.h mode change 100644 => 100755 framework/Source/GPUImageDilationFilter.m mode change 100644 => 100755 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h mode change 100644 => 100755 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m mode change 100644 => 100755 framework/Source/GPUImageDivideBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageDivideBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageErosionFilter.h mode change 100644 => 100755 framework/Source/GPUImageErosionFilter.m mode change 100644 => 100755 framework/Source/GPUImageFalseColorFilter.h mode change 100644 => 100755 framework/Source/GPUImageFalseColorFilter.m mode change 100644 => 100755 framework/Source/GPUImageGlassSphereFilter.h mode change 100644 => 100755 framework/Source/GPUImageGlassSphereFilter.m mode change 100644 => 100755 framework/Source/GPUImageHalftoneFilter.h mode change 100644 => 100755 framework/Source/GPUImageHalftoneFilter.m mode change 100644 => 100755 framework/Source/GPUImageHighPassFilter.h mode change 100644 => 100755 framework/Source/GPUImageHighPassFilter.m mode change 100644 => 100755 framework/Source/GPUImageHighlightShadowFilter.h mode change 100644 => 100755 framework/Source/GPUImageHighlightShadowFilter.m mode change 100644 => 100755 framework/Source/GPUImageHoughTransformLineDetector.h mode change 100644 => 100755 framework/Source/GPUImageHoughTransformLineDetector.m mode change 100644 => 100755 framework/Source/GPUImageHueFilter.h mode change 100644 => 100755 framework/Source/GPUImageHueFilter.m mode change 100644 => 100755 framework/Source/GPUImageJFAVoroniFilter.h mode change 100644 => 100755 framework/Source/GPUImageJFAVoroniFilter.m mode change 100644 => 100755 framework/Source/GPUImageLanczosResamplingFilter.h mode change 100644 => 100755 framework/Source/GPUImageLanczosResamplingFilter.m mode change 100644 => 100755 framework/Source/GPUImageLevelsFilter.h mode change 100644 => 100755 framework/Source/GPUImageLevelsFilter.m mode change 100644 => 100755 framework/Source/GPUImageLineGenerator.h mode change 100644 => 100755 framework/Source/GPUImageLineGenerator.m mode change 100644 => 100755 framework/Source/GPUImageLocalBinaryPatternFilter.h mode change 100644 => 100755 framework/Source/GPUImageLocalBinaryPatternFilter.m mode change 100644 => 100755 framework/Source/GPUImageLookupFilter.h mode change 100644 => 100755 framework/Source/GPUImageLookupFilter.m mode change 100644 => 100755 framework/Source/GPUImageLowPassFilter.h mode change 100644 => 100755 framework/Source/GPUImageLowPassFilter.m mode change 100644 => 100755 framework/Source/GPUImageLuminosity.h mode change 100644 => 100755 framework/Source/GPUImageLuminosity.m mode change 100644 => 100755 framework/Source/GPUImageMedianFilter.h mode change 100644 => 100755 framework/Source/GPUImageMedianFilter.m mode change 100644 => 100755 framework/Source/GPUImageMonochromeFilter.h mode change 100644 => 100755 framework/Source/GPUImageMonochromeFilter.m mode change 100644 => 100755 framework/Source/GPUImageMosaicFilter.h mode change 100644 => 100755 framework/Source/GPUImageMosaicFilter.m mode change 100644 => 100755 framework/Source/GPUImageMotionDetector.h mode change 100644 => 100755 framework/Source/GPUImageMotionDetector.m mode change 100644 => 100755 framework/Source/GPUImageNobleCornerDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUImageNobleCornerDetectionFilter.m mode change 100644 => 100755 framework/Source/GPUImageNonMaximumSuppressionFilter.h mode change 100644 => 100755 framework/Source/GPUImageNonMaximumSuppressionFilter.m mode change 100644 => 100755 framework/Source/GPUImageNormalBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageNormalBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageOpacityFilter.h mode change 100644 => 100755 framework/Source/GPUImageOpacityFilter.m mode change 100644 => 100755 framework/Source/GPUImageOpeningFilter.h mode change 100644 => 100755 framework/Source/GPUImageOpeningFilter.m mode change 100644 => 100755 framework/Source/GPUImageParallelCoordinateLineTransformFilter.h mode change 100644 => 100755 framework/Source/GPUImageParallelCoordinateLineTransformFilter.m mode change 100644 => 100755 framework/Source/GPUImagePerlinNoiseFilter.h mode change 100644 => 100755 framework/Source/GPUImagePerlinNoiseFilter.m mode change 100644 => 100755 framework/Source/GPUImagePolkaDotFilter.h mode change 100644 => 100755 framework/Source/GPUImagePolkaDotFilter.m mode change 100644 => 100755 framework/Source/GPUImageRGBClosingFilter.h mode change 100644 => 100755 framework/Source/GPUImageRGBClosingFilter.m mode change 100644 => 100755 framework/Source/GPUImageRGBDilationFilter.h mode change 100644 => 100755 framework/Source/GPUImageRGBDilationFilter.m mode change 100644 => 100755 framework/Source/GPUImageRGBErosionFilter.h mode change 100644 => 100755 framework/Source/GPUImageRGBErosionFilter.m mode change 100644 => 100755 framework/Source/GPUImageRGBOpeningFilter.h mode change 100644 => 100755 framework/Source/GPUImageRGBOpeningFilter.m mode change 100644 => 100755 framework/Source/GPUImageRawDataInput.h mode change 100644 => 100755 framework/Source/GPUImageRawDataInput.m mode change 100644 => 100755 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m mode change 100644 => 100755 framework/Source/GPUImageSingleComponentFastBlurFilter.h mode change 100644 => 100755 framework/Source/GPUImageSingleComponentFastBlurFilter.m mode change 100644 => 100755 framework/Source/GPUImageSingleComponentGaussianBlurFilter.h mode change 100644 => 100755 framework/Source/GPUImageSingleComponentGaussianBlurFilter.m mode change 100644 => 100755 framework/Source/GPUImageSolidColorGenerator.h mode change 100644 => 100755 framework/Source/GPUImageSolidColorGenerator.m mode change 100644 => 100755 framework/Source/GPUImageSourceOverBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageSourceOverBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageSphereRefractionFilter.h mode change 100644 => 100755 framework/Source/GPUImageSphereRefractionFilter.m mode change 100644 => 100755 framework/Source/GPUImageThresholdSketchFilter.h mode change 100644 => 100755 framework/Source/GPUImageThresholdSketchFilter.m mode change 100644 => 100755 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h mode change 100644 => 100755 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m mode change 100644 => 100755 framework/Source/GPUImageToneCurveFilter.m mode change 100644 => 100755 framework/Source/GPUImageTwoInputFilter.h mode change 100644 => 100755 framework/Source/GPUImageTwoInputFilter.m mode change 100644 => 100755 framework/Source/GPUImageTwoPassTextureSamplingFilter.h mode change 100644 => 100755 framework/Source/GPUImageTwoPassTextureSamplingFilter.m mode change 100644 => 100755 framework/Source/GPUImageUIElement.h mode change 100644 => 100755 framework/Source/GPUImageUIElement.m mode change 100644 => 100755 framework/Source/GPUImageVoroniConsumerFilter.h mode change 100644 => 100755 framework/Source/GPUImageVoroniConsumerFilter.m mode change 100644 => 100755 framework/Source/GPUImageWeakPixelInclusionFilter.h mode change 100644 => 100755 framework/Source/GPUImageWeakPixelInclusionFilter.m mode change 100644 => 100755 framework/Source/GPUImageWhiteBalanceFilter.h mode change 100644 => 100755 framework/Source/GPUImageWhiteBalanceFilter.m mode change 100644 => 100755 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.h b/framework/Source/GPUImage3x3TextureSamplingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAddBlendFilter.h b/framework/Source/GPUImageAddBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAddBlendFilter.m b/framework/Source/GPUImageAddBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAverageColor.h b/framework/Source/GPUImageAverageColor.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.h b/framework/Source/GPUImageAverageLuminanceThresholdFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.m b/framework/Source/GPUImageAverageLuminanceThresholdFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBilateralFilter.h b/framework/Source/GPUImageBilateralFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBuffer.h b/framework/Source/GPUImageBuffer.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBulgeDistortionFilter.h b/framework/Source/GPUImageBulgeDistortionFilter.h index 0ba06f936..d416e536f 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.h +++ b/framework/Source/GPUImageBulgeDistortionFilter.h @@ -3,7 +3,7 @@ /// Creates a bulge distortion on the image @interface GPUImageBulgeDistortionFilter : GPUImageFilter { - GLint radiusUniform, centerUniform, scaleUniform; + GLint aspectRatioUniform, radiusUniform, centerUniform, scaleUniform; } /// The center about which to apply the distortion, with a default of (0.5, 0.5) diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index 2bb2da86f..aa7ed6d38 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -6,31 +6,44 @@ uniform sampler2D inputImageTexture; + uniform highp float aspectRatio; uniform highp vec2 center; uniform highp float radius; uniform highp float scale; void main() { - highp vec2 textureCoordinateToUse = textureCoordinate; - highp float dist = distance(center, textureCoordinate); - textureCoordinateToUse -= center; + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(center, textureCoordinateToUse); + textureCoordinateToUse = textureCoordinate; + if (dist < radius) { + textureCoordinateToUse -= center; highp float percent = 1.0 - ((radius - dist) / radius) * scale; percent = percent * percent; textureCoordinateToUse = textureCoordinateToUse * percent; + textureCoordinateToUse += center; + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); } - textureCoordinateToUse += center; - - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); - } ); +@interface GPUImageBulgeDistortionFilter () + +@property (readwrite, nonatomic) CGFloat aspectRatio; + +@end + @implementation GPUImageBulgeDistortionFilter +@synthesize aspectRatio = _aspectRatio; @synthesize center = _center; @synthesize radius = _radius; @synthesize scale = _scale; @@ -45,6 +58,7 @@ - (id)init; return nil; } + aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; radiusUniform = [filterProgram uniformIndex:@"radius"]; scaleUniform = [filterProgram uniformIndex:@"scale"]; centerUniform = [filterProgram uniformIndex:@"center"]; @@ -59,6 +73,31 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) + { + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } + } +} + +- (void)setAspectRatio:(CGFloat)newValue; +{ + _aspectRatio = newValue; + + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; +} + - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; { [super setInputRotation:newInputRotation atIndex:textureIndex]; diff --git a/framework/Source/GPUImageChromaKeyFilter.m b/framework/Source/GPUImageChromaKeyFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageClosingFilter.h b/framework/Source/GPUImageClosingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageClosingFilter.m b/framework/Source/GPUImageClosingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorPackingFilter.h b/framework/Source/GPUImageColorPackingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCrosshairGenerator.h b/framework/Source/GPUImageCrosshairGenerator.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDarkenBlendFilter.m b/framework/Source/GPUImageDarkenBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDilationFilter.h b/framework/Source/GPUImageDilationFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDilationFilter.m b/framework/Source/GPUImageDilationFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDivideBlendFilter.h b/framework/Source/GPUImageDivideBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDivideBlendFilter.m b/framework/Source/GPUImageDivideBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageErosionFilter.h b/framework/Source/GPUImageErosionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageErosionFilter.m b/framework/Source/GPUImageErosionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFalseColorFilter.h b/framework/Source/GPUImageFalseColorFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGlassSphereFilter.h b/framework/Source/GPUImageGlassSphereFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGlassSphereFilter.m b/framework/Source/GPUImageGlassSphereFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHalftoneFilter.h b/framework/Source/GPUImageHalftoneFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHalftoneFilter.m b/framework/Source/GPUImageHalftoneFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHighPassFilter.h b/framework/Source/GPUImageHighPassFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHighPassFilter.m b/framework/Source/GPUImageHighPassFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHighlightShadowFilter.h b/framework/Source/GPUImageHighlightShadowFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHighlightShadowFilter.m b/framework/Source/GPUImageHighlightShadowFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHoughTransformLineDetector.h b/framework/Source/GPUImageHoughTransformLineDetector.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHueFilter.h b/framework/Source/GPUImageHueFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageJFAVoroniFilter.h b/framework/Source/GPUImageJFAVoroniFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLanczosResamplingFilter.h b/framework/Source/GPUImageLanczosResamplingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLevelsFilter.h b/framework/Source/GPUImageLevelsFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLineGenerator.h b/framework/Source/GPUImageLineGenerator.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.h b/framework/Source/GPUImageLocalBinaryPatternFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.m b/framework/Source/GPUImageLocalBinaryPatternFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLookupFilter.h b/framework/Source/GPUImageLookupFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLookupFilter.m b/framework/Source/GPUImageLookupFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLowPassFilter.h b/framework/Source/GPUImageLowPassFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLowPassFilter.m b/framework/Source/GPUImageLowPassFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLuminosity.h b/framework/Source/GPUImageLuminosity.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMedianFilter.h b/framework/Source/GPUImageMedianFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMedianFilter.m b/framework/Source/GPUImageMedianFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMonochromeFilter.h b/framework/Source/GPUImageMonochromeFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMotionDetector.h b/framework/Source/GPUImageMotionDetector.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMotionDetector.m b/framework/Source/GPUImageMotionDetector.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.h b/framework/Source/GPUImageNobleCornerDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.m b/framework/Source/GPUImageNobleCornerDetectionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.h b/framework/Source/GPUImageNonMaximumSuppressionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNormalBlendFilter.h b/framework/Source/GPUImageNormalBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpacityFilter.h b/framework/Source/GPUImageOpacityFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpacityFilter.m b/framework/Source/GPUImageOpacityFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpeningFilter.h b/framework/Source/GPUImageOpeningFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpeningFilter.m b/framework/Source/GPUImageOpeningFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePerlinNoiseFilter.h b/framework/Source/GPUImagePerlinNoiseFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 6858034c6..e60302b67 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -81,6 +81,10 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef imageContext = CGBitmapContextCreate(imageData, (size_t)pixelSizeToUseForTexture.width, (size_t)pixelSizeToUseForTexture.height, 8, (size_t)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + if (imageContext == NULL) + { + NSLog(@"Empty GPUImage Context"); + } // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), newImageSource); CGContextRelease(imageContext); @@ -111,9 +115,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; - [self initializeOutputTextureIfNeeded]; - glBindTexture(GL_TEXTURE_2D, outputTexture); if (self.shouldSmoothlyScaleOutput) { diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index ec87fadb3..a1235c367 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -18,19 +18,18 @@ void main() // // gl_FragColor = texture2D(inputImageTexture, samplePos ); - highp vec2 textureCoordinateToUse = textureCoordinate; - highp float dist = distance(pixelateCenter, textureCoordinate); + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(pixelateCenter, textureCoordinateToUse); if (dist < pixelateRadius) { - textureCoordinateToUse += pixelateCenter; highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; gl_FragColor = texture2D(inputImageTexture, samplePos ); } else { - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); } } ); diff --git a/framework/Source/GPUImagePolkaDotFilter.h b/framework/Source/GPUImagePolkaDotFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBClosingFilter.h b/framework/Source/GPUImageRGBClosingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBClosingFilter.m b/framework/Source/GPUImageRGBClosingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBDilationFilter.h b/framework/Source/GPUImageRGBDilationFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBDilationFilter.m b/framework/Source/GPUImageRGBDilationFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBErosionFilter.h b/framework/Source/GPUImageRGBErosionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBErosionFilter.m b/framework/Source/GPUImageRGBErosionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBOpeningFilter.h b/framework/Source/GPUImageRGBOpeningFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBOpeningFilter.m b/framework/Source/GPUImageRGBOpeningFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.h b/framework/Source/GPUImageSingleComponentFastBlurFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.m b/framework/Source/GPUImageSingleComponentFastBlurFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSolidColorGenerator.h b/framework/Source/GPUImageSolidColorGenerator.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSourceOverBlendFilter.h b/framework/Source/GPUImageSourceOverBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSourceOverBlendFilter.m b/framework/Source/GPUImageSourceOverBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSphereRefractionFilter.h b/framework/Source/GPUImageSphereRefractionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdSketchFilter.h b/framework/Source/GPUImageThresholdSketchFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdSketchFilter.m b/framework/Source/GPUImageThresholdSketchFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.h b/framework/Source/GPUImageTwoPassTextureSamplingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageUIElement.h b/framework/Source/GPUImageUIElement.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoroniConsumerFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoroniConsumerFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.h b/framework/Source/GPUImageWeakPixelInclusionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.m b/framework/Source/GPUImageWeakPixelInclusionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageWhiteBalanceFilter.h b/framework/Source/GPUImageWhiteBalanceFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageWhiteBalanceFilter.m b/framework/Source/GPUImageWhiteBalanceFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m old mode 100644 new mode 100755 From 18213765a86d78073ad7628a1082904eb10bde13 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Fri, 9 Nov 2012 17:28:40 -0700 Subject: [PATCH 269/695] Revert "?" This reverts commit 41dd71f204e9d366c0f0e45fd8758b31696f2841. --- .../Source/GPUImage3x3TextureSamplingFilter.h | 0 .../Source/GPUImage3x3TextureSamplingFilter.m | 0 framework/Source/GPUImageAddBlendFilter.h | 0 framework/Source/GPUImageAddBlendFilter.m | 0 framework/Source/GPUImageAverageColor.h | 0 framework/Source/GPUImageAverageColor.m | 0 .../GPUImageAverageLuminanceThresholdFilter.h | 0 .../GPUImageAverageLuminanceThresholdFilter.m | 0 framework/Source/GPUImageBilateralFilter.h | 0 framework/Source/GPUImageBilateralFilter.m | 0 framework/Source/GPUImageBuffer.h | 0 framework/Source/GPUImageBuffer.m | 0 .../Source/GPUImageBulgeDistortionFilter.h | 2 +- .../Source/GPUImageBulgeDistortionFilter.m | 53 +++---------------- framework/Source/GPUImageChromaKeyFilter.m | 0 framework/Source/GPUImageClosingFilter.h | 0 framework/Source/GPUImageClosingFilter.m | 0 framework/Source/GPUImageColorPackingFilter.h | 0 framework/Source/GPUImageColorPackingFilter.m | 0 framework/Source/GPUImageCrosshairGenerator.h | 0 framework/Source/GPUImageCrosshairGenerator.m | 0 framework/Source/GPUImageDarkenBlendFilter.m | 0 framework/Source/GPUImageDilationFilter.h | 0 framework/Source/GPUImageDilationFilter.m | 0 ...geDirectionalNonMaximumSuppressionFilter.h | 0 ...geDirectionalNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageDivideBlendFilter.h | 0 framework/Source/GPUImageDivideBlendFilter.m | 0 framework/Source/GPUImageErosionFilter.h | 0 framework/Source/GPUImageErosionFilter.m | 0 framework/Source/GPUImageFalseColorFilter.h | 0 framework/Source/GPUImageFalseColorFilter.m | 0 framework/Source/GPUImageGlassSphereFilter.h | 0 framework/Source/GPUImageGlassSphereFilter.m | 0 framework/Source/GPUImageHalftoneFilter.h | 0 framework/Source/GPUImageHalftoneFilter.m | 0 framework/Source/GPUImageHighPassFilter.h | 0 framework/Source/GPUImageHighPassFilter.m | 0 .../Source/GPUImageHighlightShadowFilter.h | 0 .../Source/GPUImageHighlightShadowFilter.m | 0 .../GPUImageHoughTransformLineDetector.h | 0 .../GPUImageHoughTransformLineDetector.m | 0 framework/Source/GPUImageHueFilter.h | 0 framework/Source/GPUImageHueFilter.m | 0 framework/Source/GPUImageJFAVoroniFilter.h | 0 framework/Source/GPUImageJFAVoroniFilter.m | 0 .../Source/GPUImageLanczosResamplingFilter.h | 0 .../Source/GPUImageLanczosResamplingFilter.m | 0 framework/Source/GPUImageLevelsFilter.h | 0 framework/Source/GPUImageLevelsFilter.m | 0 framework/Source/GPUImageLineGenerator.h | 0 framework/Source/GPUImageLineGenerator.m | 0 .../Source/GPUImageLocalBinaryPatternFilter.h | 0 .../Source/GPUImageLocalBinaryPatternFilter.m | 0 framework/Source/GPUImageLookupFilter.h | 0 framework/Source/GPUImageLookupFilter.m | 0 framework/Source/GPUImageLowPassFilter.h | 0 framework/Source/GPUImageLowPassFilter.m | 0 framework/Source/GPUImageLuminosity.h | 0 framework/Source/GPUImageLuminosity.m | 0 framework/Source/GPUImageMedianFilter.h | 0 framework/Source/GPUImageMedianFilter.m | 0 framework/Source/GPUImageMonochromeFilter.h | 0 framework/Source/GPUImageMonochromeFilter.m | 0 framework/Source/GPUImageMosaicFilter.h | 0 framework/Source/GPUImageMosaicFilter.m | 0 framework/Source/GPUImageMotionDetector.h | 0 framework/Source/GPUImageMotionDetector.m | 0 .../GPUImageNobleCornerDetectionFilter.h | 0 .../GPUImageNobleCornerDetectionFilter.m | 0 .../GPUImageNonMaximumSuppressionFilter.h | 0 .../GPUImageNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageNormalBlendFilter.h | 0 framework/Source/GPUImageNormalBlendFilter.m | 0 framework/Source/GPUImageOpacityFilter.h | 0 framework/Source/GPUImageOpacityFilter.m | 0 framework/Source/GPUImageOpeningFilter.h | 0 framework/Source/GPUImageOpeningFilter.m | 0 ...ageParallelCoordinateLineTransformFilter.h | 0 ...ageParallelCoordinateLineTransformFilter.m | 0 framework/Source/GPUImagePerlinNoiseFilter.h | 0 framework/Source/GPUImagePerlinNoiseFilter.m | 0 framework/Source/GPUImagePicture.m | 6 +-- framework/Source/GPUImagePixellateFilter.m | 7 +-- framework/Source/GPUImagePolkaDotFilter.h | 0 framework/Source/GPUImagePolkaDotFilter.m | 0 framework/Source/GPUImageRGBClosingFilter.h | 0 framework/Source/GPUImageRGBClosingFilter.m | 0 framework/Source/GPUImageRGBDilationFilter.h | 0 framework/Source/GPUImageRGBDilationFilter.m | 0 framework/Source/GPUImageRGBErosionFilter.h | 0 framework/Source/GPUImageRGBErosionFilter.m | 0 framework/Source/GPUImageRGBOpeningFilter.h | 0 framework/Source/GPUImageRGBOpeningFilter.m | 0 framework/Source/GPUImageRawDataInput.h | 0 framework/Source/GPUImageRawDataInput.m | 0 .../GPUImageShiTomasiFeatureDetectionFilter.h | 0 .../GPUImageShiTomasiFeatureDetectionFilter.m | 0 .../GPUImageSingleComponentFastBlurFilter.h | 0 .../GPUImageSingleComponentFastBlurFilter.m | 0 ...PUImageSingleComponentGaussianBlurFilter.h | 0 ...PUImageSingleComponentGaussianBlurFilter.m | 0 .../Source/GPUImageSolidColorGenerator.h | 0 .../Source/GPUImageSolidColorGenerator.m | 0 .../Source/GPUImageSourceOverBlendFilter.h | 0 .../Source/GPUImageSourceOverBlendFilter.m | 0 .../Source/GPUImageSphereRefractionFilter.h | 0 .../Source/GPUImageSphereRefractionFilter.m | 0 .../Source/GPUImageThresholdSketchFilter.h | 0 .../Source/GPUImageThresholdSketchFilter.m | 0 ...geThresholdedNonMaximumSuppressionFilter.h | 0 ...geThresholdedNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageToneCurveFilter.m | 0 framework/Source/GPUImageTwoInputFilter.h | 0 framework/Source/GPUImageTwoInputFilter.m | 0 .../GPUImageTwoPassTextureSamplingFilter.h | 0 .../GPUImageTwoPassTextureSamplingFilter.m | 0 framework/Source/GPUImageUIElement.h | 0 framework/Source/GPUImageUIElement.m | 0 .../Source/GPUImageVoroniConsumerFilter.h | 0 .../Source/GPUImageVoroniConsumerFilter.m | 0 .../Source/GPUImageWeakPixelInclusionFilter.h | 0 .../Source/GPUImageWeakPixelInclusionFilter.m | 0 framework/Source/GPUImageWhiteBalanceFilter.h | 0 framework/Source/GPUImageWhiteBalanceFilter.m | 0 ...imageDirectionalSobelEdgeDetectionFilter.h | 0 ...imageDirectionalSobelEdgeDetectionFilter.m | 0 127 files changed, 14 insertions(+), 54 deletions(-) mode change 100755 => 100644 framework/Source/GPUImage3x3TextureSamplingFilter.h mode change 100755 => 100644 framework/Source/GPUImage3x3TextureSamplingFilter.m mode change 100755 => 100644 framework/Source/GPUImageAddBlendFilter.h mode change 100755 => 100644 framework/Source/GPUImageAddBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageAverageColor.h mode change 100755 => 100644 framework/Source/GPUImageAverageColor.m mode change 100755 => 100644 framework/Source/GPUImageAverageLuminanceThresholdFilter.h mode change 100755 => 100644 framework/Source/GPUImageAverageLuminanceThresholdFilter.m mode change 100755 => 100644 framework/Source/GPUImageBilateralFilter.h mode change 100755 => 100644 framework/Source/GPUImageBilateralFilter.m mode change 100755 => 100644 framework/Source/GPUImageBuffer.h mode change 100755 => 100644 framework/Source/GPUImageBuffer.m mode change 100755 => 100644 framework/Source/GPUImageChromaKeyFilter.m mode change 100755 => 100644 framework/Source/GPUImageClosingFilter.h mode change 100755 => 100644 framework/Source/GPUImageClosingFilter.m mode change 100755 => 100644 framework/Source/GPUImageColorPackingFilter.h mode change 100755 => 100644 framework/Source/GPUImageColorPackingFilter.m mode change 100755 => 100644 framework/Source/GPUImageCrosshairGenerator.h mode change 100755 => 100644 framework/Source/GPUImageCrosshairGenerator.m mode change 100755 => 100644 framework/Source/GPUImageDarkenBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageDilationFilter.h mode change 100755 => 100644 framework/Source/GPUImageDilationFilter.m mode change 100755 => 100644 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h mode change 100755 => 100644 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m mode change 100755 => 100644 framework/Source/GPUImageDivideBlendFilter.h mode change 100755 => 100644 framework/Source/GPUImageDivideBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageErosionFilter.h mode change 100755 => 100644 framework/Source/GPUImageErosionFilter.m mode change 100755 => 100644 framework/Source/GPUImageFalseColorFilter.h mode change 100755 => 100644 framework/Source/GPUImageFalseColorFilter.m mode change 100755 => 100644 framework/Source/GPUImageGlassSphereFilter.h mode change 100755 => 100644 framework/Source/GPUImageGlassSphereFilter.m mode change 100755 => 100644 framework/Source/GPUImageHalftoneFilter.h mode change 100755 => 100644 framework/Source/GPUImageHalftoneFilter.m mode change 100755 => 100644 framework/Source/GPUImageHighPassFilter.h mode change 100755 => 100644 framework/Source/GPUImageHighPassFilter.m mode change 100755 => 100644 framework/Source/GPUImageHighlightShadowFilter.h mode change 100755 => 100644 framework/Source/GPUImageHighlightShadowFilter.m mode change 100755 => 100644 framework/Source/GPUImageHoughTransformLineDetector.h mode change 100755 => 100644 framework/Source/GPUImageHoughTransformLineDetector.m mode change 100755 => 100644 framework/Source/GPUImageHueFilter.h mode change 100755 => 100644 framework/Source/GPUImageHueFilter.m mode change 100755 => 100644 framework/Source/GPUImageJFAVoroniFilter.h mode change 100755 => 100644 framework/Source/GPUImageJFAVoroniFilter.m mode change 100755 => 100644 framework/Source/GPUImageLanczosResamplingFilter.h mode change 100755 => 100644 framework/Source/GPUImageLanczosResamplingFilter.m mode change 100755 => 100644 framework/Source/GPUImageLevelsFilter.h mode change 100755 => 100644 framework/Source/GPUImageLevelsFilter.m mode change 100755 => 100644 framework/Source/GPUImageLineGenerator.h mode change 100755 => 100644 framework/Source/GPUImageLineGenerator.m mode change 100755 => 100644 framework/Source/GPUImageLocalBinaryPatternFilter.h mode change 100755 => 100644 framework/Source/GPUImageLocalBinaryPatternFilter.m mode change 100755 => 100644 framework/Source/GPUImageLookupFilter.h mode change 100755 => 100644 framework/Source/GPUImageLookupFilter.m mode change 100755 => 100644 framework/Source/GPUImageLowPassFilter.h mode change 100755 => 100644 framework/Source/GPUImageLowPassFilter.m mode change 100755 => 100644 framework/Source/GPUImageLuminosity.h mode change 100755 => 100644 framework/Source/GPUImageLuminosity.m mode change 100755 => 100644 framework/Source/GPUImageMedianFilter.h mode change 100755 => 100644 framework/Source/GPUImageMedianFilter.m mode change 100755 => 100644 framework/Source/GPUImageMonochromeFilter.h mode change 100755 => 100644 framework/Source/GPUImageMonochromeFilter.m mode change 100755 => 100644 framework/Source/GPUImageMosaicFilter.h mode change 100755 => 100644 framework/Source/GPUImageMosaicFilter.m mode change 100755 => 100644 framework/Source/GPUImageMotionDetector.h mode change 100755 => 100644 framework/Source/GPUImageMotionDetector.m mode change 100755 => 100644 framework/Source/GPUImageNobleCornerDetectionFilter.h mode change 100755 => 100644 framework/Source/GPUImageNobleCornerDetectionFilter.m mode change 100755 => 100644 framework/Source/GPUImageNonMaximumSuppressionFilter.h mode change 100755 => 100644 framework/Source/GPUImageNonMaximumSuppressionFilter.m mode change 100755 => 100644 framework/Source/GPUImageNormalBlendFilter.h mode change 100755 => 100644 framework/Source/GPUImageNormalBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageOpacityFilter.h mode change 100755 => 100644 framework/Source/GPUImageOpacityFilter.m mode change 100755 => 100644 framework/Source/GPUImageOpeningFilter.h mode change 100755 => 100644 framework/Source/GPUImageOpeningFilter.m mode change 100755 => 100644 framework/Source/GPUImageParallelCoordinateLineTransformFilter.h mode change 100755 => 100644 framework/Source/GPUImageParallelCoordinateLineTransformFilter.m mode change 100755 => 100644 framework/Source/GPUImagePerlinNoiseFilter.h mode change 100755 => 100644 framework/Source/GPUImagePerlinNoiseFilter.m mode change 100755 => 100644 framework/Source/GPUImagePolkaDotFilter.h mode change 100755 => 100644 framework/Source/GPUImagePolkaDotFilter.m mode change 100755 => 100644 framework/Source/GPUImageRGBClosingFilter.h mode change 100755 => 100644 framework/Source/GPUImageRGBClosingFilter.m mode change 100755 => 100644 framework/Source/GPUImageRGBDilationFilter.h mode change 100755 => 100644 framework/Source/GPUImageRGBDilationFilter.m mode change 100755 => 100644 framework/Source/GPUImageRGBErosionFilter.h mode change 100755 => 100644 framework/Source/GPUImageRGBErosionFilter.m mode change 100755 => 100644 framework/Source/GPUImageRGBOpeningFilter.h mode change 100755 => 100644 framework/Source/GPUImageRGBOpeningFilter.m mode change 100755 => 100644 framework/Source/GPUImageRawDataInput.h mode change 100755 => 100644 framework/Source/GPUImageRawDataInput.m mode change 100755 => 100644 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h mode change 100755 => 100644 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m mode change 100755 => 100644 framework/Source/GPUImageSingleComponentFastBlurFilter.h mode change 100755 => 100644 framework/Source/GPUImageSingleComponentFastBlurFilter.m mode change 100755 => 100644 framework/Source/GPUImageSingleComponentGaussianBlurFilter.h mode change 100755 => 100644 framework/Source/GPUImageSingleComponentGaussianBlurFilter.m mode change 100755 => 100644 framework/Source/GPUImageSolidColorGenerator.h mode change 100755 => 100644 framework/Source/GPUImageSolidColorGenerator.m mode change 100755 => 100644 framework/Source/GPUImageSourceOverBlendFilter.h mode change 100755 => 100644 framework/Source/GPUImageSourceOverBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageSphereRefractionFilter.h mode change 100755 => 100644 framework/Source/GPUImageSphereRefractionFilter.m mode change 100755 => 100644 framework/Source/GPUImageThresholdSketchFilter.h mode change 100755 => 100644 framework/Source/GPUImageThresholdSketchFilter.m mode change 100755 => 100644 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h mode change 100755 => 100644 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m mode change 100755 => 100644 framework/Source/GPUImageToneCurveFilter.m mode change 100755 => 100644 framework/Source/GPUImageTwoInputFilter.h mode change 100755 => 100644 framework/Source/GPUImageTwoInputFilter.m mode change 100755 => 100644 framework/Source/GPUImageTwoPassTextureSamplingFilter.h mode change 100755 => 100644 framework/Source/GPUImageTwoPassTextureSamplingFilter.m mode change 100755 => 100644 framework/Source/GPUImageUIElement.h mode change 100755 => 100644 framework/Source/GPUImageUIElement.m mode change 100755 => 100644 framework/Source/GPUImageVoroniConsumerFilter.h mode change 100755 => 100644 framework/Source/GPUImageVoroniConsumerFilter.m mode change 100755 => 100644 framework/Source/GPUImageWeakPixelInclusionFilter.h mode change 100755 => 100644 framework/Source/GPUImageWeakPixelInclusionFilter.m mode change 100755 => 100644 framework/Source/GPUImageWhiteBalanceFilter.h mode change 100755 => 100644 framework/Source/GPUImageWhiteBalanceFilter.m mode change 100755 => 100644 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h mode change 100755 => 100644 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.h b/framework/Source/GPUImage3x3TextureSamplingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAddBlendFilter.h b/framework/Source/GPUImageAddBlendFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAddBlendFilter.m b/framework/Source/GPUImageAddBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAverageColor.h b/framework/Source/GPUImageAverageColor.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.h b/framework/Source/GPUImageAverageLuminanceThresholdFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.m b/framework/Source/GPUImageAverageLuminanceThresholdFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageBilateralFilter.h b/framework/Source/GPUImageBilateralFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageBuffer.h b/framework/Source/GPUImageBuffer.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageBulgeDistortionFilter.h b/framework/Source/GPUImageBulgeDistortionFilter.h index d416e536f..0ba06f936 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.h +++ b/framework/Source/GPUImageBulgeDistortionFilter.h @@ -3,7 +3,7 @@ /// Creates a bulge distortion on the image @interface GPUImageBulgeDistortionFilter : GPUImageFilter { - GLint aspectRatioUniform, radiusUniform, centerUniform, scaleUniform; + GLint radiusUniform, centerUniform, scaleUniform; } /// The center about which to apply the distortion, with a default of (0.5, 0.5) diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index aa7ed6d38..2bb2da86f 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -6,44 +6,31 @@ uniform sampler2D inputImageTexture; - uniform highp float aspectRatio; uniform highp vec2 center; uniform highp float radius; uniform highp float scale; void main() { - highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); - highp float dist = distance(center, textureCoordinateToUse); - textureCoordinateToUse = textureCoordinate; - + highp vec2 textureCoordinateToUse = textureCoordinate; + highp float dist = distance(center, textureCoordinate); + textureCoordinateToUse -= center; if (dist < radius) { - textureCoordinateToUse -= center; highp float percent = 1.0 - ((radius - dist) / radius) * scale; percent = percent * percent; textureCoordinateToUse = textureCoordinateToUse * percent; - textureCoordinateToUse += center; - - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); - } - else - { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); } + textureCoordinateToUse += center; + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + } ); -@interface GPUImageBulgeDistortionFilter () - -@property (readwrite, nonatomic) CGFloat aspectRatio; - -@end - @implementation GPUImageBulgeDistortionFilter -@synthesize aspectRatio = _aspectRatio; @synthesize center = _center; @synthesize radius = _radius; @synthesize scale = _scale; @@ -58,7 +45,6 @@ - (id)init; return nil; } - aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; radiusUniform = [filterProgram uniformIndex:@"radius"]; scaleUniform = [filterProgram uniformIndex:@"scale"]; centerUniform = [filterProgram uniformIndex:@"center"]; @@ -73,31 +59,6 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; -{ - CGSize oldInputSize = inputTextureSize; - [super setInputSize:newSize atIndex:textureIndex]; - - if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) - { - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; - } - else - { - [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; - } - } -} - -- (void)setAspectRatio:(CGFloat)newValue; -{ - _aspectRatio = newValue; - - [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; -} - - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; { [super setInputRotation:newInputRotation atIndex:textureIndex]; diff --git a/framework/Source/GPUImageChromaKeyFilter.m b/framework/Source/GPUImageChromaKeyFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageClosingFilter.h b/framework/Source/GPUImageClosingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageClosingFilter.m b/framework/Source/GPUImageClosingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageColorPackingFilter.h b/framework/Source/GPUImageColorPackingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageCrosshairGenerator.h b/framework/Source/GPUImageCrosshairGenerator.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDarkenBlendFilter.m b/framework/Source/GPUImageDarkenBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDilationFilter.h b/framework/Source/GPUImageDilationFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDilationFilter.m b/framework/Source/GPUImageDilationFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDivideBlendFilter.h b/framework/Source/GPUImageDivideBlendFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDivideBlendFilter.m b/framework/Source/GPUImageDivideBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageErosionFilter.h b/framework/Source/GPUImageErosionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageErosionFilter.m b/framework/Source/GPUImageErosionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageFalseColorFilter.h b/framework/Source/GPUImageFalseColorFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageGlassSphereFilter.h b/framework/Source/GPUImageGlassSphereFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageGlassSphereFilter.m b/framework/Source/GPUImageGlassSphereFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHalftoneFilter.h b/framework/Source/GPUImageHalftoneFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHalftoneFilter.m b/framework/Source/GPUImageHalftoneFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHighPassFilter.h b/framework/Source/GPUImageHighPassFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHighPassFilter.m b/framework/Source/GPUImageHighPassFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHighlightShadowFilter.h b/framework/Source/GPUImageHighlightShadowFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHighlightShadowFilter.m b/framework/Source/GPUImageHighlightShadowFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHoughTransformLineDetector.h b/framework/Source/GPUImageHoughTransformLineDetector.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHueFilter.h b/framework/Source/GPUImageHueFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageJFAVoroniFilter.h b/framework/Source/GPUImageJFAVoroniFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLanczosResamplingFilter.h b/framework/Source/GPUImageLanczosResamplingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLevelsFilter.h b/framework/Source/GPUImageLevelsFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLineGenerator.h b/framework/Source/GPUImageLineGenerator.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.h b/framework/Source/GPUImageLocalBinaryPatternFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.m b/framework/Source/GPUImageLocalBinaryPatternFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLookupFilter.h b/framework/Source/GPUImageLookupFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLookupFilter.m b/framework/Source/GPUImageLookupFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLowPassFilter.h b/framework/Source/GPUImageLowPassFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLowPassFilter.m b/framework/Source/GPUImageLowPassFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLuminosity.h b/framework/Source/GPUImageLuminosity.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMedianFilter.h b/framework/Source/GPUImageMedianFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMedianFilter.m b/framework/Source/GPUImageMedianFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMonochromeFilter.h b/framework/Source/GPUImageMonochromeFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMotionDetector.h b/framework/Source/GPUImageMotionDetector.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMotionDetector.m b/framework/Source/GPUImageMotionDetector.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.h b/framework/Source/GPUImageNobleCornerDetectionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.m b/framework/Source/GPUImageNobleCornerDetectionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.h b/framework/Source/GPUImageNonMaximumSuppressionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNormalBlendFilter.h b/framework/Source/GPUImageNormalBlendFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOpacityFilter.h b/framework/Source/GPUImageOpacityFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOpacityFilter.m b/framework/Source/GPUImageOpacityFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOpeningFilter.h b/framework/Source/GPUImageOpeningFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOpeningFilter.m b/framework/Source/GPUImageOpeningFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImagePerlinNoiseFilter.h b/framework/Source/GPUImagePerlinNoiseFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index e60302b67..6858034c6 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -81,10 +81,6 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef imageContext = CGBitmapContextCreate(imageData, (size_t)pixelSizeToUseForTexture.width, (size_t)pixelSizeToUseForTexture.height, 8, (size_t)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); - if (imageContext == NULL) - { - NSLog(@"Empty GPUImage Context"); - } // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), newImageSource); CGContextRelease(imageContext); @@ -115,7 +111,9 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; + [self initializeOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, outputTexture); if (self.shouldSmoothlyScaleOutput) { diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index a1235c367..ec87fadb3 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -18,18 +18,19 @@ void main() // // gl_FragColor = texture2D(inputImageTexture, samplePos ); - highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); - highp float dist = distance(pixelateCenter, textureCoordinateToUse); + highp vec2 textureCoordinateToUse = textureCoordinate; + highp float dist = distance(pixelateCenter, textureCoordinate); if (dist < pixelateRadius) { + textureCoordinateToUse += pixelateCenter; highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; gl_FragColor = texture2D(inputImageTexture, samplePos ); } else { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); } } ); diff --git a/framework/Source/GPUImagePolkaDotFilter.h b/framework/Source/GPUImagePolkaDotFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBClosingFilter.h b/framework/Source/GPUImageRGBClosingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBClosingFilter.m b/framework/Source/GPUImageRGBClosingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBDilationFilter.h b/framework/Source/GPUImageRGBDilationFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBDilationFilter.m b/framework/Source/GPUImageRGBDilationFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBErosionFilter.h b/framework/Source/GPUImageRGBErosionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBErosionFilter.m b/framework/Source/GPUImageRGBErosionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBOpeningFilter.h b/framework/Source/GPUImageRGBOpeningFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBOpeningFilter.m b/framework/Source/GPUImageRGBOpeningFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.h b/framework/Source/GPUImageSingleComponentFastBlurFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.m b/framework/Source/GPUImageSingleComponentFastBlurFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSolidColorGenerator.h b/framework/Source/GPUImageSolidColorGenerator.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSourceOverBlendFilter.h b/framework/Source/GPUImageSourceOverBlendFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSourceOverBlendFilter.m b/framework/Source/GPUImageSourceOverBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSphereRefractionFilter.h b/framework/Source/GPUImageSphereRefractionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageThresholdSketchFilter.h b/framework/Source/GPUImageThresholdSketchFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageThresholdSketchFilter.m b/framework/Source/GPUImageThresholdSketchFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.h b/framework/Source/GPUImageTwoPassTextureSamplingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageUIElement.h b/framework/Source/GPUImageUIElement.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoroniConsumerFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoroniConsumerFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.h b/framework/Source/GPUImageWeakPixelInclusionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.m b/framework/Source/GPUImageWeakPixelInclusionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageWhiteBalanceFilter.h b/framework/Source/GPUImageWhiteBalanceFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageWhiteBalanceFilter.m b/framework/Source/GPUImageWhiteBalanceFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m old mode 100755 new mode 100644 From 6f51dcf204c95d858e415d3842f1ec69a91997f9 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 10 Nov 2012 08:45:03 -0700 Subject: [PATCH 270/695] Workaround for black pixels with text coordinates along borders --- .../Source/GPUImageBulgeDistortionFilter.h | 2 +- .../Source/GPUImageBulgeDistortionFilter.m | 55 ++++++++++++++++--- framework/Source/GPUImageSwirlFilter.m | 6 +- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/framework/Source/GPUImageBulgeDistortionFilter.h b/framework/Source/GPUImageBulgeDistortionFilter.h index 0ba06f936..d416e536f 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.h +++ b/framework/Source/GPUImageBulgeDistortionFilter.h @@ -3,7 +3,7 @@ /// Creates a bulge distortion on the image @interface GPUImageBulgeDistortionFilter : GPUImageFilter { - GLint radiusUniform, centerUniform, scaleUniform; + GLint aspectRatioUniform, radiusUniform, centerUniform, scaleUniform; } /// The center about which to apply the distortion, with a default of (0.5, 0.5) diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index 2bb2da86f..fba4e9af6 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -6,31 +6,46 @@ uniform sampler2D inputImageTexture; + uniform highp float aspectRatio; uniform highp vec2 center; uniform highp float radius; uniform highp float scale; void main() { - highp vec2 textureCoordinateToUse = textureCoordinate; - highp float dist = distance(center, textureCoordinate); - textureCoordinateToUse -= center; + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(center, textureCoordinateToUse); + textureCoordinateToUse = textureCoordinate; + if (dist < radius) { + textureCoordinateToUse -= center; highp float percent = 1.0 - ((radius - dist) / radius) * scale; percent = percent * percent; textureCoordinateToUse = textureCoordinateToUse * percent; + textureCoordinateToUse += center; + textureCoordinateToUse.x = clamp(textureCoordinateToUse.x, 0.01, 0.99); + textureCoordinateToUse.y = clamp(textureCoordinateToUse.y, 0.01, 0.99); + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); } - textureCoordinateToUse += center; - - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); - } ); +@interface GPUImageBulgeDistortionFilter () + +@property (readwrite, nonatomic) CGFloat aspectRatio; + +@end + @implementation GPUImageBulgeDistortionFilter +@synthesize aspectRatio = _aspectRatio; @synthesize center = _center; @synthesize radius = _radius; @synthesize scale = _scale; @@ -45,6 +60,7 @@ - (id)init; return nil; } + aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; radiusUniform = [filterProgram uniformIndex:@"radius"]; scaleUniform = [filterProgram uniformIndex:@"scale"]; centerUniform = [filterProgram uniformIndex:@"center"]; @@ -59,6 +75,31 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) + { + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } + } +} + +- (void)setAspectRatio:(CGFloat)newValue; +{ + _aspectRatio = newValue; + + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; +} + - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; { [super setInputRotation:newInputRotation atIndex:textureIndex]; diff --git a/framework/Source/GPUImageSwirlFilter.m b/framework/Source/GPUImageSwirlFilter.m index 6004a85b3..8b973b73c 100755 --- a/framework/Source/GPUImageSwirlFilter.m +++ b/framework/Source/GPUImageSwirlFilter.m @@ -16,16 +16,18 @@ void main() { highp vec2 textureCoordinateToUse = textureCoordinate; highp float dist = distance(center, textureCoordinate); - textureCoordinateToUse -= center; if (dist < radius) { + textureCoordinateToUse -= center; highp float percent = (radius - dist) / radius; highp float theta = percent * percent * angle * 8.0; highp float s = sin(theta); highp float c = cos(theta); textureCoordinateToUse = vec2(dot(textureCoordinateToUse, vec2(c, -s)), dot(textureCoordinateToUse, vec2(s, c))); + textureCoordinateToUse += center; + textureCoordinateToUse.x = clamp(textureCoordinateToUse.x, 0.01, 0.99); + textureCoordinateToUse.y = clamp(textureCoordinateToUse.y, 0.01, 0.99); } - textureCoordinateToUse += center; gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); From 00a0af51740646bd28589a6b400805e8b0e08f1f Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 10 Nov 2012 08:46:28 -0700 Subject: [PATCH 271/695] Revert "Fix aspect ratio for bulge distortion filter" This reverts commit c942cb9b90221d22ec572529c2b73ffe3aa533fe. --- framework/Source/GPUImageChromaKeyFilter.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 framework/Source/GPUImageChromaKeyFilter.h diff --git a/framework/Source/GPUImageChromaKeyFilter.h b/framework/Source/GPUImageChromaKeyFilter.h old mode 100755 new mode 100644 From ffa5d13f3fa096271ace4abe449429fa9d04bac5 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 10 Nov 2012 11:51:15 -0700 Subject: [PATCH 272/695] Rollback manual clamping, change pixellate filter to use two paths depending on defaults --- .../Source/GPUImageBulgeDistortionFilter.m | 2 -- framework/Source/GPUImagePixellateFilter.h | 4 +-- framework/Source/GPUImagePixellateFilter.m | 26 +++++++++++-------- framework/Source/GPUImageSwirlFilter.m | 2 -- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index fba4e9af6..aa7ed6d38 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -25,8 +25,6 @@ void main() textureCoordinateToUse = textureCoordinateToUse * percent; textureCoordinateToUse += center; - textureCoordinateToUse.x = clamp(textureCoordinateToUse.x, 0.01, 0.99); - textureCoordinateToUse.y = clamp(textureCoordinateToUse.y, 0.01, 0.99); gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); } diff --git a/framework/Source/GPUImagePixellateFilter.h b/framework/Source/GPUImagePixellateFilter.h index 60482a828..b21678c9f 100755 --- a/framework/Source/GPUImagePixellateFilter.h +++ b/framework/Source/GPUImagePixellateFilter.h @@ -8,10 +8,10 @@ // The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored. @property(readwrite, nonatomic) CGFloat fractionalWidthOfAPixel; -// the center point to start pixelation in texture coordinates +// the center point to start pixelation in texture coordinates, default 0.5, 0.5 @property(readwrite, nonatomic) CGPoint center; -// the radius (0.0 - 1.0) in which to pixelate +// the radius (0.0 - 1.0) in which to pixelate, default 1.0 @property(readwrite, nonatomic) CGFloat radius; @end diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index ec87fadb3..f400fdfce 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -13,24 +13,28 @@ void main() { -// highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); -// highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; -// -// gl_FragColor = texture2D(inputImageTexture, samplePos ); - - highp vec2 textureCoordinateToUse = textureCoordinate; - highp float dist = distance(pixelateCenter, textureCoordinate); - - if (dist < pixelateRadius) + if (pixelateCenter.x == 0.5 && pixelateCenter.y == 0.5 && pixelateRadius == 1.0) { - textureCoordinateToUse += pixelateCenter; highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + gl_FragColor = texture2D(inputImageTexture, samplePos ); } else { - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(pixelateCenter, textureCoordinateToUse); + + if (dist < pixelateRadius) + { + highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + gl_FragColor = texture2D(inputImageTexture, samplePos ); + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); + } } } ); diff --git a/framework/Source/GPUImageSwirlFilter.m b/framework/Source/GPUImageSwirlFilter.m index 8b973b73c..6fd55208e 100755 --- a/framework/Source/GPUImageSwirlFilter.m +++ b/framework/Source/GPUImageSwirlFilter.m @@ -25,8 +25,6 @@ void main() highp float c = cos(theta); textureCoordinateToUse = vec2(dot(textureCoordinateToUse, vec2(c, -s)), dot(textureCoordinateToUse, vec2(s, c))); textureCoordinateToUse += center; - textureCoordinateToUse.x = clamp(textureCoordinateToUse.x, 0.01, 0.99); - textureCoordinateToUse.y = clamp(textureCoordinateToUse.y, 0.01, 0.99); } gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); From be75d3d3306d34023958dc2b32a79540c775f823 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 10 Nov 2012 13:38:25 -0700 Subject: [PATCH 273/695] Fix aspect ratio --- .../Source/GPUImagePinchDistortionFilter.m | 56 ++++++++++++++++--- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/framework/Source/GPUImagePinchDistortionFilter.m b/framework/Source/GPUImagePinchDistortionFilter.m index 4f4a75fc9..99e99d045 100755 --- a/framework/Source/GPUImagePinchDistortionFilter.m +++ b/framework/Source/GPUImagePinchDistortionFilter.m @@ -6,30 +6,42 @@ uniform sampler2D inputImageTexture; + uniform highp float aspectRatio; uniform highp vec2 center; uniform highp float radius; uniform highp float scale; void main() { - highp vec2 textureCoordinateToUse = textureCoordinate; - highp float dist = distance(center, textureCoordinate); - textureCoordinateToUse -= center; + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(center, textureCoordinateToUse); + textureCoordinateToUse = textureCoordinate; + if (dist < radius) { + textureCoordinateToUse -= center; highp float percent = 1.0 + ((0.5 - dist) / 0.5) * scale; - textureCoordinateToUse = textureCoordinateToUse * percent; + textureCoordinateToUse += center; + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); } - textureCoordinateToUse += center; - - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); - - } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); + } +} ); +@interface GPUImagePinchDistortionFilter () + +@property (readwrite, nonatomic) CGFloat aspectRatio; + +@end + @implementation GPUImagePinchDistortionFilter +@synthesize aspectRatio = _aspectRatio; @synthesize center = _center; @synthesize radius = _radius; @synthesize scale = _scale; @@ -44,6 +56,7 @@ - (id)init; return nil; } + aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; radiusUniform = [filterProgram uniformIndex:@"radius"]; scaleUniform = [filterProgram uniformIndex:@"scale"]; centerUniform = [filterProgram uniformIndex:@"center"]; @@ -58,12 +71,37 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) + { + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } + } +} + - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; { [super setInputRotation:newInputRotation atIndex:textureIndex]; [self setCenter:self.center]; } +- (void)setAspectRatio:(CGFloat)newValue; +{ + _aspectRatio = newValue; + + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; +} + - (void)setRadius:(CGFloat)newValue; { _radius = newValue; From 8095484daf64db9546172eeeee0ab301ad9501d7 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 10 Nov 2012 14:41:28 -0700 Subject: [PATCH 274/695] Add aspectRatioUniform ivar --- framework/Source/GPUImagePinchDistortionFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImagePinchDistortionFilter.h b/framework/Source/GPUImagePinchDistortionFilter.h index 15bdd8b7c..994774fdc 100755 --- a/framework/Source/GPUImagePinchDistortionFilter.h +++ b/framework/Source/GPUImagePinchDistortionFilter.h @@ -4,7 +4,7 @@ */ @interface GPUImagePinchDistortionFilter : GPUImageFilter { - GLint radiusUniform, centerUniform, scaleUniform; + GLint aspectRatioUniform, radiusUniform, centerUniform, scaleUniform; } /** The center about which to apply the distortion, with a default of (0.5, 0.5) From 224938fcfa402d97ab2de18e060dc577c5863d85 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 11 Nov 2012 11:49:11 +1300 Subject: [PATCH 275/695] Bug fix: textureNoLongerNeededForTarget would release texture before all the initial filters in a filter group had used it This problem manifests when shooting photos (ie. the conserve memory is active) and operating a chain of filters (eg. camera -> sketch -> tilt shift) where there is a filter group with multiple input filters after another filter (as above). One of the filter group's initial filters would get an empty input texture as the texture would be released early. This is because the outputTextureRetainCount is based on number of targets. But a filter group target actually represents initialFilters filters (ie. possibly more than 1). This change proxies delegate callbacks to textureNoLongerNeededForTarget from initialFilters in a filter group, through the filter group so it can run its own "retain count", before telling the actual delegate to release the texture. I have tested this with a simple example of Camera -> Sketch -> TiltShift (which is a filter group). The problem appeared when you shoot a photo - the tilt shift would have the blurry bit intact but the in-focus part of the image would be black (as the texture was released). This problem is now corrected and the same number of textures are released (so they are still being released, just later). Signed-off-by: Karl von Randow --- framework/Source/GPUImageFilterGroup.m | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index e36ca9a1c..65c52fc2d 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -88,6 +88,8 @@ - (void)setFrameProcessingCompletionBlock:(void (^)(GPUImageOutput *, CMTime))fr - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [_initialFilters count]; + for (GPUImageOutput *currentFilter in _initialFilters) { if (currentFilter != self.inputFilterToIgnoreForUpdates) @@ -99,9 +101,11 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; { + firstTextureDelegate = newTextureDelegate; + for (GPUImageOutput *currentFilter in _initialFilters) { - [currentFilter setTextureDelegate:newTextureDelegate atIndex:textureIndex]; + [currentFilter setTextureDelegate:self atIndex:textureIndex]; } } @@ -185,4 +189,16 @@ - (void)conserveMemoryForNextFrame; } } +#pragma mark - +#pragma mark GPUImageTextureDelegate methods + +- (void)textureNoLongerNeededForTarget:(id)textureTarget; +{ + outputTextureRetainCount--; + if (outputTextureRetainCount < 1) + { + [firstTextureDelegate textureNoLongerNeededForTarget:self]; + } +} + @end From deef93f67270f2fa2a18c32ba8aac243f2a68d87 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 10 Nov 2012 16:29:34 -0700 Subject: [PATCH 276/695] Add synchronous version for processImage Use case: Filtering a picture in real time, then saving that filter to disk using the existing filter pipeline --- framework/Source/GPUImagePicture.h | 1 + framework/Source/GPUImagePicture.m | 77 ++++++++++++++++++++---------- 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 65444d1b6..b191a8506 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -18,6 +18,7 @@ // Image rendering - (void)processImage; +- (void)processImageSynchronously; - (CGSize)outputImageSize; @end diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 6858034c6..5bbdcb220 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -81,6 +81,10 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef imageContext = CGBitmapContextCreate(imageData, (size_t)pixelSizeToUseForTexture.width, (size_t)pixelSizeToUseForTexture.height, 8, (size_t)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + if (imageContext == NULL) + { + NSLog(@"Empty GPUImage Context"); + } // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), newImageSource); CGContextRelease(imageContext); @@ -111,9 +115,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; - [self initializeOutputTextureIfNeeded]; - glBindTexture(GL_TEXTURE_2D, outputTexture); if (self.shouldSmoothlyScaleOutput) { @@ -156,35 +158,62 @@ - (void)removeAllTargets; hasProcessedImage = NO; } -- (void)processImage; +- (void)processImageInternal { - hasProcessedImage = YES; - -// dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_FOREVER); + if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) + { + [self conserveMemoryForNextFrame]; + } + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; + } + + dispatch_semaphore_signal(imageUpdateSemaphore); +} +- (void)processImage:(BOOL)synchronously +{ + hasProcessedImage = YES; + + // dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_FOREVER); + if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) { return; } - - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ - - if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) - { - [self conserveMemoryForNextFrame]; - } - - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + if (synchronously) + { + dispatch_sync([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ - [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; - } - - dispatch_semaphore_signal(imageUpdateSemaphore); - }); + [self processImageInternal]; + + }); + } + else + { + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + + [self processImageInternal]; + + }); + } +} + +- (void)processImageSynchronously +{ + [self processImage:YES]; +} + +- (void)processImage; +{ + [self processImage:NO]; } - (CGSize)outputImageSize; From 94293c86478f86a1495210b6eadaf825caf24405 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 10 Nov 2012 22:42:08 -0700 Subject: [PATCH 277/695] Split out pixelate filter into new PixelatePositionFilter --- framework/Source/GPUImagePixellateFilter.h | 8 +- framework/Source/GPUImagePixellateFilter.m | 53 +------ .../Source/GPUImagePixellatePositionFilter.h | 17 +++ .../Source/GPUImagePixellatePositionFilter.m | 143 ++++++++++++++++++ 4 files changed, 167 insertions(+), 54 deletions(-) create mode 100755 framework/Source/GPUImagePixellatePositionFilter.h create mode 100755 framework/Source/GPUImagePixellatePositionFilter.m diff --git a/framework/Source/GPUImagePixellateFilter.h b/framework/Source/GPUImagePixellateFilter.h index b21678c9f..c101dd533 100755 --- a/framework/Source/GPUImagePixellateFilter.h +++ b/framework/Source/GPUImagePixellateFilter.h @@ -2,16 +2,10 @@ @interface GPUImagePixellateFilter : GPUImageFilter { - GLint fractionalWidthOfAPixelUniform, aspectRatioUniform, centerUniform, radiusUniform; + GLint fractionalWidthOfAPixelUniform, aspectRatioUniform; } // The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored. @property(readwrite, nonatomic) CGFloat fractionalWidthOfAPixel; -// the center point to start pixelation in texture coordinates, default 0.5, 0.5 -@property(readwrite, nonatomic) CGPoint center; - -// the radius (0.0 - 1.0) in which to pixelate, default 1.0 -@property(readwrite, nonatomic) CGFloat radius; - @end diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index f400fdfce..e68d464d7 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -8,34 +8,13 @@ uniform highp float fractionalWidthOfPixel; uniform highp float aspectRatio; - uniform lowp vec2 pixelateCenter; - uniform highp float pixelateRadius; - + void main() { - if (pixelateCenter.x == 0.5 && pixelateCenter.y == 0.5 && pixelateRadius == 1.0) - { - highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); - highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; - - gl_FragColor = texture2D(inputImageTexture, samplePos ); - } - else - { - highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); - highp float dist = distance(pixelateCenter, textureCoordinateToUse); - - if (dist < pixelateRadius) - { - highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); - highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; - gl_FragColor = texture2D(inputImageTexture, samplePos ); - } - else - { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); - } - } + highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + + highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + gl_FragColor = texture2D(inputImageTexture, samplePos ); } ); @@ -49,8 +28,6 @@ @implementation GPUImagePixellateFilter @synthesize fractionalWidthOfAPixel = _fractionalWidthOfAPixel; @synthesize aspectRatio = _aspectRatio; -@synthesize center = _center; -@synthesize radius = _radius; #pragma mark - #pragma mark Initialization and teardown @@ -74,12 +51,8 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; fractionalWidthOfAPixelUniform = [filterProgram uniformIndex:@"fractionalWidthOfPixel"]; aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; - centerUniform = [filterProgram uniformIndex:@"pixelateCenter"]; - radiusUniform = [filterProgram uniformIndex:@"pixelateRadius"]; - + self.fractionalWidthOfAPixel = 0.05; - self.center = CGPointMake(0.5f, 0.5f); - self.radius = 1.0f; return self; } @@ -136,18 +109,4 @@ - (void)setAspectRatio:(CGFloat)newValue; [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; } -- (void)setCenter:(CGPoint)center -{ - _center = center; - - [self setPoint:_center forUniform:centerUniform program:filterProgram]; -} - -- (void)setRadius:(CGFloat)radius -{ - _radius = radius; - - [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; -} - @end diff --git a/framework/Source/GPUImagePixellatePositionFilter.h b/framework/Source/GPUImagePixellatePositionFilter.h new file mode 100755 index 000000000..9d304c93e --- /dev/null +++ b/framework/Source/GPUImagePixellatePositionFilter.h @@ -0,0 +1,17 @@ +#import "GPUImageFilter.h" + +@interface GPUImagePixellatePositionFilter : GPUImageFilter +{ + GLint fractionalWidthOfAPixelUniform, aspectRatioUniform, centerUniform, radiusUniform; +} + +// The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored. +@property(readwrite, nonatomic) CGFloat fractionalWidthOfAPixel; + +// the center point to start pixelation in texture coordinates, default 0.5, 0.5 +@property(readwrite, nonatomic) CGPoint center; + +// the radius (0.0 - 1.0) in which to pixelate, default 1.0 +@property(readwrite, nonatomic) CGFloat radius; + +@end diff --git a/framework/Source/GPUImagePixellatePositionFilter.m b/framework/Source/GPUImagePixellatePositionFilter.m new file mode 100755 index 000000000..1238c48b7 --- /dev/null +++ b/framework/Source/GPUImagePixellatePositionFilter.m @@ -0,0 +1,143 @@ +#import "GPUImagePixellatePositionFilter.h" + +NSString *const kGPUImagePixellationFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform highp float fractionalWidthOfPixel; + uniform highp float aspectRatio; + uniform lowp vec2 pixelateCenter; + uniform highp float pixelateRadius; + + void main() + { + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(pixelateCenter, textureCoordinateToUse); + + if (dist < pixelateRadius) + { + highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + gl_FragColor = texture2D(inputImageTexture, samplePos ); + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); + } + } +); + +@interface GPUImagePixellatePositionFilter () + +@property (readwrite, nonatomic) CGFloat aspectRatio; + +@end + +@implementation GPUImagePixellatePositionFilter + +@synthesize fractionalWidthOfAPixel = _fractionalWidthOfAPixel; +@synthesize aspectRatio = _aspectRatio; +@synthesize center = _center; +@synthesize radius = _radius; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithFragmentShaderFromString:kGPUImagePixellationFragmentShaderString])) + { + return nil; + } + + return self; +} + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithFragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + fractionalWidthOfAPixelUniform = [filterProgram uniformIndex:@"fractionalWidthOfPixel"]; + aspectRatioUniform = [filterProgram uniformIndex:@"aspectRatio"]; + centerUniform = [filterProgram uniformIndex:@"pixelateCenter"]; + radiusUniform = [filterProgram uniformIndex:@"pixelateRadius"]; + + self.fractionalWidthOfAPixel = 0.05; + self.center = CGPointMake(0.5f, 0.5f); + self.radius = 1.0f; + + return self; +} + +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) + { + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } + } +} + +#pragma mark - +#pragma mark Accessors + +- (void)setFractionalWidthOfAPixel:(CGFloat)newValue; +{ + CGFloat singlePixelSpacing; + if (inputTextureSize.width != 0.0) + { + singlePixelSpacing = 1.0 / inputTextureSize.width; + } + else + { + singlePixelSpacing = 1.0 / 2048.0; + } + + if (newValue < singlePixelSpacing) + { + _fractionalWidthOfAPixel = singlePixelSpacing; + } + else + { + _fractionalWidthOfAPixel = newValue; + } + + [self setFloat:_fractionalWidthOfAPixel forUniform:fractionalWidthOfAPixelUniform program:filterProgram]; +} + +- (void)setAspectRatio:(CGFloat)newValue; +{ + _aspectRatio = newValue; + + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; +} + +- (void)setCenter:(CGPoint)center +{ + _center = center; + + [self setPoint:_center forUniform:centerUniform program:filterProgram]; +} + +- (void)setRadius:(CGFloat)radius +{ + _radius = radius; + + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; +} + +@end From 215532ac3fb39d867e0bef6b4f9ea2949bf8c163 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 10 Nov 2012 22:45:50 -0700 Subject: [PATCH 278/695] Fix compile warning --- framework/Source/GPUImagePixellatePositionFilter.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImagePixellatePositionFilter.m b/framework/Source/GPUImagePixellatePositionFilter.m index 1238c48b7..f7f8a52b0 100755 --- a/framework/Source/GPUImagePixellatePositionFilter.m +++ b/framework/Source/GPUImagePixellatePositionFilter.m @@ -1,6 +1,6 @@ #import "GPUImagePixellatePositionFilter.h" -NSString *const kGPUImagePixellationFragmentShaderString = SHADER_STRING +NSString *const kGPUImagePixellationPositionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -47,7 +47,7 @@ @implementation GPUImagePixellatePositionFilter - (id)init; { - if (!(self = [self initWithFragmentShaderFromString:kGPUImagePixellationFragmentShaderString])) + if (!(self = [self initWithFragmentShaderFromString:kGPUImagePixellationPositionFragmentShaderString])) { return nil; } From 6d6de1cdc730eddc1d67f8b4ab35af3c3820feed Mon Sep 17 00:00:00 2001 From: Lajos Kamocsay Date: Sun, 11 Nov 2012 10:18:07 -0500 Subject: [PATCH 279/695] added anchorTopLeft property to GPUImageTransformFilter --- framework/Source/GPUImageTransformFilter.h | 3 ++ framework/Source/GPUImageTransformFilter.m | 59 +++++++++++++++++++--- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/framework/Source/GPUImageTransformFilter.h b/framework/Source/GPUImageTransformFilter.h index 006289fe3..9865b8538 100755 --- a/framework/Source/GPUImageTransformFilter.h +++ b/framework/Source/GPUImageTransformFilter.h @@ -13,4 +13,7 @@ // This applies the transform to the raw frame data if set to YES, the default of NO takes the aspect ratio of the image input into account when rotating @property(readwrite, nonatomic) BOOL ignoreAspectRatio; +// sets the anchor point to top left corner +@property(readwrite, nonatomic) BOOL anchorTopLeft; + @end diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index 85c1cc292..d60274eaf 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -2,13 +2,13 @@ NSString *const kGPUImageTransformVertexShaderString = SHADER_STRING ( - attribute vec4 position; - attribute vec4 inputTextureCoordinate; + attribute highp vec4 position; + attribute highp vec4 inputTextureCoordinate; uniform mat4 transformMatrix; uniform mat4 orthographicMatrix; - varying vec2 textureCoordinate; + varying highp vec2 textureCoordinate; void main() { @@ -22,6 +22,7 @@ @implementation GPUImageTransformFilter @synthesize affineTransform; @synthesize transform3D = _transform3D; @synthesize ignoreAspectRatio = _ignoreAspectRatio; +@synthesize anchorTopLeft = _anchorTopLeft; #pragma mark - #pragma mark Initialization and teardown @@ -53,19 +54,27 @@ - (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)righ GLfloat ty = - (top + bottom) / (top - bottom); GLfloat tz = - (far + near) / (far - near); - matrix[0] = 2.0f / r_l; + float scale = 2.0f; + if (_anchorTopLeft) + { + scale = 4.0f; + tx=-1.0f; + ty=-1.0f; + } + + matrix[0] = scale / r_l; matrix[1] = 0.0f; matrix[2] = 0.0f; matrix[3] = tx; matrix[4] = 0.0f; - matrix[5] = 2.0f / t_b; + matrix[5] = scale / t_b; matrix[6] = 0.0f; matrix[7] = ty; matrix[8] = 0.0f; matrix[9] = 0.0f; - matrix[10] = 2.0f / f_n; + matrix[10] = scale / f_n; matrix[11] = tz; matrix[12] = 0.0f; @@ -155,13 +164,41 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; 1.0f, 1.0f, }; + GLfloat adjustedVerticesAnchorTL[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, normalizedHeight, + 1.0f, normalizedHeight, + }; + + static const GLfloat squareVerticesAnchorTL[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + if (_ignoreAspectRatio) { - [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + if (_anchorTopLeft) + { + [self renderToTextureWithVertices:squareVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + } + else + { + [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + } } else { - [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + if (_anchorTopLeft) + { + [self renderToTextureWithVertices:adjustedVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + } + else + { + [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + } } [self informTargetsAboutNewFrameAtTime:frameTime]; @@ -216,4 +253,10 @@ - (void)setIgnoreAspectRatio:(BOOL)newValue; } } +- (void)setAnchorTopLeft:(BOOL)newValue +{ + _anchorTopLeft = newValue; + [self setIgnoreAspectRatio:_ignoreAspectRatio]; +} + @end From 850c4a8dc39d33a62c6142ceacfb8470a79c7cb1 Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Sun, 11 Nov 2012 19:04:53 +0200 Subject: [PATCH 280/695] Support for parameterless methods. --- framework/Source/GPUImageFilterPipeline.h | 4 +- framework/Source/GPUImageFilterPipeline.m | 51 ++++++++++++----------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 1f120b4fa..086bc4300 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -1,7 +1,9 @@ #import #import "GPUImageFilter.h" -@interface GPUImageFilterPipeline : NSObject +@interface GPUImageFilterPipeline : NSObject{ + NSString *stringValue; +} @property (strong) NSMutableArray *filters; diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 2329353f9..015e6e0aa 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -44,6 +44,7 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { NSMutableArray *orderedFilters = [NSMutableArray arrayWithCapacity:[filters count]]; for (NSDictionary *filter in filters) { NSString *filterName = [filter objectForKey:@"FilterName"]; + NSLog(@"Filter %@", filterName); Class theClass = NSClassFromString(filterName); GPUImageFilter *genericFilter = [[theClass alloc] init]; // Set up the properties @@ -56,30 +57,32 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { [inv setSelector:theSelector]; [inv setTarget:genericFilter]; - // Parse the argument - NSString *stringValue = nil; - NSString *string = [filterAttributes objectForKey:propertyKey]; - NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string - options:0 - range:NSMakeRange(0, [string length])]; - NSLog(@"Ranges: %d", parse.numberOfRanges); - NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; - if ([modifier isEqualToString:@"float"]) { - // Float modifier, one argument - CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - [inv setArgument:&value atIndex:2]; - } else if ([modifier isEqualToString:@"CGPoint"]) { - // CGPoint modifier, two float arguments - CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; - CGPoint value = CGPointMake(x, y); - [inv setArgument:&value atIndex:2]; - } else if ([modifier isEqualToString:@"NSString"]) { - // NSString modifier, one string argument - stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; - [inv setArgument:&stringValue atIndex:2]; - } else { - return NO; + if ([propertyKey hasSuffix:@":"]) { + // Parse the argument + stringValue = nil; + NSString *string = [filterAttributes objectForKey:propertyKey]; + NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string + options:0 + range:NSMakeRange(0, [string length])]; + + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; + if ([modifier isEqualToString:@"float"]) { + // Float modifier, one argument + CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"CGPoint"]) { + // CGPoint modifier, two float arguments + CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; + CGPoint value = CGPointMake(x, y); + [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"NSString"]) { + // NSString modifier, one string argument + stringValue = [string substringWithRange:[parse rangeAtIndex:2]]; + [inv setArgument:&stringValue atIndex:2]; + } else { + return NO; + } } [inv invoke]; From 59ee5555c7903dc18a2357f2b96a99727bf6b652 Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Tue, 13 Nov 2012 00:36:25 +0200 Subject: [PATCH 281/695] Manual update for GPUImageFilterPipeline I removed my updates to merge with latest changes. I'll put it again after this commit. --- framework/Source/GPUImageFilterPipeline.h | 6 +- framework/Source/GPUImageFilterPipeline.m | 87 +++++++++++++++-------- 2 files changed, 59 insertions(+), 34 deletions(-) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 086bc4300..3bc252080 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -1,9 +1,7 @@ #import #import "GPUImageFilter.h" -@interface GPUImageFilterPipeline : NSObject{ - NSString *stringValue; -} +@interface GPUImageFilterPipeline : NSObject @property (strong) NSMutableArray *filters; @@ -24,4 +22,4 @@ - (UIImage *) currentFilteredFrame; - (CGImageRef) newCGImageFromCurrentFilteredFrame; -@end +@end \ No newline at end of file diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 015e6e0aa..5026b8580 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -2,8 +2,9 @@ @interface GPUImageFilterPipeline () -- (BOOL) _parseConfiguration:(NSDictionary *)configuration; -- (void) _refreshFilters; +- (BOOL)_parseConfiguration:(NSDictionary *)configuration; + +- (void)_refreshFilters; @end @@ -13,7 +14,7 @@ @implementation GPUImageFilterPipeline #pragma mark Config file init -- (id) initWithConfiguration:(NSDictionary*) configuration input:(GPUImageOutput*)input output:(id )output { +- (id)initWithConfiguration:(NSDictionary *)configuration input:(GPUImageOutput *)input output:(id )output { self = [super init]; if (self) { self.input = input; @@ -27,13 +28,15 @@ - (id) initWithConfiguration:(NSDictionary*) configuration input:(GPUImageOutput return self; } -- (id) initWithConfigurationFile:(NSURL*) configuration input:(GPUImageOutput*)input output:(id )output { +- (id)initWithConfigurationFile:(NSURL *)configuration input:(GPUImageOutput *)input output:(id )output { return [self initWithConfiguration:[NSDictionary dictionaryWithContentsOfURL:configuration] input:input output:output]; } -- (BOOL) _parseConfiguration:(NSDictionary *)configuration { +- (BOOL)_parseConfiguration:(NSDictionary *)configuration { NSArray *filters = [configuration objectForKey:@"Filters"]; - if (!filters) return NO; + if (!filters) { + return NO; + } NSError *regexError = nil; NSRegularExpression *parsingRegex = [NSRegularExpression regularExpressionWithPattern:@"(float|CGPoint|NSString)\\((.*?)(?:,\\s*(.*?))*\\)" @@ -44,7 +47,6 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { NSMutableArray *orderedFilters = [NSMutableArray arrayWithCapacity:[filters count]]; for (NSDictionary *filter in filters) { NSString *filterName = [filter objectForKey:@"FilterName"]; - NSLog(@"Filter %@", filterName); Class theClass = NSClassFromString(filterName); GPUImageFilter *genericFilter = [[theClass alloc] init]; // Set up the properties @@ -57,14 +59,44 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { [inv setSelector:theSelector]; [inv setTarget:genericFilter]; - if ([propertyKey hasSuffix:@":"]) { - // Parse the argument - stringValue = nil; + // Parse the argument + NSMutableArray *parsedArray; + if ([[filterAttributes objectForKey:propertyKey] isKindOfClass:[NSArray class]]) { + NSArray *array = [filterAttributes objectForKey:propertyKey]; + parsedArray = [NSMutableArray arrayWithCapacity:[array count]]; + for (NSString *string in array) { + NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string + options:0 + range:NSMakeRange(0, [string length])]; + NSLog(@"Ranges: %d", parse.numberOfRanges); + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; + if ([modifier isEqualToString:@"float"]) { + // Float modifier, one argument + CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + [parsedArray addObject:[NSNumber numberWithFloat:value]]; + [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"CGPoint"]) { + // CGPoint modifier, two float arguments + CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; + CGPoint value = CGPointMake(x, y); + [parsedArray addObject:[NSValue valueWithCGPoint:value]]; + } else if ([modifier isEqualToString:@"NSString"]) { + // NSString modifier, one string argument + NSString *stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; + [inv setArgument:&stringValue atIndex:2]; + + } else { + return NO; + } + } + [inv setArgument:&parsedArray atIndex:2]; + } else { NSString *string = [filterAttributes objectForKey:propertyKey]; NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; - + NSLog(@"Ranges: %d", parse.numberOfRanges); NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; if ([modifier isEqualToString:@"float"]) { // Float modifier, one argument @@ -76,15 +108,10 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; CGPoint value = CGPointMake(x, y); [inv setArgument:&value atIndex:2]; - } else if ([modifier isEqualToString:@"NSString"]) { - // NSString modifier, one string argument - stringValue = [string substringWithRange:[parse rangeAtIndex:2]]; - [inv setArgument:&stringValue atIndex:2]; } else { return NO; } } - [inv invoke]; } } @@ -97,7 +124,7 @@ - (BOOL) _parseConfiguration:(NSDictionary *)configuration { #pragma mark Regular init -- (id) initWithOrderedFilters:(NSArray*) filters input:(GPUImageOutput*)input output:(id )output { +- (id)initWithOrderedFilters:(NSArray *)filters input:(GPUImageOutput *)input output:(id )output { self = [super init]; if (self) { self.input = input; @@ -108,37 +135,37 @@ - (id) initWithOrderedFilters:(NSArray*) filters input:(GPUImageOutput*)input ou return self; } -- (void) addFilter:(GPUImageFilter*)filter atIndex:(NSUInteger)insertIndex { +- (void)addFilter:(GPUImageFilter *)filter atIndex:(NSUInteger)insertIndex { [self.filters insertObject:filter atIndex:insertIndex]; [self _refreshFilters]; } -- (void) addFilter:(GPUImageFilter*)filter { +- (void)addFilter:(GPUImageFilter *)filter { [self.filters addObject:filter]; [self _refreshFilters]; } -- (void) replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageFilter*)filter { +- (void)replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageFilter *)filter { [self.filters replaceObjectAtIndex:index withObject:filter]; [self _refreshFilters]; } -- (void) removeFilterAtIndex:(NSUInteger)index { +- (void)removeFilterAtIndex:(NSUInteger)index { [self.filters removeObjectAtIndex:index]; [self _refreshFilters]; } -- (void) removeAllFilters { +- (void)removeAllFilters { [self.filters removeAllObjects]; [self _refreshFilters]; } -- (void) replaceAllFilters:(NSArray*) newFilters { +- (void)replaceAllFilters:(NSArray *)newFilters { self.filters = [NSMutableArray arrayWithArray:newFilters]; [self _refreshFilters]; } -- (void) _refreshFilters { +- (void)_refreshFilters { id prevFilter = self.input; GPUImageFilter *theFilter = nil; @@ -151,18 +178,18 @@ - (void) _refreshFilters { } [prevFilter removeAllTargets]; - + if (self.output != nil) { [prevFilter addTarget:self.output]; } } -- (UIImage *) currentFilteredFrame { - return [(GPUImageFilter*)[_filters lastObject] imageFromCurrentlyProcessedOutput]; +- (UIImage *)currentFilteredFrame { + return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentlyProcessedOutput]; } -- (CGImageRef) newCGImageFromCurrentFilteredFrame { - return [(GPUImageFilter*)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; +- (CGImageRef)newCGImageFromCurrentFilteredFrame { + return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; } -@end +@end \ No newline at end of file From b92e497bf6d8e34b2d944bc21186a739de2384dd Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Tue, 13 Nov 2012 00:44:12 +0200 Subject: [PATCH 282/695] Support for parameterless selectors and ARC fix for NSString arguments. --- framework/Source/GPUImageFilterPipeline.h | 3 + framework/Source/GPUImageFilterPipeline.m | 75 +++++++++++++---------- 2 files changed, 47 insertions(+), 31 deletions(-) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 3bc252080..638e2b972 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -2,6 +2,9 @@ #import "GPUImageFilter.h" @interface GPUImageFilterPipeline : NSObject +{ + NSString *stringValue; +} @property (strong) NSMutableArray *filters; diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 5026b8580..fb86a1606 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -59,59 +59,72 @@ - (BOOL)_parseConfiguration:(NSDictionary *)configuration { [inv setSelector:theSelector]; [inv setTarget:genericFilter]; - // Parse the argument - NSMutableArray *parsedArray; - if ([[filterAttributes objectForKey:propertyKey] isKindOfClass:[NSArray class]]) { - NSArray *array = [filterAttributes objectForKey:propertyKey]; - parsedArray = [NSMutableArray arrayWithCapacity:[array count]]; - for (NSString *string in array) { + // check selector given with parameter + if ([propertyKey hasSuffix:@":"]) { + + stringValue = nil; + + // Then parse the arguments + NSMutableArray *parsedArray; + if ([[filterAttributes objectForKey:propertyKey] isKindOfClass:[NSArray class]]) { + NSArray *array = [filterAttributes objectForKey:propertyKey]; + parsedArray = [NSMutableArray arrayWithCapacity:[array count]]; + for (NSString *string in array) { + NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string + options:0 + range:NSMakeRange(0, [string length])]; + + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; + if ([modifier isEqualToString:@"float"]) { + // Float modifier, one argument + CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + [parsedArray addObject:[NSNumber numberWithFloat:value]]; + [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"CGPoint"]) { + // CGPoint modifier, two float arguments + CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; + CGPoint value = CGPointMake(x, y); + [parsedArray addObject:[NSValue valueWithCGPoint:value]]; + } else if ([modifier isEqualToString:@"NSString"]) { + // NSString modifier, one string argument + stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; + [inv setArgument:&stringValue atIndex:2]; + + } else { + return NO; + } + } + [inv setArgument:&parsedArray atIndex:2]; + } else { + NSString *string = [filterAttributes objectForKey:propertyKey]; NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; - NSLog(@"Ranges: %d", parse.numberOfRanges); + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; if ([modifier isEqualToString:@"float"]) { // Float modifier, one argument CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - [parsedArray addObject:[NSNumber numberWithFloat:value]]; [inv setArgument:&value atIndex:2]; } else if ([modifier isEqualToString:@"CGPoint"]) { // CGPoint modifier, two float arguments CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; CGPoint value = CGPointMake(x, y); - [parsedArray addObject:[NSValue valueWithCGPoint:value]]; + [inv setArgument:&value atIndex:2]; } else if ([modifier isEqualToString:@"NSString"]) { // NSString modifier, one string argument - NSString *stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; + stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; [inv setArgument:&stringValue atIndex:2]; } else { return NO; } } - [inv setArgument:&parsedArray atIndex:2]; - } else { - NSString *string = [filterAttributes objectForKey:propertyKey]; - NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string - options:0 - range:NSMakeRange(0, [string length])]; - NSLog(@"Ranges: %d", parse.numberOfRanges); - NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; - if ([modifier isEqualToString:@"float"]) { - // Float modifier, one argument - CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - [inv setArgument:&value atIndex:2]; - } else if ([modifier isEqualToString:@"CGPoint"]) { - // CGPoint modifier, two float arguments - CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; - CGPoint value = CGPointMake(x, y); - [inv setArgument:&value atIndex:2]; - } else { - return NO; - } } + + [inv invoke]; } } From 1d63e9c523b2fe44f05c1a3bf8f98a6a36f002a0 Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Tue, 13 Nov 2012 01:15:22 +0200 Subject: [PATCH 283/695] New method added to get CGImage with orientation. --- framework/Source/GPUImageFilterPipeline.h | 1 + framework/Source/GPUImageFilterPipeline.m | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 638e2b972..157332b59 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -24,5 +24,6 @@ - (UIImage *) currentFilteredFrame; - (CGImageRef) newCGImageFromCurrentFilteredFrame; +- (CGImageRef) newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation; @end \ No newline at end of file diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index fb86a1606..84057e95c 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -205,4 +205,9 @@ - (CGImageRef)newCGImageFromCurrentFilteredFrame { return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; } +- (CGImageRef)newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation { + return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; +} + + @end \ No newline at end of file From 46f0592b2124012bf4d92df66f3e421a1ed6a152 Mon Sep 17 00:00:00 2001 From: Omer Duzyol Date: Tue, 13 Nov 2012 01:20:56 +0200 Subject: [PATCH 284/695] Undoing Test classes --- .../SimpleImageFilter/lookup_amatorka.png | 899 ------------------ .../SimpleImageFilter/lookup_miss_etikate.png | 899 ------------------ .../lookup_soft_elegance_1.png | 899 ------------------ .../lookup_soft_elegance_2.png | 899 ------------------ .../SimpleImageFilter/test.jpg | Bin 173206 -> 0 bytes 5 files changed, 3596 deletions(-) delete mode 100644 examples/SnappTestFilter/SimpleImageFilter/lookup_amatorka.png delete mode 100644 examples/SnappTestFilter/SimpleImageFilter/lookup_miss_etikate.png delete mode 100644 examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_1.png delete mode 100644 examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_2.png delete mode 100644 examples/SnappTestFilter/SimpleImageFilter/test.jpg diff --git a/examples/SnappTestFilter/SimpleImageFilter/lookup_amatorka.png b/examples/SnappTestFilter/SimpleImageFilter/lookup_amatorka.png deleted file mode 100644 index 0fed8e5c0..000000000 --- a/examples/SnappTestFilter/SimpleImageFilter/lookup_amatorka.png +++ /dev/null @@ -1,899 +0,0 @@ - - - - - - - - - GPUImage/framework/Resources/lookup_amatorka.png at e6057f93d9a14f57db7b6c6c5e467b3881dcea65 · liovch/GPUImage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - -
-
- -
-
- - - - -
    - - -
  • -
    - -
    - - - Watch - - - -
    - -
    Notification status
    - -
    -
      -
    • - - - - - Watch - -
    • -
    • - - - - - Unwatch - -
    • -
    • - - - - - Stop ignoring - -
    • -
    -
    -
    -
    -
    -
  • - -
  • - - - Unstar - - - Star - -
  • - -
  • Fork -
  • - - -
- -

- public - - - / - GPUImage - - forked from BradLarson/GPUImage - -

-
- - - - - - - - - - -
- - - - - - -
- -
- - tree: e6057f93d9 - - -
- -
Switch branches/tags
-
-
- - -
- -
-
Nothing to show
-
- -

- lookupfilter -

-
-
- -

- master -

-
-
- - -
-
-
-
- - - -
- - - - - - - - -
- -
- - - - - - - -
- - - -
- Fetching contributors… - -
-

Octocat-spinner-16px

-
-
- -
-
- -
-
-
-
- - file - 36.39 kb -
- -
-
-
- -
-
- -
-
-
-
- -
- - - -
-
-
-
- - -
- - - - - - - - -
-

Markdown Cheat Sheet

- -
- -
-
-

Format Text

-

Headers

-
-# This is an <h1> tag
-## This is an <h2> tag
-###### This is an <h6> tag
-

Text styles

-
-*This text will be italic*
-_This will also be italic_
-**This text will be bold**
-__This will also be bold__
-
-*You **can** combine them*
-
-
-
-

Lists

-

Unordered

-
-* Item 1
-* Item 2
-  * Item 2a
-  * Item 2b
-

Ordered

-
-1. Item 1
-2. Item 2
-3. Item 3
-   * Item 3a
-   * Item 3b
-
-
-

Miscellaneous

-

Images

-
-![GitHub Logo](/images/logo.png)
-Format: ![Alt Text](url)
-
-

Links

-
-http://github.com - automatic!
-[GitHub](http://github.com)
-

Blockquotes

-
-As Kanye West said:
-
-> We're living the future so
-> the present is our past.
-
-
-
-
- -

Code Examples in Markdown

-
-

Syntax highlighting with GFM

-
-```javascript
-function fancyAlert(arg) {
-  if(arg) {
-    $.facebox({div:'#foo'})
-  }
-}
-```
-
-
-

Or, indent your code 4 spaces

-
-Here is a Python code example
-without syntax highlighting:
-
-    def foo:
-      if not bar:
-        return true
-
-
-

Inline code for comments

-
-I think you should use an
-`<addr>` element here instead.
-
-
- -
- - - -
- - Something went wrong with that request. Please try again. - -
- -
-

Looking for the GitHub logo?

- -
- - - - - - - diff --git a/examples/SnappTestFilter/SimpleImageFilter/lookup_miss_etikate.png b/examples/SnappTestFilter/SimpleImageFilter/lookup_miss_etikate.png deleted file mode 100644 index 4f38bee66..000000000 --- a/examples/SnappTestFilter/SimpleImageFilter/lookup_miss_etikate.png +++ /dev/null @@ -1,899 +0,0 @@ - - - - - - - - - GPUImage/framework/Resources/lookup_miss_etikate.png at e6057f93d9a14f57db7b6c6c5e467b3881dcea65 · liovch/GPUImage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - -
-
- -
-
- - - - -
    - - -
  • -
    - -
    - - - Watch - - - -
    - -
    Notification status
    - -
    -
      -
    • - - - - - Watch - -
    • -
    • - - - - - Unwatch - -
    • -
    • - - - - - Stop ignoring - -
    • -
    -
    -
    -
    -
    -
  • - -
  • - - - Unstar - - - Star - -
  • - -
  • Fork -
  • - - -
- -

- public - - - / - GPUImage - - forked from BradLarson/GPUImage - -

-
- - - - - - - - - - -
- - - - - - -
- -
- - tree: e6057f93d9 - - -
- -
Switch branches/tags
-
-
- - -
- -
-
Nothing to show
-
- -

- lookupfilter -

-
-
- -

- master -

-
-
- - -
-
-
-
- - - -
- - - - - - - - -
- -
- - - - - - - -
- - - -
- Fetching contributors… - -
-

Octocat-spinner-16px

-
-
- -
-
- -
-
-
-
- - file - 202.596 kb -
- -
-
-
- -
-
- -
-
-
-
- -
- - - -
-
-
-
- - -
- - - - - - - - -
-

Markdown Cheat Sheet

- -
- -
-
-

Format Text

-

Headers

-
-# This is an <h1> tag
-## This is an <h2> tag
-###### This is an <h6> tag
-

Text styles

-
-*This text will be italic*
-_This will also be italic_
-**This text will be bold**
-__This will also be bold__
-
-*You **can** combine them*
-
-
-
-

Lists

-

Unordered

-
-* Item 1
-* Item 2
-  * Item 2a
-  * Item 2b
-

Ordered

-
-1. Item 1
-2. Item 2
-3. Item 3
-   * Item 3a
-   * Item 3b
-
-
-

Miscellaneous

-

Images

-
-![GitHub Logo](/images/logo.png)
-Format: ![Alt Text](url)
-
-

Links

-
-http://github.com - automatic!
-[GitHub](http://github.com)
-

Blockquotes

-
-As Kanye West said:
-
-> We're living the future so
-> the present is our past.
-
-
-
-
- -

Code Examples in Markdown

-
-

Syntax highlighting with GFM

-
-```javascript
-function fancyAlert(arg) {
-  if(arg) {
-    $.facebox({div:'#foo'})
-  }
-}
-```
-
-
-

Or, indent your code 4 spaces

-
-Here is a Python code example
-without syntax highlighting:
-
-    def foo:
-      if not bar:
-        return true
-
-
-

Inline code for comments

-
-I think you should use an
-`<addr>` element here instead.
-
-
- -
- - - -
- - Something went wrong with that request. Please try again. - -
- -
-

Looking for the GitHub logo?

- -
- - - - - - - diff --git a/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_1.png b/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_1.png deleted file mode 100644 index 7b6f4c7fd..000000000 --- a/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_1.png +++ /dev/null @@ -1,899 +0,0 @@ - - - - - - - - - GPUImage/framework/Resources/lookup_soft_elegance_1.png at e6057f93d9a14f57db7b6c6c5e467b3881dcea65 · liovch/GPUImage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - -
-
- -
-
- - - - -
    - - -
  • -
    - -
    - - - Watch - - - -
    - -
    Notification status
    - -
    -
      -
    • - - - - - Watch - -
    • -
    • - - - - - Unwatch - -
    • -
    • - - - - - Stop ignoring - -
    • -
    -
    -
    -
    -
    -
  • - -
  • - - - Unstar - - - Star - -
  • - -
  • Fork -
  • - - -
- -

- public - - - / - GPUImage - - forked from BradLarson/GPUImage - -

-
- - - - - - - - - - -
- - - - - - -
- -
- - tree: e6057f93d9 - - -
- -
Switch branches/tags
-
-
- - -
- -
-
Nothing to show
-
- -

- lookupfilter -

-
-
- -

- master -

-
-
- - -
-
-
-
- - - -
- - - - - - - - -
- -
- - - - - - - -
- - - -
- Fetching contributors… - -
-

Octocat-spinner-16px

-
-
- -
-
- -
-
-
-
- - file - 129.208 kb -
- -
-
-
- -
-
- -
-
-
-
- -
- - - -
-
-
-
- - -
- - - - - - - - -
-

Markdown Cheat Sheet

- -
- -
-
-

Format Text

-

Headers

-
-# This is an <h1> tag
-## This is an <h2> tag
-###### This is an <h6> tag
-

Text styles

-
-*This text will be italic*
-_This will also be italic_
-**This text will be bold**
-__This will also be bold__
-
-*You **can** combine them*
-
-
-
-

Lists

-

Unordered

-
-* Item 1
-* Item 2
-  * Item 2a
-  * Item 2b
-

Ordered

-
-1. Item 1
-2. Item 2
-3. Item 3
-   * Item 3a
-   * Item 3b
-
-
-

Miscellaneous

-

Images

-
-![GitHub Logo](/images/logo.png)
-Format: ![Alt Text](url)
-
-

Links

-
-http://github.com - automatic!
-[GitHub](http://github.com)
-

Blockquotes

-
-As Kanye West said:
-
-> We're living the future so
-> the present is our past.
-
-
-
-
- -

Code Examples in Markdown

-
-

Syntax highlighting with GFM

-
-```javascript
-function fancyAlert(arg) {
-  if(arg) {
-    $.facebox({div:'#foo'})
-  }
-}
-```
-
-
-

Or, indent your code 4 spaces

-
-Here is a Python code example
-without syntax highlighting:
-
-    def foo:
-      if not bar:
-        return true
-
-
-

Inline code for comments

-
-I think you should use an
-`<addr>` element here instead.
-
-
- -
- - - -
- - Something went wrong with that request. Please try again. - -
- -
-

Looking for the GitHub logo?

- -
- - - - - - - diff --git a/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_2.png b/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_2.png deleted file mode 100644 index 0951d6ba8..000000000 --- a/examples/SnappTestFilter/SimpleImageFilter/lookup_soft_elegance_2.png +++ /dev/null @@ -1,899 +0,0 @@ - - - - - - - - - GPUImage/framework/Resources/lookup_soft_elegance_2.png at e6057f93d9a14f57db7b6c6c5e467b3881dcea65 · liovch/GPUImage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - -
-
- -
-
- - - - -
    - - -
  • -
    - -
    - - - Watch - - - -
    - -
    Notification status
    - -
    -
      -
    • - - - - - Watch - -
    • -
    • - - - - - Unwatch - -
    • -
    • - - - - - Stop ignoring - -
    • -
    -
    -
    -
    -
    -
  • - -
  • - - - Unstar - - - Star - -
  • - -
  • Fork -
  • - - -
- -

- public - - - / - GPUImage - - forked from BradLarson/GPUImage - -

-
- - - - - - - - - - -
- - - - - - -
- -
- - tree: e6057f93d9 - - -
- -
Switch branches/tags
-
-
- - -
- -
-
Nothing to show
-
- -

- lookupfilter -

-
-
- -

- master -

-
-
- - -
-
-
-
- - - -
- - - - - - - - -
- -
- - - - - - - -
- - - -
- Fetching contributors… - -
-

Octocat-spinner-16px

-
-
- -
-
- -
-
-
-
- - file - 2.199 kb -
- -
-
-
- -
-
- -
-
-
-
- -
- - - -
-
-
-
- - -
- - - - - - - - -
-

Markdown Cheat Sheet

- -
- -
-
-

Format Text

-

Headers

-
-# This is an <h1> tag
-## This is an <h2> tag
-###### This is an <h6> tag
-

Text styles

-
-*This text will be italic*
-_This will also be italic_
-**This text will be bold**
-__This will also be bold__
-
-*You **can** combine them*
-
-
-
-

Lists

-

Unordered

-
-* Item 1
-* Item 2
-  * Item 2a
-  * Item 2b
-

Ordered

-
-1. Item 1
-2. Item 2
-3. Item 3
-   * Item 3a
-   * Item 3b
-
-
-

Miscellaneous

-

Images

-
-![GitHub Logo](/images/logo.png)
-Format: ![Alt Text](url)
-
-

Links

-
-http://github.com - automatic!
-[GitHub](http://github.com)
-

Blockquotes

-
-As Kanye West said:
-
-> We're living the future so
-> the present is our past.
-
-
-
-
- -

Code Examples in Markdown

-
-

Syntax highlighting with GFM

-
-```javascript
-function fancyAlert(arg) {
-  if(arg) {
-    $.facebox({div:'#foo'})
-  }
-}
-```
-
-
-

Or, indent your code 4 spaces

-
-Here is a Python code example
-without syntax highlighting:
-
-    def foo:
-      if not bar:
-        return true
-
-
-

Inline code for comments

-
-I think you should use an
-`<addr>` element here instead.
-
-
- -
- - - -
- - Something went wrong with that request. Please try again. - -
- -
-

Looking for the GitHub logo?

- -
- - - - - - - diff --git a/examples/SnappTestFilter/SimpleImageFilter/test.jpg b/examples/SnappTestFilter/SimpleImageFilter/test.jpg deleted file mode 100644 index adc9b12072e3d4d2b18e0740a0d59ba4bdffc9b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173206 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
xcwFJi+nllR`MiE-Ig1HH8s=m{ieg3I0JZ8WY^ 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Ü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 Date: Mon, 12 Nov 2012 18:15:29 -0800 Subject: [PATCH 285/695] whoops, extra dispatch_semaphore_signal --- framework/Source/GPUImageStillCamera.m | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 838c81f1b..837bb35a8 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -146,7 +146,6 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f dispatch_semaphore_signal(frameRenderingSemaphore); } - dispatch_semaphore_signal(frameRenderingSemaphore); block(dataForJPEGFile, error); }]; } From 092afd3f92f526bae899ef62976c10260f98a2d7 Mon Sep 17 00:00:00 2001 From: Lajos Kamocsay Date: Mon, 12 Nov 2012 22:24:26 -0500 Subject: [PATCH 286/695] output texture was not initialized in GPUImageRawDataInput --- framework/Source/GPUImageRawDataInput.h | 2 ++ framework/Source/GPUImageRawDataInput.m | 38 +++++++++++++++++++------ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h index 02f59808e..8fc50ee04 100644 --- a/framework/Source/GPUImageRawDataInput.h +++ b/framework/Source/GPUImageRawDataInput.h @@ -7,6 +7,8 @@ @interface GPUImageRawDataInput : GPUImageOutput { CGSize uploadedImageSize; + + dispatch_semaphore_t dataUpdateSemaphore; } // Initialization and teardown diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 133540cac..5eb027266 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -16,6 +16,8 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; return nil; } + dataUpdateSemaphore = dispatch_semaphore_create(1); + uploadedImageSize = imageSize; [self uploadBytes:bytesToUpload]; @@ -23,6 +25,14 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; return self; } +- (void)dealloc; +{ + if (dataUpdateSemaphore != NULL) + { + dispatch_release(dataUpdateSemaphore); + } +} + #pragma mark - #pragma mark Image rendering @@ -30,6 +40,8 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; { [GPUImageOpenGLESContext useImageProcessingContext]; + [self initializeOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, outputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, bytesToUpload); } @@ -43,16 +55,26 @@ - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; - (void)processData; { - CGSize pixelSizeOfImage = [self outputImageSize]; - - for (id currentTarget in targets) + if (dispatch_semaphore_wait(dataUpdateSemaphore, DISPATCH_TIME_NOW) != 0) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + return; + } + + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + + CGSize pixelSizeOfImage = [self outputImageSize]; + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; - } + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; + } + + dispatch_semaphore_signal(dataUpdateSemaphore); + }); } - (CGSize)outputImageSize; From 0759300d16d4973dda0878a242a5fc8981f0eca4 Mon Sep 17 00:00:00 2001 From: Lajos Kamocsay Date: Tue, 13 Nov 2012 23:38:52 -0500 Subject: [PATCH 287/695] added pixelFormat property to raw data input --- framework/Source/GPUImageRawDataInput.h | 12 +++++++++++- framework/Source/GPUImageRawDataInput.m | 15 ++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h index 8fc50ee04..2d56227e1 100644 --- a/framework/Source/GPUImageRawDataInput.h +++ b/framework/Source/GPUImageRawDataInput.h @@ -2,7 +2,12 @@ // The bytes passed into this input are not copied or retained, but you are free to deallocate them after they are used by this filter. // The bytes are uploaded and stored within a texture, so nothing is kept locally. -// Input bytes are assumed to be in BGRA format. +// The default format for input bytes is GPUPixelFormatBGRA, unless specified with pixelFormat: + +typedef enum { + GPUPixelFormatBGRA = GL_BGRA, + GPUPixelFormatRGBA = GL_RGBA +} GPUPixelFormat; @interface GPUImageRawDataInput : GPUImageOutput { @@ -13,6 +18,11 @@ // Initialization and teardown - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat; + +/** Input data pixel format + */ +@property (readwrite, nonatomic) GPUPixelFormat pixelFormat; // Image rendering - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 5eb027266..b0f1c67ce 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -6,10 +6,22 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; @implementation GPUImageRawDataInput +@synthesize pixelFormat = _pixelFormat; + #pragma mark - #pragma mark Initialization and teardown - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; +{ + if (!(self = [self initWithBytes:bytesToUpload size:imageSize pixelFormat:GPUPixelFormatBGRA])) + { + return nil; + } + + return self; +} + +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat; { if (!(self = [super init])) { @@ -19,6 +31,7 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; dataUpdateSemaphore = dispatch_semaphore_create(1); uploadedImageSize = imageSize; + self.pixelFormat = pixelFormat; [self uploadBytes:bytesToUpload]; @@ -43,7 +56,7 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; [self initializeOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, bytesToUpload); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, (GLint)_pixelFormat, GL_UNSIGNED_BYTE, bytesToUpload); } - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; From ab0928996154f6880534e943825f67e9cc23ca9f Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sun, 18 Nov 2012 22:27:40 -0700 Subject: [PATCH 288/695] Rollback GPUImagePicture changes --- framework/Source/GPUImagePicture.h | 3 +- framework/Source/GPUImagePicture.m | 121 +++++++++++------------------ 2 files changed, 47 insertions(+), 77 deletions(-) diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index b191a8506..413c19516 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -18,7 +18,6 @@ // Image rendering - (void)processImage; -- (void)processImageSynchronously; - (CGSize)outputImageSize; -@end +@end \ No newline at end of file diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 5bbdcb220..e539ed022 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -45,7 +45,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot CGFloat heightOfImage = CGImageGetHeight(newImageSource); pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); CGSize pixelSizeToUseForTexture = pixelSizeOfImage; - + BOOL shouldRedrawUsingCoreGraphics = YES; // For now, deal with images larger than the maximum texture size by resizing to be within that limit @@ -67,12 +67,12 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot shouldRedrawUsingCoreGraphics = YES; } - + GLubyte *imageData = NULL; CFDataRef dataFromImageDataProvider; - -// CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); - + + // CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); + if (shouldRedrawUsingCoreGraphics) { // For resized image, redraw @@ -81,11 +81,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef imageContext = CGBitmapContextCreate(imageData, (size_t)pixelSizeToUseForTexture.width, (size_t)pixelSizeToUseForTexture.height, 8, (size_t)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); - if (imageContext == NULL) - { - NSLog(@"Empty GPUImage Context"); - } -// CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html + // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), newImageSource); CGContextRelease(imageContext); CGColorSpaceRelease(genericRGBColorspace); @@ -95,27 +91,29 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot // Access the raw image bytes directly dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider(newImageSource)); imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); - } + } -// elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; -// NSLog(@"Core Graphics drawing time: %f", elapsedTime); - -// CGFloat currentRedTotal = 0.0f, currentGreenTotal = 0.0f, currentBlueTotal = 0.0f, currentAlphaTotal = 0.0f; -// NSUInteger totalNumberOfPixels = round(pixelSizeToUseForTexture.width * pixelSizeToUseForTexture.height); -// -// for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) -// { -// currentBlueTotal += (CGFloat)imageData[(currentPixel * 4)] / 255.0f; -// currentGreenTotal += (CGFloat)imageData[(currentPixel * 4) + 1] / 255.0f; -// currentRedTotal += (CGFloat)imageData[(currentPixel * 4 + 2)] / 255.0f; -// currentAlphaTotal += (CGFloat)imageData[(currentPixel * 4) + 3] / 255.0f; -// } -// -// NSLog(@"Debug, average input image red: %f, green: %f, blue: %f, alpha: %f", currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); + // elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; + // NSLog(@"Core Graphics drawing time: %f", elapsedTime); + + // CGFloat currentRedTotal = 0.0f, currentGreenTotal = 0.0f, currentBlueTotal = 0.0f, currentAlphaTotal = 0.0f; + // NSUInteger totalNumberOfPixels = round(pixelSizeToUseForTexture.width * pixelSizeToUseForTexture.height); + // + // for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) + // { + // currentBlueTotal += (CGFloat)imageData[(currentPixel * 4)] / 255.0f; + // currentGreenTotal += (CGFloat)imageData[(currentPixel * 4) + 1] / 255.0f; + // currentRedTotal += (CGFloat)imageData[(currentPixel * 4 + 2)] / 255.0f; + // currentAlphaTotal += (CGFloat)imageData[(currentPixel * 4) + 3] / 255.0f; + // } + // + // NSLog(@"Debug, average input image red: %f, green: %f, blue: %f, alpha: %f", currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; + [self initializeOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, outputTexture); if (self.shouldSmoothlyScaleOutput) { @@ -126,9 +124,9 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot if (self.shouldSmoothlyScaleOutput) { glGenerateMipmap(GL_TEXTURE_2D); - } + } }); - + if (shouldRedrawUsingCoreGraphics) { free(imageData); @@ -158,26 +156,7 @@ - (void)removeAllTargets; hasProcessedImage = NO; } -- (void)processImageInternal -{ - if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) - { - [self conserveMemoryForNextFrame]; - } - - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; - } - - dispatch_semaphore_signal(imageUpdateSemaphore); -} - -- (void)processImage:(BOOL)synchronously +- (void)processImage; { hasProcessedImage = YES; @@ -188,32 +167,24 @@ - (void)processImage:(BOOL)synchronously return; } - if (synchronously) - { - dispatch_sync([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ - - [self processImageInternal]; - - }); - } - else - { - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ - - [self processImageInternal]; + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + + if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) + { + [self conserveMemoryForNextFrame]; + } + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - }); - } -} - -- (void)processImageSynchronously -{ - [self processImage:YES]; -} - -- (void)processImage; -{ - [self processImage:NO]; + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; + } + + dispatch_semaphore_signal(imageUpdateSemaphore); + }); } - (CGSize)outputImageSize; @@ -224,7 +195,7 @@ - (CGSize)outputImageSize; - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; { [super addTarget:newTarget atTextureLocation:textureLocation]; - + if (hasProcessedImage) { [newTarget setInputSize:pixelSizeOfImage atIndex:textureLocation]; @@ -232,4 +203,4 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text } } -@end +@end \ No newline at end of file From e2fe4d7c8690c9a6cfd16b42441dd792668adc2a Mon Sep 17 00:00:00 2001 From: joein3d Date: Tue, 20 Nov 2012 16:14:09 -0500 Subject: [PATCH 289/695] Fix crashes that occur when imageByFilteringImage: is called on [GPUImageOpenGLESContext sharedOpenGLESQueue] --- framework/Source/GPUImagePicture.m | 2 +- framework/Source/GPUImageRawDataInput.m | 2 +- framework/Source/GPUImageTextureInput.m | 3 +-- framework/Source/GPUImageVideoCamera.m | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index e539ed022..4438d2c92 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -167,7 +167,7 @@ - (void)processImage; return; } - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) { diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 5eb027266..479752fae 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -60,7 +60,7 @@ - (void)processData; return; } - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ CGSize pixelSizeOfImage = [self outputImageSize]; diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index f73bc8989..7bc7bddd2 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -29,8 +29,7 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; - (void)processTextureWithFrameTime:(CMTime)frameTime; { - runSynchronouslyOnVideoProcessingQueue(^{ -// dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 96e221121..de4357a99 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -496,7 +496,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM // } CFRetain(sampleBuffer); - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [weakSelf processAudioSampleBuffer:sampleBuffer]; CFRelease(sampleBuffer); // dispatch_semaphore_signal(frameRenderingSemaphore); @@ -510,7 +510,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM } CFRetain(sampleBuffer); - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ //Feature Detection Hook. if (weakSelf.delegate) { From c7dcb0e8162cda40ea5d7d7e3fa390a0552f2e82 Mon Sep 17 00:00:00 2001 From: David Keegan Date: Thu, 22 Nov 2012 09:17:38 -0800 Subject: [PATCH 290/695] adding newlines --- framework/Source/GPUImageFilterPipeline.h | 2 +- framework/Source/GPUImageOutput.h | 2 +- framework/Source/GPUImagePicture.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 157332b59..0c6a06b3c 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -26,4 +26,4 @@ - (CGImageRef) newCGImageFromCurrentFilteredFrame; - (CGImageRef) newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index afef5447f..b9f6b7046 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -115,4 +115,4 @@ void reportAvailableMemoryForGPUImage(NSString *tag); - (void)prepareForImageCapture; - (void)conserveMemoryForNextFrame; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 413c19516..65444d1b6 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -20,4 +20,4 @@ - (void)processImage; - (CGSize)outputImageSize; -@end \ No newline at end of file +@end From 18db7d6f2a20a2e69d64c9775c4e80be5c2e9bda Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 29 Nov 2012 01:34:57 -0700 Subject: [PATCH 291/695] Add radius and center to GPUImageGaussianBlurFilter No performance impact on iphone or ipad noticed --- framework/Source/GPUImageGaussianBlurFilter.h | 10 +- framework/Source/GPUImageGaussianBlurFilter.m | 96 ++++++++++++++++--- 2 files changed, 90 insertions(+), 16 deletions(-) diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index bf920ca7c..00d1c73de 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -4,11 +4,19 @@ */ @interface GPUImageGaussianBlurFilter : GPUImageTwoPassTextureSamplingFilter { - GLint horizontalBlurSizeUniform, verticalBlurSizeUniform; + GLint horizontalBlurSizeUniform, verticalBlurSizeUniform, blurCenterUniform, blurRadiusUniform, aspectRatioUniform; } /** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 */ @property (readwrite, nonatomic) CGFloat blurSize; +/** Center for the blur, defaults to 0.5, 0.5 + */ +@property (readwrite, nonatomic) CGPoint blurCenter; + +/** Radius for the blur, defaults to 1.0 + */ +@property (readwrite, nonatomic) CGFloat blurRadius; + @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index 860df5da3..8f1c0acda 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -10,7 +10,6 @@ uniform highp float texelWidthOffset; uniform highp float texelHeightOffset; uniform highp float blurSize; - varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; @@ -40,27 +39,49 @@ void main() { varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + uniform highp float aspectRatio; + uniform lowp vec2 blurCenter; + uniform highp float blurRadius; void main() { - lowp vec4 sum = vec4(0.0); - - sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; - sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; - sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; - - gl_FragColor = sum; + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(blurCenter, textureCoordinateToUse); + + if (dist < blurRadius) + { + lowp vec4 sum = vec4(0.0); + + sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; + sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; + sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; + + gl_FragColor = sum; + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate); + } } ); +@interface GPUImageGaussianBlurFilter () + +@property (readwrite, nonatomic) CGFloat aspectRatio; + +@end + @implementation GPUImageGaussianBlurFilter @synthesize blurSize = _blurSize; +@synthesize blurCenter = _blurCenter; +@synthesize aspectRatio = _aspectRatio; - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString @@ -76,8 +97,13 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad horizontalBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; verticalBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; + aspectRatioUniform = [secondFilterProgram uniformIndex:@"aspectRatio"]; + blurCenterUniform = [secondFilterProgram uniformIndex:@"blurCenter"]; + blurRadiusUniform = [secondFilterProgram uniformIndex:@"blurRadius"]; self.blurSize = 1.0; + self.blurRadius = 1.0; + self.blurCenter = CGPointMake(0.5, 0.5); return self; } @@ -90,13 +116,53 @@ - (id)init; secondStageFragmentShaderFromString:nil]; } +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) + { + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } + } +} + #pragma mark Getters and Setters -- (void) setBlurSize:(CGFloat)blurSize { +- (void) setBlurSize:(CGFloat)blurSize; +{ _blurSize = blurSize; [self setFloat:_blurSize forUniform:horizontalBlurSizeUniform program:filterProgram]; [self setFloat:_blurSize forUniform:verticalBlurSizeUniform program:secondFilterProgram]; } +- (void) setBlurCenter:(CGPoint)blurCenter; +{ + _blurCenter = blurCenter; + + [self setPoint:_blurCenter forUniform:blurCenterUniform program:secondFilterProgram]; +} + +- (void) setBlurRadius:(CGFloat)blurRadius; +{ + _blurRadius = blurRadius; + + [self setFloat:_blurRadius forUniform:blurRadiusUniform program:secondFilterProgram]; +} + +- (void) setAspectRatio:(CGFloat)newValue; +{ + _aspectRatio = newValue; + + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:secondFilterProgram]; +} + @end From fd6765db1a48f73aad4b12b874cdba80afa8fdb5 Mon Sep 17 00:00:00 2001 From: Mitch Date: Thu, 29 Nov 2012 18:05:59 -0800 Subject: [PATCH 292/695] Add a method to allow us to specify the data format in GPUImageRawDataInput. Right now we support unsigned byte and float. Also allow for RGB images. --- framework/Source/GPUImageRawDataInput.h | 11 ++++++++++- framework/Source/GPUImageRawDataInput.m | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h index 2d56227e1..bc24dad30 100644 --- a/framework/Source/GPUImageRawDataInput.h +++ b/framework/Source/GPUImageRawDataInput.h @@ -3,12 +3,19 @@ // The bytes passed into this input are not copied or retained, but you are free to deallocate them after they are used by this filter. // The bytes are uploaded and stored within a texture, so nothing is kept locally. // The default format for input bytes is GPUPixelFormatBGRA, unless specified with pixelFormat: +// The default type for input bytes is GPUPixelTypeUByte, unless specified with pixelType: typedef enum { GPUPixelFormatBGRA = GL_BGRA, - GPUPixelFormatRGBA = GL_RGBA + GPUPixelFormatRGBA = GL_RGBA, + GPUPixelFormatRGB = GL_RGB } GPUPixelFormat; +typedef enum { + GPUPixelTypeUByte = GL_UNSIGNED_BYTE, + GPUPixelTypeFloat = GL_FLOAT +} GPUPixelType; + @interface GPUImageRawDataInput : GPUImageOutput { CGSize uploadedImageSize; @@ -19,10 +26,12 @@ typedef enum { // Initialization and teardown - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat; +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat type:(GPUPixelType)pixelType; /** Input data pixel format */ @property (readwrite, nonatomic) GPUPixelFormat pixelFormat; +@property (readwrite, nonatomic) GPUPixelType pixelType; // Image rendering - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 166f66837..96ec63f63 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -7,13 +7,14 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; @implementation GPUImageRawDataInput @synthesize pixelFormat = _pixelFormat; +@synthesize pixelType = _pixelType; #pragma mark - #pragma mark Initialization and teardown - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; { - if (!(self = [self initWithBytes:bytesToUpload size:imageSize pixelFormat:GPUPixelFormatBGRA])) + if (!(self = [self initWithBytes:bytesToUpload size:imageSize pixelFormat:GPUPixelFormatBGRA type:GPUPixelTypeUByte])) { return nil; } @@ -22,6 +23,16 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; } - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat; +{ + if (!(self = [self initWithBytes:bytesToUpload size:imageSize pixelFormat:pixelFormat type:GPUPixelTypeUByte])) + { + return nil; + } + + return self; +} + +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat type:(GPUPixelType)pixelType; { if (!(self = [super init])) { @@ -32,6 +43,7 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat: uploadedImageSize = imageSize; self.pixelFormat = pixelFormat; + self.pixelType = pixelType; [self uploadBytes:bytesToUpload]; @@ -56,7 +68,7 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; [self initializeOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, (GLint)_pixelFormat, GL_UNSIGNED_BYTE, bytesToUpload); + glTexImage2D(GL_TEXTURE_2D, 0, _pixelFormat==GPUPixelFormatRGB ? GL_RGB : GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, (GLint)_pixelFormat, (GLenum)_pixelType, bytesToUpload); } - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; From b61b50edd9b1c2aee5141022e6dde472d15b1143 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Tue, 11 Dec 2012 22:13:39 +1300 Subject: [PATCH 293/695] GPUImageSolidColorGenerator: fix setColor:(GPUVector4)newValue method implementation It didn't actually use the newValue, it instead simply preserved the existing colour. So if you tried to use this method to set colour you'd be banging your head against a wall for an hour (so I've heard ;-) Signed-off-by: Karl von Randow --- framework/Source/GPUImageSolidColorGenerator.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m index e717d0cf6..7d4458a3d 100644 --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -60,7 +60,7 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text - (void)setColor:(GPUVector4)newValue; { - [self setColorRed:_color.one green:_color.two blue:_color.three alpha:_color.four]; + [self setColorRed:newValue.one green:newValue.two blue:newValue.three alpha:newValue.four]; } - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; From 8e8296e404d091895e5e78b873d4ed1b60bc8177 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Tue, 11 Dec 2012 22:20:36 +1300 Subject: [PATCH 294/695] GPUImageVideoCamera: the delegate shouldn't be retained Retaining a delegate doesn't follow the usual pattern of delegates and thus could result in a retain cycle. I have changed the delegate to be __unsafe_unretained. Signed-off-by: Karl von Randow --- framework/Source/GPUImageVideoCamera.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 2a6d68d4b..1d152d54d 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -31,7 +31,7 @@ GPUImageRotationMode outputRotation; dispatch_semaphore_t frameRenderingSemaphore; - id _delegate; + __unsafe_unretained id _delegate; } /// The AVCaptureSession used to capture from the camera @@ -61,7 +61,7 @@ /// These properties determine whether or not the two camera orientations should be mirrored. By default, both are NO. @property(readwrite, nonatomic) BOOL horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera; -@property(nonatomic, retain) id delegate; +@property(nonatomic, assign) id delegate; /// @name Initialization and teardown From 27cf07d045468852cda95a8fbedbf5ffa8a3d3ea Mon Sep 17 00:00:00 2001 From: myeyesareblind Date: Sat, 15 Dec 2012 00:12:17 +0200 Subject: [PATCH 295/695] GPUImageToneCurveFilter # initWithACVData added --- framework/Source/GPUImageToneCurveFilter.h | 2 + framework/Source/GPUImageToneCurveFilter.m | 98 ++++++++++------------ 2 files changed, 48 insertions(+), 52 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.h b/framework/Source/GPUImageToneCurveFilter.h index 328b6ab5b..ff4ae92e7 100755 --- a/framework/Source/GPUImageToneCurveFilter.h +++ b/framework/Source/GPUImageToneCurveFilter.h @@ -8,6 +8,8 @@ @property(readwrite, nonatomic, copy) NSArray *rgbCompositeControlPoints; // Initialization and teardown +- (id)initWithACVData:(NSData*)data; + - (id)initWithACV:(NSString*)curveFilename; - (id)initWithACVURL:(NSURL*)curveFileURL; diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index a59ec0e13..8a8f61605 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -24,40 +24,33 @@ @interface GPUImageACVFile : NSObject{ @property(strong,nonatomic) NSArray *greenCurvePoints; @property(strong,nonatomic) NSArray *blueCurvePoints; -- (id) initWithCurveFilePathURL:(NSURL*)curveFilePathURL; +- (id) initWithACVFileData:(NSData*)data; + +unsigned short int16WithBytes(Byte* bytes); @end @implementation GPUImageACVFile @synthesize rgbCompositeCurvePoints, redCurvePoints, greenCurvePoints, blueCurvePoints; -- (id) initWithCurveFilePathURL:(NSURL*)curveFilePathURL -{ +- (id) initWithACVFileData:(NSData *)data { self = [super init]; - if (self != nil) - { - NSError* error = nil; - NSFileHandle* file = [NSFileHandle fileHandleForReadingFromURL:curveFilePathURL - error:&error]; - - if ((file == nil) || (error != nil)) + if (self != nil) + { + if (data.length == 0) { - NSLog(@"Failed to open file: %@", error); + NSLog(@"failed to init ACVFile with data:%@", data); return self; } - NSData *databuffer; - - // 2 bytes, Version ( = 1 or = 4) - databuffer = [file readDataOfLength: 2]; - version = CFSwapInt16BigToHost(*(int*)([databuffer bytes])); + Byte* rawBytes = (Byte*) [data bytes]; + version = int16WithBytes(rawBytes); + rawBytes+=2; - // 2 bytes, Count of curves in the file. - [file seekToFileOffset:2]; - databuffer = [file readDataOfLength:2]; - totalCurves = CFSwapInt16BigToHost(*(int*)([databuffer bytes])); + totalCurves = int16WithBytes(rawBytes); + rawBytes+=2; NSMutableArray *curves = [NSMutableArray new]; @@ -65,40 +58,37 @@ - (id) initWithCurveFilePathURL:(NSURL*)curveFilePathURL // The following is the data for each curve specified by count above for (NSInteger x = 0; x Date: Fri, 14 Dec 2012 17:08:43 -0600 Subject: [PATCH 296/695] Fixed framework under iOS 4.x. Fixed the bulge distortion filter, which was triggering crashes on certain devices. --- .../Source/GPUImageBulgeDistortionFilter.m | 41 +++++++++---------- framework/Source/GPUImageOutput.m | 5 +++ framework/Source/GPUImageVideoCamera.m | 4 ++ 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index aa7ed6d38..d9536879b 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -10,29 +10,26 @@ uniform highp vec2 center; uniform highp float radius; uniform highp float scale; - + void main() - { - highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); - highp float dist = distance(center, textureCoordinateToUse); - textureCoordinateToUse = textureCoordinate; - - if (dist < radius) - { - textureCoordinateToUse -= center; - highp float percent = 1.0 - ((radius - dist) / radius) * scale; - percent = percent * percent; - - textureCoordinateToUse = textureCoordinateToUse * percent; - textureCoordinateToUse += center; - - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); - } - else - { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); - } - } +{ + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(center, textureCoordinateToUse); + textureCoordinateToUse = textureCoordinate; + + if (dist < radius) + { + textureCoordinateToUse -= center; + highp float percent = 1.0 - ((radius - dist) / radius) * scale; + percent = percent * percent; + + textureCoordinateToUse = textureCoordinateToUse * percent; + textureCoordinateToUse += center; + } + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); +} + ); @interface GPUImageBulgeDistortionFilter () diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index dc3ca2236..9a020de72 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -131,6 +131,11 @@ - (void)addTarget:(id)newTarget; { NSInteger nextAvailableTextureIndex = [newTarget nextAvailableTextureIndex]; [self addTarget:newTarget atTextureLocation:nextAvailableTextureIndex]; + if (outputTexture) + { + [self setInputTextureForTarget:newTarget atIndex:nextAvailableTextureIndex]; + } + if ([newTarget shouldIgnoreUpdatesToThisTarget]) { _targetToIgnoreForUpdates = newTarget; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index de4357a99..86664c4ca 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -76,6 +76,10 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // Need to remove the initially created texture [self deleteOutputTexture]; } + else + { + [self initializeOutputTextureIfNeeded]; + } }); // Grab the back-facing or front-facing camera From 6016767cd2aff47b82ff49217d91d7a5fc88b855 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 15 Dec 2012 15:34:17 -0700 Subject: [PATCH 297/695] Add GPUGaussianBlurPositionFilter and restore the original code for GPUGaussianBlurFilter --- framework/Source/GPUImageGaussianBlurFilter.h | 10 +- framework/Source/GPUImageGaussianBlurFilter.m | 96 ++-------- .../GPUImageGaussianBlurPositionFilter.h | 22 +++ .../GPUImageGaussianBlurPositionFilter.m | 168 ++++++++++++++++++ 4 files changed, 206 insertions(+), 90 deletions(-) create mode 100755 framework/Source/GPUImageGaussianBlurPositionFilter.h create mode 100755 framework/Source/GPUImageGaussianBlurPositionFilter.m diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index 00d1c73de..bf920ca7c 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -4,19 +4,11 @@ */ @interface GPUImageGaussianBlurFilter : GPUImageTwoPassTextureSamplingFilter { - GLint horizontalBlurSizeUniform, verticalBlurSizeUniform, blurCenterUniform, blurRadiusUniform, aspectRatioUniform; + GLint horizontalBlurSizeUniform, verticalBlurSizeUniform; } /** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 */ @property (readwrite, nonatomic) CGFloat blurSize; -/** Center for the blur, defaults to 0.5, 0.5 - */ -@property (readwrite, nonatomic) CGPoint blurCenter; - -/** Radius for the blur, defaults to 1.0 - */ -@property (readwrite, nonatomic) CGFloat blurRadius; - @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index 8f1c0acda..860df5da3 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -10,6 +10,7 @@ uniform highp float texelWidthOffset; uniform highp float texelHeightOffset; uniform highp float blurSize; + varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; @@ -39,49 +40,27 @@ void main() { varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - - uniform highp float aspectRatio; - uniform lowp vec2 blurCenter; - uniform highp float blurRadius; void main() { - highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); - highp float dist = distance(blurCenter, textureCoordinateToUse); - - if (dist < blurRadius) - { - lowp vec4 sum = vec4(0.0); - - sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; - sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; - sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; - - gl_FragColor = sum; - } - else - { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate); - } + lowp vec4 sum = vec4(0.0); + + sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; + sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; + sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; + + gl_FragColor = sum; } ); -@interface GPUImageGaussianBlurFilter () - -@property (readwrite, nonatomic) CGFloat aspectRatio; - -@end - @implementation GPUImageGaussianBlurFilter @synthesize blurSize = _blurSize; -@synthesize blurCenter = _blurCenter; -@synthesize aspectRatio = _aspectRatio; - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString @@ -97,13 +76,8 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad horizontalBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; verticalBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; - aspectRatioUniform = [secondFilterProgram uniformIndex:@"aspectRatio"]; - blurCenterUniform = [secondFilterProgram uniformIndex:@"blurCenter"]; - blurRadiusUniform = [secondFilterProgram uniformIndex:@"blurRadius"]; self.blurSize = 1.0; - self.blurRadius = 1.0; - self.blurCenter = CGPointMake(0.5, 0.5); return self; } @@ -116,53 +90,13 @@ - (id)init; secondStageFragmentShaderFromString:nil]; } -- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; -{ - CGSize oldInputSize = inputTextureSize; - [super setInputSize:newSize atIndex:textureIndex]; - - if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) - { - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; - } - else - { - [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; - } - } -} - #pragma mark Getters and Setters -- (void) setBlurSize:(CGFloat)blurSize; -{ +- (void) setBlurSize:(CGFloat)blurSize { _blurSize = blurSize; [self setFloat:_blurSize forUniform:horizontalBlurSizeUniform program:filterProgram]; [self setFloat:_blurSize forUniform:verticalBlurSizeUniform program:secondFilterProgram]; } -- (void) setBlurCenter:(CGPoint)blurCenter; -{ - _blurCenter = blurCenter; - - [self setPoint:_blurCenter forUniform:blurCenterUniform program:secondFilterProgram]; -} - -- (void) setBlurRadius:(CGFloat)blurRadius; -{ - _blurRadius = blurRadius; - - [self setFloat:_blurRadius forUniform:blurRadiusUniform program:secondFilterProgram]; -} - -- (void) setAspectRatio:(CGFloat)newValue; -{ - _aspectRatio = newValue; - - [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:secondFilterProgram]; -} - @end diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.h b/framework/Source/GPUImageGaussianBlurPositionFilter.h new file mode 100755 index 000000000..00d1c73de --- /dev/null +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.h @@ -0,0 +1,22 @@ +#import "GPUImageTwoPassTextureSamplingFilter.h" + +/** A more generalized 9x9 Gaussian blur filter + */ +@interface GPUImageGaussianBlurFilter : GPUImageTwoPassTextureSamplingFilter +{ + GLint horizontalBlurSizeUniform, verticalBlurSizeUniform, blurCenterUniform, blurRadiusUniform, aspectRatioUniform; +} + +/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 + */ +@property (readwrite, nonatomic) CGFloat blurSize; + +/** Center for the blur, defaults to 0.5, 0.5 + */ +@property (readwrite, nonatomic) CGPoint blurCenter; + +/** Radius for the blur, defaults to 1.0 + */ +@property (readwrite, nonatomic) CGFloat blurRadius; + +@end diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.m b/framework/Source/GPUImageGaussianBlurPositionFilter.m new file mode 100755 index 000000000..8f1c0acda --- /dev/null +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.m @@ -0,0 +1,168 @@ +#import "GPUImageGaussianBlurFilter.h" + +NSString *const kGPUImageGaussianBlurVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + const lowp int GAUSSIAN_SAMPLES = 9; + + uniform highp float texelWidthOffset; + uniform highp float texelHeightOffset; + uniform highp float blurSize; + varying highp vec2 textureCoordinate; + varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + void main() { + gl_Position = position; + textureCoordinate = inputTextureCoordinate.xy; + + // Calculate the positions for the blur + int multiplier = 0; + highp vec2 blurStep; + highp vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset) * blurSize; + + for (lowp int i = 0; i < GAUSSIAN_SAMPLES; i++) { + multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2)); + // Blur in x (horizontal) + blurStep = float(multiplier) * singleStepOffset; + blurCoordinates[i] = inputTextureCoordinate.xy + blurStep; + } + } +); + +NSString *const kGPUImageGaussianBlurFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + const lowp int GAUSSIAN_SAMPLES = 9; + + varying highp vec2 textureCoordinate; + varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + uniform highp float aspectRatio; + uniform lowp vec2 blurCenter; + uniform highp float blurRadius; + + void main() { + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(blurCenter, textureCoordinateToUse); + + if (dist < blurRadius) + { + lowp vec4 sum = vec4(0.0); + + sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; + sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; + sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; + + gl_FragColor = sum; + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate); + } + } +); + +@interface GPUImageGaussianBlurFilter () + +@property (readwrite, nonatomic) CGFloat aspectRatio; + +@end + +@implementation GPUImageGaussianBlurFilter + +@synthesize blurSize = _blurSize; +@synthesize blurCenter = _blurCenter; +@synthesize aspectRatio = _aspectRatio; + +- (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString + firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString + secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString + secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString { + + if (!(self = [super initWithFirstStageVertexShaderFromString:firstStageVertexShaderString ? firstStageVertexShaderString : kGPUImageGaussianBlurVertexShaderString + firstStageFragmentShaderFromString:firstStageFragmentShaderString ? firstStageFragmentShaderString : kGPUImageGaussianBlurFragmentShaderString + secondStageVertexShaderFromString:secondStageVertexShaderString ? secondStageVertexShaderString : kGPUImageGaussianBlurVertexShaderString + secondStageFragmentShaderFromString:secondStageFragmentShaderString ? secondStageFragmentShaderString : kGPUImageGaussianBlurFragmentShaderString])) { + return nil; + } + + horizontalBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; + verticalBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; + aspectRatioUniform = [secondFilterProgram uniformIndex:@"aspectRatio"]; + blurCenterUniform = [secondFilterProgram uniformIndex:@"blurCenter"]; + blurRadiusUniform = [secondFilterProgram uniformIndex:@"blurRadius"]; + + self.blurSize = 1.0; + self.blurRadius = 1.0; + self.blurCenter = CGPointMake(0.5, 0.5); + + return self; +} + +- (id)init; +{ + return [self initWithFirstStageVertexShaderFromString:nil + firstStageFragmentShaderFromString:nil + secondStageVertexShaderFromString:nil + secondStageFragmentShaderFromString:nil]; +} + +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) + { + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } + } +} + +#pragma mark Getters and Setters + +- (void) setBlurSize:(CGFloat)blurSize; +{ + _blurSize = blurSize; + + [self setFloat:_blurSize forUniform:horizontalBlurSizeUniform program:filterProgram]; + [self setFloat:_blurSize forUniform:verticalBlurSizeUniform program:secondFilterProgram]; +} + +- (void) setBlurCenter:(CGPoint)blurCenter; +{ + _blurCenter = blurCenter; + + [self setPoint:_blurCenter forUniform:blurCenterUniform program:secondFilterProgram]; +} + +- (void) setBlurRadius:(CGFloat)blurRadius; +{ + _blurRadius = blurRadius; + + [self setFloat:_blurRadius forUniform:blurRadiusUniform program:secondFilterProgram]; +} + +- (void) setAspectRatio:(CGFloat)newValue; +{ + _aspectRatio = newValue; + + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:secondFilterProgram]; +} + +@end From 4d42ff747665fbd3667180dd4fcb70b8c24fa420 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 15 Dec 2012 15:39:59 -0700 Subject: [PATCH 298/695] Fix compile errors for new blur filter --- framework/Source/GPUImage.h | 2 ++ .../GPUImageGaussianBlurPositionFilter.h | 2 +- .../GPUImageGaussianBlurPositionFilter.m | 18 +++++++++--------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 3aa6898f4..8acb3f494 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -22,6 +22,7 @@ #import "GPUImageFilter.h" #import "GPUImageTwoInputFilter.h" #import "GPUImagePixellateFilter.h" +#import "GPUImagePixellatePositionFilter.h" #import "GPUImageSepiaFilter.h" #import "GPUImageColorInvertFilter.h" #import "GPUImageSaturationFilter.h" @@ -40,6 +41,7 @@ #import "GPUImageKuwaharaFilter.h" #import "GPUImageVignetteFilter.h" #import "GPUImageGaussianBlurFilter.h" +#import "GPUImageGaussianBlurPositionFilter.h" #import "GPUImageGaussianSelectiveBlurFilter.h" #import "GPUImageOverlayBlendFilter.h" #import "GPUImageDarkenBlendFilter.h" diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.h b/framework/Source/GPUImageGaussianBlurPositionFilter.h index 00d1c73de..648eac867 100755 --- a/framework/Source/GPUImageGaussianBlurPositionFilter.h +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.h @@ -2,7 +2,7 @@ /** A more generalized 9x9 Gaussian blur filter */ -@interface GPUImageGaussianBlurFilter : GPUImageTwoPassTextureSamplingFilter +@interface GPUImageGaussianBlurPositionFilter : GPUImageTwoPassTextureSamplingFilter { GLint horizontalBlurSizeUniform, verticalBlurSizeUniform, blurCenterUniform, blurRadiusUniform, aspectRatioUniform; } diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.m b/framework/Source/GPUImageGaussianBlurPositionFilter.m index 8f1c0acda..5d639c3a4 100755 --- a/framework/Source/GPUImageGaussianBlurPositionFilter.m +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.m @@ -1,6 +1,6 @@ -#import "GPUImageGaussianBlurFilter.h" +#import "GPUImageGaussianBlurPositionFilter.h" -NSString *const kGPUImageGaussianBlurVertexShaderString = SHADER_STRING +NSString *const kGPUImageGaussianBlurPositionVertexShaderString = SHADER_STRING ( attribute vec4 position; attribute vec4 inputTextureCoordinate; @@ -31,7 +31,7 @@ void main() { } ); -NSString *const kGPUImageGaussianBlurFragmentShaderString = SHADER_STRING +NSString *const kGPUImageGaussianBlurPositionFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -71,13 +71,13 @@ void main() { } ); -@interface GPUImageGaussianBlurFilter () +@interface GPUImageGaussianBlurPositionFilter () @property (readwrite, nonatomic) CGFloat aspectRatio; @end -@implementation GPUImageGaussianBlurFilter +@implementation GPUImageGaussianBlurPositionFilter @synthesize blurSize = _blurSize; @synthesize blurCenter = _blurCenter; @@ -88,10 +88,10 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString { - if (!(self = [super initWithFirstStageVertexShaderFromString:firstStageVertexShaderString ? firstStageVertexShaderString : kGPUImageGaussianBlurVertexShaderString - firstStageFragmentShaderFromString:firstStageFragmentShaderString ? firstStageFragmentShaderString : kGPUImageGaussianBlurFragmentShaderString - secondStageVertexShaderFromString:secondStageVertexShaderString ? secondStageVertexShaderString : kGPUImageGaussianBlurVertexShaderString - secondStageFragmentShaderFromString:secondStageFragmentShaderString ? secondStageFragmentShaderString : kGPUImageGaussianBlurFragmentShaderString])) { + if (!(self = [super initWithFirstStageVertexShaderFromString:firstStageVertexShaderString ? firstStageVertexShaderString : kGPUImageGaussianBlurPositionVertexShaderString + firstStageFragmentShaderFromString:firstStageFragmentShaderString ? firstStageFragmentShaderString : kGPUImageGaussianBlurPositionFragmentShaderString + secondStageVertexShaderFromString:secondStageVertexShaderString ? secondStageVertexShaderString : kGPUImageGaussianBlurPositionVertexShaderString + secondStageFragmentShaderFromString:secondStageFragmentShaderString ? secondStageFragmentShaderString : kGPUImageGaussianBlurPositionFragmentShaderString])) { return nil; } From 946e2a89f8f49b8fa44f2871bb6e91d7c256be97 Mon Sep 17 00:00:00 2001 From: tichou Date: Mon, 31 Dec 2012 11:44:25 +0100 Subject: [PATCH 299/695] Added cancelRecording method to movieWriter Added simple wrapper for AVAssetWriter cancelWriting based on movieWriter finishWriting in order to cancel a recording and avoid flushing the file to disk --- framework/Source/GPUImageMovieWriter.h | 1 + framework/Source/GPUImageMovieWriter.m | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 50cacc09e..a25876679 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -55,6 +55,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; - (void)startRecording; - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; - (void)finishRecording; +- (void)cancelRecording; - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; - (void)enableSynchronizationCallbacks; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 03f1fa433..66f8e258e 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -245,6 +245,21 @@ - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; [self startRecording]; } +- (void)cancelRecording; +{ + if (assetWriter.status == AVAssetWriterStatusCompleted) + { + return; + } + + isRecording = NO; + runOnMainQueueWithoutDeadlocking(^{ + [assetWriterVideoInput markAsFinished]; + [assetWriterAudioInput markAsFinished]; + [assetWriter cancelWriting]; + }); +} + - (void)finishRecording; { if (assetWriter.status == AVAssetWriterStatusCompleted) From 1c1b2fe97afaf69ac11cdbd95c85b5ad99d123f0 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 1 Jan 2013 18:22:25 -0600 Subject: [PATCH 300/695] Fixed issues with uniforms not updating on multiple instances of the same filter, while still maintaining shader program caching. --- .../MultiViewViewController.m | 25 +++++++ framework/Source/GPUImageFilter.h | 6 +- framework/Source/GPUImageFilter.m | 74 +++++++++++++------ .../Source/GPUImageSobelEdgeDetectionFilter.m | 8 +- framework/Source/GPUImageTwoPassFilter.h | 2 + framework/Source/GPUImageTwoPassFilter.m | 33 ++++++++- .../GPUImageTwoPassTextureSamplingFilter.m | 2 + 7 files changed, 122 insertions(+), 28 deletions(-) diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m index aa77367ce..ddd1669aa 100755 --- a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m +++ b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m @@ -42,6 +42,31 @@ - (void)loadView GPUImageFilter *filter2 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader2"]; GPUImageSepiaFilter *filter3 = [[GPUImageSepiaFilter alloc] init]; +// GPUImageBrightnessFilter *filter1 = [[GPUImageBrightnessFilter alloc] init]; +// GPUImageBrightnessFilter *filter2 = [[GPUImageBrightnessFilter alloc] init]; +// [filter2 setBrightness:0.5]; +// GPUImageBrightnessFilter *filter3 = [[GPUImageBrightnessFilter alloc] init]; +// [filter3 setBrightness:-0.5]; + +// GPUImageSobelEdgeDetectionFilter *filter1 = [[GPUImageSobelEdgeDetectionFilter alloc] init]; +// GPUImageSobelEdgeDetectionFilter *filter2 = [[GPUImageSobelEdgeDetectionFilter alloc] init]; +// [filter2 setTexelHeight:(1.0 / 1024.0)]; +// [filter2 setTexelWidth:(1.0 / 768.0)]; +// GPUImageSobelEdgeDetectionFilter *filter3 = [[GPUImageSobelEdgeDetectionFilter alloc] init]; +// [filter3 setTexelHeight:(1.0 / 200.0)]; +// [filter3 setTexelWidth:(1.0 / 400.0)]; + +// GPUImageTransformFilter *filter1 = [[GPUImageTransformFilter alloc] init]; +// GPUImageTransformFilter *filter2 = [[GPUImageTransformFilter alloc] init]; +// CATransform3D perspectiveTransform = CATransform3DIdentity; +// perspectiveTransform.m34 = 0.4; +// perspectiveTransform.m33 = 0.4; +// perspectiveTransform = CATransform3DScale(perspectiveTransform, 0.75, 0.75, 0.75); +// perspectiveTransform = CATransform3DRotate(perspectiveTransform, 0.5, 0.0, 1.0, 0.0); +// [filter2 setTransform3D:perspectiveTransform]; +// GPUImageTransformFilter *filter3 = [[GPUImageTransformFilter alloc] init]; +// [filter3 setAffineTransform:CGAffineTransformMakeRotation(1.0)]; + // For thumbnails smaller than the input video size, we currently need to make them render at a smaller size. // This is to avoid wasting processing time on larger frames than will be displayed. // You'll need to use -forceProcessingAtSize: with a zero size to re-enable full frame processing of video. diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 02b72c234..764c31bf5 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -60,6 +60,8 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; CGSize currentFilterSize; GPUImageRotationMode inputRotation; + + NSMutableDictionary *uniformStateRestorationBlocks; } @property(readonly) CVPixelBufferRef renderTarget; @@ -111,7 +113,6 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; /// @name Rendering + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; -- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; - (CGSize)outputFrameSize; @@ -135,4 +136,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; + @end diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 3478cb266..39428fe34 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -47,6 +47,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad return nil; } + uniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; preparedToCaptureImage = NO; _preventRendering = NO; inputRotation = kGPUImageNoRotation; @@ -508,11 +509,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; -{ - -} - - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; { if (self.frameProcessingCompletionBlock != NULL) @@ -626,7 +622,9 @@ - (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLPr { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + }]; }); } @@ -634,7 +632,9 @@ - (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLPr { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + }]; }); } @@ -642,7 +642,9 @@ - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgra { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform1f(uniform, floatValue); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform1f(uniform, floatValue); + }]; }); } @@ -650,12 +652,13 @@ - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgra { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - - GLfloat positionArray[2]; - positionArray[0] = pointValue.x; - positionArray[1] = pointValue.y; - - glUniform2fv(uniform, 1, positionArray); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + GLfloat positionArray[2]; + positionArray[0] = pointValue.x; + positionArray[1] = pointValue.y; + + glUniform2fv(uniform, 1, positionArray); + }]; }); } @@ -664,11 +667,13 @@ - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram * runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - GLfloat sizeArray[2]; - sizeArray[0] = sizeValue.width; - sizeArray[1] = sizeValue.height; - - glUniform2fv(uniform, 1, sizeArray); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + GLfloat sizeArray[2]; + sizeArray[0] = sizeValue.width; + sizeArray[1] = sizeValue.height; + + glUniform2fv(uniform, 1, sizeArray); + }]; }); } @@ -677,7 +682,9 @@ - (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLPro runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); + }]; }); } @@ -686,7 +693,9 @@ - (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLPro runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); + }]; }); } @@ -695,7 +704,9 @@ - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUnifo runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform1fv(uniform, arrayLength, arrayValue); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform1fv(uniform, arrayLength, arrayValue); + }]; }); } @@ -703,10 +714,27 @@ - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform1i(uniform, intValue); + + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform1i(uniform, intValue); + }]; }); } +- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; +{ + [uniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; + uniformStateBlock(); +} + +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; +{ + [uniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ + dispatch_block_t currentBlock = obj; + currentBlock(); + }]; +} + #pragma mark - #pragma mark GPUImageInput diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index c3bc35acf..4b0c1dfb3 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -84,9 +84,11 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); +// [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; + [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; +// glUniform1f(texelWidthUniform, _texelWidth); +// glUniform1f(texelHeightUniform, _texelHeight); }); } } diff --git a/framework/Source/GPUImageTwoPassFilter.h b/framework/Source/GPUImageTwoPassFilter.h index efb51fa68..d04a8b0e8 100755 --- a/framework/Source/GPUImageTwoPassFilter.h +++ b/framework/Source/GPUImageTwoPassFilter.h @@ -9,6 +9,8 @@ GLint secondFilterInputTextureUniform, secondFilterInputTextureUniform2; GLuint secondFilterFramebuffer; + + NSMutableDictionary *secondProgramUniformStateRestorationBlocks; } // Initialization and teardown diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index fff159bd7..e427d2fcb 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -12,6 +12,8 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade return nil; } + secondProgramUniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; + runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; @@ -361,7 +363,6 @@ - (void)releaseInputTexturesIfNeeded; { } - - (void)prepareForImageCapture; { if (preparedToCaptureImage) @@ -385,5 +386,35 @@ - (void)prepareForImageCapture; }); } +- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; +{ + if (shaderProgram == filterProgram) + { + [uniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; + } + else + { + [secondProgramUniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; + } + uniformStateBlock(); +} + +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; +{ + if (programIndex == 0) + { + [uniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ + dispatch_block_t currentBlock = obj; + currentBlock(); + }]; + } + else + { + [secondProgramUniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ + dispatch_block_t currentBlock = obj; + currentBlock(); + }]; + } +} @end diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index af6bcbdc8..060593b77 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -23,6 +23,8 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade - (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; { + [super setUniformsForProgramAtIndex:programIndex]; + if (programIndex == 0) { glUniform1f(verticalPassTexelWidthOffsetUniform, verticalPassTexelWidthOffset); From 94d86bfe662b4da8dc81027152970b710202db43 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 9 Jan 2013 18:34:09 -0600 Subject: [PATCH 301/695] A5 devices now take in camera data as YUV, speeding frame processing from 2.2 ms to 1.5 ms on 4S. No impact on memory usage, surprisingly. --- .../ShowcaseFilterViewController.m | 1 + .../SimplePhotoFilter/PhotoViewController.m | 7 +- .../GPUImageHoughTransformLineDetector.m | 1 + framework/Source/GPUImageOpenGLESContext.h | 2 + framework/Source/GPUImageOpenGLESContext.m | 28 ++ framework/Source/GPUImageStillCamera.m | 25 +- framework/Source/GPUImageVideoCamera.h | 3 + framework/Source/GPUImageVideoCamera.m | 320 +++++++++++++++--- 8 files changed, 338 insertions(+), 49 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index dd12c260f..c65690022 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -63,6 +63,7 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (void)setupFilter; { videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; facesSwitch.hidden = YES; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 156e12663..353589e8d 100755 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -53,18 +53,19 @@ - (void)viewDidLoad // stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; // filter = [[GPUImageGammaFilter alloc] init]; -// filter = [[GPUImageSketchFilter alloc] init]; + filter = [[GPUImageSketchFilter alloc] init]; // filter = [[GPUImageUnsharpMaskFilter alloc] init]; // [(GPUImageSketchFilter *)filter setTexelHeight:(1.0 / 1024.0)]; // [(GPUImageSketchFilter *)filter setTexelWidth:(1.0 / 768.0)]; // filter = [[GPUImageSmoothToonFilter alloc] init]; - filter = [[GPUImageSepiaFilter alloc] init]; +// filter = [[GPUImageSepiaFilter alloc] init]; +// filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.5, 0.5, 0.5, 0.5)]; // secondFilter = [[GPUImageSepiaFilter alloc] init]; // terminalFilter = [[GPUImageSepiaFilter alloc] init]; // [filter addTarget:secondFilter]; // [secondFilter addTarget:terminalFilter]; - [filter prepareForImageCapture]; +// [filter prepareForImageCapture]; // [terminalFilter prepareForImageCapture]; [stillCamera addTarget:filter]; diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m index 6edfa881a..e701067f5 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -11,6 +11,7 @@ @implementation GPUImageHoughTransformLineDetector @synthesize linesDetectedBlock; @synthesize edgeThreshold; @synthesize lineDetectionThreshold; +@synthesize intermediateImages = _intermediateImages; - (id)init; { diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index de552e12b..369ecb9e4 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -22,6 +22,8 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; ++ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; ++ (BOOL)deviceSupportsRedTextures; + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - (void)presentBufferForDisplay; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index a90366f8a..52e41be1b 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -91,6 +91,34 @@ + (GLint)maximumTextureUnitsForThisDevice; return maxTextureUnits; } ++ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; +{ + static dispatch_once_t pred; + static NSArray *extensionNames = nil; + + // Cache extensions for later quick reference, since this won't change for a given device + dispatch_once(&pred, ^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + NSString *extensionsString = [NSString stringWithCString:(const char *)glGetString(GL_EXTENSIONS) encoding:NSASCIIStringEncoding]; + extensionNames = [extensionsString componentsSeparatedByString:@" "]; + }); + + return [extensionNames containsObject:extension]; +} + ++ (BOOL)deviceSupportsRedTextures; +{ + static dispatch_once_t pred; + static BOOL supportsRedTextures = NO; + + dispatch_once(&pred, ^{ + supportsRedTextures = [GPUImageOpenGLESContext deviceSupportsOpenGLESExtension:@"GL_EXT_texture_rg"]; + }); + + return supportsRedTextures; +} + + + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; { GLint maxTextureSize = [self maximumTextureSizeForThisDevice]; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 837bb35a8..df5001deb 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -51,6 +51,9 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi @implementation GPUImageStillCamera +@synthesize currentCaptureMetadata = _currentCaptureMetadata; +@synthesize jpegCompressionQuality = _jpegCompressionQuality; + #pragma mark - #pragma mark Initialization and teardown @@ -64,7 +67,17 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [self.captureSession beginConfiguration]; photoOutput = [[AVCaptureStillImageOutput alloc] init]; - [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + + if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + { + // TODO: Check for full range output and use that if available + [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + else + { + [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + [self.captureSession addOutput:photoOutput]; @@ -199,7 +212,15 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) { CMSampleBufferRef sampleBuffer; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + + if (captureAsYUV) + { + NSAssert(NO, @"Error: no downsampling for YUV input in the framework yet"); + } + else + { + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + } dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 1d152d54d..345c5860f 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -30,6 +30,9 @@ BOOL capturePaused; GPUImageRotationMode outputRotation; dispatch_semaphore_t frameRenderingSemaphore; + + BOOL captureAsYUV; + GLuint luminanceTexture, chrominanceTexture; __unsafe_unretained id _delegate; } diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 86664c4ca..97cb22b58 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -1,5 +1,38 @@ #import "GPUImageVideoCamera.h" #import "GPUImageMovieWriter.h" +#import "GPUImageFilter.h" + +NSString *const kGPUImageYUVVideoRangeConversionFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D luminanceTexture; + uniform sampler2D chrominanceTexture; + + void main() + { + mediump vec3 yuv; + lowp vec3 rgb; + + yuv.x = texture2D(luminanceTexture, textureCoordinate).r; + yuv.yz = texture2D(chrominanceTexture, textureCoordinate).rg - vec2(0.5, 0.5); + + // BT.601, which is the standard for SDTV is provided as a reference + /* + rgb = mat3( 1, 1, 1, + 0, -.39465, 2.03211, + 1.13983, -.58060, 0) * yuv; + */ + + // Using BT.709 which is the standard for HDTV + rgb = mat3( 1, 1, 1, + 0, -.21482, 2.12798, + 1.28033, -.38059, 0) * yuv; + + gl_FragColor = vec4(rgb, 1); + } +); + #pragma mark - #pragma mark Private methods and instance variables @@ -14,9 +47,18 @@ @interface GPUImageVideoCamera () NSInteger _frameRate; dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; + + GLProgram *yuvConversionProgram; + GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; + GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; + GLuint yuvConversionFramebuffer; + + int imageBufferWidth, imageBufferHeight; } - (void)updateOrientationSendToTargets; +- (void)convertYUVToRGBOutput; +- (void)setYUVConversionFBO; @end @@ -58,8 +100,43 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD _runBenchmark = NO; capturePaused = NO; outputRotation = kGPUImageNoRotation; + captureAsYUV = YES; runSynchronouslyOnVideoProcessingQueue(^{ + + if (captureAsYUV) + { + yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionFragmentShaderString]; + + if (!yuvConversionProgram.initialized) + { + [yuvConversionProgram addAttribute:@"position"]; + [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; + + if (![yuvConversionProgram link]) + { + NSString *progLog = [yuvConversionProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [yuvConversionProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + yuvConversionProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; + yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; + yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; + yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; + + [GPUImageOpenGLESContext setActiveShaderProgram:yuvConversionProgram]; + + glEnableVertexAttribArray(yuvConversionPositionAttribute); + glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); + } + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { [GPUImageOpenGLESContext useImageProcessingContext]; @@ -74,7 +151,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } // Need to remove the initially created texture - [self deleteOutputTexture]; +// [self deleteOutputTexture]; } else { @@ -114,7 +191,15 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD videoOutput = [[AVCaptureVideoDataOutput alloc] init]; [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + { + // TODO: Check for full range output and use that if available + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + else + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; // [videoOutput setSampleBufferDelegate:self queue:[GPUImageOpenGLESContext sharedOpenGLESQueue]]; @@ -171,6 +256,11 @@ - (void)dealloc { dispatch_release(frameRenderingSemaphore); } + + if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + { + [self destroyYUVConversionFBO]; + } } - (void)removeInputsAndOutputs; @@ -350,6 +440,33 @@ - (AVCaptureConnection *)videoCaptureConnection { #define INITIALFRAMESTOIGNOREFORBENCHMARK 5 +- (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth height:(int)bufferHeight time:(CMTime)currentTime; +{ + for (id currentTarget in targets) + { + if ([currentTarget enabled]) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; + + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; + } + else + { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + } + } + } +} + - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { if (capturePaused) @@ -368,55 +485,87 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { - CVPixelBufferLockBaseAddress(cameraFrame, 0); - + CVOpenGLESTextureRef luminanceTextureRef = NULL; + CVOpenGLESTextureRef chrominanceTextureRef = NULL; CVOpenGLESTextureRef texture = NULL; - CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); - - if (!texture || err) { - NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); - NSAssert(NO, @"Camera failure"); - return; - } - outputTexture = CVOpenGLESTextureGetName(texture); - // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - for (id currentTarget in targets) + if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) { - if ([currentTarget enabled]) + + if ( (imageBufferWidth != bufferWidth) && (imageBufferHeight != bufferHeight) ) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + imageBufferWidth = bufferWidth; + imageBufferHeight = bufferHeight; - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - - [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; - } - else - { - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - } + [self destroyYUVConversionFBO]; + [self createYUVConversionFBO]; + } + + CVReturn err; + // Y-plane + glActiveTexture(GL_TEXTURE4); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + if (err) + { + NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + luminanceTexture = CVOpenGLESTextureGetName(luminanceTextureRef); + glBindTexture(GL_TEXTURE_2D, luminanceTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + // UV-plane + glActiveTexture(GL_TEXTURE5); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + if (err) + { + NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); } + + chrominanceTexture = CVOpenGLESTextureGetName(chrominanceTextureRef); + glBindTexture(GL_TEXTURE_2D, chrominanceTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + [self convertYUVToRGBOutput]; + + [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; + + CVPixelBufferUnlockBaseAddress(cameraFrame, 0); + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(luminanceTextureRef); + CFRelease(chrominanceTextureRef); + } + else + { + CVPixelBufferLockBaseAddress(cameraFrame, 0); + + CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); + + if (!texture || err) { + NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + NSAssert(NO, @"Camera failure"); + return; + } + + outputTexture = CVOpenGLESTextureGetName(texture); + // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; + + CVPixelBufferUnlockBaseAddress(cameraFrame, 0); + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(texture); + + outputTexture = 0; } - CVPixelBufferUnlockBaseAddress(cameraFrame, 0); - - // Flush the CVOpenGLESTexture cache and release the texture - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(texture); - outputTexture = 0; if (_runBenchmark) { @@ -432,7 +581,6 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; } else { - // Upload to texture CVPixelBufferLockBaseAddress(cameraFrame, 0); glBindTexture(GL_TEXTURE_2D, outputTexture); @@ -478,6 +626,90 @@ - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; [self.audioEncodingTarget processAudioBuffer:sampleBuffer]; } +- (void)convertYUVToRGBOutput; +{ + [GPUImageOpenGLESContext setActiveShaderProgram:yuvConversionProgram]; + [self setYUVConversionFBO]; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + static const GLfloat squareVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat textureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, luminanceTexture); + glUniform1i(yuvConversionLuminanceTextureUniform, 4); + + glActiveTexture(GL_TEXTURE5); + glBindTexture(GL_TEXTURE_2D, chrominanceTexture); + glUniform1i(yuvConversionChrominanceTextureUniform, 5); + + glVertexAttribPointer(yuvConversionPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); + glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +- (void)setYUVConversionFBO; +{ + if (!yuvConversionFramebuffer) + { + [self createYUVConversionFBO]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); + + glViewport(0, 0, imageBufferWidth, imageBufferHeight); +} + +- (void)createYUVConversionFBO; +{ + [self initializeOutputTextureIfNeeded]; + + glActiveTexture(GL_TEXTURE1); + glGenFramebuffers(1, &yuvConversionFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); + + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageBufferWidth, imageBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + [self notifyTargetsAboutNewOutputTexture]; + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + glBindTexture(GL_TEXTURE_2D, 0); + +} + +- (void)destroyYUVConversionFBO; +{ + if (yuvConversionFramebuffer) + { + glDeleteFramebuffers(1, &yuvConversionFramebuffer); + yuvConversionFramebuffer = 0; + } + + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } +} + + #pragma mark - #pragma mark Benchmarking From af168f86175771ac2a9b1aa30454e175be230521 Mon Sep 17 00:00:00 2001 From: Raphael Schaad Date: Sun, 13 Jan 2013 00:34:44 -0800 Subject: [PATCH 302/695] ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in those cases is required. Use iOS 6 version value instead of macro for comparisons because we might get compiled on an old OS that does not define a later. --- framework/Source/GPUImagePicture.m | 3 +++ framework/Source/GPUImageRawDataInput.m | 3 +++ framework/Source/GPUImageVideoCamera.m | 3 +++ 3 files changed, 9 insertions(+) diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 4438d2c92..7a8e18783 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -139,6 +139,8 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot return self; } +// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 - (void)dealloc; { if (imageUpdateSemaphore != NULL) @@ -146,6 +148,7 @@ - (void)dealloc; dispatch_release(imageUpdateSemaphore); } } +#endif #pragma mark - #pragma mark Image rendering diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 96ec63f63..334e1120b 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -50,6 +50,8 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat: return self; } +// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 - (void)dealloc; { if (dataUpdateSemaphore != NULL) @@ -57,6 +59,7 @@ - (void)dealloc; dispatch_release(dataUpdateSemaphore); } } +#endif #pragma mark - #pragma mark Image rendering diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 97cb22b58..c383771f5 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -242,6 +242,8 @@ - (void)dealloc CFRelease(coreVideoTextureCache); } +// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 if (cameraProcessingQueue != NULL) { dispatch_release(cameraProcessingQueue); @@ -256,6 +258,7 @@ - (void)dealloc { dispatch_release(frameRenderingSemaphore); } +#endif if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) { From 74c3810799dd9782b479c2f2290f070c3b4acb8c Mon Sep 17 00:00:00 2001 From: Raphael Schaad Date: Sun, 13 Jan 2013 00:38:01 -0800 Subject: [PATCH 303/695] =?UTF-8?q?AVAssetWriter=20=E2=80=93finishWriting?= =?UTF-8?q?=20is=20deprecated=20in=20iOS=206.0;=20switch=20over=20to=20the?= =?UTF-8?q?=20new=20-finishWritingWithCompletionHandler:=20for=20that=20ve?= =?UTF-8?q?rsion=20and=20up.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/Source/GPUImageMovieWriter.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 66f8e258e..b7fdebc75 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -271,7 +271,11 @@ - (void)finishRecording; runOnMainQueueWithoutDeadlocking(^{ [assetWriterVideoInput markAsFinished]; [assetWriterAudioInput markAsFinished]; +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 [assetWriter finishWriting]; +#else + [assetWriter finishWritingWithCompletionHandler:NULL]; +#endif }); } From 1743b73ab9f7d9340c2ea794dab6b71f765118b6 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 14 Jan 2013 17:39:07 -0600 Subject: [PATCH 304/695] Added YUV camera support to non-A5 GPUs. Added full-range YUV for better color reproduction. Fixed a crashing issue with YUV code on the iPhone 4. --- .../ShowcaseFilterViewController.m | 1 + framework/Source/GPUImageOpenGLESContext.m | 3 + framework/Source/GPUImageStillCamera.m | 38 +++++++- framework/Source/GPUImageVideoCamera.h | 1 + framework/Source/GPUImageVideoCamera.m | 91 +++++++++++++++++-- 5 files changed, 120 insertions(+), 14 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index c65690022..06eb5b03e 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -63,6 +63,7 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (void)setupFilter; { videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 52e41be1b..118532dfd 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -106,6 +106,9 @@ + (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; return [extensionNames containsObject:extension]; } + +// http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt + + (BOOL)deviceSupportsRedTextures; { static dispatch_once_t pred; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index df5001deb..b64cc1806 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -9,6 +9,8 @@ void stillImageDataReleaseCallback(void *releaseRefCon, const void *baseAddress) void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer) { + // CVPixelBufferCreateWithPlanarBytes for YUV input + CGSize originalSize = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); CVPixelBufferLockBaseAddress(cameraFrame, 0); @@ -68,17 +70,45 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD photoOutput = [[AVCaptureStillImageOutput alloc] init]; + // Having a still photo input set to BGRA and video to YUV doesn't work well, so since I don't have YUV resizing for iPhone 4 yet, kick back to BGRA for that device +// if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) { - // TODO: Check for full range output and use that if available - [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + BOOL supportsFullYUVRange = NO; + NSArray *supportedPixelFormats = photoOutput.availableImageDataCVPixelFormatTypes; + for (NSNumber *currentPixelFormat in supportedPixelFormats) + { + if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + { + supportsFullYUVRange = YES; + } + } + + if (supportsFullYUVRange) + { + [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + else + { + [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } } else { [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; } - +// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// { +// // TODO: Check for full range output and use that if available +// [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; +// } +// else +// { +// [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; +// } + [self.captureSession addOutput:photoOutput]; [self.captureSession commitConfiguration]; @@ -213,7 +243,7 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi { CMSampleBufferRef sampleBuffer; - if (captureAsYUV) + if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) { NSAssert(NO, @"Error: no downsampling for YUV input in the framework yet"); } diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 345c5860f..c15a483d2 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -26,6 +26,7 @@ AVCaptureDevice *_inputCamera; AVCaptureDevice *_microphone; AVCaptureDeviceInput *videoInput; + AVCaptureVideoDataOutput *videoOutput; BOOL capturePaused; GPUImageRotationMode outputRotation; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 97cb22b58..83582d904 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -2,7 +2,7 @@ #import "GPUImageMovieWriter.h" #import "GPUImageFilter.h" -NSString *const kGPUImageYUVVideoRangeConversionFragmentShaderString = SHADER_STRING +NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -33,6 +33,37 @@ void main() } ); +NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D luminanceTexture; + uniform sampler2D chrominanceTexture; + + void main() + { + mediump vec3 yuv; + lowp vec3 rgb; + + yuv.x = texture2D(luminanceTexture, textureCoordinate).r; + yuv.yz = texture2D(chrominanceTexture, textureCoordinate).ra - vec2(0.5, 0.5); + + // BT.601, which is the standard for SDTV is provided as a reference + /* + rgb = mat3( 1, 1, 1, + 0, -.39465, 2.03211, + 1.13983, -.58060, 0) * yuv; + */ + + // Using BT.709 which is the standard for HDTV + rgb = mat3( 1, 1, 1, + 0, -.21482, 2.12798, + 1.28033, -.38059, 0) * yuv; + + gl_FragColor = vec4(rgb, 1); + } + ); + #pragma mark - #pragma mark Private methods and instance variables @@ -40,7 +71,6 @@ void main() @interface GPUImageVideoCamera () { AVCaptureDeviceInput *audioInput; - AVCaptureVideoDataOutput *videoOutput; AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; @@ -106,7 +136,15 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD if (captureAsYUV) { - yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionFragmentShaderString]; + [GPUImageOpenGLESContext useImageProcessingContext]; + if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) + { + yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; + } + else + { + yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; + } if (!yuvConversionProgram.initialized) { @@ -191,10 +229,27 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD videoOutput = [[AVCaptureVideoDataOutput alloc] init]; [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; - if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) { - // TODO: Check for full range output and use that if available - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + BOOL supportsFullYUVRange = NO; + NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; + for (NSNumber *currentPixelFormat in supportedPixelFormats) + { + if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + { + supportsFullYUVRange = YES; + } + } + + if (supportsFullYUVRange) + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + else + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } } else { @@ -257,7 +312,8 @@ - (void)dealloc dispatch_release(frameRenderingSemaphore); } - if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) { [self destroyYUVConversionFBO]; } @@ -489,7 +545,8 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVOpenGLESTextureRef chrominanceTextureRef = NULL; CVOpenGLESTextureRef texture = NULL; - if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) // Check for YUV planar inputs to do RGB conversion { if ( (imageBufferWidth != bufferWidth) && (imageBufferHeight != bufferHeight) ) @@ -504,7 +561,14 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVReturn err; // Y-plane glActiveTexture(GL_TEXTURE4); - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + } + else + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + } if (err) { NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); @@ -517,7 +581,14 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; // UV-plane glActiveTexture(GL_TEXTURE5); - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + } + else + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + } if (err) { NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); From e85f2efb6629fbbd9f8b77b6f5633b952e52ecde Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 14 Jan 2013 17:53:43 -0600 Subject: [PATCH 305/695] Fixed compiler macros for targeting iOS 6.0. --- framework/Source/GPUImageMovieWriter.m | 2 +- framework/Source/GPUImagePicture.m | 2 +- framework/Source/GPUImageRawDataInput.m | 4 ++-- framework/Source/GPUImageVideoCamera.m | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index b7fdebc75..28fb58192 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -271,7 +271,7 @@ - (void)finishRecording; runOnMainQueueWithoutDeadlocking(^{ [assetWriterVideoInput markAsFinished]; [assetWriterAudioInput markAsFinished]; -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 +#if (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) [assetWriter finishWriting]; #else [assetWriter finishWritingWithCompletionHandler:NULL]; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 7a8e18783..b442da712 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -140,7 +140,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot } // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 +#if (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) - (void)dealloc; { if (imageUpdateSemaphore != NULL) diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 334e1120b..3ce2aba2f 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -51,15 +51,15 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat: } // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 - (void)dealloc; { +#if (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) if (dataUpdateSemaphore != NULL) { dispatch_release(dataUpdateSemaphore); } -} #endif +} #pragma mark - #pragma mark Image rendering diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 6d3d6ba72..c61536666 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -298,7 +298,7 @@ - (void)dealloc } // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 +#if (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) if (cameraProcessingQueue != NULL) { dispatch_release(cameraProcessingQueue); From c28828ba1c0d9d685d67544c050c8315f5369024 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Tue, 15 Jan 2013 20:30:53 +1300 Subject: [PATCH 306/695] Add color, hue, saturation and luminosity blend modes. With formulas based upon the PDF specification which matches Photoshop behaviour. --- .../ShowcaseFilterListController.m | 4 + .../ShowcaseFilterViewController.h | 4 + .../ShowcaseFilterViewController.m | 32 +++++ framework/GPUImage.xcodeproj/project.pbxproj | 32 +++++ framework/Source/GPUImage.h | 4 + framework/Source/GPUImageColorBlendFilter.h | 5 + framework/Source/GPUImageColorBlendFilter.m | 65 ++++++++++ framework/Source/GPUImageHueBlendFilter.h | 5 + framework/Source/GPUImageHueBlendFilter.m | 115 ++++++++++++++++++ .../Source/GPUImageLuminosityBlendFilter.h | 5 + .../Source/GPUImageLuminosityBlendFilter.m | 65 ++++++++++ .../Source/GPUImageSaturationBlendFilter.h | 5 + .../Source/GPUImageSaturationBlendFilter.m | 115 ++++++++++++++++++ 13 files changed, 456 insertions(+) create mode 100644 framework/Source/GPUImageColorBlendFilter.h create mode 100644 framework/Source/GPUImageColorBlendFilter.m create mode 100644 framework/Source/GPUImageHueBlendFilter.h create mode 100644 framework/Source/GPUImageHueBlendFilter.m create mode 100644 framework/Source/GPUImageLuminosityBlendFilter.h create mode 100644 framework/Source/GPUImageLuminosityBlendFilter.m create mode 100644 framework/Source/GPUImageSaturationBlendFilter.h create mode 100644 framework/Source/GPUImageSaturationBlendFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 8b025e890..dc7ecf35c 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -159,6 +159,10 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SUBTRACTBLEND: cell.textLabel.text = @"Subtract blend"; break; case GPUIMAGE_HARDLIGHTBLEND: cell.textLabel.text = @"Hard light blend"; break; case GPUIMAGE_SOFTLIGHTBLEND: cell.textLabel.text = @"Soft light blend"; break; + case GPUIMAGE_COLORBLEND: cell.textLabel.text = @"Color blend"; break; + case GPUIMAGE_HUEBLEND: cell.textLabel.text = @"Hue blend"; break; + case GPUIMAGE_SATURATIONBLEND: cell.textLabel.text = @"Saturation blend"; break; + case GPUIMAGE_LUMINOSITYBLEND: cell.textLabel.text = @"Luminosity blend"; break; case GPUIMAGE_NORMALBLEND: cell.textLabel.text = @"Normal blend"; break; case GPUIMAGE_OPACITY: cell.textLabel.text = @"Opacity adjustment"; break; case GPUIMAGE_KUWAHARA: cell.textLabel.text = @"Kuwahara"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 042290840..145a4fffd 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -100,6 +100,10 @@ typedef enum { GPUIMAGE_EXCLUSIONBLEND, GPUIMAGE_HARDLIGHTBLEND, GPUIMAGE_SOFTLIGHTBLEND, + GPUIMAGE_COLORBLEND, + GPUIMAGE_HUEBLEND, + GPUIMAGE_SATURATIONBLEND, + GPUIMAGE_LUMINOSITYBLEND, GPUIMAGE_NORMALBLEND, GPUIMAGE_OPACITY, GPUIMAGE_CUSTOM, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 06eb5b03e..f014ccebe 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1010,6 +1010,38 @@ - (void)setupFilter; filter = [[GPUImageSoftLightBlendFilter alloc] init]; }; break; + case GPUIMAGE_COLORBLEND: + { + self.title = @"Color Blend"; + self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; + + filter = [[GPUImageColorBlendFilter alloc] init]; + }; break; + case GPUIMAGE_HUEBLEND: + { + self.title = @"Hue Blend"; + self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; + + filter = [[GPUImageHueBlendFilter alloc] init]; + }; break; + case GPUIMAGE_SATURATIONBLEND: + { + self.title = @"Saturation Blend"; + self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; + + filter = [[GPUImageSaturationBlendFilter alloc] init]; + }; break; + case GPUIMAGE_LUMINOSITYBLEND: + { + self.title = @"Luminosity Blend"; + self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; + + filter = [[GPUImageLuminosityBlendFilter alloc] init]; + }; break; case GPUIMAGE_NORMALBLEND: { self.title = @"Normal Blend"; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index a4076855a..4369fb3b1 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -43,6 +43,12 @@ 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; }; 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; + B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; }; + B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */; }; + B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; }; + B80171FF16312800001C8D16 /* GPUImageSaturationBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */; }; + B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; }; + B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; }; @@ -318,6 +324,8 @@ BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; + C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; }; + C04C8D1815F8059F00449601 /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */; }; C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; }; C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; /* End PBXBuildFile section */ @@ -361,6 +369,12 @@ 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftEleganceFilter.m; path = Source/GPUImageSoftEleganceFilter.m; sourceTree = SOURCE_ROOT; }; 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLookupFilter.h; path = Source/GPUImageLookupFilter.h; sourceTree = SOURCE_ROOT; }; 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLookupFilter.m; path = Source/GPUImageLookupFilter.m; sourceTree = SOURCE_ROOT; }; + B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueBlendFilter.h; path = Source/GPUImageHueBlendFilter.h; sourceTree = SOURCE_ROOT; }; + B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueBlendFilter.m; path = Source/GPUImageHueBlendFilter.m; sourceTree = SOURCE_ROOT; }; + B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSaturationBlendFilter.h; path = Source/GPUImageSaturationBlendFilter.h; sourceTree = SOURCE_ROOT; }; + B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSaturationBlendFilter.m; path = Source/GPUImageSaturationBlendFilter.m; sourceTree = SOURCE_ROOT; }; + B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminosityBlendFilter.h; path = Source/GPUImageLuminosityBlendFilter.h; sourceTree = SOURCE_ROOT; }; + B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminosityBlendFilter.m; path = Source/GPUImageLuminosityBlendFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLevelsFilter.h; path = Source/GPUImageLevelsFilter.h; sourceTree = SOURCE_ROOT; }; @@ -633,6 +647,8 @@ BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLanczosResamplingFilter.m; path = Source/GPUImageLanczosResamplingFilter.m; sourceTree = SOURCE_ROOT; }; BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; + C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorBlendFilter.h; path = Source/GPUImageColorBlendFilter.h; sourceTree = SOURCE_ROOT; }; + C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorBlendFilter.m; path = Source/GPUImageColorBlendFilter.m; sourceTree = SOURCE_ROOT; }; C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueFilter.m; path = Source/GPUImageHueFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ @@ -786,6 +802,14 @@ BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */, 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */, 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */, + C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */, + C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */, + B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */, + B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */, + B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */, + B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */, + B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */, + B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */, ); name = Blends; sourceTree = ""; @@ -1236,6 +1260,10 @@ BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */, BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */, B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */, + C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */, + B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */, + B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */, + B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1494,6 +1522,10 @@ BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */, BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */, B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */, + C04C8D1815F8059F00449601 /* GPUImageColorBlendFilter.m in Sources */, + B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */, + B80171FF16312800001C8D16 /* GPUImageSaturationBlendFilter.m in Sources */, + B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 8acb3f494..217ccbf3c 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -57,6 +57,10 @@ #import "GPUImageSubtractBlendFilter.h" #import "GPUImageHardLightBlendFilter.h" #import "GPUImageSoftLightBlendFilter.h" +#import "GPUImageColorBlendFilter.h" +#import "GPUImageHueBlendFilter.h" +#import "GPUImageSaturationBlendFilter.h" +#import "GPUImageLuminosityBlendFilter.h" #import "GPUImageCropFilter.h" #import "GPUImageGrayscaleFilter.h" #import "GPUImageTransformFilter.h" diff --git a/framework/Source/GPUImageColorBlendFilter.h b/framework/Source/GPUImageColorBlendFilter.h new file mode 100644 index 000000000..302a16c6c --- /dev/null +++ b/framework/Source/GPUImageColorBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageColorBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageColorBlendFilter.m b/framework/Source/GPUImageColorBlendFilter.m new file mode 100644 index 000000000..eb0ccbff2 --- /dev/null +++ b/framework/Source/GPUImageColorBlendFilter.m @@ -0,0 +1,65 @@ +#import "GPUImageColorBlendFilter.h" + +/** + * Color blend mode based upon pseudo code from the PDF specification. + */ +NSString *const kGPUImageColorBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + highp float lum(lowp vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + lowp vec3 clipcolor(lowp vec3 c) { + highp float l = lum(c); + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + lowp vec3 setlum(lowp vec3 c, highp float l) { + highp float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + void main() + { + highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(overlayColor.rgb, lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } + ); + + +@implementation GPUImageColorBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageColorBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end \ No newline at end of file diff --git a/framework/Source/GPUImageHueBlendFilter.h b/framework/Source/GPUImageHueBlendFilter.h new file mode 100644 index 000000000..4399ffcfb --- /dev/null +++ b/framework/Source/GPUImageHueBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageHueBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageHueBlendFilter.m b/framework/Source/GPUImageHueBlendFilter.m new file mode 100644 index 000000000..e448ee9aa --- /dev/null +++ b/framework/Source/GPUImageHueBlendFilter.m @@ -0,0 +1,115 @@ +#import "GPUImageHueBlendFilter.h" + +/** + * Hue blend mode based upon pseudo code from the PDF specification. + */ +NSString *const kGPUImageHueBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + highp float lum(lowp vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + lowp vec3 clipcolor(lowp vec3 c) { + highp float l = lum(c); + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + lowp vec3 setlum(lowp vec3 c, highp float l) { + highp float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + highp float sat(lowp vec3 c) { + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + return x - n; + } + + lowp float mid(lowp float cmin, lowp float cmid, lowp float cmax, highp float s) { + return ((cmid - cmin) * s) / (cmax - cmin); + } + + lowp vec3 setsat(lowp vec3 c, highp float s) { + if (c.r > c.g) { + if (c.r > c.b) { + if (c.g > c.b) { + /* g is mid, b is min */ + c.g = mid(c.b, c.g, c.r, s); + c.b = 0.0; + } else { + /* b is mid, g is min */ + c.b = mid(c.g, c.b, c.r, s); + c.g = 0.0; + } + c.r = s; + } else { + /* b is max, r is mid, g is min */ + c.r = mid(c.g, c.r, c.b, s); + c.b = s; + c.r = 0.0; + } + } else if (c.r > c.b) { + /* g is max, r is mid, b is min */ + c.r = mid(c.b, c.r, c.g, s); + c.g = s; + c.b = 0.0; + } else if (c.g > c.b) { + /* g is max, b is mid, r is min */ + c.b = mid(c.r, c.b, c.g, s); + c.g = s; + c.r = 0.0; + } else if (c.b > c.g) { + /* b is max, g is mid, r is min */ + c.g = mid(c.r, c.g, c.b, s); + c.b = s; + c.r = 0.0; + } else { + c = vec3(0.0); + } + return c; + } + + void main() + { + highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(overlayColor.rgb, sat(baseColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } + ); + + +@implementation GPUImageHueBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageHueBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageLuminosityBlendFilter.h b/framework/Source/GPUImageLuminosityBlendFilter.h new file mode 100644 index 000000000..03b5e4c9f --- /dev/null +++ b/framework/Source/GPUImageLuminosityBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageLuminosityBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageLuminosityBlendFilter.m b/framework/Source/GPUImageLuminosityBlendFilter.m new file mode 100644 index 000000000..f58970ef8 --- /dev/null +++ b/framework/Source/GPUImageLuminosityBlendFilter.m @@ -0,0 +1,65 @@ +#import "GPUImageLuminosityBlendFilter.h" + +/** + * Luminosity blend mode based upon pseudo code from the PDF specification. + */ +NSString *const kGPUImageLuminosityBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + highp float lum(lowp vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + lowp vec3 clipcolor(lowp vec3 c) { + highp float l = lum(c); + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + lowp vec3 setlum(lowp vec3 c, highp float l) { + highp float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + void main() + { + highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(baseColor.rgb, lum(overlayColor.rgb)) * overlayColor.a, baseColor.a); + } + ); + + +@implementation GPUImageLuminosityBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageLuminosityBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageSaturationBlendFilter.h b/framework/Source/GPUImageSaturationBlendFilter.h new file mode 100644 index 000000000..767892a53 --- /dev/null +++ b/framework/Source/GPUImageSaturationBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageSaturationBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageSaturationBlendFilter.m b/framework/Source/GPUImageSaturationBlendFilter.m new file mode 100644 index 000000000..1925926dd --- /dev/null +++ b/framework/Source/GPUImageSaturationBlendFilter.m @@ -0,0 +1,115 @@ +#import "GPUImageSaturationBlendFilter.h" + +/** + * Saturation blend mode based upon pseudo code from the PDF specification. + */ +NSString *const kGPUImageSaturationBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + highp float lum(lowp vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + lowp vec3 clipcolor(lowp vec3 c) { + highp float l = lum(c); + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + lowp vec3 setlum(lowp vec3 c, highp float l) { + highp float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + highp float sat(lowp vec3 c) { + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + return x - n; + } + + lowp float mid(lowp float cmin, lowp float cmid, lowp float cmax, highp float s) { + return ((cmid - cmin) * s) / (cmax - cmin); + } + + lowp vec3 setsat(lowp vec3 c, highp float s) { + if (c.r > c.g) { + if (c.r > c.b) { + if (c.g > c.b) { + /* g is mid, b is min */ + c.g = mid(c.b, c.g, c.r, s); + c.b = 0.0; + } else { + /* b is mid, g is min */ + c.b = mid(c.g, c.b, c.r, s); + c.g = 0.0; + } + c.r = s; + } else { + /* b is max, r is mid, g is min */ + c.r = mid(c.g, c.r, c.b, s); + c.b = s; + c.r = 0.0; + } + } else if (c.r > c.b) { + /* g is max, r is mid, b is min */ + c.r = mid(c.b, c.r, c.g, s); + c.g = s; + c.b = 0.0; + } else if (c.g > c.b) { + /* g is max, b is mid, r is min */ + c.b = mid(c.r, c.b, c.g, s); + c.g = s; + c.r = 0.0; + } else if (c.b > c.g) { + /* b is max, g is mid, r is min */ + c.g = mid(c.r, c.g, c.b, s); + c.b = s; + c.r = 0.0; + } else { + c = vec3(0.0); + } + return c; + } + + void main() + { + highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(baseColor.rgb, sat(overlayColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } + ); + + +@implementation GPUImageSaturationBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageSaturationBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end From 2df60b24aaaa8308c7564b8f7d50bdec3a8854fd Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sat, 20 Oct 2012 00:09:33 +1300 Subject: [PATCH 307/695] Linear burn blend filter --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 8 +++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 +++++ framework/Source/GPUImage.h | 1 + .../Source/GPUImageLinearBurnBlendFilter.h | 5 +++ .../Source/GPUImageLinearBurnBlendFilter.m | 32 +++++++++++++++++++ 7 files changed, 56 insertions(+) create mode 100644 framework/Source/GPUImageLinearBurnBlendFilter.h create mode 100644 framework/Source/GPUImageLinearBurnBlendFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 8b025e890..0b6aea459 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -148,6 +148,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SCREENBLEND: cell.textLabel.text = @"Screen blend"; break; case GPUIMAGE_COLORBURN: cell.textLabel.text = @"Color burn blend"; break; case GPUIMAGE_COLORDODGE: cell.textLabel.text = @"Color dodge blend"; break; + case GPUIMAGE_LINEARBURN: cell.textLabel.text = @"Linear burn blend"; break; case GPUIMAGE_ADD: cell.textLabel.text = @"Add blend"; break; case GPUIMAGE_DIVIDE: cell.textLabel.text = @"Divide blend"; break; case GPUIMAGE_MULTIPLY: cell.textLabel.text = @"Multiply blend"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 042290840..5b95618e5 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -94,6 +94,7 @@ typedef enum { GPUIMAGE_DARKEN, GPUIMAGE_COLORBURN, GPUIMAGE_COLORDODGE, + GPUIMAGE_LINEARBURN, GPUIMAGE_SCREENBLEND, GPUIMAGE_DIFFERENCEBLEND, GPUIMAGE_SUBTRACTBLEND, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 06eb5b03e..58eca0dc6 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -970,6 +970,14 @@ - (void)setupFilter; filter = [[GPUImageColorDodgeBlendFilter alloc] init]; }; break; + case GPUIMAGE_LINEARBURN: + { + self.title = @"Linear Burn Blend"; + self.filterSettingsSlider.hidden = YES; + needsSecondImage = YES; + + filter = [[GPUImageLinearBurnBlendFilter alloc] init]; + }; break; case GPUIMAGE_EXCLUSIONBLEND: { self.title = @"Exclusion Blend"; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index a4076855a..fb75674c3 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -43,6 +43,8 @@ 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; }; 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; + B80172551631627B001C8D16 /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801725316316279001C8D16 /* GPUImageLinearBurnBlendFilter.h */; }; + B80172561631627B001C8D16 /* GPUImageLinearBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80172541631627A001C8D16 /* GPUImageLinearBurnBlendFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; }; @@ -361,6 +363,8 @@ 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftEleganceFilter.m; path = Source/GPUImageSoftEleganceFilter.m; sourceTree = SOURCE_ROOT; }; 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLookupFilter.h; path = Source/GPUImageLookupFilter.h; sourceTree = SOURCE_ROOT; }; 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLookupFilter.m; path = Source/GPUImageLookupFilter.m; sourceTree = SOURCE_ROOT; }; + B801725316316279001C8D16 /* GPUImageLinearBurnBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLinearBurnBlendFilter.h; path = Source/GPUImageLinearBurnBlendFilter.h; sourceTree = SOURCE_ROOT; }; + B80172541631627A001C8D16 /* GPUImageLinearBurnBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLinearBurnBlendFilter.m; path = Source/GPUImageLinearBurnBlendFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLevelsFilter.h; path = Source/GPUImageLevelsFilter.h; sourceTree = SOURCE_ROOT; }; @@ -786,6 +790,8 @@ BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */, 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */, 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */, + B801725316316279001C8D16 /* GPUImageLinearBurnBlendFilter.h */, + B80172541631627A001C8D16 /* GPUImageLinearBurnBlendFilter.m */, ); name = Blends; sourceTree = ""; @@ -1236,6 +1242,7 @@ BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */, BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */, B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */, + B80172551631627B001C8D16 /* GPUImageLinearBurnBlendFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1494,6 +1501,7 @@ BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */, BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */, B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */, + B80172561631627B001C8D16 /* GPUImageLinearBurnBlendFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 8acb3f494..277e4961c 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -138,3 +138,4 @@ #import "GPUImageParallelCoordinateLineTransformFilter.h" #import "GPUImageThresholdSketchFilter.h" #import "GPUImageLineGenerator.h" +#import "GPUImageLinearBurnBlendFilter.h" diff --git a/framework/Source/GPUImageLinearBurnBlendFilter.h b/framework/Source/GPUImageLinearBurnBlendFilter.h new file mode 100644 index 000000000..7e5e415cf --- /dev/null +++ b/framework/Source/GPUImageLinearBurnBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageLinearBurnBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageLinearBurnBlendFilter.m b/framework/Source/GPUImageLinearBurnBlendFilter.m new file mode 100644 index 000000000..1a62ed740 --- /dev/null +++ b/framework/Source/GPUImageLinearBurnBlendFilter.m @@ -0,0 +1,32 @@ +#import "GPUImageLinearBurnBlendFilter.h" + +NSString *const kGPUImageLinearBurnBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + mediump vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(clamp(textureColor.rgb + textureColor2.rgb - vec3(1.0), vec3(0.0), vec3(1.0)), textureColor.a); + } + ); + +@implementation GPUImageLinearBurnBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageLinearBurnBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end From 6ad440ebcf61e31cb92d7fec5414275ecb2241fb Mon Sep 17 00:00:00 2001 From: Cameron Perry Date: Fri, 18 Jan 2013 10:54:33 -0800 Subject: [PATCH 308/695] Fix defects as described in issue #654 - filters using a lookup filter would not update with new input. --- framework/Source/GPUImageAmatorkaFilter.m | 5 +++++ framework/Source/GPUImageMissEtikateFilter.m | 5 +++++ framework/Source/GPUImageSoftEleganceFilter.m | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/framework/Source/GPUImageAmatorkaFilter.m b/framework/Source/GPUImageAmatorkaFilter.m index 8ed55e04d..ce0a1f2ce 100755 --- a/framework/Source/GPUImageAmatorkaFilter.m +++ b/framework/Source/GPUImageAmatorkaFilter.m @@ -26,6 +26,11 @@ - (id)init; return self; } +-(void)prepareForImageCapture { + [lookupImageSource processImage]; + [super prepareForImageCapture]; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageMissEtikateFilter.m b/framework/Source/GPUImageMissEtikateFilter.m index 831ba0524..f15b85eea 100755 --- a/framework/Source/GPUImageMissEtikateFilter.m +++ b/framework/Source/GPUImageMissEtikateFilter.m @@ -26,6 +26,11 @@ - (id)init; return self; } +-(void)prepareForImageCapture { + [lookupImageSource processImage]; + [super prepareForImageCapture]; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m index cb12f9af1..08b6e8b35 100755 --- a/framework/Source/GPUImageSoftEleganceFilter.m +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -50,6 +50,12 @@ - (id)init; return self; } +-(void)prepareForImageCapture { + [lookupImageSource1 processImage]; + [lookupImageSource2 processImage]; + [super prepareForImageCapture]; +} + #pragma mark - #pragma mark Accessors From 3b78c37b05a4557828f7f337ae7fbbe2f7f9b7d1 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 20 Jan 2013 00:23:01 -0600 Subject: [PATCH 309/695] Now passes luminance plane directly into filters that need grayscale, significantly improving performance for edge detection and related filters. Fixed a bug with the iOS 6.0 feature detection macro. --- framework/Source/GPUImageFilter.h | 3 + framework/Source/GPUImageFilter.m | 17 +++- framework/Source/GPUImageFilterGroup.m | 19 +++++ framework/Source/GPUImageGrayscaleFilter.m | 82 +++++++++++++++++++ framework/Source/GPUImageMovieWriter.m | 12 ++- framework/Source/GPUImageOpenGLESContext.h | 2 + framework/Source/GPUImageOutput.h | 4 + framework/Source/GPUImageOutput.m | 12 ++- framework/Source/GPUImagePicture.m | 2 +- framework/Source/GPUImageRawDataInput.m | 2 +- framework/Source/GPUImageRawDataOutput.m | 10 +++ .../Source/GPUImageSobelEdgeDetectionFilter.m | 13 ++- framework/Source/GPUImageTextureOutput.m | 10 +++ framework/Source/GPUImageTwoPassFilter.m | 34 ++++++-- framework/Source/GPUImageVideoCamera.h | 2 +- framework/Source/GPUImageVideoCamera.m | 38 ++++++--- framework/Source/GPUImageView.h | 2 + framework/Source/GPUImageView.m | 10 +++ 18 files changed, 246 insertions(+), 28 deletions(-) diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 764c31bf5..179d11935 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -61,11 +61,14 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; CGSize currentFilterSize; GPUImageRotationMode inputRotation; + BOOL currentlyReceivingMonochromeInput; + NSMutableDictionary *uniformStateRestorationBlocks; } @property(readonly) CVPixelBufferRef renderTarget; @property(readwrite, nonatomic) BOOL preventRendering; +@property(readwrite, nonatomic) BOOL currentlyReceivingMonochromeInput; /// @name Initialization and teardown diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 39428fe34..9c7763385 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -36,6 +36,7 @@ @implementation GPUImageFilter @synthesize renderTarget; @synthesize preventRendering = _preventRendering; +@synthesize currentlyReceivingMonochromeInput; #pragma mark - #pragma mark Initialization and teardown @@ -50,6 +51,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad uniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; preparedToCaptureImage = NO; _preventRendering = NO; + currentlyReceivingMonochromeInput = NO; inputRotation = kGPUImageNoRotation; backgroundColorRed = 0.0; backgroundColorGreen = 0.0; @@ -344,7 +346,15 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; [self initializeOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + +// if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// { +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); +// } +// else +// { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); +// } glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); [self notifyTargetsAboutNewOutputTexture]; @@ -989,6 +999,11 @@ - (void)conserveMemoryForNextFrame; } } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 65c52fc2d..1fbccc5e2 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -189,6 +189,25 @@ - (void)conserveMemoryForNextFrame; } } +- (BOOL)wantsMonochromeInput; +{ + BOOL allInputsWantMonochromeInput = YES; + for (GPUImageOutput *currentFilter in _initialFilters) + { + allInputsWantMonochromeInput = allInputsWantMonochromeInput && [currentFilter wantsMonochromeInput]; + } + + return allInputsWantMonochromeInput; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + for (GPUImageOutput *currentFilter in _initialFilters) + { + [currentFilter setCurrentlyReceivingMonochromeInput:newValue]; + } +} + #pragma mark - #pragma mark GPUImageTextureDelegate methods diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index 46dd1196b..78876244f 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -21,6 +21,88 @@ void main() } ); +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + if (!currentlyReceivingMonochromeInput) + { + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + } +} + +- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +{ + [super setInputTexture:newInputTexture atIndex:textureIndex]; + if (currentlyReceivingMonochromeInput) + { + [self notifyTargetsAboutNewOutputTexture]; + } +} + +- (GLuint)textureForOutput; +{ + if (currentlyReceivingMonochromeInput) + { + return filterSourceTexture; + } + else + { + return outputTexture; + } +} + +- (BOOL)wantsMonochromeInput; +{ + return YES; +} + +- (BOOL)providesMonochromeOutput; +{ + return YES; +} + +- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; +{ + if (self.frameProcessingCompletionBlock != NULL) + { + self.frameProcessingCompletionBlock(self, frameTime); + } + + [self releaseInputTexturesIfNeeded]; + + for (id currentTarget in targets) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; + } + + if (currentlyReceivingMonochromeInput) + { + [currentTarget setInputRotation:inputRotation atIndex:textureIndex]; + + CGSize sizeToRotate = [self outputFrameSize]; + CGSize rotatedSize = sizeToRotate; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + rotatedSize.width = sizeToRotate.height; + rotatedSize.height = sizeToRotate.width; + } + [currentTarget setInputSize:rotatedSize atIndex:textureIndex]; + } + else + { + [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; + } + [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndex]; + } + } +} + #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 28fb58192..78bc028c7 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -271,7 +271,7 @@ - (void)finishRecording; runOnMainQueueWithoutDeadlocking(^{ [assetWriterVideoInput markAsFinished]; [assetWriterAudioInput markAsFinished]; -#if (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) [assetWriter finishWriting]; #else [assetWriter finishWritingWithCompletionHandler:NULL]; @@ -602,6 +602,16 @@ - (void)conserveMemoryForNextFrame; } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index 369ecb9e4..a96ab96c6 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -50,6 +50,8 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (BOOL)shouldIgnoreUpdatesToThisTarget; - (BOOL)enabled; - (void)conserveMemoryForNextFrame; +- (BOOL)wantsMonochromeInput; +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; @end @protocol GPUImageTextureDelegate diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index b9f6b7046..48618646f 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -34,6 +34,8 @@ void reportAvailableMemoryForGPUImage(NSString *tag); __unsafe_unretained id firstTextureDelegate; BOOL shouldConserveMemoryForNextFrame; + + BOOL allTargetsWantMonochromeData; } @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; @@ -112,6 +114,8 @@ void reportAvailableMemoryForGPUImage(NSString *tag); - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; +- (BOOL)providesMonochromeOutput; + - (void)prepareForImageCapture; - (void)conserveMemoryForNextFrame; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 9a020de72..2a7d43c97 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -88,7 +88,8 @@ - (id)init; targets = [[NSMutableArray alloc] init]; targetTextureIndices = [[NSMutableArray alloc] init]; _enabled = YES; - + allTargetsWantMonochromeData = YES; + return self; } @@ -155,6 +156,8 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text [newTarget setTextureDelegate:self atIndex:textureLocation]; [targets addObject:newTarget]; [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; + + allTargetsWantMonochromeData = allTargetsWantMonochromeData && [newTarget wantsMonochromeInput]; }); } @@ -203,6 +206,8 @@ - (void)removeAllTargets; } [targets removeAllObjects]; [targetTextureIndices removeAllObjects]; + + allTargetsWantMonochromeData = YES; }); } @@ -360,6 +365,11 @@ - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation return processedImage; } +- (BOOL)providesMonochromeOutput; +{ + return NO; +} + - (void)prepareForImageCapture; { diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index b442da712..08abb54c2 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -140,7 +140,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot } // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) - (void)dealloc; { if (imageUpdateSemaphore != NULL) diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 3ce2aba2f..fda407d8d 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -53,7 +53,7 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat: // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. - (void)dealloc; { -#if (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (dataUpdateSemaphore != NULL) { dispatch_release(dataUpdateSemaphore); diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index d9c0d6ecc..ab146f73e 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -349,6 +349,16 @@ - (void)conserveMemoryForNextFrame; } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 4b0c1dfb3..713a28c66 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -84,15 +84,22 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ -// [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; -// glUniform1f(texelWidthUniform, _texelWidth); -// glUniform1f(texelHeightUniform, _texelHeight); }); } } +- (BOOL)wantsMonochromeInput; +{ + return YES; +} + +- (BOOL)providesMonochromeOutput; +{ + return YES; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index 562643c08..ffa7e4f2a 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -71,4 +71,14 @@ - (void)conserveMemoryForNextFrame; } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + @end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index e427d2fcb..c9a8d1cdb 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -202,7 +202,14 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { [self initializeSecondOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); +// if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// { +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); +// } +// else +// { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); +// } glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); [self notifyTargetsAboutNewOutputTexture]; @@ -318,8 +325,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - // Run the first stage of the two-pass filter - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + // This assumes that any two-pass filter that says it desires monochrome input is using the first pass for a luminance conversion, which can be dropped + if (!currentlyReceivingMonochromeInput) + { + // Run the first stage of the two-pass filter + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + } // Run the second stage of the two-pass filter [self setSecondFilterFBO]; @@ -330,13 +341,22 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, outputTexture); + if (!currentlyReceivingMonochromeInput) + { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); + } + else + { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, sourceTexture); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + } - glUniform1i(secondFilterInputTextureUniform, 3); + glUniform1i(secondFilterInputTextureUniform, 3); glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index c15a483d2..0701d6722 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -31,7 +31,7 @@ BOOL capturePaused; GPUImageRotationMode outputRotation; dispatch_semaphore_t frameRenderingSemaphore; - + BOOL captureAsYUV; GLuint luminanceTexture, chrominanceTexture; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index c61536666..657ec1b07 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -137,14 +137,14 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD if (captureAsYUV) { [GPUImageOpenGLESContext useImageProcessingContext]; - if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) - { - yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; - } - else - { +// if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) +// { +// yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; +// } +// else +// { yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; - } +// } if (!yuvConversionProgram.initialized) { @@ -298,7 +298,7 @@ - (void)dealloc } // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (cameraProcessingQueue != NULL) { dispatch_release(cameraProcessingQueue); @@ -513,7 +513,16 @@ - (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth hei [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + if ([currentTarget wantsMonochromeInput] && captureAsYUV) + { + [currentTarget setCurrentlyReceivingMonochromeInput:YES]; + [currentTarget setInputTexture:luminanceTexture atIndex:textureIndexOfTarget]; + } + else + { + [currentTarget setCurrentlyReceivingMonochromeInput:NO]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + } [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; } @@ -566,7 +575,8 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; glActiveTexture(GL_TEXTURE4); if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); +// err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); } else { @@ -586,7 +596,8 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; glActiveTexture(GL_TEXTURE5); if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); +// err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); } else { @@ -602,7 +613,10 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - [self convertYUVToRGBOutput]; + if (!allTargetsWantMonochromeData) + { + [self convertYUVToRGBOutput]; + } [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index 31673d393..62ac641fc 100755 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -35,4 +35,6 @@ typedef enum { */ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; + @end diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 8125acbd4..e9fd485dd 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -441,6 +441,16 @@ - (void)conserveMemoryForNextFrame; } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + #pragma mark - #pragma mark Accessors From 6321bf82b55bf608f91baaaac5f1837cb9bc4f07 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 21 Jan 2013 15:14:14 -0600 Subject: [PATCH 310/695] 3x3 convolutions were being applied against an image's alpha channel, as well, which wasn't correct. --- .../Source/GPUImage3x3ConvolutionFilter.m | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m index 605ff2ca3..987fb1b31 100755 --- a/framework/Source/GPUImage3x3ConvolutionFilter.m +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -22,21 +22,21 @@ void main() { - mediump vec4 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate); - mediump vec4 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate); - mediump vec4 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate); + mediump vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + mediump vec3 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb; + mediump vec3 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb; mediump vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 leftColor = texture2D(inputImageTexture, leftTextureCoordinate); - mediump vec4 rightColor = texture2D(inputImageTexture, rightTextureCoordinate); - mediump vec4 topColor = texture2D(inputImageTexture, topTextureCoordinate); - mediump vec4 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate); - mediump vec4 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate); + mediump vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + mediump vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + mediump vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; + mediump vec3 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).rgb; + mediump vec3 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb; - mediump vec4 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; - resultColor += leftColor * convolutionMatrix[1][0] + centerColor * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; + mediump vec3 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; + resultColor += leftColor * convolutionMatrix[1][0] + centerColor.rgb * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; - gl_FragColor = resultColor; + gl_FragColor = vec4(resultColor, centerColor.a); } ); From d3510025850135d4f87a046c1796a7847db68eaa Mon Sep 17 00:00:00 2001 From: shu223 Date: Tue, 22 Jan 2013 20:39:21 +0900 Subject: [PATCH 311/695] Some refactorings. --- framework/Source/GPUImageBilateralFilter.m | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m index 507067115..28aebe9d1 100644 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -18,13 +18,22 @@ void main() { lowp vec4 sum = centralColor * 0.18; lowp vec4 sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); + void main() + { + lowp vec4 centralColor; + lowp float gaussianWeightTotal; + lowp vec4 sum; + lowp vec4 sampleColor; lowp float distanceFromCentralColor; - // distanceFromCentralColor = abs(centralColor.g - sampleColor.g); - // distanceFromCentralColor = smoothstep(0.0, 1.0, abs(centralColor.g - sampleColor.g)); - // distanceFromCentralColor = smoothstep(0.0, 1.0, distance(centralColor, sampleColor) * distanceNormalizationFactor); - distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + lowp float gaussianWeight; + + centralColor = texture2D(inputImageTexture, blurCoordinates[4]); + gaussianWeightTotal = 0.18; + sum = centralColor * 0.18; - lowp float gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); + sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; From 200f51ead2aac813f43280fb95606150b1f71781 Mon Sep 17 00:00:00 2001 From: shu223 Date: Tue, 22 Jan 2013 20:40:08 +0900 Subject: [PATCH 312/695] Changed "distanceNormalizationFactor" from const value to property. It was important change to make bilateral-filter's effect adjustable. --- framework/Source/GPUImageBilateralFilter.h | 7 ++++- framework/Source/GPUImageBilateralFilter.m | 34 ++++++++++++++++------ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/framework/Source/GPUImageBilateralFilter.h b/framework/Source/GPUImageBilateralFilter.h index 617312b21..6b736ccff 100644 --- a/framework/Source/GPUImageBilateralFilter.h +++ b/framework/Source/GPUImageBilateralFilter.h @@ -1,5 +1,10 @@ #import "GPUImageGaussianBlurFilter.h" @interface GPUImageBilateralFilter : GPUImageGaussianBlurFilter - +{ + CGFloat firstDistanceNormalizationFactorUniform; + CGFloat secondDistanceNormalizationFactorUniform; +} +// A normalization factor for the distance between central color and sample color. +@property(nonatomic, readwrite) CGFloat distanceNormalizationFactor; @end diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m index 28aebe9d1..e64ae0e48 100644 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -9,15 +9,8 @@ varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; -// const mediump float distanceNormalizationFactor = 0.6933613; - const mediump float distanceNormalizationFactor = 1.5; + uniform mediump float distanceNormalizationFactor; - void main() { - lowp vec4 centralColor = texture2D(inputImageTexture, blurCoordinates[4]); - lowp float gaussianWeightTotal = 0.18; - lowp vec4 sum = centralColor * 0.18; - - lowp vec4 sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); void main() { lowp vec4 centralColor; @@ -30,7 +23,7 @@ void main() centralColor = texture2D(inputImageTexture, blurCoordinates[4]); gaussianWeightTotal = 0.18; sum = centralColor * 0.18; - + sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); @@ -95,8 +88,31 @@ - (id)init; return nil; } + firstDistanceNormalizationFactorUniform = [filterProgram uniformIndex:@"distanceNormalizationFactor"]; + secondDistanceNormalizationFactorUniform = [filterProgram uniformIndex:@"distanceNormalizationFactor"]; + + self.blurSize = 4.0; + self.distanceNormalizationFactor = 8.0; + return self; } + +#pragma mark - +#pragma mark Accessors + +- (void)setDistanceNormalizationFactor:(CGFloat)newValue +{ + _distanceNormalizationFactor = newValue; + + [self setFloat:newValue + forUniform:firstDistanceNormalizationFactorUniform + program:filterProgram]; + + [self setFloat:newValue + forUniform:secondDistanceNormalizationFactorUniform + program:secondFilterProgram]; +} + @end From 87ccf71c01ab563bd39438ee2b0dbede32914b81 Mon Sep 17 00:00:00 2001 From: Slavik Romanuk Date: Tue, 22 Jan 2013 23:45:01 +0200 Subject: [PATCH 313/695] Changes to fix incorrect release of filter's target. --- framework/Source/GPUImageFilter.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 3478cb266..b1b9b426e 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -154,7 +154,9 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) GPUImageFilter *filter = (__bridge_transfer GPUImageFilter*)info; CVPixelBufferUnlockBaseAddress([filter renderTarget], 0); - CFRelease([filter renderTarget]); + if ([filter renderTarget]) { + CFRelease([filter renderTarget]); + } [filter destroyFilterFBO]; From 8cc0807da05daddaf2369d7202450586ff3780e3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 23 Jan 2013 14:21:04 -0600 Subject: [PATCH 314/695] Fixed the blur filters, which were only blurring in one direction. Oops. --- framework/Source/GPUImageFilter.m | 2 +- framework/Source/GPUImageTwoInputFilter.m | 5 ++--- framework/Source/GPUImageTwoPassFilter.m | 3 ++- .../Source/GPUImageTwoPassTextureSamplingFilter.m | 14 +++++++++----- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 9c7763385..c1eba441e 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -502,8 +502,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - [self setUniformsForProgramAtIndex:0]; [self setFilterFBO]; + [self setUniformsForProgramAtIndex:0]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index e24dae357..46e67cb89 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -92,10 +92,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - [self setUniformsForProgramAtIndex:0]; - [self setFilterFBO]; - + [self setUniformsForProgramAtIndex:0]; + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index c9a8d1cdb..4f20cd453 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -284,7 +284,7 @@ - (void)setFilterFBO; { [super createFilterFBOofSize:currentFBOSize]; } - [super setupFilterForSize:currentFBOSize]; + [self setupFilterForSize:currentFBOSize]; } glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); @@ -408,6 +408,7 @@ - (void)prepareForImageCapture; - (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; { +// TODO: Deal with the fact that two-pass filters may have the same shader program identifier if (shaderProgram == filterProgram) { [uniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index 060593b77..af103e781 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -12,11 +12,15 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade return nil; } - verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; - - horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; + verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + + horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; + horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + }); return self; } From c04c5242ee973b700d681964e76ef54164494269 Mon Sep 17 00:00:00 2001 From: Pradyumna Doddala Date: Mon, 28 Jan 2013 15:54:20 +0530 Subject: [PATCH 315/695] Included Delegate to get Movie playing completed callback --- framework/Source/GPUImageMovie.h | 11 +++++++++++ framework/Source/GPUImageMovie.m | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index a9558f00c..92e7e99f4 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -3,6 +3,13 @@ #import "GPUImageOpenGLESContext.h" #import "GPUImageOutput.h" +/** Protocol for getting Movie played callback. + */ +@protocol GPUImageMovieDelegate + +- (void)didCompletePlayingMovie; +@end + /** Source object for filtering movies */ @interface GPUImageMovie : GPUImageOutput @@ -18,6 +25,10 @@ */ @property(readwrite, nonatomic) BOOL playAtActualSpeed; +/** This is used to send the delete Movie did complete playing alert + */ +@property (readwrite, nonatomic) id delegate; + /// @name Initialization and teardown - (id)initWithAsset:(AVAsset *)asset; - (id)initWithURL:(NSURL *)url; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 09257ec71..8947afcd2 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -21,6 +21,7 @@ @implementation GPUImageMovie @synthesize asset = _asset; @synthesize runBenchmark = _runBenchmark; @synthesize playAtActualSpeed = _playAtActualSpeed; +@synthesize delegate = _delegate; #pragma mark - #pragma mark Initialization and teardown @@ -177,6 +178,9 @@ - (void)processAsset if (reader.status == AVAssetWriterStatusCompleted) { [weakSelf endProcessing]; + if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { + [self.delegate didCompletePlayingMovie]; + } } } } From 7d1f7592a01aa446507654cb620f8ae79d51c6a5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 28 Jan 2013 19:54:54 -0600 Subject: [PATCH 316/695] Fixed the Lanczos resampling filter. --- .../ShowcaseFilterViewController.m | 3 +- .../Source/GPUImageLanczosResamplingFilter.m | 33 +++++++++++++++++++ framework/Source/GPUImageTwoPassFilter.m | 7 ++-- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index f014ccebe..4f95a9207 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1506,7 +1506,8 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)filter setDisplayTileSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setVignetteEnd:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; - case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; +// case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setDistanceNormalizationFactor:[(UISlider*)sender value]]; break; case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)filter setOpacity:[(UISlider *)sender value]]; break; diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m index 4c5658d31..24c6dd56f 100644 --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -123,4 +123,37 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; }); } +// The first pass (vertical) of the resampling needs to be shrunk in only one dimension so that the remaining shrinkage can be performed in the horizonal pass +- (void)setFilterFBO; +{ + CGSize currentFBOSize = [self sizeOfFBO]; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + currentFBOSize.height = self.originalImageSize.height; + } + else + { + currentFBOSize.width = self.originalImageSize.width; + } + + if (!filterFramebuffer) + { + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } + [self setupFilterForSize:currentFBOSize]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); + + glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); +} + @end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 4f20cd453..27ef39e5f 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -271,9 +271,10 @@ - (void)destroyFilterFBO; - (void)setFilterFBO; { + CGSize currentFBOSize = [self sizeOfFBO]; + if (!filterFramebuffer) { - CGSize currentFBOSize = [self sizeOfFBO]; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { preparedToCaptureImage = NO; @@ -289,7 +290,6 @@ - (void)setFilterFBO; glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } @@ -305,9 +305,6 @@ - (void)setSecondFilterFBO; glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); - -// CGSize currentFBOSize = [self sizeOfFBO]; -// glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } - (void)setOutputFBO; From e2670f076bbe8fff7cfa3c0abe859637fa640bce Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 29 Jan 2013 14:10:53 -0600 Subject: [PATCH 317/695] Fixed a bug with monochrome filters and the still camera on older devices. Removed a static analyzer warning. --- framework/Source/GPUImageStillCamera.m | 1 + framework/Source/GPUImageToneCurveFilter.m | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index b64cc1806..a76e8dd11 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -95,6 +95,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } else { + captureAsYUV = NO; [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; } diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index a59ec0e13..8b83d1c04 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -298,6 +298,10 @@ - (NSMutableArray *)splineCurve:(NSArray *)points // Is [points count] equal to [sdA count]? // int n = [points count]; int n = [sdA count]; + if (n < 1) + { + return nil; + } double sd[n]; // From NSMutableArray to sd[n]; From 389f090db11bd6b4b7d00798d37748b8196ca482 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 29 Jan 2013 14:44:05 -0600 Subject: [PATCH 318/695] Added examples in the FilterShowcase for the partial pixellation and partial Gaussian blur filters. --- .../ShowcaseFilterListController.m | 2 ++ .../ShowcaseFilterViewController.h | 2 ++ .../ShowcaseFilterViewController.m | 25 +++++++++++++++++++ framework/Source/GPUImage.h | 2 ++ .../Source/GPUImagePixellatePositionFilter.m | 2 +- 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index c67895ab0..5b5058fd3 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -104,6 +104,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_AMATORKA: cell.textLabel.text = @"Amatorka (Lookup)"; break; case GPUIMAGE_PIXELLATE: cell.textLabel.text = @"Pixellate"; break; case GPUIMAGE_POLARPIXELLATE: cell.textLabel.text = @"Polar pixellate"; break; + case GPUIMAGE_PIXELLATE_POSITION: cell.textLabel.text = @"Pixellate (position)"; break; case GPUIMAGE_POLKADOT: cell.textLabel.text = @"Polka dot"; break; case GPUIMAGE_HALFTONE: cell.textLabel.text = @"Halftone"; break; case GPUIMAGE_CROSSHATCH: cell.textLabel.text = @"Crosshatch"; break; @@ -174,6 +175,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_BILATERAL: cell.textLabel.text = @"Bilateral blur"; break; case GPUIMAGE_BOXBLUR: cell.textLabel.text = @"Box blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: cell.textLabel.text = @"Gaussian selective blur"; break; + case GPUIMAGE_GAUSSIAN_POSITION: cell.textLabel.text = @"Gaussian (centered)"; break; case GPUIMAGE_UIELEMENT: cell.textLabel.text = @"UI element"; break; case GPUIMAGE_CUSTOM: cell.textLabel.text = @"Custom"; break; case GPUIMAGE_FILECONFIG: cell.textLabel.text = @"Filter Chain"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 4fb9d0cd9..f120ed9dd 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -36,6 +36,7 @@ typedef enum { GPUIMAGE_AVERAGELUMINANCETHRESHOLD, GPUIMAGE_PIXELLATE, GPUIMAGE_POLARPIXELLATE, + GPUIMAGE_PIXELLATE_POSITION, GPUIMAGE_POLKADOT, GPUIMAGE_HALFTONE, GPUIMAGE_CROSSHATCH, @@ -66,6 +67,7 @@ typedef enum { GPUIMAGE_VIGNETTE, GPUIMAGE_GAUSSIAN, GPUIMAGE_GAUSSIAN_SELECTIVE, + GPUIMAGE_GAUSSIAN_POSITION, GPUIMAGE_FASTBLUR, GPUIMAGE_BOXBLUR, GPUIMAGE_MEDIAN, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index a6470c206..ec27b089b 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -106,6 +106,17 @@ - (void)setupFilter; filter = [[GPUImagePolarPixellateFilter alloc] init]; }; break; + case GPUIMAGE_PIXELLATE_POSITION: + { + self.title = @"Pixellate (position)"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setValue:0.25]; + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:0.5]; + + filter = [[GPUImagePixellatePositionFilter alloc] init]; + }; break; case GPUIMAGE_POLKADOT: { self.title = @"Polka Dot"; @@ -1155,6 +1166,18 @@ - (void)setupFilter; filter = [[GPUImageGaussianSelectiveBlurFilter alloc] init]; [(GPUImageGaussianSelectiveBlurFilter*)filter setExcludeCircleRadius:40.0/320.0]; }; break; + case GPUIMAGE_GAUSSIAN_POSITION: + { + self.title = @"Selective Blur"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:.75f]; + [self.filterSettingsSlider setValue:40.0/320.0]; + + filter = [[GPUImageGaussianBlurPositionFilter alloc] init]; + [(GPUImageGaussianBlurPositionFilter*)filter setBlurRadius:40.0/320.0]; + }; break; case GPUIMAGE_BILATERAL: { self.title = @"Bilateral Blur"; @@ -1457,6 +1480,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_SEPIA: [(GPUImageSepiaFilter *)filter setIntensity:[(UISlider *)sender value]]; break; case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_POLARPIXELLATE: [(GPUImagePolarPixellateFilter *)filter setPixelSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; + case GPUIMAGE_PIXELLATE_POSITION: [(GPUImagePixellatePositionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_POLKADOT: [(GPUImagePolkaDotFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_HALFTONE: [(GPUImageHalftoneFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_SATURATION: [(GPUImageSaturationFilter *)filter setSaturation:[(UISlider *)sender value]]; break; @@ -1520,6 +1544,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)filter setOpacity:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)filter setExcludeCircleRadius:[(UISlider*)sender value]]; break; + case GPUIMAGE_GAUSSIAN_POSITION: [(GPUImageGaussianBlurPositionFilter *)filter setBlurRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_FILTERGROUP: [(GPUImagePixellateFilter *)[(GPUImageFilterGroup *)filter filterAtIndex:1] setFractionalWidthOfAPixel:[(UISlider *)sender value]]; break; case GPUIMAGE_CROP: [(GPUImageCropFilter *)filter setCropRegion:CGRectMake(0.0, 0.0, 1.0, [(UISlider*)sender value])]; break; case GPUIMAGE_TRANSFORM: [(GPUImageTransformFilter *)filter setAffineTransform:CGAffineTransformMakeRotation([(UISlider*)sender value])]; break; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 22ce52b4a..11b7861b1 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -143,3 +143,5 @@ #import "GPUImageThresholdSketchFilter.h" #import "GPUImageLineGenerator.h" #import "GPUImageLinearBurnBlendFilter.h" +#import "GPUImageGaussianBlurPositionFilter.h" +#import "GPUImagePixellatePositionFilter.h" diff --git a/framework/Source/GPUImagePixellatePositionFilter.m b/framework/Source/GPUImagePixellatePositionFilter.m index f7f8a52b0..fc7441b5e 100755 --- a/framework/Source/GPUImagePixellatePositionFilter.m +++ b/framework/Source/GPUImagePixellatePositionFilter.m @@ -69,7 +69,7 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; self.fractionalWidthOfAPixel = 0.05; self.center = CGPointMake(0.5f, 0.5f); - self.radius = 1.0f; + self.radius = 0.25f; return self; } From 9655f16e89caf35878ac7d2f3e2646568a5a670a Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Tue, 29 Jan 2013 14:40:27 -0700 Subject: [PATCH 319/695] Merge master, Kuwahara optimizations Optimized Kuwahara filter a bit Added Kuwahara radius 3 filter which is heavily optimized and can process 4 megapixel images without issue --- framework/Source/GPUImage.h | 5 + .../Source/GPUImage3x3ConvolutionFilter.m | 22 +- .../Source/GPUImage3x3TextureSamplingFilter.h | 0 .../Source/GPUImage3x3TextureSamplingFilter.m | 0 framework/Source/GPUImageAddBlendFilter.h | 0 framework/Source/GPUImageAddBlendFilter.m | 0 framework/Source/GPUImageAmatorkaFilter.m | 5 + framework/Source/GPUImageAverageColor.h | 0 framework/Source/GPUImageAverageColor.m | 0 .../GPUImageAverageLuminanceThresholdFilter.h | 0 .../GPUImageAverageLuminanceThresholdFilter.m | 0 framework/Source/GPUImageBilateralFilter.h | 7 +- framework/Source/GPUImageBilateralFilter.m | 51 ++- framework/Source/GPUImageBuffer.h | 0 framework/Source/GPUImageBuffer.m | 0 .../Source/GPUImageBulgeDistortionFilter.m | 41 +- framework/Source/GPUImageChromaKeyFilter.h | 0 framework/Source/GPUImageChromaKeyFilter.m | 0 framework/Source/GPUImageClosingFilter.h | 0 framework/Source/GPUImageClosingFilter.m | 0 framework/Source/GPUImageColorBlendFilter.h | 5 + framework/Source/GPUImageColorBlendFilter.m | 65 +++ framework/Source/GPUImageColorPackingFilter.h | 0 framework/Source/GPUImageColorPackingFilter.m | 0 framework/Source/GPUImageCrosshairGenerator.h | 0 framework/Source/GPUImageCrosshairGenerator.m | 0 framework/Source/GPUImageDarkenBlendFilter.m | 0 framework/Source/GPUImageDilationFilter.h | 0 framework/Source/GPUImageDilationFilter.m | 0 ...geDirectionalNonMaximumSuppressionFilter.h | 0 ...geDirectionalNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageDivideBlendFilter.h | 0 framework/Source/GPUImageDivideBlendFilter.m | 0 framework/Source/GPUImageErosionFilter.h | 0 framework/Source/GPUImageErosionFilter.m | 0 framework/Source/GPUImageFalseColorFilter.h | 0 framework/Source/GPUImageFalseColorFilter.m | 0 framework/Source/GPUImageFilter.h | 9 +- framework/Source/GPUImageFilter.m | 93 ++-- framework/Source/GPUImageFilterGroup.m | 37 +- framework/Source/GPUImageFilterPipeline.h | 4 + framework/Source/GPUImageFilterPipeline.m | 108 +++-- framework/Source/GPUImageGlassSphereFilter.h | 0 framework/Source/GPUImageGlassSphereFilter.m | 0 framework/Source/GPUImageGrayscaleFilter.m | 82 ++++ framework/Source/GPUImageHalftoneFilter.h | 0 framework/Source/GPUImageHalftoneFilter.m | 0 framework/Source/GPUImageHighPassFilter.h | 0 framework/Source/GPUImageHighPassFilter.m | 0 .../Source/GPUImageHighlightShadowFilter.h | 0 .../Source/GPUImageHighlightShadowFilter.m | 0 .../GPUImageHoughTransformLineDetector.h | 0 .../GPUImageHoughTransformLineDetector.m | 1 + framework/Source/GPUImageHueBlendFilter.h | 5 + framework/Source/GPUImageHueBlendFilter.m | 115 +++++ framework/Source/GPUImageHueFilter.h | 0 framework/Source/GPUImageHueFilter.m | 0 framework/Source/GPUImageJFAVoroniFilter.h | 0 framework/Source/GPUImageJFAVoroniFilter.m | 0 framework/Source/GPUImageKuwaharaFilter.m | 132 +++--- .../Source/GPUImageKuwaharaRadius3Filter.h | 8 + .../Source/GPUImageKuwaharaRadius3Filter.m | 286 ++++++++++++ .../Source/GPUImageLanczosResamplingFilter.h | 0 .../Source/GPUImageLanczosResamplingFilter.m | 33 ++ framework/Source/GPUImageLevelsFilter.h | 0 framework/Source/GPUImageLevelsFilter.m | 0 framework/Source/GPUImageLineGenerator.h | 0 framework/Source/GPUImageLineGenerator.m | 0 .../Source/GPUImageLocalBinaryPatternFilter.h | 0 .../Source/GPUImageLocalBinaryPatternFilter.m | 0 framework/Source/GPUImageLookupFilter.h | 0 framework/Source/GPUImageLookupFilter.m | 0 framework/Source/GPUImageLowPassFilter.h | 0 framework/Source/GPUImageLowPassFilter.m | 0 framework/Source/GPUImageLuminosity.h | 0 framework/Source/GPUImageLuminosity.m | 0 .../Source/GPUImageLuminosityBlendFilter.h | 5 + .../Source/GPUImageLuminosityBlendFilter.m | 65 +++ framework/Source/GPUImageMedianFilter.h | 0 framework/Source/GPUImageMedianFilter.m | 0 framework/Source/GPUImageMissEtikateFilter.m | 5 + framework/Source/GPUImageMonochromeFilter.h | 0 framework/Source/GPUImageMonochromeFilter.m | 0 framework/Source/GPUImageMosaicFilter.h | 0 framework/Source/GPUImageMosaicFilter.m | 0 framework/Source/GPUImageMotionDetector.h | 0 framework/Source/GPUImageMotionDetector.m | 0 framework/Source/GPUImageMovieWriter.h | 1 + framework/Source/GPUImageMovieWriter.m | 29 ++ .../GPUImageNobleCornerDetectionFilter.h | 0 .../GPUImageNobleCornerDetectionFilter.m | 0 .../GPUImageNonMaximumSuppressionFilter.h | 0 .../GPUImageNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageNormalBlendFilter.h | 0 framework/Source/GPUImageNormalBlendFilter.m | 0 framework/Source/GPUImageOpacityFilter.h | 0 framework/Source/GPUImageOpacityFilter.m | 0 framework/Source/GPUImageOpenGLESContext.h | 4 + framework/Source/GPUImageOpenGLESContext.m | 31 ++ framework/Source/GPUImageOpeningFilter.h | 0 framework/Source/GPUImageOpeningFilter.m | 0 framework/Source/GPUImageOutput.h | 6 +- framework/Source/GPUImageOutput.m | 17 +- ...ageParallelCoordinateLineTransformFilter.h | 0 ...ageParallelCoordinateLineTransformFilter.m | 0 framework/Source/GPUImagePerlinNoiseFilter.h | 0 framework/Source/GPUImagePerlinNoiseFilter.m | 0 framework/Source/GPUImagePicture.h | 2 +- framework/Source/GPUImagePicture.m | 5 +- framework/Source/GPUImagePolkaDotFilter.h | 0 framework/Source/GPUImagePolkaDotFilter.m | 0 framework/Source/GPUImageRGBClosingFilter.h | 0 framework/Source/GPUImageRGBClosingFilter.m | 0 framework/Source/GPUImageRGBDilationFilter.h | 0 framework/Source/GPUImageRGBDilationFilter.m | 0 framework/Source/GPUImageRGBErosionFilter.h | 0 framework/Source/GPUImageRGBErosionFilter.m | 0 framework/Source/GPUImageRGBOpeningFilter.h | 0 framework/Source/GPUImageRGBOpeningFilter.m | 0 framework/Source/GPUImageRawDataInput.h | 23 +- framework/Source/GPUImageRawDataInput.m | 68 ++- framework/Source/GPUImageRawDataOutput.m | 10 + .../Source/GPUImageSaturationBlendFilter.h | 5 + .../Source/GPUImageSaturationBlendFilter.m | 115 +++++ .../GPUImageShiTomasiFeatureDetectionFilter.h | 0 .../GPUImageShiTomasiFeatureDetectionFilter.m | 0 .../GPUImageSingleComponentFastBlurFilter.h | 0 .../GPUImageSingleComponentFastBlurFilter.m | 0 ...PUImageSingleComponentGaussianBlurFilter.h | 0 ...PUImageSingleComponentGaussianBlurFilter.m | 0 .../Source/GPUImageSobelEdgeDetectionFilter.m | 15 +- framework/Source/GPUImageSoftEleganceFilter.m | 6 + .../Source/GPUImageSolidColorGenerator.h | 0 .../Source/GPUImageSolidColorGenerator.m | 2 +- .../Source/GPUImageSourceOverBlendFilter.h | 0 .../Source/GPUImageSourceOverBlendFilter.m | 0 .../Source/GPUImageSphereRefractionFilter.h | 0 .../Source/GPUImageSphereRefractionFilter.m | 0 framework/Source/GPUImageStillCamera.h | 7 + framework/Source/GPUImageStillCamera.m | 217 ++++----- framework/Source/GPUImageTextureInput.m | 3 +- framework/Source/GPUImageTextureOutput.m | 10 + .../Source/GPUImageThresholdSketchFilter.h | 0 .../Source/GPUImageThresholdSketchFilter.m | 0 ...geThresholdedNonMaximumSuppressionFilter.h | 0 ...geThresholdedNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageToneCurveFilter.m | 0 framework/Source/GPUImageTransformFilter.h | 3 + framework/Source/GPUImageTransformFilter.m | 59 ++- framework/Source/GPUImageTwoInputFilter.h | 0 framework/Source/GPUImageTwoInputFilter.m | 5 +- framework/Source/GPUImageTwoPassFilter.h | 2 + framework/Source/GPUImageTwoPassFilter.m | 77 +++- .../GPUImageTwoPassTextureSamplingFilter.h | 0 .../GPUImageTwoPassTextureSamplingFilter.m | 16 +- framework/Source/GPUImageUIElement.h | 0 framework/Source/GPUImageUIElement.m | 0 framework/Source/GPUImageVideoCamera.h | 8 +- framework/Source/GPUImageVideoCamera.m | 418 ++++++++++++++++-- framework/Source/GPUImageView.h | 2 + framework/Source/GPUImageView.m | 10 + .../Source/GPUImageVoroniConsumerFilter.h | 0 .../Source/GPUImageVoroniConsumerFilter.m | 0 .../Source/GPUImageWeakPixelInclusionFilter.h | 0 .../Source/GPUImageWeakPixelInclusionFilter.m | 0 framework/Source/GPUImageWhiteBalanceFilter.h | 0 framework/Source/GPUImageWhiteBalanceFilter.m | 0 ...imageDirectionalSobelEdgeDetectionFilter.h | 0 ...imageDirectionalSobelEdgeDetectionFilter.m | 0 169 files changed, 1986 insertions(+), 379 deletions(-) mode change 100644 => 100755 framework/Source/GPUImage3x3TextureSamplingFilter.h mode change 100644 => 100755 framework/Source/GPUImage3x3TextureSamplingFilter.m mode change 100644 => 100755 framework/Source/GPUImageAddBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageAddBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageAverageColor.h mode change 100644 => 100755 framework/Source/GPUImageAverageColor.m mode change 100644 => 100755 framework/Source/GPUImageAverageLuminanceThresholdFilter.h mode change 100644 => 100755 framework/Source/GPUImageAverageLuminanceThresholdFilter.m mode change 100644 => 100755 framework/Source/GPUImageBilateralFilter.h mode change 100644 => 100755 framework/Source/GPUImageBilateralFilter.m mode change 100644 => 100755 framework/Source/GPUImageBuffer.h mode change 100644 => 100755 framework/Source/GPUImageBuffer.m mode change 100644 => 100755 framework/Source/GPUImageChromaKeyFilter.h mode change 100644 => 100755 framework/Source/GPUImageChromaKeyFilter.m mode change 100644 => 100755 framework/Source/GPUImageClosingFilter.h mode change 100644 => 100755 framework/Source/GPUImageClosingFilter.m create mode 100755 framework/Source/GPUImageColorBlendFilter.h create mode 100755 framework/Source/GPUImageColorBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageColorPackingFilter.h mode change 100644 => 100755 framework/Source/GPUImageColorPackingFilter.m mode change 100644 => 100755 framework/Source/GPUImageCrosshairGenerator.h mode change 100644 => 100755 framework/Source/GPUImageCrosshairGenerator.m mode change 100644 => 100755 framework/Source/GPUImageDarkenBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageDilationFilter.h mode change 100644 => 100755 framework/Source/GPUImageDilationFilter.m mode change 100644 => 100755 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h mode change 100644 => 100755 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m mode change 100644 => 100755 framework/Source/GPUImageDivideBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageDivideBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageErosionFilter.h mode change 100644 => 100755 framework/Source/GPUImageErosionFilter.m mode change 100644 => 100755 framework/Source/GPUImageFalseColorFilter.h mode change 100644 => 100755 framework/Source/GPUImageFalseColorFilter.m mode change 100644 => 100755 framework/Source/GPUImageGlassSphereFilter.h mode change 100644 => 100755 framework/Source/GPUImageGlassSphereFilter.m mode change 100644 => 100755 framework/Source/GPUImageHalftoneFilter.h mode change 100644 => 100755 framework/Source/GPUImageHalftoneFilter.m mode change 100644 => 100755 framework/Source/GPUImageHighPassFilter.h mode change 100644 => 100755 framework/Source/GPUImageHighPassFilter.m mode change 100644 => 100755 framework/Source/GPUImageHighlightShadowFilter.h mode change 100644 => 100755 framework/Source/GPUImageHighlightShadowFilter.m mode change 100644 => 100755 framework/Source/GPUImageHoughTransformLineDetector.h mode change 100644 => 100755 framework/Source/GPUImageHoughTransformLineDetector.m create mode 100755 framework/Source/GPUImageHueBlendFilter.h create mode 100755 framework/Source/GPUImageHueBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageHueFilter.h mode change 100644 => 100755 framework/Source/GPUImageHueFilter.m mode change 100644 => 100755 framework/Source/GPUImageJFAVoroniFilter.h mode change 100644 => 100755 framework/Source/GPUImageJFAVoroniFilter.m create mode 100644 framework/Source/GPUImageKuwaharaRadius3Filter.h create mode 100644 framework/Source/GPUImageKuwaharaRadius3Filter.m mode change 100644 => 100755 framework/Source/GPUImageLanczosResamplingFilter.h mode change 100644 => 100755 framework/Source/GPUImageLanczosResamplingFilter.m mode change 100644 => 100755 framework/Source/GPUImageLevelsFilter.h mode change 100644 => 100755 framework/Source/GPUImageLevelsFilter.m mode change 100644 => 100755 framework/Source/GPUImageLineGenerator.h mode change 100644 => 100755 framework/Source/GPUImageLineGenerator.m mode change 100644 => 100755 framework/Source/GPUImageLocalBinaryPatternFilter.h mode change 100644 => 100755 framework/Source/GPUImageLocalBinaryPatternFilter.m mode change 100644 => 100755 framework/Source/GPUImageLookupFilter.h mode change 100644 => 100755 framework/Source/GPUImageLookupFilter.m mode change 100644 => 100755 framework/Source/GPUImageLowPassFilter.h mode change 100644 => 100755 framework/Source/GPUImageLowPassFilter.m mode change 100644 => 100755 framework/Source/GPUImageLuminosity.h mode change 100644 => 100755 framework/Source/GPUImageLuminosity.m create mode 100755 framework/Source/GPUImageLuminosityBlendFilter.h create mode 100755 framework/Source/GPUImageLuminosityBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageMedianFilter.h mode change 100644 => 100755 framework/Source/GPUImageMedianFilter.m mode change 100644 => 100755 framework/Source/GPUImageMonochromeFilter.h mode change 100644 => 100755 framework/Source/GPUImageMonochromeFilter.m mode change 100644 => 100755 framework/Source/GPUImageMosaicFilter.h mode change 100644 => 100755 framework/Source/GPUImageMosaicFilter.m mode change 100644 => 100755 framework/Source/GPUImageMotionDetector.h mode change 100644 => 100755 framework/Source/GPUImageMotionDetector.m mode change 100644 => 100755 framework/Source/GPUImageNobleCornerDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUImageNobleCornerDetectionFilter.m mode change 100644 => 100755 framework/Source/GPUImageNonMaximumSuppressionFilter.h mode change 100644 => 100755 framework/Source/GPUImageNonMaximumSuppressionFilter.m mode change 100644 => 100755 framework/Source/GPUImageNormalBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageNormalBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageOpacityFilter.h mode change 100644 => 100755 framework/Source/GPUImageOpacityFilter.m mode change 100644 => 100755 framework/Source/GPUImageOpeningFilter.h mode change 100644 => 100755 framework/Source/GPUImageOpeningFilter.m mode change 100644 => 100755 framework/Source/GPUImageParallelCoordinateLineTransformFilter.h mode change 100644 => 100755 framework/Source/GPUImageParallelCoordinateLineTransformFilter.m mode change 100644 => 100755 framework/Source/GPUImagePerlinNoiseFilter.h mode change 100644 => 100755 framework/Source/GPUImagePerlinNoiseFilter.m mode change 100644 => 100755 framework/Source/GPUImagePolkaDotFilter.h mode change 100644 => 100755 framework/Source/GPUImagePolkaDotFilter.m mode change 100644 => 100755 framework/Source/GPUImageRGBClosingFilter.h mode change 100644 => 100755 framework/Source/GPUImageRGBClosingFilter.m mode change 100644 => 100755 framework/Source/GPUImageRGBDilationFilter.h mode change 100644 => 100755 framework/Source/GPUImageRGBDilationFilter.m mode change 100644 => 100755 framework/Source/GPUImageRGBErosionFilter.h mode change 100644 => 100755 framework/Source/GPUImageRGBErosionFilter.m mode change 100644 => 100755 framework/Source/GPUImageRGBOpeningFilter.h mode change 100644 => 100755 framework/Source/GPUImageRGBOpeningFilter.m mode change 100644 => 100755 framework/Source/GPUImageRawDataInput.h mode change 100644 => 100755 framework/Source/GPUImageRawDataInput.m create mode 100755 framework/Source/GPUImageSaturationBlendFilter.h create mode 100755 framework/Source/GPUImageSaturationBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m mode change 100644 => 100755 framework/Source/GPUImageSingleComponentFastBlurFilter.h mode change 100644 => 100755 framework/Source/GPUImageSingleComponentFastBlurFilter.m mode change 100644 => 100755 framework/Source/GPUImageSingleComponentGaussianBlurFilter.h mode change 100644 => 100755 framework/Source/GPUImageSingleComponentGaussianBlurFilter.m mode change 100644 => 100755 framework/Source/GPUImageSolidColorGenerator.h mode change 100644 => 100755 framework/Source/GPUImageSolidColorGenerator.m mode change 100644 => 100755 framework/Source/GPUImageSourceOverBlendFilter.h mode change 100644 => 100755 framework/Source/GPUImageSourceOverBlendFilter.m mode change 100644 => 100755 framework/Source/GPUImageSphereRefractionFilter.h mode change 100644 => 100755 framework/Source/GPUImageSphereRefractionFilter.m mode change 100644 => 100755 framework/Source/GPUImageThresholdSketchFilter.h mode change 100644 => 100755 framework/Source/GPUImageThresholdSketchFilter.m mode change 100644 => 100755 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h mode change 100644 => 100755 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m mode change 100644 => 100755 framework/Source/GPUImageToneCurveFilter.m mode change 100644 => 100755 framework/Source/GPUImageTwoInputFilter.h mode change 100644 => 100755 framework/Source/GPUImageTwoInputFilter.m mode change 100644 => 100755 framework/Source/GPUImageTwoPassTextureSamplingFilter.h mode change 100644 => 100755 framework/Source/GPUImageTwoPassTextureSamplingFilter.m mode change 100644 => 100755 framework/Source/GPUImageUIElement.h mode change 100644 => 100755 framework/Source/GPUImageUIElement.m mode change 100644 => 100755 framework/Source/GPUImageVoroniConsumerFilter.h mode change 100644 => 100755 framework/Source/GPUImageVoroniConsumerFilter.m mode change 100644 => 100755 framework/Source/GPUImageWeakPixelInclusionFilter.h mode change 100644 => 100755 framework/Source/GPUImageWeakPixelInclusionFilter.m mode change 100644 => 100755 framework/Source/GPUImageWhiteBalanceFilter.h mode change 100644 => 100755 framework/Source/GPUImageWhiteBalanceFilter.m mode change 100644 => 100755 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h mode change 100644 => 100755 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 8acb3f494..565168456 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -39,6 +39,7 @@ #import "GPUImageMultiplyBlendFilter.h" #import "GPUImageDissolveBlendFilter.h" #import "GPUImageKuwaharaFilter.h" +#import "GPUImageKuwaharaRadius3Filter.h" #import "GPUImageVignetteFilter.h" #import "GPUImageGaussianBlurFilter.h" #import "GPUImageGaussianBlurPositionFilter.h" @@ -57,6 +58,10 @@ #import "GPUImageSubtractBlendFilter.h" #import "GPUImageHardLightBlendFilter.h" #import "GPUImageSoftLightBlendFilter.h" +#import "GPUImageColorBlendFilter.h" +#import "GPUImageHueBlendFilter.h" +#import "GPUImageSaturationBlendFilter.h" +#import "GPUImageLuminosityBlendFilter.h" #import "GPUImageCropFilter.h" #import "GPUImageGrayscaleFilter.h" #import "GPUImageTransformFilter.h" diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m index 605ff2ca3..987fb1b31 100755 --- a/framework/Source/GPUImage3x3ConvolutionFilter.m +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -22,21 +22,21 @@ void main() { - mediump vec4 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate); - mediump vec4 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate); - mediump vec4 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate); + mediump vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + mediump vec3 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb; + mediump vec3 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb; mediump vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec4 leftColor = texture2D(inputImageTexture, leftTextureCoordinate); - mediump vec4 rightColor = texture2D(inputImageTexture, rightTextureCoordinate); - mediump vec4 topColor = texture2D(inputImageTexture, topTextureCoordinate); - mediump vec4 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate); - mediump vec4 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate); + mediump vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + mediump vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + mediump vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; + mediump vec3 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).rgb; + mediump vec3 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb; - mediump vec4 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; - resultColor += leftColor * convolutionMatrix[1][0] + centerColor * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; + mediump vec3 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; + resultColor += leftColor * convolutionMatrix[1][0] + centerColor.rgb * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; - gl_FragColor = resultColor; + gl_FragColor = vec4(resultColor, centerColor.a); } ); diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.h b/framework/Source/GPUImage3x3TextureSamplingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAddBlendFilter.h b/framework/Source/GPUImageAddBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAddBlendFilter.m b/framework/Source/GPUImageAddBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAmatorkaFilter.m b/framework/Source/GPUImageAmatorkaFilter.m index 8ed55e04d..ce0a1f2ce 100755 --- a/framework/Source/GPUImageAmatorkaFilter.m +++ b/framework/Source/GPUImageAmatorkaFilter.m @@ -26,6 +26,11 @@ - (id)init; return self; } +-(void)prepareForImageCapture { + [lookupImageSource processImage]; + [super prepareForImageCapture]; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageAverageColor.h b/framework/Source/GPUImageAverageColor.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.h b/framework/Source/GPUImageAverageLuminanceThresholdFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.m b/framework/Source/GPUImageAverageLuminanceThresholdFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBilateralFilter.h b/framework/Source/GPUImageBilateralFilter.h old mode 100644 new mode 100755 index 617312b21..6b736ccff --- a/framework/Source/GPUImageBilateralFilter.h +++ b/framework/Source/GPUImageBilateralFilter.h @@ -1,5 +1,10 @@ #import "GPUImageGaussianBlurFilter.h" @interface GPUImageBilateralFilter : GPUImageGaussianBlurFilter - +{ + CGFloat firstDistanceNormalizationFactorUniform; + CGFloat secondDistanceNormalizationFactorUniform; +} +// A normalization factor for the distance between central color and sample color. +@property(nonatomic, readwrite) CGFloat distanceNormalizationFactor; @end diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m old mode 100644 new mode 100755 index 507067115..e64ae0e48 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -9,22 +9,24 @@ varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; -// const mediump float distanceNormalizationFactor = 0.6933613; - const mediump float distanceNormalizationFactor = 1.5; + uniform mediump float distanceNormalizationFactor; - void main() { - lowp vec4 centralColor = texture2D(inputImageTexture, blurCoordinates[4]); - lowp float gaussianWeightTotal = 0.18; - lowp vec4 sum = centralColor * 0.18; - - lowp vec4 sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); + void main() + { + lowp vec4 centralColor; + lowp float gaussianWeightTotal; + lowp vec4 sum; + lowp vec4 sampleColor; lowp float distanceFromCentralColor; - // distanceFromCentralColor = abs(centralColor.g - sampleColor.g); - // distanceFromCentralColor = smoothstep(0.0, 1.0, abs(centralColor.g - sampleColor.g)); - // distanceFromCentralColor = smoothstep(0.0, 1.0, distance(centralColor, sampleColor) * distanceNormalizationFactor); + lowp float gaussianWeight; + + centralColor = texture2D(inputImageTexture, blurCoordinates[4]); + gaussianWeightTotal = 0.18; + sum = centralColor * 0.18; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); - - lowp float gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); + gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; @@ -86,8 +88,31 @@ - (id)init; return nil; } + firstDistanceNormalizationFactorUniform = [filterProgram uniformIndex:@"distanceNormalizationFactor"]; + secondDistanceNormalizationFactorUniform = [filterProgram uniformIndex:@"distanceNormalizationFactor"]; + + self.blurSize = 4.0; + self.distanceNormalizationFactor = 8.0; + return self; } + +#pragma mark - +#pragma mark Accessors + +- (void)setDistanceNormalizationFactor:(CGFloat)newValue +{ + _distanceNormalizationFactor = newValue; + + [self setFloat:newValue + forUniform:firstDistanceNormalizationFactorUniform + program:filterProgram]; + + [self setFloat:newValue + forUniform:secondDistanceNormalizationFactorUniform + program:secondFilterProgram]; +} + @end diff --git a/framework/Source/GPUImageBuffer.h b/framework/Source/GPUImageBuffer.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index aa7ed6d38..d9536879b 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -10,29 +10,26 @@ uniform highp vec2 center; uniform highp float radius; uniform highp float scale; - + void main() - { - highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); - highp float dist = distance(center, textureCoordinateToUse); - textureCoordinateToUse = textureCoordinate; - - if (dist < radius) - { - textureCoordinateToUse -= center; - highp float percent = 1.0 - ((radius - dist) / radius) * scale; - percent = percent * percent; - - textureCoordinateToUse = textureCoordinateToUse * percent; - textureCoordinateToUse += center; - - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); - } - else - { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); - } - } +{ + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(center, textureCoordinateToUse); + textureCoordinateToUse = textureCoordinate; + + if (dist < radius) + { + textureCoordinateToUse -= center; + highp float percent = 1.0 - ((radius - dist) / radius) * scale; + percent = percent * percent; + + textureCoordinateToUse = textureCoordinateToUse * percent; + textureCoordinateToUse += center; + } + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); +} + ); @interface GPUImageBulgeDistortionFilter () diff --git a/framework/Source/GPUImageChromaKeyFilter.h b/framework/Source/GPUImageChromaKeyFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageChromaKeyFilter.m b/framework/Source/GPUImageChromaKeyFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageClosingFilter.h b/framework/Source/GPUImageClosingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageClosingFilter.m b/framework/Source/GPUImageClosingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorBlendFilter.h b/framework/Source/GPUImageColorBlendFilter.h new file mode 100755 index 000000000..302a16c6c --- /dev/null +++ b/framework/Source/GPUImageColorBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageColorBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageColorBlendFilter.m b/framework/Source/GPUImageColorBlendFilter.m new file mode 100755 index 000000000..eb0ccbff2 --- /dev/null +++ b/framework/Source/GPUImageColorBlendFilter.m @@ -0,0 +1,65 @@ +#import "GPUImageColorBlendFilter.h" + +/** + * Color blend mode based upon pseudo code from the PDF specification. + */ +NSString *const kGPUImageColorBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + highp float lum(lowp vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + lowp vec3 clipcolor(lowp vec3 c) { + highp float l = lum(c); + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + lowp vec3 setlum(lowp vec3 c, highp float l) { + highp float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + void main() + { + highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(overlayColor.rgb, lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } + ); + + +@implementation GPUImageColorBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageColorBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end \ No newline at end of file diff --git a/framework/Source/GPUImageColorPackingFilter.h b/framework/Source/GPUImageColorPackingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCrosshairGenerator.h b/framework/Source/GPUImageCrosshairGenerator.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDarkenBlendFilter.m b/framework/Source/GPUImageDarkenBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDilationFilter.h b/framework/Source/GPUImageDilationFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDilationFilter.m b/framework/Source/GPUImageDilationFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDivideBlendFilter.h b/framework/Source/GPUImageDivideBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageDivideBlendFilter.m b/framework/Source/GPUImageDivideBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageErosionFilter.h b/framework/Source/GPUImageErosionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageErosionFilter.m b/framework/Source/GPUImageErosionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFalseColorFilter.h b/framework/Source/GPUImageFalseColorFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 02b72c234..179d11935 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -60,10 +60,15 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; CGSize currentFilterSize; GPUImageRotationMode inputRotation; + + BOOL currentlyReceivingMonochromeInput; + + NSMutableDictionary *uniformStateRestorationBlocks; } @property(readonly) CVPixelBufferRef renderTarget; @property(readwrite, nonatomic) BOOL preventRendering; +@property(readwrite, nonatomic) BOOL currentlyReceivingMonochromeInput; /// @name Initialization and teardown @@ -111,7 +116,6 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; /// @name Rendering + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; -- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; - (CGSize)outputFrameSize; @@ -135,4 +139,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; + @end diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 3478cb266..c1eba441e 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -36,6 +36,7 @@ @implementation GPUImageFilter @synthesize renderTarget; @synthesize preventRendering = _preventRendering; +@synthesize currentlyReceivingMonochromeInput; #pragma mark - #pragma mark Initialization and teardown @@ -47,8 +48,10 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad return nil; } + uniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; preparedToCaptureImage = NO; _preventRendering = NO; + currentlyReceivingMonochromeInput = NO; inputRotation = kGPUImageNoRotation; backgroundColorRed = 0.0; backgroundColorGreen = 0.0; @@ -343,7 +346,15 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; [self initializeOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + +// if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// { +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); +// } +// else +// { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); +// } glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); [self notifyTargetsAboutNewOutputTexture]; @@ -491,8 +502,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - [self setUniformsForProgramAtIndex:0]; [self setFilterFBO]; + [self setUniformsForProgramAtIndex:0]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); @@ -508,11 +519,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; -{ - -} - - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; { if (self.frameProcessingCompletionBlock != NULL) @@ -626,7 +632,9 @@ - (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLPr { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + }]; }); } @@ -634,7 +642,9 @@ - (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLPr { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); + }]; }); } @@ -642,7 +652,9 @@ - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgra { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform1f(uniform, floatValue); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform1f(uniform, floatValue); + }]; }); } @@ -650,12 +662,13 @@ - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgra { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - - GLfloat positionArray[2]; - positionArray[0] = pointValue.x; - positionArray[1] = pointValue.y; - - glUniform2fv(uniform, 1, positionArray); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + GLfloat positionArray[2]; + positionArray[0] = pointValue.x; + positionArray[1] = pointValue.y; + + glUniform2fv(uniform, 1, positionArray); + }]; }); } @@ -664,11 +677,13 @@ - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram * runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - GLfloat sizeArray[2]; - sizeArray[0] = sizeValue.width; - sizeArray[1] = sizeValue.height; - - glUniform2fv(uniform, 1, sizeArray); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + GLfloat sizeArray[2]; + sizeArray[0] = sizeValue.width; + sizeArray[1] = sizeValue.height; + + glUniform2fv(uniform, 1, sizeArray); + }]; }); } @@ -677,7 +692,9 @@ - (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLPro runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); + }]; }); } @@ -686,7 +703,9 @@ - (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLPro runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); + }]; }); } @@ -695,7 +714,9 @@ - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUnifo runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform1fv(uniform, arrayLength, arrayValue); + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform1fv(uniform, arrayLength, arrayValue); + }]; }); } @@ -703,10 +724,27 @@ - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - glUniform1i(uniform, intValue); + + [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ + glUniform1i(uniform, intValue); + }]; }); } +- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; +{ + [uniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; + uniformStateBlock(); +} + +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; +{ + [uniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ + dispatch_block_t currentBlock = obj; + currentBlock(); + }]; +} + #pragma mark - #pragma mark GPUImageInput @@ -961,6 +999,11 @@ - (void)conserveMemoryForNextFrame; } } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index e36ca9a1c..1fbccc5e2 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -88,6 +88,8 @@ - (void)setFrameProcessingCompletionBlock:(void (^)(GPUImageOutput *, CMTime))fr - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { + outputTextureRetainCount = [_initialFilters count]; + for (GPUImageOutput *currentFilter in _initialFilters) { if (currentFilter != self.inputFilterToIgnoreForUpdates) @@ -99,9 +101,11 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; { + firstTextureDelegate = newTextureDelegate; + for (GPUImageOutput *currentFilter in _initialFilters) { - [currentFilter setTextureDelegate:newTextureDelegate atIndex:textureIndex]; + [currentFilter setTextureDelegate:self atIndex:textureIndex]; } } @@ -185,4 +189,35 @@ - (void)conserveMemoryForNextFrame; } } +- (BOOL)wantsMonochromeInput; +{ + BOOL allInputsWantMonochromeInput = YES; + for (GPUImageOutput *currentFilter in _initialFilters) + { + allInputsWantMonochromeInput = allInputsWantMonochromeInput && [currentFilter wantsMonochromeInput]; + } + + return allInputsWantMonochromeInput; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + for (GPUImageOutput *currentFilter in _initialFilters) + { + [currentFilter setCurrentlyReceivingMonochromeInput:newValue]; + } +} + +#pragma mark - +#pragma mark GPUImageTextureDelegate methods + +- (void)textureNoLongerNeededForTarget:(id)textureTarget; +{ + outputTextureRetainCount--; + if (outputTextureRetainCount < 1) + { + [firstTextureDelegate textureNoLongerNeededForTarget:self]; + } +} + @end diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 1f120b4fa..0c6a06b3c 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -2,6 +2,9 @@ #import "GPUImageFilter.h" @interface GPUImageFilterPipeline : NSObject +{ + NSString *stringValue; +} @property (strong) NSMutableArray *filters; @@ -21,5 +24,6 @@ - (UIImage *) currentFilteredFrame; - (CGImageRef) newCGImageFromCurrentFilteredFrame; +- (CGImageRef) newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation; @end diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 5a736c849..84057e95c 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -37,12 +37,12 @@ - (BOOL)_parseConfiguration:(NSDictionary *)configuration { if (!filters) { return NO; } - + NSError *regexError = nil; NSRegularExpression *parsingRegex = [NSRegularExpression regularExpressionWithPattern:@"(float|CGPoint|NSString)\\((.*?)(?:,\\s*(.*?))*\\)" - options:0 - error:®exError]; - + options:0 + error:®exError]; + // It's faster to put them into an array and then pass it to the filters property than it is to call [self addFilter:] every time NSMutableArray *orderedFilters = [NSMutableArray arrayWithCapacity:[filters count]]; for (NSDictionary *filter in filters) { @@ -58,67 +58,80 @@ - (BOOL)_parseConfiguration:(NSDictionary *)configuration { NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[theClass instanceMethodSignatureForSelector:theSelector]]; [inv setSelector:theSelector]; [inv setTarget:genericFilter]; - - // Parse the argument - NSMutableArray *parsedArray; - if ([[filterAttributes objectForKey:propertyKey] isKindOfClass:[NSArray class]]) { - NSArray *array = [filterAttributes objectForKey:propertyKey]; - parsedArray = [NSMutableArray arrayWithCapacity:[array count]]; - for (NSString *string in array) { + + // check selector given with parameter + if ([propertyKey hasSuffix:@":"]) { + + stringValue = nil; + + // Then parse the arguments + NSMutableArray *parsedArray; + if ([[filterAttributes objectForKey:propertyKey] isKindOfClass:[NSArray class]]) { + NSArray *array = [filterAttributes objectForKey:propertyKey]; + parsedArray = [NSMutableArray arrayWithCapacity:[array count]]; + for (NSString *string in array) { + NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string + options:0 + range:NSMakeRange(0, [string length])]; + + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; + if ([modifier isEqualToString:@"float"]) { + // Float modifier, one argument + CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + [parsedArray addObject:[NSNumber numberWithFloat:value]]; + [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"CGPoint"]) { + // CGPoint modifier, two float arguments + CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; + CGPoint value = CGPointMake(x, y); + [parsedArray addObject:[NSValue valueWithCGPoint:value]]; + } else if ([modifier isEqualToString:@"NSString"]) { + // NSString modifier, one string argument + stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; + [inv setArgument:&stringValue atIndex:2]; + + } else { + return NO; + } + } + [inv setArgument:&parsedArray atIndex:2]; + } else { + NSString *string = [filterAttributes objectForKey:propertyKey]; NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string - options:0 - range:NSMakeRange(0, [string length])]; - NSLog(@"Ranges: %d", parse.numberOfRanges); + options:0 + range:NSMakeRange(0, [string length])]; + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; if ([modifier isEqualToString:@"float"]) { // Float modifier, one argument CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - [parsedArray addObject:[NSNumber numberWithFloat:value]]; [inv setArgument:&value atIndex:2]; } else if ([modifier isEqualToString:@"CGPoint"]) { // CGPoint modifier, two float arguments CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; CGPoint value = CGPointMake(x, y); - [parsedArray addObject:[NSValue valueWithCGPoint:value]]; + [inv setArgument:&value atIndex:2]; } else if ([modifier isEqualToString:@"NSString"]) { // NSString modifier, one string argument - NSString *stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; + stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; [inv setArgument:&stringValue atIndex:2]; - + } else { return NO; } } - [inv setArgument:&parsedArray atIndex:2]; - } else { - NSString *string = [filterAttributes objectForKey:propertyKey]; - NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string - options:0 - range:NSMakeRange(0, [string length])]; - NSLog(@"Ranges: %d", parse.numberOfRanges); - NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; - if ([modifier isEqualToString:@"float"]) { - // Float modifier, one argument - CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - [inv setArgument:&value atIndex:2]; - } else if ([modifier isEqualToString:@"CGPoint"]) { - // CGPoint modifier, two float arguments - CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; - CGPoint value = CGPointMake(x, y); - [inv setArgument:&value atIndex:2]; - } else { - return NO; - } } + + [inv invoke]; } } [orderedFilters addObject:genericFilter]; } self.filters = orderedFilters; - + return YES; } @@ -166,19 +179,19 @@ - (void)replaceAllFilters:(NSArray *)newFilters { } - (void)_refreshFilters { - + id prevFilter = self.input; GPUImageFilter *theFilter = nil; - + for (int i = 0; i < [self.filters count]; i++) { theFilter = [self.filters objectAtIndex:i]; [prevFilter removeAllTargets]; [prevFilter addTarget:theFilter]; prevFilter = theFilter; } - + [prevFilter removeAllTargets]; - + if (self.output != nil) { [prevFilter addTarget:self.output]; } @@ -192,4 +205,9 @@ - (CGImageRef)newCGImageFromCurrentFilteredFrame { return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; } -@end +- (CGImageRef)newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation { + return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; +} + + +@end \ No newline at end of file diff --git a/framework/Source/GPUImageGlassSphereFilter.h b/framework/Source/GPUImageGlassSphereFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGlassSphereFilter.m b/framework/Source/GPUImageGlassSphereFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index 46dd1196b..78876244f 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -21,6 +21,88 @@ void main() } ); +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + if (!currentlyReceivingMonochromeInput) + { + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + } +} + +- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +{ + [super setInputTexture:newInputTexture atIndex:textureIndex]; + if (currentlyReceivingMonochromeInput) + { + [self notifyTargetsAboutNewOutputTexture]; + } +} + +- (GLuint)textureForOutput; +{ + if (currentlyReceivingMonochromeInput) + { + return filterSourceTexture; + } + else + { + return outputTexture; + } +} + +- (BOOL)wantsMonochromeInput; +{ + return YES; +} + +- (BOOL)providesMonochromeOutput; +{ + return YES; +} + +- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; +{ + if (self.frameProcessingCompletionBlock != NULL) + { + self.frameProcessingCompletionBlock(self, frameTime); + } + + [self releaseInputTexturesIfNeeded]; + + for (id currentTarget in targets) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; + } + + if (currentlyReceivingMonochromeInput) + { + [currentTarget setInputRotation:inputRotation atIndex:textureIndex]; + + CGSize sizeToRotate = [self outputFrameSize]; + CGSize rotatedSize = sizeToRotate; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + rotatedSize.width = sizeToRotate.height; + rotatedSize.height = sizeToRotate.width; + } + [currentTarget setInputSize:rotatedSize atIndex:textureIndex]; + } + else + { + [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; + } + [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndex]; + } + } +} + #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageHalftoneFilter.h b/framework/Source/GPUImageHalftoneFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHalftoneFilter.m b/framework/Source/GPUImageHalftoneFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHighPassFilter.h b/framework/Source/GPUImageHighPassFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHighPassFilter.m b/framework/Source/GPUImageHighPassFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHighlightShadowFilter.h b/framework/Source/GPUImageHighlightShadowFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHighlightShadowFilter.m b/framework/Source/GPUImageHighlightShadowFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHoughTransformLineDetector.h b/framework/Source/GPUImageHoughTransformLineDetector.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m old mode 100644 new mode 100755 index 6edfa881a..e701067f5 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -11,6 +11,7 @@ @implementation GPUImageHoughTransformLineDetector @synthesize linesDetectedBlock; @synthesize edgeThreshold; @synthesize lineDetectionThreshold; +@synthesize intermediateImages = _intermediateImages; - (id)init; { diff --git a/framework/Source/GPUImageHueBlendFilter.h b/framework/Source/GPUImageHueBlendFilter.h new file mode 100755 index 000000000..4399ffcfb --- /dev/null +++ b/framework/Source/GPUImageHueBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageHueBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageHueBlendFilter.m b/framework/Source/GPUImageHueBlendFilter.m new file mode 100755 index 000000000..e448ee9aa --- /dev/null +++ b/framework/Source/GPUImageHueBlendFilter.m @@ -0,0 +1,115 @@ +#import "GPUImageHueBlendFilter.h" + +/** + * Hue blend mode based upon pseudo code from the PDF specification. + */ +NSString *const kGPUImageHueBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + highp float lum(lowp vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + lowp vec3 clipcolor(lowp vec3 c) { + highp float l = lum(c); + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + lowp vec3 setlum(lowp vec3 c, highp float l) { + highp float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + highp float sat(lowp vec3 c) { + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + return x - n; + } + + lowp float mid(lowp float cmin, lowp float cmid, lowp float cmax, highp float s) { + return ((cmid - cmin) * s) / (cmax - cmin); + } + + lowp vec3 setsat(lowp vec3 c, highp float s) { + if (c.r > c.g) { + if (c.r > c.b) { + if (c.g > c.b) { + /* g is mid, b is min */ + c.g = mid(c.b, c.g, c.r, s); + c.b = 0.0; + } else { + /* b is mid, g is min */ + c.b = mid(c.g, c.b, c.r, s); + c.g = 0.0; + } + c.r = s; + } else { + /* b is max, r is mid, g is min */ + c.r = mid(c.g, c.r, c.b, s); + c.b = s; + c.r = 0.0; + } + } else if (c.r > c.b) { + /* g is max, r is mid, b is min */ + c.r = mid(c.b, c.r, c.g, s); + c.g = s; + c.b = 0.0; + } else if (c.g > c.b) { + /* g is max, b is mid, r is min */ + c.b = mid(c.r, c.b, c.g, s); + c.g = s; + c.r = 0.0; + } else if (c.b > c.g) { + /* b is max, g is mid, r is min */ + c.g = mid(c.r, c.g, c.b, s); + c.b = s; + c.r = 0.0; + } else { + c = vec3(0.0); + } + return c; + } + + void main() + { + highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(overlayColor.rgb, sat(baseColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } + ); + + +@implementation GPUImageHueBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageHueBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageHueFilter.h b/framework/Source/GPUImageHueFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageJFAVoroniFilter.h b/framework/Source/GPUImageJFAVoroniFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m index e779c11c6..8c74e661a 100755 --- a/framework/Source/GPUImageKuwaharaFilter.m +++ b/framework/Source/GPUImageKuwaharaFilter.m @@ -15,64 +15,86 @@ precision highp float; - const vec2 src_size = vec2 (768.0, 1024.0); + const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0); void main (void) { - vec2 uv = textureCoordinate; - float n = float((radius + 1) * (radius + 1)); - - vec3 m[4]; - vec3 s[4]; - for (int k = 0; k < 4; ++k) { - m[k] = vec3(0.0); - s[k] = vec3(0.0); - } - - for (int j = -radius; j <= 0; ++j) { - for (int i = -radius; i <= 0; ++i) { - vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; - m[0] += c; - s[0] += c * c; - } - } - - for (int j = -radius; j <= 0; ++j) { - for (int i = 0; i <= radius; ++i) { - vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; - m[1] += c; - s[1] += c * c; - } - } - - for (int j = 0; j <= radius; ++j) { - for (int i = 0; i <= radius; ++i) { - vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; - m[2] += c; - s[2] += c * c; - } - } - - for (int j = 0; j <= radius; ++j) { - for (int i = -radius; i <= 0; ++i) { - vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; - m[3] += c; - s[3] += c * c; - } - } - - - float min_sigma2 = 1e+2; - for (int k = 0; k < 4; ++k) { - m[k] /= n; - s[k] = abs(s[k] / n - m[k] * m[k]); - - float sigma2 = s[k].r + s[k].g + s[k].b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m[k], 1.0); - } - } + vec2 uv = textureCoordinate; + float n = float((radius + 1) * (radius + 1)); + int i; int j; + vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0); + vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0); + vec3 c; + + for (j = -radius; j <= 0; ++j) { + for (i = -radius; i <= 0; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m0 += c; + s0 += c * c; + } + } + + for (j = -radius; j <= 0; ++j) { + for (i = 0; i <= radius; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m1 += c; + s1 += c * c; + } + } + + for (j = 0; j <= radius; ++j) { + for (i = 0; i <= radius; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m2 += c; + s2 += c * c; + } + } + + for (j = 0; j <= radius; ++j) { + for (i = -radius; i <= 0; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m3 += c; + s3 += c * c; + } + } + + + float min_sigma2 = 1e+2; + m0 /= n; + s0 = abs(s0 / n - m0 * m0); + + float sigma2 = s0.r + s0.g + s0.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m0, 1.0); + } + + m1 /= n; + s1 = abs(s1 / n - m1 * m1); + + sigma2 = s1.r + s1.g + s1.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m1, 1.0); + } + + m2 /= n; + s2 = abs(s2 / n - m2 * m2); + + sigma2 = s2.r + s2.g + s2.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m2, 1.0); + } + + m3 /= n; + s3 = abs(s3 / n - m3 * m3); + + sigma2 = s3.r + s3.g + s3.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m3, 1.0); + } } ); diff --git a/framework/Source/GPUImageKuwaharaRadius3Filter.h b/framework/Source/GPUImageKuwaharaRadius3Filter.h new file mode 100644 index 000000000..c4591b817 --- /dev/null +++ b/framework/Source/GPUImageKuwaharaRadius3Filter.h @@ -0,0 +1,8 @@ +// +// GPUImageKuwaharaRadius3Filter.h + +#import "GPUImageFilter.h" + +@interface GPUImageKuwaharaRadius3Filter : GPUImageFilter + +@end diff --git a/framework/Source/GPUImageKuwaharaRadius3Filter.m b/framework/Source/GPUImageKuwaharaRadius3Filter.m new file mode 100644 index 000000000..086154922 --- /dev/null +++ b/framework/Source/GPUImageKuwaharaRadius3Filter.m @@ -0,0 +1,286 @@ +#import "GPUImageKuwaharaRadius3Filter.h" + +// Sourced from Kyprianidis, J. E., Kang, H., and Doellner, J. "Anisotropic Kuwahara Filtering on the GPU," GPU Pro p.247 (2010). +// +// Original header: +// +// Anisotropic Kuwahara Filtering on the GPU +// by Jan Eric Kyprianidis + +NSString *const kGPUImageKuwaharaRadius3FragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + + precision highp float; + + const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0); + + void main (void) + { + vec2 uv = textureCoordinate; + float n = float(16); // radius is assumed to be 3 + vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0); + vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0); + vec3 c; + vec3 cSq; + + c = texture2D(inputImageTexture, uv + vec2(-3,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-2,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-1,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(0,-3) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,-2) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,-1) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-3,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(-2,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(-1,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(0,3) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,2) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,1) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(3,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(2,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(1,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(3,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(2,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(1,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + float min_sigma2 = 1e+2; + m0 /= n; + s0 = abs(s0 / n - m0 * m0); + + float sigma2 = s0.r + s0.g + s0.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m0, 1.0); + } + + m1 /= n; + s1 = abs(s1 / n - m1 * m1); + + sigma2 = s1.r + s1.g + s1.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m1, 1.0); + } + + m2 /= n; + s2 = abs(s2 / n - m2 * m2); + + sigma2 = s2.r + s2.g + s2.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m2, 1.0); + } + + m3 /= n; + s3 = abs(s3 / n - m3 * m3); + + sigma2 = s3.r + s3.g + s3.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m3, 1.0); + } + } + ); + +@implementation GPUImageKuwaharaRadius3Filter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageKuwaharaRadius3FragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageLanczosResamplingFilter.h b/framework/Source/GPUImageLanczosResamplingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m old mode 100644 new mode 100755 index 4c5658d31..24c6dd56f --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -123,4 +123,37 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; }); } +// The first pass (vertical) of the resampling needs to be shrunk in only one dimension so that the remaining shrinkage can be performed in the horizonal pass +- (void)setFilterFBO; +{ + CGSize currentFBOSize = [self sizeOfFBO]; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + currentFBOSize.height = self.originalImageSize.height; + } + else + { + currentFBOSize.width = self.originalImageSize.width; + } + + if (!filterFramebuffer) + { + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } + [self setupFilterForSize:currentFBOSize]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); + + glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); +} + @end diff --git a/framework/Source/GPUImageLevelsFilter.h b/framework/Source/GPUImageLevelsFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLineGenerator.h b/framework/Source/GPUImageLineGenerator.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.h b/framework/Source/GPUImageLocalBinaryPatternFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.m b/framework/Source/GPUImageLocalBinaryPatternFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLookupFilter.h b/framework/Source/GPUImageLookupFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLookupFilter.m b/framework/Source/GPUImageLookupFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLowPassFilter.h b/framework/Source/GPUImageLowPassFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLowPassFilter.m b/framework/Source/GPUImageLowPassFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLuminosity.h b/framework/Source/GPUImageLuminosity.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageLuminosityBlendFilter.h b/framework/Source/GPUImageLuminosityBlendFilter.h new file mode 100755 index 000000000..03b5e4c9f --- /dev/null +++ b/framework/Source/GPUImageLuminosityBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageLuminosityBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageLuminosityBlendFilter.m b/framework/Source/GPUImageLuminosityBlendFilter.m new file mode 100755 index 000000000..f58970ef8 --- /dev/null +++ b/framework/Source/GPUImageLuminosityBlendFilter.m @@ -0,0 +1,65 @@ +#import "GPUImageLuminosityBlendFilter.h" + +/** + * Luminosity blend mode based upon pseudo code from the PDF specification. + */ +NSString *const kGPUImageLuminosityBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + highp float lum(lowp vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + lowp vec3 clipcolor(lowp vec3 c) { + highp float l = lum(c); + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + lowp vec3 setlum(lowp vec3 c, highp float l) { + highp float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + void main() + { + highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(baseColor.rgb, lum(overlayColor.rgb)) * overlayColor.a, baseColor.a); + } + ); + + +@implementation GPUImageLuminosityBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageLuminosityBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageMedianFilter.h b/framework/Source/GPUImageMedianFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMedianFilter.m b/framework/Source/GPUImageMedianFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMissEtikateFilter.m b/framework/Source/GPUImageMissEtikateFilter.m index 831ba0524..f15b85eea 100755 --- a/framework/Source/GPUImageMissEtikateFilter.m +++ b/framework/Source/GPUImageMissEtikateFilter.m @@ -26,6 +26,11 @@ - (id)init; return self; } +-(void)prepareForImageCapture { + [lookupImageSource processImage]; + [super prepareForImageCapture]; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageMonochromeFilter.h b/framework/Source/GPUImageMonochromeFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMotionDetector.h b/framework/Source/GPUImageMotionDetector.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMotionDetector.m b/framework/Source/GPUImageMotionDetector.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index 50cacc09e..a25876679 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -55,6 +55,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; - (void)startRecording; - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; - (void)finishRecording; +- (void)cancelRecording; - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; - (void)enableSynchronizationCallbacks; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 03f1fa433..78bc028c7 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -245,6 +245,21 @@ - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; [self startRecording]; } +- (void)cancelRecording; +{ + if (assetWriter.status == AVAssetWriterStatusCompleted) + { + return; + } + + isRecording = NO; + runOnMainQueueWithoutDeadlocking(^{ + [assetWriterVideoInput markAsFinished]; + [assetWriterAudioInput markAsFinished]; + [assetWriter cancelWriting]; + }); +} + - (void)finishRecording; { if (assetWriter.status == AVAssetWriterStatusCompleted) @@ -256,7 +271,11 @@ - (void)finishRecording; runOnMainQueueWithoutDeadlocking(^{ [assetWriterVideoInput markAsFinished]; [assetWriterAudioInput markAsFinished]; +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) [assetWriter finishWriting]; +#else + [assetWriter finishWritingWithCompletionHandler:NULL]; +#endif }); } @@ -583,6 +602,16 @@ - (void)conserveMemoryForNextFrame; } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.h b/framework/Source/GPUImageNobleCornerDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.m b/framework/Source/GPUImageNobleCornerDetectionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.h b/framework/Source/GPUImageNonMaximumSuppressionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNormalBlendFilter.h b/framework/Source/GPUImageNormalBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpacityFilter.h b/framework/Source/GPUImageOpacityFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpacityFilter.m b/framework/Source/GPUImageOpacityFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index de552e12b..a96ab96c6 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -22,6 +22,8 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; ++ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; ++ (BOOL)deviceSupportsRedTextures; + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - (void)presentBufferForDisplay; @@ -48,6 +50,8 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (BOOL)shouldIgnoreUpdatesToThisTarget; - (BOOL)enabled; - (void)conserveMemoryForNextFrame; +- (BOOL)wantsMonochromeInput; +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; @end @protocol GPUImageTextureDelegate diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index a90366f8a..118532dfd 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -91,6 +91,37 @@ + (GLint)maximumTextureUnitsForThisDevice; return maxTextureUnits; } ++ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; +{ + static dispatch_once_t pred; + static NSArray *extensionNames = nil; + + // Cache extensions for later quick reference, since this won't change for a given device + dispatch_once(&pred, ^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + NSString *extensionsString = [NSString stringWithCString:(const char *)glGetString(GL_EXTENSIONS) encoding:NSASCIIStringEncoding]; + extensionNames = [extensionsString componentsSeparatedByString:@" "]; + }); + + return [extensionNames containsObject:extension]; +} + + +// http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt + ++ (BOOL)deviceSupportsRedTextures; +{ + static dispatch_once_t pred; + static BOOL supportsRedTextures = NO; + + dispatch_once(&pred, ^{ + supportsRedTextures = [GPUImageOpenGLESContext deviceSupportsOpenGLESExtension:@"GL_EXT_texture_rg"]; + }); + + return supportsRedTextures; +} + + + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; { GLint maxTextureSize = [self maximumTextureSizeForThisDevice]; diff --git a/framework/Source/GPUImageOpeningFilter.h b/framework/Source/GPUImageOpeningFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOpeningFilter.m b/framework/Source/GPUImageOpeningFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index afef5447f..48618646f 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -34,6 +34,8 @@ void reportAvailableMemoryForGPUImage(NSString *tag); __unsafe_unretained id firstTextureDelegate; BOOL shouldConserveMemoryForNextFrame; + + BOOL allTargetsWantMonochromeData; } @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; @@ -112,7 +114,9 @@ void reportAvailableMemoryForGPUImage(NSString *tag); - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; +- (BOOL)providesMonochromeOutput; + - (void)prepareForImageCapture; - (void)conserveMemoryForNextFrame; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index dc3ca2236..2a7d43c97 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -88,7 +88,8 @@ - (id)init; targets = [[NSMutableArray alloc] init]; targetTextureIndices = [[NSMutableArray alloc] init]; _enabled = YES; - + allTargetsWantMonochromeData = YES; + return self; } @@ -131,6 +132,11 @@ - (void)addTarget:(id)newTarget; { NSInteger nextAvailableTextureIndex = [newTarget nextAvailableTextureIndex]; [self addTarget:newTarget atTextureLocation:nextAvailableTextureIndex]; + if (outputTexture) + { + [self setInputTextureForTarget:newTarget atIndex:nextAvailableTextureIndex]; + } + if ([newTarget shouldIgnoreUpdatesToThisTarget]) { _targetToIgnoreForUpdates = newTarget; @@ -150,6 +156,8 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text [newTarget setTextureDelegate:self atIndex:textureLocation]; [targets addObject:newTarget]; [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; + + allTargetsWantMonochromeData = allTargetsWantMonochromeData && [newTarget wantsMonochromeInput]; }); } @@ -198,6 +206,8 @@ - (void)removeAllTargets; } [targets removeAllObjects]; [targetTextureIndices removeAllObjects]; + + allTargetsWantMonochromeData = YES; }); } @@ -355,6 +365,11 @@ - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation return processedImage; } +- (BOOL)providesMonochromeOutput; +{ + return NO; +} + - (void)prepareForImageCapture; { diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePerlinNoiseFilter.h b/framework/Source/GPUImagePerlinNoiseFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 413c19516..65444d1b6 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -20,4 +20,4 @@ - (void)processImage; - (CGSize)outputImageSize; -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index e539ed022..08abb54c2 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -139,6 +139,8 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot return self; } +// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) - (void)dealloc; { if (imageUpdateSemaphore != NULL) @@ -146,6 +148,7 @@ - (void)dealloc; dispatch_release(imageUpdateSemaphore); } } +#endif #pragma mark - #pragma mark Image rendering @@ -167,7 +170,7 @@ - (void)processImage; return; } - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) { diff --git a/framework/Source/GPUImagePolkaDotFilter.h b/framework/Source/GPUImagePolkaDotFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBClosingFilter.h b/framework/Source/GPUImageRGBClosingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBClosingFilter.m b/framework/Source/GPUImageRGBClosingFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBDilationFilter.h b/framework/Source/GPUImageRGBDilationFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBDilationFilter.m b/framework/Source/GPUImageRGBDilationFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBErosionFilter.h b/framework/Source/GPUImageRGBErosionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBErosionFilter.m b/framework/Source/GPUImageRGBErosionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBOpeningFilter.h b/framework/Source/GPUImageRGBOpeningFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRGBOpeningFilter.m b/framework/Source/GPUImageRGBOpeningFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h old mode 100644 new mode 100755 index 02f59808e..bc24dad30 --- a/framework/Source/GPUImageRawDataInput.h +++ b/framework/Source/GPUImageRawDataInput.h @@ -2,15 +2,36 @@ // The bytes passed into this input are not copied or retained, but you are free to deallocate them after they are used by this filter. // The bytes are uploaded and stored within a texture, so nothing is kept locally. -// Input bytes are assumed to be in BGRA format. +// The default format for input bytes is GPUPixelFormatBGRA, unless specified with pixelFormat: +// The default type for input bytes is GPUPixelTypeUByte, unless specified with pixelType: + +typedef enum { + GPUPixelFormatBGRA = GL_BGRA, + GPUPixelFormatRGBA = GL_RGBA, + GPUPixelFormatRGB = GL_RGB +} GPUPixelFormat; + +typedef enum { + GPUPixelTypeUByte = GL_UNSIGNED_BYTE, + GPUPixelTypeFloat = GL_FLOAT +} GPUPixelType; @interface GPUImageRawDataInput : GPUImageOutput { CGSize uploadedImageSize; + + dispatch_semaphore_t dataUpdateSemaphore; } // Initialization and teardown - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat; +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat type:(GPUPixelType)pixelType; + +/** Input data pixel format + */ +@property (readwrite, nonatomic) GPUPixelFormat pixelFormat; +@property (readwrite, nonatomic) GPUPixelType pixelType; // Image rendering - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m old mode 100644 new mode 100755 index 133540cac..fda407d8d --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -6,23 +6,61 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; @implementation GPUImageRawDataInput +@synthesize pixelFormat = _pixelFormat; +@synthesize pixelType = _pixelType; + #pragma mark - #pragma mark Initialization and teardown - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; +{ + if (!(self = [self initWithBytes:bytesToUpload size:imageSize pixelFormat:GPUPixelFormatBGRA type:GPUPixelTypeUByte])) + { + return nil; + } + + return self; +} + +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat; +{ + if (!(self = [self initWithBytes:bytesToUpload size:imageSize pixelFormat:pixelFormat type:GPUPixelTypeUByte])) + { + return nil; + } + + return self; +} + +- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat type:(GPUPixelType)pixelType; { if (!(self = [super init])) { return nil; } + dataUpdateSemaphore = dispatch_semaphore_create(1); + uploadedImageSize = imageSize; + self.pixelFormat = pixelFormat; + self.pixelType = pixelType; [self uploadBytes:bytesToUpload]; return self; } +// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. +- (void)dealloc; +{ +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) + if (dataUpdateSemaphore != NULL) + { + dispatch_release(dataUpdateSemaphore); + } +#endif +} + #pragma mark - #pragma mark Image rendering @@ -30,8 +68,10 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; { [GPUImageOpenGLESContext useImageProcessingContext]; + [self initializeOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, bytesToUpload); + glTexImage2D(GL_TEXTURE_2D, 0, _pixelFormat==GPUPixelFormatRGB ? GL_RGB : GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, (GLint)_pixelFormat, (GLenum)_pixelType, bytesToUpload); } - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; @@ -43,16 +83,26 @@ - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; - (void)processData; { - CGSize pixelSizeOfImage = [self outputImageSize]; - - for (id currentTarget in targets) + if (dispatch_semaphore_wait(dataUpdateSemaphore, DISPATCH_TIME_NOW) != 0) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + return; + } + + runAsynchronouslyOnVideoProcessingQueue(^{ + + CGSize pixelSizeOfImage = [self outputImageSize]; + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; - } + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; + } + + dispatch_semaphore_signal(dataUpdateSemaphore); + }); } - (CGSize)outputImageSize; diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index d9c0d6ecc..ab146f73e 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -349,6 +349,16 @@ - (void)conserveMemoryForNextFrame; } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageSaturationBlendFilter.h b/framework/Source/GPUImageSaturationBlendFilter.h new file mode 100755 index 000000000..767892a53 --- /dev/null +++ b/framework/Source/GPUImageSaturationBlendFilter.h @@ -0,0 +1,5 @@ +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageSaturationBlendFilter : GPUImageTwoInputFilter + +@end diff --git a/framework/Source/GPUImageSaturationBlendFilter.m b/framework/Source/GPUImageSaturationBlendFilter.m new file mode 100755 index 000000000..1925926dd --- /dev/null +++ b/framework/Source/GPUImageSaturationBlendFilter.m @@ -0,0 +1,115 @@ +#import "GPUImageSaturationBlendFilter.h" + +/** + * Saturation blend mode based upon pseudo code from the PDF specification. + */ +NSString *const kGPUImageSaturationBlendFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + varying highp vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + highp float lum(lowp vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + lowp vec3 clipcolor(lowp vec3 c) { + highp float l = lum(c); + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + lowp vec3 setlum(lowp vec3 c, highp float l) { + highp float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + highp float sat(lowp vec3 c) { + lowp float n = min(min(c.r, c.g), c.b); + lowp float x = max(max(c.r, c.g), c.b); + return x - n; + } + + lowp float mid(lowp float cmin, lowp float cmid, lowp float cmax, highp float s) { + return ((cmid - cmin) * s) / (cmax - cmin); + } + + lowp vec3 setsat(lowp vec3 c, highp float s) { + if (c.r > c.g) { + if (c.r > c.b) { + if (c.g > c.b) { + /* g is mid, b is min */ + c.g = mid(c.b, c.g, c.r, s); + c.b = 0.0; + } else { + /* b is mid, g is min */ + c.b = mid(c.g, c.b, c.r, s); + c.g = 0.0; + } + c.r = s; + } else { + /* b is max, r is mid, g is min */ + c.r = mid(c.g, c.r, c.b, s); + c.b = s; + c.r = 0.0; + } + } else if (c.r > c.b) { + /* g is max, r is mid, b is min */ + c.r = mid(c.b, c.r, c.g, s); + c.g = s; + c.b = 0.0; + } else if (c.g > c.b) { + /* g is max, b is mid, r is min */ + c.b = mid(c.r, c.b, c.g, s); + c.g = s; + c.r = 0.0; + } else if (c.b > c.g) { + /* b is max, g is mid, r is min */ + c.g = mid(c.r, c.g, c.b, s); + c.b = s; + c.r = 0.0; + } else { + c = vec3(0.0); + } + return c; + } + + void main() + { + highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(baseColor.rgb, sat(overlayColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } + ); + + +@implementation GPUImageSaturationBlendFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageSaturationBlendFragmentShaderString])) + { + return nil; + } + + return self; +} + +@end diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.h b/framework/Source/GPUImageSingleComponentFastBlurFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.m b/framework/Source/GPUImageSingleComponentFastBlurFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index c3bc35acf..713a28c66 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -84,13 +84,22 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; + [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; }); } } +- (BOOL)wantsMonochromeInput; +{ + return YES; +} + +- (BOOL)providesMonochromeOutput; +{ + return YES; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m index cb12f9af1..08b6e8b35 100755 --- a/framework/Source/GPUImageSoftEleganceFilter.m +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -50,6 +50,12 @@ - (id)init; return self; } +-(void)prepareForImageCapture { + [lookupImageSource1 processImage]; + [lookupImageSource2 processImage]; + [super prepareForImageCapture]; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageSolidColorGenerator.h b/framework/Source/GPUImageSolidColorGenerator.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m old mode 100644 new mode 100755 index e717d0cf6..7d4458a3d --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -60,7 +60,7 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text - (void)setColor:(GPUVector4)newValue; { - [self setColorRed:_color.one green:_color.two blue:_color.three alpha:_color.four]; + [self setColorRed:newValue.one green:newValue.two blue:newValue.three alpha:newValue.four]; } - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; diff --git a/framework/Source/GPUImageSourceOverBlendFilter.h b/framework/Source/GPUImageSourceOverBlendFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSourceOverBlendFilter.m b/framework/Source/GPUImageSourceOverBlendFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSphereRefractionFilter.h b/framework/Source/GPUImageSphereRefractionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index 542ab6c8d..a86d93675 100755 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -5,6 +5,13 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina @interface GPUImageStillCamera : GPUImageVideoCamera +/** The JPEG compression quality to use when capturing a photo as a JPEG. + */ +@property CGFloat jpegCompressionQuality; + +// Only reliably set inside the context of the completion handler of one of the capture methods +@property (readonly) NSDictionary *currentCaptureMetadata; + // Photography controls - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block; - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 1cb78296c..b64cc1806 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -9,6 +9,8 @@ void stillImageDataReleaseCallback(void *releaseRefCon, const void *baseAddress) void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer) { + // CVPixelBufferCreateWithPlanarBytes for YUV input + CGSize originalSize = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); CVPixelBufferLockBaseAddress(cameraFrame, 0); @@ -44,10 +46,16 @@ @interface GPUImageStillCamera () AVCaptureStillImageOutput *photoOutput; } +// Methods calling this are responsible for calling dispatch_semaphore_signal(frameRenderingSemaphore) somewhere inside the block +- (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withImageOnGPUHandler:(void (^)(NSError *error))block; + @end @implementation GPUImageStillCamera +@synthesize currentCaptureMetadata = _currentCaptureMetadata; +@synthesize jpegCompressionQuality = _jpegCompressionQuality; + #pragma mark - #pragma mark Initialization and teardown @@ -61,12 +69,52 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [self.captureSession beginConfiguration]; photoOutput = [[AVCaptureStillImageOutput alloc] init]; - [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + + // Having a still photo input set to BGRA and video to YUV doesn't work well, so since I don't have YUV resizing for iPhone 4 yet, kick back to BGRA for that device +// if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) + if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + { + BOOL supportsFullYUVRange = NO; + NSArray *supportedPixelFormats = photoOutput.availableImageDataCVPixelFormatTypes; + for (NSNumber *currentPixelFormat in supportedPixelFormats) + { + if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + { + supportsFullYUVRange = YES; + } + } + + if (supportsFullYUVRange) + { + [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + else + { + [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + } + else + { + [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } +// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// { +// // TODO: Check for full range output and use that if available +// [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; +// } +// else +// { +// [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; +// } + [self.captureSession addOutput:photoOutput]; [self.captureSession commitConfiguration]; + self.jpegCompressionQuality = 0.8; + return self; } @@ -107,128 +155,80 @@ - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBuffer - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - - [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { - - if(imageSampleBuffer == NULL){ - dispatch_semaphore_signal(frameRenderingSemaphore); - block(nil, error); - return; - } - - [self conserveMemoryForNextFrame]; - - // For now, resize photos to fix within the max texture size of the GPU - CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); - - CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); - CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; - if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) - { - CMSampleBufferRef sampleBuffer; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + UIImage *filteredPhoto = nil; - dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - CFRelease(sampleBuffer); + if(!error){ + filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; } - else - { - // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches - AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) - { - dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - } - } - - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; dispatch_semaphore_signal(frameRenderingSemaphore); - - block(filteredPhoto, error); + + block(filteredPhoto, error); }]; - - return; } - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; { -// reportAvailableMemoryForGPUImage(@"Before still image capture"); - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); +// reportAvailableMemoryForGPUImage(@"Before Capture"); - [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { -// reportAvailableMemoryForGPUImage(@"Before filter processing"); + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + NSData *dataForJPEGFile = nil; - if(imageSampleBuffer == NULL){ + if(!error){ + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dispatch_semaphore_signal(frameRenderingSemaphore); +// reportAvailableMemoryForGPUImage(@"After UIImage generation"); + + dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto,self.jpegCompressionQuality); +// reportAvailableMemoryForGPUImage(@"After JPEG generation"); + } + +// reportAvailableMemoryForGPUImage(@"After autorelease pool"); + }else{ dispatch_semaphore_signal(frameRenderingSemaphore); - block(nil, error); - return; } - [self conserveMemoryForNextFrame]; + block(dataForJPEGFile, error); + }]; +} - // For now, resize photos to fix within the max texture size of the GPU - CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); +- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; +{ - CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); - CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; - if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) - { - CMSampleBufferRef sampleBuffer; + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + NSData *dataForPNGFile = nil; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); - - dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - CFRelease(sampleBuffer); - } - else - { - // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches - AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) - { + if(!error){ + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; dispatch_semaphore_signal(frameRenderingSemaphore); - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - } - } - -// reportAvailableMemoryForGPUImage(@"After filter processing"); - - __strong NSData *dataForJPEGFile = nil; - @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); + } + }else{ dispatch_semaphore_signal(frameRenderingSemaphore); - -// reportAvailableMemoryForGPUImage(@"After UIImage generation"); - - dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, 0.8); -// reportAvailableMemoryForGPUImage(@"After JPEG generation"); } - -// reportAvailableMemoryForGPUImage(@"After autorelease pool"); - - block(dataForJPEGFile, error); + + block(dataForPNGFile, error); }]; return; } -- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; +#pragma mark - Private Methods + +- (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withImageOnGPUHandler:(void (^)(NSError *error))block { dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + if(photoOutput.isCapturingStillImage){ + block([NSError errorWithDomain:AVFoundationErrorDomain code:AVErrorMaximumStillImageCaptureRequestsExceeded userInfo:nil]); + return; + } + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { if(imageSampleBuffer == NULL){ - dispatch_semaphore_signal(frameRenderingSemaphore); - block(nil, error); + block(error); return; } @@ -236,13 +236,21 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); - + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) { CMSampleBufferRef sampleBuffer; - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + + if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) + { + NSAssert(NO, @"Error: no downsampling for YUV input in the framework yet"); + } + else + { + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + } dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; @@ -261,18 +269,15 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi } } - NSData *dataForPNGFile = nil; - @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; - dispatch_semaphore_signal(frameRenderingSemaphore); - dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); - } - - block(dataForPNGFile, error); + CFDictionaryRef metadata = CMCopyDictionaryOfAttachments(NULL, imageSampleBuffer, kCMAttachmentMode_ShouldPropagate); + _currentCaptureMetadata = (__bridge_transfer NSDictionary *)metadata; + + block(nil); + + _currentCaptureMetadata = nil; }]; - - return; } + @end diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index f73bc8989..7bc7bddd2 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -29,8 +29,7 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; - (void)processTextureWithFrameTime:(CMTime)frameTime; { - runSynchronouslyOnVideoProcessingQueue(^{ -// dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index 562643c08..ffa7e4f2a 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -71,4 +71,14 @@ - (void)conserveMemoryForNextFrame; } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + @end diff --git a/framework/Source/GPUImageThresholdSketchFilter.h b/framework/Source/GPUImageThresholdSketchFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdSketchFilter.m b/framework/Source/GPUImageThresholdSketchFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTransformFilter.h b/framework/Source/GPUImageTransformFilter.h index 006289fe3..9865b8538 100755 --- a/framework/Source/GPUImageTransformFilter.h +++ b/framework/Source/GPUImageTransformFilter.h @@ -13,4 +13,7 @@ // This applies the transform to the raw frame data if set to YES, the default of NO takes the aspect ratio of the image input into account when rotating @property(readwrite, nonatomic) BOOL ignoreAspectRatio; +// sets the anchor point to top left corner +@property(readwrite, nonatomic) BOOL anchorTopLeft; + @end diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index 85c1cc292..d60274eaf 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -2,13 +2,13 @@ NSString *const kGPUImageTransformVertexShaderString = SHADER_STRING ( - attribute vec4 position; - attribute vec4 inputTextureCoordinate; + attribute highp vec4 position; + attribute highp vec4 inputTextureCoordinate; uniform mat4 transformMatrix; uniform mat4 orthographicMatrix; - varying vec2 textureCoordinate; + varying highp vec2 textureCoordinate; void main() { @@ -22,6 +22,7 @@ @implementation GPUImageTransformFilter @synthesize affineTransform; @synthesize transform3D = _transform3D; @synthesize ignoreAspectRatio = _ignoreAspectRatio; +@synthesize anchorTopLeft = _anchorTopLeft; #pragma mark - #pragma mark Initialization and teardown @@ -53,19 +54,27 @@ - (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)righ GLfloat ty = - (top + bottom) / (top - bottom); GLfloat tz = - (far + near) / (far - near); - matrix[0] = 2.0f / r_l; + float scale = 2.0f; + if (_anchorTopLeft) + { + scale = 4.0f; + tx=-1.0f; + ty=-1.0f; + } + + matrix[0] = scale / r_l; matrix[1] = 0.0f; matrix[2] = 0.0f; matrix[3] = tx; matrix[4] = 0.0f; - matrix[5] = 2.0f / t_b; + matrix[5] = scale / t_b; matrix[6] = 0.0f; matrix[7] = ty; matrix[8] = 0.0f; matrix[9] = 0.0f; - matrix[10] = 2.0f / f_n; + matrix[10] = scale / f_n; matrix[11] = tz; matrix[12] = 0.0f; @@ -155,13 +164,41 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; 1.0f, 1.0f, }; + GLfloat adjustedVerticesAnchorTL[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, normalizedHeight, + 1.0f, normalizedHeight, + }; + + static const GLfloat squareVerticesAnchorTL[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + if (_ignoreAspectRatio) { - [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + if (_anchorTopLeft) + { + [self renderToTextureWithVertices:squareVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + } + else + { + [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + } } else { - [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + if (_anchorTopLeft) + { + [self renderToTextureWithVertices:adjustedVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + } + else + { + [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + } } [self informTargetsAboutNewFrameAtTime:frameTime]; @@ -216,4 +253,10 @@ - (void)setIgnoreAspectRatio:(BOOL)newValue; } } +- (void)setAnchorTopLeft:(BOOL)newValue +{ + _anchorTopLeft = newValue; + [self setIgnoreAspectRatio:_ignoreAspectRatio]; +} + @end diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m old mode 100644 new mode 100755 index e24dae357..46e67cb89 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -92,10 +92,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - [self setUniformsForProgramAtIndex:0]; - [self setFilterFBO]; - + [self setUniformsForProgramAtIndex:0]; + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageTwoPassFilter.h b/framework/Source/GPUImageTwoPassFilter.h index efb51fa68..d04a8b0e8 100755 --- a/framework/Source/GPUImageTwoPassFilter.h +++ b/framework/Source/GPUImageTwoPassFilter.h @@ -9,6 +9,8 @@ GLint secondFilterInputTextureUniform, secondFilterInputTextureUniform2; GLuint secondFilterFramebuffer; + + NSMutableDictionary *secondProgramUniformStateRestorationBlocks; } // Initialization and teardown diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index fff159bd7..27ef39e5f 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -12,6 +12,8 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade return nil; } + secondProgramUniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; + runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; @@ -200,7 +202,14 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { [self initializeSecondOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); +// if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// { +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); +// } +// else +// { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); +// } glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); [self notifyTargetsAboutNewOutputTexture]; @@ -262,9 +271,10 @@ - (void)destroyFilterFBO; - (void)setFilterFBO; { + CGSize currentFBOSize = [self sizeOfFBO]; + if (!filterFramebuffer) { - CGSize currentFBOSize = [self sizeOfFBO]; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { preparedToCaptureImage = NO; @@ -275,12 +285,11 @@ - (void)setFilterFBO; { [super createFilterFBOofSize:currentFBOSize]; } - [super setupFilterForSize:currentFBOSize]; + [self setupFilterForSize:currentFBOSize]; } glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } @@ -296,9 +305,6 @@ - (void)setSecondFilterFBO; glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); - -// CGSize currentFBOSize = [self sizeOfFBO]; -// glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } - (void)setOutputFBO; @@ -316,8 +322,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - // Run the first stage of the two-pass filter - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + // This assumes that any two-pass filter that says it desires monochrome input is using the first pass for a luminance conversion, which can be dropped + if (!currentlyReceivingMonochromeInput) + { + // Run the first stage of the two-pass filter + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + } // Run the second stage of the two-pass filter [self setSecondFilterFBO]; @@ -328,13 +338,22 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, outputTexture); + if (!currentlyReceivingMonochromeInput) + { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); + } + else + { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, sourceTexture); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + } - glUniform1i(secondFilterInputTextureUniform, 3); + glUniform1i(secondFilterInputTextureUniform, 3); glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -361,7 +380,6 @@ - (void)releaseInputTexturesIfNeeded; { } - - (void)prepareForImageCapture; { if (preparedToCaptureImage) @@ -385,5 +403,36 @@ - (void)prepareForImageCapture; }); } +- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; +{ +// TODO: Deal with the fact that two-pass filters may have the same shader program identifier + if (shaderProgram == filterProgram) + { + [uniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; + } + else + { + [secondProgramUniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; + } + uniformStateBlock(); +} + +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; +{ + if (programIndex == 0) + { + [uniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ + dispatch_block_t currentBlock = obj; + currentBlock(); + }]; + } + else + { + [secondProgramUniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ + dispatch_block_t currentBlock = obj; + currentBlock(); + }]; + } +} @end diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.h b/framework/Source/GPUImageTwoPassTextureSamplingFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m old mode 100644 new mode 100755 index af6bcbdc8..af103e781 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -12,17 +12,23 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade return nil; } - verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; - - horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; + verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + + horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; + horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + }); return self; } - (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; { + [super setUniformsForProgramAtIndex:programIndex]; + if (programIndex == 0) { glUniform1f(verticalPassTexelWidthOffsetUniform, verticalPassTexelWidthOffset); diff --git a/framework/Source/GPUImageUIElement.h b/framework/Source/GPUImageUIElement.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 2a6d68d4b..0701d6722 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -26,12 +26,16 @@ AVCaptureDevice *_inputCamera; AVCaptureDevice *_microphone; AVCaptureDeviceInput *videoInput; + AVCaptureVideoDataOutput *videoOutput; BOOL capturePaused; GPUImageRotationMode outputRotation; dispatch_semaphore_t frameRenderingSemaphore; + + BOOL captureAsYUV; + GLuint luminanceTexture, chrominanceTexture; - id _delegate; + __unsafe_unretained id _delegate; } /// The AVCaptureSession used to capture from the camera @@ -61,7 +65,7 @@ /// These properties determine whether or not the two camera orientations should be mirrored. By default, both are NO. @property(readwrite, nonatomic) BOOL horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera; -@property(nonatomic, retain) id delegate; +@property(nonatomic, assign) id delegate; /// @name Initialization and teardown diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 96e221121..657ec1b07 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -1,5 +1,69 @@ #import "GPUImageVideoCamera.h" #import "GPUImageMovieWriter.h" +#import "GPUImageFilter.h" + +NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D luminanceTexture; + uniform sampler2D chrominanceTexture; + + void main() + { + mediump vec3 yuv; + lowp vec3 rgb; + + yuv.x = texture2D(luminanceTexture, textureCoordinate).r; + yuv.yz = texture2D(chrominanceTexture, textureCoordinate).rg - vec2(0.5, 0.5); + + // BT.601, which is the standard for SDTV is provided as a reference + /* + rgb = mat3( 1, 1, 1, + 0, -.39465, 2.03211, + 1.13983, -.58060, 0) * yuv; + */ + + // Using BT.709 which is the standard for HDTV + rgb = mat3( 1, 1, 1, + 0, -.21482, 2.12798, + 1.28033, -.38059, 0) * yuv; + + gl_FragColor = vec4(rgb, 1); + } +); + +NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D luminanceTexture; + uniform sampler2D chrominanceTexture; + + void main() + { + mediump vec3 yuv; + lowp vec3 rgb; + + yuv.x = texture2D(luminanceTexture, textureCoordinate).r; + yuv.yz = texture2D(chrominanceTexture, textureCoordinate).ra - vec2(0.5, 0.5); + + // BT.601, which is the standard for SDTV is provided as a reference + /* + rgb = mat3( 1, 1, 1, + 0, -.39465, 2.03211, + 1.13983, -.58060, 0) * yuv; + */ + + // Using BT.709 which is the standard for HDTV + rgb = mat3( 1, 1, 1, + 0, -.21482, 2.12798, + 1.28033, -.38059, 0) * yuv; + + gl_FragColor = vec4(rgb, 1); + } + ); + #pragma mark - #pragma mark Private methods and instance variables @@ -7,16 +71,24 @@ @interface GPUImageVideoCamera () { AVCaptureDeviceInput *audioInput; - AVCaptureVideoDataOutput *videoOutput; AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; NSInteger _frameRate; dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; + + GLProgram *yuvConversionProgram; + GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; + GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; + GLuint yuvConversionFramebuffer; + + int imageBufferWidth, imageBufferHeight; } - (void)updateOrientationSendToTargets; +- (void)convertYUVToRGBOutput; +- (void)setYUVConversionFBO; @end @@ -58,8 +130,51 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD _runBenchmark = NO; capturePaused = NO; outputRotation = kGPUImageNoRotation; + captureAsYUV = YES; runSynchronouslyOnVideoProcessingQueue(^{ + + if (captureAsYUV) + { + [GPUImageOpenGLESContext useImageProcessingContext]; +// if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) +// { +// yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; +// } +// else +// { + yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; +// } + + if (!yuvConversionProgram.initialized) + { + [yuvConversionProgram addAttribute:@"position"]; + [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; + + if (![yuvConversionProgram link]) + { + NSString *progLog = [yuvConversionProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [yuvConversionProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + yuvConversionProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; + yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; + yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; + yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; + + [GPUImageOpenGLESContext setActiveShaderProgram:yuvConversionProgram]; + + glEnableVertexAttribArray(yuvConversionPositionAttribute); + glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); + } + if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { [GPUImageOpenGLESContext useImageProcessingContext]; @@ -74,7 +189,11 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } // Need to remove the initially created texture - [self deleteOutputTexture]; +// [self deleteOutputTexture]; + } + else + { + [self initializeOutputTextureIfNeeded]; } }); @@ -110,7 +229,32 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD videoOutput = [[AVCaptureVideoDataOutput alloc] init]; [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; +// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) + { + BOOL supportsFullYUVRange = NO; + NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; + for (NSNumber *currentPixelFormat in supportedPixelFormats) + { + if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + { + supportsFullYUVRange = YES; + } + } + + if (supportsFullYUVRange) + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + else + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + } + else + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; // [videoOutput setSampleBufferDelegate:self queue:[GPUImageOpenGLESContext sharedOpenGLESQueue]]; @@ -153,6 +297,8 @@ - (void)dealloc CFRelease(coreVideoTextureCache); } +// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (cameraProcessingQueue != NULL) { dispatch_release(cameraProcessingQueue); @@ -167,6 +313,13 @@ - (void)dealloc { dispatch_release(frameRenderingSemaphore); } +#endif + +// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) + { + [self destroyYUVConversionFBO]; + } } - (void)removeInputsAndOutputs; @@ -346,6 +499,42 @@ - (AVCaptureConnection *)videoCaptureConnection { #define INITIALFRAMESTOIGNOREFORBENCHMARK 5 +- (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth height:(int)bufferHeight time:(CMTime)currentTime; +{ + for (id currentTarget in targets) + { + if ([currentTarget enabled]) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; + + if ([currentTarget wantsMonochromeInput] && captureAsYUV) + { + [currentTarget setCurrentlyReceivingMonochromeInput:YES]; + [currentTarget setInputTexture:luminanceTexture atIndex:textureIndexOfTarget]; + } + else + { + [currentTarget setCurrentlyReceivingMonochromeInput:NO]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + } + + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; + } + else + { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + } + } + } +} + - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { if (capturePaused) @@ -364,55 +553,107 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { - CVPixelBufferLockBaseAddress(cameraFrame, 0); - + CVOpenGLESTextureRef luminanceTextureRef = NULL; + CVOpenGLESTextureRef chrominanceTextureRef = NULL; CVOpenGLESTextureRef texture = NULL; - CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); - - if (!texture || err) { - NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); - NSAssert(NO, @"Camera failure"); - return; - } - - outputTexture = CVOpenGLESTextureGetName(texture); - // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - for (id currentTarget in targets) +// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) // Check for YUV planar inputs to do RGB conversion { - if ([currentTarget enabled]) + + if ( (imageBufferWidth != bufferWidth) && (imageBufferHeight != bufferHeight) ) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + imageBufferWidth = bufferWidth; + imageBufferHeight = bufferHeight; - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - - [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; - } - else - { - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - } + [self destroyYUVConversionFBO]; + [self createYUVConversionFBO]; + } + + CVReturn err; + // Y-plane + glActiveTexture(GL_TEXTURE4); + if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) + { +// err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + } + else + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + } + if (err) + { + NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + luminanceTexture = CVOpenGLESTextureGetName(luminanceTextureRef); + glBindTexture(GL_TEXTURE_2D, luminanceTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + // UV-plane + glActiveTexture(GL_TEXTURE5); + if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) + { +// err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + } + else + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); } + if (err) + { + NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + chrominanceTexture = CVOpenGLESTextureGetName(chrominanceTextureRef); + glBindTexture(GL_TEXTURE_2D, chrominanceTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + if (!allTargetsWantMonochromeData) + { + [self convertYUVToRGBOutput]; + } + + [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; + + CVPixelBufferUnlockBaseAddress(cameraFrame, 0); + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(luminanceTextureRef); + CFRelease(chrominanceTextureRef); + } + else + { + CVPixelBufferLockBaseAddress(cameraFrame, 0); + + CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); + + if (!texture || err) { + NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + NSAssert(NO, @"Camera failure"); + return; + } + + outputTexture = CVOpenGLESTextureGetName(texture); + // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; + + CVPixelBufferUnlockBaseAddress(cameraFrame, 0); + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(texture); + + outputTexture = 0; } - CVPixelBufferUnlockBaseAddress(cameraFrame, 0); - - // Flush the CVOpenGLESTexture cache and release the texture - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(texture); - outputTexture = 0; if (_runBenchmark) { @@ -428,7 +669,6 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; } else { - // Upload to texture CVPixelBufferLockBaseAddress(cameraFrame, 0); glBindTexture(GL_TEXTURE_2D, outputTexture); @@ -474,6 +714,90 @@ - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; [self.audioEncodingTarget processAudioBuffer:sampleBuffer]; } +- (void)convertYUVToRGBOutput; +{ + [GPUImageOpenGLESContext setActiveShaderProgram:yuvConversionProgram]; + [self setYUVConversionFBO]; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + static const GLfloat squareVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat textureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, luminanceTexture); + glUniform1i(yuvConversionLuminanceTextureUniform, 4); + + glActiveTexture(GL_TEXTURE5); + glBindTexture(GL_TEXTURE_2D, chrominanceTexture); + glUniform1i(yuvConversionChrominanceTextureUniform, 5); + + glVertexAttribPointer(yuvConversionPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); + glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +- (void)setYUVConversionFBO; +{ + if (!yuvConversionFramebuffer) + { + [self createYUVConversionFBO]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); + + glViewport(0, 0, imageBufferWidth, imageBufferHeight); +} + +- (void)createYUVConversionFBO; +{ + [self initializeOutputTextureIfNeeded]; + + glActiveTexture(GL_TEXTURE1); + glGenFramebuffers(1, &yuvConversionFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); + + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageBufferWidth, imageBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + [self notifyTargetsAboutNewOutputTexture]; + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + glBindTexture(GL_TEXTURE_2D, 0); + +} + +- (void)destroyYUVConversionFBO; +{ + if (yuvConversionFramebuffer) + { + glDeleteFramebuffers(1, &yuvConversionFramebuffer); + yuvConversionFramebuffer = 0; + } + + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } +} + + #pragma mark - #pragma mark Benchmarking @@ -496,7 +820,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM // } CFRetain(sampleBuffer); - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ [weakSelf processAudioSampleBuffer:sampleBuffer]; CFRelease(sampleBuffer); // dispatch_semaphore_signal(frameRenderingSemaphore); @@ -510,7 +834,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM } CFRetain(sampleBuffer); - dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ //Feature Detection Hook. if (weakSelf.delegate) { diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index 31673d393..62ac641fc 100755 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -35,4 +35,6 @@ typedef enum { */ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; + @end diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 8125acbd4..e9fd485dd 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -441,6 +441,16 @@ - (void)conserveMemoryForNextFrame; } +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoroniConsumerFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoroniConsumerFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.h b/framework/Source/GPUImageWeakPixelInclusionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.m b/framework/Source/GPUImageWeakPixelInclusionFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageWhiteBalanceFilter.h b/framework/Source/GPUImageWhiteBalanceFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUImageWhiteBalanceFilter.m b/framework/Source/GPUImageWhiteBalanceFilter.m old mode 100644 new mode 100755 diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h old mode 100644 new mode 100755 diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m old mode 100644 new mode 100755 From 7cb386ca7b8bcc0b5361a748e770f66b57888a70 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Tue, 29 Jan 2013 14:59:04 -0700 Subject: [PATCH 320/695] Revert "Merge master, Kuwahara optimizations" This reverts commit 9655f16e89caf35878ac7d2f3e2646568a5a670a. --- framework/Source/GPUImage.h | 5 - .../Source/GPUImage3x3ConvolutionFilter.m | 22 +- .../Source/GPUImage3x3TextureSamplingFilter.h | 0 .../Source/GPUImage3x3TextureSamplingFilter.m | 0 framework/Source/GPUImageAddBlendFilter.h | 0 framework/Source/GPUImageAddBlendFilter.m | 0 framework/Source/GPUImageAmatorkaFilter.m | 5 - framework/Source/GPUImageAverageColor.h | 0 framework/Source/GPUImageAverageColor.m | 0 .../GPUImageAverageLuminanceThresholdFilter.h | 0 .../GPUImageAverageLuminanceThresholdFilter.m | 0 framework/Source/GPUImageBilateralFilter.h | 7 +- framework/Source/GPUImageBilateralFilter.m | 51 +-- framework/Source/GPUImageBuffer.h | 0 framework/Source/GPUImageBuffer.m | 0 .../Source/GPUImageBulgeDistortionFilter.m | 41 +- framework/Source/GPUImageChromaKeyFilter.h | 0 framework/Source/GPUImageChromaKeyFilter.m | 0 framework/Source/GPUImageClosingFilter.h | 0 framework/Source/GPUImageClosingFilter.m | 0 framework/Source/GPUImageColorBlendFilter.h | 5 - framework/Source/GPUImageColorBlendFilter.m | 65 --- framework/Source/GPUImageColorPackingFilter.h | 0 framework/Source/GPUImageColorPackingFilter.m | 0 framework/Source/GPUImageCrosshairGenerator.h | 0 framework/Source/GPUImageCrosshairGenerator.m | 0 framework/Source/GPUImageDarkenBlendFilter.m | 0 framework/Source/GPUImageDilationFilter.h | 0 framework/Source/GPUImageDilationFilter.m | 0 ...geDirectionalNonMaximumSuppressionFilter.h | 0 ...geDirectionalNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageDivideBlendFilter.h | 0 framework/Source/GPUImageDivideBlendFilter.m | 0 framework/Source/GPUImageErosionFilter.h | 0 framework/Source/GPUImageErosionFilter.m | 0 framework/Source/GPUImageFalseColorFilter.h | 0 framework/Source/GPUImageFalseColorFilter.m | 0 framework/Source/GPUImageFilter.h | 9 +- framework/Source/GPUImageFilter.m | 93 ++-- framework/Source/GPUImageFilterGroup.m | 37 +- framework/Source/GPUImageFilterPipeline.h | 4 - framework/Source/GPUImageFilterPipeline.m | 108 ++--- framework/Source/GPUImageGlassSphereFilter.h | 0 framework/Source/GPUImageGlassSphereFilter.m | 0 framework/Source/GPUImageGrayscaleFilter.m | 82 ---- framework/Source/GPUImageHalftoneFilter.h | 0 framework/Source/GPUImageHalftoneFilter.m | 0 framework/Source/GPUImageHighPassFilter.h | 0 framework/Source/GPUImageHighPassFilter.m | 0 .../Source/GPUImageHighlightShadowFilter.h | 0 .../Source/GPUImageHighlightShadowFilter.m | 0 .../GPUImageHoughTransformLineDetector.h | 0 .../GPUImageHoughTransformLineDetector.m | 1 - framework/Source/GPUImageHueBlendFilter.h | 5 - framework/Source/GPUImageHueBlendFilter.m | 115 ----- framework/Source/GPUImageHueFilter.h | 0 framework/Source/GPUImageHueFilter.m | 0 framework/Source/GPUImageJFAVoroniFilter.h | 0 framework/Source/GPUImageJFAVoroniFilter.m | 0 framework/Source/GPUImageKuwaharaFilter.m | 132 +++--- .../Source/GPUImageKuwaharaRadius3Filter.h | 8 - .../Source/GPUImageKuwaharaRadius3Filter.m | 286 ------------ .../Source/GPUImageLanczosResamplingFilter.h | 0 .../Source/GPUImageLanczosResamplingFilter.m | 33 -- framework/Source/GPUImageLevelsFilter.h | 0 framework/Source/GPUImageLevelsFilter.m | 0 framework/Source/GPUImageLineGenerator.h | 0 framework/Source/GPUImageLineGenerator.m | 0 .../Source/GPUImageLocalBinaryPatternFilter.h | 0 .../Source/GPUImageLocalBinaryPatternFilter.m | 0 framework/Source/GPUImageLookupFilter.h | 0 framework/Source/GPUImageLookupFilter.m | 0 framework/Source/GPUImageLowPassFilter.h | 0 framework/Source/GPUImageLowPassFilter.m | 0 framework/Source/GPUImageLuminosity.h | 0 framework/Source/GPUImageLuminosity.m | 0 .../Source/GPUImageLuminosityBlendFilter.h | 5 - .../Source/GPUImageLuminosityBlendFilter.m | 65 --- framework/Source/GPUImageMedianFilter.h | 0 framework/Source/GPUImageMedianFilter.m | 0 framework/Source/GPUImageMissEtikateFilter.m | 5 - framework/Source/GPUImageMonochromeFilter.h | 0 framework/Source/GPUImageMonochromeFilter.m | 0 framework/Source/GPUImageMosaicFilter.h | 0 framework/Source/GPUImageMosaicFilter.m | 0 framework/Source/GPUImageMotionDetector.h | 0 framework/Source/GPUImageMotionDetector.m | 0 framework/Source/GPUImageMovieWriter.h | 1 - framework/Source/GPUImageMovieWriter.m | 29 -- .../GPUImageNobleCornerDetectionFilter.h | 0 .../GPUImageNobleCornerDetectionFilter.m | 0 .../GPUImageNonMaximumSuppressionFilter.h | 0 .../GPUImageNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageNormalBlendFilter.h | 0 framework/Source/GPUImageNormalBlendFilter.m | 0 framework/Source/GPUImageOpacityFilter.h | 0 framework/Source/GPUImageOpacityFilter.m | 0 framework/Source/GPUImageOpenGLESContext.h | 4 - framework/Source/GPUImageOpenGLESContext.m | 31 -- framework/Source/GPUImageOpeningFilter.h | 0 framework/Source/GPUImageOpeningFilter.m | 0 framework/Source/GPUImageOutput.h | 6 +- framework/Source/GPUImageOutput.m | 17 +- ...ageParallelCoordinateLineTransformFilter.h | 0 ...ageParallelCoordinateLineTransformFilter.m | 0 framework/Source/GPUImagePerlinNoiseFilter.h | 0 framework/Source/GPUImagePerlinNoiseFilter.m | 0 framework/Source/GPUImagePicture.h | 2 +- framework/Source/GPUImagePicture.m | 5 +- framework/Source/GPUImagePolkaDotFilter.h | 0 framework/Source/GPUImagePolkaDotFilter.m | 0 framework/Source/GPUImageRGBClosingFilter.h | 0 framework/Source/GPUImageRGBClosingFilter.m | 0 framework/Source/GPUImageRGBDilationFilter.h | 0 framework/Source/GPUImageRGBDilationFilter.m | 0 framework/Source/GPUImageRGBErosionFilter.h | 0 framework/Source/GPUImageRGBErosionFilter.m | 0 framework/Source/GPUImageRGBOpeningFilter.h | 0 framework/Source/GPUImageRGBOpeningFilter.m | 0 framework/Source/GPUImageRawDataInput.h | 23 +- framework/Source/GPUImageRawDataInput.m | 68 +-- framework/Source/GPUImageRawDataOutput.m | 10 - .../Source/GPUImageSaturationBlendFilter.h | 5 - .../Source/GPUImageSaturationBlendFilter.m | 115 ----- .../GPUImageShiTomasiFeatureDetectionFilter.h | 0 .../GPUImageShiTomasiFeatureDetectionFilter.m | 0 .../GPUImageSingleComponentFastBlurFilter.h | 0 .../GPUImageSingleComponentFastBlurFilter.m | 0 ...PUImageSingleComponentGaussianBlurFilter.h | 0 ...PUImageSingleComponentGaussianBlurFilter.m | 0 .../Source/GPUImageSobelEdgeDetectionFilter.m | 15 +- framework/Source/GPUImageSoftEleganceFilter.m | 6 - .../Source/GPUImageSolidColorGenerator.h | 0 .../Source/GPUImageSolidColorGenerator.m | 2 +- .../Source/GPUImageSourceOverBlendFilter.h | 0 .../Source/GPUImageSourceOverBlendFilter.m | 0 .../Source/GPUImageSphereRefractionFilter.h | 0 .../Source/GPUImageSphereRefractionFilter.m | 0 framework/Source/GPUImageStillCamera.h | 7 - framework/Source/GPUImageStillCamera.m | 217 +++++---- framework/Source/GPUImageTextureInput.m | 3 +- framework/Source/GPUImageTextureOutput.m | 10 - .../Source/GPUImageThresholdSketchFilter.h | 0 .../Source/GPUImageThresholdSketchFilter.m | 0 ...geThresholdedNonMaximumSuppressionFilter.h | 0 ...geThresholdedNonMaximumSuppressionFilter.m | 0 framework/Source/GPUImageToneCurveFilter.m | 0 framework/Source/GPUImageTransformFilter.h | 3 - framework/Source/GPUImageTransformFilter.m | 59 +-- framework/Source/GPUImageTwoInputFilter.h | 0 framework/Source/GPUImageTwoInputFilter.m | 5 +- framework/Source/GPUImageTwoPassFilter.h | 2 - framework/Source/GPUImageTwoPassFilter.m | 77 +--- .../GPUImageTwoPassTextureSamplingFilter.h | 0 .../GPUImageTwoPassTextureSamplingFilter.m | 16 +- framework/Source/GPUImageUIElement.h | 0 framework/Source/GPUImageUIElement.m | 0 framework/Source/GPUImageVideoCamera.h | 8 +- framework/Source/GPUImageVideoCamera.m | 418 ++---------------- framework/Source/GPUImageView.h | 2 - framework/Source/GPUImageView.m | 10 - .../Source/GPUImageVoroniConsumerFilter.h | 0 .../Source/GPUImageVoroniConsumerFilter.m | 0 .../Source/GPUImageWeakPixelInclusionFilter.h | 0 .../Source/GPUImageWeakPixelInclusionFilter.m | 0 framework/Source/GPUImageWhiteBalanceFilter.h | 0 framework/Source/GPUImageWhiteBalanceFilter.m | 0 ...imageDirectionalSobelEdgeDetectionFilter.h | 0 ...imageDirectionalSobelEdgeDetectionFilter.m | 0 169 files changed, 379 insertions(+), 1986 deletions(-) mode change 100755 => 100644 framework/Source/GPUImage3x3TextureSamplingFilter.h mode change 100755 => 100644 framework/Source/GPUImage3x3TextureSamplingFilter.m mode change 100755 => 100644 framework/Source/GPUImageAddBlendFilter.h mode change 100755 => 100644 framework/Source/GPUImageAddBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageAverageColor.h mode change 100755 => 100644 framework/Source/GPUImageAverageColor.m mode change 100755 => 100644 framework/Source/GPUImageAverageLuminanceThresholdFilter.h mode change 100755 => 100644 framework/Source/GPUImageAverageLuminanceThresholdFilter.m mode change 100755 => 100644 framework/Source/GPUImageBilateralFilter.h mode change 100755 => 100644 framework/Source/GPUImageBilateralFilter.m mode change 100755 => 100644 framework/Source/GPUImageBuffer.h mode change 100755 => 100644 framework/Source/GPUImageBuffer.m mode change 100755 => 100644 framework/Source/GPUImageChromaKeyFilter.h mode change 100755 => 100644 framework/Source/GPUImageChromaKeyFilter.m mode change 100755 => 100644 framework/Source/GPUImageClosingFilter.h mode change 100755 => 100644 framework/Source/GPUImageClosingFilter.m delete mode 100755 framework/Source/GPUImageColorBlendFilter.h delete mode 100755 framework/Source/GPUImageColorBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageColorPackingFilter.h mode change 100755 => 100644 framework/Source/GPUImageColorPackingFilter.m mode change 100755 => 100644 framework/Source/GPUImageCrosshairGenerator.h mode change 100755 => 100644 framework/Source/GPUImageCrosshairGenerator.m mode change 100755 => 100644 framework/Source/GPUImageDarkenBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageDilationFilter.h mode change 100755 => 100644 framework/Source/GPUImageDilationFilter.m mode change 100755 => 100644 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h mode change 100755 => 100644 framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m mode change 100755 => 100644 framework/Source/GPUImageDivideBlendFilter.h mode change 100755 => 100644 framework/Source/GPUImageDivideBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageErosionFilter.h mode change 100755 => 100644 framework/Source/GPUImageErosionFilter.m mode change 100755 => 100644 framework/Source/GPUImageFalseColorFilter.h mode change 100755 => 100644 framework/Source/GPUImageFalseColorFilter.m mode change 100755 => 100644 framework/Source/GPUImageGlassSphereFilter.h mode change 100755 => 100644 framework/Source/GPUImageGlassSphereFilter.m mode change 100755 => 100644 framework/Source/GPUImageHalftoneFilter.h mode change 100755 => 100644 framework/Source/GPUImageHalftoneFilter.m mode change 100755 => 100644 framework/Source/GPUImageHighPassFilter.h mode change 100755 => 100644 framework/Source/GPUImageHighPassFilter.m mode change 100755 => 100644 framework/Source/GPUImageHighlightShadowFilter.h mode change 100755 => 100644 framework/Source/GPUImageHighlightShadowFilter.m mode change 100755 => 100644 framework/Source/GPUImageHoughTransformLineDetector.h mode change 100755 => 100644 framework/Source/GPUImageHoughTransformLineDetector.m delete mode 100755 framework/Source/GPUImageHueBlendFilter.h delete mode 100755 framework/Source/GPUImageHueBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageHueFilter.h mode change 100755 => 100644 framework/Source/GPUImageHueFilter.m mode change 100755 => 100644 framework/Source/GPUImageJFAVoroniFilter.h mode change 100755 => 100644 framework/Source/GPUImageJFAVoroniFilter.m delete mode 100644 framework/Source/GPUImageKuwaharaRadius3Filter.h delete mode 100644 framework/Source/GPUImageKuwaharaRadius3Filter.m mode change 100755 => 100644 framework/Source/GPUImageLanczosResamplingFilter.h mode change 100755 => 100644 framework/Source/GPUImageLanczosResamplingFilter.m mode change 100755 => 100644 framework/Source/GPUImageLevelsFilter.h mode change 100755 => 100644 framework/Source/GPUImageLevelsFilter.m mode change 100755 => 100644 framework/Source/GPUImageLineGenerator.h mode change 100755 => 100644 framework/Source/GPUImageLineGenerator.m mode change 100755 => 100644 framework/Source/GPUImageLocalBinaryPatternFilter.h mode change 100755 => 100644 framework/Source/GPUImageLocalBinaryPatternFilter.m mode change 100755 => 100644 framework/Source/GPUImageLookupFilter.h mode change 100755 => 100644 framework/Source/GPUImageLookupFilter.m mode change 100755 => 100644 framework/Source/GPUImageLowPassFilter.h mode change 100755 => 100644 framework/Source/GPUImageLowPassFilter.m mode change 100755 => 100644 framework/Source/GPUImageLuminosity.h mode change 100755 => 100644 framework/Source/GPUImageLuminosity.m delete mode 100755 framework/Source/GPUImageLuminosityBlendFilter.h delete mode 100755 framework/Source/GPUImageLuminosityBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageMedianFilter.h mode change 100755 => 100644 framework/Source/GPUImageMedianFilter.m mode change 100755 => 100644 framework/Source/GPUImageMonochromeFilter.h mode change 100755 => 100644 framework/Source/GPUImageMonochromeFilter.m mode change 100755 => 100644 framework/Source/GPUImageMosaicFilter.h mode change 100755 => 100644 framework/Source/GPUImageMosaicFilter.m mode change 100755 => 100644 framework/Source/GPUImageMotionDetector.h mode change 100755 => 100644 framework/Source/GPUImageMotionDetector.m mode change 100755 => 100644 framework/Source/GPUImageNobleCornerDetectionFilter.h mode change 100755 => 100644 framework/Source/GPUImageNobleCornerDetectionFilter.m mode change 100755 => 100644 framework/Source/GPUImageNonMaximumSuppressionFilter.h mode change 100755 => 100644 framework/Source/GPUImageNonMaximumSuppressionFilter.m mode change 100755 => 100644 framework/Source/GPUImageNormalBlendFilter.h mode change 100755 => 100644 framework/Source/GPUImageNormalBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageOpacityFilter.h mode change 100755 => 100644 framework/Source/GPUImageOpacityFilter.m mode change 100755 => 100644 framework/Source/GPUImageOpeningFilter.h mode change 100755 => 100644 framework/Source/GPUImageOpeningFilter.m mode change 100755 => 100644 framework/Source/GPUImageParallelCoordinateLineTransformFilter.h mode change 100755 => 100644 framework/Source/GPUImageParallelCoordinateLineTransformFilter.m mode change 100755 => 100644 framework/Source/GPUImagePerlinNoiseFilter.h mode change 100755 => 100644 framework/Source/GPUImagePerlinNoiseFilter.m mode change 100755 => 100644 framework/Source/GPUImagePolkaDotFilter.h mode change 100755 => 100644 framework/Source/GPUImagePolkaDotFilter.m mode change 100755 => 100644 framework/Source/GPUImageRGBClosingFilter.h mode change 100755 => 100644 framework/Source/GPUImageRGBClosingFilter.m mode change 100755 => 100644 framework/Source/GPUImageRGBDilationFilter.h mode change 100755 => 100644 framework/Source/GPUImageRGBDilationFilter.m mode change 100755 => 100644 framework/Source/GPUImageRGBErosionFilter.h mode change 100755 => 100644 framework/Source/GPUImageRGBErosionFilter.m mode change 100755 => 100644 framework/Source/GPUImageRGBOpeningFilter.h mode change 100755 => 100644 framework/Source/GPUImageRGBOpeningFilter.m mode change 100755 => 100644 framework/Source/GPUImageRawDataInput.h mode change 100755 => 100644 framework/Source/GPUImageRawDataInput.m delete mode 100755 framework/Source/GPUImageSaturationBlendFilter.h delete mode 100755 framework/Source/GPUImageSaturationBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h mode change 100755 => 100644 framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m mode change 100755 => 100644 framework/Source/GPUImageSingleComponentFastBlurFilter.h mode change 100755 => 100644 framework/Source/GPUImageSingleComponentFastBlurFilter.m mode change 100755 => 100644 framework/Source/GPUImageSingleComponentGaussianBlurFilter.h mode change 100755 => 100644 framework/Source/GPUImageSingleComponentGaussianBlurFilter.m mode change 100755 => 100644 framework/Source/GPUImageSolidColorGenerator.h mode change 100755 => 100644 framework/Source/GPUImageSolidColorGenerator.m mode change 100755 => 100644 framework/Source/GPUImageSourceOverBlendFilter.h mode change 100755 => 100644 framework/Source/GPUImageSourceOverBlendFilter.m mode change 100755 => 100644 framework/Source/GPUImageSphereRefractionFilter.h mode change 100755 => 100644 framework/Source/GPUImageSphereRefractionFilter.m mode change 100755 => 100644 framework/Source/GPUImageThresholdSketchFilter.h mode change 100755 => 100644 framework/Source/GPUImageThresholdSketchFilter.m mode change 100755 => 100644 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h mode change 100755 => 100644 framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m mode change 100755 => 100644 framework/Source/GPUImageToneCurveFilter.m mode change 100755 => 100644 framework/Source/GPUImageTwoInputFilter.h mode change 100755 => 100644 framework/Source/GPUImageTwoInputFilter.m mode change 100755 => 100644 framework/Source/GPUImageTwoPassTextureSamplingFilter.h mode change 100755 => 100644 framework/Source/GPUImageTwoPassTextureSamplingFilter.m mode change 100755 => 100644 framework/Source/GPUImageUIElement.h mode change 100755 => 100644 framework/Source/GPUImageUIElement.m mode change 100755 => 100644 framework/Source/GPUImageVoroniConsumerFilter.h mode change 100755 => 100644 framework/Source/GPUImageVoroniConsumerFilter.m mode change 100755 => 100644 framework/Source/GPUImageWeakPixelInclusionFilter.h mode change 100755 => 100644 framework/Source/GPUImageWeakPixelInclusionFilter.m mode change 100755 => 100644 framework/Source/GPUImageWhiteBalanceFilter.h mode change 100755 => 100644 framework/Source/GPUImageWhiteBalanceFilter.m mode change 100755 => 100644 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h mode change 100755 => 100644 framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 565168456..8acb3f494 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -39,7 +39,6 @@ #import "GPUImageMultiplyBlendFilter.h" #import "GPUImageDissolveBlendFilter.h" #import "GPUImageKuwaharaFilter.h" -#import "GPUImageKuwaharaRadius3Filter.h" #import "GPUImageVignetteFilter.h" #import "GPUImageGaussianBlurFilter.h" #import "GPUImageGaussianBlurPositionFilter.h" @@ -58,10 +57,6 @@ #import "GPUImageSubtractBlendFilter.h" #import "GPUImageHardLightBlendFilter.h" #import "GPUImageSoftLightBlendFilter.h" -#import "GPUImageColorBlendFilter.h" -#import "GPUImageHueBlendFilter.h" -#import "GPUImageSaturationBlendFilter.h" -#import "GPUImageLuminosityBlendFilter.h" #import "GPUImageCropFilter.h" #import "GPUImageGrayscaleFilter.h" #import "GPUImageTransformFilter.h" diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m index 987fb1b31..605ff2ca3 100755 --- a/framework/Source/GPUImage3x3ConvolutionFilter.m +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -22,21 +22,21 @@ void main() { - mediump vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; - mediump vec3 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb; - mediump vec3 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb; + mediump vec4 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate); + mediump vec4 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate); + mediump vec4 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate); mediump vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); - mediump vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; - mediump vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; - mediump vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; - mediump vec3 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).rgb; - mediump vec3 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb; + mediump vec4 leftColor = texture2D(inputImageTexture, leftTextureCoordinate); + mediump vec4 rightColor = texture2D(inputImageTexture, rightTextureCoordinate); + mediump vec4 topColor = texture2D(inputImageTexture, topTextureCoordinate); + mediump vec4 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate); + mediump vec4 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate); - mediump vec3 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; - resultColor += leftColor * convolutionMatrix[1][0] + centerColor.rgb * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; + mediump vec4 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; + resultColor += leftColor * convolutionMatrix[1][0] + centerColor * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; - gl_FragColor = vec4(resultColor, centerColor.a); + gl_FragColor = resultColor; } ); diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.h b/framework/Source/GPUImage3x3TextureSamplingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAddBlendFilter.h b/framework/Source/GPUImageAddBlendFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAddBlendFilter.m b/framework/Source/GPUImageAddBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAmatorkaFilter.m b/framework/Source/GPUImageAmatorkaFilter.m index ce0a1f2ce..8ed55e04d 100755 --- a/framework/Source/GPUImageAmatorkaFilter.m +++ b/framework/Source/GPUImageAmatorkaFilter.m @@ -26,11 +26,6 @@ - (id)init; return self; } --(void)prepareForImageCapture { - [lookupImageSource processImage]; - [super prepareForImageCapture]; -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageAverageColor.h b/framework/Source/GPUImageAverageColor.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.h b/framework/Source/GPUImageAverageLuminanceThresholdFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageAverageLuminanceThresholdFilter.m b/framework/Source/GPUImageAverageLuminanceThresholdFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageBilateralFilter.h b/framework/Source/GPUImageBilateralFilter.h old mode 100755 new mode 100644 index 6b736ccff..617312b21 --- a/framework/Source/GPUImageBilateralFilter.h +++ b/framework/Source/GPUImageBilateralFilter.h @@ -1,10 +1,5 @@ #import "GPUImageGaussianBlurFilter.h" @interface GPUImageBilateralFilter : GPUImageGaussianBlurFilter -{ - CGFloat firstDistanceNormalizationFactorUniform; - CGFloat secondDistanceNormalizationFactorUniform; -} -// A normalization factor for the distance between central color and sample color. -@property(nonatomic, readwrite) CGFloat distanceNormalizationFactor; + @end diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m old mode 100755 new mode 100644 index e64ae0e48..507067115 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -9,24 +9,22 @@ varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - uniform mediump float distanceNormalizationFactor; +// const mediump float distanceNormalizationFactor = 0.6933613; + const mediump float distanceNormalizationFactor = 1.5; - void main() - { - lowp vec4 centralColor; - lowp float gaussianWeightTotal; - lowp vec4 sum; - lowp vec4 sampleColor; - lowp float distanceFromCentralColor; - lowp float gaussianWeight; - - centralColor = texture2D(inputImageTexture, blurCoordinates[4]); - gaussianWeightTotal = 0.18; - sum = centralColor * 0.18; + void main() { + lowp vec4 centralColor = texture2D(inputImageTexture, blurCoordinates[4]); + lowp float gaussianWeightTotal = 0.18; + lowp vec4 sum = centralColor * 0.18; - sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); + lowp vec4 sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); + lowp float distanceFromCentralColor; + // distanceFromCentralColor = abs(centralColor.g - sampleColor.g); + // distanceFromCentralColor = smoothstep(0.0, 1.0, abs(centralColor.g - sampleColor.g)); + // distanceFromCentralColor = smoothstep(0.0, 1.0, distance(centralColor, sampleColor) * distanceNormalizationFactor); distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); - gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); + + lowp float gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); gaussianWeightTotal += gaussianWeight; sum += sampleColor * gaussianWeight; @@ -88,31 +86,8 @@ - (id)init; return nil; } - firstDistanceNormalizationFactorUniform = [filterProgram uniformIndex:@"distanceNormalizationFactor"]; - secondDistanceNormalizationFactorUniform = [filterProgram uniformIndex:@"distanceNormalizationFactor"]; - - self.blurSize = 4.0; - self.distanceNormalizationFactor = 8.0; - return self; } - -#pragma mark - -#pragma mark Accessors - -- (void)setDistanceNormalizationFactor:(CGFloat)newValue -{ - _distanceNormalizationFactor = newValue; - - [self setFloat:newValue - forUniform:firstDistanceNormalizationFactorUniform - program:filterProgram]; - - [self setFloat:newValue - forUniform:secondDistanceNormalizationFactorUniform - program:secondFilterProgram]; -} - @end diff --git a/framework/Source/GPUImageBuffer.h b/framework/Source/GPUImageBuffer.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index d9536879b..aa7ed6d38 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -10,26 +10,29 @@ uniform highp vec2 center; uniform highp float radius; uniform highp float scale; - + void main() -{ - highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); - highp float dist = distance(center, textureCoordinateToUse); - textureCoordinateToUse = textureCoordinate; - - if (dist < radius) - { - textureCoordinateToUse -= center; - highp float percent = 1.0 - ((radius - dist) / radius) * scale; - percent = percent * percent; - - textureCoordinateToUse = textureCoordinateToUse * percent; - textureCoordinateToUse += center; - } - - gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); -} - + { + highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + highp float dist = distance(center, textureCoordinateToUse); + textureCoordinateToUse = textureCoordinate; + + if (dist < radius) + { + textureCoordinateToUse -= center; + highp float percent = 1.0 - ((radius - dist) / radius) * scale; + percent = percent * percent; + + textureCoordinateToUse = textureCoordinateToUse * percent; + textureCoordinateToUse += center; + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); + } + } ); @interface GPUImageBulgeDistortionFilter () diff --git a/framework/Source/GPUImageChromaKeyFilter.h b/framework/Source/GPUImageChromaKeyFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageChromaKeyFilter.m b/framework/Source/GPUImageChromaKeyFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageClosingFilter.h b/framework/Source/GPUImageClosingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageClosingFilter.m b/framework/Source/GPUImageClosingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageColorBlendFilter.h b/framework/Source/GPUImageColorBlendFilter.h deleted file mode 100755 index 302a16c6c..000000000 --- a/framework/Source/GPUImageColorBlendFilter.h +++ /dev/null @@ -1,5 +0,0 @@ -#import "GPUImageTwoInputFilter.h" - -@interface GPUImageColorBlendFilter : GPUImageTwoInputFilter - -@end diff --git a/framework/Source/GPUImageColorBlendFilter.m b/framework/Source/GPUImageColorBlendFilter.m deleted file mode 100755 index eb0ccbff2..000000000 --- a/framework/Source/GPUImageColorBlendFilter.m +++ /dev/null @@ -1,65 +0,0 @@ -#import "GPUImageColorBlendFilter.h" - -/** - * Color blend mode based upon pseudo code from the PDF specification. - */ -NSString *const kGPUImageColorBlendFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - varying highp vec2 textureCoordinate2; - - uniform sampler2D inputImageTexture; - uniform sampler2D inputImageTexture2; - - highp float lum(lowp vec3 c) { - return dot(c, vec3(0.3, 0.59, 0.11)); - } - - lowp vec3 clipcolor(lowp vec3 c) { - highp float l = lum(c); - lowp float n = min(min(c.r, c.g), c.b); - lowp float x = max(max(c.r, c.g), c.b); - - if (n < 0.0) { - c.r = l + ((c.r - l) * l) / (l - n); - c.g = l + ((c.g - l) * l) / (l - n); - c.b = l + ((c.b - l) * l) / (l - n); - } - if (x > 1.0) { - c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); - c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); - c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); - } - - return c; - } - - lowp vec3 setlum(lowp vec3 c, highp float l) { - highp float d = l - lum(c); - c = c + vec3(d); - return clipcolor(c); - } - - void main() - { - highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); - highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); - - gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(overlayColor.rgb, lum(baseColor.rgb)) * overlayColor.a, baseColor.a); - } - ); - - -@implementation GPUImageColorBlendFilter - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageColorBlendFragmentShaderString])) - { - return nil; - } - - return self; -} - -@end \ No newline at end of file diff --git a/framework/Source/GPUImageColorPackingFilter.h b/framework/Source/GPUImageColorPackingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageCrosshairGenerator.h b/framework/Source/GPUImageCrosshairGenerator.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDarkenBlendFilter.m b/framework/Source/GPUImageDarkenBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDilationFilter.h b/framework/Source/GPUImageDilationFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDilationFilter.m b/framework/Source/GPUImageDilationFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDivideBlendFilter.h b/framework/Source/GPUImageDivideBlendFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageDivideBlendFilter.m b/framework/Source/GPUImageDivideBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageErosionFilter.h b/framework/Source/GPUImageErosionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageErosionFilter.m b/framework/Source/GPUImageErosionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageFalseColorFilter.h b/framework/Source/GPUImageFalseColorFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 179d11935..02b72c234 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -60,15 +60,10 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; CGSize currentFilterSize; GPUImageRotationMode inputRotation; - - BOOL currentlyReceivingMonochromeInput; - - NSMutableDictionary *uniformStateRestorationBlocks; } @property(readonly) CVPixelBufferRef renderTarget; @property(readwrite, nonatomic) BOOL preventRendering; -@property(readwrite, nonatomic) BOOL currentlyReceivingMonochromeInput; /// @name Initialization and teardown @@ -116,6 +111,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; /// @name Rendering + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; - (CGSize)outputFrameSize; @@ -139,7 +135,4 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; -- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; -- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; - @end diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index c1eba441e..3478cb266 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -36,7 +36,6 @@ @implementation GPUImageFilter @synthesize renderTarget; @synthesize preventRendering = _preventRendering; -@synthesize currentlyReceivingMonochromeInput; #pragma mark - #pragma mark Initialization and teardown @@ -48,10 +47,8 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad return nil; } - uniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; preparedToCaptureImage = NO; _preventRendering = NO; - currentlyReceivingMonochromeInput = NO; inputRotation = kGPUImageNoRotation; backgroundColorRed = 0.0; backgroundColorGreen = 0.0; @@ -346,15 +343,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; [self initializeOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, outputTexture); - -// if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) -// { -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); -// } -// else -// { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); -// } + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); [self notifyTargetsAboutNewOutputTexture]; @@ -502,8 +491,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - [self setFilterFBO]; [self setUniformsForProgramAtIndex:0]; + [self setFilterFBO]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); @@ -519,6 +508,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; +{ + +} + - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; { if (self.frameProcessingCompletionBlock != NULL) @@ -632,9 +626,7 @@ - (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLPr { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); - }]; + glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); }); } @@ -642,9 +634,7 @@ - (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLPr { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); - }]; + glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); }); } @@ -652,9 +642,7 @@ - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgra { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - glUniform1f(uniform, floatValue); - }]; + glUniform1f(uniform, floatValue); }); } @@ -662,13 +650,12 @@ - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgra { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - GLfloat positionArray[2]; - positionArray[0] = pointValue.x; - positionArray[1] = pointValue.y; - - glUniform2fv(uniform, 1, positionArray); - }]; + + GLfloat positionArray[2]; + positionArray[0] = pointValue.x; + positionArray[1] = pointValue.y; + + glUniform2fv(uniform, 1, positionArray); }); } @@ -677,13 +664,11 @@ - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram * runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - GLfloat sizeArray[2]; - sizeArray[0] = sizeValue.width; - sizeArray[1] = sizeValue.height; - - glUniform2fv(uniform, 1, sizeArray); - }]; + GLfloat sizeArray[2]; + sizeArray[0] = sizeValue.width; + sizeArray[1] = sizeValue.height; + + glUniform2fv(uniform, 1, sizeArray); }); } @@ -692,9 +677,7 @@ - (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLPro runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); - }]; + glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); }); } @@ -703,9 +686,7 @@ - (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLPro runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); - }]; + glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); }); } @@ -714,9 +695,7 @@ - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUnifo runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - glUniform1fv(uniform, arrayLength, arrayValue); - }]; + glUniform1fv(uniform, arrayLength, arrayValue); }); } @@ -724,27 +703,10 @@ - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram { runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; - - [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - glUniform1i(uniform, intValue); - }]; + glUniform1i(uniform, intValue); }); } -- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; -{ - [uniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; - uniformStateBlock(); -} - -- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; -{ - [uniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ - dispatch_block_t currentBlock = obj; - currentBlock(); - }]; -} - #pragma mark - #pragma mark GPUImageInput @@ -999,11 +961,6 @@ - (void)conserveMemoryForNextFrame; } } -- (BOOL)wantsMonochromeInput; -{ - return NO; -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 1fbccc5e2..e36ca9a1c 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -88,8 +88,6 @@ - (void)setFrameProcessingCompletionBlock:(void (^)(GPUImageOutput *, CMTime))fr - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [_initialFilters count]; - for (GPUImageOutput *currentFilter in _initialFilters) { if (currentFilter != self.inputFilterToIgnoreForUpdates) @@ -101,11 +99,9 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; { - firstTextureDelegate = newTextureDelegate; - for (GPUImageOutput *currentFilter in _initialFilters) { - [currentFilter setTextureDelegate:self atIndex:textureIndex]; + [currentFilter setTextureDelegate:newTextureDelegate atIndex:textureIndex]; } } @@ -189,35 +185,4 @@ - (void)conserveMemoryForNextFrame; } } -- (BOOL)wantsMonochromeInput; -{ - BOOL allInputsWantMonochromeInput = YES; - for (GPUImageOutput *currentFilter in _initialFilters) - { - allInputsWantMonochromeInput = allInputsWantMonochromeInput && [currentFilter wantsMonochromeInput]; - } - - return allInputsWantMonochromeInput; -} - -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; -{ - for (GPUImageOutput *currentFilter in _initialFilters) - { - [currentFilter setCurrentlyReceivingMonochromeInput:newValue]; - } -} - -#pragma mark - -#pragma mark GPUImageTextureDelegate methods - -- (void)textureNoLongerNeededForTarget:(id)textureTarget; -{ - outputTextureRetainCount--; - if (outputTextureRetainCount < 1) - { - [firstTextureDelegate textureNoLongerNeededForTarget:self]; - } -} - @end diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 0c6a06b3c..1f120b4fa 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -2,9 +2,6 @@ #import "GPUImageFilter.h" @interface GPUImageFilterPipeline : NSObject -{ - NSString *stringValue; -} @property (strong) NSMutableArray *filters; @@ -24,6 +21,5 @@ - (UIImage *) currentFilteredFrame; - (CGImageRef) newCGImageFromCurrentFilteredFrame; -- (CGImageRef) newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation; @end diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 84057e95c..5a736c849 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -37,12 +37,12 @@ - (BOOL)_parseConfiguration:(NSDictionary *)configuration { if (!filters) { return NO; } - + NSError *regexError = nil; NSRegularExpression *parsingRegex = [NSRegularExpression regularExpressionWithPattern:@"(float|CGPoint|NSString)\\((.*?)(?:,\\s*(.*?))*\\)" - options:0 - error:®exError]; - + options:0 + error:®exError]; + // It's faster to put them into an array and then pass it to the filters property than it is to call [self addFilter:] every time NSMutableArray *orderedFilters = [NSMutableArray arrayWithCapacity:[filters count]]; for (NSDictionary *filter in filters) { @@ -58,80 +58,67 @@ - (BOOL)_parseConfiguration:(NSDictionary *)configuration { NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[theClass instanceMethodSignatureForSelector:theSelector]]; [inv setSelector:theSelector]; [inv setTarget:genericFilter]; - - // check selector given with parameter - if ([propertyKey hasSuffix:@":"]) { - - stringValue = nil; - - // Then parse the arguments - NSMutableArray *parsedArray; - if ([[filterAttributes objectForKey:propertyKey] isKindOfClass:[NSArray class]]) { - NSArray *array = [filterAttributes objectForKey:propertyKey]; - parsedArray = [NSMutableArray arrayWithCapacity:[array count]]; - for (NSString *string in array) { - NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string - options:0 - range:NSMakeRange(0, [string length])]; - - NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; - if ([modifier isEqualToString:@"float"]) { - // Float modifier, one argument - CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - [parsedArray addObject:[NSNumber numberWithFloat:value]]; - [inv setArgument:&value atIndex:2]; - } else if ([modifier isEqualToString:@"CGPoint"]) { - // CGPoint modifier, two float arguments - CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; - CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; - CGPoint value = CGPointMake(x, y); - [parsedArray addObject:[NSValue valueWithCGPoint:value]]; - } else if ([modifier isEqualToString:@"NSString"]) { - // NSString modifier, one string argument - stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; - [inv setArgument:&stringValue atIndex:2]; - - } else { - return NO; - } - } - [inv setArgument:&parsedArray atIndex:2]; - } else { - NSString *string = [filterAttributes objectForKey:propertyKey]; + + // Parse the argument + NSMutableArray *parsedArray; + if ([[filterAttributes objectForKey:propertyKey] isKindOfClass:[NSArray class]]) { + NSArray *array = [filterAttributes objectForKey:propertyKey]; + parsedArray = [NSMutableArray arrayWithCapacity:[array count]]; + for (NSString *string in array) { NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string - options:0 - range:NSMakeRange(0, [string length])]; - + options:0 + range:NSMakeRange(0, [string length])]; + NSLog(@"Ranges: %d", parse.numberOfRanges); NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; if ([modifier isEqualToString:@"float"]) { // Float modifier, one argument CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + [parsedArray addObject:[NSNumber numberWithFloat:value]]; [inv setArgument:&value atIndex:2]; } else if ([modifier isEqualToString:@"CGPoint"]) { // CGPoint modifier, two float arguments CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; CGPoint value = CGPointMake(x, y); - [inv setArgument:&value atIndex:2]; + [parsedArray addObject:[NSValue valueWithCGPoint:value]]; } else if ([modifier isEqualToString:@"NSString"]) { // NSString modifier, one string argument - stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; + NSString *stringValue = [[string substringWithRange:[parse rangeAtIndex:2]] copy]; [inv setArgument:&stringValue atIndex:2]; - + } else { return NO; } } + [inv setArgument:&parsedArray atIndex:2]; + } else { + NSString *string = [filterAttributes objectForKey:propertyKey]; + NSTextCheckingResult *parse = [parsingRegex firstMatchInString:string + options:0 + range:NSMakeRange(0, [string length])]; + NSLog(@"Ranges: %d", parse.numberOfRanges); + NSString *modifier = [string substringWithRange:[parse rangeAtIndex:1]]; + if ([modifier isEqualToString:@"float"]) { + // Float modifier, one argument + CGFloat value = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + [inv setArgument:&value atIndex:2]; + } else if ([modifier isEqualToString:@"CGPoint"]) { + // CGPoint modifier, two float arguments + CGFloat x = [[string substringWithRange:[parse rangeAtIndex:2]] floatValue]; + CGFloat y = [[string substringWithRange:[parse rangeAtIndex:3]] floatValue]; + CGPoint value = CGPointMake(x, y); + [inv setArgument:&value atIndex:2]; + } else { + return NO; + } } - - [inv invoke]; } } [orderedFilters addObject:genericFilter]; } self.filters = orderedFilters; - + return YES; } @@ -179,19 +166,19 @@ - (void)replaceAllFilters:(NSArray *)newFilters { } - (void)_refreshFilters { - + id prevFilter = self.input; GPUImageFilter *theFilter = nil; - + for (int i = 0; i < [self.filters count]; i++) { theFilter = [self.filters objectAtIndex:i]; [prevFilter removeAllTargets]; [prevFilter addTarget:theFilter]; prevFilter = theFilter; } - + [prevFilter removeAllTargets]; - + if (self.output != nil) { [prevFilter addTarget:self.output]; } @@ -205,9 +192,4 @@ - (CGImageRef)newCGImageFromCurrentFilteredFrame { return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; } -- (CGImageRef)newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation { - return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; -} - - -@end \ No newline at end of file +@end diff --git a/framework/Source/GPUImageGlassSphereFilter.h b/framework/Source/GPUImageGlassSphereFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageGlassSphereFilter.m b/framework/Source/GPUImageGlassSphereFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index 78876244f..46dd1196b 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -21,88 +21,6 @@ void main() } ); -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; -{ - if (!currentlyReceivingMonochromeInput) - { - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; - } -} - -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; -{ - [super setInputTexture:newInputTexture atIndex:textureIndex]; - if (currentlyReceivingMonochromeInput) - { - [self notifyTargetsAboutNewOutputTexture]; - } -} - -- (GLuint)textureForOutput; -{ - if (currentlyReceivingMonochromeInput) - { - return filterSourceTexture; - } - else - { - return outputTexture; - } -} - -- (BOOL)wantsMonochromeInput; -{ - return YES; -} - -- (BOOL)providesMonochromeOutput; -{ - return YES; -} - -- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; -{ - if (self.frameProcessingCompletionBlock != NULL) - { - self.frameProcessingCompletionBlock(self, frameTime); - } - - [self releaseInputTexturesIfNeeded]; - - for (id currentTarget in targets) - { - if (currentTarget != self.targetToIgnoreForUpdates) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; - } - - if (currentlyReceivingMonochromeInput) - { - [currentTarget setInputRotation:inputRotation atIndex:textureIndex]; - - CGSize sizeToRotate = [self outputFrameSize]; - CGSize rotatedSize = sizeToRotate; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - rotatedSize.width = sizeToRotate.height; - rotatedSize.height = sizeToRotate.width; - } - [currentTarget setInputSize:rotatedSize atIndex:textureIndex]; - } - else - { - [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; - } - [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndex]; - } - } -} - #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageHalftoneFilter.h b/framework/Source/GPUImageHalftoneFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHalftoneFilter.m b/framework/Source/GPUImageHalftoneFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHighPassFilter.h b/framework/Source/GPUImageHighPassFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHighPassFilter.m b/framework/Source/GPUImageHighPassFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHighlightShadowFilter.h b/framework/Source/GPUImageHighlightShadowFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHighlightShadowFilter.m b/framework/Source/GPUImageHighlightShadowFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHoughTransformLineDetector.h b/framework/Source/GPUImageHoughTransformLineDetector.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m old mode 100755 new mode 100644 index e701067f5..6edfa881a --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -11,7 +11,6 @@ @implementation GPUImageHoughTransformLineDetector @synthesize linesDetectedBlock; @synthesize edgeThreshold; @synthesize lineDetectionThreshold; -@synthesize intermediateImages = _intermediateImages; - (id)init; { diff --git a/framework/Source/GPUImageHueBlendFilter.h b/framework/Source/GPUImageHueBlendFilter.h deleted file mode 100755 index 4399ffcfb..000000000 --- a/framework/Source/GPUImageHueBlendFilter.h +++ /dev/null @@ -1,5 +0,0 @@ -#import "GPUImageTwoInputFilter.h" - -@interface GPUImageHueBlendFilter : GPUImageTwoInputFilter - -@end diff --git a/framework/Source/GPUImageHueBlendFilter.m b/framework/Source/GPUImageHueBlendFilter.m deleted file mode 100755 index e448ee9aa..000000000 --- a/framework/Source/GPUImageHueBlendFilter.m +++ /dev/null @@ -1,115 +0,0 @@ -#import "GPUImageHueBlendFilter.h" - -/** - * Hue blend mode based upon pseudo code from the PDF specification. - */ -NSString *const kGPUImageHueBlendFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - varying highp vec2 textureCoordinate2; - - uniform sampler2D inputImageTexture; - uniform sampler2D inputImageTexture2; - - highp float lum(lowp vec3 c) { - return dot(c, vec3(0.3, 0.59, 0.11)); - } - - lowp vec3 clipcolor(lowp vec3 c) { - highp float l = lum(c); - lowp float n = min(min(c.r, c.g), c.b); - lowp float x = max(max(c.r, c.g), c.b); - - if (n < 0.0) { - c.r = l + ((c.r - l) * l) / (l - n); - c.g = l + ((c.g - l) * l) / (l - n); - c.b = l + ((c.b - l) * l) / (l - n); - } - if (x > 1.0) { - c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); - c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); - c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); - } - - return c; - } - - lowp vec3 setlum(lowp vec3 c, highp float l) { - highp float d = l - lum(c); - c = c + vec3(d); - return clipcolor(c); - } - - highp float sat(lowp vec3 c) { - lowp float n = min(min(c.r, c.g), c.b); - lowp float x = max(max(c.r, c.g), c.b); - return x - n; - } - - lowp float mid(lowp float cmin, lowp float cmid, lowp float cmax, highp float s) { - return ((cmid - cmin) * s) / (cmax - cmin); - } - - lowp vec3 setsat(lowp vec3 c, highp float s) { - if (c.r > c.g) { - if (c.r > c.b) { - if (c.g > c.b) { - /* g is mid, b is min */ - c.g = mid(c.b, c.g, c.r, s); - c.b = 0.0; - } else { - /* b is mid, g is min */ - c.b = mid(c.g, c.b, c.r, s); - c.g = 0.0; - } - c.r = s; - } else { - /* b is max, r is mid, g is min */ - c.r = mid(c.g, c.r, c.b, s); - c.b = s; - c.r = 0.0; - } - } else if (c.r > c.b) { - /* g is max, r is mid, b is min */ - c.r = mid(c.b, c.r, c.g, s); - c.g = s; - c.b = 0.0; - } else if (c.g > c.b) { - /* g is max, b is mid, r is min */ - c.b = mid(c.r, c.b, c.g, s); - c.g = s; - c.r = 0.0; - } else if (c.b > c.g) { - /* b is max, g is mid, r is min */ - c.g = mid(c.r, c.g, c.b, s); - c.b = s; - c.r = 0.0; - } else { - c = vec3(0.0); - } - return c; - } - - void main() - { - highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); - highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); - - gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(overlayColor.rgb, sat(baseColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); - } - ); - - -@implementation GPUImageHueBlendFilter - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageHueBlendFragmentShaderString])) - { - return nil; - } - - return self; -} - -@end diff --git a/framework/Source/GPUImageHueFilter.h b/framework/Source/GPUImageHueFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageJFAVoroniFilter.h b/framework/Source/GPUImageJFAVoroniFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m index 8c74e661a..e779c11c6 100755 --- a/framework/Source/GPUImageKuwaharaFilter.m +++ b/framework/Source/GPUImageKuwaharaFilter.m @@ -15,86 +15,64 @@ precision highp float; - const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0); + const vec2 src_size = vec2 (768.0, 1024.0); void main (void) { - vec2 uv = textureCoordinate; - float n = float((radius + 1) * (radius + 1)); - int i; int j; - vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0); - vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0); - vec3 c; - - for (j = -radius; j <= 0; ++j) { - for (i = -radius; i <= 0; ++i) { - c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; - m0 += c; - s0 += c * c; - } - } - - for (j = -radius; j <= 0; ++j) { - for (i = 0; i <= radius; ++i) { - c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; - m1 += c; - s1 += c * c; - } - } - - for (j = 0; j <= radius; ++j) { - for (i = 0; i <= radius; ++i) { - c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; - m2 += c; - s2 += c * c; - } - } - - for (j = 0; j <= radius; ++j) { - for (i = -radius; i <= 0; ++i) { - c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; - m3 += c; - s3 += c * c; - } - } - - - float min_sigma2 = 1e+2; - m0 /= n; - s0 = abs(s0 / n - m0 * m0); - - float sigma2 = s0.r + s0.g + s0.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m0, 1.0); - } - - m1 /= n; - s1 = abs(s1 / n - m1 * m1); - - sigma2 = s1.r + s1.g + s1.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m1, 1.0); - } - - m2 /= n; - s2 = abs(s2 / n - m2 * m2); - - sigma2 = s2.r + s2.g + s2.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m2, 1.0); - } - - m3 /= n; - s3 = abs(s3 / n - m3 * m3); - - sigma2 = s3.r + s3.g + s3.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m3, 1.0); - } + vec2 uv = textureCoordinate; + float n = float((radius + 1) * (radius + 1)); + + vec3 m[4]; + vec3 s[4]; + for (int k = 0; k < 4; ++k) { + m[k] = vec3(0.0); + s[k] = vec3(0.0); + } + + for (int j = -radius; j <= 0; ++j) { + for (int i = -radius; i <= 0; ++i) { + vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; + m[0] += c; + s[0] += c * c; + } + } + + for (int j = -radius; j <= 0; ++j) { + for (int i = 0; i <= radius; ++i) { + vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; + m[1] += c; + s[1] += c * c; + } + } + + for (int j = 0; j <= radius; ++j) { + for (int i = 0; i <= radius; ++i) { + vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; + m[2] += c; + s[2] += c * c; + } + } + + for (int j = 0; j <= radius; ++j) { + for (int i = -radius; i <= 0; ++i) { + vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; + m[3] += c; + s[3] += c * c; + } + } + + + float min_sigma2 = 1e+2; + for (int k = 0; k < 4; ++k) { + m[k] /= n; + s[k] = abs(s[k] / n - m[k] * m[k]); + + float sigma2 = s[k].r + s[k].g + s[k].b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m[k], 1.0); + } + } } ); diff --git a/framework/Source/GPUImageKuwaharaRadius3Filter.h b/framework/Source/GPUImageKuwaharaRadius3Filter.h deleted file mode 100644 index c4591b817..000000000 --- a/framework/Source/GPUImageKuwaharaRadius3Filter.h +++ /dev/null @@ -1,8 +0,0 @@ -// -// GPUImageKuwaharaRadius3Filter.h - -#import "GPUImageFilter.h" - -@interface GPUImageKuwaharaRadius3Filter : GPUImageFilter - -@end diff --git a/framework/Source/GPUImageKuwaharaRadius3Filter.m b/framework/Source/GPUImageKuwaharaRadius3Filter.m deleted file mode 100644 index 086154922..000000000 --- a/framework/Source/GPUImageKuwaharaRadius3Filter.m +++ /dev/null @@ -1,286 +0,0 @@ -#import "GPUImageKuwaharaRadius3Filter.h" - -// Sourced from Kyprianidis, J. E., Kang, H., and Doellner, J. "Anisotropic Kuwahara Filtering on the GPU," GPU Pro p.247 (2010). -// -// Original header: -// -// Anisotropic Kuwahara Filtering on the GPU -// by Jan Eric Kyprianidis - -NSString *const kGPUImageKuwaharaRadius3FragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - uniform sampler2D inputImageTexture; - - precision highp float; - - const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0); - - void main (void) - { - vec2 uv = textureCoordinate; - float n = float(16); // radius is assumed to be 3 - vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0); - vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0); - vec3 c; - vec3 cSq; - - c = texture2D(inputImageTexture, uv + vec2(-3,-3) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-3,-2) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-3,-1) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-3,0) * src_size).rgb; - cSq = c * c; - m0 += c; - s0 += cSq; - m1 += c; - s1 += cSq; - - c = texture2D(inputImageTexture, uv + vec2(-2,-3) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-2,-2) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-2,-1) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-2,0) * src_size).rgb; - cSq = c * c; - m0 += c; - s0 += cSq; - m1 += c; - s1 += cSq; - - c = texture2D(inputImageTexture, uv + vec2(-1,-3) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-1,-2) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-1,-1) * src_size).rgb; - m0 += c; - s0 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-1,0) * src_size).rgb; - cSq = c * c; - m0 += c; - s0 += cSq; - m1 += c; - s1 += cSq; - - c = texture2D(inputImageTexture, uv + vec2(0,-3) * src_size).rgb; - cSq = c * c; - m0 += c; - s0 += cSq; - m3 += c; - s3 += cSq; - c = texture2D(inputImageTexture, uv + vec2(0,-2) * src_size).rgb; - cSq = c * c; - m0 += c; - s0 += cSq; - m3 += c; - s3 += cSq; - c = texture2D(inputImageTexture, uv + vec2(0,-1) * src_size).rgb; - cSq = c * c; - m0 += c; - s0 += cSq; - m3 += c; - s3 += cSq; - c = texture2D(inputImageTexture, uv + vec2(0,0) * src_size).rgb; - cSq = c * c; - m0 += c; - s0 += cSq; - m1 += c; - s1 += cSq; - m2 += c; - s2 += cSq; - m3 += c; - s3 += cSq; - - c = texture2D(inputImageTexture, uv + vec2(-3,3) * src_size).rgb; - m1 += c; - s1 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-3,2) * src_size).rgb; - m1 += c; - s1 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-3,1) * src_size).rgb; - m1 += c; - s1 += c * c; - - c = texture2D(inputImageTexture, uv + vec2(-2,3) * src_size).rgb; - m1 += c; - s1 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-2,2) * src_size).rgb; - m1 += c; - s1 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-2,1) * src_size).rgb; - m1 += c; - s1 += c * c; - - c = texture2D(inputImageTexture, uv + vec2(-1,3) * src_size).rgb; - m1 += c; - s1 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-1,2) * src_size).rgb; - m1 += c; - s1 += c * c; - c = texture2D(inputImageTexture, uv + vec2(-1,1) * src_size).rgb; - m1 += c; - s1 += c * c; - - c = texture2D(inputImageTexture, uv + vec2(0,3) * src_size).rgb; - cSq = c * c; - m1 += c; - s1 += cSq; - m2 += c; - s2 += cSq; - c = texture2D(inputImageTexture, uv + vec2(0,2) * src_size).rgb; - cSq = c * c; - m1 += c; - s1 += cSq; - m2 += c; - s2 += cSq; - c = texture2D(inputImageTexture, uv + vec2(0,1) * src_size).rgb; - cSq = c * c; - m1 += c; - s1 += cSq; - m2 += c; - s2 += cSq; - - c = texture2D(inputImageTexture, uv + vec2(3,3) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(3,2) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(3,1) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(3,0) * src_size).rgb; - cSq = c * c; - m2 += c; - s2 += cSq; - m3 += c; - s3 += cSq; - - c = texture2D(inputImageTexture, uv + vec2(2,3) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(2,2) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(2,1) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(2,0) * src_size).rgb; - cSq = c * c; - m2 += c; - s2 += cSq; - m3 += c; - s3 += cSq; - - c = texture2D(inputImageTexture, uv + vec2(1,3) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(1,2) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(1,1) * src_size).rgb; - m2 += c; - s2 += c * c; - c = texture2D(inputImageTexture, uv + vec2(1,0) * src_size).rgb; - cSq = c * c; - m2 += c; - s2 += cSq; - m3 += c; - s3 += cSq; - - c = texture2D(inputImageTexture, uv + vec2(3,-3) * src_size).rgb; - m3 += c; - s3 += c * c; - c = texture2D(inputImageTexture, uv + vec2(3,-2) * src_size).rgb; - m3 += c; - s3 += c * c; - c = texture2D(inputImageTexture, uv + vec2(3,-1) * src_size).rgb; - m3 += c; - s3 += c * c; - - c = texture2D(inputImageTexture, uv + vec2(2,-3) * src_size).rgb; - m3 += c; - s3 += c * c; - c = texture2D(inputImageTexture, uv + vec2(2,-2) * src_size).rgb; - m3 += c; - s3 += c * c; - c = texture2D(inputImageTexture, uv + vec2(2,-1) * src_size).rgb; - m3 += c; - s3 += c * c; - - c = texture2D(inputImageTexture, uv + vec2(1,-3) * src_size).rgb; - m3 += c; - s3 += c * c; - c = texture2D(inputImageTexture, uv + vec2(1,-2) * src_size).rgb; - m3 += c; - s3 += c * c; - c = texture2D(inputImageTexture, uv + vec2(1,-1) * src_size).rgb; - m3 += c; - s3 += c * c; - - float min_sigma2 = 1e+2; - m0 /= n; - s0 = abs(s0 / n - m0 * m0); - - float sigma2 = s0.r + s0.g + s0.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m0, 1.0); - } - - m1 /= n; - s1 = abs(s1 / n - m1 * m1); - - sigma2 = s1.r + s1.g + s1.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m1, 1.0); - } - - m2 /= n; - s2 = abs(s2 / n - m2 * m2); - - sigma2 = s2.r + s2.g + s2.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m2, 1.0); - } - - m3 /= n; - s3 = abs(s3 / n - m3 * m3); - - sigma2 = s3.r + s3.g + s3.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m3, 1.0); - } - } - ); - -@implementation GPUImageKuwaharaRadius3Filter - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageKuwaharaRadius3FragmentShaderString])) - { - return nil; - } - - return self; -} - -@end diff --git a/framework/Source/GPUImageLanczosResamplingFilter.h b/framework/Source/GPUImageLanczosResamplingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m old mode 100755 new mode 100644 index 24c6dd56f..4c5658d31 --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -123,37 +123,4 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; }); } -// The first pass (vertical) of the resampling needs to be shrunk in only one dimension so that the remaining shrinkage can be performed in the horizonal pass -- (void)setFilterFBO; -{ - CGSize currentFBOSize = [self sizeOfFBO]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - currentFBOSize.height = self.originalImageSize.height; - } - else - { - currentFBOSize.width = self.originalImageSize.width; - } - - if (!filterFramebuffer) - { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - } - [self setupFilterForSize:currentFBOSize]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - - glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); -} - @end diff --git a/framework/Source/GPUImageLevelsFilter.h b/framework/Source/GPUImageLevelsFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLineGenerator.h b/framework/Source/GPUImageLineGenerator.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.h b/framework/Source/GPUImageLocalBinaryPatternFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.m b/framework/Source/GPUImageLocalBinaryPatternFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLookupFilter.h b/framework/Source/GPUImageLookupFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLookupFilter.m b/framework/Source/GPUImageLookupFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLowPassFilter.h b/framework/Source/GPUImageLowPassFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLowPassFilter.m b/framework/Source/GPUImageLowPassFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLuminosity.h b/framework/Source/GPUImageLuminosity.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageLuminosityBlendFilter.h b/framework/Source/GPUImageLuminosityBlendFilter.h deleted file mode 100755 index 03b5e4c9f..000000000 --- a/framework/Source/GPUImageLuminosityBlendFilter.h +++ /dev/null @@ -1,5 +0,0 @@ -#import "GPUImageTwoInputFilter.h" - -@interface GPUImageLuminosityBlendFilter : GPUImageTwoInputFilter - -@end diff --git a/framework/Source/GPUImageLuminosityBlendFilter.m b/framework/Source/GPUImageLuminosityBlendFilter.m deleted file mode 100755 index f58970ef8..000000000 --- a/framework/Source/GPUImageLuminosityBlendFilter.m +++ /dev/null @@ -1,65 +0,0 @@ -#import "GPUImageLuminosityBlendFilter.h" - -/** - * Luminosity blend mode based upon pseudo code from the PDF specification. - */ -NSString *const kGPUImageLuminosityBlendFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - varying highp vec2 textureCoordinate2; - - uniform sampler2D inputImageTexture; - uniform sampler2D inputImageTexture2; - - highp float lum(lowp vec3 c) { - return dot(c, vec3(0.3, 0.59, 0.11)); - } - - lowp vec3 clipcolor(lowp vec3 c) { - highp float l = lum(c); - lowp float n = min(min(c.r, c.g), c.b); - lowp float x = max(max(c.r, c.g), c.b); - - if (n < 0.0) { - c.r = l + ((c.r - l) * l) / (l - n); - c.g = l + ((c.g - l) * l) / (l - n); - c.b = l + ((c.b - l) * l) / (l - n); - } - if (x > 1.0) { - c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); - c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); - c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); - } - - return c; - } - - lowp vec3 setlum(lowp vec3 c, highp float l) { - highp float d = l - lum(c); - c = c + vec3(d); - return clipcolor(c); - } - - void main() - { - highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); - highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); - - gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(baseColor.rgb, lum(overlayColor.rgb)) * overlayColor.a, baseColor.a); - } - ); - - -@implementation GPUImageLuminosityBlendFilter - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageLuminosityBlendFragmentShaderString])) - { - return nil; - } - - return self; -} - -@end diff --git a/framework/Source/GPUImageMedianFilter.h b/framework/Source/GPUImageMedianFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMedianFilter.m b/framework/Source/GPUImageMedianFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMissEtikateFilter.m b/framework/Source/GPUImageMissEtikateFilter.m index f15b85eea..831ba0524 100755 --- a/framework/Source/GPUImageMissEtikateFilter.m +++ b/framework/Source/GPUImageMissEtikateFilter.m @@ -26,11 +26,6 @@ - (id)init; return self; } --(void)prepareForImageCapture { - [lookupImageSource processImage]; - [super prepareForImageCapture]; -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageMonochromeFilter.h b/framework/Source/GPUImageMonochromeFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMotionDetector.h b/framework/Source/GPUImageMotionDetector.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMotionDetector.m b/framework/Source/GPUImageMotionDetector.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index a25876679..50cacc09e 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -55,7 +55,6 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; - (void)startRecording; - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; - (void)finishRecording; -- (void)cancelRecording; - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; - (void)enableSynchronizationCallbacks; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 78bc028c7..03f1fa433 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -245,21 +245,6 @@ - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; [self startRecording]; } -- (void)cancelRecording; -{ - if (assetWriter.status == AVAssetWriterStatusCompleted) - { - return; - } - - isRecording = NO; - runOnMainQueueWithoutDeadlocking(^{ - [assetWriterVideoInput markAsFinished]; - [assetWriterAudioInput markAsFinished]; - [assetWriter cancelWriting]; - }); -} - - (void)finishRecording; { if (assetWriter.status == AVAssetWriterStatusCompleted) @@ -271,11 +256,7 @@ - (void)finishRecording; runOnMainQueueWithoutDeadlocking(^{ [assetWriterVideoInput markAsFinished]; [assetWriterAudioInput markAsFinished]; -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) [assetWriter finishWriting]; -#else - [assetWriter finishWritingWithCompletionHandler:NULL]; -#endif }); } @@ -602,16 +583,6 @@ - (void)conserveMemoryForNextFrame; } -- (BOOL)wantsMonochromeInput; -{ - return NO; -} - -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; -{ - -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.h b/framework/Source/GPUImageNobleCornerDetectionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.m b/framework/Source/GPUImageNobleCornerDetectionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.h b/framework/Source/GPUImageNonMaximumSuppressionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNormalBlendFilter.h b/framework/Source/GPUImageNormalBlendFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOpacityFilter.h b/framework/Source/GPUImageOpacityFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOpacityFilter.m b/framework/Source/GPUImageOpacityFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index a96ab96c6..de552e12b 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -22,8 +22,6 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; -+ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; -+ (BOOL)deviceSupportsRedTextures; + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - (void)presentBufferForDisplay; @@ -50,8 +48,6 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (BOOL)shouldIgnoreUpdatesToThisTarget; - (BOOL)enabled; - (void)conserveMemoryForNextFrame; -- (BOOL)wantsMonochromeInput; -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; @end @protocol GPUImageTextureDelegate diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 118532dfd..a90366f8a 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -91,37 +91,6 @@ + (GLint)maximumTextureUnitsForThisDevice; return maxTextureUnits; } -+ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; -{ - static dispatch_once_t pred; - static NSArray *extensionNames = nil; - - // Cache extensions for later quick reference, since this won't change for a given device - dispatch_once(&pred, ^{ - [GPUImageOpenGLESContext useImageProcessingContext]; - NSString *extensionsString = [NSString stringWithCString:(const char *)glGetString(GL_EXTENSIONS) encoding:NSASCIIStringEncoding]; - extensionNames = [extensionsString componentsSeparatedByString:@" "]; - }); - - return [extensionNames containsObject:extension]; -} - - -// http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt - -+ (BOOL)deviceSupportsRedTextures; -{ - static dispatch_once_t pred; - static BOOL supportsRedTextures = NO; - - dispatch_once(&pred, ^{ - supportsRedTextures = [GPUImageOpenGLESContext deviceSupportsOpenGLESExtension:@"GL_EXT_texture_rg"]; - }); - - return supportsRedTextures; -} - - + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; { GLint maxTextureSize = [self maximumTextureSizeForThisDevice]; diff --git a/framework/Source/GPUImageOpeningFilter.h b/framework/Source/GPUImageOpeningFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOpeningFilter.m b/framework/Source/GPUImageOpeningFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 48618646f..afef5447f 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -34,8 +34,6 @@ void reportAvailableMemoryForGPUImage(NSString *tag); __unsafe_unretained id firstTextureDelegate; BOOL shouldConserveMemoryForNextFrame; - - BOOL allTargetsWantMonochromeData; } @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; @@ -114,9 +112,7 @@ void reportAvailableMemoryForGPUImage(NSString *tag); - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; -- (BOOL)providesMonochromeOutput; - - (void)prepareForImageCapture; - (void)conserveMemoryForNextFrame; -@end +@end \ No newline at end of file diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 2a7d43c97..dc3ca2236 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -88,8 +88,7 @@ - (id)init; targets = [[NSMutableArray alloc] init]; targetTextureIndices = [[NSMutableArray alloc] init]; _enabled = YES; - allTargetsWantMonochromeData = YES; - + return self; } @@ -132,11 +131,6 @@ - (void)addTarget:(id)newTarget; { NSInteger nextAvailableTextureIndex = [newTarget nextAvailableTextureIndex]; [self addTarget:newTarget atTextureLocation:nextAvailableTextureIndex]; - if (outputTexture) - { - [self setInputTextureForTarget:newTarget atIndex:nextAvailableTextureIndex]; - } - if ([newTarget shouldIgnoreUpdatesToThisTarget]) { _targetToIgnoreForUpdates = newTarget; @@ -156,8 +150,6 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text [newTarget setTextureDelegate:self atIndex:textureLocation]; [targets addObject:newTarget]; [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; - - allTargetsWantMonochromeData = allTargetsWantMonochromeData && [newTarget wantsMonochromeInput]; }); } @@ -206,8 +198,6 @@ - (void)removeAllTargets; } [targets removeAllObjects]; [targetTextureIndices removeAllObjects]; - - allTargetsWantMonochromeData = YES; }); } @@ -365,11 +355,6 @@ - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation return processedImage; } -- (BOOL)providesMonochromeOutput; -{ - return NO; -} - - (void)prepareForImageCapture; { diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImagePerlinNoiseFilter.h b/framework/Source/GPUImagePerlinNoiseFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 65444d1b6..413c19516 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -20,4 +20,4 @@ - (void)processImage; - (CGSize)outputImageSize; -@end +@end \ No newline at end of file diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 08abb54c2..e539ed022 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -139,8 +139,6 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot return self; } -// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) - (void)dealloc; { if (imageUpdateSemaphore != NULL) @@ -148,7 +146,6 @@ - (void)dealloc; dispatch_release(imageUpdateSemaphore); } } -#endif #pragma mark - #pragma mark Image rendering @@ -170,7 +167,7 @@ - (void)processImage; return; } - runAsynchronouslyOnVideoProcessingQueue(^{ + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) { diff --git a/framework/Source/GPUImagePolkaDotFilter.h b/framework/Source/GPUImagePolkaDotFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBClosingFilter.h b/framework/Source/GPUImageRGBClosingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBClosingFilter.m b/framework/Source/GPUImageRGBClosingFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBDilationFilter.h b/framework/Source/GPUImageRGBDilationFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBDilationFilter.m b/framework/Source/GPUImageRGBDilationFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBErosionFilter.h b/framework/Source/GPUImageRGBErosionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBErosionFilter.m b/framework/Source/GPUImageRGBErosionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBOpeningFilter.h b/framework/Source/GPUImageRGBOpeningFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRGBOpeningFilter.m b/framework/Source/GPUImageRGBOpeningFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h old mode 100755 new mode 100644 index bc24dad30..02f59808e --- a/framework/Source/GPUImageRawDataInput.h +++ b/framework/Source/GPUImageRawDataInput.h @@ -2,36 +2,15 @@ // The bytes passed into this input are not copied or retained, but you are free to deallocate them after they are used by this filter. // The bytes are uploaded and stored within a texture, so nothing is kept locally. -// The default format for input bytes is GPUPixelFormatBGRA, unless specified with pixelFormat: -// The default type for input bytes is GPUPixelTypeUByte, unless specified with pixelType: - -typedef enum { - GPUPixelFormatBGRA = GL_BGRA, - GPUPixelFormatRGBA = GL_RGBA, - GPUPixelFormatRGB = GL_RGB -} GPUPixelFormat; - -typedef enum { - GPUPixelTypeUByte = GL_UNSIGNED_BYTE, - GPUPixelTypeFloat = GL_FLOAT -} GPUPixelType; +// Input bytes are assumed to be in BGRA format. @interface GPUImageRawDataInput : GPUImageOutput { CGSize uploadedImageSize; - - dispatch_semaphore_t dataUpdateSemaphore; } // Initialization and teardown - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; -- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat; -- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat type:(GPUPixelType)pixelType; - -/** Input data pixel format - */ -@property (readwrite, nonatomic) GPUPixelFormat pixelFormat; -@property (readwrite, nonatomic) GPUPixelType pixelType; // Image rendering - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m old mode 100755 new mode 100644 index fda407d8d..133540cac --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -6,61 +6,23 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; @implementation GPUImageRawDataInput -@synthesize pixelFormat = _pixelFormat; -@synthesize pixelType = _pixelType; - #pragma mark - #pragma mark Initialization and teardown - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; -{ - if (!(self = [self initWithBytes:bytesToUpload size:imageSize pixelFormat:GPUPixelFormatBGRA type:GPUPixelTypeUByte])) - { - return nil; - } - - return self; -} - -- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat; -{ - if (!(self = [self initWithBytes:bytesToUpload size:imageSize pixelFormat:pixelFormat type:GPUPixelTypeUByte])) - { - return nil; - } - - return self; -} - -- (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat:(GPUPixelFormat)pixelFormat type:(GPUPixelType)pixelType; { if (!(self = [super init])) { return nil; } - dataUpdateSemaphore = dispatch_semaphore_create(1); - uploadedImageSize = imageSize; - self.pixelFormat = pixelFormat; - self.pixelType = pixelType; [self uploadBytes:bytesToUpload]; return self; } -// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -- (void)dealloc; -{ -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) - if (dataUpdateSemaphore != NULL) - { - dispatch_release(dataUpdateSemaphore); - } -#endif -} - #pragma mark - #pragma mark Image rendering @@ -68,10 +30,8 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; { [GPUImageOpenGLESContext useImageProcessingContext]; - [self initializeOutputTextureIfNeeded]; - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, _pixelFormat==GPUPixelFormatRGB ? GL_RGB : GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, (GLint)_pixelFormat, (GLenum)_pixelType, bytesToUpload); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, bytesToUpload); } - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; @@ -83,26 +43,16 @@ - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; - (void)processData; { - if (dispatch_semaphore_wait(dataUpdateSemaphore, DISPATCH_TIME_NOW) != 0) - { - return; - } - - runAsynchronouslyOnVideoProcessingQueue(^{ - - CGSize pixelSizeOfImage = [self outputImageSize]; + CGSize pixelSizeOfImage = [self outputImageSize]; - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; - } - - dispatch_semaphore_signal(dataUpdateSemaphore); - }); + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; + } } - (CGSize)outputImageSize; diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index ab146f73e..d9c0d6ecc 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -349,16 +349,6 @@ - (void)conserveMemoryForNextFrame; } -- (BOOL)wantsMonochromeInput; -{ - return NO; -} - -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; -{ - -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageSaturationBlendFilter.h b/framework/Source/GPUImageSaturationBlendFilter.h deleted file mode 100755 index 767892a53..000000000 --- a/framework/Source/GPUImageSaturationBlendFilter.h +++ /dev/null @@ -1,5 +0,0 @@ -#import "GPUImageTwoInputFilter.h" - -@interface GPUImageSaturationBlendFilter : GPUImageTwoInputFilter - -@end diff --git a/framework/Source/GPUImageSaturationBlendFilter.m b/framework/Source/GPUImageSaturationBlendFilter.m deleted file mode 100755 index 1925926dd..000000000 --- a/framework/Source/GPUImageSaturationBlendFilter.m +++ /dev/null @@ -1,115 +0,0 @@ -#import "GPUImageSaturationBlendFilter.h" - -/** - * Saturation blend mode based upon pseudo code from the PDF specification. - */ -NSString *const kGPUImageSaturationBlendFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - varying highp vec2 textureCoordinate2; - - uniform sampler2D inputImageTexture; - uniform sampler2D inputImageTexture2; - - highp float lum(lowp vec3 c) { - return dot(c, vec3(0.3, 0.59, 0.11)); - } - - lowp vec3 clipcolor(lowp vec3 c) { - highp float l = lum(c); - lowp float n = min(min(c.r, c.g), c.b); - lowp float x = max(max(c.r, c.g), c.b); - - if (n < 0.0) { - c.r = l + ((c.r - l) * l) / (l - n); - c.g = l + ((c.g - l) * l) / (l - n); - c.b = l + ((c.b - l) * l) / (l - n); - } - if (x > 1.0) { - c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); - c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); - c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); - } - - return c; - } - - lowp vec3 setlum(lowp vec3 c, highp float l) { - highp float d = l - lum(c); - c = c + vec3(d); - return clipcolor(c); - } - - highp float sat(lowp vec3 c) { - lowp float n = min(min(c.r, c.g), c.b); - lowp float x = max(max(c.r, c.g), c.b); - return x - n; - } - - lowp float mid(lowp float cmin, lowp float cmid, lowp float cmax, highp float s) { - return ((cmid - cmin) * s) / (cmax - cmin); - } - - lowp vec3 setsat(lowp vec3 c, highp float s) { - if (c.r > c.g) { - if (c.r > c.b) { - if (c.g > c.b) { - /* g is mid, b is min */ - c.g = mid(c.b, c.g, c.r, s); - c.b = 0.0; - } else { - /* b is mid, g is min */ - c.b = mid(c.g, c.b, c.r, s); - c.g = 0.0; - } - c.r = s; - } else { - /* b is max, r is mid, g is min */ - c.r = mid(c.g, c.r, c.b, s); - c.b = s; - c.r = 0.0; - } - } else if (c.r > c.b) { - /* g is max, r is mid, b is min */ - c.r = mid(c.b, c.r, c.g, s); - c.g = s; - c.b = 0.0; - } else if (c.g > c.b) { - /* g is max, b is mid, r is min */ - c.b = mid(c.r, c.b, c.g, s); - c.g = s; - c.r = 0.0; - } else if (c.b > c.g) { - /* b is max, g is mid, r is min */ - c.g = mid(c.r, c.g, c.b, s); - c.b = s; - c.r = 0.0; - } else { - c = vec3(0.0); - } - return c; - } - - void main() - { - highp vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); - highp vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); - - gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(baseColor.rgb, sat(overlayColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); - } - ); - - -@implementation GPUImageSaturationBlendFilter - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageSaturationBlendFragmentShaderString])) - { - return nil; - } - - return self; -} - -@end diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.h b/framework/Source/GPUImageSingleComponentFastBlurFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.m b/framework/Source/GPUImageSingleComponentFastBlurFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 713a28c66..c3bc35acf 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -84,22 +84,13 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; - [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); }); } } -- (BOOL)wantsMonochromeInput; -{ - return YES; -} - -- (BOOL)providesMonochromeOutput; -{ - return YES; -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m index 08b6e8b35..cb12f9af1 100755 --- a/framework/Source/GPUImageSoftEleganceFilter.m +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -50,12 +50,6 @@ - (id)init; return self; } --(void)prepareForImageCapture { - [lookupImageSource1 processImage]; - [lookupImageSource2 processImage]; - [super prepareForImageCapture]; -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageSolidColorGenerator.h b/framework/Source/GPUImageSolidColorGenerator.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m old mode 100755 new mode 100644 index 7d4458a3d..e717d0cf6 --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -60,7 +60,7 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text - (void)setColor:(GPUVector4)newValue; { - [self setColorRed:newValue.one green:newValue.two blue:newValue.three alpha:newValue.four]; + [self setColorRed:_color.one green:_color.two blue:_color.three alpha:_color.four]; } - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; diff --git a/framework/Source/GPUImageSourceOverBlendFilter.h b/framework/Source/GPUImageSourceOverBlendFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSourceOverBlendFilter.m b/framework/Source/GPUImageSourceOverBlendFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSphereRefractionFilter.h b/framework/Source/GPUImageSphereRefractionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index a86d93675..542ab6c8d 100755 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -5,13 +5,6 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina @interface GPUImageStillCamera : GPUImageVideoCamera -/** The JPEG compression quality to use when capturing a photo as a JPEG. - */ -@property CGFloat jpegCompressionQuality; - -// Only reliably set inside the context of the completion handler of one of the capture methods -@property (readonly) NSDictionary *currentCaptureMetadata; - // Photography controls - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block; - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index b64cc1806..1cb78296c 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -9,8 +9,6 @@ void stillImageDataReleaseCallback(void *releaseRefCon, const void *baseAddress) void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize finalSize, CMSampleBufferRef *sampleBuffer) { - // CVPixelBufferCreateWithPlanarBytes for YUV input - CGSize originalSize = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); CVPixelBufferLockBaseAddress(cameraFrame, 0); @@ -46,16 +44,10 @@ @interface GPUImageStillCamera () AVCaptureStillImageOutput *photoOutput; } -// Methods calling this are responsible for calling dispatch_semaphore_signal(frameRenderingSemaphore) somewhere inside the block -- (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withImageOnGPUHandler:(void (^)(NSError *error))block; - @end @implementation GPUImageStillCamera -@synthesize currentCaptureMetadata = _currentCaptureMetadata; -@synthesize jpegCompressionQuality = _jpegCompressionQuality; - #pragma mark - #pragma mark Initialization and teardown @@ -69,52 +61,12 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [self.captureSession beginConfiguration]; photoOutput = [[AVCaptureStillImageOutput alloc] init]; - - // Having a still photo input set to BGRA and video to YUV doesn't work well, so since I don't have YUV resizing for iPhone 4 yet, kick back to BGRA for that device -// if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) - if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) - { - BOOL supportsFullYUVRange = NO; - NSArray *supportedPixelFormats = photoOutput.availableImageDataCVPixelFormatTypes; - for (NSNumber *currentPixelFormat in supportedPixelFormats) - { - if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) - { - supportsFullYUVRange = YES; - } - } - - if (supportsFullYUVRange) - { - [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } - else - { - [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } - } - else - { - [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } + [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; -// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) -// { -// // TODO: Check for full range output and use that if available -// [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; -// } -// else -// { -// [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; -// } - [self.captureSession addOutput:photoOutput]; [self.captureSession commitConfiguration]; - self.jpegCompressionQuality = 0.8; - return self; } @@ -155,80 +107,128 @@ - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBuffer - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; { - [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { - UIImage *filteredPhoto = nil; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - if(!error){ - filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + + if(imageSampleBuffer == NULL){ + dispatch_semaphore_signal(frameRenderingSemaphore); + block(nil, error); + return; } - dispatch_semaphore_signal(frameRenderingSemaphore); - block(filteredPhoto, error); + [self conserveMemoryForNextFrame]; + + // For now, resize photos to fix within the max texture size of the GPU + CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); + + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); + CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; + if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) + { + CMSampleBufferRef sampleBuffer; + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + + dispatch_semaphore_signal(frameRenderingSemaphore); + [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + CFRelease(sampleBuffer); + } + else + { + // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches + AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; + if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) + { + dispatch_semaphore_signal(frameRenderingSemaphore); + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + } + } + + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dispatch_semaphore_signal(frameRenderingSemaphore); + + block(filteredPhoto, error); }]; + + return; } - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; { -// reportAvailableMemoryForGPUImage(@"Before Capture"); - - [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { - NSData *dataForJPEGFile = nil; - - if(!error){ - @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; - dispatch_semaphore_signal(frameRenderingSemaphore); -// reportAvailableMemoryForGPUImage(@"After UIImage generation"); +// reportAvailableMemoryForGPUImage(@"Before still image capture"); + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto,self.jpegCompressionQuality); -// reportAvailableMemoryForGPUImage(@"After JPEG generation"); - } + [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { +// reportAvailableMemoryForGPUImage(@"Before filter processing"); -// reportAvailableMemoryForGPUImage(@"After autorelease pool"); - }else{ + if(imageSampleBuffer == NULL){ dispatch_semaphore_signal(frameRenderingSemaphore); + block(nil, error); + return; } - block(dataForJPEGFile, error); - }]; -} + [self conserveMemoryForNextFrame]; -- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; -{ + // For now, resize photos to fix within the max texture size of the GPU + CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); - [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { - NSData *dataForPNGFile = nil; + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); + CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; + if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) + { + CMSampleBufferRef sampleBuffer; - if(!error){ - @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; - dispatch_semaphore_signal(frameRenderingSemaphore); - dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); - } - }else{ + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); + dispatch_semaphore_signal(frameRenderingSemaphore); + [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + CFRelease(sampleBuffer); } + else + { + // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches + AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; + if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) + { + dispatch_semaphore_signal(frameRenderingSemaphore); + [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + } + } + +// reportAvailableMemoryForGPUImage(@"After filter processing"); - block(dataForPNGFile, error); + __strong NSData *dataForJPEGFile = nil; + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dispatch_semaphore_signal(frameRenderingSemaphore); + +// reportAvailableMemoryForGPUImage(@"After UIImage generation"); + + dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, 0.8); +// reportAvailableMemoryForGPUImage(@"After JPEG generation"); + } + +// reportAvailableMemoryForGPUImage(@"After autorelease pool"); + + block(dataForJPEGFile, error); }]; return; } -#pragma mark - Private Methods - -- (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withImageOnGPUHandler:(void (^)(NSError *error))block +- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; { dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - if(photoOutput.isCapturingStillImage){ - block([NSError errorWithDomain:AVFoundationErrorDomain code:AVErrorMaximumStillImageCaptureRequestsExceeded userInfo:nil]); - return; - } - [photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { + if(imageSampleBuffer == NULL){ - block(error); + dispatch_semaphore_signal(frameRenderingSemaphore); + block(nil, error); return; } @@ -236,21 +236,13 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); - + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) { CMSampleBufferRef sampleBuffer; - - if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) - { - NSAssert(NO, @"Error: no downsampling for YUV input in the framework yet"); - } - else - { - GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); - } + GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; @@ -269,15 +261,18 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi } } - CFDictionaryRef metadata = CMCopyDictionaryOfAttachments(NULL, imageSampleBuffer, kCMAttachmentMode_ShouldPropagate); - _currentCaptureMetadata = (__bridge_transfer NSDictionary *)metadata; - - block(nil); - - _currentCaptureMetadata = nil; + NSData *dataForPNGFile = nil; + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + dispatch_semaphore_signal(frameRenderingSemaphore); + dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); + } + + block(dataForPNGFile, error); }]; + + return; } - @end diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index 7bc7bddd2..f73bc8989 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -29,7 +29,8 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; - (void)processTextureWithFrameTime:(CMTime)frameTime; { - runAsynchronouslyOnVideoProcessingQueue(^{ + runSynchronouslyOnVideoProcessingQueue(^{ +// dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index ffa7e4f2a..562643c08 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -71,14 +71,4 @@ - (void)conserveMemoryForNextFrame; } -- (BOOL)wantsMonochromeInput; -{ - return NO; -} - -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; -{ - -} - @end diff --git a/framework/Source/GPUImageThresholdSketchFilter.h b/framework/Source/GPUImageThresholdSketchFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageThresholdSketchFilter.m b/framework/Source/GPUImageThresholdSketchFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageTransformFilter.h b/framework/Source/GPUImageTransformFilter.h index 9865b8538..006289fe3 100755 --- a/framework/Source/GPUImageTransformFilter.h +++ b/framework/Source/GPUImageTransformFilter.h @@ -13,7 +13,4 @@ // This applies the transform to the raw frame data if set to YES, the default of NO takes the aspect ratio of the image input into account when rotating @property(readwrite, nonatomic) BOOL ignoreAspectRatio; -// sets the anchor point to top left corner -@property(readwrite, nonatomic) BOOL anchorTopLeft; - @end diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index d60274eaf..85c1cc292 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -2,13 +2,13 @@ NSString *const kGPUImageTransformVertexShaderString = SHADER_STRING ( - attribute highp vec4 position; - attribute highp vec4 inputTextureCoordinate; + attribute vec4 position; + attribute vec4 inputTextureCoordinate; uniform mat4 transformMatrix; uniform mat4 orthographicMatrix; - varying highp vec2 textureCoordinate; + varying vec2 textureCoordinate; void main() { @@ -22,7 +22,6 @@ @implementation GPUImageTransformFilter @synthesize affineTransform; @synthesize transform3D = _transform3D; @synthesize ignoreAspectRatio = _ignoreAspectRatio; -@synthesize anchorTopLeft = _anchorTopLeft; #pragma mark - #pragma mark Initialization and teardown @@ -54,27 +53,19 @@ - (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)righ GLfloat ty = - (top + bottom) / (top - bottom); GLfloat tz = - (far + near) / (far - near); - float scale = 2.0f; - if (_anchorTopLeft) - { - scale = 4.0f; - tx=-1.0f; - ty=-1.0f; - } - - matrix[0] = scale / r_l; + matrix[0] = 2.0f / r_l; matrix[1] = 0.0f; matrix[2] = 0.0f; matrix[3] = tx; matrix[4] = 0.0f; - matrix[5] = scale / t_b; + matrix[5] = 2.0f / t_b; matrix[6] = 0.0f; matrix[7] = ty; matrix[8] = 0.0f; matrix[9] = 0.0f; - matrix[10] = scale / f_n; + matrix[10] = 2.0f / f_n; matrix[11] = tz; matrix[12] = 0.0f; @@ -164,41 +155,13 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; 1.0f, 1.0f, }; - GLfloat adjustedVerticesAnchorTL[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, normalizedHeight, - 1.0f, normalizedHeight, - }; - - static const GLfloat squareVerticesAnchorTL[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - if (_ignoreAspectRatio) { - if (_anchorTopLeft) - { - [self renderToTextureWithVertices:squareVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; - } - else - { - [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; - } + [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; } else { - if (_anchorTopLeft) - { - [self renderToTextureWithVertices:adjustedVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; - } - else - { - [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; - } + [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; } [self informTargetsAboutNewFrameAtTime:frameTime]; @@ -253,10 +216,4 @@ - (void)setIgnoreAspectRatio:(BOOL)newValue; } } -- (void)setAnchorTopLeft:(BOOL)newValue -{ - _anchorTopLeft = newValue; - [self setIgnoreAspectRatio:_ignoreAspectRatio]; -} - @end diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m old mode 100755 new mode 100644 index 46e67cb89..e24dae357 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -92,9 +92,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - [self setFilterFBO]; [self setUniformsForProgramAtIndex:0]; - + + [self setFilterFBO]; + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageTwoPassFilter.h b/framework/Source/GPUImageTwoPassFilter.h index d04a8b0e8..efb51fa68 100755 --- a/framework/Source/GPUImageTwoPassFilter.h +++ b/framework/Source/GPUImageTwoPassFilter.h @@ -9,8 +9,6 @@ GLint secondFilterInputTextureUniform, secondFilterInputTextureUniform2; GLuint secondFilterFramebuffer; - - NSMutableDictionary *secondProgramUniformStateRestorationBlocks; } // Initialization and teardown diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 27ef39e5f..fff159bd7 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -12,8 +12,6 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade return nil; } - secondProgramUniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; - runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageOpenGLESContext useImageProcessingContext]; @@ -202,14 +200,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { [self initializeSecondOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); -// if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) -// { -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); -// } -// else -// { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); -// } + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); [self notifyTargetsAboutNewOutputTexture]; @@ -271,10 +262,9 @@ - (void)destroyFilterFBO; - (void)setFilterFBO; { - CGSize currentFBOSize = [self sizeOfFBO]; - if (!filterFramebuffer) { + CGSize currentFBOSize = [self sizeOfFBO]; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { preparedToCaptureImage = NO; @@ -285,11 +275,12 @@ - (void)setFilterFBO; { [super createFilterFBOofSize:currentFBOSize]; } - [self setupFilterForSize:currentFBOSize]; + [super setupFilterForSize:currentFBOSize]; } glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); + CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } @@ -305,6 +296,9 @@ - (void)setSecondFilterFBO; glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); + +// CGSize currentFBOSize = [self sizeOfFBO]; +// glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } - (void)setOutputFBO; @@ -322,12 +316,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - // This assumes that any two-pass filter that says it desires monochrome input is using the first pass for a luminance conversion, which can be dropped - if (!currentlyReceivingMonochromeInput) - { - // Run the first stage of the two-pass filter - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; - } + // Run the first stage of the two-pass filter + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; // Run the second stage of the two-pass filter [self setSecondFilterFBO]; @@ -338,22 +328,13 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - if (!currentlyReceivingMonochromeInput) - { - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); - } - else - { - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, sourceTexture); - glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - } + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, outputTexture); - glUniform1i(secondFilterInputTextureUniform, 3); + glUniform1i(secondFilterInputTextureUniform, 3); glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -380,6 +361,7 @@ - (void)releaseInputTexturesIfNeeded; { } + - (void)prepareForImageCapture; { if (preparedToCaptureImage) @@ -403,36 +385,5 @@ - (void)prepareForImageCapture; }); } -- (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; -{ -// TODO: Deal with the fact that two-pass filters may have the same shader program identifier - if (shaderProgram == filterProgram) - { - [uniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; - } - else - { - [secondProgramUniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; - } - uniformStateBlock(); -} - -- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; -{ - if (programIndex == 0) - { - [uniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ - dispatch_block_t currentBlock = obj; - currentBlock(); - }]; - } - else - { - [secondProgramUniformStateRestorationBlocks enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ - dispatch_block_t currentBlock = obj; - currentBlock(); - }]; - } -} @end diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.h b/framework/Source/GPUImageTwoPassTextureSamplingFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m old mode 100755 new mode 100644 index af103e781..af6bcbdc8 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -12,23 +12,17 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade return nil; } - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; - - verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; - - horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; - }); + verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; + verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + + horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; + horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; return self; } - (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; { - [super setUniformsForProgramAtIndex:programIndex]; - if (programIndex == 0) { glUniform1f(verticalPassTexelWidthOffsetUniform, verticalPassTexelWidthOffset); diff --git a/framework/Source/GPUImageUIElement.h b/framework/Source/GPUImageUIElement.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 0701d6722..2a6d68d4b 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -26,16 +26,12 @@ AVCaptureDevice *_inputCamera; AVCaptureDevice *_microphone; AVCaptureDeviceInput *videoInput; - AVCaptureVideoDataOutput *videoOutput; BOOL capturePaused; GPUImageRotationMode outputRotation; dispatch_semaphore_t frameRenderingSemaphore; - - BOOL captureAsYUV; - GLuint luminanceTexture, chrominanceTexture; - __unsafe_unretained id _delegate; + id _delegate; } /// The AVCaptureSession used to capture from the camera @@ -65,7 +61,7 @@ /// These properties determine whether or not the two camera orientations should be mirrored. By default, both are NO. @property(readwrite, nonatomic) BOOL horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera; -@property(nonatomic, assign) id delegate; +@property(nonatomic, retain) id delegate; /// @name Initialization and teardown diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 657ec1b07..96e221121 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -1,69 +1,5 @@ #import "GPUImageVideoCamera.h" #import "GPUImageMovieWriter.h" -#import "GPUImageFilter.h" - -NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - - uniform sampler2D luminanceTexture; - uniform sampler2D chrominanceTexture; - - void main() - { - mediump vec3 yuv; - lowp vec3 rgb; - - yuv.x = texture2D(luminanceTexture, textureCoordinate).r; - yuv.yz = texture2D(chrominanceTexture, textureCoordinate).rg - vec2(0.5, 0.5); - - // BT.601, which is the standard for SDTV is provided as a reference - /* - rgb = mat3( 1, 1, 1, - 0, -.39465, 2.03211, - 1.13983, -.58060, 0) * yuv; - */ - - // Using BT.709 which is the standard for HDTV - rgb = mat3( 1, 1, 1, - 0, -.21482, 2.12798, - 1.28033, -.38059, 0) * yuv; - - gl_FragColor = vec4(rgb, 1); - } -); - -NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - - uniform sampler2D luminanceTexture; - uniform sampler2D chrominanceTexture; - - void main() - { - mediump vec3 yuv; - lowp vec3 rgb; - - yuv.x = texture2D(luminanceTexture, textureCoordinate).r; - yuv.yz = texture2D(chrominanceTexture, textureCoordinate).ra - vec2(0.5, 0.5); - - // BT.601, which is the standard for SDTV is provided as a reference - /* - rgb = mat3( 1, 1, 1, - 0, -.39465, 2.03211, - 1.13983, -.58060, 0) * yuv; - */ - - // Using BT.709 which is the standard for HDTV - rgb = mat3( 1, 1, 1, - 0, -.21482, 2.12798, - 1.28033, -.38059, 0) * yuv; - - gl_FragColor = vec4(rgb, 1); - } - ); - #pragma mark - #pragma mark Private methods and instance variables @@ -71,24 +7,16 @@ void main() @interface GPUImageVideoCamera () { AVCaptureDeviceInput *audioInput; + AVCaptureVideoDataOutput *videoOutput; AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; NSInteger _frameRate; dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; - - GLProgram *yuvConversionProgram; - GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; - GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; - GLuint yuvConversionFramebuffer; - - int imageBufferWidth, imageBufferHeight; } - (void)updateOrientationSendToTargets; -- (void)convertYUVToRGBOutput; -- (void)setYUVConversionFBO; @end @@ -130,51 +58,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD _runBenchmark = NO; capturePaused = NO; outputRotation = kGPUImageNoRotation; - captureAsYUV = YES; runSynchronouslyOnVideoProcessingQueue(^{ - - if (captureAsYUV) - { - [GPUImageOpenGLESContext useImageProcessingContext]; -// if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) -// { -// yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; -// } -// else -// { - yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; -// } - - if (!yuvConversionProgram.initialized) - { - [yuvConversionProgram addAttribute:@"position"]; - [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; - - if (![yuvConversionProgram link]) - { - NSString *progLog = [yuvConversionProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [yuvConversionProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - yuvConversionProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - } - - yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; - yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; - yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; - yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; - - [GPUImageOpenGLESContext setActiveShaderProgram:yuvConversionProgram]; - - glEnableVertexAttribArray(yuvConversionPositionAttribute); - glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); - } - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { [GPUImageOpenGLESContext useImageProcessingContext]; @@ -189,11 +74,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } // Need to remove the initially created texture -// [self deleteOutputTexture]; - } - else - { - [self initializeOutputTextureIfNeeded]; + [self deleteOutputTexture]; } }); @@ -229,32 +110,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD videoOutput = [[AVCaptureVideoDataOutput alloc] init]; [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; -// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) - if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) - { - BOOL supportsFullYUVRange = NO; - NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; - for (NSNumber *currentPixelFormat in supportedPixelFormats) - { - if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) - { - supportsFullYUVRange = YES; - } - } - - if (supportsFullYUVRange) - { - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } - else - { - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } - } - else - { - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; // [videoOutput setSampleBufferDelegate:self queue:[GPUImageOpenGLESContext sharedOpenGLESQueue]]; @@ -297,8 +153,6 @@ - (void)dealloc CFRelease(coreVideoTextureCache); } -// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (cameraProcessingQueue != NULL) { dispatch_release(cameraProcessingQueue); @@ -313,13 +167,6 @@ - (void)dealloc { dispatch_release(frameRenderingSemaphore); } -#endif - -// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) - if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) - { - [self destroyYUVConversionFBO]; - } } - (void)removeInputsAndOutputs; @@ -499,42 +346,6 @@ - (AVCaptureConnection *)videoCaptureConnection { #define INITIALFRAMESTOIGNOREFORBENCHMARK 5 -- (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth height:(int)bufferHeight time:(CMTime)currentTime; -{ - for (id currentTarget in targets) - { - if ([currentTarget enabled]) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - - if ([currentTarget wantsMonochromeInput] && captureAsYUV) - { - [currentTarget setCurrentlyReceivingMonochromeInput:YES]; - [currentTarget setInputTexture:luminanceTexture atIndex:textureIndexOfTarget]; - } - else - { - [currentTarget setCurrentlyReceivingMonochromeInput:NO]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - } - - [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; - } - else - { - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; - } - } - } -} - - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { if (capturePaused) @@ -553,107 +364,55 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; if ([GPUImageOpenGLESContext supportsFastTextureUpload]) { - CVOpenGLESTextureRef luminanceTextureRef = NULL; - CVOpenGLESTextureRef chrominanceTextureRef = NULL; + CVPixelBufferLockBaseAddress(cameraFrame, 0); + CVOpenGLESTextureRef texture = NULL; + CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); + + if (!texture || err) { + NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + NSAssert(NO, @"Camera failure"); + return; + } + + outputTexture = CVOpenGLESTextureGetName(texture); + // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) - if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) // Check for YUV planar inputs to do RGB conversion + for (id currentTarget in targets) { - - if ( (imageBufferWidth != bufferWidth) && (imageBufferHeight != bufferHeight) ) + if ([currentTarget enabled]) { - imageBufferWidth = bufferWidth; - imageBufferHeight = bufferHeight; + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [self destroyYUVConversionFBO]; - [self createYUVConversionFBO]; - } - - CVReturn err; - // Y-plane - glActiveTexture(GL_TEXTURE4); - if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) - { -// err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); - } - else - { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); - } - if (err) - { - NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); - } - - luminanceTexture = CVOpenGLESTextureGetName(luminanceTextureRef); - glBindTexture(GL_TEXTURE_2D, luminanceTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - // UV-plane - glActiveTexture(GL_TEXTURE5); - if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) - { -// err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); - } - else - { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); - } - if (err) - { - NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); - } - - chrominanceTexture = CVOpenGLESTextureGetName(chrominanceTextureRef); - glBindTexture(GL_TEXTURE_2D, chrominanceTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - if (!allTargetsWantMonochromeData) - { - [self convertYUVToRGBOutput]; - } - - [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; - - CVPixelBufferUnlockBaseAddress(cameraFrame, 0); - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(luminanceTextureRef); - CFRelease(chrominanceTextureRef); - } - else - { - CVPixelBufferLockBaseAddress(cameraFrame, 0); - - CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); - - if (!texture || err) { - NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); - NSAssert(NO, @"Camera failure"); - return; + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; + + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; + } + else + { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + } } - - outputTexture = CVOpenGLESTextureGetName(texture); - // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; - - CVPixelBufferUnlockBaseAddress(cameraFrame, 0); - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(texture); - - outputTexture = 0; } + CVPixelBufferUnlockBaseAddress(cameraFrame, 0); + + // Flush the CVOpenGLESTexture cache and release the texture + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(texture); + outputTexture = 0; if (_runBenchmark) { @@ -669,6 +428,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; } else { + // Upload to texture CVPixelBufferLockBaseAddress(cameraFrame, 0); glBindTexture(GL_TEXTURE_2D, outputTexture); @@ -714,90 +474,6 @@ - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; [self.audioEncodingTarget processAudioBuffer:sampleBuffer]; } -- (void)convertYUVToRGBOutput; -{ - [GPUImageOpenGLESContext setActiveShaderProgram:yuvConversionProgram]; - [self setYUVConversionFBO]; - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - static const GLfloat squareVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - - static const GLfloat textureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, luminanceTexture); - glUniform1i(yuvConversionLuminanceTextureUniform, 4); - - glActiveTexture(GL_TEXTURE5); - glBindTexture(GL_TEXTURE_2D, chrominanceTexture); - glUniform1i(yuvConversionChrominanceTextureUniform, 5); - - glVertexAttribPointer(yuvConversionPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); - glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); -} - -- (void)setYUVConversionFBO; -{ - if (!yuvConversionFramebuffer) - { - [self createYUVConversionFBO]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); - - glViewport(0, 0, imageBufferWidth, imageBufferHeight); -} - -- (void)createYUVConversionFBO; -{ - [self initializeOutputTextureIfNeeded]; - - glActiveTexture(GL_TEXTURE1); - glGenFramebuffers(1, &yuvConversionFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); - - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageBufferWidth, imageBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - [self notifyTargetsAboutNewOutputTexture]; - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - glBindTexture(GL_TEXTURE_2D, 0); - -} - -- (void)destroyYUVConversionFBO; -{ - if (yuvConversionFramebuffer) - { - glDeleteFramebuffers(1, &yuvConversionFramebuffer); - yuvConversionFramebuffer = 0; - } - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } -} - - #pragma mark - #pragma mark Benchmarking @@ -820,7 +496,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM // } CFRetain(sampleBuffer); - runAsynchronouslyOnVideoProcessingQueue(^{ + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ [weakSelf processAudioSampleBuffer:sampleBuffer]; CFRelease(sampleBuffer); // dispatch_semaphore_signal(frameRenderingSemaphore); @@ -834,7 +510,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM } CFRetain(sampleBuffer); - runAsynchronouslyOnVideoProcessingQueue(^{ + dispatch_async([GPUImageOpenGLESContext sharedOpenGLESQueue], ^{ //Feature Detection Hook. if (weakSelf.delegate) { diff --git a/framework/Source/GPUImageView.h b/framework/Source/GPUImageView.h index 62ac641fc..31673d393 100755 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/GPUImageView.h @@ -35,6 +35,4 @@ typedef enum { */ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; - @end diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index e9fd485dd..8125acbd4 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -441,16 +441,6 @@ - (void)conserveMemoryForNextFrame; } -- (BOOL)wantsMonochromeInput; -{ - return NO; -} - -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; -{ - -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoroniConsumerFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoroniConsumerFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.h b/framework/Source/GPUImageWeakPixelInclusionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.m b/framework/Source/GPUImageWeakPixelInclusionFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageWhiteBalanceFilter.h b/framework/Source/GPUImageWhiteBalanceFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUImageWhiteBalanceFilter.m b/framework/Source/GPUImageWhiteBalanceFilter.m old mode 100755 new mode 100644 diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.h old mode 100755 new mode 100644 diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m old mode 100755 new mode 100644 From fa87e45610d7a4dd3380d771695010a652de8da7 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Tue, 29 Jan 2013 15:08:17 -0700 Subject: [PATCH 321/695] Kuwahara filter optimizations --- framework/Source/GPUImage.h | 4 +- framework/Source/GPUImageKuwaharaFilter.m | 132 ++++---- .../Source/GPUImageKuwaharaRadius3Filter.h | 8 + .../Source/GPUImageKuwaharaRadius3Filter.m | 286 ++++++++++++++++++ 4 files changed, 372 insertions(+), 58 deletions(-) create mode 100644 framework/Source/GPUImageKuwaharaRadius3Filter.h create mode 100644 framework/Source/GPUImageKuwaharaRadius3Filter.m diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 11b7861b1..565168456 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -39,6 +39,7 @@ #import "GPUImageMultiplyBlendFilter.h" #import "GPUImageDissolveBlendFilter.h" #import "GPUImageKuwaharaFilter.h" +#import "GPUImageKuwaharaRadius3Filter.h" #import "GPUImageVignetteFilter.h" #import "GPUImageGaussianBlurFilter.h" #import "GPUImageGaussianBlurPositionFilter.h" @@ -142,6 +143,3 @@ #import "GPUImageParallelCoordinateLineTransformFilter.h" #import "GPUImageThresholdSketchFilter.h" #import "GPUImageLineGenerator.h" -#import "GPUImageLinearBurnBlendFilter.h" -#import "GPUImageGaussianBlurPositionFilter.h" -#import "GPUImagePixellatePositionFilter.h" diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m index e779c11c6..8c74e661a 100755 --- a/framework/Source/GPUImageKuwaharaFilter.m +++ b/framework/Source/GPUImageKuwaharaFilter.m @@ -15,64 +15,86 @@ precision highp float; - const vec2 src_size = vec2 (768.0, 1024.0); + const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0); void main (void) { - vec2 uv = textureCoordinate; - float n = float((radius + 1) * (radius + 1)); - - vec3 m[4]; - vec3 s[4]; - for (int k = 0; k < 4; ++k) { - m[k] = vec3(0.0); - s[k] = vec3(0.0); - } - - for (int j = -radius; j <= 0; ++j) { - for (int i = -radius; i <= 0; ++i) { - vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; - m[0] += c; - s[0] += c * c; - } - } - - for (int j = -radius; j <= 0; ++j) { - for (int i = 0; i <= radius; ++i) { - vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; - m[1] += c; - s[1] += c * c; - } - } - - for (int j = 0; j <= radius; ++j) { - for (int i = 0; i <= radius; ++i) { - vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; - m[2] += c; - s[2] += c * c; - } - } - - for (int j = 0; j <= radius; ++j) { - for (int i = -radius; i <= 0; ++i) { - vec3 c = texture2D(inputImageTexture, uv + vec2(i,j) / src_size).rgb; - m[3] += c; - s[3] += c * c; - } - } - - - float min_sigma2 = 1e+2; - for (int k = 0; k < 4; ++k) { - m[k] /= n; - s[k] = abs(s[k] / n - m[k] * m[k]); - - float sigma2 = s[k].r + s[k].g + s[k].b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - gl_FragColor = vec4(m[k], 1.0); - } - } + vec2 uv = textureCoordinate; + float n = float((radius + 1) * (radius + 1)); + int i; int j; + vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0); + vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0); + vec3 c; + + for (j = -radius; j <= 0; ++j) { + for (i = -radius; i <= 0; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m0 += c; + s0 += c * c; + } + } + + for (j = -radius; j <= 0; ++j) { + for (i = 0; i <= radius; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m1 += c; + s1 += c * c; + } + } + + for (j = 0; j <= radius; ++j) { + for (i = 0; i <= radius; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m2 += c; + s2 += c * c; + } + } + + for (j = 0; j <= radius; ++j) { + for (i = -radius; i <= 0; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m3 += c; + s3 += c * c; + } + } + + + float min_sigma2 = 1e+2; + m0 /= n; + s0 = abs(s0 / n - m0 * m0); + + float sigma2 = s0.r + s0.g + s0.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m0, 1.0); + } + + m1 /= n; + s1 = abs(s1 / n - m1 * m1); + + sigma2 = s1.r + s1.g + s1.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m1, 1.0); + } + + m2 /= n; + s2 = abs(s2 / n - m2 * m2); + + sigma2 = s2.r + s2.g + s2.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m2, 1.0); + } + + m3 /= n; + s3 = abs(s3 / n - m3 * m3); + + sigma2 = s3.r + s3.g + s3.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m3, 1.0); + } } ); diff --git a/framework/Source/GPUImageKuwaharaRadius3Filter.h b/framework/Source/GPUImageKuwaharaRadius3Filter.h new file mode 100644 index 000000000..c4591b817 --- /dev/null +++ b/framework/Source/GPUImageKuwaharaRadius3Filter.h @@ -0,0 +1,8 @@ +// +// GPUImageKuwaharaRadius3Filter.h + +#import "GPUImageFilter.h" + +@interface GPUImageKuwaharaRadius3Filter : GPUImageFilter + +@end diff --git a/framework/Source/GPUImageKuwaharaRadius3Filter.m b/framework/Source/GPUImageKuwaharaRadius3Filter.m new file mode 100644 index 000000000..086154922 --- /dev/null +++ b/framework/Source/GPUImageKuwaharaRadius3Filter.m @@ -0,0 +1,286 @@ +#import "GPUImageKuwaharaRadius3Filter.h" + +// Sourced from Kyprianidis, J. E., Kang, H., and Doellner, J. "Anisotropic Kuwahara Filtering on the GPU," GPU Pro p.247 (2010). +// +// Original header: +// +// Anisotropic Kuwahara Filtering on the GPU +// by Jan Eric Kyprianidis + +NSString *const kGPUImageKuwaharaRadius3FragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + + precision highp float; + + const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0); + + void main (void) + { + vec2 uv = textureCoordinate; + float n = float(16); // radius is assumed to be 3 + vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0); + vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0); + vec3 c; + vec3 cSq; + + c = texture2D(inputImageTexture, uv + vec2(-3,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-2,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-1,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(0,-3) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,-2) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,-1) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-3,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(-2,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(-1,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(0,3) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,2) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,1) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(3,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(2,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(1,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(3,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(2,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(1,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + float min_sigma2 = 1e+2; + m0 /= n; + s0 = abs(s0 / n - m0 * m0); + + float sigma2 = s0.r + s0.g + s0.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m0, 1.0); + } + + m1 /= n; + s1 = abs(s1 / n - m1 * m1); + + sigma2 = s1.r + s1.g + s1.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m1, 1.0); + } + + m2 /= n; + s2 = abs(s2 / n - m2 * m2); + + sigma2 = s2.r + s2.g + s2.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m2, 1.0); + } + + m3 /= n; + s3 = abs(s3 / n - m3 * m3); + + sigma2 = s3.r + s3.g + s3.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m3, 1.0); + } + } + ); + +@implementation GPUImageKuwaharaRadius3Filter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageKuwaharaRadius3FragmentShaderString])) + { + return nil; + } + + return self; +} + +@end From b0224b57ee9e26dc32d7484fe15fef50c545f5ad Mon Sep 17 00:00:00 2001 From: Ian Simon Date: Tue, 29 Jan 2013 16:52:46 -0800 Subject: [PATCH 322/695] added two input 3x3 texture sampling filter --- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ ...GPUImageTwoInput3x3TextureSamplingFilter.h | 23 ++++ ...GPUImageTwoInput3x3TextureSamplingFilter.m | 122 ++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.h create mode 100644 framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 4369fb3b1..38047ddaa 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */; }; 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; }; 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; + 46A8097816B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h */; }; + 46A8097916B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097716B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m */; }; 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; @@ -353,6 +355,8 @@ 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNormalBlendFilter.m; path = Source/GPUImageNormalBlendFilter.m; sourceTree = SOURCE_ROOT; }; 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSourceOverBlendFilter.h; path = Source/GPUImageSourceOverBlendFilter.h; sourceTree = SOURCE_ROOT; }; 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSourceOverBlendFilter.m; path = Source/GPUImageSourceOverBlendFilter.m; sourceTree = SOURCE_ROOT; }; + 46A8097616B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInput3x3TextureSamplingFilter.h; path = Source/GPUImageTwoInput3x3TextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; + 46A8097716B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInput3x3TextureSamplingFilter.m; path = Source/GPUImageTwoInput3x3TextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHazeFilter.m; path = Source/GPUImageHazeFilter.m; sourceTree = SOURCE_ROOT; }; 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGrayscaleFilter.h; path = Source/GPUImageGrayscaleFilter.h; sourceTree = SOURCE_ROOT; }; @@ -886,6 +890,8 @@ BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */, BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */, BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */, + 46A8097616B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h */, + 46A8097716B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m */, BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */, BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */, BC1B715D14F4AFFF00ACA2AB /* Color processing */, @@ -1264,6 +1270,7 @@ B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */, B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */, B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */, + 46A8097816B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1526,6 +1533,7 @@ B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */, B80171FF16312800001C8D16 /* GPUImageSaturationBlendFilter.m in Sources */, B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */, + 46A8097916B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.h b/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.h new file mode 100644 index 000000000..cd29a4660 --- /dev/null +++ b/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.h @@ -0,0 +1,23 @@ +// +// GPUImageTwoInput3x3TextureSamplingFilter.h +// GPUImage +// +// Created by Ian Simon on 1/29/13. +// Copyright (c) 2013 Brad Larson. All rights reserved. +// + +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageTwoInput3x3TextureSamplingFilter : GPUImageTwoInputFilter +{ + GLint texelWidthUniform, texelHeightUniform; + + CGFloat texelWidth, texelHeight; + BOOL hasOverriddenImageSizeFactor; +} + +// The texel width and height determines how far out to sample from this texel. By default, this is the normalized width of a pixel, but this can be overridden for different effects. +@property(readwrite, nonatomic) CGFloat texelWidth; +@property(readwrite, nonatomic) CGFloat texelHeight; + +@end diff --git a/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m b/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m new file mode 100644 index 000000000..e38ed64be --- /dev/null +++ b/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m @@ -0,0 +1,122 @@ +// +// GPUImageTwoInput3x3TextureSamplingFilter.m +// GPUImage +// +// Created by Ian Simon on 1/29/13. +// Copyright (c) 2013 Brad Larson. All rights reserved. +// + +#import "GPUImageTwoInput3x3TextureSamplingFilter.h" + +NSString *const kGPUImageTwoInputNearbyTexelSamplingVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + attribute vec4 inputTextureCoordinate2; + + uniform highp float texelWidth; + uniform highp float texelHeight; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + varying vec2 textureCoordinate2; + + void main() + { + gl_Position = position; + + vec2 widthStep = vec2(texelWidth, 0.0); + vec2 heightStep = vec2(0.0, texelHeight); + vec2 widthHeightStep = vec2(texelWidth, texelHeight); + vec2 widthNegativeHeightStep = vec2(texelWidth, -texelHeight); + + textureCoordinate = inputTextureCoordinate.xy; + leftTextureCoordinate = inputTextureCoordinate.xy - widthStep; + rightTextureCoordinate = inputTextureCoordinate.xy + widthStep; + + topTextureCoordinate = inputTextureCoordinate.xy - heightStep; + topLeftTextureCoordinate = inputTextureCoordinate.xy - widthHeightStep; + topRightTextureCoordinate = inputTextureCoordinate.xy + widthNegativeHeightStep; + + bottomTextureCoordinate = inputTextureCoordinate.xy + heightStep; + bottomLeftTextureCoordinate = inputTextureCoordinate.xy - widthNegativeHeightStep; + bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep; + + textureCoordinate2 = inputTextureCoordinate2.xy; + } +); + +@implementation GPUImageTwoInput3x3TextureSamplingFilter + +@synthesize texelWidth = _texelWidth; +@synthesize texelHeight = _texelHeight; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageTwoInputNearbyTexelSamplingVertexShaderString fragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + texelWidthUniform = [filterProgram uniformIndex:@"texelWidth"]; + texelHeightUniform = [filterProgram uniformIndex:@"texelHeight"]; + + return self; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + if (!hasOverriddenImageSizeFactor) + { + _texelWidth = 1.0 / filterFrameSize.width; + _texelHeight = 1.0 / filterFrameSize.height; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + glUniform1f(texelWidthUniform, _texelHeight); + glUniform1f(texelHeightUniform, _texelWidth); + } + else + { + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + } + }); + } +} + +#pragma mark - +#pragma mark Accessors + +- (void)setTexelWidth:(CGFloat)newValue; +{ + hasOverriddenImageSizeFactor = YES; + _texelWidth = newValue; + + [self setFloat:_texelWidth forUniform:texelWidthUniform program:filterProgram]; +} + +- (void)setTexelHeight:(CGFloat)newValue; +{ + hasOverriddenImageSizeFactor = YES; + _texelHeight = newValue; + + [self setFloat:_texelHeight forUniform:texelHeightUniform program:filterProgram]; +} + +@end From 850ebf179d8b90a9695d3f13408da793de45696c Mon Sep 17 00:00:00 2001 From: Ian Simon Date: Tue, 29 Jan 2013 17:06:01 -0800 Subject: [PATCH 323/695] two input 3x3 texture sampling filter now samples a 3x3 window for both textures --- ...GPUImageTwoInput3x3TextureSamplingFilter.m | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m b/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m index e38ed64be..91b306969 100644 --- a/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m @@ -30,6 +30,16 @@ varying vec2 bottomRightTextureCoordinate; varying vec2 textureCoordinate2; + varying vec2 leftTextureCoordinate2; + varying vec2 rightTextureCoordinate2; + + varying vec2 topTextureCoordinate2; + varying vec2 topLeftTextureCoordinate2; + varying vec2 topRightTextureCoordinate2; + + varying vec2 bottomTextureCoordinate2; + varying vec2 bottomLeftTextureCoordinate2; + varying vec2 bottomRightTextureCoordinate2; void main() { @@ -53,6 +63,16 @@ void main() bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep; textureCoordinate2 = inputTextureCoordinate2.xy; + leftTextureCoordinate2 = inputTextureCoordinate2.xy - widthStep; + rightTextureCoordinate2 = inputTextureCoordinate2.xy + widthStep; + + topTextureCoordinate2 = inputTextureCoordinate2.xy - heightStep; + topLeftTextureCoordinate2 = inputTextureCoordinate2.xy - widthHeightStep; + topRightTextureCoordinate2 = inputTextureCoordinate2.xy + widthNegativeHeightStep; + + bottomTextureCoordinate2 = inputTextureCoordinate2.xy + heightStep; + bottomLeftTextureCoordinate2 = inputTextureCoordinate2.xy - widthNegativeHeightStep; + bottomRightTextureCoordinate2 = inputTextureCoordinate2.xy + widthHeightStep; } ); From a434fe2d1b120197aae8e3afdcc9b9446c5f1afa Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 29 Jan 2013 19:59:58 -0600 Subject: [PATCH 324/695] Fixed a header. --- framework/Source/GPUImage.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 565168456..61db156b2 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -143,3 +143,6 @@ #import "GPUImageParallelCoordinateLineTransformFilter.h" #import "GPUImageThresholdSketchFilter.h" #import "GPUImageLineGenerator.h" +#import "GPUImageLinearBurnBlendFilter.h" +#import "GPUImageGaussianBlurPositionFilter.h" +#import "GPUImagePixellatePositionFilter.h" From c6dad1b9e6e604f8556abd784647db87b14de1bb Mon Sep 17 00:00:00 2001 From: Ian Simon Date: Wed, 30 Jan 2013 01:37:31 -0800 Subject: [PATCH 325/695] added approximate poisson image blending --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 13 + framework/GPUImage.xcodeproj/project.pbxproj | 24 +- framework/Source/GPUImage.h | 2 + framework/Source/GPUImagePoissonBlendFilter.h | 26 ++ framework/Source/GPUImagePoissonBlendFilter.m | 325 ++++++++++++++++++ ...ImageTwoInputCrossTextureSamplingFilter.h} | 4 +- ...ImageTwoInputCrossTextureSamplingFilter.m} | 32 +- 9 files changed, 389 insertions(+), 39 deletions(-) create mode 100644 framework/Source/GPUImagePoissonBlendFilter.h create mode 100644 framework/Source/GPUImagePoissonBlendFilter.m rename framework/Source/{GPUImageTwoInput3x3TextureSamplingFilter.h => GPUImageTwoInputCrossTextureSamplingFilter.h} (81%) rename framework/Source/{GPUImageTwoInput3x3TextureSamplingFilter.m => GPUImageTwoInputCrossTextureSamplingFilter.m} (71%) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index dc7ecf35c..4640e45c2 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -164,6 +164,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_SATURATIONBLEND: cell.textLabel.text = @"Saturation blend"; break; case GPUIMAGE_LUMINOSITYBLEND: cell.textLabel.text = @"Luminosity blend"; break; case GPUIMAGE_NORMALBLEND: cell.textLabel.text = @"Normal blend"; break; + case GPUIMAGE_POISSONBLEND: cell.textLabel.text = @"Poisson blend"; break; case GPUIMAGE_OPACITY: cell.textLabel.text = @"Opacity adjustment"; break; case GPUIMAGE_KUWAHARA: cell.textLabel.text = @"Kuwahara"; break; case GPUIMAGE_VIGNETTE: cell.textLabel.text = @"Vignette"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 145a4fffd..e48ab8318 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -105,6 +105,7 @@ typedef enum { GPUIMAGE_SATURATIONBLEND, GPUIMAGE_LUMINOSITYBLEND, GPUIMAGE_NORMALBLEND, + GPUIMAGE_POISSONBLEND, GPUIMAGE_OPACITY, GPUIMAGE_CUSTOM, GPUIMAGE_UIELEMENT, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index f014ccebe..a6860b5d3 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1050,6 +1050,18 @@ - (void)setupFilter; filter = [[GPUImageNormalBlendFilter alloc] init]; }; break; + case GPUIMAGE_POISSONBLEND: + { + self.title = @"Poisson Blend"; + self.filterSettingsSlider.hidden = NO; + needsSecondImage = YES; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.5]; + + filter = [[GPUImagePoissonBlendFilter alloc] init]; + }; break; case GPUIMAGE_OPACITY: { @@ -1477,6 +1489,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)filter setThresholdMultiplier:[(UISlider *)sender value]]; break; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; + case GPUIMAGE_POISSONBLEND: [(GPUImagePoissonBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; case GPUIMAGE_LOWPASS: [(GPUImageLowPassFilter *)filter setFilterStrength:[(UISlider *)sender value]]; break; case GPUIMAGE_HIGHPASS: [(GPUImageHighPassFilter *)filter setFilterStrength:[(UISlider *)sender value]]; break; case GPUIMAGE_MOTIONDETECTOR: [(GPUImageMotionDetector *)filter setLowPassFilterStrength:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 38047ddaa..5339f5ba6 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -27,8 +27,10 @@ 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */; }; 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; }; 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; - 46A8097816B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h */; }; - 46A8097916B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097716B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m */; }; + 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; }; + 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097716B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m */; }; + 46A8097D16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; }; + 46A8097E16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */; }; 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; @@ -355,8 +357,10 @@ 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNormalBlendFilter.m; path = Source/GPUImageNormalBlendFilter.m; sourceTree = SOURCE_ROOT; }; 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSourceOverBlendFilter.h; path = Source/GPUImageSourceOverBlendFilter.h; sourceTree = SOURCE_ROOT; }; 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSourceOverBlendFilter.m; path = Source/GPUImageSourceOverBlendFilter.m; sourceTree = SOURCE_ROOT; }; - 46A8097616B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInput3x3TextureSamplingFilter.h; path = Source/GPUImageTwoInput3x3TextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; - 46A8097716B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInput3x3TextureSamplingFilter.m; path = Source/GPUImageTwoInput3x3TextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; + 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputCrossTextureSamplingFilter.h; path = Source/GPUImageTwoInputCrossTextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; + 46A8097716B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputCrossTextureSamplingFilter.m; path = Source/GPUImageTwoInputCrossTextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; + 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePoissonBlendFilter.h; path = Source/GPUImagePoissonBlendFilter.h; sourceTree = SOURCE_ROOT; }; + 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePoissonBlendFilter.m; path = Source/GPUImagePoissonBlendFilter.m; sourceTree = SOURCE_ROOT; }; 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHazeFilter.m; path = Source/GPUImageHazeFilter.m; sourceTree = SOURCE_ROOT; }; 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGrayscaleFilter.h; path = Source/GPUImageGrayscaleFilter.h; sourceTree = SOURCE_ROOT; }; @@ -814,6 +818,8 @@ B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */, B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */, B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */, + 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */, + 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */, ); name = Blends; sourceTree = ""; @@ -890,8 +896,8 @@ BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */, BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */, BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */, - 46A8097616B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h */, - 46A8097716B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m */, + 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */, + 46A8097716B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m */, BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */, BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */, BC1B715D14F4AFFF00ACA2AB /* Color processing */, @@ -1270,7 +1276,8 @@ B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */, B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */, B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */, - 46A8097816B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.h in Headers */, + 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */, + 46A8097D16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1533,7 +1540,8 @@ B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */, B80171FF16312800001C8D16 /* GPUImageSaturationBlendFilter.m in Sources */, B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */, - 46A8097916B8A48E000C29ED /* GPUImageTwoInput3x3TextureSamplingFilter.m in Sources */, + 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */, + 46A8097E16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 217ccbf3c..4d76ed96c 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -142,3 +142,5 @@ #import "GPUImageParallelCoordinateLineTransformFilter.h" #import "GPUImageThresholdSketchFilter.h" #import "GPUImageLineGenerator.h" +#import "GPUImageTwoInputCrossTextureSamplingFilter.h" +#import "GPUImagePoissonBlendFilter.h" diff --git a/framework/Source/GPUImagePoissonBlendFilter.h b/framework/Source/GPUImagePoissonBlendFilter.h new file mode 100644 index 000000000..a108f55a2 --- /dev/null +++ b/framework/Source/GPUImagePoissonBlendFilter.h @@ -0,0 +1,26 @@ +// +// GPUImagePoissonBlendFilter.h +// GPUImage +// +// Created by Ian Simon on 1/29/13. +// Copyright (c) 2013 Brad Larson. All rights reserved. +// + +#import "GPUImageTwoInputCrossTextureSamplingFilter.h" +#import "GPUImageFilterGroup.h" + +@interface GPUImagePoissonBlendFilter : GPUImageTwoInputCrossTextureSamplingFilter +{ + GLint mixUniform; + + GLuint secondFilterOutputTexture; + GLuint secondFilterFramebuffer; +} + +// Mix ranges from 0.0 (only image 1) to 1.0 (only image 2 gradients), with 1.0 as the normal level +@property(readwrite, nonatomic) CGFloat mix; + +// The number of times to propagate the gradients. +@property(readwrite, nonatomic) NSUInteger numIterations; + +@end \ No newline at end of file diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m new file mode 100644 index 000000000..8ed25832a --- /dev/null +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -0,0 +1,325 @@ +// +// GPUImagePoissonBlendFilter.m +// GPUImage +// +// Created by Ian Simon on 1/29/13. +// Copyright (c) 2013 Brad Larson. All rights reserved. +// + +#import "GPUImagePoissonBlendFilter.h" + +NSString *const kGPUImagePoissonBlendFragmentShaderString = SHADER_STRING +( + precision mediump float; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + varying vec2 topTextureCoordinate; + varying vec2 bottomTextureCoordinate; + + varying vec2 textureCoordinate2; + varying vec2 leftTextureCoordinate2; + varying vec2 rightTextureCoordinate2; + varying vec2 topTextureCoordinate2; + varying vec2 bottomTextureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform lowp float mixturePercent; + + void main() + { + vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; + + vec4 centerColor2 = texture2D(inputImageTexture2, textureCoordinate2); + vec3 bottomColor2 = texture2D(inputImageTexture2, bottomTextureCoordinate2).rgb; + vec3 leftColor2 = texture2D(inputImageTexture2, leftTextureCoordinate2).rgb; + vec3 rightColor2 = texture2D(inputImageTexture2, rightTextureCoordinate2).rgb; + vec3 topColor2 = texture2D(inputImageTexture2, topTextureCoordinate2).rgb; + + vec3 meanColor = (bottomColor + leftColor + rightColor + topColor) / 4.0; + vec3 diffColor = centerColor.rgb - meanColor; + + vec3 meanColor2 = (bottomColor2 + leftColor2 + rightColor2 + topColor2) / 4.0; + vec3 diffColor2 = centerColor2.rgb - meanColor2; + + vec3 gradColor = (centerColor.rgb + diffColor2); + + gl_FragColor = vec4(mix(centerColor.rgb, gradColor, centerColor2.a * mixturePercent), centerColor.a); + } +); + +@implementation GPUImagePoissonBlendFilter + +@synthesize mix = _mix; +@synthesize numIterations = _numIterations; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImagePoissonBlendFragmentShaderString])) + { + return nil; + } + + mixUniform = [filterProgram uniformIndex:@"mixturePercent"]; + self.mix = 0.5; + + self.numIterations = 10; + + return self; +} + +- (void)setMix:(CGFloat)newValue; +{ + _mix = newValue; + + [self setFloat:_mix forUniform:mixUniform program:filterProgram]; +} + +- (void)initializeSecondOutputTextureIfNeeded; +{ + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + return; + } + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + if (!secondFilterOutputTexture) + { + glGenTextures(1, &secondFilterOutputTexture); + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + } + }); +} + +- (void)deleteOutputTexture; +{ + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } + + if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) + { + if (secondFilterOutputTexture) + { + glDeleteTextures(1, &secondFilterOutputTexture); + secondFilterOutputTexture = 0; + } + } +} + +- (void)createFilterFBOofSize:(CGSize)currentFBOSize +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + if (!filterFramebuffer) + { + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } + } + + glGenFramebuffers(1, &secondFilterFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); +#else + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); +#endif + + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + } + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + + [self notifyTargetsAboutNewOutputTexture]; + } + else + { + [self initializeSecondOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + // if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + // { + // glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); + // } + // else + // { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + // } + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + + [self notifyTargetsAboutNewOutputTexture]; + } + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + + glBindTexture(GL_TEXTURE_2D, 0); + }); +} + +- (void)recreateFilterFBO +{ + cachedMaximumOutputSize = CGSizeZero; + + [self destroyFilterFBO]; + [self deleteOutputTexture]; +} + +- (void)destroyFilterFBO; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + if (filterFramebuffer) + { + glDeleteFramebuffers(1, &filterFramebuffer); + filterFramebuffer = 0; + } + + if (secondFilterFramebuffer) + { + glDeleteFramebuffers(1, &secondFilterFramebuffer); + secondFilterFramebuffer = 0; + } + + if (filterTextureCache != NULL) + { + CFRelease(renderTarget); + renderTarget = NULL; + + if (renderTexture) + { + CFRelease(renderTexture); + renderTexture = NULL; + } + + CVOpenGLESTextureCacheFlush(filterTextureCache, 0); + CFRelease(filterTextureCache); + filterTextureCache = NULL; + } + }); +} + +- (void)setSecondFilterFBO; +{ + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); +} + +- (void)setOutputFBO; +{ + if (self.numIterations % 2 == 1) { + [self setSecondFilterFBO]; + } else { + [self setFilterFBO]; + } +} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + // Run the first stage of the two-pass filter + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + + for (int pass = 1; pass < self.numIterations; pass++) { + + if (pass % 2 == 0) { + + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation] sourceTexture:secondFilterOutputTexture]; + } else { + // Run the second stage of the two-pass filter + [self setSecondFilterFBO]; + + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glUniform1i(filterInputTextureUniform, 2); + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + glUniform1i(filterInputTextureUniform2, 3); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); + glVertexAttribPointer(filterSecondTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation2]); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + } +} + +@end \ No newline at end of file diff --git a/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.h b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.h similarity index 81% rename from framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.h rename to framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.h index cd29a4660..bc0492ca7 100644 --- a/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.h +++ b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.h @@ -1,5 +1,5 @@ // -// GPUImageTwoInput3x3TextureSamplingFilter.h +// GPUImageTwoInputCrossTextureSamplingFilter.h // GPUImage // // Created by Ian Simon on 1/29/13. @@ -8,7 +8,7 @@ #import "GPUImageTwoInputFilter.h" -@interface GPUImageTwoInput3x3TextureSamplingFilter : GPUImageTwoInputFilter +@interface GPUImageTwoInputCrossTextureSamplingFilter : GPUImageTwoInputFilter { GLint texelWidthUniform, texelHeightUniform; diff --git a/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m similarity index 71% rename from framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m rename to framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m index 91b306969..246ccc2f2 100644 --- a/framework/Source/GPUImageTwoInput3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m @@ -1,12 +1,12 @@ // -// GPUImageTwoInput3x3TextureSamplingFilter.m +// GPUImageTwoInputCrossTextureSamplingFilter.m // GPUImage // // Created by Ian Simon on 1/29/13. // Copyright (c) 2013 Brad Larson. All rights reserved. // -#import "GPUImageTwoInput3x3TextureSamplingFilter.h" +#import "GPUImageTwoInputCrossTextureSamplingFilter.h" NSString *const kGPUImageTwoInputNearbyTexelSamplingVertexShaderString = SHADER_STRING ( @@ -20,26 +20,14 @@ varying vec2 textureCoordinate; varying vec2 leftTextureCoordinate; varying vec2 rightTextureCoordinate; - varying vec2 topTextureCoordinate; - varying vec2 topLeftTextureCoordinate; - varying vec2 topRightTextureCoordinate; - varying vec2 bottomTextureCoordinate; - varying vec2 bottomLeftTextureCoordinate; - varying vec2 bottomRightTextureCoordinate; varying vec2 textureCoordinate2; varying vec2 leftTextureCoordinate2; varying vec2 rightTextureCoordinate2; - varying vec2 topTextureCoordinate2; - varying vec2 topLeftTextureCoordinate2; - varying vec2 topRightTextureCoordinate2; - varying vec2 bottomTextureCoordinate2; - varying vec2 bottomLeftTextureCoordinate2; - varying vec2 bottomRightTextureCoordinate2; void main() { @@ -47,36 +35,22 @@ void main() vec2 widthStep = vec2(texelWidth, 0.0); vec2 heightStep = vec2(0.0, texelHeight); - vec2 widthHeightStep = vec2(texelWidth, texelHeight); - vec2 widthNegativeHeightStep = vec2(texelWidth, -texelHeight); textureCoordinate = inputTextureCoordinate.xy; leftTextureCoordinate = inputTextureCoordinate.xy - widthStep; rightTextureCoordinate = inputTextureCoordinate.xy + widthStep; - topTextureCoordinate = inputTextureCoordinate.xy - heightStep; - topLeftTextureCoordinate = inputTextureCoordinate.xy - widthHeightStep; - topRightTextureCoordinate = inputTextureCoordinate.xy + widthNegativeHeightStep; - bottomTextureCoordinate = inputTextureCoordinate.xy + heightStep; - bottomLeftTextureCoordinate = inputTextureCoordinate.xy - widthNegativeHeightStep; - bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep; textureCoordinate2 = inputTextureCoordinate2.xy; leftTextureCoordinate2 = inputTextureCoordinate2.xy - widthStep; rightTextureCoordinate2 = inputTextureCoordinate2.xy + widthStep; - topTextureCoordinate2 = inputTextureCoordinate2.xy - heightStep; - topLeftTextureCoordinate2 = inputTextureCoordinate2.xy - widthHeightStep; - topRightTextureCoordinate2 = inputTextureCoordinate2.xy + widthNegativeHeightStep; - bottomTextureCoordinate2 = inputTextureCoordinate2.xy + heightStep; - bottomLeftTextureCoordinate2 = inputTextureCoordinate2.xy - widthNegativeHeightStep; - bottomRightTextureCoordinate2 = inputTextureCoordinate2.xy + widthHeightStep; } ); -@implementation GPUImageTwoInput3x3TextureSamplingFilter +@implementation GPUImageTwoInputCrossTextureSamplingFilter @synthesize texelWidth = _texelWidth; @synthesize texelHeight = _texelHeight; From 38917803cc757ad83d6fff3730e0b0eaed975309 Mon Sep 17 00:00:00 2001 From: Ian Simon Date: Wed, 30 Jan 2013 02:17:17 -0800 Subject: [PATCH 326/695] fixed poisson equation bug --- framework/Source/GPUImagePoissonBlendFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m index 8ed25832a..e391b838b 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.m +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -49,7 +49,7 @@ void main() vec3 meanColor2 = (bottomColor2 + leftColor2 + rightColor2 + topColor2) / 4.0; vec3 diffColor2 = centerColor2.rgb - meanColor2; - vec3 gradColor = (centerColor.rgb + diffColor2); + vec3 gradColor = (meanColor + diffColor2); gl_FragColor = vec4(mix(centerColor.rgb, gradColor, centerColor2.a * mixturePercent), centerColor.a); } From 8221cdf18a26b394757a6ab749021f71eeb847b6 Mon Sep 17 00:00:00 2001 From: Ian Simon Date: Wed, 30 Jan 2013 13:12:16 -0800 Subject: [PATCH 327/695] added comment about number of poisson iterations --- framework/Source/GPUImagePoissonBlendFilter.h | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/Source/GPUImagePoissonBlendFilter.h b/framework/Source/GPUImagePoissonBlendFilter.h index a108f55a2..5d3c378df 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.h +++ b/framework/Source/GPUImagePoissonBlendFilter.h @@ -21,6 +21,7 @@ @property(readwrite, nonatomic) CGFloat mix; // The number of times to propagate the gradients. +// Crank this up to 100 or even 1000 if you want to get anywhere near convergence. Yes, this will be slow. @property(readwrite, nonatomic) NSUInteger numIterations; @end \ No newline at end of file From bedf6dfded44c94103f4b6d8fd7f85e2b59b5916 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Date: Fri, 1 Feb 2013 11:08:06 +0100 Subject: [PATCH 328/695] Removing warnings under Xcode 4.6 Signed-off-by: Daniel Garcia --- framework/GPUImage.xcodeproj/project.pbxproj | 12 +++++++++++- framework/Source/GPUImageStillCamera.m | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 1d6d04c6e..3ae9bf0c9 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1345,7 +1345,7 @@ BCF1A32B14DDB1EC00852800 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0450; + LastUpgradeCheck = 0460; ORGANIZATIONNAME = "Brad Larson"; }; buildConfigurationList = BCF1A32E14DDB1EC00852800 /* Build configuration list for PBXProject "GPUImage" */; @@ -1618,6 +1618,10 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -1631,6 +1635,7 @@ GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 4.0; RUN_CLANG_STATIC_ANALYZER = YES; @@ -1644,12 +1649,17 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 4.0; RUN_CLANG_STATIC_ANALYZER = YES; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index a76e8dd11..a86e68085 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -242,7 +242,7 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) { - CMSampleBufferRef sampleBuffer; + CMSampleBufferRef sampleBuffer = NULL; if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) { From aeb7329b5479217a25255ee32b4f71f4001d1165 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Date: Fri, 1 Feb 2013 12:06:48 +0100 Subject: [PATCH 329/695] Removing warnings under Xcode 4.6 Signed-off-by: Daniel Garcia --- framework/Source/GPUImageMovie.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index 92e7e99f4..c4c97a58a 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -27,7 +27,7 @@ /** This is used to send the delete Movie did complete playing alert */ -@property (readwrite, nonatomic) id delegate; +@property (readwrite, nonatomic, assign) id delegate; /// @name Initialization and teardown - (id)initWithAsset:(AVAsset *)asset; From cef40ae655355167f489079a19b43c30c2f69058 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 1 Feb 2013 18:33:47 -0600 Subject: [PATCH 330/695] Beginning to add some icons to the project. --- README.md | 2 ++ examples/SharedIcons/Icon-72.png | Bin 0 -> 5046 bytes examples/SharedIcons/Icon-72@2x.png | Bin 0 -> 10229 bytes examples/SharedIcons/Icon-Small-50.png | Bin 0 -> 3413 bytes examples/SharedIcons/Icon-Small-50@2x.png | Bin 0 -> 6901 bytes examples/SharedIcons/Icon-Small.png | Bin 0 -> 2666 bytes examples/SharedIcons/Icon-Small@2x.png | Bin 0 -> 4210 bytes examples/SharedIcons/Icon.png | Bin 0 -> 3875 bytes examples/SharedIcons/Icon@2x.png | Bin 0 -> 7538 bytes examples/SharedIcons/iTunesArtwork.png | Bin 0 -> 45855 bytes 10 files changed, 2 insertions(+) create mode 100644 examples/SharedIcons/Icon-72.png create mode 100644 examples/SharedIcons/Icon-72@2x.png create mode 100644 examples/SharedIcons/Icon-Small-50.png create mode 100644 examples/SharedIcons/Icon-Small-50@2x.png create mode 100644 examples/SharedIcons/Icon-Small.png create mode 100644 examples/SharedIcons/Icon-Small@2x.png create mode 100644 examples/SharedIcons/Icon.png create mode 100644 examples/SharedIcons/Icon@2x.png create mode 100644 examples/SharedIcons/iTunesArtwork.png diff --git a/README.md b/README.md index 76e9b3406..af16d8320 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # GPUImage framework # +

+ Brad Larson http://www.sunsetlakesoftware.com diff --git a/examples/SharedIcons/Icon-72.png b/examples/SharedIcons/Icon-72.png new file mode 100644 index 0000000000000000000000000000000000000000..56129fcf9eabe0fe3a1de90c299d9ccc6446526d GIT binary patch literal 5046 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 literal 0 HcmV?d00001 diff --git a/examples/SharedIcons/Icon-Small-50@2x.png b/examples/SharedIcons/Icon-Small-50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..209a15905962ab5b2b628338681f050d149db272 GIT binary patch literal 6901 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 literal 0 HcmV?d00001 diff --git a/examples/SharedIcons/Icon-Small.png b/examples/SharedIcons/Icon-Small.png new file mode 100644 index 0000000000000000000000000000000000000000..29dea6cb30b3955226e694acf07539d807660d2c GIT binary patch literal 2666 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 literal 0 HcmV?d00001 diff --git a/examples/SharedIcons/iTunesArtwork.png b/examples/SharedIcons/iTunesArtwork.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e20235e859f1bebc6f8696896c88a03901704f GIT binary patch literal 45855 zcmc$_2Q*w?`!;;WXwe1{Ef_?U6eD^coeB8xMdM!p?^c($!qX)}VK_wOk|UP}BH`i8vfegQ7LQli&H#rc(KczJmh1Dsvu zjWx9XH5~k=#P1#yg_K zF~q-RgF_WhTjfmyT>{koe0*GdgOt@Bf?VAE0>b2ZO@lnVJ%T)30tGLGswx<}c)K_R zx;XRdI{5O6UAw|7E_O}qZ;y$Kx3^1xJgwj70?Qt4$d2a__HzoeitIjU24tKqS z`2YWa^%Nv;kN-6DA4vbxdPT(lsk@3`k5hn)Ly%v<|0L&BxQWZ1|7`tl5R}yd9GrP? zI0OXx`TnExe{acuiuh~E|EllQiU1Ec_n^T4RQLZf5`O++f2Ez$Q-b&Zp`rg9$o|u$ z|If(k@9r1m7wGQi|8LIz$29(T_y0PV|J^08x2{Vc;=#{C zblREeT2`Ui*xYMmIs&ug)4t#MnU?`FNGvQD21gwsPeOP2j+eU=hmGRS=T0^3&J2EUgV%CK z-Wb9MLYj^ugF{o0Ny9yMO85F+H$I6_0o>dDiFllh|pIM3{Z#iLc+F&n@b z6@xxWKyPmxp^2-cc+wfBR&{BE+9$lTJt6R>(37MryPVh6xS_jI$Jqw3o}BASZ989k zc=zchzCK1#?g%7rDuwUw^mpU}YZa!Z8`mG96zWLp6YY^RN}Unf8OXZ*`W`j-ppAI@c@s6#w+;);|rfR_Ng)PiL zqnh6zXUE$zPSec z?A8n~B{gdI@F4eiX1Oi=)<`=O319HqQ;+2e!-rx{PIlKP=Kl$8;}B_Y$GmvQ-nWN= z;)sc=+%K$oLi@%27HJKs;yXCl;XG(W+YaVMo0#&nBPVS*`fp%FCk{WrXdTT2@d9u0 zfY&24@%erBg!+f6qZeJnlyojR1^etzD}7cd_XIZln6cj#N>=du!%DTd#q73_p!qqT z-;4iJOTB?$ut!8SKXn5+xP8NvjpF={3>~emQe>!7-l7c_-moAy4@;#I}L> zI2B{eleLG@6hM&blNk!YdT;N$FZlsU9z?t`basw78BPC{Ah9V-641W70e?Y7d=!3% z^bukE>PO5czFM3thVTPwb)}WSZ*w6DYcO3<8$hP;mRSXn8jAX6(lrp88>Ko?|3>TQZX6gB#D!ot=RQY`5$8 zbX8gU_ zKIb+AJyKX%KOikzFGQW)T=KN*>9IE1dk6yJBxq^}YJIGT>Bj!i>rkuk+)A?8ohjG# zbKel7+>Kv=IobQU6R(Tju9y6r8c`&c0TKH+6PA;7vXwl=WVm9KDpgX%z~>&!ob+n6es2OURERY6MMoiz?{7Dkl=$uqOopG z5w9Cj(oR$@(4+4@emGJLa!Bz<;1^U6%;;%^y?n#na5G2cN{t&OtHslo1Bo zE6ZJl+y*$uAF1{AzMPA_!-_QbwIM2Bf^qoy_Q0A#$hhiNF5uUQ$NR15NaqlpuZsaq zTc??muL8ZW_V`A`eJG=48svf{PxV7H#h{*)D9<|km6JoxX zo62;uD1Hm5Si9C)VIHeI(ow@>`LTD0m+W�rj+)O%V#e^S+l&ji=^d|2UhxHHw$+ zG7`w$-{x6;k-%p?DIBq1IA_9z=~z*o-nigL-T(Fn-~Q%<4#ns0=in)Fbb~S%T*;0; zx22W1CM3w+ptRh26q6LNfH_{nRpv5N-Xi1t88eH>+2+vRoYc0%Qf?mpPE=EBpru?p zx~8DKxbx{i_!V-tRN ztvyf#ZXc{!$n&mxLu&rBpw+Ph2WA{{08y=qAG4>vffz4jxfEB-wlei6Z1XYB7t2jE z`sL;Oh?<7X5(JuM^Mcx1?q1Zy{_&3XADN2^%Iy&Bb9UM+YIJk=`;A+7)3za*3E4Ex zo!Ix+`f06yLoJ+8&#*csD{G#V$%AIsM(Q5~6;PodYteNEynjYn@Tnnvh)Cz0Nv>oAxH;3=Ek^i8* z6WFlN)QLhf-2v)Xp$}$YdCjfA7Q>EbyT3f#=9Fl(UVvHzqSzHi-0~_dBXFdOe`L~z zHJcqmeNkZ%d5v>DP~bh({V-OGV<>BRLLA$WpiKjnWU&yZ7`h$NALo!`}LX*UVk-dw+f!y0Mvl1eoQ(Z7aiqZ2CHv zj@4qPUX_8vNk<|bsMB1oxd@3m^);Z)lB;izr|FLcsyqHBYXF1f`|`WWfW;kDsFGXY zla~_p8M&Jboff3Ig1L4_kz)c#z8k!-jw>5T^pWEiN!f0>0s4a%T32wv>O!UR|3#(Y zKxrWkc_%$*D!J@>(xF=l0bD3)2>yoVD@lkon{m?4=u>*jrrUK1w}sC+ft4eH5iB7Mc-PT~xwHI*P;Zbj&B|4k%aFq1l z{B8U^X#bI!v&2-V|4=v>y9>KN+JX-OGtOnJ{!#BcOG(UbP~bBjOno9oS%;j2tLtF| zN)iWidoH=XWtZ@#0KECv57%sUw`QD9ts0+=1~{qNhmb(QOi<1Gd$z9kZmA(@FyLmN zVqMxx37G6X$hreR=+u`OjG4AxjokC<7e>LNc#xmAwlI`=c)Ub1?Jz|AG^8o8hv>3@2X=_)0=z9a709fNc_^D*MxT@8EcF5l^5M@D%#8at)`ZGfm_77| zYrVSLs;c#=iCTJOW@@JKSM%?(08kxBmU(M)EYG5>_0=Y_UxFhGAU!8#_-g4QvqH+mrpJG z;A08>@78i2e}PlDk_7BEt298U7{b@2;mw@Qk5B!6%$s+vmw5&%E4Nf36bTpujG$)_ zYMnzsVHHBT*qudz+dlKYSlyFGdM#; zPQZJUXCmMqsbs@LU|)S@`MmPc%`C4p42Bv|sO%eA{Vc-IkLawFRo^eo%J^U~Ioo@r zU4irHX)S_RPcm(5^WAf;5szf4IileI#q!|I{iKe;`y9Hv%!tG%E?C?S6f)rlZ!c;=bVdopAU2or#p4)F6;?&lOy~=?4r1z7!5myn=;_Hh23)#dv!b6#)6R=g$m8i!WG+QPNnZS|}TnlS~0Zs5j~heO+W z`u9gLtG2R& z^5TIomfdB?Z^3Al+hGu8peA`Ga^QohZE!mP-?eaEp~uQEB}!4s>V!9VhT=1N0Mpj%iFhpm1Zy+epLNd71`{}g>fUC;{}A9(L@-j_r%oGgn#vR z&vrGF<*Jv{l|CdXf%FEDOvx&OJ+nCPZauCJB^w!Hh~UsONx@<}hGvao3YjqR@8lfS z#FeP*^&YV*FA&qG1jXs285@O2=DkyAqt43PU!InVFWO`xG!BOJD*mh@yBsfzc^XfW z-v3I;BpArC<27cxGO4t%Ln}eqJLMLIz-)=$MZu(8RC=fEqEK#5yA@qf!3^>n1(Yg2 zPwR`HXZFxQq9yq~Cs_KbhB$PFB_Kb|{{f`Fy>%%s`b&GEd^|Yz?3?>pMSI%=I?qVIuPUJMvetV6;y>gD9 z1;J{rR{9iAm&qKjPU}P8knxtSzs|3&VM9x1R~~2}{d%Vi2&p9MUV(_@rOi*M;m2=S zgkNRo4U)g1*VXSI)fRgt2UHch8k5Ck1ds;rdJ)1#5OG{496Hde8{cS-aRlx zY9zd|e4u0U9GPRrX1JO=7MC(&`-PHpW>vcP2NHz?&1o85n3*Te5i<)C+te9Yk zUKbb58hTe)JP2S@e5ig*H=GQ+{}jUKZyv?7tevN4)rH4~RNW&pO|^To07)A<(Y$TD5RN4zu8r;|5Q zkT=p2%ey5%HU8xVyWy@Tl7h(3Z)iXVDgu|QV(m8m^|~|$kNpuRreNnIN_&BETJ*W7 z-rTxZ<4jaP>x0|s2Q=+=&Fh{tGBAQJkKCW%k-A~GR&H?kI935@{o)T2i*REDri!qy z^5(@K7yHR1U#Apv9e{5fZS%L>3Q1W?R2Had)Ly=*VYe%BtlAD?c|e_cVjnu32ln6! z*T27BN+ha8-2vvF9lLMzOoUcZ3WMgu%g8kfa5v};cMr_$Jb??=q@|zej7DV zvc#sP2>dLd``F*yZr8wwjQ5l=1BMo!2Z^8&47^AM3W#c*!DUVIjxO1JTn~OSj@t)n zupZAsh#H!rmnpx%z`K%ZazTyHycP@ys)N8?&A{;v1VKG28l(Fj5_+CLLgovWh+0{E z8_Cfpd^+v!04|m!TV;$e;VI~`vyfWB0m!?}`12!ia+m?lNj(}c8eo;6888MXra@F$ zwXv?()iD(z074Ij<={3>=5rV6G^7ZIJl=kIYg1T|#qNP6GVmg70z@OC6s+%v-&EV5 zOGMqW+n-1z>f)g|*ZHnpFW_w|phre@X!<%=put(a=+>A?8f2FPLJirWzmZJe;KG1nov}H2=o%vX{fPPI36i4N@3A zZPyO*9$bnTn=DvHcTk*CnUH;nGW-+nG=@Qtbq2Uf2|ME;Q&cbP?lv_-P?{XX+rT_H z1;*P6dp<*b8cY}>;{AjIUg(s*EN+F)fQu@r(JLDCT%z~(rj`9)$2F;i4r`v=iwUa) zS==PU?tPJh3Z&3xlHN!$9dA}voOATJJSaQDi;q`}Z7nSW9IpDHSu+~h%aG#F*W<3G7xou9EkN;z57zf7&2}~IxK!?^VOT`D2qz$am4bxhXtfCm zpeuzgY`;_<#(JZVx*78k_@BeSGe*flOmI-u9Z_dsaxpcNjxnm&0HVs*N_&6b|1atF zgVULkFrc7>C2c2pa+auGcs@uQYN~0weex6w>I)#`2IN@aew-L6Q{gH38Us1YlPXPG zDEKwSmUd?Tn2+%aJ|EV?{CK(Z(H121*fzcr`k-kk!O5|06mpu!L-Ht=mhI4{32v~E zGks4^W6u0H=0d%>>3gL4*SUl1e##2ZYGECl=mWFQAVS(~nuYtgh|7+rE)tfl(By`L zrA<5CZvEZR@Jgb4a>i03>e;dO>0vSG`+yS~;05AkJ`)QyB2p*Pbr-KTD`KUFySZ}zBCn>_6Vf&Pu$UT$eDfPgVsnb+bjJ!Gy z|AoaBLq=``)Hjr-hh%bZc2GI*;}SlhQFaYWn=etWq=;w7iwEtAM4lA`+5^8e<-6B0 z9|nOPTdciww*DI)dxUFQH9F^YV;qh)QL|>2P8ahUf_AKGiAq05e` zZrMOEC6|UFYb%1k_??MFotv%8?8JTC5adk>8L)Hl;ETJ7OXRIfwP?pH7<~@FaL^_gqpU_g@}26mL_YT+3ZuX8^Ki1rZ}J7se=Q;?YR4-|%tW`i#5j#i zLvoPgI`pRHqtB4%v!n({m5(=X$fhdz>u!Ad8dMFxxzzVnSlQ%W(~;R=rKQcVMR7@qA>Snm%o_}~ z05pZp{s9NTlt%_=yfSn!HMJnyJ~f5+-m(CUuPPA>nf*wtqi%kEx@$t<~KYFeUp%T>$3o3z~d z=dmot;`v1UasT7?-iqh3CQuBuQD)Iu(6#08A?IdYk%%@)cU3Z}IQFLoa(EYhWJ7Vn z98qxp;}D#VFKG{AZgmA~;$UR}`q9}9#WEUsanG*VmZhy~-#PMG8G};tI}zSmKGc0# z41Mcsl+fW3b%#|??#$}|M+l>88*{37qu-mfkXP(7Kw0%eaHLO-AtApMSN3OnA=h=! zAm(I5dvHHzOR@P2u|ru8c+>gzjCMjz&hKWz?*{wG+fl1LB_(RF%8lQomSm6ps--7) zF{T0Us!cu+b*M3KGH6R#nBQ=^7Z>+&%d?ENv)KMRF-Ne&jd0B)xaC8EX$p)qN1_FK zIyFTRhLPT)oANTXP~w$eg)MVD?Au+Zun!kVf?;%-q#MtYlk1+L46>Tab-F4vb4x>n z%=6bsdKTb*pED!8IJ7GDLy3rjbr#B~0(otV>X{I)XE;i66~-e}{s%(tzc=S)a}6W! zX8&ShH=cDC+S=(^H7MRjRD9Po^ouSh8*LaMr=NkSSV04!*(xLd3YLYvnwlVu?DMveeqY_-Qa=Ym{K!TW|mCQ4DwMNaV< zwDxHt1YZt3!?U!1i0;_GL-WqyQG zRtSw7a$&<4=hq_IiA^5Kt3X=%3#l{MihblaQE?tIV`*1sLwlm8+_7M^i7R$Amw%TsKu&<6o!T z@7w+Qfhau<*1Ju{HmBH*apAj!D1KvVf2ma{5#QFvX7J*OUhCo?s@R7zk*boo$DRWs znz;faY@;6i$xX#^7IXBJmoxN+;O+R=`^Qj>Zct=h1u2SOjlBP9A(3vOV@@$xVei)LM_@HH~0$x(Bvp4a{N!8zPqIw;jpnvC#9on&0n6)>M$Xa3~Vy zSH9{;@97n>E7YwbF=pLcR7tZ?<5g*HwKwe7y;bqQr(ZkDXao!Ghv3E;t!p0BNV#|*qHCw& zoNP?yY7nN#VpGp*yD-1xC%3HU((eOvC(y3j!h$Y9|5Q&@Nf@0_&vpB9BH5*MW9S*!Y*h-$l<8v9paI+?%H_V?KG(U*ouD7NED zd3l8=FDq~if!JRcfbu;xONI2p=ACfEiLMf%Rs(qV5Al4P8F-i6N z2nvk)V6D-*-%S<9u8w?b=Y{2`(+kp+#g=74%@4dS?Y>8M*p5cMXBn@5@LD*^?^o{a zi22y|HJHXDse|vlJx>q)H+7E*P8~3p04(RdcP}Jxn_z`IQOYNBlxqhEjwIH**hNNc9_tQ; zbA5Ptgu1>RBL$I$J@0cPf6cJ~XADD*>LT)yc~Y1a-3_754+q|FWw6#oP1ug6ix3AY zhQhE~nt??#QJ(f1AMwkhb-pYenl5<|6s09vKkI_<^u24?P{L033K70}l{GQayeE(2 zn%9&i2X9>5D3U2Ar~$4c3&Y-XFQumQ)fYK;C!+|VrRtnZP{n4s-rLCEy3U?zR-mDV(BYzwK{dpXsBodp&-(#H|wf@B<=vwN3BRR2=fHj|*Rf zuDzo^rfZ;^4*Qg9p5*Ajq3!tXqT1Xl#jh~KCgCWi$2l?wVJQ=|jkLo(1uQ2CP6{H{ zY?PmUsgcwN!-dy!)OlM$(Kf^_8bBCuk8E~i`tqyctq>BvH4NubCLLMIm^PP}ZFTR! zVSO#8&tnHSTxP2;&OX@#sZ2xmVD^%cRI=I!-l!zLv)_}9FHvu(OEufnXaRfP!K!e^>O zgl$ysLhk2#tvBja2x_Ic^#g-Dv3#e|iXB4E0<|!Vg?SH{BaEJCZ=@^PYEkdkv%W#_ ze=r})Mfm>VzmuF%VL?!HL^n+#e^Yx!px(v9(0_i1H5C4whg7`dVQ+?)&(mS1I)bL1 zN33*zvN4VJ&|$O#G8vxt?dqwbnzcxL+U)VQ=+jLt=*Z2-b%!nU4Y27j;KNws38cV+ z^k(Ztm*Xi9zV0S`l-N%_a8EBnmh2_39Z=N_a4?y4^dt)Pz)6QG*nx)#-#t9=lxoD~ zZrc%5>-r`2wk!vdh&DKH4FuXAu~p-q{)AuHALe*e&U%2$!V=(FUkoX*>X8^+Iu?Q8 zR)Cd{)M*YDa5coOCfYELjtOAwL|%+`rv#tNM?To28v1jFPurq@=V>_+seCWk$=YYK z8`P;p7E0K4>7k0IZyI?iHH0Bki5GyuK z|AoJB|5)8*uQBs80Ug=VZ9JjaZVv}6iI}&!w-w|FdIKLWFfj@1tB@zYvRXNPJmqWA zMhu^fIBTrL^6GR}Biqpa3agE0!d_@)yhUflicRXUy~nAgUbqr-j6@L+za~t7pcQsJ z7sF@4NPYt0mSkD0iW#w{ShB`uSwI&zMIN;O;yH4>#Dg$9&1yz@192uzC{#~R=i5z* zG4)YS3YuRi{2dY;E~o9~2{e=i8Y<-_BQa{~2J1Lz1`=ioU5p=Ve(;W!diF4aJqpY< zr<|BdED9@7qOxwid6K_7hi$)J3h%je+m*eZMYwVb=|g~Xj>Y(1#%=$SXZjOjH~#$y z137{C%kLs4m5mUQ8y9CD)GTHcfTD6anwzzb1NID}83hB;C>;9I{-T2Fk;L2bG7|^1 zpF0AL@mij}-d(bbcw}-tPbJgnN{4vh!*{1ci;$A_BG$Kyh#ris8rBfqo_K`J^rI_~-A>0WEc&>^cIQeob)?LYJUPc6P-7ikwVRJ0Y#V*m0F5Lg9 zSg)AgWPyIH^c`q@5#IA-;eOqh!Oazjh}yHE@2~cWR9+-LKMLk!!k>`biH6kmLrK@l znOA&Y-|*kNmlE)z(H+Seq^P~sdohSR|43@KpV{49+~0q%%|P#w84w(P|9BY^#x9-_@qHwPE_=Z8$L4PJQoPv&)Q!&|q>cOv1=-ou-Gv0{(* z(0vvpMX8a8$nhrsJ!8TS4E7Fm$H8y&KP zY0pI@1$zh}#5yY_;-d#@@vp8YoT#ultEp7 z-}pT-|MG`ReHSXK0n+llz&Wu$TUfR;oxO`+?b1OzW{3=HQ0~J5#T^0)5XVO?Sg;b{xp6ePL!pFFfODN~fu>_CF z-)W9)#tz{!;xE>PS4x7{uqX+FSW^5eXF{tZ`rZ{O_GAJ#RdbZeGldc6Yb^IE;tG8g zy=bB9;-|@|pFUQg*o^O2k!2Q&qXM09tXIP}jQTbqC1 z1Kwu8wAoYNX!5wyB>4PeVU?p3asO2FSz1nJvyAu1_&q zKz{xveeebDV`%fA<2m`gkKh(Ux(tfwHn{(JlK-)!MKh)`Ur>!-0MLK%uf^ZVBpNR| z7~MZ=R`w}pujE6)>L#kz4fj?vz3%Q~IOKft)I22wk+om5E)#O8{c@zOX)qUIh)NPY zp?qNk@Dz(1@gi)ZBR&$Rza$vI30eD)Ai|FIe)dR%y7%z0{oK9QG+6P+j9riW=a`BI zf6ho7D%%VyIJu-H_Dx+Z=)twPud{1mOm*0Dn-qt+@zh zt^gxPNmGgvl(6tP?=JZGyFG$&6?a7&{dJ$rA=^~F@@AJs#Ull1_Qm*DTw7|0#0U8L z*l*3Hu_M1O=vSThzq%KW9WC4k~M; zul0#@a=-xjR&UNK5C+E#BXJI+u;)d*YugM{o7JR%m>1gB#;;W(UO!Q(Fx6+=wF?-T zpsi?2qjOqLa9UD0dw4mHI?oV-QIkwOr@sk=-$|4Org?pxHuP!y*o-e3>U0w@RT9d8 z<7E!snvj<&gpHMjBzu-Wt42CPnGlVaFGdJAhmn^7I#txd*T90QEy(T>hJkjrgRZ@q zqeD&p8y)ZdTNs4TK2ZTOR?QJ-(t75Kuqj%m747VRQFGzKsNK@#!;opr2i;-`7}4ID z%TLPpQ80>iU48Ev?K)@3lw$u&nb$L{?Sxl;+$5_h4wGt`G0iahj(qudPOOt=|1n`l z2|0uxgT7hUW9Wc39|BF5tq@P_Jj7Cmib~=B&98fywG;eAI>*ogV^>$DqMtUJN*p+Q zoDIVn>++fD^4Z6AJ`96_E@T)-6MgBG&Z@46zOyH^{xMZ- zMKFumUfxmuZX0!!PDP06II>W8w-b2tq~DfjqesNi(^2e)*p(&MRAe({bhaa8hwJ`T zg$qYL{fVCN+b?S%uLH}y}A@v;%N*iy)kBY?dJ5v$*}PahX^tz zupY*D=~h~a=POTBu#Q1i_I5!5`jpr?f;x|a_L)psCGe zskbXMX~q@~aXv=1EL8rHw~|!7f82-zn_gy_-qp{_6Xd^FB7N~(*;Uahi8Ksf^{Cn| zVea+m>X(`3=E#faaO!YH^(tw5IW9jmVf0htVt5(aUB?Soc6Pc=VHmdku3zQKm;TmVB$3OAowNl9u+TAvDewcx!HU#?iPI8!H+q9n4owq`z*m+^0R+662= z{%!-gmRREexPiB%Br8X*m7PucU=L$F71D7eGd z7KxTZqwCVDgfFmPO+SJ5TWKFx<)0fC<{QW2O}?TT>AWA(7(vY5fZ=$>P=e1Zft6&o zT)T9OrlRE1nyb53y3p56+KL2f3)3{U(%rs1w=4`bLy6T(Gu_LEI?nO@=g4l5>d)Fz zPhRA5F}Czub@tv&)j=W5X-a1&(7~YPZzQK12 z54+CSs^VLwrkABm2BS;5aS5hA%w&VVWaq?mWe=y)clbqJ18?r;mt3L1-EvB; zY7gsId_dgDQ(6BB78a!7KK!R1nziUlP#_uY~o68S{Y0iez=Risat0xWemlL$D{$FsT|U8!gil30K7 zG3C!fsar*>&QxDoc*mSGJ>Oh5!%42#fLLgaYB4%V|<=BJ|W&@v9zoBP2}mbDviZ`=6sd<0n5pvH{4mp)`a zAl`CBFUsT#`u^0gieY^cqmNa)MJeqST)y+}&b|9RDMCpeoek+lcHV2SGY{CE!K(Fz zk-x%@g!=US_si}kUkgE56vA}=KnkyTf5V%c^L(N$p|7UrgPI@U;9t$wd6mT<@rsj- z(RuFmSt_(~Bp{M_8!Ynsf?!{PgCUC$PEI9 zsNBoSOlEIEsTuZ{*uy zL_|6n#D|7Vyla>9IeopJ|H=@u&J#&fuPw8~l0S78^4^m@^VP+g4f@f%cZ;{=C$EM? zRoy)U>I($QV22gopd*ng&Yvc(b8#mxO%!}>3e?^Zb+?ZMCVvK3o&QQKW+dEq1-Qfb zVEWj#C-AG9(+_1af+LdsxJS4>-y3WUA0%ZbW! z-@JZrQ<*D{&dPgjj z0EiUjFR46yP@g0Hnl&yBo>aXY`QZ(Dz$_eH&x@ThNkxTR-EpDe3swU9W^OuSFQ~p} zO5*B!_CvWq73J&NbnTl%P7#la{B73X=IoT}@*?BNc^!E>w!nBrEDy7GV72((Yj5Iu z2Kn`~LhfhfKE3p|-}p%ZyTi<(oxu;KwvmB-G&!~b7n6Junn_e@T+M<^ zf%!RNCly{p^{k<_Iltc9Vo^_+N~OLH@JnQ>{YmMOI+IyjGoZC%uH2NKOn^tBNrU|v zE8tVq7jhwj%TQZf<8dx70>5-!J2K{vqqe%p)Ah+{2*soT`GQfC_=w_9D;(piH?TD}W*rqB3`vX=VIWW2okNL}8JIlXCE%*xGwzTj<06LA;s zCbJE`ebb)-7@FU`yPDm@6B%(psF#)aG8_75HAVTY!>ukQJz0UVh zD<07Zh4yiU2TjBGY9wx|h-124fYi0F7Xde+KKB*cKYRIFOo~QCXhcc0*q`UpawfO7 zPTKS1XaQEfP>n~BHa-qG5f5P`$r7deV)x>vF4fbs^dpUtN@5rXHf2HhBIok^v?P~{)d#~LH z6|0=atPjM)nl++S2A=%7r0;rN-3ZUmAK^l1Ga93YvgvD~nTMttDBO*LT=?#iy(wCT z<}aZ`vS%-I==Os}r?xHl_zyg`rM++OwF^NhTu0M8uN=%eSEzg`cUoib#78uyMM9vP zPqtWt!J^ceRT6$#&sqP(ra_Vos1yWVZ{ye zfkVg}mthzn3>F=#D-oEMcUnU!g7@FBwyo?I*wuSP;M0c{H`~BF6TIJgic2{pcgpP! zYLIU{s_ENp7samKmmH3(54N1Tw;Hd`9W|16x&5joEA3yJ>qLw7_9m~dChoC~T5lzMw9?WR zDX1Rp-SaVhFRZJRtWWo0H)U^TZC@t0WHC86K&jr6tYs#qP~4)q&IucLZiWn>F6+Dy6e7f9pwp*Hzf>xHTV$?`gk|rDLd1;0YMALW>n{C2tbW zf$#rptCBzT$S{nHy*h~y$$xfh;mLRR5yVZcvx@2Ho8u*pnEClXnZ0}M9N4wjFzW0p zeA6bn4<{bILJCA|(Q^j1eKfj)!a4+%-`P)$>4|VRu$a2|jGO25tvM$`3v;Vt)4?zs z9j)5%=Q&_IeZ3qbH=2HYT_Zy#?9oeSkkO4#21IMz`=h?$3ry64og00Zxck(3YKP#m z7c62ZqPs*XZw4XdX`h+EbRwS`JKR;?6;%Zhf*Iwx3#59qA@tEfx*ftMW;!rAh36B& zWysLf6hT<|WD=Q}TM%pc$kD5%9|YlT+q@=l3o(Hl-7wZGS1Nqb?+o5(gi0$vmagD; z3Qs_=zx^GwX!XG{2<0Gc)cP0g_?7Q;SLB#N$O@=F8b0@1<)VqM-eUdaH}DoRVi30j zQAx__J!Vl7cD;Q%EkC0}Z~a!k3{fax(|q`9^Y*ZaZU?&-%=cyO$FlxJ+*~!pH+B>* zk1X7p9n^!9h#`BW47t()!w47;E*wAGTCE44z>~M|t=wC$#EhcP01)e4J2|3+E#ybS z%!xX;=9E(+O9Af(ze9t<0>R#Ac8{9us05KKR71?2F(K6W-GWDaF3SZi$|^wFQ<5b5 z&>a2tmiXt=f&(5xaM12n#%mZ_M97w!qs6`AyEbbtF20(0XRnz@sq438-_}jq-)W`b z#D=w2u)N>k+|d0~x2M<7MrBA&&cc7Gc;mSBw5lTj#Zvb6PS-gTiqWhJ#^n3UEa1`G9+?<56>6xZ z+OygTz0%<6eKDysitc1`jgEDc#MTOKSTR&T{B@4^3sPMVMBIUoPT5$&i5Gqm@fWotKp$E z)y(#c?&3J%-II?-k0^1X;H}ArT2k{bmFE%xK!(6)cU)`CBjaL-+`OHR{RW>AVJ@9V#j@qgGmZ z1R9F~E^6xI=)*08zs1?K^Ewl9{zmR{cul5OXPuQsC&R`O6Q(M=`%h_A3!-Y#$a66u zVOUkc$4$6lclgGXLHk^<<8P1B4d3PO(|2J;FnHu(e;djgj@7^ zPPNH#W9prNEuHearaTgVgfBteT^QD%kvH|Sw*73Y3g;6tOcrjw*8_J5Z>SNPO=Dd+ z^U{yX?Zw-u+fk!XK7L>DWiGo^<@YoCIgCZbIpm4Sk#?pddH;^)0^iI6A<`W6_o_Mz z7^CTB_7>~6KfcF7b6bC#t7{{&$F>2FyJKJ~PXMjqL9 z4NPTvv68yb2gsLdanxAdmsi68GP3;Tb7UF<{p2p59Sc1u1Cup2(jN1{vyDsMzIke; zjA_Q_O00^liZe@GO~KkmOo@EyN=%({scXXBD2pD36?}OKY;{!Cv}a`{uf)r=yX3U& z0N%8x8jm#TEy;hfS2-B;eD_9bk(``73yYETD7*gD*0b?vcyUHxTuhvgtWbObzTemdzMS+Y(t)U?Y|GV?eGGOuRy;@S27J0Lx@X)UP%QO0 z>?XgpWWv7W#;229(%6)_E+jitW=bd`pi@$7;1NaU1*zPPlhA9qJ)~~ZHu`%qxWMsTE zNm_=vu?Rgkls-ECMK@FL9-=4E+WJh`YVnaB7`VxvK&oh-8dnll?7rQ!P0l~B3NJJ*5HowUq1$^;* zLz#6?TFUeK$HmPTks|>{zBD+Q)0;lb%_9l4urhT9vMG2CR#)VKby!j zoj{NTtjy;zqW+F#03Y1^h}sHVWAik%8ITE;-F3$V&ZrU}y$F9t@*ekG0#kn?{BG%6PJIaNeT z+}mDbKL}yn6%~*Mdnf;^wa8`Y+tGo{yK4rU5N&wglL7FEo^8B$HuJaBKSX4}`8>@4 z#%!;bNz{oyir#k@SF#847P0G>DQ*IN8A1t zikj8@)k{8)*E;q9BQN2cHi{!aWH&1i`525-1F)~tbpV-@c;YgEXZm>!z#I0Z?Eask zt)kQbL^f*u5m9S`b`BuV(2{D;-@ZPA22`zrPQgB&^GHEGeCu?SZ81%x=us2LpdN=v zF|J=fefUe0Unu)Ow}uV26%*|i2()zr4D2^;_9CZb4?G39ONjKuY5-{NI)!EY=~WO; z4SG#C&0}KWZFgctCoD~N6-KjX}trVf&xFY z&lgECW4>3mWdyyjTIP}As1-!VtN2D955(AX?C-up3qet8;0s)zwqhY*%dSIe03sXw z{B_fT!};9vjT*tbzzq7Kr!>>WB(L|It&8KmCxJ^XZ6)YzqDH3~so2-w?BSbX_55 z%Sif!VJ1KI41hyj!^vC5it1u*L2X}Ud=9|DShmsz+ASsJH2@l5$i>)-?6RO~%wWwh zsH~B-3;OM^{6+!#ZEe8YCpL8l5S>$2zJ+hQlCa?eIH~nt@fj!q3i(FYP2W79!RGfi z%?ReKf?&O=6v-3%aIZczXwqInT%2S89n|h{L)rk`3(SF$w~Vb%u!9+Zv+fx?21tay zeayish~Yn{VoeAf%-@^03fgZ{6TiuCZ#WwqEc}U}InH=MFBw?>H*3Rc;$TTMp#hT#L5-#DI(KuMB%U6MO*1 z7q~+Xv{^IYYU`T3Uz51vF#o$4T-)(g(g99DI0cMf3-_%n6zcV(WQ_4m+o z3L8E>vS0rLbU$78F9&o^>W_%XT?N4pm{Q?Hm?bN0q@fsq#n-k<=nKJZs<}IXl z_ow#q4_OR12t?_E%Wf0VN7p~Pedm+t8&ur45W(TuGxe-SjM2UK7Xvo=@vmd$$ng^v znom2E56;mfYGH^uoo8J)?I;BVj-x*ptleZiqpK(O zw#Lkv8;NOAyV03EXVYXwu3?SV09Xf5`%-L*gFR%`l5q0d01S*G@*@0zEIxkrdf>3_ zI*HSKHK7<22uKI_rx12sls>~;+}J<(e&<&@r&z;MYn=1h1K*~P?aBl5Bwik%0O0)P z3kPSG{Ye6Ra$s`$H28%coxK`Ezx5D(%|b8^A&l*j41;otU#mM zgd>E!+nsvs-{aIaS)vgs(G6(F)OvAlgg=|g(uXAM0|A>@SiA+lO+DgrQgn|!RFSp} zz@FSD1PEY#Kz-)IIUqs=-HmwJ0&qimL(3)ctCE=Y#`P@++2i#1Y+MzK3ps7|5V~!m zsIj&5?}qNUCEIDs!*p`)hTz2sh@~NX47ieITeiTeYS8MKIy!GgL9xN>XD_TZPxB_~Dbim@%Q z?yuutB^e+Bf1E2wD^CL0_@`I@OE@<0}$$N5mA5OTKb5#8X8!4G2!1@5+T(*Y3 zD*|JeC3Ke{5iE}vVNcCUhH8DXE5B!xC~aye7A_OTsubiSN3^*%P$v~&9wsOXcnB6j z90Z~@P_=D9Hn0vZA8UceFblA^oy~*{2Hp6N$cQKqG@wLde8YvzUSqyztV__JL>@pK z(m`i1O7TB+w}|FP^FG^1y{3O{^Oe|q5E%6VHGr_yCamlCZUD{XEpZembd|(Q1s)k# zG4_4)zJl)#!ES8|D_3=qI5xjE5kJ_!inZLqBp})dlo`Yg8}moehpwVK0gf=^1C}io zW6WYf5Tx97z8SKyV3aCO`<57iVLztS1+6*BUos%!%8`LhvpvmRI&kD4KT8i zek%>U-%g!l`^7|?D?P6OwPLk)4{fBq^6i+JH_rE@{P z;WnkRL?*;nrdtMZCQ)n=7x}(%7SgvK0gEB+zC9QdHhEj-CW&YgoIGe{QAWhwL9IgNg zWMWM89YJCbT>#KIoMo)K+M@4B#tGQ=CNl;Gn`DFG$dUsy`85FI=?PCo;!KhyU_8{D z8DQ+Av|)a;Zk9tiZkX>>23p=8A_OGY>Px)76M{;GL6^6~(xr^|?-^IWHGLWY%3%ci zF@$o`yTFD30#sR*0@kVQ{*b&#WTB)ir04lTt=`EqS0#uC2bOTpCO~ePpcntu( zGs!~B4KsozC)&a@L4z`gg7f#J3r81XaqYfBL_~$45H%tyLPA791xmLr5?dxua&|%N z>8x}YwCv8?(Hh!GD-THF6T%s$uyOUfd0(vyVFUw!zxgk|B(0zQ`s~reUovjM^8vNi z`t`F{wA73n#!y14NSo8z7a$J&bI|xb)DuwDAMkTbK-drhck|HRXMXZ+pw21?2LH!v z7SIa-g=;UiAF$<<6ShMNyUtD?^~Xe^A|z6zGys4GQlJTd8pgeDr6Q-L*vk~aNzFbngY_>3e-EkrYt3^&5~(Y=!Mv@wR~PYxqx`#Cn%b1fn8Z+Sx14!NSe4z2VJj zjj0b+`b~9=U=SGeWCoCcdYtSb<5ZZ#ID7v5AO7af_ka3nkPleQ7pS^x@bK(mJ*!Fc zS7nzUZer`hYCfUQ|0VY80Ivar`{qu)2H+CE*#9{*0#n0%5(dBh;5x+L?fkLUU$sA4 zDP@|bG=M@N1kw!}VA5bDe}6XaaS516gI6b+zDwkLm7^26(eOOn*FT;<4ax&flMyV% z|8?%%xq&{Q=2r3W+?o2I2I`yqK?hvlumv5oUet-P-H_TP2Xkrw{OIwNYXDiOr-i7< zuV6cA4V8I~hj1p^MLsR!uiEIp3;DYrr4&`oMqCA8LM%Xy%}6z2YN67;W&oN%p_jJO z)ZbKSRXyVy(sGrdubL&v;YA(G12T}#5GTQPn()7^4UkLr(nPlHlbk(!c8CwK4uH;{ zKU*Kpx;2|oA7JnlZ>R}3XzdBSFbDIFfgC?T;H-@!*V<>+LAxK@s^8<_fI>=0igQ55 znS&>CadS`}!CmKIP=18Q`Xg2fwL+~_rHCqvvl1d`Bu%6cG+skR%puDAW zCrAQZQ*UB)#t|H`ljN~HX0n2|27uO=8T)Tg=9mvSx%E%i06cPu;IYMUh1wFK^t0}=5HI?*60j@Qg$~2MDP^O`vT4kF7lh*3F?xHO$1Ty?ly1= z5z&Ju2&oFn_X4aJpz{IUwg%M#{~YdD3abh=DWV4aK>%C=BBCa(HEGb@QdRQKPt3LN zSqcE8Nh2wRt#NRy=TtL**iOyPAMn17zRvya>)WZ)(HX&%!Y{tMbN>AKuC+bj|H}A) z`tbZ&gGpcuS0HC#BmyG6T(&X4&#VH-bM;)AdyRrX=M55D8wjE_G1NgX$jv=iW=xEJ z{u|5#T-3_10r+(milqc`RH%T(K;+{7h=^p{{S~5d11;=>S}9VbD>g`Dl$WGXYlT{q zUCKn{I!J+lV7XjYRRu)NpuR#r#W?9C$(aK4Vrs<5{2SLPK)-~I&|1@9{`^zp1KipG zKiU))RC7e7>sn_EF_w!Zw3{GW&^NGM7`;$2epdqI!q@_sz#K-xqcD7?Xbr$y1%aEN zuVhde|5|&c0pjHJDK5y;FYB%b&=_=50NUXGy6N?-6p>Q8A|llwKTUZ`;}R8Wtx*$o z4!|~X2?FF;Nlh9wD5VfU5ja`wl*NycLkz_Gl{5E_q)*KB7s3f+eZaZa2ZZgRDJ-al zX70v@cFiQd8O&eK7jA@(9gaRIe$NN`*qa3mhX7&?Ik6f5u#O-&%{I_j4S*VBvMonk+M@W4N{~%>ra}%UA~yA@a&;SFz3gbnznQ`>33vV zR@~2;TU!o`N7csCcg$-koG?5Oi1L4#-$Nfzx7l_Zd9k0x(V`uqMZ#v20yrKZ(Y3h- z*pt(s^wd<8C(KRhcnu)63gTpLAeaDfx*20{BwzHU2~59s!BL0lknsVeP!XyM6=6k+ zDvl8%A}UQvq1L1|X(H0l;{V=yynVO*=6!3z3e1RHTRz39gFn3DWJ-U3=mPFRvMRD zD~+x7ckmzbDK$?U6#Jk5+fU1JsR*blM8vA9stT*Bs_Ke>v?j9|6&VnL(}#dU@^+3hE%kaiKOT6kK09eZS8kRkdG_=zPfAZ zH~p;a-nC_Rs|%&V{}RJ~U;`Bd9fuxE)QpL*5d?@?rL9c zZ6o@R!NER(qTem|ue=5jj8kl=4K!R^Kpu4Ev?~$$YLtYth8e&u<^t|lz$8^o4M2fv zDl13|DlpbxLlZ<1A}CEujY?bS-}e7-2M}gbrzcgV#x;f30a#P7%nY?^nyPGEU^YT1 zZwP40NKYy!XpL;rF%+v`8Wz+ohj51yp!ESYUr?sCK6>+>ND~4!ji6l-fifKN&a$F) z?M(V!%<&Ioj3ZH3uI>VU$D?HuIp^K1REYIgLHH!ao?`ZC%gP5F6sTi<=~4lO0Lm08 z8|#li2%wR$DG_UJ8vnJ^`%m5}+tT~4>uPlKXU8~|LNiuZRSFfVc8^}02f)q`9g_5>7+SWjuMt$?1sDelVs&7S91_6UbLVPm7{Nem-BCiunqIrAFAv&@Y^r)9 zv*P=bIN#Jd@i5zH;no14CyQS3Gp5L;P0rG{5UlbZIiV}qYX?%@I#6mIfbju@pwX;< zR-`qNMy>qVpS%Xz?ahCUn*sPIRjH0HQ($ z9)%Ii9?#QXp1ykd=EaM*;Y+1z!r&r8brUGl^0!xSwWWkiLgOvZ9~-IiTS9RK1C1EN zg7V+(WWTA)z}qD*&Hg%MEvy@F1C5q{9cxAoS!FN+K&7w0>^}6S4vEm5)o#lkA}EER z0TdrvSBQjW**`WbADq$O78r}AOsAg#)J2?I?vs?k%urRP^}of3?0=KD``sdFM5Xo8 z+X=zVu{WmcZRr_9UqiEihj=QyHAXNV#b5jAgKHms@b>kaAHIJOPWgs2Vl3Wng0vb4 z^isch@kTFoSP=7Jd0U%mTL6((iPN#?4Nq`}4Z^|l&jqz{Bf(gy~L=D&$(v)(LpAPw_*cm%@A5e}1u-^e=Hc+W&ZP zwo475PKd3w!NEvtY+azaZSV2^G=hG!3N%>(K6OU0Ac}8T!1{c^Ikqpz-e8oF={E!| zD9NxEWV8gQl?!KWJ=?BK97&-}4FH&}G7c0@w+%E^1Mr}$I2AArhtf_r?oWMl(biRv zFLO0}u}n*lCX;|6Y9d0_Qoi_m-y-PQww&7dH2`LE_ujHH#go?feD=)S=174cIAKvE)m! z*qxkb^J@SuBN&`!8>m+Uh=#WWq2Vi-EYcC&MclvK#kt)d`f?Gbc6*uGyesLGJ05LW$*I@Bq&21Z`m!NNkFi=(Gv8Hc}5iG|7 zcJAC4U)}yoFBZi31L|Y|-o62)lrl?v3CJb^NC4=r<{-!1z5Y^W`$ z0T>0`W*ewGlR(Z`00om`@e@ev9>eCr|43rceIwh909y)XVuW$jZd@S(0?zu|47C!B zwehH07UTekZJ=al9OL9rlMem$GGgY^#8rB^^xAdC)%PKw?J|O8SisH?%LD9j)~Rwt zlO9(}RjPe8#CSy;an;M#FCC{Bfr5n@qR$W=%Z}Cnx~Llg2MtoL4$Mb-fg&{kV#p7z ziSpohiGh~{bREOw<^j<46B8L9V0n~~VLup2g|;Yqe0xd^{zt^jCAlNkzstb22W5Cv z2hraA0`#>(4r%+0V3zD9!vZ!e4=`?{2Dh8THu)n!RaaG2#W0Fa5r>;EirZKV!!vY- zs98McCIpn&nZrnAV>N(=z6POd2x@7~Hg-t`C=f45Q)Zi;HzMY&gL zA8_cT^$L{ZhQvmNWiPJR+(;WJ_)RO3ZKclshj`(lcuueZKEOhQY>!m)<)rrWa7QGN z2F!h(c;`>*_HLWklCywV?hd`(`s3?sja6me!YGVjN~tftx}9eMJ3p*1NO9^I+iP6U z>Uvgzk3O+}WauKem;p@IMuvPJ61T{^O%(8EG0NbeIPC7@43alsq*TMjvFvWZPLbCL z`0L4I1DM1*2+#F*Nn-re9Z8628179?Z z0=hi?(RKl8t^e}p`)}XAg<$0;_c{g(QnAh@;{)EkeOsdk3E?%Z~1SML;(d0EaIOZ6072#wnW|*f1Y+Ka6mAv$w?>mzDwa&f*rM zKk_zE;{)EkeQO~n9?RRqH9jDf2dMVi1wc4Bb2vLZaQFK-yMBzDh<4?i<~JoUl7T^` zDB$FT*aUtw&QpdczQfV`u8lDU1d;#3uG0x>0Kqhyn+X&@7o6Jt&C5s~2;?(Iy8a+$ zp#wQJHz0<1MAP5KXWFC%Hb02`%l|sIzFB8d!kM&K5C)UOXlX~x`?SsOzFQ8{~vmfMV7M z@YUVuWCoVd#CHZP6=2*l+x-z4&kwX;Al3Y9jBiJOtii%89B&y_pU-L(JL?B@!39E^Xlv$v2uc*+qQGkaapWaO(tg53g(Ay;y3qszJ^(-? z?LRn;JRs=?9E_;jZj9KWk6vyN3jcHJHm-GB?C_|y02Y9AL+nN0(SUtq{WvZ(E*3;Y zUKq@$$FAO!&D&YwMV?i@ydALM?ZbCAevn$Oj;@;0~R12A$or4jPndOvq#gtK=|edf1@&NJ|=&Uy8+k-%tm_i5uA-f_hP8XaxV~F9cK`>B= zpV%6JSv-c_E(kjX+_A!M9-Z=cQurjrVG($m6@j2VIQ~1Jd+!L-z9L1#KoAgQW_}Hg z@0Rtuk^lezY>yF)2oYbtc&V4mS1;c@d-f*A0@n0~=2^h_-cXeSY+7qYda)#;aO@|3 z6=N(92%|u5>@$H_@=xRi@*b$-0PNl`#0;~gBiW4gr^t%8mhRR)ip=ct1Zx2UJ~IRd z@s|uhz#oY1(t)5yDAS8Mihk>{w1>~vpp*~5oRvs4l;>Z9`cnc*;6l6& zl=o19?>y-U6ThWh!OJ|OSN1qbo4~@UOKoov)2lzIf%Z4;5xpE zffZ*reozh`<@SS;TYn&mj4f=B3;lH507m_{7+aBqiDckAzmxyTyIr7u0A_cLV4*=z zW&kYwLlbOc4a?aR!nDh!5z1av%3#cNVTc#K{fH0Nl{pyFV4hpYQVl z?^-N~T#f&`TMFjKr$7Xj#WJTxZh9_wqEx+CyCrs&L>=5yBt?qj5pCN3MXafyv z02CAf^6c=_E(wUG70J4R=*2go`yJ#qng_%nom3_if9Y%#e=fK2jbTA;C#YvImBRo4 z07S>X9W7&2IM@;$uXr)jYI+ontK;34l!)%bo}geAL{RQIVF4fr?z_crVGY0^PmYZk z$LEG8?hGJ^e@4G8GJ@Uj=Bh$y#TwA)a-I_Op<}eyPN2ihI{V>}4h+Wqtq$M8AC2PA z55R)DJ#ox-B7pJ$ilcY$^>P`p%Q$#(3iWNZiGX3*=$E1azRLy{bvYD$+0&{4#M(d| zFBE1gln5VaS1)}m__oN_z6Gd=H0f^3f;EL95bxb6K_5_&HVaKvG$Cm0tP9t8rfcB5 zkGt0<9>ovO13IqCc2Gbu9D?4zdAC?POvl(Z2sKaL%S1@A_4uCMk4F7Ip<~o(#B&2D zIUpxPiVWeNLK`S?#xl3xG~y1NJ)vP{Lt-FA_9p`fF%VvW^}zQiX0m<#NCpr@^xzKS zLaZJD9wQh;I>wPF0f{Jncpd=3vY^`9uisw1TP~O0m;(VQL}ht1xG}@H^^cqW0X7u9 zUual>W^o;2otVv>mznu$`Np~&jgi7lSU&MS4R&~Yry0|g+cNzHg*Y(a! z0Q1M}CAr3yVu(`g7`#2rLpDOMg961?`jAg%9C31v`=Si?B_gsj;Xe@>QyayI$RE1} zqdd0$IG3ci`5D5h!|p#@%XD{dTIRq0_N~vmAbKhbCC(7(!fC#P~a;gl?4q|9e zz8xzF-@WAvLGwKu}oI-aNqhLseIY=gu_#BO1b+=Qc|sGJ7yi8tBuIC#6CDA*cax zMle_t`H8Or<=a5PD`OAZ^L%mz5s|5<0;zjS)*sOa3}FGw_<-)-dRCt~f3E3}x69!I zxV&?KL(S32nqgNmiq1q>i^Fq*`24ilW^k&mJ;?#goIi1jcoMTNvVRuehyEd0z3HG2 zu?3tX>IbX<<6%JqSimw^P~H6Rpgw!?d^fq;ST7D$6EWkDO+Ar(_3HVH*RS6`{qbLNaj%__# z&sY+JM%cOp8e9|gD8bx%aBmHO0thhqW6iO5+gFRXfszA45%4!0T>?jOPbbbmWY@y~ z6uOe?z$sP#v>3sfeG&kdu3ou$=jK;me>R&{`8)u!EMU<*K+O(k7p`1H+eg|OEbV_} z#E2nzKt0Uf#|(UMnjvn~f$vaop2(r~>P&3Jle;wli1gSeemMENLj<3zf%7)dObvi7 z52eTy9f=1J*>s}Rw8sa$c@x;Z9{vDz z@!AzYXV}+0G6Ep2wI;oi8H%rkNPh`@bes|ZO0>(8;_*J)62z_Y))>KnGf@ULfFYNK zh{$fH0PTgTEz2$d04gBe{1|I%?`d*q_Scd0?I-{wOvpwU!J;Aj!I{GzAJF!O4(AV0 zhyg;+18D-i)Xlt?hfWZswpY5`>pg%iC=O zrH!?LS|BLC3c@$7#zGbj;}-SrBZ^fJ72GWw}JU@b&nlwWsRZ_(MjNqGJ@qp_=CfPKYaE3ybs8;fbl#)0f9Dm zYP&tBc|~okzw=N|_KsoX4gNe7XI->^CocoAe>`p;gU%&krV_)5$g{5@?@A0KNg(^m^IwE1L+$ zU0N13Snm4}$f5ALSCAw&sN(aNSRD{?t(#8X-)unJjsyC&nXdw^S&W52!n7o+ZP8@* zy{_NEL@)qf{Q76NZ|^!rfEh06%isO`VzH{(fP4y=+)=^FXCkJTrKZ&CxS&qI=p!`P?@~usCglc zJBnOCaw~wewFBWF#OpB%|B)SjZu@Q9r~98kZQ^v-MA;5vz1G{lKL7TI|NQvlhi(^s zelhRO2XxF2P#(PjetCRZJikz9suUo{OGS*2sJRz>zZMv85Z+?Cjv!uOy)_JpC18#- z!x1l&ATFm`Y#IF)DRgdjD12U2RmuVMX(=V(gg7v;=p}3b3KnDFjS8na)BU#X%?8wZ zaS#0d9b6w{1G-0mU0h!D=L0J91EwCFo*teS&o5zIdNdC`Qk%9SJyEJvNJh(fxN!}Y zWQEE=%C;*ZrGQetJ<2NtZ3PyZ{4jq@hQd2y2tv+uqwi{Y;&7Mte~*6-$N!jG0S3Er zEdMH)8<@527@W0z3`mRzj>_+r*spt!?`xe<(`5 zBCo>i7}~Y3^|afeV9fk)U;gpqj~}{6fc4gf7Uu^jCVKq%@ci&pbWi>FLn&p+9}eV6 zpirC_USe-_f!NWW43fsds_1H&8VmrgS@`tnX?(%?<#!13qNClZw*Nfg(2j~nY*Dk^^b~wBx4aeGctQ1hD zzpnvhe!4ruJ$}Jn*Be0F^<-cZ2Ym6HpWocx__`n|`0VO}E_%2iUl(MmfF3{I_dwHR z;-JvE+bJ1OTq^iUDWEh0D3#M|E@pr^EdZtTK9WP=Lr_2@$sv~0fqB3cuax|E4ZIwl1aRWwtkm3 z;M0eX)HwodV4tx0b=rN($#eqYL`QiM79=-&7eDdVL&H`8T`qahAU~>wD9Qj+m;4UL zR6D2B%HmWugAk${bHO$i#br$ZQ6UhO3V|#M1NgdOFaZR1h;OT|VD48;8sU{l9*|lr z(6*y;|NVF=jwZuIAnP1$?f3V-9)h;o{hUaj6TZ2-MZ#$aQD?&i_4Wr`Utf0_faz=s zD2_FLVu?o>U10HBz(BlMM9s%_&27|hA&pSHE_=qRA{PF?%8IDGNY z*6)-H`t{Fl-`-_Dd0>PthS-3A{Q0zw{xd+Or7XdVr*!H;VgSNj!QxXSh7dtvJYokT z0$^q&vJl}J2=#|ZYK|?`lWa3~m&(9D=Y80lK+;tFfyC&qa+=*`ciHB34c8Aqkz&&9 zy0MiojqZjlq-tB+4j=u~iC~FpLQ;{LtFY~T{oc*zzy0AqzxXxXzP(GkTD)f5kT~G? zf1IM^k2&L&*WhbG40!}(Vx;*K5BaVM%mSZgP zaMIgW3M$>y!)US$~s6(z)%oZ9f2}6U<6$?PE}uD7^3W8km@F zfW4%GQybv&0W2nnL0AH#8(OOinnp_2L>E^V)9EA_Hc?w|`)W1Io+ep{Bfb8(9#s0o zobfIMBYVmsnPGs`sJXfJSE&S=>8e#Jpdbe40|FQ}#ToC{O);hp( zg3c1AI~MG6{Xt$yuNM@h0hm3$`S}5f4X_5_&E1>X#oP>kM^s)fx~G^~Ywdk}9Z@}f z=wGRXCj{v^aytE9s7*8^6G@{)8U0bFfHZ3iC#5Tz(w{MDfF-q*)70}e0_SZjX3l!&h1-puE7KbS$w zsqBt^(M)=!E&HzB0?n}kM1=dCIQ~pr;KUu%BSIFowJzk@8c6{~m8i))GA^_iI0^`% z6D%JHv$-A0UQl=m_YA|bF{|3G}?ILXP!g`fW z>zRsvCA}&hl~=R4^*RsN_qqPSJ~?@9Xd)J5HZwoK+kolK=eP6A3)Y4uXTz9iX2cD+ zdbwiKkg|9ec#=52`wa%_@o2Oc~WY(wY| zM@WULe~_|l4j5!BKB4S1Q81V_NZFbRO8gUE$MJ7l?R(R%!4|JAz*@_ZQ)yjIT!d4s zxKGBmx!#+v!{vg0O*hU4d4ptgukhfBHS6V)eD}5vyOESC zN6M%8d6c3}@0Q9FdP6<695kXe?!L-{c zW$SJg*{m-N|D(vx64ewcpr~5^lgPty+wa?N+ZNH^Q!BAfyZJIG=0(w`&Py{BnBL=h z0+=a6@YdeRoC9)7pG*p&FM-%*1V9YZASf8Ml;HbwmP}#a4&1g;n{E-n_E>&F5qMBR z__A6jTI-dN*$EPCi9)CUj_!B8H*5z>9@exX5&=<@510mFeInW9Ma;x{`Lc}5I;9u&?Eu#E0bhL4BbLn% zU@<>n8oA9vWld{dJS|e6p0f_G!RVj;DijRRgQf}UWej*edY7YvA$CO>C~Z>>BDpuy z>@))&Nm0m8yN+nn^F@j+-^L*q9zlP@{nu~*?Z5wzs%;Pok%MeWTc20}C;7QrE%a)! zTE09#etLO+cz*n(gNjV5u;%Z{6*`ORY&&1CkQXlD;f`Gy*h%oqH})0ltZf*>y>``^x*4u$yEM} zxm<#Zb`ozX?5~0TgQ$v*MUl2dGH4*n0Tg*AF%V{3f)Eum5D0%~kYpcQfc`-HKx+22 zZF2_TL*;9;p4MYqUtHteM&s|VmKOcBUfDa#lVP|*!f*}a_O$*uNTH7T0aIV|qgVRj z*>8GmUIONDo^TR5|65BO#=i zOM2D$+vW_w{fC4KNJxxiC#MeD`ec0#Kn>ipUM-gkbEjb%ijOae_#w|{m+OzQd9XG= zU`k9{vtH?kA3y1pc5ke#IEhPvxFGMtl`QNA`IBM-pd>CtK^zomu;6-ex7Z2X{aPdo zBtj8m2iUX!Iq~HO{cOu3(V5NzczJ%z!7HVJofcSv8f|^=dJm}v>y6`Y%t6v~n>S~L zzY=OqTYFhgmJ!lNX#?W<0aIqyEB*2N4_a$PSyUoJMH|IdIT_e{p^?)6_I!WtyFYF- zj4cI+@h_hKcfDb>>okBQq2OwhLM}Lu5+Hqllo>H>)C`>2{_^D|yAGL9aL;vX>j$m( zY2k!nPvQm%zLtEaQb+Ed)*opE5ak2J{D7%mtv-JD<7&0?y3F9XE!YlZF~I<2wS7mQ z*ACoj-@V2)8pvCK@P*ISK>OZL@s=lXB8l$simTaU8W5EzrAY3Q#Zsvh>qGxJkNfK1 zU#*ron^7bOI@pi4e&BlT1lKy&%U=(0y;6#fup~6K0d9W4^v7?1SglqN6b=h=hpjra z2YpS+81~Jgf2#k3-c)g-2^#JC9Dw)xy&5Rl7J&g-Xf9?7IE^}bor2 z>VCBS;=T|7(4MUDKRrgIK44ovYJF`Qd&0f=pNF}APpQMrb3wOvx6|cf=_m4vP%W*m ziF@C;43oRM8kM>M;r)vofZxr_KncXV9Pvj@mQsV^L z`ZHhe)vb^HV{hVssZTxn8Xx#1svDxh99JO5$=FR>!2zyrr?rV%!;*q~%ErUgpZ@Dh zL%H`}B`QV^E?ENqx)P3x*I<^~Hu!5$5q%6_`_Kp5 z*0=S>44lRsA!eR>apW*Giv{f43MualYoVvS>r24I6(G!?ij%4Uq@fUHpjHWP7x>9V zf4&6ns0BLcdX~+X-<&a^O!h#wI~B#k+WIqFFS3+cANyy1nl*EQ9c3QwbR*q%i8?%Z z5ho_Xx2c63K&cFrMCJlJ&jh5#fKpL6lx*KXx4#wm4Bzk5fb7_5>(6pMn=yT-5d=(S z(=QU)v8X52#sh*`*=7(>OH^`=s9`A*%8Bp;OO_plVE|iwGc)6Y;>!V7jX}{Qyps2C z`+ea+`o?uP4z~5@w*DlxDY;@850fGSFn)9sk9a@04u$K}>tL^=G`ENfS+|)G~IQ2Eb|LTVN_q9hZ~U z!yuPEo5ULLFZX>PfP3nu0RYiU-u=r+y48@OerbZ{t7?JTww94DMz__@kGB3S*PliN z5K%xJCe+5xHVbDvEvnfU*jIlo2FmOK>njx0%eL)7bUt*fYTK4VG>YrK zGmY`K{;b#Y2^oWFJR+SF_8F<}T1ciIl2r`PF=Vcj_9_Z5P}G7B#f7cB&JF|f$}_hF z?>b3f%9H>~pM|niKwE#d>rcf1c&PJPVBsd~!=W5Fn+TsFWo~a7u2>|<#%>f7u#vu{x{OTy6dG~8Z0MyqAI`B_z{mHM#Y1INvsiM8W*&oU^GdrlH z;et9s0nh$!RC_f3*yBi&W15u*PODV)O2Y@7FG&W+?cb-jKhoKbQ5VQvV|< zpelZ3Qxv6S!M1V$Rhv>y1#`h}iCQINJ=hQ2+I<=50I*&|Mz!kI#$|17f8ah5YbGKn zNKnYX|Mv1LwDoO0iP6DFy(#XRGJZg>kB98}nU!Ue5yl5t`iGg1uB?WmVF%Gr9ND7L z_J{4Ko?r|F=2wphZGBr$@kEf5i~u^kZdpLdI{>>5-Bs>j&3!2->`Z%~1F%wS-u>UH zj&+}Nk5=Tr50k2+P(c3dSk~5``})(6f{;*)0j$fu-QTLq&S`hB8)O;LSWXQ3a44XY z`$!!b`d7+AD60%97K*g>XSZGxD{ZBLj=vB{bu%qp^Jg(+_TkpPwlU`~bHTDeh{SAz zlxaUw3aD+{w+Hzcbm}Z4Y3tki(=Y&h*a1NHl(;Aal;i+HXuv*+pO}IA=HKkLf0Fz8 zX!7Fy#bs@MTYoAP&>HZY z5N+$ve7zY8e=?S{|U#5Nt7?lav65 zi7{ziYs&$gc@98}&w@_IKT$jo$}ec^&v<>y0c<)4FwXo`y1k^FovinlB1R0*Kqa`w zm7hlrAgbpp4vcN<+xpu2^DzL291vv1J#w@GGBr@*9SwzV+oAJ6y7p`09=7#uJ)m3= za0+Um>*oMCn8gENi8$4U&T{}AWuQ6#L*dqt@tkY`ci%s-2E465&-Eu80Tk+FuzSoe zmHMZ2PgMNx$G|wlAm;*8R~aamsHC=?4f^-$#V7ruZTrhTKl}A3l?FJT7n6&Ca-v%rNrG}z0aPpl z^)&C~`CVKw(*1f3E9gG;sP95D%~ky9@%jIM^xa2aCpniE&|+(mxIL+ZMj$ zW`{Z2_mcz6JrWe!`m(t_+mnN{)@jPOpy2MnXM%kr9XlKVsae-jRHD%@K1HY zWMa_E!sKbgw*H*gpUmg~h;jfmPKv{gi+^J#a(=&ufBS#){M+U}&d9~z?VTm%$hQ7G z*Sr4F6R9FR{5}Aiuq7(c|I8G*{UmY#Fz*@66E+kOGmI&459;f@ipH;5hjR%6@~?gL zC-zE%+}5A@dH^Abc>K-42a*FAD$Za2jiVfZm45R|(3bUg2A+wD0YuN9izjQm&{-RU z4!)?ZZ|hHEJHn<0mb6bY{fm<&!5)OnfE4u(bpZLT7;_xXe%m$+`gvwAxkr-1ZT)$# z*C%5ejv)t-mH=_|Pau8R{;)H^oZi17d@R=o9};+bfeN%X8*pyuUyS;Tq(NJM&g)O< z^M4dtKvhtd%5QPSmaX_C0u#e_fmvDzZ1!Av5IW4Cya2o0Z`jSa9n`;KL{kK(BQnTz{ex&PGnqhjz{?4JyY zZR^i@y>A9S{YJ3e)QaiBY$=*YwOQ`J=6J#!R_{&88!W~Q+Hs^;-_X!S`##}R;-z!H9(|5M2f*M zSziDaB_YuC$TnmerLLzTaC6P`Ul08YvhT@XwO)1T#kcimww|=sYH}i<{{z(m3aMWP zlM(iT>(pi@ayCF~hIRj$R@wl&BBfb_K?+bz8gK?60BEIL=HTQXQ2r%~2O{Ip0)Vvx zEAw%#>cwMCefhTjq}OX;axx$P1JnYF%KzEQ_QTkKKmn2G{q>3o3}_~$VXA%z6WBvE zTmpbX4c8%S{iAAr5&wu{m~u#i;ii3yB;G-v3j_4xGlj^u{%qGfdvGFxpnJ{%M1}uu zSg#%1!1}iq` zuLAjFs({u&{{0(>teht*@Iho7BEHh4yW2MGGsl+CMBE_g;lS_6U)%a~T^|_$gxo;O z0c?!@Ave&))Pu5NfrvE`z=~OGt(977hT@ghuGtq1W+=rT{V5cHdZ;`!pdZ5eBifS` z5Re1{xg;ED&9`|_=x`cGvCt8ZKG=0T(bl*1K^pqFJ*~r>2f$vsnPF>zG+RkGX4a%Z zYQ;>Xp@|eo6M+fJ*Z}YQd-MmDedPnS0T~07@KzSA z)4PJEzbWvs-MvQQQ){d516%f^Ec!>jKLSFoLyR1X>rWIr`t}1C|0gP(5EZ&|?|H`f z(Bnk(4)9!-8&oP{0CEq}?YH%9JrOyAnUspM0?bF|TOC{Hhm#l@_4#gdgn zj$$5qR01MfJ=eBh*U8!d0HDbP6Q!n8HBnGX!F~qlenhuj4 zBgT#i%wRy1HvqowGxhzCAOV1s2|~nH1n=K|BthV?V|{<1&)OhCTMXb;lD~ro5;Ez! z&U10`8IC(w-%)%qj}5@(yo!eNI#9NwP9Ocl_s`gX$wV3c2Y@dYJ-QZwgXja`YQbKZ z3BXniLb(4TJ-}eiP^KL?OZNf&3dqL+EYiW=y|31)9sVbE7tb&O zvdb9qq)x!R4tbY#pzJ=XrbDoebCn!<2C(sSouuz?u9X23rJxih6XX6vwi6uPr18Vc z0YpIng|s{&NVURN3@LVIfB|Czh_spg;(TV5MA8m23P`z&Q2oO$*K0(qt$nlNMpod6 z1qVckP#@g=nXK3c?qx+!;HcY_0;)q^7gaJZ6f+Dts`3Tc(Ydzsx=z*z2qH)+WxX$i z9x|;tTYlsQU}rgi!im^AvGBQdfS5Hwxmq9*BbZ??tck$3=@-si;c!8}XaOKEawzfi zqNWD)**X7i+8L}SsHc(G2Lt`%Vlcw_=Jc`-JZjvzwsX`h2C{h_C}(xZD;{M$mvxWY z(z#~ySxw|}aX}euiNc62|vT2D?z z|I06=d-mgw4PSP_LlI}NZC;WJ6vi7EuoIJyE!`7lYVrUMh>1opEGKbPifa=k?~#3> zU7qr6I>Nu6Oefur=aHW4)Hn9z4|5s)kLcnYRv$pgC$~1h#h@Y-b#a%ge++;~0WOb& z{K+gX3r;A!7C=}#5B>5^@+|;TT)Wm?1@z%*=42-yZSFK{(OD1bT(zh}sc7P>{Mkzs zW&(2U;We`yTh1+^{n*cgkW&BZ9f;pi;@$C`KeVHYV-7ca zu2bcKMwragGXQ%Cx5C7j0EY3m*cJOAgeY8i)A+DITxoL@$jn0n$WRcjq#r&4Kx`81 zjX4??nKr7U=yb2cubk>p6sdZx)33b=|9Y$EN>0}$dA5mjohtKlV(3qYnFHVqq(sJ@ zIR|!@fkLH`^zgllc)Bl{u*RXk6-s4-BfF%_FRqnMgR>`&WEoZIgN#a))U9fD2uD$8 z=l$5Dz)nO&Ubt?D*LSWftmkq-o@gCVUiVy3%D#$7H)IgCHR5%hQCxsF4`7>)e{KUP zn1QmFUz8a*@OLQ}wm~R>vV#$<^0*tFDP4ZVl1EX#xNwq)Ajz`>oRLul3_X>j(l0Qe z1R^WJob=){GALJ_M@djt6e)Xe{9MXCEDPx?9spq@&egUPrhs@edQvJLATHSSzh7k+c+iY{I#sqO7K zcE#Y4Bp(L66mRKiXf5HWb0tj9(ALOToU3goX#n=%7k8V1>i6@w!c_K}JsfC}b%z%N zIn;Bn3=%Ro8Usuw3OS46M~yqzE{>`cI}R~1YeV@cP#%3QP8g>l)YdCrSKCg(0PL#| zpxdM8T4?VW@8kcBrqgk{RXu~V=1Yg%fPk(8qngvwHHI)wYaW#V%i*6(q9nU95^gHR zpcLrZ{`DwO9(S&YM3shZJFly4Ct?8hl>_Jv1*llseuU89QKf>oB%Wh*^Iyko{-cAf zeCSKHt{y3FvQ#4)c2pvTxXE)NMfP#$>O3mGsL@BxyTF@;^3k9?+LvFO+IoeFYTHRt zK)cHU3^W6@Ci#4rG*{v4iX_!R0CBgXk4OizHwNfN1SGv@*)!nM#V;Kd2^ldJlg|4+ zS9Vm<+x4ZOVk*T}{OfU`Jl<@qPi?&>ZfM&{8h}GV%yDyKU&lXfbo67LkcnO+DssFc z8fURD;g37Nr#^1zx{~%8@T-qP?+nWQo=dz75yl0q+>(DiHs3JDY^+ahjecEiI}rnL z2swamlrK;m$N2F?xolA=`e*1be?iG=btIC3f%IBxn$F-T$^Uq)q%HZ^qw)>o)6^rV zt@Y2Q7N zHS9gw%~6OQ2@K18zQ(^^7nH}HYdp0zHYMJ+lca$5nFAPM4|=E~>|=kxvt!47_;jx4 zH5e4A5lBlAi=z5>X<#`zWkToZDY7hk*dvYt_dxS5kMco)ZNMJ%5g!TVqdR1_ z^BpdlHWJE5f%3R>g#+2PU2HFIXxj->KrEf5W)QZ(N|mI1%)IxwC{Lh23d3)tEJToy zuGSLuq&rc^aTGZul*~@)bhSg!*{>BJ#f9i$U@c_@l;hT?Ubq|w<>Nqk^tnb*Tcgj_ zwo^3#ZQCaJXCN5QwiH+{7WmqqFe#?Oc2r{obigC}5uzh{=sq3#!k~4pV88W>&s8Ua zkRjm4p?n-DkM!k7QCp*5SKCg+0JI#yjx9jI{eV62$ZvPuJa`a_Oi^qCP?#Chi|`o5 zuwWSUu3>D}i8j`wfzSbYG6G-$pqqvA(V#rWY>c9|Mw_U%ornQwIe;C3KZ@{~l>NvE zAm)FNj|Ywdi1lHx_)ONd9OKXUiU+~q7^Q;#0+ErCLYsv0aruUEY3fnb)@T#ewj(zH z9ZYJo{#)_=k-7iD+lM6aqi=K0|HNU$Yp@sv8}M2jKlmBV5nTqbz{-t7`8ZG>?aPm$ zwq9|rww*!*(6${w4hrZ`egKE(aMDdch&2WSeAPPlf?-^D@qyw4G31Qf^!i`7iQ0D_ z*aaa79$Gy~AKt)RcqJ@)V~A^-^wK)6ws{uQ0W)ms%k2Ni4f zFf8L}`2&bHSrj{lK`6t@-p8emN8}quoNFYtRXPfd25ttRZQDS9h&$n+-vd41|3Q=r z7GGkQ7#`AFOO&xkSoZ~_2cjHQ;E3Ln;Q8_^<^c?W@^PR%+Ls?eZB>tAzP`R}-{58d z+O{e5_W=Ne>Vt>>$OSBD9Tg}V~q}G8!faj0?NmM@_4hc zKDEWQqku2|@mI|TGy~AKO`(7A`vU<4B=8^AhLQ*i#G?+${ze)=am(&tNuE;S5_(Ms zy6Z3Z|IWNZXklF_r&r_~#+VJjR`skyZPf^|$z;-OKr;Ys+cf&S?5~9W(iWEnp(xc} z%>bZ71+L5zrCr3RgFMPw5XV6SjTc%NH;gkI97hS#B-FP1kDodSv1S8K-2jw? z^^tpPttMa``csbn7W92xPXzcS_>bZO#EImN1Tfar(TtyRzla<%S?WO<0S@TP*=LJ) z^ZtaVx|TlA2q+(yZy0wj7L1lO8-y6A!>LA3p*?^NU03*Lx4fbD){%O&t2Yo65 zK4j&O$OV&^gOJJ*=#Bvf(mX{6OkTuuKQ1) zio_8S{rwj|tJ#1LA0FO+^-YZsLyH4WIs(8TKxnq$HO9c>zCeEg@ll5_Vl{}Y1_&ue zZ=Q6?(SLw#N&YxI1+YdC5ILq?{mY<_>`Bf8xVXHm5l3%7d)r|H-o5+on|I$72{E4{ zR?P;Sf&mb@B$NxejSx^N=hXDU*K+?0CI2!Q@Emp<^jkZ9`+qvE|(p|(cRm-E*tRGci+BypA%wYHbsjAj@tk* zbx)2;2I(Qw95$c7)+0EWSCJ+Eq5;4|Y90FH-~dQedbX5nEu(*NT~7}JcbS9YdhV}q ziJ`P+1LQ+eh2J@bc>pywzvHM6KYZvQjsSGW0bhOfCu0LRwv^J^H5+i$5rFs-qH~@& zlCM$bo^i*`er!)@fBn|@OzaaG`%hKqkFvj@6gD;h|0N7X87Dhl;9Bl~a#9`^3wWm^ zK7u;}ihg@@Eb{=U#OB}LUe%8J=IigDo}OyN5f6w1j136K#$I5n3p!c@078j01sDt> zvY$ed!6n-Vi(#`J&EJ*TYH90!?tz`^*W_r)zxWr&11+6~XN*Kq=?)D=1}cf>L6(7pfk=aMHp!N0KI` zgIH%G%^cfxAbTx+g+j&aL$H^|os0cR4fKok=0hbN_Qcz_$42LhuX!-X;SiSCjOxYM z!~##G;gH zHsFX10LXkAf{cs>b#mWJ0Bq9)Fytth!$258iR9EsbTfA1ME5f@kmXB6t}uAYN|ACA zfKpKQ9Wnb3v_XIZls6Kx`p4|c*bIJDBKv*Vx7E3C%wgZ-Er_XR-b90fVG{D^AR@yI z`d!@M;zo;^_VWZm>Ler-h}oW(y~8Sr$Z`$f$~U)VG_|CgMZ@KP-RlizWH7_tU*WK3>iF^Tv1V*;Zf`nlz_;&z`09`E zx|_40)DSMHBb__M2E2dwzMDX6aloM)0CpTJ+wTVx6PT?R2R3d$hXNCZO|cQVdXd4@ zk6d|D`@-i7w1#u9n8BhtlBFx}yltkqyGuc-iE^#MegZsXv5%`d6iLqLxe*lN6fULv zOsq*82i#Fu@^OevCW5?7DdH4{1zjf1(RE;QDQ;I&0QcIx_ihRfwAPOIVIobWIg}S@ z=lc^lz&hAovAAd`5J()DE%RYEmY69aE4fSo?PeapsmznQ|^#>F_TrQ?*HsH{60D%2M$&Y>j5f1dV<8hh2w@B^_X>N3;w+KWy)jo(c zdlHEUw<%Hluhhh%Kj5o?@^&z0W=q?PQ`?)b6|E3e_I)E}U0^5dyJ=&NkmZ#!)P4p5 zGwGG{*)7$hCNAIVESJn9__ZWm*l#zG}lm~_AUC`pZ-;_7N$PR z{rb(jZ>tp0!_)2EoB4cB?kpUKARwB}XE!%jKYah87)#vWKe1lk-Q9XNUw(OgM*6eQ z-#*;mzq~B-N6?yo{Ncmf&u*vFDctLg(zyT;U0z;ZUCoWf%D0anA10vd+iOptLF||Z zQA&OG`Q81;`^93}VE2#=z(4<%*}YrhQ)7a7(}Ls7gJn`#)CIZXe@Pji6Y3+utyV?Q zHN?+kstA(wAu*ydJcy1T#Fz~sStr3fq$!zMFIP#$P*k=gc2s!4)C8bHv)H4k9IUYp zLC?>=`B!=1-~9BiWH+xzF#{btIcl%u1<#8}RmaGM!30l#p5%eKr8lH@7#Gw?n&Y*lfUo<^Ws{ z*wywhU`pdKtjQLr59vJzQbVZ!OeWLmbmHOx<>?<4 zj|9-G70c>UnTP-;vq^>h@th5qX|-JCz0AIMVKPt2C6bZD*ub!!JJn{HB@)Sm`f+ z_aBcBkJQ<)nrmhV)7gxy z?_YgCSnFlQ1!E9F&1O?TQB=t(tec@1vIj9Q!S|LY?c?kaNo&1YEQ7)ub5=^~1V{)< z*~diEp5_w-pw)6!{$x)lweTh!!u0d^|C*3FlDLqN`gJ`5xO@9%KA#t<4*+*>Z(p9D zYH4&j2dUf$i^`lk)SNBPgskT}3_L3ujY?03fjpFTZKz}L6e zIf3Q_lokgZmI3(5fBh}I?vKr1x{giXYvX4XTB3+UK_8zVKPH6i2tD@CNBEdOKif3;X@3IB1I?rc7{HKWR+rBRe1HkGF4o2VCyWsP?S z)a+tLli>C{O$ve{ko}c)`XC_8=5w>2A-V>YFCu1>w^+O^ZP^Z2v#0jSPtK37)uN3cGmjL|R+ zVTUBLna^fA^P?OgDgK5U?WxczId;CtqS8pz=alpsN3HZ(JH9AXFn+-UO2;iT88~8`Ks!#Z!J+ceY zhcU>ia4P_cY=@Z7m`!-3WX$92Vm`l|1Hi;p+jD6LuiTMfiOJpjX;Hh+}O4b#Zke%9=cF6s0~^ zi`Bv&=(`1K)jv>^$^6ZQkv@W=B&FbA*YbH0eEHDeYcXbeIrCmCR8$WotzcpR{`RMT zZ4=90rrZ7OFaXQtYO#2}dwbVGeGHESJQtLwbBD$Ocel9!ZE(QX;eu*0&49Wfesg;r z&Ys0I%?2C{1r+rt896wI_JRvyR|y10Dmi&xVh;gm^U}|xUQ-TwAw-EuD9kTs^UDhd z`36Cicw|%kLoW|ct5xLtlbAhn`Q}n7CGyG9dt&ZfE%o!mvrM>#?4@`RU%HxSTZyn* zuAU#BBqS(>i#L~;s8X|8*jX)>&yUZ(xy#OYsbn%HlgY*PrOATJwgU=9{2-#m^J4L` zhz5#@7e$2m#hjAS$?oMWgaP4}w@-$Od;%Kt%NT__BO?xqEx-`xA2NgVyAN z@^r2-PVqJOS7@cH+bc{ag+d=Of5tqBmku?!aCLp9l!BZPAY>cNkJZcK z>EVf-KxV-Hs4drCKsB9QU0;htcnQD_`aivh6mkJe=O!*GZ3|KE@{2$HKFI+@%)2mU zUw0Y+B6@s$4mO~c&K=AJO$7;)rgMod25>>9Hnhs-53~WZX-7=c8wV)xo0~U%C92H^ z>@^1vy6lNX{i1CTU@Hv6gy7RMGTs&E*!+tEg^||(NPS4pl3ZL}UR_^7nGIzA0o+du z|BoNhcr?lK`&oZq;<6ywZ|0%fqLI zoz%PyKS_iJQDya+DnMiwKqT9c{^OAH^5*LD=8Xk=NVngYyeKAm{PEtVEAvW8rEWgE zQIn}px~ftXuzXqGf4C zZwj(OFV8QJA0LdIkFCvjGDB(kKhb11y?%SET=rW$1tn!upB|r{@1KHzG{-Wg;z?fK zT&ZF!0PuYO=$HTUyDy_8aHXfWI|*Ei13J2M*WiNc%~|t{`HS@jznh&5#iE1ww zWO~FpN>p22&>nLD|73M51G&uMBLZf}3Ar}0cmhe7aB}V%Kv6$1Vj@U117F>~d2@U1 zm>(MfAUOVZ_5BYY7mFpMz}i5m+n?O2>C~gXvLc<%+a*9@`LekG;iE|Ua{eHb>C|Ld zDQHoc(n<3V7Un_3v6G3q{rs)*{gq5?N52&&EYFHdFaWTkiPWoTDX)40|S0JX3-+wTP zN@Vb_l)C%Nx6|1)rtG8X0ss~-i;sW)m`km3c#zNhg9xuZ^a}%6JTE@|`J;nd2JvK~ z?*8Jfnt6F>A?)m(Y^LYO=TAR;BCR8@Ki=`T*?e~Uled^C@|H~O_|W3%)8oU3dpUb9 z)D-1LlK9QtHBsJk0RWF5?)|0s)%Sl$DWFRI``3dFK+XjfsShH$`~2 Date: Fri, 1 Feb 2013 19:56:23 -0600 Subject: [PATCH 331/695] Added icons to all of the sample applications. I was getting bored with white squares. --- .../BenchmarkSuite.xcodeproj/project.pbxproj | 20 +++++++++++++++++++ .../BenchmarkSuite/BenchmarkSuite-Info.plist | 4 +++- .../project.pbxproj | 20 +++++++++++++++++++ .../ColorObjectTracking-Info.plist | 6 ++++-- examples/CubeExample/CubeExample-Info.plist | 4 +++- .../CubeExample.xcodeproj/project.pbxproj | 20 +++++++++++++++++++ .../project.pbxproj | 20 +++++++++++++++++++ .../FeatureExtractionTest-Info.plist | 6 ++++-- .../FilterShowcase.xcodeproj/project.pbxproj | 20 +++++++++++++++++++ .../FilterShowcase/FilterShowcase-Info.plist | 2 ++ .../project.pbxproj | 20 +++++++++++++++++++ .../MultiViewFilterExample-Info.plist | 2 ++ .../RawDataTest.xcodeproj/project.pbxproj | 20 +++++++++++++++++++ .../RawDataTest/RawDataTest-Info.plist | 2 ++ .../project.pbxproj | 20 +++++++++++++++++++ .../SimpleImageFilter-Info.plist | 2 ++ .../project.pbxproj | 20 +++++++++++++++++++ .../SimplePhotoFilter-Info.plist | 6 ++++-- .../project.pbxproj | 20 +++++++++++++++++++ .../SimpleVideoFileFilter-Info.plist | 4 +++- .../project.pbxproj | 20 +++++++++++++++++++ .../SimpleVideoFilter-Info.plist | 2 ++ 22 files changed, 251 insertions(+), 9 deletions(-) diff --git a/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj b/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj index a24554c16..d3a8acaea 100755 --- a/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj +++ b/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj @@ -8,6 +8,11 @@ /* Begin PBXBuildFile section */ BC982A9614EDF8750001FF6F /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982A9514EDF8740001FF6F /* GLKit.framework */; }; + BCB3C3D216BCA4AD003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3CD16BCA4AD003D26B0 /* Icon-72.png */; }; + BCB3C3D316BCA4AD003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3CE16BCA4AD003D26B0 /* Icon-72@2x.png */; }; + BCB3C3D416BCA4AD003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3CF16BCA4AD003D26B0 /* Icon.png */; }; + BCB3C3D516BCA4AD003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3D016BCA4AD003D26B0 /* Icon@2x.png */; }; + BCB3C3D616BCA4AD003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3D116BCA4AD003D26B0 /* iTunesArtwork.png */; }; BCC3D1CE14ECB1DB00E111AF /* ImageFilteringBenchmarkController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC3D1CD14ECB1DB00E111AF /* ImageFilteringBenchmarkController.m */; }; BCF9D15B14EAD24200986461 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D15A14EAD24200986461 /* UIKit.framework */; }; BCF9D15D14EAD24200986461 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D15C14EAD24200986461 /* Foundation.framework */; }; @@ -62,6 +67,11 @@ /* Begin PBXFileReference section */ BC982A9514EDF8740001FF6F /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; }; + BCB3C3CD16BCA4AD003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C3CE16BCA4AD003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C3CF16BCA4AD003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C3D016BCA4AD003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C3D116BCA4AD003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCC3D1CC14ECB1DB00E111AF /* ImageFilteringBenchmarkController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageFilteringBenchmarkController.h; sourceTree = ""; }; BCC3D1CD14ECB1DB00E111AF /* ImageFilteringBenchmarkController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageFilteringBenchmarkController.m; sourceTree = ""; }; BCF9D15614EAD24200986461 /* BenchmarkSuite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BenchmarkSuite.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -178,6 +188,11 @@ BCF9D16114EAD24200986461 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C3CD16BCA4AD003D26B0 /* Icon-72.png */, + BCB3C3CE16BCA4AD003D26B0 /* Icon-72@2x.png */, + BCB3C3CF16BCA4AD003D26B0 /* Icon.png */, + BCB3C3D016BCA4AD003D26B0 /* Icon@2x.png */, + BCB3C3D116BCA4AD003D26B0 /* iTunesArtwork.png */, BCF9D1E914EC569700986461 /* Lambeau.jpg */, BCF9D19314EC29FA00986461 /* 41-picture-frame.png */, BCF9D19414EC29FA00986461 /* 41-picture-frame@2x.png */, @@ -287,6 +302,11 @@ BCF9D19D14EC29FA00986461 /* 86-camera.png in Resources */, BCF9D19E14EC29FA00986461 /* 86-camera@2x.png in Resources */, BCF9D1EA14EC569700986461 /* Lambeau.jpg in Resources */, + BCB3C3D216BCA4AD003D26B0 /* Icon-72.png in Resources */, + BCB3C3D316BCA4AD003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C3D416BCA4AD003D26B0 /* Icon.png in Resources */, + BCB3C3D516BCA4AD003D26B0 /* Icon@2x.png in Resources */, + BCB3C3D616BCA4AD003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist index 6587ee3a1..7a0d5fcab 100755 --- a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist +++ b/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist @@ -26,7 +26,9 @@ 1.0 LSRequiresIPhoneOS - UIFileSharingEnabled + UIFileSharingEnabled + + UIPrerenderedIcon UIRequiredDeviceCapabilities diff --git a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj b/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj index 2ea670121..5ae8b7d94 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj +++ b/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj @@ -13,6 +13,11 @@ BC245DE914DDC959009FE7EB /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BC245DE714DDC959009FE7EB /* InfoPlist.strings */; }; BC245DEB14DDC959009FE7EB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DEA14DDC959009FE7EB /* main.m */; }; BC245DEF14DDC959009FE7EB /* ColorTrackingAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DEE14DDC959009FE7EB /* ColorTrackingAppDelegate.m */; }; + BCB3C3DF16BCA51E003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3DA16BCA51E003D26B0 /* Icon-72.png */; }; + BCB3C3E016BCA51E003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3DB16BCA51E003D26B0 /* Icon-72@2x.png */; }; + BCB3C3E116BCA51E003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3DC16BCA51E003D26B0 /* Icon.png */; }; + BCB3C3E216BCA51E003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3DD16BCA51E003D26B0 /* Icon@2x.png */; }; + BCB3C3E316BCA51E003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3DE16BCA51E003D26B0 /* iTunesArtwork.png */; }; BCB5DD8314E85CB0000AF3C2 /* PositionColor.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCB5DD8214E85CB0000AF3C2 /* PositionColor.fsh */; }; BCB5E74614DDCF4F00701302 /* ColorTrackingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E74514DDCF4F00701302 /* ColorTrackingViewController.m */; }; BCB5E74814DDD1B300701302 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E74714DDD1B300701302 /* QuartzCore.framework */; }; @@ -60,6 +65,11 @@ BC245DED14DDC959009FE7EB /* ColorTrackingAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ColorTrackingAppDelegate.h; sourceTree = ""; }; BC245DEE14DDC959009FE7EB /* ColorTrackingAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ColorTrackingAppDelegate.m; sourceTree = ""; }; BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCB3C3DA16BCA51E003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C3DB16BCA51E003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C3DC16BCA51E003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C3DD16BCA51E003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C3DE16BCA51E003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCB5DD8214E85CB0000AF3C2 /* PositionColor.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = PositionColor.fsh; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.glsl; }; BCB5E74414DDCF4F00701302 /* ColorTrackingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorTrackingViewController.h; sourceTree = ""; }; BCB5E74514DDCF4F00701302 /* ColorTrackingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ColorTrackingViewController.m; sourceTree = ""; }; @@ -140,6 +150,11 @@ BC245DE514DDC959009FE7EB /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C3DA16BCA51E003D26B0 /* Icon-72.png */, + BCB3C3DB16BCA51E003D26B0 /* Icon-72@2x.png */, + BCB3C3DC16BCA51E003D26B0 /* Icon.png */, + BCB3C3DD16BCA51E003D26B0 /* Icon@2x.png */, + BCB3C3DE16BCA51E003D26B0 /* iTunesArtwork.png */, BC245DE614DDC959009FE7EB /* ColorObjectTracking-Info.plist */, BC245DE714DDC959009FE7EB /* InfoPlist.strings */, BC245DEA14DDC959009FE7EB /* main.m */, @@ -244,6 +259,11 @@ BC245DE914DDC959009FE7EB /* InfoPlist.strings in Resources */, BCB5E7B214E460D300701302 /* Threshold.fsh in Resources */, BCB5DD8314E85CB0000AF3C2 /* PositionColor.fsh in Resources */, + BCB3C3DF16BCA51E003D26B0 /* Icon-72.png in Resources */, + BCB3C3E016BCA51E003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C3E116BCA51E003D26B0 /* Icon.png in Resources */, + BCB3C3E216BCA51E003D26B0 /* Icon@2x.png in Resources */, + BCB3C3E316BCA51E003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist b/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist index b486ef4dc..842a62042 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist +++ b/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist @@ -24,10 +24,12 @@ ???? CFBundleVersion 1.0 - UIFileSharingEnabled - LSRequiresIPhoneOS + UIFileSharingEnabled + + UIPrerenderedIcon + UIRequiredDeviceCapabilities armv7 diff --git a/examples/CubeExample/CubeExample-Info.plist b/examples/CubeExample/CubeExample-Info.plist index bcf7ff5db..9ee59cfa8 100755 --- a/examples/CubeExample/CubeExample-Info.plist +++ b/examples/CubeExample/CubeExample-Info.plist @@ -24,12 +24,14 @@ 1.0 LSRequiresIPhoneOS - UIStatusBarHidden + UIPrerenderedIcon UIRequiredDeviceCapabilities armv7 + UIStatusBarHidden + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj b/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj index 6fdfafe55..3fbda5178 100755 --- a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj +++ b/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj @@ -16,6 +16,11 @@ 2514C27C10084DCA00A42282 /* Shader.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 2514C27A10084DCA00A42282 /* Shader.vsh */; }; 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD15070DC6FC5B0079059D /* QuartzCore.framework */; }; + BCB3C3EC16BCA5AC003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3E716BCA5AC003D26B0 /* Icon-72.png */; }; + BCB3C3ED16BCA5AC003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3E816BCA5AC003D26B0 /* Icon-72@2x.png */; }; + BCB3C3EE16BCA5AC003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3E916BCA5AC003D26B0 /* Icon.png */; }; + BCB3C3EF16BCA5AC003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3EA16BCA5AC003D26B0 /* Icon@2x.png */; }; + BCB3C3F016BCA5AC003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3EB16BCA5AC003D26B0 /* iTunesArtwork.png */; }; BCB6B8A41505A9840041703B /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A11505A9840041703B /* AVFoundation.framework */; }; BCB6B8A51505A9840041703B /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A21505A9840041703B /* CoreMedia.framework */; }; BCB6B8A61505A9840041703B /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A31505A9840041703B /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; @@ -64,6 +69,11 @@ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* CubeExample_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CubeExample_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* CubeExample-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CubeExample-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; + BCB3C3E716BCA5AC003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C3E816BCA5AC003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C3E916BCA5AC003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C3EA16BCA5AC003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C3EB16BCA5AC003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCB6B883150447DF0041703B /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCB6B8A11505A9840041703B /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCB6B8A21505A9840041703B /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; @@ -149,6 +159,11 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + BCB3C3E716BCA5AC003D26B0 /* Icon-72.png */, + BCB3C3E816BCA5AC003D26B0 /* Icon-72@2x.png */, + BCB3C3E916BCA5AC003D26B0 /* Icon.png */, + BCB3C3EA16BCA5AC003D26B0 /* Icon@2x.png */, + BCB3C3EB16BCA5AC003D26B0 /* iTunesArtwork.png */, 8D1107310486CEB800E47090 /* CubeExample-Info.plist */, ); name = Resources; @@ -254,6 +269,11 @@ files = ( 2514C27B10084DCA00A42282 /* Shader.fsh in Resources */, 2514C27C10084DCA00A42282 /* Shader.vsh in Resources */, + BCB3C3EC16BCA5AC003D26B0 /* Icon-72.png in Resources */, + BCB3C3ED16BCA5AC003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C3EE16BCA5AC003D26B0 /* Icon.png in Resources */, + BCB3C3EF16BCA5AC003D26B0 /* Icon@2x.png in Resources */, + BCB3C3F016BCA5AC003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index 01f5682ea..ab5f3e26d 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -22,6 +22,11 @@ BC18E0CC156C881700AB8026 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0CB156C881700AB8026 /* 71yih.png */; }; BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC46D52315D03D9C00CC63CA /* LBPTest.png */; }; BCA464C9162785EA00C0F68E /* LineTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCA464C8162785EA00C0F68E /* LineTest.png */; }; + BCB3C3F916BCA61A003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F416BCA61A003D26B0 /* Icon-72.png */; }; + BCB3C3FA16BCA61A003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */; }; + BCB3C3FB16BCA61A003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F616BCA61A003D26B0 /* Icon.png */; }; + BCB3C3FC16BCA61A003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F716BCA61A003D26B0 /* Icon@2x.png */; }; + BCB3C3FD16BCA61A003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F816BCA61A003D26B0 /* iTunesArtwork.png */; }; BCB79DC715E9754000965D92 /* ChairTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB79DC615E9754000965D92 /* ChairTest.png */; }; BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCD9A355157EC35E00C41504 /* 8pixeltest.png */; }; BCF2860F1628A5140051E9C5 /* LineTest2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF2860E1628A5140051E9C5 /* LineTest2.png */; }; @@ -71,6 +76,11 @@ BC18E0CB156C881700AB8026 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; BC46D52315D03D9C00CC63CA /* LBPTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LBPTest.png; sourceTree = ""; }; BCA464C8162785EA00C0F68E /* LineTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest.png; sourceTree = ""; }; + BCB3C3F416BCA61A003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C3F616BCA61A003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C3F716BCA61A003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C3F816BCA61A003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCB79DC615E9754000965D92 /* ChairTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ChairTest.png; sourceTree = ""; }; BCD9A355157EC35E00C41504 /* 8pixeltest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 8pixeltest.png; sourceTree = ""; }; BCF2860E1628A5140051E9C5 /* LineTest2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest2.png; sourceTree = ""; }; @@ -142,6 +152,11 @@ BC18E0A1156C822E00AB8026 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C3F416BCA61A003D26B0 /* Icon-72.png */, + BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */, + BCB3C3F616BCA61A003D26B0 /* Icon.png */, + BCB3C3F716BCA61A003D26B0 /* Icon@2x.png */, + BCB3C3F816BCA61A003D26B0 /* iTunesArtwork.png */, BCF2860E1628A5140051E9C5 /* LineTest2.png */, BCA464C8162785EA00C0F68E /* LineTest.png */, BC46D52315D03D9C00CC63CA /* LBPTest.png */, @@ -248,6 +263,11 @@ BCB79DC715E9754000965D92 /* ChairTest.png in Resources */, BCA464C9162785EA00C0F68E /* LineTest.png in Resources */, BCF2860F1628A5140051E9C5 /* LineTest2.png in Resources */, + BCB3C3F916BCA61A003D26B0 /* Icon-72.png in Resources */, + BCB3C3FA16BCA61A003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C3FB16BCA61A003D26B0 /* Icon.png in Resources */, + BCB3C3FC16BCA61A003D26B0 /* Icon@2x.png in Resources */, + BCB3C3FD16BCA61A003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist index 3559393ab..09637b9c1 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist +++ b/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist @@ -4,8 +4,6 @@ CFBundleDevelopmentRegion en - UIFileSharingEnabled - CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable @@ -26,6 +24,10 @@ 1.0 LSRequiresIPhoneOS + UIFileSharingEnabled + + UIPrerenderedIcon + UIRequiredDeviceCapabilities armv7 diff --git a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 55c044783..68798cff8 100755 --- a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -27,6 +27,11 @@ BC982B4214F06BF70001FF6F /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B3014F049950001FF6F /* libGPUImage.a */; }; BC982BD114F1C0F00001FF6F /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BC982BD014F1C0F00001FF6F /* WID-small.jpg */; }; BC982C4114F1F6C80001FF6F /* CustomFilter.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BC982C4014F1F6C80001FF6F /* CustomFilter.fsh */; }; + BCB3C3C516BCA2EB003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C016BCA2EB003D26B0 /* Icon-72.png */; }; + BCB3C3C616BCA2EB003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C116BCA2EB003D26B0 /* Icon-72@2x.png */; }; + BCB3C3C716BCA2EB003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C216BCA2EB003D26B0 /* Icon.png */; }; + BCB3C3C816BCA2EB003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C316BCA2EB003D26B0 /* Icon@2x.png */; }; + BCB3C3C916BCA2EB003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C416BCA2EB003D26B0 /* iTunesArtwork.png */; }; BCF9D9AB15CCD1AF007E7FBA /* lookup_amatorka.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */; }; BCF9D9AC15CCD1AF007E7FBA /* lookup_miss_etikate.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */; }; BCF9D9AD15CCD1AF007E7FBA /* lookup_soft_elegance_1.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */; }; @@ -88,6 +93,11 @@ BC982B3E14F05DC10001FF6F /* ShowcaseFilterListController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShowcaseFilterListController.m; sourceTree = ""; }; BC982BD014F1C0F00001FF6F /* WID-small.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = "WID-small.jpg"; path = "../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg"; sourceTree = ""; }; BC982C4014F1F6C80001FF6F /* CustomFilter.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = CustomFilter.fsh; sourceTree = ""; }; + BCB3C3C016BCA2EB003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C3C116BCA2EB003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C3C216BCA2EB003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C3C316BCA2EB003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C3C416BCA2EB003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_amatorka.png; path = ../../../framework/Resources/lookup_amatorka.png; sourceTree = ""; }; BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; @@ -172,6 +182,11 @@ BC982B0D14F046AC0001FF6F /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C3C016BCA2EB003D26B0 /* Icon-72.png */, + BCB3C3C116BCA2EB003D26B0 /* Icon-72@2x.png */, + BCB3C3C216BCA2EB003D26B0 /* Icon.png */, + BCB3C3C316BCA2EB003D26B0 /* Icon@2x.png */, + BCB3C3C416BCA2EB003D26B0 /* iTunesArtwork.png */, BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */, BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */, BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */, @@ -290,6 +305,11 @@ BCF9D9AC15CCD1AF007E7FBA /* lookup_miss_etikate.png in Resources */, BCF9D9AD15CCD1AF007E7FBA /* lookup_soft_elegance_1.png in Resources */, BCF9D9AE15CCD1AF007E7FBA /* lookup_soft_elegance_2.png in Resources */, + BCB3C3C516BCA2EB003D26B0 /* Icon-72.png in Resources */, + BCB3C3C616BCA2EB003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C3C716BCA2EB003D26B0 /* Icon.png in Resources */, + BCB3C3C816BCA2EB003D26B0 /* Icon@2x.png in Resources */, + BCB3C3C916BCA2EB003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist b/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist index 94fae500b..6bf36763c 100755 --- a/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist +++ b/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist @@ -24,6 +24,8 @@ 1.0 LSRequiresIPhoneOS + UIPrerenderedIcon + UIRequiredDeviceCapabilities armv7 diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj index aaa2ae92f..5472cd4b9 100755 --- a/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj +++ b/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj @@ -21,6 +21,11 @@ BC01CAB514E763FC00967264 /* MultiViewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01CAB414E763FC00967264 /* MultiViewViewController.m */; }; BC3145C814E76BA700824EA0 /* Shader1.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BC3145C614E76BA700824EA0 /* Shader1.fsh */; }; BC3145C914E76BA700824EA0 /* Shader2.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BC3145C714E76BA700824EA0 /* Shader2.fsh */; }; + BCB3C40616BCA69F003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40116BCA69F003D26B0 /* Icon-72.png */; }; + BCB3C40716BCA69F003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40216BCA69F003D26B0 /* Icon-72@2x.png */; }; + BCB3C40816BCA69F003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40316BCA69F003D26B0 /* Icon.png */; }; + BCB3C40916BCA69F003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40416BCA69F003D26B0 /* Icon@2x.png */; }; + BCB3C40A16BCA69F003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40516BCA69F003D26B0 /* iTunesArtwork.png */; }; BCB5DD6614E76CD2000AF3C2 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DD6514E76CD2000AF3C2 /* AVFoundation.framework */; }; /* End PBXBuildFile section */ @@ -68,6 +73,11 @@ BC01CAB414E763FC00967264 /* MultiViewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MultiViewViewController.m; sourceTree = ""; }; BC3145C614E76BA700824EA0 /* Shader1.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = Shader1.fsh; sourceTree = ""; }; BC3145C714E76BA700824EA0 /* Shader2.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = Shader2.fsh; sourceTree = ""; }; + BCB3C40116BCA69F003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C40216BCA69F003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C40316BCA69F003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C40416BCA69F003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C40516BCA69F003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCB5DD6514E76CD2000AF3C2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ @@ -141,6 +151,11 @@ BC01CA8C14E7620600967264 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C40116BCA69F003D26B0 /* Icon-72.png */, + BCB3C40216BCA69F003D26B0 /* Icon-72@2x.png */, + BCB3C40316BCA69F003D26B0 /* Icon.png */, + BCB3C40416BCA69F003D26B0 /* Icon@2x.png */, + BCB3C40516BCA69F003D26B0 /* iTunesArtwork.png */, BC01CA8D14E7620600967264 /* MultiViewFilterExample-Info.plist */, BC01CA8E14E7620600967264 /* InfoPlist.strings */, BC01CA9114E7620600967264 /* main.m */, @@ -236,6 +251,11 @@ BC01CA9014E7620600967264 /* InfoPlist.strings in Resources */, BC3145C814E76BA700824EA0 /* Shader1.fsh in Resources */, BC3145C914E76BA700824EA0 /* Shader2.fsh in Resources */, + BCB3C40616BCA69F003D26B0 /* Icon-72.png in Resources */, + BCB3C40716BCA69F003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C40816BCA69F003D26B0 /* Icon.png in Resources */, + BCB3C40916BCA69F003D26B0 /* Icon@2x.png in Resources */, + BCB3C40A16BCA69F003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist index 93f7ddf83..fc2b1a87b 100755 --- a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist +++ b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist @@ -26,6 +26,8 @@ 1.0 LSRequiresIPhoneOS + UIPrerenderedIcon + UIRequiredDeviceCapabilities armv7 diff --git a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj b/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj index 886dfaeb5..cff6c455f 100644 --- a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj +++ b/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj @@ -9,6 +9,11 @@ /* Begin PBXBuildFile section */ BC18E03D156B352E00AB8026 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E62F1569D454006B155F /* libGPUImage.a */; }; BC18E03F156B354000AB8026 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E03E156B354000AB8026 /* CoreMedia.framework */; }; + BCB3C41116BCA74F003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40E16BCA74F003D26B0 /* Icon-72.png */; }; + BCB3C41216BCA74F003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40F16BCA74F003D26B0 /* Icon-72@2x.png */; }; + BCB3C41316BCA74F003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C41016BCA74F003D26B0 /* Icon@2x.png */; }; + BCB3C41816BCA75A003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C41616BCA75A003D26B0 /* Icon.png */; }; + BCB3C41916BCA75A003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C41716BCA75A003D26B0 /* iTunesArtwork.png */; }; BCF1E6071569D372006B155F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6061569D372006B155F /* UIKit.framework */; }; BCF1E6091569D372006B155F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6081569D372006B155F /* Foundation.framework */; }; BCF1E60B1569D372006B155F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E60A1569D372006B155F /* CoreGraphics.framework */; }; @@ -48,6 +53,11 @@ /* Begin PBXFileReference section */ BC18E03E156B354000AB8026 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + BCB3C40E16BCA74F003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C40F16BCA74F003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C41016BCA74F003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C41616BCA75A003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C41716BCA75A003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCF1E6021569D372006B155F /* RawDataTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RawDataTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCF1E6061569D372006B155F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCF1E6081569D372006B155F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -133,6 +143,11 @@ BCF1E60D1569D372006B155F /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C41616BCA75A003D26B0 /* Icon.png */, + BCB3C41716BCA75A003D26B0 /* iTunesArtwork.png */, + BCB3C40E16BCA74F003D26B0 /* Icon-72.png */, + BCB3C40F16BCA74F003D26B0 /* Icon-72@2x.png */, + BCB3C41016BCA74F003D26B0 /* Icon@2x.png */, BCF1E60E1569D372006B155F /* RawDataTest-Info.plist */, BCF1E60F1569D372006B155F /* InfoPlist.strings */, BCF1E6121569D372006B155F /* main.m */, @@ -228,6 +243,11 @@ files = ( BCF1E6111569D372006B155F /* InfoPlist.strings in Resources */, BCF1E63F156AAB4E006B155F /* CalculationShader.fsh in Resources */, + BCB3C41116BCA74F003D26B0 /* Icon-72.png in Resources */, + BCB3C41216BCA74F003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C41316BCA74F003D26B0 /* Icon@2x.png in Resources */, + BCB3C41816BCA75A003D26B0 /* Icon.png in Resources */, + BCB3C41916BCA75A003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/RawDataTest/RawDataTest/RawDataTest-Info.plist b/examples/RawDataTest/RawDataTest/RawDataTest-Info.plist index 94fae500b..6bf36763c 100644 --- a/examples/RawDataTest/RawDataTest/RawDataTest-Info.plist +++ b/examples/RawDataTest/RawDataTest/RawDataTest-Info.plist @@ -24,6 +24,8 @@ 1.0 LSRequiresIPhoneOS + UIPrerenderedIcon + UIRequiredDeviceCapabilities armv7 diff --git a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj index 1e1db03ec..25ac78ead 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj @@ -7,6 +7,11 @@ objects = { /* Begin PBXBuildFile section */ + BCB3C42016BCA7B7003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C41B16BCA7B7003D26B0 /* Icon-72.png */; }; + BCB3C42116BCA7B7003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C41C16BCA7B7003D26B0 /* Icon-72@2x.png */; }; + BCB3C42216BCA7B7003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C41D16BCA7B7003D26B0 /* Icon.png */; }; + BCB3C42316BCA7B7003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C41E16BCA7B7003D26B0 /* Icon@2x.png */; }; + BCB3C42416BCA7B7003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C41F16BCA7B7003D26B0 /* iTunesArtwork.png */; }; BCB5E7ED14E605A900701302 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7EC14E605A900701302 /* UIKit.framework */; }; BCB5E7EF14E605A900701302 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7EE14E605A900701302 /* Foundation.framework */; }; BCB5E7F114E605A900701302 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7F014E605A900701302 /* CoreGraphics.framework */; }; @@ -49,6 +54,11 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + BCB3C41B16BCA7B7003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C41C16BCA7B7003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C41D16BCA7B7003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C41E16BCA7B7003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C41F16BCA7B7003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCB5E7E814E605A900701302 /* SimpleImageFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleImageFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCB5E7EC14E605A900701302 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCB5E7EE14E605A900701302 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -139,6 +149,11 @@ BCB5E7F314E605A900701302 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C41B16BCA7B7003D26B0 /* Icon-72.png */, + BCB3C41C16BCA7B7003D26B0 /* Icon-72@2x.png */, + BCB3C41D16BCA7B7003D26B0 /* Icon.png */, + BCB3C41E16BCA7B7003D26B0 /* Icon@2x.png */, + BCB3C41F16BCA7B7003D26B0 /* iTunesArtwork.png */, BCB5E86414E6F1D700701302 /* Lambeau.jpg */, BCB5E86214E6F05A00701302 /* WID-small.jpg */, BCB5E7F414E605A900701302 /* SimpleImageFilter-Info.plist */, @@ -236,6 +251,11 @@ BCB5E7F714E605A900701302 /* InfoPlist.strings in Resources */, BCB5E86314E6F05A00701302 /* WID-small.jpg in Resources */, BCB5E86514E6F1D700701302 /* Lambeau.jpg in Resources */, + BCB3C42016BCA7B7003D26B0 /* Icon-72.png in Resources */, + BCB3C42116BCA7B7003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C42216BCA7B7003D26B0 /* Icon.png in Resources */, + BCB3C42316BCA7B7003D26B0 /* Icon@2x.png in Resources */, + BCB3C42416BCA7B7003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist index 42cd33d19..98c256a59 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist @@ -28,6 +28,8 @@ UIFileSharingEnabled + UIPrerenderedIcon + UIRequiredDeviceCapabilities opengles-2 diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index daa70d980..8580fce2a 100755 --- a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -8,6 +8,11 @@ /* Begin PBXBuildFile section */ BC6ED8E11545B9A900966798 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC6ED8E01545B9A900966798 /* AssetsLibrary.framework */; }; + BCB3C42D16BCA81D003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C42816BCA81D003D26B0 /* Icon-72.png */; }; + BCB3C42E16BCA81D003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C42916BCA81D003D26B0 /* Icon-72@2x.png */; }; + BCB3C42F16BCA81D003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C42A16BCA81D003D26B0 /* Icon.png */; }; + BCB3C43016BCA81D003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C42B16BCA81D003D26B0 /* Icon@2x.png */; }; + BCB3C43116BCA81D003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C42C16BCA81D003D26B0 /* iTunesArtwork.png */; }; BCC1E6A11523E3620006EFA5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6A01523E3620006EFA5 /* UIKit.framework */; }; BCC1E6A31523E3620006EFA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6A21523E3620006EFA5 /* Foundation.framework */; }; BCC1E6A51523E3620006EFA5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6A41523E3620006EFA5 /* CoreGraphics.framework */; }; @@ -49,6 +54,11 @@ /* Begin PBXFileReference section */ BC6ED8E01545B9A900966798 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; + BCB3C42816BCA81D003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C42916BCA81D003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C42A16BCA81D003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C42B16BCA81D003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C42C16BCA81D003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCC1E69C1523E3620006EFA5 /* SimplePhotoFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimplePhotoFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCC1E6A01523E3620006EFA5 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCC1E6A21523E3620006EFA5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -139,6 +149,11 @@ BCC1E6A71523E3620006EFA5 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C42816BCA81D003D26B0 /* Icon-72.png */, + BCB3C42916BCA81D003D26B0 /* Icon-72@2x.png */, + BCB3C42A16BCA81D003D26B0 /* Icon.png */, + BCB3C42B16BCA81D003D26B0 /* Icon@2x.png */, + BCB3C42C16BCA81D003D26B0 /* iTunesArtwork.png */, BCC1E6A81523E3620006EFA5 /* SimplePhotoFilter-Info.plist */, BCC1E6A91523E3620006EFA5 /* InfoPlist.strings */, BCC1E6AC1523E3620006EFA5 /* main.m */, @@ -233,6 +248,11 @@ buildActionMask = 2147483647; files = ( BCC1E6AB1523E3620006EFA5 /* InfoPlist.strings in Resources */, + BCB3C42D16BCA81D003D26B0 /* Icon-72.png in Resources */, + BCB3C42E16BCA81D003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C42F16BCA81D003D26B0 /* Icon.png in Resources */, + BCB3C43016BCA81D003D26B0 /* Icon@2x.png in Resources */, + BCB3C43116BCA81D003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist b/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist index 6e2a43568..09637b9c1 100755 --- a/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist +++ b/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist @@ -24,6 +24,10 @@ 1.0 LSRequiresIPhoneOS + UIFileSharingEnabled + + UIPrerenderedIcon + UIRequiredDeviceCapabilities armv7 @@ -41,7 +45,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIFileSharingEnabled - diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj index 2c36e78a6..a888f31ae 100755 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj @@ -9,6 +9,11 @@ /* Begin PBXBuildFile section */ 466AE00B14F2A196004FE0E5 /* sample_iPod.m4v in Resources */ = {isa = PBXBuildFile; fileRef = 466AE00A14F2A196004FE0E5 /* sample_iPod.m4v */; }; BC11C28315BCBE2300E5BEC7 /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BC11C28215BCBE2300E5BEC7 /* WID-small.jpg */; }; + BCB3C43A16BCA871003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C43516BCA871003D26B0 /* Icon-72.png */; }; + BCB3C43B16BCA871003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C43616BCA871003D26B0 /* Icon-72@2x.png */; }; + BCB3C43C16BCA871003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C43716BCA871003D26B0 /* Icon.png */; }; + BCB3C43D16BCA871003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C43816BCA871003D26B0 /* Icon@2x.png */; }; + BCB3C43E16BCA871003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C43916BCA871003D26B0 /* iTunesArtwork.png */; }; BCB5DDCF14E86899000AF3C2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDCE14E86899000AF3C2 /* UIKit.framework */; }; BCB5DDD114E86899000AF3C2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDD014E86899000AF3C2 /* Foundation.framework */; }; BCB5DDD314E86899000AF3C2 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDD214E86899000AF3C2 /* CoreGraphics.framework */; }; @@ -52,6 +57,11 @@ /* Begin PBXFileReference section */ 466AE00A14F2A196004FE0E5 /* sample_iPod.m4v */ = {isa = PBXFileReference; lastKnownFileType = file; path = sample_iPod.m4v; sourceTree = ""; }; BC11C28215BCBE2300E5BEC7 /* WID-small.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "WID-small.jpg"; sourceTree = ""; }; + BCB3C43516BCA871003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C43616BCA871003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C43716BCA871003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C43816BCA871003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C43916BCA871003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCB5DDCA14E86899000AF3C2 /* SimpleVideoFileFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleVideoFileFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCB5DDCE14E86899000AF3C2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCB5DDD014E86899000AF3C2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -142,6 +152,11 @@ BCB5DDD514E86899000AF3C2 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C43516BCA871003D26B0 /* Icon-72.png */, + BCB3C43616BCA871003D26B0 /* Icon-72@2x.png */, + BCB3C43716BCA871003D26B0 /* Icon.png */, + BCB3C43816BCA871003D26B0 /* Icon@2x.png */, + BCB3C43916BCA871003D26B0 /* iTunesArtwork.png */, BC11C28215BCBE2300E5BEC7 /* WID-small.jpg */, 466AE00A14F2A196004FE0E5 /* sample_iPod.m4v */, BCB5DDD614E86899000AF3C2 /* SimpleVideoFileFilter-Info.plist */, @@ -240,6 +255,11 @@ BCB5DDE914E868C0000AF3C2 /* SimpleVideoFileFilterViewController.xib in Resources */, 466AE00B14F2A196004FE0E5 /* sample_iPod.m4v in Resources */, BC11C28315BCBE2300E5BEC7 /* WID-small.jpg in Resources */, + BCB3C43A16BCA871003D26B0 /* Icon-72.png in Resources */, + BCB3C43B16BCA871003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C43C16BCA871003D26B0 /* Icon.png in Resources */, + BCB3C43D16BCA871003D26B0 /* Icon@2x.png in Resources */, + BCB3C43E16BCA871003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist index fe9a164e9..842a62042 100755 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist +++ b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist @@ -26,7 +26,9 @@ 1.0 LSRequiresIPhoneOS - UIFileSharingEnabled + UIFileSharingEnabled + + UIPrerenderedIcon UIRequiredDeviceCapabilities diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj b/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj index fae63ea94..497ea0b52 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj +++ b/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj @@ -7,6 +7,11 @@ objects = { /* Begin PBXBuildFile section */ + BCB3C44716BCA8C4003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C44216BCA8C4003D26B0 /* Icon-72.png */; }; + BCB3C44816BCA8C4003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C44316BCA8C4003D26B0 /* Icon-72@2x.png */; }; + BCB3C44916BCA8C4003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C44416BCA8C4003D26B0 /* Icon.png */; }; + BCB3C44A16BCA8C4003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C44516BCA8C4003D26B0 /* Icon@2x.png */; }; + BCB3C44B16BCA8C4003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C44616BCA8C4003D26B0 /* iTunesArtwork.png */; }; BCB5DDCF14E86899000AF3C2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDCE14E86899000AF3C2 /* UIKit.framework */; }; BCB5DDD114E86899000AF3C2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDD014E86899000AF3C2 /* Foundation.framework */; }; BCB5DDD314E86899000AF3C2 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDD214E86899000AF3C2 /* CoreGraphics.framework */; }; @@ -48,6 +53,11 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + BCB3C44216BCA8C4003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; + BCB3C44316BCA8C4003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; + BCB3C44416BCA8C4003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; + BCB3C44516BCA8C4003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; + BCB3C44616BCA8C4003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCB5DDCA14E86899000AF3C2 /* SimpleVideoFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleVideoFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCB5DDCE14E86899000AF3C2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCB5DDD014E86899000AF3C2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -138,6 +148,11 @@ BCB5DDD514E86899000AF3C2 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCB3C44216BCA8C4003D26B0 /* Icon-72.png */, + BCB3C44316BCA8C4003D26B0 /* Icon-72@2x.png */, + BCB3C44416BCA8C4003D26B0 /* Icon.png */, + BCB3C44516BCA8C4003D26B0 /* Icon@2x.png */, + BCB3C44616BCA8C4003D26B0 /* iTunesArtwork.png */, BCB5DDD614E86899000AF3C2 /* SimpleVideoFilter-Info.plist */, BCB5DDD714E86899000AF3C2 /* InfoPlist.strings */, BCB5DDDA14E86899000AF3C2 /* main.m */, @@ -232,6 +247,11 @@ files = ( BCB5DDD914E86899000AF3C2 /* InfoPlist.strings in Resources */, BCB5DDE914E868C0000AF3C2 /* SimpleVideoFilterViewController.xib in Resources */, + BCB3C44716BCA8C4003D26B0 /* Icon-72.png in Resources */, + BCB3C44816BCA8C4003D26B0 /* Icon-72@2x.png in Resources */, + BCB3C44916BCA8C4003D26B0 /* Icon.png in Resources */, + BCB3C44A16BCA8C4003D26B0 /* Icon@2x.png in Resources */, + BCB3C44B16BCA8C4003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist index 8214f6b18..3a78c3e17 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist @@ -28,6 +28,8 @@ UIFileSharingEnabled + UIPrerenderedIcon + UIRequiredDeviceCapabilities armv7 From b958419f03ba1510653f100f28d6b98fb37a064a Mon Sep 17 00:00:00 2001 From: Martin Kiss Date: Thu, 7 Feb 2013 14:31:33 +0100 Subject: [PATCH 332/695] Add `finishRecording` method with completion block (with backward compatibility) iOS 6 SDK and higher: If writer responds to async method, call it, otherwise call synchronous method and completion handler. iOS 5 SDK and lower: Call only synchronous method and completion handler. The rest should not be even compiled. --- framework/Source/GPUImageMovieWriter.h | 1 + framework/Source/GPUImageMovieWriter.m | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/GPUImageMovieWriter.h index a25876679..0de531b97 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/GPUImageMovieWriter.h @@ -55,6 +55,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; - (void)startRecording; - (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; - (void)finishRecording; +- (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; - (void)cancelRecording; - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; - (void)enableSynchronizationCallbacks; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 78bc028c7..9d58e7018 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -261,6 +261,11 @@ - (void)cancelRecording; } - (void)finishRecording; +{ + [self finishRecordingWithCompletionHandler:nil]; +} + +- (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; { if (assetWriter.status == AVAssetWriterStatusCompleted) { @@ -271,10 +276,21 @@ - (void)finishRecording; runOnMainQueueWithoutDeadlocking(^{ [assetWriterVideoInput markAsFinished]; [assetWriterAudioInput markAsFinished]; -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) + // Not iOS 6 SDK [assetWriter finishWriting]; + if (handler) handler(); #else - [assetWriter finishWritingWithCompletionHandler:NULL]; + // iOS 6 SDK + if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { + // Running iOS 6 + [assetWriter finishWritingWithCompletionHandler:handler]; + } + else { + // Not running iOS 6 + [assetWriter finishWriting]; + if (handler) handler(); + } #endif }); } From 3b3012f72ed429a2ee07cba24fde34de46442623 Mon Sep 17 00:00:00 2001 From: Martin Kiss Date: Thu, 7 Feb 2013 14:38:34 +0100 Subject: [PATCH 333/695] Fix case of nil completion handler, `AVAssetWriter` does not accept it. --- framework/Source/GPUImageMovieWriter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 9d58e7018..b18971fb8 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -284,7 +284,7 @@ - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; // iOS 6 SDK if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { // Running iOS 6 - [assetWriter finishWritingWithCompletionHandler:handler]; + [assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; } else { // Not running iOS 6 From 84ed64f6b61f1b4056c4b7ca0aa9efbfb7ece98f Mon Sep 17 00:00:00 2001 From: Slavik Romanuk Date: Fri, 8 Feb 2013 13:56:59 +0200 Subject: [PATCH 334/695] Fixing FBO size when it should return zero-sized value. --- framework/Source/GPUImageFilter.m | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index c1eba441e..5aca18ccf 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -265,15 +265,21 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; - (CGSize)sizeOfFBO; { - CGSize outputSize = [self maximumOutputSize]; - if ( (CGSizeEqualToSize(outputSize, CGSizeZero)) || (inputTextureSize.width < outputSize.width) ) - { - return inputTextureSize; - } - else - { - return outputSize; + //CGSize outputSize = [self maximumOutputSize]; + //if ( (CGSizeEqualToSize(outputSize, CGSizeZero)) || (inputTextureSize.width < outputSize.width) ) + //{ + // return inputTextureSize; + //} + //else + //{ + // return outputSize; + //} + + if ( (CGSizeEqualToSize(inputTextureSize, CGSizeZero)) || (inputTextureSize.width < inputTextureSize.width) ) { + return CGSizeMake(720.f, 1280.f); } + + return inputTextureSize; } - (void)createFilterFBOofSize:(CGSize)currentFBOSize; From bcbb7e6029b672cbbbd772700b62a9e404fee428 Mon Sep 17 00:00:00 2001 From: Slavik Romanuk Date: Fri, 8 Feb 2013 14:03:07 +0200 Subject: [PATCH 335/695] Fixing crash if effect's target was nil. --- framework/Source/GPUImageFilter.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 5aca18ccf..5575dc9fb 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -157,7 +157,10 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) GPUImageFilter *filter = (__bridge_transfer GPUImageFilter*)info; CVPixelBufferUnlockBaseAddress([filter renderTarget], 0); - CFRelease([filter renderTarget]); + + if ([filter renderTarget]) { + CFRelease([filter renderTarget]); + } [filter destroyFilterFBO]; From 4240e6a19c6fd366954d60e910b7dbd1b6217f61 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 8 Feb 2013 22:46:44 -0600 Subject: [PATCH 336/695] Added a motion blur filter. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 12 ++ framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageMotionBlurFilter.h | 13 ++ framework/Source/GPUImageMotionBlurFilter.m | 166 ++++++++++++++++++ 7 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 framework/Source/GPUImageMotionBlurFilter.h create mode 100644 framework/Source/GPUImageMotionBlurFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 32a5b400a..080a62403 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -174,6 +174,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_FASTBLUR: cell.textLabel.text = @"Fast blur"; break; case GPUIMAGE_MEDIAN: cell.textLabel.text = @"Median (3x3)"; break; case GPUIMAGE_BILATERAL: cell.textLabel.text = @"Bilateral blur"; break; + case GPUIMAGE_MOTIONBLUR: cell.textLabel.text = @"Motion blur"; break; case GPUIMAGE_BOXBLUR: cell.textLabel.text = @"Box blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: cell.textLabel.text = @"Gaussian selective blur"; break; case GPUIMAGE_GAUSSIAN_POSITION: cell.textLabel.text = @"Gaussian (centered)"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 308bac851..094a20b64 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -72,6 +72,7 @@ typedef enum { GPUIMAGE_BOXBLUR, GPUIMAGE_MEDIAN, GPUIMAGE_BILATERAL, + GPUIMAGE_MOTIONBLUR, GPUIMAGE_SWIRL, GPUIMAGE_BULGE, GPUIMAGE_PINCH, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 35fd71a3c..8868d77a4 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1159,6 +1159,17 @@ - (void)setupFilter; filter = [[GPUImageMedianFilter alloc] init]; }; break; + case GPUIMAGE_MOTIONBLUR: + { + self.title = @"Motion Blur"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:180.0f]; + [self.filterSettingsSlider setValue:0.0]; + + filter = [[GPUImageMotionBlurFilter alloc] init]; + }; break; case GPUIMAGE_UIELEMENT: { self.title = @"UI Element"; @@ -1555,6 +1566,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setDistanceNormalizationFactor:[(UISlider*)sender value]]; break; case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_MOTIONBLUR: [(GPUImageMotionBlurFilter *)filter setBlurAngle:round([(UISlider*)sender value])]; break; case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)filter setOpacity:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)filter setExcludeCircleRadius:[(UISlider*)sender value]]; break; case GPUIMAGE_GAUSSIAN_POSITION: [(GPUImageGaussianBlurPositionFilter *)filter setBlurRadius:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 3ae9bf0c9..80b48b371 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -249,6 +249,8 @@ BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */; }; BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; }; BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */; }; + BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; }; + BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */; }; BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; @@ -583,6 +585,8 @@ BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminosity.m; path = Source/GPUImageLuminosity.m; sourceTree = SOURCE_ROOT; }; BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAverageLuminanceThresholdFilter.h; path = Source/GPUImageAverageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageLuminanceThresholdFilter.m; path = Source/GPUImageAverageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; + BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMotionBlurFilter.h; path = Source/GPUImageMotionBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMotionBlurFilter.m; path = Source/GPUImageMotionBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMonochromeFilter.h; path = Source/GPUImageMonochromeFilter.h; sourceTree = SOURCE_ROOT; }; BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; @@ -1054,6 +1058,8 @@ BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */, BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */, BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */, + BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */, + BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -1297,6 +1303,7 @@ BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */, BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */, 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */, + BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1564,6 +1571,7 @@ BC185E8316B866F000EA01AD /* GPUImagePixellatePositionFilter.m in Sources */, 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */, BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */, + BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 63236f980..d2209d701 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -147,4 +147,5 @@ #import "GPUImageGaussianBlurPositionFilter.h" #import "GPUImagePixellatePositionFilter.h" #import "GPUImageTwoInputCrossTextureSamplingFilter.h" -#import "GPUImagePoissonBlendFilter.h" \ No newline at end of file +#import "GPUImagePoissonBlendFilter.h" +#import "GPUImageMotionBlurFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageMotionBlurFilter.h b/framework/Source/GPUImageMotionBlurFilter.h new file mode 100644 index 000000000..dcca712f5 --- /dev/null +++ b/framework/Source/GPUImageMotionBlurFilter.h @@ -0,0 +1,13 @@ +#import "GPUImageFilter.h" + +@interface GPUImageMotionBlurFilter : GPUImageFilter + +/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 + */ +@property (readwrite, nonatomic) CGFloat blurSize; + +/** The angular direction of the blur, in degrees. 0 degrees by default + */ +@property (readwrite, nonatomic) CGFloat blurAngle; + +@end diff --git a/framework/Source/GPUImageMotionBlurFilter.m b/framework/Source/GPUImageMotionBlurFilter.m new file mode 100644 index 000000000..3a9d8d13b --- /dev/null +++ b/framework/Source/GPUImageMotionBlurFilter.m @@ -0,0 +1,166 @@ +#import "GPUImageMotionBlurFilter.h" + +// Override vertex shader to remove dependent texture reads +NSString *const kGPUImageTiltedTexelSamplingVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + uniform highp vec2 directionalTexelStep; + + varying vec2 textureCoordinate; + varying vec2 oneStepBackTextureCoordinate; + varying vec2 twoStepsBackTextureCoordinate; + varying vec2 threeStepsBackTextureCoordinate; + varying vec2 fourStepsBackTextureCoordinate; + varying vec2 oneStepForwardTextureCoordinate; + varying vec2 twoStepsForwardTextureCoordinate; + varying vec2 threeStepsForwardTextureCoordinate; + varying vec2 fourStepsForwardTextureCoordinate; + + void main() + { + gl_Position = position; + + textureCoordinate = inputTextureCoordinate.xy; + oneStepBackTextureCoordinate = inputTextureCoordinate.xy - directionalTexelStep; + twoStepsBackTextureCoordinate = inputTextureCoordinate.xy - 2.0 * directionalTexelStep; + threeStepsBackTextureCoordinate = inputTextureCoordinate.xy - 3.0 * directionalTexelStep; + fourStepsBackTextureCoordinate = inputTextureCoordinate.xy - 4.0 * directionalTexelStep; + oneStepForwardTextureCoordinate = inputTextureCoordinate.xy + directionalTexelStep; + twoStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 2.0 * directionalTexelStep; + threeStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 3.0 * directionalTexelStep; + fourStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 4.0 * directionalTexelStep; + } +); + +NSString *const kGPUImageMotionBlurFragmentShaderString = SHADER_STRING +( + precision highp float; + + uniform sampler2D inputImageTexture; + + varying vec2 textureCoordinate; + varying vec2 oneStepBackTextureCoordinate; + varying vec2 twoStepsBackTextureCoordinate; + varying vec2 threeStepsBackTextureCoordinate; + varying vec2 fourStepsBackTextureCoordinate; + varying vec2 oneStepForwardTextureCoordinate; + varying vec2 twoStepsForwardTextureCoordinate; + varying vec2 threeStepsForwardTextureCoordinate; + varying vec2 fourStepsForwardTextureCoordinate; + + void main() + { + // Box weights +// lowp vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.1111111; +// fragmentColor += texture2D(inputImageTexture, oneStepBackTextureCoordinate) * 0.1111111; +// fragmentColor += texture2D(inputImageTexture, twoStepsBackTextureCoordinate) * 0.1111111; +// fragmentColor += texture2D(inputImageTexture, threeStepsBackTextureCoordinate) * 0.1111111; +// fragmentColor += texture2D(inputImageTexture, fourStepsBackTextureCoordinate) * 0.1111111; +// fragmentColor += texture2D(inputImageTexture, oneStepForwardTextureCoordinate) * 0.1111111; +// fragmentColor += texture2D(inputImageTexture, twoStepsForwardTextureCoordinate) * 0.1111111; +// fragmentColor += texture2D(inputImageTexture, threeStepsForwardTextureCoordinate) * 0.1111111; +// fragmentColor += texture2D(inputImageTexture, fourStepsForwardTextureCoordinate) * 0.1111111; + + lowp vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.18; + fragmentColor += texture2D(inputImageTexture, oneStepBackTextureCoordinate) * 0.15; + fragmentColor += texture2D(inputImageTexture, twoStepsBackTextureCoordinate) * 0.12; + fragmentColor += texture2D(inputImageTexture, threeStepsBackTextureCoordinate) * 0.09; + fragmentColor += texture2D(inputImageTexture, fourStepsBackTextureCoordinate) * 0.05; + fragmentColor += texture2D(inputImageTexture, oneStepForwardTextureCoordinate) * 0.15; + fragmentColor += texture2D(inputImageTexture, twoStepsForwardTextureCoordinate) * 0.12; + fragmentColor += texture2D(inputImageTexture, threeStepsForwardTextureCoordinate) * 0.09; + fragmentColor += texture2D(inputImageTexture, fourStepsForwardTextureCoordinate) * 0.05; + + gl_FragColor = fragmentColor; + } +); + +@interface GPUImageMotionBlurFilter() +{ + GLint directionalTexelStepUniform; +} + +- (void)recalculateTexelOffsets; + +@end + +@implementation GPUImageMotionBlurFilter + +@synthesize blurSize = _blurSize; +@synthesize blurAngle = _blurAngle; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithVertexShaderFromString:kGPUImageTiltedTexelSamplingVertexShaderString fragmentShaderFromString:kGPUImageMotionBlurFragmentShaderString])) + { + return nil; + } + + directionalTexelStepUniform = [filterProgram uniformIndex:@"directionalTexelStep"]; + + self.blurSize = 2.5; + self.blurAngle = 0.0; + + return self; +} + +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + CGSize oldInputSize = inputTextureSize; + [super setInputSize:newSize atIndex:textureIndex]; + + if (!CGSizeEqualToSize(oldInputSize, inputTextureSize) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) + { + [self recalculateTexelOffsets]; + } +} + +- (void)recalculateTexelOffsets; +{ + CGFloat aspectRatio = 1.0; + CGPoint texelOffsets; + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + aspectRatio = (inputTextureSize.width / inputTextureSize.height); + texelOffsets.x = _blurSize * sin(_blurAngle * M_PI / 180.0) * aspectRatio / inputTextureSize.height; + texelOffsets.y = _blurSize * cos(_blurAngle * M_PI / 180.0) / inputTextureSize.height; + } + else + { + aspectRatio = (inputTextureSize.height / inputTextureSize.width); + texelOffsets.x = _blurSize * cos(_blurAngle * M_PI / 180.0) * aspectRatio / inputTextureSize.width; + texelOffsets.y = _blurSize * sin(_blurAngle * M_PI / 180.0) / inputTextureSize.width; + } + + [self setPoint:texelOffsets forUniform:directionalTexelStepUniform program:filterProgram]; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self recalculateTexelOffsets]; +} + +- (void)setBlurAngle:(CGFloat)newValue; +{ + _blurAngle = newValue; + [self recalculateTexelOffsets]; +} + +- (void)setBlurSize:(CGFloat)newValue; +{ + _blurSize = newValue; + [self recalculateTexelOffsets]; +} + + +@end From 28c0e08ce335be77db7352c3debb8bbb8a13a56d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 8 Feb 2013 22:54:20 -0600 Subject: [PATCH 337/695] Incorporated Jacob Gundersen's fixes to the Voronoi filter, fixed the naming of it across the framework. --- .../ShowcaseFilterListController.m | 2 +- .../ShowcaseFilterViewController.h | 2 +- .../ShowcaseFilterViewController.m | 14 +- framework/GPUImage.xcodeproj/project.pbxproj | 32 +-- framework/Source/GPUImage.h | 4 +- ...oniFilter.h => GPUImageJFAVoronoiFilter.h} | 8 +- ...oniFilter.m => GPUImageJFAVoronoiFilter.m} | 182 +++++++++--------- ...lter.h => GPUImageVoronoiConsumerFilter.h} | 2 +- ...lter.m => GPUImageVoronoiConsumerFilter.m} | 19 +- 9 files changed, 130 insertions(+), 135 deletions(-) rename framework/Source/{GPUImageJFAVoroniFilter.h => GPUImageJFAVoronoiFilter.h} (68%) rename framework/Source/{GPUImageJFAVoroniFilter.m => GPUImageJFAVoronoiFilter.m} (79%) rename framework/Source/{GPUImageVoroniConsumerFilter.h => GPUImageVoronoiConsumerFilter.h} (64%) rename framework/Source/{GPUImageVoroniConsumerFilter.m => GPUImageVoronoiConsumerFilter.m} (74%) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 080a62403..10ba90384 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -141,7 +141,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_OPENING: cell.textLabel.text = @"Opening"; break; case GPUIMAGE_CLOSING: cell.textLabel.text = @"Closing"; break; case GPUIMAGE_PERLINNOISE: cell.textLabel.text = @"Perlin noise"; break; - case GPUIMAGE_VORONI: cell.textLabel.text = @"Voroni"; break; + case GPUIMAGE_VORONOI: cell.textLabel.text = @"Voronoi"; break; case GPUIMAGE_MOSAIC: cell.textLabel.text = @"Mosaic"; break; case GPUIMAGE_LOCALBINARYPATTERN: cell.textLabel.text = @"Local binary pattern"; break; case GPUIMAGE_CHROMAKEY: cell.textLabel.text = @"Chroma key blend (green)"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 094a20b64..850c2ecb1 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -84,7 +84,7 @@ typedef enum { GPUIMAGE_OPENING, GPUIMAGE_CLOSING, GPUIMAGE_PERLINNOISE, - GPUIMAGE_VORONI, + GPUIMAGE_VORONOI, GPUIMAGE_MOSAIC, GPUIMAGE_LOCALBINARYPATTERN, GPUIMAGE_DISSOLVE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 8868d77a4..171034081 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -832,22 +832,22 @@ - (void)setupFilter; filter = [[GPUImagePerlinNoiseFilter alloc] init]; }; break; - case GPUIMAGE_VORONI: + case GPUIMAGE_VORONOI: { - self.title = @"Voroni"; + self.title = @"Voronoi"; self.filterSettingsSlider.hidden = YES; - GPUImageJFAVoroniFilter *jfa = [[GPUImageJFAVoroniFilter alloc] init]; + GPUImageJFAVoronoiFilter *jfa = [[GPUImageJFAVoronoiFilter alloc] init]; [jfa setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; sourcePicture = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"voroni_points2.png"]]; [sourcePicture addTarget:jfa]; - filter = [[GPUImageVoroniConsumerFilter alloc] init]; + filter = [[GPUImageVoronoiConsumerFilter alloc] init]; [jfa setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; - [(GPUImageVoroniConsumerFilter *)filter setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; + [(GPUImageVoronoiConsumerFilter *)filter setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; [videoCamera addTarget:filter]; [jfa addTarget:filter]; @@ -1266,7 +1266,7 @@ - (void)setupFilter; else { - if (filterType != GPUIMAGE_VORONI) + if (filterType != GPUIMAGE_VORONOI) { [videoCamera addTarget:filter]; } @@ -1283,7 +1283,7 @@ - (void)setupFilter; inputImage = [UIImage imageNamed:@"mask"]; } /* - else if (filterType == GPUIMAGE_VORONI) { + else if (filterType == GPUIMAGE_VORONOI) { inputImage = [UIImage imageNamed:@"voroni_points.png"]; }*/ else { diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 80b48b371..1b2f14a8c 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -301,12 +301,12 @@ BCF1A34C14DDB1EC00852800 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33414DDB1EC00852800 /* libGPUImage.a */; }; BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1A35014DDB1EC00852800 /* InfoPlist.strings */; }; BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1A35414DDB1EC00852800 /* GPUImageTests.m */; }; - BCF1E54015669907006B155F /* GPUImageJFAVoroniFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoroniFilter.h */; }; - BCF1E54115669907006B155F /* GPUImageJFAVoroniFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53B15669907006B155F /* GPUImageJFAVoroniFilter.m */; }; + BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; }; + BCF1E54115669907006B155F /* GPUImageJFAVoronoiFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */; }; BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; }; BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */; }; - BCF1E54415669907006B155F /* GPUImageVoroniConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoroniConsumerFilter.h */; }; - BCF1E54515669907006B155F /* GPUImageVoroniConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */; }; + BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; }; + BCF1E54515669907006B155F /* GPUImageVoronoiConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoronoiConsumerFilter.m */; }; BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; }; BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */; }; BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; }; @@ -636,12 +636,12 @@ BCF1A35114DDB1EC00852800 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; BCF1A35314DDB1EC00852800 /* GPUImageTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPUImageTests.h; sourceTree = ""; }; BCF1A35414DDB1EC00852800 /* GPUImageTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPUImageTests.m; sourceTree = ""; }; - BCF1E53A15669907006B155F /* GPUImageJFAVoroniFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageJFAVoroniFilter.h; path = Source/GPUImageJFAVoroniFilter.h; sourceTree = SOURCE_ROOT; }; - BCF1E53B15669907006B155F /* GPUImageJFAVoroniFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageJFAVoroniFilter.m; path = Source/GPUImageJFAVoroniFilter.m; sourceTree = SOURCE_ROOT; }; + BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageJFAVoronoiFilter.h; path = Source/GPUImageJFAVoronoiFilter.h; sourceTree = SOURCE_ROOT; }; + BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageJFAVoronoiFilter.m; path = Source/GPUImageJFAVoronoiFilter.m; sourceTree = SOURCE_ROOT; }; BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMosaicFilter.h; path = Source/GPUImageMosaicFilter.h; sourceTree = SOURCE_ROOT; }; BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMosaicFilter.m; path = Source/GPUImageMosaicFilter.m; sourceTree = SOURCE_ROOT; }; - BCF1E53E15669907006B155F /* GPUImageVoroniConsumerFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVoroniConsumerFilter.h; path = Source/GPUImageVoroniConsumerFilter.h; sourceTree = SOURCE_ROOT; }; - BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVoroniConsumerFilter.m; path = Source/GPUImageVoroniConsumerFilter.m; sourceTree = SOURCE_ROOT; }; + BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVoronoiConsumerFilter.h; path = Source/GPUImageVoronoiConsumerFilter.h; sourceTree = SOURCE_ROOT; }; + BCF1E53F15669907006B155F /* GPUImageVoronoiConsumerFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVoronoiConsumerFilter.m; path = Source/GPUImageVoronoiConsumerFilter.m; sourceTree = SOURCE_ROOT; }; BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageToneCurveFilter.h; path = Source/GPUImageToneCurveFilter.h; sourceTree = SOURCE_ROOT; }; BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageToneCurveFilter.m; path = Source/GPUImageToneCurveFilter.m; sourceTree = SOURCE_ROOT; }; BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataInput.h; path = Source/GPUImageRawDataInput.h; sourceTree = SOURCE_ROOT; }; @@ -890,12 +890,12 @@ BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */, 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */, 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */, - BCF1E53A15669907006B155F /* GPUImageJFAVoroniFilter.h */, - BCF1E53B15669907006B155F /* GPUImageJFAVoroniFilter.m */, + BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */, + BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */, BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */, BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */, - BCF1E53E15669907006B155F /* GPUImageVoroniConsumerFilter.h */, - BCF1E53F15669907006B155F /* GPUImageVoroniConsumerFilter.m */, + BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */, + BCF1E53F15669907006B155F /* GPUImageVoronoiConsumerFilter.m */, ); name = Effects; sourceTree = ""; @@ -1238,9 +1238,9 @@ BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */, BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */, BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */, - BCF1E54015669907006B155F /* GPUImageJFAVoroniFilter.h in Headers */, + BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */, BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */, - BCF1E54415669907006B155F /* GPUImageVoroniConsumerFilter.h in Headers */, + BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */, BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */, BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */, BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */, @@ -1505,9 +1505,9 @@ BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */, BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */, BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */, - BCF1E54115669907006B155F /* GPUImageJFAVoroniFilter.m in Sources */, + BCF1E54115669907006B155F /* GPUImageJFAVoronoiFilter.m in Sources */, BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */, - BCF1E54515669907006B155F /* GPUImageVoroniConsumerFilter.m in Sources */, + BCF1E54515669907006B155F /* GPUImageVoronoiConsumerFilter.m in Sources */, BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */, BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */, BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */, diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index d2209d701..84b9ee2e5 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -79,8 +79,8 @@ #import "GPUImagePolarPixellateFilter.h" #import "GPUImageStretchDistortionFilter.h" #import "GPUImagePerlinNoiseFilter.h" -#import "GPUImageJFAVoroniFilter.h" -#import "GPUImageVoroniConsumerFilter.h" +#import "GPUImageJFAVoronoiFilter.h" +#import "GPUImageVoronoiConsumerFilter.h" #import "GPUImageMosaicFilter.h" #import "GPUImageTiltShiftFilter.h" #import "GPUImage3x3ConvolutionFilter.h" diff --git a/framework/Source/GPUImageJFAVoroniFilter.h b/framework/Source/GPUImageJFAVoronoiFilter.h similarity index 68% rename from framework/Source/GPUImageJFAVoroniFilter.h rename to framework/Source/GPUImageJFAVoronoiFilter.h index de5c650f2..4c50cc37e 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.h +++ b/framework/Source/GPUImageJFAVoronoiFilter.h @@ -1,9 +1,11 @@ -#import "GPUImageTwoInputFilter.h" +#import "GPUImageFilter.h" -@interface GPUImageJFAVoroniFilter : GPUImageTwoInputFilter +@interface GPUImageJFAVoronoiFilter : GPUImageFilter { GLuint secondFilterOutputTexture; GLuint secondFilterFramebuffer; + + GLint sampleStepUniform; GLint sizeUniform; NSUInteger numPasses; @@ -12,4 +14,4 @@ @property (nonatomic, readwrite) CGSize sizeInPixels; -@end +@end \ No newline at end of file diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoronoiFilter.m similarity index 79% rename from framework/Source/GPUImageJFAVoroniFilter.m rename to framework/Source/GPUImageJFAVoronoiFilter.m index 9ad471559..7a61041af 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.m +++ b/framework/Source/GPUImageJFAVoronoiFilter.m @@ -1,17 +1,17 @@ // adapted from unitzeroone - http://unitzeroone.com/labs/jfavoronoi/ -#import "GPUImageJFAVoroniFilter.h" +#import "GPUImageJFAVoronoiFilter.h" -// The shaders are mostly taken from UnitZeroOne's WebGL example here: +// The shaders are mostly taken from UnitZeroOne's WebGL example here: // http://unitzeroone.com/blog/2011/03/22/jump-flood-voronoi-for-webgl/ -NSString *const kGPUImageJFAVoroniVertexShaderString = SHADER_STRING +NSString *const kGPUImageJFAVoronoiVertexShaderString = SHADER_STRING ( attribute vec4 position; attribute vec4 inputTextureCoordinate; - uniform highp float sampleStep; - + uniform highp float sampleStep; + varying vec2 textureCoordinate; varying vec2 leftTextureCoordinate; @@ -48,9 +48,9 @@ void main() } ); -NSString *const kGPUImageJFAVoroniFragmentShaderString = SHADER_STRING +NSString *const kGPUImageJFAVoronoiFragmentShaderString = SHADER_STRING ( - + precision highp float; varying vec2 textureCoordinate; @@ -83,7 +83,7 @@ vec2 getCoordFromColor(vec4 color) void main(void) { vec2 sub; - vec4 dst; + vec4 dst; vec4 local = texture2D(inputImageTexture, textureCoordinate); vec4 sam; float l; @@ -96,7 +96,7 @@ void main(void) { smallestDist = dot(sub,sub); } dst = local; - + sam = texture2D(inputImageTexture, topRightTextureCoordinate); if(sam.a == 1.0){ @@ -107,7 +107,7 @@ void main(void) { dst = sam; } } - + sam = texture2D(inputImageTexture, topTextureCoordinate); if(sam.a == 1.0){ sub = (getCoordFromColor(sam)-textureCoordinate); @@ -117,7 +117,7 @@ void main(void) { dst = sam; } } - + sam = texture2D(inputImageTexture, topLeftTextureCoordinate); if(sam.a == 1.0){ sub = (getCoordFromColor(sam)-textureCoordinate); @@ -127,7 +127,7 @@ void main(void) { dst = sam; } } - + sam = texture2D(inputImageTexture, bottomRightTextureCoordinate); if(sam.a == 1.0){ sub = (getCoordFromColor(sam)-textureCoordinate); @@ -137,7 +137,7 @@ void main(void) { dst = sam; } } - + sam = texture2D(inputImageTexture, bottomTextureCoordinate); if(sam.a == 1.0){ sub = (getCoordFromColor(sam)-textureCoordinate); @@ -147,7 +147,7 @@ void main(void) { dst = sam; } } - + sam = texture2D(inputImageTexture, bottomLeftTextureCoordinate); if(sam.a == 1.0){ sub = (getCoordFromColor(sam)-textureCoordinate); @@ -157,7 +157,7 @@ void main(void) { dst = sam; } } - + sam = texture2D(inputImageTexture, leftTextureCoordinate); if(sam.a == 1.0){ sub = (getCoordFromColor(sam)-textureCoordinate); @@ -167,7 +167,7 @@ void main(void) { dst = sam; } } - + sam = texture2D(inputImageTexture, rightTextureCoordinate); if(sam.a == 1.0){ sub = (getCoordFromColor(sam)-textureCoordinate); @@ -177,26 +177,34 @@ void main(void) { dst = sam; } } - gl_FragColor = dst; + gl_FragColor = dst; } ); -@implementation GPUImageJFAVoroniFilter +@interface GPUImageJFAVoronoiFilter() { + int currentPass; +} + + +@end + +@implementation GPUImageJFAVoronoiFilter @synthesize sizeInPixels = _sizeInPixels; - (id)init; { - if (!(self = [super initWithVertexShaderFromString:kGPUImageJFAVoroniVertexShaderString fragmentShaderFromString:kGPUImageJFAVoroniFragmentShaderString])) + if (!(self = [super initWithVertexShaderFromString:kGPUImageJFAVoronoiVertexShaderString fragmentShaderFromString:kGPUImageJFAVoronoiFragmentShaderString])) { - + NSLog(@"nil returned"); return nil; - + } sampleStepUniform = [filterProgram uniformIndex:@"sampleStep"]; sizeUniform = [filterProgram uniformIndex:@"size"]; + //[self disableSecondFrameCheck]; return self; } @@ -210,11 +218,11 @@ -(void)setSizeInPixels:(CGSize)sizeInPixels { float height = log2(sizeInPixels.height); if (width != height) { - NSLog(@"Voroni point texture must be square"); + NSLog(@"Voronoi point texture must be square"); return; } if (width != floor(width) || height != floor(height)) { - NSLog(@"Voroni point texture must be a power of 2. Texture size: %f, %f", sizeInPixels.width, sizeInPixels.height); + NSLog(@"Voronoi point texture must be a power of 2. Texture size: %f, %f", sizeInPixels.width, sizeInPixels.height); return; } glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); @@ -228,7 +236,7 @@ - (void)initializeOutputTextureIfNeeded; { [GPUImageOpenGLESContext useImageProcessingContext]; - glActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE2); glGenTextures(1, &outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -254,7 +262,7 @@ -(NSUInteger)nextPowerOfTwo:(CGPoint)input { } else { val = (NSUInteger)input.y; } - + val--; val = (val >> 1) | val; val = (val >> 2) | val; @@ -268,13 +276,14 @@ -(NSUInteger)nextPowerOfTwo:(CGPoint)input { - (void)createFilterFBOofSize:(CGSize)currentFBOSize { + [self prepareForImageCapture]; numPasses = (int)log2([self nextPowerOfTwo:CGPointMake(currentFBOSize.width, currentFBOSize.height)]); if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { - preparedToCaptureImage = NO; + //preparedToCaptureImage = NO; [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; + //preparedToCaptureImage = YES; } else @@ -293,8 +302,8 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize #else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); #endif - - if (err) + + if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } @@ -308,7 +317,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) + if (err) { NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); @@ -319,13 +328,13 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize NULL, // texture attributes GL_TEXTURE_2D, GL_RGBA, // opengl format - (int)currentFBOSize.width, + (int)currentFBOSize.width, (int)currentFBOSize.height, GL_BGRA, // native iOS format GL_UNSIGNED_BYTE, 0, &renderTexture); - if (err) + if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); } @@ -344,14 +353,22 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize else { [self initializeOutputTextureIfNeeded]; - + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); [self notifyTargetsAboutNewOutputTexture]; } - + + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); @@ -360,18 +377,18 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize } - //we may not need these +//we may not need these - (void)setSecondFilterFBO; { glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - // + // // CGSize currentFBOSize = [self sizeOfFBO]; // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } - (void)setOutputFBO; { - if (numPasses % 2 == 1) { + if (currentPass % 2 == 1) { [self setSecondFilterFBO]; } else { [self setFilterFBO]; @@ -384,76 +401,51 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { // Run the first stage of the two-pass filter [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + currentPass = 0; + [self setFilterFBO]; + + glActiveTexture(GL_TEXTURE2); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glUniform1f(sampleStepUniform, 0.5); glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + glBindTexture(GL_TEXTURE_2D, sourceTexture); + + glUniform1i(filterInputTextureUniform, 2); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); for (int pass = 1; pass <= numPasses + 1; pass++) { + currentPass = pass; + [self setOutputFBO]; + //glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); if (pass % 2 == 0) { - - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - - float step = pow(2.0, numPasses - pass) / pow(2.0, numPasses); - glUniform1f(sampleStepUniform, step); - glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); - - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:secondFilterOutputTexture]; + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); } else { - // Run the second stage of the two-pass filter - [self setSecondFilterFBO]; - - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, outputTexture); - - glUniform1i(filterInputTextureUniform, 3); - - float step = pow(2.0, numPasses - pass) / pow(2.0, numPasses); - glUniform1f(sampleStepUniform, step); - glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); - - if (filterSourceTexture2 != 0) - { - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); - - glUniform1i(filterInputTextureUniform2, 4); - } - - glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } + glUniform1i(filterInputTextureUniform, 2); + + float step = pow(2.0, numPasses - pass) / pow(2.0, numPasses); + glUniform1f(sampleStepUniform, step); + glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } } -/* -- (CGSize)maximumOutputSize; -{ - // I'm temporarily disabling adjustments for smaller output sizes until I figure out how to make this work better - - - if (CGSizeEqualToSize(cachedMaximumOutputSize, CGSizeZero)) - { - for (id currentTarget in targets) - { - if ([currentTarget maximumOutputSize].width > cachedMaximumOutputSize.width) - { - cachedMaximumOutputSize = [currentTarget maximumOutputSize]; - } - } - } - - return cachedMaximumOutputSize; - -}*/ - @end diff --git a/framework/Source/GPUImageVoroniConsumerFilter.h b/framework/Source/GPUImageVoronoiConsumerFilter.h similarity index 64% rename from framework/Source/GPUImageVoroniConsumerFilter.h rename to framework/Source/GPUImageVoronoiConsumerFilter.h index 69a9fcdcc..659e39d5b 100644 --- a/framework/Source/GPUImageVoroniConsumerFilter.h +++ b/framework/Source/GPUImageVoronoiConsumerFilter.h @@ -1,6 +1,6 @@ #import "GPUImageTwoInputFilter.h" -@interface GPUImageVoroniConsumerFilter : GPUImageTwoInputFilter +@interface GPUImageVoronoiConsumerFilter : GPUImageTwoInputFilter { GLint sizeUniform; } diff --git a/framework/Source/GPUImageVoroniConsumerFilter.m b/framework/Source/GPUImageVoronoiConsumerFilter.m similarity index 74% rename from framework/Source/GPUImageVoroniConsumerFilter.m rename to framework/Source/GPUImageVoronoiConsumerFilter.m index 8574c00e3..d7aeee295 100644 --- a/framework/Source/GPUImageVoroniConsumerFilter.m +++ b/framework/Source/GPUImageVoronoiConsumerFilter.m @@ -1,6 +1,6 @@ -#import "GPUImageVoroniConsumerFilter.h" +#import "GPUImageVoronoiConsumerFilter.h" -NSString *const kGPUImageVoroniConsumerFragmentShaderString = SHADER_STRING +NSString *const kGPUImageVoronoiConsumerFragmentShaderString = SHADER_STRING ( precision highp float; @@ -19,23 +19,24 @@ vec2 getCoordFromColor(vec4 color) float y = color.y*256.0 + yoff*256.0; return vec2(x,y) / size; } - + void main(void) { vec4 colorLoc = texture2D(inputImageTexture2, textureCoordinate); vec4 color = texture2D(inputImageTexture, getCoordFromColor(colorLoc)); - gl_FragColor = color; + + gl_FragColor = color; } - + ); -@implementation GPUImageVoroniConsumerFilter +@implementation GPUImageVoronoiConsumerFilter @synthesize sizeInPixels = _sizeInPixels; - (id)init; { - if (!(self = [super initWithFragmentShaderFromString:kGPUImageVoroniConsumerFragmentShaderString])) + if (!(self = [super initWithFragmentShaderFromString:kGPUImageVoronoiConsumerFragmentShaderString])) { return nil; } @@ -54,11 +55,11 @@ -(void)setSizeInPixels:(CGSize)sizeInPixels { float height = log2(sizeInPixels.height); if (width != height) { - NSLog(@"Voroni point texture must be square"); + NSLog(@"Voronoi point texture must be square"); return; } if (width != floor(width) || height != floor(height)) { - NSLog(@"Voroni point texture must be a power of 2. Texture size %f, %f", sizeInPixels.width, sizeInPixels.height); + NSLog(@"Voronoi point texture must be a power of 2. Texture size %f, %f", sizeInPixels.width, sizeInPixels.height); return; } glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); From e64d638f2a8912cede46a1a9b1ab2909c4744a2d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 11 Feb 2013 22:46:28 -0600 Subject: [PATCH 338/695] Added a zoom blur. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 14 ++- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 3 +- .../Source/GPUImage3x3TextureSamplingFilter.m | 14 ++- framework/Source/GPUImagePoissonBlendFilter.h | 8 -- framework/Source/GPUImagePoissonBlendFilter.m | 8 -- ...UImageTwoInputCrossTextureSamplingFilter.h | 8 -- ...UImageTwoInputCrossTextureSamplingFilter.m | 8 -- framework/Source/GPUImageZoomBlurFilter.h | 13 +++ framework/Source/GPUImageZoomBlurFilter.m | 85 +++++++++++++++++++ 12 files changed, 135 insertions(+), 36 deletions(-) create mode 100644 framework/Source/GPUImageZoomBlurFilter.h create mode 100644 framework/Source/GPUImageZoomBlurFilter.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 10ba90384..abd0307a2 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -175,6 +175,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_MEDIAN: cell.textLabel.text = @"Median (3x3)"; break; case GPUIMAGE_BILATERAL: cell.textLabel.text = @"Bilateral blur"; break; case GPUIMAGE_MOTIONBLUR: cell.textLabel.text = @"Motion blur"; break; + case GPUIMAGE_ZOOMBLUR: cell.textLabel.text = @"Zoom blur"; break; case GPUIMAGE_BOXBLUR: cell.textLabel.text = @"Box blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: cell.textLabel.text = @"Gaussian selective blur"; break; case GPUIMAGE_GAUSSIAN_POSITION: cell.textLabel.text = @"Gaussian (centered)"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 850c2ecb1..5c9bf88d0 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -73,6 +73,7 @@ typedef enum { GPUIMAGE_MEDIAN, GPUIMAGE_BILATERAL, GPUIMAGE_MOTIONBLUR, + GPUIMAGE_ZOOMBLUR, GPUIMAGE_SWIRL, GPUIMAGE_BULGE, GPUIMAGE_PINCH, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 171034081..fb3df95a7 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1170,6 +1170,17 @@ - (void)setupFilter; filter = [[GPUImageMotionBlurFilter alloc] init]; }; break; + case GPUIMAGE_ZOOMBLUR: + { + self.title = @"Zoom Blur"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:2.5f]; + [self.filterSettingsSlider setValue:1.0]; + + filter = [[GPUImageZoomBlurFilter alloc] init]; + }; break; case GPUIMAGE_UIELEMENT: { self.title = @"UI Element"; @@ -1566,7 +1577,8 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setDistanceNormalizationFactor:[(UISlider*)sender value]]; break; case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; - case GPUIMAGE_MOTIONBLUR: [(GPUImageMotionBlurFilter *)filter setBlurAngle:round([(UISlider*)sender value])]; break; + case GPUIMAGE_MOTIONBLUR: [(GPUImageMotionBlurFilter *)filter setBlurAngle:[(UISlider*)sender value]]; break; + case GPUIMAGE_ZOOMBLUR: [(GPUImageZoomBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)filter setOpacity:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)filter setExcludeCircleRadius:[(UISlider*)sender value]]; break; case GPUIMAGE_GAUSSIAN_POSITION: [(GPUImageGaussianBlurPositionFilter *)filter setBlurRadius:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 1b2f14a8c..0f3bf963e 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -251,6 +251,8 @@ BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */; }; BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; }; BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */; }; + BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; }; + BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */; }; BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; @@ -587,6 +589,8 @@ BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageLuminanceThresholdFilter.m; path = Source/GPUImageAverageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMotionBlurFilter.h; path = Source/GPUImageMotionBlurFilter.h; sourceTree = SOURCE_ROOT; }; BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMotionBlurFilter.m; path = Source/GPUImageMotionBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageZoomBlurFilter.h; path = Source/GPUImageZoomBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageZoomBlurFilter.m; path = Source/GPUImageZoomBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMonochromeFilter.h; path = Source/GPUImageMonochromeFilter.h; sourceTree = SOURCE_ROOT; }; BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; @@ -1060,6 +1064,8 @@ BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */, BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */, BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */, + BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */, + BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -1304,6 +1310,7 @@ BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */, 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */, BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */, + BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1572,6 +1579,7 @@ 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */, BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */, BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */, + BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 84b9ee2e5..9fb1e6129 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -148,4 +148,5 @@ #import "GPUImagePixellatePositionFilter.h" #import "GPUImageTwoInputCrossTextureSamplingFilter.h" #import "GPUImagePoissonBlendFilter.h" -#import "GPUImageMotionBlurFilter.h" \ No newline at end of file +#import "GPUImageMotionBlurFilter.h" +#import "GPUImageZoomBlurFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m index 089848794..bb314cdb7 100644 --- a/framework/Source/GPUImage3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -53,9 +53,9 @@ @implementation GPUImage3x3TextureSamplingFilter #pragma mark - #pragma mark Initialization and teardown -- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +- (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShaderFromString:(NSString *)fragmentShaderString; { - if (!(self = [super initWithVertexShaderFromString:kGPUImageNearbyTexelSamplingVertexShaderString fragmentShaderFromString:fragmentShaderString])) + if (!(self = [super initWithVertexShaderFromString:vertexShaderString fragmentShaderFromString:fragmentShaderString])) { return nil; } @@ -66,6 +66,16 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; return self; } +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [self initWithVertexShaderFromString:kGPUImageNearbyTexelSamplingVertexShaderString fragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + return self; +} + - (void)setupFilterForSize:(CGSize)filterFrameSize; { if (!hasOverriddenImageSizeFactor) diff --git a/framework/Source/GPUImagePoissonBlendFilter.h b/framework/Source/GPUImagePoissonBlendFilter.h index 5d3c378df..da3b63683 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.h +++ b/framework/Source/GPUImagePoissonBlendFilter.h @@ -1,11 +1,3 @@ -// -// GPUImagePoissonBlendFilter.h -// GPUImage -// -// Created by Ian Simon on 1/29/13. -// Copyright (c) 2013 Brad Larson. All rights reserved. -// - #import "GPUImageTwoInputCrossTextureSamplingFilter.h" #import "GPUImageFilterGroup.h" diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m index e391b838b..514a33dfe 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.m +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -1,11 +1,3 @@ -// -// GPUImagePoissonBlendFilter.m -// GPUImage -// -// Created by Ian Simon on 1/29/13. -// Copyright (c) 2013 Brad Larson. All rights reserved. -// - #import "GPUImagePoissonBlendFilter.h" NSString *const kGPUImagePoissonBlendFragmentShaderString = SHADER_STRING diff --git a/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.h b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.h index bc0492ca7..64eac9dc5 100644 --- a/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.h +++ b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.h @@ -1,11 +1,3 @@ -// -// GPUImageTwoInputCrossTextureSamplingFilter.h -// GPUImage -// -// Created by Ian Simon on 1/29/13. -// Copyright (c) 2013 Brad Larson. All rights reserved. -// - #import "GPUImageTwoInputFilter.h" @interface GPUImageTwoInputCrossTextureSamplingFilter : GPUImageTwoInputFilter diff --git a/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m index 246ccc2f2..b14ca910f 100644 --- a/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m @@ -1,11 +1,3 @@ -// -// GPUImageTwoInputCrossTextureSamplingFilter.m -// GPUImage -// -// Created by Ian Simon on 1/29/13. -// Copyright (c) 2013 Brad Larson. All rights reserved. -// - #import "GPUImageTwoInputCrossTextureSamplingFilter.h" NSString *const kGPUImageTwoInputNearbyTexelSamplingVertexShaderString = SHADER_STRING diff --git a/framework/Source/GPUImageZoomBlurFilter.h b/framework/Source/GPUImageZoomBlurFilter.h new file mode 100644 index 000000000..744a72cbc --- /dev/null +++ b/framework/Source/GPUImageZoomBlurFilter.h @@ -0,0 +1,13 @@ +#import "GPUImageFilter.h" + +@interface GPUImageZoomBlurFilter : GPUImageFilter + +/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 + */ +@property (readwrite, nonatomic) CGFloat blurSize; + +/** The normalized center of the blur. (0.5, 0.5) by default + */ +@property (readwrite, nonatomic) CGPoint blurCenter; + +@end diff --git a/framework/Source/GPUImageZoomBlurFilter.m b/framework/Source/GPUImageZoomBlurFilter.m new file mode 100644 index 000000000..6a570e1c0 --- /dev/null +++ b/framework/Source/GPUImageZoomBlurFilter.m @@ -0,0 +1,85 @@ +#import "GPUImageZoomBlurFilter.h" + +NSString *const kGPUImageZoomBlurFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform highp vec2 blurCenter; + uniform highp float blurSize; + + void main() + { + // TODO: Do a more intelligent scaling based on resolution here + highp vec2 samplingOffset = 1.0/100.0 * (blurCenter - textureCoordinate) * blurSize; + + lowp vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.18; + fragmentColor += texture2D(inputImageTexture, textureCoordinate + samplingOffset) * 0.15; + fragmentColor += texture2D(inputImageTexture, textureCoordinate + (2.0 * samplingOffset)) * 0.12; + fragmentColor += texture2D(inputImageTexture, textureCoordinate + (3.0 * samplingOffset)) * 0.09; + fragmentColor += texture2D(inputImageTexture, textureCoordinate + (4.0 * samplingOffset)) * 0.05; + fragmentColor += texture2D(inputImageTexture, textureCoordinate - samplingOffset) * 0.15; + fragmentColor += texture2D(inputImageTexture, textureCoordinate - (2.0 * samplingOffset)) * 0.12; + fragmentColor += texture2D(inputImageTexture, textureCoordinate - (3.0 * samplingOffset)) * 0.09; + fragmentColor += texture2D(inputImageTexture, textureCoordinate - (4.0 * samplingOffset)) * 0.05; + + gl_FragColor = fragmentColor; + } +); + +@interface GPUImageZoomBlurFilter() +{ + GLint blurSizeUniform, blurCenterUniform; +} +@end + +@implementation GPUImageZoomBlurFilter + +@synthesize blurSize = _blurSize; +@synthesize blurCenter = _blurCenter; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageZoomBlurFragmentShaderString])) + { + return nil; + } + + blurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; + blurCenterUniform = [filterProgram uniformIndex:@"blurCenter"]; + + self.blurSize = 1.0; + self.blurCenter = CGPointMake(0.5, 0.5); + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setBlurCenter:self.blurCenter]; +} + +- (void)setBlurSize:(CGFloat)newValue; +{ + _blurSize = newValue; + + [self setFloat:_blurSize forUniform:blurSizeUniform program:filterProgram]; +} + +- (void)setBlurCenter:(CGPoint)newValue; +{ + _blurCenter = newValue; + + CGPoint rotatedPoint = [self rotatedPoint:_blurCenter forRotation:inputRotation]; + [self setPoint:rotatedPoint forUniform:blurCenterUniform program:filterProgram]; +} + +@end From 6d00ebb32f6dd4ede5c65f76ad3157fd3e57c408 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 15 Feb 2013 15:49:19 -0600 Subject: [PATCH 339/695] Fixed an error with the second shader program in GPUImageTwoPassFilter. --- framework/Source/GPUImageTwoPassFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 27ef39e5f..639789be9 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -52,7 +52,7 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade - (id)initWithFirstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString; { - if (!(self = [self initWithFirstStageVertexShaderFromString:kGPUImageVertexShaderString firstStageFragmentShaderFromString:firstStageFragmentShaderString secondStageVertexShaderFromString:kGPUImageVertexShaderString secondStageFragmentShaderFromString:firstStageFragmentShaderString])) + if (!(self = [self initWithFirstStageVertexShaderFromString:kGPUImageVertexShaderString firstStageFragmentShaderFromString:firstStageFragmentShaderString secondStageVertexShaderFromString:kGPUImageVertexShaderString secondStageFragmentShaderFromString:secondStageFragmentShaderString])) { return nil; } From a660bfd0d760e431b780badd4cb0837fe42dbb8c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 24 Feb 2013 15:11:29 -0600 Subject: [PATCH 340/695] Restructured the blur filters to use a standardized texel spacing. Fixed a memory leak in the luminance and color averaging, as pointed out by BillHu. --- framework/Source/GPUImageAverageColor.m | 8 +++++++ framework/Source/GPUImageBoxBlurFilter.h | 3 --- framework/Source/GPUImageBoxBlurFilter.m | 14 +++++------ framework/Source/GPUImageFastBlurFilter.h | 3 --- framework/Source/GPUImageFastBlurFilter.m | 14 +++++------ framework/Source/GPUImageGaussianBlurFilter.h | 3 --- framework/Source/GPUImageGaussianBlurFilter.m | 23 +++++++++--------- .../GPUImageGaussianBlurPositionFilter.h | 2 +- .../GPUImageGaussianBlurPositionFilter.m | 17 +++++++------ .../GPUImageTwoPassTextureSamplingFilter.h | 5 ++++ .../GPUImageTwoPassTextureSamplingFilter.m | 24 ++++++++++++++++--- 11 files changed, 67 insertions(+), 49 deletions(-) diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index 4ae448350..c781697aa 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -78,6 +78,14 @@ - (id)init; return self; } +- (void)dealloc; +{ + if (rawImagePixels != NULL) + { + free(rawImagePixels); + } +} + #pragma mark - #pragma mark Manage the output texture diff --git a/framework/Source/GPUImageBoxBlurFilter.h b/framework/Source/GPUImageBoxBlurFilter.h index b3fc81297..6e7451fa5 100755 --- a/framework/Source/GPUImageBoxBlurFilter.h +++ b/framework/Source/GPUImageBoxBlurFilter.h @@ -3,9 +3,6 @@ /** A hardware-accelerated 9-hit box blur of an image */ @interface GPUImageBoxBlurFilter : GPUImageTwoPassTextureSamplingFilter -{ - GLint firstBlurSizeUniform, secondBlurSizeUniform; -} /// A scaling for the size of the applied blur, default of 1.0 @property(readwrite, nonatomic) CGFloat blurSize; diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index 6623f1916..d0de040bc 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -7,7 +7,6 @@ uniform float texelWidthOffset; uniform float texelHeightOffset; - uniform highp float blurSize; varying vec2 centerTextureCoordinate; varying vec2 oneStepLeftTextureCoordinate; @@ -19,8 +18,8 @@ void main() { gl_Position = position; - vec2 firstOffset = vec2(1.5 * texelWidthOffset, 1.5 * texelHeightOffset) * blurSize; - vec2 secondOffset = vec2(3.5 * texelWidthOffset, 3.5 * texelHeightOffset) * blurSize; + vec2 firstOffset = vec2(1.5 * texelWidthOffset, 1.5 * texelHeightOffset); + vec2 secondOffset = vec2(3.5 * texelWidthOffset, 3.5 * texelHeightOffset); centerTextureCoordinate = inputTextureCoordinate; oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset; @@ -68,9 +67,6 @@ - (id)init; { return nil; } - - firstBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; - secondBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; self.blurSize = 1.0; @@ -84,8 +80,10 @@ - (void)setBlurSize:(CGFloat)newValue; { _blurSize = newValue; - [self setFloat:_blurSize forUniform:firstBlurSizeUniform program:filterProgram]; - [self setFloat:_blurSize forUniform:secondBlurSizeUniform program:secondFilterProgram]; + _verticalTexelSpacing = _blurSize; + _horizontalTexelSpacing = _blurSize; + + [self setupFilterForSize:[self sizeOfFBO]]; } @end diff --git a/framework/Source/GPUImageFastBlurFilter.h b/framework/Source/GPUImageFastBlurFilter.h index 0e094af72..6cdd3fecf 100755 --- a/framework/Source/GPUImageFastBlurFilter.h +++ b/framework/Source/GPUImageFastBlurFilter.h @@ -2,9 +2,6 @@ /// A hardware-accelerated 9-hit Gaussian blur of an image @interface GPUImageFastBlurFilter : GPUImageTwoPassTextureSamplingFilter -{ - GLint firstBlurSizeUniform, secondBlurSizeUniform; -} /// The number of times to sequentially blur the incoming image. The more passes, the slower the filter. @property(readwrite, nonatomic) NSUInteger blurPasses; diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index b3e3ee58a..2eb39ac15 100755 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -9,7 +9,6 @@ uniform highp float texelWidthOffset; uniform highp float texelHeightOffset; - uniform highp float blurSize; varying highp vec2 centerTextureCoordinate; varying highp vec2 oneStepLeftTextureCoordinate; @@ -23,8 +22,8 @@ void main() { gl_Position = position; - vec2 firstOffset = vec2(1.3846153846 * texelWidthOffset, 1.3846153846 * texelHeightOffset) * blurSize; - vec2 secondOffset = vec2(3.2307692308 * texelWidthOffset, 3.2307692308 * texelHeightOffset) * blurSize; + vec2 firstOffset = vec2(1.3846153846 * texelWidthOffset, 1.3846153846 * texelHeightOffset); + vec2 secondOffset = vec2(3.2307692308 * texelWidthOffset, 3.2307692308 * texelHeightOffset); centerTextureCoordinate = inputTextureCoordinate; oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset; @@ -112,9 +111,6 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; return nil; } - firstBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; - secondBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; - self.blurSize = 1.0; return self; @@ -140,8 +136,10 @@ - (void)setBlurSize:(CGFloat)newValue; { _blurSize = newValue; - [self setFloat:_blurSize forUniform:firstBlurSizeUniform program:filterProgram]; - [self setFloat:_blurSize forUniform:secondBlurSizeUniform program:secondFilterProgram]; + _verticalTexelSpacing = _blurSize; + _horizontalTexelSpacing = _blurSize; + + [self setupFilterForSize:[self sizeOfFBO]]; } @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index bf920ca7c..549663439 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -3,9 +3,6 @@ /** A more generalized 9x9 Gaussian blur filter */ @interface GPUImageGaussianBlurFilter : GPUImageTwoPassTextureSamplingFilter -{ - GLint horizontalBlurSizeUniform, verticalBlurSizeUniform; -} /** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 */ diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index 860df5da3..eaec2ea65 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -9,7 +9,6 @@ uniform highp float texelWidthOffset; uniform highp float texelHeightOffset; - uniform highp float blurSize; varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; @@ -21,7 +20,7 @@ void main() { // Calculate the positions for the blur int multiplier = 0; highp vec2 blurStep; - highp vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset) * blurSize; + highp vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset); for (lowp int i = 0; i < GAUSSIAN_SAMPLES; i++) { multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2)); @@ -74,9 +73,6 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad return nil; } - horizontalBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; - verticalBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; - self.blurSize = 1.0; return self; @@ -90,13 +86,18 @@ - (id)init; secondStageFragmentShaderFromString:nil]; } -#pragma mark Getters and Setters - -- (void) setBlurSize:(CGFloat)blurSize { - _blurSize = blurSize; +#pragma mark - +#pragma mark Accessors - [self setFloat:_blurSize forUniform:horizontalBlurSizeUniform program:filterProgram]; - [self setFloat:_blurSize forUniform:verticalBlurSizeUniform program:secondFilterProgram]; +- (void)setBlurSize:(CGFloat)newValue; +{ + _blurSize = newValue; + + _verticalTexelSpacing = _blurSize; + _horizontalTexelSpacing = _blurSize; + + [self setupFilterForSize:[self sizeOfFBO]]; } + @end diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.h b/framework/Source/GPUImageGaussianBlurPositionFilter.h index 648eac867..dc88a563a 100755 --- a/framework/Source/GPUImageGaussianBlurPositionFilter.h +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.h @@ -4,7 +4,7 @@ */ @interface GPUImageGaussianBlurPositionFilter : GPUImageTwoPassTextureSamplingFilter { - GLint horizontalBlurSizeUniform, verticalBlurSizeUniform, blurCenterUniform, blurRadiusUniform, aspectRatioUniform; + GLint blurCenterUniform, blurRadiusUniform, aspectRatioUniform; } /** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.m b/framework/Source/GPUImageGaussianBlurPositionFilter.m index 5d639c3a4..6b16afecc 100755 --- a/framework/Source/GPUImageGaussianBlurPositionFilter.m +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.m @@ -9,7 +9,6 @@ uniform highp float texelWidthOffset; uniform highp float texelHeightOffset; - uniform highp float blurSize; varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; @@ -20,7 +19,7 @@ void main() { // Calculate the positions for the blur int multiplier = 0; highp vec2 blurStep; - highp vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset) * blurSize; + highp vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset); for (lowp int i = 0; i < GAUSSIAN_SAMPLES; i++) { multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2)); @@ -95,8 +94,6 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad return nil; } - horizontalBlurSizeUniform = [filterProgram uniformIndex:@"blurSize"]; - verticalBlurSizeUniform = [secondFilterProgram uniformIndex:@"blurSize"]; aspectRatioUniform = [secondFilterProgram uniformIndex:@"aspectRatio"]; blurCenterUniform = [secondFilterProgram uniformIndex:@"blurCenter"]; blurRadiusUniform = [secondFilterProgram uniformIndex:@"blurRadius"]; @@ -136,12 +133,14 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; #pragma mark Getters and Setters -- (void) setBlurSize:(CGFloat)blurSize; +- (void)setBlurSize:(CGFloat)newValue; { - _blurSize = blurSize; - - [self setFloat:_blurSize forUniform:horizontalBlurSizeUniform program:filterProgram]; - [self setFloat:_blurSize forUniform:verticalBlurSizeUniform program:secondFilterProgram]; + _blurSize = newValue; + + _verticalTexelSpacing = _blurSize; + _horizontalTexelSpacing = _blurSize; + + [self setupFilterForSize:[self sizeOfFBO]]; } - (void) setBlurCenter:(CGPoint)blurCenter; diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.h b/framework/Source/GPUImageTwoPassTextureSamplingFilter.h index dec6fc2b3..73ab79d30 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.h +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.h @@ -4,5 +4,10 @@ { GLint verticalPassTexelWidthOffsetUniform, verticalPassTexelHeightOffsetUniform, horizontalPassTexelWidthOffsetUniform, horizontalPassTexelHeightOffsetUniform; GLfloat verticalPassTexelWidthOffset, verticalPassTexelHeightOffset, horizontalPassTexelWidthOffset, horizontalPassTexelHeightOffset; + CGFloat _verticalTexelSpacing, _horizontalTexelSpacing; } + +// This sets the spacing between texels (in pixels) when sampling for the first. By default, this is 1.0 +@property(readwrite, nonatomic) CGFloat verticalTexelSpacing, horizontalTexelSpacing; + @end diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index af103e781..01a3dca07 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -2,6 +2,9 @@ @implementation GPUImageTwoPassTextureSamplingFilter +@synthesize verticalTexelSpacing = _verticalTexelSpacing; +@synthesize horizontalTexelSpacing = _horizontalTexelSpacing; + #pragma mark - #pragma mark Initialization and teardown @@ -47,18 +50,33 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { - verticalPassTexelWidthOffset = 1.0 / filterFrameSize.height; + verticalPassTexelWidthOffset = _verticalTexelSpacing / filterFrameSize.height; verticalPassTexelHeightOffset = 0.0; } else { verticalPassTexelWidthOffset = 0.0; - verticalPassTexelHeightOffset = 1.0 / filterFrameSize.height; + verticalPassTexelHeightOffset = _verticalTexelSpacing / filterFrameSize.height; } - horizontalPassTexelWidthOffset = 1.0 / filterFrameSize.width; + horizontalPassTexelWidthOffset = _horizontalTexelSpacing / filterFrameSize.width; horizontalPassTexelHeightOffset = 0.0; }); } +#pragma mark - +#pragma mark Accessors + +- (void)setVerticalTexelSpacing:(CGFloat)newValue; +{ + _verticalTexelSpacing = newValue; + [self setupFilterForSize:[self sizeOfFBO]]; +} + +- (void)setHorizontalTexelSpacing:(CGFloat)newValue; +{ + _horizontalTexelSpacing = newValue; + [self setupFilterForSize:[self sizeOfFBO]]; +} + @end From 9da4abf79f1430876fd2cac503051f66ab590c3a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 3 Mar 2013 20:45:53 -0600 Subject: [PATCH 341/695] Added texel spacing adjustments to the opening and closing filters. --- framework/Source/GPUImageClosingFilter.h | 2 ++ framework/Source/GPUImageClosingFilter.m | 17 +++++++++++++++++ framework/Source/GPUImageOpeningFilter.h | 2 ++ framework/Source/GPUImageOpeningFilter.m | 17 +++++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/framework/Source/GPUImageClosingFilter.h b/framework/Source/GPUImageClosingFilter.h index 691d9d883..61e34c41f 100644 --- a/framework/Source/GPUImageClosingFilter.h +++ b/framework/Source/GPUImageClosingFilter.h @@ -12,6 +12,8 @@ GPUImageDilationFilter *dilationFilter; } +@property(readwrite, nonatomic) CGFloat verticalTexelSpacing, horizontalTexelSpacing; + - (id)initWithRadius:(NSUInteger)radius; @end diff --git a/framework/Source/GPUImageClosingFilter.m b/framework/Source/GPUImageClosingFilter.m index b47b2b0c8..01e9b29b7 100644 --- a/framework/Source/GPUImageClosingFilter.m +++ b/framework/Source/GPUImageClosingFilter.m @@ -4,6 +4,9 @@ @implementation GPUImageClosingFilter +@synthesize verticalTexelSpacing = _verticalTexelSpacing; +@synthesize horizontalTexelSpacing = _horizontalTexelSpacing; + - (id)init; { if (!(self = [self initWithRadius:1])) @@ -37,4 +40,18 @@ - (id)initWithRadius:(NSUInteger)radius; return self; } +- (void)setVerticalTexelSpacing:(CGFloat)newValue; +{ + _verticalTexelSpacing = newValue; + erosionFilter.verticalTexelSpacing = newValue; + dilationFilter.verticalTexelSpacing = newValue; +} + +- (void)setHorizontalTexelSpacing:(CGFloat)newValue; +{ + _horizontalTexelSpacing = newValue; + erosionFilter.horizontalTexelSpacing = newValue; + dilationFilter.horizontalTexelSpacing = newValue; +} + @end diff --git a/framework/Source/GPUImageOpeningFilter.h b/framework/Source/GPUImageOpeningFilter.h index d3d833563..3e4f7545a 100644 --- a/framework/Source/GPUImageOpeningFilter.h +++ b/framework/Source/GPUImageOpeningFilter.h @@ -12,6 +12,8 @@ GPUImageDilationFilter *dilationFilter; } +@property(readwrite, nonatomic) CGFloat verticalTexelSpacing, horizontalTexelSpacing; + - (id)initWithRadius:(NSUInteger)radius; @end diff --git a/framework/Source/GPUImageOpeningFilter.m b/framework/Source/GPUImageOpeningFilter.m index 9b81dd613..4e7a56532 100644 --- a/framework/Source/GPUImageOpeningFilter.m +++ b/framework/Source/GPUImageOpeningFilter.m @@ -4,6 +4,9 @@ @implementation GPUImageOpeningFilter +@synthesize verticalTexelSpacing = _verticalTexelSpacing; +@synthesize horizontalTexelSpacing = _horizontalTexelSpacing; + - (id)init; { if (!(self = [self initWithRadius:1])) @@ -37,4 +40,18 @@ - (id)initWithRadius:(NSUInteger)radius; return self; } +- (void)setVerticalTexelSpacing:(CGFloat)newValue; +{ + _verticalTexelSpacing = newValue; + erosionFilter.verticalTexelSpacing = newValue; + dilationFilter.verticalTexelSpacing = newValue; +} + +- (void)setHorizontalTexelSpacing:(CGFloat)newValue; +{ + _horizontalTexelSpacing = newValue; + erosionFilter.horizontalTexelSpacing = newValue; + dilationFilter.horizontalTexelSpacing = newValue; +} + @end From 8fe5dd755a6bc64f3365ff93811a0a63f6f7042d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 3 Mar 2013 23:16:40 -0600 Subject: [PATCH 342/695] Experimented with direct image processing from disk using stb_image.c. 10X slower than traveling through UIImage, though. --- .../SimpleImageViewController.m | 4 + framework/GPUImage.xcodeproj/project.pbxproj | 4 + framework/Source/GPUImagePicture.h | 1 + framework/Source/GPUImagePicture.m | 66 + framework/Source/stb_image.c | 4676 +++++++++++++++++ 5 files changed, 4751 insertions(+) create mode 100644 framework/Source/stb_image.c diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index 8a80b2cb5..dc71c930b 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -80,9 +80,13 @@ - (void)setupDisplayFiltering; - (void)setupImageFilteringToDisk; { // Set up a manual image filtering chain +// NSURL *inputImageURL = [[NSBundle mainBundle] URLForResource:@"Lambeau" withExtension:@"jpg"]; UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; +// GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithURL:inputImageURL]; + + GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; GPUImageVignetteFilter *vignetteImageFilter = [[GPUImageVignetteFilter alloc] init]; vignetteImageFilter.vignetteEnd = 0.6; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 0f3bf963e..5b325a230 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -257,6 +257,7 @@ BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */; }; + BCBF617316E4478E00E2784A /* stb_image.c in Sources */ = {isa = PBXBuildFile; fileRef = BCBF617216E4478E00E2784A /* stb_image.c */; }; BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; }; BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */; }; BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; }; @@ -595,6 +596,7 @@ BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBuffer.m; path = Source/GPUImageBuffer.m; sourceTree = SOURCE_ROOT; }; + BCBF617216E4478E00E2784A /* stb_image.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stb_image.c; path = Source/stb_image.c; sourceTree = SOURCE_ROOT; }; BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramGenerator.h; path = Source/GPUImageHistogramGenerator.h; sourceTree = SOURCE_ROOT; }; BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramGenerator.m; path = Source/GPUImageHistogramGenerator.m; sourceTree = SOURCE_ROOT; }; BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePosterizeFilter.h; path = Source/GPUImagePosterizeFilter.h; sourceTree = SOURCE_ROOT; }; @@ -938,6 +940,7 @@ BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */, BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */, BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */, + BCBF617216E4478E00E2784A /* stb_image.c */, BCB5E7D814E6003400701302 /* GPUImagePicture.h */, BCB5E7D914E6003400701302 /* GPUImagePicture.m */, BC982C6A14F33C290001FF6F /* GPUImageMovie.h */, @@ -1580,6 +1583,7 @@ BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */, BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */, BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */, + BCBF617316E4478E00E2784A /* stb_image.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/GPUImagePicture.h index 65444d1b6..d6d1ac061 100755 --- a/framework/Source/GPUImagePicture.h +++ b/framework/Source/GPUImagePicture.h @@ -11,6 +11,7 @@ } // Initialization and teardown +- (id)initWithURL:(NSURL *)url; - (id)initWithImage:(UIImage *)newImageSource; - (id)initWithCGImage:(CGImageRef)newImageSource; - (id)initWithImage:(UIImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 08abb54c2..4ac3880ae 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -1,10 +1,76 @@ #import "GPUImagePicture.h" +#import "stb_image.c" @implementation GPUImagePicture #pragma mark - #pragma mark Initialization and teardown +- (id)initWithURL:(NSURL *)url; +{ + NSData *imageData = [[NSData alloc] initWithContentsOfURL:url]; + + if (!(self = [self initWithData:imageData])) + { + return nil; + } + + return self; +} + +- (id)initWithData:(NSData *)imageData; +{ + if (!(self = [self init])) + { + return nil; + } + + hasProcessedImage = NO; + self.shouldSmoothlyScaleOutput = NO; + imageUpdateSemaphore = dispatch_semaphore_create(1); + + int widthOfImage = 0; + int heightOfImage = 0; + int componentsOfImage = 0; + +// unsigned char *data = stbi_load([[url absoluteString] UTF8String], &x, &y, &n, 0); + + unsigned char *imageBytes = stbi_load_from_memory([imageData bytes], [imageData length], &widthOfImage, &heightOfImage, &componentsOfImage, 0); + pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); + + GLenum format = GL_RGBA; + if (componentsOfImage == 3) + { + format = GL_RGB; + } + else if (componentsOfImage == 4) + { + format = GL_RGBA; + } + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageOpenGLESContext useImageProcessingContext]; + + [self initializeOutputTextureIfNeeded]; + + glBindTexture(GL_TEXTURE_2D, outputTexture); + if (self.shouldSmoothlyScaleOutput) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } + glTexImage2D(GL_TEXTURE_2D, 0, format, widthOfImage, heightOfImage, 0, format, GL_UNSIGNED_BYTE, imageBytes); + + if (self.shouldSmoothlyScaleOutput) + { + glGenerateMipmap(GL_TEXTURE_2D); + } + }); + + stbi_image_free(imageBytes); + + return self; +} + - (id)initWithImage:(UIImage *)newImageSource; { if (!(self = [self initWithImage:newImageSource smoothlyScaleOutput:NO])) diff --git a/framework/Source/stb_image.c b/framework/Source/stb_image.c new file mode 100644 index 000000000..34750ddaf --- /dev/null +++ b/framework/Source/stb_image.c @@ -0,0 +1,4676 @@ +/* stbi-1.33 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c + when you control the images you're loading + no warranty implied; use at your own risk + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline (no JPEG progressive) + PNG 8-bit-per-channel only + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) + + Latest revisions: + 1.33 (2011-07-14) minor fixes suggested by Dave Moore + 1.32 (2011-07-13) info support for all filetypes (SpartanJ) + 1.31 (2011-06-19) a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) added ability to load files via io callbacks (Ben Wenger) + 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila) + allow trailing 0s at end of image data (Laurent Gomila) + 1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ + + See end of file for full revision history. + + TODO: + stbi_info support for BMP,PSD,HDR,PIC + + + ============================ Contributors ========================= + + Image formats Optimizations & bugfixes + Sean Barrett (jpeg, png, bmp) Fabian "ryg" Giesen + Nicolas Schulz (hdr, psd) + Jonathan Dummer (tga) Bug fixes & warning fixes + Jean-Marc Lienher (gif) Marc LeBlanc + Tom Seddon (pic) Christpher Lloyd + Thatcher Ulrich (psd) Dave Moore + Won Chun + the Horde3D community + Extensions, features Janez Zemva + Jetro Lauha (stbi_info) Jonathan Blow + James "moose2000" Brown (iPhone PNG) Laurent Gomila + Ben "Disch" Wenger (io callbacks) Aruelien Pocheville + Martin "SpartanJ" Golini Ryamond Barbiero + David Woo + + + If your name should be here but isn't, let Sean know. + +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// To get a header file for this, either cut and paste the header, +// or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and +// then include stb_image.c from it. + +//// begin header file //////////////////////////////////////////////////// +// +// Limitations: +// - no jpeg progressive support +// - non-HDR formats support 8-bit samples only (jpeg, png) +// - no delayed line count (jpeg) -- IJG doesn't support either +// - no 1-bit BMP +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *comp -- outputs # of image components in image file +// int req_comp -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. +// If req_comp is non-zero, *comp has the number of components that _would_ +// have been output otherwise. E.g. if you set req_comp to 4, you will always +// get RGBA output, but you can check *comp to easily see if it's opaque. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *comp will be unchanged. The function stbi_failure_reason() +// can be queried for an extremely brief, end-user unfriendly explanation +// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid +// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// =========================================================================== +// +// iPhone PNG support: +// +// By default we convert iphone-formatted PNGs back to RGB; nominally they +// would silently load as BGR, except the existing code should have just +// failed on such iPhone PNGs. But you can disable this conversion by +// by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through. +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image now supports loading HDR images in general, and currently +// the Radiance .HDR file format, although the support is provided +// generically. You can still load any file through the existing interface; +// if you attempt to load an HDR file, it will be automatically remapped to +// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). + + +#ifndef STBI_NO_STDIO + +#if defined(_MSC_VER) && _MSC_VER >= 0x1400 +#define _CRT_SECURE_NO_WARNINGS // suppress bogus warnings about fopen() +#endif + +#include +#endif + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for req_comp + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +typedef unsigned char stbi_uc; + +#ifdef __cplusplus +extern "C" { +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); + +#ifndef STBI_NO_STDIO +extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); +extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,unsigned n); // skip the next 'n' bytes + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +extern stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + +#ifndef STBI_NO_HDR + extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); + + #ifndef STBI_NO_STDIO + extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); + extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + #endif + + extern float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + + extern void stbi_hdr_to_ldr_gamma(float gamma); + extern void stbi_hdr_to_ldr_scale(float scale); + + extern void stbi_ldr_to_hdr_gamma(float gamma); + extern void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_HDR + +// stbi_is_hdr is always defined +extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +extern int stbi_is_hdr (char const *filename); +extern int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +extern const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +extern void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +extern int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +extern int stbi_info (char const *filename, int *x, int *y, int *comp); +extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); + +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + + +// ZLIB client - used by PNG, available for other purposes + +extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +// define faster low-level operations (typically SIMD support) +#ifdef STBI_SIMD +typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize); +// compute an integer IDCT on "input" +// input[x] = data[x] * dequantize[x] +// write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' +// CLAMP results to 0..255 +typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step); +// compute a conversion from YCbCr to RGB +// 'count' pixels +// write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B +// y: Y input channel +// cb: Cb input channel; scale/biased to be 0..255 +// cr: Cr input channel; scale/biased to be 0..255 + +extern void stbi_install_idct(stbi_idct_8x8 func); +extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); +#endif // STBI_SIMD + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifndef STBI_HEADER_FILE_ONLY + +#ifndef STBI_NO_HDR +#include // ldexp +#include // strcmp, strtok +#endif + +#ifndef STBI_NO_STDIO +#include +#endif +#include +#include +#include +#include + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + + +// implementation: +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef signed short int16; +typedef unsigned int uint32; +typedef signed int int32; +typedef unsigned int uint; + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1]; + +#if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE) +#define STBI_NO_WRITE +#endif + +#define STBI_NOTUSED(v) (void)sizeof(v) + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +/////////////////////////////////////////////// +// +// stbi struct and start_xxx functions + +// stbi structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + uint8 buffer_start[128]; + + uint8 *img_buffer, *img_buffer_end; + uint8 *img_buffer_original; +} stbi; + + +float *stbi_loadf_main(stbi *s, int *x, int *y, int *comp, int req_comp); +char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); + +static void refill_buffer(stbi *s); + +// initialize a memory-decode context +static void start_mem(stbi *s, uint8 const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (uint8 *) buffer; + s->img_buffer_end = (uint8 *) buffer+len; +} + +// initialize a callback-based context +static void start_callbacks(stbi *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + refill_buffer(s); +} + +#ifndef STBI_NO_STDIO + +static int stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stdio_skip(void *user, unsigned n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi_stdio_callbacks = +{ + stdio_read, + stdio_skip, + stdio_eof, +}; + +static void start_file(stbi *s, FILE *f) +{ + start_callbacks(s, &stbi_stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi_rewind(stbi *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; +} + +static int stbi_jpeg_test(stbi *s); +static stbi_uc *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp); +static int stbi_png_test(stbi *s); +static stbi_uc *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_png_info(stbi *s, int *x, int *y, int *comp); +static int stbi_bmp_test(stbi *s); +static stbi_uc *stbi_bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_tga_test(stbi *s); +static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_tga_info(stbi *s, int *x, int *y, int *comp); +static int stbi_psd_test(stbi *s); +static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_hdr_test(stbi *s); +static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_pic_test(stbi *s); +static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_gif_test(stbi *s); +static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_gif_info(stbi *s, int *x, int *y, int *comp); + + +// this is not threadsafe +static const char *failure_reason; + +const char *stbi_failure_reason(void) +{ + return failure_reason; +} + +static int e(const char *str) +{ + failure_reason = str; + return 0; +} + +// e - error +// epf - error returning pointer to float +// epuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define e(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define e(x,y) e(y) +#else + #define e(x,y) e(x) +#endif + +#define epf(x,y) ((float *) (e(x,y)?NULL:NULL)) +#define epuc(x,y) ((unsigned char *) (e(x,y)?NULL:NULL)) + +void stbi_image_free(void *retval_from_stbi_load) +{ + free(retval_from_stbi_load); +} + +#ifndef STBI_NO_HDR +static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static unsigned char *stbi_load_main(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + if (stbi_jpeg_test(s)) return stbi_jpeg_load(s,x,y,comp,req_comp); + if (stbi_png_test(s)) return stbi_png_load(s,x,y,comp,req_comp); + if (stbi_bmp_test(s)) return stbi_bmp_load(s,x,y,comp,req_comp); + if (stbi_gif_test(s)) return stbi_gif_load(s,x,y,comp,req_comp); + if (stbi_psd_test(s)) return stbi_psd_load(s,x,y,comp,req_comp); + if (stbi_pic_test(s)) return stbi_pic_load(s,x,y,comp,req_comp); + + #ifndef STBI_NO_HDR + if (stbi_hdr_test(s)) { + float *hdr = stbi_hdr_load(s, x,y,comp,req_comp); + return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + // test tga last because it's a crappy test! + if (stbi_tga_test(s)) + return stbi_tga_load(s,x,y,comp,req_comp); + return epuc("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = fopen(filename, "rb"); + unsigned char *result; + if (!f) return epuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_file(&s,f); + return stbi_load_main(&s,x,y,comp,req_comp); +} +#endif //!STBI_NO_STDIO + +unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_mem(&s,buffer,len); + return stbi_load_main(&s,x,y,comp,req_comp); +} + +unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_load_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_HDR + +float *stbi_loadf_main(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi_hdr_test(s)) + return stbi_hdr_load(s,x,y,comp,req_comp); + #endif + data = stbi_load_main(s, x, y, comp, req_comp); + if (data) + return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return epf("unknown image type", "Image not of any known type, or corrupt"); +} + +float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_mem(&s,buffer,len); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} + +float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = fopen(filename, "rb"); + float *result; + if (!f) return epf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_file(&s,f); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_HDR + +// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is +// defined, for API simplicity; if STBI_NO_HDR is defined, it always +// reports false! + +int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi s; + start_mem(&s,buffer,len); + return stbi_hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +extern int stbi_is_hdr (char const *filename) +{ + FILE *f = fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +extern int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + stbi s; + start_file(&s,f); + return stbi_hdr_test(&s); + #else + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi s; + start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_hdr_test(&s); + #else + return 0; + #endif +} + +#ifndef STBI_NO_HDR +static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f; +static float l2h_gamma=2.2f, l2h_scale=1.0f; + +void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; } +void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; } + +void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; } +void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; } +#endif + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + SCAN_load=0, + SCAN_type, + SCAN_header +}; + +static void refill_buffer(stbi *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_end-1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static int get8(stbi *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int at_eof(stbi *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +stbi_inline static uint8 get8u(stbi *s) +{ + return (uint8) get8(s); +} + +static void skip(stbi *s, int n) +{ + if (s->io.read) { + int blen = s->img_buffer_end - s->img_buffer; + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int getn(stbi *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = s->img_buffer_end - s->img_buffer; + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int get16(stbi *s) +{ + int z = get8(s); + return (z << 8) + get8(s); +} + +static uint32 get32(stbi *s) +{ + uint32 z = get16(s); + return (z << 16) + get16(s); +} + +static int get16le(stbi *s) +{ + int z = get8(s); + return z + (get8(s) << 8); +} + +static uint32 get32le(stbi *s) +{ + uint32 z = get16le(s); + return z + (get16le(s) << 16); +} + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static uint8 compute_y(int r, int g, int b) +{ + return (uint8) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + assert(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) malloc(req_comp * x * y); + if (good == NULL) { + free(data); + return epuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define COMBO(a,b) ((a)*8+(b)) + #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (COMBO(img_n, req_comp)) { + CASE(1,2) dest[0]=src[0], dest[1]=255; break; + CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; + CASE(2,1) dest[0]=src[0]; break; + CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; + CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; + CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break; + CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break; + CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break; + CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; + CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + default: assert(0); + } + #undef CASE + } + + free(data); + return good; +} + +#ifndef STBI_NO_HDR +static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output = (float *) malloc(x * y * comp * sizeof(float)); + if (output == NULL) { free(data); return epf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale; + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + free(data); + return output; +} + +#define float2int(x) ((int) (x)) +static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output = (stbi_uc *) malloc(x * y * comp); + if (output == NULL) { free(data); return epuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (uint8) float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (uint8) float2int(z); + } + } + free(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) +// +// simple implementation +// - channel subsampling of at most 2 in each dimension +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - uses a lot of intermediate memory, could cache poorly +// - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 +// stb_jpeg: 1.34 seconds (MSVC6, default release build) +// stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) +// IJL11.dll: 1.08 seconds (compiled by intel) +// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) +// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + uint8 fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + uint16 code[256]; + uint8 values[256]; + uint8 size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} huffman; + +typedef struct +{ + #ifdef STBI_SIMD + unsigned short dequant2[4][64]; + #endif + stbi *s; + huffman huff_dc[4]; + huffman huff_ac[4]; + uint8 dequant[4][64]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + uint8 *data; + void *raw_data; + uint8 *linebuf; + } img_comp[4]; + + uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int scan_n, order[4]; + int restart_interval, todo; +} jpeg; + +static int build_huffman(huffman *h, int *count) +{ + int i,j,k=0,code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (uint8) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (uint16) (code++); + if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (uint8) i; + } + } + } + return 1; +} + +static void grow_buffer_unsafe(jpeg *j) +{ + do { + int b = j->nomore ? 0 : get8(j->s); + if (b == 0xff) { + int c = get8(j->s); + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int decode(jpeg *j, huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & bmask[k]) + h->delta[k]; + assert((((j->code_buffer) >> (32 - h->size[c])) & bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// combined JPEG 'receive' and JPEG 'extend', since baseline +// always extends everything it receives. +stbi_inline static int extend_receive(jpeg *j, int n) +{ + unsigned int m = 1 << (n-1); + unsigned int k; + if (j->code_bits < n) grow_buffer_unsafe(j); + + #if 1 + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~bmask[n]; + k &= bmask[n]; + j->code_bits -= n; + #else + k = (j->code_buffer >> (32 - n)) & bmask[n]; + j->code_bits -= n; + j->code_buffer <<= n; + #endif + // the following test is probably a random branch that won't + // predict well. I tried to table accelerate it but failed. + // maybe it's compiling as a conditional move? + if (k < m) + return (-1 << n) + k + 1; + else + return k; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static uint8 dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b) +{ + int diff,dc,k; + int t = decode(j, hdc); + if (t < 0) return e("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) dc; + + // decode AC components, see JPEG spec + k = 1; + do { + int r,s; + int rs = decode(j, hac); + if (rs < 0) return e("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + data[dezigzag[k++]] = (short) extend_receive(j,s); + } + } while (k < 64); + return 1; +} + +// take a -128..127 value and clamp it and convert to 0..255 +stbi_inline static uint8 clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (uint8) x; +} + +#define f2f(x) (int) (((x) * 4096 + 0.5)) +#define fsh(x) ((x) << 12) + +// derived from jidctint -- DCT_ISLOW +#define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * f2f(0.5411961f); \ + t2 = p1 + p3*f2f(-1.847759065f); \ + t3 = p1 + p2*f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = fsh(p2+p3); \ + t1 = fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*f2f( 1.175875602f); \ + t0 = t0*f2f( 0.298631336f); \ + t1 = t1*f2f( 2.053119869f); \ + t2 = t2*f2f( 3.072711026f); \ + t3 = t3*f2f( 1.501321110f); \ + p1 = p5 + p1*f2f(-0.899976223f); \ + p2 = p5 + p2*f2f(-2.562915447f); \ + p3 = p3*f2f(-1.961570560f); \ + p4 = p4*f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +#ifdef STBI_SIMD +typedef unsigned short stbi_dequantize_t; +#else +typedef uint8 stbi_dequantize_t; +#endif + +// .344 seconds on 3*anemones.jpg +static void idct_block(uint8 *out, int out_stride, short data[64], stbi_dequantize_t *dequantize) +{ + int i,val[64],*v=val; + stbi_dequantize_t *dq = dequantize; + uint8 *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d,++dq, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] * dq[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], + d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = clamp((x0+t3) >> 17); + o[7] = clamp((x0-t3) >> 17); + o[1] = clamp((x1+t2) >> 17); + o[6] = clamp((x1-t2) >> 17); + o[2] = clamp((x2+t1) >> 17); + o[5] = clamp((x2-t1) >> 17); + o[3] = clamp((x3+t0) >> 17); + o[4] = clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SIMD +static stbi_idct_8x8 stbi_idct_installed = idct_block; + +void stbi_install_idct(stbi_idct_8x8 func) +{ + stbi_idct_installed = func; +} +#endif + +#define MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static uint8 get_marker(jpeg *j) +{ + uint8 x; + if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; } + x = get8u(j->s); + if (x != 0xff) return MARKER_none; + while (x == 0xff) + x = get8u(j->s); + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, reset the entropy decoder and +// the dc prediction +static void reset(jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; + j->marker = MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int parse_entropy_coded_data(jpeg *z) +{ + reset(z); + if (z->scan_n == 1) { + int i,j; + #ifdef STBI_SIMD + __declspec(align(16)) + #endif + short data[64]; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; + #ifdef STBI_SIMD + stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); + #else + idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); + #endif + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!RESTART(z->marker)) return 1; + reset(z); + } + } + } + } else { // interleaved! + int i,j,k,x,y; + short data[64]; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; + #ifdef STBI_SIMD + stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); + #else + idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); + #endif + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!RESTART(z->marker)) return 1; + reset(z); + } + } + } + } + return 1; +} + +static int process_marker(jpeg *z, int m) +{ + int L; + switch (m) { + case MARKER_none: // no marker found + return e("expected marker","Corrupt JPEG"); + + case 0xC2: // SOF - progressive + return e("progressive jpeg","JPEG format not supported (progressive)"); + + case 0xDD: // DRI - specify restart interval + if (get16(z->s) != 4) return e("bad DRI len","Corrupt JPEG"); + z->restart_interval = get16(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = get16(z->s)-2; + while (L > 0) { + int q = get8(z->s); + int p = q >> 4; + int t = q & 15,i; + if (p != 0) return e("bad DQT type","Corrupt JPEG"); + if (t > 3) return e("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) + z->dequant[t][dezigzag[i]] = get8u(z->s); + #ifdef STBI_SIMD + for (i=0; i < 64; ++i) + z->dequant2[t][i] = z->dequant[t][i]; + #endif + L -= 65; + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = get16(z->s)-2; + while (L > 0) { + uint8 *v; + int sizes[16],i,m=0; + int q = get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = get8(z->s); + m += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < m; ++i) + v[i] = get8u(z->s); + L -= m; + } + return L==0; + } + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + skip(z->s, get16(z->s)-2); + return 1; + } + return 0; +} + +// after we see SOS +static int process_scan_header(jpeg *z) +{ + int i; + int Ls = get16(z->s); + z->scan_n = get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return e("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = get8(z->s), which; + int q = get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG"); + get8(z->s); // should be 63, but might be 0 + if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG"); + + return 1; +} + +static int process_frame_header(jpeg *z, int scan) +{ + stbi *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = get16(s); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG + p = get8(s); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = get16(s); if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = get16(s); if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires + c = get8(s); + if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG"); + + for (i=0; i < s->img_n; ++i) { + z->img_comp[i].id = get8(s); + if (z->img_comp[i].id != i+1) // JFIF requires + if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! + return e("bad component ID","Corrupt JPEG"); + q = get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG"); + z->img_comp[i].tq = get8(s); if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG"); + } + + if (scan != SCAN_load) return 1; + + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + if (z->img_comp[i].raw_data == NULL) { + for(--i; i >= 0; --i) { + free(z->img_comp[i].raw_data); + z->img_comp[i].data = NULL; + } + return e("outofmem", "Out of memory"); + } + // align blocks for installable-idct using mmx/sse + z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + z->img_comp[i].linebuf = NULL; + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define DNL(x) ((x) == 0xdc) +#define SOI(x) ((x) == 0xd8) +#define EOI(x) ((x) == 0xd9) +#define SOF(x) ((x) == 0xc0 || (x) == 0xc1) +#define SOS(x) ((x) == 0xda) + +static int decode_jpeg_header(jpeg *z, int scan) +{ + int m; + z->marker = MARKER_none; // initialize cached marker to empty + m = get_marker(z); + if (!SOI(m)) return e("no SOI","Corrupt JPEG"); + if (scan == SCAN_type) return 1; + m = get_marker(z); + while (!SOF(m)) { + if (!process_marker(z,m)) return 0; + m = get_marker(z); + while (m == MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (at_eof(z->s)) return e("no SOF", "Corrupt JPEG"); + m = get_marker(z); + } + } + if (!process_frame_header(z, scan)) return 0; + return 1; +} + +static int decode_jpeg_image(jpeg *j) +{ + int m; + j->restart_interval = 0; + if (!decode_jpeg_header(j, SCAN_load)) return 0; + m = get_marker(j); + while (!EOI(m)) { + if (SOS(m)) { + if (!process_scan_header(j)) return 0; + if (!parse_entropy_coded_data(j)) return 0; + if (j->marker == MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!at_eof(j->s)) { + int x = get8(j->s); + if (x == 255) { + j->marker = get8u(j->s); + break; + } else if (x != 0) { + return 0; + } + } + // if we reach eof without hitting a marker, get_marker() below will fail and we'll eventually return 0 + } + } else { + if (!process_marker(j, m)) return 0; + } + m = get_marker(j); + } + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1, + int w, int hs); + +#define div4(x) ((uint8) ((x) >> 2)) + +static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static uint8* resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + uint8 *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = div4(n+input[i-1]); + out[i*2+1] = div4(n+input[i+1]); + } + out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define div16(x) ((uint8) ((x) >> 4)) + +static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = div16(3*t0 + t1 + 8); + out[i*2 ] = div16(3*t1 + t0 + 8); + } + out[w*2-1] = div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + in_far = in_far; + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) + +// 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) +// VC6 without processor=Pro is generating multiple LEAs per multiply! +static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 16) + 32768; // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr*float2fixed(1.40200f); + g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); + b = y_fixed + cb*float2fixed(1.77200f); + r >>= 16; + g >>= 16; + b >>= 16; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (uint8)r; + out[1] = (uint8)g; + out[2] = (uint8)b; + out[3] = 255; + out += step; + } +} + +#ifdef STBI_SIMD +static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row; + +void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) +{ + stbi_YCbCr_installed = func; +} +#endif + + +// clean up the temporary component buffers +static void cleanup_jpeg(jpeg *j) +{ + int i; + for (i=0; i < j->s->img_n; ++i) { + if (j->img_comp[i].data) { + free(j->img_comp[i].raw_data); + j->img_comp[i].data = NULL; + } + if (j->img_comp[i].linebuf) { + free(j->img_comp[i].linebuf); + j->img_comp[i].linebuf = NULL; + } + } +} + +typedef struct +{ + resample_row_func resample; + uint8 *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi_resample; + +static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n; + // validate req_comp + if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); + z->s->img_n = 0; + + // load a jpeg image from whichever source + if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n; + + if (z->s->img_n == 3 && n < 3) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + uint i,j; + uint8 *output; + uint8 *coutput[4]; + + stbi_resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi_resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (uint8 *) malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2; + else r->resample = resample_row_generic; + } + + // can't error after this so, this is safe + output = (uint8 *) malloc(n * z->s->img_x * z->s->img_y + 1); + if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + uint8 *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi_resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + uint8 *y = coutput[0]; + if (z->s->img_n == 3) { + #ifdef STBI_SIMD + stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n); + #else + YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n); + #endif + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + uint8 *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } + } + cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n; // report original components, not output + return output; + } +} + +static unsigned char *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + jpeg j; + j.s = s; + return load_jpeg_image(&j, x,y,comp,req_comp); +} + +static int stbi_jpeg_test(stbi *s) +{ + int r; + jpeg j; + j.s = s; + r = decode_jpeg_header(&j, SCAN_type); + stbi_rewind(s); + return r; +} + +static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp) +{ + if (!decode_jpeg_header(j, SCAN_header)) { + stbi_rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n; + return 1; +} + +static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp) +{ + jpeg j; + j.s = s; + return stbi_jpeg_info_raw(&j, x, y, comp); +} + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define ZFAST_BITS 9 // accelerate all cases in default tables +#define ZFAST_MASK ((1 << ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + uint16 fast[1 << ZFAST_BITS]; + uint16 firstcode[16]; + int maxcode[17]; + uint16 firstsymbol[16]; + uint8 size[288]; + uint16 value[288]; +} zhuffman; + +stbi_inline static int bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int bit_reverse(int v, int bits) +{ + assert(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return bitreverse16(v) >> (16-bits); +} + +static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 255, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + assert(sizes[i] <= (1 << i)); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (uint16) code; + z->firstsymbol[i] = (uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + z->size[c] = (uint8)s; + z->value[c] = (uint16)i; + if (s <= ZFAST_BITS) { + int k = bit_reverse(next_code[s],s); + while (k < (1 << ZFAST_BITS)) { + z->fast[k] = (uint16) c; + k += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + uint8 *zbuffer, *zbuffer_end; + int num_bits; + uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + zhuffman z_length, z_distance; +} zbuf; + +stbi_inline static int zget8(zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void fill_bits(zbuf *z) +{ + do { + assert(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int zreceive(zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +stbi_inline static int zhuffman_decode(zbuf *a, zhuffman *z) +{ + int b,s,k; + if (a->num_bits < 16) fill_bits(a); + b = z->fast[a->code_buffer & ZFAST_MASK]; + if (b < 0xffff) { + s = z->size[b]; + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; + } + + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = bit_reverse(a->code_buffer, 16); + for (s=ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + assert(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +static int expand(zbuf *z, int n) // need to make room for n bytes +{ + char *q; + int cur, limit; + if (!z->z_expandable) return e("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) realloc(z->zout_start, limit); + if (q == NULL) return e("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int length_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int length_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int dist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int parse_huffman_block(zbuf *a) +{ + for(;;) { + int z = zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes + if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0; + *a->zout++ = (char) z; + } else { + uint8 *p; + int len,dist; + if (z == 256) return 1; + z -= 257; + len = length_base[z]; + if (length_extra[z]) len += zreceive(a, length_extra[z]); + z = zhuffman_decode(a, &a->z_distance); + if (z < 0) return e("bad huffman code","Corrupt PNG"); + dist = dist_base[z]; + if (dist_extra[z]) dist += zreceive(a, dist_extra[z]); + if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG"); + if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0; + p = (uint8 *) (a->zout - dist); + while (len--) + *a->zout++ = *p++; + } + } +} + +static int compute_huffman_codes(zbuf *a) +{ + static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + zhuffman z_codelength; + uint8 lencodes[286+32+137];//padding for maximum single op + uint8 codelength_sizes[19]; + int i,n; + + int hlit = zreceive(a,5) + 257; + int hdist = zreceive(a,5) + 1; + int hclen = zreceive(a,4) + 4; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (uint8) s; + } + if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < hlit + hdist) { + int c = zhuffman_decode(a, &z_codelength); + assert(c >= 0 && c < 19); + if (c < 16) + lencodes[n++] = (uint8) c; + else if (c == 16) { + c = zreceive(a,2)+3; + memset(lencodes+n, lencodes[n-1], c); + n += c; + } else if (c == 17) { + c = zreceive(a,3)+3; + memset(lencodes+n, 0, c); + n += c; + } else { + assert(c == 18); + c = zreceive(a,7)+11; + memset(lencodes+n, 0, c); + n += c; + } + } + if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG"); + if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int parse_uncompressed_block(zbuf *a) +{ + uint8 header[4]; + int len,nlen,k; + if (a->num_bits & 7) + zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns? + a->code_buffer >>= 8; + a->num_bits -= 8; + } + assert(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = (uint8) zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!expand(a, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int parse_zlib_header(zbuf *a) +{ + int cmf = zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = zget8(a); + if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +// @TODO: should statically initialize these for optimal thread safety +static uint8 default_length[288], default_distance[32]; +static void init_defaults(void) +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) default_length[i] = 8; + for ( ; i <= 255; ++i) default_length[i] = 9; + for ( ; i <= 279; ++i) default_length[i] = 7; + for ( ; i <= 287; ++i) default_length[i] = 8; + + for (i=0; i <= 31; ++i) default_distance[i] = 5; +} + +int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead +static int parse_zlib(zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = zreceive(a,1); + type = zreceive(a,2); + if (type == 0) { + if (!parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!default_distance[31]) init_defaults(); + if (!zbuild_huffman(&a->z_length , default_length , 288)) return 0; + if (!zbuild_huffman(&a->z_distance, default_distance, 32)) return 0; + } else { + if (!compute_huffman_codes(a)) return 0; + } + if (!parse_huffman_block(a)) return 0; + } + if (stbi_png_partial && a->zout - a->zout_start > 65536) + break; + } while (!final); + return 1; +} + +static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return parse_zlib(a, parse_header); +} + +char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + zbuf a; + char *p = (char *) malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (uint8 *) buffer; + a.zbuffer_end = (uint8 *) buffer + len; + if (do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + zbuf a; + char *p = (char *) malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (uint8 *) buffer; + a.zbuffer_end = (uint8 *) buffer + len; + if (do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + zbuf a; + a.zbuffer = (uint8 *) ibuffer; + a.zbuffer_end = (uint8 *) ibuffer + ilen; + if (do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + zbuf a; + char *p = (char *) malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (uint8 *) buffer; + a.zbuffer_end = (uint8 *) buffer+len; + if (do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + zbuf a; + a.zbuffer = (uint8 *) ibuffer; + a.zbuffer_end = (uint8 *) ibuffer + ilen; + if (do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + + +typedef struct +{ + uint32 length; + uint32 type; +} chunk; + +#define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + +static chunk get_chunk_header(stbi *s) +{ + chunk c; + c.length = get32(s); + c.type = get32(s); + return c; +} + +static int check_png_header(stbi *s) +{ + static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (get8u(s) != png_sig[i]) return e("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi *s; + uint8 *idata, *expanded, *out; +} png; + + +enum { + F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4, + F_avg_first, F_paeth_first +}; + +static uint8 first_row_filter[5] = +{ + F_none, F_sub, F_none, F_avg_first, F_paeth_first +}; + +static int paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +// create the png data from post-deflated data +static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y) +{ + stbi *s = a->s; + uint32 i,j,stride = x*out_n; + int k; + int img_n = s->img_n; // copy it into a local for later + assert(out_n == s->img_n || out_n == s->img_n+1); + if (stbi_png_partial) y = 1; + a->out = (uint8 *) malloc(x * y * out_n); + if (!a->out) return e("outofmem", "Out of memory"); + if (!stbi_png_partial) { + if (s->img_x == x && s->img_y == y) { + if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); + } else { // interlaced: + if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); + } + } + for (j=0; j < y; ++j) { + uint8 *cur = a->out + stride*j; + uint8 *prior = cur - stride; + int filter = *raw++; + if (filter > 4) return e("invalid filter","Corrupt PNG"); + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + // handle first pixel explicitly + for (k=0; k < img_n; ++k) { + switch (filter) { + case F_none : cur[k] = raw[k]; break; + case F_sub : cur[k] = raw[k]; break; + case F_up : cur[k] = raw[k] + prior[k]; break; + case F_avg : cur[k] = raw[k] + (prior[k]>>1); break; + case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break; + case F_avg_first : cur[k] = raw[k]; break; + case F_paeth_first: cur[k] = raw[k]; break; + } + } + if (img_n != out_n) cur[img_n] = 255; + raw += img_n; + cur += out_n; + prior += out_n; + // this is a little gross, so that we don't switch per-pixel or per-component + if (img_n == out_n) { + #define CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ + for (k=0; k < img_n; ++k) + switch (filter) { + CASE(F_none) cur[k] = raw[k]; break; + CASE(F_sub) cur[k] = raw[k] + cur[k-img_n]; break; + CASE(F_up) cur[k] = raw[k] + prior[k]; break; + CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break; + CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; + CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1); break; + CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break; + } + #undef CASE + } else { + assert(img_n+1 == out_n); + #define CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ + for (k=0; k < img_n; ++k) + switch (filter) { + CASE(F_none) cur[k] = raw[k]; break; + CASE(F_sub) cur[k] = raw[k] + cur[k-out_n]; break; + CASE(F_up) cur[k] = raw[k] + prior[k]; break; + CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break; + CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; + CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1); break; + CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break; + } + #undef CASE + } + } + return 1; +} + +static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced) +{ + uint8 *final; + int p; + int save; + if (!interlaced) + return create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y); + save = stbi_png_partial; + stbi_png_partial = 0; + + // de-interlacing + final = (uint8 *) malloc(a->s->img_x * a->s->img_y * out_n); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) { + free(final); + return 0; + } + for (j=0; j < y; ++j) + for (i=0; i < x; ++i) + memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, + a->out + (j*x+i)*out_n, out_n); + free(a->out); + raw += (x*out_n+1)*y; + raw_len -= (x*out_n+1)*y; + } + } + a->out = final; + + stbi_png_partial = save; + return 1; +} + +static int compute_transparency(png *z, uint8 tc[3], int out_n) +{ + stbi *s = z->s; + uint32 i, pixel_count = s->img_x * s->img_y; + uint8 *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + assert(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n) +{ + uint32 i, pixel_count = a->s->img_x * a->s->img_y; + uint8 *p, *temp_out, *orig = a->out; + + p = (uint8 *) malloc(pixel_count * pal_img_n); + if (p == NULL) return e("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + free(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi_unpremultiply_on_load = 0; +static int stbi_de_iphone_flag = 0; + +void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi_unpremultiply_on_load = flag_true_if_should_unpremultiply; +} +void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi_de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi_de_iphone(png *z) +{ + stbi *s = z->s; + uint32 i, pixel_count = s->img_x * s->img_y; + uint8 *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + uint8 t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + assert(s->img_out_n == 4); + if (stbi_unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + uint8 a = p[3]; + uint8 t = p[0]; + if (a) { + p[0] = p[2] * 255 / a; + p[1] = p[1] * 255 / a; + p[2] = t * 255 / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + uint8 t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +static int parse_png_file(png *z, int scan, int req_comp) +{ + uint8 palette[1024], pal_img_n=0; + uint8 has_trans=0, tc[3]; + uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, iphone=0; + stbi *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!check_png_header(s)) return 0; + + if (scan == SCAN_type) return 1; + + for (;;) { + chunk c = get_chunk_header(s); + switch (c.type) { + case PNG_TYPE('C','g','B','I'): + iphone = stbi_de_iphone_flag; + skip(s, c.length); + break; + case PNG_TYPE('I','H','D','R'): { + int depth,color,comp,filter; + if (!first) return e("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return e("bad IHDR len","Corrupt PNG"); + s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)"); + s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)"); + depth = get8(s); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only"); + color = get8(s); if (color > 6) return e("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG"); + comp = get8(s); if (comp) return e("bad comp method","Corrupt PNG"); + filter= get8(s); if (filter) return e("bad filter method","Corrupt PNG"); + interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); + if (scan == SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case PNG_TYPE('P','L','T','E'): { + if (first) return e("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = get8u(s); + palette[i*4+1] = get8u(s); + palette[i*4+2] = get8u(s); + palette[i*4+3] = 255; + } + break; + } + + case PNG_TYPE('t','R','N','S'): { + if (first) return e("first not IHDR", "Corrupt PNG"); + if (z->idata) return e("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = get8u(s); + } else { + if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG"); + if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG"); + has_trans = 1; + for (k=0; k < s->img_n; ++k) + tc[k] = (uint8) get16(s); // non 8-bit images will be larger + } + break; + } + + case PNG_TYPE('I','D','A','T'): { + if (first) return e("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG"); + if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } + if (ioff + c.length > idata_limit) { + uint8 *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + p = (uint8 *) realloc(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory"); + z->idata = p; + } + if (!getn(s, z->idata+ioff,c.length)) return e("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case PNG_TYPE('I','E','N','D'): { + uint32 raw_len; + if (first) return e("first not IHDR", "Corrupt PNG"); + if (scan != SCAN_load) return 1; + if (z->idata == NULL) return e("no IDAT","Corrupt PNG"); + z->expanded = (uint8 *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !iphone); + if (z->expanded == NULL) return 0; // zlib should set error + free(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0; + if (has_trans) + if (!compute_transparency(z, tc, s->img_out_n)) return 0; + if (iphone && s->img_out_n > 2) + stbi_de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!expand_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } + free(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return e("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX chunk not known"; + invalid_chunk[0] = (uint8) (c.type >> 24); + invalid_chunk[1] = (uint8) (c.type >> 16); + invalid_chunk[2] = (uint8) (c.type >> 8); + invalid_chunk[3] = (uint8) (c.type >> 0); + #endif + return e(invalid_chunk, "PNG not supported: unknown chunk type"); + } + skip(s, c.length); + break; + } + // end of chunk, read and skip CRC + get32(s); + } +} + +static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp) +{ + unsigned char *result=NULL; + if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); + if (parse_png_file(p, SCAN_load, req_comp)) { + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + result = convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + free(p->out); p->out = NULL; + free(p->expanded); p->expanded = NULL; + free(p->idata); p->idata = NULL; + + return result; +} + +static unsigned char *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + png p; + p.s = s; + return do_png(&p, x,y,comp,req_comp); +} + +static int stbi_png_test(stbi *s) +{ + int r; + r = check_png_header(s); + stbi_rewind(s); + return r; +} + +static int stbi_png_info_raw(png *p, int *x, int *y, int *comp) +{ + if (!parse_png_file(p, SCAN_header, 0)) { + stbi_rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi_png_info(stbi *s, int *x, int *y, int *comp) +{ + png p; + p.s = s; + return stbi_png_info_raw(&p, x, y, comp); +} + +// Microsoft/Windows BMP image + +static int bmp_test(stbi *s) +{ + int sz; + if (get8(s) != 'B') return 0; + if (get8(s) != 'M') return 0; + get32le(s); // discard filesize + get16le(s); // discard reserved + get16le(s); // discard reserved + get32le(s); // discard data offset + sz = get32le(s); + if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1; + return 0; +} + +static int stbi_bmp_test(stbi *s) +{ + int r = bmp_test(s); + stbi_rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +static int shiftsigned(int v, int shift, int bits) +{ + int result; + int z=0; + + if (shift < 0) v <<= -shift; + else v >>= shift; + result = v; + + z = bits; + while (z < 8) { + result += v >> z; + z += bits; + } + return result; +} + +static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + uint8 *out; + unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; + stbi_uc pal[256][4]; + int psize=0,i,j,compress=0,width; + int bpp, flip_vertically, pad, target, offset, hsz; + if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP"); + get32le(s); // discard filesize + get16le(s); // discard reserved + get16le(s); // discard reserved + offset = get32le(s); + hsz = get32le(s); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = get16le(s); + s->img_y = get16le(s); + } else { + s->img_x = get32le(s); + s->img_y = get32le(s); + } + if (get16le(s) != 1) return epuc("bad BMP", "bad BMP"); + bpp = get16le(s); + if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit"); + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + if (hsz == 12) { + if (bpp < 24) + psize = (offset - 14 - 24) / 3; + } else { + compress = get32le(s); + if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE"); + get32le(s); // discard sizeof + get32le(s); // discard hres + get32le(s); // discard vres + get32le(s); // discard colorsused + get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + get32le(s); + get32le(s); + get32le(s); + get32le(s); + } + if (bpp == 16 || bpp == 32) { + mr = mg = mb = 0; + if (compress == 0) { + if (bpp == 32) { + mr = 0xffu << 16; + mg = 0xffu << 8; + mb = 0xffu << 0; + ma = 0xffu << 24; + fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 + } else { + mr = 31u << 10; + mg = 31u << 5; + mb = 31u << 0; + } + } else if (compress == 3) { + mr = get32le(s); + mg = get32le(s); + mb = get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (mr == mg && mg == mb) { + // ?!?!? + return epuc("bad BMP", "bad BMP"); + } + } else + return epuc("bad BMP", "bad BMP"); + } + } else { + assert(hsz == 108); + mr = get32le(s); + mg = get32le(s); + mb = get32le(s); + ma = get32le(s); + get32le(s); // discard color space + for (i=0; i < 12; ++i) + get32le(s); // discard color space parameters + } + if (bpp < 16) + psize = (offset - 14 - hsz) >> 2; + } + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + out = (stbi_uc *) malloc(target * s->img_x * s->img_y); + if (!out) return epuc("outofmem", "Out of memory"); + if (bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { free(out); return epuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = get8u(s); + pal[i][1] = get8u(s); + pal[i][0] = get8u(s); + if (hsz != 12) get8(s); + pal[i][3] = 255; + } + skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); + if (bpp == 4) width = (s->img_x + 1) >> 1; + else if (bpp == 8) width = s->img_x; + else { free(out); return epuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=get8(s),v2=0; + if (bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (bpp == 8) ? get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + skip(s, pad); + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + skip(s, offset - 14 - hsz); + if (bpp == 24) width = 3 * s->img_x; + else if (bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (bpp == 24) { + easy = 1; + } else if (bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { free(out); return epuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = high_bit(mr)-7; rcount = bitcount(mr); + gshift = high_bit(mg)-7; gcount = bitcount(mr); + bshift = high_bit(mb)-7; bcount = bitcount(mr); + ashift = high_bit(ma)-7; acount = bitcount(mr); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + int a; + out[z+2] = get8u(s); + out[z+1] = get8u(s); + out[z+0] = get8u(s); + z += 3; + a = (easy == 2 ? get8(s) : 255); + if (target == 4) out[z++] = (uint8) a; + } + } else { + for (i=0; i < (int) s->img_x; ++i) { + uint32 v = (bpp == 16 ? get16le(s) : get32le(s)); + int a; + out[z++] = (uint8) shiftsigned(v & mr, rshift, rcount); + out[z++] = (uint8) shiftsigned(v & mg, gshift, gcount); + out[z++] = (uint8) shiftsigned(v & mb, bshift, bcount); + a = (ma ? shiftsigned(v & ma, ashift, acount) : 255); + if (target == 4) out[z++] = (uint8) a; + } + } + skip(s, pad); + } + } + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} + +static stbi_uc *stbi_bmp_load(stbi *s,int *x, int *y, int *comp, int req_comp) +{ + return bmp_load(s, x,y,comp,req_comp); +} + + +// Targa Truevision - TGA +// by Jonathan Dummer + +static int tga_info(stbi *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp; + int sz; + get8u(s); // discard Offset + sz = get8u(s); // color type + if( sz > 1 ) { + stbi_rewind(s); + return 0; // only RGB or indexed allowed + } + sz = get8u(s); // image type + // only RGB or grey allowed, +/- RLE + if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; + skip(s,9); + tga_w = get16le(s); + if( tga_w < 1 ) { + stbi_rewind(s); + return 0; // test width + } + tga_h = get16le(s); + if( tga_h < 1 ) { + stbi_rewind(s); + return 0; // test height + } + sz = get8(s); // bits per pixel + // only RGB or RGBA or grey allowed + if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) { + stbi_rewind(s); + return 0; + } + tga_comp = sz; + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp / 8; + return 1; // seems to have passed everything +} + +int stbi_tga_info(stbi *s, int *x, int *y, int *comp) +{ + return tga_info(s, x, y, comp); +} + +static int tga_test(stbi *s) +{ + int sz; + get8u(s); // discard Offset + sz = get8u(s); // color type + if ( sz > 1 ) return 0; // only RGB or indexed allowed + sz = get8u(s); // image type + if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE + get16(s); // discard palette start + get16(s); // discard palette length + get8(s); // discard bits per palette color entry + get16(s); // discard x origin + get16(s); // discard y origin + if ( get16(s) < 1 ) return 0; // test width + if ( get16(s) < 1 ) return 0; // test height + sz = get8(s); // bits per pixel + if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed + return 1; // seems to have passed everything +} + +static int stbi_tga_test(stbi *s) +{ + int res = tga_test(s); + stbi_rewind(s); + return res; +} + +static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + // read in the TGA header stuff + int tga_offset = get8u(s); + int tga_indexed = get8u(s); + int tga_image_type = get8u(s); + int tga_is_RLE = 0; + int tga_palette_start = get16le(s); + int tga_palette_len = get16le(s); + int tga_palette_bits = get8u(s); + int tga_x_origin = get16le(s); + int tga_y_origin = get16le(s); + int tga_width = get16le(s); + int tga_height = get16le(s); + int tga_bits_per_pixel = get8u(s); + int tga_inverted = get8u(s); + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4]; + unsigned char trans_data[4]; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + /* int tga_alpha_bits = tga_inverted & 15; */ + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // error check + if ( //(tga_indexed) || + (tga_width < 1) || (tga_height < 1) || + (tga_image_type < 1) || (tga_image_type > 3) || + ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && + (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) + ) + { + return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA + } + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) + { + tga_bits_per_pixel = tga_palette_bits; + } + + // tga info + *x = tga_width; + *y = tga_height; + if ( (req_comp < 1) || (req_comp > 4) ) + { + // just use whatever the file was + req_comp = tga_bits_per_pixel / 8; + *comp = req_comp; + } else + { + // force a new number of components + *comp = tga_bits_per_pixel/8; + } + tga_data = (unsigned char*)malloc( tga_width * tga_height * req_comp ); + if (!tga_data) return epuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + skip(s, tga_offset ); + // do I need to load a palette? + if ( tga_indexed ) + { + // any data to skip? (offset usually = 0) + skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); + if (!tga_palette) return epuc("outofmem", "Out of memory"); + if (!getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { + free(tga_data); + free(tga_palette); + return epuc("bad palette", "Corrupt TGA"); + } + } + // load the data + trans_data[0] = trans_data[1] = trans_data[2] = trans_data[3] = 0; + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE chunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = get8u(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in 1 byte, then perform the lookup + int pal_idx = get8u(s); + if ( pal_idx >= tga_palette_len ) + { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_bits_per_pixel / 8; + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else + { + // read in the data raw + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + { + raw_data[j] = get8u(s); + } + } + // convert raw to the intermediate format + switch (tga_bits_per_pixel) + { + case 8: + // Luminous => RGBA + trans_data[0] = raw_data[0]; + trans_data[1] = raw_data[0]; + trans_data[2] = raw_data[0]; + trans_data[3] = 255; + break; + case 16: + // Luminous,Alpha => RGBA + trans_data[0] = raw_data[0]; + trans_data[1] = raw_data[0]; + trans_data[2] = raw_data[0]; + trans_data[3] = raw_data[1]; + break; + case 24: + // BGR => RGBA + trans_data[0] = raw_data[2]; + trans_data[1] = raw_data[1]; + trans_data[2] = raw_data[0]; + trans_data[3] = 255; + break; + case 32: + // BGRA => RGBA + trans_data[0] = raw_data[2]; + trans_data[1] = raw_data[1]; + trans_data[2] = raw_data[0]; + trans_data[3] = raw_data[3]; + break; + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + // convert to final format + switch (req_comp) + { + case 1: + // RGBA => Luminance + tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); + break; + case 2: + // RGBA => Luminance,Alpha + tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); + tga_data[i*req_comp+1] = trans_data[3]; + break; + case 3: + // RGBA => RGB + tga_data[i*req_comp+0] = trans_data[0]; + tga_data[i*req_comp+1] = trans_data[1]; + tga_data[i*req_comp+2] = trans_data[2]; + break; + case 4: + // RGBA => RGBA + tga_data[i*req_comp+0] = trans_data[0]; + tga_data[i*req_comp+1] = trans_data[1]; + tga_data[i*req_comp+2] = trans_data[2]; + tga_data[i*req_comp+3] = trans_data[3]; + break; + } + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * req_comp; + int index2 = (tga_height - 1 - j) * tga_width * req_comp; + for (i = tga_width * req_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + free( tga_palette ); + } + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} + +static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + return tga_load(s,x,y,comp,req_comp); +} + + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +static int psd_test(stbi *s) +{ + if (get32(s) != 0x38425053) return 0; // "8BPS" + else return 1; +} + +static int stbi_psd_test(stbi *s) +{ + int r = psd_test(s); + stbi_rewind(s); + return r; +} + +static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + int pixelCount; + int channelCount, compression; + int channel, i, count, len; + int w,h; + uint8 *out; + + // Check identifier + if (get32(s) != 0x38425053) // "8BPS" + return epuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (get16(s) != 1) + return epuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = get16(s); + if (channelCount < 0 || channelCount > 16) + return epuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = get32(s); + w = get32(s); + + // Make sure the depth is 8 bits. + if (get16(s) != 8) + return epuc("unsupported bit depth", "PSD bit depth is not 8 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (get16(s) != 3) + return epuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + skip(s,get32(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + skip(s, get32(s) ); + + // Skip the reserved data. + skip(s, get32(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = get16(s); + if (compression > 1) + return epuc("bad compression", "PSD has an unknown compression format"); + + // Create the destination image. + out = (stbi_uc *) malloc(4 * w*h); + if (!out) return epuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + uint8 *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; + } else { + // Read the RLE data. + count = 0; + while (count < pixelCount) { + len = get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + count += len; + while (len) { + *p = get8u(s); + p += 4; + len--; + } + } else if (len > 128) { + uint8 val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len ^= 0x0FF; + len += 2; + val = get8u(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + uint8 *p; + + p = out + channel; + if (channel > channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; + } else { + // Read the data. + for (i = 0; i < pixelCount; i++) + *p = get8u(s), p += 4; + } + } + } + + if (req_comp && req_comp != 4) { + out = convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // convert_format frees input on failure + } + + if (comp) *comp = channelCount; + *y = h; + *x = w; + + return out; +} + +static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + return psd_load(s,x,y,comp,req_comp); +} + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +static int pic_is4(stbi *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int pic_test(stbi *s) +{ + int i; + + if (!pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + get8(s); + + if (!pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} pic_packet_t; + +static stbi_uc *pic_readval(stbi *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (at_eof(s)) return epuc("bad file","PIC file too short"); + dest[i]=get8u(s); + } + } + + return dest; +} + +static void pic_copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *pic_load2(stbi *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + pic_packet_t packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + pic_packet_t *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return epuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = get8(s); + packet->size = get8u(s); + packet->type = get8u(s); + packet->channel = get8u(s); + + act_comp |= packet->channel; + + if (at_eof(s)) return epuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return epuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return epuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=get8u(s); + if (at_eof(s)) return epuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (uint8) left; + + if (!pic_readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = get8(s), i; + if (at_eof(s)) return epuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + int i; + + if (count==128) + count = get16(s); + else + count -= 127; + if (count > left) + return epuc("bad file","scanline overrun"); + + if (!pic_readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return epuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static stbi_uc *pic_load(stbi *s,int *px,int *py,int *comp,int req_comp) +{ + stbi_uc *result; + int i, x,y; + + for (i=0; i<92; ++i) + get8(s); + + x = get16(s); + y = get16(s); + if (at_eof(s)) return epuc("bad file","file too short (pic header)"); + if ((1 << 28) / x < y) return epuc("too large", "Image too large to decode"); + + get32(s); //skip `ratio' + get16(s); //skip `fields' + get16(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) malloc(x*y*4); + memset(result, 0xff, x*y*4); + + if (!pic_load2(s,x,y,comp, result)) { + free(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi_pic_test(stbi *s) +{ + int r = pic_test(s); + stbi_rewind(s); + return r; +} + +static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + return pic_load(s,x,y,comp,req_comp); +} + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb +typedef struct stbi_gif_lzw_struct { + int16 prefix; + uint8 first; + uint8 suffix; +} stbi_gif_lzw; + +typedef struct stbi_gif_struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + int flags, bgindex, ratio, transparent, eflags; + uint8 pal[256][4]; + uint8 lpal[256][4]; + stbi_gif_lzw codes[4096]; + uint8 *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; +} stbi_gif; + +static int gif_test(stbi *s) +{ + int sz; + if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return 0; + sz = get8(s); + if (sz != '9' && sz != '7') return 0; + if (get8(s) != 'a') return 0; + return 1; +} + +static int stbi_gif_test(stbi *s) +{ + int r = gif_test(s); + stbi_rewind(s); + return r; +} + +static void stbi_gif_parse_colortable(stbi *s, uint8 pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = get8u(s); + pal[i][1] = get8u(s); + pal[i][0] = get8u(s); + pal[i][3] = transp ? 0 : 255; + } +} + +static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info) +{ + uint8 version; + if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') + return e("not GIF", "Corrupt GIF"); + + version = get8u(s); + if (version != '7' && version != '9') return e("not GIF", "Corrupt GIF"); + if (get8(s) != 'a') return e("not GIF", "Corrupt GIF"); + + failure_reason = ""; + g->w = get16le(s); + g->h = get16le(s); + g->flags = get8(s); + g->bgindex = get8(s); + g->ratio = get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi_gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp) +{ + stbi_gif g; + if (!stbi_gif_header(s, &g, comp, 1)) { + stbi_rewind( s ); + return 0; + } + if (x) *x = g.w; + if (y) *y = g.h; + return 1; +} + +static void stbi_out_gif_code(stbi_gif *g, uint16 code) +{ + uint8 *p, *c; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi_out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + p = &g->out[g->cur_x + g->cur_y]; + c = &g->color_table[g->codes[code].suffix * 4]; + + if (c[3] >= 128) { + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static uint8 *stbi_process_gif_raster(stbi *s, stbi_gif *g) +{ + uint8 lzw_cs; + int32 len, code; + uint32 first; + int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi_gif_lzw *p; + + lzw_cs = get8u(s); + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (code = 0; code < clear; code++) { + g->codes[code].prefix = -1; + g->codes[code].first = (uint8) code; + g->codes[code].suffix = (uint8) code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (int32) get8(s) << valid_bits; + valid_bits += 8; + } else { + int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + skip(s, len); + while ((len = get8(s)) > 0) + skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) return epuc("no clear code", "Corrupt GIF"); + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 4096) return epuc("too many codes", "Corrupt GIF"); + p->prefix = (int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return epuc("illegal code in raster", "Corrupt GIF"); + + stbi_out_gif_code(g, (uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return epuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +static void stbi_fill_gif_background(stbi_gif *g) +{ + int i; + uint8 *c = g->pal[g->bgindex]; + // @OPTIMIZE: write a dword at a time + for (i = 0; i < g->w * g->h * 4; i += 4) { + uint8 *p = &g->out[i]; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +static uint8 *stbi_gif_load_next(stbi *s, stbi_gif *g, int *comp, int req_comp) +{ + int i; + uint8 *old_out = 0; + + if (g->out == 0) { + if (!stbi_gif_header(s, g, comp,0)) return 0; // failure_reason set by stbi_gif_header + g->out = (uint8 *) malloc(4 * g->w * g->h); + if (g->out == 0) return epuc("outofmem", "Out of memory"); + stbi_fill_gif_background(g); + } else { + // animated-gif-only path + if (((g->eflags & 0x1C) >> 2) == 3) { + old_out = g->out; + g->out = (uint8 *) malloc(4 * g->w * g->h); + if (g->out == 0) return epuc("outofmem", "Out of memory"); + memcpy(g->out, old_out, g->w*g->h*4); + } + } + + for (;;) { + switch (get8(s)) { + case 0x2C: /* Image Descriptor */ + { + int32 x, y, w, h; + uint8 *o; + + x = get16le(s); + y = get16le(s); + w = get16le(s); + h = get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return epuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi_gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (uint8 *) g->lpal; + } else if (g->flags & 0x80) { + for (i=0; i < 256; ++i) // @OPTIMIZE: reset only the previous transparent + g->pal[i][3] = 255; + if (g->transparent >= 0 && (g->eflags & 0x01)) + g->pal[g->transparent][3] = 0; + g->color_table = (uint8 *) g->pal; + } else + return epuc("missing color table", "Corrupt GIF"); + + o = stbi_process_gif_raster(s, g); + if (o == NULL) return NULL; + + if (req_comp && req_comp != 4) + o = convert_format(o, 4, req_comp, g->w, g->h); + return o; + } + + case 0x21: // Comment Extension. + { + int len; + if (get8(s) == 0xF9) { // Graphic Control Extension. + len = get8(s); + if (len == 4) { + g->eflags = get8(s); + get16le(s); // delay + g->transparent = get8(s); + } else { + skip(s, len); + break; + } + } + while ((len = get8(s)) != 0) + skip(s, len); + break; + } + + case 0x3B: // gif stream termination code + return (uint8 *) 1; + + default: + return epuc("unknown code", "Corrupt GIF"); + } + } +} + +static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + uint8 *u = 0; + stbi_gif g={0}; + + u = stbi_gif_load_next(s, &g, comp, req_comp); + if (u == (void *) 1) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + } + + return u; +} + +static int stbi_gif_info(stbi *s, int *x, int *y, int *comp) +{ + return stbi_gif_info_raw(s,x,y,comp); +} + + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int hdr_test(stbi *s) +{ + const char *signature = "#?RADIANCE\n"; + int i; + for (i=0; signature[i]; ++i) + if (get8(s) != signature[i]) + return 0; + return 1; +} + +static int stbi_hdr_test(stbi* s) +{ + int r = hdr_test(s); + stbi_rewind(s); + return r; +} + +#define HDR_BUFLEN 1024 +static char *hdr_gettoken(stbi *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) get8(z); + + while (!at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == HDR_BUFLEN-1) { + // flush to end of line + while (!at_eof(z) && get8(z) != '\n') + ; + break; + } + c = (char) get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + char buffer[HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + + + // Check identifier + if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) + return epf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return epf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = strtol(token, NULL, 10); + + *x = width; + *y = height; + + *comp = 3; + if (req_comp == 0) req_comp = 3; + + // Read data + hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + getn(s, rgbe, 4); + hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = get8(s); + c2 = get8(s); + len = get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + uint8 rgbe[4]; + rgbe[0] = (uint8) c1; + rgbe[1] = (uint8) c2; + rgbe[2] = (uint8) len; + rgbe[3] = (uint8) get8u(s); + hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + free(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= get8(s); + if (len != width) { free(hdr_data); free(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); + + for (k = 0; k < 4; ++k) { + i = 0; + while (i < width) { + count = get8u(s); + if (count > 128) { + // Run + value = get8u(s); + count -= 128; + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = get8u(s); + } + } + } + for (i=0; i < width; ++i) + hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + free(scanline); + } + + return hdr_data; +} + +static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + return hdr_load(s,x,y,comp,req_comp); +} + +static int stbi_hdr_info(stbi *s, int *x, int *y, int *comp) +{ + char buffer[HDR_BUFLEN]; + char *token; + int valid = 0; + + if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) { + stbi_rewind( s ); + return 0; + } + + for(;;) { + token = hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi_rewind( s ); + return 0; + } + token = hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi_rewind( s ); + return 0; + } + token += 3; + *y = strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi_rewind( s ); + return 0; + } + token += 3; + *x = strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +static int stbi_bmp_info(stbi *s, int *x, int *y, int *comp) +{ + int hsz; + if (get8(s) != 'B' || get8(s) != 'M') { + stbi_rewind( s ); + return 0; + } + skip(s,12); + hsz = get32le(s); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) { + stbi_rewind( s ); + return 0; + } + if (hsz == 12) { + *x = get16le(s); + *y = get16le(s); + } else { + *x = get32le(s); + *y = get32le(s); + } + if (get16le(s) != 1) { + stbi_rewind( s ); + return 0; + } + *comp = get16le(s) / 8; + return 1; +} + +static int stbi_psd_info(stbi *s, int *x, int *y, int *comp) +{ + int channelCount; + if (get32(s) != 0x38425053) { + stbi_rewind( s ); + return 0; + } + if (get16(s) != 1) { + stbi_rewind( s ); + return 0; + } + skip(s, 6); + channelCount = get16(s); + if (channelCount < 0 || channelCount > 16) { + stbi_rewind( s ); + return 0; + } + *y = get32(s); + *x = get32(s); + if (get16(s) != 8) { + stbi_rewind( s ); + return 0; + } + if (get16(s) != 3) { + stbi_rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi_pic_info(stbi *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained; + pic_packet_t packets[10]; + + skip(s, 92); + + *x = get16(s); + *y = get16(s); + if (at_eof(s)) return 0; + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi_rewind( s ); + return 0; + } + + skip(s, 8); + + do { + pic_packet_t *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = get8(s); + packet->size = get8u(s); + packet->type = get8u(s); + packet->channel = get8u(s); + act_comp |= packet->channel; + + if (at_eof(s)) { + stbi_rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi_rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} + +static int stbi_info_main(stbi *s, int *x, int *y, int *comp) +{ + if (stbi_jpeg_info(s, x, y, comp)) + return 1; + if (stbi_png_info(s, x, y, comp)) + return 1; + if (stbi_gif_info(s, x, y, comp)) + return 1; + if (stbi_bmp_info(s, x, y, comp)) + return 1; + if (stbi_psd_info(s, x, y, comp)) + return 1; + if (stbi_pic_info(s, x, y, comp)) + return 1; + #ifndef STBI_NO_HDR + if (stbi_hdr_info(s, x, y, comp)) + return 1; + #endif + // test tga last because it's a crappy test! + if (stbi_tga_info(s, x, y, comp)) + return 1; + return e("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = fopen(filename, "rb"); + int result; + if (!f) return e("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi s; + long pos = ftell(f); + start_file(&s, f); + r = stbi_info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi s; + start_mem(&s,buffer,len); + return stbi_info_main(&s,x,y,comp); +} + +int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi s; + start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi_info_main(&s,x,y,comp); +} + +#endif // STBI_HEADER_FILE_ONLY + +/* + revision history: + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-uint8 to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.e. Janez (U+017D)emva) + 1.21 fix use of 'uint8' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 2008-08-02 + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 first released version +*/ From 8346a9568a9f9d9b8b18ed34a14c79ce77b630bf Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 4 Mar 2013 09:38:34 -0600 Subject: [PATCH 343/695] Made header files public and incorporated the radius-3 Kuwahara filter with the project. Rolled back experiments with image file loading. --- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 6 + .../SimpleImageViewController.m | 6 +- framework/GPUImage.xcodeproj/project.pbxproj | 322 +- framework/Source/GPUImagePicture.m | 48 +- framework/Source/stb_image.c | 4676 ----------------- 7 files changed, 178 insertions(+), 4882 deletions(-) delete mode 100644 framework/Source/stb_image.c diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index abd0307a2..e0cd9caca 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -169,6 +169,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_POISSONBLEND: cell.textLabel.text = @"Poisson blend"; break; case GPUIMAGE_OPACITY: cell.textLabel.text = @"Opacity adjustment"; break; case GPUIMAGE_KUWAHARA: cell.textLabel.text = @"Kuwahara"; break; + case GPUIMAGE_KUWAHARARADIUS3: cell.textLabel.text = @"Kuwahara (fixed radius)"; break; case GPUIMAGE_VIGNETTE: cell.textLabel.text = @"Vignette"; break; case GPUIMAGE_GAUSSIAN: cell.textLabel.text = @"Gaussian blur"; break; case GPUIMAGE_FASTBLUR: cell.textLabel.text = @"Fast blur"; break; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 5c9bf88d0..9d52c5e4a 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -64,6 +64,7 @@ typedef enum { GPUIMAGE_EMBOSS, GPUIMAGE_CHROMAKEYNONBLEND, GPUIMAGE_KUWAHARA, + GPUIMAGE_KUWAHARARADIUS3, GPUIMAGE_VIGNETTE, GPUIMAGE_GAUSSIAN, GPUIMAGE_GAUSSIAN_SELECTIVE, diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index fb3df95a7..c1139cb85 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1112,7 +1112,13 @@ - (void)setupFilter; filter = [[GPUImageKuwaharaFilter alloc] init]; }; break; + case GPUIMAGE_KUWAHARARADIUS3: + { + self.title = @"Kuwahara (Radius 3)"; + self.filterSettingsSlider.hidden = YES; + filter = [[GPUImageKuwaharaRadius3Filter alloc] init]; + }; break; case GPUIMAGE_VIGNETTE: { self.title = @"Vignette"; diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index dc71c930b..bfed5f935 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -80,11 +80,11 @@ - (void)setupDisplayFiltering; - (void)setupImageFilteringToDisk; { // Set up a manual image filtering chain -// NSURL *inputImageURL = [[NSBundle mainBundle] URLForResource:@"Lambeau" withExtension:@"jpg"]; + NSURL *inputImageURL = [[NSBundle mainBundle] URLForResource:@"Lambeau" withExtension:@"jpg"]; UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; - GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; -// GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithURL:inputImageURL]; +// GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; + GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithURL:inputImageURL]; GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 5b325a230..a843f51dc 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -21,191 +21,191 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; + 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; - 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; }; + 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */; }; - 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; }; + 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; - 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; }; + 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097716B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m */; }; - 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; + 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; - 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; + 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6EE27494150E8FC60040DDB6 /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */; }; - 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; }; + 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; - 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; }; + 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; - 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; }; + 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */; }; - 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; }; + 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96781B3515C39E80005FA0D7 /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */; }; - 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; }; + 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; - 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; }; + 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; - B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; }; + B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */; }; - B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; }; + B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B80171FF16312800001C8D16 /* GPUImageSaturationBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */; }; - B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; }; + B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */; }; - B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; + B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; - B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; }; + B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */; }; - BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; }; + BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */; }; - BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; }; + BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */; }; - BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; }; + BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */; }; - BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; }; + BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */; }; - BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; }; + BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */; }; - BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; }; + BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */; }; - BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; }; + BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690D1157C2EBA009274F9 /* GPUImageRGBDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690CF157C2EBA009274F9 /* GPUImageRGBDilationFilter.m */; }; - BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; }; + BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690D6157C31C9009274F9 /* GPUImageRGBErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D4157C31C9009274F9 /* GPUImageRGBErosionFilter.m */; }; - BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; }; + BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D8157C33B8009274F9 /* GPUImageRGBOpeningFilter.m */; }; - BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; }; + BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */; }; - BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; }; + BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690F8157C5075009274F9 /* GPUImageColorPackingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690F6157C5075009274F9 /* GPUImageColorPackingFilter.m */; }; - BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; }; + BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; - BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; }; + BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC185E7B16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7916B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m */; }; - BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; }; + BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC185E7F16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7D16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m */; }; - BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; }; + BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC185E8316B866F000EA01AD /* GPUImagePixellatePositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E8116B866F000EA01AD /* GPUImagePixellatePositionFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; - BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; }; - BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; }; + BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC1B715814F49DAA00ACA2AB /* GPUImageRawDataOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B715614F49DAA00ACA2AB /* GPUImageRawDataOutput.m */; }; - BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; }; + BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC1B717D14F566E200ACA2AB /* GPUImageSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */; }; - BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; }; + BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC1B718F14F56C1D00ACA2AB /* GPUImageSwirlFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B718D14F56C1D00ACA2AB /* GPUImageSwirlFilter.m */; }; - BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; }; + BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC1B728214FB16AF00ACA2AB /* GPUImageMovieWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */; }; - BC245DC114DDBCF5009FE7EB /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; }; - BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; }; + BC245DC114DDBCF5009FE7EB /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; - BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; }; + BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */; }; - BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; }; + BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */; }; - BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; }; + BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC4D03D0160919AE00F64358 /* GPUImageHalftoneFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4D03CE160919AE00F64358 /* GPUImageHalftoneFilter.m */; }; - BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; }; + BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; - BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; }; + BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D8291579779700CC9C1E /* GPUImageUIElement.m */; }; - BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; }; + BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */; }; - BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; }; + BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */; }; - BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; + BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; - BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; }; + BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */; }; - BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; }; + BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */; }; - BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; }; + BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */; }; - BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; + BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; - BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; }; + BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC95C4091622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */; }; - BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; + BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B5414F07F790001FF6F /* GPUImageColorInvertFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5014F07F790001FF6F /* GPUImageColorInvertFilter.m */; }; - BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; }; + BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B5614F07F790001FF6F /* GPUImageSaturationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5214F07F790001FF6F /* GPUImageSaturationFilter.m */; }; - BC982B6714F092EF0001FF6F /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; }; + BC982B6714F092EF0001FF6F /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B6814F092EF0001FF6F /* GPUImageContrastFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B6614F092EF0001FF6F /* GPUImageContrastFilter.m */; }; - BC982B7914F098CC0001FF6F /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; }; + BC982B7914F098CC0001FF6F /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B7A14F098CC0001FF6F /* GPUImageBrightnessFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */; }; - BC982B7E14F09F980001FF6F /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; }; + BC982B7E14F09F980001FF6F /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B7F14F09F980001FF6F /* GPUImageGammaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7D14F09F980001FF6F /* GPUImageGammaFilter.m */; }; - BC982B9914F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; }; + BC982B9914F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B9A14F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */; }; - BC982BEB14F1CE600001FF6F /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; }; + BC982BEB14F1CE600001FF6F /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982BEC14F1CE600001FF6F /* GPUImageDissolveBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BE814F1CE600001FF6F /* GPUImageDissolveBlendFilter.m */; }; - BC982BED14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; }; + BC982BED14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982BEE14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BEA14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m */; }; - BC982C4714F29E580001FF6F /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; }; + BC982C4714F29E580001FF6F /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C4814F29E580001FF6F /* GPUImageKuwaharaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */; }; - BC982C6E14F33C2A0001FF6F /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; }; + BC982C6E14F33C2A0001FF6F /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C6F14F33C2A0001FF6F /* GPUImageMovie.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */; }; - BC982C7014F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; }; + BC982C7014F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C7114F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6D14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m */; }; - BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; }; + BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C8214F34F0C0001FF6F /* GPUImageDarkenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C7E14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.m */; }; - BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; }; + BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C8414F34F0C0001FF6F /* GPUImageLightenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */; }; - BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; }; + BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982CA014F35C2D0001FF6F /* GPUImageToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */; }; - BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; }; + BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */; }; - BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; }; + BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */; }; - BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; }; + BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */; }; - BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; }; + BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA632821623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632801623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m */; }; - BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; }; + BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA632871623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */; }; - BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; }; + BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */; }; - BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; }; + BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */; }; - BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; }; + BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCABED9115263CF20098A93E /* GPUImageStretchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */; }; - BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; }; + BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */; }; - BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; }; + BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */; }; - BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; }; + BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */; }; - BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; }; + BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; - BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; }; + BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */; }; - BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; }; + BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */; }; - BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; }; + BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */; }; - BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; }; + BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D1015718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */; }; - BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; }; + BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D1515718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */; }; - BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; }; + BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */; }; - BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; }; + BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; - BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; }; + BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */; }; - BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; }; + BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */; }; - BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; }; + BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */; }; - BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; }; + BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */; }; - BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; + BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; - BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; + BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E75D14E2086300701302 /* GPUImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E75B14E2086300701302 /* GPUImageView.m */; }; - BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; }; + BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E76614E208D700701302 /* GPUImageVideoCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */; }; - BCB5E76C14E20AD700701302 /* GPUImageOpenGLESContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageOpenGLESContext.h */; }; + BCB5E76C14E20AD700701302 /* GPUImageOpenGLESContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageOpenGLESContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E76D14E20AD700701302 /* GPUImageOpenGLESContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageOpenGLESContext.m */; }; BCB5E76F14E20B8000701302 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E76E14E20B7F00701302 /* UIKit.framework */; }; BCB5E77114E20B8A00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77014E20B8A00701302 /* AVFoundation.framework */; }; @@ -213,90 +213,92 @@ BCB5E77514E20B9700701302 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77414E20B9700701302 /* OpenGLES.framework */; }; BCB5E77714E20BA800701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77614E20BA800701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Required, ); }; }; BCB5E77914E20BAF00701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77814E20BAF00701302 /* CoreMedia.framework */; }; - BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; }; + BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E78014E22E4300701302 /* GPUImageOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E77E14E22E4200701302 /* GPUImageOutput.m */; }; - BCB5E79414E3275200701302 /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; }; + BCB5E79414E3275200701302 /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E79514E3275200701302 /* GLProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E79314E3275200701302 /* GLProgram.m */; }; - BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; }; + BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E7C314E4B6D400701302 /* GPUImageSepiaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7C114E4B6D400701302 /* GPUImageSepiaFilter.m */; }; - BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; }; + BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E7DB14E6003400701302 /* GPUImagePicture.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7D914E6003400701302 /* GPUImagePicture.m */; }; - BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; }; + BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B838150400030041703B /* GPUImageExposureFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B834150400030041703B /* GPUImageExposureFilter.m */; }; - BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; }; + BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B83A150400030041703B /* GPUImageSharpenFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B836150400030041703B /* GPUImageSharpenFilter.m */; }; - BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; }; + BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B85715041A920041703B /* GPUImageColorBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85115041A920041703B /* GPUImageColorBurnBlendFilter.m */; }; - BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; }; + BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B85915041A920041703B /* GPUImageColorDodgeBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85315041A920041703B /* GPUImageColorDodgeBlendFilter.m */; }; - BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; }; + BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B85B15041A920041703B /* GPUImageScreenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85515041A920041703B /* GPUImageScreenBlendFilter.m */; }; - BCB6B8701504234A0041703B /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; }; + BCB6B8701504234A0041703B /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8711504234A0041703B /* GPUImageDifferenceBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8691504234A0041703B /* GPUImageDifferenceBlendFilter.m */; }; - BCB6B8721504234A0041703B /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; }; + BCB6B8721504234A0041703B /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8731504234A0041703B /* GPUImageExclusionBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86B1504234A0041703B /* GPUImageExclusionBlendFilter.m */; }; - BCB6B8741504234A0041703B /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; }; + BCB6B8741504234A0041703B /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8751504234A0041703B /* GPUImageHardLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86D1504234A0041703B /* GPUImageHardLightBlendFilter.m */; }; - BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; }; + BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8771504234A0041703B /* GPUImageSoftLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */; }; - BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; }; + BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8BC1505BF940041703B /* GPUImageTextureOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */; }; - BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; }; + BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; - BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; }; + BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */; }; - BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; }; + BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */; }; - BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; }; + BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */; }; - BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; }; + BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */; }; - BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; }; + BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */; }; - BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; }; + BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; - BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; + BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */; }; - BCBF617316E4478E00E2784A /* stb_image.c in Sources */ = {isa = PBXBuildFile; fileRef = BCBF617216E4478E00E2784A /* stb_image.c */; }; - BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; }; + BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF617916E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.m */; }; + BCBF617D16E4F69B00E2784A /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */; }; - BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; }; + BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E5A9151E74B20006EFA5 /* GPUImagePosterizeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5A7151E74B20006EFA5 /* GPUImagePosterizeFilter.m */; }; - BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; }; + BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E5B9151E83700006EFA5 /* GPUImageFilterGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */; }; - BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; }; + BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E5C8151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */; }; - BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; }; + BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E5CD151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */; }; - BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; }; + BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E611152156620006EFA5 /* GPUImageUnsharpMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */; }; - BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; }; + BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E634152239090006EFA5 /* GPUImageBulgeDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E632152239090006EFA5 /* GPUImageBulgeDistortionFilter.m */; }; - BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; }; + BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E639152243630006EFA5 /* GPUImagePinchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E637152243620006EFA5 /* GPUImagePinchDistortionFilter.m */; }; - BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; }; - BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; }; + BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E66E152368130006EFA5 /* GPUImageCrosshatchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */; }; BCC1E67C152368840006EFA5 /* GPUImageCGAColorspaceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E67B152368840006EFA5 /* GPUImageCGAColorspaceFilter.m */; }; - BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; }; + BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */; }; - BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; }; + BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */; }; - BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; }; + BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC93A101501D1BF00958B26 /* GPUImageFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */; }; - BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; }; + BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC93A1F1501E42F00958B26 /* GPUImageTwoPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */; }; BCC93A301502A90F00958B26 /* GPUImageFilterPipeline.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D69488A1501F58200206FF8 /* GPUImageFilterPipeline.m */; }; BCC93A311502A91500958B26 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */; }; - BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; }; - BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; }; - BCC94ABB151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; }; + BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC94ABB151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC94ABC151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */; }; - BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; }; + BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC94CFB15101EB3002F9BC5 /* GPUImageTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */; }; - BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; }; + BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */; }; - BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; }; + BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */; }; BCF1A33814DDB1EC00852800 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; BCF1A34614DDB1EC00852800 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A34514DDB1EC00852800 /* SenTestingKit.framework */; }; @@ -304,43 +306,43 @@ BCF1A34C14DDB1EC00852800 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33414DDB1EC00852800 /* libGPUImage.a */; }; BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1A35014DDB1EC00852800 /* InfoPlist.strings */; }; BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1A35414DDB1EC00852800 /* GPUImageTests.m */; }; - BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; }; + BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E54115669907006B155F /* GPUImageJFAVoronoiFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */; }; - BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; }; + BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */; }; - BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; }; + BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E54515669907006B155F /* GPUImageVoronoiConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoronoiConsumerFilter.m */; }; - BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; }; + BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */; }; - BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; }; + BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */; }; - BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; }; + BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; - BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; }; + BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */; }; - BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; }; + BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */; }; - BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; }; + BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */; }; - BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; }; + BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */; }; - BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; }; + BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m */; }; - BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; + BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; - BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; }; + BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; - BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; }; + BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; - BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; }; + BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */; }; - BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; }; + BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; }; - BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; + BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; - C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; }; + C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; C04C8D1815F8059F00449601 /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */; }; - C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; }; + C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; /* End PBXBuildFile section */ @@ -596,7 +598,8 @@ BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBuffer.m; path = Source/GPUImageBuffer.m; sourceTree = SOURCE_ROOT; }; - BCBF617216E4478E00E2784A /* stb_image.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stb_image.c; path = Source/stb_image.c; sourceTree = SOURCE_ROOT; }; + BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageKuwaharaRadius3Filter.h; path = Source/GPUImageKuwaharaRadius3Filter.h; sourceTree = SOURCE_ROOT; }; + BCBF617916E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageKuwaharaRadius3Filter.m; path = Source/GPUImageKuwaharaRadius3Filter.m; sourceTree = SOURCE_ROOT; }; BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramGenerator.h; path = Source/GPUImageHistogramGenerator.h; sourceTree = SOURCE_ROOT; }; BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramGenerator.m; path = Source/GPUImageHistogramGenerator.m; sourceTree = SOURCE_ROOT; }; BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePosterizeFilter.h; path = Source/GPUImagePosterizeFilter.h; sourceTree = SOURCE_ROOT; }; @@ -894,6 +897,8 @@ BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */, BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */, BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */, + BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */, + BCBF617916E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.m */, 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */, 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */, BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */, @@ -940,7 +945,6 @@ BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */, BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */, BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */, - BCBF617216E4478E00E2784A /* stb_image.c */, BCB5E7D814E6003400701302 /* GPUImagePicture.h */, BCB5E7D914E6003400701302 /* GPUImagePicture.m */, BC982C6A14F33C290001FF6F /* GPUImageMovie.h */, @@ -1223,12 +1227,14 @@ BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */, BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */, BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */, + BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */, BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */, BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */, BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */, BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */, BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */, BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */, + BCBF617D16E4F69B00E2784A /* GPUImagePoissonBlendFilter.h in Headers */, BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */, BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */, 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */, @@ -1583,7 +1589,7 @@ BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */, BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */, BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */, - BCBF617316E4478E00E2784A /* stb_image.c in Sources */, + BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/GPUImagePicture.m index 4ac3880ae..501c9970f 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/GPUImagePicture.m @@ -1,5 +1,4 @@ #import "GPUImagePicture.h" -#import "stb_image.c" @implementation GPUImagePicture @@ -20,54 +19,13 @@ - (id)initWithURL:(NSURL *)url; - (id)initWithData:(NSData *)imageData; { - if (!(self = [self init])) + UIImage *inputImage = [[UIImage alloc] initWithData:imageData]; + + if (!(self = [self initWithImage:inputImage])) { return nil; } - hasProcessedImage = NO; - self.shouldSmoothlyScaleOutput = NO; - imageUpdateSemaphore = dispatch_semaphore_create(1); - - int widthOfImage = 0; - int heightOfImage = 0; - int componentsOfImage = 0; - -// unsigned char *data = stbi_load([[url absoluteString] UTF8String], &x, &y, &n, 0); - - unsigned char *imageBytes = stbi_load_from_memory([imageData bytes], [imageData length], &widthOfImage, &heightOfImage, &componentsOfImage, 0); - pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); - - GLenum format = GL_RGBA; - if (componentsOfImage == 3) - { - format = GL_RGB; - } - else if (componentsOfImage == 4) - { - format = GL_RGBA; - } - - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; - - [self initializeOutputTextureIfNeeded]; - - glBindTexture(GL_TEXTURE_2D, outputTexture); - if (self.shouldSmoothlyScaleOutput) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - } - glTexImage2D(GL_TEXTURE_2D, 0, format, widthOfImage, heightOfImage, 0, format, GL_UNSIGNED_BYTE, imageBytes); - - if (self.shouldSmoothlyScaleOutput) - { - glGenerateMipmap(GL_TEXTURE_2D); - } - }); - - stbi_image_free(imageBytes); - return self; } diff --git a/framework/Source/stb_image.c b/framework/Source/stb_image.c deleted file mode 100644 index 34750ddaf..000000000 --- a/framework/Source/stb_image.c +++ /dev/null @@ -1,4676 +0,0 @@ -/* stbi-1.33 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c - when you control the images you're loading - no warranty implied; use at your own risk - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - JPEG baseline (no JPEG progressive) - PNG 8-bit-per-channel only - - TGA (not sure what subset, if a subset) - BMP non-1bpp, non-RLE - PSD (composited view only, no extra channels) - - GIF (*comp always reports as 4-channel) - HDR (radiance rgbE format) - PIC (Softimage PIC) - - - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - - decode from arbitrary I/O callbacks - - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) - - Latest revisions: - 1.33 (2011-07-14) minor fixes suggested by Dave Moore - 1.32 (2011-07-13) info support for all filetypes (SpartanJ) - 1.31 (2011-06-19) a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) added ability to load files via io callbacks (Ben Wenger) - 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila) - allow trailing 0s at end of image data (Laurent Gomila) - 1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ - - See end of file for full revision history. - - TODO: - stbi_info support for BMP,PSD,HDR,PIC - - - ============================ Contributors ========================= - - Image formats Optimizations & bugfixes - Sean Barrett (jpeg, png, bmp) Fabian "ryg" Giesen - Nicolas Schulz (hdr, psd) - Jonathan Dummer (tga) Bug fixes & warning fixes - Jean-Marc Lienher (gif) Marc LeBlanc - Tom Seddon (pic) Christpher Lloyd - Thatcher Ulrich (psd) Dave Moore - Won Chun - the Horde3D community - Extensions, features Janez Zemva - Jetro Lauha (stbi_info) Jonathan Blow - James "moose2000" Brown (iPhone PNG) Laurent Gomila - Ben "Disch" Wenger (io callbacks) Aruelien Pocheville - Martin "SpartanJ" Golini Ryamond Barbiero - David Woo - - - If your name should be here but isn't, let Sean know. - -*/ - -#ifndef STBI_INCLUDE_STB_IMAGE_H -#define STBI_INCLUDE_STB_IMAGE_H - -// To get a header file for this, either cut and paste the header, -// or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and -// then include stb_image.c from it. - -//// begin header file //////////////////////////////////////////////////// -// -// Limitations: -// - no jpeg progressive support -// - non-HDR formats support 8-bit samples only (jpeg, png) -// - no delayed line count (jpeg) -- IJG doesn't support either -// - no 1-bit BMP -// - GIF always returns *comp=4 -// -// Basic usage (see HDR discussion below): -// int x,y,n; -// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... -// // ... x = width, y = height, n = # 8-bit components per pixel ... -// // ... replace '0' with '1'..'4' to force that many components per pixel -// // ... but 'n' will always be the number that it would have been if you said 0 -// stbi_image_free(data) -// -// Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *comp -- outputs # of image components in image file -// int req_comp -- if non-zero, # of image components requested in result -// -// The return value from an image loader is an 'unsigned char *' which points -// to the pixel data. The pixel data consists of *y scanlines of *x pixels, -// with each pixel consisting of N interleaved 8-bit components; the first -// pixel pointed to is top-left-most in the image. There is no padding between -// image scanlines or between pixels, regardless of format. The number of -// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. -// If req_comp is non-zero, *comp has the number of components that _would_ -// have been output otherwise. E.g. if you set req_comp to 4, you will always -// get RGBA output, but you can check *comp to easily see if it's opaque. -// -// An output image with N components has the following components interleaved -// in this order in each pixel: -// -// N=#comp components -// 1 grey -// 2 grey, alpha -// 3 red, green, blue -// 4 red, green, blue, alpha -// -// If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *comp will be unchanged. The function stbi_failure_reason() -// can be queried for an extremely brief, end-user unfriendly explanation -// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid -// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly -// more user-friendly ones. -// -// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. -// -// =========================================================================== -// -// iPhone PNG support: -// -// By default we convert iphone-formatted PNGs back to RGB; nominally they -// would silently load as BGR, except the existing code should have just -// failed on such iPhone PNGs. But you can disable this conversion by -// by calling stbi_convert_iphone_png_to_rgb(0), in which case -// you will always just get the native iphone "format" through. -// -// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per -// pixel to remove any premultiplied alpha *only* if the image file explicitly -// says there's premultiplied data (currently only happens in iPhone images, -// and only if iPhone convert-to-rgb processing is on). -// -// =========================================================================== -// -// HDR image support (disable by defining STBI_NO_HDR) -// -// stb_image now supports loading HDR images in general, and currently -// the Radiance .HDR file format, although the support is provided -// generically. You can still load any file through the existing interface; -// if you attempt to load an HDR file, it will be automatically remapped to -// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; -// both of these constants can be reconfigured through this interface: -// -// stbi_hdr_to_ldr_gamma(2.2f); -// stbi_hdr_to_ldr_scale(1.0f); -// -// (note, do not use _inverse_ constants; stbi_image will invert them -// appropriately). -// -// Additionally, there is a new, parallel interface for loading files as -// (linear) floats to preserve the full dynamic range: -// -// float *data = stbi_loadf(filename, &x, &y, &n, 0); -// -// If you load LDR images through this interface, those images will -// be promoted to floating point values, run through the inverse of -// constants corresponding to the above: -// -// stbi_ldr_to_hdr_scale(1.0f); -// stbi_ldr_to_hdr_gamma(2.2f); -// -// Finally, given a filename (or an open file or memory block--see header -// file for details) containing image data, you can query for the "most -// appropriate" interface to use (that is, whether the image is HDR or -// not), using: -// -// stbi_is_hdr(char *filename); -// -// =========================================================================== -// -// I/O callbacks -// -// I/O callbacks allow you to read from arbitrary sources, like packaged -// files or some other source. Data read from callbacks are processed -// through a small internal buffer (currently 128 bytes) to try to reduce -// overhead. -// -// The three functions you must define are "read" (reads some bytes of data), -// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). - - -#ifndef STBI_NO_STDIO - -#if defined(_MSC_VER) && _MSC_VER >= 0x1400 -#define _CRT_SECURE_NO_WARNINGS // suppress bogus warnings about fopen() -#endif - -#include -#endif - -#define STBI_VERSION 1 - -enum -{ - STBI_default = 0, // only used for req_comp - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4 -}; - -typedef unsigned char stbi_uc; - -#ifdef __cplusplus -extern "C" { -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// PRIMARY API - works on images of any type -// - -// -// load image by filename, open file, or memory buffer -// - -extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - -#ifndef STBI_NO_STDIO -extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); -extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - -typedef struct -{ - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read - void (*skip) (void *user,unsigned n); // skip the next 'n' bytes - int (*eof) (void *user); // returns nonzero if we are at end of file/data -} stbi_io_callbacks; - -extern stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); - -#ifndef STBI_NO_HDR - extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - - #ifndef STBI_NO_STDIO - extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); - extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); - #endif - - extern float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); - - extern void stbi_hdr_to_ldr_gamma(float gamma); - extern void stbi_hdr_to_ldr_scale(float scale); - - extern void stbi_ldr_to_hdr_gamma(float gamma); - extern void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_HDR - -// stbi_is_hdr is always defined -extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); -extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); -#ifndef STBI_NO_STDIO -extern int stbi_is_hdr (char const *filename); -extern int stbi_is_hdr_from_file(FILE *f); -#endif // STBI_NO_STDIO - - -// get a VERY brief reason for failure -// NOT THREADSAFE -extern const char *stbi_failure_reason (void); - -// free the loaded image -- this is just free() -extern void stbi_image_free (void *retval_from_stbi_load); - -// get image dimensions & components without fully decoding -extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); -extern int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); - -#ifndef STBI_NO_STDIO -extern int stbi_info (char const *filename, int *x, int *y, int *comp); -extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); - -#endif - - - -// for image formats that explicitly notate that they have premultiplied alpha, -// we just return the colors as stored in the file. set this flag to force -// unpremultiplication. results are undefined if the unpremultiply overflow. -extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); - -// indicate whether we should process iphone images back to canonical format, -// or just pass them through "as-is" -extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - - -// ZLIB client - used by PNG, available for other purposes - -extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); -extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); -extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - -extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); -extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - - -// define faster low-level operations (typically SIMD support) -#ifdef STBI_SIMD -typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize); -// compute an integer IDCT on "input" -// input[x] = data[x] * dequantize[x] -// write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' -// CLAMP results to 0..255 -typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step); -// compute a conversion from YCbCr to RGB -// 'count' pixels -// write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B -// y: Y input channel -// cb: Cb input channel; scale/biased to be 0..255 -// cr: Cr input channel; scale/biased to be 0..255 - -extern void stbi_install_idct(stbi_idct_8x8 func); -extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); -#endif // STBI_SIMD - - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - -#ifndef STBI_HEADER_FILE_ONLY - -#ifndef STBI_NO_HDR -#include // ldexp -#include // strcmp, strtok -#endif - -#ifndef STBI_NO_STDIO -#include -#endif -#include -#include -#include -#include - -#ifndef _MSC_VER - #ifdef __cplusplus - #define stbi_inline inline - #else - #define stbi_inline - #endif -#else - #define stbi_inline __forceinline -#endif - - -// implementation: -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef signed short int16; -typedef unsigned int uint32; -typedef signed int int32; -typedef unsigned int uint; - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1]; - -#if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE) -#define STBI_NO_WRITE -#endif - -#define STBI_NOTUSED(v) (void)sizeof(v) - -#ifdef _MSC_VER -#define STBI_HAS_LROTL -#endif - -#ifdef STBI_HAS_LROTL - #define stbi_lrot(x,y) _lrotl(x,y) -#else - #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) -#endif - -/////////////////////////////////////////////// -// -// stbi struct and start_xxx functions - -// stbi structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information -typedef struct -{ - uint32 img_x, img_y; - int img_n, img_out_n; - - stbi_io_callbacks io; - void *io_user_data; - - int read_from_callbacks; - int buflen; - uint8 buffer_start[128]; - - uint8 *img_buffer, *img_buffer_end; - uint8 *img_buffer_original; -} stbi; - - -float *stbi_loadf_main(stbi *s, int *x, int *y, int *comp, int req_comp); -char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); - -static void refill_buffer(stbi *s); - -// initialize a memory-decode context -static void start_mem(stbi *s, uint8 const *buffer, int len) -{ - s->io.read = NULL; - s->read_from_callbacks = 0; - s->img_buffer = s->img_buffer_original = (uint8 *) buffer; - s->img_buffer_end = (uint8 *) buffer+len; -} - -// initialize a callback-based context -static void start_callbacks(stbi *s, stbi_io_callbacks *c, void *user) -{ - s->io = *c; - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; - s->img_buffer_original = s->buffer_start; - refill_buffer(s); -} - -#ifndef STBI_NO_STDIO - -static int stdio_read(void *user, char *data, int size) -{ - return (int) fread(data,1,size,(FILE*) user); -} - -static void stdio_skip(void *user, unsigned n) -{ - fseek((FILE*) user, n, SEEK_CUR); -} - -static int stdio_eof(void *user) -{ - return feof((FILE*) user); -} - -static stbi_io_callbacks stbi_stdio_callbacks = -{ - stdio_read, - stdio_skip, - stdio_eof, -}; - -static void start_file(stbi *s, FILE *f) -{ - start_callbacks(s, &stbi_stdio_callbacks, (void *) f); -} - -//static void stop_file(stbi *s) { } - -#endif // !STBI_NO_STDIO - -static void stbi_rewind(stbi *s) -{ - // conceptually rewind SHOULD rewind to the beginning of the stream, - // but we just rewind to the beginning of the initial buffer, because - // we only use it after doing 'test', which only ever looks at at most 92 bytes - s->img_buffer = s->img_buffer_original; -} - -static int stbi_jpeg_test(stbi *s); -static stbi_uc *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp); -static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp); -static int stbi_png_test(stbi *s); -static stbi_uc *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp); -static int stbi_png_info(stbi *s, int *x, int *y, int *comp); -static int stbi_bmp_test(stbi *s); -static stbi_uc *stbi_bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp); -static int stbi_tga_test(stbi *s); -static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp); -static int stbi_tga_info(stbi *s, int *x, int *y, int *comp); -static int stbi_psd_test(stbi *s); -static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp); -static int stbi_hdr_test(stbi *s); -static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp); -static int stbi_pic_test(stbi *s); -static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp); -static int stbi_gif_test(stbi *s); -static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp); -static int stbi_gif_info(stbi *s, int *x, int *y, int *comp); - - -// this is not threadsafe -static const char *failure_reason; - -const char *stbi_failure_reason(void) -{ - return failure_reason; -} - -static int e(const char *str) -{ - failure_reason = str; - return 0; -} - -// e - error -// epf - error returning pointer to float -// epuc - error returning pointer to unsigned char - -#ifdef STBI_NO_FAILURE_STRINGS - #define e(x,y) 0 -#elif defined(STBI_FAILURE_USERMSG) - #define e(x,y) e(y) -#else - #define e(x,y) e(x) -#endif - -#define epf(x,y) ((float *) (e(x,y)?NULL:NULL)) -#define epuc(x,y) ((unsigned char *) (e(x,y)?NULL:NULL)) - -void stbi_image_free(void *retval_from_stbi_load) -{ - free(retval_from_stbi_load); -} - -#ifndef STBI_NO_HDR -static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp); -static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp); -#endif - -static unsigned char *stbi_load_main(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - if (stbi_jpeg_test(s)) return stbi_jpeg_load(s,x,y,comp,req_comp); - if (stbi_png_test(s)) return stbi_png_load(s,x,y,comp,req_comp); - if (stbi_bmp_test(s)) return stbi_bmp_load(s,x,y,comp,req_comp); - if (stbi_gif_test(s)) return stbi_gif_load(s,x,y,comp,req_comp); - if (stbi_psd_test(s)) return stbi_psd_load(s,x,y,comp,req_comp); - if (stbi_pic_test(s)) return stbi_pic_load(s,x,y,comp,req_comp); - - #ifndef STBI_NO_HDR - if (stbi_hdr_test(s)) { - float *hdr = stbi_hdr_load(s, x,y,comp,req_comp); - return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } - #endif - - // test tga last because it's a crappy test! - if (stbi_tga_test(s)) - return stbi_tga_load(s,x,y,comp,req_comp); - return epuc("unknown image type", "Image not of any known type, or corrupt"); -} - -#ifndef STBI_NO_STDIO -unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = fopen(filename, "rb"); - unsigned char *result; - if (!f) return epuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_file(&s,f); - return stbi_load_main(&s,x,y,comp,req_comp); -} -#endif //!STBI_NO_STDIO - -unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_mem(&s,buffer,len); - return stbi_load_main(&s,x,y,comp,req_comp); -} - -unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi_load_main(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_HDR - -float *stbi_loadf_main(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - #ifndef STBI_NO_HDR - if (stbi_hdr_test(s)) - return stbi_hdr_load(s,x,y,comp,req_comp); - #endif - data = stbi_load_main(s, x, y, comp, req_comp); - if (data) - return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return epf("unknown image type", "Image not of any known type, or corrupt"); -} - -float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_mem(&s,buffer,len); - return stbi_loadf_main(&s,x,y,comp,req_comp); -} - -float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi_loadf_main(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = fopen(filename, "rb"); - float *result; - if (!f) return epf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_file(&s,f); - return stbi_loadf_main(&s,x,y,comp,req_comp); -} -#endif // !STBI_NO_STDIO - -#endif // !STBI_NO_HDR - -// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is -// defined, for API simplicity; if STBI_NO_HDR is defined, it always -// reports false! - -int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) -{ - #ifndef STBI_NO_HDR - stbi s; - start_mem(&s,buffer,len); - return stbi_hdr_test(&s); - #else - STBI_NOTUSED(buffer); - STBI_NOTUSED(len); - return 0; - #endif -} - -#ifndef STBI_NO_STDIO -extern int stbi_is_hdr (char const *filename) -{ - FILE *f = fopen(filename, "rb"); - int result=0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -extern int stbi_is_hdr_from_file(FILE *f) -{ - #ifndef STBI_NO_HDR - stbi s; - start_file(&s,f); - return stbi_hdr_test(&s); - #else - return 0; - #endif -} -#endif // !STBI_NO_STDIO - -extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) -{ - #ifndef STBI_NO_HDR - stbi s; - start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi_hdr_test(&s); - #else - return 0; - #endif -} - -#ifndef STBI_NO_HDR -static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f; -static float l2h_gamma=2.2f, l2h_scale=1.0f; - -void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; } -void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; } - -void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; } -void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; } -#endif - - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum -{ - SCAN_load=0, - SCAN_type, - SCAN_header -}; - -static void refill_buffer(stbi *s) -{ - int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); - if (n == 0) { - // at end of file, treat same as if from memory - s->read_from_callbacks = 0; - s->img_buffer = s->img_buffer_end-1; - *s->img_buffer = 0; - } else { - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + n; - } -} - -stbi_inline static int get8(stbi *s) -{ - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - if (s->read_from_callbacks) { - refill_buffer(s); - return *s->img_buffer++; - } - return 0; -} - -stbi_inline static int at_eof(stbi *s) -{ - if (s->io.read) { - if (!(s->io.eof)(s->io_user_data)) return 0; - // if feof() is true, check if buffer = end - // special case: we've only got the special 0 character at the end - if (s->read_from_callbacks == 0) return 1; - } - - return s->img_buffer >= s->img_buffer_end; -} - -stbi_inline static uint8 get8u(stbi *s) -{ - return (uint8) get8(s); -} - -static void skip(stbi *s, int n) -{ - if (s->io.read) { - int blen = s->img_buffer_end - s->img_buffer; - if (blen < n) { - s->img_buffer = s->img_buffer_end; - (s->io.skip)(s->io_user_data, n - blen); - return; - } - } - s->img_buffer += n; -} - -static int getn(stbi *s, stbi_uc *buffer, int n) -{ - if (s->io.read) { - int blen = s->img_buffer_end - s->img_buffer; - if (blen < n) { - int res, count; - - memcpy(buffer, s->img_buffer, blen); - - count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); - res = (count == (n-blen)); - s->img_buffer = s->img_buffer_end; - return res; - } - } - - if (s->img_buffer+n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} - -static int get16(stbi *s) -{ - int z = get8(s); - return (z << 8) + get8(s); -} - -static uint32 get32(stbi *s) -{ - uint32 z = get16(s); - return (z << 16) + get16(s); -} - -static int get16le(stbi *s) -{ - int z = get8(s); - return z + (get8(s) << 8); -} - -static uint32 get32le(stbi *s) -{ - uint32 z = get16le(s); - return z + (get16le(s) << 16); -} - -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static uint8 compute_y(int r, int g, int b) -{ - return (uint8) (((r*77) + (g*150) + (29*b)) >> 8); -} - -static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y) -{ - int i,j; - unsigned char *good; - - if (req_comp == img_n) return data; - assert(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *) malloc(req_comp * x * y); - if (good == NULL) { - free(data); - return epuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - unsigned char *src = data + j * x * img_n ; - unsigned char *dest = good + j * x * req_comp; - - #define COMBO(a,b) ((a)*8+(b)) - #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (COMBO(img_n, req_comp)) { - CASE(1,2) dest[0]=src[0], dest[1]=255; break; - CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; - CASE(2,1) dest[0]=src[0]; break; - CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; - CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; - CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break; - CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break; - CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break; - CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; - CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; - default: assert(0); - } - #undef CASE - } - - free(data); - return good; -} - -#ifndef STBI_NO_HDR -static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -{ - int i,k,n; - float *output = (float *) malloc(x * y * comp * sizeof(float)); - if (output == NULL) { free(data); return epf("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale; - } - if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; - } - free(data); - return output; -} - -#define float2int(x) ((int) (x)) -static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp) -{ - int i,k,n; - stbi_uc *output = (stbi_uc *) malloc(x * y * comp); - if (output == NULL) { free(data); return epuc("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (uint8) float2int(z); - } - if (k < comp) { - float z = data[i*comp+k] * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (uint8) float2int(z); - } - } - free(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) -// -// simple implementation -// - channel subsampling of at most 2 in each dimension -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - uses a lot of intermediate memory, could cache poorly -// - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 -// stb_jpeg: 1.34 seconds (MSVC6, default release build) -// stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) -// IJL11.dll: 1.08 seconds (compiled by intel) -// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) -// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct -{ - uint8 fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - uint16 code[256]; - uint8 values[256]; - uint8 size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} huffman; - -typedef struct -{ - #ifdef STBI_SIMD - unsigned short dequant2[4][64]; - #endif - stbi *s; - huffman huff_dc[4]; - huffman huff_ac[4]; - uint8 dequant[4][64]; - -// sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - -// definition of jpeg image component - struct - { - int id; - int h,v; - int tq; - int hd,ha; - int dc_pred; - - int x,y,w2,h2; - uint8 *data; - void *raw_data; - uint8 *linebuf; - } img_comp[4]; - - uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int scan_n, order[4]; - int restart_interval, todo; -} jpeg; - -static int build_huffman(huffman *h, int *count) -{ - int i,j,k=0,code; - // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) - for (j=0; j < count[i]; ++j) - h->size[k++] = (uint8) (i+1); - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for(j=1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (uint16) (code++); - if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16-j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i=0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS-s); - int m = 1 << (FAST_BITS-s); - for (j=0; j < m; ++j) { - h->fast[c+j] = (uint8) i; - } - } - } - return 1; -} - -static void grow_buffer_unsafe(jpeg *j) -{ - do { - int b = j->nomore ? 0 : get8(j->s); - if (b == 0xff) { - int c = get8(j->s); - if (c != 0) { - j->marker = (unsigned char) c; - j->nomore = 1; - return; - } - } - j->code_buffer |= b << (24 - j->code_bits); - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; - -// decode a jpeg huffman value from the bitstream -stbi_inline static int decode(jpeg *j, huffman *h) -{ - unsigned int temp; - int c,k; - - if (j->code_bits < 16) grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - k = h->fast[c]; - if (k < 255) { - int s = h->size[k]; - if (s > j->code_bits) - return -1; - j->code_buffer <<= s; - j->code_bits -= s; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - temp = j->code_buffer >> 16; - for (k=FAST_BITS+1 ; ; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (32 - k)) & bmask[k]) + h->delta[k]; - assert((((j->code_buffer) >> (32 - h->size[c])) & bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - j->code_buffer <<= k; - return h->values[c]; -} - -// combined JPEG 'receive' and JPEG 'extend', since baseline -// always extends everything it receives. -stbi_inline static int extend_receive(jpeg *j, int n) -{ - unsigned int m = 1 << (n-1); - unsigned int k; - if (j->code_bits < n) grow_buffer_unsafe(j); - - #if 1 - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~bmask[n]; - k &= bmask[n]; - j->code_bits -= n; - #else - k = (j->code_buffer >> (32 - n)) & bmask[n]; - j->code_bits -= n; - j->code_buffer <<= n; - #endif - // the following test is probably a random branch that won't - // predict well. I tried to table accelerate it but failed. - // maybe it's compiling as a conditional move? - if (k < m) - return (-1 << n) + k + 1; - else - return k; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static uint8 dezigzag[64+15] = -{ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63 -}; - -// decode one 64-entry block-- -static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b) -{ - int diff,dc,k; - int t = decode(j, hdc); - if (t < 0) return e("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); - - diff = t ? extend_receive(j, t) : 0; - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) dc; - - // decode AC components, see JPEG spec - k = 1; - do { - int r,s; - int rs = decode(j, hac); - if (rs < 0) return e("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - data[dezigzag[k++]] = (short) extend_receive(j,s); - } - } while (k < 64); - return 1; -} - -// take a -128..127 value and clamp it and convert to 0..255 -stbi_inline static uint8 clamp(int x) -{ - // trick to use a single test to catch both cases - if ((unsigned int) x > 255) { - if (x < 0) return 0; - if (x > 255) return 255; - } - return (uint8) x; -} - -#define f2f(x) (int) (((x) * 4096 + 0.5)) -#define fsh(x) ((x) << 12) - -// derived from jidctint -- DCT_ISLOW -#define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ - int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ - p2 = s2; \ - p3 = s6; \ - p1 = (p2+p3) * f2f(0.5411961f); \ - t2 = p1 + p3*f2f(-1.847759065f); \ - t3 = p1 + p2*f2f( 0.765366865f); \ - p2 = s0; \ - p3 = s4; \ - t0 = fsh(p2+p3); \ - t1 = fsh(p2-p3); \ - x0 = t0+t3; \ - x3 = t0-t3; \ - x1 = t1+t2; \ - x2 = t1-t2; \ - t0 = s7; \ - t1 = s5; \ - t2 = s3; \ - t3 = s1; \ - p3 = t0+t2; \ - p4 = t1+t3; \ - p1 = t0+t3; \ - p2 = t1+t2; \ - p5 = (p3+p4)*f2f( 1.175875602f); \ - t0 = t0*f2f( 0.298631336f); \ - t1 = t1*f2f( 2.053119869f); \ - t2 = t2*f2f( 3.072711026f); \ - t3 = t3*f2f( 1.501321110f); \ - p1 = p5 + p1*f2f(-0.899976223f); \ - p2 = p5 + p2*f2f(-2.562915447f); \ - p3 = p3*f2f(-1.961570560f); \ - p4 = p4*f2f(-0.390180644f); \ - t3 += p1+p4; \ - t2 += p2+p3; \ - t1 += p2+p4; \ - t0 += p1+p3; - -#ifdef STBI_SIMD -typedef unsigned short stbi_dequantize_t; -#else -typedef uint8 stbi_dequantize_t; -#endif - -// .344 seconds on 3*anemones.jpg -static void idct_block(uint8 *out, int out_stride, short data[64], stbi_dequantize_t *dequantize) -{ - int i,val[64],*v=val; - stbi_dequantize_t *dq = dequantize; - uint8 *o; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d,++dq, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0] * dq[0] << 2; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], - d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - // so we want to round that, which means adding 0.5 * 1<<17, - // aka 65536. Also, we'll end up with -128 to 127 that we want - // to encode as 0..255 by adding 128, so we'll add that before the shift - x0 += 65536 + (128<<17); - x1 += 65536 + (128<<17); - x2 += 65536 + (128<<17); - x3 += 65536 + (128<<17); - // tried computing the shifts into temps, or'ing the temps to see - // if any were out of range, but that was slower - o[0] = clamp((x0+t3) >> 17); - o[7] = clamp((x0-t3) >> 17); - o[1] = clamp((x1+t2) >> 17); - o[6] = clamp((x1-t2) >> 17); - o[2] = clamp((x2+t1) >> 17); - o[5] = clamp((x2-t1) >> 17); - o[3] = clamp((x3+t0) >> 17); - o[4] = clamp((x3-t0) >> 17); - } -} - -#ifdef STBI_SIMD -static stbi_idct_8x8 stbi_idct_installed = idct_block; - -void stbi_install_idct(stbi_idct_8x8 func) -{ - stbi_idct_installed = func; -} -#endif - -#define MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static uint8 get_marker(jpeg *j) -{ - uint8 x; - if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; } - x = get8u(j->s); - if (x != 0xff) return MARKER_none; - while (x == 0xff) - x = get8u(j->s); - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, reset the entropy decoder and -// the dc prediction -static void reset(jpeg *j) -{ - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; - j->marker = MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int parse_entropy_coded_data(jpeg *z) -{ - reset(z); - if (z->scan_n == 1) { - int i,j; - #ifdef STBI_SIMD - __declspec(align(16)) - #endif - short data[64]; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; - #ifdef STBI_SIMD - stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); - #else - idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); - #endif - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!RESTART(z->marker)) return 1; - reset(z); - } - } - } - } else { // interleaved! - int i,j,k,x,y; - short data[64]; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; - #ifdef STBI_SIMD - stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); - #else - idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); - #endif - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!RESTART(z->marker)) return 1; - reset(z); - } - } - } - } - return 1; -} - -static int process_marker(jpeg *z, int m) -{ - int L; - switch (m) { - case MARKER_none: // no marker found - return e("expected marker","Corrupt JPEG"); - - case 0xC2: // SOF - progressive - return e("progressive jpeg","JPEG format not supported (progressive)"); - - case 0xDD: // DRI - specify restart interval - if (get16(z->s) != 4) return e("bad DRI len","Corrupt JPEG"); - z->restart_interval = get16(z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = get16(z->s)-2; - while (L > 0) { - int q = get8(z->s); - int p = q >> 4; - int t = q & 15,i; - if (p != 0) return e("bad DQT type","Corrupt JPEG"); - if (t > 3) return e("bad DQT table","Corrupt JPEG"); - for (i=0; i < 64; ++i) - z->dequant[t][dezigzag[i]] = get8u(z->s); - #ifdef STBI_SIMD - for (i=0; i < 64; ++i) - z->dequant2[t][i] = z->dequant[t][i]; - #endif - L -= 65; - } - return L==0; - - case 0xC4: // DHT - define huffman table - L = get16(z->s)-2; - while (L > 0) { - uint8 *v; - int sizes[16],i,m=0; - int q = get8(z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG"); - for (i=0; i < 16; ++i) { - sizes[i] = get8(z->s); - m += sizes[i]; - } - L -= 17; - if (tc == 0) { - if (!build_huffman(z->huff_dc+th, sizes)) return 0; - v = z->huff_dc[th].values; - } else { - if (!build_huffman(z->huff_ac+th, sizes)) return 0; - v = z->huff_ac[th].values; - } - for (i=0; i < m; ++i) - v[i] = get8u(z->s); - L -= m; - } - return L==0; - } - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - skip(z->s, get16(z->s)-2); - return 1; - } - return 0; -} - -// after we see SOS -static int process_scan_header(jpeg *z) -{ - int i; - int Ls = get16(z->s); - z->scan_n = get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return e("bad SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG"); - for (i=0; i < z->scan_n; ++i) { - int id = get8(z->s), which; - int q = get8(z->s); - for (which = 0; which < z->s->img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s->img_n) return 0; - z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG"); - z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG"); - z->order[i] = which; - } - if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG"); - get8(z->s); // should be 63, but might be 0 - if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG"); - - return 1; -} - -static int process_frame_header(jpeg *z, int scan) -{ - stbi *s = z->s; - int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = get16(s); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG - p = get8(s); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = get16(s); if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = get16(s); if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires - c = get8(s); - if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires - s->img_n = c; - for (i=0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG"); - - for (i=0; i < s->img_n; ++i) { - z->img_comp[i].id = get8(s); - if (z->img_comp[i].id != i+1) // JFIF requires - if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! - return e("bad component ID","Corrupt JPEG"); - q = get8(s); - z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG"); - z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG"); - z->img_comp[i].tq = get8(s); if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG"); - } - - if (scan != SCAN_load) return 1; - - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); - - for (i=0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; - - for (i=0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); - if (z->img_comp[i].raw_data == NULL) { - for(--i; i >= 0; --i) { - free(z->img_comp[i].raw_data); - z->img_comp[i].data = NULL; - } - return e("outofmem", "Out of memory"); - } - // align blocks for installable-idct using mmx/sse - z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - z->img_comp[i].linebuf = NULL; - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define DNL(x) ((x) == 0xdc) -#define SOI(x) ((x) == 0xd8) -#define EOI(x) ((x) == 0xd9) -#define SOF(x) ((x) == 0xc0 || (x) == 0xc1) -#define SOS(x) ((x) == 0xda) - -static int decode_jpeg_header(jpeg *z, int scan) -{ - int m; - z->marker = MARKER_none; // initialize cached marker to empty - m = get_marker(z); - if (!SOI(m)) return e("no SOI","Corrupt JPEG"); - if (scan == SCAN_type) return 1; - m = get_marker(z); - while (!SOF(m)) { - if (!process_marker(z,m)) return 0; - m = get_marker(z); - while (m == MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (at_eof(z->s)) return e("no SOF", "Corrupt JPEG"); - m = get_marker(z); - } - } - if (!process_frame_header(z, scan)) return 0; - return 1; -} - -static int decode_jpeg_image(jpeg *j) -{ - int m; - j->restart_interval = 0; - if (!decode_jpeg_header(j, SCAN_load)) return 0; - m = get_marker(j); - while (!EOI(m)) { - if (SOS(m)) { - if (!process_scan_header(j)) return 0; - if (!parse_entropy_coded_data(j)) return 0; - if (j->marker == MARKER_none ) { - // handle 0s at the end of image data from IP Kamera 9060 - while (!at_eof(j->s)) { - int x = get8(j->s); - if (x == 255) { - j->marker = get8u(j->s); - break; - } else if (x != 0) { - return 0; - } - } - // if we reach eof without hitting a marker, get_marker() below will fail and we'll eventually return 0 - } - } else { - if (!process_marker(j, m)) return 0; - } - m = get_marker(j); - } - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1, - int w, int hs); - -#define div4(x) ((uint8) ((x) >> 2)) - -static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - STBI_NOTUSED(out); - STBI_NOTUSED(in_far); - STBI_NOTUSED(w); - STBI_NOTUSED(hs); - return in_near; -} - -static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - // need to generate two samples vertically for every one in input - int i; - STBI_NOTUSED(hs); - for (i=0; i < w; ++i) - out[i] = div4(3*in_near[i] + in_far[i] + 2); - return out; -} - -static uint8* resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - // need to generate two samples horizontally for every one in input - int i; - uint8 *input = in_near; - - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = div4(input[0]*3 + input[1] + 2); - for (i=1; i < w-1; ++i) { - int n = 3*input[i]+2; - out[i*2+0] = div4(n+input[i-1]); - out[i*2+1] = div4(n+input[i+1]); - } - out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2); - out[i*2+1] = input[w-1]; - - STBI_NOTUSED(in_far); - STBI_NOTUSED(hs); - - return out; -} - -#define div16(x) ((uint8) ((x) >> 4)) - -static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i,t0,t1; - if (w == 1) { - out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - out[0] = div4(t1+2); - for (i=1; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = div16(3*t0 + t1 + 8); - out[i*2 ] = div16(3*t1 + t0 + 8); - } - out[w*2-1] = div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} - -static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - // resample with nearest-neighbor - int i,j; - in_far = in_far; - for (i=0; i < w; ++i) - for (j=0; j < hs; ++j) - out[i*hs+j] = in_near[i]; - return out; -} - -#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) - -// 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) -// VC6 without processor=Pro is generating multiple LEAs per multiply! -static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 16) + 32768; // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr*float2fixed(1.40200f); - g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); - b = y_fixed + cb*float2fixed(1.77200f); - r >>= 16; - g >>= 16; - b >>= 16; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (uint8)r; - out[1] = (uint8)g; - out[2] = (uint8)b; - out[3] = 255; - out += step; - } -} - -#ifdef STBI_SIMD -static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row; - -void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) -{ - stbi_YCbCr_installed = func; -} -#endif - - -// clean up the temporary component buffers -static void cleanup_jpeg(jpeg *j) -{ - int i; - for (i=0; i < j->s->img_n; ++i) { - if (j->img_comp[i].data) { - free(j->img_comp[i].raw_data); - j->img_comp[i].data = NULL; - } - if (j->img_comp[i].linebuf) { - free(j->img_comp[i].linebuf); - j->img_comp[i].linebuf = NULL; - } - } -} - -typedef struct -{ - resample_row_func resample; - uint8 *line0,*line1; - int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi_resample; - -static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) -{ - int n, decode_n; - // validate req_comp - if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); - z->s->img_n = 0; - - // load a jpeg image from whichever source - if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n; - - if (z->s->img_n == 3 && n < 3) - decode_n = 1; - else - decode_n = z->s->img_n; - - // resample and color-convert - { - int k; - uint i,j; - uint8 *output; - uint8 *coutput[4]; - - stbi_resample res_comp[4]; - - for (k=0; k < decode_n; ++k) { - stbi_resample *r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (uint8 *) malloc(z->s->img_x + 3); - if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s->img_x + r->hs-1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2; - else r->resample = resample_row_generic; - } - - // can't error after this so, this is safe - output = (uint8 *) malloc(n * z->s->img_x * z->s->img_y + 1); - if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } - - // now go ahead and resample - for (j=0; j < z->s->img_y; ++j) { - uint8 *out = output + n * z->s->img_x * j; - for (k=0; k < decode_n; ++k) { - stbi_resample *r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, - y_bot ? r->line1 : r->line0, - y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - uint8 *y = coutput[0]; - if (z->s->img_n == 3) { - #ifdef STBI_SIMD - stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n); - #else - YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n); - #endif - } else - for (i=0; i < z->s->img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - uint8 *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; - } - } - cleanup_jpeg(z); - *out_x = z->s->img_x; - *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n; // report original components, not output - return output; - } -} - -static unsigned char *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - jpeg j; - j.s = s; - return load_jpeg_image(&j, x,y,comp,req_comp); -} - -static int stbi_jpeg_test(stbi *s) -{ - int r; - jpeg j; - j.s = s; - r = decode_jpeg_header(&j, SCAN_type); - stbi_rewind(s); - return r; -} - -static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp) -{ - if (!decode_jpeg_header(j, SCAN_header)) { - stbi_rewind( j->s ); - return 0; - } - if (x) *x = j->s->img_x; - if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n; - return 1; -} - -static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp) -{ - jpeg j; - j.s = s; - return stbi_jpeg_info_raw(&j, x, y, comp); -} - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define ZFAST_BITS 9 // accelerate all cases in default tables -#define ZFAST_MASK ((1 << ZFAST_BITS) - 1) - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct -{ - uint16 fast[1 << ZFAST_BITS]; - uint16 firstcode[16]; - int maxcode[17]; - uint16 firstsymbol[16]; - uint8 size[288]; - uint16 value[288]; -} zhuffman; - -stbi_inline static int bitreverse16(int n) -{ - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -stbi_inline static int bit_reverse(int v, int bits) -{ - assert(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return bitreverse16(v) >> (16-bits); -} - -static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num) -{ - int i,k=0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 255, sizeof(z->fast)); - for (i=0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i=1; i < 16; ++i) - assert(sizes[i] <= (1 << i)); - code = 0; - for (i=1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (uint16) code; - z->firstsymbol[i] = (uint16) k; - code = (code + sizes[i]); - if (sizes[i]) - if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG"); - z->maxcode[i] = code << (16-i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i=0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - z->size[c] = (uint8)s; - z->value[c] = (uint16)i; - if (s <= ZFAST_BITS) { - int k = bit_reverse(next_code[s],s); - while (k < (1 << ZFAST_BITS)) { - z->fast[k] = (uint16) c; - k += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct -{ - uint8 *zbuffer, *zbuffer_end; - int num_bits; - uint32 code_buffer; - - char *zout; - char *zout_start; - char *zout_end; - int z_expandable; - - zhuffman z_length, z_distance; -} zbuf; - -stbi_inline static int zget8(zbuf *z) -{ - if (z->zbuffer >= z->zbuffer_end) return 0; - return *z->zbuffer++; -} - -static void fill_bits(zbuf *z) -{ - do { - assert(z->code_buffer < (1U << z->num_bits)); - z->code_buffer |= zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -stbi_inline static unsigned int zreceive(zbuf *z, int n) -{ - unsigned int k; - if (z->num_bits < n) fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -stbi_inline static int zhuffman_decode(zbuf *a, zhuffman *z) -{ - int b,s,k; - if (a->num_bits < 16) fill_bits(a); - b = z->fast[a->code_buffer & ZFAST_MASK]; - if (b < 0xffff) { - s = z->size[b]; - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; - } - - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = bit_reverse(a->code_buffer, 16); - for (s=ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; - if (s == 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - assert(z->size[b] == s); - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -static int expand(zbuf *z, int n) // need to make room for n bytes -{ - char *q; - int cur, limit; - if (!z->z_expandable) return e("output buffer limit","Corrupt PNG"); - cur = (int) (z->zout - z->zout_start); - limit = (int) (z->zout_end - z->zout_start); - while (cur + n > limit) - limit *= 2; - q = (char *) realloc(z->zout_start, limit); - if (q == NULL) return e("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static int length_base[31] = { - 3,4,5,6,7,8,9,10,11,13, - 15,17,19,23,27,31,35,43,51,59, - 67,83,99,115,131,163,195,227,258,0,0 }; - -static int length_extra[31]= -{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - -static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, -257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - -static int dist_extra[32] = -{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static int parse_huffman_block(zbuf *a) -{ - for(;;) { - int z = zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes - if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0; - *a->zout++ = (char) z; - } else { - uint8 *p; - int len,dist; - if (z == 256) return 1; - z -= 257; - len = length_base[z]; - if (length_extra[z]) len += zreceive(a, length_extra[z]); - z = zhuffman_decode(a, &a->z_distance); - if (z < 0) return e("bad huffman code","Corrupt PNG"); - dist = dist_base[z]; - if (dist_extra[z]) dist += zreceive(a, dist_extra[z]); - if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG"); - if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0; - p = (uint8 *) (a->zout - dist); - while (len--) - *a->zout++ = *p++; - } - } -} - -static int compute_huffman_codes(zbuf *a) -{ - static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - zhuffman z_codelength; - uint8 lencodes[286+32+137];//padding for maximum single op - uint8 codelength_sizes[19]; - int i,n; - - int hlit = zreceive(a,5) + 257; - int hdist = zreceive(a,5) + 1; - int hclen = zreceive(a,4) + 4; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i=0; i < hclen; ++i) { - int s = zreceive(a,3); - codelength_sizes[length_dezigzag[i]] = (uint8) s; - } - if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; - - n = 0; - while (n < hlit + hdist) { - int c = zhuffman_decode(a, &z_codelength); - assert(c >= 0 && c < 19); - if (c < 16) - lencodes[n++] = (uint8) c; - else if (c == 16) { - c = zreceive(a,2)+3; - memset(lencodes+n, lencodes[n-1], c); - n += c; - } else if (c == 17) { - c = zreceive(a,3)+3; - memset(lencodes+n, 0, c); - n += c; - } else { - assert(c == 18); - c = zreceive(a,7)+11; - memset(lencodes+n, 0, c); - n += c; - } - } - if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG"); - if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; - if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; - return 1; -} - -static int parse_uncompressed_block(zbuf *a) -{ - uint8 header[4]; - int len,nlen,k; - if (a->num_bits & 7) - zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns? - a->code_buffer >>= 8; - a->num_bits -= 8; - } - assert(a->num_bits == 0); - // now fill header the normal way - while (k < 4) - header[k++] = (uint8) zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!expand(a, len)) return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int parse_zlib_header(zbuf *a) -{ - int cmf = zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = zget8(a); - if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -// @TODO: should statically initialize these for optimal thread safety -static uint8 default_length[288], default_distance[32]; -static void init_defaults(void) -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) default_length[i] = 8; - for ( ; i <= 255; ++i) default_length[i] = 9; - for ( ; i <= 279; ++i) default_length[i] = 7; - for ( ; i <= 287; ++i) default_length[i] = 8; - - for (i=0; i <= 31; ++i) default_distance[i] = 5; -} - -int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead -static int parse_zlib(zbuf *a, int parse_header) -{ - int final, type; - if (parse_header) - if (!parse_zlib_header(a)) return 0; - a->num_bits = 0; - a->code_buffer = 0; - do { - final = zreceive(a,1); - type = zreceive(a,2); - if (type == 0) { - if (!parse_uncompressed_block(a)) return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!default_distance[31]) init_defaults(); - if (!zbuild_huffman(&a->z_length , default_length , 288)) return 0; - if (!zbuild_huffman(&a->z_distance, default_distance, 32)) return 0; - } else { - if (!compute_huffman_codes(a)) return 0; - } - if (!parse_huffman_block(a)) return 0; - } - if (stbi_png_partial && a->zout - a->zout_start > 65536) - break; - } while (!final); - return 1; -} - -static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header) -{ - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return parse_zlib(a, parse_header); -} - -char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) -{ - zbuf a; - char *p = (char *) malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (uint8 *) buffer; - a.zbuffer_end = (uint8 *) buffer + len; - if (do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - free(a.zout_start); - return NULL; - } -} - -char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) -{ - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) -{ - zbuf a; - char *p = (char *) malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (uint8 *) buffer; - a.zbuffer_end = (uint8 *) buffer + len; - if (do_zlib(&a, p, initial_size, 1, parse_header)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - free(a.zout_start); - return NULL; - } -} - -int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) -{ - zbuf a; - a.zbuffer = (uint8 *) ibuffer; - a.zbuffer_end = (uint8 *) ibuffer + ilen; - if (do_zlib(&a, obuffer, olen, 0, 1)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) -{ - zbuf a; - char *p = (char *) malloc(16384); - if (p == NULL) return NULL; - a.zbuffer = (uint8 *) buffer; - a.zbuffer_end = (uint8 *) buffer+len; - if (do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - free(a.zout_start); - return NULL; - } -} - -int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) -{ - zbuf a; - a.zbuffer = (uint8 *) ibuffer; - a.zbuffer_end = (uint8 *) ibuffer + ilen; - if (do_zlib(&a, obuffer, olen, 0, 0)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - - -typedef struct -{ - uint32 length; - uint32 type; -} chunk; - -#define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) - -static chunk get_chunk_header(stbi *s) -{ - chunk c; - c.length = get32(s); - c.type = get32(s); - return c; -} - -static int check_png_header(stbi *s) -{ - static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 }; - int i; - for (i=0; i < 8; ++i) - if (get8u(s) != png_sig[i]) return e("bad png sig","Not a PNG"); - return 1; -} - -typedef struct -{ - stbi *s; - uint8 *idata, *expanded, *out; -} png; - - -enum { - F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4, - F_avg_first, F_paeth_first -}; - -static uint8 first_row_filter[5] = -{ - F_none, F_sub, F_none, F_avg_first, F_paeth_first -}; - -static int paeth(int a, int b, int c) -{ - int p = a + b - c; - int pa = abs(p-a); - int pb = abs(p-b); - int pc = abs(p-c); - if (pa <= pb && pa <= pc) return a; - if (pb <= pc) return b; - return c; -} - -// create the png data from post-deflated data -static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y) -{ - stbi *s = a->s; - uint32 i,j,stride = x*out_n; - int k; - int img_n = s->img_n; // copy it into a local for later - assert(out_n == s->img_n || out_n == s->img_n+1); - if (stbi_png_partial) y = 1; - a->out = (uint8 *) malloc(x * y * out_n); - if (!a->out) return e("outofmem", "Out of memory"); - if (!stbi_png_partial) { - if (s->img_x == x && s->img_y == y) { - if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); - } else { // interlaced: - if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); - } - } - for (j=0; j < y; ++j) { - uint8 *cur = a->out + stride*j; - uint8 *prior = cur - stride; - int filter = *raw++; - if (filter > 4) return e("invalid filter","Corrupt PNG"); - // if first row, use special filter that doesn't sample previous row - if (j == 0) filter = first_row_filter[filter]; - // handle first pixel explicitly - for (k=0; k < img_n; ++k) { - switch (filter) { - case F_none : cur[k] = raw[k]; break; - case F_sub : cur[k] = raw[k]; break; - case F_up : cur[k] = raw[k] + prior[k]; break; - case F_avg : cur[k] = raw[k] + (prior[k]>>1); break; - case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break; - case F_avg_first : cur[k] = raw[k]; break; - case F_paeth_first: cur[k] = raw[k]; break; - } - } - if (img_n != out_n) cur[img_n] = 255; - raw += img_n; - cur += out_n; - prior += out_n; - // this is a little gross, so that we don't switch per-pixel or per-component - if (img_n == out_n) { - #define CASE(f) \ - case f: \ - for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ - for (k=0; k < img_n; ++k) - switch (filter) { - CASE(F_none) cur[k] = raw[k]; break; - CASE(F_sub) cur[k] = raw[k] + cur[k-img_n]; break; - CASE(F_up) cur[k] = raw[k] + prior[k]; break; - CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break; - CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; - CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1); break; - CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break; - } - #undef CASE - } else { - assert(img_n+1 == out_n); - #define CASE(f) \ - case f: \ - for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ - for (k=0; k < img_n; ++k) - switch (filter) { - CASE(F_none) cur[k] = raw[k]; break; - CASE(F_sub) cur[k] = raw[k] + cur[k-out_n]; break; - CASE(F_up) cur[k] = raw[k] + prior[k]; break; - CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break; - CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; - CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1); break; - CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break; - } - #undef CASE - } - } - return 1; -} - -static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced) -{ - uint8 *final; - int p; - int save; - if (!interlaced) - return create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y); - save = stbi_png_partial; - stbi_png_partial = 0; - - // de-interlacing - final = (uint8 *) malloc(a->s->img_x * a->s->img_y * out_n); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; - int xspc[] = { 8,8,4,4,2,2,1 }; - int yspc[] = { 8,8,8,4,4,2,2 }; - int i,j,x,y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; - y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; - if (x && y) { - if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) { - free(final); - return 0; - } - for (j=0; j < y; ++j) - for (i=0; i < x; ++i) - memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, - a->out + (j*x+i)*out_n, out_n); - free(a->out); - raw += (x*out_n+1)*y; - raw_len -= (x*out_n+1)*y; - } - } - a->out = final; - - stbi_png_partial = save; - return 1; -} - -static int compute_transparency(png *z, uint8 tc[3], int out_n) -{ - stbi *s = z->s; - uint32 i, pixel_count = s->img_x * s->img_y; - uint8 *p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - assert(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i=0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i=0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n) -{ - uint32 i, pixel_count = a->s->img_x * a->s->img_y; - uint8 *p, *temp_out, *orig = a->out; - - p = (uint8 *) malloc(pixel_count * pal_img_n); - if (p == NULL) return e("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p += 3; - } - } else { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p[3] = palette[n+3]; - p += 4; - } - } - free(a->out); - a->out = temp_out; - - STBI_NOTUSED(len); - - return 1; -} - -static int stbi_unpremultiply_on_load = 0; -static int stbi_de_iphone_flag = 0; - -void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) -{ - stbi_unpremultiply_on_load = flag_true_if_should_unpremultiply; -} -void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) -{ - stbi_de_iphone_flag = flag_true_if_should_convert; -} - -static void stbi_de_iphone(png *z) -{ - stbi *s = z->s; - uint32 i, pixel_count = s->img_x * s->img_y; - uint8 *p = z->out; - - if (s->img_out_n == 3) { // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - uint8 t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 3; - } - } else { - assert(s->img_out_n == 4); - if (stbi_unpremultiply_on_load) { - // convert bgr to rgb and unpremultiply - for (i=0; i < pixel_count; ++i) { - uint8 a = p[3]; - uint8 t = p[0]; - if (a) { - p[0] = p[2] * 255 / a; - p[1] = p[1] * 255 / a; - p[2] = t * 255 / a; - } else { - p[0] = p[2]; - p[2] = t; - } - p += 4; - } - } else { - // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - uint8 t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 4; - } - } - } -} - -static int parse_png_file(png *z, int scan, int req_comp) -{ - uint8 palette[1024], pal_img_n=0; - uint8 has_trans=0, tc[3]; - uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, iphone=0; - stbi *s = z->s; - - z->expanded = NULL; - z->idata = NULL; - z->out = NULL; - - if (!check_png_header(s)) return 0; - - if (scan == SCAN_type) return 1; - - for (;;) { - chunk c = get_chunk_header(s); - switch (c.type) { - case PNG_TYPE('C','g','B','I'): - iphone = stbi_de_iphone_flag; - skip(s, c.length); - break; - case PNG_TYPE('I','H','D','R'): { - int depth,color,comp,filter; - if (!first) return e("multiple IHDR","Corrupt PNG"); - first = 0; - if (c.length != 13) return e("bad IHDR len","Corrupt PNG"); - s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)"); - s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)"); - depth = get8(s); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only"); - color = get8(s); if (color > 6) return e("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG"); - comp = get8(s); if (comp) return e("bad comp method","Corrupt PNG"); - filter= get8(s); if (filter) return e("bad filter method","Corrupt PNG"); - interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG"); - if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); - if (scan == SCAN_header) return 1; - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG"); - // if SCAN_header, have to scan to see if we have a tRNS - } - break; - } - - case PNG_TYPE('P','L','T','E'): { - if (first) return e("first not IHDR", "Corrupt PNG"); - if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG"); - for (i=0; i < pal_len; ++i) { - palette[i*4+0] = get8u(s); - palette[i*4+1] = get8u(s); - palette[i*4+2] = get8u(s); - palette[i*4+3] = 255; - } - break; - } - - case PNG_TYPE('t','R','N','S'): { - if (first) return e("first not IHDR", "Corrupt PNG"); - if (z->idata) return e("tRNS after IDAT","Corrupt PNG"); - if (pal_img_n) { - if (scan == SCAN_header) { s->img_n = 4; return 1; } - if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG"); - if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG"); - pal_img_n = 4; - for (i=0; i < c.length; ++i) - palette[i*4+3] = get8u(s); - } else { - if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG"); - if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG"); - has_trans = 1; - for (k=0; k < s->img_n; ++k) - tc[k] = (uint8) get16(s); // non 8-bit images will be larger - } - break; - } - - case PNG_TYPE('I','D','A','T'): { - if (first) return e("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG"); - if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } - if (ioff + c.length > idata_limit) { - uint8 *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - p = (uint8 *) realloc(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory"); - z->idata = p; - } - if (!getn(s, z->idata+ioff,c.length)) return e("outofdata","Corrupt PNG"); - ioff += c.length; - break; - } - - case PNG_TYPE('I','E','N','D'): { - uint32 raw_len; - if (first) return e("first not IHDR", "Corrupt PNG"); - if (scan != SCAN_load) return 1; - if (z->idata == NULL) return e("no IDAT","Corrupt PNG"); - z->expanded = (uint8 *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !iphone); - if (z->expanded == NULL) return 0; // zlib should set error - free(z->idata); z->idata = NULL; - if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n+1; - else - s->img_out_n = s->img_n; - if (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0; - if (has_trans) - if (!compute_transparency(z, tc, s->img_out_n)) return 0; - if (iphone && s->img_out_n > 2) - stbi_de_iphone(z); - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!expand_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } - free(z->expanded); z->expanded = NULL; - return 1; - } - - default: - // if critical, fail - if (first) return e("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { - #ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX chunk not known"; - invalid_chunk[0] = (uint8) (c.type >> 24); - invalid_chunk[1] = (uint8) (c.type >> 16); - invalid_chunk[2] = (uint8) (c.type >> 8); - invalid_chunk[3] = (uint8) (c.type >> 0); - #endif - return e(invalid_chunk, "PNG not supported: unknown chunk type"); - } - skip(s, c.length); - break; - } - // end of chunk, read and skip CRC - get32(s); - } -} - -static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp) -{ - unsigned char *result=NULL; - if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); - if (parse_png_file(p, SCAN_load, req_comp)) { - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { - result = convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - p->s->img_out_n = req_comp; - if (result == NULL) return result; - } - *x = p->s->img_x; - *y = p->s->img_y; - if (n) *n = p->s->img_n; - } - free(p->out); p->out = NULL; - free(p->expanded); p->expanded = NULL; - free(p->idata); p->idata = NULL; - - return result; -} - -static unsigned char *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - png p; - p.s = s; - return do_png(&p, x,y,comp,req_comp); -} - -static int stbi_png_test(stbi *s) -{ - int r; - r = check_png_header(s); - stbi_rewind(s); - return r; -} - -static int stbi_png_info_raw(png *p, int *x, int *y, int *comp) -{ - if (!parse_png_file(p, SCAN_header, 0)) { - stbi_rewind( p->s ); - return 0; - } - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; - return 1; -} - -static int stbi_png_info(stbi *s, int *x, int *y, int *comp) -{ - png p; - p.s = s; - return stbi_png_info_raw(&p, x, y, comp); -} - -// Microsoft/Windows BMP image - -static int bmp_test(stbi *s) -{ - int sz; - if (get8(s) != 'B') return 0; - if (get8(s) != 'M') return 0; - get32le(s); // discard filesize - get16le(s); // discard reserved - get16le(s); // discard reserved - get32le(s); // discard data offset - sz = get32le(s); - if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1; - return 0; -} - -static int stbi_bmp_test(stbi *s) -{ - int r = bmp_test(s); - stbi_rewind(s); - return r; -} - - -// returns 0..31 for the highest set bit -static int high_bit(unsigned int z) -{ - int n=0; - if (z == 0) return -1; - if (z >= 0x10000) n += 16, z >>= 16; - if (z >= 0x00100) n += 8, z >>= 8; - if (z >= 0x00010) n += 4, z >>= 4; - if (z >= 0x00004) n += 2, z >>= 2; - if (z >= 0x00002) n += 1, z >>= 1; - return n; -} - -static int bitcount(unsigned int a) -{ - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -static int shiftsigned(int v, int shift, int bits) -{ - int result; - int z=0; - - if (shift < 0) v <<= -shift; - else v >>= shift; - result = v; - - z = bits; - while (z < 8) { - result += v >> z; - z += bits; - } - return result; -} - -static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - uint8 *out; - unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; - stbi_uc pal[256][4]; - int psize=0,i,j,compress=0,width; - int bpp, flip_vertically, pad, target, offset, hsz; - if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP"); - get32le(s); // discard filesize - get16le(s); // discard reserved - get16le(s); // discard reserved - offset = get32le(s); - hsz = get32le(s); - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { - s->img_x = get16le(s); - s->img_y = get16le(s); - } else { - s->img_x = get32le(s); - s->img_y = get32le(s); - } - if (get16le(s) != 1) return epuc("bad BMP", "bad BMP"); - bpp = get16le(s); - if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit"); - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - if (hsz == 12) { - if (bpp < 24) - psize = (offset - 14 - 24) / 3; - } else { - compress = get32le(s); - if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE"); - get32le(s); // discard sizeof - get32le(s); // discard hres - get32le(s); // discard vres - get32le(s); // discard colorsused - get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - get32le(s); - get32le(s); - get32le(s); - get32le(s); - } - if (bpp == 16 || bpp == 32) { - mr = mg = mb = 0; - if (compress == 0) { - if (bpp == 32) { - mr = 0xffu << 16; - mg = 0xffu << 8; - mb = 0xffu << 0; - ma = 0xffu << 24; - fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 - } else { - mr = 31u << 10; - mg = 31u << 5; - mb = 31u << 0; - } - } else if (compress == 3) { - mr = get32le(s); - mg = get32le(s); - mb = get32le(s); - // not documented, but generated by photoshop and handled by mspaint - if (mr == mg && mg == mb) { - // ?!?!? - return epuc("bad BMP", "bad BMP"); - } - } else - return epuc("bad BMP", "bad BMP"); - } - } else { - assert(hsz == 108); - mr = get32le(s); - mg = get32le(s); - mb = get32le(s); - ma = get32le(s); - get32le(s); // discard color space - for (i=0; i < 12; ++i) - get32le(s); // discard color space parameters - } - if (bpp < 16) - psize = (offset - 14 - hsz) >> 2; - } - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - out = (stbi_uc *) malloc(target * s->img_x * s->img_y); - if (!out) return epuc("outofmem", "Out of memory"); - if (bpp < 16) { - int z=0; - if (psize == 0 || psize > 256) { free(out); return epuc("invalid", "Corrupt BMP"); } - for (i=0; i < psize; ++i) { - pal[i][2] = get8u(s); - pal[i][1] = get8u(s); - pal[i][0] = get8u(s); - if (hsz != 12) get8(s); - pal[i][3] = 255; - } - skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); - if (bpp == 4) width = (s->img_x + 1) >> 1; - else if (bpp == 8) width = s->img_x; - else { free(out); return epuc("bad bpp", "Corrupt BMP"); } - pad = (-width)&3; - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=get8(s),v2=0; - if (bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (bpp == 8) ? get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - } - skip(s, pad); - } - } else { - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; - skip(s, offset - 14 - hsz); - if (bpp == 24) width = 3 * s->img_x; - else if (bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; - pad = (-width) & 3; - if (bpp == 24) { - easy = 1; - } else if (bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) { free(out); return epuc("bad masks", "Corrupt BMP"); } - // right shift amt to put high bit in position #7 - rshift = high_bit(mr)-7; rcount = bitcount(mr); - gshift = high_bit(mg)-7; gcount = bitcount(mr); - bshift = high_bit(mb)-7; bcount = bitcount(mr); - ashift = high_bit(ma)-7; acount = bitcount(mr); - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { - for (i=0; i < (int) s->img_x; ++i) { - int a; - out[z+2] = get8u(s); - out[z+1] = get8u(s); - out[z+0] = get8u(s); - z += 3; - a = (easy == 2 ? get8(s) : 255); - if (target == 4) out[z++] = (uint8) a; - } - } else { - for (i=0; i < (int) s->img_x; ++i) { - uint32 v = (bpp == 16 ? get16le(s) : get32le(s)); - int a; - out[z++] = (uint8) shiftsigned(v & mr, rshift, rcount); - out[z++] = (uint8) shiftsigned(v & mg, gshift, gcount); - out[z++] = (uint8) shiftsigned(v & mb, bshift, bcount); - a = (ma ? shiftsigned(v & ma, ashift, acount) : 255); - if (target == 4) out[z++] = (uint8) a; - } - } - skip(s, pad); - } - } - if (flip_vertically) { - stbi_uc t; - for (j=0; j < (int) s->img_y>>1; ++j) { - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { - t = p1[i], p1[i] = p2[i], p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - return out; -} - -static stbi_uc *stbi_bmp_load(stbi *s,int *x, int *y, int *comp, int req_comp) -{ - return bmp_load(s, x,y,comp,req_comp); -} - - -// Targa Truevision - TGA -// by Jonathan Dummer - -static int tga_info(stbi *s, int *x, int *y, int *comp) -{ - int tga_w, tga_h, tga_comp; - int sz; - get8u(s); // discard Offset - sz = get8u(s); // color type - if( sz > 1 ) { - stbi_rewind(s); - return 0; // only RGB or indexed allowed - } - sz = get8u(s); // image type - // only RGB or grey allowed, +/- RLE - if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; - skip(s,9); - tga_w = get16le(s); - if( tga_w < 1 ) { - stbi_rewind(s); - return 0; // test width - } - tga_h = get16le(s); - if( tga_h < 1 ) { - stbi_rewind(s); - return 0; // test height - } - sz = get8(s); // bits per pixel - // only RGB or RGBA or grey allowed - if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) { - stbi_rewind(s); - return 0; - } - tga_comp = sz; - if (x) *x = tga_w; - if (y) *y = tga_h; - if (comp) *comp = tga_comp / 8; - return 1; // seems to have passed everything -} - -int stbi_tga_info(stbi *s, int *x, int *y, int *comp) -{ - return tga_info(s, x, y, comp); -} - -static int tga_test(stbi *s) -{ - int sz; - get8u(s); // discard Offset - sz = get8u(s); // color type - if ( sz > 1 ) return 0; // only RGB or indexed allowed - sz = get8u(s); // image type - if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE - get16(s); // discard palette start - get16(s); // discard palette length - get8(s); // discard bits per palette color entry - get16(s); // discard x origin - get16(s); // discard y origin - if ( get16(s) < 1 ) return 0; // test width - if ( get16(s) < 1 ) return 0; // test height - sz = get8(s); // bits per pixel - if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed - return 1; // seems to have passed everything -} - -static int stbi_tga_test(stbi *s) -{ - int res = tga_test(s); - stbi_rewind(s); - return res; -} - -static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - // read in the TGA header stuff - int tga_offset = get8u(s); - int tga_indexed = get8u(s); - int tga_image_type = get8u(s); - int tga_is_RLE = 0; - int tga_palette_start = get16le(s); - int tga_palette_len = get16le(s); - int tga_palette_bits = get8u(s); - int tga_x_origin = get16le(s); - int tga_y_origin = get16le(s); - int tga_width = get16le(s); - int tga_height = get16le(s); - int tga_bits_per_pixel = get8u(s); - int tga_inverted = get8u(s); - // image data - unsigned char *tga_data; - unsigned char *tga_palette = NULL; - int i, j; - unsigned char raw_data[4]; - unsigned char trans_data[4]; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - - // do a tiny bit of precessing - if ( tga_image_type >= 8 ) - { - tga_image_type -= 8; - tga_is_RLE = 1; - } - /* int tga_alpha_bits = tga_inverted & 15; */ - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // error check - if ( //(tga_indexed) || - (tga_width < 1) || (tga_height < 1) || - (tga_image_type < 1) || (tga_image_type > 3) || - ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && - (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) - ) - { - return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA - } - - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) - { - tga_bits_per_pixel = tga_palette_bits; - } - - // tga info - *x = tga_width; - *y = tga_height; - if ( (req_comp < 1) || (req_comp > 4) ) - { - // just use whatever the file was - req_comp = tga_bits_per_pixel / 8; - *comp = req_comp; - } else - { - // force a new number of components - *comp = tga_bits_per_pixel/8; - } - tga_data = (unsigned char*)malloc( tga_width * tga_height * req_comp ); - if (!tga_data) return epuc("outofmem", "Out of memory"); - - // skip to the data's starting position (offset usually = 0) - skip(s, tga_offset ); - // do I need to load a palette? - if ( tga_indexed ) - { - // any data to skip? (offset usually = 0) - skip(s, tga_palette_start ); - // load the palette - tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); - if (!tga_palette) return epuc("outofmem", "Out of memory"); - if (!getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { - free(tga_data); - free(tga_palette); - return epuc("bad palette", "Corrupt TGA"); - } - } - // load the data - trans_data[0] = trans_data[1] = trans_data[2] = trans_data[3] = 0; - for (i=0; i < tga_width * tga_height; ++i) - { - // if I'm in RLE mode, do I need to get a RLE chunk? - if ( tga_is_RLE ) - { - if ( RLE_count == 0 ) - { - // yep, get the next byte as a RLE command - int RLE_cmd = get8u(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if ( !RLE_repeating ) - { - read_next_pixel = 1; - } - } else - { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if ( read_next_pixel ) - { - // load however much data we did have - if ( tga_indexed ) - { - // read in 1 byte, then perform the lookup - int pal_idx = get8u(s); - if ( pal_idx >= tga_palette_len ) - { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_bits_per_pixel / 8; - for (j = 0; j*8 < tga_bits_per_pixel; ++j) - { - raw_data[j] = tga_palette[pal_idx+j]; - } - } else - { - // read in the data raw - for (j = 0; j*8 < tga_bits_per_pixel; ++j) - { - raw_data[j] = get8u(s); - } - } - // convert raw to the intermediate format - switch (tga_bits_per_pixel) - { - case 8: - // Luminous => RGBA - trans_data[0] = raw_data[0]; - trans_data[1] = raw_data[0]; - trans_data[2] = raw_data[0]; - trans_data[3] = 255; - break; - case 16: - // Luminous,Alpha => RGBA - trans_data[0] = raw_data[0]; - trans_data[1] = raw_data[0]; - trans_data[2] = raw_data[0]; - trans_data[3] = raw_data[1]; - break; - case 24: - // BGR => RGBA - trans_data[0] = raw_data[2]; - trans_data[1] = raw_data[1]; - trans_data[2] = raw_data[0]; - trans_data[3] = 255; - break; - case 32: - // BGRA => RGBA - trans_data[0] = raw_data[2]; - trans_data[1] = raw_data[1]; - trans_data[2] = raw_data[0]; - trans_data[3] = raw_data[3]; - break; - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - // convert to final format - switch (req_comp) - { - case 1: - // RGBA => Luminance - tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); - break; - case 2: - // RGBA => Luminance,Alpha - tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); - tga_data[i*req_comp+1] = trans_data[3]; - break; - case 3: - // RGBA => RGB - tga_data[i*req_comp+0] = trans_data[0]; - tga_data[i*req_comp+1] = trans_data[1]; - tga_data[i*req_comp+2] = trans_data[2]; - break; - case 4: - // RGBA => RGBA - tga_data[i*req_comp+0] = trans_data[0]; - tga_data[i*req_comp+1] = trans_data[1]; - tga_data[i*req_comp+2] = trans_data[2]; - tga_data[i*req_comp+3] = trans_data[3]; - break; - } - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if ( tga_inverted ) - { - for (j = 0; j*2 < tga_height; ++j) - { - int index1 = j * tga_width * req_comp; - int index2 = (tga_height - 1 - j) * tga_width * req_comp; - for (i = tga_width * req_comp; i > 0; --i) - { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if ( tga_palette != NULL ) - { - free( tga_palette ); - } - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; - // OK, done - return tga_data; -} - -static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - return tga_load(s,x,y,comp,req_comp); -} - - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB - -static int psd_test(stbi *s) -{ - if (get32(s) != 0x38425053) return 0; // "8BPS" - else return 1; -} - -static int stbi_psd_test(stbi *s) -{ - int r = psd_test(s); - stbi_rewind(s); - return r; -} - -static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - int pixelCount; - int channelCount, compression; - int channel, i, count, len; - int w,h; - uint8 *out; - - // Check identifier - if (get32(s) != 0x38425053) // "8BPS" - return epuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (get16(s) != 1) - return epuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - skip(s, 6 ); - - // Read the number of channels (R, G, B, A, etc). - channelCount = get16(s); - if (channelCount < 0 || channelCount > 16) - return epuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = get32(s); - w = get32(s); - - // Make sure the depth is 8 bits. - if (get16(s) != 8) - return epuc("unsupported bit depth", "PSD bit depth is not 8 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (get16(s) != 3) - return epuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - skip(s,get32(s) ); - - // Skip the image resources. (resolution, pen tool paths, etc) - skip(s, get32(s) ); - - // Skip the reserved data. - skip(s, get32(s) ); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = get16(s); - if (compression > 1) - return epuc("bad compression", "PSD has an unknown compression format"); - - // Create the destination image. - out = (stbi_uc *) malloc(4 * w*h); - if (!out) return epuc("outofmem", "Out of memory"); - pixelCount = w*h; - - // Initialize the data to zero. - //memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, - // which we're going to just skip. - skip(s, h * channelCount * 2 ); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - uint8 *p; - - p = out+channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; - } else { - // Read the RLE data. - count = 0; - while (count < pixelCount) { - len = get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - count += len; - while (len) { - *p = get8u(s); - p += 4; - len--; - } - } else if (len > 128) { - uint8 val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len ^= 0x0FF; - len += 2; - val = get8u(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - } - } - - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - uint8 *p; - - p = out + channel; - if (channel > channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; - } else { - // Read the data. - for (i = 0; i < pixelCount; i++) - *p = get8u(s), p += 4; - } - } - } - - if (req_comp && req_comp != 4) { - out = convert_format(out, 4, req_comp, w, h); - if (out == NULL) return out; // convert_format frees input on failure - } - - if (comp) *comp = channelCount; - *y = h; - *x = w; - - return out; -} - -static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - return psd_load(s,x,y,comp,req_comp); -} - -// ************************************************************************************************* -// Softimage PIC loader -// by Tom Seddon -// -// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format -// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ - -static int pic_is4(stbi *s,const char *str) -{ - int i; - for (i=0; i<4; ++i) - if (get8(s) != (stbi_uc)str[i]) - return 0; - - return 1; -} - -static int pic_test(stbi *s) -{ - int i; - - if (!pic_is4(s,"\x53\x80\xF6\x34")) - return 0; - - for(i=0;i<84;++i) - get8(s); - - if (!pic_is4(s,"PICT")) - return 0; - - return 1; -} - -typedef struct -{ - stbi_uc size,type,channel; -} pic_packet_t; - -static stbi_uc *pic_readval(stbi *s, int channel, stbi_uc *dest) -{ - int mask=0x80, i; - - for (i=0; i<4; ++i, mask>>=1) { - if (channel & mask) { - if (at_eof(s)) return epuc("bad file","PIC file too short"); - dest[i]=get8u(s); - } - } - - return dest; -} - -static void pic_copyval(int channel,stbi_uc *dest,const stbi_uc *src) -{ - int mask=0x80,i; - - for (i=0;i<4; ++i, mask>>=1) - if (channel&mask) - dest[i]=src[i]; -} - -static stbi_uc *pic_load2(stbi *s,int width,int height,int *comp, stbi_uc *result) -{ - int act_comp=0,num_packets=0,y,chained; - pic_packet_t packets[10]; - - // this will (should...) cater for even some bizarre stuff like having data - // for the same channel in multiple packets. - do { - pic_packet_t *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return epuc("bad format","too many packets"); - - packet = &packets[num_packets++]; - - chained = get8(s); - packet->size = get8u(s); - packet->type = get8u(s); - packet->channel = get8u(s); - - act_comp |= packet->channel; - - if (at_eof(s)) return epuc("bad file","file too short (reading packets)"); - if (packet->size != 8) return epuc("bad format","packet isn't 8bpp"); - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? - - for(y=0; ytype) { - default: - return epuc("bad format","packet has bad compression type"); - - case 0: {//uncompressed - int x; - - for(x=0;xchannel,dest)) - return 0; - break; - } - - case 1://Pure RLE - { - int left=width, i; - - while (left>0) { - stbi_uc count,value[4]; - - count=get8u(s); - if (at_eof(s)) return epuc("bad file","file too short (pure read count)"); - - if (count > left) - count = (uint8) left; - - if (!pic_readval(s,packet->channel,value)) return 0; - - for(i=0; ichannel,dest,value); - left -= count; - } - } - break; - - case 2: {//Mixed RLE - int left=width; - while (left>0) { - int count = get8(s), i; - if (at_eof(s)) return epuc("bad file","file too short (mixed read count)"); - - if (count >= 128) { // Repeated - stbi_uc value[4]; - int i; - - if (count==128) - count = get16(s); - else - count -= 127; - if (count > left) - return epuc("bad file","scanline overrun"); - - if (!pic_readval(s,packet->channel,value)) - return 0; - - for(i=0;ichannel,dest,value); - } else { // Raw - ++count; - if (count>left) return epuc("bad file","scanline overrun"); - - for(i=0;ichannel,dest)) - return 0; - } - left-=count; - } - break; - } - } - } - } - - return result; -} - -static stbi_uc *pic_load(stbi *s,int *px,int *py,int *comp,int req_comp) -{ - stbi_uc *result; - int i, x,y; - - for (i=0; i<92; ++i) - get8(s); - - x = get16(s); - y = get16(s); - if (at_eof(s)) return epuc("bad file","file too short (pic header)"); - if ((1 << 28) / x < y) return epuc("too large", "Image too large to decode"); - - get32(s); //skip `ratio' - get16(s); //skip `fields' - get16(s); //skip `pad' - - // intermediate buffer is RGBA - result = (stbi_uc *) malloc(x*y*4); - memset(result, 0xff, x*y*4); - - if (!pic_load2(s,x,y,comp, result)) { - free(result); - result=0; - } - *px = x; - *py = y; - if (req_comp == 0) req_comp = *comp; - result=convert_format(result,4,req_comp,x,y); - - return result; -} - -static int stbi_pic_test(stbi *s) -{ - int r = pic_test(s); - stbi_rewind(s); - return r; -} - -static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - return pic_load(s,x,y,comp,req_comp); -} - -// ************************************************************************************************* -// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb -typedef struct stbi_gif_lzw_struct { - int16 prefix; - uint8 first; - uint8 suffix; -} stbi_gif_lzw; - -typedef struct stbi_gif_struct -{ - int w,h; - stbi_uc *out; // output buffer (always 4 components) - int flags, bgindex, ratio, transparent, eflags; - uint8 pal[256][4]; - uint8 lpal[256][4]; - stbi_gif_lzw codes[4096]; - uint8 *color_table; - int parse, step; - int lflags; - int start_x, start_y; - int max_x, max_y; - int cur_x, cur_y; - int line_size; -} stbi_gif; - -static int gif_test(stbi *s) -{ - int sz; - if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return 0; - sz = get8(s); - if (sz != '9' && sz != '7') return 0; - if (get8(s) != 'a') return 0; - return 1; -} - -static int stbi_gif_test(stbi *s) -{ - int r = gif_test(s); - stbi_rewind(s); - return r; -} - -static void stbi_gif_parse_colortable(stbi *s, uint8 pal[256][4], int num_entries, int transp) -{ - int i; - for (i=0; i < num_entries; ++i) { - pal[i][2] = get8u(s); - pal[i][1] = get8u(s); - pal[i][0] = get8u(s); - pal[i][3] = transp ? 0 : 255; - } -} - -static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info) -{ - uint8 version; - if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') - return e("not GIF", "Corrupt GIF"); - - version = get8u(s); - if (version != '7' && version != '9') return e("not GIF", "Corrupt GIF"); - if (get8(s) != 'a') return e("not GIF", "Corrupt GIF"); - - failure_reason = ""; - g->w = get16le(s); - g->h = get16le(s); - g->flags = get8(s); - g->bgindex = get8(s); - g->ratio = get8(s); - g->transparent = -1; - - if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) return 1; - - if (g->flags & 0x80) - stbi_gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); - - return 1; -} - -static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp) -{ - stbi_gif g; - if (!stbi_gif_header(s, &g, comp, 1)) { - stbi_rewind( s ); - return 0; - } - if (x) *x = g.w; - if (y) *y = g.h; - return 1; -} - -static void stbi_out_gif_code(stbi_gif *g, uint16 code) -{ - uint8 *p, *c; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty - if (g->codes[code].prefix >= 0) - stbi_out_gif_code(g, g->codes[code].prefix); - - if (g->cur_y >= g->max_y) return; - - p = &g->out[g->cur_x + g->cur_y]; - c = &g->color_table[g->codes[code].suffix * 4]; - - if (c[3] >= 128) { - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; - - if (g->cur_x >= g->max_x) { - g->cur_x = g->start_x; - g->cur_y += g->step; - - while (g->cur_y >= g->max_y && g->parse > 0) { - g->step = (1 << g->parse) * g->line_size; - g->cur_y = g->start_y + (g->step >> 1); - --g->parse; - } - } -} - -static uint8 *stbi_process_gif_raster(stbi *s, stbi_gif *g) -{ - uint8 lzw_cs; - int32 len, code; - uint32 first; - int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi_gif_lzw *p; - - lzw_cs = get8u(s); - clear = 1 << lzw_cs; - first = 1; - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - bits = 0; - valid_bits = 0; - for (code = 0; code < clear; code++) { - g->codes[code].prefix = -1; - g->codes[code].first = (uint8) code; - g->codes[code].suffix = (uint8) code; - } - - // support no starting clear code - avail = clear+2; - oldcode = -1; - - len = 0; - for(;;) { - if (valid_bits < codesize) { - if (len == 0) { - len = get8(s); // start new block - if (len == 0) - return g->out; - } - --len; - bits |= (int32) get8(s) << valid_bits; - valid_bits += 8; - } else { - int32 code = bits & codemask; - bits >>= codesize; - valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - avail = clear + 2; - oldcode = -1; - first = 0; - } else if (code == clear + 1) { // end of stream code - skip(s, len); - while ((len = get8(s)) > 0) - skip(s,len); - return g->out; - } else if (code <= avail) { - if (first) return epuc("no clear code", "Corrupt GIF"); - - if (oldcode >= 0) { - p = &g->codes[avail++]; - if (avail > 4096) return epuc("too many codes", "Corrupt GIF"); - p->prefix = (int16) oldcode; - p->first = g->codes[oldcode].first; - p->suffix = (code == avail) ? p->first : g->codes[code].first; - } else if (code == avail) - return epuc("illegal code in raster", "Corrupt GIF"); - - stbi_out_gif_code(g, (uint16) code); - - if ((avail & codemask) == 0 && avail <= 0x0FFF) { - codesize++; - codemask = (1 << codesize) - 1; - } - - oldcode = code; - } else { - return epuc("illegal code in raster", "Corrupt GIF"); - } - } - } -} - -static void stbi_fill_gif_background(stbi_gif *g) -{ - int i; - uint8 *c = g->pal[g->bgindex]; - // @OPTIMIZE: write a dword at a time - for (i = 0; i < g->w * g->h * 4; i += 4) { - uint8 *p = &g->out[i]; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } -} - -// this function is designed to support animated gifs, although stb_image doesn't support it -static uint8 *stbi_gif_load_next(stbi *s, stbi_gif *g, int *comp, int req_comp) -{ - int i; - uint8 *old_out = 0; - - if (g->out == 0) { - if (!stbi_gif_header(s, g, comp,0)) return 0; // failure_reason set by stbi_gif_header - g->out = (uint8 *) malloc(4 * g->w * g->h); - if (g->out == 0) return epuc("outofmem", "Out of memory"); - stbi_fill_gif_background(g); - } else { - // animated-gif-only path - if (((g->eflags & 0x1C) >> 2) == 3) { - old_out = g->out; - g->out = (uint8 *) malloc(4 * g->w * g->h); - if (g->out == 0) return epuc("outofmem", "Out of memory"); - memcpy(g->out, old_out, g->w*g->h*4); - } - } - - for (;;) { - switch (get8(s)) { - case 0x2C: /* Image Descriptor */ - { - int32 x, y, w, h; - uint8 *o; - - x = get16le(s); - y = get16le(s); - w = get16le(s); - h = get16le(s); - if (((x + w) > (g->w)) || ((y + h) > (g->h))) - return epuc("bad Image Descriptor", "Corrupt GIF"); - - g->line_size = g->w * 4; - g->start_x = x * 4; - g->start_y = y * g->line_size; - g->max_x = g->start_x + w * 4; - g->max_y = g->start_y + h * g->line_size; - g->cur_x = g->start_x; - g->cur_y = g->start_y; - - g->lflags = get8(s); - - if (g->lflags & 0x40) { - g->step = 8 * g->line_size; // first interlaced spacing - g->parse = 3; - } else { - g->step = g->line_size; - g->parse = 0; - } - - if (g->lflags & 0x80) { - stbi_gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (uint8 *) g->lpal; - } else if (g->flags & 0x80) { - for (i=0; i < 256; ++i) // @OPTIMIZE: reset only the previous transparent - g->pal[i][3] = 255; - if (g->transparent >= 0 && (g->eflags & 0x01)) - g->pal[g->transparent][3] = 0; - g->color_table = (uint8 *) g->pal; - } else - return epuc("missing color table", "Corrupt GIF"); - - o = stbi_process_gif_raster(s, g); - if (o == NULL) return NULL; - - if (req_comp && req_comp != 4) - o = convert_format(o, 4, req_comp, g->w, g->h); - return o; - } - - case 0x21: // Comment Extension. - { - int len; - if (get8(s) == 0xF9) { // Graphic Control Extension. - len = get8(s); - if (len == 4) { - g->eflags = get8(s); - get16le(s); // delay - g->transparent = get8(s); - } else { - skip(s, len); - break; - } - } - while ((len = get8(s)) != 0) - skip(s, len); - break; - } - - case 0x3B: // gif stream termination code - return (uint8 *) 1; - - default: - return epuc("unknown code", "Corrupt GIF"); - } - } -} - -static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - uint8 *u = 0; - stbi_gif g={0}; - - u = stbi_gif_load_next(s, &g, comp, req_comp); - if (u == (void *) 1) u = 0; // end of animated gif marker - if (u) { - *x = g.w; - *y = g.h; - } - - return u; -} - -static int stbi_gif_info(stbi *s, int *x, int *y, int *comp) -{ - return stbi_gif_info_raw(s,x,y,comp); -} - - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int hdr_test(stbi *s) -{ - const char *signature = "#?RADIANCE\n"; - int i; - for (i=0; signature[i]; ++i) - if (get8(s) != signature[i]) - return 0; - return 1; -} - -static int stbi_hdr_test(stbi* s) -{ - int r = hdr_test(s); - stbi_rewind(s); - return r; -} - -#define HDR_BUFLEN 1024 -static char *hdr_gettoken(stbi *z, char *buffer) -{ - int len=0; - char c = '\0'; - - c = (char) get8(z); - - while (!at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == HDR_BUFLEN-1) { - // flush to end of line - while (!at_eof(z) && get8(z) != '\n') - ; - break; - } - c = (char) get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void hdr_convert(float *output, stbi_uc *input, int req_comp) -{ - if ( input[3] != 0 ) { - float f1; - // Exponent - f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) output[1] = 1; - if (req_comp == 4) output[3] = 1; - } else { - switch (req_comp) { - case 4: output[3] = 1; /* fallthrough */ - case 3: output[0] = output[1] = output[2] = 0; - break; - case 2: output[1] = 1; /* fallthrough */ - case 1: output[0] = 0; - break; - } - } -} - -static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - char buffer[HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - float *hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - - - // Check identifier - if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) - return epf("not HDR", "Corrupt HDR image"); - - // Parse header - for(;;) { - token = hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return epf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = strtol(token, NULL, 10); - - *x = width; - *y = height; - - *comp = 3; - if (req_comp == 0) req_comp = 3; - - // Read data - hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); - - // Load image data - // image data is stored as some number of sca - if ( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - getn(s, rgbe, 4); - hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = get8(s); - c2 = get8(s); - len = get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - uint8 rgbe[4]; - rgbe[0] = (uint8) c1; - rgbe[1] = (uint8) c2; - rgbe[2] = (uint8) len; - rgbe[3] = (uint8) get8u(s); - hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - free(scanline); - goto main_decode_loop; // yes, this makes no sense - } - len <<= 8; - len |= get8(s); - if (len != width) { free(hdr_data); free(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); - - for (k = 0; k < 4; ++k) { - i = 0; - while (i < width) { - count = get8u(s); - if (count > 128) { - // Run - value = get8u(s); - count -= 128; - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = get8u(s); - } - } - } - for (i=0; i < width; ++i) - hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); - } - free(scanline); - } - - return hdr_data; -} - -static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - return hdr_load(s,x,y,comp,req_comp); -} - -static int stbi_hdr_info(stbi *s, int *x, int *y, int *comp) -{ - char buffer[HDR_BUFLEN]; - char *token; - int valid = 0; - - if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) { - stbi_rewind( s ); - return 0; - } - - for(;;) { - token = hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) { - stbi_rewind( s ); - return 0; - } - token = hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) { - stbi_rewind( s ); - return 0; - } - token += 3; - *y = strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) { - stbi_rewind( s ); - return 0; - } - token += 3; - *x = strtol(token, NULL, 10); - *comp = 3; - return 1; -} -#endif // STBI_NO_HDR - -static int stbi_bmp_info(stbi *s, int *x, int *y, int *comp) -{ - int hsz; - if (get8(s) != 'B' || get8(s) != 'M') { - stbi_rewind( s ); - return 0; - } - skip(s,12); - hsz = get32le(s); - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) { - stbi_rewind( s ); - return 0; - } - if (hsz == 12) { - *x = get16le(s); - *y = get16le(s); - } else { - *x = get32le(s); - *y = get32le(s); - } - if (get16le(s) != 1) { - stbi_rewind( s ); - return 0; - } - *comp = get16le(s) / 8; - return 1; -} - -static int stbi_psd_info(stbi *s, int *x, int *y, int *comp) -{ - int channelCount; - if (get32(s) != 0x38425053) { - stbi_rewind( s ); - return 0; - } - if (get16(s) != 1) { - stbi_rewind( s ); - return 0; - } - skip(s, 6); - channelCount = get16(s); - if (channelCount < 0 || channelCount > 16) { - stbi_rewind( s ); - return 0; - } - *y = get32(s); - *x = get32(s); - if (get16(s) != 8) { - stbi_rewind( s ); - return 0; - } - if (get16(s) != 3) { - stbi_rewind( s ); - return 0; - } - *comp = 4; - return 1; -} - -static int stbi_pic_info(stbi *s, int *x, int *y, int *comp) -{ - int act_comp=0,num_packets=0,chained; - pic_packet_t packets[10]; - - skip(s, 92); - - *x = get16(s); - *y = get16(s); - if (at_eof(s)) return 0; - if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi_rewind( s ); - return 0; - } - - skip(s, 8); - - do { - pic_packet_t *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return 0; - - packet = &packets[num_packets++]; - chained = get8(s); - packet->size = get8u(s); - packet->type = get8u(s); - packet->channel = get8u(s); - act_comp |= packet->channel; - - if (at_eof(s)) { - stbi_rewind( s ); - return 0; - } - if (packet->size != 8) { - stbi_rewind( s ); - return 0; - } - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); - - return 1; -} - -static int stbi_info_main(stbi *s, int *x, int *y, int *comp) -{ - if (stbi_jpeg_info(s, x, y, comp)) - return 1; - if (stbi_png_info(s, x, y, comp)) - return 1; - if (stbi_gif_info(s, x, y, comp)) - return 1; - if (stbi_bmp_info(s, x, y, comp)) - return 1; - if (stbi_psd_info(s, x, y, comp)) - return 1; - if (stbi_pic_info(s, x, y, comp)) - return 1; - #ifndef STBI_NO_HDR - if (stbi_hdr_info(s, x, y, comp)) - return 1; - #endif - // test tga last because it's a crappy test! - if (stbi_tga_info(s, x, y, comp)) - return 1; - return e("unknown image type", "Image not of any known type, or corrupt"); -} - -#ifndef STBI_NO_STDIO -int stbi_info(char const *filename, int *x, int *y, int *comp) -{ - FILE *f = fopen(filename, "rb"); - int result; - if (!f) return e("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); - fclose(f); - return result; -} - -int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) -{ - int r; - stbi s; - long pos = ftell(f); - start_file(&s, f); - r = stbi_info_main(&s,x,y,comp); - fseek(f,pos,SEEK_SET); - return r; -} -#endif // !STBI_NO_STDIO - -int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) -{ - stbi s; - start_mem(&s,buffer,len); - return stbi_info_main(&s,x,y,comp); -} - -int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) -{ - stbi s; - start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi_info_main(&s,x,y,comp); -} - -#endif // STBI_HEADER_FILE_ONLY - -/* - revision history: - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-uint8 to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.e. Janez (U+017D)emva) - 1.21 fix use of 'uint8' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 2008-08-02 - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 first released version -*/ From 3a6e5d4bd1924b53620945d3b062c766bb1ff5d4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 4 Mar 2013 11:09:41 -0600 Subject: [PATCH 344/695] Updated the documentation for all of the new filters added in recent months. --- README.md | 112 ++++++++++++++++++- framework/GPUImage.xcodeproj/project.pbxproj | 16 +-- 2 files changed, 118 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index af16d8320..ba89302ec 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# GPUImage framework # +# GPUImage #
@@ -54,6 +54,8 @@ Documentation is generated from header comments using appledoc. To build the doc ## Built-in filters ## +There are currently 125 built-in filters, divided into the following categories: + ### Color adjustments ### - **GPUImageBrightnessFilter**: Adjusts the brightness of the image @@ -71,6 +73,8 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageGammaFilter**: Adjusts the gamma of an image - *gamma*: The gamma adjustment to apply (0.0 - 3.0, with 1.0 as the default) +- **GPUImageLevelsFilter**: Photoshop-like levels adjustment. The min, max, minOut and maxOut parameters are floats in the range [0, 1]. If you have parameters from Photoshop in the range [0, 255] you must first convert them to be [0, 1]. The gamma/mid parameter is a float >= 0. This matches the value from Photoshop. If you want to apply levels to RGB as well as individual channels you need to use this filter twice - first for the individual channels and then for all channels. + - **GPUImageColorMatrixFilter**: Transforms the colors of an image by applying a matrix to them - *colorMatrix*: A 4x4 matrix used to transform each color in an image - *intensity*: The degree to which the new transformed color replaces the original color for each pixel @@ -86,7 +90,8 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageToneCurveFilter**: Adjusts the colors of an image based on spline curves for each color channel. - *redControlPoints*: - *greenControlPoints*: - - *blueControlPoints*: The tone curve takes in a series of control points that define the spline curve for each color component. These are stored as NSValue-wrapped CGPoints in an NSArray, with normalized X and Y coordinates from 0 - 1. The defaults are (0,0), (0.5,0.5), (1,1). + - *blueControlPoints*: + - *rgbCompositeControlPoints*: The tone curve takes in a series of control points that define the spline curve for each color component, or for all three in the composite. These are stored as NSValue-wrapped CGPoints in an NSArray, with normalized X and Y coordinates from 0 - 1. The defaults are (0,0), (0.5,0.5), (1,1). - **GPUImageHighlightShadowFilter**: Adjusts the shadows and highlights of an image - *shadows*: Increase to lighten shadows, from 0.0 to 1.0, with 0.0 as the default. @@ -112,6 +117,10 @@ Documentation is generated from header comments using appledoc. To build the doc - *firstColor*: The first and second colors specify what colors replace the dark and light areas of the image, respectively. The defaults are (0.0, 0.0, 0.5) amd (1.0, 0.0, 0.0). - *secondColor*: +- **GPUImageHazeFilter**: Used to add or remove haze (similar to a UV filter) + - *distance*: Strength of the color applied. Default 0. Values between -.3 and .3 are best. + - *slope*: Amount of color change. Default 0. Values between -.3 and .3 are best. + - **GPUImageSepiaFilter**: Simple sepia tone filter - *intensity*: The degree to which the sepia tone replaces the normal image color (0.0 - 1.0, with 1.0 as the default) @@ -164,9 +173,15 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageFastBlurFilter**: A hardware-accelerated 9-hit Gaussian blur of an image - *blurPasses*: The number of times to re-apply this blur on an image. More passes lead to a blurrier image, yet they require more processing power. The default is 1. +- **GPUImageSingleComponentFastBlurFilter**: A modification of the GPUImageFastBlurFilter to only operate on the red component + - *blurPasses*: The number of times to re-apply this blur on an image. More passes lead to a blurrier image, yet they require more processing power. The default is 1. + - **GPUImageGaussianBlurFilter**: A more generalized 9x9 Gaussian blur filter - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 +- **GPUImageSingleComponentGaussianBlurFilter**: A modification of the GPUImageGaussianBlurFilter that operates only on the red component + - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 + - **GPUImageGaussianSelectiveBlurFilter**: A Gaussian blur that preserves focus within a circular region - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 - *excludeCircleRadius*: The radius of the circular area being excluded from the blur @@ -174,6 +189,17 @@ Documentation is generated from header comments using appledoc. To build the doc - *excludeBlurSize*: The size of the area between the blurred portion and the clear circle - *aspectRatio*: The aspect ratio of the image, used to adjust the circularity of the in-focus region. By default, this matches the image aspect ratio, but you can override this value. +- **GPUImageGaussianBlurPositionFilter**: The inverse of the GPUImageGaussianSelectiveBlurFilter, applying the blur only within a certain circle + - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 + - *blurCenter*: Center for the blur, defaults to 0.5, 0.5 + - *blurRadius*: Radius for the blur, defaults to 1.0 + +- **GPUImageMedianFilter**: Takes the median value of the three color components, over a 3x3 area + +- **GPUImageBilateralFilter**: A bilateral blur, which tries to blur similar color values while preserving sharp edges + - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 4.0 + - *distanceNormalizationFactor*: A normalization factor for the distance between central color and sample color, with a default of 8.0. + - **GPUImageTiltShiftFilter**: A simulated tilt shift lens effect - *blurSize*: A multiplier for the size of the out-of-focus blur, ranging from 0.0 on up, with a default of 2.0 - *topFocusLevel*: The normalized location of the top of the in-focus area in the image, this value should be lower than bottomFocusLevel, default 0.4 @@ -189,6 +215,11 @@ Documentation is generated from header comments using appledoc. To build the doc - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges +- **GPUImageThresholdEdgeDetectionFilter**: Performs Sobel edge detection, but applies a threshold instead of giving gradual strength values + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges + - *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.8 as the default + - **GPUImageCannyEdgeDetectionFilter**: This uses the full Canny process to highlight one-pixel-wide edges - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges @@ -234,6 +265,8 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageRGBClosingFilter**: This is the same as the GPUImageClosingFilter, except that this acts on all color channels, not just the red channel. +- **GPUImageLocalBinaryPatternFilter**: This performs a comparison of intensity of the red channel of the 8 surrounding pixels and that of the central one, encoding the comparison results in a bit string that becomes this pixel intensity. The least-significant bit is the top-right comparison, going counterclockwise to end at the right comparison as the most significant bit. + - **GPUImageLowPassFilter**: This applies a low pass filter to incoming video frames. This basically accumulates a weighted rolling average of previous frames with the current ones as they come in. This can be used to denoise video, add motion blur, or be used to create a high pass filter. - *filterStrength*: This controls the degree by which the previous accumulated frames are blended with the current one. This ranges from 0.0 to 1.0, with a default of 0.5. @@ -243,6 +276,21 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageMotionDetector**: This is a motion detector based on a high-pass filter. You set the motionDetectionBlock and on every incoming frame it will give you the centroid of any detected movement in the scene (in normalized X,Y coordinates) as well as an intensity of motion for the scene. - *lowPassFilterStrength*: This controls the strength of the low pass filter used behind the scenes to establish the baseline that incoming frames are compared with. This ranges from 0.0 to 1.0, with a default of 0.5. +- **GPUImageHoughTransformLineDetector**: Detects lines in the image using a Hough transform into parallel coordinate space. This approach is based entirely on the PC lines process developed by the Graph@FIT research group at the Brno University of Technology and described in their publications: M. Dubská, J. Havel, and A. Herout. Real-Time Detection of Lines using Parallel Coordinates and OpenGL. Proceedings of SCCG 2011, Bratislava, SK, p. 7 (http://medusa.fit.vutbr.cz/public/data/papers/2011-SCCG-Dubska-Real-Time-Line-Detection-Using-PC-and-OpenGL.pdf) and M. Dubská, J. Havel, and A. Herout. PClines — Line detection using parallel coordinates. 2011 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), p. 1489- 1494 (http://medusa.fit.vutbr.cz/public/data/papers/2011-CVPR-Dubska-PClines.pdf). + - *edgeThreshold*: A threshold value for which a point is detected as belonging to an edge for determining lines. Default is 0.9. + - *lineDetectionThreshold*: A threshold value for which a local maximum is detected as belonging to a line in parallel coordinate space. Default is 0.20. + - *linesDetectedBlock*: This block is called on the detection of lines, usually on every processed frame. A C array containing normalized slopes and intercepts in m, b pairs (y=mx+b) is passed in, along with a count of the number of lines detected and the current timestamp of the video frame. + +- **GPUImageLineGenerator**: A helper class that generates lines which can overlay the scene. The color of these lines can be adjusted using -setLineColorRed:green:blue: + - *lineWidth*: The width of the lines, in pixels, with a default of 1.0. + +- **GPUImageMotionBlurFilter**: Applies a directional motion blur to an image + - *blurSize*: A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 + - *blurAngle*: The angular direction of the blur, in degrees. 0 degrees by default. + +- **GPUImageZoomBlurFilter**: Applies a directional motion blur to an image + - *blurSize*: A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 + - *blurCenter*: The normalized center of the blur. (0.5, 0.5) by default ### Blending modes ### @@ -257,6 +305,8 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageAddBlendFilter**: Applies an additive blend of two images +- **GPUImageSubtractBlendFilter**: Applies a subtractive blend of two images + - **GPUImageDivideBlendFilter**: Applies a division blend of two images - **GPUImageOverlayBlendFilter**: Applies an overlay blend of two images @@ -282,6 +332,30 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageAlphaBlendFilter**: Blends the second image over the first, based on the second's alpha channel - *mix*: The degree with which the second image overrides the first (0.0 - 1.0, with 1.0 as the default) +- **GPUImageSourceOverBlendFilter**: Applies a source over blend of two images + +- **GPUImageColorBurnBlendFilter**: Applies a color burn blend of two images + +- **GPUImageColorDodgeBlendFilter**: Applies a color dodge blend of two images + +- **GPUImageNormalBlendFilter**: Applies a normal blend of two images + +- **GPUImageColorBlendFilter**: Applies a color blend of two images + +- **GPUImageHueBlendFilter**: Applies a hue blend of two images + +- **GPUImageSaturationBlendFilter**: Applies a saturation blend of two images + +- **GPUImageLuminosityBlendFilter**: Applies a luminosity blend of two images + +- **GPUImageLinearBurnBlendFilter**: Applies a linear burn blend of two images + +- **GPUImagePoissonBlendFilter**: Applies a Poisson blend of two images + - *mix*: Mix ranges from 0.0 (only image 1) to 1.0 (only image 2 gradients), with 1.0 as the normal level + - *numIterations*: The number of times to propagate the gradients. Crank this up to 100 or even 1000 if you want to get anywhere near convergence. Yes, this will be slow. + +- **GPUImageMaskFilter**: Masks one image using another + ### Visual effects ### - **GPUImagePixellateFilter**: Applies a pixellation effect on an image or video @@ -306,6 +380,10 @@ Documentation is generated from header comments using appledoc. To build the doc - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges +- **GPUImageThresholdSketchFilter**: Same as the sketch filter, only the edges are thresholded instead of being grayscale + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges + - **GPUImageToonFilter**: This uses Sobel edge detection to place a black border around objects, and then it quantizes the colors present in the image to give a cartoon-like quality to the image. - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges @@ -343,6 +421,16 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageStretchDistortionFilter**: Creates a stretch distortion of the image - *center*: The center of the image (in normalized coordinates from 0 - 1.0) about which to distort, with a default of (0.5, 0.5) +- **GPUImageSphereRefractionFilter**: Simulates the refraction through a glass sphere + - *center*: The center about which to apply the distortion, with a default of (0.5, 0.5) + - *radius*: The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25 + - *refractiveIndex*: The index of refraction for the sphere, with a default of 0.71 + +- **GPUImageGlassSphereFilter**: Same as the GPUImageSphereRefractionFilter, only the image is not inverted and there's a little bit of frosting at the edges of the glass + - *center*: The center about which to apply the distortion, with a default of (0.5, 0.5) + - *radius*: The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25 + - *refractiveIndex*: The index of refraction for the sphere, with a default of 0.71 + - **GPUImageVignetteFilter**: Performs a vignetting effect, fading out the image at the edges - *x*: - *y*: The directional intensity of the vignetting, with a default of x = 0.75, y = 0.5 @@ -350,6 +438,26 @@ Documentation is generated from header comments using appledoc. To build the doc - **GPUImageKuwaharaFilter**: Kuwahara image abstraction, drawn from the work of Kyprianidis, et. al. in their publication "Anisotropic Kuwahara Filtering on the GPU" within the GPU Pro collection. This produces an oil-painting-like image, but it is extremely computationally expensive, so it can take seconds to render a frame on an iPad 2. This might be best used for still images. - *radius*: In integer specifying the number of pixels out from the center pixel to test when applying the filter, with a default of 4. A higher value creates a more abstracted image, but at the cost of much greater processing time. +- **GPUImageKuwaharaRadius3Filter**: A modified version of the Kuwahara filter, optimized to work over just a radius of three pixels + +- **GPUImagePerlinNoiseFilter**: Generates an image full of Perlin noise + - *colorStart*: + - *colorFinish*: The color range for the noise being generated + - *scale*: The scaling of the noise being generated + +- **GPUImageCGAColorspaceFilter**: Simulates the colorspace of a CGA monitor + +- **GPUImageMosaicFilter**: This filter takes an input tileset, the tiles must ascend in luminance. It looks at the input image and replaces each display tile with an input tile according to the luminance of that tile. The idea was to replicate the ASCII video filters seen in other apps, but the tileset can be anything. + - *inputTileSize*: + - *numTiles*: + - *displayTileSize*: + - *colorOn*: + +- **GPUImageJFAVoronoiFilter**: Generates a Voronoi map, for use in a later stage. + - *sizeInPixels*: Size of the individual elements + +- **GPUImageVoronoiConsumerFilter**: Takes in the Voronoi map, and uses that to filter an incoming image. + - *sizeInPixels*: Size of the individual elements You can also easily write your own custom filters using the C-like OpenGL Shading Language, as described below. diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index a843f51dc..f4ce80cbf 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -812,10 +812,14 @@ BCB6B86B1504234A0041703B /* GPUImageExclusionBlendFilter.m */, BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */, BCB6B86D1504234A0041703B /* GPUImageHardLightBlendFilter.m */, + BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */, + BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */, BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */, BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */, BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */, BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */, + 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */, + 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */, BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */, BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */, BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */, @@ -824,10 +828,6 @@ BC982C6D14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m */, BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */, BCB6B85515041A920041703B /* GPUImageScreenBlendFilter.m */, - BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */, - BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */, - 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */, - 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */, BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */, BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */, BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */, @@ -846,6 +846,8 @@ BC185E7916B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m */, 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */, 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */, + 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, + 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */, ); name = Blends; sourceTree = ""; @@ -873,8 +875,6 @@ BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */, BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */, BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */, - 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */, - 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */, BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */, BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */, BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */, @@ -983,6 +983,8 @@ BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */, BCB6B835150400030041703B /* GPUImageSharpenFilter.h */, BCB6B836150400030041703B /* GPUImageSharpenFilter.m */, + BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */, + BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */, BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */, BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */, BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */, @@ -1001,8 +1003,6 @@ BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */, BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */, BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */, - BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */, - BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */, BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */, BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */, BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */, From 3e48b2487a6c7283ec7f8375a793d61dfd97395b Mon Sep 17 00:00:00 2001 From: Pierre Rothmaler Date: Mon, 11 Mar 2013 16:17:00 +0100 Subject: [PATCH 345/695] prevent header files from being copied public --- framework/GPUImage.xcodeproj/project.pbxproj | 312 +++++++++---------- 1 file changed, 156 insertions(+), 156 deletions(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index f4ce80cbf..bb2dbc404 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -21,191 +21,191 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; settings = {ATTRIBUTES = (); }; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; - 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */; }; - 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; - 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097716B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m */; }; - 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; settings = {ATTRIBUTES = (); }; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; - 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; settings = {ATTRIBUTES = (); }; }; 6EE27494150E8FC60040DDB6 /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */; }; - 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; - 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; settings = {ATTRIBUTES = (); }; }; 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; - 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (); }; }; 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */; }; - 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; settings = {ATTRIBUTES = (); }; }; 96781B3515C39E80005FA0D7 /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */; }; - 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (); }; }; 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; - 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (); }; }; 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; - B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */; }; - B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; B80171FF16312800001C8D16 /* GPUImageSaturationBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */; }; - B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */; }; - B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (); }; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; - B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (); }; }; B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */; }; - BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */; }; - BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (); }; }; BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */; }; - BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */; }; - BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */; }; - BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */; }; - BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */; }; - BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0690D1157C2EBA009274F9 /* GPUImageRGBDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690CF157C2EBA009274F9 /* GPUImageRGBDilationFilter.m */; }; - BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0690D6157C31C9009274F9 /* GPUImageRGBErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D4157C31C9009274F9 /* GPUImageRGBErosionFilter.m */; }; - BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D8157C33B8009274F9 /* GPUImageRGBOpeningFilter.m */; }; - BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */; }; - BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; settings = {ATTRIBUTES = (); }; }; BC0690F8157C5075009274F9 /* GPUImageColorPackingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690F6157C5075009274F9 /* GPUImageColorPackingFilter.m */; }; - BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; settings = {ATTRIBUTES = (); }; }; BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; - BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BC185E7B16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7916B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m */; }; - BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; settings = {ATTRIBUTES = (); }; }; BC185E7F16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7D16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m */; }; - BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (); }; }; BC185E8316B866F000EA01AD /* GPUImagePixellatePositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E8116B866F000EA01AD /* GPUImagePixellatePositionFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; - BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (); }; }; BC1B715814F49DAA00ACA2AB /* GPUImageRawDataOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B715614F49DAA00ACA2AB /* GPUImageRawDataOutput.m */; }; - BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; settings = {ATTRIBUTES = (); }; }; BC1B717D14F566E200ACA2AB /* GPUImageSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */; }; - BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; settings = {ATTRIBUTES = (); }; }; BC1B718F14F56C1D00ACA2AB /* GPUImageSwirlFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B718D14F56C1D00ACA2AB /* GPUImageSwirlFilter.m */; }; - BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (); }; }; BC1B728214FB16AF00ACA2AB /* GPUImageMovieWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */; }; - BC245DC114DDBCF5009FE7EB /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC245DC114DDBCF5009FE7EB /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; settings = {ATTRIBUTES = (); }; }; + BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; settings = {ATTRIBUTES = (); }; }; BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; - BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (); }; }; BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */; }; - BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; settings = {ATTRIBUTES = (); }; }; BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */; }; - BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (); }; }; BC4D03D0160919AE00F64358 /* GPUImageHalftoneFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4D03CE160919AE00F64358 /* GPUImageHalftoneFilter.m */; }; - BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; - BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; settings = {ATTRIBUTES = (); }; }; BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D8291579779700CC9C1E /* GPUImageUIElement.m */; }; - BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; settings = {ATTRIBUTES = (); }; }; BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */; }; - BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (); }; }; BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */; }; - BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (); }; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; - BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (); }; }; BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */; }; - BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; settings = {ATTRIBUTES = (); }; }; BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */; }; - BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (); }; }; BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */; }; - BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; settings = {ATTRIBUTES = (); }; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; - BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; settings = {ATTRIBUTES = (); }; }; BC95C4091622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */; }; - BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982B5414F07F790001FF6F /* GPUImageColorInvertFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5014F07F790001FF6F /* GPUImageColorInvertFilter.m */; }; - BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982B5614F07F790001FF6F /* GPUImageSaturationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5214F07F790001FF6F /* GPUImageSaturationFilter.m */; }; - BC982B6714F092EF0001FF6F /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B6714F092EF0001FF6F /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982B6814F092EF0001FF6F /* GPUImageContrastFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B6614F092EF0001FF6F /* GPUImageContrastFilter.m */; }; - BC982B7914F098CC0001FF6F /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B7914F098CC0001FF6F /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982B7A14F098CC0001FF6F /* GPUImageBrightnessFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */; }; - BC982B7E14F09F980001FF6F /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B7E14F09F980001FF6F /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982B7F14F09F980001FF6F /* GPUImageGammaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7D14F09F980001FF6F /* GPUImageGammaFilter.m */; }; - BC982B9914F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B9914F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982B9A14F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */; }; - BC982BEB14F1CE600001FF6F /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982BEB14F1CE600001FF6F /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982BEC14F1CE600001FF6F /* GPUImageDissolveBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BE814F1CE600001FF6F /* GPUImageDissolveBlendFilter.m */; }; - BC982BED14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982BED14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982BEE14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BEA14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m */; }; - BC982C4714F29E580001FF6F /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C4714F29E580001FF6F /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982C4814F29E580001FF6F /* GPUImageKuwaharaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */; }; - BC982C6E14F33C2A0001FF6F /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C6E14F33C2A0001FF6F /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; settings = {ATTRIBUTES = (); }; }; BC982C6F14F33C2A0001FF6F /* GPUImageMovie.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */; }; - BC982C7014F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C7014F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982C7114F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6D14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m */; }; - BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982C8214F34F0C0001FF6F /* GPUImageDarkenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C7E14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.m */; }; - BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982C8414F34F0C0001FF6F /* GPUImageLightenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */; }; - BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; settings = {ATTRIBUTES = (); }; }; BC982CA014F35C2D0001FF6F /* GPUImageToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */; }; - BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; settings = {ATTRIBUTES = (); }; }; BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */; }; - BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; settings = {ATTRIBUTES = (); }; }; BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */; }; - BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (); }; }; BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */; }; - BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCA632821623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632801623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m */; }; - BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; settings = {ATTRIBUTES = (); }; }; BCA632871623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */; }; - BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; settings = {ATTRIBUTES = (); }; }; BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */; }; - BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; settings = {ATTRIBUTES = (); }; }; BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */; }; - BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCABED9115263CF20098A93E /* GPUImageStretchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */; }; - BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */; }; - BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */; }; - BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */; }; - BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; - BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */; }; - BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */; }; - BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */; }; - BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD4D1015718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */; }; - BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD4D1515718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */; }; - BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */; }; - BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; - BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */; }; - BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */; }; - BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */; }; - BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (); }; }; BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */; }; - BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; - BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; settings = {ATTRIBUTES = (); }; }; BCB5E75D14E2086300701302 /* GPUImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E75B14E2086300701302 /* GPUImageView.m */; }; - BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; settings = {ATTRIBUTES = (); }; }; BCB5E76614E208D700701302 /* GPUImageVideoCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */; }; - BCB5E76C14E20AD700701302 /* GPUImageOpenGLESContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageOpenGLESContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E76C14E20AD700701302 /* GPUImageOpenGLESContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageOpenGLESContext.h */; settings = {ATTRIBUTES = (); }; }; BCB5E76D14E20AD700701302 /* GPUImageOpenGLESContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageOpenGLESContext.m */; }; BCB5E76F14E20B8000701302 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E76E14E20B7F00701302 /* UIKit.framework */; }; BCB5E77114E20B8A00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77014E20B8A00701302 /* AVFoundation.framework */; }; @@ -213,92 +213,92 @@ BCB5E77514E20B9700701302 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77414E20B9700701302 /* OpenGLES.framework */; }; BCB5E77714E20BA800701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77614E20BA800701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Required, ); }; }; BCB5E77914E20BAF00701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77814E20BAF00701302 /* CoreMedia.framework */; }; - BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; settings = {ATTRIBUTES = (); }; }; BCB5E78014E22E4300701302 /* GPUImageOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E77E14E22E4200701302 /* GPUImageOutput.m */; }; - BCB5E79414E3275200701302 /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E79414E3275200701302 /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; settings = {ATTRIBUTES = (); }; }; BCB5E79514E3275200701302 /* GLProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E79314E3275200701302 /* GLProgram.m */; }; - BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB5E7C314E4B6D400701302 /* GPUImageSepiaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7C114E4B6D400701302 /* GPUImageSepiaFilter.m */; }; - BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; settings = {ATTRIBUTES = (); }; }; BCB5E7DB14E6003400701302 /* GPUImagePicture.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7D914E6003400701302 /* GPUImagePicture.m */; }; - BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B838150400030041703B /* GPUImageExposureFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B834150400030041703B /* GPUImageExposureFilter.m */; }; - BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B83A150400030041703B /* GPUImageSharpenFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B836150400030041703B /* GPUImageSharpenFilter.m */; }; - BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B85715041A920041703B /* GPUImageColorBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85115041A920041703B /* GPUImageColorBurnBlendFilter.m */; }; - BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B85915041A920041703B /* GPUImageColorDodgeBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85315041A920041703B /* GPUImageColorDodgeBlendFilter.m */; }; - BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B85B15041A920041703B /* GPUImageScreenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85515041A920041703B /* GPUImageScreenBlendFilter.m */; }; - BCB6B8701504234A0041703B /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8701504234A0041703B /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B8711504234A0041703B /* GPUImageDifferenceBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8691504234A0041703B /* GPUImageDifferenceBlendFilter.m */; }; - BCB6B8721504234A0041703B /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8721504234A0041703B /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B8731504234A0041703B /* GPUImageExclusionBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86B1504234A0041703B /* GPUImageExclusionBlendFilter.m */; }; - BCB6B8741504234A0041703B /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8741504234A0041703B /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B8751504234A0041703B /* GPUImageHardLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86D1504234A0041703B /* GPUImageHardLightBlendFilter.m */; }; - BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B8771504234A0041703B /* GPUImageSoftLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */; }; - BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; settings = {ATTRIBUTES = (); }; }; BCB6B8BC1505BF940041703B /* GPUImageTextureOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */; }; - BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; - BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; settings = {ATTRIBUTES = (); }; }; BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */; }; - BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; settings = {ATTRIBUTES = (); }; }; BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */; }; - BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */; }; - BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */; }; - BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */; }; - BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; settings = {ATTRIBUTES = (); }; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; - BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (); }; }; BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */; }; - BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */; settings = {ATTRIBUTES = (); }; }; BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF617916E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.m */; }; - BCBF617D16E4F69B00E2784A /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBF617D16E4F69B00E2784A /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; settings = {ATTRIBUTES = (); }; }; BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */; }; - BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC1E5A9151E74B20006EFA5 /* GPUImagePosterizeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5A7151E74B20006EFA5 /* GPUImagePosterizeFilter.m */; }; - BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; settings = {ATTRIBUTES = (); }; }; BCC1E5B9151E83700006EFA5 /* GPUImageFilterGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */; }; - BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC1E5C8151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */; }; - BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC1E5CD151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */; }; - BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC1E611152156620006EFA5 /* GPUImageUnsharpMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */; }; - BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC1E634152239090006EFA5 /* GPUImageBulgeDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E632152239090006EFA5 /* GPUImageBulgeDistortionFilter.m */; }; - BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC1E639152243630006EFA5 /* GPUImagePinchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E637152243620006EFA5 /* GPUImagePinchDistortionFilter.m */; }; - BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC1E66E152368130006EFA5 /* GPUImageCrosshatchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */; }; BCC1E67C152368840006EFA5 /* GPUImageCGAColorspaceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E67B152368840006EFA5 /* GPUImageCGAColorspaceFilter.m */; }; - BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */; }; - BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */; }; - BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC93A101501D1BF00958B26 /* GPUImageFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */; }; - BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC93A1F1501E42F00958B26 /* GPUImageTwoPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */; }; BCC93A301502A90F00958B26 /* GPUImageFilterPipeline.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D69488A1501F58200206FF8 /* GPUImageFilterPipeline.m */; }; BCC93A311502A91500958B26 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */; }; - BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC94ABB151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; settings = {ATTRIBUTES = (); }; }; + BCC94ABB151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC94ABC151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */; }; - BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; settings = {ATTRIBUTES = (); }; }; BCC94CFB15101EB3002F9BC5 /* GPUImageTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */; }; - BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */; }; - BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */; }; BCF1A33814DDB1EC00852800 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; BCF1A34614DDB1EC00852800 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A34514DDB1EC00852800 /* SenTestingKit.framework */; }; @@ -306,43 +306,43 @@ BCF1A34C14DDB1EC00852800 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33414DDB1EC00852800 /* libGPUImage.a */; }; BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1A35014DDB1EC00852800 /* InfoPlist.strings */; }; BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1A35414DDB1EC00852800 /* GPUImageTests.m */; }; - BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF1E54115669907006B155F /* GPUImageJFAVoronoiFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */; }; - BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */; }; - BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF1E54515669907006B155F /* GPUImageVoronoiConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoronoiConsumerFilter.m */; }; - BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */; }; - BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (); }; }; BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */; }; - BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; settings = {ATTRIBUTES = (); }; }; BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; - BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */; }; - BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */; }; - BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */; }; - BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */; }; - BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m */; }; - BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; - BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; - BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; - BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */; }; - BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; }; - BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (); }; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; - C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; C04C8D1815F8059F00449601 /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */; }; - C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (); }; }; C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; /* End PBXBuildFile section */ From 7d9391198e49ca12bf5eb630a3da1b09ae6ee375 Mon Sep 17 00:00:00 2001 From: Hailei Gu Date: Wed, 13 Mar 2013 15:27:30 +0800 Subject: [PATCH 346/695] Fix a issue that GPUImageMovie instance is retained by block object but not released. --- framework/Source/GPUImageMovie.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 8947afcd2..39d305da9 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -106,7 +106,10 @@ - (void)startProcessing previousActualFrameTime = CFAbsoluteTimeGetCurrent(); NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; - AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; + AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; + + GPUImageMovie __block *blockSelf = self; + [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ NSError *error = nil; AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; @@ -114,8 +117,9 @@ - (void)startProcessing { return; } - self.asset = inputAsset; - [self processAsset]; + blockSelf.asset = inputAsset; + [blockSelf processAsset]; + blockSelf = nil; }]; } From e1f1afa475222886b983d06c742bea28b38d4567 Mon Sep 17 00:00:00 2001 From: Hovig Devejian Date: Wed, 13 Mar 2013 22:07:12 -0700 Subject: [PATCH 347/695] fixed iOS 6.0 deprecation warning on dispatch_get_current_queue() --- framework/Source/GPUImageOpenGLESContext.h | 1 + framework/Source/GPUImageOpenGLESContext.m | 10 +++++++++- framework/Source/GPUImageOutput.m | 10 ++++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index a96ab96c6..5fab58215 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -16,6 +16,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k @property(readonly, nonatomic) dispatch_queue_t contextQueue; @property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram; ++ (void *)contextKey; + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; + (dispatch_queue_t)sharedOpenGLESQueue; + (void)useImageProcessingContext; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index 118532dfd..0572c18b3 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -16,19 +16,27 @@ @implementation GPUImageOpenGLESContext @synthesize currentShaderProgram = _currentShaderProgram; @synthesize contextQueue = _contextQueue; +static void *openGLESContextQueueKey; + - (id)init; { if (!(self = [super init])) { return nil; } - + + openGLESContextQueueKey = &openGLESContextQueueKey; _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); + dispatch_queue_set_specific(_contextQueue, openGLESContextQueueKey, (__bridge void *)self, NULL); shaderProgramCache = [[NSMutableDictionary alloc] init]; return self; } ++ (void *)contextKey { + return openGLESContextQueueKey; +} + // Based on Colin Wheeler's example here: http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; { diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 2a7d43c97..314b77ddb 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -19,11 +19,10 @@ void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue]; - if (dispatch_get_current_queue() == videoProcessingQueue) + if(dispatch_get_specific([GPUImageOpenGLESContext contextKey])) { block(); - } - else + }else { dispatch_sync(videoProcessingQueue, block); } @@ -33,11 +32,10 @@ void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue]; - if (dispatch_get_current_queue() == videoProcessingQueue) + if(dispatch_get_specific([GPUImageOpenGLESContext contextKey])) { block(); - } - else + }else { dispatch_async(videoProcessingQueue, block); } From 9ff1643bb2cbb769d1fcb4c3c80b8a8427127ee0 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 15 Mar 2013 09:07:50 -0500 Subject: [PATCH 348/695] Started adding FAST corner detector. --- framework/Source/GPUImageFASTCornerDetectionFilter.h | 11 +++++++++++ framework/Source/GPUImageFASTCornerDetectionFilter.m | 5 +++++ .../Source/GPUImageHarrisCornerDetectionFilter.m | 5 +++++ framework/Source/GPUImageHoughTransformLineDetector.m | 6 ++++-- 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 framework/Source/GPUImageFASTCornerDetectionFilter.h create mode 100644 framework/Source/GPUImageFASTCornerDetectionFilter.m diff --git a/framework/Source/GPUImageFASTCornerDetectionFilter.h b/framework/Source/GPUImageFASTCornerDetectionFilter.h new file mode 100644 index 000000000..b5c8b10d9 --- /dev/null +++ b/framework/Source/GPUImageFASTCornerDetectionFilter.h @@ -0,0 +1,11 @@ +#import + +@interface GPUImageFASTCornerDetectionFilter : GPUImageFilterGroup +{ +// Generate a lookup texture based on the bit patterns + +// Step 1: convert to monochrome if necessary +// Step 2: do a lookup at each pixel based on the Bresenham circle, encode comparison in two color components +// Step 3: do non-maximum suppression of close corner points +} +@end diff --git a/framework/Source/GPUImageFASTCornerDetectionFilter.m b/framework/Source/GPUImageFASTCornerDetectionFilter.m new file mode 100644 index 000000000..814029fb1 --- /dev/null +++ b/framework/Source/GPUImageFASTCornerDetectionFilter.m @@ -0,0 +1,5 @@ +#import "GPUImageFASTCornerDetectionFilter.h" + +@implementation GPUImageFASTCornerDetectionFilter + +@end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index e766d3f1a..7436ac766 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -225,6 +225,11 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; } } +- (BOOL)wantsMonochromeInput; +{ + return YES; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m index e701067f5..2667d4db7 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -191,8 +191,10 @@ - (void)extractLineParametersFromImageAtFrameTime:(CMTime)frameTime; } } -#pragma mark - -#pragma mark Accessors +- (BOOL)wantsMonochromeInput; +{ + return YES; +} #pragma mark - #pragma mark Accessors From 69ec0cc1cec4c9ad23a38543a05728fbf87cbb08 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 24 Mar 2013 13:48:07 -0500 Subject: [PATCH 349/695] Fixed the all the erosion and dilation filters after breaking them earlier. --- framework/Source/GPUImageTwoPassTextureSamplingFilter.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index 01a3dca07..7b96e83df 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -25,6 +25,9 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; }); + self.verticalTexelSpacing = 1.0; + self.horizontalTexelSpacing = 1.0; + return self; } From 5ab73bbde8789fba28e1912f4a3a558b7d9d5538 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 24 Mar 2013 15:27:51 -0500 Subject: [PATCH 350/695] Implemented a correction to the normal blend filter suggested by Ruochuan Du. --- framework/Source/GPUImageNormalBlendFilter.m | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m index b6aceefc9..d32f95404 100644 --- a/framework/Source/GPUImageNormalBlendFilter.m +++ b/framework/Source/GPUImageNormalBlendFilter.m @@ -30,14 +30,17 @@ void main() lowp vec4 outputColor; - outputColor.r = c1.r + c2.r * c2.a * (1.0 - c1.a); - - outputColor.g = c1.g + c2.g * c2.a * (1.0 - c1.a); - - outputColor.b = c1.b + c2.b * c2.a * (1.0 - c1.a); - - outputColor.a = c1.a + c2.a * (1.0 - c1.a); +// outputColor.r = c1.r + c2.r * c2.a * (1.0 - c1.a); +// outputColor.g = c1.g + c2.g * c2.a * (1.0 - c1.a); +// outputColor.b = c1.b + c2.b * c2.a * (1.0 - c1.a); +// outputColor.a = c1.a + c2.a * (1.0 - c1.a); + lowp float a = c1.a + c2.a * (1.0 - c1.a); + outputColor.r = (c1.r * c1.a + c2.r * c2.a * (1.0 - c1.a))/a; + outputColor.g = (c1.g * c1.a + c2.g * c2.a * (1.0 - c1.a))/a; + outputColor.b = (c1.b * c1.a + c2.b * c2.a * (1.0 - c1.a))/a; + outputColor.a = a; + gl_FragColor = outputColor; } ); From ed802f6d4c8749ab1f24ac9dc9665a8fe277c2ee Mon Sep 17 00:00:00 2001 From: Alex Burgel Date: Mon, 11 Feb 2013 14:47:24 -0500 Subject: [PATCH 351/695] Fix GPUImageTwoInputFilter to correctly reset itself --- framework/Source/GPUImageTwoInputFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 46e67cb89..38c5858e9 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -143,7 +143,7 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; if (textureIndex == 0) { filterSourceTexture = newInputTexture; - hasSetFirstTexture = YES; + hasSetFirstTexture = (newInputTexture != 0); } else { From f99ea618f224956aae7cb045fc79eb328fe73960 Mon Sep 17 00:00:00 2001 From: Alex Burgel Date: Fri, 29 Mar 2013 14:54:51 -0400 Subject: [PATCH 352/695] Remove weak reference when processing video to fix dealloc issue --- framework/Source/GPUImageVideoCamera.m | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) mode change 100755 => 100644 framework/Source/GPUImageVideoCamera.m diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m old mode 100755 new mode 100644 index 657ec1b07..d0f1140fd --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -811,7 +811,6 @@ - (CGFloat)averageFrameDurationDuringCapture; - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { - __unsafe_unretained GPUImageVideoCamera *weakSelf = self; if (captureOutput == audioOutput) { // if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) @@ -821,7 +820,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM CFRetain(sampleBuffer); runAsynchronouslyOnVideoProcessingQueue(^{ - [weakSelf processAudioSampleBuffer:sampleBuffer]; + [self processAudioSampleBuffer:sampleBuffer]; CFRelease(sampleBuffer); // dispatch_semaphore_signal(frameRenderingSemaphore); }); @@ -836,12 +835,12 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM CFRetain(sampleBuffer); runAsynchronouslyOnVideoProcessingQueue(^{ //Feature Detection Hook. - if (weakSelf.delegate) + if (self.delegate) { - [weakSelf.delegate willOutputSampleBuffer:sampleBuffer]; + [self.delegate willOutputSampleBuffer:sampleBuffer]; } - [weakSelf processVideoSampleBuffer:sampleBuffer]; + [self processVideoSampleBuffer:sampleBuffer]; CFRelease(sampleBuffer); dispatch_semaphore_signal(frameRenderingSemaphore); From 6d5b921133432cb5d0ecd205422899428f33fc82 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 18 Apr 2013 10:42:07 -0500 Subject: [PATCH 353/695] Applied karlvr's suggested fix for the Lanczos resampling filter's renderTarget crash, based on pull request #880. --- framework/Source/GPUImageLanczosResamplingFilter.m | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m index 24c6dd56f..77c286a7b 100644 --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -138,16 +138,7 @@ - (void)setFilterFBO; if (!filterFramebuffer) { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) - { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - } + [super createFilterFBOofSize:currentFBOSize]; [self setupFilterForSize:currentFBOSize]; } From 2090447fc5db2847a4c28c3929371004b770c878 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 18 Apr 2013 12:01:07 -0500 Subject: [PATCH 354/695] Added forceProcessingAtSizeRespectingAspectRatio: to GPUImageFilterGroup, per issue #870. --- framework/Source/GPUImageFilterGroup.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 1fbccc5e2..457c7accb 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -151,6 +151,14 @@ - (void)forceProcessingAtSize:(CGSize)frameSize; } } +- (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; +{ + for (GPUImageOutput *currentFilter in filters) + { + [currentFilter forceProcessingAtSizeRespectingAspectRatio:frameSize]; + } +} + - (CGSize)maximumOutputSize; { From 0a427a9e9a446ca6cf484b1c2c158122830cecbe Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 20 Apr 2013 21:59:40 -0500 Subject: [PATCH 355/695] Undid pull request #905, because it broke blends in many cases. --- framework/Source/GPUImageTwoInputFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 38c5858e9..46e67cb89 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -143,7 +143,7 @@ - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; if (textureIndex == 0) { filterSourceTexture = newInputTexture; - hasSetFirstTexture = (newInputTexture != 0); + hasSetFirstTexture = YES; } else { From 4a0952b145d4c6f86c56dd6467797bf67a47ba01 Mon Sep 17 00:00:00 2001 From: Alex Burgel Date: Sun, 21 Apr 2013 09:43:43 -0400 Subject: [PATCH 356/695] Fix filter resetting to ensure GPUImageTwoInputFilter is in good state --- framework/Source/GPUImageOutput.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 314b77ddb..902aec33d 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -177,8 +177,8 @@ - (void)removeTarget:(id)targetToRemove; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; runSynchronouslyOnVideoProcessingQueue(^{ - [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; + [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setTextureDelegate:nil atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; @@ -197,8 +197,8 @@ - (void)removeAllTargets; NSInteger indexOfObject = [targets indexOfObject:targetToRemove]; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; + [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setTextureDelegate:nil atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; } From e589bdc66eb9ed2e3e649b5eb16a54098aedb248 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 22 Apr 2013 22:45:30 -0500 Subject: [PATCH 357/695] Started Mac port, so restructuring things to support this. Mac test application somewhat functional. --- .../project.pbxproj | 391 ++ .../SimplePhotoFilter/SLSDocument.h | 13 + .../SimplePhotoFilter/SLSDocument.m | 75 + .../SimplePhotoFilter-Info.plist | 67 + .../SimplePhotoFilter-Prefix.pch | 7 + .../SimplePhotoFilter/en.lproj/Credits.rtf | 29 + .../en.lproj/InfoPlist.strings | 0 .../SimplePhotoFilter/en.lproj/MainMenu.xib | 4562 +++++++++++++++++ .../en.lproj/SLSDocument.xib | 486 ++ .../SimplePhotoFilter/main.m | 14 + .../BenchmarkSuite.xcodeproj/project.pbxproj | 50 +- .../BenchmarkSuite/41-picture-frame.png | Bin .../BenchmarkSuite/41-picture-frame@2x.png | Bin .../BenchmarkSuite/46-movie-2.png | Bin .../BenchmarkSuite/46-movie-2@2x.png | Bin .../BenchmarkSuite/86-camera.png | Bin .../BenchmarkSuite/86-camera@2x.png | Bin .../BenchmarkSuite/BenchmarkAppDelegate.h | 0 .../BenchmarkSuite/BenchmarkAppDelegate.m | 0 .../BenchmarkSuite/BenchmarkSuite-Info.plist | 0 .../BenchmarkSuite/BenchmarkSuite-Prefix.pch | 0 .../BenchmarkTableViewController.h | 0 .../BenchmarkTableViewController.m | 0 .../BenchmarkTableViewController.xib | 0 .../ImageFilteringBenchmarkController.h | 0 .../ImageFilteringBenchmarkController.m | 0 .../VideoFilteringBenchmarkController.h | 0 .../VideoFilteringBenchmarkController.m | 0 .../VideoFilteringDisplayController.h | 0 .../VideoFilteringDisplayController.m | 0 .../VideoFilteringDisplayController.xib | 0 .../en.lproj/InfoPlist.strings | 0 .../BenchmarkSuite/BenchmarkSuite/main.m | 0 .../BenchmarkSuite/GlyphishIconLicense.txt | 0 .../project.pbxproj | 48 +- .../ColorObjectTracking-Info.plist | 0 .../ColorObjectTracking-Prefix.pch | 0 .../ColorTrackingAppDelegate.h | 0 .../ColorTrackingAppDelegate.m | 0 .../ColorTrackingViewController.h | 0 .../ColorTrackingViewController.m | 2 +- .../ColorObjectTracking/PositionColor.fsh | 0 .../ColorObjectTracking/Threshold.fsh | 0 .../en.lproj/InfoPlist.strings | 0 .../ColorObjectTracking/main.m | 0 .../Classes/CubeExampleAppDelegate.h | 0 .../Classes/CubeExampleAppDelegate.m | 0 .../Classes/DisplayViewController.h | 0 .../Classes/DisplayViewController.m | 0 .../CubeExample/Classes/ES2Renderer.h | 0 .../CubeExample/Classes/ES2Renderer.m | 2 +- .../CubeExample/Classes/ESRenderer.h | 0 .../CubeExample/CubeExample-Info.plist | 0 .../CubeExample.xcodeproj/project.pbxproj | 38 +- .../CubeExample/CubeExample_Prefix.pch | 0 .../{ => iOS}/CubeExample/Shaders/Shader.fsh | 0 .../{ => iOS}/CubeExample/Shaders/Shader.vsh | 0 examples/{ => iOS}/CubeExample/main.m | 0 .../project.pbxproj | 38 +- .../FeatureExtractionTest/71yih.png | Bin .../FeatureExtractionTest/8pixeltest.png | Bin .../FeatureExtractionTest/ChairTest.png | Bin .../FeatureExtractionAppDelegate.h | 0 .../FeatureExtractionAppDelegate.m | 0 .../FeatureExtractionTest-Info.plist | 0 .../FeatureExtractionTest-Prefix.pch | 0 .../FeatureExtractionTest/LBPTest.png | Bin .../FeatureExtractionTest/LineTest.png | Bin .../FeatureExtractionTest/LineTest2.png | Bin .../en.lproj/InfoPlist.strings | 0 .../FeatureExtractionTest/main.m | 0 .../FilterShowcase.xcodeproj/project.pbxproj | 46 +- .../FilterShowcase/CustomFilter.fsh | 0 .../FilterShowcase/FilterShowcase-Info.plist | 0 .../FilterShowcase/FilterShowcase-Prefix.pch | 0 .../FilterShowcase/SampleConfiguration.plist | 0 .../FilterShowcase/ShowcaseAppDelegate.h | 0 .../FilterShowcase/ShowcaseAppDelegate.m | 0 .../ShowcaseFilterListController.h | 0 .../ShowcaseFilterListController.m | 2 +- .../ShowcaseFilterViewController.h | 0 .../ShowcaseFilterViewController.m | 2 +- .../ShowcaseFilterViewController.xib | 0 .../FilterShowcase/FilterShowcase/curvies.png | Bin .../FilterShowcase/dotletterstiles.png | Bin .../en.lproj/InfoPlist.strings | 0 .../FilterShowcase/FilterShowcase/main.m | 0 .../FilterShowcase/FilterShowcase/mask.png | Bin .../FilterShowcase/FilterShowcase/squares.png | Bin .../FilterShowcase/voroni_points2.png | Bin .../project.pbxproj | 38 +- .../MultiViewAppDelegate.h | 0 .../MultiViewAppDelegate.m | 0 .../MultiViewFilterExample-Info.plist | 0 .../MultiViewFilterExample-Prefix.pch | 0 .../MultiViewViewController.h | 0 .../MultiViewViewController.m | 0 .../MultiViewFilterExample/Shader1.fsh | 0 .../MultiViewFilterExample/Shader2.fsh | 0 .../en.lproj/InfoPlist.strings | 0 .../MultiViewFilterExample/main.m | 0 .../RawDataTest.xcodeproj/project.pbxproj | 42 +- .../RawDataTest/CalculationShader.fsh | 0 .../RawDataTest/RawDataTest-Info.plist | 0 .../RawDataTest/RawDataTest-Prefix.pch | 0 .../RawDataTest/RawDataTestAppDelegate.h | 0 .../RawDataTest/RawDataTestAppDelegate.m | 0 .../RawDataTest}/en.lproj/InfoPlist.strings | 0 .../{ => iOS}/RawDataTest/RawDataTest/main.m | 0 examples/{ => iOS}/SharedIcons/Icon-72.png | Bin examples/{ => iOS}/SharedIcons/Icon-72@2x.png | Bin .../{ => iOS}/SharedIcons/Icon-Small-50.png | Bin .../SharedIcons/Icon-Small-50@2x.png | Bin examples/{ => iOS}/SharedIcons/Icon-Small.png | Bin .../{ => iOS}/SharedIcons/Icon-Small@2x.png | Bin examples/{ => iOS}/SharedIcons/Icon.png | Bin examples/{ => iOS}/SharedIcons/Icon@2x.png | Bin .../{ => iOS}/SharedIcons/iTunesArtwork.png | Bin .../project.pbxproj | 38 +- .../SimpleImageFilter/Lambeau.jpg | Bin .../SimpleImageAppDelegate.h | 0 .../SimpleImageAppDelegate.m | 0 .../SimpleImageFilter-Info.plist | 0 .../SimpleImageFilter-Prefix.pch | 0 .../SimpleImageViewController.h | 0 .../SimpleImageViewController.m | 0 .../SimpleImageFilter/WID-small.jpg | Bin .../en.lproj/InfoPlist.strings | 0 .../SimpleImageFilter/main.m | 0 .../project.pbxproj | 38 +- .../SimplePhotoFilter/PhotoAppDelegate.h | 0 .../SimplePhotoFilter/PhotoAppDelegate.m | 0 .../SimplePhotoFilter/PhotoViewController.h | 0 .../SimplePhotoFilter/PhotoViewController.m | 0 .../SimplePhotoFilter-Info.plist | 0 .../SimplePhotoFilter-Prefix.pch | 0 .../en.lproj/InfoPlist.strings | 0 .../SimplePhotoFilter/main.m | 0 .../project.pbxproj | 38 +- .../SimpleVideoFileFilter-Info.plist | 0 .../SimpleVideoFileFilter-Prefix.pch | 0 .../SimpleVideoFileFilterAppDelegate.h | 0 .../SimpleVideoFileFilterAppDelegate.m | 0 .../SimpleVideoFileFilterViewController.h | 0 .../SimpleVideoFileFilterViewController.m | 0 .../SimpleVideoFileFilterViewController.xib | 0 .../SimpleVideoFileFilter/WID-small.jpg | Bin .../en.lproj/InfoPlist.strings | 0 .../SimpleVideoFileFilter/main.m | 0 .../SimpleVideoFileFilter/sample_iPod.m4v | Bin .../project.pbxproj | 38 +- .../SimpleVideoFilter-Info.plist | 0 .../SimpleVideoFilter-Prefix.pch | 0 .../SimpleVideoFilterAppDelegate.h | 0 .../SimpleVideoFilterAppDelegate.m | 0 .../SimpleVideoFilterViewController.h | 0 .../SimpleVideoFilterViewController.m | 0 .../SimpleVideoFilterViewController.xib | 0 .../en.lproj/InfoPlist.strings | 2 + .../SimpleVideoFilter/main.m | 0 framework/GPUImage.xcodeproj/project.pbxproj | 42 +- .../GPUImageMac.xcodeproj/project.pbxproj | 387 ++ framework/Source/GLProgram.h | 5 + framework/Source/GLProgram.m | 4 +- framework/Source/GPUImage.h | 2 +- .../Source/GPUImage3x3TextureSamplingFilter.m | 2 +- framework/Source/GPUImageAverageColor.m | 10 +- framework/Source/GPUImageBrightnessFilter.m | 17 + framework/Source/GPUImageBuffer.m | 2 +- framework/Source/GPUImageColorPackingFilter.m | 2 +- framework/Source/GPUImageCrosshairGenerator.m | 2 +- ...geDirectionalNonMaximumSuppressionFilter.m | 2 +- framework/Source/GPUImageFilter.h | 6 +- framework/Source/GPUImageFilter.m | 104 +- framework/Source/GPUImageGrayscaleFilter.m | 2 +- framework/Source/GPUImageHistogramFilter.m | 20 +- framework/Source/GPUImageJFAVoronoiFilter.m | 12 +- framework/Source/GPUImageLineGenerator.m | 4 +- framework/Source/GPUImageLuminosity.m | 10 +- framework/Source/GPUImageMovie.h | 2 +- framework/Source/GPUImageMovie.m | 14 +- framework/Source/GPUImageOutput.h | 46 +- framework/Source/GPUImageOutput.m | 131 +- ...ageParallelCoordinateLineTransformFilter.m | 4 +- framework/Source/GPUImagePoissonBlendFilter.m | 26 +- framework/Source/GPUImageRawDataInput.m | 2 +- framework/Source/GPUImageRawDataOutput.h | 2 +- framework/Source/GPUImageRawDataOutput.m | 34 +- framework/Source/GPUImageSharpenFilter.m | 2 +- framework/Source/GPUImageStillCamera.m | 10 +- framework/Source/GPUImageTextureInput.m | 2 +- framework/Source/GPUImageTextureOutput.h | 2 +- framework/Source/GPUImageToneCurveFilter.m | 4 +- ...UImageTwoInputCrossTextureSamplingFilter.m | 2 +- framework/Source/GPUImageTwoInputFilter.m | 4 +- framework/Source/GPUImageTwoPassFilter.m | 34 +- .../GPUImageTwoPassTextureSamplingFilter.m | 2 +- framework/Source/GPUImageUIElement.m | 2 +- framework/Source/GPUImageVideoCamera.h | 2 +- framework/Source/GPUImageVideoCamera.m | 42 +- framework/Source/Mac/GPUImage.h | 17 + framework/Source/Mac/GPUImageContext.h | 59 + framework/Source/Mac/GPUImageContext.m | 228 + framework/Source/Mac/GPUImageMac-Info.plist | 30 + framework/Source/Mac/GPUImageMac-Prefix.pch | 7 + framework/Source/Mac/GPUImageMovieWriter.h | 59 + framework/Source/Mac/GPUImageMovieWriter.m | 627 +++ framework/Source/Mac/GPUImagePicture.h | 23 + framework/Source/Mac/GPUImagePicture.m | 233 + framework/Source/Mac/GPUImageView.h | 40 + framework/Source/Mac/GPUImageView.m | 419 ++ .../Source/Mac/en.lproj/InfoPlist.strings | 2 + .../Source/{ => iOS}/GPUImage-Prefix.pch | 0 .../GPUImageContext.h} | 8 +- .../GPUImageContext.m} | 26 +- .../Source/{ => iOS}/GPUImageMovieWriter.h | 2 +- .../Source/{ => iOS}/GPUImageMovieWriter.m | 36 +- framework/Source/{ => iOS}/GPUImagePicture.h | 0 framework/Source/{ => iOS}/GPUImagePicture.m | 6 +- framework/Source/{ => iOS}/GPUImageView.h | 2 +- framework/Source/{ => iOS}/GPUImageView.m | 18 +- 221 files changed, 8399 insertions(+), 553 deletions(-) create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.h create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/Credits.rtf rename examples/{BenchmarkSuite/BenchmarkSuite => Mac/SimplePhotoFilter/SimplePhotoFilter}/en.lproj/InfoPlist.strings (100%) mode change 100755 => 100644 create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/MainMenu.xib create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter/main.m rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj (95%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/41-picture-frame@2x.png (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/46-movie-2.png (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/46-movie-2@2x.png (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/86-camera.png (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/86-camera@2x.png (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib (100%) rename examples/{ColorObjectTracking/ColorObjectTracking => iOS/BenchmarkSuite/BenchmarkSuite}/en.lproj/InfoPlist.strings (100%) rename examples/{ => iOS}/BenchmarkSuite/BenchmarkSuite/main.m (100%) rename examples/{ => iOS}/BenchmarkSuite/GlyphishIconLicense.txt (100%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj (94%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist (100%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Prefix.pch (100%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.h (100%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.m (100%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h (100%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m (99%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/PositionColor.fsh (100%) rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/Threshold.fsh (100%) rename examples/{FeatureExtractionTest/FeatureExtractionTest => iOS/ColorObjectTracking/ColorObjectTracking}/en.lproj/InfoPlist.strings (100%) mode change 100644 => 100755 rename examples/{ => iOS}/ColorObjectTracking/ColorObjectTracking/main.m (100%) rename examples/{ => iOS}/CubeExample/Classes/CubeExampleAppDelegate.h (100%) rename examples/{ => iOS}/CubeExample/Classes/CubeExampleAppDelegate.m (100%) rename examples/{ => iOS}/CubeExample/Classes/DisplayViewController.h (100%) rename examples/{ => iOS}/CubeExample/Classes/DisplayViewController.m (100%) rename examples/{ => iOS}/CubeExample/Classes/ES2Renderer.h (100%) rename examples/{ => iOS}/CubeExample/Classes/ES2Renderer.m (99%) rename examples/{ => iOS}/CubeExample/Classes/ESRenderer.h (100%) rename examples/{ => iOS}/CubeExample/CubeExample-Info.plist (100%) rename examples/{ => iOS}/CubeExample/CubeExample.xcodeproj/project.pbxproj (94%) rename examples/{ => iOS}/CubeExample/CubeExample_Prefix.pch (100%) rename examples/{ => iOS}/CubeExample/Shaders/Shader.fsh (100%) rename examples/{ => iOS}/CubeExample/Shaders/Shader.vsh (100%) rename examples/{ => iOS}/CubeExample/main.m (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj (94%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/71yih.png (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/8pixeltest.png (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/ChairTest.png (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/LBPTest.png (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/LineTest.png (100%) rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/LineTest2.png (100%) rename examples/{FilterShowcase/FilterShowcase => iOS/FeatureExtractionTest/FeatureExtractionTest}/en.lproj/InfoPlist.strings (100%) mode change 100755 => 100644 rename examples/{ => iOS}/FeatureExtractionTest/FeatureExtractionTest/main.m (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj (93%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/CustomFilter.fsh (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/SampleConfiguration.plist (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m (99%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m (99%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/curvies.png (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/dotletterstiles.png (100%) rename examples/{MultiViewFilterExample/MultiViewFilterExample => iOS/FilterShowcase/FilterShowcase}/en.lproj/InfoPlist.strings (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/main.m (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/mask.png (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/squares.png (100%) rename examples/{ => iOS}/FilterShowcase/FilterShowcase/voroni_points2.png (100%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj (94%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.h (100%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m (100%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist (100%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch (100%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.h (100%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m (100%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh (100%) rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh (100%) rename examples/{RawDataTest/RawDataTest => iOS/MultiViewFilterExample/MultiViewFilterExample}/en.lproj/InfoPlist.strings (100%) mode change 100644 => 100755 rename examples/{ => iOS}/MultiViewFilterExample/MultiViewFilterExample/main.m (100%) rename examples/{ => iOS}/RawDataTest/RawDataTest.xcodeproj/project.pbxproj (93%) rename examples/{ => iOS}/RawDataTest/RawDataTest/CalculationShader.fsh (100%) rename examples/{ => iOS}/RawDataTest/RawDataTest/RawDataTest-Info.plist (100%) rename examples/{ => iOS}/RawDataTest/RawDataTest/RawDataTest-Prefix.pch (100%) rename examples/{ => iOS}/RawDataTest/RawDataTest/RawDataTestAppDelegate.h (100%) rename examples/{ => iOS}/RawDataTest/RawDataTest/RawDataTestAppDelegate.m (100%) rename examples/{SimpleImageFilter/SimpleImageFilter => iOS/RawDataTest/RawDataTest}/en.lproj/InfoPlist.strings (100%) mode change 100755 => 100644 rename examples/{ => iOS}/RawDataTest/RawDataTest/main.m (100%) rename examples/{ => iOS}/SharedIcons/Icon-72.png (100%) rename examples/{ => iOS}/SharedIcons/Icon-72@2x.png (100%) rename examples/{ => iOS}/SharedIcons/Icon-Small-50.png (100%) rename examples/{ => iOS}/SharedIcons/Icon-Small-50@2x.png (100%) rename examples/{ => iOS}/SharedIcons/Icon-Small.png (100%) rename examples/{ => iOS}/SharedIcons/Icon-Small@2x.png (100%) rename examples/{ => iOS}/SharedIcons/Icon.png (100%) rename examples/{ => iOS}/SharedIcons/Icon@2x.png (100%) rename examples/{ => iOS}/SharedIcons/iTunesArtwork.png (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj (93%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.h (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.m (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Prefix.pch (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/WID-small.jpg (100%) rename examples/{SimplePhotoFilter/SimplePhotoFilter => iOS/SimpleImageFilter/SimpleImageFilter}/en.lproj/InfoPlist.strings (100%) rename examples/{ => iOS}/SimpleImageFilter/SimpleImageFilter/main.m (100%) rename examples/{ => iOS}/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj (93%) rename examples/{ => iOS}/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.h (100%) rename examples/{ => iOS}/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.m (100%) rename examples/{ => iOS}/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h (100%) rename examples/{ => iOS}/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m (100%) rename examples/{ => iOS}/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist (100%) rename examples/{ => iOS}/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch (100%) rename examples/{SimpleVideoFileFilter/SimpleVideoFileFilter => iOS/SimplePhotoFilter/SimplePhotoFilter}/en.lproj/InfoPlist.strings (100%) rename examples/{ => iOS}/SimplePhotoFilter/SimplePhotoFilter/main.m (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj (94%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Prefix.pch (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.h (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.m (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/WID-small.jpg (100%) rename examples/{SimpleVideoFilter/SimpleVideoFilter => iOS/SimpleVideoFileFilter/SimpleVideoFileFilter}/en.lproj/InfoPlist.strings (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/main.m (100%) rename examples/{ => iOS}/SimpleVideoFileFilter/SimpleVideoFileFilter/sample_iPod.m4v (100%) rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj (93%) rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist (100%) rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Prefix.pch (100%) rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.h (100%) rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m (100%) rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h (100%) rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m (100%) rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib (100%) create mode 100755 examples/iOS/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings rename examples/{ => iOS}/SimpleVideoFilter/SimpleVideoFilter/main.m (100%) create mode 100644 framework/GPUImageMac.xcodeproj/project.pbxproj create mode 100755 framework/Source/Mac/GPUImage.h create mode 100755 framework/Source/Mac/GPUImageContext.h create mode 100755 framework/Source/Mac/GPUImageContext.m create mode 100644 framework/Source/Mac/GPUImageMac-Info.plist create mode 100644 framework/Source/Mac/GPUImageMac-Prefix.pch create mode 100755 framework/Source/Mac/GPUImageMovieWriter.h create mode 100755 framework/Source/Mac/GPUImageMovieWriter.m create mode 100755 framework/Source/Mac/GPUImagePicture.h create mode 100755 framework/Source/Mac/GPUImagePicture.m create mode 100755 framework/Source/Mac/GPUImageView.h create mode 100755 framework/Source/Mac/GPUImageView.m create mode 100644 framework/Source/Mac/en.lproj/InfoPlist.strings rename framework/Source/{ => iOS}/GPUImage-Prefix.pch (100%) rename framework/Source/{GPUImageOpenGLESContext.h => iOS/GPUImageContext.h} (93%) rename framework/Source/{GPUImageOpenGLESContext.m => iOS/GPUImageContext.m} (85%) rename framework/Source/{ => iOS}/GPUImageMovieWriter.h (98%) rename framework/Source/{ => iOS}/GPUImageMovieWriter.m (93%) rename framework/Source/{ => iOS}/GPUImagePicture.h (100%) rename framework/Source/{ => iOS}/GPUImagePicture.m (97%) rename framework/Source/{ => iOS}/GPUImageView.h (97%) rename framework/Source/{ => iOS}/GPUImageView.m (94%) diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj new file mode 100644 index 000000000..9f5dcfd06 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -0,0 +1,391 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BCA3F3411723A2E800E28AEC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3401723A2E800E28AEC /* Cocoa.framework */; }; + BCA3F34D1723A2E800E28AEC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA3F34C1723A2E800E28AEC /* main.m */; }; + BCA3F3511723A2E800E28AEC /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = BCA3F34F1723A2E800E28AEC /* Credits.rtf */; }; + BCA3F3541723A2E800E28AEC /* SLSDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA3F3531723A2E800E28AEC /* SLSDocument.m */; }; + BCA3F3571723A2E800E28AEC /* SLSDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA3F3551723A2E800E28AEC /* SLSDocument.xib */; }; + BCA3F35A1723A2E800E28AEC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA3F3581723A2E800E28AEC /* MainMenu.xib */; }; + BCF40F331724A083005AE36A /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF40F3017249F6F005AE36A /* GPUImage.framework */; }; + BCF40F351724AFA0005AE36A /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BCF40F3017249F6F005AE36A /* GPUImage.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BCF40F2F17249F6F005AE36A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF40F2B17249F6F005AE36A /* GPUImageMac.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCA3F31C17239B6500E28AEC; + remoteInfo = GPUImage; + }; + BCF40F311724A042005AE36A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF40F2B17249F6F005AE36A /* GPUImageMac.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BCA3F31B17239B6500E28AEC; + remoteInfo = GPUImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + BCF40F341724AF95005AE36A /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BCF40F351724AFA0005AE36A /* GPUImage.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + BCA3F33D1723A2E800E28AEC /* SimplePhotoFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimplePhotoFilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BCA3F3401723A2E800E28AEC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + BCA3F3431723A2E800E28AEC /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + BCA3F3441723A2E800E28AEC /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + BCA3F3451723A2E800E28AEC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + BCA3F3481723A2E800E28AEC /* SimplePhotoFilter-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SimplePhotoFilter-Info.plist"; sourceTree = ""; }; + BCA3F34A1723A2E800E28AEC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + BCA3F34C1723A2E800E28AEC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + BCA3F34E1723A2E800E28AEC /* SimplePhotoFilter-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimplePhotoFilter-Prefix.pch"; sourceTree = ""; }; + BCA3F3501723A2E800E28AEC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + BCA3F3521723A2E800E28AEC /* SLSDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SLSDocument.h; sourceTree = ""; }; + BCA3F3531723A2E800E28AEC /* SLSDocument.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SLSDocument.m; sourceTree = ""; }; + BCA3F3561723A2E800E28AEC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/SLSDocument.xib; sourceTree = ""; }; + BCA3F3591723A2E800E28AEC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + BCF40F2B17249F6F005AE36A /* GPUImageMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImageMac.xcodeproj; path = ../../../framework/GPUImageMac.xcodeproj; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BCA3F33A1723A2E800E28AEC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF40F331724A083005AE36A /* GPUImage.framework in Frameworks */, + BCA3F3411723A2E800E28AEC /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BCA3F3341723A2E800E28AEC = { + isa = PBXGroup; + children = ( + BCA3F3461723A2E800E28AEC /* SimplePhotoFilter */, + BCA3F33F1723A2E800E28AEC /* Frameworks */, + BCA3F33E1723A2E800E28AEC /* Products */, + ); + sourceTree = ""; + }; + BCA3F33E1723A2E800E28AEC /* Products */ = { + isa = PBXGroup; + children = ( + BCA3F33D1723A2E800E28AEC /* SimplePhotoFilter.app */, + ); + name = Products; + sourceTree = ""; + }; + BCA3F33F1723A2E800E28AEC /* Frameworks */ = { + isa = PBXGroup; + children = ( + BCF40F2B17249F6F005AE36A /* GPUImageMac.xcodeproj */, + BCA3F3401723A2E800E28AEC /* Cocoa.framework */, + BCA3F3421723A2E800E28AEC /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + BCA3F3421723A2E800E28AEC /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + BCA3F3431723A2E800E28AEC /* AppKit.framework */, + BCA3F3441723A2E800E28AEC /* CoreData.framework */, + BCA3F3451723A2E800E28AEC /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + BCA3F3461723A2E800E28AEC /* SimplePhotoFilter */ = { + isa = PBXGroup; + children = ( + BCA3F3521723A2E800E28AEC /* SLSDocument.h */, + BCA3F3531723A2E800E28AEC /* SLSDocument.m */, + BCA3F3551723A2E800E28AEC /* SLSDocument.xib */, + BCA3F3581723A2E800E28AEC /* MainMenu.xib */, + BCA3F3471723A2E800E28AEC /* Supporting Files */, + ); + path = SimplePhotoFilter; + sourceTree = ""; + }; + BCA3F3471723A2E800E28AEC /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BCA3F3481723A2E800E28AEC /* SimplePhotoFilter-Info.plist */, + BCA3F3491723A2E800E28AEC /* InfoPlist.strings */, + BCA3F34C1723A2E800E28AEC /* main.m */, + BCA3F34E1723A2E800E28AEC /* SimplePhotoFilter-Prefix.pch */, + BCA3F34F1723A2E800E28AEC /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BCF40F2C17249F6F005AE36A /* Products */ = { + isa = PBXGroup; + children = ( + BCF40F3017249F6F005AE36A /* GPUImage.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BCA3F33C1723A2E800E28AEC /* SimplePhotoFilter */ = { + isa = PBXNativeTarget; + buildConfigurationList = BCA3F35D1723A2E800E28AEC /* Build configuration list for PBXNativeTarget "SimplePhotoFilter" */; + buildPhases = ( + BCA3F3391723A2E800E28AEC /* Sources */, + BCF40F341724AF95005AE36A /* CopyFiles */, + BCA3F33A1723A2E800E28AEC /* Frameworks */, + BCA3F33B1723A2E800E28AEC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BCF40F321724A042005AE36A /* PBXTargetDependency */, + ); + name = SimplePhotoFilter; + productName = SimplePhotoFilter; + productReference = BCA3F33D1723A2E800E28AEC /* SimplePhotoFilter.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BCA3F3351723A2E800E28AEC /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = SLS; + LastUpgradeCheck = 0460; + ORGANIZATIONNAME = "Sunset Lake Software LLC"; + }; + buildConfigurationList = BCA3F3381723A2E800E28AEC /* Build configuration list for PBXProject "SimplePhotoFilter" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = BCA3F3341723A2E800E28AEC; + productRefGroup = BCA3F33E1723A2E800E28AEC /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BCF40F2C17249F6F005AE36A /* Products */; + ProjectRef = BCF40F2B17249F6F005AE36A /* GPUImageMac.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + BCA3F33C1723A2E800E28AEC /* SimplePhotoFilter */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + BCF40F3017249F6F005AE36A /* GPUImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = GPUImage.framework; + remoteRef = BCF40F2F17249F6F005AE36A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + BCA3F33B1723A2E800E28AEC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCA3F3511723A2E800E28AEC /* Credits.rtf in Resources */, + BCA3F3571723A2E800E28AEC /* SLSDocument.xib in Resources */, + BCA3F35A1723A2E800E28AEC /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BCA3F3391723A2E800E28AEC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCA3F34D1723A2E800E28AEC /* main.m in Sources */, + BCA3F3541723A2E800E28AEC /* SLSDocument.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BCF40F321724A042005AE36A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GPUImage; + targetProxy = BCF40F311724A042005AE36A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + BCA3F3491723A2E800E28AEC /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + BCA3F34A1723A2E800E28AEC /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + BCA3F34F1723A2E800E28AEC /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + BCA3F3501723A2E800E28AEC /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + BCA3F3551723A2E800E28AEC /* SLSDocument.xib */ = { + isa = PBXVariantGroup; + children = ( + BCA3F3561723A2E800E28AEC /* en */, + ); + name = SLSDocument.xib; + sourceTree = ""; + }; + BCA3F3581723A2E800E28AEC /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + BCA3F3591723A2E800E28AEC /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BCA3F35B1723A2E800E28AEC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + BCA3F35C1723A2E800E28AEC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + SDKROOT = macosx; + }; + name = Release; + }; + BCA3F35E1723A2E800E28AEC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "SimplePhotoFilter/SimplePhotoFilter-Prefix.pch"; + INFOPLIST_FILE = "SimplePhotoFilter/SimplePhotoFilter-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + BCA3F35F1723A2E800E28AEC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "SimplePhotoFilter/SimplePhotoFilter-Prefix.pch"; + INFOPLIST_FILE = "SimplePhotoFilter/SimplePhotoFilter-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BCA3F3381723A2E800E28AEC /* Build configuration list for PBXProject "SimplePhotoFilter" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCA3F35B1723A2E800E28AEC /* Debug */, + BCA3F35C1723A2E800E28AEC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BCA3F35D1723A2E800E28AEC /* Build configuration list for PBXNativeTarget "SimplePhotoFilter" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCA3F35E1723A2E800E28AEC /* Debug */, + BCA3F35F1723A2E800E28AEC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BCA3F3351723A2E800E28AEC /* Project object */; +} diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.h b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.h new file mode 100644 index 000000000..8bf8ed915 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.h @@ -0,0 +1,13 @@ +#import +#import + +@interface SLSDocument : NSDocument +{ + GPUImagePicture *inputPicture; + GPUImageFilter *imageFilter; +} + +@property(readwrite, weak) IBOutlet GPUImageView *imageView; +@property(readwrite, nonatomic) CGFloat sliderSetting; + +@end diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m new file mode 100644 index 000000000..07c445ee6 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m @@ -0,0 +1,75 @@ +#import "SLSDocument.h" + +@implementation SLSDocument + +@synthesize imageView = _imageView; +@synthesize sliderSetting = _sliderSetting; + +- (id)init +{ + self = [super init]; + if (self) { + // Add your subclass-specific initialization here. + } + return self; +} + +- (NSString *)windowNibName +{ + // Override returning the nib file name of the document + // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. + return @"SLSDocument"; +} + +- (void)windowControllerDidLoadNib:(NSWindowController *)aController +{ + [super windowControllerDidLoadNib:aController]; + // Add any code here that needs to be executed once the windowController has loaded the document's window. + + NSLog(@"Did load nib"); + + [inputPicture addTarget:imageFilter]; + [imageFilter addTarget:self.imageView]; + [inputPicture processImage]; +} + ++ (BOOL)autosavesInPlace +{ + return YES; +} + +- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError +{ + // Insert code here to write your document to data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning nil. + // You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead. + NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil]; + @throw exception; + return nil; +} + +- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError +{ + // Take in image from data, read that into NSImage + // Start up a GPUImagePicture with that data + NSImage *sourceImage = [[NSImage alloc] initWithData:data]; + inputPicture = [[GPUImagePicture alloc] initWithImage:sourceImage]; + + imageFilter = [[GPUImageBrightnessFilter alloc] init]; + NSLog(@"Set up filters"); + + return YES; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setSliderSetting:(CGFloat)newValue; +{ + _sliderSetting = newValue; + + [(GPUImageBrightnessFilter *)imageFilter setBrightness:_sliderSetting]; + [inputPicture processImage]; +} + + +@end diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist new file mode 100644 index 000000000..b156fe6a7 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist @@ -0,0 +1,67 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + jpg + + CFBundleTypeIconFile + + CFBundleTypeName + JPEG + CFBundleTypeOSTypes + + ???? + + CFBundleTypeRole + Editor + NSDocumentClass + SLSDocument + + + CFBundleTypeExtensions + + png + + CFBundleTypeName + PNG + CFBundleTypeRole + Editor + NSDocumentClass + SLSDocument + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2013 Sunset Lake Software LLC. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch new file mode 100644 index 000000000..9f8887e54 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'SimplePhotoFilter' target in the 'SimplePhotoFilter' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/Credits.rtf b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/Credits.rtf new file mode 100644 index 000000000..46576ef21 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/examples/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings old mode 100755 new mode 100644 similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings rename to examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/MainMenu.xib b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/MainMenu.xib new file mode 100644 index 000000000..6d84c5f03 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/MainMenu.xib @@ -0,0 +1,4562 @@ + + + + 1080 + 11D50 + 2457 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 2457 + + + NSMenu + NSMenuItem + NSCustomObject + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + SimplePhotoFilter + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + SimplePhotoFilter + + + + About SimplePhotoFilter + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide SimplePhotoFilter + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit SimplePhotoFilter + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + + + Font + + 2147483647 + + + submenuAction: + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligatures + + 2147483647 + + + submenuAction: + + Ligatures + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + SimplePhotoFilter Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + NSFontManager + + + + + + + terminate: + + + + 448 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 371 + + + + openDocument: + + + + 372 + + + + printDocument: + + + + 373 + + + + raiseBaseline: + + + + 425 + + + + lowerBaseline: + + + + 426 + + + + copyFont: + + + + 427 + + + + subscript: + + + + 428 + + + + superscript: + + + + 429 + + + + tightenKerning: + + + + 430 + + + + underline: + + + + 431 + + + + orderFrontColorPanel: + + + + 432 + + + + useAllLigatures: + + + + 433 + + + + loosenKerning: + + + + 434 + + + + pasteFont: + + + + 435 + + + + unscript: + + + + 436 + + + + useStandardKerning: + + + + 437 + + + + useStandardLigatures: + + + + 438 + + + + turnOffLigatures: + + + + 439 + + + + turnOffKerning: + + + + 440 + + + + capitalizeWord: + + + + 454 + + + + lowercaseWord: + + + + 455 + + + + uppercaseWord: + + + + 456 + + + + toggleAutomaticDashSubstitution: + + + + 460 + + + + orderFrontSubstitutionsPanel: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + toggleAutomaticSpellingCorrection: + + + + 466 + + + + performFindPanelAction: + + + + 467 + + + + performFindPanelAction: + + + + 468 + + + + performFindPanelAction: + + + + 469 + + + + pasteAsPlainText: + + + + 471 + + + + showHelp: + + + + 494 + + + + alignCenter: + + + + 517 + + + + pasteRuler: + + + + 518 + + + + toggleRuler: + + + + 519 + + + + alignRight: + + + + 520 + + + + copyRuler: + + + + 521 + + + + alignJustified: + + + + 522 + + + + alignLeft: + + + + 523 + + + + makeBaseWritingDirectionNatural: + + + + 524 + + + + makeBaseWritingDirectionLeftToRight: + + + + 525 + + + + makeBaseWritingDirectionRightToLeft: + + + + 526 + + + + makeTextWritingDirectionNatural: + + + + 527 + + + + makeTextWritingDirectionLeftToRight: + + + + 528 + + + + makeTextWritingDirectionRightToLeft: + + + + 529 + + + + performFindPanelAction: + + + + 533 + + + + addFontTrait: + + + + 420 + + + + addFontTrait: + + + + 421 + + + + modifyFont: + + + + 422 + + + + orderFrontFontPanel: + + + + 423 + + + + modifyFont: + + + + 424 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 374 + + + + + + + + 375 + + + + + + + + + 376 + + + + + + + + 387 + + + + + + + + + + + + + + + + + + + + + + + 388 + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + + + + + + + + 405 + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + + + + + + 411 + + + + + 412 + + + + + 413 + + + + + 414 + + + + + + + + + + + 415 + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 449 + + + + + + + + 450 + + + + + + + + + + 451 + + + + + 452 + + + + + 453 + + + + + 457 + + + + + 458 + + + + + 459 + + + + + 462 + + + + + 464 + + + + + 465 + + + + + 470 + + + + + 491 + + + + + + + + 492 + + + + + + + + 493 + + + + + 495 + + + + + + + + 496 + + + + + + + + + + + + + + + + + 497 + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + + + + 503 + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + + + + + + + + + + + + 508 + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 532 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 533 + + + + + ABAppCardController + NSWindowController + + id + id + id + id + id + id + id + id + + + + addCardViewField: + id + + + copy: + id + + + cut: + id + + + doDelete: + id + + + find: + id + + + paste: + id + + + saveChanges: + id + + + toggleCardEditingMode: + id + + + + ABCardView + NSButton + NSManagedObjectContext + NSSearchField + NSTextField + NSWindow + + + + mCardView + ABCardView + + + mEditButton + NSButton + + + mManagedObjectContext + NSManagedObjectContext + + + mSearchField + NSSearchField + + + mStatusTextField + NSTextField + + + mWindow + NSWindow + + + + IBProjectSource + ./Classes/ABAppCardController.h + + + + ABCardView + NSView + + id + id + + + + commitAndSave: + id + + + statusImageClicked: + id + + + + NSObjectController + NSImageView + NSView + ABNameFrameView + NSView + NSImage + ABImageView + + + + mBindingsController + NSObjectController + + + mBuddyStatusImage + NSImageView + + + mHeaderView + NSView + + + mNameView + ABNameFrameView + + + mNextKeyView + NSView + + + mUserImage + NSImage + + + mUserImageView + ABImageView + + + + IBProjectSource + ./Classes/ABCardView.h + + + + ABImageView + NSImageView + + id + id + id + id + + + + copy: + id + + + cut: + id + + + delete: + id + + + paste: + id + + + + IBProjectSource + ./Classes/ABImageView.h + + + + DVTBorderedView + DVTLayoutView_ML + + contentView + NSView + + + contentView + + contentView + NSView + + + + IBProjectSource + ./Classes/DVTBorderedView.h + + + + DVTDelayedMenuButton + NSButton + + IBProjectSource + ./Classes/DVTDelayedMenuButton.h + + + + DVTGradientImageButton + NSButton + + IBProjectSource + ./Classes/DVTGradientImageButton.h + + + + DVTImageAndTextCell + NSTextFieldCell + + IBProjectSource + ./Classes/DVTImageAndTextCell.h + + + + DVTImageAndTextColumn + NSTableColumn + + IBProjectSource + ./Classes/DVTImageAndTextColumn.h + + + + DVTLayoutView_ML + NSView + + IBProjectSource + ./Classes/DVTLayoutView_ML.h + + + + DVTOutlineView + NSOutlineView + + IBProjectSource + ./Classes/DVTOutlineView.h + + + + DVTSplitView + NSSplitView + + IBProjectSource + ./Classes/DVTSplitView.h + + + + DVTStackView_ML + DVTLayoutView_ML + + IBProjectSource + ./Classes/DVTStackView_ML.h + + + + DVTTableView + NSTableView + + IBProjectSource + ./Classes/DVTTableView.h + + + + DVTViewController + NSViewController + + IBProjectSource + ./Classes/DVTViewController.h + + + + FirstResponder + + duplicateDocument: + id + + + duplicateDocument: + + duplicateDocument: + id + + + + IBUserSource + + + + + HFController + NSObject + + selectAll: + id + + + selectAll: + + selectAll: + id + + + + IBProjectSource + ./Classes/HFController.h + + + + HFRepresenterTextView + NSView + + selectAll: + id + + + selectAll: + + selectAll: + id + + + + IBProjectSource + ./Classes/HFRepresenterTextView.h + + + + IBEditor + NSObject + + id + id + id + id + id + + + + changeFont: + id + + + performCopy: + id + + + performCut: + id + + + selectAll: + id + + + sizeSelectionToFit: + id + + + + IBProjectSource + ./Classes/IBEditor.h + + + + IDECapsuleListView + DVTStackView_ML + + dataSource + id + + + dataSource + + dataSource + id + + + + IBProjectSource + ./Classes/IDECapsuleListView.h + + + + IDEDMArrayController + NSArrayController + + IBProjectSource + ./Classes/IDEDMArrayController.h + + + + IDEDMEditor + IDEEditor + + DVTBorderedView + NSView + IDEDMEditorSourceListController + DVTSplitView + + + + bottomToolbarBorderView + DVTBorderedView + + + sourceListSplitViewPane + NSView + + + sourceListViewController + IDEDMEditorSourceListController + + + splitView + DVTSplitView + + + + IBProjectSource + ./Classes/IDEDMEditor.h + + + + IDEDMEditorController + IDEViewController + + IBProjectSource + ./Classes/IDEDMEditorController.h + + + + IDEDMEditorSourceListController + IDEDMEditorController + + DVTBorderedView + IDEDMEditor + DVTImageAndTextColumn + DVTOutlineView + NSTreeController + + + + borderedView + DVTBorderedView + + + parentEditor + IDEDMEditor + + + primaryColumn + DVTImageAndTextColumn + + + sourceListOutlineView + DVTOutlineView + + + sourceListTreeController + NSTreeController + + + + IBProjectSource + ./Classes/IDEDMEditorSourceListController.h + + + + IDEDMHighlightImageAndTextCell + DVTImageAndTextCell + + IBProjectSource + ./Classes/IDEDMHighlightImageAndTextCell.h + + + + IDEDataModelBrowserEditor + IDEDMEditorController + + IDEDataModelPropertiesTableController + IDECapsuleListView + NSArrayController + IDEDataModelPropertiesTableController + IDEDataModelEntityContentsEditor + IDEDataModelPropertiesTableController + + + + attributesTableViewController + IDEDataModelPropertiesTableController + + + capsuleView + IDECapsuleListView + + + entityArrayController + NSArrayController + + + fetchedPropertiesTableViewController + IDEDataModelPropertiesTableController + + + parentEditor + IDEDataModelEntityContentsEditor + + + relationshipsTableViewController + IDEDataModelPropertiesTableController + + + + IBProjectSource + ./Classes/IDEDataModelBrowserEditor.h + + + + IDEDataModelConfigurationEditor + IDEDMEditorController + + IDECapsuleListView + IDEDataModelEditor + IDEDataModelConfigurationTableController + + + + capsuleListView + IDECapsuleListView + + + parentEditor + IDEDataModelEditor + + + tableController + IDEDataModelConfigurationTableController + + + + IBProjectSource + ./Classes/IDEDataModelConfigurationEditor.h + + + + IDEDataModelConfigurationTableController + IDEDMEditorController + + NSArrayController + NSArrayController + IDEDataModelConfigurationEditor + XDTableView + + + + configurationsArrayController + NSArrayController + + + entitiesArrayController + NSArrayController + + + parentEditor + IDEDataModelConfigurationEditor + + + tableView + XDTableView + + + + IBProjectSource + ./Classes/IDEDataModelConfigurationTableController.h + + + + IDEDataModelDiagramEditor + IDEDMEditorController + + XDDiagramView + IDEDataModelEntityContentsEditor + + + + diagramView + XDDiagramView + + + parentEditor + IDEDataModelEntityContentsEditor + + + + IBProjectSource + ./Classes/IDEDataModelDiagramEditor.h + + + + IDEDataModelEditor + IDEDMEditor + + DVTDelayedMenuButton + DVTDelayedMenuButton + NSSegmentedControl + IDEDataModelConfigurationEditor + IDEDataModelEntityContentsEditor + IDEDataModelFetchRequestEditor + NSSegmentedControl + NSTabView + + + + addEntityButton + DVTDelayedMenuButton + + + addPropertyButton + DVTDelayedMenuButton + + + browserDiagramSegmentControl + NSSegmentedControl + + + configurationViewController + IDEDataModelConfigurationEditor + + + entityContentsViewController + IDEDataModelEntityContentsEditor + + + fetchRequestViewController + IDEDataModelFetchRequestEditor + + + hierarchySegmentControl + NSSegmentedControl + + + tabView + NSTabView + + + + IBProjectSource + ./Classes/IDEDataModelEditor.h + + + + IDEDataModelEntityContentsEditor + IDEDMEditorController + + IDEDataModelBrowserEditor + IDEDataModelDiagramEditor + IDEDataModelEditor + NSTabView + + + + browserViewController + IDEDataModelBrowserEditor + + + diagramViewController + IDEDataModelDiagramEditor + + + parentEditor + IDEDataModelEditor + + + tabView + NSTabView + + + + IBProjectSource + ./Classes/IDEDataModelEntityContentsEditor.h + + + + IDEDataModelFetchRequestEditor + IDEDMEditorController + + NSArrayController + IDEDataModelEditor + IDECapsuleListView + + + + entityController + NSArrayController + + + parentEditor + IDEDataModelEditor + + + tableView + IDECapsuleListView + + + + IBProjectSource + ./Classes/IDEDataModelFetchRequestEditor.h + + + + IDEDataModelPropertiesTableController + IDEDMEditorController + + IDEDMArrayController + NSTableColumn + NSArrayController + IDEDataModelBrowserEditor + IDEDMHighlightImageAndTextCell + XDTableView + + + + arrayController + IDEDMArrayController + + + entitiesColumn + NSTableColumn + + + entityArrayController + NSArrayController + + + parentEditor + IDEDataModelBrowserEditor + + + propertyNameAndImageCell + IDEDMHighlightImageAndTextCell + + + tableView + XDTableView + + + + IBProjectSource + ./Classes/IDEDataModelPropertiesTableController.h + + + + IDEDocDownloadsTableViewController + NSObject + + NSButtonCell + DVTTableView + IDEDocViewingPrefPaneController + + + + _downloadButtonCell + NSButtonCell + + + _tableView + DVTTableView + + + prefPaneController + IDEDocViewingPrefPaneController + + + + IBProjectSource + ./Classes/IDEDocDownloadsTableViewController.h + + + + IDEDocViewingPrefPaneController + IDEViewController + + id + id + id + id + id + id + id + id + id + id + id + + + + addSubscription: + id + + + checkForAndInstallUpdatesNow: + id + + + deleteDocSet: + id + + + downloadAction: + id + + + minimumFontSizeComboBoxAction: + id + + + minimumFontSizeEnabledAction: + id + + + showHelp: + id + + + showSubscriptionSheet: + id + + + subscriptionCancelAction: + id + + + toggleAutoCheckForAndInstallUpdates: + id + + + toggleDocSetInfo: + id + + + + DVTGradientImageButton + DVTGradientImageButton + DVTGradientImageButton + NSSplitView + NSView + NSView + DVTBorderedView + DVTBorderedView + NSButton + NSTextView + IDEDocDownloadsTableViewController + NSComboBox + NSTextField + NSButton + NSTextField + NSWindow + NSButton + + + + _addButton + DVTGradientImageButton + + + _deleteButton + DVTGradientImageButton + + + _showInfoAreaButton + DVTGradientImageButton + + + _splitView + NSSplitView + + + _splitViewDocSetInfoSubview + NSView + + + _splitViewDocSetsListSubview + NSView + + + borderedViewAroundSplitView + DVTBorderedView + + + borderedViewBelowTable + DVTBorderedView + + + checkAndInstallNowButton + NSButton + + + docSetInfoTextView + NSTextView + + + downloadsTableViewController + IDEDocDownloadsTableViewController + + + minimumFontSizeControl + NSComboBox + + + noUpdatesAvailableMessage + NSTextField + + + showInfoButton + NSButton + + + subscriptionTextField + NSTextField + + + subscriptionWindow + NSWindow + + + validateAddSubscriptionButton + NSButton + + + + IBProjectSource + ./Classes/IDEDocViewingPrefPaneController.h + + + + IDEEditor + IDEViewController + + IBProjectSource + ./Classes/IDEEditor.h + + + + IDEViewController + DVTViewController + + IBProjectSource + ./Classes/IDEViewController.h + + + + IKImageView + + id + id + id + id + + + + copy: + id + + + crop: + id + + + cut: + id + + + paste: + id + + + + IBProjectSource + ./Classes/IKImageView.h + + + + NSDocument + + id + id + id + id + id + id + + + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + IBProjectSource + ./Classes/NSDocument.h + + + + NSDocumentController + + _openRecentDocument: + id + + + _openRecentDocument: + + _openRecentDocument: + id + + + + IBProjectSource + ./Classes/NSDocumentController.h + + + + NSResponder + + _insertFindPattern: + id + + + _insertFindPattern: + + _insertFindPattern: + id + + + + IBProjectSource + ./Classes/NSResponder.h + + + + QLPreviewBubble + NSObject + + id + id + + + + hide: + id + + + show: + id + + + + parentWindow + NSWindow + + + parentWindow + + parentWindow + NSWindow + + + + IBProjectSource + ./Classes/QLPreviewBubble.h + + + + QTMovieView + + id + id + id + id + id + + + + showAll: + id + + + showCustomButton: + id + + + toggleLoops: + id + + + zoomIn: + id + + + zoomOut: + id + + + + IBProjectSource + ./Classes/QTMovieView.h + + + + WebView + + id + id + id + id + + + + reloadFromOrigin: + id + + + resetPageZoom: + id + + + zoomPageIn: + id + + + zoomPageOut: + id + + + + IBProjectSource + ./Classes/WebView.h + + + + XDDiagramView + NSView + + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + + + + _graphLayouterMenuItemAction: + id + + + _zoomPopUpButtonAction: + id + + + alignBottomEdges: + id + + + alignCentersHorizontallyInContainer: + id + + + alignCentersVerticallyInContainer: + id + + + alignHorizontalCenters: + id + + + alignLeftEdges: + id + + + alignRightEdges: + id + + + alignTopEdges: + id + + + alignVerticalCenters: + id + + + bringToFront: + id + + + collapseAllCompartments: + id + + + copy: + id + + + cut: + id + + + delete: + id + + + deleteBackward: + id + + + deleteForward: + id + + + deselectAll: + id + + + diagramZoomIn: + id + + + diagramZoomOut: + id + + + expandAllCompartments: + id + + + flipHorizontally: + id + + + flipVertically: + id + + + layoutGraphicsConcentrically: + id + + + layoutGraphicsHierarchically: + id + + + lock: + id + + + makeSameHeight: + id + + + makeSameWidth: + id + + + moveDown: + id + + + moveDownAndModifySelection: + id + + + moveLeft: + id + + + moveLeftAndModifySelection: + id + + + moveRight: + id + + + moveRightAndModifySelection: + id + + + moveUp: + id + + + moveUpAndModifySelection: + id + + + paste: + id + + + rollDownAllCompartments: + id + + + rollUpAllCompartments: + id + + + selectAll: + id + + + sendToBack: + id + + + sizeToFit: + id + + + toggleGridShown: + id + + + toggleHiddenGraphicsShown: + id + + + togglePageBreaksShown: + id + + + toggleRuler: + id + + + toggleSnapsToGrid: + id + + + unlock: + id + + + + _diagramController + IDEDataModelDiagramEditor + + + _diagramController + + _diagramController + IDEDataModelDiagramEditor + + + + IBProjectSource + ./Classes/XDDiagramView.h + + + + XDTableView + NSTableView + + showAllTableColumns: + id + + + showAllTableColumns: + + showAllTableColumns: + id + + + + IBProjectSource + ./Classes/XDTableView.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib new file mode 100644 index 000000000..354f8d86a --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib @@ -0,0 +1,486 @@ + + + + 1080 + 12D78 + 3084 + 1187.37 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + IBNSLayoutConstraint + NSCustomObject + NSOpenGLView + NSSlider + NSSliderCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + SLSDocument + + + FirstResponder + + + 15 + 2 + {{133, 235}, {507, 413}} + 1886912512 + Window + NSWindow + View + + {94, 86} + + + 256 + + + + 268 + {{0, 54}, {507, 359}} + + + + _NS:24 + + + AAAAYAAAAAA + + + + + + 268 + {{18, 18}, {471, 21}} + + + + _NS:9 + YES + + -2080374784 + 0 + + _NS:9 + + 1 + -1 + 0.0 + 0.0 + 0 + 1 + NO + NO + + NO + + + {507, 413} + + + + + {{0, 0}, {1440, 878}} + {94, 108} + {10000000000000, 10000000000000} + YES + + + NSApplication + + + + + + + window + + + + 18 + + + + imageView + + + + 100050 + + + + delegate + + + + 17 + + + + value: sliderSetting + + + + + + value: sliderSetting + value + sliderSetting + 2 + + + 100049 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 5 + + + + + + Window + + + 6 + + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 54 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 8 + 29 + 3 + + + + + + + + -3 + + + Application + + + 100027 + + + + + 100033 + + + + + 100035 + + + + + 100036 + + + + + 100038 + + + + + + + + 100039 + + + + + 100041 + + + + + 100043 + + + + + 100045 + + + + + 100047 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + GPUImageView + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{133, 170}, {507, 413}} + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 100050 + + + + + GPUImageView + NSOpenGLView + + IBProjectSource + ./Classes/GPUImageView.h + + + + NSDocument + + id + id + id + id + id + id + id + + + + browseDocumentVersions: + id + + + duplicateDocument: + id + + + moveDocument: + id + + + renameDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + + IBProjectSource + ./Classes/NSDocument.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + SLSDocument + NSDocument + + imageView + GPUImageView + + + imageView + + imageView + GPUImageView + + + + IBProjectSource + ./Classes/SLSDocument.h + + + + + 0 + IBCocoaFramework + YES + 3 + YES + + diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/main.m b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/main.m new file mode 100644 index 000000000..945de6ba6 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/main.m @@ -0,0 +1,14 @@ +// +// main.m +// SimplePhotoFilter +// +// Created by Brad Larson on 4/20/2013. +// Copyright (c) 2013 Sunset Lake Software LLC. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj b/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj similarity index 95% rename from examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj rename to examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj index d3a8acaea..1de7829de 100755 --- a/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ BCB3C3D516BCA4AD003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3D016BCA4AD003D26B0 /* Icon@2x.png */; }; BCB3C3D616BCA4AD003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3D116BCA4AD003D26B0 /* iTunesArtwork.png */; }; BCC3D1CE14ECB1DB00E111AF /* ImageFilteringBenchmarkController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC3D1CD14ECB1DB00E111AF /* ImageFilteringBenchmarkController.m */; }; + BCF866DC1725A2EA00912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF866D71725A2D800912E34 /* libGPUImage.a */; }; BCF9D15B14EAD24200986461 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D15A14EAD24200986461 /* UIKit.framework */; }; BCF9D15D14EAD24200986461 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D15C14EAD24200986461 /* Foundation.framework */; }; BCF9D15F14EAD24200986461 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D15E14EAD24200986461 /* CoreGraphics.framework */; }; @@ -31,7 +32,6 @@ BCF9D19C14EC29FA00986461 /* 46-movie-2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D19614EC29FA00986461 /* 46-movie-2@2x.png */; }; BCF9D19D14EC29FA00986461 /* 86-camera.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D19714EC29FA00986461 /* 86-camera.png */; }; BCF9D19E14EC29FA00986461 /* 86-camera@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D19814EC29FA00986461 /* 86-camera@2x.png */; }; - BCF9D1D914EC4F5800986461 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D1D314EC4F3F00986461 /* libGPUImage.a */; }; BCF9D1DD14EC4F6C00986461 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D1DA14EC4F6C00986461 /* CoreMedia.framework */; }; BCF9D1DE14EC4F6C00986461 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D1DB14EC4F6C00986461 /* CoreVideo.framework */; }; BCF9D1DF14EC4F6C00986461 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D1DC14EC4F6C00986461 /* QuartzCore.framework */; }; @@ -42,21 +42,21 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BCF9D1D214EC4F3F00986461 /* PBXContainerItemProxy */ = { + BCF866D61725A2D800912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BCF9D1D414EC4F3F00986461 /* PBXContainerItemProxy */ = { + BCF866D81725A2D800912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BCF9D1D714EC4F4C00986461 /* PBXContainerItemProxy */ = { + BCF866DA1725A2E400912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */; proxyType = 1; @@ -98,7 +98,7 @@ BCF9D19614EC29FA00986461 /* 46-movie-2@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "46-movie-2@2x.png"; sourceTree = ""; }; BCF9D19714EC29FA00986461 /* 86-camera.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "86-camera.png"; sourceTree = ""; }; BCF9D19814EC29FA00986461 /* 86-camera@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "86-camera@2x.png"; sourceTree = ""; }; - BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCF9D1DA14EC4F6C00986461 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCF9D1DB14EC4F6C00986461 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; BCF9D1DC14EC4F6C00986461 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; @@ -113,6 +113,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF866DC1725A2EA00912E34 /* libGPUImage.a in Frameworks */, BC982A9614EDF8750001FF6F /* GLKit.framework in Frameworks */, BCF9D20C14EC7EB100986461 /* CoreImage.framework in Frameworks */, BCF9D1E314EC4F7C00986461 /* AVFoundation.framework in Frameworks */, @@ -120,7 +121,6 @@ BCF9D1DD14EC4F6C00986461 /* CoreMedia.framework in Frameworks */, BCF9D1DE14EC4F6C00986461 /* CoreVideo.framework in Frameworks */, BCF9D1DF14EC4F6C00986461 /* QuartzCore.framework in Frameworks */, - BCF9D1D914EC4F5800986461 /* libGPUImage.a in Frameworks */, BCF9D15B14EAD24200986461 /* UIKit.framework in Frameworks */, BCF9D15D14EAD24200986461 /* Foundation.framework in Frameworks */, BCF9D15F14EAD24200986461 /* CoreGraphics.framework in Frameworks */, @@ -130,6 +130,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + BCF866D11725A2D800912E34 /* Products */ = { + isa = PBXGroup; + children = ( + BCF866D71725A2D800912E34 /* libGPUImage.a */, + BCF866D91725A2D800912E34 /* GPUImageTests.octest */, + ); + name = Products; + sourceTree = ""; + }; BCF9D14B14EAD24200986461 = { isa = PBXGroup; children = ( @@ -208,15 +217,6 @@ name = "Supporting Files"; sourceTree = ""; }; - BCF9D1CB14EC4F3F00986461 /* Products */ = { - isa = PBXGroup; - children = ( - BCF9D1D314EC4F3F00986461 /* libGPUImage.a */, - BCF9D1D514EC4F3F00986461 /* GPUImageTests.octest */, - ); - name = Products; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -231,7 +231,7 @@ buildRules = ( ); dependencies = ( - BCF9D1D814EC4F4C00986461 /* PBXTargetDependency */, + BCF866DB1725A2E400912E34 /* PBXTargetDependency */, ); name = BenchmarkSuite; productName = BenchmarkSuite; @@ -259,7 +259,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BCF9D1CB14EC4F3F00986461 /* Products */; + ProductGroup = BCF866D11725A2D800912E34 /* Products */; ProjectRef = BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */; }, ); @@ -271,18 +271,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BCF9D1D314EC4F3F00986461 /* libGPUImage.a */ = { + BCF866D71725A2D800912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BCF9D1D214EC4F3F00986461 /* PBXContainerItemProxy */; + remoteRef = BCF866D61725A2D800912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BCF9D1D514EC4F3F00986461 /* GPUImageTests.octest */ = { + BCF866D91725A2D800912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BCF9D1D414EC4F3F00986461 /* PBXContainerItemProxy */; + remoteRef = BCF866D81725A2D800912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -329,10 +329,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BCF9D1D814EC4F4C00986461 /* PBXTargetDependency */ = { + BCF866DB1725A2E400912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BCF9D1D714EC4F4C00986461 /* PBXContainerItemProxy */; + targetProxy = BCF866DA1725A2E400912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -369,7 +369,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; @@ -391,7 +391,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = "-ObjC"; diff --git a/examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png b/examples/iOS/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png diff --git a/examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame@2x.png b/examples/iOS/BenchmarkSuite/BenchmarkSuite/41-picture-frame@2x.png similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/41-picture-frame@2x.png rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/41-picture-frame@2x.png diff --git a/examples/BenchmarkSuite/BenchmarkSuite/46-movie-2.png b/examples/iOS/BenchmarkSuite/BenchmarkSuite/46-movie-2.png similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/46-movie-2.png rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/46-movie-2.png diff --git a/examples/BenchmarkSuite/BenchmarkSuite/46-movie-2@2x.png b/examples/iOS/BenchmarkSuite/BenchmarkSuite/46-movie-2@2x.png similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/46-movie-2@2x.png rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/46-movie-2@2x.png diff --git a/examples/BenchmarkSuite/BenchmarkSuite/86-camera.png b/examples/iOS/BenchmarkSuite/BenchmarkSuite/86-camera.png similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/86-camera.png rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/86-camera.png diff --git a/examples/BenchmarkSuite/BenchmarkSuite/86-camera@2x.png b/examples/iOS/BenchmarkSuite/BenchmarkSuite/86-camera@2x.png similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/86-camera@2x.png rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/86-camera@2x.png diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib diff --git a/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h b/examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h diff --git a/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib diff --git a/examples/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings b/examples/iOS/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings diff --git a/examples/BenchmarkSuite/BenchmarkSuite/main.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/main.m similarity index 100% rename from examples/BenchmarkSuite/BenchmarkSuite/main.m rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/main.m diff --git a/examples/BenchmarkSuite/GlyphishIconLicense.txt b/examples/iOS/BenchmarkSuite/GlyphishIconLicense.txt similarity index 100% rename from examples/BenchmarkSuite/GlyphishIconLicense.txt rename to examples/iOS/BenchmarkSuite/GlyphishIconLicense.txt diff --git a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj b/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj similarity index 94% rename from examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj rename to examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj index 5ae8b7d94..a8a7d98ad 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj +++ b/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj @@ -22,29 +22,29 @@ BCB5E74614DDCF4F00701302 /* ColorTrackingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E74514DDCF4F00701302 /* ColorTrackingViewController.m */; }; BCB5E74814DDD1B300701302 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E74714DDD1B300701302 /* QuartzCore.framework */; }; BCB5E7A314E346BE00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A214E346BE00701302 /* AVFoundation.framework */; }; - BCB5E7A414E346CE00701302 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC245E1214DDCA1F009FE7EB /* libGPUImage.a */; }; BCB5E7A614E346F100701302 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A514E346F100701302 /* OpenGLES.framework */; }; BCB5E7A814E3471100701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A714E3471100701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCB5E7AA14E3472100701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A914E3472100701302 /* CoreMedia.framework */; }; BCB5E7B214E460D300701302 /* Threshold.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E7B114E460D300701302 /* Threshold.fsh */; }; + BCF866E91725A39D00912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF866E41725A38C00912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BC245E1114DDCA1F009FE7EB /* PBXContainerItemProxy */ = { + BCF866E31725A38C00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BC245E1314DDCA1F009FE7EB /* PBXContainerItemProxy */ = { + BCF866E51725A38C00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BCB5E73F14DDCCA600701302 /* PBXContainerItemProxy */ = { + BCF866E71725A39800912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */; proxyType = 1; @@ -64,7 +64,7 @@ BC245DEC14DDC959009FE7EB /* ColorObjectTracking-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ColorObjectTracking-Prefix.pch"; sourceTree = ""; }; BC245DED14DDC959009FE7EB /* ColorTrackingAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ColorTrackingAppDelegate.h; sourceTree = ""; }; BC245DEE14DDC959009FE7EB /* ColorTrackingAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ColorTrackingAppDelegate.m; sourceTree = ""; }; - BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCB3C3DA16BCA51E003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; BCB3C3DB16BCA51E003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; BCB3C3DC16BCA51E003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; @@ -86,6 +86,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF866E91725A39D00912E34 /* libGPUImage.a in Frameworks */, BCB5E7AA14E3472100701302 /* CoreMedia.framework in Frameworks */, BCB5E7A814E3471100701302 /* CoreVideo.framework in Frameworks */, BCB5E7A614E346F100701302 /* OpenGLES.framework in Frameworks */, @@ -94,7 +95,6 @@ BC245DDF14DDC959009FE7EB /* UIKit.framework in Frameworks */, BC245DE114DDC959009FE7EB /* Foundation.framework in Frameworks */, BC245DE314DDC959009FE7EB /* CoreGraphics.framework in Frameworks */, - BCB5E7A414E346CE00701302 /* libGPUImage.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -163,22 +163,22 @@ name = "Supporting Files"; sourceTree = ""; }; - BC245E0D14DDCA1F009FE7EB /* Products */ = { + BCB5E7B014E4606200701302 /* Shaders */ = { isa = PBXGroup; children = ( - BC245E1214DDCA1F009FE7EB /* libGPUImage.a */, - BC245E1414DDCA1F009FE7EB /* GPUImageTests.octest */, + BCB5DD8214E85CB0000AF3C2 /* PositionColor.fsh */, + BCB5E7B114E460D300701302 /* Threshold.fsh */, ); - name = Products; + name = Shaders; sourceTree = ""; }; - BCB5E7B014E4606200701302 /* Shaders */ = { + BCF866DE1725A38C00912E34 /* Products */ = { isa = PBXGroup; children = ( - BCB5DD8214E85CB0000AF3C2 /* PositionColor.fsh */, - BCB5E7B114E460D300701302 /* Threshold.fsh */, + BCF866E41725A38C00912E34 /* libGPUImage.a */, + BCF866E61725A38C00912E34 /* GPUImageTests.octest */, ); - name = Shaders; + name = Products; sourceTree = ""; }; /* End PBXGroup section */ @@ -195,7 +195,7 @@ buildRules = ( ); dependencies = ( - BCB5E74014DDCCA600701302 /* PBXTargetDependency */, + BCF866E81725A39800912E34 /* PBXTargetDependency */, ); name = ColorObjectTracking; productName = ColorObjectTracking; @@ -223,7 +223,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BC245E0D14DDCA1F009FE7EB /* Products */; + ProductGroup = BCF866DE1725A38C00912E34 /* Products */; ProjectRef = BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */; }, ); @@ -235,18 +235,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BC245E1214DDCA1F009FE7EB /* libGPUImage.a */ = { + BCF866E41725A38C00912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BC245E1114DDCA1F009FE7EB /* PBXContainerItemProxy */; + remoteRef = BCF866E31725A38C00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BC245E1414DDCA1F009FE7EB /* GPUImageTests.octest */ = { + BCF866E61725A38C00912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BC245E1314DDCA1F009FE7EB /* PBXContainerItemProxy */; + remoteRef = BCF866E51725A38C00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -283,10 +283,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BCB5E74014DDCCA600701302 /* PBXTargetDependency */ = { + BCF866E81725A39800912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BCB5E73F14DDCCA600701302 /* PBXContainerItemProxy */; + targetProxy = BCF866E71725A39800912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -322,7 +322,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/Source/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -342,7 +342,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/Source/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Info.plist diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Prefix.pch b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Prefix.pch similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Prefix.pch rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorObjectTracking-Prefix.pch diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.h b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.h similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.h rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.h diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.m b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.m similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.m rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingAppDelegate.m diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.h diff --git a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m similarity index 99% rename from examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index db520687e..2c1fa6eef 100755 --- a/examples/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -231,7 +231,7 @@ - (CGPoint)centroidFromTexture:(GLubyte *)pixels ofSize:(CGSize)textureSize; { CGFloat currentXTotal = 0.0f, currentYTotal = 0.0f, currentPixelTotal = 0.0f; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { for (NSUInteger currentPixel = 0; currentPixel < (textureSize.width * textureSize.height); currentPixel++) { diff --git a/examples/ColorObjectTracking/ColorObjectTracking/PositionColor.fsh b/examples/iOS/ColorObjectTracking/ColorObjectTracking/PositionColor.fsh similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/PositionColor.fsh rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/PositionColor.fsh diff --git a/examples/ColorObjectTracking/ColorObjectTracking/Threshold.fsh b/examples/iOS/ColorObjectTracking/ColorObjectTracking/Threshold.fsh similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/Threshold.fsh rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/Threshold.fsh diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/en.lproj/InfoPlist.strings b/examples/iOS/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/en.lproj/InfoPlist.strings rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings diff --git a/examples/ColorObjectTracking/ColorObjectTracking/main.m b/examples/iOS/ColorObjectTracking/ColorObjectTracking/main.m similarity index 100% rename from examples/ColorObjectTracking/ColorObjectTracking/main.m rename to examples/iOS/ColorObjectTracking/ColorObjectTracking/main.m diff --git a/examples/CubeExample/Classes/CubeExampleAppDelegate.h b/examples/iOS/CubeExample/Classes/CubeExampleAppDelegate.h similarity index 100% rename from examples/CubeExample/Classes/CubeExampleAppDelegate.h rename to examples/iOS/CubeExample/Classes/CubeExampleAppDelegate.h diff --git a/examples/CubeExample/Classes/CubeExampleAppDelegate.m b/examples/iOS/CubeExample/Classes/CubeExampleAppDelegate.m similarity index 100% rename from examples/CubeExample/Classes/CubeExampleAppDelegate.m rename to examples/iOS/CubeExample/Classes/CubeExampleAppDelegate.m diff --git a/examples/CubeExample/Classes/DisplayViewController.h b/examples/iOS/CubeExample/Classes/DisplayViewController.h similarity index 100% rename from examples/CubeExample/Classes/DisplayViewController.h rename to examples/iOS/CubeExample/Classes/DisplayViewController.h diff --git a/examples/CubeExample/Classes/DisplayViewController.m b/examples/iOS/CubeExample/Classes/DisplayViewController.m similarity index 100% rename from examples/CubeExample/Classes/DisplayViewController.m rename to examples/iOS/CubeExample/Classes/DisplayViewController.m diff --git a/examples/CubeExample/Classes/ES2Renderer.h b/examples/iOS/CubeExample/Classes/ES2Renderer.h similarity index 100% rename from examples/CubeExample/Classes/ES2Renderer.h rename to examples/iOS/CubeExample/Classes/ES2Renderer.h diff --git a/examples/CubeExample/Classes/ES2Renderer.m b/examples/iOS/CubeExample/Classes/ES2Renderer.m similarity index 99% rename from examples/CubeExample/Classes/ES2Renderer.m rename to examples/iOS/CubeExample/Classes/ES2Renderer.m index 5e118158f..af7e52fa0 100755 --- a/examples/CubeExample/Classes/ES2Renderer.m +++ b/examples/iOS/CubeExample/Classes/ES2Renderer.m @@ -32,7 +32,7 @@ - (id)initWithSize:(CGSize)newSize; if ((self = [super init])) { // Need to use a share group based on the GPUImage context to share textures with the 3-D scene - context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:[[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context] sharegroup]]; + context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:[[[GPUImageContext sharedImageProcessingContext] context] sharegroup]]; if (!context || ![EAGLContext setCurrentContext:context] || ![self loadShaders]) { diff --git a/examples/CubeExample/Classes/ESRenderer.h b/examples/iOS/CubeExample/Classes/ESRenderer.h similarity index 100% rename from examples/CubeExample/Classes/ESRenderer.h rename to examples/iOS/CubeExample/Classes/ESRenderer.h diff --git a/examples/CubeExample/CubeExample-Info.plist b/examples/iOS/CubeExample/CubeExample-Info.plist similarity index 100% rename from examples/CubeExample/CubeExample-Info.plist rename to examples/iOS/CubeExample/CubeExample-Info.plist diff --git a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj b/examples/iOS/CubeExample/CubeExample.xcodeproj/project.pbxproj similarity index 94% rename from examples/CubeExample/CubeExample.xcodeproj/project.pbxproj rename to examples/iOS/CubeExample/CubeExample.xcodeproj/project.pbxproj index 3fbda5178..d8275f650 100755 --- a/examples/CubeExample/CubeExample.xcodeproj/project.pbxproj +++ b/examples/iOS/CubeExample/CubeExample.xcodeproj/project.pbxproj @@ -24,27 +24,27 @@ BCB6B8A41505A9840041703B /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A11505A9840041703B /* AVFoundation.framework */; }; BCB6B8A51505A9840041703B /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A21505A9840041703B /* CoreMedia.framework */; }; BCB6B8A61505A9840041703B /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8A31505A9840041703B /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - BCB6B8A91505A9AA0041703B /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B88C150447DF0041703B /* libGPUImage.a */; }; BCB6B8C41505C2780041703B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8C31505C2780041703B /* CoreGraphics.framework */; }; BCF3D690153CC5E6009A1FE5 /* DisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68F153CC5E6009A1FE5 /* DisplayViewController.m */; }; + BCF866F61725A44300912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF866F11725A41E00912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BCB6B88B150447DF0041703B /* PBXContainerItemProxy */ = { + BCF866F01725A41E00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB6B883150447DF0041703B /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BCB6B88D150447DF0041703B /* PBXContainerItemProxy */ = { + BCF866F21725A41E00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB6B883150447DF0041703B /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BCB6B8A71505A9A40041703B /* PBXContainerItemProxy */ = { + BCF866F41725A43C00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB6B883150447DF0041703B /* GPUImage.xcodeproj */; proxyType = 1; @@ -74,7 +74,7 @@ BCB3C3E916BCA5AC003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../SharedIcons/Icon.png; sourceTree = ""; }; BCB3C3EA16BCA5AC003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../SharedIcons/Icon@2x.png"; sourceTree = ""; }; BCB3C3EB16BCA5AC003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; - BCB6B883150447DF0041703B /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCB6B883150447DF0041703B /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCB6B8A11505A9840041703B /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCB6B8A21505A9840041703B /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCB6B8A31505A9840041703B /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; @@ -88,8 +88,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF866F61725A44300912E34 /* libGPUImage.a in Frameworks */, BCB6B8C41505C2780041703B /* CoreGraphics.framework in Frameworks */, - BCB6B8A91505A9AA0041703B /* libGPUImage.a in Frameworks */, BCB6B8A41505A9840041703B /* AVFoundation.framework in Frameworks */, BCB6B8A51505A9840041703B /* CoreMedia.framework in Frameworks */, BCB6B8A61505A9840041703B /* CoreVideo.framework in Frameworks */, @@ -185,11 +185,11 @@ name = Frameworks; sourceTree = ""; }; - BCB6B884150447DF0041703B /* Products */ = { + BCF866EB1725A41E00912E34 /* Products */ = { isa = PBXGroup; children = ( - BCB6B88C150447DF0041703B /* libGPUImage.a */, - BCB6B88E150447DF0041703B /* GPUImageTests.octest */, + BCF866F11725A41E00912E34 /* libGPUImage.a */, + BCF866F31725A41E00912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -208,7 +208,7 @@ buildRules = ( ); dependencies = ( - BCB6B8A81505A9A40041703B /* PBXTargetDependency */, + BCF866F51725A43C00912E34 /* PBXTargetDependency */, ); name = CubeExample; productName = CubeExample; @@ -234,7 +234,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BCB6B884150447DF0041703B /* Products */; + ProductGroup = BCF866EB1725A41E00912E34 /* Products */; ProjectRef = BCB6B883150447DF0041703B /* GPUImage.xcodeproj */; }, ); @@ -246,18 +246,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BCB6B88C150447DF0041703B /* libGPUImage.a */ = { + BCF866F11725A41E00912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BCB6B88B150447DF0041703B /* PBXContainerItemProxy */; + remoteRef = BCF866F01725A41E00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BCB6B88E150447DF0041703B /* GPUImageTests.octest */ = { + BCF866F31725A41E00912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BCB6B88D150447DF0041703B /* PBXContainerItemProxy */; + remoteRef = BCF866F21725A41E00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -294,10 +294,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BCB6B8A81505A9A40041703B /* PBXTargetDependency */ = { + BCF866F51725A43C00912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BCB6B8A71505A9A40041703B /* PBXContainerItemProxy */; + targetProxy = BCF866F41725A43C00912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -341,7 +341,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; OTHER_LDFLAGS = "-fobjc-arc"; PREBINDING = NO; @@ -359,7 +359,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = "-fobjc-arc"; diff --git a/examples/CubeExample/CubeExample_Prefix.pch b/examples/iOS/CubeExample/CubeExample_Prefix.pch similarity index 100% rename from examples/CubeExample/CubeExample_Prefix.pch rename to examples/iOS/CubeExample/CubeExample_Prefix.pch diff --git a/examples/CubeExample/Shaders/Shader.fsh b/examples/iOS/CubeExample/Shaders/Shader.fsh similarity index 100% rename from examples/CubeExample/Shaders/Shader.fsh rename to examples/iOS/CubeExample/Shaders/Shader.fsh diff --git a/examples/CubeExample/Shaders/Shader.vsh b/examples/iOS/CubeExample/Shaders/Shader.vsh similarity index 100% rename from examples/CubeExample/Shaders/Shader.vsh rename to examples/iOS/CubeExample/Shaders/Shader.vsh diff --git a/examples/CubeExample/main.m b/examples/iOS/CubeExample/main.m similarity index 100% rename from examples/CubeExample/main.m rename to examples/iOS/CubeExample/main.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj similarity index 94% rename from examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index ab5f3e26d..ae8cb3e1b 100644 --- a/examples/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ BC18E0A5156C822E00AB8026 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0A3156C822E00AB8026 /* InfoPlist.strings */; }; BC18E0A7156C822E00AB8026 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BC18E0A6156C822E00AB8026 /* main.m */; }; BC18E0AB156C822E00AB8026 /* FeatureExtractionAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BC18E0AA156C822E00AB8026 /* FeatureExtractionAppDelegate.m */; }; - BC18E0C0156C833800AB8026 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0BB156C830F00AB8026 /* libGPUImage.a */; }; BC18E0C4156C835500AB8026 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C1156C835500AB8026 /* CoreMedia.framework */; }; BC18E0C5156C835500AB8026 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C2156C835500AB8026 /* CoreVideo.framework */; }; BC18E0C6156C835500AB8026 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C3156C835500AB8026 /* QuartzCore.framework */; }; @@ -30,24 +29,25 @@ BCB79DC715E9754000965D92 /* ChairTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB79DC615E9754000965D92 /* ChairTest.png */; }; BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCD9A355157EC35E00C41504 /* 8pixeltest.png */; }; BCF2860F1628A5140051E9C5 /* LineTest2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF2860E1628A5140051E9C5 /* LineTest2.png */; }; + BCF867031725A53400912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF866FE1725A4E600912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BC18E0BA156C830F00AB8026 /* PBXContainerItemProxy */ = { + BCF866FD1725A4E600912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BC18E0BC156C830F00AB8026 /* PBXContainerItemProxy */ = { + BCF866FF1725A4E600912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BC18E0BE156C832900AB8026 /* PBXContainerItemProxy */ = { + BCF867011725A52D00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */; proxyType = 1; @@ -67,7 +67,7 @@ BC18E0A8156C822E00AB8026 /* FeatureExtractionTest-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FeatureExtractionTest-Prefix.pch"; sourceTree = ""; }; BC18E0A9156C822E00AB8026 /* FeatureExtractionAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FeatureExtractionAppDelegate.h; sourceTree = ""; }; BC18E0AA156C822E00AB8026 /* FeatureExtractionAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FeatureExtractionAppDelegate.m; sourceTree = ""; }; - BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BC18E0C1156C835500AB8026 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BC18E0C2156C835500AB8026 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; BC18E0C3156C835500AB8026 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; @@ -91,12 +91,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF867031725A53400912E34 /* libGPUImage.a in Frameworks */, BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */, BC18E0C8156C835E00AB8026 /* OpenGLES.framework in Frameworks */, BC18E0C4156C835500AB8026 /* CoreMedia.framework in Frameworks */, BC18E0C5156C835500AB8026 /* CoreVideo.framework in Frameworks */, BC18E0C6156C835500AB8026 /* QuartzCore.framework in Frameworks */, - BC18E0C0156C833800AB8026 /* libGPUImage.a in Frameworks */, BC18E09B156C822E00AB8026 /* UIKit.framework in Frameworks */, BC18E09D156C822E00AB8026 /* Foundation.framework in Frameworks */, BC18E09F156C822E00AB8026 /* CoreGraphics.framework in Frameworks */, @@ -171,11 +171,11 @@ name = "Supporting Files"; sourceTree = ""; }; - BC18E0B2156C830F00AB8026 /* Products */ = { + BCF866F81725A4E600912E34 /* Products */ = { isa = PBXGroup; children = ( - BC18E0BB156C830F00AB8026 /* libGPUImage.a */, - BC18E0BD156C830F00AB8026 /* GPUImageTests.octest */, + BCF866FE1725A4E600912E34 /* libGPUImage.a */, + BCF867001725A4E600912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -194,7 +194,7 @@ buildRules = ( ); dependencies = ( - BC18E0BF156C832900AB8026 /* PBXTargetDependency */, + BCF867021725A52D00912E34 /* PBXTargetDependency */, ); name = FeatureExtractionTest; productName = FeatureExtractionTest; @@ -223,7 +223,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BC18E0B2156C830F00AB8026 /* Products */; + ProductGroup = BCF866F81725A4E600912E34 /* Products */; ProjectRef = BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */; }, ); @@ -235,18 +235,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BC18E0BB156C830F00AB8026 /* libGPUImage.a */ = { + BCF866FE1725A4E600912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BC18E0BA156C830F00AB8026 /* PBXContainerItemProxy */; + remoteRef = BCF866FD1725A4E600912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BC18E0BD156C830F00AB8026 /* GPUImageTests.octest */ = { + BCF867001725A4E600912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BC18E0BC156C830F00AB8026 /* PBXContainerItemProxy */; + remoteRef = BCF866FF1725A4E600912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -286,10 +286,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BC18E0BF156C832900AB8026 /* PBXTargetDependency */ = { + BCF867021725A52D00912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BC18E0BE156C832900AB8026 /* PBXContainerItemProxy */; + targetProxy = BCF867011725A52D00912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -325,7 +325,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -345,7 +345,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/71yih.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/71yih.png similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/71yih.png rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/71yih.png diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/8pixeltest.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/8pixeltest.png similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/8pixeltest.png rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/8pixeltest.png diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/ChairTest.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/ChairTest.png similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/ChairTest.png rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/ChairTest.png diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.h diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Info.plist diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionTest-Prefix.pch diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/LBPTest.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/LBPTest.png similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/LBPTest.png rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/LBPTest.png diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/LineTest.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/LineTest.png similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/LineTest.png rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/LineTest.png diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/LineTest2.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/LineTest2.png similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/LineTest2.png rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/LineTest2.png diff --git a/examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/en.lproj/InfoPlist.strings old mode 100755 new mode 100644 similarity index 100% rename from examples/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/en.lproj/InfoPlist.strings diff --git a/examples/FeatureExtractionTest/FeatureExtractionTest/main.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/main.m similarity index 100% rename from examples/FeatureExtractionTest/FeatureExtractionTest/main.m rename to examples/iOS/FeatureExtractionTest/FeatureExtractionTest/main.m diff --git a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj similarity index 93% rename from examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj rename to examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 68798cff8..55c5ffcbf 100755 --- a/examples/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -24,7 +24,6 @@ BC982B3614F04B3A0001FF6F /* ShowcaseFilterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B3414F04B3A0001FF6F /* ShowcaseFilterViewController.m */; }; BC982B3714F04B3A0001FF6F /* ShowcaseFilterViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC982B3514F04B3A0001FF6F /* ShowcaseFilterViewController.xib */; }; BC982B3F14F05DC20001FF6F /* ShowcaseFilterListController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B3E14F05DC10001FF6F /* ShowcaseFilterListController.m */; }; - BC982B4214F06BF70001FF6F /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC982B3014F049950001FF6F /* libGPUImage.a */; }; BC982BD114F1C0F00001FF6F /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BC982BD014F1C0F00001FF6F /* WID-small.jpg */; }; BC982C4114F1F6C80001FF6F /* CustomFilter.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BC982C4014F1F6C80001FF6F /* CustomFilter.fsh */; }; BCB3C3C516BCA2EB003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C016BCA2EB003D26B0 /* Icon-72.png */; }; @@ -32,6 +31,7 @@ BCB3C3C716BCA2EB003D26B0 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C216BCA2EB003D26B0 /* Icon.png */; }; BCB3C3C816BCA2EB003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C316BCA2EB003D26B0 /* Icon@2x.png */; }; BCB3C3C916BCA2EB003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3C416BCA2EB003D26B0 /* iTunesArtwork.png */; }; + BCF866CF1725A19A00912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF866C41725894100912E34 /* libGPUImage.a */; }; BCF9D9AB15CCD1AF007E7FBA /* lookup_amatorka.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */; }; BCF9D9AC15CCD1AF007E7FBA /* lookup_miss_etikate.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */; }; BCF9D9AD15CCD1AF007E7FBA /* lookup_soft_elegance_1.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */; }; @@ -43,21 +43,21 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BC982B2F14F049950001FF6F /* PBXContainerItemProxy */ = { + BCF866C31725894100912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC982B2714F049950001FF6F /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BC982B3114F049950001FF6F /* PBXContainerItemProxy */ = { + BCF866C51725894100912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC982B2714F049950001FF6F /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BC982B4014F06BF00001FF6F /* PBXContainerItemProxy */ = { + BCF866CD1725A19100912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC982B2714F049950001FF6F /* GPUImage.xcodeproj */; proxyType = 1; @@ -85,7 +85,7 @@ BC982B1F14F048160001FF6F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BC982B2314F0481C0001FF6F /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BC982B2514F048230001FF6F /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - BC982B2714F049950001FF6F /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BC982B2714F049950001FF6F /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BC982B3314F04B3A0001FF6F /* ShowcaseFilterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShowcaseFilterViewController.h; sourceTree = ""; }; BC982B3414F04B3A0001FF6F /* ShowcaseFilterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShowcaseFilterViewController.m; sourceTree = ""; }; BC982B3514F04B3A0001FF6F /* ShowcaseFilterViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ShowcaseFilterViewController.xib; sourceTree = ""; }; @@ -98,10 +98,10 @@ BCB3C3C216BCA2EB003D26B0 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../../SharedIcons/Icon.png; sourceTree = ""; }; BCB3C3C316BCA2EB003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; BCB3C3C416BCA2EB003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; - BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_amatorka.png; path = ../../../framework/Resources/lookup_amatorka.png; sourceTree = ""; }; - BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; - BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; - BCF9D9AA15CCD1AF007E7FBA /* lookup_soft_elegance_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_2.png; path = ../../../framework/Resources/lookup_soft_elegance_2.png; sourceTree = ""; }; + BCF9D9A715CCD1AF007E7FBA /* lookup_amatorka.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_amatorka.png; path = ../../../../framework/Resources/lookup_amatorka.png; sourceTree = ""; }; + BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; + BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; + BCF9D9AA15CCD1AF007E7FBA /* lookup_soft_elegance_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_2.png; path = ../../../../framework/Resources/lookup_soft_elegance_2.png; sourceTree = ""; }; F2F3361D156585C400B0FBB8 /* voroni_points2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voroni_points2.png; sourceTree = ""; }; F2F336261565906000B0FBB8 /* dotletterstiles.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dotletterstiles.png; sourceTree = ""; }; F2F33628156591CA00B0FBB8 /* curvies.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = curvies.png; sourceTree = ""; }; @@ -113,8 +113,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF866CF1725A19A00912E34 /* libGPUImage.a in Frameworks */, 6BF3ED5715B5C2BF002F9E9E /* CoreImage.framework in Frameworks */, - BC982B4214F06BF70001FF6F /* libGPUImage.a in Frameworks */, BC982B2614F048230001FF6F /* OpenGLES.framework in Frameworks */, BC982B2414F0481C0001FF6F /* AVFoundation.framework in Frameworks */, BC982B2014F048160001FF6F /* CoreMedia.framework in Frameworks */, @@ -206,11 +206,11 @@ name = "Supporting Files"; sourceTree = ""; }; - BC982B2814F049950001FF6F /* Products */ = { + BCF866BE1725894100912E34 /* Products */ = { isa = PBXGroup; children = ( - BC982B3014F049950001FF6F /* libGPUImage.a */, - BC982B3214F049950001FF6F /* GPUImageTests.octest */, + BCF866C41725894100912E34 /* libGPUImage.a */, + BCF866C61725894100912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -229,7 +229,7 @@ buildRules = ( ); dependencies = ( - BC982B4114F06BF00001FF6F /* PBXTargetDependency */, + BCF866CE1725A19100912E34 /* PBXTargetDependency */, ); name = FilterShowcase; productName = FilterShowcase; @@ -258,7 +258,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BC982B2814F049950001FF6F /* Products */; + ProductGroup = BCF866BE1725894100912E34 /* Products */; ProjectRef = BC982B2714F049950001FF6F /* GPUImage.xcodeproj */; }, ); @@ -270,18 +270,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BC982B3014F049950001FF6F /* libGPUImage.a */ = { + BCF866C41725894100912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BC982B2F14F049950001FF6F /* PBXContainerItemProxy */; + remoteRef = BCF866C31725894100912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BC982B3214F049950001FF6F /* GPUImageTests.octest */ = { + BCF866C61725894100912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BC982B3114F049950001FF6F /* PBXContainerItemProxy */; + remoteRef = BCF866C51725894100912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -330,10 +330,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BC982B4114F06BF00001FF6F /* PBXTargetDependency */ = { + BCF866CE1725A19100912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BC982B4014F06BF00001FF6F /* PBXContainerItemProxy */; + targetProxy = BCF866CD1725A19100912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -368,7 +368,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; @@ -388,7 +388,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = "-ObjC"; diff --git a/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh b/examples/iOS/FilterShowcase/FilterShowcase/CustomFilter.fsh similarity index 100% rename from examples/FilterShowcase/FilterShowcase/CustomFilter.fsh rename to examples/iOS/FilterShowcase/FilterShowcase/CustomFilter.fsh diff --git a/examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist b/examples/iOS/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist similarity index 100% rename from examples/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist rename to examples/iOS/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist diff --git a/examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch b/examples/iOS/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch similarity index 100% rename from examples/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch rename to examples/iOS/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch diff --git a/examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist b/examples/iOS/FilterShowcase/FilterShowcase/SampleConfiguration.plist similarity index 100% rename from examples/FilterShowcase/FilterShowcase/SampleConfiguration.plist rename to examples/iOS/FilterShowcase/FilterShowcase/SampleConfiguration.plist diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h similarity index 100% rename from examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h rename to examples/iOS/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.h diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m similarity index 100% rename from examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m rename to examples/iOS/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h similarity index 100% rename from examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h rename to examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.h diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m similarity index 99% rename from examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m rename to examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index e0cd9caca..9f96a283c 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -45,7 +45,7 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Disable the last filter (Core Image face detection) if running on iOS 4.0 - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { return GPUIMAGE_NUMFILTERS; } diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h similarity index 100% rename from examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h rename to examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m similarity index 99% rename from examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m rename to examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index c1139cb85..3feba711f 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -31,7 +31,7 @@ - (void)viewDidLoad { [super viewDidLoad]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil]; self.faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib similarity index 100% rename from examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib rename to examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.xib diff --git a/examples/FilterShowcase/FilterShowcase/curvies.png b/examples/iOS/FilterShowcase/FilterShowcase/curvies.png similarity index 100% rename from examples/FilterShowcase/FilterShowcase/curvies.png rename to examples/iOS/FilterShowcase/FilterShowcase/curvies.png diff --git a/examples/FilterShowcase/FilterShowcase/dotletterstiles.png b/examples/iOS/FilterShowcase/FilterShowcase/dotletterstiles.png similarity index 100% rename from examples/FilterShowcase/FilterShowcase/dotletterstiles.png rename to examples/iOS/FilterShowcase/FilterShowcase/dotletterstiles.png diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings b/examples/iOS/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings rename to examples/iOS/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings diff --git a/examples/FilterShowcase/FilterShowcase/main.m b/examples/iOS/FilterShowcase/FilterShowcase/main.m similarity index 100% rename from examples/FilterShowcase/FilterShowcase/main.m rename to examples/iOS/FilterShowcase/FilterShowcase/main.m diff --git a/examples/FilterShowcase/FilterShowcase/mask.png b/examples/iOS/FilterShowcase/FilterShowcase/mask.png similarity index 100% rename from examples/FilterShowcase/FilterShowcase/mask.png rename to examples/iOS/FilterShowcase/FilterShowcase/mask.png diff --git a/examples/FilterShowcase/FilterShowcase/squares.png b/examples/iOS/FilterShowcase/FilterShowcase/squares.png similarity index 100% rename from examples/FilterShowcase/FilterShowcase/squares.png rename to examples/iOS/FilterShowcase/FilterShowcase/squares.png diff --git a/examples/FilterShowcase/FilterShowcase/voroni_points2.png b/examples/iOS/FilterShowcase/FilterShowcase/voroni_points2.png similarity index 100% rename from examples/FilterShowcase/FilterShowcase/voroni_points2.png rename to examples/iOS/FilterShowcase/FilterShowcase/voroni_points2.png diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj similarity index 94% rename from examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj index 5472cd4b9..ebe0c4527 100755 --- a/examples/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj +++ b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ BC01CA9014E7620600967264 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BC01CA8E14E7620600967264 /* InfoPlist.strings */; }; BC01CA9214E7620600967264 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01CA9114E7620600967264 /* main.m */; }; BC01CA9614E7620600967264 /* MultiViewAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01CA9514E7620600967264 /* MultiViewAppDelegate.m */; }; - BC01CAAA14E762DE00967264 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAA514E762BF00967264 /* libGPUImage.a */; }; BC01CAAC14E762E600967264 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAAB14E762E600967264 /* CoreMedia.framework */; }; BC01CAAE14E762EE00967264 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAAD14E762EE00967264 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BC01CAB014E762F600967264 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC01CAAF14E762F600967264 /* QuartzCore.framework */; }; @@ -27,24 +26,25 @@ BCB3C40916BCA69F003D26B0 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40416BCA69F003D26B0 /* Icon@2x.png */; }; BCB3C40A16BCA69F003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40516BCA69F003D26B0 /* iTunesArtwork.png */; }; BCB5DD6614E76CD2000AF3C2 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DD6514E76CD2000AF3C2 /* AVFoundation.framework */; }; + BCF867101725A58F00912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8670B1725A56D00912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BC01CAA414E762BF00967264 /* PBXContainerItemProxy */ = { + BCF8670A1725A56D00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC01CA9C14E762BE00967264 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BC01CAA614E762BF00967264 /* PBXContainerItemProxy */ = { + BCF8670C1725A56D00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC01CA9C14E762BE00967264 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BC01CAA814E762D100967264 /* PBXContainerItemProxy */ = { + BCF8670E1725A58A00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC01CA9C14E762BE00967264 /* GPUImage.xcodeproj */; proxyType = 1; @@ -64,7 +64,7 @@ BC01CA9314E7620600967264 /* MultiViewFilterExample-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MultiViewFilterExample-Prefix.pch"; sourceTree = ""; }; BC01CA9414E7620600967264 /* MultiViewAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MultiViewAppDelegate.h; sourceTree = ""; }; BC01CA9514E7620600967264 /* MultiViewAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MultiViewAppDelegate.m; sourceTree = ""; }; - BC01CA9C14E762BE00967264 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BC01CA9C14E762BE00967264 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BC01CAAB14E762E600967264 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BC01CAAD14E762EE00967264 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; BC01CAAF14E762F600967264 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; @@ -86,12 +86,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF867101725A58F00912E34 /* libGPUImage.a in Frameworks */, BCB5DD6614E76CD2000AF3C2 /* AVFoundation.framework in Frameworks */, BC01CAB214E762FD00967264 /* OpenGLES.framework in Frameworks */, BC01CAB014E762F600967264 /* QuartzCore.framework in Frameworks */, BC01CAAE14E762EE00967264 /* CoreVideo.framework in Frameworks */, BC01CAAC14E762E600967264 /* CoreMedia.framework in Frameworks */, - BC01CAAA14E762DE00967264 /* libGPUImage.a in Frameworks */, BC01CA8614E7620600967264 /* UIKit.framework in Frameworks */, BC01CA8814E7620600967264 /* Foundation.framework in Frameworks */, BC01CA8A14E7620600967264 /* CoreGraphics.framework in Frameworks */, @@ -164,11 +164,11 @@ name = "Supporting Files"; sourceTree = ""; }; - BC01CA9D14E762BE00967264 /* Products */ = { + BCF867051725A56D00912E34 /* Products */ = { isa = PBXGroup; children = ( - BC01CAA514E762BF00967264 /* libGPUImage.a */, - BC01CAA714E762BF00967264 /* GPUImageTests.octest */, + BCF8670B1725A56D00912E34 /* libGPUImage.a */, + BCF8670D1725A56D00912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -187,7 +187,7 @@ buildRules = ( ); dependencies = ( - BC01CAA914E762D100967264 /* PBXTargetDependency */, + BCF8670F1725A58A00912E34 /* PBXTargetDependency */, ); name = MultiViewFilterExample; productName = MultiViewFilterExample; @@ -215,7 +215,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BC01CA9D14E762BE00967264 /* Products */; + ProductGroup = BCF867051725A56D00912E34 /* Products */; ProjectRef = BC01CA9C14E762BE00967264 /* GPUImage.xcodeproj */; }, ); @@ -227,18 +227,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BC01CAA514E762BF00967264 /* libGPUImage.a */ = { + BCF8670B1725A56D00912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BC01CAA414E762BF00967264 /* PBXContainerItemProxy */; + remoteRef = BCF8670A1725A56D00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BC01CAA714E762BF00967264 /* GPUImageTests.octest */ = { + BCF8670D1725A56D00912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BC01CAA614E762BF00967264 /* PBXContainerItemProxy */; + remoteRef = BCF8670C1725A56D00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -275,10 +275,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BC01CAA914E762D100967264 /* PBXTargetDependency */ = { + BCF8670F1725A58A00912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BC01CAA814E762D100967264 /* PBXContainerItemProxy */; + targetProxy = BCF8670E1725A58A00912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -315,7 +315,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/Source/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_LDFLAGS = "-fobjc-arc"; PROVISIONING_PROFILE = ""; @@ -338,7 +338,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/Source/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = "-fobjc-arc"; diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.h b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.h similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.h rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.h diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewAppDelegate.m diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.h b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.h similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.h rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.h diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh diff --git a/examples/RawDataTest/RawDataTest/en.lproj/InfoPlist.strings b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 similarity index 100% rename from examples/RawDataTest/RawDataTest/en.lproj/InfoPlist.strings rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/main.m b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/main.m similarity index 100% rename from examples/MultiViewFilterExample/MultiViewFilterExample/main.m rename to examples/iOS/MultiViewFilterExample/MultiViewFilterExample/main.m diff --git a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj b/examples/iOS/RawDataTest/RawDataTest.xcodeproj/project.pbxproj similarity index 93% rename from examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj rename to examples/iOS/RawDataTest/RawDataTest.xcodeproj/project.pbxproj index cff6c455f..20d91ce04 100644 --- a/examples/RawDataTest/RawDataTest.xcodeproj/project.pbxproj +++ b/examples/iOS/RawDataTest/RawDataTest.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - BC18E03D156B352E00AB8026 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E62F1569D454006B155F /* libGPUImage.a */; }; BC18E03F156B354000AB8026 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E03E156B354000AB8026 /* CoreMedia.framework */; }; BCB3C41116BCA74F003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40E16BCA74F003D26B0 /* Icon-72.png */; }; BCB3C41216BCA74F003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40F16BCA74F003D26B0 /* Icon-72@2x.png */; }; @@ -25,24 +24,25 @@ BCF1E6231569D42A006B155F /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6211569D42A006B155F /* OpenGLES.framework */; }; BCF1E6241569D42A006B155F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6221569D42A006B155F /* QuartzCore.framework */; }; BCF1E63F156AAB4E006B155F /* CalculationShader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCF1E63E156AAB4E006B155F /* CalculationShader.fsh */; }; + BCF8671D1725A63600912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867181725A62900912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BCF1E62E1569D454006B155F /* PBXContainerItemProxy */ = { + BCF867171725A62900912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCF1E6251569D453006B155F /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BCF1E6301569D454006B155F /* PBXContainerItemProxy */ = { + BCF867191725A62900912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCF1E6251569D453006B155F /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BCF1E6371569D565006B155F /* PBXContainerItemProxy */ = { + BCF8671B1725A63100912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCF1E6251569D453006B155F /* GPUImage.xcodeproj */; proxyType = 1; @@ -72,7 +72,7 @@ BCF1E61F1569D408006B155F /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCF1E6211569D42A006B155F /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; BCF1E6221569D42A006B155F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - BCF1E6251569D453006B155F /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCF1E6251569D453006B155F /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCF1E63E156AAB4E006B155F /* CalculationShader.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = CalculationShader.fsh; sourceTree = ""; }; /* End PBXFileReference section */ @@ -81,8 +81,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF8671D1725A63600912E34 /* libGPUImage.a in Frameworks */, BC18E03F156B354000AB8026 /* CoreMedia.framework in Frameworks */, - BC18E03D156B352E00AB8026 /* libGPUImage.a in Frameworks */, BCF1E6231569D42A006B155F /* OpenGLES.framework in Frameworks */, BCF1E6241569D42A006B155F /* QuartzCore.framework in Frameworks */, BCF1E6201569D408006B155F /* AVFoundation.framework in Frameworks */, @@ -99,7 +99,6 @@ BCF1E5F71569D372006B155F = { isa = PBXGroup; children = ( - BC18E03E156B354000AB8026 /* CoreMedia.framework */, BCF1E60C1569D372006B155F /* RawDataTest */, BCF1E6051569D372006B155F /* Frameworks */, BCF1E6031569D372006B155F /* Products */, @@ -118,6 +117,7 @@ isa = PBXGroup; children = ( BCF1E6251569D453006B155F /* GPUImage.xcodeproj */, + BC18E03E156B354000AB8026 /* CoreMedia.framework */, BCF1E6211569D42A006B155F /* OpenGLES.framework */, BCF1E6221569D42A006B155F /* QuartzCore.framework */, BCF1E61F1569D408006B155F /* AVFoundation.framework */, @@ -156,11 +156,11 @@ name = "Supporting Files"; sourceTree = ""; }; - BCF1E6261569D453006B155F /* Products */ = { + BCF867121725A62900912E34 /* Products */ = { isa = PBXGroup; children = ( - BCF1E62F1569D454006B155F /* libGPUImage.a */, - BCF1E6311569D454006B155F /* GPUImageTests.octest */, + BCF867181725A62900912E34 /* libGPUImage.a */, + BCF8671A1725A62900912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -179,7 +179,7 @@ buildRules = ( ); dependencies = ( - BCF1E6381569D565006B155F /* PBXTargetDependency */, + BCF8671C1725A63100912E34 /* PBXTargetDependency */, ); name = RawDataTest; productName = RawDataTest; @@ -208,7 +208,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BCF1E6261569D453006B155F /* Products */; + ProductGroup = BCF867121725A62900912E34 /* Products */; ProjectRef = BCF1E6251569D453006B155F /* GPUImage.xcodeproj */; }, ); @@ -220,18 +220,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BCF1E62F1569D454006B155F /* libGPUImage.a */ = { + BCF867181725A62900912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BCF1E62E1569D454006B155F /* PBXContainerItemProxy */; + remoteRef = BCF867171725A62900912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BCF1E6311569D454006B155F /* GPUImageTests.octest */ = { + BCF8671A1725A62900912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BCF1E6301569D454006B155F /* PBXContainerItemProxy */; + remoteRef = BCF867191725A62900912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -266,10 +266,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BCF1E6381569D565006B155F /* PBXTargetDependency */ = { + BCF8671C1725A63100912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BCF1E6371569D565006B155F /* PBXContainerItemProxy */; + targetProxy = BCF8671B1725A63100912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -293,7 +293,6 @@ CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = "../../framework/**"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -306,7 +305,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -321,13 +320,12 @@ CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; - FRAMEWORK_SEARCH_PATHS = "../../framework/**"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; diff --git a/examples/RawDataTest/RawDataTest/CalculationShader.fsh b/examples/iOS/RawDataTest/RawDataTest/CalculationShader.fsh similarity index 100% rename from examples/RawDataTest/RawDataTest/CalculationShader.fsh rename to examples/iOS/RawDataTest/RawDataTest/CalculationShader.fsh diff --git a/examples/RawDataTest/RawDataTest/RawDataTest-Info.plist b/examples/iOS/RawDataTest/RawDataTest/RawDataTest-Info.plist similarity index 100% rename from examples/RawDataTest/RawDataTest/RawDataTest-Info.plist rename to examples/iOS/RawDataTest/RawDataTest/RawDataTest-Info.plist diff --git a/examples/RawDataTest/RawDataTest/RawDataTest-Prefix.pch b/examples/iOS/RawDataTest/RawDataTest/RawDataTest-Prefix.pch similarity index 100% rename from examples/RawDataTest/RawDataTest/RawDataTest-Prefix.pch rename to examples/iOS/RawDataTest/RawDataTest/RawDataTest-Prefix.pch diff --git a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h b/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.h similarity index 100% rename from examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.h rename to examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.h diff --git a/examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m b/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m similarity index 100% rename from examples/RawDataTest/RawDataTest/RawDataTestAppDelegate.m rename to examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m diff --git a/examples/SimpleImageFilter/SimpleImageFilter/en.lproj/InfoPlist.strings b/examples/iOS/RawDataTest/RawDataTest/en.lproj/InfoPlist.strings old mode 100755 new mode 100644 similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/en.lproj/InfoPlist.strings rename to examples/iOS/RawDataTest/RawDataTest/en.lproj/InfoPlist.strings diff --git a/examples/RawDataTest/RawDataTest/main.m b/examples/iOS/RawDataTest/RawDataTest/main.m similarity index 100% rename from examples/RawDataTest/RawDataTest/main.m rename to examples/iOS/RawDataTest/RawDataTest/main.m diff --git a/examples/SharedIcons/Icon-72.png b/examples/iOS/SharedIcons/Icon-72.png similarity index 100% rename from examples/SharedIcons/Icon-72.png rename to examples/iOS/SharedIcons/Icon-72.png diff --git a/examples/SharedIcons/Icon-72@2x.png b/examples/iOS/SharedIcons/Icon-72@2x.png similarity index 100% rename from examples/SharedIcons/Icon-72@2x.png rename to examples/iOS/SharedIcons/Icon-72@2x.png diff --git a/examples/SharedIcons/Icon-Small-50.png b/examples/iOS/SharedIcons/Icon-Small-50.png similarity index 100% rename from examples/SharedIcons/Icon-Small-50.png rename to examples/iOS/SharedIcons/Icon-Small-50.png diff --git a/examples/SharedIcons/Icon-Small-50@2x.png b/examples/iOS/SharedIcons/Icon-Small-50@2x.png similarity index 100% rename from examples/SharedIcons/Icon-Small-50@2x.png rename to examples/iOS/SharedIcons/Icon-Small-50@2x.png diff --git a/examples/SharedIcons/Icon-Small.png b/examples/iOS/SharedIcons/Icon-Small.png similarity index 100% rename from examples/SharedIcons/Icon-Small.png rename to examples/iOS/SharedIcons/Icon-Small.png diff --git a/examples/SharedIcons/Icon-Small@2x.png b/examples/iOS/SharedIcons/Icon-Small@2x.png similarity index 100% rename from examples/SharedIcons/Icon-Small@2x.png rename to examples/iOS/SharedIcons/Icon-Small@2x.png diff --git a/examples/SharedIcons/Icon.png b/examples/iOS/SharedIcons/Icon.png similarity index 100% rename from examples/SharedIcons/Icon.png rename to examples/iOS/SharedIcons/Icon.png diff --git a/examples/SharedIcons/Icon@2x.png b/examples/iOS/SharedIcons/Icon@2x.png similarity index 100% rename from examples/SharedIcons/Icon@2x.png rename to examples/iOS/SharedIcons/Icon@2x.png diff --git a/examples/SharedIcons/iTunesArtwork.png b/examples/iOS/SharedIcons/iTunesArtwork.png similarity index 100% rename from examples/SharedIcons/iTunesArtwork.png rename to examples/iOS/SharedIcons/iTunesArtwork.png diff --git a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj b/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj similarity index 93% rename from examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj rename to examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj index 25ac78ead..1fec12af7 100755 --- a/examples/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj @@ -19,7 +19,6 @@ BCB5E7F914E605A900701302 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7F814E605A900701302 /* main.m */; }; BCB5E7FD14E605A900701302 /* SimpleImageAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7FC14E605A900701302 /* SimpleImageAppDelegate.m */; }; BCB5E80614E605A900701302 /* SimpleImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E80514E605A900701302 /* SimpleImageViewController.m */; }; - BCB5E81A14E6136B00701302 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E81514E610BE00701302 /* libGPUImage.a */; }; BCB5E82314E62A3C00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E81E14E62A3C00701302 /* AVFoundation.framework */; }; BCB5E82414E62A3C00701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E81F14E62A3C00701302 /* CoreMedia.framework */; }; BCB5E82514E62A3C00701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E82014E62A3C00701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; @@ -27,24 +26,25 @@ BCB5E82714E62A3C00701302 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E82214E62A3C00701302 /* QuartzCore.framework */; }; BCB5E86314E6F05A00701302 /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E86214E6F05A00701302 /* WID-small.jpg */; }; BCB5E86514E6F1D700701302 /* Lambeau.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E86414E6F1D700701302 /* Lambeau.jpg */; }; + BCF8672A1725A6B400912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867251725A69A00912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BCB5E81414E610BE00701302 /* PBXContainerItemProxy */ = { + BCF867241725A69A00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5E80C14E610BE00701302 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BCB5E81614E610BE00701302 /* PBXContainerItemProxy */ = { + BCF867261725A69A00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5E80C14E610BE00701302 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BCB5E81814E6118A00701302 /* PBXContainerItemProxy */ = { + BCF867281725A6AD00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5E80C14E610BE00701302 /* GPUImage.xcodeproj */; proxyType = 1; @@ -71,7 +71,7 @@ BCB5E7FC14E605A900701302 /* SimpleImageAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleImageAppDelegate.m; sourceTree = ""; }; BCB5E80414E605A900701302 /* SimpleImageViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleImageViewController.h; sourceTree = ""; }; BCB5E80514E605A900701302 /* SimpleImageViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleImageViewController.m; sourceTree = ""; }; - BCB5E80C14E610BE00701302 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCB5E80C14E610BE00701302 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCB5E81E14E62A3C00701302 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCB5E81F14E62A3C00701302 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCB5E82014E62A3C00701302 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; @@ -86,12 +86,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF8672A1725A6B400912E34 /* libGPUImage.a in Frameworks */, BCB5E82314E62A3C00701302 /* AVFoundation.framework in Frameworks */, BCB5E82414E62A3C00701302 /* CoreMedia.framework in Frameworks */, BCB5E82514E62A3C00701302 /* CoreVideo.framework in Frameworks */, BCB5E82614E62A3C00701302 /* OpenGLES.framework in Frameworks */, BCB5E82714E62A3C00701302 /* QuartzCore.framework in Frameworks */, - BCB5E81A14E6136B00701302 /* libGPUImage.a in Frameworks */, BCB5E7ED14E605A900701302 /* UIKit.framework in Frameworks */, BCB5E7EF14E605A900701302 /* Foundation.framework in Frameworks */, BCB5E7F114E605A900701302 /* CoreGraphics.framework in Frameworks */, @@ -164,11 +164,11 @@ name = "Supporting Files"; sourceTree = ""; }; - BCB5E80D14E610BE00701302 /* Products */ = { + BCF8671F1725A69A00912E34 /* Products */ = { isa = PBXGroup; children = ( - BCB5E81514E610BE00701302 /* libGPUImage.a */, - BCB5E81714E610BE00701302 /* GPUImageTests.octest */, + BCF867251725A69A00912E34 /* libGPUImage.a */, + BCF867271725A69A00912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -187,7 +187,7 @@ buildRules = ( ); dependencies = ( - BCB5E81914E6118A00701302 /* PBXTargetDependency */, + BCF867291725A6AD00912E34 /* PBXTargetDependency */, ); name = SimpleImageFilter; productName = SimpleImageFilter; @@ -215,7 +215,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BCB5E80D14E610BE00701302 /* Products */; + ProductGroup = BCF8671F1725A69A00912E34 /* Products */; ProjectRef = BCB5E80C14E610BE00701302 /* GPUImage.xcodeproj */; }, ); @@ -227,18 +227,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BCB5E81514E610BE00701302 /* libGPUImage.a */ = { + BCF867251725A69A00912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BCB5E81414E610BE00701302 /* PBXContainerItemProxy */; + remoteRef = BCF867241725A69A00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BCB5E81714E610BE00701302 /* GPUImageTests.octest */ = { + BCF867271725A69A00912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BCB5E81614E610BE00701302 /* PBXContainerItemProxy */; + remoteRef = BCF867261725A69A00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -275,10 +275,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BCB5E81914E6118A00701302 /* PBXTargetDependency */ = { + BCF867291725A6AD00912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BCB5E81814E6118A00701302 /* PBXContainerItemProxy */; + targetProxy = BCF867281725A6AD00912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -314,7 +314,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/Source/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; @@ -335,7 +335,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/Source/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = "-ObjC"; diff --git a/examples/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg b/examples/iOS/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.h b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.h similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.h rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.h diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.m b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.m similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.m rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageAppDelegate.m diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Info.plist diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Prefix.pch b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Prefix.pch similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Prefix.pch rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageFilter-Prefix.pch diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.h diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m diff --git a/examples/SimpleImageFilter/SimpleImageFilter/WID-small.jpg b/examples/iOS/SimpleImageFilter/SimpleImageFilter/WID-small.jpg similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/WID-small.jpg rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/WID-small.jpg diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings b/examples/iOS/SimpleImageFilter/SimpleImageFilter/en.lproj/InfoPlist.strings similarity index 100% rename from examples/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/en.lproj/InfoPlist.strings diff --git a/examples/SimpleImageFilter/SimpleImageFilter/main.m b/examples/iOS/SimpleImageFilter/SimpleImageFilter/main.m similarity index 100% rename from examples/SimpleImageFilter/SimpleImageFilter/main.m rename to examples/iOS/SimpleImageFilter/SimpleImageFilter/main.m diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj similarity index 93% rename from examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index 8580fce2a..78ef8ad36 100755 --- a/examples/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -19,31 +19,31 @@ BCC1E6AB1523E3620006EFA5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCC1E6A91523E3620006EFA5 /* InfoPlist.strings */; }; BCC1E6AD1523E3620006EFA5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E6AC1523E3620006EFA5 /* main.m */; }; BCC1E6B11523E3630006EFA5 /* PhotoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E6B01523E3630006EFA5 /* PhotoAppDelegate.m */; }; - BCC1E6C51523E3A10006EFA5 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C01523E3880006EFA5 /* libGPUImage.a */; }; BCC1E6CA1523E3C50006EFA5 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C61523E3C50006EFA5 /* CoreMedia.framework */; }; BCC1E6CB1523E3C50006EFA5 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C71523E3C50006EFA5 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCC1E6CC1523E3C50006EFA5 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C81523E3C50006EFA5 /* OpenGLES.framework */; }; BCC1E6CD1523E3C50006EFA5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C91523E3C50006EFA5 /* QuartzCore.framework */; }; BCC1E6D01523E4780006EFA5 /* PhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E6CF1523E4780006EFA5 /* PhotoViewController.m */; }; BCC1E6DA1523E9DC0006EFA5 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6D91523E9DB0006EFA5 /* AVFoundation.framework */; }; + BCF867371725A72000912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867321725A70500912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BCC1E6BF1523E3880006EFA5 /* PBXContainerItemProxy */ = { + BCF867311725A70500912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCC1E6B71523E3880006EFA5 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BCC1E6C11523E3880006EFA5 /* PBXContainerItemProxy */ = { + BCF867331725A70500912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCC1E6B71523E3880006EFA5 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BCC1E6C31523E39F0006EFA5 /* PBXContainerItemProxy */ = { + BCF867351725A71B00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCC1E6B71523E3880006EFA5 /* GPUImage.xcodeproj */; proxyType = 1; @@ -69,7 +69,7 @@ BCC1E6AE1523E3620006EFA5 /* SimplePhotoFilter-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimplePhotoFilter-Prefix.pch"; sourceTree = ""; }; BCC1E6AF1523E3630006EFA5 /* PhotoAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PhotoAppDelegate.h; sourceTree = ""; }; BCC1E6B01523E3630006EFA5 /* PhotoAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PhotoAppDelegate.m; sourceTree = ""; }; - BCC1E6B71523E3880006EFA5 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCC1E6B71523E3880006EFA5 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCC1E6C61523E3C50006EFA5 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCC1E6C71523E3C50006EFA5 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; BCC1E6C81523E3C50006EFA5 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; @@ -84,13 +84,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF867371725A72000912E34 /* libGPUImage.a in Frameworks */, BC6ED8E11545B9A900966798 /* AssetsLibrary.framework in Frameworks */, BCC1E6DA1523E9DC0006EFA5 /* AVFoundation.framework in Frameworks */, BCC1E6CA1523E3C50006EFA5 /* CoreMedia.framework in Frameworks */, BCC1E6CB1523E3C50006EFA5 /* CoreVideo.framework in Frameworks */, BCC1E6CC1523E3C50006EFA5 /* OpenGLES.framework in Frameworks */, BCC1E6CD1523E3C50006EFA5 /* QuartzCore.framework in Frameworks */, - BCC1E6C51523E3A10006EFA5 /* libGPUImage.a in Frameworks */, BCC1E6A11523E3620006EFA5 /* UIKit.framework in Frameworks */, BCC1E6A31523E3620006EFA5 /* Foundation.framework in Frameworks */, BCC1E6A51523E3620006EFA5 /* CoreGraphics.framework in Frameworks */, @@ -162,11 +162,11 @@ name = "Supporting Files"; sourceTree = ""; }; - BCC1E6B81523E3880006EFA5 /* Products */ = { + BCF8672C1725A70500912E34 /* Products */ = { isa = PBXGroup; children = ( - BCC1E6C01523E3880006EFA5 /* libGPUImage.a */, - BCC1E6C21523E3880006EFA5 /* GPUImageTests.octest */, + BCF867321725A70500912E34 /* libGPUImage.a */, + BCF867341725A70500912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -185,7 +185,7 @@ buildRules = ( ); dependencies = ( - BCC1E6C41523E39F0006EFA5 /* PBXTargetDependency */, + BCF867361725A71B00912E34 /* PBXTargetDependency */, ); name = SimplePhotoFilter; productName = SimplePhotoFilter; @@ -214,7 +214,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BCC1E6B81523E3880006EFA5 /* Products */; + ProductGroup = BCF8672C1725A70500912E34 /* Products */; ProjectRef = BCC1E6B71523E3880006EFA5 /* GPUImage.xcodeproj */; }, ); @@ -226,18 +226,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BCC1E6C01523E3880006EFA5 /* libGPUImage.a */ = { + BCF867321725A70500912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BCC1E6BF1523E3880006EFA5 /* PBXContainerItemProxy */; + remoteRef = BCF867311725A70500912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BCC1E6C21523E3880006EFA5 /* GPUImageTests.octest */ = { + BCF867341725A70500912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BCC1E6C11523E3880006EFA5 /* PBXContainerItemProxy */; + remoteRef = BCF867331725A70500912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -272,10 +272,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BCC1E6C41523E39F0006EFA5 /* PBXTargetDependency */ = { + BCF867361725A71B00912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BCC1E6C31523E39F0006EFA5 /* PBXContainerItemProxy */; + targetProxy = BCF867351725A71B00912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -311,7 +311,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/Source/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -331,7 +331,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/Source/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.h b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.h similarity index 100% rename from examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.h rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.h diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.m b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.m similarity index 100% rename from examples/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.m rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoAppDelegate.m diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h similarity index 100% rename from examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m similarity index 100% rename from examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist similarity index 100% rename from examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch similarity index 100% rename from examples/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/en.lproj/InfoPlist.strings b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/en.lproj/InfoPlist.strings rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/main.m b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/main.m similarity index 100% rename from examples/SimplePhotoFilter/SimplePhotoFilter/main.m rename to examples/iOS/SimplePhotoFilter/SimplePhotoFilter/main.m diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj similarity index 94% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj index a888f31ae..d9a63428b 100755 --- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj @@ -27,25 +27,25 @@ BCB5DDFD14E876ED000AF3C2 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCB5DDFF14E87783000AF3C2 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFE14E87783000AF3C2 /* QuartzCore.framework */; }; BCB5DE0114E87789000AF3C2 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DE0014E87789000AF3C2 /* OpenGLES.framework */; }; - BCB5DE0214E8779B000AF3C2 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDF314E8756B000AF3C2 /* libGPUImage.a */; }; + BCF867441725AAA300912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8673F1725AA7E00912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BCB5DDF214E8756B000AF3C2 /* PBXContainerItemProxy */ = { + BCF8673E1725AA7E00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BCB5DDF414E8756B000AF3C2 /* PBXContainerItemProxy */ = { + BCF867401725AA7E00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BCB5DDF614E87573000AF3C2 /* PBXContainerItemProxy */ = { + BCF867421725AA9E00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */; proxyType = 1; @@ -75,7 +75,7 @@ BCB5DDE514E868C0000AF3C2 /* SimpleVideoFileFilterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleVideoFileFilterViewController.h; sourceTree = ""; }; BCB5DDE614E868C0000AF3C2 /* SimpleVideoFileFilterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleVideoFileFilterViewController.m; sourceTree = ""; }; BCB5DDE714E868C0000AF3C2 /* SimpleVideoFileFilterViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SimpleVideoFileFilterViewController.xib; sourceTree = ""; }; - BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCB5DDF814E876DD000AF3C2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCB5DDFA14E876ED000AF3C2 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; @@ -88,7 +88,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BCB5DE0214E8779B000AF3C2 /* libGPUImage.a in Frameworks */, + BCF867441725AAA300912E34 /* libGPUImage.a in Frameworks */, BCB5DE0114E87789000AF3C2 /* OpenGLES.framework in Frameworks */, BCB5DDFF14E87783000AF3C2 /* QuartzCore.framework in Frameworks */, BCB5DDFC14E876ED000AF3C2 /* CoreMedia.framework in Frameworks */, @@ -167,11 +167,11 @@ name = "Supporting Files"; sourceTree = ""; }; - BCB5DDEB14E8756A000AF3C2 /* Products */ = { + BCF867391725AA7E00912E34 /* Products */ = { isa = PBXGroup; children = ( - BCB5DDF314E8756B000AF3C2 /* libGPUImage.a */, - BCB5DDF514E8756B000AF3C2 /* GPUImageTests.octest */, + BCF8673F1725AA7E00912E34 /* libGPUImage.a */, + BCF867411725AA7E00912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -190,7 +190,7 @@ buildRules = ( ); dependencies = ( - BCB5DDF714E87573000AF3C2 /* PBXTargetDependency */, + BCF867431725AA9E00912E34 /* PBXTargetDependency */, ); name = SimpleVideoFileFilter; productName = SimpleVideoFileFilter; @@ -218,7 +218,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BCB5DDEB14E8756A000AF3C2 /* Products */; + ProductGroup = BCF867391725AA7E00912E34 /* Products */; ProjectRef = BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */; }, ); @@ -230,18 +230,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BCB5DDF314E8756B000AF3C2 /* libGPUImage.a */ = { + BCF8673F1725AA7E00912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BCB5DDF214E8756B000AF3C2 /* PBXContainerItemProxy */; + remoteRef = BCF8673E1725AA7E00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BCB5DDF514E8756B000AF3C2 /* GPUImageTests.octest */ = { + BCF867411725AA7E00912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BCB5DDF414E8756B000AF3C2 /* PBXContainerItemProxy */; + remoteRef = BCF867401725AA7E00912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -279,10 +279,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BCB5DDF714E87573000AF3C2 /* PBXTargetDependency */ = { + BCF867431725AA9E00912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BCB5DDF614E87573000AF3C2 /* PBXContainerItemProxy */; + targetProxy = BCF867421725AA9E00912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -317,7 +317,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_LDFLAGS = ( "-ObjC", @@ -340,7 +340,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = ( diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Info.plist diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Prefix.pch b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Prefix.pch similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Prefix.pch rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilter-Prefix.pch diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.h b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.h similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.h rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.h diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.m b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.m similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.m rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterAppDelegate.m diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/WID-small.jpg b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/WID-small.jpg similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/WID-small.jpg rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/WID-small.jpg diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/en.lproj/InfoPlist.strings similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/en.lproj/InfoPlist.strings diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/main.m b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/main.m similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/main.m rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/main.m diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/sample_iPod.m4v b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/sample_iPod.m4v similarity index 100% rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/sample_iPod.m4v rename to examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/sample_iPod.m4v diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj similarity index 93% rename from examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj index 497ea0b52..240f1461c 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj @@ -25,25 +25,25 @@ BCB5DDFD14E876ED000AF3C2 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BCB5DDFF14E87783000AF3C2 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFE14E87783000AF3C2 /* QuartzCore.framework */; }; BCB5DE0114E87789000AF3C2 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DE0014E87789000AF3C2 /* OpenGLES.framework */; }; - BCB5DE0214E8779B000AF3C2 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDF314E8756B000AF3C2 /* libGPUImage.a */; }; + BCF867511725AB5300912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8674C1725AB2100912E34 /* libGPUImage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BCB5DDF214E8756B000AF3C2 /* PBXContainerItemProxy */ = { + BCF8674B1725AB2100912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BCB5DDF414E8756B000AF3C2 /* PBXContainerItemProxy */ = { + BCF8674D1725AB2100912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = BCF1A34414DDB1EC00852800; remoteInfo = GPUImageTests; }; - BCB5DDF614E87573000AF3C2 /* PBXContainerItemProxy */ = { + BCF8674F1725AB4E00912E34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */; proxyType = 1; @@ -71,7 +71,7 @@ BCB5DDE514E868C0000AF3C2 /* SimpleVideoFilterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleVideoFilterViewController.h; sourceTree = ""; }; BCB5DDE614E868C0000AF3C2 /* SimpleVideoFilterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleVideoFilterViewController.m; sourceTree = ""; }; BCB5DDE714E868C0000AF3C2 /* SimpleVideoFilterViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SimpleVideoFilterViewController.xib; sourceTree = ""; }; - BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCB5DDF814E876DD000AF3C2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCB5DDFA14E876ED000AF3C2 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; @@ -84,7 +84,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BCB5DE0214E8779B000AF3C2 /* libGPUImage.a in Frameworks */, + BCF867511725AB5300912E34 /* libGPUImage.a in Frameworks */, BCB5DE0114E87789000AF3C2 /* OpenGLES.framework in Frameworks */, BCB5DDFF14E87783000AF3C2 /* QuartzCore.framework in Frameworks */, BCB5DDFC14E876ED000AF3C2 /* CoreMedia.framework in Frameworks */, @@ -161,11 +161,11 @@ name = "Supporting Files"; sourceTree = ""; }; - BCB5DDEB14E8756A000AF3C2 /* Products */ = { + BCF867461725AB2100912E34 /* Products */ = { isa = PBXGroup; children = ( - BCB5DDF314E8756B000AF3C2 /* libGPUImage.a */, - BCB5DDF514E8756B000AF3C2 /* GPUImageTests.octest */, + BCF8674C1725AB2100912E34 /* libGPUImage.a */, + BCF8674E1725AB2100912E34 /* GPUImageTests.octest */, ); name = Products; sourceTree = ""; @@ -184,7 +184,7 @@ buildRules = ( ); dependencies = ( - BCB5DDF714E87573000AF3C2 /* PBXTargetDependency */, + BCF867501725AB4E00912E34 /* PBXTargetDependency */, ); name = SimpleVideoFilter; productName = SimpleVideoFilter; @@ -212,7 +212,7 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BCB5DDEB14E8756A000AF3C2 /* Products */; + ProductGroup = BCF867461725AB2100912E34 /* Products */; ProjectRef = BCB5DDEA14E8756A000AF3C2 /* GPUImage.xcodeproj */; }, ); @@ -224,18 +224,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BCB5DDF314E8756B000AF3C2 /* libGPUImage.a */ = { + BCF8674C1725AB2100912E34 /* libGPUImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libGPUImage.a; - remoteRef = BCB5DDF214E8756B000AF3C2 /* PBXContainerItemProxy */; + remoteRef = BCF8674B1725AB2100912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BCB5DDF514E8756B000AF3C2 /* GPUImageTests.octest */ = { + BCF8674E1725AB2100912E34 /* GPUImageTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = GPUImageTests.octest; - remoteRef = BCB5DDF414E8756B000AF3C2 /* PBXContainerItemProxy */; + remoteRef = BCF8674D1725AB2100912E34 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -271,10 +271,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BCB5DDF714E87573000AF3C2 /* PBXTargetDependency */ = { + BCF867501725AB4E00912E34 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GPUImage; - targetProxy = BCB5DDF614E87573000AF3C2 /* PBXContainerItemProxy */; + targetProxy = BCF8674F1725AB4E00912E34 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -309,7 +309,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_LDFLAGS = ( "-ObjC", @@ -332,7 +332,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../framework/**"; + HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = ( diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Info.plist diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Prefix.pch b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Prefix.pch similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Prefix.pch rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilter-Prefix.pch diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.h b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.h similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.h rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.h diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterAppDelegate.m diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.h diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib diff --git a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings new file mode 100755 index 000000000..477b28ff8 --- /dev/null +++ b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/main.m b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/main.m similarity index 100% rename from examples/SimpleVideoFilter/SimpleVideoFilter/main.m rename to examples/iOS/SimpleVideoFilter/SimpleVideoFilter/main.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index bb2dbc404..8adf62c1d 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -95,7 +95,6 @@ BC1B718F14F56C1D00ACA2AB /* GPUImageSwirlFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B718D14F56C1D00ACA2AB /* GPUImageSwirlFilter.m */; }; BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (); }; }; BC1B728214FB16AF00ACA2AB /* GPUImageMovieWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */; }; - BC245DC114DDBCF5009FE7EB /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; settings = {ATTRIBUTES = (); }; }; BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; settings = {ATTRIBUTES = (); }; }; BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (); }; }; @@ -205,8 +204,8 @@ BCB5E75D14E2086300701302 /* GPUImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E75B14E2086300701302 /* GPUImageView.m */; }; BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; settings = {ATTRIBUTES = (); }; }; BCB5E76614E208D700701302 /* GPUImageVideoCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */; }; - BCB5E76C14E20AD700701302 /* GPUImageOpenGLESContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageOpenGLESContext.h */; settings = {ATTRIBUTES = (); }; }; - BCB5E76D14E20AD700701302 /* GPUImageOpenGLESContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageOpenGLESContext.m */; }; + BCB5E76C14E20AD700701302 /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageContext.h */; settings = {ATTRIBUTES = (); }; }; + BCB5E76D14E20AD700701302 /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageContext.m */; }; BCB5E76F14E20B8000701302 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E76E14E20B7F00701302 /* UIKit.framework */; }; BCB5E77114E20B8A00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77014E20B8A00701302 /* AVFoundation.framework */; }; BCB5E77314E20B9100701302 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77214E20B9100701302 /* QuartzCore.framework */; }; @@ -336,6 +335,7 @@ BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (); }; }; BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */; }; + BCF866C8172589A500912E34 /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; }; BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; }; BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (); }; }; @@ -435,8 +435,8 @@ BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSketchFilter.m; path = Source/GPUImageSketchFilter.m; sourceTree = SOURCE_ROOT; }; BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSwirlFilter.h; path = Source/GPUImageSwirlFilter.h; sourceTree = SOURCE_ROOT; }; BC1B718D14F56C1D00ACA2AB /* GPUImageSwirlFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSwirlFilter.m; path = Source/GPUImageSwirlFilter.m; sourceTree = SOURCE_ROOT; }; - BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMovieWriter.h; path = Source/GPUImageMovieWriter.h; sourceTree = SOURCE_ROOT; }; - BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMovieWriter.m; path = Source/GPUImageMovieWriter.m; sourceTree = SOURCE_ROOT; }; + BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMovieWriter.h; path = Source/iOS/GPUImageMovieWriter.h; sourceTree = SOURCE_ROOT; }; + BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMovieWriter.m; path = Source/iOS/GPUImageMovieWriter.m; sourceTree = SOURCE_ROOT; }; BC245DBF14DDBCF5009FE7EB /* GPUImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage.h; path = Source/GPUImage.h; sourceTree = SOURCE_ROOT; }; BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFilter.h; path = Source/GPUImageFilter.h; sourceTree = SOURCE_ROOT; }; BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFilter.m; path = Source/GPUImageFilter.m; sourceTree = SOURCE_ROOT; }; @@ -542,12 +542,12 @@ BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMotionDetector.m; path = Source/GPUImageMotionDetector.m; sourceTree = SOURCE_ROOT; }; BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; - BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/GPUImageView.h; sourceTree = SOURCE_ROOT; }; - BCB5E75B14E2086300701302 /* GPUImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageView.m; path = Source/GPUImageView.m; sourceTree = SOURCE_ROOT; }; + BCB5E75A14E2086300701302 /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/iOS/GPUImageView.h; sourceTree = SOURCE_ROOT; }; + BCB5E75B14E2086300701302 /* GPUImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageView.m; path = Source/iOS/GPUImageView.m; sourceTree = SOURCE_ROOT; }; BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVideoCamera.h; path = Source/GPUImageVideoCamera.h; sourceTree = SOURCE_ROOT; }; BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVideoCamera.m; path = Source/GPUImageVideoCamera.m; sourceTree = SOURCE_ROOT; }; - BCB5E76A14E20AD700701302 /* GPUImageOpenGLESContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOpenGLESContext.h; path = Source/GPUImageOpenGLESContext.h; sourceTree = SOURCE_ROOT; }; - BCB5E76B14E20AD700701302 /* GPUImageOpenGLESContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpenGLESContext.m; path = Source/GPUImageOpenGLESContext.m; sourceTree = SOURCE_ROOT; }; + BCB5E76A14E20AD700701302 /* GPUImageContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageContext.h; path = Source/iOS/GPUImageContext.h; sourceTree = SOURCE_ROOT; }; + BCB5E76B14E20AD700701302 /* GPUImageContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageContext.m; path = Source/iOS/GPUImageContext.m; sourceTree = SOURCE_ROOT; }; BCB5E76E14E20B7F00701302 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; BCB5E77014E20B8A00701302 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCB5E77214E20B9100701302 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; @@ -560,8 +560,8 @@ BCB5E79314E3275200701302 /* GLProgram.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GLProgram.m; path = Source/GLProgram.m; sourceTree = SOURCE_ROOT; }; BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSepiaFilter.h; path = Source/GPUImageSepiaFilter.h; sourceTree = SOURCE_ROOT; }; BCB5E7C114E4B6D400701302 /* GPUImageSepiaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSepiaFilter.m; path = Source/GPUImageSepiaFilter.m; sourceTree = SOURCE_ROOT; }; - BCB5E7D814E6003400701302 /* GPUImagePicture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePicture.h; path = Source/GPUImagePicture.h; sourceTree = SOURCE_ROOT; }; - BCB5E7D914E6003400701302 /* GPUImagePicture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePicture.m; path = Source/GPUImagePicture.m; sourceTree = SOURCE_ROOT; }; + BCB5E7D814E6003400701302 /* GPUImagePicture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePicture.h; path = Source/iOS/GPUImagePicture.h; sourceTree = SOURCE_ROOT; }; + BCB5E7D914E6003400701302 /* GPUImagePicture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePicture.m; path = Source/iOS/GPUImagePicture.m; sourceTree = SOURCE_ROOT; }; BCB6B833150400030041703B /* GPUImageExposureFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageExposureFilter.h; path = Source/GPUImageExposureFilter.h; sourceTree = SOURCE_ROOT; }; BCB6B834150400030041703B /* GPUImageExposureFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageExposureFilter.m; path = Source/GPUImageExposureFilter.m; sourceTree = SOURCE_ROOT; }; BCB6B835150400030041703B /* GPUImageSharpenFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSharpenFilter.h; path = Source/GPUImageSharpenFilter.h; sourceTree = SOURCE_ROOT; }; @@ -638,7 +638,7 @@ BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAddBlendFilter.m; path = Source/GPUImageAddBlendFilter.m; sourceTree = SOURCE_ROOT; }; BCF1A33414DDB1EC00852800 /* libGPUImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGPUImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; BCF1A33714DDB1EC00852800 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - BCF1A33B14DDB1EC00852800 /* GPUImage-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "GPUImage-Prefix.pch"; path = "Source/GPUImage-Prefix.pch"; sourceTree = ""; }; + BCF1A33B14DDB1EC00852800 /* GPUImage-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "GPUImage-Prefix.pch"; path = "Source/iOS/GPUImage-Prefix.pch"; sourceTree = ""; }; BCF1A34414DDB1EC00852800 /* GPUImageTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GPUImageTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; BCF1A34514DDB1EC00852800 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; BCF1A34F14DDB1EC00852800 /* GPUImageTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GPUImageTests-Info.plist"; sourceTree = ""; }; @@ -941,6 +941,8 @@ BCB5E78114E232BC00701302 /* Sources */ = { isa = PBXGroup; children = ( + BCB5E77D14E22E4200701302 /* GPUImageOutput.h */, + BCB5E77E14E22E4200701302 /* GPUImageOutput.m */, BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */, BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */, BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */, @@ -1117,10 +1119,8 @@ BC245DBF14DDBCF5009FE7EB /* GPUImage.h */, BCB5E79214E3275100701302 /* GLProgram.h */, BCB5E79314E3275200701302 /* GLProgram.m */, - BCB5E77D14E22E4200701302 /* GPUImageOutput.h */, - BCB5E77E14E22E4200701302 /* GPUImageOutput.m */, - BCB5E76A14E20AD700701302 /* GPUImageOpenGLESContext.h */, - BCB5E76B14E20AD700701302 /* GPUImageOpenGLESContext.m */, + BCB5E76A14E20AD700701302 /* GPUImageContext.h */, + BCB5E76B14E20AD700701302 /* GPUImageContext.m */, BCB5E78114E232BC00701302 /* Sources */, 0D6948871501F56600206FF8 /* Pipeline */, BC245DC314DDBE6B009FE7EB /* Filters */, @@ -1164,11 +1164,11 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BC245DC114DDBCF5009FE7EB /* GPUImage.h in Headers */, + BCF866C8172589A500912E34 /* GPUImage.h in Headers */, BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */, BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */, BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */, - BCB5E76C14E20AD700701302 /* GPUImageOpenGLESContext.h in Headers */, + BCB5E76C14E20AD700701302 /* GPUImageContext.h in Headers */, BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */, BCB5E79414E3275200701302 /* GLProgram.h in Headers */, BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */, @@ -1438,7 +1438,7 @@ BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */, BCB5E75D14E2086300701302 /* GPUImageView.m in Sources */, BCB5E76614E208D700701302 /* GPUImageVideoCamera.m in Sources */, - BCB5E76D14E20AD700701302 /* GPUImageOpenGLESContext.m in Sources */, + BCB5E76D14E20AD700701302 /* GPUImageContext.m in Sources */, BCB5E78014E22E4300701302 /* GPUImageOutput.m in Sources */, BCB5E79514E3275200701302 /* GLProgram.m in Sources */, BCB5E7C314E4B6D400701302 /* GPUImageSepiaFilter.m in Sources */, @@ -1701,7 +1701,7 @@ CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Source/GPUImage-Prefix.pch"; + GCC_PREFIX_HEADER = "Source/iOS/GPUImage-Prefix.pch"; HEADER_SEARCH_PATHS = ""; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1715,7 +1715,7 @@ CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Source/GPUImage-Prefix.pch"; + GCC_PREFIX_HEADER = "Source/iOS/GPUImage-Prefix.pch"; HEADER_SEARCH_PATHS = ""; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj new file mode 100644 index 000000000..f7d7b39af --- /dev/null +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -0,0 +1,387 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BCA3F32017239B6500E28AEC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F31F17239B6500E28AEC /* Cocoa.framework */; }; + BCA3F3621723A8FA00E28AEC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3601723A8FA00E28AEC /* OpenGL.framework */; }; + BCA3F3631723A8FA00E28AEC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */; }; + BCA3F3651723A96600E28AEC /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA3F3641723A96600E28AEC /* GPUImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF40F1217247D68005AE36A /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1017247D68005AE36A /* GPUImageContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF40F1317247D68005AE36A /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F1117247D68005AE36A /* GPUImageContext.m */; }; + BCF40F1617247FD8005AE36A /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1417247FD8005AE36A /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF40F1717247FD8005AE36A /* GLProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F1517247FD8005AE36A /* GLProgram.m */; }; + BCF40F1B1724829B005AE36A /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F191724829B005AE36A /* GPUImageOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF40F1C1724829B005AE36A /* GPUImageOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F1A1724829B005AE36A /* GPUImageOutput.m */; }; + BCF40F2017248322005AE36A /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1E17248322005AE36A /* GPUImageFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF40F2117248322005AE36A /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F1F17248322005AE36A /* GPUImageFilter.m */; }; + BCF40F2517248836005AE36A /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F2317248836005AE36A /* GPUImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF40F2617248836005AE36A /* GPUImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F2417248836005AE36A /* GPUImageView.m */; }; + BCF40F29172488D3005AE36A /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F27172488D3005AE36A /* GPUImageBrightnessFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF40F2A172488D3005AE36A /* GPUImageBrightnessFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F28172488D3005AE36A /* GPUImageBrightnessFilter.m */; }; + BCF867561725AF9300912E34 /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867521725AF9300912E34 /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867571725AF9300912E34 /* GPUImageMovieWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867531725AF9300912E34 /* GPUImageMovieWriter.m */; }; + BCF867581725AF9300912E34 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867541725AF9300912E34 /* GPUImagePicture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867591725AF9300912E34 /* GPUImagePicture.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867551725AF9300912E34 /* GPUImagePicture.m */; }; + BCF8675B1725BBE300912E34 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8675A1725BBE300912E34 /* AVFoundation.framework */; }; + BCF8675D1725BBE900912E34 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8675C1725BBE900912E34 /* CoreMedia.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + BCA3F31C17239B6500E28AEC /* GPUImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GPUImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BCA3F31F17239B6500E28AEC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + BCA3F32217239B6500E28AEC /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + BCA3F32317239B6500E28AEC /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + BCA3F32417239B6500E28AEC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + BCA3F32717239B6500E28AEC /* GPUImageMac-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = "GPUImageMac-Info.plist"; path = "Source/Mac/GPUImageMac-Info.plist"; sourceTree = ""; }; + BCA3F32B17239B6500E28AEC /* GPUImageMac-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "GPUImageMac-Prefix.pch"; path = "Source/Mac/GPUImageMac-Prefix.pch"; sourceTree = ""; }; + BCA3F3601723A8FA00E28AEC /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + BCA3F3641723A96600E28AEC /* GPUImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage.h; path = Source/Mac/GPUImage.h; sourceTree = SOURCE_ROOT; }; + BCF40F1017247D68005AE36A /* GPUImageContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageContext.h; path = Source/Mac/GPUImageContext.h; sourceTree = SOURCE_ROOT; }; + BCF40F1117247D68005AE36A /* GPUImageContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageContext.m; path = Source/Mac/GPUImageContext.m; sourceTree = SOURCE_ROOT; }; + BCF40F1417247FD8005AE36A /* GLProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GLProgram.h; path = Source/GLProgram.h; sourceTree = SOURCE_ROOT; }; + BCF40F1517247FD8005AE36A /* GLProgram.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GLProgram.m; path = Source/GLProgram.m; sourceTree = SOURCE_ROOT; }; + BCF40F191724829B005AE36A /* GPUImageOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOutput.h; path = Source/GPUImageOutput.h; sourceTree = SOURCE_ROOT; }; + BCF40F1A1724829B005AE36A /* GPUImageOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOutput.m; path = Source/GPUImageOutput.m; sourceTree = SOURCE_ROOT; }; + BCF40F1E17248322005AE36A /* GPUImageFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFilter.h; path = Source/GPUImageFilter.h; sourceTree = SOURCE_ROOT; }; + BCF40F1F17248322005AE36A /* GPUImageFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFilter.m; path = Source/GPUImageFilter.m; sourceTree = SOURCE_ROOT; }; + BCF40F2317248836005AE36A /* GPUImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageView.h; path = Source/Mac/GPUImageView.h; sourceTree = SOURCE_ROOT; }; + BCF40F2417248836005AE36A /* GPUImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageView.m; path = Source/Mac/GPUImageView.m; sourceTree = SOURCE_ROOT; }; + BCF40F27172488D3005AE36A /* GPUImageBrightnessFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBrightnessFilter.h; path = Source/GPUImageBrightnessFilter.h; sourceTree = SOURCE_ROOT; }; + BCF40F28172488D3005AE36A /* GPUImageBrightnessFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBrightnessFilter.m; path = Source/GPUImageBrightnessFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867521725AF9300912E34 /* GPUImageMovieWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMovieWriter.h; path = Source/Mac/GPUImageMovieWriter.h; sourceTree = SOURCE_ROOT; }; + BCF867531725AF9300912E34 /* GPUImageMovieWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMovieWriter.m; path = Source/Mac/GPUImageMovieWriter.m; sourceTree = SOURCE_ROOT; }; + BCF867541725AF9300912E34 /* GPUImagePicture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePicture.h; path = Source/Mac/GPUImagePicture.h; sourceTree = SOURCE_ROOT; }; + BCF867551725AF9300912E34 /* GPUImagePicture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePicture.m; path = Source/Mac/GPUImagePicture.m; sourceTree = SOURCE_ROOT; }; + BCF8675A1725BBE300912E34 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + BCF8675C1725BBE900912E34 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BCA3F31817239B6500E28AEC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF8675D1725BBE900912E34 /* CoreMedia.framework in Frameworks */, + BCF8675B1725BBE300912E34 /* AVFoundation.framework in Frameworks */, + BCA3F3621723A8FA00E28AEC /* OpenGL.framework in Frameworks */, + BCA3F3631723A8FA00E28AEC /* QuartzCore.framework in Frameworks */, + BCA3F32017239B6500E28AEC /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BCA3F31217239B6500E28AEC = { + isa = PBXGroup; + children = ( + BCA3F32517239B6500E28AEC /* GPUImageMac */, + BCA3F31E17239B6500E28AEC /* Frameworks */, + BCA3F31D17239B6500E28AEC /* Products */, + ); + sourceTree = ""; + }; + BCA3F31D17239B6500E28AEC /* Products */ = { + isa = PBXGroup; + children = ( + BCA3F31C17239B6500E28AEC /* GPUImage.framework */, + ); + name = Products; + sourceTree = ""; + }; + BCA3F31E17239B6500E28AEC /* Frameworks */ = { + isa = PBXGroup; + children = ( + BCA3F31F17239B6500E28AEC /* Cocoa.framework */, + BCA3F3601723A8FA00E28AEC /* OpenGL.framework */, + BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */, + BCF8675C1725BBE900912E34 /* CoreMedia.framework */, + BCF8675A1725BBE300912E34 /* AVFoundation.framework */, + BCA3F32117239B6500E28AEC /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + BCA3F32117239B6500E28AEC /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + BCA3F32217239B6500E28AEC /* AppKit.framework */, + BCA3F32317239B6500E28AEC /* CoreData.framework */, + BCA3F32417239B6500E28AEC /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + BCA3F32517239B6500E28AEC /* GPUImageMac */ = { + isa = PBXGroup; + children = ( + BCA3F3641723A96600E28AEC /* GPUImage.h */, + BCF40F1417247FD8005AE36A /* GLProgram.h */, + BCF40F1517247FD8005AE36A /* GLProgram.m */, + BCF40F1017247D68005AE36A /* GPUImageContext.h */, + BCF40F1117247D68005AE36A /* GPUImageContext.m */, + BCF40F1817248286005AE36A /* Sources */, + BCF40F1D17248308005AE36A /* Filters */, + BCF40F2217248811005AE36A /* Outputs */, + BCA3F32617239B6500E28AEC /* Supporting Files */, + ); + path = GPUImageMac; + sourceTree = ""; + }; + BCA3F32617239B6500E28AEC /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BCA3F32717239B6500E28AEC /* GPUImageMac-Info.plist */, + BCA3F32B17239B6500E28AEC /* GPUImageMac-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BCF40F1817248286005AE36A /* Sources */ = { + isa = PBXGroup; + children = ( + BCF40F191724829B005AE36A /* GPUImageOutput.h */, + BCF40F1A1724829B005AE36A /* GPUImageOutput.m */, + BCF867541725AF9300912E34 /* GPUImagePicture.h */, + BCF867551725AF9300912E34 /* GPUImagePicture.m */, + ); + name = Sources; + sourceTree = ""; + }; + BCF40F1D17248308005AE36A /* Filters */ = { + isa = PBXGroup; + children = ( + BCF40F1E17248322005AE36A /* GPUImageFilter.h */, + BCF40F1F17248322005AE36A /* GPUImageFilter.m */, + BCF40F27172488D3005AE36A /* GPUImageBrightnessFilter.h */, + BCF40F28172488D3005AE36A /* GPUImageBrightnessFilter.m */, + ); + name = Filters; + sourceTree = ""; + }; + BCF40F2217248811005AE36A /* Outputs */ = { + isa = PBXGroup; + children = ( + BCF40F2317248836005AE36A /* GPUImageView.h */, + BCF40F2417248836005AE36A /* GPUImageView.m */, + BCF867521725AF9300912E34 /* GPUImageMovieWriter.h */, + BCF867531725AF9300912E34 /* GPUImageMovieWriter.m */, + ); + name = Outputs; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + BCA3F31917239B6500E28AEC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BCA3F3651723A96600E28AEC /* GPUImage.h in Headers */, + BCF40F1217247D68005AE36A /* GPUImageContext.h in Headers */, + BCF40F1617247FD8005AE36A /* GLProgram.h in Headers */, + BCF40F1B1724829B005AE36A /* GPUImageOutput.h in Headers */, + BCF40F2017248322005AE36A /* GPUImageFilter.h in Headers */, + BCF40F2517248836005AE36A /* GPUImageView.h in Headers */, + BCF40F29172488D3005AE36A /* GPUImageBrightnessFilter.h in Headers */, + BCF867561725AF9300912E34 /* GPUImageMovieWriter.h in Headers */, + BCF867581725AF9300912E34 /* GPUImagePicture.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + BCA3F31B17239B6500E28AEC /* GPUImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = BCA3F33117239B6500E28AEC /* Build configuration list for PBXNativeTarget "GPUImage" */; + buildPhases = ( + BCA3F31717239B6500E28AEC /* Sources */, + BCA3F31817239B6500E28AEC /* Frameworks */, + BCA3F31917239B6500E28AEC /* Headers */, + BCA3F31A17239B6500E28AEC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GPUImage; + productName = GPUImageMac; + productReference = BCA3F31C17239B6500E28AEC /* GPUImage.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BCA3F31317239B6500E28AEC /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0460; + ORGANIZATIONNAME = "Sunset Lake Software LLC"; + }; + buildConfigurationList = BCA3F31617239B6500E28AEC /* Build configuration list for PBXProject "GPUImageMac" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = BCA3F31217239B6500E28AEC; + productRefGroup = BCA3F31D17239B6500E28AEC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + BCA3F31B17239B6500E28AEC /* GPUImage */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + BCA3F31A17239B6500E28AEC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BCA3F31717239B6500E28AEC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF40F1317247D68005AE36A /* GPUImageContext.m in Sources */, + BCF40F1717247FD8005AE36A /* GLProgram.m in Sources */, + BCF40F1C1724829B005AE36A /* GPUImageOutput.m in Sources */, + BCF40F2117248322005AE36A /* GPUImageFilter.m in Sources */, + BCF40F2617248836005AE36A /* GPUImageView.m in Sources */, + BCF40F2A172488D3005AE36A /* GPUImageBrightnessFilter.m in Sources */, + BCF867571725AF9300912E34 /* GPUImageMovieWriter.m in Sources */, + BCF867591725AF9300912E34 /* GPUImagePicture.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + BCA3F32F17239B6500E28AEC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.6; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + BCA3F33017239B6500E28AEC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.6; + SDKROOT = macosx; + }; + name = Release; + }; + BCA3F33217239B6500E28AEC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Source/Mac/GPUImageMac-Prefix.pch"; + INFOPLIST_FILE = "Source/Mac/GPUImageMac-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = framework; + }; + name = Debug; + }; + BCA3F33317239B6500E28AEC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Source/Mac/GPUImageMac-Prefix.pch"; + INFOPLIST_FILE = "Source/Mac/GPUImageMac-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = framework; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BCA3F31617239B6500E28AEC /* Build configuration list for PBXProject "GPUImageMac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCA3F32F17239B6500E28AEC /* Debug */, + BCA3F33017239B6500E28AEC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BCA3F33117239B6500E28AEC /* Build configuration list for PBXNativeTarget "GPUImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCA3F33217239B6500E28AEC /* Debug */, + BCA3F33317239B6500E28AEC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BCA3F31317239B6500E28AEC /* Project object */; +} diff --git a/framework/Source/GLProgram.h b/framework/Source/GLProgram.h index b10ad72af..2c5b21523 100755 --- a/framework/Source/GLProgram.h +++ b/framework/Source/GLProgram.h @@ -4,8 +4,13 @@ // I've extended this to be able to take programs as NSStrings in addition to files, for baked-in shaders #import + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #import #import +#else +#import +#endif @interface GLProgram : NSObject { diff --git a/framework/Source/GLProgram.m b/framework/Source/GLProgram.m index 7d93365c9..a0de43861 100755 --- a/framework/Source/GLProgram.m +++ b/framework/Source/GLProgram.m @@ -138,7 +138,7 @@ - (void)addAttribute:(NSString *)attributeName { [attributes addObject:attributeName]; glBindAttribLocation(program, - [attributes indexOfObject:attributeName], + (GLuint)[attributes indexOfObject:attributeName], [attributeName UTF8String]); } } @@ -146,7 +146,7 @@ - (void)addAttribute:(NSString *)attributeName // START:indexmethods - (GLuint)attributeIndex:(NSString *)attributeName { - return [attributes indexOfObject:attributeName]; + return (GLuint)[attributes indexOfObject:attributeName]; } - (GLuint)uniformIndex:(NSString *)uniformName { diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 9fb1e6129..9df3f3a64 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -1,7 +1,7 @@ #import "GLProgram.h" // Base classes -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" #import "GPUImageOutput.h" #import "GPUImageView.h" #import "GPUImageVideoCamera.h" diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m index bb314cdb7..c3e74d374 100644 --- a/framework/Source/GPUImage3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -84,7 +84,7 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { glUniform1f(texelWidthUniform, _texelHeight); diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index c781697aa..d0ac294d6 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -98,7 +98,7 @@ - (void)initializeOutputTextureIfNeeded; // Create textures for each level runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; NSUInteger numberOfReductionsInX = floor(log(inputTextureSize.width) / log(4.0)); NSUInteger numberOfReductionsInY = floor(log(inputTextureSize.height) / log(4.0)); @@ -141,7 +141,7 @@ - (void)deleteOutputTexture; } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; NSUInteger numberOfStageTextures = [stageTextures count]; for (NSUInteger currentStage = 0; currentStage < numberOfStageTextures; currentStage++) @@ -172,7 +172,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { // Create framebuffers for each level runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glActiveTexture(GL_TEXTURE1); NSUInteger numberOfStageFramebuffers = [stageTextures count]; @@ -203,7 +203,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; - (void)destroyFilterFBO; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; NSUInteger numberOfStageFramebuffers = [stageFramebuffers count]; for (NSUInteger currentStage = 0; currentStage < numberOfStageFramebuffers; currentStage++) @@ -223,7 +223,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); diff --git a/framework/Source/GPUImageBrightnessFilter.m b/framework/Source/GPUImageBrightnessFilter.m index 08eff6347..7e526d856 100755 --- a/framework/Source/GPUImageBrightnessFilter.m +++ b/framework/Source/GPUImageBrightnessFilter.m @@ -1,5 +1,6 @@ #import "GPUImageBrightnessFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageBrightnessFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -14,6 +15,22 @@ void main() gl_FragColor = vec4((textureColor.rgb + vec3(brightness)), textureColor.w); } ); +#else +NSString *const kGPUImageBrightnessFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float brightness; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4((textureColor.rgb + vec3(brightness)), textureColor.w); + } + ); +#endif @implementation GPUImageBrightnessFilter diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index c3b4d92ae..63ba2d6ba 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -81,7 +81,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; glBindTexture(GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue]); diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m index 825bc656a..12033d4e6 100644 --- a/framework/Source/GPUImageColorPackingFilter.m +++ b/framework/Source/GPUImageColorPackingFilter.m @@ -74,7 +74,7 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; texelHeight = 0.5 / inputTextureSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glUniform1f(texelWidthUniform, texelWidth); glUniform1f(texelHeightUniform, texelHeight); }); diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index 1216ffcc2..a308b8b38 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -73,7 +73,7 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m index c27b5ad09..4af09dd69 100644 --- a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m @@ -67,7 +67,7 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glUniform1f(texelWidthUniform, _texelWidth); glUniform1f(texelHeightUniform, _texelHeight); }); diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 179d11935..8e0c555b9 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -53,10 +53,14 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; BOOL preparedToCaptureImage; - + + // Texture caches are an iOS-specific capability +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CVOpenGLESTextureCacheRef filterTextureCache; CVPixelBufferRef renderTarget; CVOpenGLESTextureRef renderTexture; +#else +#endif CGSize currentFilterSize; GPUImageRotationMode inputRotation; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 7cccbc2b7..5b70e8f9d 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -12,10 +12,12 @@ void main() { - gl_Position = position; - textureCoordinate = inputTextureCoordinate.xy; + gl_Position = position; + textureCoordinate = inputTextureCoordinate.xy; } -); + ); + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePassthroughFragmentShaderString = SHADER_STRING ( @@ -29,6 +31,22 @@ void main() } ); +#else + +NSString *const kGPUImagePassthroughFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate); + } +); +#endif + + void dataProviderReleaseCallback (void *info, const void *data, size_t size); void dataProviderUnlockCallback (void *info, const void *data, size_t size); @@ -59,9 +77,9 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad backgroundColorAlpha = 0.0; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; - filterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; + filterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; if (!filterProgram.initialized) { @@ -84,7 +102,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glEnableVertexAttribArray(filterPositionAttribute); glEnableVertexAttribArray(filterTextureCoordinateAttribute); @@ -171,7 +189,7 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrie __block CGImageRef cgImageFromBytes; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; CGSize currentFBOSize = [self sizeOfFBO]; NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; @@ -182,7 +200,7 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrie GLubyte *rawImagePixels; CGDataProviderRef dataProvider; - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { // glFlush(); glFinish(); @@ -203,7 +221,7 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrie CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); } @@ -220,15 +238,6 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrie return cgImageFromBytes; } -- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; -{ - CGImageRef cgImageFromBytes = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; - UIImage *finalImage = [UIImage imageWithCGImage:cgImageFromBytes scale:1.0 orientation:imageOrientation]; - CGImageRelease(cgImageFromBytes); - - return finalImage; -} - - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter { return [self newCGImageByFilteringCGImage:imageToFilter orientation:UIImageOrientationUp]; @@ -249,19 +258,6 @@ - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation return processedImage; } -- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter -{ - return [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; -} - -- (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; -{ - CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; - UIImage *processedImage = [UIImage imageWithCGImage:image scale:[imageToFilter scale] orientation:[imageToFilter imageOrientation]]; - CGImageRelease(image); - return processedImage; -} - #pragma mark - #pragma mark Managing the display FBOs @@ -281,18 +277,19 @@ - (CGSize)sizeOfFBO; - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glActiveTexture(GL_TEXTURE1); glGenFramebuffers(1, &filterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #endif if (err) @@ -342,6 +339,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); [self notifyTargetsAboutNewOutputTexture]; +#endif } else { @@ -349,7 +347,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glBindTexture(GL_TEXTURE_2D, outputTexture); -// if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// if ([self providesMonochromeOutput] && [GPUImageContext deviceSupportsRedTextures]) // { // glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); // } @@ -376,11 +374,12 @@ - (void)destroyFilterFBO; if (filterFramebuffer) { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glDeleteFramebuffers(1, &filterFramebuffer); filterFramebuffer = 0; - + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE if (filterTextureCache != NULL) { CFRelease(renderTarget); @@ -396,6 +395,7 @@ - (void)destroyFilterFBO; CFRelease(filterTextureCache); filterTextureCache = NULL; } +#endif }); } } @@ -503,7 +503,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; [self setUniformsForProgramAtIndex:0]; @@ -537,7 +537,7 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; } @@ -562,12 +562,12 @@ - (void)prepareForImageCapture; preparedToCaptureImage = YES; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { if (outputTexture) { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glDeleteTextures(1, &outputTexture); outputTexture = 0; @@ -633,7 +633,7 @@ - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSStrin - (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ glUniformMatrix3fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); }]; @@ -643,7 +643,7 @@ - (void)setMatrix3f:(GPUMatrix3x3)matrix forUniform:(GLint)uniform program:(GLPr - (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat *)&matrix); }]; @@ -653,7 +653,7 @@ - (void)setMatrix4f:(GPUMatrix4x4)matrix forUniform:(GLint)uniform program:(GLPr - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ glUniform1f(uniform, floatValue); }]; @@ -663,7 +663,7 @@ - (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgra - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ GLfloat positionArray[2]; positionArray[0] = pointValue.x; @@ -677,7 +677,7 @@ - (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgra - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ GLfloat sizeArray[2]; @@ -692,7 +692,7 @@ - (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram * - (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ glUniform3fv(uniform, 1, (GLfloat *)&vectorValue); @@ -703,7 +703,7 @@ - (void)setVec3:(GPUVector3)vectorValue forUniform:(GLint)uniform program:(GLPro - (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ glUniform4fv(uniform, 1, (GLfloat *)&vectorValue); @@ -714,7 +714,7 @@ - (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLPro - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ glUniform1fv(uniform, arrayLength, arrayValue); @@ -725,7 +725,7 @@ - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUnifo - (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { runAsynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ glUniform1i(uniform, intValue); @@ -939,7 +939,7 @@ - (void)cleanupOutputImage; - (void)deleteOutputTexture; { - if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) + if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) { if (outputTexture) { diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index 78876244f..429962b58 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -76,7 +76,7 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; } diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index bc2c9e211..b45fce387 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -129,10 +129,10 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; - secondFilterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; - thirdFilterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + thirdFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; if (!secondFilterProgram.initialized) { @@ -151,7 +151,7 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; } - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; glEnableVertexAttribArray(secondFilterPositionAttribute); @@ -172,7 +172,7 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; thirdFilterPositionAttribute = [thirdFilterProgram attributeIndex:@"position"]; - [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; + [GPUImageContext setActiveShaderProgram:thirdFilterProgram]; glEnableVertexAttribArray(thirdFilterPositionAttribute); }); @@ -254,13 +254,13 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates); [self setFilterFBO]; - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); @@ -274,12 +274,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (histogramType == kGPUImageHistogramRGB) { - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; glVertexAttribPointer(secondFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); - [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; + [GPUImageContext setActiveShaderProgram:thirdFilterProgram]; glVertexAttribPointer(thirdFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); @@ -295,7 +295,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates //{ // _scalingFactor = newValue; // -// [GPUImageOpenGLESContext useImageProcessingContext]; +// [GPUImageContext useImageProcessingContext]; // [filterProgram use]; // glUniform1f(scalingFactorUniform, _scalingFactor); //} diff --git a/framework/Source/GPUImageJFAVoronoiFilter.m b/framework/Source/GPUImageJFAVoronoiFilter.m index 7a61041af..4b310d100 100644 --- a/framework/Source/GPUImageJFAVoronoiFilter.m +++ b/framework/Source/GPUImageJFAVoronoiFilter.m @@ -234,7 +234,7 @@ -(void)setSizeInPixels:(CGSize)sizeInPixels { - (void)initializeOutputTextureIfNeeded; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glActiveTexture(GL_TEXTURE2); glGenTextures(1, &outputTexture); @@ -279,7 +279,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize [self prepareForImageCapture]; numPasses = (int)log2([self nextPowerOfTwo:CGPointMake(currentFBOSize.width, currentFBOSize.height)]); - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { //preparedToCaptureImage = NO; [super createFilterFBOofSize:currentFBOSize]; @@ -295,12 +295,12 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize glGenFramebuffers(1, &secondFilterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #endif if (err) @@ -400,7 +400,7 @@ - (void)setOutputFBO; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { // Run the first stage of the two-pass filter - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; currentPass = 0; [self setFilterFBO]; diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m index b11a7dc85..741256b88 100644 --- a/framework/Source/GPUImageLineGenerator.m +++ b/framework/Source/GPUImageLineGenerator.m @@ -105,7 +105,7 @@ - (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; @@ -136,7 +136,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates - (void)setLineWidth:(CGFloat)newValue; { _lineWidth = newValue; - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glLineWidth(newValue); } diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index b17380c52..fdcb4f22c 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -79,9 +79,9 @@ - (id)init; }]; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; - secondFilterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageColorAveragingVertexShaderString fragmentShaderString:kGPUImageLuminosityFragmentShaderString]; + secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageColorAveragingVertexShaderString fragmentShaderString:kGPUImageLuminosityFragmentShaderString]; if (!secondFilterProgram.initialized) { @@ -108,7 +108,7 @@ - (id)init; secondFilterTexelWidthUniform = [secondFilterProgram uniformIndex:@"texelWidth"]; secondFilterTexelHeightUniform = [secondFilterProgram uniformIndex:@"texelHeight"]; - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; glEnableVertexAttribArray(secondFilterPositionAttribute); glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); @@ -131,7 +131,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } // Do an initial render pass that both convert to luminance and reduces - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); @@ -160,7 +160,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates currentTexture = [[stageTextures objectAtIndex:0] intValue]; // Just perform reductions from this point on - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index c4c97a58a..5768cfba6 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -1,6 +1,6 @@ #import #import -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" #import "GPUImageOutput.h" /** Protocol for getting Movie played callback. diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 39d305da9..072f285e9 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -58,14 +58,14 @@ - (id)initWithAsset:(AVAsset *)asset; - (void)textureCacheSetup; { - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); #endif if (err) { @@ -80,7 +80,7 @@ - (void)textureCacheSetup; - (void)dealloc { - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { CFRelease(coreVideoTextureCache); } @@ -279,11 +279,11 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { CVPixelBufferLockBaseAddress(movieFrame, 0); - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; CVOpenGLESTextureRef texture = NULL; CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 48618646f..6fda9496f 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -1,6 +1,20 @@ -#import +#import "GPUImageContext.h" -#import "GPUImageOpenGLESContext.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#import +#else +// For now, just redefine this on the Mac +typedef NS_ENUM(NSInteger, UIImageOrientation) { + UIImageOrientationUp, // default orientation + UIImageOrientationDown, // 180 deg rotation + UIImageOrientationLeft, // 90 deg CCW + UIImageOrientationRight, // 90 deg CW + UIImageOrientationUpMirrored, // as above but image mirrored along other axis. horizontal flip + UIImageOrientationDownMirrored, // horizontal flip + UIImageOrientationLeftMirrored, // vertical flip + UIImageOrientationRightMirrored, // vertical flip +}; +#endif void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)); @@ -92,27 +106,23 @@ void reportAvailableMemoryForGPUImage(NSString *tag); /// @name Still image processing -/** Retreives the currently processed image as a UIImage. - */ -- (UIImage *)imageFromCurrentlyProcessedOutput; - (CGImageRef)newCGImageFromCurrentlyProcessedOutput; - -/** Convenience method to retreive the currently processed image with a different orientation. - @param imageOrientation Orientation for image - */ -- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; -/** Convenience method to process an image with a filter. - - This method is useful for using filters on still images without building a full pipeline. - - @param imageToFilter Image to be filtered - */ +// Platform-specific image output methods +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +- (UIImage *)imageFromCurrentlyProcessedOutput; +- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; - (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter; -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; +#else +- (NSImage *)imageFromCurrentlyProcessedOutput; +- (NSImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (NSImage *)imageByFilteringImage:(NSImage *)imageToFilter; +- (CGImageRef)newCGImageByFilteringImage:(NSImage *)imageToFilter; +#endif - (BOOL)providesMonochromeOutput; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 314b77ddb..b742c5839 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -17,9 +17,9 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)) void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) { - dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue]; + dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; - if(dispatch_get_specific([GPUImageOpenGLESContext contextKey])) + if(dispatch_get_specific([GPUImageContext contextKey])) { block(); }else @@ -30,9 +30,9 @@ void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)) { - dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue]; + dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; - if(dispatch_get_specific([GPUImageOpenGLESContext contextKey])) + if(dispatch_get_specific([GPUImageContext contextKey])) { block(); }else @@ -217,7 +217,7 @@ - (void)initializeOutputTextureIfNeeded; runSynchronouslyOnVideoProcessingQueue(^{ if (!outputTexture) { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glActiveTexture(GL_TEXTURE0); glGenTextures(1, &outputTexture); @@ -258,13 +258,60 @@ - (void)cleanupOutputImage; #pragma mark - #pragma mark Still image processing -/** - Retreive the currently processed output image as an UIImage. - - The image's orientation will be the device's current orientation. - See also: [GPUImageOutput imageFromCurrentlyProcessedOutputWithOrientation:] - */ -- (UIImage *)imageFromCurrentlyProcessedOutput; +- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +{ + return nil; +} + +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter +{ + return [self newCGImageByFilteringCGImage:imageToFilter orientation:UIImageOrientationUp]; +} + +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; +{ + GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; + + [self prepareForImageCapture]; + + [stillImageSource addTarget:(id)self]; + [stillImageSource processImage]; + + CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation]; + + [stillImageSource removeTarget:(id)self]; + return processedImage; +} + +- (BOOL)providesMonochromeOutput; +{ + return NO; +} + +- (void)prepareForImageCapture; +{ + +} + +- (void)conserveMemoryForNextFrame; +{ + shouldConserveMemoryForNextFrame = YES; + + for (id currentTarget in targets) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget conserveMemoryForNextFrame]; + } + } +} + +#pragma mark - +#pragma mark Platform-specific image output methods + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + +- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; { UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; UIImageOrientation imageOrientation = UIImageOrientationLeft; @@ -287,10 +334,10 @@ - (UIImage *)imageFromCurrentlyProcessedOutput; break; } - return [self imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + return [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; } -- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; +- (UIImage *)imageFromCurrentlyProcessedOutput; { UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; UIImageOrientation imageOrientation = UIImageOrientationLeft; @@ -313,7 +360,7 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutput; break; } - return [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + return [self imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; } - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; @@ -333,58 +380,46 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; return processedImage; } -- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter { - return nil; + return [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; } -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter +#else + +- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; { - return [self newCGImageByFilteringCGImage:imageToFilter orientation:UIImageOrientationUp]; + return [self newCGImageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationLeft]; } -- (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter +- (NSImage *)imageFromCurrentlyProcessedOutput; { - return [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; + return [self imageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationLeft]; } -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; +- (NSImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; { - GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; - - [self prepareForImageCapture]; - - [stillImageSource addTarget:(id)self]; - [stillImageSource processImage]; - - CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation]; + CGImageRef cgImageFromBytes = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + NSImage *finalImage = [[NSImage alloc] initWithCGImage:cgImageFromBytes size:NSZeroSize]; + CGImageRelease(cgImageFromBytes); - [stillImageSource removeTarget:(id)self]; - return processedImage; + return finalImage; } -- (BOOL)providesMonochromeOutput; +- (NSImage *)imageByFilteringImage:(NSImage *)imageToFilter; { - return NO; + CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil] orientation:UIImageOrientationLeft]; + NSImage *processedImage = [[NSImage alloc] initWithCGImage:image size:NSZeroSize]; + CGImageRelease(image); + return processedImage; } -- (void)prepareForImageCapture; +- (CGImageRef)newCGImageByFilteringImage:(NSImage *)imageToFilter { - + return [self newCGImageByFilteringCGImage:[imageToFilter CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil] orientation:UIImageOrientationLeft]; } -- (void)conserveMemoryForNextFrame; -{ - shouldConserveMemoryForNextFrame = YES; - - for (id currentTarget in targets) - { - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget conserveMemoryForNextFrame]; - } - } -} +#endif #pragma mark - #pragma mark GPUImageTextureDelegate methods diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index 872d37ef7..bfd282623 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -89,7 +89,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; // Grab the edge points from the previous frame and create the parallel coordinate lines for them // This would be a great place to have a working histogram pyramid implementation @@ -163,7 +163,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [self setFilterFBO]; - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m index 514a33dfe..64697a1d7 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.m +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -76,13 +76,13 @@ - (void)setMix:(CGFloat)newValue; - (void)initializeSecondOutputTextureIfNeeded; { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { return; } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (!secondFilterOutputTexture) { @@ -105,7 +105,7 @@ - (void)deleteOutputTexture; outputTexture = 0; } - if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) + if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) { if (secondFilterOutputTexture) { @@ -118,11 +118,11 @@ - (void)deleteOutputTexture; - (void)createFilterFBOofSize:(CGSize)currentFBOSize { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (!filterFramebuffer) { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { preparedToCaptureImage = NO; [super createFilterFBOofSize:currentFBOSize]; @@ -137,12 +137,12 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize glGenFramebuffers(1, &secondFilterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #endif if (err) @@ -196,7 +196,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize { [self initializeSecondOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - // if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) + // if ([self providesMonochromeOutput] && [GPUImageContext deviceSupportsRedTextures]) // { // glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); // } @@ -228,7 +228,7 @@ - (void)recreateFilterFBO - (void)destroyFilterFBO; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (filterFramebuffer) { @@ -277,7 +277,7 @@ - (void)setOutputFBO; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { // Run the first stage of the two-pass filter - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; @@ -285,14 +285,14 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (pass % 2 == 0) { - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation] sourceTexture:secondFilterOutputTexture]; } else { // Run the second stage of the two-pass filter [self setSecondFilterFBO]; - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index fda407d8d..3c0351652 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -66,7 +66,7 @@ - (void)dealloc; - (void)uploadBytes:(GLubyte *)bytesToUpload; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; [self initializeOutputTextureIfNeeded]; diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index cf8fa5382..5fd0e436e 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -1,5 +1,5 @@ #import -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" struct GPUByteColorVector { GLubyte red; diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index ab146f73e..fc8951fd4 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -1,6 +1,6 @@ #import "GPUImageRawDataOutput.h" -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" #import "GLProgram.h" #import "GPUImageFilter.h" #import "GPUImageMovieWriter.h" @@ -53,14 +53,14 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn _rawBytesForImage = NULL; inputRotation = kGPUImageNoRotation; - [GPUImageOpenGLESContext useImageProcessingContext]; - if ( (outputBGRA && ![GPUImageOpenGLESContext supportsFastTextureUpload]) || (!outputBGRA && [GPUImageOpenGLESContext supportsFastTextureUpload]) ) + [GPUImageContext useImageProcessingContext]; + if ( (outputBGRA && ![GPUImageContext supportsFastTextureUpload]) || (!outputBGRA && [GPUImageContext supportsFastTextureUpload]) ) { - dataProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + dataProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; } else { - dataProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + dataProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; } if (!dataProgram.initialized) @@ -86,7 +86,7 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn dataInputTextureUniform = [dataProgram uniformIndex:@"inputImageTexture"]; // REFACTOR: Wrap this in a block for the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:dataProgram]; + [GPUImageContext setActiveShaderProgram:dataProgram]; glEnableVertexAttribArray(dataPositionAttribute); glEnableVertexAttribArray(dataTextureCoordinateAttribute); @@ -98,7 +98,7 @@ - (void)dealloc { [self destroyDataFBO]; - if (_rawBytesForImage != NULL && (![GPUImageOpenGLESContext supportsFastTextureUpload])) + if (_rawBytesForImage != NULL && (![GPUImageContext supportsFastTextureUpload])) { free(_rawBytesForImage); _rawBytesForImage = NULL; @@ -114,12 +114,12 @@ - (void)createDataFBO; glGenFramebuffers(1, &dataFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, dataFramebuffer); - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &rawDataTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &rawDataTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &rawDataTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &rawDataTextureCache); #endif if (err) { @@ -189,7 +189,7 @@ - (void)createDataFBO; - (void)destroyDataFBO; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (renderTexture) { @@ -227,7 +227,7 @@ - (void)setFilterFBO; - (void)renderAtInternalSize; { - [GPUImageOpenGLESContext setActiveShaderProgram:dataProgram]; + [GPUImageContext setActiveShaderProgram:dataProgram]; [self setFilterFBO]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -364,7 +364,7 @@ - (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; - (GLubyte *)rawBytesForImage; { - if ( (_rawBytesForImage == NULL) && (![GPUImageOpenGLESContext supportsFastTextureUpload]) ) + if ( (_rawBytesForImage == NULL) && (![GPUImageContext supportsFastTextureUpload]) ) { _rawBytesForImage = (GLubyte *) calloc(imageSize.width * imageSize.height * 4, sizeof(GLubyte)); hasReadFromTheCurrentFrame = NO; @@ -379,8 +379,8 @@ - (GLubyte *)rawBytesForImage; runSynchronouslyOnVideoProcessingQueue(^{ // Note: the fast texture caches speed up 640x480 frame reads from 9.6 ms to 3.1 ms on iPhone 4S - [GPUImageOpenGLESContext useImageProcessingContext]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + [GPUImageContext useImageProcessingContext]; + if ([GPUImageContext supportsFastTextureUpload]) { CVPixelBufferUnlockBaseAddress(renderTarget, 0); // CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); @@ -388,7 +388,7 @@ - (GLubyte *)rawBytesForImage; [self renderAtInternalSize]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { glFinish(); CVPixelBufferLockBaseAddress(renderTarget, 0); @@ -408,7 +408,7 @@ - (GLubyte *)rawBytesForImage; - (NSUInteger)bytesPerRowInOutput; { - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { return CVPixelBufferGetBytesPerRow(renderTarget); } diff --git a/framework/Source/GPUImageSharpenFilter.m b/framework/Source/GPUImageSharpenFilter.m index 3e41e0cb0..54bbabfd1 100755 --- a/framework/Source/GPUImageSharpenFilter.m +++ b/framework/Source/GPUImageSharpenFilter.m @@ -89,7 +89,7 @@ - (id)init; - (void)setupFilterForSize:(CGSize)filterFrameSize; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index a86e68085..8e33255b7 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -71,8 +71,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD photoOutput = [[AVCaptureStillImageOutput alloc] init]; // Having a still photo input set to BGRA and video to YUV doesn't work well, so since I don't have YUV resizing for iPhone 4 yet, kick back to BGRA for that device -// if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) - if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) + if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) { BOOL supportsFullYUVRange = NO; NSArray *supportedPixelFormats = photoOutput.availableImageDataCVPixelFormatTypes; @@ -100,7 +100,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; } -// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) // { // // TODO: Check for full range output and use that if available // [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; @@ -239,7 +239,7 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); - CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; + CGSize scaledImageSizeToFitOnGPU = [GPUImageContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) { CMSampleBufferRef sampleBuffer = NULL; @@ -262,7 +262,7 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi { // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageOpenGLESContext supportsFastTextureUpload])) + if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageContext supportsFastTextureUpload])) { dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index 7bc7bddd2..d43b379fd 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -13,7 +13,7 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; [self deleteOutputTexture]; }); diff --git a/framework/Source/GPUImageTextureOutput.h b/framework/Source/GPUImageTextureOutput.h index 91bdaca70..af8442fbf 100755 --- a/framework/Source/GPUImageTextureOutput.h +++ b/framework/Source/GPUImageTextureOutput.h @@ -1,5 +1,5 @@ #import -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" @protocol GPUImageTextureOutputDelegate; diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 0dc77fbdd..574a876d9 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -410,7 +410,7 @@ - (NSMutableArray *)secondDerivative:(NSArray *)points - (void)updateToneCurveTexture; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (!toneCurveTexture) { glActiveTexture(GL_TEXTURE3); @@ -455,7 +455,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); diff --git a/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m index b14ca910f..9e74f4b85 100644 --- a/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m @@ -71,7 +71,7 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { glUniform1f(texelWidthUniform, _texelHeight); diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 46e67cb89..9954f6aeb 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -55,7 +55,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad secondFrameTime = kCMTimeInvalid; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; filterSecondTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate2"]; filterInputTextureUniform2 = [filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader @@ -91,7 +91,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; [self setUniformsForProgramAtIndex:0]; diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 639789be9..5ad6d2653 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -15,9 +15,9 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade secondProgramUniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; - secondFilterProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:secondStageVertexShaderString fragmentShaderString:secondStageFragmentShaderString]; + secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:secondStageVertexShaderString fragmentShaderString:secondStageFragmentShaderString]; if (!secondFilterProgram.initialized) { @@ -41,7 +41,7 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; glEnableVertexAttribArray(secondFilterPositionAttribute); glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); @@ -79,13 +79,13 @@ - (GLuint)textureForOutput; - (void)initializeSecondOutputTextureIfNeeded; { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { return; } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (!secondFilterOutputTexture) { @@ -108,7 +108,7 @@ - (void)deleteOutputTexture; outputTexture = 0; } - if (!([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage)) + if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) { if (secondFilterOutputTexture) { @@ -124,11 +124,11 @@ - (void)deleteOutputTexture; - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (!filterFramebuffer) { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { preparedToCaptureImage = NO; [super createFilterFBOofSize:currentFBOSize]; @@ -143,12 +143,12 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glGenFramebuffers(1, &secondFilterFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &filterTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #endif if (err) @@ -202,7 +202,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { [self initializeSecondOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); -// if ([self providesMonochromeOutput] && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// if ([self providesMonochromeOutput] && [GPUImageContext deviceSupportsRedTextures]) // { // glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); // } @@ -237,7 +237,7 @@ - (void)recreateFilterFBO - (void)destroyFilterFBO; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (filterFramebuffer) { @@ -275,7 +275,7 @@ - (void)setFilterFBO; if (!filterFramebuffer) { - if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { preparedToCaptureImage = NO; [super createFilterFBOofSize:currentFBOSize]; @@ -332,7 +332,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // Run the second stage of the two-pass filter [self setSecondFilterFBO]; - [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; [self setUniformsForProgramAtIndex:1]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -390,11 +390,11 @@ - (void)prepareForImageCapture; runSynchronouslyOnVideoProcessingQueue(^{ preparedToCaptureImage = YES; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { if (secondFilterOutputTexture) { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glDeleteTextures(1, &secondFilterOutputTexture); secondFilterOutputTexture = 0; diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index 7b96e83df..b6a2ec58b 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -16,7 +16,7 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m index 2036a63ff..2c554d62c 100644 --- a/framework/Source/GPUImageUIElement.m +++ b/framework/Source/GPUImageUIElement.m @@ -60,7 +60,7 @@ - (CGSize)layerSizeInPixels; - (void)update; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; [self initializeOutputTextureIfNeeded]; if(CMTIME_IS_INVALID(time)) { diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 0701d6722..cc84e5ce0 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -1,7 +1,7 @@ #import #import #import -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" #import "GPUImageOutput.h" //Delegate Protocal for Face Detection. diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index d0f1140fd..b7c475868 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -136,14 +136,14 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD if (captureAsYUV) { - [GPUImageOpenGLESContext useImageProcessingContext]; -// if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) + [GPUImageContext useImageProcessingContext]; +// if ([GPUImageContext deviceSupportsRedTextures]) // { -// yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; +// yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; // } // else // { - yuvConversionProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; + yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; // } if (!yuvConversionProgram.initialized) @@ -169,19 +169,19 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; - [GPUImageOpenGLESContext setActiveShaderProgram:yuvConversionProgram]; + [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; glEnableVertexAttribArray(yuvConversionPositionAttribute); glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); } - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); #endif if (err) { @@ -229,8 +229,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD videoOutput = [[AVCaptureVideoDataOutput alloc] init]; [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; -// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) - if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) +// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) { BOOL supportsFullYUVRange = NO; NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; @@ -257,7 +257,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; -// [videoOutput setSampleBufferDelegate:self queue:[GPUImageOpenGLESContext sharedOpenGLESQueue]]; +// [videoOutput setSampleBufferDelegate:self queue:[GPUImageContext sharedContextQueue]]; if ([_captureSession canAddOutput:videoOutput]) { [_captureSession addOutput:videoOutput]; @@ -292,7 +292,7 @@ - (void)dealloc [self removeInputsAndOutputs]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { CFRelease(coreVideoTextureCache); } @@ -315,8 +315,8 @@ - (void)dealloc } #endif -// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) - if (captureAsYUV && [GPUImageOpenGLESContext supportsFastTextureUpload]) +// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) { [self destroyYUVConversionFBO]; } @@ -549,15 +549,15 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { CVOpenGLESTextureRef luminanceTextureRef = NULL; CVOpenGLESTextureRef chrominanceTextureRef = NULL; CVOpenGLESTextureRef texture = NULL; -// if (captureAsYUV && [GPUImageOpenGLESContext deviceSupportsRedTextures]) +// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) // Check for YUV planar inputs to do RGB conversion { @@ -573,7 +573,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVReturn err; // Y-plane glActiveTexture(GL_TEXTURE4); - if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) + if ([GPUImageContext deviceSupportsRedTextures]) { // err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); @@ -594,7 +594,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; // UV-plane glActiveTexture(GL_TEXTURE5); - if ([GPUImageOpenGLESContext deviceSupportsRedTextures]) + if ([GPUImageContext deviceSupportsRedTextures]) { // err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); @@ -716,7 +716,7 @@ - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)convertYUVToRGBOutput; { - [GPUImageOpenGLESContext setActiveShaderProgram:yuvConversionProgram]; + [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; [self setYUVConversionFBO]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h new file mode 100755 index 000000000..f160f5b92 --- /dev/null +++ b/framework/Source/Mac/GPUImage.h @@ -0,0 +1,17 @@ +#import + +// Base classes +#import +#import + +// Sources +#import +#import + +// Filters +#import +#import + +// Outputs +#import +#import diff --git a/framework/Source/Mac/GPUImageContext.h b/framework/Source/Mac/GPUImageContext.h new file mode 100755 index 000000000..7281bd97c --- /dev/null +++ b/framework/Source/Mac/GPUImageContext.h @@ -0,0 +1,59 @@ +#import +#import +#import +#import +#import "GLProgram.h" + +#define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical) + +typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180 } GPUImageRotationMode; + +@interface GPUImageContext : NSObject + +@property(readonly, nonatomic) dispatch_queue_t contextQueue; +@property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram; +@property(readonly, retain, nonatomic) NSOpenGLContext *context; + ++ (void *)contextKey; ++ (GPUImageContext *)sharedImageProcessingContext; ++ (dispatch_queue_t)sharedContextQueue; ++ (void)useImageProcessingContext; ++ (void)setActiveShaderProgram:(GLProgram *)shaderProgram; ++ (GLint)maximumTextureSizeForThisDevice; ++ (GLint)maximumTextureUnitsForThisDevice; ++ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; ++ (BOOL)deviceSupportsRedTextures; ++ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; + +- (void)presentBufferForDisplay; +- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString; + +- (void)useSharegroup:(CGLShareGroupObj *)sharegroup; + +// Manage fast texture upload ++ (BOOL)supportsFastTextureUpload; + +@end + +@protocol GPUImageTextureDelegate; + +@protocol GPUImageInput +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; +- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +- (NSInteger)nextAvailableTextureIndex; +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +- (CGSize)maximumOutputSize; +- (void)endProcessing; +- (BOOL)shouldIgnoreUpdatesToThisTarget; +- (BOOL)enabled; +- (void)conserveMemoryForNextFrame; +- (BOOL)wantsMonochromeInput; +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +@end + +@protocol GPUImageTextureDelegate +- (void)textureNoLongerNeededForTarget:(id)textureTarget; +@end + diff --git a/framework/Source/Mac/GPUImageContext.m b/framework/Source/Mac/GPUImageContext.m new file mode 100755 index 000000000..9b1acf9f7 --- /dev/null +++ b/framework/Source/Mac/GPUImageContext.m @@ -0,0 +1,228 @@ +#import "GPUImageContext.h" +#import + +@interface GPUImageContext() +{ + NSMutableDictionary *shaderProgramCache; + CGLShareGroupObj *_sharegroup; +} + +@end + +@implementation GPUImageContext + +@synthesize context = _context; +@synthesize currentShaderProgram = _currentShaderProgram; +@synthesize contextQueue = _contextQueue; + +static void *openGLESContextQueueKey; + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + openGLESContextQueueKey = &openGLESContextQueueKey; + _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); + dispatch_queue_set_specific(_contextQueue, openGLESContextQueueKey, (__bridge void *)self, NULL); + shaderProgramCache = [[NSMutableDictionary alloc] init]; + + return self; +} + ++ (void *)contextKey { + return openGLESContextQueueKey; +} + +// Based on Colin Wheeler's example here: http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html ++ (GPUImageContext *)sharedImageProcessingContext; +{ + static dispatch_once_t pred; + static GPUImageContext *sharedImageProcessingContext = nil; + + dispatch_once(&pred, ^{ + sharedImageProcessingContext = [[[self class] alloc] init]; + }); + return sharedImageProcessingContext; +} + ++ (dispatch_queue_t)sharedContextQueue; +{ + return [[self sharedImageProcessingContext] contextQueue]; +} + ++ (void)useImageProcessingContext; +{ + NSOpenGLContext *imageProcessingContext = [[GPUImageContext sharedImageProcessingContext] context]; + if ([NSOpenGLContext currentContext] != imageProcessingContext) + { + [imageProcessingContext makeCurrentContext]; + } +} + ++ (void)setActiveShaderProgram:(GLProgram *)shaderProgram; +{ + GPUImageContext *sharedContext = [GPUImageContext sharedImageProcessingContext]; + NSOpenGLContext *imageProcessingContext = [sharedContext context]; + if ([NSOpenGLContext currentContext] != imageProcessingContext) + { + [imageProcessingContext makeCurrentContext]; + } + + if (sharedContext.currentShaderProgram != shaderProgram) + { + sharedContext.currentShaderProgram = shaderProgram; + [shaderProgram use]; + } +} + ++ (GLint)maximumTextureSizeForThisDevice; +{ + static dispatch_once_t pred; + static GLint maxTextureSize = 0; + + dispatch_once(&pred, ^{ + [self useImageProcessingContext]; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); + }); + + return maxTextureSize; +} + ++ (GLint)maximumTextureUnitsForThisDevice; +{ + GLint maxTextureUnits; + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); + return maxTextureUnits; +} + ++ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; +{ + static dispatch_once_t pred; + static NSArray *extensionNames = nil; + + // Cache extensions for later quick reference, since this won't change for a given device + dispatch_once(&pred, ^{ + [GPUImageContext useImageProcessingContext]; + NSString *extensionsString = [NSString stringWithCString:(const char *)glGetString(GL_EXTENSIONS) encoding:NSASCIIStringEncoding]; + extensionNames = [extensionsString componentsSeparatedByString:@" "]; + }); + + return [extensionNames containsObject:extension]; +} + + +// http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt + ++ (BOOL)deviceSupportsRedTextures; +{ + static dispatch_once_t pred; + static BOOL supportsRedTextures = NO; + + dispatch_once(&pred, ^{ + supportsRedTextures = [GPUImageContext deviceSupportsOpenGLESExtension:@"GL_EXT_texture_rg"]; + }); + + return supportsRedTextures; +} + + ++ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; +{ + GLint maxTextureSize = [self maximumTextureSizeForThisDevice]; + if ( (inputSize.width < maxTextureSize) && (inputSize.height < maxTextureSize) ) + { + return inputSize; + } + + CGSize adjustedSize; + if (inputSize.width > inputSize.height) + { + adjustedSize.width = (CGFloat)maxTextureSize; + adjustedSize.height = ((CGFloat)maxTextureSize / inputSize.width) * inputSize.height; + } + else + { + adjustedSize.height = (CGFloat)maxTextureSize; + adjustedSize.width = ((CGFloat)maxTextureSize / inputSize.height) * inputSize.width; + } + + return adjustedSize; +} + +- (void)presentBufferForDisplay; +{ + [self.context flushBuffer]; +} + +- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString; +{ + NSString *lookupKeyForShaderProgram = [NSString stringWithFormat:@"V: %@ - F: %@", vertexShaderString, fragmentShaderString]; + GLProgram *programFromCache = [shaderProgramCache objectForKey:lookupKeyForShaderProgram]; + + if (programFromCache == nil) + { + programFromCache = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; + [shaderProgramCache setObject:programFromCache forKey:lookupKeyForShaderProgram]; + } + + return programFromCache; +} + +- (void)useSharegroup:(CGLShareGroupObj *)sharegroup; +{ + NSAssert(_context == nil, @"Unable to use a share group when the context has already been created. Call this method before you use the context for the first time."); + + _sharegroup = sharegroup; +} + +- (NSOpenGLContext *)createContext; +{ + NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, 0, + 0 + }; + + NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes]; + if (pixelFormat == nil) + { + NSLog(@"Error: No appropriate pixel format found"); + } + // TODO: Take into account the sharegroup + NSOpenGLContext *context = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil]; + + NSAssert(context != nil, @"Unable to create an OpenGL context. The GPUImage framework requires OpenGL support to work."); + return context; +} + + +#pragma mark - +#pragma mark Manage fast texture upload + ++ (BOOL)supportsFastTextureUpload; +{ + // This may need to be redone to account for the Mac's accelerated data transfer methods + return NO; +} + +#pragma mark - +#pragma mark Accessors + +- (NSOpenGLContext *)context; +{ + if (_context == nil) + { + _context = [self createContext]; + [_context makeCurrentContext]; + + // Set up a few global settings for the image processing pipeline + glDisable(GL_DEPTH_TEST); + } + + return _context; +} + +@end diff --git a/framework/Source/Mac/GPUImageMac-Info.plist b/framework/Source/Mac/GPUImageMac-Info.plist new file mode 100644 index 000000000..88daf2cb2 --- /dev/null +++ b/framework/Source/Mac/GPUImageMac-Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSHumanReadableCopyright + Copyright © 2013 Sunset Lake Software LLC. All rights reserved. + NSPrincipalClass + + + diff --git a/framework/Source/Mac/GPUImageMac-Prefix.pch b/framework/Source/Mac/GPUImageMac-Prefix.pch new file mode 100644 index 000000000..f01e58184 --- /dev/null +++ b/framework/Source/Mac/GPUImageMac-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'GPUImageMac' target in the 'GPUImageMac' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/framework/Source/Mac/GPUImageMovieWriter.h b/framework/Source/Mac/GPUImageMovieWriter.h new file mode 100755 index 000000000..f9edc87c6 --- /dev/null +++ b/framework/Source/Mac/GPUImageMovieWriter.h @@ -0,0 +1,59 @@ +#import +#import +#import "GPUImageContext.h" + +extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; + +@protocol GPUImageMovieWriterDelegate + +@optional +- (void)movieRecordingCompleted; +- (void)movieRecordingFailedWithError:(NSError*)error; + +@end + +@interface GPUImageMovieWriter : NSObject +{ + CMVideoDimensions videoDimensions; + CMVideoCodecType videoType; + + NSURL *movieURL; + NSString *fileType; + AVAssetWriter *assetWriter; + AVAssetWriterInput *assetWriterAudioInput; + AVAssetWriterInput *assetWriterVideoInput; + AVAssetWriterInputPixelBufferAdaptor *assetWriterPixelBufferInput; + dispatch_queue_t movieWritingQueue; + + CGSize videoSize; + GPUImageRotationMode inputRotation; + + __unsafe_unretained id textureDelegate; +} + +@property(readwrite, nonatomic) BOOL hasAudioTrack; +@property(readwrite, nonatomic) BOOL shouldPassthroughAudio; +@property(nonatomic, copy) void(^completionBlock)(void); +@property(nonatomic, copy) void(^failureBlock)(NSError*); +@property(nonatomic, assign) id delegate; +@property(readwrite, nonatomic) BOOL encodingLiveVideo; +@property(nonatomic, copy) void(^videoInputReadyCallback)(void); +@property(nonatomic, copy) void(^audioInputReadyCallback)(void); +@property(nonatomic) BOOL enabled; + +// Initialization and teardown +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; + +- (void)setHasAudioTrack:(BOOL)hasAudioTrack audioSettings:(NSDictionary *)audioOutputSettings; + +// Movie recording +- (void)startRecording; +- (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; +- (void)finishRecording; +- (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; +- (void)cancelRecording; +- (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; +- (void)enableSynchronizationCallbacks; + +@end diff --git a/framework/Source/Mac/GPUImageMovieWriter.m b/framework/Source/Mac/GPUImageMovieWriter.m new file mode 100755 index 000000000..889fcda2f --- /dev/null +++ b/framework/Source/Mac/GPUImageMovieWriter.m @@ -0,0 +1,627 @@ +#import "GPUImageMovieWriter.h" + +#import "GPUImageContext.h" +#import "GLProgram.h" +#import "GPUImageFilter.h" + +NSString *const kGPUImageColorSwizzlingFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate).bgra; + } +); + + +@interface GPUImageMovieWriter () +{ + GLuint movieFramebuffer, movieRenderbuffer; + + GLProgram *colorSwizzlingProgram; + GLint colorSwizzlingPositionAttribute, colorSwizzlingTextureCoordinateAttribute; + GLint colorSwizzlingInputTextureUniform; + + GLuint inputTextureForMovieRendering; + + GLubyte *frameData; + + CMTime startTime, previousFrameTime; + + BOOL isRecording; +} + +// Movie recording +- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; + +// Frame rendering +- (void)createDataFBO; +- (void)destroyDataFBO; +- (void)setFilterFBO; + +- (void)renderAtInternalSize; + +@end + +@implementation GPUImageMovieWriter + +@synthesize hasAudioTrack = _hasAudioTrack; +@synthesize encodingLiveVideo = _encodingLiveVideo; +@synthesize shouldPassthroughAudio = _shouldPassthroughAudio; +@synthesize completionBlock; +@synthesize failureBlock; +@synthesize videoInputReadyCallback; +@synthesize audioInputReadyCallback; +@synthesize enabled; + +@synthesize delegate = _delegate; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; +{ + return [self initWithMovieURL:newMovieURL size:newSize fileType:AVFileTypeQuickTimeMovie outputSettings:nil]; +} + +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; +{ + if (!(self = [super init])) + { + return nil; + } + + self.enabled = YES; + + videoSize = newSize; + movieURL = newMovieURL; + fileType = newFileType; + startTime = kCMTimeInvalid; + _encodingLiveVideo = YES; + previousFrameTime = kCMTimeNegativeInfinity; + inputRotation = kGPUImageNoRotation; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + if ([GPUImageContext supportsFastTextureUpload]) + { + colorSwizzlingProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + } + else + { + colorSwizzlingProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + } + + if (!colorSwizzlingProgram.initialized) + { + [colorSwizzlingProgram addAttribute:@"position"]; + [colorSwizzlingProgram addAttribute:@"inputTextureCoordinate"]; + + if (![colorSwizzlingProgram link]) + { + NSString *progLog = [colorSwizzlingProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [colorSwizzlingProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [colorSwizzlingProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + colorSwizzlingProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + colorSwizzlingPositionAttribute = [colorSwizzlingProgram attributeIndex:@"position"]; + colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; + colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; + + // REFACTOR: Wrap this in a block for the image processing queue + [GPUImageContext setActiveShaderProgram:colorSwizzlingProgram]; + + glEnableVertexAttribArray(colorSwizzlingPositionAttribute); + glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); + }); + + [self initializeMovieWithOutputSettings:outputSettings]; + + return self; +} + +- (void)dealloc; +{ + [self destroyDataFBO]; + + if (frameData != NULL) + { + free(frameData); + } +} + +#pragma mark - +#pragma mark Movie recording + +- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; +{ + isRecording = NO; + + self.enabled = YES; + frameData = (GLubyte *) malloc((int)videoSize.width * (int)videoSize.height * 4); + +// frameData = (GLubyte *) calloc(videoSize.width * videoSize.height * 4, sizeof(GLubyte)); + NSError *error = nil; + assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:fileType error:&error]; + if (error != nil) + { + NSLog(@"Error: %@", error); + if (failureBlock) + { + failureBlock(error); + } + else + { + if(self.delegate && [self.delegate respondsToSelector:@selector(movieRecordingFailedWithError:)]) + { + [self.delegate movieRecordingFailedWithError:error]; + } + } + } + + // Set this to make sure that a functional movie is produced, even if the recording is cut off mid-stream. Only the last second should be lost in that case. + assetWriter.movieFragmentInterval = CMTimeMakeWithSeconds(1.0, 1000); + + // use default output settings if none specified + if (outputSettings == nil) + { + outputSettings = [[NSMutableDictionary alloc] init]; + [outputSettings setObject:AVVideoCodecH264 forKey:AVVideoCodecKey]; + [outputSettings setObject:[NSNumber numberWithInt:videoSize.width] forKey:AVVideoWidthKey]; + [outputSettings setObject:[NSNumber numberWithInt:videoSize.height] forKey:AVVideoHeightKey]; + } + // custom output settings specified + else + { + NSString *videoCodec = [outputSettings objectForKey:AVVideoCodecKey]; + NSNumber *width = [outputSettings objectForKey:AVVideoWidthKey]; + NSNumber *height = [outputSettings objectForKey:AVVideoHeightKey]; + + NSAssert(videoCodec && width && height, @"OutputSettings is missing required parameters."); + } + + /* + NSDictionary *videoCleanApertureSettings = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt:videoSize.width], AVVideoCleanApertureWidthKey, + [NSNumber numberWithInt:videoSize.height], AVVideoCleanApertureHeightKey, + [NSNumber numberWithInt:0], AVVideoCleanApertureHorizontalOffsetKey, + [NSNumber numberWithInt:0], AVVideoCleanApertureVerticalOffsetKey, + nil]; + + NSDictionary *videoAspectRatioSettings = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt:3], AVVideoPixelAspectRatioHorizontalSpacingKey, + [NSNumber numberWithInt:3], AVVideoPixelAspectRatioVerticalSpacingKey, + nil]; + + NSMutableDictionary * compressionProperties = [[NSMutableDictionary alloc] init]; + [compressionProperties setObject:videoCleanApertureSettings forKey:AVVideoCleanApertureKey]; + [compressionProperties setObject:videoAspectRatioSettings forKey:AVVideoPixelAspectRatioKey]; + [compressionProperties setObject:[NSNumber numberWithInt: 2000000] forKey:AVVideoAverageBitRateKey]; + [compressionProperties setObject:[NSNumber numberWithInt: 16] forKey:AVVideoMaxKeyFrameIntervalKey]; + [compressionProperties setObject:AVVideoProfileLevelH264Main31 forKey:AVVideoProfileLevelKey]; + + [outputSettings setObject:compressionProperties forKey:AVVideoCompressionPropertiesKey]; + */ + + assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings]; + assetWriterVideoInput.expectsMediaDataInRealTime = _encodingLiveVideo; + + // You need to use BGRA for the video in order to get realtime encoding. I use a color-swizzling shader to line up glReadPixels' normal RGBA output with the movie input's BGRA. + NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, + [NSNumber numberWithInt:videoSize.width], kCVPixelBufferWidthKey, + [NSNumber numberWithInt:videoSize.height], kCVPixelBufferHeightKey, + nil]; +// NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32ARGB], kCVPixelBufferPixelFormatTypeKey, +// nil]; + + assetWriterPixelBufferInput = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:assetWriterVideoInput sourcePixelBufferAttributes:sourcePixelBufferAttributesDictionary]; + + [assetWriter addInput:assetWriterVideoInput]; +} + +- (void)startRecording; +{ + isRecording = YES; + startTime = kCMTimeInvalid; + // [assetWriter startWriting]; + + // [assetWriter startSessionAtSourceTime:kCMTimeZero]; +} + +- (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; +{ + assetWriterVideoInput.transform = orientationTransform; + + [self startRecording]; +} + +- (void)cancelRecording; +{ + if (assetWriter.status == AVAssetWriterStatusCompleted) + { + return; + } + + isRecording = NO; + runOnMainQueueWithoutDeadlocking(^{ + [assetWriterVideoInput markAsFinished]; + [assetWriterAudioInput markAsFinished]; + [assetWriter cancelWriting]; + }); +} + +- (void)finishRecording; +{ + [self finishRecordingWithCompletionHandler:nil]; +} + +- (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; +{ + if (assetWriter.status == AVAssetWriterStatusCompleted) + { + return; + } + + isRecording = NO; + runOnMainQueueWithoutDeadlocking(^{ + [assetWriterVideoInput markAsFinished]; + [assetWriterAudioInput markAsFinished]; +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) + // Not iOS 6 SDK + [assetWriter finishWriting]; + if (handler) handler(); +#else + // iOS 6 SDK + if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { + // Running iOS 6 + [assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; + } + else { + // Not running iOS 6 + [assetWriter finishWriting]; + if (handler) handler(); + } +#endif + }); +} + +- (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; +{ + if (!isRecording) + { + return; + } + + if (_hasAudioTrack) + { + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); + + if (CMTIME_IS_INVALID(startTime)) + { + if (audioInputReadyCallback == NULL) + { + [assetWriter startWriting]; + } + [assetWriter startSessionAtSourceTime:currentSampleTime]; + startTime = currentSampleTime; + } + + if (!assetWriterAudioInput.readyForMoreMediaData) + { + NSLog(@"Had to drop an audio frame"); + return; + } + +// NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); + [assetWriterAudioInput appendSampleBuffer:audioBuffer]; + } +} + +- (void)enableSynchronizationCallbacks; +{ + if (videoInputReadyCallback != NULL) + { + [assetWriter startWriting]; + [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:[GPUImageContext sharedContextQueue] usingBlock:videoInputReadyCallback]; + } + + if (audioInputReadyCallback != NULL) + { + [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:[GPUImageContext sharedContextQueue] usingBlock:audioInputReadyCallback]; + } + +} + +#pragma mark - +#pragma mark Frame rendering + +- (void)createDataFBO; +{ + glActiveTexture(GL_TEXTURE1); + glGenFramebuffers(1, &movieFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, movieFramebuffer); + + glGenRenderbuffers(1, &movieRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, movieRenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, (int)videoSize.width, (int)videoSize.height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, movieRenderbuffer); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); +} + +- (void)destroyDataFBO; +{ + [GPUImageContext useImageProcessingContext]; + + if (movieFramebuffer) + { + glDeleteFramebuffers(1, &movieFramebuffer); + movieFramebuffer = 0; + } + + if (movieRenderbuffer) + { + glDeleteRenderbuffers(1, &movieRenderbuffer); + movieRenderbuffer = 0; + } +} + +- (void)setFilterFBO; +{ + if (!movieFramebuffer) + { + [self createDataFBO]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, movieFramebuffer); + + glViewport(0, 0, (int)videoSize.width, (int)videoSize.height); +} + +- (void)renderAtInternalSize; +{ + [GPUImageContext useImageProcessingContext]; + [self setFilterFBO]; + + [GPUImageContext setActiveShaderProgram:colorSwizzlingProgram]; + + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // This needs to be flipped to write out to video correctly + static const GLfloat squareVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat textureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, inputTextureForMovieRendering); + glUniform1i(colorSwizzlingInputTextureUniform, 4); + + glVertexAttribPointer(colorSwizzlingPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); + glVertexAttribPointer(colorSwizzlingTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + glFinish(); +} + +#pragma mark - +#pragma mark GPUImageInput protocol + +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; +{ + if (!isRecording) + { + return; + } + + // Drop frames forced by images and other things with no time constants + // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case + if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) || (CMTIME_IS_INDEFINITE(frameTime)) ) + { + return; + } + + if (CMTIME_IS_INVALID(startTime)) + { + if (videoInputReadyCallback == NULL) + { + [assetWriter startWriting]; + } + + [assetWriter startSessionAtSourceTime:frameTime]; + startTime = frameTime; + } + + if (!assetWriterVideoInput.readyForMoreMediaData) + { + NSLog(@"Had to drop a video frame"); + return; + } + + // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames + [GPUImageContext useImageProcessingContext]; + [self renderAtInternalSize]; + + CVPixelBufferRef pixel_buffer = NULL; + + CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &pixel_buffer); + if ((pixel_buffer == NULL) || (status != kCVReturnSuccess)) + { + return; + } + else + { + CVPixelBufferLockBaseAddress(pixel_buffer, 0); + + GLubyte *pixelBufferData = (GLubyte *)CVPixelBufferGetBaseAddress(pixel_buffer); + glReadPixels(0, 0, videoSize.width, videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufferData); + } + +// if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:CMTimeSubtract(frameTime, startTime)]) + if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) + { + NSLog(@"Problem appending pixel buffer at time: %lld", frameTime.value); + } + else + { +// NSLog(@"Recorded video sample time: %lld, %d, %lld", frameTime.value, frameTime.timescale, frameTime.epoch); + } + CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); + + previousFrameTime = frameTime; + + if (![GPUImageContext supportsFastTextureUpload]) + { + CVPixelBufferRelease(pixel_buffer); + } +} + +- (NSInteger)nextAvailableTextureIndex; +{ + return 0; +} + +- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +{ + inputTextureForMovieRendering = newInputTexture; +} + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + inputRotation = newInputRotation; +} + +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ +} + +- (CGSize)maximumOutputSize; +{ + return videoSize; +} + +- (void)endProcessing +{ + if (completionBlock) + { + completionBlock(); + } + else + { + if (_delegate && [_delegate respondsToSelector:@selector(movieRecordingCompleted)]) + { + [_delegate movieRecordingCompleted]; + } + } +} + +- (BOOL)shouldIgnoreUpdatesToThisTarget; +{ + return NO; +} + +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + textureDelegate = newTextureDelegate; +} + +- (void)conserveMemoryForNextFrame; +{ + +} + +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + +#pragma mark - +#pragma mark Accessors + +- (void)setHasAudioTrack:(BOOL)newValue +{ + [self setHasAudioTrack:newValue audioSettings:nil]; +} + +- (void)setHasAudioTrack:(BOOL)newValue audioSettings:(NSDictionary *)audioOutputSettings; +{ + _hasAudioTrack = newValue; + + if (_hasAudioTrack) + { + if (_shouldPassthroughAudio) + { + // Do not set any settings so audio will be the same as passthrough + audioOutputSettings = nil; + } + else if (audioOutputSettings == nil) + { +// double preferredHardwareSampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; + double preferredHardwareSampleRate = 48000; // ? - TODO: Fix this, because it's probably broken + + AudioChannelLayout acl; + bzero( &acl, sizeof(acl)); + acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; + + audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys: + [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, + [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, + [ NSNumber numberWithFloat: preferredHardwareSampleRate ], AVSampleRateKey, + [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, + //[ NSNumber numberWithInt:AVAudioQualityLow], AVEncoderAudioQualityKey, + [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, + nil]; +/* + AudioChannelLayout acl; + bzero( &acl, sizeof(acl)); + acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; + + audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys: + [ NSNumber numberWithInt: kAudioFormatMPEG4AAC ], AVFormatIDKey, + [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, + [ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey, + [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, + [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, + nil];*/ + } + + assetWriterAudioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings]; + [assetWriter addInput:assetWriterAudioInput]; + assetWriterAudioInput.expectsMediaDataInRealTime = _encodingLiveVideo; + } + else + { + // Remove audio track if it exists + } +} + + +@end diff --git a/framework/Source/Mac/GPUImagePicture.h b/framework/Source/Mac/GPUImagePicture.h new file mode 100755 index 000000000..fa2584622 --- /dev/null +++ b/framework/Source/Mac/GPUImagePicture.h @@ -0,0 +1,23 @@ +#import +#import "GPUImageOutput.h" + +@interface GPUImagePicture : GPUImageOutput +{ + CGSize pixelSizeOfImage; + BOOL hasProcessedImage; + + dispatch_semaphore_t imageUpdateSemaphore; +} + +// Initialization and teardown +- (id)initWithURL:(NSURL *)url; +- (id)initWithImage:(NSImage *)newImageSource; +- (id)initWithCGImage:(CGImageRef)newImageSource; +- (id)initWithImage:(NSImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; +- (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; + +// Image rendering +- (void)processImage; +- (CGSize)outputImageSize; + +@end diff --git a/framework/Source/Mac/GPUImagePicture.m b/framework/Source/Mac/GPUImagePicture.m new file mode 100755 index 000000000..577bbebfb --- /dev/null +++ b/framework/Source/Mac/GPUImagePicture.m @@ -0,0 +1,233 @@ +#import "GPUImagePicture.h" + +@implementation GPUImagePicture + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithURL:(NSURL *)url; +{ + NSData *imageData = [[NSData alloc] initWithContentsOfURL:url]; + + if (!(self = [self initWithData:imageData])) + { + return nil; + } + + return self; +} + +- (id)initWithData:(NSData *)imageData; +{ + NSImage *inputImage = [[NSImage alloc] initWithData:imageData]; + + if (!(self = [self initWithImage:inputImage])) + { + return nil; + } + + return self; +} + +- (id)initWithImage:(NSImage *)newImageSource; +{ + if (!(self = [self initWithImage:newImageSource smoothlyScaleOutput:NO])) + { + return nil; + } + + return self; +} + +- (id)initWithCGImage:(CGImageRef)newImageSource; +{ + if (!(self = [self initWithCGImage:newImageSource smoothlyScaleOutput:NO])) + { + return nil; + } + return self; +} + +- (id)initWithImage:(NSImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; +{ + return [self initWithCGImage:[newImageSource CGImageForProposedRect:NULL context:NULL hints:nil] smoothlyScaleOutput:smoothlyScaleOutput]; +} + +- (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; +{ + if (!(self = [super init])) + { + return nil; + } + + hasProcessedImage = NO; + self.shouldSmoothlyScaleOutput = smoothlyScaleOutput; + imageUpdateSemaphore = dispatch_semaphore_create(1); + + // TODO: Dispatch this whole thing asynchronously to move image loading off main thread + CGFloat widthOfImage = CGImageGetWidth(newImageSource); + CGFloat heightOfImage = CGImageGetHeight(newImageSource); + pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); + CGSize pixelSizeToUseForTexture = pixelSizeOfImage; + + BOOL shouldRedrawUsingCoreGraphics = YES; + + // For now, deal with images larger than the maximum texture size by resizing to be within that limit + CGSize scaledImageSizeToFitOnGPU = [GPUImageContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; + if (!CGSizeEqualToSize(scaledImageSizeToFitOnGPU, pixelSizeOfImage)) + { + pixelSizeOfImage = scaledImageSizeToFitOnGPU; + pixelSizeToUseForTexture = pixelSizeOfImage; + shouldRedrawUsingCoreGraphics = YES; + } + + if (self.shouldSmoothlyScaleOutput) + { + // In order to use mipmaps, you need to provide power-of-two textures, so convert to the next largest power of two and stretch to fill + CGFloat powerClosestToWidth = ceil(log2(pixelSizeOfImage.width)); + CGFloat powerClosestToHeight = ceil(log2(pixelSizeOfImage.height)); + + pixelSizeToUseForTexture = CGSizeMake(pow(2.0, powerClosestToWidth), pow(2.0, powerClosestToHeight)); + + shouldRedrawUsingCoreGraphics = YES; + } + + GLubyte *imageData = NULL; + CFDataRef dataFromImageDataProvider; + + // CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); + + if (shouldRedrawUsingCoreGraphics) + { + // For resized image, redraw + imageData = (GLubyte *) calloc(1, (int)pixelSizeToUseForTexture.width * (int)pixelSizeToUseForTexture.height * 4); + + CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); + + CGContextRef imageContext = CGBitmapContextCreate(imageData, (size_t)pixelSizeToUseForTexture.width, (size_t)pixelSizeToUseForTexture.height, 8, (size_t)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html + CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), newImageSource); + CGContextRelease(imageContext); + CGColorSpaceRelease(genericRGBColorspace); + } + else + { + // Access the raw image bytes directly + dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider(newImageSource)); + imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); + } + + // elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; + // NSLog(@"Core Graphics drawing time: %f", elapsedTime); + + // CGFloat currentRedTotal = 0.0f, currentGreenTotal = 0.0f, currentBlueTotal = 0.0f, currentAlphaTotal = 0.0f; + // NSUInteger totalNumberOfPixels = round(pixelSizeToUseForTexture.width * pixelSizeToUseForTexture.height); + // + // for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) + // { + // currentBlueTotal += (CGFloat)imageData[(currentPixel * 4)] / 255.0f; + // currentGreenTotal += (CGFloat)imageData[(currentPixel * 4) + 1] / 255.0f; + // currentRedTotal += (CGFloat)imageData[(currentPixel * 4 + 2)] / 255.0f; + // currentAlphaTotal += (CGFloat)imageData[(currentPixel * 4) + 3] / 255.0f; + // } + // + // NSLog(@"Debug, average input image red: %f, green: %f, blue: %f, alpha: %f", currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + [self initializeOutputTextureIfNeeded]; + + glBindTexture(GL_TEXTURE_2D, outputTexture); + if (self.shouldSmoothlyScaleOutput) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); + + if (self.shouldSmoothlyScaleOutput) + { + glGenerateMipmap(GL_TEXTURE_2D); + } + }); + + if (shouldRedrawUsingCoreGraphics) + { + free(imageData); + } + else + { + CFRelease(dataFromImageDataProvider); + } + + return self; +} + +// ARC forbids explicit message send of 'release' on Mountain Lion, but needs this on Lion and older +#if ( (MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8) || (!defined(__MAC_10_8)) ) +- (void)dealloc; +{ + if (imageUpdateSemaphore != NULL) + { + dispatch_release(imageUpdateSemaphore); + } +} +#endif + +#pragma mark - +#pragma mark Image rendering + +- (void)removeAllTargets; +{ + [super removeAllTargets]; + hasProcessedImage = NO; +} + +- (void)processImage; +{ + hasProcessedImage = YES; + + // dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_FOREVER); + + if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) + { + return; + } + + runAsynchronouslyOnVideoProcessingQueue(^{ + + if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) + { + [self conserveMemoryForNextFrame]; + } + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; + } + + dispatch_semaphore_signal(imageUpdateSemaphore); + }); +} + +- (CGSize)outputImageSize; +{ + return pixelSizeOfImage; +} + +- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; +{ + [super addTarget:newTarget atTextureLocation:textureLocation]; + + if (hasProcessedImage) + { + [newTarget setInputSize:pixelSizeOfImage atIndex:textureLocation]; + [newTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureLocation]; + } +} + +@end \ No newline at end of file diff --git a/framework/Source/Mac/GPUImageView.h b/framework/Source/Mac/GPUImageView.h new file mode 100755 index 000000000..8852f31be --- /dev/null +++ b/framework/Source/Mac/GPUImageView.h @@ -0,0 +1,40 @@ +#import +#import "GPUImageContext.h" + +typedef enum { + kGPUImageFillModeStretch, // Stretch to fill the full view, which may distort the image outside of its normal aspect ratio + kGPUImageFillModePreserveAspectRatio, // Maintains the aspect ratio of the source image, adding bars of the specified background color + kGPUImageFillModePreserveAspectRatioAndFill // Maintains the aspect ratio of the source image, zooming in on its center to fill the view +} GPUImageFillModeType; + +/** + UIView subclass to use as an endpoint for displaying GPUImage outputs + */ +@interface GPUImageView : NSOpenGLView +{ + GPUImageRotationMode inputRotation; + __unsafe_unretained id textureDelegate; +} + +/** The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio + */ +@property(readwrite, nonatomic) GPUImageFillModeType fillMode; + +/** This calculates the current display size, in pixels, taking into account Retina scaling factors + */ +@property(readonly, nonatomic) CGSize sizeInPixels; + +@property(nonatomic) BOOL enabled; + +/** Handling fill mode + + @param redComponent Red component for background color + @param greenComponent Green component for background color + @param blueComponent Blue component for background color + @param alphaComponent Alpha component for background color + */ +- (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; + +@end diff --git a/framework/Source/Mac/GPUImageView.m b/framework/Source/Mac/GPUImageView.m new file mode 100755 index 000000000..3918bf69a --- /dev/null +++ b/framework/Source/Mac/GPUImageView.m @@ -0,0 +1,419 @@ +#import "GPUImageView.h" +#import +#import "GPUImageContext.h" +#import "GPUImageFilter.h" +#import + +#pragma mark - +#pragma mark Private methods and instance variables + +@interface GPUImageView () +{ + GLuint inputTextureForDisplay; + + GLProgram *displayProgram; + GLint displayPositionAttribute, displayTextureCoordinateAttribute; + GLint displayInputTextureUniform; + + CGSize inputImageSize; + GLfloat imageVertices[8]; + GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; +} + +// Initialization and teardown +- (void)commonInit; + +// Managing the display FBOs +- (void)createDisplayFramebuffer; +- (void)destroyDisplayFramebuffer; + +// Handling fill mode +- (void)recalculateViewGeometry; + +@end + +@implementation GPUImageView + +@synthesize sizeInPixels = _sizeInPixels; +@synthesize fillMode = _fillMode; +@synthesize enabled; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithFrame:(CGRect)frame +{ + if (!(self = [super initWithFrame:frame])) + { + return nil; + } + + [self commonInit]; + + return self; +} + +-(id)initWithCoder:(NSCoder *)coder +{ + if (!(self = [super initWithCoder:coder])) + { + return nil; + } + + [self commonInit]; + + return self; +} + +- (void)commonInit; +{ + [self setOpenGLContext:[[GPUImageContext sharedImageProcessingContext] context]]; + inputRotation = kGPUImageNoRotation; + self.hidden = NO; + + self.enabled = YES; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + displayProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + if (!displayProgram.initialized) + { + [displayProgram addAttribute:@"position"]; + [displayProgram addAttribute:@"inputTextureCoordinate"]; + + if (![displayProgram link]) + { + NSString *progLog = [displayProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [displayProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [displayProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + displayProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + displayPositionAttribute = [displayProgram attributeIndex:@"position"]; + displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; + displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader + + [GPUImageContext setActiveShaderProgram:displayProgram]; + glEnableVertexAttribArray(displayPositionAttribute); + glEnableVertexAttribArray(displayTextureCoordinateAttribute); + + [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; + _fillMode = kGPUImageFillModePreserveAspectRatio; + [self createDisplayFramebuffer]; + }); + + [self addObserver:self forKeyPath:@"frame" options:0 context:NULL]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if (object == self && [keyPath isEqualToString:@"frame"] && (!CGSizeEqualToSize(self.bounds.size, CGSizeZero))) + { + runSynchronouslyOnVideoProcessingQueue(^{ + [self destroyDisplayFramebuffer]; + [self createDisplayFramebuffer]; + }); + } +} + +- (void)dealloc +{ + [self removeObserver:self forKeyPath:@"frame"]; + + runSynchronouslyOnVideoProcessingQueue(^{ + [self destroyDisplayFramebuffer]; + }); +} + +#pragma mark - +#pragma mark Managing the display FBOs + +- (void)createDisplayFramebuffer; +{ + // Perhaps I'll use an FBO at some time later, but for now will render directly to the screen + _sizeInPixels.width = self.bounds.size.width; + _sizeInPixels.height = self.bounds.size.height; + +// NSLog(@"Backing width: %d, height: %d", backingWidth, backingHeight); +} + +- (void)destroyDisplayFramebuffer; +{ + [GPUImageContext useImageProcessingContext]; +} + +- (void)setDisplayFramebuffer; +{ + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + glViewport(0, 0, (GLint)_sizeInPixels.width, (GLint)_sizeInPixels.height); +} + +- (void)presentFramebuffer; +{ + glBindRenderbuffer(GL_RENDERBUFFER, 0); + [[GPUImageContext sharedImageProcessingContext] presentBufferForDisplay]; +} + +#pragma mark - +#pragma mark Handling fill mode + +- (void)recalculateViewGeometry; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + CGFloat heightScaling, widthScaling; + + CGSize currentViewSize = self.bounds.size; + + // CGFloat imageAspectRatio = inputImageSize.width / inputImageSize.height; + // CGFloat viewAspectRatio = currentViewSize.width / currentViewSize.height; + + CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(inputImageSize, self.bounds); + + switch(_fillMode) + { + case kGPUImageFillModeStretch: + { + widthScaling = 1.0; + heightScaling = 1.0; + }; break; + case kGPUImageFillModePreserveAspectRatio: + { + widthScaling = insetRect.size.width / currentViewSize.width; + heightScaling = insetRect.size.height / currentViewSize.height; + }; break; + case kGPUImageFillModePreserveAspectRatioAndFill: + { + // CGFloat widthHolder = insetRect.size.width / currentViewSize.width; + widthScaling = currentViewSize.height / insetRect.size.height; + heightScaling = currentViewSize.width / insetRect.size.width; + }; break; + } + + imageVertices[0] = -widthScaling; + imageVertices[1] = -heightScaling; + imageVertices[2] = widthScaling; + imageVertices[3] = -heightScaling; + imageVertices[4] = -widthScaling; + imageVertices[5] = heightScaling; + imageVertices[6] = widthScaling; + imageVertices[7] = heightScaling; + }); + +// static const GLfloat imageVertices[] = { +// -1.0f, -1.0f, +// 1.0f, -1.0f, +// -1.0f, 1.0f, +// 1.0f, 1.0f, +// }; +} + +- (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; +{ + backgroundColorRed = redComponent; + backgroundColorGreen = greenComponent; + backgroundColorBlue = blueComponent; + backgroundColorAlpha = alphaComponent; +} + ++ (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; +{ +// static const GLfloat noRotationTextureCoordinates[] = { +// 0.0f, 0.0f, +// 1.0f, 0.0f, +// 0.0f, 1.0f, +// 1.0f, 1.0f, +// }; + + static const GLfloat noRotationTextureCoordinates[] = { + 0.0f, 1.0f, + 1.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 0.0f, + }; + + static const GLfloat rotateRightTextureCoordinates[] = { + 1.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 0.0f, 0.0f, + }; + + static const GLfloat rotateLeftTextureCoordinates[] = { + 0.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 0.0f, + 1.0f, 1.0f, + }; + + static const GLfloat verticalFlipTextureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat horizontalFlipTextureCoordinates[] = { + 1.0f, 1.0f, + 0.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 0.0f, + }; + + static const GLfloat rotateRightVerticalFlipTextureCoordinates[] = { + 1.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 0.0f, + 0.0f, 1.0f, + }; + + static const GLfloat rotate180TextureCoordinates[] = { + 1.0f, 0.0f, + 0.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 1.0f, + }; + + switch(rotationMode) + { + case kGPUImageNoRotation: return noRotationTextureCoordinates; + case kGPUImageRotateLeft: return rotateLeftTextureCoordinates; + case kGPUImageRotateRight: return rotateRightTextureCoordinates; + case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; + case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; + case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; + case kGPUImageRotate180: return rotate180TextureCoordinates; + } +} + +#pragma mark - +#pragma mark GPUInput protocol + +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext setActiveShaderProgram:displayProgram]; + [self setDisplayFramebuffer]; + + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); + glUniform1i(displayInputTextureUniform, 4); + + glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); + glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + [self presentFramebuffer]; + }); +} + +- (NSInteger)nextAvailableTextureIndex; +{ + return 0; +} + +- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +{ + inputTextureForDisplay = newInputTexture; +} + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + inputRotation = newInputRotation; +} + +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + CGSize rotatedSize = newSize; + + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + rotatedSize.width = newSize.height; + rotatedSize.height = newSize.width; + } + + if (!CGSizeEqualToSize(inputImageSize, rotatedSize)) + { + inputImageSize = rotatedSize; + [self recalculateViewGeometry]; + } + }); +} + +- (CGSize)maximumOutputSize; +{ + if ([self respondsToSelector:@selector(setContentScaleFactor:)]) + { + CGSize pointSize = self.bounds.size; + // TODO: Account for Retina displays + return pointSize; +// return CGSizeMake(self.contentScaleFactor * pointSize.width, self.contentScaleFactor * pointSize.height); + } + else + { + return self.bounds.size; + } +} + +- (void)endProcessing +{ +} + +- (BOOL)shouldIgnoreUpdatesToThisTarget; +{ + return NO; +} + +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + textureDelegate = newTextureDelegate; +} + +- (void)conserveMemoryForNextFrame; +{ + +} + +- (BOOL)wantsMonochromeInput; +{ + return NO; +} + +- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; +{ + +} + +#pragma mark - +#pragma mark Accessors + +- (CGSize)sizeInPixels; +{ + if (CGSizeEqualToSize(_sizeInPixels, CGSizeZero)) + { + return [self maximumOutputSize]; + } + else + { + return _sizeInPixels; + } +} + +- (void)setFillMode:(GPUImageFillModeType)newValue; +{ + _fillMode = newValue; + [self recalculateViewGeometry]; +} + +@end diff --git a/framework/Source/Mac/en.lproj/InfoPlist.strings b/framework/Source/Mac/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/framework/Source/Mac/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/framework/Source/GPUImage-Prefix.pch b/framework/Source/iOS/GPUImage-Prefix.pch similarity index 100% rename from framework/Source/GPUImage-Prefix.pch rename to framework/Source/iOS/GPUImage-Prefix.pch diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/iOS/GPUImageContext.h similarity index 93% rename from framework/Source/GPUImageOpenGLESContext.h rename to framework/Source/iOS/GPUImageContext.h index 5fab58215..a3fba2f3e 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/iOS/GPUImageContext.h @@ -10,15 +10,15 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180 } GPUImageRotationMode; -@interface GPUImageOpenGLESContext : NSObject +@interface GPUImageContext : NSObject -@property(readonly, retain, nonatomic) EAGLContext *context; @property(readonly, nonatomic) dispatch_queue_t contextQueue; @property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram; +@property(readonly, retain, nonatomic) EAGLContext *context; + (void *)contextKey; -+ (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; -+ (dispatch_queue_t)sharedOpenGLESQueue; ++ (GPUImageContext *)sharedImageProcessingContext; ++ (dispatch_queue_t)sharedContextQueue; + (void)useImageProcessingContext; + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/iOS/GPUImageContext.m similarity index 85% rename from framework/Source/GPUImageOpenGLESContext.m rename to framework/Source/iOS/GPUImageContext.m index 0572c18b3..fd2bef1c4 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -1,8 +1,8 @@ -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" #import #import -@interface GPUImageOpenGLESContext() +@interface GPUImageContext() { NSMutableDictionary *shaderProgramCache; EAGLSharegroup *_sharegroup; @@ -10,7 +10,7 @@ @interface GPUImageOpenGLESContext() @end -@implementation GPUImageOpenGLESContext +@implementation GPUImageContext @synthesize context = _context; @synthesize currentShaderProgram = _currentShaderProgram; @@ -38,25 +38,25 @@ + (void *)contextKey { } // Based on Colin Wheeler's example here: http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html -+ (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; ++ (GPUImageContext *)sharedImageProcessingContext; { static dispatch_once_t pred; - static GPUImageOpenGLESContext *sharedImageProcessingOpenGLESContext = nil; + static GPUImageContext *sharedImageProcessingContext = nil; dispatch_once(&pred, ^{ - sharedImageProcessingOpenGLESContext = [[[self class] alloc] init]; + sharedImageProcessingContext = [[[self class] alloc] init]; }); - return sharedImageProcessingOpenGLESContext; + return sharedImageProcessingContext; } -+ (dispatch_queue_t)sharedOpenGLESQueue; ++ (dispatch_queue_t)sharedContextQueue; { - return [[self sharedImageProcessingOpenGLESContext] contextQueue]; + return [[self sharedImageProcessingContext] contextQueue]; } + (void)useImageProcessingContext; { - EAGLContext *imageProcessingContext = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context]; + EAGLContext *imageProcessingContext = [[GPUImageContext sharedImageProcessingContext] context]; if ([EAGLContext currentContext] != imageProcessingContext) { [EAGLContext setCurrentContext:imageProcessingContext]; @@ -65,7 +65,7 @@ + (void)useImageProcessingContext; + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; { - GPUImageOpenGLESContext *sharedContext = [GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext]; + GPUImageContext *sharedContext = [GPUImageContext sharedImageProcessingContext]; EAGLContext *imageProcessingContext = [sharedContext context]; if ([EAGLContext currentContext] != imageProcessingContext) { @@ -106,7 +106,7 @@ + (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; // Cache extensions for later quick reference, since this won't change for a given device dispatch_once(&pred, ^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; NSString *extensionsString = [NSString stringWithCString:(const char *)glGetString(GL_EXTENSIONS) encoding:NSASCIIStringEncoding]; extensionNames = [extensionsString componentsSeparatedByString:@" "]; }); @@ -123,7 +123,7 @@ + (BOOL)deviceSupportsRedTextures; static BOOL supportsRedTextures = NO; dispatch_once(&pred, ^{ - supportsRedTextures = [GPUImageOpenGLESContext deviceSupportsOpenGLESExtension:@"GL_EXT_texture_rg"]; + supportsRedTextures = [GPUImageContext deviceSupportsOpenGLESExtension:@"GL_EXT_texture_rg"]; }); return supportsRedTextures; diff --git a/framework/Source/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h similarity index 98% rename from framework/Source/GPUImageMovieWriter.h rename to framework/Source/iOS/GPUImageMovieWriter.h index 0de531b97..b46e908ce 100755 --- a/framework/Source/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -1,6 +1,6 @@ #import #import -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m similarity index 93% rename from framework/Source/GPUImageMovieWriter.m rename to framework/Source/iOS/GPUImageMovieWriter.m index b18971fb8..a586b023b 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -1,6 +1,6 @@ #import "GPUImageMovieWriter.h" -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" #import "GLProgram.h" #import "GPUImageFilter.h" @@ -85,15 +85,15 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr inputRotation = kGPUImageNoRotation; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { - colorSwizzlingProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + colorSwizzlingProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; } else { - colorSwizzlingProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + colorSwizzlingProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; } if (!colorSwizzlingProgram.initialized) @@ -119,7 +119,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; // REFACTOR: Wrap this in a block for the image processing queue - [GPUImageOpenGLESContext setActiveShaderProgram:colorSwizzlingProgram]; + [GPUImageContext setActiveShaderProgram:colorSwizzlingProgram]; glEnableVertexAttribArray(colorSwizzlingPositionAttribute); glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); @@ -332,12 +332,12 @@ - (void)enableSynchronizationCallbacks; if (videoInputReadyCallback != NULL) { [assetWriter startWriting]; - [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:[GPUImageOpenGLESContext sharedOpenGLESQueue] usingBlock:videoInputReadyCallback]; + [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:[GPUImageContext sharedContextQueue] usingBlock:videoInputReadyCallback]; } if (audioInputReadyCallback != NULL) { - [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:[GPUImageOpenGLESContext sharedOpenGLESQueue] usingBlock:audioInputReadyCallback]; + [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:[GPUImageContext sharedContextQueue] usingBlock:audioInputReadyCallback]; } } @@ -351,12 +351,12 @@ - (void)createDataFBO; glGenFramebuffers(1, &movieFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, movieFramebuffer); - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); #endif if (err) @@ -402,7 +402,7 @@ - (void)createDataFBO; - (void)destroyDataFBO; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (movieFramebuffer) { @@ -416,7 +416,7 @@ - (void)destroyDataFBO; movieRenderbuffer = 0; } - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { if (coreVideoTextureCache) { @@ -449,10 +449,10 @@ - (void)setFilterFBO; - (void)renderAtInternalSize; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; [self setFilterFBO]; - [GPUImageOpenGLESContext setActiveShaderProgram:colorSwizzlingProgram]; + [GPUImageContext setActiveShaderProgram:colorSwizzlingProgram]; glClearColor(1.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -519,12 +519,12 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; [self renderAtInternalSize]; CVPixelBufferRef pixel_buffer = NULL; - if ([GPUImageOpenGLESContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload]) { pixel_buffer = renderTarget; CVPixelBufferLockBaseAddress(pixel_buffer, 0); @@ -558,7 +558,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; previousFrameTime = frameTime; - if (![GPUImageOpenGLESContext supportsFastTextureUpload]) + if (![GPUImageContext supportsFastTextureUpload]) { CVPixelBufferRelease(pixel_buffer); } diff --git a/framework/Source/GPUImagePicture.h b/framework/Source/iOS/GPUImagePicture.h similarity index 100% rename from framework/Source/GPUImagePicture.h rename to framework/Source/iOS/GPUImagePicture.h diff --git a/framework/Source/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m similarity index 97% rename from framework/Source/GPUImagePicture.m rename to framework/Source/iOS/GPUImagePicture.m index 501c9970f..49d2901ce 100755 --- a/framework/Source/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -13,7 +13,7 @@ - (id)initWithURL:(NSURL *)url; { return nil; } - + return self; } @@ -73,7 +73,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot BOOL shouldRedrawUsingCoreGraphics = YES; // For now, deal with images larger than the maximum texture size by resizing to be within that limit - CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; + CGSize scaledImageSizeToFitOnGPU = [GPUImageContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; if (!CGSizeEqualToSize(scaledImageSizeToFitOnGPU, pixelSizeOfImage)) { pixelSizeOfImage = scaledImageSizeToFitOnGPU; @@ -134,7 +134,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot // NSLog(@"Debug, average input image red: %f, green: %f, blue: %f, alpha: %f", currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; [self initializeOutputTextureIfNeeded]; diff --git a/framework/Source/GPUImageView.h b/framework/Source/iOS/GPUImageView.h similarity index 97% rename from framework/Source/GPUImageView.h rename to framework/Source/iOS/GPUImageView.h index 62ac641fc..7d0465ab4 100755 --- a/framework/Source/GPUImageView.h +++ b/framework/Source/iOS/GPUImageView.h @@ -1,5 +1,5 @@ #import -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" typedef enum { kGPUImageFillModeStretch, // Stretch to fill the full view, which may distort the image outside of its normal aspect ratio diff --git a/framework/Source/GPUImageView.m b/framework/Source/iOS/GPUImageView.m similarity index 94% rename from framework/Source/GPUImageView.m rename to framework/Source/iOS/GPUImageView.m index e9fd485dd..015c29e18 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/iOS/GPUImageView.m @@ -1,7 +1,7 @@ #import "GPUImageView.h" #import #import -#import "GPUImageOpenGLESContext.h" +#import "GPUImageContext.h" #import "GPUImageFilter.h" #import @@ -90,9 +90,9 @@ - (void)commonInit; self.enabled = YES; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; - displayProgram = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + displayProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; if (!displayProgram.initialized) { [displayProgram addAttribute:@"position"]; @@ -115,7 +115,7 @@ - (void)commonInit; displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader - [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; + [GPUImageContext setActiveShaderProgram:displayProgram]; glEnableVertexAttribArray(displayPositionAttribute); glEnableVertexAttribArray(displayTextureCoordinateAttribute); @@ -152,7 +152,7 @@ - (void)dealloc - (void)createDisplayFramebuffer; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; glGenFramebuffers(1, &displayFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, displayFramebuffer); @@ -160,7 +160,7 @@ - (void)createDisplayFramebuffer; glGenRenderbuffers(1, &displayRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, displayRenderbuffer); - [[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; + [[[GPUImageContext sharedImageProcessingContext] context] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; GLint backingWidth, backingHeight; @@ -186,7 +186,7 @@ - (void)createDisplayFramebuffer; - (void)destroyDisplayFramebuffer; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageContext useImageProcessingContext]; if (displayFramebuffer) { @@ -216,7 +216,7 @@ - (void)setDisplayFramebuffer; - (void)presentFramebuffer; { glBindRenderbuffer(GL_RENDERBUFFER, displayRenderbuffer); - [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] presentBufferForDisplay]; + [[GPUImageContext sharedImageProcessingContext] presentBufferForDisplay]; } #pragma mark - @@ -356,7 +356,7 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; + [GPUImageContext setActiveShaderProgram:displayProgram]; [self setDisplayFramebuffer]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); From 5b87ee41d5337054456c4ff1016b05e4e5720c73 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 23 Apr 2013 19:57:24 -0500 Subject: [PATCH 358/695] Added a FilterShowcase example to the Mac port and added an AV Foundation video camera input to the Mac. --- .../FilterShowcase.xcodeproj/project.pbxproj | 380 ++ .../FilterShowcase/FilterShowcase-Info.plist | 34 + .../FilterShowcase/FilterShowcase-Prefix.pch | 7 + .../FilterShowcase/SLSAppDelegate.h | 9 + .../FilterShowcase/SLSAppDelegate.m | 13 + .../FilterShowcase/en.lproj/Credits.rtf | 29 + .../FilterShowcase/en.lproj/InfoPlist.strings | 2 + .../FilterShowcase/en.lproj/MainMenu.xib | 3139 +++++++++++++++++ .../Mac/FilterShowcase/FilterShowcase/main.m | 6 + .../SLSFilterShowcaseWindowController.h | 22 + .../SLSFilterShowcaseWindowController.m | 114 + .../SLSFilterShowcaseWindowController.xib | 851 +++++ .../project.pbxproj | 2 +- .../en.lproj/SLSDocument.xib | 48 +- .../GPUImageMac.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImageOutput.m | 2 +- framework/Source/Mac/GPUImage.h | 1 + framework/Source/Mac/GPUImageAVCamera.h | 126 + framework/Source/Mac/GPUImageAVCamera.m | 775 ++++ 19 files changed, 5519 insertions(+), 49 deletions(-) create mode 100644 examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj create mode 100644 examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist create mode 100644 examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch create mode 100644 examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.h create mode 100644 examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.m create mode 100644 examples/Mac/FilterShowcase/FilterShowcase/en.lproj/Credits.rtf create mode 100644 examples/Mac/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings create mode 100644 examples/Mac/FilterShowcase/FilterShowcase/en.lproj/MainMenu.xib create mode 100644 examples/Mac/FilterShowcase/FilterShowcase/main.m create mode 100644 examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h create mode 100644 examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m create mode 100644 examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib create mode 100755 framework/Source/Mac/GPUImageAVCamera.h create mode 100644 framework/Source/Mac/GPUImageAVCamera.m diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj new file mode 100644 index 000000000..051e122a8 --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -0,0 +1,380 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BCF8676E17263EAC00912E34 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8676D17263EAC00912E34 /* Cocoa.framework */; }; + BCF8677817263EAC00912E34 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF8677617263EAC00912E34 /* InfoPlist.strings */; }; + BCF8677A17263EAC00912E34 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8677917263EAC00912E34 /* main.m */; }; + BCF8677E17263EAC00912E34 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = BCF8677C17263EAC00912E34 /* Credits.rtf */; }; + BCF8678117263EAD00912E34 /* SLSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8678017263EAD00912E34 /* SLSAppDelegate.m */; }; + BCF8678417263EAD00912E34 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCF8678217263EAD00912E34 /* MainMenu.xib */; }; + BCF8679617263FCF00912E34 /* SLSFilterShowcaseWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8679417263FCF00912E34 /* SLSFilterShowcaseWindowController.m */; }; + BCF8679717263FCF00912E34 /* SLSFilterShowcaseWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCF8679517263FCF00912E34 /* SLSFilterShowcaseWindowController.xib */; }; + BCF8679A1726410E00912E34 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8678F17263F3500912E34 /* GPUImage.framework */; }; + BCF867A1172762B500912E34 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867A0172762B500912E34 /* AVFoundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BCF8678E17263F3500912E34 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF8678A17263F3400912E34 /* GPUImageMac.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCA3F31C17239B6500E28AEC; + remoteInfo = GPUImage; + }; + BCF867981726410300912E34 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF8678A17263F3400912E34 /* GPUImageMac.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BCA3F31B17239B6500E28AEC; + remoteInfo = GPUImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + BCF8676A17263EAC00912E34 /* FilterShowcase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FilterShowcase.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BCF8676D17263EAC00912E34 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + BCF8677017263EAC00912E34 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + BCF8677117263EAC00912E34 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + BCF8677217263EAC00912E34 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + BCF8677517263EAC00912E34 /* FilterShowcase-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "FilterShowcase-Info.plist"; sourceTree = ""; }; + BCF8677717263EAC00912E34 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + BCF8677917263EAC00912E34 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + BCF8677B17263EAC00912E34 /* FilterShowcase-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FilterShowcase-Prefix.pch"; sourceTree = ""; }; + BCF8677D17263EAC00912E34 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + BCF8677F17263EAC00912E34 /* SLSAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SLSAppDelegate.h; sourceTree = ""; }; + BCF8678017263EAD00912E34 /* SLSAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SLSAppDelegate.m; sourceTree = ""; }; + BCF8678317263EAD00912E34 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + BCF8678A17263F3400912E34 /* GPUImageMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImageMac.xcodeproj; path = ../../../framework/GPUImageMac.xcodeproj; sourceTree = ""; }; + BCF8679317263FCF00912E34 /* SLSFilterShowcaseWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SLSFilterShowcaseWindowController.h; path = ../SLSFilterShowcaseWindowController.h; sourceTree = ""; }; + BCF8679417263FCF00912E34 /* SLSFilterShowcaseWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SLSFilterShowcaseWindowController.m; path = ../SLSFilterShowcaseWindowController.m; sourceTree = ""; }; + BCF8679517263FCF00912E34 /* SLSFilterShowcaseWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = SLSFilterShowcaseWindowController.xib; path = ../SLSFilterShowcaseWindowController.xib; sourceTree = ""; }; + BCF867A0172762B500912E34 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BCF8676717263EAC00912E34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF867A1172762B500912E34 /* AVFoundation.framework in Frameworks */, + BCF8679A1726410E00912E34 /* GPUImage.framework in Frameworks */, + BCF8676E17263EAC00912E34 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BCF8676117263EAC00912E34 = { + isa = PBXGroup; + children = ( + BCF867A0172762B500912E34 /* AVFoundation.framework */, + BCF8677317263EAC00912E34 /* FilterShowcase */, + BCF8676C17263EAC00912E34 /* Frameworks */, + BCF8676B17263EAC00912E34 /* Products */, + ); + sourceTree = ""; + }; + BCF8676B17263EAC00912E34 /* Products */ = { + isa = PBXGroup; + children = ( + BCF8676A17263EAC00912E34 /* FilterShowcase.app */, + ); + name = Products; + sourceTree = ""; + }; + BCF8676C17263EAC00912E34 /* Frameworks */ = { + isa = PBXGroup; + children = ( + BCF8678A17263F3400912E34 /* GPUImageMac.xcodeproj */, + BCF8676D17263EAC00912E34 /* Cocoa.framework */, + BCF8676F17263EAC00912E34 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + BCF8676F17263EAC00912E34 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + BCF8677017263EAC00912E34 /* AppKit.framework */, + BCF8677117263EAC00912E34 /* CoreData.framework */, + BCF8677217263EAC00912E34 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + BCF8677317263EAC00912E34 /* FilterShowcase */ = { + isa = PBXGroup; + children = ( + BCF8677F17263EAC00912E34 /* SLSAppDelegate.h */, + BCF8678017263EAD00912E34 /* SLSAppDelegate.m */, + BCF8678217263EAD00912E34 /* MainMenu.xib */, + BCF8679317263FCF00912E34 /* SLSFilterShowcaseWindowController.h */, + BCF8679417263FCF00912E34 /* SLSFilterShowcaseWindowController.m */, + BCF8679517263FCF00912E34 /* SLSFilterShowcaseWindowController.xib */, + BCF8677417263EAC00912E34 /* Supporting Files */, + ); + path = FilterShowcase; + sourceTree = ""; + }; + BCF8677417263EAC00912E34 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BCF8677517263EAC00912E34 /* FilterShowcase-Info.plist */, + BCF8677617263EAC00912E34 /* InfoPlist.strings */, + BCF8677917263EAC00912E34 /* main.m */, + BCF8677B17263EAC00912E34 /* FilterShowcase-Prefix.pch */, + BCF8677C17263EAC00912E34 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BCF8678B17263F3400912E34 /* Products */ = { + isa = PBXGroup; + children = ( + BCF8678F17263F3500912E34 /* GPUImage.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BCF8676917263EAC00912E34 /* FilterShowcase */ = { + isa = PBXNativeTarget; + buildConfigurationList = BCF8678717263EAD00912E34 /* Build configuration list for PBXNativeTarget "FilterShowcase" */; + buildPhases = ( + BCF8676617263EAC00912E34 /* Sources */, + BCF8676717263EAC00912E34 /* Frameworks */, + BCF8676817263EAC00912E34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BCF867991726410300912E34 /* PBXTargetDependency */, + ); + name = FilterShowcase; + productName = FilterShowcase; + productReference = BCF8676A17263EAC00912E34 /* FilterShowcase.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BCF8676217263EAC00912E34 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = SLS; + LastUpgradeCheck = 0460; + ORGANIZATIONNAME = "Sunset Lake Software LLC"; + }; + buildConfigurationList = BCF8676517263EAC00912E34 /* Build configuration list for PBXProject "FilterShowcase" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = BCF8676117263EAC00912E34; + productRefGroup = BCF8676B17263EAC00912E34 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BCF8678B17263F3400912E34 /* Products */; + ProjectRef = BCF8678A17263F3400912E34 /* GPUImageMac.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + BCF8676917263EAC00912E34 /* FilterShowcase */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + BCF8678F17263F3500912E34 /* GPUImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = GPUImage.framework; + remoteRef = BCF8678E17263F3500912E34 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + BCF8676817263EAC00912E34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF8677817263EAC00912E34 /* InfoPlist.strings in Resources */, + BCF8677E17263EAC00912E34 /* Credits.rtf in Resources */, + BCF8678417263EAD00912E34 /* MainMenu.xib in Resources */, + BCF8679717263FCF00912E34 /* SLSFilterShowcaseWindowController.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BCF8676617263EAC00912E34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF8677A17263EAC00912E34 /* main.m in Sources */, + BCF8678117263EAD00912E34 /* SLSAppDelegate.m in Sources */, + BCF8679617263FCF00912E34 /* SLSFilterShowcaseWindowController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BCF867991726410300912E34 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GPUImage; + targetProxy = BCF867981726410300912E34 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + BCF8677617263EAC00912E34 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + BCF8677717263EAC00912E34 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + BCF8677C17263EAC00912E34 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + BCF8677D17263EAC00912E34 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + BCF8678217263EAD00912E34 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + BCF8678317263EAD00912E34 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BCF8678517263EAD00912E34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + BCF8678617263EAD00912E34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + SDKROOT = macosx; + }; + name = Release; + }; + BCF8678817263EAD00912E34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "FilterShowcase/FilterShowcase-Prefix.pch"; + INFOPLIST_FILE = "FilterShowcase/FilterShowcase-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + BCF8678917263EAD00912E34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "FilterShowcase/FilterShowcase-Prefix.pch"; + INFOPLIST_FILE = "FilterShowcase/FilterShowcase-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BCF8676517263EAC00912E34 /* Build configuration list for PBXProject "FilterShowcase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCF8678517263EAD00912E34 /* Debug */, + BCF8678617263EAD00912E34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BCF8678717263EAD00912E34 /* Build configuration list for PBXNativeTarget "FilterShowcase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCF8678817263EAD00912E34 /* Debug */, + BCF8678917263EAD00912E34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BCF8676217263EAC00912E34 /* Project object */; +} diff --git a/examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist b/examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist new file mode 100644 index 000000000..2dc5329d4 --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2013 Sunset Lake Software LLC. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch b/examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch new file mode 100644 index 000000000..c34391f9d --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'FilterShowcase' target in the 'FilterShowcase' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.h b/examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.h new file mode 100644 index 000000000..a626fa96d --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.h @@ -0,0 +1,9 @@ +#import +#import "SLSFilterShowcaseWindowController.h" + +@interface SLSAppDelegate : NSObject +{ + SLSFilterShowcaseWindowController *windowController; +} + +@end diff --git a/examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.m b/examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.m new file mode 100644 index 000000000..b10d60e46 --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.m @@ -0,0 +1,13 @@ +#import "SLSAppDelegate.h" + +@implementation SLSAppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + // Insert code here to initialize your application + + windowController = [[SLSFilterShowcaseWindowController alloc] initWithWindowNibName:@"SLSFilterShowcaseWindowController"]; + [windowController showWindow:self]; +} + +@end diff --git a/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/Credits.rtf b/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/Credits.rtf new file mode 100644 index 000000000..46576ef21 --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings b/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/MainMenu.xib b/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/MainMenu.xib new file mode 100644 index 000000000..3b0dc9acb --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/MainMenu.xib @@ -0,0 +1,3139 @@ + + + + 1080 + 12D78 + 3084 + 1187.37 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + NSCustomObject + NSMenu + NSMenuItem + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + FilterShowcase + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + FilterShowcase + + + + About FilterShowcase + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide FilterShowcase + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit FilterShowcase + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + + + Font + + 2147483647 + + + submenuAction: + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligatures + + 2147483647 + + + submenuAction: + + Ligatures + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + FilterShowcase Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + SLSAppDelegate + + + NSFontManager + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + performFindPanelAction: + + + + 535 + + + + addFontTrait: + + + + 421 + + + + addFontTrait: + + + + 422 + + + + modifyFont: + + + + 423 + + + + orderFrontFontPanel: + + + + 424 + + + + modifyFont: + + + + 425 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 375 + + + + + + + + 376 + + + + + + + + + 377 + + + + + + + + 388 + + + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 420 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 496 + + + + + + + + 497 + + + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + 534 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 535 + + + + + SLSAppDelegate + NSObject + + IBProjectSource + ./Classes/SLSAppDelegate.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/examples/Mac/FilterShowcase/FilterShowcase/main.m b/examples/Mac/FilterShowcase/FilterShowcase/main.m new file mode 100644 index 000000000..04d99dab9 --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase/main.m @@ -0,0 +1,6 @@ +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h new file mode 100644 index 000000000..db55d7ce8 --- /dev/null +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -0,0 +1,22 @@ +#import +#import + +typedef enum { + GPUIMAGE_BRIGHTNESS, + GPUIMAGE_NUMFILTERS +} GPUImageShowcaseFilterType; + +@interface SLSFilterShowcaseWindowController : NSWindowController +{ + GPUImageOutput *currentlySelectedFilter; + GPUImageAVCamera *inputCamera; + NSUInteger currentlySelectedRow; +} + +@property(readwrite) IBOutlet GPUImageView *glView; +@property(readwrite) BOOL enableSlider; +@property(readwrite, nonatomic) CGFloat minimumSliderValue, maximumSliderValue, currentSliderValue; + +- (void)changeSelectedRow:(NSUInteger)newRowIndex; + +@end diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m new file mode 100644 index 000000000..a7e507eb5 --- /dev/null +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -0,0 +1,114 @@ +#import "SLSFilterShowcaseWindowController.h" + +@interface SLSFilterShowcaseWindowController () + +@end + +@implementation SLSFilterShowcaseWindowController + +@synthesize glView = _glView; +@synthesize enableSlider = _enableSlider; +@synthesize minimumSliderValue = _minimumSliderValue, maximumSliderValue = _maximumSliderValue, currentSliderValue = _currentSliderValue; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithWindow:(NSWindow *)window +{ + self = [super initWithWindow:window]; + if (self) { + // Initialization code here. + } + + return self; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + + inputCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionUnspecified]; + + currentlySelectedRow = 1; + [self changeSelectedRow:0]; + + [inputCamera startCameraCapture]; +} + +#pragma mark - +#pragma mark Filter switching + +- (void)changeSelectedRow:(NSUInteger)newRowIndex; +{ + if (newRowIndex == currentlySelectedRow) + { + return; + } + + currentlySelectedRow = newRowIndex; + + if (currentlySelectedFilter != nil) + { + [inputCamera removeAllTargets]; + // Disconnect older filter before replacing with new one + [currentlySelectedFilter removeAllTargets]; + currentlySelectedFilter = nil; + } + + switch(currentlySelectedRow) + { + case GPUIMAGE_BRIGHTNESS: + { + currentlySelectedFilter = [[GPUImageBrightnessFilter alloc] init]; + + self.minimumSliderValue = -1.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.0; + self.enableSlider = YES; + }; break; + } + + [inputCamera addTarget:currentlySelectedFilter]; + [currentlySelectedFilter addTarget:self.glView]; +} + +#pragma mark - +#pragma mark Filter settings + +- (void)setCurrentSliderValue:(CGFloat)newValue; +{ + _currentSliderValue = newValue; + switch(currentlySelectedRow) + { + case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)currentlySelectedFilter setBrightness:_currentSliderValue]; break; + } +} + +#pragma mark - +#pragma mark NSTableView delegate methods + +- (int)numberOfRowsInTableView:(NSTableView *)aTableView +{ + return GPUIMAGE_NUMFILTERS; +} + +- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex +{ + NSString *tableRowTitle = nil; + + switch(rowIndex) + { + case GPUIMAGE_BRIGHTNESS: tableRowTitle = @"Brightness"; break; + } + + return tableRowTitle; +} + +- (void)tableViewSelectionDidChange:(NSNotification *)aNotification; +{ + NSInteger rowIndex = [[aNotification object] selectedRow]; + + [self changeSelectedRow:rowIndex]; +} + +@end diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib new file mode 100644 index 000000000..3fba0bc36 --- /dev/null +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib @@ -0,0 +1,851 @@ + + + + 1080 + 12D78 + 3084 + 1187.37 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + IBNSLayoutConstraint + NSCustomObject + NSOpenGLView + NSScrollView + NSScroller + NSSlider + NSSliderCell + NSTableColumn + NSTableHeaderView + NSTableView + NSTextFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + SLSFilterShowcaseWindowController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 240}, {854, 553}} + 544735232 + Filter Showcase + NSWindow + + + + + 256 + + + + 268 + + + + 2304 + + + + 256 + {164, 495} + + + + _NS:13 + YES + NO + YES + + + 256 + {164, 17} + + + + _NS:16 + + + + + -2147483392 + {{224, 0}, {16, 17}} + + _NS:19 + + + + 159.62109375 + 40 + 1000 + + 75497536 + 2048 + Filter + + LucidaGrande + 11 + 3100 + + + 3 + MC4zMzMzMzI5ODU2AA + + + 6 + System + headerTextColor + + 3 + MAA + + + + + 337641536 + 2048 + Text Cell + + LucidaGrande + 11 + 16 + + + + 6 + System + controlBackgroundColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + + + 3 + YES + + + + 3 + 2 + + 3 + MQA + + + 6 + System + gridColor + + 3 + MC41AA + + + 17 + 44040192 + + + 0 + 15 + 0 + YES + 0 + 1 + + + {{1, 17}, {164, 495}} + + + + _NS:11 + + + 4 + + + + -2147483392 + {{224, 17}, {15, 102}} + + + + _NS:58 + NO + + _doScroller: + 37 + 0.1947367936372757 + + + + -2147483392 + {{1, 490}, {162, 16}} + + + + _NS:60 + NO + 1 + + _doScroller: + 1 + 0.9939393939393939 + + + + 2304 + + + + {{1, 0}, {164, 17}} + + + + _NS:15 + + + 4 + + + {{20, 20}, {166, 513}} + + + + _NS:9 + 133682 + + + + + QSAAAEEgAABBmAAAQZgAAA + 0.25 + 4 + 1 + + + + 268 + {{194, 53}, {640, 480}} + + + + _NS:24 + + + AAAAYAAAAAA + + + + + + 268 + {{192, 18}, {644, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 100 + 0.0 + 50 + 0.0 + 0 + 1 + NO + NO + + NO + + + {854, 553} + + + + + {{0, 0}, {1440, 878}} + {10000000000000, 10000000000000} + NO + + + + + + + window + + + + 3 + + + + glView + + + + 54 + + + + delegate + + + + 4 + + + + delegate + + + + 63 + + + + dataSource + + + + 64 + + + + maxValue: maximumSliderValue + + + + + + maxValue: maximumSliderValue + maxValue + maximumSliderValue + 2 + + + 59 + + + + minValue: minimumSliderValue + + + + + + minValue: minimumSliderValue + minValue + minimumSliderValue + + 2 + + + 60 + + + + value: currentSliderValue + + + + + + value: currentSliderValue + value + currentSliderValue + + 2 + + + 62 + + + + enabled: enableSlider + + + + + + enabled: enableSlider + enabled + enableSlider + 2 + + + 68 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + + + + + + 2 + + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 53 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + 5 + + + + + + + + + + + 6 + + + + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + + + + 13 + + + + + 18 + + + + + 20 + + + + + 22 + + + + + 24 + + + + + 29 + + + + + 33 + + + + + 35 + + + + + 39 + + + + + + 7 + 0 + + 0 + 1 + + 640 + + 1000 + + 3 + 9 + 1 + + + + + + 40 + + + + + 48 + + + + + 49 + + + + + 50 + + + + + 51 + + + + + 53 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{357, 418}, {480, 270}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + GPUImageView + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 68 + + + + + GPUImageView + NSOpenGLView + + IBProjectSource + ./Classes/GPUImageView.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + SLSFilterShowcaseWindowController + NSWindowController + + glView + GPUImageView + + + glView + + glView + GPUImageView + + + + IBProjectSource + ./Classes/SLSFilterShowcaseWindowController.h + + + + + 0 + IBCocoaFramework + YES + 3 + YES + + diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index 9f5dcfd06..31d5a4fe7 100644 --- a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -118,10 +118,10 @@ BCA3F3461723A2E800E28AEC /* SimplePhotoFilter */ = { isa = PBXGroup; children = ( + BCA3F3581723A2E800E28AEC /* MainMenu.xib */, BCA3F3521723A2E800E28AEC /* SLSDocument.h */, BCA3F3531723A2E800E28AEC /* SLSDocument.m */, BCA3F3551723A2E800E28AEC /* SLSDocument.xib */, - BCA3F3581723A2E800E28AEC /* MainMenu.xib */, BCA3F3471723A2E800E28AEC /* Supporting Files */, ); path = SimplePhotoFilter; diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib index 354f8d86a..1e5ce4911 100644 --- a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib @@ -71,7 +71,7 @@ _NS:9 YES - -2080374784 + -2080112384 0 _NS:9 @@ -402,52 +402,6 @@ ./Classes/GPUImageView.h
- - NSDocument - - id - id - id - id - id - id - id - - - - browseDocumentVersions: - id - - - duplicateDocument: - id - - - moveDocument: - id - - - renameDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - - IBProjectSource - ./Classes/NSDocument.h - - NSLayoutConstraint NSObject diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index f7d7b39af..79dfc0e43 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -29,6 +29,8 @@ BCF867591725AF9300912E34 /* GPUImagePicture.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867551725AF9300912E34 /* GPUImagePicture.m */; }; BCF8675B1725BBE300912E34 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8675A1725BBE300912E34 /* AVFoundation.framework */; }; BCF8675D1725BBE900912E34 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8675C1725BBE900912E34 /* CoreMedia.framework */; }; + BCF8679D1727585D00912E34 /* GPUImageAVCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8679B1727585D00912E34 /* GPUImageAVCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8679E1727585D00912E34 /* GPUImageAVCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8679C1727585D00912E34 /* GPUImageAVCamera.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -60,6 +62,8 @@ BCF867551725AF9300912E34 /* GPUImagePicture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePicture.m; path = Source/Mac/GPUImagePicture.m; sourceTree = SOURCE_ROOT; }; BCF8675A1725BBE300912E34 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCF8675C1725BBE900912E34 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + BCF8679B1727585D00912E34 /* GPUImageAVCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAVCamera.h; path = Source/Mac/GPUImageAVCamera.h; sourceTree = SOURCE_ROOT; }; + BCF8679C1727585D00912E34 /* GPUImageAVCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAVCamera.m; path = Source/Mac/GPUImageAVCamera.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -148,6 +152,8 @@ children = ( BCF40F191724829B005AE36A /* GPUImageOutput.h */, BCF40F1A1724829B005AE36A /* GPUImageOutput.m */, + BCF8679B1727585D00912E34 /* GPUImageAVCamera.h */, + BCF8679C1727585D00912E34 /* GPUImageAVCamera.m */, BCF867541725AF9300912E34 /* GPUImagePicture.h */, BCF867551725AF9300912E34 /* GPUImagePicture.m */, ); @@ -192,6 +198,7 @@ BCF40F29172488D3005AE36A /* GPUImageBrightnessFilter.h in Headers */, BCF867561725AF9300912E34 /* GPUImageMovieWriter.h in Headers */, BCF867581725AF9300912E34 /* GPUImagePicture.h in Headers */, + BCF8679D1727585D00912E34 /* GPUImageAVCamera.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -265,6 +272,7 @@ BCF40F2A172488D3005AE36A /* GPUImageBrightnessFilter.m in Sources */, BCF867571725AF9300912E34 /* GPUImageMovieWriter.m in Sources */, BCF867591725AF9300912E34 /* GPUImagePicture.m in Sources */, + BCF8679E1727585D00912E34 /* GPUImageAVCamera.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index b742c5839..47f0ccb22 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -58,7 +58,7 @@ void reportAvailableMemoryForGPUImage(NSString *tag) &size); if( kerr == KERN_SUCCESS ) { - NSLog(@"%@ - Memory used: %u", tag, info.resident_size); //in bytes + NSLog(@"%@ - Memory used: %lu", tag, info.resident_size); //in bytes } else { NSLog(@"%@ - Error: %s", tag, mach_error_string(kerr)); } diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index f160f5b92..08921f76c 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -6,6 +6,7 @@ // Sources #import +#import #import // Filters diff --git a/framework/Source/Mac/GPUImageAVCamera.h b/framework/Source/Mac/GPUImageAVCamera.h new file mode 100755 index 000000000..bb3836e18 --- /dev/null +++ b/framework/Source/Mac/GPUImageAVCamera.h @@ -0,0 +1,126 @@ +#import +#import +#import +#import "GPUImageContext.h" +#import "GPUImageOutput.h" + +//Delegate Protocal for Face Detection. +@protocol GPUImageVideoCameraDelegate + +@optional +- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer; +@end + + +/** + A GPUImageOutput that provides frames from either camera +*/ +@interface GPUImageAVCamera : GPUImageOutput +{ + NSUInteger numberOfFramesCaptured; + CGFloat totalFrameTimeDuringCapture; + + AVCaptureSession *_captureSession; + AVCaptureDevice *_inputCamera; + AVCaptureDevice *_microphone; + AVCaptureDeviceInput *videoInput; + AVCaptureVideoDataOutput *videoOutput; + + BOOL capturePaused; + GPUImageRotationMode outputRotation; + dispatch_semaphore_t frameRenderingSemaphore; + + BOOL captureAsYUV; + GLuint luminanceTexture, chrominanceTexture; + + __unsafe_unretained id _delegate; +} + +/// The AVCaptureSession used to capture from the camera +@property(readonly, retain, nonatomic) AVCaptureSession *captureSession; + +/// This enables the capture session preset to be changed on the fly +@property (readwrite, nonatomic, copy) NSString *captureSessionPreset; + +/// This sets the frame rate of the camera (iOS 5 and above only) +/** + Setting this to 0 or below will set the frame rate back to the default setting for a particular preset. + */ +@property (readwrite) NSInteger frameRate; + +/// Easy way to tell if front-facing camera is present on device +@property (readonly, getter = isFrontFacingCameraPresent) BOOL frontFacingCameraPresent; + +/// This enables the benchmarking mode, which logs out instantaneous and average frame times to the console +@property(readwrite, nonatomic) BOOL runBenchmark; + +/// Use this property to manage camera settings. Focus point, exposure point, etc. +@property(readonly) AVCaptureDevice *inputCamera; + +/// These properties determine whether or not the two camera orientations should be mirrored. By default, both are NO. +@property(readwrite, nonatomic) BOOL horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera; + +@property(nonatomic, assign) id delegate; + +/// @name Initialization and teardown + +/** Begin a capture session + + See AVCaptureSession for acceptable values + + @param sessionPreset Session preset to use + @param cameraPosition Camera to capture from + */ +- (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; + +/** Tear down the capture session + */ +- (void)removeInputsAndOutputs; + +/// @name Manage the camera video stream + +/** Start camera capturing + */ +- (void)startCameraCapture; + +/** Stop camera capturing + */ +- (void)stopCameraCapture; + +/** Pause camera capturing + */ +- (void)pauseCameraCapture; + +/** Resume camera capturing + */ +- (void)resumeCameraCapture; + +/** Process a video sample + @param sampleBuffer Buffer to process + */ +- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; + +/** Process an audio sample + @param sampleBuffer Buffer to process + */ +- (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; + +/** Get the position (front, rear) of the source camera + */ +- (AVCaptureDevicePosition)cameraPosition; + +/** Get the AVCaptureConnection of the source camera + */ +- (AVCaptureConnection *)videoCaptureConnection; + +/** This flips between the front and rear cameras + */ +- (void)rotateCamera; + +/// @name Benchmarking + +/** When benchmarking is enabled, this will keep a running average of the time from uploading, processing, and final recording or display + */ +- (CGFloat)averageFrameDurationDuringCapture; + +@end diff --git a/framework/Source/Mac/GPUImageAVCamera.m b/framework/Source/Mac/GPUImageAVCamera.m new file mode 100644 index 000000000..3a1bcf911 --- /dev/null +++ b/framework/Source/Mac/GPUImageAVCamera.m @@ -0,0 +1,775 @@ +#import "GPUImageAVCamera.h" +#import "GPUImageMovieWriter.h" +#import "GPUImageFilter.h" + +NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D luminanceTexture; + uniform sampler2D chrominanceTexture; + + void main() + { + vec3 yuv; + vec3 rgb; + + yuv.x = texture2D(luminanceTexture, textureCoordinate).r; + yuv.yz = texture2D(chrominanceTexture, textureCoordinate).rg - vec2(0.5, 0.5); + + // BT.601, which is the standard for SDTV is provided as a reference + /* + rgb = mat3( 1, 1, 1, + 0, -.39465, 2.03211, + 1.13983, -.58060, 0) * yuv; + */ + + // Using BT.709 which is the standard for HDTV + rgb = mat3( 1, 1, 1, + 0, -.21482, 2.12798, + 1.28033, -.38059, 0) * yuv; + + gl_FragColor = vec4(rgb, 1); + } +); + +NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D luminanceTexture; + uniform sampler2D chrominanceTexture; + + void main() + { + vec3 yuv; + vec3 rgb; + + yuv.x = texture2D(luminanceTexture, textureCoordinate).r; + yuv.yz = texture2D(chrominanceTexture, textureCoordinate).ra - vec2(0.5, 0.5); + + // BT.601, which is the standard for SDTV is provided as a reference + /* + rgb = mat3( 1, 1, 1, + 0, -.39465, 2.03211, + 1.13983, -.58060, 0) * yuv; + */ + + // Using BT.709 which is the standard for HDTV + rgb = mat3( 1, 1, 1, + 0, -.21482, 2.12798, + 1.28033, -.38059, 0) * yuv; + + gl_FragColor = vec4(rgb, 1); + } + ); + + +#pragma mark - +#pragma mark Private methods and instance variables + +@interface GPUImageAVCamera () +{ + AVCaptureDeviceInput *audioInput; + AVCaptureAudioDataOutput *audioOutput; + NSDate *startingCaptureTime; + + NSInteger _frameRate; + + dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; + + GLProgram *yuvConversionProgram; + GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; + GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; + GLuint yuvConversionFramebuffer; + + int imageBufferWidth, imageBufferHeight; +} + +- (void)updateOrientationSendToTargets; +- (void)convertYUVToRGBOutput; +- (void)setYUVConversionFBO; + +@end + +@implementation GPUImageAVCamera + +@synthesize captureSessionPreset = _captureSessionPreset; +@synthesize captureSession = _captureSession; +@synthesize inputCamera = _inputCamera; +@synthesize runBenchmark = _runBenchmark; +@synthesize delegate = _delegate; +@synthesize horizontallyMirrorFrontFacingCamera = _horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera = _horizontallyMirrorRearFacingCamera; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [self initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack])) + { + return nil; + } + + return self; +} + +- (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; +{ + if (!(self = [super init])) + { + return nil; + } + + cameraProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.cameraProcessingQueue", NULL); + audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); + frameRenderingSemaphore = dispatch_semaphore_create(1); + + _frameRate = 0; // This will not set frame rate unless this value gets set to 1 or above + _runBenchmark = NO; + capturePaused = NO; + outputRotation = kGPUImageNoRotation; + captureAsYUV = YES; + + runSynchronouslyOnVideoProcessingQueue(^{ + + if (captureAsYUV) + { + [GPUImageContext useImageProcessingContext]; +// if ([GPUImageContext deviceSupportsRedTextures]) +// { +// yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; +// } +// else +// { + yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; +// } + + if (!yuvConversionProgram.initialized) + { + [yuvConversionProgram addAttribute:@"position"]; + [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; + + if (![yuvConversionProgram link]) + { + NSString *progLog = [yuvConversionProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [yuvConversionProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + yuvConversionProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; + yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; + yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; + yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; + + [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; + + glEnableVertexAttribArray(yuvConversionPositionAttribute); + glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); + } + + [self initializeOutputTextureIfNeeded]; + }); + + // Grab the back-facing or front-facing camera + _inputCamera = nil; + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + for (AVCaptureDevice *device in devices) + { + if ([device position] == cameraPosition) + { + _inputCamera = device; + } + } + + if (!_inputCamera) { + return nil; + } + + // Create the capture session + _captureSession = [[AVCaptureSession alloc] init]; + + [_captureSession beginConfiguration]; + + // Add the video input + NSError *error = nil; + videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:_inputCamera error:&error]; + if ([_captureSession canAddInput:videoInput]) + { + [_captureSession addInput:videoInput]; + } + + // Add the video frame output + videoOutput = [[AVCaptureVideoDataOutput alloc] init]; + [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; + +// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) + { + BOOL supportsFullYUVRange = NO; + NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; + for (NSNumber *currentPixelFormat in supportedPixelFormats) + { + if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + { + supportsFullYUVRange = YES; + } + } + + if (supportsFullYUVRange) + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + else + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + } + else + { + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + } + + [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; +// [videoOutput setSampleBufferDelegate:self queue:[GPUImageContext sharedContextQueue]]; + if ([_captureSession canAddOutput:videoOutput]) + { + [_captureSession addOutput:videoOutput]; + } + else + { + NSLog(@"Couldn't add video output"); + return nil; + } + + _captureSessionPreset = sessionPreset; + [_captureSession setSessionPreset:_captureSessionPreset]; + +// This will let you get 60 FPS video from the 720p preset on an iPhone 4S, but only that device and that preset +// AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; +// +// if (conn.supportsVideoMinFrameDuration) +// conn.videoMinFrameDuration = CMTimeMake(1,60); +// if (conn.supportsVideoMaxFrameDuration) +// conn.videoMaxFrameDuration = CMTimeMake(1,60); + + [_captureSession commitConfiguration]; + + return self; +} + +- (void)dealloc +{ + [self stopCameraCapture]; + [videoOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; + [audioOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; + + [self removeInputsAndOutputs]; + +// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) + if (cameraProcessingQueue != NULL) + { + dispatch_release(cameraProcessingQueue); + } + + if (audioProcessingQueue != NULL) + { + dispatch_release(audioProcessingQueue); + } + + if (frameRenderingSemaphore != NULL) + { + dispatch_release(frameRenderingSemaphore); + } +#endif + +// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) + { + [self destroyYUVConversionFBO]; + } +} + +- (void)removeInputsAndOutputs; +{ + [_captureSession removeInput:videoInput]; + [_captureSession removeOutput:videoOutput]; + if (_microphone != nil) + { + [_captureSession removeInput:audioInput]; + [_captureSession removeOutput:audioOutput]; + } +} + +#pragma mark - +#pragma mark Managing targets + +- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; +{ + [super addTarget:newTarget atTextureLocation:textureLocation]; + + [newTarget setInputRotation:outputRotation atIndex:textureLocation]; +} + +#pragma mark - +#pragma mark Manage the camera video stream + +- (void)startCameraCapture; +{ + if (![_captureSession isRunning]) + { + startingCaptureTime = [NSDate date]; + [_captureSession startRunning]; + }; +} + +- (void)stopCameraCapture; +{ + if ([_captureSession isRunning]) + { + [_captureSession stopRunning]; + } +} + +- (void)pauseCameraCapture; +{ + capturePaused = YES; +} + +- (void)resumeCameraCapture; +{ + capturePaused = NO; +} + +- (void)rotateCamera +{ + if (self.frontFacingCameraPresent == NO) + return; + + NSError *error; + AVCaptureDeviceInput *newVideoInput; + AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; + + if (currentCameraPosition == AVCaptureDevicePositionBack) + { + currentCameraPosition = AVCaptureDevicePositionFront; + } + else + { + currentCameraPosition = AVCaptureDevicePositionBack; + } + + AVCaptureDevice *backFacingCamera = nil; + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + for (AVCaptureDevice *device in devices) + { + if ([device position] == currentCameraPosition) + { + backFacingCamera = device; + } + } + newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error]; + + if (newVideoInput != nil) + { + [_captureSession beginConfiguration]; + + [_captureSession removeInput:videoInput]; + if ([_captureSession canAddInput:newVideoInput]) + { + [_captureSession addInput:newVideoInput]; + videoInput = newVideoInput; + } + else + { + [_captureSession addInput:videoInput]; + } + //captureSession.sessionPreset = oriPreset; + [_captureSession commitConfiguration]; + } + + _inputCamera = backFacingCamera; +} + +- (AVCaptureDevicePosition)cameraPosition +{ + return [[videoInput device] position]; +} + +- (BOOL)isFrontFacingCameraPresent; +{ + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + + for (AVCaptureDevice *device in devices) + { + if ([device position] == AVCaptureDevicePositionFront) + return YES; + } + + return NO; +} + +- (void)setCaptureSessionPreset:(NSString *)captureSessionPreset; +{ + [_captureSession beginConfiguration]; + + _captureSessionPreset = captureSessionPreset; + [_captureSession setSessionPreset:_captureSessionPreset]; + + [_captureSession commitConfiguration]; +} + +- (void)setFrameRate:(NSInteger)frameRate; +{ + _frameRate = frameRate; + + if (_frameRate > 0) + { + for (AVCaptureConnection *connection in videoOutput.connections) + { + if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) + connection.videoMinFrameDuration = CMTimeMake(1, _frameRate); + + } + } + else + { + for (AVCaptureConnection *connection in videoOutput.connections) + { + if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) + connection.videoMinFrameDuration = kCMTimeInvalid; // This sets videoMinFrameDuration back to default + } + } +} + +- (NSInteger)frameRate; +{ + return _frameRate; +} + +- (AVCaptureConnection *)videoCaptureConnection { + for (AVCaptureConnection *connection in [videoOutput connections] ) { + for ( AVCaptureInputPort *port in [connection inputPorts] ) { + if ( [[port mediaType] isEqual:AVMediaTypeVideo] ) { + return connection; + } + } + } + + return nil; +} + +#define INITIALFRAMESTOIGNOREFORBENCHMARK 5 + +- (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth height:(int)bufferHeight time:(CMTime)currentTime; +{ + for (id currentTarget in targets) + { + if ([currentTarget enabled]) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; + + if ([currentTarget wantsMonochromeInput] && captureAsYUV) + { + [currentTarget setCurrentlyReceivingMonochromeInput:YES]; + [currentTarget setInputTexture:luminanceTexture atIndex:textureIndexOfTarget]; + } + else + { + [currentTarget setCurrentlyReceivingMonochromeInput:NO]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + } + + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; + } + else + { + [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; + [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + } + } + } +} + +- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; +{ + if (capturePaused) + { + return; + } + + CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer); + GLsizei bufferWidth = (GLsizei)CVPixelBufferGetWidth(cameraFrame); + GLsizei bufferHeight = (GLsizei)CVPixelBufferGetHeight(cameraFrame); + + CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); + + [GPUImageContext useImageProcessingContext]; + + CVPixelBufferLockBaseAddress(cameraFrame, 0); + + glBindTexture(GL_TEXTURE_2D, outputTexture); + + // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); + + // Using BGRA extension to pull in video frame data directly + // The use of bytesPerRow / 4 accounts for a display glitch present in preview video frames when using the photo preset on the camera + GLsizei bytesPerRow = (GLsizei)CVPixelBufferGetBytesPerRow(cameraFrame); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); + + for (id currentTarget in targets) + { + if ([currentTarget enabled]) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; + } + } + } + + CVPixelBufferUnlockBaseAddress(cameraFrame, 0); + + if (_runBenchmark) + { + numberOfFramesCaptured++; + if (numberOfFramesCaptured > INITIALFRAMESTOIGNOREFORBENCHMARK) + { + CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); + totalFrameTimeDuringCapture += currentFrameTime; + } + } +} + +- (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; +{ + [self.audioEncodingTarget processAudioBuffer:sampleBuffer]; +} + +- (void)convertYUVToRGBOutput; +{ + [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; + [self setYUVConversionFBO]; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + static const GLfloat squareVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat textureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, luminanceTexture); + glUniform1i(yuvConversionLuminanceTextureUniform, 4); + + glActiveTexture(GL_TEXTURE5); + glBindTexture(GL_TEXTURE_2D, chrominanceTexture); + glUniform1i(yuvConversionChrominanceTextureUniform, 5); + + glVertexAttribPointer(yuvConversionPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); + glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +- (void)setYUVConversionFBO; +{ + if (!yuvConversionFramebuffer) + { + [self createYUVConversionFBO]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); + + glViewport(0, 0, imageBufferWidth, imageBufferHeight); +} + +- (void)createYUVConversionFBO; +{ + [self initializeOutputTextureIfNeeded]; + + glActiveTexture(GL_TEXTURE1); + glGenFramebuffers(1, &yuvConversionFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); + + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageBufferWidth, imageBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + [self notifyTargetsAboutNewOutputTexture]; + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + glBindTexture(GL_TEXTURE_2D, 0); + +} + +- (void)destroyYUVConversionFBO; +{ + if (yuvConversionFramebuffer) + { + glDeleteFramebuffers(1, &yuvConversionFramebuffer); + yuvConversionFramebuffer = 0; + } + + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } +} + + +#pragma mark - +#pragma mark Benchmarking + +- (CGFloat)averageFrameDurationDuringCapture; +{ + return (totalFrameTimeDuringCapture / (CGFloat)(numberOfFramesCaptured - INITIALFRAMESTOIGNOREFORBENCHMARK)) * 1000.0; +} + +#pragma mark - +#pragma mark AVCaptureVideoDataOutputSampleBufferDelegate + +- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection +{ + if (captureOutput == audioOutput) + { +// if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) +// { +// return; +// } + + CFRetain(sampleBuffer); + runAsynchronouslyOnVideoProcessingQueue(^{ + [self processAudioSampleBuffer:sampleBuffer]; + CFRelease(sampleBuffer); +// dispatch_semaphore_signal(frameRenderingSemaphore); + }); + } + else + { + if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) + { + return; + } + + CFRetain(sampleBuffer); + runAsynchronouslyOnVideoProcessingQueue(^{ + //Feature Detection Hook. + if (self.delegate) + { + [self.delegate willOutputSampleBuffer:sampleBuffer]; + } + + [self processVideoSampleBuffer:sampleBuffer]; + + CFRelease(sampleBuffer); + dispatch_semaphore_signal(frameRenderingSemaphore); + }); + } +} + +#pragma mark - +#pragma mark Accessors + +- (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [_captureSession beginConfiguration]; + + if (newValue == nil) + { + if (audioOutput) + { + [_captureSession removeInput:audioInput]; + [_captureSession removeOutput:audioOutput]; + audioInput = nil; + audioOutput = nil; + _microphone = nil; + } + } + else + { + _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; + audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; + if ([_captureSession canAddInput:audioInput]) + { + [_captureSession addInput:audioInput]; + } + audioOutput = [[AVCaptureAudioDataOutput alloc] init]; + + if ([_captureSession canAddOutput:audioOutput]) + { + [_captureSession addOutput:audioOutput]; + } + else + { + NSLog(@"Couldn't add audio output"); + } + [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; + } + + [_captureSession commitConfiguration]; + + [super setAudioEncodingTarget:newValue]; + }); +} + +- (void)updateOrientationSendToTargets; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + + // From the iOS 5.0 release notes: + // In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight. + + outputRotation = kGPUImageNoRotation; + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + } + }); +} + +- (void)setHorizontallyMirrorFrontFacingCamera:(BOOL)newValue +{ + _horizontallyMirrorFrontFacingCamera = newValue; + [self updateOrientationSendToTargets]; +} + +- (void)setHorizontallyMirrorRearFacingCamera:(BOOL)newValue +{ + _horizontallyMirrorRearFacingCamera = newValue; + [self updateOrientationSendToTargets]; +} + +@end From b4613cac11c9026527ced975a1c50b2a3cbe4a85 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 24 Apr 2013 10:17:48 -0500 Subject: [PATCH 359/695] Ported several filters to the Mac, along with some base classes. Expanded the FilterShowcase Mac example. --- .../SLSFilterShowcaseWindowController.h | 14 ++ .../SLSFilterShowcaseWindowController.m | 139 +++++++++++++++ .../GPUImageMac.xcodeproj/project.pbxproj | 158 +++++++++++++++++- .../Source/GPUImage3x3TextureSamplingFilter.m | 4 +- framework/Source/GPUImageContrastFilter.m | 17 ++ framework/Source/GPUImageExposureFilter.m | 17 ++ framework/Source/GPUImageGrayscaleFilter.m | 20 +++ framework/Source/GPUImageHueFilter.m | 51 +++++- framework/Source/GPUImageKuwaharaFilter.m | 91 ++++++++++ framework/Source/GPUImageLevelsFilter.m | 23 ++- framework/Source/GPUImageMonochromeFilter.m | 33 ++++ framework/Source/GPUImageOutput.m | 2 +- framework/Source/GPUImagePixellateFilter.m | 20 +++ framework/Source/GPUImageRGBFilter.m | 19 +++ framework/Source/GPUImageSaturationFilter.m | 23 +++ framework/Source/GPUImageSketchFilter.m | 37 ++++ .../Source/GPUImageSobelEdgeDetectionFilter.m | 37 ++++ framework/Source/GPUImageToonFilter.m | 49 ++++++ framework/Source/GPUImageTwoPassFilter.m | 5 + framework/Source/GPUImageWhiteBalanceFilter.m | 32 ++++ framework/Source/Mac/GPUImage.h | 16 ++ framework/Source/Mac/GPUImageAVCamera.m | 4 +- 22 files changed, 801 insertions(+), 10 deletions(-) diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index db55d7ce8..28b43fb92 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -2,7 +2,21 @@ #import typedef enum { + GPUIMAGE_SATURATION, + GPUIMAGE_CONTRAST, GPUIMAGE_BRIGHTNESS, + GPUIMAGE_LEVELS, + GPUIMAGE_EXPOSURE, + GPUIMAGE_RGB, + GPUIMAGE_HUE, + GPUIMAGE_WHITEBALANCE, + GPUIMAGE_MONOCHROME, + GPUIMAGE_PIXELLATE, + GPUIMAGE_GRAYSCALE, + GPUIMAGE_SOBELEDGEDETECTION, + GPUIMAGE_SKETCH, + GPUIMAGE_TOON, + GPUIMAGE_KUWAHARA, GPUIMAGE_NUMFILTERS } GPUImageShowcaseFilterType; diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index a7e507eb5..0e88e46a0 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -57,6 +57,24 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; switch(currentlySelectedRow) { + case GPUIMAGE_SATURATION: + { + currentlySelectedFilter = [[GPUImageSaturationFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 2.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_CONTRAST: + { + currentlySelectedFilter = [[GPUImageContrastFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 4.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; case GPUIMAGE_BRIGHTNESS: { currentlySelectedFilter = [[GPUImageBrightnessFilter alloc] init]; @@ -66,6 +84,99 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 0.0; self.enableSlider = YES; }; break; + case GPUIMAGE_LEVELS: + { + currentlySelectedFilter = [[GPUImageLevelsFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_EXPOSURE: + { + currentlySelectedFilter = [[GPUImageExposureFilter alloc] init]; + + self.minimumSliderValue = -4.0; + self.maximumSliderValue = 4.0; + self.currentSliderValue = 0.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_RGB: + { + currentlySelectedFilter = [[GPUImageRGBFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 2.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_HUE: + { + currentlySelectedFilter = [[GPUImageHueFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 360.0; + self.currentSliderValue = 90.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_WHITEBALANCE: + { + currentlySelectedFilter = [[GPUImageWhiteBalanceFilter alloc] init]; + + self.minimumSliderValue = 2500.0; + self.maximumSliderValue = 7500.0; + self.currentSliderValue = 5000.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_MONOCHROME: + { + currentlySelectedFilter = [[GPUImageMonochromeFilter alloc] init]; + [(GPUImageMonochromeFilter *)currentlySelectedFilter setColor:(GPUVector4){0.0f, 0.0f, 1.0f, 1.f}]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_GRAYSCALE: + { + currentlySelectedFilter = [[GPUImageGrayscaleFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_PIXELLATE: + { + currentlySelectedFilter = [[GPUImagePixellateFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 0.3; + self.currentSliderValue = 0.05; + self.enableSlider = YES; + }; break; + case GPUIMAGE_SOBELEDGEDETECTION: + { + currentlySelectedFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_SKETCH: + { + currentlySelectedFilter = [[GPUImageSketchFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_TOON: + { + currentlySelectedFilter = [[GPUImageToonFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_KUWAHARA: + { + currentlySelectedFilter = [[GPUImageKuwaharaFilter alloc] init]; + + self.minimumSliderValue = 3.0; + self.maximumSliderValue = 8.0; + self.currentSliderValue = 3.0; + self.enableSlider = YES; + }; break; } [inputCamera addTarget:currentlySelectedFilter]; @@ -80,7 +191,21 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; _currentSliderValue = newValue; switch(currentlySelectedRow) { + case GPUIMAGE_SATURATION: [(GPUImageSaturationFilter *)currentlySelectedFilter setSaturation:_currentSliderValue]; break; + case GPUIMAGE_CONTRAST: [(GPUImageContrastFilter *)currentlySelectedFilter setContrast:_currentSliderValue]; break; case GPUIMAGE_BRIGHTNESS: [(GPUImageBrightnessFilter *)currentlySelectedFilter setBrightness:_currentSliderValue]; break; + case GPUIMAGE_LEVELS: { + [(GPUImageLevelsFilter *)currentlySelectedFilter setRedMin:_currentSliderValue gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + [(GPUImageLevelsFilter *)currentlySelectedFilter setGreenMin:_currentSliderValue gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + [(GPUImageLevelsFilter *)currentlySelectedFilter setBlueMin:_currentSliderValue gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; + }; break; + case GPUIMAGE_EXPOSURE: [(GPUImageExposureFilter *)currentlySelectedFilter setExposure:_currentSliderValue]; break; + case GPUIMAGE_RGB: [(GPUImageRGBFilter *)currentlySelectedFilter setGreen:_currentSliderValue]; break; + case GPUIMAGE_HUE: [(GPUImageHueFilter *)currentlySelectedFilter setHue:_currentSliderValue]; break; + case GPUIMAGE_WHITEBALANCE: [(GPUImageWhiteBalanceFilter *)currentlySelectedFilter setTemperature:_currentSliderValue]; break; + case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; + case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; + case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; } } @@ -98,7 +223,21 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu switch(rowIndex) { + case GPUIMAGE_SATURATION: tableRowTitle = @"Saturation"; break; + case GPUIMAGE_CONTRAST: tableRowTitle = @"Contrast"; break; case GPUIMAGE_BRIGHTNESS: tableRowTitle = @"Brightness"; break; + case GPUIMAGE_LEVELS: tableRowTitle = @"Levels"; break; + case GPUIMAGE_EXPOSURE: tableRowTitle = @"Exposure"; break; + case GPUIMAGE_RGB: tableRowTitle = @"RGB"; break; + case GPUIMAGE_HUE: tableRowTitle = @"Hue"; break; + case GPUIMAGE_WHITEBALANCE: tableRowTitle = @"White balance"; break; + case GPUIMAGE_MONOCHROME: tableRowTitle = @"Monochrome"; break; + case GPUIMAGE_PIXELLATE: tableRowTitle = @"Pixellate"; break; + case GPUIMAGE_GRAYSCALE: tableRowTitle = @"Grayscale"; break; + case GPUIMAGE_SOBELEDGEDETECTION: tableRowTitle = @"Sobel edge detection"; break; + case GPUIMAGE_SKETCH: tableRowTitle = @"Sketch"; break; + case GPUIMAGE_TOON: tableRowTitle = @"Toon"; break; + case GPUIMAGE_KUWAHARA: tableRowTitle = @"Kuwahara"; break; } return tableRowTitle; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 79dfc0e43..d364b89ff 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -31,6 +31,38 @@ BCF8675D1725BBE900912E34 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8675C1725BBE900912E34 /* CoreMedia.framework */; }; BCF8679D1727585D00912E34 /* GPUImageAVCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8679B1727585D00912E34 /* GPUImageAVCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF8679E1727585D00912E34 /* GPUImageAVCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8679C1727585D00912E34 /* GPUImageAVCamera.m */; }; + BCF867AD172778D500912E34 /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867A3172778D500912E34 /* GPUImageContrastFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867AE172778D500912E34 /* GPUImageContrastFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867A4172778D500912E34 /* GPUImageContrastFilter.m */; }; + BCF867AF172778D500912E34 /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867A5172778D500912E34 /* GPUImageExposureFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867B0172778D500912E34 /* GPUImageExposureFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867A6172778D500912E34 /* GPUImageExposureFilter.m */; }; + BCF867B1172778D500912E34 /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867A7172778D500912E34 /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867B2172778D500912E34 /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867A8172778D500912E34 /* GPUImageHueFilter.m */; }; + BCF867B3172778D500912E34 /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867A9172778D500912E34 /* GPUImageSaturationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867B4172778D500912E34 /* GPUImageSaturationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867AA172778D500912E34 /* GPUImageSaturationFilter.m */; }; + BCF867B5172778D500912E34 /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867AB172778D500912E34 /* GPUImageWhiteBalanceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867B6172778D500912E34 /* GPUImageWhiteBalanceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867AC172778D500912E34 /* GPUImageWhiteBalanceFilter.m */; }; + BCF867B91727791200912E34 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867B71727791200912E34 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867BA1727791200912E34 /* GPUImageLevelsFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867B81727791200912E34 /* GPUImageLevelsFilter.m */; }; + BCF867BF1727794000912E34 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867BB1727794000912E34 /* GPUImageMonochromeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867C01727794000912E34 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867BC1727794000912E34 /* GPUImageMonochromeFilter.m */; }; + BCF867C11727794000912E34 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867BD1727794000912E34 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867C21727794000912E34 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867BE1727794000912E34 /* GPUImageRGBFilter.m */; }; + BCF867C71727872D00912E34 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867C51727872D00912E34 /* GPUImagePixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867C81727872D00912E34 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867C61727872D00912E34 /* GPUImagePixellateFilter.m */; }; + BCF867CB172788F100912E34 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867C9172788F100912E34 /* GPUImage3x3TextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867CC172788F100912E34 /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867CA172788F100912E34 /* GPUImage3x3TextureSamplingFilter.m */; }; + BCF867CF172789B200912E34 /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867CD172789B200912E34 /* GPUImageSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867D0172789B200912E34 /* GPUImageSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867CE172789B200912E34 /* GPUImageSketchFilter.m */; }; + BCF867D417278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867D217278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867D517278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867D317278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.m */; }; + BCF867D817278A7A00912E34 /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867D617278A7900912E34 /* GPUImageToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867D917278A7A00912E34 /* GPUImageToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867D717278A7900912E34 /* GPUImageToonFilter.m */; }; + BCF867DC17278C5A00912E34 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867DA17278C5800912E34 /* GPUImageTwoPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867DD17278C5A00912E34 /* GPUImageTwoPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867DB17278C5900912E34 /* GPUImageTwoPassFilter.m */; }; + BCF867E017278D1900912E34 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867DE17278D1900912E34 /* GPUImageGrayscaleFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867E117278D1900912E34 /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867DF17278D1900912E34 /* GPUImageGrayscaleFilter.m */; }; + BCF867E41727903D00912E34 /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867E21727903C00912E34 /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867E51727903D00912E34 /* GPUImageKuwaharaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867E31727903D00912E34 /* GPUImageKuwaharaFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -64,6 +96,38 @@ BCF8675C1725BBE900912E34 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCF8679B1727585D00912E34 /* GPUImageAVCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAVCamera.h; path = Source/Mac/GPUImageAVCamera.h; sourceTree = SOURCE_ROOT; }; BCF8679C1727585D00912E34 /* GPUImageAVCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAVCamera.m; path = Source/Mac/GPUImageAVCamera.m; sourceTree = SOURCE_ROOT; }; + BCF867A3172778D500912E34 /* GPUImageContrastFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageContrastFilter.h; path = Source/GPUImageContrastFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867A4172778D500912E34 /* GPUImageContrastFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageContrastFilter.m; path = Source/GPUImageContrastFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867A5172778D500912E34 /* GPUImageExposureFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageExposureFilter.h; path = Source/GPUImageExposureFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867A6172778D500912E34 /* GPUImageExposureFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageExposureFilter.m; path = Source/GPUImageExposureFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867A7172778D500912E34 /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867A8172778D500912E34 /* GPUImageHueFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueFilter.m; path = Source/GPUImageHueFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867A9172778D500912E34 /* GPUImageSaturationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSaturationFilter.h; path = Source/GPUImageSaturationFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867AA172778D500912E34 /* GPUImageSaturationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSaturationFilter.m; path = Source/GPUImageSaturationFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867AB172778D500912E34 /* GPUImageWhiteBalanceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageWhiteBalanceFilter.h; path = Source/GPUImageWhiteBalanceFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867AC172778D500912E34 /* GPUImageWhiteBalanceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageWhiteBalanceFilter.m; path = Source/GPUImageWhiteBalanceFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867B71727791200912E34 /* GPUImageLevelsFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLevelsFilter.h; path = Source/GPUImageLevelsFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867B81727791200912E34 /* GPUImageLevelsFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLevelsFilter.m; path = Source/GPUImageLevelsFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867BB1727794000912E34 /* GPUImageMonochromeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMonochromeFilter.h; path = Source/GPUImageMonochromeFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867BC1727794000912E34 /* GPUImageMonochromeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMonochromeFilter.m; path = Source/GPUImageMonochromeFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867BD1727794000912E34 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867BE1727794000912E34 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867C51727872D00912E34 /* GPUImagePixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellateFilter.h; path = Source/GPUImagePixellateFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867C61727872D00912E34 /* GPUImagePixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellateFilter.m; path = Source/GPUImagePixellateFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867C9172788F100912E34 /* GPUImage3x3TextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage3x3TextureSamplingFilter.h; path = Source/GPUImage3x3TextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867CA172788F100912E34 /* GPUImage3x3TextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3TextureSamplingFilter.m; path = Source/GPUImage3x3TextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867CD172789B200912E34 /* GPUImageSketchFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSketchFilter.h; path = Source/GPUImageSketchFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867CE172789B200912E34 /* GPUImageSketchFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSketchFilter.m; path = Source/GPUImageSketchFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867D217278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSobelEdgeDetectionFilter.h; path = Source/GPUImageSobelEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867D317278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSobelEdgeDetectionFilter.m; path = Source/GPUImageSobelEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867D617278A7900912E34 /* GPUImageToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageToonFilter.h; path = Source/GPUImageToonFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867D717278A7900912E34 /* GPUImageToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageToonFilter.m; path = Source/GPUImageToonFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867DA17278C5800912E34 /* GPUImageTwoPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoPassFilter.h; path = Source/GPUImageTwoPassFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867DB17278C5900912E34 /* GPUImageTwoPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoPassFilter.m; path = Source/GPUImageTwoPassFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867DE17278D1900912E34 /* GPUImageGrayscaleFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGrayscaleFilter.h; path = Source/GPUImageGrayscaleFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867DF17278D1900912E34 /* GPUImageGrayscaleFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGrayscaleFilter.m; path = Source/GPUImageGrayscaleFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867E21727903C00912E34 /* GPUImageKuwaharaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageKuwaharaFilter.h; path = Source/GPUImageKuwaharaFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867E31727903D00912E34 /* GPUImageKuwaharaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageKuwaharaFilter.m; path = Source/GPUImageKuwaharaFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -165,8 +229,13 @@ children = ( BCF40F1E17248322005AE36A /* GPUImageFilter.h */, BCF40F1F17248322005AE36A /* GPUImageFilter.m */, - BCF40F27172488D3005AE36A /* GPUImageBrightnessFilter.h */, - BCF40F28172488D3005AE36A /* GPUImageBrightnessFilter.m */, + BCF867DA17278C5800912E34 /* GPUImageTwoPassFilter.h */, + BCF867DB17278C5900912E34 /* GPUImageTwoPassFilter.m */, + BCF867C9172788F100912E34 /* GPUImage3x3TextureSamplingFilter.h */, + BCF867CA172788F100912E34 /* GPUImage3x3TextureSamplingFilter.m */, + BCF867C31727820100912E34 /* Color processing */, + BCF867D1172789C800912E34 /* Image processing */, + BCF867C4172786BA00912E34 /* Effects */, ); name = Filters; sourceTree = ""; @@ -182,6 +251,57 @@ name = Outputs; sourceTree = ""; }; + BCF867C31727820100912E34 /* Color processing */ = { + isa = PBXGroup; + children = ( + BCF867A9172778D500912E34 /* GPUImageSaturationFilter.h */, + BCF867AA172778D500912E34 /* GPUImageSaturationFilter.m */, + BCF867A3172778D500912E34 /* GPUImageContrastFilter.h */, + BCF867A4172778D500912E34 /* GPUImageContrastFilter.m */, + BCF40F27172488D3005AE36A /* GPUImageBrightnessFilter.h */, + BCF40F28172488D3005AE36A /* GPUImageBrightnessFilter.m */, + BCF867B71727791200912E34 /* GPUImageLevelsFilter.h */, + BCF867B81727791200912E34 /* GPUImageLevelsFilter.m */, + BCF867A5172778D500912E34 /* GPUImageExposureFilter.h */, + BCF867A6172778D500912E34 /* GPUImageExposureFilter.m */, + BCF867BD1727794000912E34 /* GPUImageRGBFilter.h */, + BCF867BE1727794000912E34 /* GPUImageRGBFilter.m */, + BCF867A7172778D500912E34 /* GPUImageHueFilter.h */, + BCF867A8172778D500912E34 /* GPUImageHueFilter.m */, + BCF867AB172778D500912E34 /* GPUImageWhiteBalanceFilter.h */, + BCF867AC172778D500912E34 /* GPUImageWhiteBalanceFilter.m */, + BCF867BB1727794000912E34 /* GPUImageMonochromeFilter.h */, + BCF867BC1727794000912E34 /* GPUImageMonochromeFilter.m */, + BCF867DE17278D1900912E34 /* GPUImageGrayscaleFilter.h */, + BCF867DF17278D1900912E34 /* GPUImageGrayscaleFilter.m */, + ); + name = "Color processing"; + sourceTree = ""; + }; + BCF867C4172786BA00912E34 /* Effects */ = { + isa = PBXGroup; + children = ( + BCF867C51727872D00912E34 /* GPUImagePixellateFilter.h */, + BCF867C61727872D00912E34 /* GPUImagePixellateFilter.m */, + BCF867CD172789B200912E34 /* GPUImageSketchFilter.h */, + BCF867CE172789B200912E34 /* GPUImageSketchFilter.m */, + BCF867D617278A7900912E34 /* GPUImageToonFilter.h */, + BCF867D717278A7900912E34 /* GPUImageToonFilter.m */, + BCF867E21727903C00912E34 /* GPUImageKuwaharaFilter.h */, + BCF867E31727903D00912E34 /* GPUImageKuwaharaFilter.m */, + ); + name = Effects; + sourceTree = ""; + }; + BCF867D1172789C800912E34 /* Image processing */ = { + isa = PBXGroup; + children = ( + BCF867D217278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.h */, + BCF867D317278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.m */, + ); + name = "Image processing"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -195,10 +315,26 @@ BCF40F1B1724829B005AE36A /* GPUImageOutput.h in Headers */, BCF40F2017248322005AE36A /* GPUImageFilter.h in Headers */, BCF40F2517248836005AE36A /* GPUImageView.h in Headers */, - BCF40F29172488D3005AE36A /* GPUImageBrightnessFilter.h in Headers */, BCF867561725AF9300912E34 /* GPUImageMovieWriter.h in Headers */, BCF867581725AF9300912E34 /* GPUImagePicture.h in Headers */, BCF8679D1727585D00912E34 /* GPUImageAVCamera.h in Headers */, + BCF40F29172488D3005AE36A /* GPUImageBrightnessFilter.h in Headers */, + BCF867AD172778D500912E34 /* GPUImageContrastFilter.h in Headers */, + BCF867AF172778D500912E34 /* GPUImageExposureFilter.h in Headers */, + BCF867B1172778D500912E34 /* GPUImageHueFilter.h in Headers */, + BCF867B3172778D500912E34 /* GPUImageSaturationFilter.h in Headers */, + BCF867B5172778D500912E34 /* GPUImageWhiteBalanceFilter.h in Headers */, + BCF867B91727791200912E34 /* GPUImageLevelsFilter.h in Headers */, + BCF867BF1727794000912E34 /* GPUImageMonochromeFilter.h in Headers */, + BCF867C11727794000912E34 /* GPUImageRGBFilter.h in Headers */, + BCF867C71727872D00912E34 /* GPUImagePixellateFilter.h in Headers */, + BCF867CB172788F100912E34 /* GPUImage3x3TextureSamplingFilter.h in Headers */, + BCF867CF172789B200912E34 /* GPUImageSketchFilter.h in Headers */, + BCF867D417278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.h in Headers */, + BCF867D817278A7A00912E34 /* GPUImageToonFilter.h in Headers */, + BCF867DC17278C5A00912E34 /* GPUImageTwoPassFilter.h in Headers */, + BCF867E017278D1900912E34 /* GPUImageGrayscaleFilter.h in Headers */, + BCF867E41727903D00912E34 /* GPUImageKuwaharaFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -273,6 +409,22 @@ BCF867571725AF9300912E34 /* GPUImageMovieWriter.m in Sources */, BCF867591725AF9300912E34 /* GPUImagePicture.m in Sources */, BCF8679E1727585D00912E34 /* GPUImageAVCamera.m in Sources */, + BCF867AE172778D500912E34 /* GPUImageContrastFilter.m in Sources */, + BCF867B0172778D500912E34 /* GPUImageExposureFilter.m in Sources */, + BCF867B2172778D500912E34 /* GPUImageHueFilter.m in Sources */, + BCF867B4172778D500912E34 /* GPUImageSaturationFilter.m in Sources */, + BCF867B6172778D500912E34 /* GPUImageWhiteBalanceFilter.m in Sources */, + BCF867BA1727791200912E34 /* GPUImageLevelsFilter.m in Sources */, + BCF867C01727794000912E34 /* GPUImageMonochromeFilter.m in Sources */, + BCF867C21727794000912E34 /* GPUImageRGBFilter.m in Sources */, + BCF867C81727872D00912E34 /* GPUImagePixellateFilter.m in Sources */, + BCF867CC172788F100912E34 /* GPUImage3x3TextureSamplingFilter.m in Sources */, + BCF867D0172789B200912E34 /* GPUImageSketchFilter.m in Sources */, + BCF867D517278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.m in Sources */, + BCF867D917278A7A00912E34 /* GPUImageToonFilter.m in Sources */, + BCF867DD17278C5A00912E34 /* GPUImageTwoPassFilter.m in Sources */, + BCF867E117278D1900912E34 /* GPUImageGrayscaleFilter.m in Sources */, + BCF867E51727903D00912E34 /* GPUImageKuwaharaFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m index c3e74d374..05c4d50cc 100644 --- a/framework/Source/GPUImage3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -6,8 +6,8 @@ attribute vec4 position; attribute vec4 inputTextureCoordinate; - uniform highp float texelWidth; - uniform highp float texelHeight; + uniform float texelWidth; + uniform float texelHeight; varying vec2 textureCoordinate; varying vec2 leftTextureCoordinate; diff --git a/framework/Source/GPUImageContrastFilter.m b/framework/Source/GPUImageContrastFilter.m index ec58d74eb..5ed1e22fc 100755 --- a/framework/Source/GPUImageContrastFilter.m +++ b/framework/Source/GPUImageContrastFilter.m @@ -1,5 +1,6 @@ #import "GPUImageContrastFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageContrastFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -14,6 +15,22 @@ void main() gl_FragColor = vec4(((textureColor.rgb - vec3(0.5)) * contrast + vec3(0.5)), textureColor.w); } ); +#else +NSString *const kGPUImageContrastFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float contrast; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4(((textureColor.rgb - vec3(0.5)) * contrast + vec3(0.5)), textureColor.w); + } + ); +#endif @implementation GPUImageContrastFilter diff --git a/framework/Source/GPUImageExposureFilter.m b/framework/Source/GPUImageExposureFilter.m index baffa18d2..d5ee2c9fd 100755 --- a/framework/Source/GPUImageExposureFilter.m +++ b/framework/Source/GPUImageExposureFilter.m @@ -1,5 +1,6 @@ #import "GPUImageExposureFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageExposureFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -14,6 +15,22 @@ void main() gl_FragColor = vec4(textureColor.rgb * pow(2.0, exposure), textureColor.w); } ); +#else +NSString *const kGPUImageExposureFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float exposure; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4(textureColor.rgb * pow(2.0, exposure), textureColor.w); + } +); +#endif @implementation GPUImageExposureFilter diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index 429962b58..0cdafadc7 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -2,6 +2,7 @@ @implementation GPUImageGrayscaleFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLuminanceFragmentShaderString = SHADER_STRING ( precision highp float; @@ -20,6 +21,25 @@ void main() gl_FragColor = vec4(vec3(luminance), textureColor.a); } ); +#else +NSString *const kGPUImageLuminanceFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, W); + + gl_FragColor = vec4(vec3(luminance), textureColor.a); + } +); +#endif + - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m index 218d66944..5b42c86d3 100644 --- a/framework/Source/GPUImageHueFilter.m +++ b/framework/Source/GPUImageHueFilter.m @@ -2,6 +2,7 @@ #import "GPUImageHueFilter.h" // Adapted from http://stackoverflow.com/questions/9234724/how-to-change-hue-of-a-texture-with-glsl - see for code and discussion +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHueFragmentShaderString = SHADER_STRING ( precision highp float; @@ -47,8 +48,54 @@ void main () // Save the result gl_FragColor = color; } - ); - +); +#else +NSString *const kGPUImageHueFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float hueAdjust; + const vec4 kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0); + const vec4 kRGBToI = vec4 (0.595716, -0.274453, -0.321263, 0.0); + const vec4 kRGBToQ = vec4 (0.211456, -0.522591, 0.31135, 0.0); + + const vec4 kYIQToR = vec4 (1.0, 0.9563, 0.6210, 0.0); + const vec4 kYIQToG = vec4 (1.0, -0.2721, -0.6474, 0.0); + const vec4 kYIQToB = vec4 (1.0, -1.1070, 1.7046, 0.0); + + void main () + { + // Sample the input pixel + vec4 color = texture2D(inputImageTexture, textureCoordinate); + + // Convert to YIQ + float YPrime = dot (color, kRGBToYPrime); + float I = dot (color, kRGBToI); + float Q = dot (color, kRGBToQ); + + // Calculate the hue and chroma + float hue = atan (Q, I); + float chroma = sqrt (I * I + Q * Q); + + // Make the user's adjustments + hue += (-hueAdjust); //why negative rotation? + + // Convert back to YIQ + Q = chroma * sin (hue); + I = chroma * cos (hue); + + // Convert back to RGB + vec4 yIQ = vec4 (YPrime, I, Q, 0.0); + color.r = dot (yIQ, kYIQToR); + color.g = dot (yIQ, kYIQToG); + color.b = dot (yIQ, kYIQToB); + + // Save the result + gl_FragColor = color; + } +); +#endif @implementation GPUImageHueFilter @synthesize hue; diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m index 8c74e661a..5c8e3968f 100755 --- a/framework/Source/GPUImageKuwaharaFilter.m +++ b/framework/Source/GPUImageKuwaharaFilter.m @@ -7,6 +7,7 @@ // Anisotropic Kuwahara Filtering on the GPU // by Jan Eric Kyprianidis +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageKuwaharaFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -97,6 +98,96 @@ void main (void) } } ); +#else +NSString *const kGPUImageKuwaharaFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform int radius; + + const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0); + + void main (void) + { + vec2 uv = textureCoordinate; + float n = float((radius + 1) * (radius + 1)); + int i; int j; + vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0); + vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0); + vec3 c; + + for (j = -radius; j <= 0; ++j) { + for (i = -radius; i <= 0; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m0 += c; + s0 += c * c; + } + } + + for (j = -radius; j <= 0; ++j) { + for (i = 0; i <= radius; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m1 += c; + s1 += c * c; + } + } + + for (j = 0; j <= radius; ++j) { + for (i = 0; i <= radius; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m2 += c; + s2 += c * c; + } + } + + for (j = 0; j <= radius; ++j) { + for (i = -radius; i <= 0; ++i) { + c = texture2D(inputImageTexture, uv + vec2(i,j) * src_size).rgb; + m3 += c; + s3 += c * c; + } + } + + + float min_sigma2 = 1e+2; + m0 /= n; + s0 = abs(s0 / n - m0 * m0); + + float sigma2 = s0.r + s0.g + s0.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m0, 1.0); + } + + m1 /= n; + s1 = abs(s1 / n - m1 * m1); + + sigma2 = s1.r + s1.g + s1.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m1, 1.0); + } + + m2 /= n; + s2 = abs(s2 / n - m2 * m2); + + sigma2 = s2.r + s2.g + s2.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m2, 1.0); + } + + m3 /= n; + s3 = abs(s3 / n - m3 * m3); + + sigma2 = s3.r + s3.g + s3.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m3, 1.0); + } + } +); +#endif @implementation GPUImageKuwaharaFilter diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m index ff98dbd72..8f692b33a 100644 --- a/framework/Source/GPUImageLevelsFilter.m +++ b/framework/Source/GPUImageLevelsFilter.m @@ -17,6 +17,7 @@ #define LevelsControlOutputRange(color, minOutput, maxOutput) mix(minOutput, maxOutput, color) #define LevelsControl(color, minInput, gamma, maxInput, minOutput, maxOutput) LevelsControlOutputRange(LevelsControlInput(color, minInput, gamma, maxInput), minOutput, maxOutput) +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLevelsFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -34,7 +35,27 @@ void main() gl_FragColor = vec4(LevelsControl(textureColor.rgb, min, mid, max, minOutput, maxOutput), textureColor.a); } - ); +); +#else +NSString *const kGPUImageLevelsFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform vec3 min; + uniform vec3 mid; + uniform vec3 max; + uniform vec3 minOutput; + uniform vec3 maxOutput; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4(LevelsControl(textureColor.rgb, min, mid, max, minOutput, maxOutput), textureColor.a); + } +); +#endif @implementation GPUImageLevelsFilter diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m index b7c953077..70cef872f 100644 --- a/framework/Source/GPUImageMonochromeFilter.m +++ b/framework/Source/GPUImageMonochromeFilter.m @@ -1,5 +1,6 @@ #import "GPUImageMonochromeFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUMonochromeFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -32,6 +33,38 @@ void main() gl_FragColor = vec4( mix(textureColor.rgb, outputColor.rgb, intensity), textureColor.a); } ); +#else +NSString *const kGPUMonochromeFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float intensity; + uniform vec3 filterColor; + + const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + //desat, then apply overlay blend + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, luminanceWeighting); + + vec4 desat = vec4(vec3(luminance), 1.0); + + //overlay + vec4 outputColor = vec4( + (desat.r < 0.5 ? (2.0 * desat.r * filterColor.r) : (1.0 - 2.0 * (1.0 - desat.r) * (1.0 - filterColor.r))), + (desat.g < 0.5 ? (2.0 * desat.g * filterColor.g) : (1.0 - 2.0 * (1.0 - desat.g) * (1.0 - filterColor.g))), + (desat.b < 0.5 ? (2.0 * desat.b * filterColor.b) : (1.0 - 2.0 * (1.0 - desat.b) * (1.0 - filterColor.b))), + 1.0 + ); + + //which is better, or are they equal? + gl_FragColor = vec4( mix(textureColor.rgb, outputColor.rgb, intensity), textureColor.a); + } +); +#endif @implementation GPUImageMonochromeFilter diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 47f0ccb22..b742c5839 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -58,7 +58,7 @@ void reportAvailableMemoryForGPUImage(NSString *tag) &size); if( kerr == KERN_SUCCESS ) { - NSLog(@"%@ - Memory used: %lu", tag, info.resident_size); //in bytes + NSLog(@"%@ - Memory used: %u", tag, info.resident_size); //in bytes } else { NSLog(@"%@ - Error: %s", tag, mach_error_string(kerr)); } diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index e68d464d7..1be736b05 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -1,5 +1,6 @@ #import "GPUImagePixellateFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePixellationFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -17,6 +18,25 @@ void main() gl_FragColor = texture2D(inputImageTexture, samplePos ); } ); +#else +NSString *const kGPUImagePixellationFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float fractionalWidthOfPixel; + uniform float aspectRatio; + + void main() + { + vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + + vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + gl_FragColor = texture2D(inputImageTexture, samplePos ); + } +); +#endif @interface GPUImagePixellateFilter () diff --git a/framework/Source/GPUImageRGBFilter.m b/framework/Source/GPUImageRGBFilter.m index c981f8805..241641c10 100755 --- a/framework/Source/GPUImageRGBFilter.m +++ b/framework/Source/GPUImageRGBFilter.m @@ -1,5 +1,6 @@ #import "GPUImageRGBFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageRGBFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -13,9 +14,27 @@ void main() { highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, 1.0); + } +); +#else +NSString *const kGPUImageRGBFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float red; + uniform float green; + uniform float blue; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, 1.0); } ); +#endif @implementation GPUImageRGBFilter diff --git a/framework/Source/GPUImageSaturationFilter.m b/framework/Source/GPUImageSaturationFilter.m index 31929e7e3..fc373d4a4 100755 --- a/framework/Source/GPUImageSaturationFilter.m +++ b/framework/Source/GPUImageSaturationFilter.m @@ -1,5 +1,6 @@ #import "GPUImageSaturationFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSaturationFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -20,6 +21,28 @@ void main() } ); +#else +NSString *const kGPUImageSaturationFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float saturation; + + // Values from "Graphics Shaders: Theory and Practice" by Bailey and Cunningham + const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, luminanceWeighting); + vec3 greyScaleColor = vec3(luminance); + + gl_FragColor = vec4(mix(greyScaleColor, textureColor.rgb, saturation), textureColor.w); + + } + ); +#endif @implementation GPUImageSaturationFilter diff --git a/framework/Source/GPUImageSketchFilter.m b/framework/Source/GPUImageSketchFilter.m index 09c262368..6e793b307 100755 --- a/framework/Source/GPUImageSketchFilter.m +++ b/framework/Source/GPUImageSketchFilter.m @@ -3,6 +3,7 @@ @implementation GPUImageSketchFilter // Invert the colorspace for a sketch +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSketchFragmentShaderString = SHADER_STRING ( precision mediump float; @@ -39,6 +40,42 @@ void main() gl_FragColor = vec4(vec3(mag), 1.0); } ); +#else +NSString *const kGPUImageSketchFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + + float mag = 1.0 - length(vec2(h, v)); + + gl_FragColor = vec4(vec3(mag), 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 713a28c66..5663fa391 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -3,6 +3,7 @@ #import "GPUImage3x3ConvolutionFilter.h" // Code from "Graphics Shaders: Theory and Practice" by M. Bailey and S. Cunningham +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSobelEdgeDetectionFragmentShaderString = SHADER_STRING ( precision mediump float; @@ -39,6 +40,42 @@ void main() gl_FragColor = vec4(vec3(mag), 1.0); } ); +#else +NSString *const kGPUImageSobelEdgeDetectionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + + float mag = length(vec2(h, v)); + + gl_FragColor = vec4(vec3(mag), 1.0); + } +); +#endif @implementation GPUImageSobelEdgeDetectionFilter diff --git a/framework/Source/GPUImageToonFilter.m b/framework/Source/GPUImageToonFilter.m index 88c032065..e8ff104e7 100755 --- a/framework/Source/GPUImageToonFilter.m +++ b/framework/Source/GPUImageToonFilter.m @@ -3,6 +3,7 @@ #import "GPUImage3x3ConvolutionFilter.h" // Code from "Graphics Shaders: Theory and Practice" by M. Bailey and S. Cunningham +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageToonFragmentShaderString = SHADER_STRING ( precision highp float; @@ -51,6 +52,54 @@ void main() gl_FragColor = vec4(posterizedImageColor * thresholdTest, textureColor.a); } ); +#else +NSString *const kGPUImageToonFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float intensity; + uniform float threshold; + uniform float quantizationLevels; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + + float mag = length(vec2(h, v)); + + vec3 posterizedImageColor = floor((textureColor.rgb * quantizationLevels) + 0.5) / quantizationLevels; + + float thresholdTest = 1.0 - step(threshold, mag); + + gl_FragColor = vec4(posterizedImageColor * thresholdTest, textureColor.a); + } +); +#endif @implementation GPUImageToonFilter diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 5ad6d2653..fe3a00453 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -145,6 +145,8 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + #if defined(__IPHONE_6_0) CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #else @@ -197,6 +199,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); [self notifyTargetsAboutNewOutputTexture]; +#endif } else { @@ -251,6 +254,7 @@ - (void)destroyFilterFBO; secondFilterFramebuffer = 0; } +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE if (filterTextureCache != NULL) { CFRelease(renderTarget); @@ -266,6 +270,7 @@ - (void)destroyFilterFBO; CFRelease(filterTextureCache); filterTextureCache = NULL; } +#endif }); } diff --git a/framework/Source/GPUImageWhiteBalanceFilter.m b/framework/Source/GPUImageWhiteBalanceFilter.m index bb1a25b3c..af4b4bad1 100644 --- a/framework/Source/GPUImageWhiteBalanceFilter.m +++ b/framework/Source/GPUImageWhiteBalanceFilter.m @@ -1,5 +1,6 @@ #import "GPUImageWhiteBalanceFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageWhiteBalanceFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -29,6 +30,37 @@ void main() gl_FragColor = vec4(mix(rgb, processed, temperature), source.a); } ); +#else +NSString *const kGPUImageWhiteBalanceFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + varying vec2 textureCoordinate; + + uniform float temperature; + uniform float tint; + + const vec3 warmFilter = vec3(0.93, 0.54, 0.0); + + const mat3 RGBtoYIQ = mat3(0.299, 0.587, 0.114, 0.596, -0.274, -0.322, 0.212, -0.523, 0.311); + const mat3 YIQtoRGB = mat3(1.0, 0.956, 0.621, 1.0, -0.272, -0.647, 1.0, -1.105, 1.702); + + void main() +{ + vec4 source = texture2D(inputImageTexture, textureCoordinate); + + vec3 yiq = RGBtoYIQ * source.rgb; //adjusting tint + yiq.b = clamp(yiq.b + tint*0.5226*0.1, -0.5226, 0.5226); + vec3 rgb = YIQtoRGB * yiq; + + vec3 processed = vec3( + (rgb.r < 0.5 ? (2.0 * rgb.r * warmFilter.r) : (1.0 - 2.0 * (1.0 - rgb.r) * (1.0 - warmFilter.r))), //adjusting temperature + (rgb.g < 0.5 ? (2.0 * rgb.g * warmFilter.g) : (1.0 - 2.0 * (1.0 - rgb.g) * (1.0 - warmFilter.g))), + (rgb.b < 0.5 ? (2.0 * rgb.b * warmFilter.b) : (1.0 - 2.0 * (1.0 - rgb.b) * (1.0 - warmFilter.b)))); + + gl_FragColor = vec4(mix(rgb, processed, temperature), source.a); +} +); +#endif @implementation GPUImageWhiteBalanceFilter diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 08921f76c..908cf2629 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -11,7 +11,23 @@ // Filters #import +#import +#import +#import +#import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import // Outputs #import diff --git a/framework/Source/Mac/GPUImageAVCamera.m b/framework/Source/Mac/GPUImageAVCamera.m index 3a1bcf911..58a1d7720 100644 --- a/framework/Source/Mac/GPUImageAVCamera.m +++ b/framework/Source/Mac/GPUImageAVCamera.m @@ -182,7 +182,9 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *device in devices) { - if ([device position] == cameraPosition) + NSLog(@"Device: %@, %ld", device, [device position]); + + if (([device position] == cameraPosition) && (![device isSuspended]) ) { _inputCamera = device; } From a4270b0aea3acfaa0120868a041d2ff7aa2c3317 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 24 Apr 2013 13:16:43 -0500 Subject: [PATCH 360/695] Ported another set of filters to the Mac. --- .../FilterShowcase.xcodeproj/project.pbxproj | 6 +- .../SLSFilterShowcaseWindowController.h | 17 ++ .../SLSFilterShowcaseWindowController.m | 172 ++++++++++++++++++ .../ShowcaseFilterListController.m | 2 +- .../GPUImageMac.xcodeproj/project.pbxproj | 136 ++++++++++++++ framework/Source/GPUImageBilateralFilter.m | 78 ++++++++ framework/Source/GPUImageBoxBlurFilter.m | 25 ++- framework/Source/GPUImageCropFilter.m | 2 +- framework/Source/GPUImageFalseColorFilter.m | 23 +++ framework/Source/GPUImageFastBlurFilter.m | 65 ++++++- framework/Source/GPUImageGaussianBlurFilter.m | 52 +++++- .../GPUImageGaussianBlurPositionFilter.m | 62 ++++++- .../GPUImageGaussianSelectiveBlurFilter.m | 27 +++ framework/Source/GPUImageMedianFilter.m | 59 ++++++ framework/Source/GPUImageMotionBlurFilter.m | 45 ++++- framework/Source/GPUImageSharpenFilter.m | 35 +++- framework/Source/GPUImageTransformFilter.m | 6 +- framework/Source/GPUImageTwoInputFilter.m | 2 +- framework/Source/GPUImageUnsharpMaskFilter.m | 23 +++ framework/Source/GPUImageZoomBlurFilter.m | 30 +++ framework/Source/Mac/GPUImage.h | 17 ++ framework/Source/Mac/GPUImageAVCamera.m | 2 + 22 files changed, 847 insertions(+), 39 deletions(-) diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 051e122a8..8fbbfefd9 100644 --- a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ BCF8679717263FCF00912E34 /* SLSFilterShowcaseWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCF8679517263FCF00912E34 /* SLSFilterShowcaseWindowController.xib */; }; BCF8679A1726410E00912E34 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8678F17263F3500912E34 /* GPUImage.framework */; }; BCF867A1172762B500912E34 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867A0172762B500912E34 /* AVFoundation.framework */; }; + BCF8680B17284D6A00912E34 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8680A17284D6A00912E34 /* QuartzCore.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -55,6 +56,7 @@ BCF8679417263FCF00912E34 /* SLSFilterShowcaseWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SLSFilterShowcaseWindowController.m; path = ../SLSFilterShowcaseWindowController.m; sourceTree = ""; }; BCF8679517263FCF00912E34 /* SLSFilterShowcaseWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = SLSFilterShowcaseWindowController.xib; path = ../SLSFilterShowcaseWindowController.xib; sourceTree = ""; }; BCF867A0172762B500912E34 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + BCF8680A17284D6A00912E34 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,6 +64,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCF8680B17284D6A00912E34 /* QuartzCore.framework in Frameworks */, BCF867A1172762B500912E34 /* AVFoundation.framework in Frameworks */, BCF8679A1726410E00912E34 /* GPUImage.framework in Frameworks */, BCF8676E17263EAC00912E34 /* Cocoa.framework in Frameworks */, @@ -74,7 +77,6 @@ BCF8676117263EAC00912E34 = { isa = PBXGroup; children = ( - BCF867A0172762B500912E34 /* AVFoundation.framework */, BCF8677317263EAC00912E34 /* FilterShowcase */, BCF8676C17263EAC00912E34 /* Frameworks */, BCF8676B17263EAC00912E34 /* Products */, @@ -94,6 +96,8 @@ children = ( BCF8678A17263F3400912E34 /* GPUImageMac.xcodeproj */, BCF8676D17263EAC00912E34 /* Cocoa.framework */, + BCF8680A17284D6A00912E34 /* QuartzCore.framework */, + BCF867A0172762B500912E34 /* AVFoundation.framework */, BCF8676F17263EAC00912E34 /* Other Frameworks */, ); name = Frameworks; diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index 28b43fb92..acaf3e69c 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -11,12 +11,29 @@ typedef enum { GPUIMAGE_HUE, GPUIMAGE_WHITEBALANCE, GPUIMAGE_MONOCHROME, + GPUIMAGE_FALSECOLOR, + GPUIMAGE_SHARPEN, + GPUIMAGE_UNSHARPMASK, + GPUIMAGE_TRANSFORM, + GPUIMAGE_TRANSFORM3D, + GPUIMAGE_CROP, GPUIMAGE_PIXELLATE, GPUIMAGE_GRAYSCALE, GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_KUWAHARA, + GPUIMAGE_GAUSSIAN, + + GPUIMAGE_GAUSSIAN_SELECTIVE, + GPUIMAGE_GAUSSIAN_POSITION, + GPUIMAGE_FASTBLUR, + GPUIMAGE_BOXBLUR, + GPUIMAGE_MEDIAN, + GPUIMAGE_BILATERAL, + GPUIMAGE_MOTIONBLUR, + GPUIMAGE_ZOOMBLUR, + GPUIMAGE_NUMFILTERS } GPUImageShowcaseFilterType; diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 0e88e46a0..202bf2458 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -28,6 +28,7 @@ - (void)windowDidLoad [super windowDidLoad]; inputCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionUnspecified]; + inputCamera.runBenchmark = YES; currentlySelectedRow = 1; [self changeSelectedRow:0]; @@ -139,6 +140,64 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 1.0; self.enableSlider = YES; }; break; + case GPUIMAGE_FALSECOLOR: + { + currentlySelectedFilter = [[GPUImageFalseColorFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_SHARPEN: + { + currentlySelectedFilter = [[GPUImageSharpenFilter alloc] init]; + + self.minimumSliderValue = -1.0; + self.maximumSliderValue = 4.0; + self.currentSliderValue = 0.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_UNSHARPMASK: + { + currentlySelectedFilter = [[GPUImageUnsharpMaskFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 5.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_TRANSFORM: + { + currentlySelectedFilter = [[GPUImageTransformFilter alloc] init]; + [(GPUImageTransformFilter *)currentlySelectedFilter setAffineTransform:CGAffineTransformMakeRotation(2.0)]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 6.28; + self.currentSliderValue = 2.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_TRANSFORM3D: + { + currentlySelectedFilter = [[GPUImageTransformFilter alloc] init]; + CATransform3D perspectiveTransform = CATransform3DIdentity; + perspectiveTransform.m34 = 0.4; + perspectiveTransform.m33 = 0.4; + perspectiveTransform = CATransform3DScale(perspectiveTransform, 0.75, 0.75, 0.75); + perspectiveTransform = CATransform3DRotate(perspectiveTransform, 0.75, 0.0, 1.0, 0.0); + + [(GPUImageTransformFilter *)currentlySelectedFilter setTransform3D:perspectiveTransform]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 6.28; + self.currentSliderValue = 0.75; + self.enableSlider = YES; + }; break; + case GPUIMAGE_CROP: + { + currentlySelectedFilter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 1.0, 0.25)]; + + self.minimumSliderValue = 0.2; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; case GPUIMAGE_GRAYSCALE: { currentlySelectedFilter = [[GPUImageGrayscaleFilter alloc] init]; @@ -177,6 +236,83 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 3.0; self.enableSlider = YES; }; break; + case GPUIMAGE_GAUSSIAN: + { + currentlySelectedFilter = [[GPUImageGaussianBlurFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 10.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_GAUSSIAN_SELECTIVE: + { + currentlySelectedFilter = [[GPUImageGaussianSelectiveBlurFilter alloc] init]; + [(GPUImageGaussianSelectiveBlurFilter*)currentlySelectedFilter setExcludeCircleRadius:40.0/320.0]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 0.75; + self.currentSliderValue = 40.0/320.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_GAUSSIAN_POSITION: + { + currentlySelectedFilter = [[GPUImageGaussianBlurPositionFilter alloc] init]; + [(GPUImageGaussianBlurPositionFilter*)currentlySelectedFilter setBlurRadius:40.0/320.0]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 0.75; + self.currentSliderValue = 40.0/320.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_FASTBLUR: + { + currentlySelectedFilter = [[GPUImageFastBlurFilter alloc] init]; + + self.minimumSliderValue = 1.0; + self.maximumSliderValue = 10.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_BOXBLUR: + { + currentlySelectedFilter = [[GPUImageBoxBlurFilter alloc] init]; + + self.enableSlider = NO; + }; break; + case GPUIMAGE_MEDIAN: + { + currentlySelectedFilter = [[GPUImageMedianFilter alloc] init]; + + self.enableSlider = NO; + }; break; + case GPUIMAGE_BILATERAL: + { + currentlySelectedFilter = [[GPUImageBilateralFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 10.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_MOTIONBLUR: + { + currentlySelectedFilter = [[GPUImageMotionBlurFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 180.0; + self.currentSliderValue = 0.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_ZOOMBLUR: + { + currentlySelectedFilter = [[GPUImageZoomBlurFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 2.5; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; } [inputCamera addTarget:currentlySelectedFilter]; @@ -206,6 +342,27 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; + case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)currentlySelectedFilter setSharpness:_currentSliderValue]; break; + case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; + case GPUIMAGE_TRANSFORM: [(GPUImageTransformFilter *)currentlySelectedFilter setAffineTransform:CGAffineTransformMakeRotation(_currentSliderValue)]; break; + case GPUIMAGE_TRANSFORM3D: + { + CATransform3D perspectiveTransform = CATransform3DIdentity; + perspectiveTransform.m34 = 0.4; + perspectiveTransform.m33 = 0.4; + perspectiveTransform = CATransform3DScale(perspectiveTransform, 0.75, 0.75, 0.75); + perspectiveTransform = CATransform3DRotate(perspectiveTransform, _currentSliderValue, 0.0, 1.0, 0.0); + + [(GPUImageTransformFilter *)currentlySelectedFilter setTransform3D:perspectiveTransform]; + }; break; + case GPUIMAGE_CROP: [(GPUImageCropFilter *)currentlySelectedFilter setCropRegion:CGRectMake(0.0, 0.0, 1.0, _currentSliderValue)]; break; + case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)currentlySelectedFilter setExcludeCircleRadius:_currentSliderValue]; break; + case GPUIMAGE_GAUSSIAN_POSITION: [(GPUImageGaussianBlurPositionFilter *)currentlySelectedFilter setBlurRadius:_currentSliderValue]; break; + case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)currentlySelectedFilter setBlurPasses:round(_currentSliderValue)]; break; + case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)currentlySelectedFilter setDistanceNormalizationFactor:_currentSliderValue]; break; + case GPUIMAGE_MOTIONBLUR: [(GPUImageMotionBlurFilter *)currentlySelectedFilter setBlurAngle:_currentSliderValue]; break; + case GPUIMAGE_ZOOMBLUR: [(GPUImageZoomBlurFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; } } @@ -238,6 +395,21 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_SKETCH: tableRowTitle = @"Sketch"; break; case GPUIMAGE_TOON: tableRowTitle = @"Toon"; break; case GPUIMAGE_KUWAHARA: tableRowTitle = @"Kuwahara"; break; + case GPUIMAGE_FALSECOLOR: tableRowTitle = @"False color"; break; + case GPUIMAGE_SHARPEN: tableRowTitle = @"Sharpen"; break; + case GPUIMAGE_UNSHARPMASK: tableRowTitle = @"Unsharp mask"; break; + case GPUIMAGE_TRANSFORM: tableRowTitle = @"Transform (2-D)"; break; + case GPUIMAGE_TRANSFORM3D: tableRowTitle = @"Transform (3-D)"; break; + case GPUIMAGE_CROP: tableRowTitle = @"Crop"; break; + case GPUIMAGE_GAUSSIAN: tableRowTitle = @"Gaussian blur"; break; + case GPUIMAGE_GAUSSIAN_SELECTIVE: tableRowTitle = @"Gaussian selective blur"; break; + case GPUIMAGE_GAUSSIAN_POSITION: tableRowTitle = @"Gaussian (centered)"; break; + case GPUIMAGE_FASTBLUR: tableRowTitle = @"Gaussian blur (optimized)"; break; + case GPUIMAGE_BOXBLUR: tableRowTitle = @"Box blur"; break; + case GPUIMAGE_MEDIAN: tableRowTitle = @"Median (3x3)"; break; + case GPUIMAGE_BILATERAL: tableRowTitle = @"Bilateral blur"; break; + case GPUIMAGE_MOTIONBLUR: tableRowTitle = @"Motion blur"; break; + case GPUIMAGE_ZOOMBLUR: tableRowTitle = @"Zoom blur"; break; } return tableRowTitle; diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 9f96a283c..c6583693a 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -172,7 +172,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_KUWAHARARADIUS3: cell.textLabel.text = @"Kuwahara (fixed radius)"; break; case GPUIMAGE_VIGNETTE: cell.textLabel.text = @"Vignette"; break; case GPUIMAGE_GAUSSIAN: cell.textLabel.text = @"Gaussian blur"; break; - case GPUIMAGE_FASTBLUR: cell.textLabel.text = @"Fast blur"; break; + case GPUIMAGE_FASTBLUR: cell.textLabel.text = @"Gaussian blur (optimized)"; break; case GPUIMAGE_MEDIAN: cell.textLabel.text = @"Median (3x3)"; break; case GPUIMAGE_BILATERAL: cell.textLabel.text = @"Bilateral blur"; break; case GPUIMAGE_MOTIONBLUR: cell.textLabel.text = @"Motion blur"; break; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index d364b89ff..d041551c6 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -63,6 +63,40 @@ BCF867E117278D1900912E34 /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867DF17278D1900912E34 /* GPUImageGrayscaleFilter.m */; }; BCF867E41727903D00912E34 /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867E21727903C00912E34 /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF867E51727903D00912E34 /* GPUImageKuwaharaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867E31727903D00912E34 /* GPUImageKuwaharaFilter.m */; }; + BCF867E81728477300912E34 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867E61728477200912E34 /* GPUImageFalseColorFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867E91728477300912E34 /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867E71728477200912E34 /* GPUImageFalseColorFilter.m */; }; + BCF867EC172847A000912E34 /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867EA172847A000912E34 /* GPUImageSharpenFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867ED172847A000912E34 /* GPUImageSharpenFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867EB172847A000912E34 /* GPUImageSharpenFilter.m */; }; + BCF867F01728487100912E34 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867EE1728487000912E34 /* GPUImageUnsharpMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867F11728487100912E34 /* GPUImageUnsharpMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867EF1728487000912E34 /* GPUImageUnsharpMaskFilter.m */; }; + BCF867F41728490600912E34 /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867F21728490300912E34 /* GPUImageTwoInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867F51728490600912E34 /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867F31728490500912E34 /* GPUImageTwoInputFilter.m */; }; + BCF867F81728494C00912E34 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867F61728494B00912E34 /* GPUImageGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867F91728494C00912E34 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867F71728494B00912E34 /* GPUImageGaussianBlurFilter.m */; }; + BCF867FC1728496E00912E34 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867FA1728496A00912E34 /* GPUImageTwoPassTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF867FD1728496E00912E34 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867FB1728496C00912E34 /* GPUImageTwoPassTextureSamplingFilter.m */; }; + BCF8680017284C4000912E34 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF867FE17284C3C00912E34 /* GPUImageFilterGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8680117284C4000912E34 /* GPUImageFilterGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF867FF17284C3E00912E34 /* GPUImageFilterGroup.m */; }; + BCF8680417284CFC00912E34 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8680217284CFB00912E34 /* GPUImageTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8680517284CFC00912E34 /* GPUImageTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8680317284CFB00912E34 /* GPUImageTransformFilter.m */; }; + BCF8680817284D0B00912E34 /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8680617284D0A00912E34 /* GPUImageCropFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8680917284D0B00912E34 /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8680717284D0A00912E34 /* GPUImageCropFilter.m */; }; + BCF86810172853AA00912E34 /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8680C172853A500912E34 /* GPUImageGaussianBlurPositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF86811172853AA00912E34 /* GPUImageGaussianBlurPositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8680D172853A600912E34 /* GPUImageGaussianBlurPositionFilter.m */; }; + BCF86812172853AA00912E34 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8680E172853A700912E34 /* GPUImageGaussianSelectiveBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF86813172853AA00912E34 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8680F172853A800912E34 /* GPUImageGaussianSelectiveBlurFilter.m */; }; + BCF8681C172854B900912E34 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86814172854AA00912E34 /* GPUImageBilateralFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8681D172854B900912E34 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86815172854AC00912E34 /* GPUImageBilateralFilter.m */; }; + BCF8681E172854B900912E34 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8681F172854B900912E34 /* GPUImageBoxBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */; }; + BCF86820172854B900912E34 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF86821172854B900912E34 /* GPUImageFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86819172854B500912E34 /* GPUImageFastBlurFilter.m */; }; + BCF86822172854B900912E34 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8681A172854B600912E34 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF86823172854B900912E34 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8681B172854B800912E34 /* GPUImageMedianFilter.m */; }; + BCF86828172857B900912E34 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86824172857AD00912E34 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF86829172857B900912E34 /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86825172857B000912E34 /* GPUImageMotionBlurFilter.m */; }; + BCF8682A172857B900912E34 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86826172857B200912E34 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8682B172857B900912E34 /* GPUImageZoomBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86827172857B600912E34 /* GPUImageZoomBlurFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -128,6 +162,40 @@ BCF867DF17278D1900912E34 /* GPUImageGrayscaleFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGrayscaleFilter.m; path = Source/GPUImageGrayscaleFilter.m; sourceTree = SOURCE_ROOT; }; BCF867E21727903C00912E34 /* GPUImageKuwaharaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageKuwaharaFilter.h; path = Source/GPUImageKuwaharaFilter.h; sourceTree = SOURCE_ROOT; }; BCF867E31727903D00912E34 /* GPUImageKuwaharaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageKuwaharaFilter.m; path = Source/GPUImageKuwaharaFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867E61728477200912E34 /* GPUImageFalseColorFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFalseColorFilter.h; path = Source/GPUImageFalseColorFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867E71728477200912E34 /* GPUImageFalseColorFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFalseColorFilter.m; path = Source/GPUImageFalseColorFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867EA172847A000912E34 /* GPUImageSharpenFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSharpenFilter.h; path = Source/GPUImageSharpenFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867EB172847A000912E34 /* GPUImageSharpenFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSharpenFilter.m; path = Source/GPUImageSharpenFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867EE1728487000912E34 /* GPUImageUnsharpMaskFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageUnsharpMaskFilter.h; path = Source/GPUImageUnsharpMaskFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867EF1728487000912E34 /* GPUImageUnsharpMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageUnsharpMaskFilter.m; path = Source/GPUImageUnsharpMaskFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867F21728490300912E34 /* GPUImageTwoInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputFilter.h; path = Source/GPUImageTwoInputFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867F31728490500912E34 /* GPUImageTwoInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputFilter.m; path = Source/GPUImageTwoInputFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867F61728494B00912E34 /* GPUImageGaussianBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGaussianBlurFilter.h; path = Source/GPUImageGaussianBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867F71728494B00912E34 /* GPUImageGaussianBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianBlurFilter.m; path = Source/GPUImageGaussianBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867FA1728496A00912E34 /* GPUImageTwoPassTextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoPassTextureSamplingFilter.h; path = Source/GPUImageTwoPassTextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; + BCF867FB1728496C00912E34 /* GPUImageTwoPassTextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoPassTextureSamplingFilter.m; path = Source/GPUImageTwoPassTextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; + BCF867FE17284C3C00912E34 /* GPUImageFilterGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFilterGroup.h; path = Source/GPUImageFilterGroup.h; sourceTree = SOURCE_ROOT; }; + BCF867FF17284C3E00912E34 /* GPUImageFilterGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFilterGroup.m; path = Source/GPUImageFilterGroup.m; sourceTree = SOURCE_ROOT; }; + BCF8680217284CFB00912E34 /* GPUImageTransformFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTransformFilter.h; path = Source/GPUImageTransformFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8680317284CFB00912E34 /* GPUImageTransformFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTransformFilter.m; path = Source/GPUImageTransformFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8680617284D0A00912E34 /* GPUImageCropFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCropFilter.h; path = Source/GPUImageCropFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8680717284D0A00912E34 /* GPUImageCropFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCropFilter.m; path = Source/GPUImageCropFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8680C172853A500912E34 /* GPUImageGaussianBlurPositionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGaussianBlurPositionFilter.h; path = Source/GPUImageGaussianBlurPositionFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8680D172853A600912E34 /* GPUImageGaussianBlurPositionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianBlurPositionFilter.m; path = Source/GPUImageGaussianBlurPositionFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8680E172853A700912E34 /* GPUImageGaussianSelectiveBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGaussianSelectiveBlurFilter.h; path = Source/GPUImageGaussianSelectiveBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8680F172853A800912E34 /* GPUImageGaussianSelectiveBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianSelectiveBlurFilter.m; path = Source/GPUImageGaussianSelectiveBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCF86814172854AA00912E34 /* GPUImageBilateralFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBilateralFilter.h; path = Source/GPUImageBilateralFilter.h; sourceTree = SOURCE_ROOT; }; + BCF86815172854AC00912E34 /* GPUImageBilateralFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBilateralFilter.m; path = Source/GPUImageBilateralFilter.m; sourceTree = SOURCE_ROOT; }; + BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBoxBlurFilter.h; path = Source/GPUImageBoxBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBoxBlurFilter.m; path = Source/GPUImageBoxBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFastBlurFilter.h; path = Source/GPUImageFastBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCF86819172854B500912E34 /* GPUImageFastBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFastBlurFilter.m; path = Source/GPUImageFastBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8681A172854B600912E34 /* GPUImageMedianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMedianFilter.h; path = Source/GPUImageMedianFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8681B172854B800912E34 /* GPUImageMedianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMedianFilter.m; path = Source/GPUImageMedianFilter.m; sourceTree = SOURCE_ROOT; }; + BCF86824172857AD00912E34 /* GPUImageMotionBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMotionBlurFilter.h; path = Source/GPUImageMotionBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCF86825172857B000912E34 /* GPUImageMotionBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMotionBlurFilter.m; path = Source/GPUImageMotionBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCF86826172857B200912E34 /* GPUImageZoomBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageZoomBlurFilter.h; path = Source/GPUImageZoomBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCF86827172857B600912E34 /* GPUImageZoomBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageZoomBlurFilter.m; path = Source/GPUImageZoomBlurFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -229,8 +297,14 @@ children = ( BCF40F1E17248322005AE36A /* GPUImageFilter.h */, BCF40F1F17248322005AE36A /* GPUImageFilter.m */, + BCF867FE17284C3C00912E34 /* GPUImageFilterGroup.h */, + BCF867FF17284C3E00912E34 /* GPUImageFilterGroup.m */, BCF867DA17278C5800912E34 /* GPUImageTwoPassFilter.h */, BCF867DB17278C5900912E34 /* GPUImageTwoPassFilter.m */, + BCF867FA1728496A00912E34 /* GPUImageTwoPassTextureSamplingFilter.h */, + BCF867FB1728496C00912E34 /* GPUImageTwoPassTextureSamplingFilter.m */, + BCF867F21728490300912E34 /* GPUImageTwoInputFilter.h */, + BCF867F31728490500912E34 /* GPUImageTwoInputFilter.m */, BCF867C9172788F100912E34 /* GPUImage3x3TextureSamplingFilter.h */, BCF867CA172788F100912E34 /* GPUImage3x3TextureSamplingFilter.m */, BCF867C31727820100912E34 /* Color processing */, @@ -274,6 +348,8 @@ BCF867BC1727794000912E34 /* GPUImageMonochromeFilter.m */, BCF867DE17278D1900912E34 /* GPUImageGrayscaleFilter.h */, BCF867DF17278D1900912E34 /* GPUImageGrayscaleFilter.m */, + BCF867E61728477200912E34 /* GPUImageFalseColorFilter.h */, + BCF867E71728477200912E34 /* GPUImageFalseColorFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -296,8 +372,34 @@ BCF867D1172789C800912E34 /* Image processing */ = { isa = PBXGroup; children = ( + BCF8680217284CFB00912E34 /* GPUImageTransformFilter.h */, + BCF8680317284CFB00912E34 /* GPUImageTransformFilter.m */, + BCF8680617284D0A00912E34 /* GPUImageCropFilter.h */, + BCF8680717284D0A00912E34 /* GPUImageCropFilter.m */, BCF867D217278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.h */, BCF867D317278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.m */, + BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */, + BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */, + BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */, + BCF86819172854B500912E34 /* GPUImageFastBlurFilter.m */, + BCF867F61728494B00912E34 /* GPUImageGaussianBlurFilter.h */, + BCF867F71728494B00912E34 /* GPUImageGaussianBlurFilter.m */, + BCF8680E172853A700912E34 /* GPUImageGaussianSelectiveBlurFilter.h */, + BCF8680F172853A800912E34 /* GPUImageGaussianSelectiveBlurFilter.m */, + BCF8680C172853A500912E34 /* GPUImageGaussianBlurPositionFilter.h */, + BCF8680D172853A600912E34 /* GPUImageGaussianBlurPositionFilter.m */, + BCF8681A172854B600912E34 /* GPUImageMedianFilter.h */, + BCF8681B172854B800912E34 /* GPUImageMedianFilter.m */, + BCF86814172854AA00912E34 /* GPUImageBilateralFilter.h */, + BCF86815172854AC00912E34 /* GPUImageBilateralFilter.m */, + BCF867EA172847A000912E34 /* GPUImageSharpenFilter.h */, + BCF867EB172847A000912E34 /* GPUImageSharpenFilter.m */, + BCF867EE1728487000912E34 /* GPUImageUnsharpMaskFilter.h */, + BCF867EF1728487000912E34 /* GPUImageUnsharpMaskFilter.m */, + BCF86824172857AD00912E34 /* GPUImageMotionBlurFilter.h */, + BCF86825172857B000912E34 /* GPUImageMotionBlurFilter.m */, + BCF86826172857B200912E34 /* GPUImageZoomBlurFilter.h */, + BCF86827172857B600912E34 /* GPUImageZoomBlurFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -335,6 +437,23 @@ BCF867DC17278C5A00912E34 /* GPUImageTwoPassFilter.h in Headers */, BCF867E017278D1900912E34 /* GPUImageGrayscaleFilter.h in Headers */, BCF867E41727903D00912E34 /* GPUImageKuwaharaFilter.h in Headers */, + BCF867E81728477300912E34 /* GPUImageFalseColorFilter.h in Headers */, + BCF867EC172847A000912E34 /* GPUImageSharpenFilter.h in Headers */, + BCF867F01728487100912E34 /* GPUImageUnsharpMaskFilter.h in Headers */, + BCF867F41728490600912E34 /* GPUImageTwoInputFilter.h in Headers */, + BCF867F81728494C00912E34 /* GPUImageGaussianBlurFilter.h in Headers */, + BCF867FC1728496E00912E34 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */, + BCF8680017284C4000912E34 /* GPUImageFilterGroup.h in Headers */, + BCF8680417284CFC00912E34 /* GPUImageTransformFilter.h in Headers */, + BCF8680817284D0B00912E34 /* GPUImageCropFilter.h in Headers */, + BCF86810172853AA00912E34 /* GPUImageGaussianBlurPositionFilter.h in Headers */, + BCF86812172853AA00912E34 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */, + BCF8681C172854B900912E34 /* GPUImageBilateralFilter.h in Headers */, + BCF8681E172854B900912E34 /* GPUImageBoxBlurFilter.h in Headers */, + BCF86820172854B900912E34 /* GPUImageFastBlurFilter.h in Headers */, + BCF86822172854B900912E34 /* GPUImageMedianFilter.h in Headers */, + BCF86828172857B900912E34 /* GPUImageMotionBlurFilter.h in Headers */, + BCF8682A172857B900912E34 /* GPUImageZoomBlurFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -425,6 +544,23 @@ BCF867DD17278C5A00912E34 /* GPUImageTwoPassFilter.m in Sources */, BCF867E117278D1900912E34 /* GPUImageGrayscaleFilter.m in Sources */, BCF867E51727903D00912E34 /* GPUImageKuwaharaFilter.m in Sources */, + BCF867E91728477300912E34 /* GPUImageFalseColorFilter.m in Sources */, + BCF867ED172847A000912E34 /* GPUImageSharpenFilter.m in Sources */, + BCF867F11728487100912E34 /* GPUImageUnsharpMaskFilter.m in Sources */, + BCF867F51728490600912E34 /* GPUImageTwoInputFilter.m in Sources */, + BCF867F91728494C00912E34 /* GPUImageGaussianBlurFilter.m in Sources */, + BCF867FD1728496E00912E34 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */, + BCF8680117284C4000912E34 /* GPUImageFilterGroup.m in Sources */, + BCF8680517284CFC00912E34 /* GPUImageTransformFilter.m in Sources */, + BCF8680917284D0B00912E34 /* GPUImageCropFilter.m in Sources */, + BCF86811172853AA00912E34 /* GPUImageGaussianBlurPositionFilter.m in Sources */, + BCF86813172853AA00912E34 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */, + BCF8681D172854B900912E34 /* GPUImageBilateralFilter.m in Sources */, + BCF8681F172854B900912E34 /* GPUImageBoxBlurFilter.m in Sources */, + BCF86821172854B900912E34 /* GPUImageFastBlurFilter.m in Sources */, + BCF86823172854B900912E34 /* GPUImageMedianFilter.m in Sources */, + BCF86829172857B900912E34 /* GPUImageMotionBlurFilter.m in Sources */, + BCF8682B172857B900912E34 /* GPUImageZoomBlurFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m index e64ae0e48..dd7deaf4c 100644 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -1,5 +1,6 @@ #import "GPUImageBilateralFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageBilateralFilterFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -75,6 +76,83 @@ void main() gl_FragColor = sum / gaussianWeightTotal; } ); +#else +NSString *const kGPUImageBilateralFilterFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + const int GAUSSIAN_SAMPLES = 9; + + varying vec2 textureCoordinate; + varying vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + uniform float distanceNormalizationFactor; + + void main() + { + vec4 centralColor; + float gaussianWeightTotal; + vec4 sum; + vec4 sampleColor; + float distanceFromCentralColor; + float gaussianWeight; + + centralColor = texture2D(inputImageTexture, blurCoordinates[4]); + gaussianWeightTotal = 0.18; + sum = centralColor * 0.18; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[1]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[2]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[3]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[5]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[6]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[7]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + sampleColor = texture2D(inputImageTexture, blurCoordinates[8]); + distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); + gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); + gaussianWeightTotal += gaussianWeight; + sum += sampleColor * gaussianWeight; + + gl_FragColor = sum / gaussianWeightTotal; + } +); +#endif @implementation GPUImageBilateralFilter diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index d0de040bc..e6a984ea0 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -29,7 +29,7 @@ void main() } ); - +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageBoxBlurFragmentShaderString = SHADER_STRING ( precision highp float; @@ -53,6 +53,29 @@ void main() gl_FragColor = fragmentColor; } ); +#else +NSString *const kGPUImageBoxBlurFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; + + void main() + { + vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2; + fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.2; + fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.2; + fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.2; + fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.2; + + gl_FragColor = fragmentColor; + } +); +#endif @implementation GPUImageBoxBlurFilter diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 58f3daf8b..43381b33d 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -2,7 +2,7 @@ NSString *const kGPUImageCropFragmentShaderString = SHADER_STRING ( - varying highp vec2 textureCoordinate; + varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m index 475313eab..f514dbab7 100644 --- a/framework/Source/GPUImageFalseColorFilter.m +++ b/framework/Source/GPUImageFalseColorFilter.m @@ -1,5 +1,6 @@ #import "GPUImageFalseColorFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUFalseColorFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -21,6 +22,28 @@ void main() gl_FragColor = vec4( mix(firstColor.rgb, secondColor.rgb, luminance), textureColor.a); } ); +#else +NSString *const kGPUFalseColorFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float intensity; + uniform vec3 firstColor; + uniform vec3 secondColor; + + const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, luminanceWeighting); + + gl_FragColor = vec4( mix(firstColor.rgb, secondColor.rgb, luminance), textureColor.a); + } +); +#endif + @implementation GPUImageFalseColorFilter diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index 2eb39ac15..7d09abcc1 100755 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -7,14 +7,14 @@ attribute vec4 position; attribute vec2 inputTextureCoordinate; - uniform highp float texelWidthOffset; - uniform highp float texelHeightOffset; + uniform float texelWidthOffset; + uniform float texelHeightOffset; - varying highp vec2 centerTextureCoordinate; - varying highp vec2 oneStepLeftTextureCoordinate; - varying highp vec2 twoStepsLeftTextureCoordinate; - varying highp vec2 oneStepRightTextureCoordinate; - varying highp vec2 twoStepsRightTextureCoordinate; + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; // const float offset[3] = float[]( 0.0, 1.3846153846, 3.2307692308 ); @@ -33,7 +33,7 @@ void main() } ); - +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageFastBlurFragmentShaderString = SHADER_STRING ( precision highp float; @@ -85,6 +85,55 @@ void main() gl_FragColor = vec4(fragmentColor, 1.0); } ); +#else +NSString *const kGPUImageFastBlurFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; + + // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); + + void main() + { + vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2270270270; + fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.0702702703; + fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.0702702703; + + gl_FragColor = fragmentColor; + } +); + +NSString *const kGPUImageFastBlurIgnoringAlphaFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; + + // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); + + void main() + { + vec3 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).rgb * 0.2270270270; + fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate).rgb * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate).rgb * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate).rgb * 0.0702702703; + fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate).rgb * 0.0702702703; + + gl_FragColor = vec4(fragmentColor, 1.0); + } +); +#endif @implementation GPUImageFastBlurFilter diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index eaec2ea65..cbad532df 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -5,24 +5,26 @@ attribute vec4 position; attribute vec4 inputTextureCoordinate; - const lowp int GAUSSIAN_SAMPLES = 9; + const int GAUSSIAN_SAMPLES = 9; - uniform highp float texelWidthOffset; - uniform highp float texelHeightOffset; + uniform float texelWidthOffset; + uniform float texelHeightOffset; - varying highp vec2 textureCoordinate; - varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + varying vec2 textureCoordinate; + varying vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - void main() { + void main() + { gl_Position = position; textureCoordinate = inputTextureCoordinate.xy; // Calculate the positions for the blur int multiplier = 0; - highp vec2 blurStep; - highp vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset); + vec2 blurStep; + vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset); - for (lowp int i = 0; i < GAUSSIAN_SAMPLES; i++) { + for (int i = 0; i < GAUSSIAN_SAMPLES; i++) + { multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2)); // Blur in x (horizontal) blurStep = float(multiplier) * singleStepOffset; @@ -31,6 +33,7 @@ void main() { } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageGaussianBlurFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -40,7 +43,8 @@ void main() { varying highp vec2 textureCoordinate; varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - void main() { + void main() + { lowp vec4 sum = vec4(0.0); sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; @@ -56,6 +60,34 @@ void main() { gl_FragColor = sum; } ); +#else +NSString *const kGPUImageGaussianBlurFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + const int GAUSSIAN_SAMPLES = 9; + + varying vec2 textureCoordinate; + varying vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + void main() + { + vec4 sum = vec4(0.0); + + sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; + sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; + sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; + + gl_FragColor = sum; + } +); +#endif @implementation GPUImageGaussianBlurFilter diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.m b/framework/Source/GPUImageGaussianBlurPositionFilter.m index 6b16afecc..26bd38af2 100755 --- a/framework/Source/GPUImageGaussianBlurPositionFilter.m +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.m @@ -5,23 +5,24 @@ attribute vec4 position; attribute vec4 inputTextureCoordinate; - const lowp int GAUSSIAN_SAMPLES = 9; + const int GAUSSIAN_SAMPLES = 9; - uniform highp float texelWidthOffset; - uniform highp float texelHeightOffset; - varying highp vec2 textureCoordinate; - varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + uniform float texelWidthOffset; + uniform float texelHeightOffset; + varying vec2 textureCoordinate; + varying vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - void main() { + void main() + { gl_Position = position; textureCoordinate = inputTextureCoordinate.xy; // Calculate the positions for the blur int multiplier = 0; - highp vec2 blurStep; - highp vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset); + vec2 blurStep; + vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset); - for (lowp int i = 0; i < GAUSSIAN_SAMPLES; i++) { + for (int i = 0; i < GAUSSIAN_SAMPLES; i++) { multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2)); // Blur in x (horizontal) blurStep = float(multiplier) * singleStepOffset; @@ -30,6 +31,7 @@ void main() { } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageGaussianBlurPositionFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -69,6 +71,48 @@ void main() { } } ); +#else +NSString *const kGPUImageGaussianBlurPositionFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + const int GAUSSIAN_SAMPLES = 9; + + varying vec2 textureCoordinate; + varying vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + uniform float aspectRatio; + uniform vec2 blurCenter; + uniform float blurRadius; + + void main() + { + vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float dist = distance(blurCenter, textureCoordinateToUse); + + if (dist < blurRadius) + { + vec4 sum = vec4(0.0); + + sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; + sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; + sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; + sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; + sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; + sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; + + gl_FragColor = sum; + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate); + } + } +); +#endif @interface GPUImageGaussianBlurPositionFilter () diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index 98c478568..7bf419a06 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -2,6 +2,7 @@ #import "GPUImageGaussianBlurFilter.h" #import "GPUImageTwoInputFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageGaussianSelectiveBlurFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -26,6 +27,32 @@ void main() gl_FragColor = mix(sharpImageColor, blurredImageColor, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, distanceFromCenter)); } ); +#else +NSString *const kGPUImageGaussianSelectiveBlurFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform float excludeCircleRadius; + uniform vec2 excludeCirclePoint; + uniform float excludeBlurSize; + uniform float aspectRatio; + + void main() + { + vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); + vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); + + vec2 textureCoordinateToUse = vec2(textureCoordinate2.x, (textureCoordinate2.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float distanceFromCenter = distance(excludeCirclePoint, textureCoordinateToUse); + + gl_FragColor = mix(sharpImageColor, blurredImageColor, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, distanceFromCenter)); + } +); +#endif @implementation GPUImageGaussianSelectiveBlurFilter diff --git a/framework/Source/GPUImageMedianFilter.m b/framework/Source/GPUImageMedianFilter.m index efcab7248..78c118057 100644 --- a/framework/Source/GPUImageMedianFilter.m +++ b/framework/Source/GPUImageMedianFilter.m @@ -40,6 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageMedianFragmentShaderString = SHADER_STRING ( precision highp float; @@ -98,6 +99,64 @@ void main() gl_FragColor = vec4(v[4], 1.0); } ); +#else +NSString *const kGPUImageMedianFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + +#define s2(a, b) temp = a; a = min(a, b); b = max(temp, b); +#define mn3(a, b, c) s2(a, b); s2(a, c); +#define mx3(a, b, c) s2(b, c); s2(a, c); + +#define mnmx3(a, b, c) mx3(a, b, c); s2(a, b); // 3 exchanges +#define mnmx4(a, b, c, d) s2(a, b); s2(c, d); s2(a, c); s2(b, d); // 4 exchanges +#define mnmx5(a, b, c, d, e) s2(a, b); s2(c, d); mn3(a, c, e); mx3(b, d, e); // 6 exchanges +#define mnmx6(a, b, c, d, e, f) s2(a, d); s2(b, e); s2(c, f); mn3(a, b, c); mx3(d, e, f); // 7 exchanges + + void main() + { + vec3 v[6]; + + v[0] = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb; + v[1] = texture2D(inputImageTexture, topRightTextureCoordinate).rgb; + v[2] = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb; + v[3] = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb; + v[4] = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + v[5] = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + // v[6] = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + // v[7] = texture2D(inputImageTexture, topTextureCoordinate).rgb; + vec3 temp; + + mnmx6(v[0], v[1], v[2], v[3], v[4], v[5]); + + v[5] = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + + mnmx5(v[1], v[2], v[3], v[4], v[5]); + + v[5] = texture2D(inputImageTexture, topTextureCoordinate).rgb; + + mnmx4(v[2], v[3], v[4], v[5]); + + v[5] = texture2D(inputImageTexture, textureCoordinate).rgb; + + mnmx3(v[3], v[4], v[5]); + + gl_FragColor = vec4(v[4], 1.0); + } +); +#endif @implementation GPUImageMedianFilter diff --git a/framework/Source/GPUImageMotionBlurFilter.m b/framework/Source/GPUImageMotionBlurFilter.m index 3a9d8d13b..5a2c20b67 100644 --- a/framework/Source/GPUImageMotionBlurFilter.m +++ b/framework/Source/GPUImageMotionBlurFilter.m @@ -6,7 +6,7 @@ attribute vec4 position; attribute vec4 inputTextureCoordinate; - uniform highp vec2 directionalTexelStep; + uniform vec2 directionalTexelStep; varying vec2 textureCoordinate; varying vec2 oneStepBackTextureCoordinate; @@ -34,6 +34,7 @@ void main() } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageMotionBlurFragmentShaderString = SHADER_STRING ( precision highp float; @@ -76,6 +77,48 @@ void main() gl_FragColor = fragmentColor; } ); +#else +NSString *const kGPUImageMotionBlurFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 textureCoordinate; + varying vec2 oneStepBackTextureCoordinate; + varying vec2 twoStepsBackTextureCoordinate; + varying vec2 threeStepsBackTextureCoordinate; + varying vec2 fourStepsBackTextureCoordinate; + varying vec2 oneStepForwardTextureCoordinate; + varying vec2 twoStepsForwardTextureCoordinate; + varying vec2 threeStepsForwardTextureCoordinate; + varying vec2 fourStepsForwardTextureCoordinate; + + void main() + { + // Box weights + // vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.1111111; + // fragmentColor += texture2D(inputImageTexture, oneStepBackTextureCoordinate) * 0.1111111; + // fragmentColor += texture2D(inputImageTexture, twoStepsBackTextureCoordinate) * 0.1111111; + // fragmentColor += texture2D(inputImageTexture, threeStepsBackTextureCoordinate) * 0.1111111; + // fragmentColor += texture2D(inputImageTexture, fourStepsBackTextureCoordinate) * 0.1111111; + // fragmentColor += texture2D(inputImageTexture, oneStepForwardTextureCoordinate) * 0.1111111; + // fragmentColor += texture2D(inputImageTexture, twoStepsForwardTextureCoordinate) * 0.1111111; + // fragmentColor += texture2D(inputImageTexture, threeStepsForwardTextureCoordinate) * 0.1111111; + // fragmentColor += texture2D(inputImageTexture, fourStepsForwardTextureCoordinate) * 0.1111111; + + vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.18; + fragmentColor += texture2D(inputImageTexture, oneStepBackTextureCoordinate) * 0.15; + fragmentColor += texture2D(inputImageTexture, twoStepsBackTextureCoordinate) * 0.12; + fragmentColor += texture2D(inputImageTexture, threeStepsBackTextureCoordinate) * 0.09; + fragmentColor += texture2D(inputImageTexture, fourStepsBackTextureCoordinate) * 0.05; + fragmentColor += texture2D(inputImageTexture, oneStepForwardTextureCoordinate) * 0.15; + fragmentColor += texture2D(inputImageTexture, twoStepsForwardTextureCoordinate) * 0.12; + fragmentColor += texture2D(inputImageTexture, threeStepsForwardTextureCoordinate) * 0.09; + fragmentColor += texture2D(inputImageTexture, fourStepsForwardTextureCoordinate) * 0.05; + + gl_FragColor = fragmentColor; + } +); +#endif @interface GPUImageMotionBlurFilter() { diff --git a/framework/Source/GPUImageSharpenFilter.m b/framework/Source/GPUImageSharpenFilter.m index 54bbabfd1..6d7367a94 100755 --- a/framework/Source/GPUImageSharpenFilter.m +++ b/framework/Source/GPUImageSharpenFilter.m @@ -22,8 +22,8 @@ void main() { gl_Position = position; - mediump vec2 widthStep = vec2(imageWidthFactor, 0.0); - mediump vec2 heightStep = vec2(0.0, imageHeightFactor); + vec2 widthStep = vec2(imageWidthFactor, 0.0); + vec2 heightStep = vec2(0.0, imageHeightFactor); textureCoordinate = inputTextureCoordinate.xy; leftTextureCoordinate = inputTextureCoordinate.xy - widthStep; @@ -34,8 +34,10 @@ void main() centerMultiplier = 1.0 + 4.0 * sharpness; edgeMultiplier = sharpness; } - ); +); + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSharpenFragmentShaderString = SHADER_STRING ( precision highp float; @@ -62,6 +64,33 @@ void main() gl_FragColor = vec4((textureColor * centerMultiplier - (leftTextureColor * edgeMultiplier + rightTextureColor * edgeMultiplier + topTextureColor * edgeMultiplier + bottomTextureColor * edgeMultiplier)), texture2D(inputImageTexture, bottomTextureCoordinate).w); } ); +#else +NSString *const kGPUImageSharpenFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + varying vec2 topTextureCoordinate; + varying vec2 bottomTextureCoordinate; + + varying float centerMultiplier; + varying float edgeMultiplier; + + uniform sampler2D inputImageTexture; + + void main() + { + vec3 textureColor = texture2D(inputImageTexture, textureCoordinate).rgb; + vec3 leftTextureColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + vec3 rightTextureColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + vec3 topTextureColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; + vec3 bottomTextureColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + + gl_FragColor = vec4((textureColor * centerMultiplier - (leftTextureColor * edgeMultiplier + rightTextureColor * edgeMultiplier + topTextureColor * edgeMultiplier + bottomTextureColor * edgeMultiplier)), texture2D(inputImageTexture, bottomTextureCoordinate).w); + } +); +#endif + @implementation GPUImageSharpenFilter diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index d60274eaf..6cbc5eb69 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -2,13 +2,13 @@ NSString *const kGPUImageTransformVertexShaderString = SHADER_STRING ( - attribute highp vec4 position; - attribute highp vec4 inputTextureCoordinate; + attribute vec4 position; + attribute vec4 inputTextureCoordinate; uniform mat4 transformMatrix; uniform mat4 orthographicMatrix; - varying highp vec2 textureCoordinate; + varying vec2 textureCoordinate; void main() { diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 9954f6aeb..b4a5d9dc3 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -15,7 +15,7 @@ void main() textureCoordinate = inputTextureCoordinate.xy; textureCoordinate2 = inputTextureCoordinate2.xy; } - ); +); @implementation GPUImageTwoInputFilter diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index 64765558d..169b5e737 100755 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -3,6 +3,7 @@ #import "GPUImageTwoInputFilter.h" #import "GPUImageGaussianBlurFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageUnsharpMaskFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -23,6 +24,28 @@ void main() // gl_FragColor = vec4(sharpImageColor.rgb - (blurredImageColor.rgb * intensity), 1.0); } ); +#else +NSString *const kGPUImageUnsharpMaskFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform float intensity; + + void main() + { + vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); + vec3 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2).rgb; + + gl_FragColor = vec4(sharpImageColor.rgb * intensity + blurredImageColor * (1.0 - intensity), sharpImageColor.a); + // gl_FragColor = mix(blurredImageColor, sharpImageColor, intensity); + // gl_FragColor = vec4(sharpImageColor.rgb - (blurredImageColor.rgb * intensity), 1.0); + } +); +#endif @implementation GPUImageUnsharpMaskFilter diff --git a/framework/Source/GPUImageZoomBlurFilter.m b/framework/Source/GPUImageZoomBlurFilter.m index 6a570e1c0..2ae849344 100644 --- a/framework/Source/GPUImageZoomBlurFilter.m +++ b/framework/Source/GPUImageZoomBlurFilter.m @@ -1,5 +1,6 @@ #import "GPUImageZoomBlurFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageZoomBlurFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -27,6 +28,35 @@ void main() gl_FragColor = fragmentColor; } ); +#else +NSString *const kGPUImageZoomBlurFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform vec2 blurCenter; + uniform float blurSize; + + void main() + { + // TODO: Do a more intelligent scaling based on resolution here + vec2 samplingOffset = 1.0/100.0 * (blurCenter - textureCoordinate) * blurSize; + + vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.18; + fragmentColor += texture2D(inputImageTexture, textureCoordinate + samplingOffset) * 0.15; + fragmentColor += texture2D(inputImageTexture, textureCoordinate + (2.0 * samplingOffset)) * 0.12; + fragmentColor += texture2D(inputImageTexture, textureCoordinate + (3.0 * samplingOffset)) * 0.09; + fragmentColor += texture2D(inputImageTexture, textureCoordinate + (4.0 * samplingOffset)) * 0.05; + fragmentColor += texture2D(inputImageTexture, textureCoordinate - samplingOffset) * 0.15; + fragmentColor += texture2D(inputImageTexture, textureCoordinate - (2.0 * samplingOffset)) * 0.12; + fragmentColor += texture2D(inputImageTexture, textureCoordinate - (3.0 * samplingOffset)) * 0.09; + fragmentColor += texture2D(inputImageTexture, textureCoordinate - (4.0 * samplingOffset)) * 0.05; + + gl_FragColor = fragmentColor; + } +); +#endif @interface GPUImageZoomBlurFilter() { diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 908cf2629..dd87289c0 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -28,6 +28,23 @@ #import #import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import // Outputs #import diff --git a/framework/Source/Mac/GPUImageAVCamera.m b/framework/Source/Mac/GPUImageAVCamera.m index 58a1d7720..37ca34158 100644 --- a/framework/Source/Mac/GPUImageAVCamera.m +++ b/framework/Source/Mac/GPUImageAVCamera.m @@ -557,6 +557,8 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); totalFrameTimeDuringCapture += currentFrameTime; + NSLog(@"Average frame time : %f ms", [self averageFrameDurationDuringCapture]); + NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); } } } From d10bd9e3f0bebefdb7a21cdbb549b557d12e2c41 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 24 Apr 2013 16:36:40 -0500 Subject: [PATCH 361/695] Ported the blend filters to the Mac. --- .../FilterShowcase.xcodeproj/project.pbxproj | 8 + .../SLSFilterShowcaseWindowController.h | 27 +- .../SLSFilterShowcaseWindowController.m | 264 +++++++++++++++++- .../ShowcaseFilterViewController.m | 1 - .../GPUImageMac.xcodeproj/project.pbxproj | 232 +++++++++++++++ framework/Source/GPUImageAddBlendFilter.m | 44 ++- framework/Source/GPUImageAlphaBlendFilter.m | 22 +- .../Source/GPUImageChromaKeyBlendFilter.m | 34 ++- framework/Source/GPUImageColorBlendFilter.m | 50 +++- .../Source/GPUImageColorBurnBlendFilter.m | 19 ++ .../Source/GPUImageColorDodgeBlendFilter.m | 29 ++ framework/Source/GPUImageDarkenBlendFilter.m | 19 ++ .../Source/GPUImageDifferenceBlendFilter.m | 18 ++ .../Source/GPUImageDissolveBlendFilter.m | 20 ++ framework/Source/GPUImageDivideBlendFilter.m | 41 +++ .../Source/GPUImageExclusionBlendFilter.m | 21 ++ .../Source/GPUImageHardLightBlendFilter.m | 42 +++ framework/Source/GPUImageHueBlendFilter.m | 101 ++++++- framework/Source/GPUImageLightenBlendFilter.m | 19 ++ .../Source/GPUImageLinearBurnBlendFilter.m | 21 +- .../Source/GPUImageLuminosityBlendFilter.m | 50 +++- framework/Source/GPUImageMaskFilter.m | 29 +- .../Source/GPUImageMultiplyBlendFilter.m | 19 ++ framework/Source/GPUImageNormalBlendFilter.m | 34 ++- framework/Source/GPUImageOpacityFilter.m | 19 +- framework/Source/GPUImageOverlayBlendFilter.m | 40 +++ framework/Source/GPUImagePoissonBlendFilter.m | 52 ++++ .../Source/GPUImageSaturationBlendFilter.m | 100 ++++++- framework/Source/GPUImageScreenBlendFilter.m | 19 ++ .../Source/GPUImageSoftLightBlendFilter.m | 19 ++ .../Source/GPUImageSourceOverBlendFilter.m | 19 ++ .../Source/GPUImageSubtractBlendFilter.m | 21 +- ...UImageTwoInputCrossTextureSamplingFilter.m | 4 +- framework/Source/Mac/GPUImage.h | 27 ++ 34 files changed, 1466 insertions(+), 18 deletions(-) diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 8fbbfefd9..8592ff621 100644 --- a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -18,6 +18,8 @@ BCF8679A1726410E00912E34 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8678F17263F3500912E34 /* GPUImage.framework */; }; BCF867A1172762B500912E34 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867A0172762B500912E34 /* AVFoundation.framework */; }; BCF8680B17284D6A00912E34 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8680A17284D6A00912E34 /* QuartzCore.framework */; }; + BCF868881728790500912E34 /* Lambeau.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCF868871728790500912E34 /* Lambeau.jpg */; }; + BCF8688A1728791300912E34 /* mask.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF868891728791300912E34 /* mask.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -57,6 +59,8 @@ BCF8679517263FCF00912E34 /* SLSFilterShowcaseWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = SLSFilterShowcaseWindowController.xib; path = ../SLSFilterShowcaseWindowController.xib; sourceTree = ""; }; BCF867A0172762B500912E34 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCF8680A17284D6A00912E34 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + BCF868871728790500912E34 /* Lambeau.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = Lambeau.jpg; path = ../../../iOS/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg; sourceTree = ""; }; + BCF868891728791300912E34 /* mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mask.png; path = ../../../iOS/FilterShowcase/FilterShowcase/mask.png; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -130,6 +134,8 @@ BCF8677417263EAC00912E34 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCF868891728791300912E34 /* mask.png */, + BCF868871728790500912E34 /* Lambeau.jpg */, BCF8677517263EAC00912E34 /* FilterShowcase-Info.plist */, BCF8677617263EAC00912E34 /* InfoPlist.strings */, BCF8677917263EAC00912E34 /* main.m */, @@ -220,6 +226,8 @@ BCF8677E17263EAC00912E34 /* Credits.rtf in Resources */, BCF8678417263EAD00912E34 /* MainMenu.xib in Resources */, BCF8679717263FCF00912E34 /* SLSFilterShowcaseWindowController.xib in Resources */, + BCF868881728790500912E34 /* Lambeau.jpg in Resources */, + BCF8688A1728791300912E34 /* mask.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index acaf3e69c..7f1af9aa9 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -17,6 +17,7 @@ typedef enum { GPUIMAGE_TRANSFORM, GPUIMAGE_TRANSFORM3D, GPUIMAGE_CROP, + GPUIMAGE_MASK, GPUIMAGE_PIXELLATE, GPUIMAGE_GRAYSCALE, GPUIMAGE_SOBELEDGEDETECTION, @@ -24,7 +25,6 @@ typedef enum { GPUIMAGE_TOON, GPUIMAGE_KUWAHARA, GPUIMAGE_GAUSSIAN, - GPUIMAGE_GAUSSIAN_SELECTIVE, GPUIMAGE_GAUSSIAN_POSITION, GPUIMAGE_FASTBLUR, @@ -33,6 +33,30 @@ typedef enum { GPUIMAGE_BILATERAL, GPUIMAGE_MOTIONBLUR, GPUIMAGE_ZOOMBLUR, + GPUIMAGE_DISSOLVE, + GPUIMAGE_CHROMAKEY, + GPUIMAGE_ADD, + GPUIMAGE_DIVIDE, + GPUIMAGE_MULTIPLY, + GPUIMAGE_OVERLAY, + GPUIMAGE_LIGHTEN, + GPUIMAGE_DARKEN, + GPUIMAGE_COLORBURN, + GPUIMAGE_COLORDODGE, + GPUIMAGE_LINEARBURN, + GPUIMAGE_SCREENBLEND, + GPUIMAGE_DIFFERENCEBLEND, + GPUIMAGE_SUBTRACTBLEND, + GPUIMAGE_EXCLUSIONBLEND, + GPUIMAGE_HARDLIGHTBLEND, + GPUIMAGE_SOFTLIGHTBLEND, + GPUIMAGE_COLORBLEND, + GPUIMAGE_HUEBLEND, + GPUIMAGE_SATURATIONBLEND, + GPUIMAGE_LUMINOSITYBLEND, + GPUIMAGE_NORMALBLEND, + GPUIMAGE_POISSONBLEND, + GPUIMAGE_OPACITY, GPUIMAGE_NUMFILTERS } GPUImageShowcaseFilterType; @@ -41,6 +65,7 @@ typedef enum { { GPUImageOutput *currentlySelectedFilter; GPUImageAVCamera *inputCamera; + GPUImagePicture *imageForBlending; NSUInteger currentlySelectedRow; } diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 202bf2458..5854ff540 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -47,10 +47,12 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; } currentlySelectedRow = newRowIndex; - + BOOL needsSecondImage = NO; + if (currentlySelectedFilter != nil) { [inputCamera removeAllTargets]; + [imageForBlending removeAllTargets]; // Disconnect older filter before replacing with new one [currentlySelectedFilter removeAllTargets]; currentlySelectedFilter = nil; @@ -198,6 +200,13 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 0.5; self.enableSlider = YES; }; break; + case GPUIMAGE_MASK: + { + currentlySelectedFilter = [[GPUImageMaskFilter alloc] init]; + [(GPUImageFilter*)currentlySelectedFilter setBackgroundColorRed:0.0 green:1.0 blue:0.0 alpha:1.0]; + self.enableSlider = NO; + needsSecondImage = YES; + }; break; case GPUIMAGE_GRAYSCALE: { currentlySelectedFilter = [[GPUImageGrayscaleFilter alloc] init]; @@ -313,10 +322,234 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 1.0; self.enableSlider = YES; }; break; + case GPUIMAGE_DISSOLVE: + { + currentlySelectedFilter = [[GPUImageDissolveBlendFilter alloc] init]; + + needsSecondImage = YES; + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_CHROMAKEY: + { + currentlySelectedFilter = [[GPUImageChromaKeyBlendFilter alloc] init]; + [(GPUImageChromaKeyBlendFilter *)currentlySelectedFilter setColorToReplaceRed:0.0 green:1.0 blue:0.0]; + + needsSecondImage = YES; + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.4; + self.enableSlider = YES; + }; break; + case GPUIMAGE_ADD: + { + currentlySelectedFilter = [[GPUImageAddBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_DIVIDE: + { + currentlySelectedFilter = [[GPUImageDivideBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_MULTIPLY: + { + currentlySelectedFilter = [[GPUImageMultiplyBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_OVERLAY: + { + currentlySelectedFilter = [[GPUImageOverlayBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_LIGHTEN: + { + currentlySelectedFilter = [[GPUImageLightenBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_DARKEN: + { + currentlySelectedFilter = [[GPUImageDarkenBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_COLORBURN: + { + currentlySelectedFilter = [[GPUImageColorBurnBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_COLORDODGE: + { + currentlySelectedFilter = [[GPUImageColorDodgeBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_LINEARBURN: + { + currentlySelectedFilter = [[GPUImageLinearBurnBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_SCREENBLEND: + { + currentlySelectedFilter = [[GPUImageScreenBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_DIFFERENCEBLEND: + { + currentlySelectedFilter = [[GPUImageDifferenceBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_SUBTRACTBLEND: + { + currentlySelectedFilter = [[GPUImageSubtractBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_EXCLUSIONBLEND: + { + currentlySelectedFilter = [[GPUImageExclusionBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_HARDLIGHTBLEND: + { + currentlySelectedFilter = [[GPUImageHardLightBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_SOFTLIGHTBLEND: + { + currentlySelectedFilter = [[GPUImageSoftLightBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_COLORBLEND: + { + currentlySelectedFilter = [[GPUImageColorBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_HUEBLEND: + { + currentlySelectedFilter = [[GPUImageHueBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_SATURATIONBLEND: + { + currentlySelectedFilter = [[GPUImageSaturationBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_LUMINOSITYBLEND: + { + currentlySelectedFilter = [[GPUImageLuminosityBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_NORMALBLEND: + { + currentlySelectedFilter = [[GPUImageNormalBlendFilter alloc] init]; + + needsSecondImage = YES; + self.enableSlider = NO; + }; break; + case GPUIMAGE_POISSONBLEND: + { + currentlySelectedFilter = [[GPUImagePoissonBlendFilter alloc] init]; + + needsSecondImage = YES; + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_OPACITY: + { + currentlySelectedFilter = [[GPUImageOpacityFilter alloc] init]; + + needsSecondImage = YES; + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; } [inputCamera addTarget:currentlySelectedFilter]; [currentlySelectedFilter addTarget:self.glView]; + + if (needsSecondImage) + { + if (imageForBlending == nil) + { + NSImage *inputImage; + + if (currentlySelectedRow == GPUIMAGE_MASK) + { + inputImage = [NSImage imageNamed:@"mask"]; + } + /* + else if (filterType == GPUIMAGE_VORONOI) { + inputImage = [UIImage imageNamed:@"voroni_points.png"]; + }*/ + else { + // The picture is only used for two-image blend filters + inputImage = [NSImage imageNamed:@"Lambeau.jpg"]; + } + + imageForBlending = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; + } + [imageForBlending processImage]; + [imageForBlending addTarget:currentlySelectedFilter]; + } + + // if ( (filterType == GPUIMAGE_OPACITY) || (filterType == GPUIMAGE_CHROMAKEYNONBLEND) ) + if (currentlySelectedRow == GPUIMAGE_OPACITY) + { + [currentlySelectedFilter removeTarget:self.glView]; + + [imageForBlending removeTarget:currentlySelectedFilter]; + [inputCamera removeTarget:currentlySelectedFilter]; + [inputCamera addTarget:currentlySelectedFilter]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + blendFilter.mix = 1.0; + [imageForBlending addTarget:blendFilter]; + [currentlySelectedFilter addTarget:blendFilter]; + + [blendFilter addTarget:self.glView]; + } + } #pragma mark - @@ -363,6 +596,10 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)currentlySelectedFilter setDistanceNormalizationFactor:_currentSliderValue]; break; case GPUIMAGE_MOTIONBLUR: [(GPUImageMotionBlurFilter *)currentlySelectedFilter setBlurAngle:_currentSliderValue]; break; case GPUIMAGE_ZOOMBLUR: [(GPUImageZoomBlurFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)currentlySelectedFilter setMix:_currentSliderValue]; break; + case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)currentlySelectedFilter setThresholdSensitivity:_currentSliderValue]; break; + case GPUIMAGE_POISSONBLEND: [(GPUImagePoissonBlendFilter *)currentlySelectedFilter setMix:_currentSliderValue]; break; + case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)currentlySelectedFilter setOpacity:_currentSliderValue]; break; } } @@ -401,6 +638,7 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_TRANSFORM: tableRowTitle = @"Transform (2-D)"; break; case GPUIMAGE_TRANSFORM3D: tableRowTitle = @"Transform (3-D)"; break; case GPUIMAGE_CROP: tableRowTitle = @"Crop"; break; + case GPUIMAGE_MASK: tableRowTitle = @"Mask"; break; case GPUIMAGE_GAUSSIAN: tableRowTitle = @"Gaussian blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: tableRowTitle = @"Gaussian selective blur"; break; case GPUIMAGE_GAUSSIAN_POSITION: tableRowTitle = @"Gaussian (centered)"; break; @@ -410,6 +648,30 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_BILATERAL: tableRowTitle = @"Bilateral blur"; break; case GPUIMAGE_MOTIONBLUR: tableRowTitle = @"Motion blur"; break; case GPUIMAGE_ZOOMBLUR: tableRowTitle = @"Zoom blur"; break; + case GPUIMAGE_DISSOLVE: tableRowTitle = @"Dissolve blend"; break; + case GPUIMAGE_CHROMAKEY: tableRowTitle = @"Chroma key blend (green)"; break; + case GPUIMAGE_ADD: tableRowTitle = @"Add blend"; break; + case GPUIMAGE_DIVIDE: tableRowTitle = @"Divide blend"; break; + case GPUIMAGE_MULTIPLY: tableRowTitle = @"Multiply blend"; break; + case GPUIMAGE_OVERLAY: tableRowTitle = @"Overlay blend"; break; + case GPUIMAGE_LIGHTEN: tableRowTitle = @"Lighten blend"; break; + case GPUIMAGE_DARKEN: tableRowTitle = @"Darken blend"; break; + case GPUIMAGE_COLORBURN: tableRowTitle = @"Color burn blend"; break; + case GPUIMAGE_COLORDODGE: tableRowTitle = @"Color dodge blend"; break; + case GPUIMAGE_LINEARBURN: tableRowTitle = @"Linear burn blend"; break; + case GPUIMAGE_SCREENBLEND: tableRowTitle = @"Screen blend"; break; + case GPUIMAGE_DIFFERENCEBLEND: tableRowTitle = @"Difference blend"; break; + case GPUIMAGE_SUBTRACTBLEND: tableRowTitle = @"Subtract blend"; break; + case GPUIMAGE_EXCLUSIONBLEND: tableRowTitle = @"Exclusion blend"; break; + case GPUIMAGE_HARDLIGHTBLEND: tableRowTitle = @"Hard light blend"; break; + case GPUIMAGE_SOFTLIGHTBLEND: tableRowTitle = @"Soft light blend"; break; + case GPUIMAGE_COLORBLEND: tableRowTitle = @"Color blend"; break; + case GPUIMAGE_HUEBLEND: tableRowTitle = @"Hue blend"; break; + case GPUIMAGE_SATURATIONBLEND: tableRowTitle = @"Saturation blend"; break; + case GPUIMAGE_LUMINOSITYBLEND: tableRowTitle = @"Luminosity blend"; break; + case GPUIMAGE_NORMALBLEND: tableRowTitle = @"Normal blend"; break; + case GPUIMAGE_POISSONBLEND: tableRowTitle = @"Poisson blend"; break; + case GPUIMAGE_OPACITY: tableRowTitle = @"Opacity adjustment"; break; } return tableRowTitle; diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 3feba711f..79c46a4b2 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1081,7 +1081,6 @@ - (void)setupFilter; filter = [[GPUImagePoissonBlendFilter alloc] init]; }; break; - case GPUIMAGE_OPACITY: { self.title = @"Opacity Adjustment"; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index d041551c6..5ae71bfa3 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -97,6 +97,62 @@ BCF86829172857B900912E34 /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86825172857B000912E34 /* GPUImageMotionBlurFilter.m */; }; BCF8682A172857B900912E34 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86826172857B200912E34 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF8682B172857B900912E34 /* GPUImageZoomBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86827172857B600912E34 /* GPUImageZoomBlurFilter.m */; }; + BCF8683017286EDB00912E34 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8682D17286EDB00912E34 /* GPUImageAddBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8683117286EDB00912E34 /* GPUImageAddBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8682E17286EDB00912E34 /* GPUImageAddBlendFilter.m */; }; + BCF8683F17286F2800912E34 /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8683317286F2800912E34 /* GPUImageColorBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8684017286F2800912E34 /* GPUImageColorBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8683417286F2800912E34 /* GPUImageColorBurnBlendFilter.m */; }; + BCF8684117286F2800912E34 /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8683517286F2800912E34 /* GPUImageDarkenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8684217286F2800912E34 /* GPUImageDarkenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8683617286F2800912E34 /* GPUImageDarkenBlendFilter.m */; }; + BCF8684317286F2800912E34 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8683717286F2800912E34 /* GPUImageDivideBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8684417286F2800912E34 /* GPUImageDivideBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8683817286F2800912E34 /* GPUImageDivideBlendFilter.m */; }; + BCF8684517286F2800912E34 /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8683917286F2800912E34 /* GPUImageLightenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8684617286F2800912E34 /* GPUImageLightenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8683A17286F2800912E34 /* GPUImageLightenBlendFilter.m */; }; + BCF8684717286F2800912E34 /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8683B17286F2800912E34 /* GPUImageMultiplyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8684817286F2800912E34 /* GPUImageMultiplyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8683C17286F2800912E34 /* GPUImageMultiplyBlendFilter.m */; }; + BCF8684917286F2800912E34 /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8683D17286F2800912E34 /* GPUImageOverlayBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8684A17286F2800912E34 /* GPUImageOverlayBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8683E17286F2800912E34 /* GPUImageOverlayBlendFilter.m */; }; + BCF868531728716400912E34 /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8684B1728715800912E34 /* GPUImageColorDodgeBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868541728716400912E34 /* GPUImageColorDodgeBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8684C1728715900912E34 /* GPUImageColorDodgeBlendFilter.m */; }; + BCF868551728716400912E34 /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8684D1728715C00912E34 /* GPUImageDifferenceBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868561728716400912E34 /* GPUImageDifferenceBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8684E1728715D00912E34 /* GPUImageDifferenceBlendFilter.m */; }; + BCF868571728716400912E34 /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8684F1728715F00912E34 /* GPUImageLinearBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868581728716400912E34 /* GPUImageLinearBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868501728716000912E34 /* GPUImageLinearBurnBlendFilter.m */; }; + BCF868591728716400912E34 /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF868511728716200912E34 /* GPUImageScreenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8685A1728716400912E34 /* GPUImageScreenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868521728716300912E34 /* GPUImageScreenBlendFilter.m */; }; + BCF8686F1728721300912E34 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8685B172871EE00912E34 /* GPUImageColorBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868701728721300912E34 /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8685C172871F000912E34 /* GPUImageColorBlendFilter.m */; }; + BCF868711728721300912E34 /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8685D172871F300912E34 /* GPUImageExclusionBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868721728721300912E34 /* GPUImageExclusionBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8685E172871F500912E34 /* GPUImageExclusionBlendFilter.m */; }; + BCF868731728721300912E34 /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8685F172871F800912E34 /* GPUImageHardLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868741728721300912E34 /* GPUImageHardLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86860172871FB00912E34 /* GPUImageHardLightBlendFilter.m */; }; + BCF868751728721300912E34 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86861172871FC00912E34 /* GPUImageHueBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868761728721300912E34 /* GPUImageHueBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86862172871FD00912E34 /* GPUImageHueBlendFilter.m */; }; + BCF868771728721300912E34 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86863172871FF00912E34 /* GPUImageLuminosityBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868781728721300912E34 /* GPUImageLuminosityBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868641728720100912E34 /* GPUImageLuminosityBlendFilter.m */; }; + BCF868791728721300912E34 /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF868651728720200912E34 /* GPUImageNormalBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8687A1728721300912E34 /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868661728720400912E34 /* GPUImageNormalBlendFilter.m */; }; + BCF8687B1728721300912E34 /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF868671728720600912E34 /* GPUImagePoissonBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8687C1728721300912E34 /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868681728720700912E34 /* GPUImagePoissonBlendFilter.m */; }; + BCF8687D1728721300912E34 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF868691728720900912E34 /* GPUImageSaturationBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8687E1728721300912E34 /* GPUImageSaturationBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8686A1728720B00912E34 /* GPUImageSaturationBlendFilter.m */; }; + BCF8687F1728721300912E34 /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8686B1728720C00912E34 /* GPUImageSoftLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868801728721300912E34 /* GPUImageSoftLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8686C1728720E00912E34 /* GPUImageSoftLightBlendFilter.m */; }; + BCF868811728721300912E34 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8686D1728720F00912E34 /* GPUImageSubtractBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868821728721300912E34 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8686E1728721100912E34 /* GPUImageSubtractBlendFilter.m */; }; + BCF868851728773900912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF868831728771D00912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868861728773900912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868841728772600912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.m */; }; + BCF8688F17287ED000912E34 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8688B17287EB500912E34 /* GPUImageChromaKeyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8689017287ED000912E34 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8688C17287EBB00912E34 /* GPUImageChromaKeyBlendFilter.m */; }; + BCF8689117287ED000912E34 /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8688D17287EC400912E34 /* GPUImageDissolveBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8689217287ED000912E34 /* GPUImageDissolveBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8688E17287ECC00912E34 /* GPUImageDissolveBlendFilter.m */; }; + BCF86895172880B800912E34 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86893172880AB00912E34 /* GPUImageSourceOverBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF86896172880B800912E34 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86894172880B100912E34 /* GPUImageSourceOverBlendFilter.m */; }; + BCF86899172883A300912E34 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF868971728839800912E34 /* GPUImageMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8689A172883A300912E34 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868981728839C00912E34 /* GPUImageMaskFilter.m */; }; + BCF8689D1728862100912E34 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8689B1728861E00912E34 /* GPUImageOpacityFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF8689E1728862100912E34 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */; }; + BCF868A11728866400912E34 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8689F1728865500912E34 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF868A21728866400912E34 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868A01728865D00912E34 /* GPUImageAlphaBlendFilter.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -196,6 +252,62 @@ BCF86825172857B000912E34 /* GPUImageMotionBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMotionBlurFilter.m; path = Source/GPUImageMotionBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCF86826172857B200912E34 /* GPUImageZoomBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageZoomBlurFilter.h; path = Source/GPUImageZoomBlurFilter.h; sourceTree = SOURCE_ROOT; }; BCF86827172857B600912E34 /* GPUImageZoomBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageZoomBlurFilter.m; path = Source/GPUImageZoomBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8682D17286EDB00912E34 /* GPUImageAddBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAddBlendFilter.h; path = Source/GPUImageAddBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8682E17286EDB00912E34 /* GPUImageAddBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAddBlendFilter.m; path = Source/GPUImageAddBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8683317286F2800912E34 /* GPUImageColorBurnBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorBurnBlendFilter.h; path = Source/GPUImageColorBurnBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8683417286F2800912E34 /* GPUImageColorBurnBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorBurnBlendFilter.m; path = Source/GPUImageColorBurnBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8683517286F2800912E34 /* GPUImageDarkenBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDarkenBlendFilter.h; path = Source/GPUImageDarkenBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8683617286F2800912E34 /* GPUImageDarkenBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDarkenBlendFilter.m; path = Source/GPUImageDarkenBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8683717286F2800912E34 /* GPUImageDivideBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDivideBlendFilter.h; path = Source/GPUImageDivideBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8683817286F2800912E34 /* GPUImageDivideBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDivideBlendFilter.m; path = Source/GPUImageDivideBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8683917286F2800912E34 /* GPUImageLightenBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLightenBlendFilter.h; path = Source/GPUImageLightenBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8683A17286F2800912E34 /* GPUImageLightenBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLightenBlendFilter.m; path = Source/GPUImageLightenBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8683B17286F2800912E34 /* GPUImageMultiplyBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMultiplyBlendFilter.h; path = Source/GPUImageMultiplyBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8683C17286F2800912E34 /* GPUImageMultiplyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMultiplyBlendFilter.m; path = Source/GPUImageMultiplyBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8683D17286F2800912E34 /* GPUImageOverlayBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOverlayBlendFilter.h; path = Source/GPUImageOverlayBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8683E17286F2800912E34 /* GPUImageOverlayBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOverlayBlendFilter.m; path = Source/GPUImageOverlayBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8684B1728715800912E34 /* GPUImageColorDodgeBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorDodgeBlendFilter.h; path = Source/GPUImageColorDodgeBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8684C1728715900912E34 /* GPUImageColorDodgeBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorDodgeBlendFilter.m; path = Source/GPUImageColorDodgeBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8684D1728715C00912E34 /* GPUImageDifferenceBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDifferenceBlendFilter.h; path = Source/GPUImageDifferenceBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8684E1728715D00912E34 /* GPUImageDifferenceBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDifferenceBlendFilter.m; path = Source/GPUImageDifferenceBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8684F1728715F00912E34 /* GPUImageLinearBurnBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLinearBurnBlendFilter.h; path = Source/GPUImageLinearBurnBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF868501728716000912E34 /* GPUImageLinearBurnBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLinearBurnBlendFilter.m; path = Source/GPUImageLinearBurnBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF868511728716200912E34 /* GPUImageScreenBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageScreenBlendFilter.h; path = Source/GPUImageScreenBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF868521728716300912E34 /* GPUImageScreenBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageScreenBlendFilter.m; path = Source/GPUImageScreenBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8685B172871EE00912E34 /* GPUImageColorBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorBlendFilter.h; path = Source/GPUImageColorBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8685C172871F000912E34 /* GPUImageColorBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorBlendFilter.m; path = Source/GPUImageColorBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8685D172871F300912E34 /* GPUImageExclusionBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageExclusionBlendFilter.h; path = Source/GPUImageExclusionBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8685E172871F500912E34 /* GPUImageExclusionBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageExclusionBlendFilter.m; path = Source/GPUImageExclusionBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8685F172871F800912E34 /* GPUImageHardLightBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHardLightBlendFilter.h; path = Source/GPUImageHardLightBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF86860172871FB00912E34 /* GPUImageHardLightBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHardLightBlendFilter.m; path = Source/GPUImageHardLightBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF86861172871FC00912E34 /* GPUImageHueBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueBlendFilter.h; path = Source/GPUImageHueBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF86862172871FD00912E34 /* GPUImageHueBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueBlendFilter.m; path = Source/GPUImageHueBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF86863172871FF00912E34 /* GPUImageLuminosityBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminosityBlendFilter.h; path = Source/GPUImageLuminosityBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF868641728720100912E34 /* GPUImageLuminosityBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminosityBlendFilter.m; path = Source/GPUImageLuminosityBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF868651728720200912E34 /* GPUImageNormalBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNormalBlendFilter.h; path = Source/GPUImageNormalBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF868661728720400912E34 /* GPUImageNormalBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNormalBlendFilter.m; path = Source/GPUImageNormalBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF868671728720600912E34 /* GPUImagePoissonBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePoissonBlendFilter.h; path = Source/GPUImagePoissonBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF868681728720700912E34 /* GPUImagePoissonBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePoissonBlendFilter.m; path = Source/GPUImagePoissonBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF868691728720900912E34 /* GPUImageSaturationBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSaturationBlendFilter.h; path = Source/GPUImageSaturationBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8686A1728720B00912E34 /* GPUImageSaturationBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSaturationBlendFilter.m; path = Source/GPUImageSaturationBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8686B1728720C00912E34 /* GPUImageSoftLightBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSoftLightBlendFilter.h; path = Source/GPUImageSoftLightBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8686C1728720E00912E34 /* GPUImageSoftLightBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftLightBlendFilter.m; path = Source/GPUImageSoftLightBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8686D1728720F00912E34 /* GPUImageSubtractBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSubtractBlendFilter.h; path = Source/GPUImageSubtractBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8686E1728721100912E34 /* GPUImageSubtractBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSubtractBlendFilter.m; path = Source/GPUImageSubtractBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF868831728771D00912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoInputCrossTextureSamplingFilter.h; path = Source/GPUImageTwoInputCrossTextureSamplingFilter.h; sourceTree = SOURCE_ROOT; }; + BCF868841728772600912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoInputCrossTextureSamplingFilter.m; path = Source/GPUImageTwoInputCrossTextureSamplingFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8688B17287EB500912E34 /* GPUImageChromaKeyBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyBlendFilter.h; path = Source/GPUImageChromaKeyBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8688C17287EBB00912E34 /* GPUImageChromaKeyBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyBlendFilter.m; path = Source/GPUImageChromaKeyBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8688D17287EC400912E34 /* GPUImageDissolveBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDissolveBlendFilter.h; path = Source/GPUImageDissolveBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8688E17287ECC00912E34 /* GPUImageDissolveBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDissolveBlendFilter.m; path = Source/GPUImageDissolveBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF86893172880AB00912E34 /* GPUImageSourceOverBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSourceOverBlendFilter.h; path = Source/GPUImageSourceOverBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF86894172880B100912E34 /* GPUImageSourceOverBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSourceOverBlendFilter.m; path = Source/GPUImageSourceOverBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCF868971728839800912E34 /* GPUImageMaskFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMaskFilter.h; path = Source/GPUImageMaskFilter.h; sourceTree = SOURCE_ROOT; }; + BCF868981728839C00912E34 /* GPUImageMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMaskFilter.m; path = Source/GPUImageMaskFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8689B1728861E00912E34 /* GPUImageOpacityFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOpacityFilter.h; path = Source/GPUImageOpacityFilter.h; sourceTree = SOURCE_ROOT; }; + BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpacityFilter.m; path = Source/GPUImageOpacityFilter.m; sourceTree = SOURCE_ROOT; }; + BCF8689F1728865500912E34 /* GPUImageAlphaBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAlphaBlendFilter.h; path = Source/GPUImageAlphaBlendFilter.h; sourceTree = SOURCE_ROOT; }; + BCF868A01728865D00912E34 /* GPUImageAlphaBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAlphaBlendFilter.m; path = Source/GPUImageAlphaBlendFilter.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -303,6 +415,8 @@ BCF867DB17278C5900912E34 /* GPUImageTwoPassFilter.m */, BCF867FA1728496A00912E34 /* GPUImageTwoPassTextureSamplingFilter.h */, BCF867FB1728496C00912E34 /* GPUImageTwoPassTextureSamplingFilter.m */, + BCF868831728771D00912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.h */, + BCF868841728772600912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.m */, BCF867F21728490300912E34 /* GPUImageTwoInputFilter.h */, BCF867F31728490500912E34 /* GPUImageTwoInputFilter.m */, BCF867C9172788F100912E34 /* GPUImage3x3TextureSamplingFilter.h */, @@ -310,6 +424,7 @@ BCF867C31727820100912E34 /* Color processing */, BCF867D1172789C800912E34 /* Image processing */, BCF867C4172786BA00912E34 /* Effects */, + BCF8682C17286E5F00912E34 /* Blends */, ); name = Filters; sourceTree = ""; @@ -350,6 +465,8 @@ BCF867DF17278D1900912E34 /* GPUImageGrayscaleFilter.m */, BCF867E61728477200912E34 /* GPUImageFalseColorFilter.h */, BCF867E71728477200912E34 /* GPUImageFalseColorFilter.m */, + BCF8689B1728861E00912E34 /* GPUImageOpacityFilter.h */, + BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -404,6 +521,65 @@ name = "Image processing"; sourceTree = ""; }; + BCF8682C17286E5F00912E34 /* Blends */ = { + isa = PBXGroup; + children = ( + BCF868971728839800912E34 /* GPUImageMaskFilter.h */, + BCF868981728839C00912E34 /* GPUImageMaskFilter.m */, + BCF8688D17287EC400912E34 /* GPUImageDissolveBlendFilter.h */, + BCF8688E17287ECC00912E34 /* GPUImageDissolveBlendFilter.m */, + BCF8688B17287EB500912E34 /* GPUImageChromaKeyBlendFilter.h */, + BCF8688C17287EBB00912E34 /* GPUImageChromaKeyBlendFilter.m */, + BCF8682D17286EDB00912E34 /* GPUImageAddBlendFilter.h */, + BCF8682E17286EDB00912E34 /* GPUImageAddBlendFilter.m */, + BCF8683717286F2800912E34 /* GPUImageDivideBlendFilter.h */, + BCF8683817286F2800912E34 /* GPUImageDivideBlendFilter.m */, + BCF8683B17286F2800912E34 /* GPUImageMultiplyBlendFilter.h */, + BCF8683C17286F2800912E34 /* GPUImageMultiplyBlendFilter.m */, + BCF8683D17286F2800912E34 /* GPUImageOverlayBlendFilter.h */, + BCF8683E17286F2800912E34 /* GPUImageOverlayBlendFilter.m */, + BCF8683917286F2800912E34 /* GPUImageLightenBlendFilter.h */, + BCF8683A17286F2800912E34 /* GPUImageLightenBlendFilter.m */, + BCF8683517286F2800912E34 /* GPUImageDarkenBlendFilter.h */, + BCF8683617286F2800912E34 /* GPUImageDarkenBlendFilter.m */, + BCF8683317286F2800912E34 /* GPUImageColorBurnBlendFilter.h */, + BCF8683417286F2800912E34 /* GPUImageColorBurnBlendFilter.m */, + BCF8684B1728715800912E34 /* GPUImageColorDodgeBlendFilter.h */, + BCF8684C1728715900912E34 /* GPUImageColorDodgeBlendFilter.m */, + BCF8684F1728715F00912E34 /* GPUImageLinearBurnBlendFilter.h */, + BCF868501728716000912E34 /* GPUImageLinearBurnBlendFilter.m */, + BCF868511728716200912E34 /* GPUImageScreenBlendFilter.h */, + BCF868521728716300912E34 /* GPUImageScreenBlendFilter.m */, + BCF8684D1728715C00912E34 /* GPUImageDifferenceBlendFilter.h */, + BCF8684E1728715D00912E34 /* GPUImageDifferenceBlendFilter.m */, + BCF8686D1728720F00912E34 /* GPUImageSubtractBlendFilter.h */, + BCF8686E1728721100912E34 /* GPUImageSubtractBlendFilter.m */, + BCF8685D172871F300912E34 /* GPUImageExclusionBlendFilter.h */, + BCF8685E172871F500912E34 /* GPUImageExclusionBlendFilter.m */, + BCF8685F172871F800912E34 /* GPUImageHardLightBlendFilter.h */, + BCF86860172871FB00912E34 /* GPUImageHardLightBlendFilter.m */, + BCF8686B1728720C00912E34 /* GPUImageSoftLightBlendFilter.h */, + BCF8686C1728720E00912E34 /* GPUImageSoftLightBlendFilter.m */, + BCF8685B172871EE00912E34 /* GPUImageColorBlendFilter.h */, + BCF8685C172871F000912E34 /* GPUImageColorBlendFilter.m */, + BCF86861172871FC00912E34 /* GPUImageHueBlendFilter.h */, + BCF86862172871FD00912E34 /* GPUImageHueBlendFilter.m */, + BCF868691728720900912E34 /* GPUImageSaturationBlendFilter.h */, + BCF8686A1728720B00912E34 /* GPUImageSaturationBlendFilter.m */, + BCF86863172871FF00912E34 /* GPUImageLuminosityBlendFilter.h */, + BCF868641728720100912E34 /* GPUImageLuminosityBlendFilter.m */, + BCF868651728720200912E34 /* GPUImageNormalBlendFilter.h */, + BCF868661728720400912E34 /* GPUImageNormalBlendFilter.m */, + BCF868671728720600912E34 /* GPUImagePoissonBlendFilter.h */, + BCF868681728720700912E34 /* GPUImagePoissonBlendFilter.m */, + BCF86893172880AB00912E34 /* GPUImageSourceOverBlendFilter.h */, + BCF86894172880B100912E34 /* GPUImageSourceOverBlendFilter.m */, + BCF8689F1728865500912E34 /* GPUImageAlphaBlendFilter.h */, + BCF868A01728865D00912E34 /* GPUImageAlphaBlendFilter.m */, + ); + name = Blends; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -454,6 +630,34 @@ BCF86822172854B900912E34 /* GPUImageMedianFilter.h in Headers */, BCF86828172857B900912E34 /* GPUImageMotionBlurFilter.h in Headers */, BCF8682A172857B900912E34 /* GPUImageZoomBlurFilter.h in Headers */, + BCF8683017286EDB00912E34 /* GPUImageAddBlendFilter.h in Headers */, + BCF8683F17286F2800912E34 /* GPUImageColorBurnBlendFilter.h in Headers */, + BCF8684117286F2800912E34 /* GPUImageDarkenBlendFilter.h in Headers */, + BCF8684317286F2800912E34 /* GPUImageDivideBlendFilter.h in Headers */, + BCF8684517286F2800912E34 /* GPUImageLightenBlendFilter.h in Headers */, + BCF8684717286F2800912E34 /* GPUImageMultiplyBlendFilter.h in Headers */, + BCF8684917286F2800912E34 /* GPUImageOverlayBlendFilter.h in Headers */, + BCF868531728716400912E34 /* GPUImageColorDodgeBlendFilter.h in Headers */, + BCF868551728716400912E34 /* GPUImageDifferenceBlendFilter.h in Headers */, + BCF868571728716400912E34 /* GPUImageLinearBurnBlendFilter.h in Headers */, + BCF868591728716400912E34 /* GPUImageScreenBlendFilter.h in Headers */, + BCF8686F1728721300912E34 /* GPUImageColorBlendFilter.h in Headers */, + BCF868711728721300912E34 /* GPUImageExclusionBlendFilter.h in Headers */, + BCF868731728721300912E34 /* GPUImageHardLightBlendFilter.h in Headers */, + BCF868751728721300912E34 /* GPUImageHueBlendFilter.h in Headers */, + BCF868771728721300912E34 /* GPUImageLuminosityBlendFilter.h in Headers */, + BCF868791728721300912E34 /* GPUImageNormalBlendFilter.h in Headers */, + BCF8687B1728721300912E34 /* GPUImagePoissonBlendFilter.h in Headers */, + BCF8687D1728721300912E34 /* GPUImageSaturationBlendFilter.h in Headers */, + BCF8687F1728721300912E34 /* GPUImageSoftLightBlendFilter.h in Headers */, + BCF868811728721300912E34 /* GPUImageSubtractBlendFilter.h in Headers */, + BCF868851728773900912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */, + BCF8688F17287ED000912E34 /* GPUImageChromaKeyBlendFilter.h in Headers */, + BCF8689117287ED000912E34 /* GPUImageDissolveBlendFilter.h in Headers */, + BCF86895172880B800912E34 /* GPUImageSourceOverBlendFilter.h in Headers */, + BCF86899172883A300912E34 /* GPUImageMaskFilter.h in Headers */, + BCF8689D1728862100912E34 /* GPUImageOpacityFilter.h in Headers */, + BCF868A11728866400912E34 /* GPUImageAlphaBlendFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -561,6 +765,34 @@ BCF86823172854B900912E34 /* GPUImageMedianFilter.m in Sources */, BCF86829172857B900912E34 /* GPUImageMotionBlurFilter.m in Sources */, BCF8682B172857B900912E34 /* GPUImageZoomBlurFilter.m in Sources */, + BCF8683117286EDB00912E34 /* GPUImageAddBlendFilter.m in Sources */, + BCF8684017286F2800912E34 /* GPUImageColorBurnBlendFilter.m in Sources */, + BCF8684217286F2800912E34 /* GPUImageDarkenBlendFilter.m in Sources */, + BCF8684417286F2800912E34 /* GPUImageDivideBlendFilter.m in Sources */, + BCF8684617286F2800912E34 /* GPUImageLightenBlendFilter.m in Sources */, + BCF8684817286F2800912E34 /* GPUImageMultiplyBlendFilter.m in Sources */, + BCF8684A17286F2800912E34 /* GPUImageOverlayBlendFilter.m in Sources */, + BCF868541728716400912E34 /* GPUImageColorDodgeBlendFilter.m in Sources */, + BCF868561728716400912E34 /* GPUImageDifferenceBlendFilter.m in Sources */, + BCF868581728716400912E34 /* GPUImageLinearBurnBlendFilter.m in Sources */, + BCF8685A1728716400912E34 /* GPUImageScreenBlendFilter.m in Sources */, + BCF868701728721300912E34 /* GPUImageColorBlendFilter.m in Sources */, + BCF868721728721300912E34 /* GPUImageExclusionBlendFilter.m in Sources */, + BCF868741728721300912E34 /* GPUImageHardLightBlendFilter.m in Sources */, + BCF868761728721300912E34 /* GPUImageHueBlendFilter.m in Sources */, + BCF868781728721300912E34 /* GPUImageLuminosityBlendFilter.m in Sources */, + BCF8687A1728721300912E34 /* GPUImageNormalBlendFilter.m in Sources */, + BCF8687C1728721300912E34 /* GPUImagePoissonBlendFilter.m in Sources */, + BCF8687E1728721300912E34 /* GPUImageSaturationBlendFilter.m in Sources */, + BCF868801728721300912E34 /* GPUImageSoftLightBlendFilter.m in Sources */, + BCF868821728721300912E34 /* GPUImageSubtractBlendFilter.m in Sources */, + BCF868861728773900912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */, + BCF8689017287ED000912E34 /* GPUImageChromaKeyBlendFilter.m in Sources */, + BCF8689217287ED000912E34 /* GPUImageDissolveBlendFilter.m in Sources */, + BCF86896172880B800912E34 /* GPUImageSourceOverBlendFilter.m in Sources */, + BCF8689A172883A300912E34 /* GPUImageMaskFilter.m in Sources */, + BCF8689E1728862100912E34 /* GPUImageOpacityFilter.m in Sources */, + BCF868A21728866400912E34 /* GPUImageAlphaBlendFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageAddBlendFilter.m b/framework/Source/GPUImageAddBlendFilter.m index ee5cb5e79..c89054a8b 100644 --- a/framework/Source/GPUImageAddBlendFilter.m +++ b/framework/Source/GPUImageAddBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageAddBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageAddBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -38,7 +39,48 @@ void main() gl_FragColor = vec4(r, g, b, a); } - ); +); +#else +NSString *const kGPUImageAddBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + float r; + if (overlay.r * base.a + base.r * overlay.a >= overlay.a * base.a) { + r = overlay.a * base.a + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } else { + r = overlay.r + base.r; + } + + float g; + if (overlay.g * base.a + base.g * overlay.a >= overlay.a * base.a) { + g = overlay.a * base.a + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } else { + g = overlay.g + base.g; + } + + float b; + if (overlay.b * base.a + base.b * overlay.a >= overlay.a * base.a) { + b = overlay.a * base.a + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } else { + b = overlay.b + base.b; + } + + float a = overlay.a + base.a - overlay.a * base.a; + + gl_FragColor = vec4(r, g, b, a); + } +); +#endif diff --git a/framework/Source/GPUImageAlphaBlendFilter.m b/framework/Source/GPUImageAlphaBlendFilter.m index 5aba674a8..077df790c 100755 --- a/framework/Source/GPUImageAlphaBlendFilter.m +++ b/framework/Source/GPUImageAlphaBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageAlphaBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageAlphaBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -18,7 +19,26 @@ void main() gl_FragColor = vec4(mix(textureColor.rgb, textureColor2.rgb, textureColor2.a * mixturePercent), textureColor.a); } ); - +#else +NSString *const kGPUImageAlphaBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform float mixturePercent; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(mix(textureColor.rgb, textureColor2.rgb, textureColor2.a * mixturePercent), textureColor.a); + } +); +#endif @implementation GPUImageAlphaBlendFilter diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m index f8bb2b5a7..5d039745f 100755 --- a/framework/Source/GPUImageChromaKeyBlendFilter.m +++ b/framework/Source/GPUImageChromaKeyBlendFilter.m @@ -2,6 +2,7 @@ // Shader code based on Apple's CIChromaKeyFilter example: https://developer.apple.com/library/mac/#samplecode/CIChromaKeyFilter/Introduction/Intro.html +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageChromaKeyBlendFragmentShaderString = SHADER_STRING ( precision highp float; @@ -32,7 +33,38 @@ void main() float blendValue = 1.0 - smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb))); gl_FragColor = mix(textureColor, textureColor2, blendValue); } - ); +); +#else +NSString *const kGPUImageChromaKeyBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform float thresholdSensitivity; + uniform float smoothing; + uniform vec3 colorToReplace; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + + float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b; + float maskCr = 0.7132 * (colorToReplace.r - maskY); + float maskCb = 0.5647 * (colorToReplace.b - maskY); + + float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b; + float Cr = 0.7132 * (textureColor.r - Y); + float Cb = 0.5647 * (textureColor.b - Y); + + // float blendValue = 1.0 - smoothstep(thresholdSensitivity - smoothing, thresholdSensitivity , abs(Cr - maskCr) + abs(Cb - maskCb)); + float blendValue = 1.0 - smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb))); + gl_FragColor = mix(textureColor, textureColor2, blendValue); + } +); +#endif @implementation GPUImageChromaKeyBlendFilter diff --git a/framework/Source/GPUImageColorBlendFilter.m b/framework/Source/GPUImageColorBlendFilter.m index eb0ccbff2..ced1cb8e4 100644 --- a/framework/Source/GPUImageColorBlendFilter.m +++ b/framework/Source/GPUImageColorBlendFilter.m @@ -3,6 +3,7 @@ /** * Color blend mode based upon pseudo code from the PDF specification. */ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageColorBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -47,7 +48,54 @@ void main() gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(overlayColor.rgb, lum(baseColor.rgb)) * overlayColor.a, baseColor.a); } - ); +); +#else +NSString *const kGPUImageColorBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + float lum(vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + vec3 clipcolor(vec3 c) { + float l = lum(c); + float n = min(min(c.r, c.g), c.b); + float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + vec3 setlum(vec3 c, float l) { + float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + void main() + { + vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(overlayColor.rgb, lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } +); +#endif @implementation GPUImageColorBlendFilter diff --git a/framework/Source/GPUImageColorBurnBlendFilter.m b/framework/Source/GPUImageColorBurnBlendFilter.m index b0dcdf5e7..5d6ff60d2 100755 --- a/framework/Source/GPUImageColorBurnBlendFilter.m +++ b/framework/Source/GPUImageColorBurnBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageColorBurnBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageColorBurnBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -16,6 +17,24 @@ void main() gl_FragColor = whiteColor - (whiteColor - textureColor) / textureColor2; } ); +#else +NSString *const kGPUImageColorBurnBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + vec4 whiteColor = vec4(1.0); + gl_FragColor = whiteColor - (whiteColor - textureColor) / textureColor2; + } +); +#endif @implementation GPUImageColorBurnBlendFilter diff --git a/framework/Source/GPUImageColorDodgeBlendFilter.m b/framework/Source/GPUImageColorDodgeBlendFilter.m index 5898c23af..6a38827ce 100755 --- a/framework/Source/GPUImageColorDodgeBlendFilter.m +++ b/framework/Source/GPUImageColorDodgeBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageColorDodgeBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageColorDodgeBlendFragmentShaderString = SHADER_STRING ( @@ -29,6 +30,34 @@ void main() gl_FragColor = vec4(mix(firstBlendColor, secondBlendColor, colorChoice), 1.0); } ); +#else +NSString *const kGPUImageColorDodgeBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + vec3 baseOverlayAlphaProduct = vec3(overlay.a * base.a); + vec3 rightHandProduct = overlay.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlay.a); + + vec3 firstBlendColor = baseOverlayAlphaProduct + rightHandProduct; + vec3 overlayRGB = clamp((overlay.rgb / clamp(overlay.a, 0.01, 1.0)) * step(0.0, overlay.a), 0.0, 0.99); + + vec3 secondBlendColor = (base.rgb * overlay.a) / (1.0 - overlayRGB) + rightHandProduct; + + vec3 colorChoice = step((overlay.rgb * base.a + base.rgb * overlay.a), baseOverlayAlphaProduct); + + gl_FragColor = vec4(mix(firstBlendColor, secondBlendColor, colorChoice), 1.0); + } +); +#endif @implementation GPUImageColorDodgeBlendFilter diff --git a/framework/Source/GPUImageDarkenBlendFilter.m b/framework/Source/GPUImageDarkenBlendFilter.m index 732d9b023..85ec9e8a9 100644 --- a/framework/Source/GPUImageDarkenBlendFilter.m +++ b/framework/Source/GPUImageDarkenBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageDarkenBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageDarkenBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -16,6 +17,24 @@ void main() gl_FragColor = vec4(min(overlayer.rgb * base.a, base.rgb * overlayer.a) + overlayer.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlayer.a), 1.0); } ); +#else +NSString *const kGPUImageDarkenBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlayer = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(min(overlayer.rgb * base.a, base.rgb * overlayer.a) + overlayer.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlayer.a), 1.0); + } + ); +#endif @implementation GPUImageDarkenBlendFilter diff --git a/framework/Source/GPUImageDifferenceBlendFilter.m b/framework/Source/GPUImageDifferenceBlendFilter.m index bf5b5d749..01bf09b22 100755 --- a/framework/Source/GPUImageDifferenceBlendFilter.m +++ b/framework/Source/GPUImageDifferenceBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageDifferenceBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageDifferenceBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -15,6 +16,23 @@ void main() gl_FragColor = vec4(abs(textureColor2.rgb - textureColor.rgb), textureColor.a); } ); +#else +NSString *const kGPUImageDifferenceBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + gl_FragColor = vec4(abs(textureColor2.rgb - textureColor.rgb), textureColor.a); + } +); +#endif @implementation GPUImageDifferenceBlendFilter diff --git a/framework/Source/GPUImageDissolveBlendFilter.m b/framework/Source/GPUImageDissolveBlendFilter.m index 3af97701a..b4a5609f7 100755 --- a/framework/Source/GPUImageDissolveBlendFilter.m +++ b/framework/Source/GPUImageDissolveBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageDissolveBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageDissolveBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -17,6 +18,25 @@ void main() gl_FragColor = mix(textureColor, textureColor2, mixturePercent); } ); +#else +NSString *const kGPUImageDissolveBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + uniform float mixturePercent; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = mix(textureColor, textureColor2, mixturePercent); + } +); +#endif @implementation GPUImageDissolveBlendFilter diff --git a/framework/Source/GPUImageDivideBlendFilter.m b/framework/Source/GPUImageDivideBlendFilter.m index ee4e75207..63ee071e7 100644 --- a/framework/Source/GPUImageDivideBlendFilter.m +++ b/framework/Source/GPUImageDivideBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageDivideBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageDivideBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -35,9 +36,49 @@ void main() mediump float a = overlay.a + base.a - overlay.a * base.a; + gl_FragColor = vec4(ra, ga, ba, a); + } +); +#else +NSString *const kGPUImageDivideBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + float ra; + if (overlay.a == 0.0 || ((base.r / overlay.r) > (base.a / overlay.a))) + ra = overlay.a * base.a + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + else + ra = (base.r * overlay.a * overlay.a) / overlay.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + + + float ga; + if (overlay.a == 0.0 || ((base.g / overlay.g) > (base.a / overlay.a))) + ga = overlay.a * base.a + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + else + ga = (base.g * overlay.a * overlay.a) / overlay.g + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + + + float ba; + if (overlay.a == 0.0 || ((base.b / overlay.b) > (base.a / overlay.a))) + ba = overlay.a * base.a + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + else + ba = (base.b * overlay.a * overlay.a) / overlay.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + + float a = overlay.a + base.a - overlay.a * base.a; + gl_FragColor = vec4(ra, ga, ba, a); } ); +#endif @implementation GPUImageDivideBlendFilter diff --git a/framework/Source/GPUImageExclusionBlendFilter.m b/framework/Source/GPUImageExclusionBlendFilter.m index 4ac63ade6..c364159fe 100755 --- a/framework/Source/GPUImageExclusionBlendFilter.m +++ b/framework/Source/GPUImageExclusionBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageExclusionBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageExclusionBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -18,6 +19,26 @@ void main() gl_FragColor = vec4((overlay.rgb * base.a + base.rgb * overlay.a - 2.0 * overlay.rgb * base.rgb) + overlay.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlay.a), base.a); } ); +#else +NSString *const kGPUImageExclusionBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + // Dca = (Sca.Da + Dca.Sa - 2.Sca.Dca) + Sca.(1 - Da) + Dca.(1 - Sa) + + gl_FragColor = vec4((overlay.rgb * base.a + base.rgb * overlay.a - 2.0 * overlay.rgb * base.rgb) + overlay.rgb * (1.0 - base.a) + base.rgb * (1.0 - overlay.a), base.a); + } + ); +#endif @implementation GPUImageExclusionBlendFilter diff --git a/framework/Source/GPUImageHardLightBlendFilter.m b/framework/Source/GPUImageHardLightBlendFilter.m index eb6576e32..2896ce824 100755 --- a/framework/Source/GPUImageHardLightBlendFilter.m +++ b/framework/Source/GPUImageHardLightBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageHardLightBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHardLightBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -39,6 +40,47 @@ void main() gl_FragColor = vec4(ra, ga, ba, 1.0); } ); +#else +NSString *const kGPUImageHardLightBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + float ra; + if (2.0 * overlay.r < overlay.a) { + ra = 2.0 * overlay.r * base.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } else { + ra = overlay.a * base.a - 2.0 * (base.a - base.r) * (overlay.a - overlay.r) + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } + + float ga; + if (2.0 * overlay.g < overlay.a) { + ga = 2.0 * overlay.g * base.g + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } else { + ga = overlay.a * base.a - 2.0 * (base.a - base.g) * (overlay.a - overlay.g) + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } + + float ba; + if (2.0 * overlay.b < overlay.a) { + ba = 2.0 * overlay.b * base.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } else { + ba = overlay.a * base.a - 2.0 * (base.a - base.b) * (overlay.a - overlay.b) + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } + + gl_FragColor = vec4(ra, ga, ba, 1.0); + } +); +#endif @implementation GPUImageHardLightBlendFilter diff --git a/framework/Source/GPUImageHueBlendFilter.m b/framework/Source/GPUImageHueBlendFilter.m index e448ee9aa..f9dfbbb89 100644 --- a/framework/Source/GPUImageHueBlendFilter.m +++ b/framework/Source/GPUImageHueBlendFilter.m @@ -3,6 +3,7 @@ /** * Hue blend mode based upon pseudo code from the PDF specification. */ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHueBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -97,8 +98,104 @@ void main() gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(overlayColor.rgb, sat(baseColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); } - ); - +); +#else +NSString *const kGPUImageHueBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + float lum(vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + vec3 clipcolor(vec3 c) { + float l = lum(c); + float n = min(min(c.r, c.g), c.b); + float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + vec3 setlum(vec3 c, float l) { + float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + float sat(vec3 c) { + float n = min(min(c.r, c.g), c.b); + float x = max(max(c.r, c.g), c.b); + return x - n; + } + + float mid(float cmin, float cmid, float cmax, float s) { + return ((cmid - cmin) * s) / (cmax - cmin); + } + + vec3 setsat(vec3 c, float s) { + if (c.r > c.g) { + if (c.r > c.b) { + if (c.g > c.b) { + /* g is mid, b is min */ + c.g = mid(c.b, c.g, c.r, s); + c.b = 0.0; + } else { + /* b is mid, g is min */ + c.b = mid(c.g, c.b, c.r, s); + c.g = 0.0; + } + c.r = s; + } else { + /* b is max, r is mid, g is min */ + c.r = mid(c.g, c.r, c.b, s); + c.b = s; + c.r = 0.0; + } + } else if (c.r > c.b) { + /* g is max, r is mid, b is min */ + c.r = mid(c.b, c.r, c.g, s); + c.g = s; + c.b = 0.0; + } else if (c.g > c.b) { + /* g is max, b is mid, r is min */ + c.b = mid(c.r, c.b, c.g, s); + c.g = s; + c.r = 0.0; + } else if (c.b > c.g) { + /* b is max, g is mid, r is min */ + c.g = mid(c.r, c.g, c.b, s); + c.b = s; + c.r = 0.0; + } else { + c = vec3(0.0); + } + return c; + } + + void main() + { + vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(overlayColor.rgb, sat(baseColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } +); +#endif @implementation GPUImageHueBlendFilter diff --git a/framework/Source/GPUImageLightenBlendFilter.m b/framework/Source/GPUImageLightenBlendFilter.m index 3d632b532..2bbd4b205 100755 --- a/framework/Source/GPUImageLightenBlendFilter.m +++ b/framework/Source/GPUImageLightenBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageLightenBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLightenBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -16,6 +17,24 @@ void main() gl_FragColor = max(textureColor, textureColor2); } ); +#else +NSString *const kGPUImageLightenBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = max(textureColor, textureColor2); + } + ); +#endif @implementation GPUImageLightenBlendFilter diff --git a/framework/Source/GPUImageLinearBurnBlendFilter.m b/framework/Source/GPUImageLinearBurnBlendFilter.m index 1a62ed740..47031967f 100644 --- a/framework/Source/GPUImageLinearBurnBlendFilter.m +++ b/framework/Source/GPUImageLinearBurnBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageLinearBurnBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLinearBurnBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -15,7 +16,25 @@ void main() gl_FragColor = vec4(clamp(textureColor.rgb + textureColor2.rgb - vec3(1.0), vec3(0.0), vec3(1.0)), textureColor.a); } - ); +); +#else +NSString *const kGPUImageLinearBurnBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(clamp(textureColor.rgb + textureColor2.rgb - vec3(1.0), vec3(0.0), vec3(1.0)), textureColor.a); + } +); +#endif @implementation GPUImageLinearBurnBlendFilter diff --git a/framework/Source/GPUImageLuminosityBlendFilter.m b/framework/Source/GPUImageLuminosityBlendFilter.m index f58970ef8..7e399746f 100644 --- a/framework/Source/GPUImageLuminosityBlendFilter.m +++ b/framework/Source/GPUImageLuminosityBlendFilter.m @@ -3,6 +3,7 @@ /** * Luminosity blend mode based upon pseudo code from the PDF specification. */ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLuminosityBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -47,7 +48,54 @@ void main() gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(baseColor.rgb, lum(overlayColor.rgb)) * overlayColor.a, baseColor.a); } - ); +); +#else +NSString *const kGPUImageLuminosityBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + float lum(vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + vec3 clipcolor(vec3 c) { + float l = lum(c); + float n = min(min(c.r, c.g), c.b); + float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + vec3 setlum(vec3 c, float l) { + float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + void main() + { + vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(baseColor.rgb, lum(overlayColor.rgb)) * overlayColor.a, baseColor.a); + } +); +#endif @implementation GPUImageLuminosityBlendFilter diff --git a/framework/Source/GPUImageMaskFilter.m b/framework/Source/GPUImageMaskFilter.m index f3a157f7f..bf3c84d3d 100755 --- a/framework/Source/GPUImageMaskFilter.m +++ b/framework/Source/GPUImageMaskFilter.m @@ -1,5 +1,6 @@ #import "GPUImageMaskFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageMaskShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -23,7 +24,33 @@ void main() gl_FragColor = vec4(textureColor.xyz, newAlpha); // gl_FragColor = vec4(textureColor2); } - ); +); +#else +NSString *const kGPUImageMaskShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + + //Averages mask's the RGB values, and scales that value by the mask's alpha + // + //The dot product should take fewer cycles than doing an average normally + // + //Typical/ideal case, R,G, and B will be the same, and Alpha will be 1.0 + float newAlpha = dot(textureColor2.rgb, vec3(.33333334, .33333334, .33333334)) * textureColor2.a; + + gl_FragColor = vec4(textureColor.xyz, newAlpha); + // gl_FragColor = vec4(textureColor2); + } +); +#endif @implementation GPUImageMaskFilter diff --git a/framework/Source/GPUImageMultiplyBlendFilter.m b/framework/Source/GPUImageMultiplyBlendFilter.m index 5842056f8..ed6470723 100755 --- a/framework/Source/GPUImageMultiplyBlendFilter.m +++ b/framework/Source/GPUImageMultiplyBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageMultiplyBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageMultiplyBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -16,6 +17,24 @@ void main() gl_FragColor = overlayer * base + overlayer * (1.0 - base.a) + base * (1.0 - overlayer.a); } ); +#else +NSString *const kGPUImageMultiplyBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlayer = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = overlayer * base + overlayer * (1.0 - base.a) + base * (1.0 - overlayer.a); + } +); +#endif @implementation GPUImageMultiplyBlendFilter diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m index d32f95404..52477227a 100644 --- a/framework/Source/GPUImageNormalBlendFilter.m +++ b/framework/Source/GPUImageNormalBlendFilter.m @@ -15,6 +15,7 @@ For some reason Photoshop behaves D = C1 + C2 * C2a * (1 - C1a) */ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageNormalBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -43,7 +44,38 @@ void main() gl_FragColor = outputColor; } - ); +); +#else +NSString *const kGPUImageNormalBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 c2 = texture2D(inputImageTexture, textureCoordinate); + vec4 c1 = texture2D(inputImageTexture2, textureCoordinate2); + + vec4 outputColor; + + // outputColor.r = c1.r + c2.r * c2.a * (1.0 - c1.a); + // outputColor.g = c1.g + c2.g * c2.a * (1.0 - c1.a); + // outputColor.b = c1.b + c2.b * c2.a * (1.0 - c1.a); + // outputColor.a = c1.a + c2.a * (1.0 - c1.a); + + float a = c1.a + c2.a * (1.0 - c1.a); + outputColor.r = (c1.r * c1.a + c2.r * c2.a * (1.0 - c1.a))/a; + outputColor.g = (c1.g * c1.a + c2.g * c2.a * (1.0 - c1.a))/a; + outputColor.b = (c1.b * c1.a + c2.b * c2.a * (1.0 - c1.a))/a; + outputColor.a = a; + + gl_FragColor = outputColor; + } +); +#endif @implementation GPUImageNormalBlendFilter diff --git a/framework/Source/GPUImageOpacityFilter.m b/framework/Source/GPUImageOpacityFilter.m index 401a2e672..b74acb604 100644 --- a/framework/Source/GPUImageOpacityFilter.m +++ b/framework/Source/GPUImageOpacityFilter.m @@ -4,6 +4,7 @@ @implementation GPUImageOpacityFilter @synthesize opacity = _opacity; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageOpacityFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -17,7 +18,23 @@ void main() gl_FragColor = vec4(textureColor.rgb, textureColor.a * opacity); } - ); +); +#else +NSString *const kGPUImageOpacityFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float opacity; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4(textureColor.rgb, textureColor.a * opacity); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageOverlayBlendFilter.m b/framework/Source/GPUImageOverlayBlendFilter.m index 8ab728fbb..c8c5185d0 100755 --- a/framework/Source/GPUImageOverlayBlendFilter.m +++ b/framework/Source/GPUImageOverlayBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageOverlayBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageOverlayBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -37,6 +38,45 @@ void main() gl_FragColor = vec4(ra, ga, ba, 1.0); } ); +#else +NSString *const kGPUImageOverlayBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + float ra; + if (2.0 * base.r < base.a) { + ra = 2.0 * overlay.r * base.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } else { + ra = overlay.a * base.a - 2.0 * (base.a - base.r) * (overlay.a - overlay.r) + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a); + } + + float ga; + if (2.0 * base.g < base.a) { + ga = 2.0 * overlay.g * base.g + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } else { + ga = overlay.a * base.a - 2.0 * (base.a - base.g) * (overlay.a - overlay.g) + overlay.g * (1.0 - base.a) + base.g * (1.0 - overlay.a); + } + + float ba; + if (2.0 * base.b < base.a) { + ba = 2.0 * overlay.b * base.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } else { + ba = overlay.a * base.a - 2.0 * (base.a - base.b) * (overlay.a - overlay.b) + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a); + } + + gl_FragColor = vec4(ra, ga, ba, 1.0); + } +); +#endif @implementation GPUImageOverlayBlendFilter diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m index 64697a1d7..8cca788d5 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.m +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImagePoissonBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePoissonBlendFragmentShaderString = SHADER_STRING ( precision mediump float; @@ -46,6 +47,52 @@ void main() gl_FragColor = vec4(mix(centerColor.rgb, gradColor, centerColor2.a * mixturePercent), centerColor.a); } ); +#else +NSString *const kGPUImagePoissonBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + varying vec2 topTextureCoordinate; + varying vec2 bottomTextureCoordinate; + + varying vec2 textureCoordinate2; + varying vec2 leftTextureCoordinate2; + varying vec2 rightTextureCoordinate2; + varying vec2 topTextureCoordinate2; + varying vec2 bottomTextureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform float mixturePercent; + + void main() + { + vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; + + vec4 centerColor2 = texture2D(inputImageTexture2, textureCoordinate2); + vec3 bottomColor2 = texture2D(inputImageTexture2, bottomTextureCoordinate2).rgb; + vec3 leftColor2 = texture2D(inputImageTexture2, leftTextureCoordinate2).rgb; + vec3 rightColor2 = texture2D(inputImageTexture2, rightTextureCoordinate2).rgb; + vec3 topColor2 = texture2D(inputImageTexture2, topTextureCoordinate2).rgb; + + vec3 meanColor = (bottomColor + leftColor + rightColor + topColor) / 4.0; + vec3 diffColor = centerColor.rgb - meanColor; + + vec3 meanColor2 = (bottomColor2 + leftColor2 + rightColor2 + topColor2) / 4.0; + vec3 diffColor2 = centerColor2.rgb - meanColor2; + + vec3 gradColor = (meanColor + diffColor2); + + gl_FragColor = vec4(mix(centerColor.rgb, gradColor, centerColor2.a * mixturePercent), centerColor.a); + } +); +#endif @implementation GPUImagePoissonBlendFilter @@ -139,6 +186,8 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + #if defined(__IPHONE_6_0) CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #else @@ -191,6 +240,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); [self notifyTargetsAboutNewOutputTexture]; +#endif } else { @@ -242,6 +292,7 @@ - (void)destroyFilterFBO; secondFilterFramebuffer = 0; } +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE if (filterTextureCache != NULL) { CFRelease(renderTarget); @@ -257,6 +308,7 @@ - (void)destroyFilterFBO; CFRelease(filterTextureCache); filterTextureCache = NULL; } +#endif }); } diff --git a/framework/Source/GPUImageSaturationBlendFilter.m b/framework/Source/GPUImageSaturationBlendFilter.m index 1925926dd..da37f6aab 100644 --- a/framework/Source/GPUImageSaturationBlendFilter.m +++ b/framework/Source/GPUImageSaturationBlendFilter.m @@ -3,6 +3,7 @@ /** * Saturation blend mode based upon pseudo code from the PDF specification. */ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSaturationBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -97,7 +98,104 @@ void main() gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(baseColor.rgb, sat(overlayColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); } - ); +); +#else +NSString *const kGPUImageSaturationBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + float lum(vec3 c) { + return dot(c, vec3(0.3, 0.59, 0.11)); + } + + vec3 clipcolor(vec3 c) { + float l = lum(c); + float n = min(min(c.r, c.g), c.b); + float x = max(max(c.r, c.g), c.b); + + if (n < 0.0) { + c.r = l + ((c.r - l) * l) / (l - n); + c.g = l + ((c.g - l) * l) / (l - n); + c.b = l + ((c.b - l) * l) / (l - n); + } + if (x > 1.0) { + c.r = l + ((c.r - l) * (1.0 - l)) / (x - l); + c.g = l + ((c.g - l) * (1.0 - l)) / (x - l); + c.b = l + ((c.b - l) * (1.0 - l)) / (x - l); + } + + return c; + } + + vec3 setlum(vec3 c, float l) { + float d = l - lum(c); + c = c + vec3(d); + return clipcolor(c); + } + + float sat(vec3 c) { + float n = min(min(c.r, c.g), c.b); + float x = max(max(c.r, c.g), c.b); + return x - n; + } + + float mid(float cmin, float cmid, float cmax, float s) { + return ((cmid - cmin) * s) / (cmax - cmin); + } + + vec3 setsat(vec3 c, float s) { + if (c.r > c.g) { + if (c.r > c.b) { + if (c.g > c.b) { + /* g is mid, b is min */ + c.g = mid(c.b, c.g, c.r, s); + c.b = 0.0; + } else { + /* b is mid, g is min */ + c.b = mid(c.g, c.b, c.r, s); + c.g = 0.0; + } + c.r = s; + } else { + /* b is max, r is mid, g is min */ + c.r = mid(c.g, c.r, c.b, s); + c.b = s; + c.r = 0.0; + } + } else if (c.r > c.b) { + /* g is max, r is mid, b is min */ + c.r = mid(c.b, c.r, c.g, s); + c.g = s; + c.b = 0.0; + } else if (c.g > c.b) { + /* g is max, b is mid, r is min */ + c.b = mid(c.r, c.b, c.g, s); + c.g = s; + c.r = 0.0; + } else if (c.b > c.g) { + /* b is max, g is mid, r is min */ + c.g = mid(c.r, c.g, c.b, s); + c.b = s; + c.r = 0.0; + } else { + c = vec3(0.0); + } + return c; + } + + void main() + { + vec4 baseColor = texture2D(inputImageTexture, textureCoordinate); + vec4 overlayColor = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(baseColor.rgb * (1.0 - overlayColor.a) + setlum(setsat(baseColor.rgb, sat(overlayColor.rgb)), lum(baseColor.rgb)) * overlayColor.a, baseColor.a); + } +); +#endif @implementation GPUImageSaturationBlendFilter diff --git a/framework/Source/GPUImageScreenBlendFilter.m b/framework/Source/GPUImageScreenBlendFilter.m index 4db0b987d..d871e7db2 100755 --- a/framework/Source/GPUImageScreenBlendFilter.m +++ b/framework/Source/GPUImageScreenBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageScreenBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageScreenBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -16,6 +17,24 @@ void main() gl_FragColor = whiteColor - ((whiteColor - textureColor2) * (whiteColor - textureColor)); } ); +#else +NSString *const kGPUImageScreenBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + vec4 whiteColor = vec4(1.0); + gl_FragColor = whiteColor - ((whiteColor - textureColor2) * (whiteColor - textureColor)); + } +); +#endif @implementation GPUImageScreenBlendFilter diff --git a/framework/Source/GPUImageSoftLightBlendFilter.m b/framework/Source/GPUImageSoftLightBlendFilter.m index c67d461c5..944640bd2 100755 --- a/framework/Source/GPUImageSoftLightBlendFilter.m +++ b/framework/Source/GPUImageSoftLightBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageSoftLightBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSoftLightBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -16,6 +17,24 @@ void main() gl_FragColor = base * (overlay.a * (base / base.a) + (2.0 * overlay * (1.0 - (base / base.a)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a); } ); +#else +NSString *const kGPUImageSoftLightBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 base = texture2D(inputImageTexture, textureCoordinate); + vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = base * (overlay.a * (base / base.a) + (2.0 * overlay * (1.0 - (base / base.a)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a); + } +); +#endif @implementation GPUImageSoftLightBlendFilter diff --git a/framework/Source/GPUImageSourceOverBlendFilter.m b/framework/Source/GPUImageSourceOverBlendFilter.m index a1b79a099..432adc4b6 100644 --- a/framework/Source/GPUImageSourceOverBlendFilter.m +++ b/framework/Source/GPUImageSourceOverBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageSourceOverBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSourceOverBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -16,6 +17,24 @@ void main() gl_FragColor = mix(textureColor, textureColor2, textureColor2.a); } ); +#else +NSString *const kGPUImageSourceOverBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate); + + gl_FragColor = mix(textureColor, textureColor2, textureColor2.a); + } + ); +#endif @implementation GPUImageSourceOverBlendFilter diff --git a/framework/Source/GPUImageSubtractBlendFilter.m b/framework/Source/GPUImageSubtractBlendFilter.m index b03726ae9..8938baeab 100755 --- a/framework/Source/GPUImageSubtractBlendFilter.m +++ b/framework/Source/GPUImageSubtractBlendFilter.m @@ -1,5 +1,6 @@ #import "GPUImageSubtractBlendFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSubtractBlendFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -15,7 +16,25 @@ void main() gl_FragColor = vec4(textureColor.rgb - textureColor2.rgb, textureColor.a); } - ); +); +#else +NSString *const kGPUImageSubtractBlendFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); + + gl_FragColor = vec4(textureColor.rgb - textureColor2.rgb, textureColor.a); + } +); +#endif @implementation GPUImageSubtractBlendFilter diff --git a/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m index 9e74f4b85..aa338f816 100644 --- a/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m @@ -6,8 +6,8 @@ attribute vec4 inputTextureCoordinate; attribute vec4 inputTextureCoordinate2; - uniform highp float texelWidth; - uniform highp float texelHeight; + uniform float texelWidth; + uniform float texelHeight; varying vec2 textureCoordinate; varying vec2 leftTextureCoordinate; diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index dd87289c0..2cd30b24d 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -45,6 +45,33 @@ #import #import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import // Outputs #import From 840d70849e1d652544f1c1e1348fcacc80956c48 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 25 Apr 2013 11:59:44 -0500 Subject: [PATCH 362/695] Fixed a crashing bug in the crop filter on iOS. --- framework/Source/GPUImageCropFilter.m | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 43381b33d..188c87184 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -1,5 +1,18 @@ #import "GPUImageCropFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageCropFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate); + } +); +#else NSString *const kGPUImageCropFragmentShaderString = SHADER_STRING ( varying vec2 textureCoordinate; @@ -11,6 +24,7 @@ void main() gl_FragColor = texture2D(inputImageTexture, textureCoordinate); } ); +#endif @interface GPUImageCropFilter () From 58e680e5aa849d80d9d4c1e65e55bd440f703036 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 25 Apr 2013 22:52:47 -0500 Subject: [PATCH 363/695] Ported a few more color adjustment filters to the Mac. Tweaked the way that GPUImageView works on the Mac to support resizing correctly. --- .../SLSFilterShowcaseWindowController.h | 5 + .../SLSFilterShowcaseWindowController.m | 55 +++++++++++ .../project.pbxproj | 2 +- .../GPUImageMac.xcodeproj/project.pbxproj | 50 ++++++++++ .../Source/GPUImageChromaKeyBlendFilter.m | 4 +- framework/Source/GPUImageColorMatrixFilter.m | 22 ++++- framework/Source/GPUImageFilterGroup.h | 2 +- framework/Source/GPUImageFilterGroup.m | 2 +- framework/Source/GPUImageGammaFilter.m | 17 ++++ framework/Source/GPUImageHazeFilter.m | 30 +++++- .../Source/GPUImageHighlightShadowFilter.m | 25 +++++ framework/Source/GPUImageOutput.m | 2 +- framework/Source/GPUImageToneCurveFilter.m | 95 +++++++++++++++++-- framework/Source/Mac/GPUImage.h | 6 ++ framework/Source/Mac/GPUImagePicture.m | 36 ++++++- framework/Source/Mac/GPUImageView.m | 10 +- 16 files changed, 336 insertions(+), 27 deletions(-) diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index 7f1af9aa9..7e258aaf3 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -18,6 +18,11 @@ typedef enum { GPUIMAGE_TRANSFORM3D, GPUIMAGE_CROP, GPUIMAGE_MASK, + GPUIMAGE_GAMMA, + GPUIMAGE_TONECURVE, + GPUIMAGE_HIGHLIGHTSHADOW, + GPUIMAGE_HAZE, + GPUIMAGE_SEPIA, GPUIMAGE_PIXELLATE, GPUIMAGE_GRAYSCALE, GPUIMAGE_SOBELEDGEDETECTION, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 5854ff540..4cb4ba032 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -207,6 +207,51 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.enableSlider = NO; needsSecondImage = YES; }; break; + case GPUIMAGE_GAMMA: + { + currentlySelectedFilter = [[GPUImageGammaFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 3.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_TONECURVE: + { + currentlySelectedFilter = [[GPUImageToneCurveFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_HIGHLIGHTSHADOW: + { + currentlySelectedFilter = [[GPUImageHighlightShadowFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_HAZE: + { + currentlySelectedFilter = [[GPUImageHazeFilter alloc] init]; + + self.minimumSliderValue = -0.2; + self.maximumSliderValue = 0.2; + self.currentSliderValue = 0.2; + self.enableSlider = YES; + }; break; + case GPUIMAGE_SEPIA: + { + currentlySelectedFilter = [[GPUImageSepiaFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; case GPUIMAGE_GRAYSCALE: { currentlySelectedFilter = [[GPUImageGrayscaleFilter alloc] init]; @@ -573,6 +618,11 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_HUE: [(GPUImageHueFilter *)currentlySelectedFilter setHue:_currentSliderValue]; break; case GPUIMAGE_WHITEBALANCE: [(GPUImageWhiteBalanceFilter *)currentlySelectedFilter setTemperature:_currentSliderValue]; break; case GPUIMAGE_MONOCHROME: [(GPUImageMonochromeFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; + case GPUIMAGE_GAMMA: [(GPUImageGammaFilter *)currentlySelectedFilter setGamma:_currentSliderValue]; break; + case GPUIMAGE_TONECURVE: [(GPUImageToneCurveFilter *)currentlySelectedFilter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithPoint:NSMakePoint(0.0, 0.0)], [NSValue valueWithPoint:NSMakePoint(0.5, _currentSliderValue)], [NSValue valueWithPoint:NSMakePoint(1.0, 0.75)], nil]]; break; + case GPUIMAGE_HIGHLIGHTSHADOW: [(GPUImageHighlightShadowFilter *)currentlySelectedFilter setHighlights:_currentSliderValue]; break; + case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)currentlySelectedFilter setDistance:_currentSliderValue]; break; + case GPUIMAGE_SEPIA: [(GPUImageSepiaFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)currentlySelectedFilter setSharpness:_currentSliderValue]; break; @@ -639,6 +689,11 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_TRANSFORM3D: tableRowTitle = @"Transform (3-D)"; break; case GPUIMAGE_CROP: tableRowTitle = @"Crop"; break; case GPUIMAGE_MASK: tableRowTitle = @"Mask"; break; + case GPUIMAGE_GAMMA: tableRowTitle = @"Gamma"; break; + case GPUIMAGE_TONECURVE: tableRowTitle = @"Tone curve"; break; + case GPUIMAGE_HIGHLIGHTSHADOW: tableRowTitle = @"Highlights and shadows"; break; + case GPUIMAGE_HAZE: tableRowTitle = @"Haze"; break; + case GPUIMAGE_SEPIA: tableRowTitle = @"Sepia tone"; break; case GPUIMAGE_GAUSSIAN: tableRowTitle = @"Gaussian blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: tableRowTitle = @"Gaussian selective blur"; break; case GPUIMAGE_GAUSSIAN_POSITION: tableRowTitle = @"Gaussian (centered)"; break; diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index 31d5a4fe7..344dabae1 100644 --- a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -155,9 +155,9 @@ buildConfigurationList = BCA3F35D1723A2E800E28AEC /* Build configuration list for PBXNativeTarget "SimplePhotoFilter" */; buildPhases = ( BCA3F3391723A2E800E28AEC /* Sources */, - BCF40F341724AF95005AE36A /* CopyFiles */, BCA3F33A1723A2E800E28AEC /* Frameworks */, BCA3F33B1723A2E800E28AEC /* Resources */, + BCF40F341724AF95005AE36A /* CopyFiles */, ); buildRules = ( ); diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 5ae71bfa3..131d55c3b 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -11,6 +11,18 @@ BCA3F3621723A8FA00E28AEC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3601723A8FA00E28AEC /* OpenGL.framework */; }; BCA3F3631723A8FA00E28AEC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */; }; BCA3F3651723A96600E28AEC /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA3F3641723A96600E28AEC /* GPUImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB009E6172A1BBD00DB804C /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009E4172A1BBD00DB804C /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB009E7172A1BBD00DB804C /* GPUImageGammaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009E5172A1BBD00DB804C /* GPUImageGammaFilter.m */; }; + BCB009EA172A1BE800DB804C /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009E8172A1BE800DB804C /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB009EB172A1BE800DB804C /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009E9172A1BE800DB804C /* GPUImageToneCurveFilter.m */; }; + BCB009F0172A23AA00DB804C /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009EC172A23A900DB804C /* GPUImageHazeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB009F1172A23AA00DB804C /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009ED172A23A900DB804C /* GPUImageHazeFilter.m */; }; + BCB009F2172A23AA00DB804C /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009EE172A23AA00DB804C /* GPUImageHighlightShadowFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB009F3172A23AA00DB804C /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009EF172A23AA00DB804C /* GPUImageHighlightShadowFilter.m */; }; + BCB009F6172A243400DB804C /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009F4172A243300DB804C /* GPUImageSepiaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB009F7172A243400DB804C /* GPUImageSepiaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009F5172A243400DB804C /* GPUImageSepiaFilter.m */; }; + BCB009FA172A246E00DB804C /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009F8172A246D00DB804C /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB009FB172A246E00DB804C /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009F9172A246E00DB804C /* GPUImageColorMatrixFilter.m */; }; BCF40F1217247D68005AE36A /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1017247D68005AE36A /* GPUImageContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF40F1317247D68005AE36A /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F1117247D68005AE36A /* GPUImageContext.m */; }; BCF40F1617247FD8005AE36A /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1417247FD8005AE36A /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -166,6 +178,18 @@ BCA3F3601723A8FA00E28AEC /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BCA3F3641723A96600E28AEC /* GPUImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage.h; path = Source/Mac/GPUImage.h; sourceTree = SOURCE_ROOT; }; + BCB009E4172A1BBD00DB804C /* GPUImageGammaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGammaFilter.h; path = Source/GPUImageGammaFilter.h; sourceTree = SOURCE_ROOT; }; + BCB009E5172A1BBD00DB804C /* GPUImageGammaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGammaFilter.m; path = Source/GPUImageGammaFilter.m; sourceTree = SOURCE_ROOT; }; + BCB009E8172A1BE800DB804C /* GPUImageToneCurveFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageToneCurveFilter.h; path = Source/GPUImageToneCurveFilter.h; sourceTree = SOURCE_ROOT; }; + BCB009E9172A1BE800DB804C /* GPUImageToneCurveFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageToneCurveFilter.m; path = Source/GPUImageToneCurveFilter.m; sourceTree = SOURCE_ROOT; }; + BCB009EC172A23A900DB804C /* GPUImageHazeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHazeFilter.h; path = Source/GPUImageHazeFilter.h; sourceTree = SOURCE_ROOT; }; + BCB009ED172A23A900DB804C /* GPUImageHazeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHazeFilter.m; path = Source/GPUImageHazeFilter.m; sourceTree = SOURCE_ROOT; }; + BCB009EE172A23AA00DB804C /* GPUImageHighlightShadowFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHighlightShadowFilter.h; path = Source/GPUImageHighlightShadowFilter.h; sourceTree = SOURCE_ROOT; }; + BCB009EF172A23AA00DB804C /* GPUImageHighlightShadowFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHighlightShadowFilter.m; path = Source/GPUImageHighlightShadowFilter.m; sourceTree = SOURCE_ROOT; }; + BCB009F4172A243300DB804C /* GPUImageSepiaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSepiaFilter.h; path = Source/GPUImageSepiaFilter.h; sourceTree = SOURCE_ROOT; }; + BCB009F5172A243400DB804C /* GPUImageSepiaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSepiaFilter.m; path = Source/GPUImageSepiaFilter.m; sourceTree = SOURCE_ROOT; }; + BCB009F8172A246D00DB804C /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; + BCB009F9172A246E00DB804C /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; BCF40F1017247D68005AE36A /* GPUImageContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageContext.h; path = Source/Mac/GPUImageContext.h; sourceTree = SOURCE_ROOT; }; BCF40F1117247D68005AE36A /* GPUImageContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageContext.m; path = Source/Mac/GPUImageContext.m; sourceTree = SOURCE_ROOT; }; BCF40F1417247FD8005AE36A /* GLProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GLProgram.h; path = Source/GLProgram.h; sourceTree = SOURCE_ROOT; }; @@ -465,6 +489,18 @@ BCF867DF17278D1900912E34 /* GPUImageGrayscaleFilter.m */, BCF867E61728477200912E34 /* GPUImageFalseColorFilter.h */, BCF867E71728477200912E34 /* GPUImageFalseColorFilter.m */, + BCB009E4172A1BBD00DB804C /* GPUImageGammaFilter.h */, + BCB009E5172A1BBD00DB804C /* GPUImageGammaFilter.m */, + BCB009E8172A1BE800DB804C /* GPUImageToneCurveFilter.h */, + BCB009E9172A1BE800DB804C /* GPUImageToneCurveFilter.m */, + BCB009EE172A23AA00DB804C /* GPUImageHighlightShadowFilter.h */, + BCB009EF172A23AA00DB804C /* GPUImageHighlightShadowFilter.m */, + BCB009EC172A23A900DB804C /* GPUImageHazeFilter.h */, + BCB009ED172A23A900DB804C /* GPUImageHazeFilter.m */, + BCB009F8172A246D00DB804C /* GPUImageColorMatrixFilter.h */, + BCB009F9172A246E00DB804C /* GPUImageColorMatrixFilter.m */, + BCB009F4172A243300DB804C /* GPUImageSepiaFilter.h */, + BCB009F5172A243400DB804C /* GPUImageSepiaFilter.m */, BCF8689B1728861E00912E34 /* GPUImageOpacityFilter.h */, BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */, ); @@ -658,6 +694,12 @@ BCF86899172883A300912E34 /* GPUImageMaskFilter.h in Headers */, BCF8689D1728862100912E34 /* GPUImageOpacityFilter.h in Headers */, BCF868A11728866400912E34 /* GPUImageAlphaBlendFilter.h in Headers */, + BCB009E6172A1BBD00DB804C /* GPUImageGammaFilter.h in Headers */, + BCB009EA172A1BE800DB804C /* GPUImageToneCurveFilter.h in Headers */, + BCB009F0172A23AA00DB804C /* GPUImageHazeFilter.h in Headers */, + BCB009F2172A23AA00DB804C /* GPUImageHighlightShadowFilter.h in Headers */, + BCB009F6172A243400DB804C /* GPUImageSepiaFilter.h in Headers */, + BCB009FA172A246E00DB804C /* GPUImageColorMatrixFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -793,6 +835,12 @@ BCF8689A172883A300912E34 /* GPUImageMaskFilter.m in Sources */, BCF8689E1728862100912E34 /* GPUImageOpacityFilter.m in Sources */, BCF868A21728866400912E34 /* GPUImageAlphaBlendFilter.m in Sources */, + BCB009E7172A1BBD00DB804C /* GPUImageGammaFilter.m in Sources */, + BCB009EB172A1BE800DB804C /* GPUImageToneCurveFilter.m in Sources */, + BCB009F1172A23AA00DB804C /* GPUImageHazeFilter.m in Sources */, + BCB009F3172A23AA00DB804C /* GPUImageHighlightShadowFilter.m in Sources */, + BCB009F7172A243400DB804C /* GPUImageSepiaFilter.m in Sources */, + BCB009FB172A246E00DB804C /* GPUImageColorMatrixFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -826,6 +874,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; + INSTALL_PATH = "@loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -853,6 +902,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; + INSTALL_PATH = "@loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx; }; diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m index 5d039745f..d6b2d7286 100755 --- a/framework/Source/GPUImageChromaKeyBlendFilter.m +++ b/framework/Source/GPUImageChromaKeyBlendFilter.m @@ -99,14 +99,14 @@ - (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent [self setVec3:colorToReplace forUniform:colorToReplaceUniform program:filterProgram]; } -- (void)setThresholdSensitivity:(CGFloat)newValue; +- (void)setThresholdSensitivity:(GLfloat)newValue; { _thresholdSensitivity = newValue; [self setFloat:_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; } -- (void)setSmoothing:(CGFloat)newValue; +- (void)setSmoothing:(GLfloat)newValue; { _smoothing = newValue; diff --git a/framework/Source/GPUImageColorMatrixFilter.m b/framework/Source/GPUImageColorMatrixFilter.m index d247f5b8b..0e21c7e8b 100755 --- a/framework/Source/GPUImageColorMatrixFilter.m +++ b/framework/Source/GPUImageColorMatrixFilter.m @@ -1,5 +1,6 @@ #import "GPUImageColorMatrixFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageColorMatrixFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -16,7 +17,26 @@ void main() gl_FragColor = (intensity * outputColor) + ((1.0 - intensity) * textureColor); } -); +); +#else +NSString *const kGPUImageColorMatrixFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform mat4 colorMatrix; + uniform float intensity; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + vec4 outputColor = textureColor * colorMatrix; + + gl_FragColor = (intensity * outputColor) + ((1.0 - intensity) * textureColor); + } +); +#endif @implementation GPUImageColorMatrixFilter diff --git a/framework/Source/GPUImageFilterGroup.h b/framework/Source/GPUImageFilterGroup.h index 16c1c3dd1..b30374c86 100755 --- a/framework/Source/GPUImageFilterGroup.h +++ b/framework/Source/GPUImageFilterGroup.h @@ -13,6 +13,6 @@ // Filter management - (void)addFilter:(GPUImageOutput *)newFilter; - (GPUImageOutput *)filterAtIndex:(NSUInteger)filterIndex; -- (int)filterCount; +- (NSUInteger)filterCount; @end diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 457c7accb..faaee993e 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -32,7 +32,7 @@ - (void)addFilter:(GPUImageOutput *)newFilter; return [filters objectAtIndex:filterIndex]; } -- (int)filterCount; +- (NSUInteger)filterCount; { return [filters count]; } diff --git a/framework/Source/GPUImageGammaFilter.m b/framework/Source/GPUImageGammaFilter.m index 1e74ac123..35adaba2f 100755 --- a/framework/Source/GPUImageGammaFilter.m +++ b/framework/Source/GPUImageGammaFilter.m @@ -1,5 +1,6 @@ #import "GPUImageGammaFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageGammaFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -14,6 +15,22 @@ void main() gl_FragColor = vec4(pow(textureColor.rgb, vec3(gamma)), textureColor.w); } ); +#else +NSString *const kGPUImageGammaFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float gamma; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4(pow(textureColor.rgb, vec3(gamma)), textureColor.w); + } +); +#endif @implementation GPUImageGammaFilter diff --git a/framework/Source/GPUImageHazeFilter.m b/framework/Source/GPUImageHazeFilter.m index 525fb7978..e9e8db822 100755 --- a/framework/Source/GPUImageHazeFilter.m +++ b/framework/Source/GPUImageHazeFilter.m @@ -1,5 +1,6 @@ #import "GPUImageHazeFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHazeFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -18,15 +19,36 @@ void main() highp vec4 c = texture2D(inputImageTexture, textureCoordinate) ; // consider using unpremultiply - - c = (c - d * color) / (1.0 -d); + c = (c - d * color) / (1.0 -d); gl_FragColor = c; //consider using premultiply(c); + } +); +#else +NSString *const kGPUImageHazeFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float distance; + uniform float slope; + + void main() + { + //todo reconsider precision modifiers + vec4 color = vec4(1.0);//todo reimplement as a parameter - + float d = textureCoordinate.y * slope + distance; + + vec4 c = texture2D(inputImageTexture, textureCoordinate) ; // consider using unpremultiply + + c = (c - d * color) / (1.0 -d); + + gl_FragColor = c; //consider using premultiply(c); } ); - +#endif diff --git a/framework/Source/GPUImageHighlightShadowFilter.m b/framework/Source/GPUImageHighlightShadowFilter.m index 50cc3f2ea..aa92b7404 100644 --- a/framework/Source/GPUImageHighlightShadowFilter.m +++ b/framework/Source/GPUImageHighlightShadowFilter.m @@ -1,5 +1,6 @@ #import "GPUImageHighlightShadowFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHighlightShadowFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -22,6 +23,30 @@ void main() gl_FragColor = vec4(result.rgb, source.a); } ); +#else +NSString *const kGPUImageHighlightShadowFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + varying vec2 textureCoordinate; + + uniform float shadows; + uniform float highlights; + + const vec3 luminanceWeighting = vec3(0.3, 0.3, 0.3); + + void main() + { + vec4 source = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(source.rgb, luminanceWeighting); + + float shadow = clamp((pow(luminance, 1.0/(shadows+1.0)) + (-0.76)*pow(luminance, 2.0/(shadows+1.0))) - luminance, 0.0, 1.0); + float highlight = clamp((1.0 - (pow(1.0-luminance, 1.0/(2.0-highlights)) + (-0.8)*pow(1.0-luminance, 2.0/(2.0-highlights)))) - luminance, -1.0, 0.0); + vec3 result = vec3(0.0, 0.0, 0.0) + ((luminance + shadow + highlight) - 0.0) * ((source.rgb - vec3(0.0, 0.0, 0.0))/(luminance - 0.0)); + + gl_FragColor = vec4(result.rgb, source.a); + } +); +#endif @implementation GPUImageHighlightShadowFilter diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index b742c5839..751ad5e3d 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -58,7 +58,7 @@ void reportAvailableMemoryForGPUImage(NSString *tag) &size); if( kerr == KERN_SUCCESS ) { - NSLog(@"%@ - Memory used: %u", tag, info.resident_size); //in bytes + NSLog(@"%@ - Memory used: %u", tag, (unsigned int)info.resident_size); //in bytes } else { NSLog(@"%@ - Error: %s", tag, mach_error_string(kerr)); } diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 574a876d9..3fe2a539d 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -72,8 +72,12 @@ - (id) initWithACVFileData:(NSData *)data { rawBytes+=2; unsigned short x = int16WithBytes(rawBytes); rawBytes+=2; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE [points addObject:[NSValue valueWithCGSize:CGSizeMake(x * pointRate, y * pointRate)]]; - } +#else + [points addObject:[NSValue valueWithSize:CGSizeMake(x * pointRate, y * pointRate)]]; +#endif + } [curves addObject:points]; } rgbCompositeCurvePoints = [curves objectAtIndex:0]; @@ -94,6 +98,7 @@ unsigned short int16WithBytes(Byte* bytes) { #pragma mark - #pragma mark GPUImageToneCurveFilter Implementation +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageToneCurveFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -110,7 +115,24 @@ void main() gl_FragColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, textureColor.a); } ); - +#else +NSString *const kGPUImageToneCurveFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D toneCurveTexture; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float redCurveValue = texture2D(toneCurveTexture, vec2(textureColor.r, 0.0)).r; + float greenCurveValue = texture2D(toneCurveTexture, vec2(textureColor.g, 0.0)).g; + float blueCurveValue = texture2D(toneCurveTexture, vec2(textureColor.b, 0.0)).b; + + gl_FragColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, textureColor.a); + } +); +#endif @interface GPUImageToneCurveFilter() { @@ -140,9 +162,12 @@ - (id)init; return nil; } - toneCurveTextureUniform = [filterProgram uniformIndex:@"toneCurveTexture"]; - + toneCurveTextureUniform = [filterProgram uniformIndex:@"toneCurveTexture"]; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSArray *defaultCurve = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, 0.5)], [NSValue valueWithCGPoint:CGPointMake(1.0, 1.0)], nil]; +#else + NSArray *defaultCurve = [NSArray arrayWithObjects:[NSValue valueWithPoint:NSMakePoint(0.0, 0.0)], [NSValue valueWithPoint:NSMakePoint(0.5, 0.5)], [NSValue valueWithPoint:NSMakePoint(1.0, 1.0)], nil]; +#endif [self setRgbCompositeControlPoints:defaultCurve]; [self setRedControlPoints:defaultCurve]; [self setGreenControlPoints:defaultCurve]; @@ -220,20 +245,33 @@ - (NSArray *)getPreparedSplineCurve:(NSArray *)points if (points && [points count] > 0) { // Sort the array. - NSArray *sortedPoints = [points sortedArrayUsingComparator:^(id a, id b) { + NSArray *sortedPoints = [points sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE float x1 = [(NSValue *)a CGPointValue].x; - float x2 = [(NSValue *)b CGPointValue].x; + float x2 = [(NSValue *)b CGPointValue].x; +#else + float x1 = [(NSValue *)a pointValue].x; + float x2 = [(NSValue *)b pointValue].x; +#endif return x1 > x2; }]; // Convert from (0, 1) to (0, 255). NSMutableArray *convertedPoints = [NSMutableArray arrayWithCapacity:[sortedPoints count]]; for (int i=0; i<[points count]; i++){ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGPoint point = [[sortedPoints objectAtIndex:i] CGPointValue]; +#else + NSPoint point = [[sortedPoints objectAtIndex:i] pointValue]; +#endif point.x = point.x * 255; point.y = point.y * 255; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE [convertedPoints addObject:[NSValue valueWithCGPoint:point]]; +#else + [convertedPoints addObject:[NSValue valueWithPoint:point]]; +#endif } @@ -241,16 +279,26 @@ - (NSArray *)getPreparedSplineCurve:(NSArray *)points // If we have a first point like (0.3, 0) we'll be missing some points at the beginning // that should be 0. +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGPoint firstSplinePoint = [[splinePoints objectAtIndex:0] CGPointValue]; +#else + NSPoint firstSplinePoint = [[splinePoints objectAtIndex:0] pointValue]; +#endif if (firstSplinePoint.x > 0) { for (int i=firstSplinePoint.x; i >= 0; i--) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGPoint newCGPoint = CGPointMake(i, 0); [splinePoints insertObject:[NSValue valueWithCGPoint:newCGPoint] atIndex:0]; +#else + NSPoint newNSPoint = NSMakePoint(i, 0); + [splinePoints insertObject:[NSValue valueWithPoint:newNSPoint] atIndex:0]; +#endif } } // Insert points similarly at the end, if necessary. +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGPoint lastSplinePoint = [[splinePoints objectAtIndex:([splinePoints count] - 1)] CGPointValue]; if (lastSplinePoint.x < 255) { @@ -259,13 +307,26 @@ - (NSArray *)getPreparedSplineCurve:(NSArray *)points [splinePoints addObject:[NSValue valueWithCGPoint:newCGPoint]]; } } +#else + NSPoint lastSplinePoint = [[splinePoints objectAtIndex:([splinePoints count] - 1)] pointValue]; + if (lastSplinePoint.x < 255) { + for (int i = lastSplinePoint.x + 1; i <= 255; i++) { + NSPoint newNSPoint = NSMakePoint(i, 255); + [splinePoints addObject:[NSValue valueWithPoint:newNSPoint]]; + } + } +#endif // Prepare the spline points. NSMutableArray *preparedSplinePoints = [NSMutableArray arrayWithCapacity:[splinePoints count]]; for (int i=0; i<[splinePoints count]; i++) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGPoint newPoint = [[splinePoints objectAtIndex:i] CGPointValue]; +#else + NSPoint newPoint = [[splinePoints objectAtIndex:i] pointValue]; +#endif CGPoint origPoint = CGPointMake(newPoint.x, newPoint.x); float distance = sqrt(pow((origPoint.x - newPoint.x), 2.0) + pow((origPoint.y - newPoint.y), 2.0)); @@ -291,7 +352,7 @@ - (NSMutableArray *)splineCurve:(NSArray *)points // Is [points count] equal to [sdA count]? // int n = [points count]; - int n = [sdA count]; + NSInteger n = [sdA count]; if (n < 1) { return nil; @@ -309,8 +370,13 @@ - (NSMutableArray *)splineCurve:(NSArray *)points for(int i=0; iup) - for(int i=n-2;i>=0;i--) + for(NSInteger i=n-2;i>=0;i--) { double k = matrix[i][2]/matrix[i+1][1]; matrix[i][1] -= k*matrix[i+1][0]; diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 2cd30b24d..4d88a402d 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -72,6 +72,12 @@ #import #import #import +#import +#import +#import +#import +#import +#import // Outputs #import diff --git a/framework/Source/Mac/GPUImagePicture.m b/framework/Source/Mac/GPUImagePicture.m index 577bbebfb..519a3df7a 100755 --- a/framework/Source/Mac/GPUImagePicture.m +++ b/framework/Source/Mac/GPUImagePicture.m @@ -143,7 +143,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, imageData); if (self.shouldSmoothlyScaleOutput) { @@ -177,6 +177,32 @@ - (void)dealloc; #pragma mark - #pragma mark Image rendering +- (void)initializeOutputTextureIfNeeded; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + if (!outputTexture) + { + [GPUImageContext useImageProcessingContext]; + + glEnable(GL_TEXTURE_RECTANGLE_EXT); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + } + }); +} + - (void)removeAllTargets; { [super removeAllTargets]; @@ -196,10 +222,10 @@ - (void)processImage; runAsynchronouslyOnVideoProcessingQueue(^{ - if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) - { - [self conserveMemoryForNextFrame]; - } +// if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) +// { +// [self conserveMemoryForNextFrame]; +// } for (id currentTarget in targets) { diff --git a/framework/Source/Mac/GPUImageView.m b/framework/Source/Mac/GPUImageView.m index 3918bf69a..6d5a5f174 100755 --- a/framework/Source/Mac/GPUImageView.m +++ b/framework/Source/Mac/GPUImageView.m @@ -151,16 +151,24 @@ - (void)destroyDisplayFramebuffer; - (void)setDisplayFramebuffer; { glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindRenderbuffer(GL_RENDERBUFFER, 0); glViewport(0, 0, (GLint)_sizeInPixels.width, (GLint)_sizeInPixels.height); } - (void)presentFramebuffer; { - glBindRenderbuffer(GL_RENDERBUFFER, 0); [[GPUImageContext sharedImageProcessingContext] presentBufferForDisplay]; } +- (void)reshape; +{ + _sizeInPixels.width = self.bounds.size.width; + _sizeInPixels.height = self.bounds.size.height; + [self recalculateViewGeometry]; + [self newFrameReadyAtTime:kCMTimeInvalid atIndex:0]; +} + #pragma mark - #pragma mark Handling fill mode From 7eaf5d3b46f4d3e6540383452a61fe411d9e5034 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 27 Apr 2013 20:22:06 -0500 Subject: [PATCH 364/695] Added a multiview test for the Mac. For now, locking focus on views to prevent glitches with multiple NSOpenGLViews on the Mac. --- .../FilterShowcase.xcodeproj/project.pbxproj | 15 + .../project.pbxproj | 403 +++ .../MultiViewFilterExample-Info.plist | 34 + .../MultiViewFilterExample-Prefix.pch | 7 + .../MultiViewFilterExample/SLSAppDelegate.h | 11 + .../MultiViewFilterExample/SLSAppDelegate.m | 11 + .../SLSMultiViewWindowController.h | 12 + .../SLSMultiViewWindowController.m | 45 + .../SLSMultiViewWindowController.xib | 309 ++ .../MultiViewFilterExample/Shader1.fsh | 19 + .../MultiViewFilterExample/Shader2.fsh | 11 + .../en.lproj/Credits.rtf | 29 + .../en.lproj/InfoPlist.strings | 2 + .../en.lproj/MainMenu.xib | 3128 +++++++++++++++++ .../MultiViewFilterExample/main.m | 6 + .../project.pbxproj | 4 +- .../SimplePhotoFilter/SLSDocument.m | 10 +- framework/Source/GPUImageFilter.m | 4 +- framework/Source/GPUImageOutput.m | 4 - framework/Source/Mac/GPUImageContext.m | 3 +- framework/Source/Mac/GPUImagePicture.m | 9 +- framework/Source/Mac/GPUImageView.m | 104 +- 22 files changed, 4131 insertions(+), 49 deletions(-) create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.h create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.m create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.h create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.xib create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/Credits.rtf create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/MainMenu.xib create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample/main.m diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 8592ff621..6902b70f7 100644 --- a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + BCB00A4C172B17F400DB804C /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BCF8678F17263F3500912E34 /* GPUImage.framework */; }; BCF8676E17263EAC00912E34 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8676D17263EAC00912E34 /* Cocoa.framework */; }; BCF8677817263EAC00912E34 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF8677617263EAC00912E34 /* InfoPlist.strings */; }; BCF8677A17263EAC00912E34 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8677917263EAC00912E34 /* main.m */; }; @@ -39,6 +40,19 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + BCB00A4B172B17E900DB804C /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BCB00A4C172B17F400DB804C /* GPUImage.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ BCF8676A17263EAC00912E34 /* FilterShowcase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FilterShowcase.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCF8676D17263EAC00912E34 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; @@ -161,6 +175,7 @@ buildConfigurationList = BCF8678717263EAD00912E34 /* Build configuration list for PBXNativeTarget "FilterShowcase" */; buildPhases = ( BCF8676617263EAC00912E34 /* Sources */, + BCB00A4B172B17E900DB804C /* CopyFiles */, BCF8676717263EAC00912E34 /* Frameworks */, BCF8676817263EAC00912E34 /* Resources */, ); diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj new file mode 100644 index 000000000..fad7e66d2 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj @@ -0,0 +1,403 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BCB00A15172B0CC500DB804C /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB00A14172B0CC500DB804C /* Cocoa.framework */; }; + BCB00A1F172B0CC500DB804C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCB00A1D172B0CC500DB804C /* InfoPlist.strings */; }; + BCB00A21172B0CC500DB804C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB00A20172B0CC500DB804C /* main.m */; }; + BCB00A25172B0CC500DB804C /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = BCB00A23172B0CC500DB804C /* Credits.rtf */; }; + BCB00A28172B0CC500DB804C /* SLSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB00A27172B0CC500DB804C /* SLSAppDelegate.m */; }; + BCB00A2B172B0CC600DB804C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB00A29172B0CC600DB804C /* MainMenu.xib */; }; + BCB00A39172B0CEF00DB804C /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB00A36172B0CD700DB804C /* GPUImage.framework */; }; + BCB00A3B172B0CFF00DB804C /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BCB00A36172B0CD700DB804C /* GPUImage.framework */; }; + BCB00A3F172B0D2F00DB804C /* SLSMultiViewWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB00A3D172B0D2F00DB804C /* SLSMultiViewWindowController.m */; }; + BCB00A40172B0D2F00DB804C /* SLSMultiViewWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB00A3E172B0D2F00DB804C /* SLSMultiViewWindowController.xib */; }; + BCB00A43172B0F2200DB804C /* Shader1.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCB00A42172B0F2200DB804C /* Shader1.fsh */; }; + BCB00A45172B0F3300DB804C /* Shader2.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCB00A44172B0F3300DB804C /* Shader2.fsh */; }; + BCB00A48172B105800DB804C /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB00A47172B105800DB804C /* AVFoundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BCB00A35172B0CD700DB804C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCB00A31172B0CD700DB804C /* GPUImageMac.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCA3F31C17239B6500E28AEC; + remoteInfo = GPUImage; + }; + BCB00A37172B0CE500DB804C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCB00A31172B0CD700DB804C /* GPUImageMac.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BCA3F31B17239B6500E28AEC; + remoteInfo = GPUImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + BCB00A3A172B0CF400DB804C /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BCB00A3B172B0CFF00DB804C /* GPUImage.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + BCB00A11172B0CC500DB804C /* MultiViewFilterExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MultiViewFilterExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BCB00A14172B0CC500DB804C /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + BCB00A17172B0CC500DB804C /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + BCB00A18172B0CC500DB804C /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + BCB00A19172B0CC500DB804C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + BCB00A1C172B0CC500DB804C /* MultiViewFilterExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MultiViewFilterExample-Info.plist"; sourceTree = ""; }; + BCB00A1E172B0CC500DB804C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + BCB00A20172B0CC500DB804C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + BCB00A22172B0CC500DB804C /* MultiViewFilterExample-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MultiViewFilterExample-Prefix.pch"; sourceTree = ""; }; + BCB00A24172B0CC500DB804C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + BCB00A26172B0CC500DB804C /* SLSAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SLSAppDelegate.h; sourceTree = ""; }; + BCB00A27172B0CC500DB804C /* SLSAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SLSAppDelegate.m; sourceTree = ""; }; + BCB00A2A172B0CC600DB804C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + BCB00A31172B0CD700DB804C /* GPUImageMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImageMac.xcodeproj; path = ../../../framework/GPUImageMac.xcodeproj; sourceTree = ""; }; + BCB00A3C172B0D2F00DB804C /* SLSMultiViewWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLSMultiViewWindowController.h; sourceTree = ""; }; + BCB00A3D172B0D2F00DB804C /* SLSMultiViewWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLSMultiViewWindowController.m; sourceTree = ""; }; + BCB00A3E172B0D2F00DB804C /* SLSMultiViewWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SLSMultiViewWindowController.xib; sourceTree = ""; }; + BCB00A42172B0F2200DB804C /* Shader1.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = Shader1.fsh; sourceTree = ""; }; + BCB00A44172B0F3300DB804C /* Shader2.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = Shader2.fsh; sourceTree = ""; }; + BCB00A47172B105800DB804C /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BCB00A0E172B0CC500DB804C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BCB00A48172B105800DB804C /* AVFoundation.framework in Frameworks */, + BCB00A39172B0CEF00DB804C /* GPUImage.framework in Frameworks */, + BCB00A15172B0CC500DB804C /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BCB00A08172B0CC500DB804C = { + isa = PBXGroup; + children = ( + BCB00A47172B105800DB804C /* AVFoundation.framework */, + BCB00A1A172B0CC500DB804C /* MultiViewFilterExample */, + BCB00A13172B0CC500DB804C /* Frameworks */, + BCB00A12172B0CC500DB804C /* Products */, + ); + sourceTree = ""; + }; + BCB00A12172B0CC500DB804C /* Products */ = { + isa = PBXGroup; + children = ( + BCB00A11172B0CC500DB804C /* MultiViewFilterExample.app */, + ); + name = Products; + sourceTree = ""; + }; + BCB00A13172B0CC500DB804C /* Frameworks */ = { + isa = PBXGroup; + children = ( + BCB00A31172B0CD700DB804C /* GPUImageMac.xcodeproj */, + BCB00A14172B0CC500DB804C /* Cocoa.framework */, + BCB00A16172B0CC500DB804C /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + BCB00A16172B0CC500DB804C /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + BCB00A17172B0CC500DB804C /* AppKit.framework */, + BCB00A18172B0CC500DB804C /* CoreData.framework */, + BCB00A19172B0CC500DB804C /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + BCB00A1A172B0CC500DB804C /* MultiViewFilterExample */ = { + isa = PBXGroup; + children = ( + BCB00A26172B0CC500DB804C /* SLSAppDelegate.h */, + BCB00A27172B0CC500DB804C /* SLSAppDelegate.m */, + BCB00A29172B0CC600DB804C /* MainMenu.xib */, + BCB00A3C172B0D2F00DB804C /* SLSMultiViewWindowController.h */, + BCB00A3D172B0D2F00DB804C /* SLSMultiViewWindowController.m */, + BCB00A3E172B0D2F00DB804C /* SLSMultiViewWindowController.xib */, + BCB00A1B172B0CC500DB804C /* Supporting Files */, + ); + path = MultiViewFilterExample; + sourceTree = ""; + }; + BCB00A1B172B0CC500DB804C /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BCB00A1C172B0CC500DB804C /* MultiViewFilterExample-Info.plist */, + BCB00A1D172B0CC500DB804C /* InfoPlist.strings */, + BCB00A20172B0CC500DB804C /* main.m */, + BCB00A22172B0CC500DB804C /* MultiViewFilterExample-Prefix.pch */, + BCB00A23172B0CC500DB804C /* Credits.rtf */, + BCB00A42172B0F2200DB804C /* Shader1.fsh */, + BCB00A44172B0F3300DB804C /* Shader2.fsh */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BCB00A32172B0CD700DB804C /* Products */ = { + isa = PBXGroup; + children = ( + BCB00A36172B0CD700DB804C /* GPUImage.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BCB00A10172B0CC500DB804C /* MultiViewFilterExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = BCB00A2E172B0CC600DB804C /* Build configuration list for PBXNativeTarget "MultiViewFilterExample" */; + buildPhases = ( + BCB00A0D172B0CC500DB804C /* Sources */, + BCB00A3A172B0CF400DB804C /* CopyFiles */, + BCB00A0E172B0CC500DB804C /* Frameworks */, + BCB00A0F172B0CC500DB804C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BCB00A38172B0CE500DB804C /* PBXTargetDependency */, + ); + name = MultiViewFilterExample; + productName = MultiViewFilterExample; + productReference = BCB00A11172B0CC500DB804C /* MultiViewFilterExample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BCB00A09172B0CC500DB804C /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = SLS; + LastUpgradeCheck = 0460; + ORGANIZATIONNAME = "Sunset Lake Software LLC"; + }; + buildConfigurationList = BCB00A0C172B0CC500DB804C /* Build configuration list for PBXProject "MultiViewFilterExample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = BCB00A08172B0CC500DB804C; + productRefGroup = BCB00A12172B0CC500DB804C /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BCB00A32172B0CD700DB804C /* Products */; + ProjectRef = BCB00A31172B0CD700DB804C /* GPUImageMac.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + BCB00A10172B0CC500DB804C /* MultiViewFilterExample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + BCB00A36172B0CD700DB804C /* GPUImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = GPUImage.framework; + remoteRef = BCB00A35172B0CD700DB804C /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + BCB00A0F172B0CC500DB804C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCB00A43172B0F2200DB804C /* Shader1.fsh in Resources */, + BCB00A45172B0F3300DB804C /* Shader2.fsh in Resources */, + BCB00A1F172B0CC500DB804C /* InfoPlist.strings in Resources */, + BCB00A25172B0CC500DB804C /* Credits.rtf in Resources */, + BCB00A2B172B0CC600DB804C /* MainMenu.xib in Resources */, + BCB00A40172B0D2F00DB804C /* SLSMultiViewWindowController.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BCB00A0D172B0CC500DB804C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCB00A21172B0CC500DB804C /* main.m in Sources */, + BCB00A28172B0CC500DB804C /* SLSAppDelegate.m in Sources */, + BCB00A3F172B0D2F00DB804C /* SLSMultiViewWindowController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BCB00A38172B0CE500DB804C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GPUImage; + targetProxy = BCB00A37172B0CE500DB804C /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + BCB00A1D172B0CC500DB804C /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + BCB00A1E172B0CC500DB804C /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + BCB00A23172B0CC500DB804C /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + BCB00A24172B0CC500DB804C /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + BCB00A29172B0CC600DB804C /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + BCB00A2A172B0CC600DB804C /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BCB00A2C172B0CC600DB804C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + BCB00A2D172B0CC600DB804C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + SDKROOT = macosx; + }; + name = Release; + }; + BCB00A2F172B0CC600DB804C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MultiViewFilterExample/MultiViewFilterExample-Prefix.pch"; + INFOPLIST_FILE = "MultiViewFilterExample/MultiViewFilterExample-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + BCB00A30172B0CC600DB804C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MultiViewFilterExample/MultiViewFilterExample-Prefix.pch"; + INFOPLIST_FILE = "MultiViewFilterExample/MultiViewFilterExample-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BCB00A0C172B0CC500DB804C /* Build configuration list for PBXProject "MultiViewFilterExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCB00A2C172B0CC600DB804C /* Debug */, + BCB00A2D172B0CC600DB804C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BCB00A2E172B0CC600DB804C /* Build configuration list for PBXNativeTarget "MultiViewFilterExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCB00A2F172B0CC600DB804C /* Debug */, + BCB00A30172B0CC600DB804C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BCB00A09172B0CC500DB804C /* Project object */; +} diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist new file mode 100644 index 000000000..2dc5329d4 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2013 Sunset Lake Software LLC. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch new file mode 100644 index 000000000..e12f24e74 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'MultiViewFilterExample' target in the 'MultiViewFilterExample' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.h b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.h new file mode 100644 index 000000000..f5f66abf6 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.h @@ -0,0 +1,11 @@ +#import +#import "SLSMultiViewWindowController.h" + +@interface SLSAppDelegate : NSObject +{ + SLSMultiViewWindowController *multiViewWindowController; +} + +@property (assign) IBOutlet NSWindow *window; + +@end diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.m b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.m new file mode 100644 index 000000000..1577065a4 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.m @@ -0,0 +1,11 @@ +#import "SLSAppDelegate.h" + +@implementation SLSAppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + multiViewWindowController = [[SLSMultiViewWindowController alloc] initWithWindowNibName:@"SLSMultiViewWindowController"]; + [multiViewWindowController showWindow:self]; +} + +@end diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.h b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.h new file mode 100644 index 000000000..10c37014c --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.h @@ -0,0 +1,12 @@ +#import +#import + +@interface SLSMultiViewWindowController : NSWindowController +{ + GPUImageFilter *filter1, *filter2, *filter3; + GPUImageAVCamera *videoCamera; +} + +@property(readwrite) IBOutlet GPUImageView *upperLeftView, *upperRightView, *lowerLeftView, *lowerRightView; + +@end diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m new file mode 100644 index 000000000..5287335c7 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m @@ -0,0 +1,45 @@ +#import "SLSMultiViewWindowController.h" + +@interface SLSMultiViewWindowController () + +@end + +@implementation SLSMultiViewWindowController + +@synthesize upperLeftView = _upperLeftView, upperRightView = _upperRightView, lowerLeftView = _lowerLeftView, lowerRightView = _lowerRightView; + +- (id)initWithWindow:(NSWindow *)window +{ + self = [super initWithWindow:window]; + if (self) { + // Initialization code here. + } + + return self; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + + videoCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionUnspecified]; + + filter1 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader1"]; + filter2 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader2"]; + filter3 = [[GPUImageSepiaFilter alloc] init]; + [filter1 forceProcessingAtSizeRespectingAspectRatio:self.upperRightView.sizeInPixels]; + [filter2 forceProcessingAtSizeRespectingAspectRatio:self.lowerLeftView.sizeInPixels]; + [filter3 forceProcessingAtSizeRespectingAspectRatio:self.upperRightView.sizeInPixels]; + + [videoCamera addTarget:self.upperLeftView]; + [videoCamera addTarget:filter1]; + [filter1 addTarget:self.upperRightView]; + [videoCamera addTarget:filter2]; + [filter2 addTarget:self.lowerLeftView]; + [videoCamera addTarget:filter3]; + [filter3 addTarget:self.lowerRightView]; + + [videoCamera startCameraCapture]; +} + +@end diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.xib b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.xib new file mode 100644 index 000000000..7e0d9cb77 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.xib @@ -0,0 +1,309 @@ + + + + 1080 + 12D78 + 3084 + 1187.37 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + NSCustomObject + NSOpenGLView + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + SLSMultiViewWindowController + + + FirstResponder + + + NSApplication + + + 7 + 2 + {{196, 240}, {688, 528}} + 544735232 + Multi View Example + NSWindow + + + {688, 528} + {688, 528} + + + 256 + + + + 268 + {{20, 268}, {320, 240}} + + + + _NS:24 + + + AAAAYAAAAAA + + + + + + 268 + {{348, 268}, {320, 240}} + + + + _NS:24 + + + AAAAYAAAAAA + + + + + + 268 + {{20, 20}, {320, 240}} + + + + _NS:24 + + + AAAAYAAAAAA + + + + + + 268 + {{348, 20}, {320, 240}} + + + + _NS:24 + + + AAAAYAAAAAA + + + + + {688, 528} + + + + + {{0, 0}, {2560, 1418}} + {688, 550} + {688, 550} + NO + + + + + + + window + + + + 3 + + + + lowerLeftView + + + + 47 + + + + lowerRightView + + + + 48 + + + + upperLeftView + + + + 49 + + + + upperRightView + + + + 50 + + + + delegate + + + + 4 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + + + + + + 2 + + + + + + + + + + + 5 + + + + + 16 + + + + + 26 + + + + + 36 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{357, 418}, {480, 270}} + + GPUImageView + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + GPUImageView + com.apple.InterfaceBuilder.CocoaPlugin + GPUImageView + com.apple.InterfaceBuilder.CocoaPlugin + GPUImageView + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 50 + + + + + GPUImageView + NSOpenGLView + + IBProjectSource + ./Classes/GPUImageView.h + + + + SLSMultiViewWindowController + NSWindowController + + GPUImageView + GPUImageView + GPUImageView + GPUImageView + + + + lowerLeftView + GPUImageView + + + lowerRightView + GPUImageView + + + upperLeftView + GPUImageView + + + upperRightView + GPUImageView + + + + IBProjectSource + ./Classes/SLSMultiViewWindowController.h + + + + + 0 + IBCocoaFramework + YES + 3 + + diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh new file mode 100644 index 000000000..15db5ddef --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh @@ -0,0 +1,19 @@ +varying vec2 textureCoordinate; + +uniform sampler2D inputImageTexture; + +void main() +{ + vec3 tc = vec3(1.0, 0.0, 0.0); + + vec3 pixcol = texture2D(inputImageTexture, textureCoordinate).rgb; + vec3 colors[3]; + colors[0] = vec3(0.0, 0.0, 1.0); + colors[1] = vec3(1.0, 1.0, 0.0); + colors[2] = vec3(1.0, 0.0, 0.0); + float lum = (pixcol.r + pixcol.g + pixcol.b) / 3.0; + int ix = (lum < 0.5)? 0:1; + tc = mix(colors[ix], colors[ix + 1], (lum - float(ix) * 0.5) / 0.5); + + gl_FragColor = vec4(tc, 1.0); +} \ No newline at end of file diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh new file mode 100644 index 000000000..ed4c5c3f8 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh @@ -0,0 +1,11 @@ +varying vec2 textureCoordinate; + +uniform sampler2D inputImageTexture; + +const vec2 sampleDivisor = vec2(0.1, 0.1); + +void main() +{ + vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor); + gl_FragColor = texture2D(inputImageTexture, samplePos ); +} \ No newline at end of file diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/Credits.rtf b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/Credits.rtf new file mode 100644 index 000000000..46576ef21 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/MainMenu.xib b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/MainMenu.xib new file mode 100644 index 000000000..9fa4b29e7 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/MainMenu.xib @@ -0,0 +1,3128 @@ + + + + 1080 + 12D78 + 3084 + 1187.37 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + NSCustomObject + NSMenu + NSMenuItem + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + MultiViewFilterExample + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + MultiViewFilterExample + + + + About MultiViewFilterExample + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide MultiViewFilterExample + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit MultiViewFilterExample + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + + + Font + + 2147483647 + + + submenuAction: + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligatures + + 2147483647 + + + submenuAction: + + Ligatures + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + MultiViewFilterExample Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + SLSAppDelegate + + + NSFontManager + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + performFindPanelAction: + + + + 535 + + + + addFontTrait: + + + + 421 + + + + addFontTrait: + + + + 422 + + + + modifyFont: + + + + 423 + + + + orderFrontFontPanel: + + + + 424 + + + + modifyFont: + + + + 425 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 375 + + + + + + + + 376 + + + + + + + + + 377 + + + + + + + + 388 + + + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 420 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 496 + + + + + + + + 497 + + + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + 534 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 535 + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/main.m b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/main.m new file mode 100644 index 000000000..04d99dab9 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/main.m @@ -0,0 +1,6 @@ +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index 344dabae1..7a9008464 100644 --- a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -308,7 +308,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.8; + MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; @@ -335,7 +335,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.8; + MACOSX_DEPLOYMENT_TARGET = 10.7; SDKROOT = macosx; }; name = Release; diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m index 07c445ee6..3c18b9ded 100644 --- a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m @@ -28,8 +28,16 @@ - (void)windowControllerDidLoadNib:(NSWindowController *)aController NSLog(@"Did load nib"); +// [inputPicture addTarget:imageFilter]; +// [imageFilter addTarget:self.imageView]; + +// [inputPicture addTarget:self.imageView]; +// [inputPicture processImage]; + [inputPicture addTarget:imageFilter]; - [imageFilter addTarget:self.imageView]; + GPUImageSketchFilter *sketchFilter = [[GPUImageSketchFilter alloc] init]; + [imageFilter addTarget:sketchFilter]; + [sketchFilter addTarget:self.imageView]; [inputPicture processImage]; } diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 5b70e8f9d..694262f6b 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -356,7 +356,9 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); // } glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); - +// glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); +// GLenum att = GL_COLOR_ATTACHMENT0; +// glDrawBuffers(1, &att); [self notifyTargetsAboutNewOutputTexture]; } diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 751ad5e3d..52415bbc6 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -130,10 +130,6 @@ - (void)addTarget:(id)newTarget; { NSInteger nextAvailableTextureIndex = [newTarget nextAvailableTextureIndex]; [self addTarget:newTarget atTextureLocation:nextAvailableTextureIndex]; - if (outputTexture) - { - [self setInputTextureForTarget:newTarget atIndex:nextAvailableTextureIndex]; - } if ([newTarget shouldIgnoreUpdatesToThisTarget]) { diff --git a/framework/Source/Mac/GPUImageContext.m b/framework/Source/Mac/GPUImageContext.m index 9b1acf9f7..e7917f913 100755 --- a/framework/Source/Mac/GPUImageContext.m +++ b/framework/Source/Mac/GPUImageContext.m @@ -87,7 +87,7 @@ + (GLint)maximumTextureSizeForThisDevice; [self useImageProcessingContext]; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); }); - + return maxTextureSize; } @@ -220,6 +220,7 @@ - (NSOpenGLContext *)context; // Set up a few global settings for the image processing pipeline glDisable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); } return _context; diff --git a/framework/Source/Mac/GPUImagePicture.m b/framework/Source/Mac/GPUImagePicture.m index 519a3df7a..64ed22c36 100755 --- a/framework/Source/Mac/GPUImagePicture.m +++ b/framework/Source/Mac/GPUImagePicture.m @@ -143,7 +143,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, imageData); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); if (self.shouldSmoothlyScaleOutput) { @@ -184,12 +184,6 @@ - (void)initializeOutputTextureIfNeeded; { [GPUImageContext useImageProcessingContext]; - glEnable(GL_TEXTURE_RECTANGLE_EXT); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glActiveTexture(GL_TEXTURE0); glGenTextures(1, &outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); @@ -217,6 +211,7 @@ - (void)processImage; if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) { + NSLog(@"Bailing on the image upload semaphore"); return; } diff --git a/framework/Source/Mac/GPUImageView.m b/framework/Source/Mac/GPUImageView.m index 6d5a5f174..c1a24af9c 100755 --- a/framework/Source/Mac/GPUImageView.m +++ b/framework/Source/Mac/GPUImageView.m @@ -65,18 +65,47 @@ -(id)initWithCoder:(NSCoder *)coder return self; } +- (void) prepareOpenGL +{ + GLint swapInt = 1; + [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; // set to vbl sync +} + - (void)commonInit; { + // I believe each of these views needs a separate OpenGL context, unlike on iOS where you're rendering to an FBO in a layer +// NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = { +// NSOpenGLPFADoubleBuffer, +// NSOpenGLPFAAccelerated, 0, +// 0 +// }; +// +// NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes]; +// if (pixelFormat == nil) +// { +// NSLog(@"Error: No appropriate pixel format found"); +// } +// // TODO: Take into account the sharegroup +// NSOpenGLContext *context = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:[[GPUImageContext sharedImageProcessingContext] context]]; +// if (context == nil) +// { +// NSAssert(NO, @"Problem creating the GPUImageView context"); +// } +// [self setOpenGLContext:context]; [self setOpenGLContext:[[GPUImageContext sharedImageProcessingContext] context]]; + + inputRotation = kGPUImageNoRotation; self.hidden = NO; self.enabled = YES; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - displayProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + [self.openGLContext makeCurrentContext]; + glDisable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); + + displayProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; if (!displayProgram.initialized) { [displayProgram addAttribute:@"position"]; @@ -97,38 +126,20 @@ - (void)commonInit; displayPositionAttribute = [displayProgram attributeIndex:@"position"]; displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; - displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader - - [GPUImageContext setActiveShaderProgram:displayProgram]; + displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; + [displayProgram use]; glEnableVertexAttribArray(displayPositionAttribute); glEnableVertexAttribArray(displayTextureCoordinateAttribute); - + [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; _fillMode = kGPUImageFillModePreserveAspectRatio; [self createDisplayFramebuffer]; }); - - [self addObserver:self forKeyPath:@"frame" options:0 context:NULL]; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context -{ - if (object == self && [keyPath isEqualToString:@"frame"] && (!CGSizeEqualToSize(self.bounds.size, CGSizeZero))) - { - runSynchronouslyOnVideoProcessingQueue(^{ - [self destroyDisplayFramebuffer]; - [self createDisplayFramebuffer]; - }); - } + } - (void)dealloc { - [self removeObserver:self forKeyPath:@"frame"]; - - runSynchronouslyOnVideoProcessingQueue(^{ - [self destroyDisplayFramebuffer]; - }); } #pragma mark - @@ -145,7 +156,7 @@ - (void)createDisplayFramebuffer; - (void)destroyDisplayFramebuffer; { - [GPUImageContext useImageProcessingContext]; + [self.openGLContext makeCurrentContext]; } - (void)setDisplayFramebuffer; @@ -158,11 +169,16 @@ - (void)setDisplayFramebuffer; - (void)presentFramebuffer; { - [[GPUImageContext sharedImageProcessingContext] presentBufferForDisplay]; + [self.openGLContext flushBuffer]; } - (void)reshape; { + if ( (_sizeInPixels.width == self.bounds.size.width) && (_sizeInPixels.width == self.bounds.size.width) ) + { + return; + } + _sizeInPixels.width = self.bounds.size.width; _sizeInPixels.height = self.bounds.size.height; [self recalculateViewGeometry]; @@ -306,22 +322,44 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:displayProgram]; + [[self openGLContext] makeCurrentContext]; + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindRenderbuffer(GL_RENDERBUFFER, 0); [self setDisplayFramebuffer]; + [displayProgram use]; + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + +// [self setDisplayFramebuffer]; +// glViewport(0, 0, (GLint)_sizeInPixels.width, (GLint)_sizeInPixels.height); + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - + glClear(GL_COLOR_BUFFER_BIT); + glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); glUniform1i(displayInputTextureUniform, 4); - + +// glVertexPointer(2, GL_FLOAT, 0, imageVertices); +// glTexCoordPointer(2, GL_FLOAT, 0, noRotationTextureCoordinates); + glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); - + +// glColor4f(0.0 , 1.0, 0.0, 1.0); + + [self lockFocus]; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + [self presentFramebuffer]; + glBindTexture(GL_TEXTURE_2D, 0); + [self unlockFocus]; + +// [GPUImageContext useImageProcessingContext]; }); } From 2d8661d9da1ca5c14466c298bb74fac047fa406f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 28 Apr 2013 17:59:53 -0500 Subject: [PATCH 365/695] Added the lookup filters. Fixed some things I broke in the last commit on the Mac. --- .../FilterShowcase.xcodeproj/project.pbxproj | 16 + .../SLSFilterShowcaseWindowController.h | 3 + .../SLSFilterShowcaseWindowController.m | 19 +- .../SLSFilterShowcaseWindowController.xib | 276 +----------------- .../GPUImageMac.xcodeproj/project.pbxproj | 32 ++ framework/Source/GPUImageAmatorkaFilter.m | 5 + .../GPUImageFASTCornerDetectionFilter.h | 2 +- framework/Source/GPUImageLookupFilter.m | 40 +++ framework/Source/GPUImageMissEtikateFilter.m | 5 + framework/Source/GPUImageSoftEleganceFilter.m | 6 + framework/Source/Mac/GPUImage.h | 4 + framework/Source/Mac/GPUImageView.m | 57 ++-- 12 files changed, 158 insertions(+), 307 deletions(-) diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 6902b70f7..32f759c8b 100644 --- a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + BC78B702172DCC7F00342C6A /* lookup_amatorka.png in Resources */ = {isa = PBXBuildFile; fileRef = BC78B6FE172DCC7F00342C6A /* lookup_amatorka.png */; }; + BC78B703172DCC7F00342C6A /* lookup_miss_etikate.png in Resources */ = {isa = PBXBuildFile; fileRef = BC78B6FF172DCC7F00342C6A /* lookup_miss_etikate.png */; }; + BC78B704172DCC7F00342C6A /* lookup_soft_elegance_1.png in Resources */ = {isa = PBXBuildFile; fileRef = BC78B700172DCC7F00342C6A /* lookup_soft_elegance_1.png */; }; + BC78B705172DCC7F00342C6A /* lookup_soft_elegance_2.png in Resources */ = {isa = PBXBuildFile; fileRef = BC78B701172DCC7F00342C6A /* lookup_soft_elegance_2.png */; }; BCB00A4C172B17F400DB804C /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BCF8678F17263F3500912E34 /* GPUImage.framework */; }; BCF8676E17263EAC00912E34 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8676D17263EAC00912E34 /* Cocoa.framework */; }; BCF8677817263EAC00912E34 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF8677617263EAC00912E34 /* InfoPlist.strings */; }; @@ -54,6 +58,10 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + BC78B6FE172DCC7F00342C6A /* lookup_amatorka.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_amatorka.png; path = ../../../../framework/Resources/lookup_amatorka.png; sourceTree = ""; }; + BC78B6FF172DCC7F00342C6A /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; + BC78B700172DCC7F00342C6A /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; + BC78B701172DCC7F00342C6A /* lookup_soft_elegance_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_2.png; path = ../../../../framework/Resources/lookup_soft_elegance_2.png; sourceTree = ""; }; BCF8676A17263EAC00912E34 /* FilterShowcase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FilterShowcase.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCF8676D17263EAC00912E34 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; BCF8677017263EAC00912E34 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -148,6 +156,10 @@ BCF8677417263EAC00912E34 /* Supporting Files */ = { isa = PBXGroup; children = ( + BC78B6FE172DCC7F00342C6A /* lookup_amatorka.png */, + BC78B6FF172DCC7F00342C6A /* lookup_miss_etikate.png */, + BC78B700172DCC7F00342C6A /* lookup_soft_elegance_1.png */, + BC78B701172DCC7F00342C6A /* lookup_soft_elegance_2.png */, BCF868891728791300912E34 /* mask.png */, BCF868871728790500912E34 /* Lambeau.jpg */, BCF8677517263EAC00912E34 /* FilterShowcase-Info.plist */, @@ -243,6 +255,10 @@ BCF8679717263FCF00912E34 /* SLSFilterShowcaseWindowController.xib in Resources */, BCF868881728790500912E34 /* Lambeau.jpg in Resources */, BCF8688A1728791300912E34 /* mask.png in Resources */, + BC78B702172DCC7F00342C6A /* lookup_amatorka.png in Resources */, + BC78B703172DCC7F00342C6A /* lookup_miss_etikate.png in Resources */, + BC78B704172DCC7F00342C6A /* lookup_soft_elegance_1.png in Resources */, + BC78B705172DCC7F00342C6A /* lookup_soft_elegance_2.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index 7e258aaf3..1110b5204 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -23,6 +23,9 @@ typedef enum { GPUIMAGE_HIGHLIGHTSHADOW, GPUIMAGE_HAZE, GPUIMAGE_SEPIA, + GPUIMAGE_AMATORKA, + GPUIMAGE_MISSETIKATE, + GPUIMAGE_SOFTELEGANCE, GPUIMAGE_PIXELLATE, GPUIMAGE_GRAYSCALE, GPUIMAGE_SOBELEDGEDETECTION, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 4cb4ba032..589102a6e 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -252,6 +252,21 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 1.0; self.enableSlider = YES; }; break; + case GPUIMAGE_AMATORKA: + { + currentlySelectedFilter = [[GPUImageAmatorkaFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_MISSETIKATE: + { + currentlySelectedFilter = [[GPUImageMissEtikateFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_SOFTELEGANCE: + { + currentlySelectedFilter = [[GPUImageSoftEleganceFilter alloc] init]; + self.enableSlider = NO; + }; break; case GPUIMAGE_GRAYSCALE: { currentlySelectedFilter = [[GPUImageGrayscaleFilter alloc] init]; @@ -594,7 +609,6 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; [blendFilter addTarget:self.glView]; } - } #pragma mark - @@ -694,6 +708,9 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_HIGHLIGHTSHADOW: tableRowTitle = @"Highlights and shadows"; break; case GPUIMAGE_HAZE: tableRowTitle = @"Haze"; break; case GPUIMAGE_SEPIA: tableRowTitle = @"Sepia tone"; break; + case GPUIMAGE_AMATORKA: tableRowTitle = @"Amatorka (Lookup)"; break; + case GPUIMAGE_MISSETIKATE: tableRowTitle = @"Miss Etikate (Lookup)"; break; + case GPUIMAGE_SOFTELEGANCE: tableRowTitle = @"Soft elegance (Lookup)"; break; case GPUIMAGE_GAUSSIAN: tableRowTitle = @"Gaussian blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: tableRowTitle = @"Gaussian selective blur"; break; case GPUIMAGE_GAUSSIAN_POSITION: tableRowTitle = @"Gaussian (centered)"; break; diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib index 3fba0bc36..dd32c444a 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib @@ -11,7 +11,6 @@ 3084 - IBNSLayoutConstraint NSCustomObject NSOpenGLView NSScrollView @@ -57,7 +56,7 @@ - 268 + 276 @@ -248,7 +247,7 @@ - 268 + 274 {{194, 53}, {640, 480}} @@ -262,7 +261,7 @@ - 268 + 290 {{192, 18}, {644, 21}} @@ -444,166 +443,6 @@ 2 - - - 4 - 0 - - 4 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - - 6 - 1 - - 8 - - 1000 - - 6 - 24 - 3 - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 4 - 0 - - 4 - 1 - - 53 - - 1000 - - 3 - 9 - 3 - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 3 - 0 - - 3 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - - 6 - 1 - - 8 - - 1000 - - 6 - 24 - 3 - - - - 4 - 0 - - 4 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 3 - 0 - - 3 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - @@ -657,62 +496,16 @@ - - 18 - - - - - 20 - - - - - 22 - - - 24 - - 29 - - - - - 33 - - - - - 35 - - - 39 - - - 7 - 0 - - 0 - 1 - - 640 - - 1000 - - 3 - 9 - 1 - @@ -721,31 +514,6 @@ - - 48 - - - - - 49 - - - - - 50 - - - - - 51 - - - - - 53 - - - @@ -757,41 +525,12 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin GPUImageView - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -813,14 +552,6 @@ ./Classes/GPUImageView.h
- - NSLayoutConstraint - NSObject - - IBProjectSource - ./Classes/NSLayoutConstraint.h - - SLSFilterShowcaseWindowController NSWindowController @@ -846,6 +577,5 @@ IBCocoaFramework YES 3 - YES diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 131d55c3b..735693f11 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -7,6 +7,14 @@ objects = { /* Begin PBXBuildFile section */ + BC78B70E172DCCB800342C6A /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B706172DCCB800342C6A /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC78B70F172DCCB800342C6A /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B707172DCCB800342C6A /* GPUImageAmatorkaFilter.m */; }; + BC78B710172DCCB800342C6A /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B708172DCCB800342C6A /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC78B711172DCCB800342C6A /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B709172DCCB800342C6A /* GPUImageLookupFilter.m */; }; + BC78B712172DCCB800342C6A /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B70A172DCCB800342C6A /* GPUImageMissEtikateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC78B713172DCCB800342C6A /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */; }; + BC78B714172DCCB800342C6A /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC78B715172DCCB800342C6A /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */; }; BCA3F32017239B6500E28AEC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F31F17239B6500E28AEC /* Cocoa.framework */; }; BCA3F3621723A8FA00E28AEC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3601723A8FA00E28AEC /* OpenGL.framework */; }; BCA3F3631723A8FA00E28AEC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */; }; @@ -168,6 +176,14 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + BC78B706172DCCB800342C6A /* GPUImageAmatorkaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAmatorkaFilter.h; path = Source/GPUImageAmatorkaFilter.h; sourceTree = SOURCE_ROOT; }; + BC78B707172DCCB800342C6A /* GPUImageAmatorkaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAmatorkaFilter.m; path = Source/GPUImageAmatorkaFilter.m; sourceTree = SOURCE_ROOT; }; + BC78B708172DCCB800342C6A /* GPUImageLookupFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLookupFilter.h; path = Source/GPUImageLookupFilter.h; sourceTree = SOURCE_ROOT; }; + BC78B709172DCCB800342C6A /* GPUImageLookupFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLookupFilter.m; path = Source/GPUImageLookupFilter.m; sourceTree = SOURCE_ROOT; }; + BC78B70A172DCCB800342C6A /* GPUImageMissEtikateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMissEtikateFilter.h; path = Source/GPUImageMissEtikateFilter.h; sourceTree = SOURCE_ROOT; }; + BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMissEtikateFilter.m; path = Source/GPUImageMissEtikateFilter.m; sourceTree = SOURCE_ROOT; }; + BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSoftEleganceFilter.h; path = Source/GPUImageSoftEleganceFilter.h; sourceTree = SOURCE_ROOT; }; + BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftEleganceFilter.m; path = Source/GPUImageSoftEleganceFilter.m; sourceTree = SOURCE_ROOT; }; BCA3F31C17239B6500E28AEC /* GPUImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GPUImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BCA3F31F17239B6500E28AEC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; BCA3F32217239B6500E28AEC /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -501,6 +517,14 @@ BCB009F9172A246E00DB804C /* GPUImageColorMatrixFilter.m */, BCB009F4172A243300DB804C /* GPUImageSepiaFilter.h */, BCB009F5172A243400DB804C /* GPUImageSepiaFilter.m */, + BC78B708172DCCB800342C6A /* GPUImageLookupFilter.h */, + BC78B709172DCCB800342C6A /* GPUImageLookupFilter.m */, + BC78B706172DCCB800342C6A /* GPUImageAmatorkaFilter.h */, + BC78B707172DCCB800342C6A /* GPUImageAmatorkaFilter.m */, + BC78B70A172DCCB800342C6A /* GPUImageMissEtikateFilter.h */, + BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */, + BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */, + BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */, BCF8689B1728861E00912E34 /* GPUImageOpacityFilter.h */, BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */, ); @@ -700,6 +724,10 @@ BCB009F2172A23AA00DB804C /* GPUImageHighlightShadowFilter.h in Headers */, BCB009F6172A243400DB804C /* GPUImageSepiaFilter.h in Headers */, BCB009FA172A246E00DB804C /* GPUImageColorMatrixFilter.h in Headers */, + BC78B710172DCCB800342C6A /* GPUImageLookupFilter.h in Headers */, + BC78B70E172DCCB800342C6A /* GPUImageAmatorkaFilter.h in Headers */, + BC78B712172DCCB800342C6A /* GPUImageMissEtikateFilter.h in Headers */, + BC78B714172DCCB800342C6A /* GPUImageSoftEleganceFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -841,6 +869,10 @@ BCB009F3172A23AA00DB804C /* GPUImageHighlightShadowFilter.m in Sources */, BCB009F7172A243400DB804C /* GPUImageSepiaFilter.m in Sources */, BCB009FB172A246E00DB804C /* GPUImageColorMatrixFilter.m in Sources */, + BC78B70F172DCCB800342C6A /* GPUImageAmatorkaFilter.m in Sources */, + BC78B711172DCCB800342C6A /* GPUImageLookupFilter.m in Sources */, + BC78B713172DCCB800342C6A /* GPUImageMissEtikateFilter.m in Sources */, + BC78B715172DCCB800342C6A /* GPUImageSoftEleganceFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageAmatorkaFilter.m b/framework/Source/GPUImageAmatorkaFilter.m index ce0a1f2ce..4d9fa9d78 100755 --- a/framework/Source/GPUImageAmatorkaFilter.m +++ b/framework/Source/GPUImageAmatorkaFilter.m @@ -11,7 +11,12 @@ - (id)init; return nil; } +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE UIImage *image = [UIImage imageNamed:@"lookup_amatorka.png"]; +#else + NSImage *image = [NSImage imageNamed:@"lookup_amatorka.png"]; +#endif + NSAssert(image, @"To use GPUImageAmatorkaFilter you need to add lookup_amatorka.png from GPUImage/framework/Resources to your application bundle."); lookupImageSource = [[GPUImagePicture alloc] initWithImage:image]; diff --git a/framework/Source/GPUImageFASTCornerDetectionFilter.h b/framework/Source/GPUImageFASTCornerDetectionFilter.h index b5c8b10d9..0cf8b8a64 100644 --- a/framework/Source/GPUImageFASTCornerDetectionFilter.h +++ b/framework/Source/GPUImageFASTCornerDetectionFilter.h @@ -1,4 +1,4 @@ -#import +#import "GPUImageFilterGroup.h" @interface GPUImageFASTCornerDetectionFilter : GPUImageFilterGroup { diff --git a/framework/Source/GPUImageLookupFilter.m b/framework/Source/GPUImageLookupFilter.m index cdab242ad..d9bba913f 100644 --- a/framework/Source/GPUImageLookupFilter.m +++ b/framework/Source/GPUImageLookupFilter.m @@ -1,5 +1,6 @@ #import "GPUImageLookupFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLookupFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -37,6 +38,45 @@ void main() gl_FragColor = vec4(newColor.rgb, textureColor.w); } ); +#else +NSString *const kGPUImageLookupFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; // TODO: This is not used + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; // lookup texture + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + float blueColor = textureColor.b * 63.0; + + vec2 quad1; + quad1.y = floor(floor(blueColor) / 8.0); + quad1.x = floor(blueColor) - (quad1.y * 8.0); + + vec2 quad2; + quad2.y = floor(ceil(blueColor) / 8.0); + quad2.x = ceil(blueColor) - (quad2.y * 8.0); + + vec2 texPos1; + texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); + texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); + + vec2 texPos2; + texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); + texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); + + vec4 newColor1 = texture2D(inputImageTexture2, texPos1); + vec4 newColor2 = texture2D(inputImageTexture2, texPos2); + + vec4 newColor = mix(newColor1, newColor2, fract(blueColor)); + gl_FragColor = vec4(newColor.rgb, textureColor.w); + } +); +#endif @implementation GPUImageLookupFilter diff --git a/framework/Source/GPUImageMissEtikateFilter.m b/framework/Source/GPUImageMissEtikateFilter.m index f15b85eea..efa595c52 100755 --- a/framework/Source/GPUImageMissEtikateFilter.m +++ b/framework/Source/GPUImageMissEtikateFilter.m @@ -11,7 +11,12 @@ - (id)init; return nil; } +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE UIImage *image = [UIImage imageNamed:@"lookup_miss_etikate.png"]; +#else + NSImage *image = [NSImage imageNamed:@"lookup_miss_etikate.png"]; +#endif + NSAssert(image, @"To use GPUImageMissEtikateFilter you need to add lookup_miss_etikate.png from GPUImage/framework/Resources to your application bundle."); lookupImageSource = [[GPUImagePicture alloc] initWithImage:image]; diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m index 08b6e8b35..5727c0038 100755 --- a/framework/Source/GPUImageSoftEleganceFilter.m +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -13,8 +13,14 @@ - (id)init; return nil; } +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE UIImage *image1 = [UIImage imageNamed:@"lookup_soft_elegance_1.png"]; UIImage *image2 = [UIImage imageNamed:@"lookup_soft_elegance_2.png"]; +#else + NSImage *image1 = [NSImage imageNamed:@"lookup_soft_elegance_1.png"]; + NSImage *image2 = [NSImage imageNamed:@"lookup_soft_elegance_2.png"]; +#endif + NSAssert(image1 && image2, @"To use GPUImageSoftEleganceFilter you need to add lookup_soft_elegance_1.png and lookup_soft_elegance_2.png from GPUImage/framework/Resources to your application bundle."); diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 4d88a402d..11cab4748 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -78,6 +78,10 @@ #import #import #import +#import +#import +#import +#import // Outputs #import diff --git a/framework/Source/Mac/GPUImageView.m b/framework/Source/Mac/GPUImageView.m index c1a24af9c..f48d231eb 100755 --- a/framework/Source/Mac/GPUImageView.m +++ b/framework/Source/Mac/GPUImageView.m @@ -65,11 +65,11 @@ -(id)initWithCoder:(NSCoder *)coder return self; } -- (void) prepareOpenGL -{ - GLint swapInt = 1; - [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; // set to vbl sync -} +//- (void) prepareOpenGL +//{ +// GLint swapInt = 1; +// [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; // set to vbl sync +//} - (void)commonInit; { @@ -102,10 +102,9 @@ - (void)commonInit; runSynchronouslyOnVideoProcessingQueue(^{ [self.openGLContext makeCurrentContext]; - glDisable(GL_DEPTH_TEST); - glEnable(GL_TEXTURE_2D); + displayProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - displayProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; +// displayProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; if (!displayProgram.initialized) { [displayProgram addAttribute:@"position"]; @@ -127,7 +126,10 @@ - (void)commonInit; displayPositionAttribute = [displayProgram attributeIndex:@"position"]; displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; - [displayProgram use]; + + [GPUImageContext setActiveShaderProgram:displayProgram]; + +// [displayProgram use]; glEnableVertexAttribArray(displayPositionAttribute); glEnableVertexAttribArray(displayTextureCoordinateAttribute); @@ -174,7 +176,7 @@ - (void)presentFramebuffer; - (void)reshape; { - if ( (_sizeInPixels.width == self.bounds.size.width) && (_sizeInPixels.width == self.bounds.size.width) ) + if ( (_sizeInPixels.width == self.bounds.size.width) && (_sizeInPixels.height == self.bounds.size.height) ) { return; } @@ -182,7 +184,9 @@ - (void)reshape; _sizeInPixels.width = self.bounds.size.width; _sizeInPixels.height = self.bounds.size.height; [self recalculateViewGeometry]; - [self newFrameReadyAtTime:kCMTimeInvalid atIndex:0]; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [self newFrameReadyAtTime:kCMTimeInvalid atIndex:0]; + }); } #pragma mark - @@ -190,7 +194,7 @@ - (void)reshape; - (void)recalculateViewGeometry; { - runSynchronouslyOnVideoProcessingQueue(^{ +// runSynchronouslyOnVideoProcessingQueue(^{ CGFloat heightScaling, widthScaling; CGSize currentViewSize = self.bounds.size; @@ -228,7 +232,7 @@ - (void)recalculateViewGeometry; imageVertices[5] = heightScaling; imageVertices[6] = widthScaling; imageVertices[7] = heightScaling; - }); +// }); // static const GLfloat imageVertices[] = { // -1.0f, -1.0f, @@ -322,20 +326,16 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { runSynchronouslyOnVideoProcessingQueue(^{ - [[self openGLContext] makeCurrentContext]; - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glBindRenderbuffer(GL_RENDERBUFFER, 0); +// [[self openGLContext] makeCurrentContext]; + [GPUImageContext setActiveShaderProgram:displayProgram]; [self setDisplayFramebuffer]; - [displayProgram use]; +// [displayProgram use]; - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - -// [self setDisplayFramebuffer]; -// glViewport(0, 0, (GLint)_sizeInPixels.width, (GLint)_sizeInPixels.height); +// glMatrixMode(GL_MODELVIEW); +// glLoadIdentity(); +// +// glMatrixMode(GL_PROJECTION); +// glLoadIdentity(); glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); @@ -344,22 +344,15 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); glUniform1i(displayInputTextureUniform, 4); -// glVertexPointer(2, GL_FLOAT, 0, imageVertices); -// glTexCoordPointer(2, GL_FLOAT, 0, noRotationTextureCoordinates); - glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); -// glColor4f(0.0 , 1.0, 0.0, 1.0); - [self lockFocus]; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [self presentFramebuffer]; glBindTexture(GL_TEXTURE_2D, 0); [self unlockFocus]; - -// [GPUImageContext useImageProcessingContext]; }); } From c4795d05754e0a3428b3dd14a485cd6519c01c4b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 30 Apr 2013 16:01:57 -0500 Subject: [PATCH 366/695] Ported convolution filters to the Mac and added a Laplacian filter. --- .../SLSFilterShowcaseWindowController.h | 3 + .../SLSFilterShowcaseWindowController.m | 31 ++++- .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 7 ++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ .../GPUImageMac.xcodeproj/project.pbxproj | 24 ++++ framework/Source/GPUImage.h | 3 +- .../Source/GPUImage3x3ConvolutionFilter.m | 58 ++++++++- framework/Source/GPUImageLaplacianFilter.h | 5 + framework/Source/GPUImageLaplacianFilter.m | 115 ++++++++++++++++++ .../Source/GPUImageSobelEdgeDetectionFilter.m | 1 - framework/Source/Mac/GPUImage.h | 3 + 13 files changed, 253 insertions(+), 7 deletions(-) create mode 100644 framework/Source/GPUImageLaplacianFilter.h create mode 100644 framework/Source/GPUImageLaplacianFilter.m diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index 1110b5204..a9b40158b 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -31,6 +31,9 @@ typedef enum { GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, + GPUIMAGE_CONVOLUTION, + GPUIMAGE_EMBOSS, + GPUIMAGE_LAPLACIAN, GPUIMAGE_KUWAHARA, GPUIMAGE_GAUSSIAN, GPUIMAGE_GAUSSIAN_SELECTIVE, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 589102a6e..ab13f2b29 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -296,6 +296,31 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; currentlySelectedFilter = [[GPUImageToonFilter alloc] init]; self.enableSlider = NO; }; break; + case GPUIMAGE_CONVOLUTION: + { + currentlySelectedFilter = [[GPUImage3x3ConvolutionFilter alloc] init]; + + [(GPUImage3x3ConvolutionFilter *)currentlySelectedFilter setConvolutionKernel:(GPUMatrix3x3){ + {-1.0f, 0.0f, 1.0f}, + {-2.0f, 0.0f, 2.0f}, + {-1.0f, 0.0f, 1.0f} + }]; + + self.enableSlider = NO; + }; break; + case GPUIMAGE_EMBOSS: + { + currentlySelectedFilter = [[GPUImageEmbossFilter alloc] init]; + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 5.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_LAPLACIAN: + { + currentlySelectedFilter = [[GPUImageLaplacianFilter alloc] init]; + self.enableSlider = NO; + }; break; case GPUIMAGE_KUWAHARA: { currentlySelectedFilter = [[GPUImageKuwaharaFilter alloc] init]; @@ -638,6 +663,7 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)currentlySelectedFilter setDistance:_currentSliderValue]; break; case GPUIMAGE_SEPIA: [(GPUImageSepiaFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; + case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)currentlySelectedFilter setSharpness:_currentSliderValue]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; @@ -695,6 +721,9 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_SOBELEDGEDETECTION: tableRowTitle = @"Sobel edge detection"; break; case GPUIMAGE_SKETCH: tableRowTitle = @"Sketch"; break; case GPUIMAGE_TOON: tableRowTitle = @"Toon"; break; + case GPUIMAGE_CONVOLUTION: tableRowTitle = @"3x3 convolution"; break; + case GPUIMAGE_EMBOSS: tableRowTitle = @"Emboss"; break; + case GPUIMAGE_LAPLACIAN: tableRowTitle = @"Laplacian (3x3)"; break; case GPUIMAGE_KUWAHARA: tableRowTitle = @"Kuwahara"; break; case GPUIMAGE_FALSECOLOR: tableRowTitle = @"False color"; break; case GPUIMAGE_SHARPEN: tableRowTitle = @"Sharpen"; break; @@ -745,7 +774,7 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_POISSONBLEND: tableRowTitle = @"Poisson blend"; break; case GPUIMAGE_OPACITY: tableRowTitle = @"Opacity adjustment"; break; } - + return tableRowTitle; } diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index c6583693a..1fd7adf13 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -129,6 +129,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_CGA: cell.textLabel.text = @"CGA colorspace"; break; case GPUIMAGE_CONVOLUTION: cell.textLabel.text = @"3x3 convolution"; break; case GPUIMAGE_EMBOSS: cell.textLabel.text = @"Emboss"; break; + case GPUIMAGE_LAPLACIAN: cell.textLabel.text = @"Laplacian"; break; case GPUIMAGE_POSTERIZE: cell.textLabel.text = @"Posterize"; break; case GPUIMAGE_SWIRL: cell.textLabel.text = @"Swirl"; break; case GPUIMAGE_BULGE: cell.textLabel.text = @"Bulge"; break; diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 9d52c5e4a..ea7806b25 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -62,6 +62,7 @@ typedef enum { GPUIMAGE_POSTERIZE, GPUIMAGE_CONVOLUTION, GPUIMAGE_EMBOSS, + GPUIMAGE_LAPLACIAN, GPUIMAGE_CHROMAKEYNONBLEND, GPUIMAGE_KUWAHARA, GPUIMAGE_KUWAHARARADIUS3, diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 79c46a4b2..32bb7c271 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -717,6 +717,13 @@ - (void)setupFilter; filter = [[GPUImageEmbossFilter alloc] init]; }; break; + case GPUIMAGE_LAPLACIAN: + { + self.title = @"Laplacian"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageLaplacianFilter alloc] init]; + }; break; case GPUIMAGE_POSTERIZE: { self.title = @"Posterize"; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 8adf62c1d..481e0f291 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -112,6 +112,8 @@ BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (); }; }; BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */; }; + BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */; }; + BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */; }; BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (); }; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (); }; }; @@ -454,6 +456,8 @@ BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDilationFilter.m; path = Source/GPUImageDilationFilter.m; sourceTree = SOURCE_ROOT; }; BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageErosionFilter.h; path = Source/GPUImageErosionFilter.h; sourceTree = SOURCE_ROOT; }; BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageErosionFilter.m; path = Source/GPUImageErosionFilter.m; sourceTree = SOURCE_ROOT; }; + BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLaplacianFilter.h; path = Source/GPUImageLaplacianFilter.h; sourceTree = SOURCE_ROOT; }; + BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLaplacianFilter.m; path = Source/GPUImageLaplacianFilter.m; sourceTree = SOURCE_ROOT; }; BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSphereRefractionFilter.h; path = Source/GPUImageSphereRefractionFilter.h; sourceTree = SOURCE_ROOT; }; @@ -1009,6 +1013,8 @@ BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */, BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */, BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */, + BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */, + BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */, BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */, BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */, BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */, @@ -1320,6 +1326,7 @@ 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */, BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */, BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */, + BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1590,6 +1597,7 @@ BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */, BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */, BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */, + BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 735693f11..26558d8c9 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + BC6C553C1730636600EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553A1730636600EB222D /* GPUImageLaplacianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC6C553D1730636600EB222D /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553B1730636600EB222D /* GPUImageLaplacianFilter.m */; }; BC78B70E172DCCB800342C6A /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B706172DCCB800342C6A /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC78B70F172DCCB800342C6A /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B707172DCCB800342C6A /* GPUImageAmatorkaFilter.m */; }; BC78B710172DCCB800342C6A /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B708172DCCB800342C6A /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -31,6 +33,10 @@ BCB009F7172A243400DB804C /* GPUImageSepiaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009F5172A243400DB804C /* GPUImageSepiaFilter.m */; }; BCB009FA172A246E00DB804C /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009F8172A246D00DB804C /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB009FB172A246E00DB804C /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009F9172A246E00DB804C /* GPUImageColorMatrixFilter.m */; }; + BCBF6931173061D200E5792A /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF692F173061D200E5792A /* GPUImage3x3ConvolutionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBF6932173061D200E5792A /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF6930173061D200E5792A /* GPUImage3x3ConvolutionFilter.m */; }; + BCBF69351730623200E5792A /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF69331730623200E5792A /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBF69361730623200E5792A /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF69341730623200E5792A /* GPUImageEmbossFilter.m */; }; BCF40F1217247D68005AE36A /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1017247D68005AE36A /* GPUImageContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF40F1317247D68005AE36A /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F1117247D68005AE36A /* GPUImageContext.m */; }; BCF40F1617247FD8005AE36A /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1417247FD8005AE36A /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -176,6 +182,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + BC6C553A1730636600EB222D /* GPUImageLaplacianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLaplacianFilter.h; path = Source/GPUImageLaplacianFilter.h; sourceTree = SOURCE_ROOT; }; + BC6C553B1730636600EB222D /* GPUImageLaplacianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLaplacianFilter.m; path = Source/GPUImageLaplacianFilter.m; sourceTree = SOURCE_ROOT; }; BC78B706172DCCB800342C6A /* GPUImageAmatorkaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAmatorkaFilter.h; path = Source/GPUImageAmatorkaFilter.h; sourceTree = SOURCE_ROOT; }; BC78B707172DCCB800342C6A /* GPUImageAmatorkaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAmatorkaFilter.m; path = Source/GPUImageAmatorkaFilter.m; sourceTree = SOURCE_ROOT; }; BC78B708172DCCB800342C6A /* GPUImageLookupFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLookupFilter.h; path = Source/GPUImageLookupFilter.h; sourceTree = SOURCE_ROOT; }; @@ -206,6 +214,10 @@ BCB009F5172A243400DB804C /* GPUImageSepiaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSepiaFilter.m; path = Source/GPUImageSepiaFilter.m; sourceTree = SOURCE_ROOT; }; BCB009F8172A246D00DB804C /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; BCB009F9172A246E00DB804C /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; + BCBF692F173061D200E5792A /* GPUImage3x3ConvolutionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage3x3ConvolutionFilter.h; path = Source/GPUImage3x3ConvolutionFilter.h; sourceTree = SOURCE_ROOT; }; + BCBF6930173061D200E5792A /* GPUImage3x3ConvolutionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3ConvolutionFilter.m; path = Source/GPUImage3x3ConvolutionFilter.m; sourceTree = SOURCE_ROOT; }; + BCBF69331730623200E5792A /* GPUImageEmbossFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageEmbossFilter.h; path = Source/GPUImageEmbossFilter.h; sourceTree = SOURCE_ROOT; }; + BCBF69341730623200E5792A /* GPUImageEmbossFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageEmbossFilter.m; path = Source/GPUImageEmbossFilter.m; sourceTree = SOURCE_ROOT; }; BCF40F1017247D68005AE36A /* GPUImageContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageContext.h; path = Source/Mac/GPUImageContext.h; sourceTree = SOURCE_ROOT; }; BCF40F1117247D68005AE36A /* GPUImageContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageContext.m; path = Source/Mac/GPUImageContext.m; sourceTree = SOURCE_ROOT; }; BCF40F1417247FD8005AE36A /* GLProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GLProgram.h; path = Source/GLProgram.h; sourceTree = SOURCE_ROOT; }; @@ -540,6 +552,8 @@ BCF867CE172789B200912E34 /* GPUImageSketchFilter.m */, BCF867D617278A7900912E34 /* GPUImageToonFilter.h */, BCF867D717278A7900912E34 /* GPUImageToonFilter.m */, + BCBF69331730623200E5792A /* GPUImageEmbossFilter.h */, + BCBF69341730623200E5792A /* GPUImageEmbossFilter.m */, BCF867E21727903C00912E34 /* GPUImageKuwaharaFilter.h */, BCF867E31727903D00912E34 /* GPUImageKuwaharaFilter.m */, ); @@ -553,6 +567,10 @@ BCF8680317284CFB00912E34 /* GPUImageTransformFilter.m */, BCF8680617284D0A00912E34 /* GPUImageCropFilter.h */, BCF8680717284D0A00912E34 /* GPUImageCropFilter.m */, + BCBF692F173061D200E5792A /* GPUImage3x3ConvolutionFilter.h */, + BCBF6930173061D200E5792A /* GPUImage3x3ConvolutionFilter.m */, + BC6C553A1730636600EB222D /* GPUImageLaplacianFilter.h */, + BC6C553B1730636600EB222D /* GPUImageLaplacianFilter.m */, BCF867D217278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.h */, BCF867D317278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.m */, BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */, @@ -728,6 +746,9 @@ BC78B70E172DCCB800342C6A /* GPUImageAmatorkaFilter.h in Headers */, BC78B712172DCCB800342C6A /* GPUImageMissEtikateFilter.h in Headers */, BC78B714172DCCB800342C6A /* GPUImageSoftEleganceFilter.h in Headers */, + BCBF6931173061D200E5792A /* GPUImage3x3ConvolutionFilter.h in Headers */, + BCBF69351730623200E5792A /* GPUImageEmbossFilter.h in Headers */, + BC6C553C1730636600EB222D /* GPUImageLaplacianFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -873,6 +894,9 @@ BC78B711172DCCB800342C6A /* GPUImageLookupFilter.m in Sources */, BC78B713172DCCB800342C6A /* GPUImageMissEtikateFilter.m in Sources */, BC78B715172DCCB800342C6A /* GPUImageSoftEleganceFilter.m in Sources */, + BCBF6932173061D200E5792A /* GPUImage3x3ConvolutionFilter.m in Sources */, + BCBF69361730623200E5792A /* GPUImageEmbossFilter.m in Sources */, + BC6C553D1730636600EB222D /* GPUImageLaplacianFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 9df3f3a64..3d170df0b 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -149,4 +149,5 @@ #import "GPUImageTwoInputCrossTextureSamplingFilter.h" #import "GPUImagePoissonBlendFilter.h" #import "GPUImageMotionBlurFilter.h" -#import "GPUImageZoomBlurFilter.h" \ No newline at end of file +#import "GPUImageZoomBlurFilter.h" +#import "GPUImageLaplacianFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m index 987fb1b31..c623ac678 100755 --- a/framework/Source/GPUImage3x3ConvolutionFilter.m +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -1,5 +1,6 @@ #import "GPUImage3x3ConvolutionFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImage3x3ConvolutionFragmentShaderString = SHADER_STRING ( precision highp float; @@ -39,6 +40,45 @@ void main() gl_FragColor = vec4(resultColor, centerColor.a); } ); +#else +NSString *const kGPUImage3x3ConvolutionFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + uniform mat3 convolutionMatrix; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + void main() + { + vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + vec3 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb; + vec3 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb; + vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; + vec3 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).rgb; + vec3 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb; + + vec3 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; + resultColor += leftColor * convolutionMatrix[1][0] + centerColor.rgb * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; + resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; + + gl_FragColor = vec4(resultColor, centerColor.a); + } +); +#endif @implementation GPUImage3x3ConvolutionFilter @@ -49,18 +89,28 @@ @implementation GPUImage3x3ConvolutionFilter - (id)init; { - if (!(self = [super initWithFragmentShaderFromString:kGPUImage3x3ConvolutionFragmentShaderString])) + if (!(self = [self initWithFragmentShaderFromString:kGPUImage3x3ConvolutionFragmentShaderString])) { - return nil; + return nil; } - - convolutionMatrixUniform = [filterProgram uniformIndex:@"convolutionMatrix"]; self.convolutionKernel = (GPUMatrix3x3){ {0.f, 0.f, 0.f}, {0.f, 1.f, 0.f}, {0.f, 0.f, 0.f} }; + + return self; +} + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithFragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + convolutionMatrixUniform = [filterProgram uniformIndex:@"convolutionMatrix"]; return self; } diff --git a/framework/Source/GPUImageLaplacianFilter.h b/framework/Source/GPUImageLaplacianFilter.h new file mode 100644 index 000000000..267c1bab5 --- /dev/null +++ b/framework/Source/GPUImageLaplacianFilter.h @@ -0,0 +1,5 @@ +#import "GPUImage3x3ConvolutionFilter.h" + +@interface GPUImageLaplacianFilter : GPUImage3x3ConvolutionFilter + +@end diff --git a/framework/Source/GPUImageLaplacianFilter.m b/framework/Source/GPUImageLaplacianFilter.m new file mode 100644 index 000000000..4242f3d13 --- /dev/null +++ b/framework/Source/GPUImageLaplacianFilter.m @@ -0,0 +1,115 @@ +#import "GPUImageLaplacianFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageLaplacianFragmentShaderString = SHADER_STRING +( + precision highp float; + + uniform sampler2D inputImageTexture; + + uniform mediump mat3 convolutionMatrix; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + void main() + { + mediump vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + mediump vec3 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb; + mediump vec3 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb; + mediump vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + mediump vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + mediump vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + mediump vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; + mediump vec3 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).rgb; + mediump vec3 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb; + + mediump vec3 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; + resultColor += leftColor * convolutionMatrix[1][0] + centerColor.rgb * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; + resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; + + // Normalize the results to allow for negative gradients in the 0.0-1.0 colorspace + resultColor = (resultColor + 1.0) / 2.0; + + gl_FragColor = vec4(resultColor, centerColor.a); + } +); +#else +NSString *const kGPUImageLaplacianFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + uniform mat3 convolutionMatrix; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + void main() + { + vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; + vec3 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb; + vec3 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb; + vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; + vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; + vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; + vec3 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).rgb; + vec3 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb; + + vec3 resultColor = topLeftColor * convolutionMatrix[0][0] + topColor * convolutionMatrix[0][1] + topRightColor * convolutionMatrix[0][2]; + resultColor += leftColor * convolutionMatrix[1][0] + centerColor.rgb * convolutionMatrix[1][1] + rightColor * convolutionMatrix[1][2]; + resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; + + // Normalize the results to allow for negative gradients in the 0.0-1.0 colorspace + resultColor = (resultColor + 1.0) / 2.0; + + gl_FragColor = vec4(resultColor, centerColor.a); + } +); +#endif + +@implementation GPUImageLaplacianFilter + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageLaplacianFragmentShaderString])) + { + return nil; + } + + GPUMatrix3x3 newConvolutionMatrix; + newConvolutionMatrix.one.one = 0.5; + newConvolutionMatrix.one.two = 1.0; + newConvolutionMatrix.one.three = 0.5; + + newConvolutionMatrix.two.one = 1.0; + newConvolutionMatrix.two.two = -6.0; + newConvolutionMatrix.two.three = 1.0; + + newConvolutionMatrix.three.one = 0.5; + newConvolutionMatrix.three.two = 1.0; + newConvolutionMatrix.three.three = 0.5; + + self.convolutionKernel = newConvolutionMatrix; + + return self; +} + +@end diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 5663fa391..f0d8d011a 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -95,7 +95,6 @@ - (id)init; return self; } - - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; { // Do a luminance pass first to reduce the calculations performed at each fragment in the edge detection phase diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 11cab4748..6e102ef84 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -82,6 +82,9 @@ #import #import #import +#import +#import +#import // Outputs #import From d5c1ddcbe7231132d8dac65b0fbcdf32e4e53979 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 3 May 2013 09:29:43 -0500 Subject: [PATCH 367/695] Added a three-input filter type, fixed scaling issues with the Lanczos resampling, and started adding multiple AV camera support to the Mac. --- .../SLSFilterShowcaseWindowController.m | 2 +- framework/GPUImage.xcodeproj/project.pbxproj | 8 + .../GPUImageMac.xcodeproj/project.pbxproj | 16 + .../Source/GPUImageLanczosResamplingFilter.m | 56 ++- framework/Source/GPUImageLaplacianFilter.m | 4 +- framework/Source/GPUImageThreeInputFilter.h | 21 ++ framework/Source/GPUImageThreeInputFilter.m | 341 ++++++++++++++++++ framework/Source/GPUImageTwoPassFilter.h | 3 + framework/Source/GPUImageTwoPassFilter.m | 162 +++++---- framework/Source/Mac/GPUImage.h | 2 + framework/Source/Mac/GPUImageAVCamera.h | 4 +- framework/Source/Mac/GPUImageAVCamera.m | 40 +- 12 files changed, 563 insertions(+), 96 deletions(-) create mode 100644 framework/Source/GPUImageThreeInputFilter.h create mode 100644 framework/Source/GPUImageThreeInputFilter.m diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index ab13f2b29..96d6ee174 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -27,7 +27,7 @@ - (void)windowDidLoad { [super windowDidLoad]; - inputCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionUnspecified]; + inputCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraDevice:nil]; inputCamera.runBenchmark = YES; currentlySelectedRow = 1; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 481e0f291..eb9e59990 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -194,6 +194,8 @@ BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (); }; }; BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */; }; + BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB030BC173400BC001A1A20 /* GPUImageThreeInputFilter.h */; }; + BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB030BD173400BC001A1A20 /* GPUImageThreeInputFilter.m */; }; BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (); }; }; BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */; }; BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (); }; }; @@ -538,6 +540,8 @@ BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDirectionalNonMaximumSuppressionFilter.m; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageWeakPixelInclusionFilter.h; path = Source/GPUImageWeakPixelInclusionFilter.h; sourceTree = SOURCE_ROOT; }; BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageWeakPixelInclusionFilter.m; path = Source/GPUImageWeakPixelInclusionFilter.m; sourceTree = SOURCE_ROOT; }; + BCB030BC173400BC001A1A20 /* GPUImageThreeInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThreeInputFilter.h; path = Source/GPUImageThreeInputFilter.h; sourceTree = SOURCE_ROOT; }; + BCB030BD173400BC001A1A20 /* GPUImageThreeInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThreeInputFilter.m; path = Source/GPUImageThreeInputFilter.m; sourceTree = SOURCE_ROOT; }; BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLowPassFilter.h; path = Source/GPUImageLowPassFilter.h; sourceTree = SOURCE_ROOT; }; BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLowPassFilter.m; path = Source/GPUImageLowPassFilter.m; sourceTree = SOURCE_ROOT; }; BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHighPassFilter.h; path = Source/GPUImageHighPassFilter.h; sourceTree = SOURCE_ROOT; }; @@ -922,6 +926,8 @@ BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */, BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */, BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */, + BCB030BC173400BC001A1A20 /* GPUImageThreeInputFilter.h */, + BCB030BD173400BC001A1A20 /* GPUImageThreeInputFilter.m */, BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */, BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */, BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */, @@ -1327,6 +1333,7 @@ BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */, BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */, BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */, + BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1598,6 +1605,7 @@ BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */, BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */, BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */, + BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 26558d8c9..879ff93cd 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ BC6C553C1730636600EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553A1730636600EB222D /* GPUImageLaplacianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC6C553D1730636600EB222D /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553B1730636600EB222D /* GPUImageLaplacianFilter.m */; }; + BC6C55461730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C55441730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC6C55471730BDCF00EB222D /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C55451730BDCF00EB222D /* GPUImageLanczosResamplingFilter.m */; }; BC78B70E172DCCB800342C6A /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B706172DCCB800342C6A /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC78B70F172DCCB800342C6A /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B707172DCCB800342C6A /* GPUImageAmatorkaFilter.m */; }; BC78B710172DCCB800342C6A /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B708172DCCB800342C6A /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -21,6 +23,8 @@ BCA3F3621723A8FA00E28AEC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3601723A8FA00E28AEC /* OpenGL.framework */; }; BCA3F3631723A8FA00E28AEC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */; }; BCA3F3651723A96600E28AEC /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA3F3641723A96600E28AEC /* GPUImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAE41E41731C3000020F80D /* GPUImageThreeInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAE41E21731C3000020F80D /* GPUImageThreeInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAE41E51731C3000020F80D /* GPUImageThreeInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAE41E31731C3000020F80D /* GPUImageThreeInputFilter.m */; }; BCB009E6172A1BBD00DB804C /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009E4172A1BBD00DB804C /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB009E7172A1BBD00DB804C /* GPUImageGammaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB009E5172A1BBD00DB804C /* GPUImageGammaFilter.m */; }; BCB009EA172A1BE800DB804C /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB009E8172A1BE800DB804C /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -184,6 +188,8 @@ /* Begin PBXFileReference section */ BC6C553A1730636600EB222D /* GPUImageLaplacianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLaplacianFilter.h; path = Source/GPUImageLaplacianFilter.h; sourceTree = SOURCE_ROOT; }; BC6C553B1730636600EB222D /* GPUImageLaplacianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLaplacianFilter.m; path = Source/GPUImageLaplacianFilter.m; sourceTree = SOURCE_ROOT; }; + BC6C55441730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLanczosResamplingFilter.h; path = Source/GPUImageLanczosResamplingFilter.h; sourceTree = SOURCE_ROOT; }; + BC6C55451730BDCF00EB222D /* GPUImageLanczosResamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLanczosResamplingFilter.m; path = Source/GPUImageLanczosResamplingFilter.m; sourceTree = SOURCE_ROOT; }; BC78B706172DCCB800342C6A /* GPUImageAmatorkaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAmatorkaFilter.h; path = Source/GPUImageAmatorkaFilter.h; sourceTree = SOURCE_ROOT; }; BC78B707172DCCB800342C6A /* GPUImageAmatorkaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAmatorkaFilter.m; path = Source/GPUImageAmatorkaFilter.m; sourceTree = SOURCE_ROOT; }; BC78B708172DCCB800342C6A /* GPUImageLookupFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLookupFilter.h; path = Source/GPUImageLookupFilter.h; sourceTree = SOURCE_ROOT; }; @@ -202,6 +208,8 @@ BCA3F3601723A8FA00E28AEC /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BCA3F3641723A96600E28AEC /* GPUImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImage.h; path = Source/Mac/GPUImage.h; sourceTree = SOURCE_ROOT; }; + BCAE41E21731C3000020F80D /* GPUImageThreeInputFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThreeInputFilter.h; path = Source/GPUImageThreeInputFilter.h; sourceTree = SOURCE_ROOT; }; + BCAE41E31731C3000020F80D /* GPUImageThreeInputFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThreeInputFilter.m; path = Source/GPUImageThreeInputFilter.m; sourceTree = SOURCE_ROOT; }; BCB009E4172A1BBD00DB804C /* GPUImageGammaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGammaFilter.h; path = Source/GPUImageGammaFilter.h; sourceTree = SOURCE_ROOT; }; BCB009E5172A1BBD00DB804C /* GPUImageGammaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGammaFilter.m; path = Source/GPUImageGammaFilter.m; sourceTree = SOURCE_ROOT; }; BCB009E8172A1BE800DB804C /* GPUImageToneCurveFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageToneCurveFilter.h; path = Source/GPUImageToneCurveFilter.h; sourceTree = SOURCE_ROOT; }; @@ -471,6 +479,8 @@ BCF868841728772600912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.m */, BCF867F21728490300912E34 /* GPUImageTwoInputFilter.h */, BCF867F31728490500912E34 /* GPUImageTwoInputFilter.m */, + BCAE41E21731C3000020F80D /* GPUImageThreeInputFilter.h */, + BCAE41E31731C3000020F80D /* GPUImageThreeInputFilter.m */, BCF867C9172788F100912E34 /* GPUImage3x3TextureSamplingFilter.h */, BCF867CA172788F100912E34 /* GPUImage3x3TextureSamplingFilter.m */, BCF867C31727820100912E34 /* Color processing */, @@ -595,6 +605,8 @@ BCF86825172857B000912E34 /* GPUImageMotionBlurFilter.m */, BCF86826172857B200912E34 /* GPUImageZoomBlurFilter.h */, BCF86827172857B600912E34 /* GPUImageZoomBlurFilter.m */, + BC6C55441730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h */, + BC6C55451730BDCF00EB222D /* GPUImageLanczosResamplingFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -749,6 +761,8 @@ BCBF6931173061D200E5792A /* GPUImage3x3ConvolutionFilter.h in Headers */, BCBF69351730623200E5792A /* GPUImageEmbossFilter.h in Headers */, BC6C553C1730636600EB222D /* GPUImageLaplacianFilter.h in Headers */, + BC6C55461730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h in Headers */, + BCAE41E41731C3000020F80D /* GPUImageThreeInputFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -897,6 +911,8 @@ BCBF6932173061D200E5792A /* GPUImage3x3ConvolutionFilter.m in Sources */, BCBF69361730623200E5792A /* GPUImageEmbossFilter.m in Sources */, BC6C553D1730636600EB222D /* GPUImageLaplacianFilter.m in Sources */, + BC6C55471730BDCF00EB222D /* GPUImageLanczosResamplingFilter.m in Sources */, + BCAE41E51731C3000020F80D /* GPUImageThreeInputFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m index 77c286a7b..54483ef96 100644 --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -39,7 +39,7 @@ void main() } ); - +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLanczosFragmentShaderString = SHADER_STRING ( precision highp float; @@ -77,7 +77,45 @@ void main() gl_FragColor = fragmentColor; } - ); +); +#else +NSString *const kGPUImageLanczosFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 threeStepsLeftTextureCoordinate; + varying vec2 fourStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; + varying vec2 threeStepsRightTextureCoordinate; + varying vec2 fourStepsRightTextureCoordinate; + + // sinc(x) * sinc(x/a) = (a * sin(pi * x) * sin(pi * x / a)) / (pi^2 * x^2) + // Assuming a Lanczos constant of 2.0, and scaling values to max out at x = +/- 1.5 + + void main() + { + vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.38026; + + fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.27667; + fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.27667; + + fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.08074; + fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.08074; + + fragmentColor += texture2D(inputImageTexture, threeStepsLeftTextureCoordinate) * -0.02612; + fragmentColor += texture2D(inputImageTexture, threeStepsRightTextureCoordinate) * -0.02612; + + fragmentColor += texture2D(inputImageTexture, fourStepsLeftTextureCoordinate) * -0.02143; + fragmentColor += texture2D(inputImageTexture, fourStepsRightTextureCoordinate) * -0.02143; + + gl_FragColor = fragmentColor; + } +); +#endif @implementation GPUImageLanczosResamplingFilter @@ -147,4 +185,18 @@ - (void)setFilterFBO; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } +- (void)setSecondFilterFBO; +{ + CGSize currentFBOSize = [self sizeOfFBO]; + if (!secondFilterFramebuffer) + { + [self createFilterFBOofSize:currentFBOSize]; + [self setupFilterForSize:currentFBOSize]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + + glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); +} + @end diff --git a/framework/Source/GPUImageLaplacianFilter.m b/framework/Source/GPUImageLaplacianFilter.m index 4242f3d13..98b78509c 100644 --- a/framework/Source/GPUImageLaplacianFilter.m +++ b/framework/Source/GPUImageLaplacianFilter.m @@ -37,7 +37,7 @@ void main() resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; // Normalize the results to allow for negative gradients in the 0.0-1.0 colorspace - resultColor = (resultColor + 1.0) / 2.0; + resultColor = resultColor + 0.5; gl_FragColor = vec4(resultColor, centerColor.a); } @@ -78,7 +78,7 @@ void main() resultColor += bottomLeftColor * convolutionMatrix[2][0] + bottomColor * convolutionMatrix[2][1] + bottomRightColor * convolutionMatrix[2][2]; // Normalize the results to allow for negative gradients in the 0.0-1.0 colorspace - resultColor = (resultColor + 1.0) / 2.0; + resultColor = resultColor + 0.5; gl_FragColor = vec4(resultColor, centerColor.a); } diff --git a/framework/Source/GPUImageThreeInputFilter.h b/framework/Source/GPUImageThreeInputFilter.h new file mode 100644 index 000000000..d0e717879 --- /dev/null +++ b/framework/Source/GPUImageThreeInputFilter.h @@ -0,0 +1,21 @@ +#import "GPUImageTwoInputFilter.h" + +extern NSString *const kGPUImageThreeInputTextureVertexShaderString; + +@interface GPUImageThreeInputFilter : GPUImageTwoInputFilter +{ + GLint filterThirdTextureCoordinateAttribute; + GLint filterInputTextureUniform3; + GPUImageRotationMode inputRotation3; + GLuint filterSourceTexture3; + CMTime thirdFrameTime; + + BOOL hasSetSecondTexture, hasReceivedThirdFrame, thirdFrameWasVideo; + BOOL thirdFrameCheckDisabled; + + __unsafe_unretained id thirdTextureDelegate; +} + +- (void)disableThirdFrameCheck; + +@end diff --git a/framework/Source/GPUImageThreeInputFilter.m b/framework/Source/GPUImageThreeInputFilter.m new file mode 100644 index 000000000..635bc2769 --- /dev/null +++ b/framework/Source/GPUImageThreeInputFilter.m @@ -0,0 +1,341 @@ +#import "GPUImageThreeInputFilter.h" + + +NSString *const kGPUImageThreeInputTextureVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + attribute vec4 inputTextureCoordinate2; + attribute vec4 inputTextureCoordinate3; + + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + varying vec2 textureCoordinate3; + + void main() + { + gl_Position = position; + textureCoordinate = inputTextureCoordinate.xy; + textureCoordinate2 = inputTextureCoordinate2.xy; + textureCoordinate3 = inputTextureCoordinate3.xy; + } +); + +@implementation GPUImageThreeInputFilter + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [self initWithVertexShaderFromString:kGPUImageThreeInputTextureVertexShaderString fragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + return self; +} + +- (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShaderFromString:(NSString *)fragmentShaderString; +{ + if (!(self = [super initWithVertexShaderFromString:vertexShaderString fragmentShaderFromString:fragmentShaderString])) + { + return nil; + } + + inputRotation3 = kGPUImageNoRotation; + + hasSetSecondTexture = NO; + + hasReceivedThirdFrame = NO; + thirdFrameWasVideo = NO; + thirdFrameCheckDisabled = NO; + + thirdFrameTime = kCMTimeInvalid; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + filterThirdTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate3"]; + + filterInputTextureUniform3 = [filterProgram uniformIndex:@"inputImageTexture3"]; // This does assume a name of "inputImageTexture3" for the third input texture in the fragment shader + glEnableVertexAttribArray(filterThirdTextureCoordinateAttribute); + }); + + return self; +} + +- (void)initializeAttributes; +{ + [super initializeAttributes]; + [filterProgram addAttribute:@"inputTextureCoordinate3"]; +} + +- (void)disableThirdFrameCheck; +{ + thirdFrameCheckDisabled = YES; +} + +#pragma mark - +#pragma mark Rendering + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + if (self.preventRendering) + { + return; + } + + [GPUImageContext setActiveShaderProgram:filterProgram]; + [self setFilterFBO]; + [self setUniformsForProgramAtIndex:0]; + + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, sourceTexture); + glUniform1i(filterInputTextureUniform, 2); + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + glUniform1i(filterInputTextureUniform2, 3); + + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, filterSourceTexture3); + glUniform1i(filterInputTextureUniform3, 4); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + glVertexAttribPointer(filterSecondTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation2]); + glVertexAttribPointer(filterThirdTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation3]); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +- (void)releaseInputTexturesIfNeeded; +{ + if (shouldConserveMemoryForNextFrame) + { + [firstTextureDelegate textureNoLongerNeededForTarget:self]; + [secondTextureDelegate textureNoLongerNeededForTarget:self]; + [thirdTextureDelegate textureNoLongerNeededForTarget:self]; + shouldConserveMemoryForNextFrame = NO; + } +} + +#pragma mark - +#pragma mark GPUImageInput + +- (NSInteger)nextAvailableTextureIndex; +{ + if (hasSetSecondTexture) + { + return 2; + } + else if (hasSetFirstTexture) + { + return 1; + } + else + { + return 0; + } +} + +- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +{ + if (textureIndex == 0) + { + filterSourceTexture = newInputTexture; + hasSetFirstTexture = YES; + } + else if (textureIndex == 1) + { + filterSourceTexture2 = newInputTexture; + hasSetSecondTexture = YES; + } + else + { + filterSourceTexture3 = newInputTexture; + } +} + +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + if (textureIndex == 0) + { + [super setInputSize:newSize atIndex:textureIndex]; + + if (CGSizeEqualToSize(newSize, CGSizeZero)) + { + hasSetFirstTexture = NO; + } + } + else if (textureIndex == 1) + { + if (CGSizeEqualToSize(newSize, CGSizeZero)) + { + hasSetSecondTexture = NO; + } + } +} + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + if (textureIndex == 0) + { + inputRotation = newInputRotation; + } + else if (textureIndex == 1) + { + inputRotation2 = newInputRotation; + } + else + { + inputRotation3 = newInputRotation; + } +} + +- (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; +{ + CGSize rotatedSize = sizeToRotate; + + GPUImageRotationMode rotationToCheck; + if (textureIndex == 0) + { + rotationToCheck = inputRotation; + } + else if (textureIndex == 1) + { + rotationToCheck = inputRotation2; + } + else + { + rotationToCheck = inputRotation3; + } + + if (GPUImageRotationSwapsWidthAndHeight(rotationToCheck)) + { + rotatedSize.width = sizeToRotate.height; + rotatedSize.height = sizeToRotate.width; + } + + return rotatedSize; +} + +- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; +{ + outputTextureRetainCount = [targets count]; + + // You can set up infinite update loops, so this helps to short circuit them + if (hasReceivedFirstFrame && hasReceivedSecondFrame) + { + return; + } + + BOOL updatedMovieFrameOppositeStillImage = NO; + + if (textureIndex == 0) + { + hasReceivedFirstFrame = YES; + firstFrameTime = frameTime; + if (secondFrameCheckDisabled) + { + hasReceivedSecondFrame = YES; + } + if (thirdFrameCheckDisabled) + { + hasReceivedThirdFrame = YES; + } + + if (!CMTIME_IS_INDEFINITE(frameTime)) + { + if CMTIME_IS_INDEFINITE(secondFrameTime) + { + updatedMovieFrameOppositeStillImage = YES; + } + } + } + else if (textureIndex == 1) + { + hasReceivedSecondFrame = YES; + secondFrameTime = frameTime; + if (firstFrameCheckDisabled) + { + hasReceivedFirstFrame = YES; + } + if (thirdFrameCheckDisabled) + { + hasReceivedThirdFrame = YES; + } + + if (!CMTIME_IS_INDEFINITE(frameTime)) + { + if CMTIME_IS_INDEFINITE(firstFrameTime) + { + updatedMovieFrameOppositeStillImage = YES; + } + } + } + else + { + hasReceivedThirdFrame = YES; + thirdFrameTime = frameTime; + if (firstFrameCheckDisabled) + { + hasReceivedFirstFrame = YES; + } + if (secondFrameCheckDisabled) + { + hasReceivedSecondFrame = YES; + } + + if (!CMTIME_IS_INDEFINITE(frameTime)) + { + if CMTIME_IS_INDEFINITE(firstFrameTime) + { + updatedMovieFrameOppositeStillImage = YES; + } + } + } + + // || (hasReceivedFirstFrame && secondFrameCheckDisabled) || (hasReceivedSecondFrame && firstFrameCheckDisabled) + if ((hasReceivedFirstFrame && hasReceivedSecondFrame && hasReceivedThirdFrame) || updatedMovieFrameOppositeStillImage) + { + outputTextureRetainCount = [targets count]; + + static const GLfloat imageVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + + [self informTargetsAboutNewFrameAtTime:frameTime]; + + hasReceivedFirstFrame = NO; + hasReceivedSecondFrame = NO; + hasReceivedThirdFrame = NO; + } +} + +- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +{ + if (textureIndex == 0) + { + firstTextureDelegate = newTextureDelegate; + } + else if (textureIndex == 1) + { + secondTextureDelegate = newTextureDelegate; + } + else + { + thirdTextureDelegate = newTextureDelegate; + } +} + + +@end diff --git a/framework/Source/GPUImageTwoPassFilter.h b/framework/Source/GPUImageTwoPassFilter.h index d04a8b0e8..b76ab6dbb 100755 --- a/framework/Source/GPUImageTwoPassFilter.h +++ b/framework/Source/GPUImageTwoPassFilter.h @@ -19,4 +19,7 @@ - (void)initializeSecondaryAttributes; - (void)initializeSecondOutputTextureIfNeeded; +// Managing the display FBOs +- (void)createSecondFilterFBOofSize:(CGSize)currentFBOSize; + @end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index fe3a00453..f7cdcdf2c 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -140,90 +140,97 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; } } - glGenFramebuffers(1, &secondFilterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + [self createSecondFilterFBOofSize:[self sizeOfFBO]]; + }); +} - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { +- (void)createSecondFilterFBOofSize:(CGSize)currentFBOSize; +{ + glGenFramebuffers(1, &secondFilterFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); + + if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) + { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - - #if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); - #else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); - #endif - - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) - { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); - } - - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - GL_RGBA, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, - 0, - &renderTexture); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); - } - - CFRelease(attrs); - CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); - - [self notifyTargetsAboutNewOutputTexture]; + +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); +#else + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #endif + + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); } - else + + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) { - [self initializeSecondOutputTextureIfNeeded]; - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); -// if ([self providesMonochromeOutput] && [GPUImageContext deviceSupportsRedTextures]) -// { -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); -// } -// else -// { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); -// } - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); - - [self notifyTargetsAboutNewOutputTexture]; + NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + filterTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + GL_RGBA, // opengl format + (int)currentFBOSize.width, + (int)currentFBOSize.height, + GL_BGRA, // native iOS format + GL_UNSIGNED_BYTE, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); } - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + CFRelease(attrs); + CFRelease(empty); + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); - glBindTexture(GL_TEXTURE_2D, 0); - }); + [self notifyTargetsAboutNewOutputTexture]; +#endif + } + else + { + [self initializeSecondOutputTextureIfNeeded]; + glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); + // if ([self providesMonochromeOutput] && [GPUImageContext deviceSupportsRedTextures]) + // { + // glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); + // } + // else + // { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + // } + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); + + [self notifyTargetsAboutNewOutputTexture]; + } + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + + glBindTexture(GL_TEXTURE_2D, 0); + } - (void)recreateFilterFBO @@ -232,7 +239,7 @@ - (void)recreateFilterFBO [self destroyFilterFBO]; [self deleteOutputTexture]; -// +// // [self setFilterFBO]; // [self setSecondFilterFBO]; } @@ -300,15 +307,14 @@ - (void)setFilterFBO; - (void)setSecondFilterFBO; { + CGSize currentFBOSize = [self sizeOfFBO]; if (!secondFilterFramebuffer) { - CGSize currentFBOSize = [self sizeOfFBO]; [self createFilterFBOofSize:currentFBOSize]; [self setupFilterForSize:currentFBOSize]; } glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 6e102ef84..c7dc39529 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -85,6 +85,8 @@ #import #import #import +#import +#import // Outputs #import diff --git a/framework/Source/Mac/GPUImageAVCamera.h b/framework/Source/Mac/GPUImageAVCamera.h index bb3836e18..998179b04 100755 --- a/framework/Source/Mac/GPUImageAVCamera.h +++ b/framework/Source/Mac/GPUImageAVCamera.h @@ -64,6 +64,8 @@ /// @name Initialization and teardown ++ (NSArray *)connectedCameraDevices; + /** Begin a capture session See AVCaptureSession for acceptable values @@ -71,7 +73,7 @@ @param sessionPreset Session preset to use @param cameraPosition Camera to capture from */ -- (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; +- (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDevice *)cameraDevice; /** Tear down the capture session */ diff --git a/framework/Source/Mac/GPUImageAVCamera.m b/framework/Source/Mac/GPUImageAVCamera.m index 37ca34158..5c2598280 100644 --- a/framework/Source/Mac/GPUImageAVCamera.m +++ b/framework/Source/Mac/GPUImageAVCamera.m @@ -104,9 +104,15 @@ @implementation GPUImageAVCamera #pragma mark - #pragma mark Initialization and teardown ++ (NSArray *)connectedCameraDevices; +{ + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + return devices; +} + - (id)init; { - if (!(self = [self initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack])) + if (!(self = [self initWithSessionPreset:AVCaptureSessionPreset640x480 cameraDevice:nil])) { return nil; } @@ -114,7 +120,7 @@ - (id)init; return self; } -- (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; +- (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDevice *)cameraDevice; { if (!(self = [super init])) { @@ -179,16 +185,24 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // Grab the back-facing or front-facing camera _inputCamera = nil; - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; - for (AVCaptureDevice *device in devices) - { - NSLog(@"Device: %@, %ld", device, [device position]); - - if (([device position] == cameraPosition) && (![device isSuspended]) ) - { - _inputCamera = device; - } - } + + if (cameraDevice == nil) + { + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + for (AVCaptureDevice *device in devices) + { + NSLog(@"Device: %@, %ld", device, [device position]); + + if (![device isSuspended]) + { + _inputCamera = device; + } + } + } + else + { + _inputCamera = cameraDevice; + } if (!_inputCamera) { return nil; @@ -518,6 +532,8 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; GLsizei bufferWidth = (GLsizei)CVPixelBufferGetWidth(cameraFrame); GLsizei bufferHeight = (GLsizei)CVPixelBufferGetHeight(cameraFrame); + NSLog(@"Buffer width: %d, height: %d", bufferWidth, bufferHeight); + CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); [GPUImageContext useImageProcessingContext]; From 4bf6a00d8c7036a367e1a9d0e80c643c1da71373 Mon Sep 17 00:00:00 2001 From: Zimu Liu Date: Fri, 3 May 2013 15:22:07 -0400 Subject: [PATCH 368/695] Added build.sh to produce a universal iOS library --- README.md | 4 ++++ build.sh | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100755 build.sh diff --git a/README.md b/README.md index ba89302ec..39286aee6 100755 --- a/README.md +++ b/README.md @@ -36,6 +36,10 @@ BSD-style, with the full license available with the framework in License.txt. - Devices must have a camera to use camera-related functionality (obviously) - The framework uses automatic reference counting (ARC), but should support projects using both ARC and manual reference counting if added as a subproject as explained below. For manual reference counting applications targeting iOS 4.x, you'll need add -fobjc-arc to the Other Linker Flags for your application project. +## Build iOS static library ## + +Execute `build.sh` to compile a universal library for iOS simulator/device. The produced library and header files are located at `build/Release-iphone`. You may also change the version of iOS SDK by specifying `IOSSDK_VER` in the `build.sh` (all available versions can be found using `xcodebuild -showsdks`). + ## General architecture ## GPUImage uses OpenGL ES 2.0 shaders to perform image and video manipulation much faster than could be done in CPU-bound routines. However, it hides the complexity of interacting with the OpenGL ES API in a simplified Objective-C interface. This interface lets you define input sources for images and video, attach filters in a chain, and send the resulting processed image or video to the screen, to a UIImage, or to a movie on disk. diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..3963a33c5 --- /dev/null +++ b/build.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -e + +IOSSDK_VER="6.1" + +# xcodebuild -showsdks + +cd framework +xcodebuild -project GPUImage.xcodeproj -target GPUImage -configuration Release -sdk iphoneos${IOSSDK_VER} build +xcodebuild -project GPUImage.xcodeproj -target GPUImage -configuration Release -sdk iphonesimulator${IOSSDK_VER} build +cd .. + +cd build +# for the fat lib file +mkdir -p Release-iphone/lib +xcrun -sdk iphoneos lipo -create Release-iphoneos/libGPUImage.a Release-iphonesimulator/libGPUImage.a -output Release-iphone/lib/libGPUImage.a +xcrun -sdk iphoneos lipo -info Release-iphone/lib/libGPUImage.a +# for header files +mkdir -p Release-iphone/include +cp ../framework/Source/*.h Release-iphone/include +cp ../framework/Source/iOS/*.h Release-iphone/include From 67d2644b3035c1b7b5b1f077ae2316e94d3d26c3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 4 May 2013 20:15:39 -0500 Subject: [PATCH 369/695] Ported a few more filters to the Mac. Added the ability to lock on to a specific UUID for a Mac camera. --- .../SLSFilterShowcaseWindowController.h | 9 +- .../SLSFilterShowcaseWindowController.m | 114 ++++++++++++++++++ .../GPUImageMac.xcodeproj/project.pbxproj | 72 +++++++++++ .../Source/GPUImageAdaptiveThresholdFilter.m | 24 +++- framework/Source/GPUImageAverageColor.m | 45 ++++++- framework/Source/GPUImageColorInvertFilter.m | 16 +++ framework/Source/GPUImageHistogramFilter.m | 24 +++- framework/Source/GPUImageHistogramGenerator.m | 19 ++- .../Source/GPUImageLuminanceThresholdFilter.m | 21 ++++ framework/Source/GPUImageLuminosity.m | 62 ++++++++++ .../Source/GPUImageSolidColorGenerator.m | 15 +++ framework/Source/Mac/GPUImage.h | 9 ++ framework/Source/Mac/GPUImageAVCamera.h | 4 + framework/Source/Mac/GPUImageAVCamera.m | 104 +++++++++++++--- 14 files changed, 508 insertions(+), 30 deletions(-) diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index a9b40158b..fb27b033e 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -26,8 +26,15 @@ typedef enum { GPUIMAGE_AMATORKA, GPUIMAGE_MISSETIKATE, GPUIMAGE_SOFTELEGANCE, - GPUIMAGE_PIXELLATE, + GPUIMAGE_COLORINVERT, GPUIMAGE_GRAYSCALE, + GPUIMAGE_HISTOGRAM, + GPUIMAGE_AVERAGECOLOR, + GPUIMAGE_LUMINOSITY, + GPUIMAGE_THRESHOLD, + GPUIMAGE_ADAPTIVETHRESHOLD, + GPUIMAGE_AVERAGELUMINANCETHRESHOLD, + GPUIMAGE_PIXELLATE, GPUIMAGE_SOBELEDGEDETECTION, GPUIMAGE_SKETCH, GPUIMAGE_TOON, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 96d6ee174..657fd4668 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -267,6 +267,57 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; currentlySelectedFilter = [[GPUImageSoftEleganceFilter alloc] init]; self.enableSlider = NO; }; break; + case GPUIMAGE_COLORINVERT: + { + currentlySelectedFilter = [[GPUImageColorInvertFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_HISTOGRAM: + { + currentlySelectedFilter = [[GPUImageHistogramFilter alloc] init]; + + self.minimumSliderValue = 4.0; + self.maximumSliderValue = 32.0; + self.currentSliderValue = 16.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_AVERAGECOLOR: + { + currentlySelectedFilter = [[GPUImageAverageColor alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_LUMINOSITY: + { + currentlySelectedFilter = [[GPUImageLuminosity alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_THRESHOLD: + { + currentlySelectedFilter = [[GPUImageLuminanceThresholdFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_ADAPTIVETHRESHOLD: + { + currentlySelectedFilter = [[GPUImageAdaptiveThresholdFilter alloc] init]; + + self.minimumSliderValue = 1.0; + self.maximumSliderValue = 20.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: + { + currentlySelectedFilter = [[GPUImageAverageLuminanceThresholdFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 2.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; case GPUIMAGE_GRAYSCALE: { currentlySelectedFilter = [[GPUImageGrayscaleFilter alloc] init]; @@ -634,6 +685,58 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; [blendFilter addTarget:self.glView]; } + else if (currentlySelectedRow == GPUIMAGE_HISTOGRAM) + { + [currentlySelectedFilter removeTarget:self.glView]; + + // I'm adding an intermediary filter because glReadPixels() requires something to be rendered for its glReadPixels() operation to work + [inputCamera removeTarget:currentlySelectedFilter]; + GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; + [inputCamera addTarget:gammaFilter]; + [gammaFilter addTarget:currentlySelectedFilter]; + + GPUImageHistogramGenerator *histogramGraph = [[GPUImageHistogramGenerator alloc] init]; + + [histogramGraph forceProcessingAtSize:CGSizeMake(256.0, 144.0)]; + [currentlySelectedFilter addTarget:histogramGraph]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + blendFilter.mix = 0.75; + [blendFilter forceProcessingAtSize:CGSizeMake(256.0, 144.0)]; + + [inputCamera addTarget:blendFilter]; + [histogramGraph addTarget:blendFilter]; + + [blendFilter addTarget:self.glView]; + } + else if (currentlySelectedRow == GPUIMAGE_AVERAGECOLOR) + { + [currentlySelectedFilter removeTarget:self.glView]; + + GPUImageSolidColorGenerator *colorGenerator = [[GPUImageSolidColorGenerator alloc] init]; + [colorGenerator forceProcessingAtSize:[self.glView sizeInPixels]]; + + [(GPUImageAverageColor *)currentlySelectedFilter setColorAverageProcessingFinishedBlock:^(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime) { + [colorGenerator setColorRed:redComponent green:greenComponent blue:blueComponent alpha:alphaComponent]; + // NSLog(@"Average color: %f, %f, %f, %f", redComponent, greenComponent, blueComponent, alphaComponent); + }]; + + [colorGenerator addTarget:self.glView]; + } + else if (currentlySelectedRow == GPUIMAGE_LUMINOSITY) + { + [currentlySelectedFilter removeTarget:self.glView]; + + GPUImageSolidColorGenerator *colorGenerator = [[GPUImageSolidColorGenerator alloc] init]; + [colorGenerator forceProcessingAtSize:[self.glView sizeInPixels]]; + + [(GPUImageLuminosity *)currentlySelectedFilter setLuminosityProcessingFinishedBlock:^(CGFloat luminosity, CMTime frameTime) { + [colorGenerator setColorRed:luminosity green:luminosity blue:luminosity alpha:1.0]; + }]; + + [colorGenerator addTarget:self.glView]; + } + } #pragma mark - @@ -663,6 +766,10 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)currentlySelectedFilter setDistance:_currentSliderValue]; break; case GPUIMAGE_SEPIA: [(GPUImageSepiaFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; + case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)currentlySelectedFilter setDownsamplingFactor:round(_currentSliderValue)]; break; + case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; + case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)currentlySelectedFilter setThresholdMultiplier:_currentSliderValue]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)currentlySelectedFilter setSharpness:_currentSliderValue]; break; @@ -718,6 +825,12 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_MONOCHROME: tableRowTitle = @"Monochrome"; break; case GPUIMAGE_PIXELLATE: tableRowTitle = @"Pixellate"; break; case GPUIMAGE_GRAYSCALE: tableRowTitle = @"Grayscale"; break; + case GPUIMAGE_HISTOGRAM: tableRowTitle = @"Histogram"; break; + case GPUIMAGE_AVERAGECOLOR: tableRowTitle = @"Average color"; break; + case GPUIMAGE_LUMINOSITY: tableRowTitle = @"Average luminosity"; break; + case GPUIMAGE_THRESHOLD: tableRowTitle = @"Threshold"; break; + case GPUIMAGE_ADAPTIVETHRESHOLD: tableRowTitle = @"Adaptive threshold"; break; + case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: tableRowTitle = @"Average luminance threshold"; break; case GPUIMAGE_SOBELEDGEDETECTION: tableRowTitle = @"Sobel edge detection"; break; case GPUIMAGE_SKETCH: tableRowTitle = @"Sketch"; break; case GPUIMAGE_TOON: tableRowTitle = @"Toon"; break; @@ -740,6 +853,7 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_AMATORKA: tableRowTitle = @"Amatorka (Lookup)"; break; case GPUIMAGE_MISSETIKATE: tableRowTitle = @"Miss Etikate (Lookup)"; break; case GPUIMAGE_SOFTELEGANCE: tableRowTitle = @"Soft elegance (Lookup)"; break; + case GPUIMAGE_COLORINVERT: tableRowTitle = @"Color invert"; break; case GPUIMAGE_GAUSSIAN: tableRowTitle = @"Gaussian blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: tableRowTitle = @"Gaussian selective blur"; break; case GPUIMAGE_GAUSSIAN_POSITION: tableRowTitle = @"Gaussian (centered)"; break; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 879ff93cd..dfa1c3b07 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -41,6 +41,24 @@ BCBF6932173061D200E5792A /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF6930173061D200E5792A /* GPUImage3x3ConvolutionFilter.m */; }; BCBF69351730623200E5792A /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF69331730623200E5792A /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBF69361730623200E5792A /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF69341730623200E5792A /* GPUImageEmbossFilter.m */; }; + BCC0DF4217358315007C485F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF4017358315007C485F /* GPUImageColorInvertFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF4317358315007C485F /* GPUImageColorInvertFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF4117358315007C485F /* GPUImageColorInvertFilter.m */; }; + BCC0DF4817359529007C485F /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF4417359529007C485F /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF4917359529007C485F /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF4517359529007C485F /* GPUImageHistogramFilter.m */; }; + BCC0DF4A17359529007C485F /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF4617359529007C485F /* GPUImageHistogramGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF4B17359529007C485F /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF4717359529007C485F /* GPUImageHistogramGenerator.m */; }; + BCC0DF52173595D3007C485F /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF4C173595D3007C485F /* GPUImageAverageColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF53173595D3007C485F /* GPUImageAverageColor.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF4D173595D3007C485F /* GPUImageAverageColor.m */; }; + BCC0DF54173595D3007C485F /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF4E173595D3007C485F /* GPUImageLuminosity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF55173595D3007C485F /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF4F173595D3007C485F /* GPUImageLuminosity.m */; }; + BCC0DF56173595D3007C485F /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF50173595D3007C485F /* GPUImageSolidColorGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF57173595D3007C485F /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF51173595D3007C485F /* GPUImageSolidColorGenerator.m */; }; + BCC0DF5A173596A8007C485F /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF58173596A8007C485F /* GPUImageAdaptiveThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF5B173596A8007C485F /* GPUImageAdaptiveThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF59173596A8007C485F /* GPUImageAdaptiveThresholdFilter.m */; }; + BCC0DF5E173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF5C173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF5F173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */; }; + BCC0DF6217359F42007C485F /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC0DF6317359F43007C485F /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */; }; BCF40F1217247D68005AE36A /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1017247D68005AE36A /* GPUImageContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF40F1317247D68005AE36A /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F1117247D68005AE36A /* GPUImageContext.m */; }; BCF40F1617247FD8005AE36A /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1417247FD8005AE36A /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -226,6 +244,24 @@ BCBF6930173061D200E5792A /* GPUImage3x3ConvolutionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImage3x3ConvolutionFilter.m; path = Source/GPUImage3x3ConvolutionFilter.m; sourceTree = SOURCE_ROOT; }; BCBF69331730623200E5792A /* GPUImageEmbossFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageEmbossFilter.h; path = Source/GPUImageEmbossFilter.h; sourceTree = SOURCE_ROOT; }; BCBF69341730623200E5792A /* GPUImageEmbossFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageEmbossFilter.m; path = Source/GPUImageEmbossFilter.m; sourceTree = SOURCE_ROOT; }; + BCC0DF4017358315007C485F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; + BCC0DF4117358315007C485F /* GPUImageColorInvertFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorInvertFilter.m; path = Source/GPUImageColorInvertFilter.m; sourceTree = SOURCE_ROOT; }; + BCC0DF4417359529007C485F /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; + BCC0DF4517359529007C485F /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; + BCC0DF4617359529007C485F /* GPUImageHistogramGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramGenerator.h; path = Source/GPUImageHistogramGenerator.h; sourceTree = SOURCE_ROOT; }; + BCC0DF4717359529007C485F /* GPUImageHistogramGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramGenerator.m; path = Source/GPUImageHistogramGenerator.m; sourceTree = SOURCE_ROOT; }; + BCC0DF4C173595D3007C485F /* GPUImageAverageColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAverageColor.h; path = Source/GPUImageAverageColor.h; sourceTree = SOURCE_ROOT; }; + BCC0DF4D173595D3007C485F /* GPUImageAverageColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageColor.m; path = Source/GPUImageAverageColor.m; sourceTree = SOURCE_ROOT; }; + BCC0DF4E173595D3007C485F /* GPUImageLuminosity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminosity.h; path = Source/GPUImageLuminosity.h; sourceTree = SOURCE_ROOT; }; + BCC0DF4F173595D3007C485F /* GPUImageLuminosity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminosity.m; path = Source/GPUImageLuminosity.m; sourceTree = SOURCE_ROOT; }; + BCC0DF50173595D3007C485F /* GPUImageSolidColorGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSolidColorGenerator.h; path = Source/GPUImageSolidColorGenerator.h; sourceTree = SOURCE_ROOT; }; + BCC0DF51173595D3007C485F /* GPUImageSolidColorGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSolidColorGenerator.m; path = Source/GPUImageSolidColorGenerator.m; sourceTree = SOURCE_ROOT; }; + BCC0DF58173596A8007C485F /* GPUImageAdaptiveThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAdaptiveThresholdFilter.h; path = Source/GPUImageAdaptiveThresholdFilter.h; sourceTree = SOURCE_ROOT; }; + BCC0DF59173596A8007C485F /* GPUImageAdaptiveThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAdaptiveThresholdFilter.m; path = Source/GPUImageAdaptiveThresholdFilter.m; sourceTree = SOURCE_ROOT; }; + BCC0DF5C173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAverageLuminanceThresholdFilter.h; path = Source/GPUImageAverageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; + BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageLuminanceThresholdFilter.m; path = Source/GPUImageAverageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; + BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminanceThresholdFilter.h; path = Source/GPUImageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; + BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminanceThresholdFilter.m; path = Source/GPUImageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; BCF40F1017247D68005AE36A /* GPUImageContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageContext.h; path = Source/Mac/GPUImageContext.h; sourceTree = SOURCE_ROOT; }; BCF40F1117247D68005AE36A /* GPUImageContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageContext.m; path = Source/Mac/GPUImageContext.m; sourceTree = SOURCE_ROOT; }; BCF40F1417247FD8005AE36A /* GLProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GLProgram.h; path = Source/GLProgram.h; sourceTree = SOURCE_ROOT; }; @@ -547,6 +583,24 @@ BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */, BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */, BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */, + BCC0DF4017358315007C485F /* GPUImageColorInvertFilter.h */, + BCC0DF4117358315007C485F /* GPUImageColorInvertFilter.m */, + BCC0DF4417359529007C485F /* GPUImageHistogramFilter.h */, + BCC0DF4517359529007C485F /* GPUImageHistogramFilter.m */, + BCC0DF4617359529007C485F /* GPUImageHistogramGenerator.h */, + BCC0DF4717359529007C485F /* GPUImageHistogramGenerator.m */, + BCC0DF4C173595D3007C485F /* GPUImageAverageColor.h */, + BCC0DF4D173595D3007C485F /* GPUImageAverageColor.m */, + BCC0DF4E173595D3007C485F /* GPUImageLuminosity.h */, + BCC0DF4F173595D3007C485F /* GPUImageLuminosity.m */, + BCC0DF50173595D3007C485F /* GPUImageSolidColorGenerator.h */, + BCC0DF51173595D3007C485F /* GPUImageSolidColorGenerator.m */, + BCC0DF58173596A8007C485F /* GPUImageAdaptiveThresholdFilter.h */, + BCC0DF59173596A8007C485F /* GPUImageAdaptiveThresholdFilter.m */, + BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */, + BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */, + BCC0DF5C173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.h */, + BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */, BCF8689B1728861E00912E34 /* GPUImageOpacityFilter.h */, BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */, ); @@ -763,6 +817,15 @@ BC6C553C1730636600EB222D /* GPUImageLaplacianFilter.h in Headers */, BC6C55461730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h in Headers */, BCAE41E41731C3000020F80D /* GPUImageThreeInputFilter.h in Headers */, + BCC0DF4217358315007C485F /* GPUImageColorInvertFilter.h in Headers */, + BCC0DF4817359529007C485F /* GPUImageHistogramFilter.h in Headers */, + BCC0DF4A17359529007C485F /* GPUImageHistogramGenerator.h in Headers */, + BCC0DF52173595D3007C485F /* GPUImageAverageColor.h in Headers */, + BCC0DF54173595D3007C485F /* GPUImageLuminosity.h in Headers */, + BCC0DF56173595D3007C485F /* GPUImageSolidColorGenerator.h in Headers */, + BCC0DF5A173596A8007C485F /* GPUImageAdaptiveThresholdFilter.h in Headers */, + BCC0DF5E173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.h in Headers */, + BCC0DF6217359F42007C485F /* GPUImageLuminanceThresholdFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -913,6 +976,15 @@ BC6C553D1730636600EB222D /* GPUImageLaplacianFilter.m in Sources */, BC6C55471730BDCF00EB222D /* GPUImageLanczosResamplingFilter.m in Sources */, BCAE41E51731C3000020F80D /* GPUImageThreeInputFilter.m in Sources */, + BCC0DF4317358315007C485F /* GPUImageColorInvertFilter.m in Sources */, + BCC0DF4917359529007C485F /* GPUImageHistogramFilter.m in Sources */, + BCC0DF4B17359529007C485F /* GPUImageHistogramGenerator.m in Sources */, + BCC0DF53173595D3007C485F /* GPUImageAverageColor.m in Sources */, + BCC0DF55173595D3007C485F /* GPUImageLuminosity.m in Sources */, + BCC0DF57173595D3007C485F /* GPUImageSolidColorGenerator.m in Sources */, + BCC0DF5B173596A8007C485F /* GPUImageAdaptiveThresholdFilter.m in Sources */, + BCC0DF5F173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m in Sources */, + BCC0DF6317359F43007C485F /* GPUImageLuminanceThresholdFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.m b/framework/Source/GPUImageAdaptiveThresholdFilter.m index 46433ce15..7b49e6647 100755 --- a/framework/Source/GPUImageAdaptiveThresholdFilter.m +++ b/framework/Source/GPUImageAdaptiveThresholdFilter.m @@ -4,6 +4,7 @@ #import "GPUImageGrayscaleFilter.h" #import "GPUImageBoxBlurFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageAdaptiveThresholdFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -19,10 +20,27 @@ void main() highp float thresholdResult = step(blurredInput - 0.05, localLuminance); gl_FragColor = vec4(vec3(thresholdResult), 1.0); -// gl_FragColor = vec4(localLuminance, textureColor.r, 0.0, textureColor.w); -// gl_FragColor = vec4(localLuminance, localLuminance, localLuminance, 1.0); } - ); +); +#else +NSString *const kGPUImageAdaptiveThresholdFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + float blurredInput = texture2D(inputImageTexture, textureCoordinate).r; + float localLuminance = texture2D(inputImageTexture2, textureCoordinate2).r; + float thresholdResult = step(blurredInput - 0.05, localLuminance); + + gl_FragColor = vec4(vec3(thresholdResult), 1.0); + } +); +#endif @interface GPUImageAdaptiveThresholdFilter() { diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index d0ac294d6..750db9fd8 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -5,8 +5,8 @@ attribute vec4 position; attribute vec4 inputTextureCoordinate; - uniform highp float texelWidth; - uniform highp float texelHeight; + uniform float texelWidth; + uniform float texelHeight; varying vec2 upperLeftInputTextureCoordinate; varying vec2 upperRightInputTextureCoordinate; @@ -24,6 +24,7 @@ void main() } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageColorAveragingFragmentShaderString = SHADER_STRING ( precision highp float; @@ -47,7 +48,29 @@ void main() gl_FragColor = 0.25 * (upperLeftColor + upperRightColor + lowerLeftColor + lowerRightColor); } ); - +#else +NSString *const kGPUImageColorAveragingFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 outputTextureCoordinate; + + varying vec2 upperLeftInputTextureCoordinate; + varying vec2 upperRightInputTextureCoordinate; + varying vec2 lowerLeftInputTextureCoordinate; + varying vec2 lowerRightInputTextureCoordinate; + + void main() + { + vec4 upperLeftColor = texture2D(inputImageTexture, upperLeftInputTextureCoordinate); + vec4 upperRightColor = texture2D(inputImageTexture, upperRightInputTextureCoordinate); + vec4 lowerLeftColor = texture2D(inputImageTexture, lowerLeftInputTextureCoordinate); + vec4 lowerRightColor = texture2D(inputImageTexture, lowerRightInputTextureCoordinate); + + gl_FragColor = 0.25 * (upperLeftColor + upperRightColor + lowerLeftColor + lowerRightColor); + } +); +#endif @implementation GPUImageAverageColor @@ -117,7 +140,11 @@ - (void)initializeOutputTextureIfNeeded; // currentStageSize.height = 2.0; // TODO: Rotate the image to account for this case, which causes FBO construction to fail } +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE [stageSizes addObject:[NSValue valueWithCGSize:currentStageSize]]; +#else + [stageSizes addObject:[NSValue valueWithSize:NSSizeFromCGSize(currentStageSize)]]; +#endif GLuint textureForStage; glGenTextures(1, &textureForStage); @@ -186,7 +213,11 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; GLuint currentTexture = [[stageTextures objectAtIndex:currentStage] intValue]; glBindTexture(GL_TEXTURE_2D, currentTexture); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGSize currentFramebufferSize = [[stageSizes objectAtIndex:currentStage] CGSizeValue]; +#else + NSSize currentFramebufferSize = [[stageSizes objectAtIndex:currentStage] sizeValue]; +#endif // NSLog(@"FBO stage size: %f, %f", currentFramebufferSize.width, currentFramebufferSize.height); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFramebufferSize.width, (int)currentFramebufferSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); @@ -236,7 +267,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates GLuint currentFramebuffer = [[stageFramebuffers objectAtIndex:currentStage] intValue]; glBindFramebuffer(GL_FRAMEBUFFER, currentFramebuffer); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGSize currentStageSize = [[stageSizes objectAtIndex:currentStage] CGSizeValue]; +#else + NSSize currentStageSize = [[stageSizes objectAtIndex:currentStage] sizeValue]; +#endif glViewport(0, 0, (int)currentStageSize.width, (int)currentStageSize.height); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -304,7 +339,11 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg - (void)extractAverageColorAtFrameTime:(CMTime)frameTime; { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGSize finalStageSize = [[stageSizes lastObject] CGSizeValue]; +#else + NSSize finalStageSize = [[stageSizes lastObject] sizeValue]; +#endif NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); if (rawImagePixels == NULL) diff --git a/framework/Source/GPUImageColorInvertFilter.m b/framework/Source/GPUImageColorInvertFilter.m index babc95358..0a8798b1a 100755 --- a/framework/Source/GPUImageColorInvertFilter.m +++ b/framework/Source/GPUImageColorInvertFilter.m @@ -1,5 +1,6 @@ #import "GPUImageColorInvertFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageInvertFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -13,6 +14,21 @@ void main() gl_FragColor = vec4((1.0 - textureColor.rgb), textureColor.w); } ); +#else +NSString *const kGPUImageInvertFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = vec4((1.0 - textureColor.rgb), textureColor.w); + } + ); +#endif @implementation GPUImageColorInvertFilter diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index b45fce387..94643c9bc 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -14,7 +14,7 @@ ( attribute vec4 position; - varying lowp vec3 colorFactor; + varying vec3 colorFactor; void main() { @@ -28,7 +28,7 @@ void main() ( attribute vec4 position; - varying lowp vec3 colorFactor; + varying vec3 colorFactor; void main() { @@ -42,7 +42,7 @@ void main() ( attribute vec4 position; - varying lowp vec3 colorFactor; + varying vec3 colorFactor; void main() { @@ -56,9 +56,9 @@ void main() ( attribute vec4 position; - varying lowp vec3 colorFactor; + varying vec3 colorFactor; - const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); + const vec3 W = vec3(0.2125, 0.7154, 0.0721); void main() { @@ -70,6 +70,7 @@ void main() } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHistogramAccumulationFragmentShaderString = SHADER_STRING ( const lowp float scalingFactor = 1.0 / 256.0; @@ -81,6 +82,19 @@ void main() gl_FragColor = vec4(colorFactor * scalingFactor , 1.0); } ); +#else +NSString *const kGPUImageHistogramAccumulationFragmentShaderString = SHADER_STRING +( + const float scalingFactor = 1.0 / 256.0; + + varying vec3 colorFactor; + + void main() + { + gl_FragColor = vec4(colorFactor * scalingFactor , 1.0); + } +); +#endif @implementation GPUImageHistogramFilter diff --git a/framework/Source/GPUImageHistogramGenerator.m b/framework/Source/GPUImageHistogramGenerator.m index ff22be913..703795df4 100755 --- a/framework/Source/GPUImageHistogramGenerator.m +++ b/framework/Source/GPUImageHistogramGenerator.m @@ -16,6 +16,7 @@ void main() } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHistogramGeneratorFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -31,7 +32,23 @@ void main() gl_FragColor = mix(backgroundColor, heightTest, heightTest.r + heightTest.g + heightTest.b); } ); - +#else +NSString *const kGPUImageHistogramGeneratorFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying float height; + + uniform sampler2D inputImageTexture; + uniform vec4 backgroundColor; + + void main() + { + vec3 colorChannels = texture2D(inputImageTexture, textureCoordinate).rgb; + vec4 heightTest = vec4(step(height, colorChannels), 1.0); + gl_FragColor = mix(backgroundColor, heightTest, heightTest.r + heightTest.g + heightTest.b); + } +); +#endif @implementation GPUImageHistogramGenerator diff --git a/framework/Source/GPUImageLuminanceThresholdFilter.m b/framework/Source/GPUImageLuminanceThresholdFilter.m index 4f7509510..368b8fbec 100755 --- a/framework/Source/GPUImageLuminanceThresholdFilter.m +++ b/framework/Source/GPUImageLuminanceThresholdFilter.m @@ -1,5 +1,6 @@ #import "GPUImageLuminanceThresholdFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLuminanceThresholdFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -18,6 +19,26 @@ void main() gl_FragColor = vec4(vec3(thresholdResult), textureColor.w); } ); +#else +NSString *const kGPUImageLuminanceThresholdFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float threshold; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, W); + float thresholdResult = step(threshold, luminance); + + gl_FragColor = vec4(vec3(thresholdResult), textureColor.w); + } +); +#endif @implementation GPUImageLuminanceThresholdFilter diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index fdcb4f22c..5058954f0 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -1,5 +1,6 @@ #import "GPUImageLuminosity.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageInitialLuminosityFragmentShaderString = SHADER_STRING ( precision highp float; @@ -51,6 +52,55 @@ void main() gl_FragColor = vec4(luminosity, luminosity, luminosity, 1.0); } ); +#else +NSString *const kGPUImageInitialLuminosityFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 outputTextureCoordinate; + + varying vec2 upperLeftInputTextureCoordinate; + varying vec2 upperRightInputTextureCoordinate; + varying vec2 lowerLeftInputTextureCoordinate; + varying vec2 lowerRightInputTextureCoordinate; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + float upperLeftLuminance = dot(texture2D(inputImageTexture, upperLeftInputTextureCoordinate).rgb, W); + float upperRightLuminance = dot(texture2D(inputImageTexture, upperRightInputTextureCoordinate).rgb, W); + float lowerLeftLuminance = dot(texture2D(inputImageTexture, lowerLeftInputTextureCoordinate).rgb, W); + float lowerRightLuminance = dot(texture2D(inputImageTexture, lowerRightInputTextureCoordinate).rgb, W); + + float luminosity = 0.25 * (upperLeftLuminance + upperRightLuminance + lowerLeftLuminance + lowerRightLuminance); + gl_FragColor = vec4(luminosity, luminosity, luminosity, 1.0); + } +); + +NSString *const kGPUImageLuminosityFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 outputTextureCoordinate; + + varying vec2 upperLeftInputTextureCoordinate; + varying vec2 upperRightInputTextureCoordinate; + varying vec2 lowerLeftInputTextureCoordinate; + varying vec2 lowerRightInputTextureCoordinate; + + void main() + { + float upperLeftLuminance = texture2D(inputImageTexture, upperLeftInputTextureCoordinate).r; + float upperRightLuminance = texture2D(inputImageTexture, upperRightInputTextureCoordinate).r; + float lowerLeftLuminance = texture2D(inputImageTexture, lowerLeftInputTextureCoordinate).r; + float lowerRightLuminance = texture2D(inputImageTexture, lowerRightInputTextureCoordinate).r; + + float luminosity = 0.25 * (upperLeftLuminance + upperRightLuminance + lowerLeftLuminance + lowerRightLuminance); + gl_FragColor = vec4(luminosity, luminosity, luminosity, 1.0); + } +); +#endif @implementation GPUImageLuminosity @@ -139,7 +189,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates GLuint currentFramebuffer = [[stageFramebuffers objectAtIndex:0] intValue]; glBindFramebuffer(GL_FRAMEBUFFER, currentFramebuffer); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGSize currentStageSize = [[stageSizes objectAtIndex:0] CGSizeValue]; +#else + NSSize currentStageSize = [[stageSizes objectAtIndex:0] sizeValue]; +#endif glViewport(0, 0, (int)currentStageSize.width, (int)currentStageSize.height); GLuint currentTexture = sourceTexture; @@ -170,7 +224,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates currentFramebuffer = [[stageFramebuffers objectAtIndex:currentStage] intValue]; glBindFramebuffer(GL_FRAMEBUFFER, currentFramebuffer); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE currentStageSize = [[stageSizes objectAtIndex:currentStage] CGSizeValue]; +#else + currentStageSize = [[stageSizes objectAtIndex:currentStage] sizeValue]; +#endif glViewport(0, 0, (int)currentStageSize.width, (int)currentStageSize.height); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -231,7 +289,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates - (void)extractLuminosityAtFrameTime:(CMTime)frameTime; { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGSize finalStageSize = [[stageSizes lastObject] CGSizeValue]; +#else + NSSize finalStageSize = [[stageSizes lastObject] sizeValue]; +#endif NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); if (rawImagePixels == NULL) diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m index 7d4458a3d..9363c72e4 100644 --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -1,5 +1,6 @@ #import "GPUImageSolidColorGenerator.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUSolidColorFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -14,6 +15,20 @@ void main() gl_FragColor = color; } ); +#else +NSString *const kGPUSolidColorFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform vec4 color; + + void main() + { + gl_FragColor = color; + } +); +#endif @implementation GPUImageSolidColorGenerator diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index c7dc39529..5f908ab20 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -87,6 +87,15 @@ #import #import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import // Outputs #import diff --git a/framework/Source/Mac/GPUImageAVCamera.h b/framework/Source/Mac/GPUImageAVCamera.h index 998179b04..54c1a2f7b 100755 --- a/framework/Source/Mac/GPUImageAVCamera.h +++ b/framework/Source/Mac/GPUImageAVCamera.h @@ -73,6 +73,8 @@ @param sessionPreset Session preset to use @param cameraPosition Camera to capture from */ +- (id)initWithDeviceUniqueID:(NSString *)deviceUniqueID; +- (id)initWithSessionPreset:(NSString *)sessionPreset deviceUniqueID:(NSString *)deviceUniqueID; - (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDevice *)cameraDevice; /** Tear down the capture session @@ -125,4 +127,6 @@ */ - (CGFloat)averageFrameDurationDuringCapture; +- (void)printSupportedPixelFormats; + @end diff --git a/framework/Source/Mac/GPUImageAVCamera.m b/framework/Source/Mac/GPUImageAVCamera.m index 5c2598280..75f8df21d 100644 --- a/framework/Source/Mac/GPUImageAVCamera.m +++ b/framework/Source/Mac/GPUImageAVCamera.m @@ -120,6 +120,26 @@ - (id)init; return self; } +- (id)initWithDeviceUniqueID:(NSString *)deviceUniqueID; +{ + if (!(self = [self initWithSessionPreset:AVCaptureSessionPreset640x480 deviceUniqueID:deviceUniqueID])) + { + return nil; + } + + return self; +} + +- (id)initWithSessionPreset:(NSString *)sessionPreset deviceUniqueID:(NSString *)deviceUniqueID; +{ + if (!(self = [self initWithSessionPreset:sessionPreset cameraDevice:[AVCaptureDevice deviceWithUniqueID:deviceUniqueID]])) + { + return nil; + } + + return self; +} + - (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDevice *)cameraDevice; { if (!(self = [super init])) @@ -188,16 +208,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDev if (cameraDevice == nil) { - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; - for (AVCaptureDevice *device in devices) - { - NSLog(@"Device: %@, %ld", device, [device position]); - - if (![device isSuspended]) - { - _inputCamera = device; - } - } + _inputCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; } else { @@ -225,13 +236,16 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDev videoOutput = [[AVCaptureVideoDataOutput alloc] init]; [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; +// NSLog(@"Camera: %@", _inputCamera); +// [self printSupportedPixelFormats]; + // if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) { BOOL supportsFullYUVRange = NO; NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; for (NSNumber *currentPixelFormat in supportedPixelFormats) - { + { if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) { supportsFullYUVRange = YES; @@ -249,7 +263,9 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDev } else { - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + // Despite returning a longer list of supported pixel formats, only RGB, RGBA, BGRA, and the YUV 4:2:2 variants seem to return cleanly +// [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_422YpCbCr8_yuvs] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; } [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; @@ -532,8 +548,6 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; GLsizei bufferWidth = (GLsizei)CVPixelBufferGetWidth(cameraFrame); GLsizei bufferHeight = (GLsizei)CVPixelBufferGetHeight(cameraFrame); - NSLog(@"Buffer width: %d, height: %d", bufferWidth, bufferHeight); - CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); [GPUImageContext useImageProcessingContext]; @@ -545,9 +559,9 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); // Using BGRA extension to pull in video frame data directly - // The use of bytesPerRow / 4 accounts for a display glitch present in preview video frames when using the photo preset on the camera - GLsizei bytesPerRow = (GLsizei)CVPixelBufferGetBytesPerRow(cameraFrame); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bytesPerRow / 3, bufferHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, CVPixelBufferGetBaseAddress(cameraFrame)); +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); for (id currentTarget in targets) { @@ -792,4 +806,60 @@ - (void)setHorizontallyMirrorRearFacingCamera:(BOOL)newValue [self updateOrientationSendToTargets]; } +- (void)printSupportedPixelFormats; +{ + NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; + for (NSNumber *currentPixelFormat in supportedPixelFormats) + { + NSString *pixelFormatName = nil; + + switch([currentPixelFormat intValue]) + { + case kCVPixelFormatType_1Monochrome: pixelFormatName = @"kCVPixelFormatType_1Monochrome"; break; + case kCVPixelFormatType_2Indexed: pixelFormatName = @"kCVPixelFormatType_2Indexed"; break; + case kCVPixelFormatType_4Indexed: pixelFormatName = @"kCVPixelFormatType_4Indexed"; break; + case kCVPixelFormatType_8Indexed: pixelFormatName = @"kCVPixelFormatType_8Indexed"; break; + case kCVPixelFormatType_1IndexedGray_WhiteIsZero: pixelFormatName = @"kCVPixelFormatType_1IndexedGray_WhiteIsZero"; break; + case kCVPixelFormatType_2IndexedGray_WhiteIsZero: pixelFormatName = @"kCVPixelFormatType_2IndexedGray_WhiteIsZero"; break; + case kCVPixelFormatType_4IndexedGray_WhiteIsZero: pixelFormatName = @"kCVPixelFormatType_4IndexedGray_WhiteIsZero"; break; + case kCVPixelFormatType_8IndexedGray_WhiteIsZero: pixelFormatName = @"kCVPixelFormatType_8IndexedGray_WhiteIsZero"; break; + case kCVPixelFormatType_16BE555: pixelFormatName = @"kCVPixelFormatType_16BE555"; break; + case kCVPixelFormatType_16LE555: pixelFormatName = @"kCVPixelFormatType_16LE555"; break; + case kCVPixelFormatType_16LE5551: pixelFormatName = @"kCVPixelFormatType_16LE5551"; break; + case kCVPixelFormatType_16BE565: pixelFormatName = @"kCVPixelFormatType_16BE565"; break; + case kCVPixelFormatType_16LE565: pixelFormatName = @"kCVPixelFormatType_16LE565"; break; + case kCVPixelFormatType_24RGB: pixelFormatName = @"kCVPixelFormatType_24RGB"; break; + case kCVPixelFormatType_24BGR: pixelFormatName = @"kCVPixelFormatType_24BGR"; break; + case kCVPixelFormatType_32ARGB: pixelFormatName = @"kCVPixelFormatType_32ARGB"; break; + case kCVPixelFormatType_32BGRA: pixelFormatName = @"kCVPixelFormatType_32BGRA"; break; + case kCVPixelFormatType_32ABGR: pixelFormatName = @"kCVPixelFormatType_32ABGR"; break; + case kCVPixelFormatType_32RGBA: pixelFormatName = @"kCVPixelFormatType_32RGBA"; break; + case kCVPixelFormatType_64ARGB: pixelFormatName = @"kCVPixelFormatType_64ARGB"; break; + case kCVPixelFormatType_48RGB: pixelFormatName = @"kCVPixelFormatType_48RGB"; break; + case kCVPixelFormatType_32AlphaGray: pixelFormatName = @"kCVPixelFormatType_32AlphaGray"; break; + case kCVPixelFormatType_16Gray: pixelFormatName = @"kCVPixelFormatType_16Gray"; break; + case kCVPixelFormatType_30RGB: pixelFormatName = @"kCVPixelFormatType_30RGB"; break; + case kCVPixelFormatType_422YpCbCr8: pixelFormatName = @"kCVPixelFormatType_422YpCbCr8"; break; + case kCVPixelFormatType_4444YpCbCrA8: pixelFormatName = @"kCVPixelFormatType_4444YpCbCrA8"; break; + case kCVPixelFormatType_4444YpCbCrA8R: pixelFormatName = @"kCVPixelFormatType_4444YpCbCrA8R"; break; + case kCVPixelFormatType_4444AYpCbCr8: pixelFormatName = @"kCVPixelFormatType_4444AYpCbCr8"; break; + case kCVPixelFormatType_4444AYpCbCr16: pixelFormatName = @"kCVPixelFormatType_4444AYpCbCr16"; break; + case kCVPixelFormatType_444YpCbCr8: pixelFormatName = @"kCVPixelFormatType_444YpCbCr8"; break; + case kCVPixelFormatType_422YpCbCr16: pixelFormatName = @"kCVPixelFormatType_422YpCbCr16"; break; + case kCVPixelFormatType_422YpCbCr10: pixelFormatName = @"kCVPixelFormatType_422YpCbCr10"; break; + case kCVPixelFormatType_444YpCbCr10: pixelFormatName = @"kCVPixelFormatType_444YpCbCr10"; break; + case kCVPixelFormatType_420YpCbCr8Planar: pixelFormatName = @"kCVPixelFormatType_420YpCbCr8Planar"; break; + case kCVPixelFormatType_420YpCbCr8PlanarFullRange: pixelFormatName = @"kCVPixelFormatType_420YpCbCr8PlanarFullRange"; break; + case kCVPixelFormatType_422YpCbCr_4A_8BiPlanar: pixelFormatName = @"kCVPixelFormatType_422YpCbCr_4A_8BiPlanar"; break; + case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: pixelFormatName = @"kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange"; break; + case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: pixelFormatName = @"kCVPixelFormatType_420YpCbCr8BiPlanarFullRange"; break; + case kCVPixelFormatType_422YpCbCr8_yuvs: pixelFormatName = @"kCVPixelFormatType_422YpCbCr8_yuvs"; break; + case kCVPixelFormatType_422YpCbCr8FullRange: pixelFormatName = @"kCVPixelFormatType_422YpCbCr8FullRange"; break; + case kCVPixelFormatType_OneComponent8: pixelFormatName = @"kCVPixelFormatType_OneComponent8"; break; + case kCVPixelFormatType_TwoComponent8: pixelFormatName = @"kCVPixelFormatType_TwoComponent8"; break; + } + NSLog(@"Supported pixel format: %@", pixelFormatName); + } +} + @end From 15ca9cb31213952fe6c66bbadee39aa35095cbc8 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 4 May 2013 22:58:34 -0500 Subject: [PATCH 370/695] Ported some more filters to the Mac, including some effect and the remaining edge detectors. --- .../SLSFilterShowcaseWindowController.h | 9 ++ .../SLSFilterShowcaseWindowController.m | 91 ++++++++++++++- .../GPUImageMac.xcodeproj/project.pbxproj | 104 ++++++++++++++++++ framework/Source/GPUImageCrosshatchFilter.m | 52 ++++++++- ...geDirectionalNonMaximumSuppressionFilter.m | 31 +++++- framework/Source/GPUImageHalftoneFilter.m | 34 +++++- .../Source/GPUImagePixellatePositionFilter.m | 31 ++++++ .../Source/GPUImagePolarPixellateFilter.m | 39 ++++++- framework/Source/GPUImagePolkaDotFilter.m | 26 +++++ .../GPUImagePrewittEdgeDetectionFilter.m | 37 +++++++ .../GPUImageSingleComponentFastBlurFilter.m | 26 +++++ .../GPUImageThresholdEdgeDetectionFilter.m | 43 +++++++- .../Source/GPUImageWeakPixelInclusionFilter.m | 38 +++++++ framework/Source/GPUImageXYDerivativeFilter.m | 39 +++++++ ...imageDirectionalSobelEdgeDetectionFilter.m | 42 +++++++ framework/Source/Mac/GPUImage.h | 13 +++ 16 files changed, 649 insertions(+), 6 deletions(-) diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index fb27b033e..faf632e6c 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -35,7 +35,16 @@ typedef enum { GPUIMAGE_ADAPTIVETHRESHOLD, GPUIMAGE_AVERAGELUMINANCETHRESHOLD, GPUIMAGE_PIXELLATE, + GPUIMAGE_POLARPIXELLATE, + GPUIMAGE_PIXELLATE_POSITION, + GPUIMAGE_POLKADOT, + GPUIMAGE_HALFTONE, + GPUIMAGE_CROSSHATCH, GPUIMAGE_SOBELEDGEDETECTION, + GPUIMAGE_PREWITTEDGEDETECTION, + GPUIMAGE_CANNYEDGEDETECTION, + GPUIMAGE_THRESHOLDEDGEDETECTION, + GPUIMAGE_XYGRADIENT, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_CONVOLUTION, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 657fd4668..6584792aa 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -332,11 +332,84 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 0.05; self.enableSlider = YES; }; break; + case GPUIMAGE_POLARPIXELLATE: + { + currentlySelectedFilter = [[GPUImagePolarPixellateFilter alloc] init]; + + self.minimumSliderValue = -0.1; + self.maximumSliderValue = 0.1; + self.currentSliderValue = 0.05; + self.enableSlider = YES; + }; break; + case GPUIMAGE_PIXELLATE_POSITION: + { + currentlySelectedFilter = [[GPUImagePixellatePositionFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 0.5; + self.currentSliderValue = 0.25; + self.enableSlider = YES; + }; break; + case GPUIMAGE_POLKADOT: + { + currentlySelectedFilter = [[GPUImagePolkaDotFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 0.3; + self.currentSliderValue = 0.05; + self.enableSlider = YES; + }; break; + case GPUIMAGE_HALFTONE: + { + currentlySelectedFilter = [[GPUImageHalftoneFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 0.05; + self.currentSliderValue = 0.01; + self.enableSlider = YES; + }; break; + case GPUIMAGE_CROSSHATCH: + { + currentlySelectedFilter = [[GPUImageCrosshatchFilter alloc] init]; + + self.minimumSliderValue = 0.01; + self.maximumSliderValue = 0.06; + self.currentSliderValue = 0.03; + self.enableSlider = YES; + }; break; case GPUIMAGE_SOBELEDGEDETECTION: { currentlySelectedFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; self.enableSlider = NO; }; break; + case GPUIMAGE_PREWITTEDGEDETECTION: + { + currentlySelectedFilter = [[GPUImagePrewittEdgeDetectionFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_CANNYEDGEDETECTION: + { + currentlySelectedFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_THRESHOLDEDGEDETECTION: + { + currentlySelectedFilter = [[GPUImageThresholdEdgeDetectionFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_XYGRADIENT: + { + currentlySelectedFilter = [[GPUImageXYDerivativeFilter alloc] init]; + self.enableSlider = NO; + }; break; case GPUIMAGE_SKETCH: { currentlySelectedFilter = [[GPUImageSketchFilter alloc] init]; @@ -766,10 +839,17 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)currentlySelectedFilter setDistance:_currentSliderValue]; break; case GPUIMAGE_SEPIA: [(GPUImageSepiaFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_PIXELLATE: [(GPUImagePixellateFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; + case GPUIMAGE_POLARPIXELLATE: [(GPUImagePolarPixellateFilter *)currentlySelectedFilter setPixelSize:CGSizeMake(_currentSliderValue, _currentSliderValue)]; break; + case GPUIMAGE_PIXELLATE_POSITION: [(GPUImagePixellatePositionFilter *)currentlySelectedFilter setRadius:_currentSliderValue]; break; + case GPUIMAGE_POLKADOT: [(GPUImagePolkaDotFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; + case GPUIMAGE_HALFTONE: [(GPUImageHalftoneFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; + case GPUIMAGE_CROSSHATCH: [(GPUImageCrosshatchFilter *)currentlySelectedFilter setCrossHatchSpacing:_currentSliderValue]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)currentlySelectedFilter setDownsamplingFactor:round(_currentSliderValue)]; break; case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)currentlySelectedFilter setThresholdMultiplier:_currentSliderValue]; break; + case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_THRESHOLDEDGEDETECTION: [(GPUImageThresholdEdgeDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)currentlySelectedFilter setSharpness:_currentSliderValue]; break; @@ -823,7 +903,6 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_HUE: tableRowTitle = @"Hue"; break; case GPUIMAGE_WHITEBALANCE: tableRowTitle = @"White balance"; break; case GPUIMAGE_MONOCHROME: tableRowTitle = @"Monochrome"; break; - case GPUIMAGE_PIXELLATE: tableRowTitle = @"Pixellate"; break; case GPUIMAGE_GRAYSCALE: tableRowTitle = @"Grayscale"; break; case GPUIMAGE_HISTOGRAM: tableRowTitle = @"Histogram"; break; case GPUIMAGE_AVERAGECOLOR: tableRowTitle = @"Average color"; break; @@ -831,7 +910,17 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_THRESHOLD: tableRowTitle = @"Threshold"; break; case GPUIMAGE_ADAPTIVETHRESHOLD: tableRowTitle = @"Adaptive threshold"; break; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: tableRowTitle = @"Average luminance threshold"; break; + case GPUIMAGE_PIXELLATE: tableRowTitle = @"Pixellate"; break; + case GPUIMAGE_POLARPIXELLATE: tableRowTitle = @"Polar pixellation"; break; + case GPUIMAGE_PIXELLATE_POSITION: tableRowTitle = @"Pixellate (position)"; break; + case GPUIMAGE_POLKADOT: tableRowTitle = @"Polka dot"; break; + case GPUIMAGE_HALFTONE: tableRowTitle = @"Halftone"; break; + case GPUIMAGE_CROSSHATCH: tableRowTitle = @"Crosshatch"; break; case GPUIMAGE_SOBELEDGEDETECTION: tableRowTitle = @"Sobel edge detection"; break; + case GPUIMAGE_PREWITTEDGEDETECTION: tableRowTitle = @"Prewitt edge detection"; break; + case GPUIMAGE_CANNYEDGEDETECTION: tableRowTitle = @"Canny edge detection"; break; + case GPUIMAGE_THRESHOLDEDGEDETECTION: tableRowTitle = @"Threshold edge detection"; break; + case GPUIMAGE_XYGRADIENT: tableRowTitle = @"X-Y gradient"; break; case GPUIMAGE_SKETCH: tableRowTitle = @"Sketch"; break; case GPUIMAGE_TOON: tableRowTitle = @"Toon"; break; case GPUIMAGE_CONVOLUTION: tableRowTitle = @"3x3 convolution"; break; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index dfa1c3b07..3a302f8cb 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -59,6 +59,32 @@ BCC0DF5F173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */; }; BCC0DF6217359F42007C485F /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC0DF6317359F43007C485F /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */; }; + BCE817A81735FDC70071D084 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817A01735FDC60071D084 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817A91735FDC70071D084 /* GPUImageHalftoneFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817A11735FDC60071D084 /* GPUImageHalftoneFilter.m */; }; + BCE817AA1735FDC70071D084 /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817A21735FDC60071D084 /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817AB1735FDC70071D084 /* GPUImagePixellatePositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817A31735FDC60071D084 /* GPUImagePixellatePositionFilter.m */; }; + BCE817AC1735FDC70071D084 /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817A41735FDC70071D084 /* GPUImagePolarPixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817AD1735FDC70071D084 /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817A51735FDC70071D084 /* GPUImagePolarPixellateFilter.m */; }; + BCE817AE1735FDC70071D084 /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817A61735FDC70071D084 /* GPUImagePolkaDotFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817AF1735FDC70071D084 /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817A71735FDC70071D084 /* GPUImagePolkaDotFilter.m */; }; + BCE817B21735FE150071D084 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817B01735FE150071D084 /* GPUImageCrosshatchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817B31735FE150071D084 /* GPUImageCrosshatchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817B11735FE150071D084 /* GPUImageCrosshatchFilter.m */; }; + BCE817BA173608690071D084 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817B4173608690071D084 /* GPUImageCannyEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817BB173608690071D084 /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817B5173608690071D084 /* GPUImageCannyEdgeDetectionFilter.m */; }; + BCE817BC173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817B6173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817BD173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817B7173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.m */; }; + BCE817BE173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817B8173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817BF173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817B9173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m */; }; + BCE817C21736092A0071D084 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817C01736092A0071D084 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817C31736092A0071D084 /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817C11736092A0071D084 /* GPUImageXYDerivativeFilter.m */; }; + BCE817C617360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817C417360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817C717360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817C517360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m */; }; + BCE817CC17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817C817360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817CD17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817C917360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; + BCE817CE17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817CA17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817CF17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817CB17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */; }; + BCE817D217360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817D017360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE817D317360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817D117360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m */; }; BCF40F1217247D68005AE36A /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1017247D68005AE36A /* GPUImageContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF40F1317247D68005AE36A /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF40F1117247D68005AE36A /* GPUImageContext.m */; }; BCF40F1617247FD8005AE36A /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF40F1417247FD8005AE36A /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -262,6 +288,32 @@ BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageLuminanceThresholdFilter.m; path = Source/GPUImageAverageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminanceThresholdFilter.h; path = Source/GPUImageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminanceThresholdFilter.m; path = Source/GPUImageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817A01735FDC60071D084 /* GPUImageHalftoneFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHalftoneFilter.h; path = Source/GPUImageHalftoneFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817A11735FDC60071D084 /* GPUImageHalftoneFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHalftoneFilter.m; path = Source/GPUImageHalftoneFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817A21735FDC60071D084 /* GPUImagePixellatePositionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellatePositionFilter.h; path = Source/GPUImagePixellatePositionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817A31735FDC60071D084 /* GPUImagePixellatePositionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePixellatePositionFilter.m; path = Source/GPUImagePixellatePositionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817A41735FDC70071D084 /* GPUImagePolarPixellateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePolarPixellateFilter.h; path = Source/GPUImagePolarPixellateFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817A51735FDC70071D084 /* GPUImagePolarPixellateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePolarPixellateFilter.m; path = Source/GPUImagePolarPixellateFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817A61735FDC70071D084 /* GPUImagePolkaDotFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePolkaDotFilter.h; path = Source/GPUImagePolkaDotFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817A71735FDC70071D084 /* GPUImagePolkaDotFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePolkaDotFilter.m; path = Source/GPUImagePolkaDotFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817B01735FE150071D084 /* GPUImageCrosshatchFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCrosshatchFilter.h; path = Source/GPUImageCrosshatchFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817B11735FE150071D084 /* GPUImageCrosshatchFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCrosshatchFilter.m; path = Source/GPUImageCrosshatchFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817B4173608690071D084 /* GPUImageCannyEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCannyEdgeDetectionFilter.h; path = Source/GPUImageCannyEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817B5173608690071D084 /* GPUImageCannyEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCannyEdgeDetectionFilter.m; path = Source/GPUImageCannyEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817B6173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePrewittEdgeDetectionFilter.h; path = Source/GPUImagePrewittEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817B7173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePrewittEdgeDetectionFilter.m; path = Source/GPUImagePrewittEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817B8173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdEdgeDetectionFilter.h; path = Source/GPUImageThresholdEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817B9173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetectionFilter.m; path = Source/GPUImageThresholdEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817C01736092A0071D084 /* GPUImageXYDerivativeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageXYDerivativeFilter.h; path = Source/GPUImageXYDerivativeFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817C11736092A0071D084 /* GPUImageXYDerivativeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageXYDerivativeFilter.m; path = Source/GPUImageXYDerivativeFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817C417360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSingleComponentFastBlurFilter.h; path = Source/GPUImageSingleComponentFastBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817C517360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSingleComponentFastBlurFilter.m; path = Source/GPUImageSingleComponentFastBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817C817360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDirectionalNonMaximumSuppressionFilter.h; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817C917360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDirectionalNonMaximumSuppressionFilter.m; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817CA17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUimageDirectionalSobelEdgeDetectionFilter.h; path = Source/GPUimageDirectionalSobelEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817CB17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUimageDirectionalSobelEdgeDetectionFilter.m; path = Source/GPUimageDirectionalSobelEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE817D017360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageWeakPixelInclusionFilter.h; path = Source/GPUImageWeakPixelInclusionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE817D117360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageWeakPixelInclusionFilter.m; path = Source/GPUImageWeakPixelInclusionFilter.m; sourceTree = SOURCE_ROOT; }; BCF40F1017247D68005AE36A /* GPUImageContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageContext.h; path = Source/Mac/GPUImageContext.h; sourceTree = SOURCE_ROOT; }; BCF40F1117247D68005AE36A /* GPUImageContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageContext.m; path = Source/Mac/GPUImageContext.m; sourceTree = SOURCE_ROOT; }; BCF40F1417247FD8005AE36A /* GLProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GLProgram.h; path = Source/GLProgram.h; sourceTree = SOURCE_ROOT; }; @@ -601,6 +653,16 @@ BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */, BCC0DF5C173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.h */, BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */, + BCE817A01735FDC60071D084 /* GPUImageHalftoneFilter.h */, + BCE817A11735FDC60071D084 /* GPUImageHalftoneFilter.m */, + BCE817A21735FDC60071D084 /* GPUImagePixellatePositionFilter.h */, + BCE817A31735FDC60071D084 /* GPUImagePixellatePositionFilter.m */, + BCE817A41735FDC70071D084 /* GPUImagePolarPixellateFilter.h */, + BCE817A51735FDC70071D084 /* GPUImagePolarPixellateFilter.m */, + BCE817A61735FDC70071D084 /* GPUImagePolkaDotFilter.h */, + BCE817A71735FDC70071D084 /* GPUImagePolkaDotFilter.m */, + BCE817B01735FE150071D084 /* GPUImageCrosshatchFilter.h */, + BCE817B11735FE150071D084 /* GPUImageCrosshatchFilter.m */, BCF8689B1728861E00912E34 /* GPUImageOpacityFilter.h */, BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */, ); @@ -637,6 +699,22 @@ BC6C553B1730636600EB222D /* GPUImageLaplacianFilter.m */, BCF867D217278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.h */, BCF867D317278A5600912E34 /* GPUImageSobelEdgeDetectionFilter.m */, + BCE817B6173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.h */, + BCE817B7173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.m */, + BCE817B4173608690071D084 /* GPUImageCannyEdgeDetectionFilter.h */, + BCE817B5173608690071D084 /* GPUImageCannyEdgeDetectionFilter.m */, + BCE817C417360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h */, + BCE817C517360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m */, + BCE817D017360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.h */, + BCE817D117360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m */, + BCE817C817360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */, + BCE817C917360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */, + BCE817CA17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */, + BCE817CB17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */, + BCE817B8173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.h */, + BCE817B9173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m */, + BCE817C01736092A0071D084 /* GPUImageXYDerivativeFilter.h */, + BCE817C11736092A0071D084 /* GPUImageXYDerivativeFilter.m */, BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */, BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */, BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */, @@ -826,6 +904,19 @@ BCC0DF5A173596A8007C485F /* GPUImageAdaptiveThresholdFilter.h in Headers */, BCC0DF5E173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.h in Headers */, BCC0DF6217359F42007C485F /* GPUImageLuminanceThresholdFilter.h in Headers */, + BCE817A81735FDC70071D084 /* GPUImageHalftoneFilter.h in Headers */, + BCE817AA1735FDC70071D084 /* GPUImagePixellatePositionFilter.h in Headers */, + BCE817AC1735FDC70071D084 /* GPUImagePolarPixellateFilter.h in Headers */, + BCE817AE1735FDC70071D084 /* GPUImagePolkaDotFilter.h in Headers */, + BCE817B21735FE150071D084 /* GPUImageCrosshatchFilter.h in Headers */, + BCE817BA173608690071D084 /* GPUImageCannyEdgeDetectionFilter.h in Headers */, + BCE817BC173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */, + BCE817BE173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */, + BCE817C21736092A0071D084 /* GPUImageXYDerivativeFilter.h in Headers */, + BCE817C617360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h in Headers */, + BCE817CC17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */, + BCE817CE17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */, + BCE817D217360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -985,6 +1076,19 @@ BCC0DF5B173596A8007C485F /* GPUImageAdaptiveThresholdFilter.m in Sources */, BCC0DF5F173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m in Sources */, BCC0DF6317359F43007C485F /* GPUImageLuminanceThresholdFilter.m in Sources */, + BCE817A91735FDC70071D084 /* GPUImageHalftoneFilter.m in Sources */, + BCE817AB1735FDC70071D084 /* GPUImagePixellatePositionFilter.m in Sources */, + BCE817AD1735FDC70071D084 /* GPUImagePolarPixellateFilter.m in Sources */, + BCE817AF1735FDC70071D084 /* GPUImagePolkaDotFilter.m in Sources */, + BCE817B31735FE150071D084 /* GPUImageCrosshatchFilter.m in Sources */, + BCE817BB173608690071D084 /* GPUImageCannyEdgeDetectionFilter.m in Sources */, + BCE817BD173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */, + BCE817BF173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */, + BCE817C31736092A0071D084 /* GPUImageXYDerivativeFilter.m in Sources */, + BCE817C717360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m in Sources */, + BCE817CD17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */, + BCE817CF17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */, + BCE817D317360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageCrosshatchFilter.m b/framework/Source/GPUImageCrosshatchFilter.m index 30fad5200..51dbd5928 100755 --- a/framework/Source/GPUImageCrosshatchFilter.m +++ b/framework/Source/GPUImageCrosshatchFilter.m @@ -2,6 +2,7 @@ // Shader code based on http://machinesdontcare.wordpress.com/ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageCrosshatchFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -50,7 +51,56 @@ void main() gl_FragColor = colorToDisplay; } ); - +#else +NSString *const kGPUImageCrosshatchFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float crossHatchSpacing; + uniform float lineWidth; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + float luminance = dot(texture2D(inputImageTexture, textureCoordinate).rgb, W); + + vec4 colorToDisplay = vec4(1.0, 1.0, 1.0, 1.0); + if (luminance < 1.00) + { + if (mod(textureCoordinate.x + textureCoordinate.y, crossHatchSpacing) <= lineWidth) + { + colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0); + } + } + if (luminance < 0.75) + { + if (mod(textureCoordinate.x - textureCoordinate.y, crossHatchSpacing) <= lineWidth) + { + colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0); + } + } + if (luminance < 0.50) + { + if (mod(textureCoordinate.x + textureCoordinate.y - (crossHatchSpacing / 2.0), crossHatchSpacing) <= lineWidth) + { + colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0); + } + } + if (luminance < 0.3) + { + if (mod(textureCoordinate.x - textureCoordinate.y - (crossHatchSpacing / 2.0), crossHatchSpacing) <= lineWidth) + { + colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0); + } + } + + gl_FragColor = colorToDisplay; + } +); +#endif @implementation GPUImageCrosshatchFilter diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m index 4af09dd69..b442f3aac 100644 --- a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m @@ -2,6 +2,7 @@ @implementation GPUImageDirectionalNonMaximumSuppressionFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageDirectionalNonmaximumSuppressionFragmentShaderString = SHADER_STRING ( precision mediump float; @@ -31,7 +32,35 @@ void main() gl_FragColor = vec4(multiplier, multiplier, multiplier, 1.0); } ); - +#else +NSString *const kGPUImageDirectionalNonmaximumSuppressionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float texelWidth; + uniform float texelHeight; + uniform float upperThreshold; + uniform float lowerThreshold; + + void main() + { + vec3 currentGradientAndDirection = texture2D(inputImageTexture, textureCoordinate).rgb; + vec2 gradientDirection = ((currentGradientAndDirection.gb * 2.0) - 1.0) * vec2(texelWidth, texelHeight); + + float firstSampledGradientMagnitude = texture2D(inputImageTexture, textureCoordinate + gradientDirection).r; + float secondSampledGradientMagnitude = texture2D(inputImageTexture, textureCoordinate - gradientDirection).r; + + float multiplier = step(firstSampledGradientMagnitude, currentGradientAndDirection.r); + multiplier = multiplier * step(secondSampledGradientMagnitude, currentGradientAndDirection.r); + + float thresholdCompliance = smoothstep(lowerThreshold, upperThreshold, currentGradientAndDirection.r); + multiplier = multiplier * thresholdCompliance; + + gl_FragColor = vec4(multiplier, multiplier, multiplier, 1.0); + } +); +#endif @synthesize texelWidth = _texelWidth; @synthesize texelHeight = _texelHeight; diff --git a/framework/Source/GPUImageHalftoneFilter.m b/framework/Source/GPUImageHalftoneFilter.m index caf0d51c9..1b621c6a3 100644 --- a/framework/Source/GPUImageHalftoneFilter.m +++ b/framework/Source/GPUImageHalftoneFilter.m @@ -1,5 +1,6 @@ #import "GPUImageHalftoneFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHalftoneFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -28,7 +29,38 @@ void main() gl_FragColor = vec4(vec3(checkForPresenceWithinDot), 1.0); } - ); +); +#else +NSString *const kGPUImageHalftoneFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float fractionalWidthOfPixel; + uniform float aspectRatio; + uniform float dotScaling; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + + vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + vec2 adjustedSamplePos = vec2(samplePos.x, (samplePos.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float distanceFromSamplePoint = distance(adjustedSamplePos, textureCoordinateToUse); + + vec3 sampledColor = texture2D(inputImageTexture, samplePos ).rgb; + float dotScaling = 1.0 - dot(sampledColor, W); + + float checkForPresenceWithinDot = 1.0 - step(distanceFromSamplePoint, (fractionalWidthOfPixel * 0.5) * dotScaling); + + gl_FragColor = vec4(vec3(checkForPresenceWithinDot), 1.0); + } +); +#endif @implementation GPUImageHalftoneFilter diff --git a/framework/Source/GPUImagePixellatePositionFilter.m b/framework/Source/GPUImagePixellatePositionFilter.m index fc7441b5e..90d70618a 100755 --- a/framework/Source/GPUImagePixellatePositionFilter.m +++ b/framework/Source/GPUImagePixellatePositionFilter.m @@ -1,5 +1,6 @@ #import "GPUImagePixellatePositionFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePixellationPositionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -28,6 +29,36 @@ void main() } } ); +#else +NSString *const kGPUImagePixellationPositionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float fractionalWidthOfPixel; + uniform float aspectRatio; + uniform vec2 pixelateCenter; + uniform float pixelateRadius; + + void main() + { + vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float dist = distance(pixelateCenter, textureCoordinateToUse); + + if (dist < pixelateRadius) + { + vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + gl_FragColor = texture2D(inputImageTexture, samplePos ); + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); + } + } +); +#endif @interface GPUImagePixellatePositionFilter () diff --git a/framework/Source/GPUImagePolarPixellateFilter.m b/framework/Source/GPUImagePolarPixellateFilter.m index 390a7aa7f..5677db487 100755 --- a/framework/Source/GPUImagePolarPixellateFilter.m +++ b/framework/Source/GPUImagePolarPixellateFilter.m @@ -2,6 +2,7 @@ // @fattjake based on vid by toneburst +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePolarPixellateFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -35,7 +36,43 @@ void main() gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); } - ); +); +#else +NSString *const kGPUImagePolarPixellateFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform vec2 center; + uniform vec2 pixelSize; + + + void main() + { + vec2 normCoord = 2.0 * textureCoordinate - 1.0; + vec2 normCenter = 2.0 * center - 1.0; + + normCoord -= normCenter; + + float r = length(normCoord); // to polar coords + float phi = atan(normCoord.y, normCoord.x); // to polar coords + + r = r - mod(r, pixelSize.x) + 0.03; + phi = phi - mod(phi, pixelSize.y); + + normCoord.x = r * cos(phi); + normCoord.y = r * sin(phi); + + normCoord += normCenter; + + vec2 textureCoordinateToUse = normCoord / 2.0 + 0.5; + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + + } +); +#endif @implementation GPUImagePolarPixellateFilter diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m index bad7e1a30..b0933a0c9 100644 --- a/framework/Source/GPUImagePolkaDotFilter.m +++ b/framework/Source/GPUImagePolkaDotFilter.m @@ -1,5 +1,6 @@ #import "GPUImagePolkaDotFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePolkaDotFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -23,6 +24,31 @@ void main() gl_FragColor = vec4(texture2D(inputImageTexture, samplePos ).rgb * checkForPresenceWithinDot, 1.0); } ); +#else +NSString *const kGPUImagePolkaDotFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float fractionalWidthOfPixel; + uniform float aspectRatio; + uniform float dotScaling; + + void main() + { + vec2 sampleDivisor = vec2(fractionalWidthOfPixel, fractionalWidthOfPixel / aspectRatio); + + vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor) + 0.5 * sampleDivisor; + vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + vec2 adjustedSamplePos = vec2(samplePos.x, (samplePos.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float distanceFromSamplePoint = distance(adjustedSamplePos, textureCoordinateToUse); + float checkForPresenceWithinDot = step(distanceFromSamplePoint, (fractionalWidthOfPixel * 0.5) * dotScaling); + + gl_FragColor = vec4(texture2D(inputImageTexture, samplePos ).rgb * checkForPresenceWithinDot, 1.0); + } +); +#endif @implementation GPUImagePolkaDotFilter diff --git a/framework/Source/GPUImagePrewittEdgeDetectionFilter.m b/framework/Source/GPUImagePrewittEdgeDetectionFilter.m index 7c0b236da..b5cfc1b97 100755 --- a/framework/Source/GPUImagePrewittEdgeDetectionFilter.m +++ b/framework/Source/GPUImagePrewittEdgeDetectionFilter.m @@ -2,6 +2,7 @@ @implementation GPUImagePrewittEdgeDetectionFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePrewittFragmentShaderString = SHADER_STRING ( precision highp float; @@ -38,6 +39,42 @@ void main() gl_FragColor = vec4(vec3(mag), 1.0); } ); +#else +NSString *const kGPUImagePrewittFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity; + + float mag = length(vec2(h, v)); + + gl_FragColor = vec4(vec3(mag), 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.m b/framework/Source/GPUImageSingleComponentFastBlurFilter.m index d31313731..4b4ed5de5 100644 --- a/framework/Source/GPUImageSingleComponentFastBlurFilter.m +++ b/framework/Source/GPUImageSingleComponentFastBlurFilter.m @@ -1,5 +1,6 @@ #import "GPUImageSingleComponentFastBlurFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSingleComponentFastBlurFragmentShaderString = SHADER_STRING ( precision highp float; @@ -25,6 +26,31 @@ void main() gl_FragColor = vec4(vec3(fragmentColor), 1.0); } ); +#else +NSString *const kGPUImageSingleComponentFastBlurFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepLeftTextureCoordinate; + varying vec2 twoStepsLeftTextureCoordinate; + varying vec2 oneStepRightTextureCoordinate; + varying vec2 twoStepsRightTextureCoordinate; + + // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); + + void main() + { + float fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).r * 0.2270270270; + fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate).r * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate).r * 0.3162162162; + fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate).r * 0.0702702703; + fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate).r * 0.0702702703; + + gl_FragColor = vec4(vec3(fragmentColor), 1.0); + } +); +#endif @implementation GPUImageSingleComponentFastBlurFilter diff --git a/framework/Source/GPUImageThresholdEdgeDetectionFilter.m b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m index 0d10c0745..05907c3c6 100755 --- a/framework/Source/GPUImageThresholdEdgeDetectionFilter.m +++ b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m @@ -3,6 +3,7 @@ @implementation GPUImageThresholdEdgeDetectionFilter // Invert the colorspace for a sketch +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageThresholdEdgeDetectionFragmentShaderString = SHADER_STRING ( precision highp float; @@ -42,7 +43,47 @@ void main() gl_FragColor = vec4(vec3(mag), 1.0); } - ); +); +#else +NSString *const kGPUImageThresholdEdgeDetectionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float threshold; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + + float mag = length(vec2(h, v)); + mag = step(threshold, mag); + + gl_FragColor = vec4(vec3(mag), 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageWeakPixelInclusionFilter.m b/framework/Source/GPUImageWeakPixelInclusionFilter.m index 93fac458e..4e95ad5d3 100644 --- a/framework/Source/GPUImageWeakPixelInclusionFilter.m +++ b/framework/Source/GPUImageWeakPixelInclusionFilter.m @@ -2,6 +2,7 @@ @implementation GPUImageWeakPixelInclusionFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageWeakPixelInclusionFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -39,6 +40,43 @@ void main() gl_FragColor = vec4(vec3(sumTest * pixelTest), 1.0); } ); +#else +NSString *const kGPUImageWeakPixelInclusionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; + + float pixelIntensitySum = bottomLeftIntensity + topRightIntensity + topLeftIntensity + bottomRightIntensity + leftIntensity + rightIntensity + bottomIntensity + topIntensity + centerIntensity; + float sumTest = step(1.5, pixelIntensitySum); + float pixelTest = step(0.01, centerIntensity); + + gl_FragColor = vec4(vec3(sumTest * pixelTest), 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageXYDerivativeFilter.m b/framework/Source/GPUImageXYDerivativeFilter.m index aaecaab1a..cf81f33b9 100755 --- a/framework/Source/GPUImageXYDerivativeFilter.m +++ b/framework/Source/GPUImageXYDerivativeFilter.m @@ -6,6 +6,7 @@ @implementation GPUImageXYDerivativeFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageGradientFragmentShaderString = SHADER_STRING ( precision highp float; @@ -44,6 +45,44 @@ void main() gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, ((verticalDerivative * horizontalDerivative) + 1.0) / 2.0, 1.0); } ); +#else +NSString *const kGPUImageGradientFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + + float verticalDerivative = -topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity; + float horizontalDerivative = -bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity; + // float verticalDerivative = -topIntensity + bottomIntensity; + // float horizontalDerivative = -leftIntensity + rightIntensity; + + // Scaling the X * Y operation so that negative numbers are not clipped in the 0..1 range. This will be expanded in the corner detection filter + gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, ((verticalDerivative * horizontalDerivative) + 1.0) / 2.0, 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m index 00627b81c..6844bbe18 100644 --- a/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUimageDirectionalSobelEdgeDetectionFilter.m @@ -2,6 +2,7 @@ @implementation GPUimageDirectionalSobelEdgeDetectionFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageDirectionalSobelEdgeDetectionFragmentShaderString = SHADER_STRING ( precision mediump float; @@ -43,6 +44,47 @@ void main() gl_FragColor = vec4(gradientMagnitude, normalizedDirection.x, normalizedDirection.y, 1.0); } ); +#else +NSString *const kGPUImageDirectionalSobelEdgeDetectionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + + vec2 gradientDirection; + gradientDirection.x = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + gradientDirection.y = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + + float gradientMagnitude = length(gradientDirection); + vec2 normalizedDirection = normalize(gradientDirection); + normalizedDirection = sign(normalizedDirection) * floor(abs(normalizedDirection) + 0.617316); // Offset by 1-sin(pi/8) to set to 0 if near axis, 1 if away + normalizedDirection = (normalizedDirection + 1.0) * 0.5; // Place -1.0 - 1.0 within 0 - 1.0 + + gl_FragColor = vec4(gradientMagnitude, normalizedDirection.x, normalizedDirection.y, 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 5f908ab20..b908cabf1 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -96,6 +96,19 @@ #import #import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import // Outputs #import From 33589dd8452d840082395dec719675ba56ddf196 Mon Sep 17 00:00:00 2001 From: Mattt Thompson Date: Sun, 5 May 2013 19:36:07 -0700 Subject: [PATCH 371/695] Fixing Indentation of Filter List & Parameters --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ba89302ec..c26564f7b 100755 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ There are currently 125 built-in filters, divided into the following categories: - *opacity*: The value to multiply the incoming alpha channel for each pixel by (0.0 - 1.0, with 1.0 as the default) - **GPUImageSolidColorGenerator**: This outputs a generated image with a solid color. You need to define the image size using -forceProcessingAtSize: - - *color*: The color, in a four component format, that is used to fill the image. + - *color*: The color, in a four component format, that is used to fill the image. - **GPUImageLuminanceThresholdFilter**: Pixels with a luminance above the threshold will appear white, and those below will be black - *threshold*: The luminance threshold, from 0.0 to 1.0, with a default of 0.5 @@ -148,8 +148,8 @@ There are currently 125 built-in filters, divided into the following categories: - **GPUImageLuminosity**: Like the GPUImageAverageColor, this reduces an image to its average luminosity. You need to set the luminosityProcessingFinishedBlock to handle the output of this filter, which just returns a luminosity value and a frame time. - **GPUImageChromaKeyFilter**: For a given color in the image, sets the alpha channel to 0. This is similar to the GPUImageChromaKeyBlendFilter, only instead of blending in a second image for a matching color this doesn't take in a second image and just turns a given color transparent. -- *thresholdSensitivity*: How close a color match needs to exist to the target color to be replaced (default of 0.4) -- *smoothing*: How smoothly to blend for the color match (default of 0.1) + - *thresholdSensitivity*: How close a color match needs to exist to the target color to be replaced (default of 0.4) + - *smoothing*: How smoothly to blend for the color match (default of 0.1) ### Image processing ### From 121b85cd1b31d7ff11b1ea430dbd4bacf5839072 Mon Sep 17 00:00:00 2001 From: Fco Javier Valdera Date: Wed, 8 May 2013 13:20:50 +0200 Subject: [PATCH 372/695] Fixed issue #765 - Added 'cancelProcessing' method to GPUImageMovie to cancel an on-going video file processing. - Added a check to cancelled status to 'finishRecordingWithCompletionHandler:' in GPUImageMovieWriter to detect if the writing was cancelled. --- framework/Source/GPUImageMovie.h | 1 + framework/Source/GPUImageMovie.m | 8 ++++++++ framework/Source/iOS/GPUImageMovieWriter.m | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index 5768cfba6..b81bcd785 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -40,6 +40,7 @@ - (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; - (void)startProcessing; - (void)endProcessing; +- (void)cancelProcessing; - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; @end diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 072f285e9..cb0397fbd 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -361,4 +361,12 @@ - (void)endProcessing; } } +- (void)cancelProcessing +{ + if (reader) { + [reader cancelReading]; + } + [self endProcessing]; +} + @end diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index a586b023b..919f12779 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -267,7 +267,7 @@ - (void)finishRecording; - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; { - if (assetWriter.status == AVAssetWriterStatusCompleted) + if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled) { return; } From bdda33328c4905858da4721033da464ea04d2e12 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 9 May 2013 14:15:28 -0500 Subject: [PATCH 373/695] Fixed a compilation error with older Xcodes. --- framework/Source/GPUImageBilateralFilter.m | 2 ++ framework/Source/GPUImageStillCamera.m | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m index dd7deaf4c..b30e834f5 100644 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -156,6 +156,8 @@ void main() @implementation GPUImageBilateralFilter +@synthesize distanceNormalizationFactor = _distanceNormalizationFactor; + - (id)init; { diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 8e33255b7..bd535d04f 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -237,7 +237,7 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); - + CGSize sizeOfPhoto = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame)); CGSize scaledImageSizeToFitOnGPU = [GPUImageContext sizeThatFitsWithinATextureForSize:sizeOfPhoto]; if (!CGSizeEqualToSize(sizeOfPhoto, scaledImageSizeToFitOnGPU)) From fab2972de48139fb2cfee369fb85916accaf1169 Mon Sep 17 00:00:00 2001 From: Stevie Graham Date: Sun, 12 May 2013 15:33:34 +0100 Subject: [PATCH 374/695] Fix GPUImageRawDataOutput so that if the current frame has been read previously, the cached version is returned rather than reading the pixel buffer/texture cache each time --- framework/Source/GPUImageRawDataOutput.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index fc8951fd4..a22e10d54 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -400,6 +400,9 @@ - (GLubyte *)rawBytesForImage; // GL_EXT_read_format_bgra // glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); } + + hasReadFromTheCurrentFrame = YES; + }); return _rawBytesForImage; From b33ff86098debc0c12ce024439239552b91564a2 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 15 May 2013 09:28:19 -0500 Subject: [PATCH 375/695] Fixed vignette filter to take into account alpha in the original image, improved its performance. --- framework/Source/GPUImageVignetteFilter.m | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m index c6a3546a5..827678e53 100755 --- a/framework/Source/GPUImageVignetteFilter.m +++ b/framework/Source/GPUImageVignetteFilter.m @@ -12,17 +12,10 @@ void main() { - /* - lowp vec3 rgb = texture2D(inputImageTexture, textureCoordinate).rgb; - lowp float d = distance(textureCoordinate, vec2(0.5,0.5)); - rgb *= (1.0 - smoothstep(vignetteStart, vignetteEnd, d)); - gl_FragColor = vec4(vec3(rgb),1.0); - */ - - lowp vec3 rgb = texture2D(inputImageTexture, textureCoordinate).rgb; + lowp vec4 sourceImageColor = texture2D(inputImageTexture, textureCoordinate); lowp float d = distance(textureCoordinate, vec2(vignetteCenter.x, vignetteCenter.y)); lowp float percent = smoothstep(vignetteStart, vignetteEnd, d); - gl_FragColor = vec4(mix(rgb.x, vignetteColor.x, percent), mix(rgb.y, vignetteColor.y, percent), mix(rgb.z, vignetteColor.z, percent), 1.0); + gl_FragColor = vec4(mix(sourceImageColor.rgb, vignetteColor, percent), sourceImageColor.a); } ); From 728d39944f884da79937911a22f97cc7cda76f26 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 17 May 2013 12:33:00 -0500 Subject: [PATCH 376/695] Ported the corner and line detectors to the Mac. Fixed a glitch in the line detector. --- .../SLSFilterShowcaseWindowController.h | 4 + .../SLSFilterShowcaseWindowController.m | 93 +++++++++++++++++++ .../GPUImageMac.xcodeproj/project.pbxproj | 72 ++++++++++++++ framework/Source/GPUImageColorPackingFilter.m | 32 ++++++- framework/Source/GPUImageCrosshairGenerator.m | 44 +++++++-- .../GPUImageHarrisCornerDetectionFilter.m | 26 ++++++ framework/Source/GPUImageLineGenerator.m | 16 +++- .../GPUImageNobleCornerDetectionFilter.m | 30 +++++- ...ageParallelCoordinateLineTransformFilter.m | 13 +++ .../GPUImageShiTomasiFeatureDetectionFilter.m | 23 +++++ ...geThresholdedNonMaximumSuppressionFilter.m | 53 ++++++++++- framework/Source/Mac/GPUImage.h | 9 ++ 12 files changed, 401 insertions(+), 14 deletions(-) diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index faf632e6c..0df305bac 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -45,6 +45,10 @@ typedef enum { GPUIMAGE_CANNYEDGEDETECTION, GPUIMAGE_THRESHOLDEDGEDETECTION, GPUIMAGE_XYGRADIENT, + GPUIMAGE_HARRISCORNERDETECTION, + GPUIMAGE_NOBLECORNERDETECTION, + GPUIMAGE_SHITOMASIFEATUREDETECTION, + GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_CONVOLUTION, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 6584792aa..60a30b76e 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -318,6 +318,47 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 1.0; self.enableSlider = YES; }; break; + + case GPUIMAGE_HARRISCORNERDETECTION: + { + currentlySelectedFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; + [(GPUImageHarrisCornerDetectionFilter *)currentlySelectedFilter setThreshold:0.20]; + + self.minimumSliderValue = 0.01; + self.maximumSliderValue = 0.70; + self.currentSliderValue = 0.20; + self.enableSlider = YES; + }; break; + case GPUIMAGE_NOBLECORNERDETECTION: + { + currentlySelectedFilter = [[GPUImageNobleCornerDetectionFilter alloc] init]; + [(GPUImageNobleCornerDetectionFilter *)currentlySelectedFilter setThreshold:0.20]; + + self.minimumSliderValue = 0.01; + self.maximumSliderValue = 0.70; + self.currentSliderValue = 0.20; + self.enableSlider = YES; + }; break; + case GPUIMAGE_SHITOMASIFEATUREDETECTION: + { + currentlySelectedFilter = [[GPUImageShiTomasiFeatureDetectionFilter alloc] init]; + [(GPUImageShiTomasiFeatureDetectionFilter *)currentlySelectedFilter setThreshold:0.20]; + + self.minimumSliderValue = 0.01; + self.maximumSliderValue = 0.70; + self.currentSliderValue = 0.20; + self.enableSlider = YES; + }; break; + case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: + { + currentlySelectedFilter = [[GPUImageHoughTransformLineDetector alloc] init]; + [(GPUImageHoughTransformLineDetector *)currentlySelectedFilter setLineDetectionThreshold:0.60]; + + self.minimumSliderValue = 0.2; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.6; + self.enableSlider = YES; + }; break; case GPUIMAGE_GRAYSCALE: { currentlySelectedFilter = [[GPUImageGrayscaleFilter alloc] init]; @@ -809,6 +850,50 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; [colorGenerator addTarget:self.glView]; } + else if ( (currentlySelectedRow == GPUIMAGE_HARRISCORNERDETECTION) || (currentlySelectedRow == GPUIMAGE_NOBLECORNERDETECTION) || (currentlySelectedRow == GPUIMAGE_SHITOMASIFEATUREDETECTION) ) + { + [currentlySelectedFilter removeTarget:self.glView]; + + GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; + crosshairGenerator.crosshairWidth = 15.0; + [crosshairGenerator forceProcessingAtSize:[self.glView sizeInPixels]]; + + [(GPUImageHarrisCornerDetectionFilter *)currentlySelectedFilter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) { + [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime]; + }]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [blendFilter forceProcessingAtSize:[self.glView sizeInPixels]]; + GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; + [inputCamera addTarget:gammaFilter]; + [gammaFilter addTarget:blendFilter]; + + [crosshairGenerator addTarget:blendFilter]; + + [blendFilter addTarget:self.glView]; + } + else if (currentlySelectedRow == GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR) + { + [currentlySelectedFilter removeTarget:self.glView]; + + GPUImageLineGenerator *lineGenerator = [[GPUImageLineGenerator alloc] init]; + // lineGenerator.crosshairWidth = 15.0; + [lineGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; + [lineGenerator setLineColorRed:1.0 green:0.0 blue:0.0]; + [(GPUImageHoughTransformLineDetector *)currentlySelectedFilter setLinesDetectedBlock:^(GLfloat* lineArray, NSUInteger linesDetected, CMTime frameTime){ + [lineGenerator renderLinesFromArray:lineArray count:linesDetected frameTime:frameTime]; + }]; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + [blendFilter forceProcessingAtSize:[self.glView sizeInPixels]]; + GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; + [inputCamera addTarget:gammaFilter]; + [gammaFilter addTarget:blendFilter]; + + [lineGenerator addTarget:blendFilter]; + + [blendFilter addTarget:self.glView]; + } } @@ -850,6 +935,10 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)currentlySelectedFilter setThresholdMultiplier:_currentSliderValue]; break; case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; case GPUIMAGE_THRESHOLDEDGEDETECTION: [(GPUImageThresholdEdgeDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; + case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; + case GPUIMAGE_NOBLECORNERDETECTION: [(GPUImageNobleCornerDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; + case GPUIMAGE_SHITOMASIFEATUREDETECTION: [(GPUImageShiTomasiFeatureDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; + case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: [(GPUImageHoughTransformLineDetector *)currentlySelectedFilter setLineDetectionThreshold:_currentSliderValue]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)currentlySelectedFilter setSharpness:_currentSliderValue]; break; @@ -920,6 +1009,10 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_PREWITTEDGEDETECTION: tableRowTitle = @"Prewitt edge detection"; break; case GPUIMAGE_CANNYEDGEDETECTION: tableRowTitle = @"Canny edge detection"; break; case GPUIMAGE_THRESHOLDEDGEDETECTION: tableRowTitle = @"Threshold edge detection"; break; + case GPUIMAGE_HARRISCORNERDETECTION: tableRowTitle = @"Harris corner detector"; break; + case GPUIMAGE_NOBLECORNERDETECTION: tableRowTitle = @"Noble corner detector"; break; + case GPUIMAGE_SHITOMASIFEATUREDETECTION: tableRowTitle = @"Shi-Tomasi feature detector"; break; + case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: tableRowTitle = @"Hough transform line detector"; break; case GPUIMAGE_XYGRADIENT: tableRowTitle = @"X-Y gradient"; break; case GPUIMAGE_SKETCH: tableRowTitle = @"Sketch"; break; case GPUIMAGE_TOON: tableRowTitle = @"Toon"; break; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 3a302f8cb..f86d230c7 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + BC56957A174683620081491B /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC569576174683620081491B /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC56957B174683620081491B /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC569577174683620081491B /* GPUImageCrosshairGenerator.m */; }; + BC56957C174683620081491B /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC569578174683620081491B /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC56957D174683620081491B /* GPUImageLineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC569579174683620081491B /* GPUImageLineGenerator.m */; }; BC6C553C1730636600EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553A1730636600EB222D /* GPUImageLaplacianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC6C553D1730636600EB222D /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553B1730636600EB222D /* GPUImageLaplacianFilter.m */; }; BC6C55461730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C55441730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -59,6 +63,20 @@ BCC0DF5F173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */; }; BCC0DF6217359F42007C485F /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC0DF6317359F43007C485F /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */; }; + BCE2EF8817459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF8217459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE2EF8917459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE2EF8317459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m */; }; + BCE2EF8A17459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF8417459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE2EF8B17459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE2EF8517459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.m */; }; + BCE2EF8C17459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF8617459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE2EF8D17459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE2EF8717459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.m */; }; + BCE2EF9217459D9300C0628C /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF8E17459D9300C0628C /* GPUImageColorPackingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE2EF9317459D9300C0628C /* GPUImageColorPackingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE2EF8F17459D9300C0628C /* GPUImageColorPackingFilter.m */; }; + BCE2EF9417459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF9017459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE2EF9517459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE2EF9117459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.m */; }; + BCE2EF9817459E2400C0628C /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF9617459E2400C0628C /* GPUImageHoughTransformLineDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE2EF9917459E2400C0628C /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE2EF9717459E2400C0628C /* GPUImageHoughTransformLineDetector.m */; }; + BCE2EF9C17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF9A17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCE2EF9D17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE2EF9B17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.m */; }; BCE817A81735FDC70071D084 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817A01735FDC60071D084 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCE817A91735FDC70071D084 /* GPUImageHalftoneFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817A11735FDC60071D084 /* GPUImageHalftoneFilter.m */; }; BCE817AA1735FDC70071D084 /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817A21735FDC60071D084 /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -230,6 +248,10 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + BC569576174683620081491B /* GPUImageCrosshairGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCrosshairGenerator.h; path = Source/GPUImageCrosshairGenerator.h; sourceTree = SOURCE_ROOT; }; + BC569577174683620081491B /* GPUImageCrosshairGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCrosshairGenerator.m; path = Source/GPUImageCrosshairGenerator.m; sourceTree = SOURCE_ROOT; }; + BC569578174683620081491B /* GPUImageLineGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLineGenerator.h; path = Source/GPUImageLineGenerator.h; sourceTree = SOURCE_ROOT; }; + BC569579174683620081491B /* GPUImageLineGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLineGenerator.m; path = Source/GPUImageLineGenerator.m; sourceTree = SOURCE_ROOT; }; BC6C553A1730636600EB222D /* GPUImageLaplacianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLaplacianFilter.h; path = Source/GPUImageLaplacianFilter.h; sourceTree = SOURCE_ROOT; }; BC6C553B1730636600EB222D /* GPUImageLaplacianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLaplacianFilter.m; path = Source/GPUImageLaplacianFilter.m; sourceTree = SOURCE_ROOT; }; BC6C55441730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLanczosResamplingFilter.h; path = Source/GPUImageLanczosResamplingFilter.h; sourceTree = SOURCE_ROOT; }; @@ -288,6 +310,20 @@ BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageLuminanceThresholdFilter.m; path = Source/GPUImageAverageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminanceThresholdFilter.h; path = Source/GPUImageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminanceThresholdFilter.m; path = Source/GPUImageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; + BCE2EF8217459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHarrisCornerDetectionFilter.h; path = Source/GPUImageHarrisCornerDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE2EF8317459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHarrisCornerDetectionFilter.m; path = Source/GPUImageHarrisCornerDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE2EF8417459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNobleCornerDetectionFilter.h; path = Source/GPUImageNobleCornerDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE2EF8517459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNobleCornerDetectionFilter.m; path = Source/GPUImageNobleCornerDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE2EF8617459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageShiTomasiFeatureDetectionFilter.h; path = Source/GPUImageShiTomasiFeatureDetectionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE2EF8717459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageShiTomasiFeatureDetectionFilter.m; path = Source/GPUImageShiTomasiFeatureDetectionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE2EF8E17459D9300C0628C /* GPUImageColorPackingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorPackingFilter.h; path = Source/GPUImageColorPackingFilter.h; sourceTree = SOURCE_ROOT; }; + BCE2EF8F17459D9300C0628C /* GPUImageColorPackingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorPackingFilter.m; path = Source/GPUImageColorPackingFilter.m; sourceTree = SOURCE_ROOT; }; + BCE2EF9017459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdedNonMaximumSuppressionFilter.h; path = Source/GPUImageThresholdedNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; + BCE2EF9117459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdedNonMaximumSuppressionFilter.m; path = Source/GPUImageThresholdedNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; + BCE2EF9617459E2400C0628C /* GPUImageHoughTransformLineDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHoughTransformLineDetector.h; path = Source/GPUImageHoughTransformLineDetector.h; sourceTree = SOURCE_ROOT; }; + BCE2EF9717459E2400C0628C /* GPUImageHoughTransformLineDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHoughTransformLineDetector.m; path = Source/GPUImageHoughTransformLineDetector.m; sourceTree = SOURCE_ROOT; }; + BCE2EF9A17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageParallelCoordinateLineTransformFilter.h; path = Source/GPUImageParallelCoordinateLineTransformFilter.h; sourceTree = SOURCE_ROOT; }; + BCE2EF9B17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageParallelCoordinateLineTransformFilter.m; path = Source/GPUImageParallelCoordinateLineTransformFilter.m; sourceTree = SOURCE_ROOT; }; BCE817A01735FDC60071D084 /* GPUImageHalftoneFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHalftoneFilter.h; path = Source/GPUImageHalftoneFilter.h; sourceTree = SOURCE_ROOT; }; BCE817A11735FDC60071D084 /* GPUImageHalftoneFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHalftoneFilter.m; path = Source/GPUImageHalftoneFilter.m; sourceTree = SOURCE_ROOT; }; BCE817A21735FDC60071D084 /* GPUImagePixellatePositionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePixellatePositionFilter.h; path = Source/GPUImagePixellatePositionFilter.h; sourceTree = SOURCE_ROOT; }; @@ -715,6 +751,24 @@ BCE817B9173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m */, BCE817C01736092A0071D084 /* GPUImageXYDerivativeFilter.h */, BCE817C11736092A0071D084 /* GPUImageXYDerivativeFilter.m */, + BCE2EF8217459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.h */, + BCE2EF8317459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m */, + BCE2EF8417459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.h */, + BCE2EF8517459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.m */, + BCE2EF8617459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.h */, + BCE2EF8717459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.m */, + BC569576174683620081491B /* GPUImageCrosshairGenerator.h */, + BC569577174683620081491B /* GPUImageCrosshairGenerator.m */, + BCE2EF8E17459D9300C0628C /* GPUImageColorPackingFilter.h */, + BCE2EF8F17459D9300C0628C /* GPUImageColorPackingFilter.m */, + BCE2EF9017459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.h */, + BCE2EF9117459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.m */, + BCE2EF9617459E2400C0628C /* GPUImageHoughTransformLineDetector.h */, + BCE2EF9717459E2400C0628C /* GPUImageHoughTransformLineDetector.m */, + BC569578174683620081491B /* GPUImageLineGenerator.h */, + BC569579174683620081491B /* GPUImageLineGenerator.m */, + BCE2EF9A17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.h */, + BCE2EF9B17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.m */, BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */, BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */, BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */, @@ -917,6 +971,15 @@ BCE817CC17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */, BCE817CE17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */, BCE817D217360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.h in Headers */, + BCE2EF8817459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.h in Headers */, + BCE2EF8A17459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.h in Headers */, + BCE2EF8C17459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */, + BCE2EF9217459D9300C0628C /* GPUImageColorPackingFilter.h in Headers */, + BCE2EF9417459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */, + BCE2EF9817459E2400C0628C /* GPUImageHoughTransformLineDetector.h in Headers */, + BCE2EF9C17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */, + BC56957A174683620081491B /* GPUImageCrosshairGenerator.h in Headers */, + BC56957C174683620081491B /* GPUImageLineGenerator.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1089,6 +1152,15 @@ BCE817CD17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */, BCE817CF17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */, BCE817D317360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m in Sources */, + BCE2EF8917459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m in Sources */, + BCE2EF8B17459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.m in Sources */, + BCE2EF8D17459D5B00C0628C /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */, + BCE2EF9317459D9300C0628C /* GPUImageColorPackingFilter.m in Sources */, + BCE2EF9517459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */, + BCE2EF9917459E2400C0628C /* GPUImageHoughTransformLineDetector.m in Sources */, + BCE2EF9D17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */, + BC56957B174683620081491B /* GPUImageCrosshairGenerator.m in Sources */, + BC56957D174683620081491B /* GPUImageLineGenerator.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m index 12033d4e6..1a087ca84 100644 --- a/framework/Source/GPUImageColorPackingFilter.m +++ b/framework/Source/GPUImageColorPackingFilter.m @@ -5,8 +5,8 @@ attribute vec4 position; attribute vec4 inputTextureCoordinate; - uniform highp float texelWidth; - uniform highp float texelHeight; + uniform float texelWidth; + uniform float texelHeight; varying vec2 upperLeftInputTextureCoordinate; varying vec2 upperRightInputTextureCoordinate; @@ -24,6 +24,7 @@ void main() } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageColorPackingFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -48,7 +49,32 @@ void main() gl_FragColor = vec4(upperLeftIntensity, upperRightIntensity, lowerLeftIntensity, lowerRightIntensity); } -); +); +#else +NSString *const kGPUImageColorPackingFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + uniform mat3 convolutionMatrix; + + varying vec2 outputTextureCoordinate; + + varying vec2 upperLeftInputTextureCoordinate; + varying vec2 upperRightInputTextureCoordinate; + varying vec2 lowerLeftInputTextureCoordinate; + varying vec2 lowerRightInputTextureCoordinate; + + void main() + { + float upperLeftIntensity = texture2D(inputImageTexture, upperLeftInputTextureCoordinate).r; + float upperRightIntensity = texture2D(inputImageTexture, upperRightInputTextureCoordinate).r; + float lowerLeftIntensity = texture2D(inputImageTexture, lowerLeftInputTextureCoordinate).r; + float lowerRightIntensity = texture2D(inputImageTexture, lowerRightInputTextureCoordinate).r; + + gl_FragColor = vec4(upperLeftIntensity, upperRightIntensity, lowerLeftIntensity, lowerRightIntensity); + } +); +#endif @implementation GPUImageColorPackingFilter diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index a308b8b38..9adb94f19 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -1,13 +1,17 @@ #import "GPUImageCrosshairGenerator.h" +#define hash # +#define wrappedlabel(x) x +#define escapedhash(a) wrappedlabel(hash)a + NSString *const kGPUImageCrosshairVertexShaderString = SHADER_STRING ( attribute vec4 position; uniform float crosshairWidth; - varying lowp vec2 centerLocation; - varying lowp float pointSpacing; + varying vec2 centerLocation; + varying float pointSpacing; void main() { @@ -18,24 +22,44 @@ void main() } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageCrosshairFragmentShaderString = SHADER_STRING ( uniform lowp vec3 crosshairColor; - varying lowp vec2 centerLocation; - varying lowp float pointSpacing; + varying highp vec2 centerLocation; + varying highp float pointSpacing; void main() { lowp vec2 distanceFromCenter = abs(centerLocation - gl_PointCoord.xy); lowp float axisTest = step(pointSpacing, gl_PointCoord.y) * step(distanceFromCenter.x, 0.09) + step(pointSpacing, gl_PointCoord.x) * step(distanceFromCenter.y, 0.09); - + gl_FragColor = vec4(crosshairColor * axisTest, axisTest); // gl_FragColor = vec4(distanceFromCenterInX, distanceFromCenterInY, 0.0, 1.0); } ); - +#else +NSString *const kGPUImageCrosshairFragmentShaderString = SHADER_STRING +( + escapedhash(version 120)\n + + uniform vec3 crosshairColor; + + varying vec2 centerLocation; + varying float pointSpacing; + + void main() + { + vec2 distanceFromCenter = abs(centerLocation - gl_PointCoord.xy); + float axisTest = step(pointSpacing, gl_PointCoord.y) * step(distanceFromCenter.x, 0.09) + step(pointSpacing, gl_PointCoord.x) * step(distanceFromCenter.y, 0.09); + + gl_FragColor = vec4(crosshairColor * axisTest, axisTest); + // gl_FragColor = vec4(distanceFromCenterInX, distanceFromCenterInY, 0.0, 1.0); + } +); +#endif @implementation GPUImageCrosshairGenerator @@ -75,6 +99,12 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext setActiveShaderProgram:filterProgram]; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#else + glEnable(GL_POINT_SPRITE); + glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); +#endif + [self setFilterFBO]; glClearColor(0.0, 0.0, 0.0, 0.0); @@ -82,7 +112,7 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, crosshairCoordinates); - glDrawArrays(GL_POINTS, 0, numberOfCrosshairs); + glDrawArrays(GL_POINTS, 0, (GLsizei)numberOfCrosshairs); [self informTargetsAboutNewFrameAtTime:frameTime]; }); diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 7436ac766..8a35ec78b 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -17,6 +17,7 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; @implementation GPUImageHarrisCornerDetectionFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHarrisCornerDetectionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -40,6 +41,31 @@ void main() gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); } ); +#else +NSString *const kGPUImageHarrisCornerDetectionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float sensitivity; + + const float harrisConstant = 0.04; + + void main() + { + vec3 derivativeElements = texture2D(inputImageTexture, textureCoordinate).rgb; + + float derivativeSum = derivativeElements.x + derivativeElements.y; + + float zElement = (derivativeElements.z * 2.0) - 1.0; + + // R = Ix^2 * Iy^2 - Ixy * Ixy - k * (Ix^2 + Iy^2)^2 + float cornerness = derivativeElements.x * derivativeElements.y - (zElement * zElement) - harrisConstant * derivativeSum * derivativeSum; + + gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); + } +); +#endif @synthesize blurSize; @synthesize cornersDetectedBlock; diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m index 741256b88..ecacd2f4b 100644 --- a/framework/Source/GPUImageLineGenerator.m +++ b/framework/Source/GPUImageLineGenerator.m @@ -8,8 +8,9 @@ void main() { gl_Position = position; } - ); +); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLineGeneratorFragmentShaderString = SHADER_STRING ( uniform lowp vec3 lineColor; @@ -19,6 +20,17 @@ void main() gl_FragColor = vec4(lineColor, 1.0); } ); +#else +NSString *const kGPUImageLineGeneratorFragmentShaderString = SHADER_STRING +( + uniform vec3 lineColor; + + void main() + { + gl_FragColor = vec4(lineColor, 1.0); + } +); +#endif @interface GPUImageLineGenerator() @@ -88,7 +100,7 @@ - (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger GLfloat slope = lineSlopeAndIntercepts[currentLineIndex++]; GLfloat intercept = lineSlopeAndIntercepts[currentLineIndex++]; - if (lineSlopeAndIntercepts[currentLineIndex] > 9000.0) // Vertical line + if (slope > 9000.0) // Vertical line { lineCoordinates[currentVertexIndex++] = intercept; lineCoordinates[currentVertexIndex++] = -1.0; diff --git a/framework/Source/GPUImageNobleCornerDetectionFilter.m b/framework/Source/GPUImageNobleCornerDetectionFilter.m index fa2934f92..aa6b30415 100644 --- a/framework/Source/GPUImageNobleCornerDetectionFilter.m +++ b/framework/Source/GPUImageNobleCornerDetectionFilter.m @@ -2,6 +2,7 @@ @implementation GPUImageNobleCornerDetectionFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageNobleCornerDetectionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -28,7 +29,34 @@ void main() gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); } ); - +#else +NSString *const kGPUImageNobleCornerDetectionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float sensitivity; + + void main() + { + vec3 derivativeElements = texture2D(inputImageTexture, textureCoordinate).rgb; + + float derivativeSum = derivativeElements.x + derivativeElements.y; + + // R = (Ix^2 * Iy^2 - Ixy * Ixy) / (Ix^2 + Iy^2) + float zElement = (derivativeElements.z * 2.0) - 1.0; + // mediump float harrisIntensity = (derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z)) / (derivativeSum); + float cornerness = (derivativeElements.x * derivativeElements.y - (zElement * zElement)) / (derivativeSum); + + // Original Harris detector + // R = Ix^2 * Iy^2 - Ixy * Ixy - k * (Ix^2 + Iy^2)^2 + // highp float harrisIntensity = derivativeElements.x * derivativeElements.y - (derivativeElements.z * derivativeElements.z) - harrisConstant * derivativeSum * derivativeSum; + + // gl_FragColor = vec4(vec3(harrisIntensity * 7.0), 1.0); + gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index bfd282623..c7f2efcc1 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -10,6 +10,7 @@ void main() } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHoughAccumulationFragmentShaderString = SHADER_STRING ( const lowp float scalingFactor = 1.0 / 256.0; @@ -20,6 +21,18 @@ void main() gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); } ); +#else +NSString *const kGPUImageHoughAccumulationFragmentShaderString = SHADER_STRING +( + const float scalingFactor = 1.0 / 256.0; + + void main() + { + // gl_FragColor = vec4(scalingFactor, scalingFactor, scalingFactor, 1.0); + gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); + } +); +#endif @interface GPUImageParallelCoordinateLineTransformFilter() // Rendering diff --git a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m index f47ec6bfa..e58cbb4fd 100644 --- a/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m +++ b/framework/Source/GPUImageShiTomasiFeatureDetectionFilter.m @@ -2,6 +2,7 @@ @implementation GPUImageShiTomasiFeatureDetectionFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageShiTomasiCornerDetectionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -22,6 +23,28 @@ void main() gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); } ); +#else +NSString *const kGPUImageShiTomasiCornerDetectionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float sensitivity; + + void main() + { + vec3 derivativeElements = texture2D(inputImageTexture, textureCoordinate).rgb; + + float derivativeDifference = derivativeElements.x - derivativeElements.y; + float zElement = (derivativeElements.z * 2.0) - 1.0; + + // R = Ix^2 + Iy^2 - sqrt( (Ix^2 - Iy^2)^2 + 4 * Ixy * Ixy) + float cornerness = derivativeElements.x + derivativeElements.y - sqrt(derivativeDifference * derivativeDifference + 4.0 * zElement * zElement); + + gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m index 1c2dce1dc..d1c6c482e 100644 --- a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m @@ -1,5 +1,6 @@ #import "GPUImageThresholdedNonMaximumSuppressionFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageThresholdedNonMaximumSuppressionFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -49,7 +50,57 @@ void main() // gl_FragColor = vec4((centerColor.rgb * step(maxValue, step(threshold, centerColor.r)) * multiplier), 1.0); } ); - +#else +NSString *const kGPUImageThresholdedNonMaximumSuppressionFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform float threshold; + + void main() + { + float bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + float leftColor = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightColor = texture2D(inputImageTexture, rightTextureCoordinate).r; + float topColor = texture2D(inputImageTexture, topTextureCoordinate).r; + float topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + + // Use a tiebreaker for pixels to the left and immediately above this one + float multiplier = 1.0 - step(centerColor.r, topColor); + multiplier = multiplier * 1.0 - step(centerColor.r, topLeftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, leftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, bottomLeftColor); + + float maxValue = max(centerColor.r, bottomColor); + maxValue = max(maxValue, bottomRightColor); + maxValue = max(maxValue, rightColor); + maxValue = max(maxValue, topRightColor); + + float finalValue = centerColor.r * step(maxValue, centerColor.r) * multiplier; + finalValue = step(threshold, finalValue); + + gl_FragColor = vec4(finalValue, finalValue, finalValue, 1.0); + // + // gl_FragColor = vec4((centerColor.rgb * step(maxValue, step(threshold, centerColor.r)) * multiplier), 1.0); + } +); +#endif @implementation GPUImageThresholdedNonMaximumSuppressionFilter diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index b908cabf1..c4176d584 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -109,6 +109,15 @@ #import #import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import // Outputs #import From 2c20e3af9d5a2bdaa37db2f9128a775dee65f483 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 17 May 2013 12:41:51 -0500 Subject: [PATCH 377/695] Added alpha support to the RGB and polka dot filters. --- framework/Source/GPUImagePolkaDotFilter.m | 8 ++++++-- framework/Source/GPUImageRGBFilter.m | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m index b0933a0c9..a439a0434 100644 --- a/framework/Source/GPUImagePolkaDotFilter.m +++ b/framework/Source/GPUImagePolkaDotFilter.m @@ -21,7 +21,9 @@ void main() highp float distanceFromSamplePoint = distance(adjustedSamplePos, textureCoordinateToUse); lowp float checkForPresenceWithinDot = step(distanceFromSamplePoint, (fractionalWidthOfPixel * 0.5) * dotScaling); - gl_FragColor = vec4(texture2D(inputImageTexture, samplePos ).rgb * checkForPresenceWithinDot, 1.0); + lowp vec4 inputColor = texture2D(inputImageTexture, samplePos); + + gl_FragColor = vec4(inputColor.rgb * checkForPresenceWithinDot, inputColor.a); } ); #else @@ -45,7 +47,9 @@ void main() float distanceFromSamplePoint = distance(adjustedSamplePos, textureCoordinateToUse); float checkForPresenceWithinDot = step(distanceFromSamplePoint, (fractionalWidthOfPixel * 0.5) * dotScaling); - gl_FragColor = vec4(texture2D(inputImageTexture, samplePos ).rgb * checkForPresenceWithinDot, 1.0); + vec4 inputColor = texture2D(inputImageTexture, samplePos); + + gl_FragColor = vec4(inputColor.rgb * checkForPresenceWithinDot, inputColor.a); } ); #endif diff --git a/framework/Source/GPUImageRGBFilter.m b/framework/Source/GPUImageRGBFilter.m index 241641c10..9946554ad 100755 --- a/framework/Source/GPUImageRGBFilter.m +++ b/framework/Source/GPUImageRGBFilter.m @@ -14,7 +14,7 @@ void main() { highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, 1.0); + gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, textureColor.a); } ); #else @@ -31,7 +31,7 @@ void main() { vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, 1.0); + gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, textureColor.a); } ); #endif From 9f97b61c697093ee935c02ed7019e091fc1f500c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 17 May 2013 15:36:32 -0500 Subject: [PATCH 378/695] Ported the buffer-based filters to the Mac, although I need to fix the motion detector display. --- .../SLSFilterShowcaseWindowController.h | 6 ++- .../SLSFilterShowcaseWindowController.m | 39 +++++++++++++++++++ .../GPUImageMac.xcodeproj/project.pbxproj | 32 +++++++++++++++ framework/Source/GPUImageMotionDetector.m | 24 ++++++++++++ framework/Source/Mac/GPUImage.h | 4 ++ 5 files changed, 104 insertions(+), 1 deletion(-) diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index 0df305bac..abefa6683 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -48,7 +48,11 @@ typedef enum { GPUIMAGE_HARRISCORNERDETECTION, GPUIMAGE_NOBLECORNERDETECTION, GPUIMAGE_SHITOMASIFEATUREDETECTION, - GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR, + GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR, + GPUIMAGE_BUFFER, + GPUIMAGE_LOWPASS, + GPUIMAGE_HIGHPASS, + GPUIMAGE_MOTIONDETECTOR, GPUIMAGE_SKETCH, GPUIMAGE_TOON, GPUIMAGE_CONVOLUTION, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 60a30b76e..6bde7a307 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -359,6 +359,38 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 0.6; self.enableSlider = YES; }; break; + case GPUIMAGE_BUFFER: + { + currentlySelectedFilter = [[GPUImageBuffer alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_LOWPASS: + { + currentlySelectedFilter = [[GPUImageLowPassFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_HIGHPASS: + { + currentlySelectedFilter = [[GPUImageHighPassFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_MOTIONDETECTOR: + { + currentlySelectedFilter = [[GPUImageMotionDetector alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; case GPUIMAGE_GRAYSCALE: { currentlySelectedFilter = [[GPUImageGrayscaleFilter alloc] init]; @@ -939,6 +971,9 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_NOBLECORNERDETECTION: [(GPUImageNobleCornerDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: [(GPUImageShiTomasiFeatureDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: [(GPUImageHoughTransformLineDetector *)currentlySelectedFilter setLineDetectionThreshold:_currentSliderValue]; break; + case GPUIMAGE_LOWPASS: [(GPUImageLowPassFilter *)currentlySelectedFilter setFilterStrength:_currentSliderValue]; break; + case GPUIMAGE_HIGHPASS: [(GPUImageHighPassFilter *)currentlySelectedFilter setFilterStrength:_currentSliderValue]; break; + case GPUIMAGE_MOTIONDETECTOR: [(GPUImageMotionDetector *)currentlySelectedFilter setLowPassFilterStrength:_currentSliderValue]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)currentlySelectedFilter setSharpness:_currentSliderValue]; break; @@ -1013,6 +1048,10 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_NOBLECORNERDETECTION: tableRowTitle = @"Noble corner detector"; break; case GPUIMAGE_SHITOMASIFEATUREDETECTION: tableRowTitle = @"Shi-Tomasi feature detector"; break; case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: tableRowTitle = @"Hough transform line detector"; break; + case GPUIMAGE_BUFFER: tableRowTitle = @"Image buffer"; break; + case GPUIMAGE_LOWPASS: tableRowTitle = @"Low pass"; break; + case GPUIMAGE_HIGHPASS: tableRowTitle = @"High pass"; break; + case GPUIMAGE_MOTIONDETECTOR: tableRowTitle = @"Motion detector"; break; case GPUIMAGE_XYGRADIENT: tableRowTitle = @"X-Y gradient"; break; case GPUIMAGE_SKETCH: tableRowTitle = @"Sketch"; break; case GPUIMAGE_TOON: tableRowTitle = @"Toon"; break; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index f86d230c7..35cce055a 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -23,6 +23,14 @@ BC78B713172DCCB800342C6A /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */; }; BC78B714172DCCB800342C6A /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC78B715172DCCB800342C6A /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */; }; + BCA20B571746C9EC0097C84A /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B4F1746C9EC0097C84A /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B581746C9EC0097C84A /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B501746C9EC0097C84A /* GPUImageBuffer.m */; }; + BCA20B591746C9EC0097C84A /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B511746C9EC0097C84A /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B5A1746C9EC0097C84A /* GPUImageHighPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B521746C9EC0097C84A /* GPUImageHighPassFilter.m */; }; + BCA20B5B1746C9EC0097C84A /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B531746C9EC0097C84A /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B5C1746C9EC0097C84A /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B541746C9EC0097C84A /* GPUImageLowPassFilter.m */; }; + BCA20B5D1746C9EC0097C84A /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B551746C9EC0097C84A /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B5E1746C9EC0097C84A /* GPUImageMotionDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B561746C9EC0097C84A /* GPUImageMotionDetector.m */; }; BCA3F32017239B6500E28AEC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F31F17239B6500E28AEC /* Cocoa.framework */; }; BCA3F3621723A8FA00E28AEC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3601723A8FA00E28AEC /* OpenGL.framework */; }; BCA3F3631723A8FA00E28AEC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */; }; @@ -264,6 +272,14 @@ BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMissEtikateFilter.m; path = Source/GPUImageMissEtikateFilter.m; sourceTree = SOURCE_ROOT; }; BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSoftEleganceFilter.h; path = Source/GPUImageSoftEleganceFilter.h; sourceTree = SOURCE_ROOT; }; BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftEleganceFilter.m; path = Source/GPUImageSoftEleganceFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B4F1746C9EC0097C84A /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; + BCA20B501746C9EC0097C84A /* GPUImageBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBuffer.m; path = Source/GPUImageBuffer.m; sourceTree = SOURCE_ROOT; }; + BCA20B511746C9EC0097C84A /* GPUImageHighPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHighPassFilter.h; path = Source/GPUImageHighPassFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B521746C9EC0097C84A /* GPUImageHighPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHighPassFilter.m; path = Source/GPUImageHighPassFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B531746C9EC0097C84A /* GPUImageLowPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLowPassFilter.h; path = Source/GPUImageLowPassFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B541746C9EC0097C84A /* GPUImageLowPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLowPassFilter.m; path = Source/GPUImageLowPassFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B551746C9EC0097C84A /* GPUImageMotionDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMotionDetector.h; path = Source/GPUImageMotionDetector.h; sourceTree = SOURCE_ROOT; }; + BCA20B561746C9EC0097C84A /* GPUImageMotionDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMotionDetector.m; path = Source/GPUImageMotionDetector.m; sourceTree = SOURCE_ROOT; }; BCA3F31C17239B6500E28AEC /* GPUImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GPUImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BCA3F31F17239B6500E28AEC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; BCA3F32217239B6500E28AEC /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -769,6 +785,14 @@ BC569579174683620081491B /* GPUImageLineGenerator.m */, BCE2EF9A17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.h */, BCE2EF9B17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.m */, + BCA20B4F1746C9EC0097C84A /* GPUImageBuffer.h */, + BCA20B501746C9EC0097C84A /* GPUImageBuffer.m */, + BCA20B511746C9EC0097C84A /* GPUImageHighPassFilter.h */, + BCA20B521746C9EC0097C84A /* GPUImageHighPassFilter.m */, + BCA20B531746C9EC0097C84A /* GPUImageLowPassFilter.h */, + BCA20B541746C9EC0097C84A /* GPUImageLowPassFilter.m */, + BCA20B551746C9EC0097C84A /* GPUImageMotionDetector.h */, + BCA20B561746C9EC0097C84A /* GPUImageMotionDetector.m */, BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */, BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */, BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */, @@ -980,6 +1004,10 @@ BCE2EF9C17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */, BC56957A174683620081491B /* GPUImageCrosshairGenerator.h in Headers */, BC56957C174683620081491B /* GPUImageLineGenerator.h in Headers */, + BCA20B571746C9EC0097C84A /* GPUImageBuffer.h in Headers */, + BCA20B591746C9EC0097C84A /* GPUImageHighPassFilter.h in Headers */, + BCA20B5B1746C9EC0097C84A /* GPUImageLowPassFilter.h in Headers */, + BCA20B5D1746C9EC0097C84A /* GPUImageMotionDetector.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1161,6 +1189,10 @@ BCE2EF9D17459E5100C0628C /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */, BC56957B174683620081491B /* GPUImageCrosshairGenerator.m in Sources */, BC56957D174683620081491B /* GPUImageLineGenerator.m in Sources */, + BCA20B581746C9EC0097C84A /* GPUImageBuffer.m in Sources */, + BCA20B5A1746C9EC0097C84A /* GPUImageHighPassFilter.m in Sources */, + BCA20B5C1746C9EC0097C84A /* GPUImageLowPassFilter.m in Sources */, + BCA20B5E1746C9EC0097C84A /* GPUImageMotionDetector.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageMotionDetector.m b/framework/Source/GPUImageMotionDetector.m index 1102f2667..0e204ad7b 100644 --- a/framework/Source/GPUImageMotionDetector.m +++ b/framework/Source/GPUImageMotionDetector.m @@ -1,5 +1,6 @@ #import "GPUImageMotionDetector.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageMotionComparisonFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -21,6 +22,29 @@ void main() gl_FragColor = movementThreshold * vec4(textureCoordinate2.x, textureCoordinate2.y, 1.0, 1.0); } ); +#else +NSString *const kGPUImageMotionComparisonFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform float intensity; + + void main() + { + vec3 currentImageColor = texture2D(inputImageTexture, textureCoordinate).rgb; + vec3 lowPassImageColor = texture2D(inputImageTexture2, textureCoordinate2).rgb; + + float colorDistance = distance(currentImageColor, lowPassImageColor); // * 0.57735 + float movementThreshold = step(0.2, colorDistance); + + gl_FragColor = movementThreshold * vec4(textureCoordinate2.x, textureCoordinate2.y, 1.0, 1.0); + } +); +#endif @implementation GPUImageMotionDetector diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index c4176d584..2a6d82ec9 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -118,6 +118,10 @@ #import #import #import +#import +#import +#import +#import // Outputs #import From 1ac93ebe823e29702449236a1d7219ffa0253065 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 17 May 2013 22:50:32 -0500 Subject: [PATCH 379/695] Ported the remaining filters to the Mac. Dramatically improved quality of the Gaussian blur by fixing an idiotic swap of texel offsets that I had in there for most of a year. --- .../FilterShowcase.xcodeproj/project.pbxproj | 8 + .../SLSFilterShowcaseWindowController.h | 22 ++ .../SLSFilterShowcaseWindowController.m | 283 +++++++++++++++++- .../GPUImageMac.xcodeproj/project.pbxproj | 216 +++++++++++++ .../Source/GPUImageBulgeDistortionFilter.m | 39 ++- .../Source/GPUImageCGAColorspaceFilter.m | 50 +++- framework/Source/GPUImageChromaKeyFilter.m | 31 +- framework/Source/GPUImageDilationFilter.m | 230 ++++++++++---- framework/Source/GPUImageErosionFilter.m | 126 +++++++- framework/Source/GPUImageGaussianBlurFilter.m | 2 +- .../GPUImageGaussianBlurPositionFilter.m | 2 +- framework/Source/GPUImageGlassSphereFilter.m | 47 ++- framework/Source/GPUImageJFAVoronoiFilter.m | 139 ++++++++- .../Source/GPUImageKuwaharaRadius3Filter.m | 263 +++++++++++++++- .../Source/GPUImageLocalBinaryPatternFilter.m | 46 +++ framework/Source/GPUImageMosaicFilter.m | 51 +++- framework/Source/GPUImagePerlinNoiseFilter.m | 94 +++++- .../Source/GPUImagePinchDistortionFilter.m | 37 ++- framework/Source/GPUImagePosterizeFilter.m | 17 ++ framework/Source/GPUImageRGBDilationFilter.m | 122 +++++++- framework/Source/GPUImageRGBErosionFilter.m | 122 +++++++- .../Source/GPUImageSphereRefractionFilter.m | 30 ++ .../Source/GPUImageStretchDistortionFilter.m | 32 +- framework/Source/GPUImageSwirlFilter.m | 32 +- .../Source/GPUImageThresholdSketchFilter.m | 45 ++- framework/Source/GPUImageTiltShiftFilter.m | 26 ++ framework/Source/GPUImageVignetteFilter.m | 21 ++ .../Source/GPUImageVoronoiConsumerFilter.m | 28 +- framework/Source/Mac/GPUImage.h | 27 ++ framework/Source/Mac/GPUImageContext.h | 2 +- 30 files changed, 2095 insertions(+), 95 deletions(-) diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 32f759c8b..680a2878b 100644 --- a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ BC78B703172DCC7F00342C6A /* lookup_miss_etikate.png in Resources */ = {isa = PBXBuildFile; fileRef = BC78B6FF172DCC7F00342C6A /* lookup_miss_etikate.png */; }; BC78B704172DCC7F00342C6A /* lookup_soft_elegance_1.png in Resources */ = {isa = PBXBuildFile; fileRef = BC78B700172DCC7F00342C6A /* lookup_soft_elegance_1.png */; }; BC78B705172DCC7F00342C6A /* lookup_soft_elegance_2.png in Resources */ = {isa = PBXBuildFile; fileRef = BC78B701172DCC7F00342C6A /* lookup_soft_elegance_2.png */; }; + BCA20BCD17471F5C0097C84A /* squares.png in Resources */ = {isa = PBXBuildFile; fileRef = BCA20BCB17471F5C0097C84A /* squares.png */; }; + BCA20BCE17471F5C0097C84A /* voroni_points2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCA20BCC17471F5C0097C84A /* voroni_points2.png */; }; BCB00A4C172B17F400DB804C /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BCF8678F17263F3500912E34 /* GPUImage.framework */; }; BCF8676E17263EAC00912E34 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8676D17263EAC00912E34 /* Cocoa.framework */; }; BCF8677817263EAC00912E34 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF8677617263EAC00912E34 /* InfoPlist.strings */; }; @@ -62,6 +64,8 @@ BC78B6FF172DCC7F00342C6A /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; BC78B700172DCC7F00342C6A /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; BC78B701172DCC7F00342C6A /* lookup_soft_elegance_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_2.png; path = ../../../../framework/Resources/lookup_soft_elegance_2.png; sourceTree = ""; }; + BCA20BCB17471F5C0097C84A /* squares.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = squares.png; path = ../../../iOS/FilterShowcase/FilterShowcase/squares.png; sourceTree = ""; }; + BCA20BCC17471F5C0097C84A /* voroni_points2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = voroni_points2.png; path = ../../../iOS/FilterShowcase/FilterShowcase/voroni_points2.png; sourceTree = ""; }; BCF8676A17263EAC00912E34 /* FilterShowcase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FilterShowcase.app; sourceTree = BUILT_PRODUCTS_DIR; }; BCF8676D17263EAC00912E34 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; BCF8677017263EAC00912E34 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -156,6 +160,8 @@ BCF8677417263EAC00912E34 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCA20BCB17471F5C0097C84A /* squares.png */, + BCA20BCC17471F5C0097C84A /* voroni_points2.png */, BC78B6FE172DCC7F00342C6A /* lookup_amatorka.png */, BC78B6FF172DCC7F00342C6A /* lookup_miss_etikate.png */, BC78B700172DCC7F00342C6A /* lookup_soft_elegance_1.png */, @@ -259,6 +265,8 @@ BC78B703172DCC7F00342C6A /* lookup_miss_etikate.png in Resources */, BC78B704172DCC7F00342C6A /* lookup_soft_elegance_1.png in Resources */, BC78B705172DCC7F00342C6A /* lookup_soft_elegance_2.png in Resources */, + BCA20BCD17471F5C0097C84A /* squares.png in Resources */, + BCA20BCE17471F5C0097C84A /* voroni_points2.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index abefa6683..64991abf0 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -54,11 +54,19 @@ typedef enum { GPUIMAGE_HIGHPASS, GPUIMAGE_MOTIONDETECTOR, GPUIMAGE_SKETCH, + GPUIMAGE_THRESHOLDSKETCH, GPUIMAGE_TOON, + GPUIMAGE_SMOOTHTOON, + GPUIMAGE_TILTSHIFT, + GPUIMAGE_CGA, + GPUIMAGE_POSTERIZE, GPUIMAGE_CONVOLUTION, GPUIMAGE_EMBOSS, GPUIMAGE_LAPLACIAN, + GPUIMAGE_CHROMAKEYNONBLEND, GPUIMAGE_KUWAHARA, + GPUIMAGE_KUWAHARARADIUS3, + GPUIMAGE_VIGNETTE, GPUIMAGE_GAUSSIAN, GPUIMAGE_GAUSSIAN_SELECTIVE, GPUIMAGE_GAUSSIAN_POSITION, @@ -68,7 +76,21 @@ typedef enum { GPUIMAGE_BILATERAL, GPUIMAGE_MOTIONBLUR, GPUIMAGE_ZOOMBLUR, + GPUIMAGE_SWIRL, + GPUIMAGE_BULGE, + GPUIMAGE_PINCH, + GPUIMAGE_SPHEREREFRACTION, + GPUIMAGE_GLASSSPHERE, + GPUIMAGE_STRETCH, + GPUIMAGE_DILATION, + GPUIMAGE_EROSION, + GPUIMAGE_OPENING, + GPUIMAGE_CLOSING, GPUIMAGE_DISSOLVE, + GPUIMAGE_PERLINNOISE, + GPUIMAGE_VORONOI, + GPUIMAGE_MOSAIC, + GPUIMAGE_LOCALBINARYPATTERN, GPUIMAGE_CHROMAKEY, GPUIMAGE_ADD, GPUIMAGE_DIVIDE, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 6bde7a307..88d9ae2f5 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -488,6 +488,14 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; currentlySelectedFilter = [[GPUImageSketchFilter alloc] init]; self.enableSlider = NO; }; break; + case GPUIMAGE_THRESHOLDSKETCH: + { + currentlySelectedFilter = [[GPUImageThresholdSketchFilter alloc] init]; + self.minimumSliderValue = 0.9; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.9; + self.enableSlider = YES; + }; break; case GPUIMAGE_TOON: { currentlySelectedFilter = [[GPUImageToonFilter alloc] init]; @@ -505,6 +513,39 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.enableSlider = NO; }; break; + case GPUIMAGE_SMOOTHTOON: + { + currentlySelectedFilter = [[GPUImageSmoothToonFilter alloc] init]; + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_TILTSHIFT: + { + currentlySelectedFilter = [[GPUImageTiltShiftFilter alloc] init]; + [(GPUImageTiltShiftFilter *)currentlySelectedFilter setTopFocusLevel:0.4]; + [(GPUImageTiltShiftFilter *)currentlySelectedFilter setBottomFocusLevel:0.6]; + [(GPUImageTiltShiftFilter *)currentlySelectedFilter setFocusFallOffRate:0.2]; + + self.minimumSliderValue = 0.2; + self.maximumSliderValue = 0.8; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_CGA: + { + currentlySelectedFilter = [[GPUImageCGAColorspaceFilter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_POSTERIZE: + { + currentlySelectedFilter = [[GPUImagePosterizeFilter alloc] init]; + self.minimumSliderValue = 1.0; + self.maximumSliderValue = 20.0; + self.currentSliderValue = 10.0; + self.enableSlider = YES; + }; break; case GPUIMAGE_EMBOSS: { currentlySelectedFilter = [[GPUImageEmbossFilter alloc] init]; @@ -518,6 +559,18 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; currentlySelectedFilter = [[GPUImageLaplacianFilter alloc] init]; self.enableSlider = NO; }; break; + case GPUIMAGE_CHROMAKEYNONBLEND: + { + currentlySelectedFilter = [[GPUImageChromaKeyFilter alloc] init]; + [(GPUImageChromaKeyFilter *)currentlySelectedFilter setColorToReplaceRed:0.0 green:1.0 blue:0.0]; + + needsSecondImage = YES; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.4; + self.enableSlider = YES; + }; break; case GPUIMAGE_KUWAHARA: { currentlySelectedFilter = [[GPUImageKuwaharaFilter alloc] init]; @@ -527,6 +580,19 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 3.0; self.enableSlider = YES; }; break; + case GPUIMAGE_KUWAHARARADIUS3: + { + currentlySelectedFilter = [[GPUImageKuwaharaRadius3Filter alloc] init]; + self.enableSlider = NO; + }; break; + case GPUIMAGE_VIGNETTE: + { + currentlySelectedFilter = [[GPUImageVignetteFilter alloc] init]; + self.minimumSliderValue = 0.5; + self.maximumSliderValue = 0.9; + self.currentSliderValue = 0.75; + self.enableSlider = YES; + }; break; case GPUIMAGE_GAUSSIAN: { currentlySelectedFilter = [[GPUImageGaussianBlurFilter alloc] init]; @@ -604,6 +670,135 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 1.0; self.enableSlider = YES; }; break; + case GPUIMAGE_SWIRL: + { + currentlySelectedFilter = [[GPUImageSwirlFilter alloc] init]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 2.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_BULGE: + { + currentlySelectedFilter = [[GPUImageBulgeDistortionFilter alloc] init]; + + self.minimumSliderValue = -1.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_PINCH: + { + currentlySelectedFilter = [[GPUImagePinchDistortionFilter alloc] init]; + + self.minimumSliderValue = -2.0; + self.maximumSliderValue = 2.0; + self.currentSliderValue = 0.5; + self.enableSlider = YES; + }; break; + case GPUIMAGE_SPHEREREFRACTION: + { + currentlySelectedFilter = [[GPUImageSphereRefractionFilter alloc] init]; + [(GPUImageSphereRefractionFilter *)currentlySelectedFilter setRadius:0.15]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.15; + self.enableSlider = YES; + }; break; + case GPUIMAGE_GLASSSPHERE: + { + currentlySelectedFilter = [[GPUImageGlassSphereFilter alloc] init]; + [(GPUImageGlassSphereFilter *)currentlySelectedFilter setRadius:0.15]; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 1.0; + self.currentSliderValue = 0.15; + self.enableSlider = YES; + }; break; + case GPUIMAGE_STRETCH: + { + currentlySelectedFilter = [[GPUImageStretchDistortionFilter alloc] init]; + + self.enableSlider = NO; + }; break; + case GPUIMAGE_DILATION: + { + currentlySelectedFilter = [[GPUImageRGBDilationFilter alloc] init]; + + self.enableSlider = NO; + }; break; + case GPUIMAGE_EROSION: + { + currentlySelectedFilter = [[GPUImageRGBErosionFilter alloc] init]; + + self.enableSlider = NO; + }; break; + case GPUIMAGE_OPENING: + { + currentlySelectedFilter = [[GPUImageRGBOpeningFilter alloc] init]; + + self.enableSlider = NO; + }; break; + case GPUIMAGE_CLOSING: + { + currentlySelectedFilter = [[GPUImageRGBClosingFilter alloc] init]; + + self.enableSlider = NO; + }; break; + case GPUIMAGE_PERLINNOISE: + { + currentlySelectedFilter = [[GPUImagePerlinNoiseFilter alloc] init]; + + self.minimumSliderValue = 1.0; + self.maximumSliderValue = 30.0; + self.currentSliderValue = 8.0; + self.enableSlider = YES; + }; break; + case GPUIMAGE_VORONOI: + { + self.enableSlider = NO; + + GPUImageJFAVoronoiFilter *jfa = [[GPUImageJFAVoronoiFilter alloc] init]; + [jfa setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; + + NSImage *voronoiPoints = [NSImage imageNamed:@"voroni_points2.png"]; + + imageForBlending = [[GPUImagePicture alloc] initWithImage:voronoiPoints]; + + [imageForBlending addTarget:jfa]; + + currentlySelectedFilter = [[GPUImageVoronoiConsumerFilter alloc] init]; + + [jfa setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; + [(GPUImageVoronoiConsumerFilter *)currentlySelectedFilter setSizeInPixels:CGSizeMake(1024.0, 1024.0)]; + + [inputCamera addTarget:currentlySelectedFilter]; + [jfa addTarget:currentlySelectedFilter]; + [imageForBlending processImage]; + }; break; + case GPUIMAGE_MOSAIC: + { + currentlySelectedFilter = [[GPUImageMosaicFilter alloc] init]; + [(GPUImageMosaicFilter *)currentlySelectedFilter setTileSet:@"squares.png"]; + [(GPUImageMosaicFilter *)currentlySelectedFilter setColorOn:NO]; +// [currentlySelectedFilter setInputRotation:kGPUImageRotateRight atIndex:0]; + + self.minimumSliderValue = 0.002; + self.maximumSliderValue = 0.05; + self.currentSliderValue = 0.025; + self.enableSlider = YES; + }; break; + case GPUIMAGE_LOCALBINARYPATTERN: + { + currentlySelectedFilter = [[GPUImageLocalBinaryPatternFilter alloc] init]; + + self.minimumSliderValue = 1.0; + self.maximumSliderValue = 5.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; + }; break; case GPUIMAGE_DISSOLVE: { currentlySelectedFilter = [[GPUImageDissolveBlendFilter alloc] init]; @@ -787,7 +982,11 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; }; break; } - [inputCamera addTarget:currentlySelectedFilter]; + if (currentlySelectedRow != GPUIMAGE_VORONOI) + { + [inputCamera addTarget:currentlySelectedFilter]; + } + [currentlySelectedFilter addTarget:self.glView]; if (needsSecondImage) @@ -815,8 +1014,7 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; [imageForBlending addTarget:currentlySelectedFilter]; } - // if ( (filterType == GPUIMAGE_OPACITY) || (filterType == GPUIMAGE_CHROMAKEYNONBLEND) ) - if (currentlySelectedRow == GPUIMAGE_OPACITY) + if ( (currentlySelectedRow == GPUIMAGE_OPACITY) || (currentlySelectedRow == GPUIMAGE_CHROMAKEYNONBLEND) ) { [currentlySelectedFilter removeTarget:self.glView]; @@ -831,6 +1029,23 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; [blendFilter addTarget:self.glView]; } + else if (currentlySelectedRow == GPUIMAGE_BUFFER) + { + [currentlySelectedFilter removeTarget:self.glView]; + + GPUImageDifferenceBlendFilter *blendFilter = [[GPUImageDifferenceBlendFilter alloc] init]; + + [inputCamera removeTarget:currentlySelectedFilter]; + + GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; + [inputCamera addTarget:gammaFilter]; + [gammaFilter addTarget:blendFilter]; + [inputCamera addTarget:currentlySelectedFilter]; + + [currentlySelectedFilter addTarget:blendFilter]; + + [blendFilter addTarget:self.glView]; + } else if (currentlySelectedRow == GPUIMAGE_HISTOGRAM) { [currentlySelectedFilter removeTarget:self.glView]; @@ -855,6 +1070,22 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; [blendFilter addTarget:self.glView]; } + else if ( (currentlySelectedRow == GPUIMAGE_SPHEREREFRACTION) || (currentlySelectedRow == GPUIMAGE_GLASSSPHERE) ) + { + [currentlySelectedFilter removeTarget:self.glView]; + + // Provide a blurred image for a cool-looking background + GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; + [inputCamera addTarget:gaussianBlur]; + gaussianBlur.blurSize = 2.0; + + GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; + blendFilter.mix = 1.0; + [gaussianBlur addTarget:blendFilter]; + [currentlySelectedFilter addTarget:blendFilter]; + + [blendFilter addTarget:self.glView]; + } else if (currentlySelectedRow == GPUIMAGE_AVERAGECOLOR) { [currentlySelectedFilter removeTarget:self.glView]; @@ -974,8 +1205,19 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_LOWPASS: [(GPUImageLowPassFilter *)currentlySelectedFilter setFilterStrength:_currentSliderValue]; break; case GPUIMAGE_HIGHPASS: [(GPUImageHighPassFilter *)currentlySelectedFilter setFilterStrength:_currentSliderValue]; break; case GPUIMAGE_MOTIONDETECTOR: [(GPUImageMotionDetector *)currentlySelectedFilter setLowPassFilterStrength:_currentSliderValue]; break; + case GPUIMAGE_THRESHOLDSKETCH: [(GPUImageThresholdSketchFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; + case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_POSTERIZE: [(GPUImagePosterizeFilter *)currentlySelectedFilter setColorLevels:round(_currentSliderValue)]; break; + case GPUIMAGE_TILTSHIFT: + { + CGFloat midpoint = _currentSliderValue; + [(GPUImageTiltShiftFilter *)currentlySelectedFilter setTopFocusLevel:midpoint - 0.1]; + [(GPUImageTiltShiftFilter *)currentlySelectedFilter setBottomFocusLevel:midpoint + 0.1]; + }; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; + case GPUIMAGE_CHROMAKEYNONBLEND: [(GPUImageChromaKeyFilter *)currentlySelectedFilter setThresholdSensitivity:_currentSliderValue]; break; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)currentlySelectedFilter setRadius:round(_currentSliderValue)]; break; + case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)currentlySelectedFilter setVignetteEnd:_currentSliderValue]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)currentlySelectedFilter setSharpness:_currentSliderValue]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)currentlySelectedFilter setIntensity:_currentSliderValue]; break; case GPUIMAGE_TRANSFORM: [(GPUImageTransformFilter *)currentlySelectedFilter setAffineTransform:CGAffineTransformMakeRotation(_currentSliderValue)]; break; @@ -997,6 +1239,19 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)currentlySelectedFilter setDistanceNormalizationFactor:_currentSliderValue]; break; case GPUIMAGE_MOTIONBLUR: [(GPUImageMotionBlurFilter *)currentlySelectedFilter setBlurAngle:_currentSliderValue]; break; case GPUIMAGE_ZOOMBLUR: [(GPUImageZoomBlurFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)currentlySelectedFilter setAngle:_currentSliderValue]; break; + case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)currentlySelectedFilter setScale:_currentSliderValue]; break; + case GPUIMAGE_PINCH: [(GPUImagePinchDistortionFilter *)currentlySelectedFilter setScale:_currentSliderValue]; break; + case GPUIMAGE_SPHEREREFRACTION: [(GPUImageSphereRefractionFilter *)currentlySelectedFilter setRadius:_currentSliderValue]; break; + case GPUIMAGE_GLASSSPHERE: [(GPUImageGlassSphereFilter *)currentlySelectedFilter setRadius:_currentSliderValue]; break; + case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)currentlySelectedFilter setScale:_currentSliderValue]; break; + case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)currentlySelectedFilter setDisplayTileSize:CGSizeMake(_currentSliderValue, _currentSliderValue)]; break; + case GPUIMAGE_LOCALBINARYPATTERN: + { + CGFloat multiplier = _currentSliderValue; + [(GPUImageLocalBinaryPatternFilter *)currentlySelectedFilter setTexelWidth:(multiplier / self.glView.bounds.size.width)]; + [(GPUImageLocalBinaryPatternFilter *)currentlySelectedFilter setTexelHeight:(multiplier / self.glView.bounds.size.height)]; + }; break; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)currentlySelectedFilter setMix:_currentSliderValue]; break; case GPUIMAGE_CHROMAKEY: [(GPUImageChromaKeyBlendFilter *)currentlySelectedFilter setThresholdSensitivity:_currentSliderValue]; break; case GPUIMAGE_POISSONBLEND: [(GPUImagePoissonBlendFilter *)currentlySelectedFilter setMix:_currentSliderValue]; break; @@ -1054,11 +1309,19 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_MOTIONDETECTOR: tableRowTitle = @"Motion detector"; break; case GPUIMAGE_XYGRADIENT: tableRowTitle = @"X-Y gradient"; break; case GPUIMAGE_SKETCH: tableRowTitle = @"Sketch"; break; + case GPUIMAGE_THRESHOLDSKETCH: tableRowTitle = @"Threshold sketch"; break; case GPUIMAGE_TOON: tableRowTitle = @"Toon"; break; + case GPUIMAGE_SMOOTHTOON: tableRowTitle = @"Smooth toon"; break; + case GPUIMAGE_TILTSHIFT: tableRowTitle = @"Tilt shift"; break; + case GPUIMAGE_CGA: tableRowTitle = @"CGA colorspace"; break; + case GPUIMAGE_POSTERIZE: tableRowTitle = @"Posterize"; break; case GPUIMAGE_CONVOLUTION: tableRowTitle = @"3x3 convolution"; break; case GPUIMAGE_EMBOSS: tableRowTitle = @"Emboss"; break; case GPUIMAGE_LAPLACIAN: tableRowTitle = @"Laplacian (3x3)"; break; + case GPUIMAGE_CHROMAKEYNONBLEND: tableRowTitle = @"Chroma key"; break; case GPUIMAGE_KUWAHARA: tableRowTitle = @"Kuwahara"; break; + case GPUIMAGE_KUWAHARARADIUS3: tableRowTitle = @"Kuwahara (radius 3)"; break; + case GPUIMAGE_VIGNETTE: tableRowTitle = @"Vignette"; break; case GPUIMAGE_FALSECOLOR: tableRowTitle = @"False color"; break; case GPUIMAGE_SHARPEN: tableRowTitle = @"Sharpen"; break; case GPUIMAGE_UNSHARPMASK: tableRowTitle = @"Unsharp mask"; break; @@ -1084,6 +1347,20 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_BILATERAL: tableRowTitle = @"Bilateral blur"; break; case GPUIMAGE_MOTIONBLUR: tableRowTitle = @"Motion blur"; break; case GPUIMAGE_ZOOMBLUR: tableRowTitle = @"Zoom blur"; break; + case GPUIMAGE_SWIRL: tableRowTitle = @"Swirl"; break; + case GPUIMAGE_BULGE: tableRowTitle = @"Bulge"; break; + case GPUIMAGE_PINCH: tableRowTitle = @"Pinch"; break; + case GPUIMAGE_SPHEREREFRACTION: tableRowTitle = @"Sphere refraction"; break; + case GPUIMAGE_GLASSSPHERE: tableRowTitle = @"Glass sphere"; break; + case GPUIMAGE_STRETCH: tableRowTitle = @"Stretch"; break; + case GPUIMAGE_DILATION: tableRowTitle = @"Dilation"; break; + case GPUIMAGE_EROSION: tableRowTitle = @"Erosion"; break; + case GPUIMAGE_OPENING: tableRowTitle = @"Opening"; break; + case GPUIMAGE_CLOSING: tableRowTitle = @"Closing"; break; + case GPUIMAGE_PERLINNOISE: tableRowTitle = @"Perlin noise"; break; + case GPUIMAGE_VORONOI: tableRowTitle = @"Voronoi"; break; + case GPUIMAGE_MOSAIC: tableRowTitle = @"Mosaic"; break; + case GPUIMAGE_LOCALBINARYPATTERN: tableRowTitle = @"Local binary pattern"; break; case GPUIMAGE_DISSOLVE: tableRowTitle = @"Dissolve blend"; break; case GPUIMAGE_CHROMAKEY: tableRowTitle = @"Chroma key blend (green)"; break; case GPUIMAGE_ADD: tableRowTitle = @"Add blend"; break; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 35cce055a..a24850b63 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -31,6 +31,60 @@ BCA20B5C1746C9EC0097C84A /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B541746C9EC0097C84A /* GPUImageLowPassFilter.m */; }; BCA20B5D1746C9EC0097C84A /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B551746C9EC0097C84A /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA20B5E1746C9EC0097C84A /* GPUImageMotionDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B561746C9EC0097C84A /* GPUImageMotionDetector.m */; }; + BCA20B611746CFE60097C84A /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B5F1746CFE60097C84A /* GPUImageThresholdSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B621746CFE60097C84A /* GPUImageThresholdSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B601746CFE60097C84A /* GPUImageThresholdSketchFilter.m */; }; + BCA20B651746D3C30097C84A /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B631746D3C30097C84A /* GPUImageSmoothToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B661746D3C30097C84A /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B641746D3C30097C84A /* GPUImageSmoothToonFilter.m */; }; + BCA20B691746D3DD0097C84A /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B671746D3DC0097C84A /* GPUImageTiltShiftFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B6A1746D3DD0097C84A /* GPUImageTiltShiftFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B681746D3DC0097C84A /* GPUImageTiltShiftFilter.m */; }; + BCA20B6D1746D44B0097C84A /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B6B1746D44A0097C84A /* GPUImageCGAColorspaceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B6E1746D44B0097C84A /* GPUImageCGAColorspaceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B6C1746D44A0097C84A /* GPUImageCGAColorspaceFilter.m */; }; + BCA20B711746D4AC0097C84A /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B6F1746D4AC0097C84A /* GPUImagePosterizeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B721746D4AC0097C84A /* GPUImagePosterizeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B701746D4AC0097C84A /* GPUImagePosterizeFilter.m */; }; + BCA20B751746DE850097C84A /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B731746DE850097C84A /* GPUImageKuwaharaRadius3Filter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B761746DE850097C84A /* GPUImageKuwaharaRadius3Filter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B741746DE850097C84A /* GPUImageKuwaharaRadius3Filter.m */; }; + BCA20B791746DEDE0097C84A /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B771746DEDD0097C84A /* GPUImageChromaKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B7A1746DEDE0097C84A /* GPUImageChromaKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B781746DEDE0097C84A /* GPUImageChromaKeyFilter.m */; }; + BCA20B7D1746DF210097C84A /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B7B1746DF200097C84A /* GPUImageVignetteFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B7E1746DF210097C84A /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B7C1746DF200097C84A /* GPUImageVignetteFilter.m */; }; + BCA20B991747081D0097C84A /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B7F1747080E0097C84A /* GPUImageBulgeDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B9A1747081D0097C84A /* GPUImageBulgeDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B801747080F0097C84A /* GPUImageBulgeDistortionFilter.m */; }; + BCA20B9B1747081D0097C84A /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B811747080F0097C84A /* GPUImageClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B9C1747081D0097C84A /* GPUImageClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B82174708100097C84A /* GPUImageClosingFilter.m */; }; + BCA20B9D1747081D0097C84A /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B83174708110097C84A /* GPUImageDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20B9E1747081D0097C84A /* GPUImageDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B84174708120097C84A /* GPUImageDilationFilter.m */; }; + BCA20B9F1747081D0097C84A /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B85174708120097C84A /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BA01747081D0097C84A /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B86174708130097C84A /* GPUImageErosionFilter.m */; }; + BCA20BA11747081D0097C84A /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B87174708140097C84A /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BA21747081D0097C84A /* GPUImageGlassSphereFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B88174708150097C84A /* GPUImageGlassSphereFilter.m */; }; + BCA20BA31747081D0097C84A /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B89174708150097C84A /* GPUImagePinchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BA41747081D0097C84A /* GPUImagePinchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B8A174708150097C84A /* GPUImagePinchDistortionFilter.m */; }; + BCA20BA51747081D0097C84A /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B8B174708160097C84A /* GPUImageRGBClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BA61747081D0097C84A /* GPUImageRGBClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B8C174708160097C84A /* GPUImageRGBClosingFilter.m */; }; + BCA20BA71747081D0097C84A /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B8D174708190097C84A /* GPUImageRGBDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BA81747081D0097C84A /* GPUImageRGBDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B8E174708190097C84A /* GPUImageRGBDilationFilter.m */; }; + BCA20BA91747081D0097C84A /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B8F174708190097C84A /* GPUImageRGBErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BAA1747081D0097C84A /* GPUImageRGBErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B901747081A0097C84A /* GPUImageRGBErosionFilter.m */; }; + BCA20BAB1747081D0097C84A /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B911747081A0097C84A /* GPUImageRGBOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BAC1747081D0097C84A /* GPUImageRGBOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B921747081B0097C84A /* GPUImageRGBOpeningFilter.m */; }; + BCA20BAD1747081D0097C84A /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B931747081B0097C84A /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BAE1747081D0097C84A /* GPUImageSphereRefractionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B941747081B0097C84A /* GPUImageSphereRefractionFilter.m */; }; + BCA20BAF1747081D0097C84A /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B951747081C0097C84A /* GPUImageStretchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BB01747081D0097C84A /* GPUImageStretchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B961747081C0097C84A /* GPUImageStretchDistortionFilter.m */; }; + BCA20BB11747081D0097C84A /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B971747081C0097C84A /* GPUImageSwirlFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BB21747081D0097C84A /* GPUImageSwirlFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B981747081D0097C84A /* GPUImageSwirlFilter.m */; }; + BCA20BB5174708630097C84A /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20BB3174708610097C84A /* GPUImageOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BB6174708630097C84A /* GPUImageOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20BB4174708620097C84A /* GPUImageOpeningFilter.m */; }; + BCA20BC117471C4B0097C84A /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20BB717471C3A0097C84A /* GPUImageJFAVoronoiFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BC217471C4B0097C84A /* GPUImageJFAVoronoiFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20BB817471C3C0097C84A /* GPUImageJFAVoronoiFilter.m */; }; + BCA20BC317471C4B0097C84A /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20BB917471C3D0097C84A /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BC417471C4B0097C84A /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20BBA17471C3F0097C84A /* GPUImageLocalBinaryPatternFilter.m */; }; + BCA20BC517471C4B0097C84A /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20BBB17471C400097C84A /* GPUImageMosaicFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BC617471C4B0097C84A /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20BBC17471C420097C84A /* GPUImageMosaicFilter.m */; }; + BCA20BC717471C4B0097C84A /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20BBD17471C440097C84A /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BC817471C4B0097C84A /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20BBE17471C460097C84A /* GPUImagePerlinNoiseFilter.m */; }; + BCA20BC917471C4B0097C84A /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20BBF17471C480097C84A /* GPUImageVoronoiConsumerFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA20BCA17471C4B0097C84A /* GPUImageVoronoiConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20BC017471C490097C84A /* GPUImageVoronoiConsumerFilter.m */; }; BCA3F32017239B6500E28AEC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F31F17239B6500E28AEC /* Cocoa.framework */; }; BCA3F3621723A8FA00E28AEC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3601723A8FA00E28AEC /* OpenGL.framework */; }; BCA3F3631723A8FA00E28AEC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA3F3611723A8FA00E28AEC /* QuartzCore.framework */; }; @@ -280,6 +334,60 @@ BCA20B541746C9EC0097C84A /* GPUImageLowPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLowPassFilter.m; path = Source/GPUImageLowPassFilter.m; sourceTree = SOURCE_ROOT; }; BCA20B551746C9EC0097C84A /* GPUImageMotionDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMotionDetector.h; path = Source/GPUImageMotionDetector.h; sourceTree = SOURCE_ROOT; }; BCA20B561746C9EC0097C84A /* GPUImageMotionDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMotionDetector.m; path = Source/GPUImageMotionDetector.m; sourceTree = SOURCE_ROOT; }; + BCA20B5F1746CFE60097C84A /* GPUImageThresholdSketchFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageThresholdSketchFilter.h; path = Source/GPUImageThresholdSketchFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B601746CFE60097C84A /* GPUImageThresholdSketchFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdSketchFilter.m; path = Source/GPUImageThresholdSketchFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B631746D3C30097C84A /* GPUImageSmoothToonFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSmoothToonFilter.h; path = Source/GPUImageSmoothToonFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B641746D3C30097C84A /* GPUImageSmoothToonFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSmoothToonFilter.m; path = Source/GPUImageSmoothToonFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B671746D3DC0097C84A /* GPUImageTiltShiftFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTiltShiftFilter.h; path = Source/GPUImageTiltShiftFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B681746D3DC0097C84A /* GPUImageTiltShiftFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTiltShiftFilter.m; path = Source/GPUImageTiltShiftFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B6B1746D44A0097C84A /* GPUImageCGAColorspaceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCGAColorspaceFilter.h; path = Source/GPUImageCGAColorspaceFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B6C1746D44A0097C84A /* GPUImageCGAColorspaceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCGAColorspaceFilter.m; path = Source/GPUImageCGAColorspaceFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B6F1746D4AC0097C84A /* GPUImagePosterizeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePosterizeFilter.h; path = Source/GPUImagePosterizeFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B701746D4AC0097C84A /* GPUImagePosterizeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePosterizeFilter.m; path = Source/GPUImagePosterizeFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B731746DE850097C84A /* GPUImageKuwaharaRadius3Filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageKuwaharaRadius3Filter.h; path = Source/GPUImageKuwaharaRadius3Filter.h; sourceTree = SOURCE_ROOT; }; + BCA20B741746DE850097C84A /* GPUImageKuwaharaRadius3Filter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageKuwaharaRadius3Filter.m; path = Source/GPUImageKuwaharaRadius3Filter.m; sourceTree = SOURCE_ROOT; }; + BCA20B771746DEDD0097C84A /* GPUImageChromaKeyFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageChromaKeyFilter.h; path = Source/GPUImageChromaKeyFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B781746DEDE0097C84A /* GPUImageChromaKeyFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageChromaKeyFilter.m; path = Source/GPUImageChromaKeyFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B7B1746DF200097C84A /* GPUImageVignetteFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVignetteFilter.h; path = Source/GPUImageVignetteFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B7C1746DF200097C84A /* GPUImageVignetteFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVignetteFilter.m; path = Source/GPUImageVignetteFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B7F1747080E0097C84A /* GPUImageBulgeDistortionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBulgeDistortionFilter.h; path = Source/GPUImageBulgeDistortionFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B801747080F0097C84A /* GPUImageBulgeDistortionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBulgeDistortionFilter.m; path = Source/GPUImageBulgeDistortionFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B811747080F0097C84A /* GPUImageClosingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageClosingFilter.h; path = Source/GPUImageClosingFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B82174708100097C84A /* GPUImageClosingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageClosingFilter.m; path = Source/GPUImageClosingFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B83174708110097C84A /* GPUImageDilationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDilationFilter.h; path = Source/GPUImageDilationFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B84174708120097C84A /* GPUImageDilationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDilationFilter.m; path = Source/GPUImageDilationFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B85174708120097C84A /* GPUImageErosionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageErosionFilter.h; path = Source/GPUImageErosionFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B86174708130097C84A /* GPUImageErosionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageErosionFilter.m; path = Source/GPUImageErosionFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B87174708140097C84A /* GPUImageGlassSphereFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGlassSphereFilter.h; path = Source/GPUImageGlassSphereFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B88174708150097C84A /* GPUImageGlassSphereFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGlassSphereFilter.m; path = Source/GPUImageGlassSphereFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B89174708150097C84A /* GPUImagePinchDistortionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePinchDistortionFilter.h; path = Source/GPUImagePinchDistortionFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B8A174708150097C84A /* GPUImagePinchDistortionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePinchDistortionFilter.m; path = Source/GPUImagePinchDistortionFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B8B174708160097C84A /* GPUImageRGBClosingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBClosingFilter.h; path = Source/GPUImageRGBClosingFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B8C174708160097C84A /* GPUImageRGBClosingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBClosingFilter.m; path = Source/GPUImageRGBClosingFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B8D174708190097C84A /* GPUImageRGBDilationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBDilationFilter.h; path = Source/GPUImageRGBDilationFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B8E174708190097C84A /* GPUImageRGBDilationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBDilationFilter.m; path = Source/GPUImageRGBDilationFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B8F174708190097C84A /* GPUImageRGBErosionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBErosionFilter.h; path = Source/GPUImageRGBErosionFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B901747081A0097C84A /* GPUImageRGBErosionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBErosionFilter.m; path = Source/GPUImageRGBErosionFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B911747081A0097C84A /* GPUImageRGBOpeningFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBOpeningFilter.h; path = Source/GPUImageRGBOpeningFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B921747081B0097C84A /* GPUImageRGBOpeningFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBOpeningFilter.m; path = Source/GPUImageRGBOpeningFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B931747081B0097C84A /* GPUImageSphereRefractionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSphereRefractionFilter.h; path = Source/GPUImageSphereRefractionFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B941747081B0097C84A /* GPUImageSphereRefractionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSphereRefractionFilter.m; path = Source/GPUImageSphereRefractionFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B951747081C0097C84A /* GPUImageStretchDistortionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStretchDistortionFilter.h; path = Source/GPUImageStretchDistortionFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B961747081C0097C84A /* GPUImageStretchDistortionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStretchDistortionFilter.m; path = Source/GPUImageStretchDistortionFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20B971747081C0097C84A /* GPUImageSwirlFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSwirlFilter.h; path = Source/GPUImageSwirlFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20B981747081D0097C84A /* GPUImageSwirlFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSwirlFilter.m; path = Source/GPUImageSwirlFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20BB3174708610097C84A /* GPUImageOpeningFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageOpeningFilter.h; path = Source/GPUImageOpeningFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20BB4174708620097C84A /* GPUImageOpeningFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpeningFilter.m; path = Source/GPUImageOpeningFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20BB717471C3A0097C84A /* GPUImageJFAVoronoiFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageJFAVoronoiFilter.h; path = Source/GPUImageJFAVoronoiFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20BB817471C3C0097C84A /* GPUImageJFAVoronoiFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageJFAVoronoiFilter.m; path = Source/GPUImageJFAVoronoiFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20BB917471C3D0097C84A /* GPUImageLocalBinaryPatternFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLocalBinaryPatternFilter.h; path = Source/GPUImageLocalBinaryPatternFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20BBA17471C3F0097C84A /* GPUImageLocalBinaryPatternFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLocalBinaryPatternFilter.m; path = Source/GPUImageLocalBinaryPatternFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20BBB17471C400097C84A /* GPUImageMosaicFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMosaicFilter.h; path = Source/GPUImageMosaicFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20BBC17471C420097C84A /* GPUImageMosaicFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMosaicFilter.m; path = Source/GPUImageMosaicFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20BBD17471C440097C84A /* GPUImagePerlinNoiseFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImagePerlinNoiseFilter.h; path = Source/GPUImagePerlinNoiseFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20BBE17471C460097C84A /* GPUImagePerlinNoiseFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImagePerlinNoiseFilter.m; path = Source/GPUImagePerlinNoiseFilter.m; sourceTree = SOURCE_ROOT; }; + BCA20BBF17471C480097C84A /* GPUImageVoronoiConsumerFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageVoronoiConsumerFilter.h; path = Source/GPUImageVoronoiConsumerFilter.h; sourceTree = SOURCE_ROOT; }; + BCA20BC017471C490097C84A /* GPUImageVoronoiConsumerFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageVoronoiConsumerFilter.m; path = Source/GPUImageVoronoiConsumerFilter.m; sourceTree = SOURCE_ROOT; }; BCA3F31C17239B6500E28AEC /* GPUImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GPUImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BCA3F31F17239B6500E28AEC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; BCA3F32217239B6500E28AEC /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -717,6 +825,8 @@ BCE817B11735FE150071D084 /* GPUImageCrosshatchFilter.m */, BCF8689B1728861E00912E34 /* GPUImageOpacityFilter.h */, BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */, + BCA20B6B1746D44A0097C84A /* GPUImageCGAColorspaceFilter.h */, + BCA20B6C1746D44A0097C84A /* GPUImageCGAColorspaceFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -728,12 +838,62 @@ BCF867C61727872D00912E34 /* GPUImagePixellateFilter.m */, BCF867CD172789B200912E34 /* GPUImageSketchFilter.h */, BCF867CE172789B200912E34 /* GPUImageSketchFilter.m */, + BCA20B5F1746CFE60097C84A /* GPUImageThresholdSketchFilter.h */, + BCA20B601746CFE60097C84A /* GPUImageThresholdSketchFilter.m */, BCF867D617278A7900912E34 /* GPUImageToonFilter.h */, BCF867D717278A7900912E34 /* GPUImageToonFilter.m */, + BCA20B631746D3C30097C84A /* GPUImageSmoothToonFilter.h */, + BCA20B641746D3C30097C84A /* GPUImageSmoothToonFilter.m */, + BCA20B671746D3DC0097C84A /* GPUImageTiltShiftFilter.h */, + BCA20B681746D3DC0097C84A /* GPUImageTiltShiftFilter.m */, BCBF69331730623200E5792A /* GPUImageEmbossFilter.h */, BCBF69341730623200E5792A /* GPUImageEmbossFilter.m */, + BCA20B771746DEDD0097C84A /* GPUImageChromaKeyFilter.h */, + BCA20B781746DEDE0097C84A /* GPUImageChromaKeyFilter.m */, BCF867E21727903C00912E34 /* GPUImageKuwaharaFilter.h */, BCF867E31727903D00912E34 /* GPUImageKuwaharaFilter.m */, + BCA20B731746DE850097C84A /* GPUImageKuwaharaRadius3Filter.h */, + BCA20B741746DE850097C84A /* GPUImageKuwaharaRadius3Filter.m */, + BCA20B6F1746D4AC0097C84A /* GPUImagePosterizeFilter.h */, + BCA20B701746D4AC0097C84A /* GPUImagePosterizeFilter.m */, + BCA20B7B1746DF200097C84A /* GPUImageVignetteFilter.h */, + BCA20B7C1746DF200097C84A /* GPUImageVignetteFilter.m */, + BCA20B971747081C0097C84A /* GPUImageSwirlFilter.h */, + BCA20B981747081D0097C84A /* GPUImageSwirlFilter.m */, + BCA20B7F1747080E0097C84A /* GPUImageBulgeDistortionFilter.h */, + BCA20B801747080F0097C84A /* GPUImageBulgeDistortionFilter.m */, + BCA20B89174708150097C84A /* GPUImagePinchDistortionFilter.h */, + BCA20B8A174708150097C84A /* GPUImagePinchDistortionFilter.m */, + BCA20B951747081C0097C84A /* GPUImageStretchDistortionFilter.h */, + BCA20B961747081C0097C84A /* GPUImageStretchDistortionFilter.m */, + BCA20B811747080F0097C84A /* GPUImageClosingFilter.h */, + BCA20B82174708100097C84A /* GPUImageClosingFilter.m */, + BCA20B8B174708160097C84A /* GPUImageRGBClosingFilter.h */, + BCA20B8C174708160097C84A /* GPUImageRGBClosingFilter.m */, + BCA20B83174708110097C84A /* GPUImageDilationFilter.h */, + BCA20B84174708120097C84A /* GPUImageDilationFilter.m */, + BCA20B8D174708190097C84A /* GPUImageRGBDilationFilter.h */, + BCA20B8E174708190097C84A /* GPUImageRGBDilationFilter.m */, + BCA20B85174708120097C84A /* GPUImageErosionFilter.h */, + BCA20B86174708130097C84A /* GPUImageErosionFilter.m */, + BCA20B8F174708190097C84A /* GPUImageRGBErosionFilter.h */, + BCA20B901747081A0097C84A /* GPUImageRGBErosionFilter.m */, + BCA20BB3174708610097C84A /* GPUImageOpeningFilter.h */, + BCA20BB4174708620097C84A /* GPUImageOpeningFilter.m */, + BCA20B911747081A0097C84A /* GPUImageRGBOpeningFilter.h */, + BCA20B921747081B0097C84A /* GPUImageRGBOpeningFilter.m */, + BCA20B931747081B0097C84A /* GPUImageSphereRefractionFilter.h */, + BCA20B941747081B0097C84A /* GPUImageSphereRefractionFilter.m */, + BCA20B87174708140097C84A /* GPUImageGlassSphereFilter.h */, + BCA20B88174708150097C84A /* GPUImageGlassSphereFilter.m */, + BCA20BBB17471C400097C84A /* GPUImageMosaicFilter.h */, + BCA20BBC17471C420097C84A /* GPUImageMosaicFilter.m */, + BCA20BBD17471C440097C84A /* GPUImagePerlinNoiseFilter.h */, + BCA20BBE17471C460097C84A /* GPUImagePerlinNoiseFilter.m */, + BCA20BB717471C3A0097C84A /* GPUImageJFAVoronoiFilter.h */, + BCA20BB817471C3C0097C84A /* GPUImageJFAVoronoiFilter.m */, + BCA20BBF17471C480097C84A /* GPUImageVoronoiConsumerFilter.h */, + BCA20BC017471C490097C84A /* GPUImageVoronoiConsumerFilter.m */, ); name = Effects; sourceTree = ""; @@ -817,6 +977,8 @@ BCF86827172857B600912E34 /* GPUImageZoomBlurFilter.m */, BC6C55441730BDCF00EB222D /* GPUImageLanczosResamplingFilter.h */, BC6C55451730BDCF00EB222D /* GPUImageLanczosResamplingFilter.m */, + BCA20BB917471C3D0097C84A /* GPUImageLocalBinaryPatternFilter.h */, + BCA20BBA17471C3F0097C84A /* GPUImageLocalBinaryPatternFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -1008,6 +1170,33 @@ BCA20B591746C9EC0097C84A /* GPUImageHighPassFilter.h in Headers */, BCA20B5B1746C9EC0097C84A /* GPUImageLowPassFilter.h in Headers */, BCA20B5D1746C9EC0097C84A /* GPUImageMotionDetector.h in Headers */, + BCA20B611746CFE60097C84A /* GPUImageThresholdSketchFilter.h in Headers */, + BCA20B651746D3C30097C84A /* GPUImageSmoothToonFilter.h in Headers */, + BCA20B691746D3DD0097C84A /* GPUImageTiltShiftFilter.h in Headers */, + BCA20B6D1746D44B0097C84A /* GPUImageCGAColorspaceFilter.h in Headers */, + BCA20B711746D4AC0097C84A /* GPUImagePosterizeFilter.h in Headers */, + BCA20B751746DE850097C84A /* GPUImageKuwaharaRadius3Filter.h in Headers */, + BCA20B791746DEDE0097C84A /* GPUImageChromaKeyFilter.h in Headers */, + BCA20B7D1746DF210097C84A /* GPUImageVignetteFilter.h in Headers */, + BCA20B991747081D0097C84A /* GPUImageBulgeDistortionFilter.h in Headers */, + BCA20B9B1747081D0097C84A /* GPUImageClosingFilter.h in Headers */, + BCA20B9D1747081D0097C84A /* GPUImageDilationFilter.h in Headers */, + BCA20B9F1747081D0097C84A /* GPUImageErosionFilter.h in Headers */, + BCA20BA11747081D0097C84A /* GPUImageGlassSphereFilter.h in Headers */, + BCA20BA31747081D0097C84A /* GPUImagePinchDistortionFilter.h in Headers */, + BCA20BA51747081D0097C84A /* GPUImageRGBClosingFilter.h in Headers */, + BCA20BA71747081D0097C84A /* GPUImageRGBDilationFilter.h in Headers */, + BCA20BA91747081D0097C84A /* GPUImageRGBErosionFilter.h in Headers */, + BCA20BAB1747081D0097C84A /* GPUImageRGBOpeningFilter.h in Headers */, + BCA20BAD1747081D0097C84A /* GPUImageSphereRefractionFilter.h in Headers */, + BCA20BAF1747081D0097C84A /* GPUImageStretchDistortionFilter.h in Headers */, + BCA20BB11747081D0097C84A /* GPUImageSwirlFilter.h in Headers */, + BCA20BB5174708630097C84A /* GPUImageOpeningFilter.h in Headers */, + BCA20BC117471C4B0097C84A /* GPUImageJFAVoronoiFilter.h in Headers */, + BCA20BC317471C4B0097C84A /* GPUImageLocalBinaryPatternFilter.h in Headers */, + BCA20BC517471C4B0097C84A /* GPUImageMosaicFilter.h in Headers */, + BCA20BC717471C4B0097C84A /* GPUImagePerlinNoiseFilter.h in Headers */, + BCA20BC917471C4B0097C84A /* GPUImageVoronoiConsumerFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1193,6 +1382,33 @@ BCA20B5A1746C9EC0097C84A /* GPUImageHighPassFilter.m in Sources */, BCA20B5C1746C9EC0097C84A /* GPUImageLowPassFilter.m in Sources */, BCA20B5E1746C9EC0097C84A /* GPUImageMotionDetector.m in Sources */, + BCA20B621746CFE60097C84A /* GPUImageThresholdSketchFilter.m in Sources */, + BCA20B661746D3C30097C84A /* GPUImageSmoothToonFilter.m in Sources */, + BCA20B6A1746D3DD0097C84A /* GPUImageTiltShiftFilter.m in Sources */, + BCA20B6E1746D44B0097C84A /* GPUImageCGAColorspaceFilter.m in Sources */, + BCA20B721746D4AC0097C84A /* GPUImagePosterizeFilter.m in Sources */, + BCA20B761746DE850097C84A /* GPUImageKuwaharaRadius3Filter.m in Sources */, + BCA20B7A1746DEDE0097C84A /* GPUImageChromaKeyFilter.m in Sources */, + BCA20B7E1746DF210097C84A /* GPUImageVignetteFilter.m in Sources */, + BCA20B9A1747081D0097C84A /* GPUImageBulgeDistortionFilter.m in Sources */, + BCA20B9C1747081D0097C84A /* GPUImageClosingFilter.m in Sources */, + BCA20B9E1747081D0097C84A /* GPUImageDilationFilter.m in Sources */, + BCA20BA01747081D0097C84A /* GPUImageErosionFilter.m in Sources */, + BCA20BA21747081D0097C84A /* GPUImageGlassSphereFilter.m in Sources */, + BCA20BA41747081D0097C84A /* GPUImagePinchDistortionFilter.m in Sources */, + BCA20BA61747081D0097C84A /* GPUImageRGBClosingFilter.m in Sources */, + BCA20BA81747081D0097C84A /* GPUImageRGBDilationFilter.m in Sources */, + BCA20BAA1747081D0097C84A /* GPUImageRGBErosionFilter.m in Sources */, + BCA20BAC1747081D0097C84A /* GPUImageRGBOpeningFilter.m in Sources */, + BCA20BAE1747081D0097C84A /* GPUImageSphereRefractionFilter.m in Sources */, + BCA20BB01747081D0097C84A /* GPUImageStretchDistortionFilter.m in Sources */, + BCA20BB21747081D0097C84A /* GPUImageSwirlFilter.m in Sources */, + BCA20BB6174708630097C84A /* GPUImageOpeningFilter.m in Sources */, + BCA20BC217471C4B0097C84A /* GPUImageJFAVoronoiFilter.m in Sources */, + BCA20BC417471C4B0097C84A /* GPUImageLocalBinaryPatternFilter.m in Sources */, + BCA20BC617471C4B0097C84A /* GPUImageMosaicFilter.m in Sources */, + BCA20BC817471C4B0097C84A /* GPUImagePerlinNoiseFilter.m in Sources */, + BCA20BCA17471C4B0097C84A /* GPUImageVoronoiConsumerFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index d9536879b..4883d54cf 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -1,5 +1,6 @@ #import "GPUImageBulgeDistortionFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageBulgeDistortionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -12,7 +13,7 @@ uniform highp float scale; void main() -{ + { highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); highp float dist = distance(center, textureCoordinateToUse); textureCoordinateToUse = textureCoordinate; @@ -28,9 +29,41 @@ void main() } gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); -} - + } ); +#else +NSString *const kGPUImageBulgeDistortionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float aspectRatio; + uniform vec2 center; + uniform float radius; + uniform float scale; + + void main() + { + vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float dist = distance(center, textureCoordinateToUse); + textureCoordinateToUse = textureCoordinate; + + if (dist < radius) + { + textureCoordinateToUse -= center; + float percent = 1.0 - ((radius - dist) / radius) * scale; + percent = percent * percent; + + textureCoordinateToUse = textureCoordinateToUse * percent; + textureCoordinateToUse += center; + } + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + } +); +#endif + @interface GPUImageBulgeDistortionFilter () diff --git a/framework/Source/GPUImageCGAColorspaceFilter.m b/framework/Source/GPUImageCGAColorspaceFilter.m index 1ab475e36..eee939a0b 100755 --- a/framework/Source/GPUImageCGAColorspaceFilter.m +++ b/framework/Source/GPUImageCGAColorspaceFilter.m @@ -4,6 +4,7 @@ #import "GPUImageCGAColorspaceFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageCGAColorspaceFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -48,7 +49,54 @@ void main() gl_FragColor = finalColor; } - ); +); +#else +NSString *const kGPUImageCGAColorspaceFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec2 sampleDivisor = vec2(1.0 / 200.0, 1.0 / 320.0); + //highp vec4 colorDivisor = vec4(colorDepth); + + vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor); + vec4 color = texture2D(inputImageTexture, samplePos ); + + //gl_FragColor = texture2D(inputImageTexture, samplePos ); + vec4 colorCyan = vec4(85.0 / 255.0, 1.0, 1.0, 1.0); + vec4 colorMagenta = vec4(1.0, 85.0 / 255.0, 1.0, 1.0); + vec4 colorWhite = vec4(1.0, 1.0, 1.0, 1.0); + vec4 colorBlack = vec4(0.0, 0.0, 0.0, 1.0); + + vec4 endColor; + float blackDistance = distance(color, colorBlack); + float whiteDistance = distance(color, colorWhite); + float magentaDistance = distance(color, colorMagenta); + float cyanDistance = distance(color, colorCyan); + + vec4 finalColor; + + float colorDistance = min(magentaDistance, cyanDistance); + colorDistance = min(colorDistance, whiteDistance); + colorDistance = min(colorDistance, blackDistance); + + if (colorDistance == blackDistance) { + finalColor = colorBlack; + } else if (colorDistance == whiteDistance) { + finalColor = colorWhite; + } else if (colorDistance == cyanDistance) { + finalColor = colorCyan; + } else { + finalColor = colorMagenta; + } + + gl_FragColor = finalColor; + } +); +#endif @implementation GPUImageCGAColorspaceFilter diff --git a/framework/Source/GPUImageChromaKeyFilter.m b/framework/Source/GPUImageChromaKeyFilter.m index 9e032922d..25c548098 100644 --- a/framework/Source/GPUImageChromaKeyFilter.m +++ b/framework/Source/GPUImageChromaKeyFilter.m @@ -2,6 +2,7 @@ // Shader code based on Apple's CIChromaKeyFilter example: https://developer.apple.com/library/mac/#samplecode/CIChromaKeyFilter/Introduction/Intro.html +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageChromaKeyFragmentShaderString = SHADER_STRING ( precision highp float; @@ -31,7 +32,35 @@ void main() gl_FragColor = vec4(textureColor.rgb, textureColor.a * blendValue); } ); - +#else +NSString *const kGPUImageChromaKeyFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform float thresholdSensitivity; + uniform float smoothing; + uniform vec3 colorToReplace; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b; + float maskCr = 0.7132 * (colorToReplace.r - maskY); + float maskCb = 0.5647 * (colorToReplace.b - maskY); + + float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b; + float Cr = 0.7132 * (textureColor.r - Y); + float Cb = 0.5647 * (textureColor.b - Y); + + // float blendValue = 1.0 - smoothstep(thresholdSensitivity - smoothing, thresholdSensitivity , abs(Cr - maskCr) + abs(Cb - maskCb)); + float blendValue = smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb))); + gl_FragColor = vec4(textureColor.rgb, textureColor.a * blendValue); + } + ); +#endif @implementation GPUImageChromaKeyFilter diff --git a/framework/Source/GPUImageDilationFilter.m b/framework/Source/GPUImageDilationFilter.m index b64374473..df065185c 100644 --- a/framework/Source/GPUImageDilationFilter.m +++ b/framework/Source/GPUImageDilationFilter.m @@ -2,7 +2,6 @@ @implementation GPUImageDilationFilter -// Radius: 1 NSString *const kGPUImageDilationRadiusOneVertexShaderString = SHADER_STRING ( attribute vec4 position; @@ -27,43 +26,83 @@ void main() } ); -NSString *const kGPUImageDilationRadiusOneFragmentShaderString = SHADER_STRING +NSString *const kGPUImageDilationRadiusTwoVertexShaderString = SHADER_STRING ( - precision lowp float; + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; varying vec2 oneStepNegativeTextureCoordinate; - - uniform sampler2D inputImageTexture; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; void main() { - float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; - float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; - float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; - - lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); - maxValue = max(maxValue, oneStepNegativeIntensity); + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + } +); - gl_FragColor = vec4(vec3(maxValue), 1.0); +NSString *const kGPUImageDilationRadiusThreeVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec2 inputTextureCoordinate; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + void main() + { + gl_Position = position; + + vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + + centerTextureCoordinate = inputTextureCoordinate; + oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; + oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; + twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); + twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); + threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); } ); -// Radius: 2 -NSString *const kGPUImageDilationRadiusTwoVertexShaderString = SHADER_STRING +NSString *const kGPUImageDilationRadiusFourVertexShaderString = SHADER_STRING ( attribute vec4 position; attribute vec2 inputTextureCoordinate; - uniform float texelWidthOffset; - uniform float texelHeightOffset; + uniform float texelWidthOffset; + uniform float texelHeightOffset; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; varying vec2 oneStepNegativeTextureCoordinate; varying vec2 twoStepsPositiveTextureCoordinate; varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; void main() { @@ -76,6 +115,34 @@ void main() oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); + threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); + threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); + fourStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 4.0); + fourStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 4.0); + } +); + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageDilationRadiusOneFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + + lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + + gl_FragColor = vec4(vec3(maxValue), 1.0); } ); @@ -108,14 +175,9 @@ void main() } ); -// Radius: 3 -NSString *const kGPUImageDilationRadiusThreeVertexShaderString = SHADER_STRING +NSString *const kGPUImageDilationRadiusThreeFragmentShaderString = SHADER_STRING ( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; - - uniform float texelWidthOffset; - uniform float texelHeightOffset; + precision lowp float; varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; @@ -124,24 +186,31 @@ void main() varying vec2 twoStepsNegativeTextureCoordinate; varying vec2 threeStepsPositiveTextureCoordinate; varying vec2 threeStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; void main() { - gl_Position = position; + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; + float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; - vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + maxValue = max(maxValue, threeStepsPositiveIntensity); + maxValue = max(maxValue, threeStepsNegativeIntensity); - centerTextureCoordinate = inputTextureCoordinate; - oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; - oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; - twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); - twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); - threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); - threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); + gl_FragColor = vec4(vec3(maxValue), 1.0); } ); -NSString *const kGPUImageDilationRadiusThreeFragmentShaderString = SHADER_STRING +NSString *const kGPUImageDilationRadiusFourFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -152,7 +221,9 @@ void main() varying vec2 twoStepsNegativeTextureCoordinate; varying vec2 threeStepsPositiveTextureCoordinate; varying vec2 threeStepsNegativeTextureCoordinate; - + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + uniform sampler2D inputImageTexture; void main() @@ -164,6 +235,8 @@ void main() float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; + float fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).r; + float fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).r; lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); maxValue = max(maxValue, oneStepNegativeIntensity); @@ -171,20 +244,63 @@ void main() maxValue = max(maxValue, twoStepsNegativeIntensity); maxValue = max(maxValue, threeStepsPositiveIntensity); maxValue = max(maxValue, threeStepsNegativeIntensity); + maxValue = max(maxValue, fourStepsPositiveIntensity); + maxValue = max(maxValue, fourStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(maxValue), 1.0); + } +); +#else +NSString *const kGPUImageDilationRadiusOneFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + + float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); gl_FragColor = vec4(vec3(maxValue), 1.0); } ); -// Radius: 4 -NSString *const kGPUImageDilationRadiusFourVertexShaderString = SHADER_STRING +NSString *const kGPUImageDilationRadiusTwoFragmentShaderString = SHADER_STRING ( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; - uniform float texelWidthOffset; - uniform float texelHeightOffset; + uniform sampler2D inputImageTexture; + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + + float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(maxValue), 1.0); + } +); + +NSString *const kGPUImageDilationRadiusThreeFragmentShaderString = SHADER_STRING +( varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; varying vec2 oneStepNegativeTextureCoordinate; @@ -192,31 +308,32 @@ void main() varying vec2 twoStepsNegativeTextureCoordinate; varying vec2 threeStepsPositiveTextureCoordinate; varying vec2 threeStepsNegativeTextureCoordinate; - varying vec2 fourStepsPositiveTextureCoordinate; - varying vec2 fourStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; void main() { - gl_Position = position; + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; + float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; - vec2 offset = vec2(texelWidthOffset, texelHeightOffset); + float maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + maxValue = max(maxValue, threeStepsPositiveIntensity); + maxValue = max(maxValue, threeStepsNegativeIntensity); - centerTextureCoordinate = inputTextureCoordinate; - oneStepNegativeTextureCoordinate = inputTextureCoordinate - offset; - oneStepPositiveTextureCoordinate = inputTextureCoordinate + offset; - twoStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 2.0); - twoStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 2.0); - threeStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 3.0); - threeStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 3.0); - fourStepsNegativeTextureCoordinate = inputTextureCoordinate - (offset * 4.0); - fourStepsPositiveTextureCoordinate = inputTextureCoordinate + (offset * 4.0); + gl_FragColor = vec4(vec3(maxValue), 1.0); } ); NSString *const kGPUImageDilationRadiusFourFragmentShaderString = SHADER_STRING ( - precision lowp float; - varying vec2 centerTextureCoordinate; varying vec2 oneStepPositiveTextureCoordinate; varying vec2 oneStepNegativeTextureCoordinate; @@ -241,7 +358,7 @@ void main() float fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).r; float fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).r; - lowp float maxValue = max(centerIntensity, oneStepPositiveIntensity); + float maxValue = max(centerIntensity, oneStepPositiveIntensity); maxValue = max(maxValue, oneStepNegativeIntensity); maxValue = max(maxValue, twoStepsPositiveIntensity); maxValue = max(maxValue, twoStepsNegativeIntensity); @@ -253,6 +370,7 @@ void main() gl_FragColor = vec4(vec3(maxValue), 1.0); } ); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageErosionFilter.m b/framework/Source/GPUImageErosionFilter.m index 3453297d3..05f4f28df 100644 --- a/framework/Source/GPUImageErosionFilter.m +++ b/framework/Source/GPUImageErosionFilter.m @@ -3,7 +3,7 @@ @implementation GPUImageErosionFilter -// Radius: 1 +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageErosionRadiusOneFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -27,7 +27,6 @@ void main() } ); -// Radius: 2 NSString *const kGPUImageErosionRadiusTwoFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -57,7 +56,6 @@ void main() } ); -// Radius: 3 NSString *const kGPUImageErosionRadiusThreeFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -93,7 +91,6 @@ void main() } ); -// Radius: 4 NSString *const kGPUImageErosionRadiusFourFragmentShaderString = SHADER_STRING ( precision lowp float; @@ -134,6 +131,127 @@ void main() gl_FragColor = vec4(vec3(minValue), 1.0); } ); +#else +NSString *const kGPUImageErosionRadiusOneFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + + float minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + + gl_FragColor = vec4(vec3(minValue), 1.0); + } +); + +NSString *const kGPUImageErosionRadiusTwoFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + + float minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(minValue), 1.0); + } +); + +NSString *const kGPUImageErosionRadiusThreeFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; + float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; + + float minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + minValue = min(minValue, threeStepsPositiveIntensity); + minValue = min(minValue, threeStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(minValue), 1.0); + } +); + +NSString *const kGPUImageErosionRadiusFourFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate).r; + float oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate).r; + float oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate).r; + float twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate).r; + float twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate).r; + float threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate).r; + float threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate).r; + float fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate).r; + float fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate).r; + + float minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + minValue = min(minValue, threeStepsPositiveIntensity); + minValue = min(minValue, threeStepsNegativeIntensity); + minValue = min(minValue, fourStepsPositiveIntensity); + minValue = min(minValue, fourStepsNegativeIntensity); + + gl_FragColor = vec4(vec3(minValue), 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index cbad532df..a33b513ea 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -21,7 +21,7 @@ void main() // Calculate the positions for the blur int multiplier = 0; vec2 blurStep; - vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset); + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset); for (int i = 0; i < GAUSSIAN_SAMPLES; i++) { diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.m b/framework/Source/GPUImageGaussianBlurPositionFilter.m index 26bd38af2..c9174f3ad 100755 --- a/framework/Source/GPUImageGaussianBlurPositionFilter.m +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.m @@ -20,7 +20,7 @@ void main() // Calculate the positions for the blur int multiplier = 0; vec2 blurStep; - vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset); + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset); for (int i = 0; i < GAUSSIAN_SAMPLES; i++) { multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2)); diff --git a/framework/Source/GPUImageGlassSphereFilter.m b/framework/Source/GPUImageGlassSphereFilter.m index 6fe4446b9..186629163 100644 --- a/framework/Source/GPUImageGlassSphereFilter.m +++ b/framework/Source/GPUImageGlassSphereFilter.m @@ -1,5 +1,6 @@ #import "GPUImageGlassSphereFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageGlassSphereFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -41,7 +42,51 @@ void main() gl_FragColor = vec4(finalSphereColor, 1.0) * checkForPresenceWithinSphere; } - ); +); +#else +NSString *const kGPUImageGlassSphereFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform vec2 center; + uniform float radius; + uniform float aspectRatio; + uniform float refractiveIndex; + // uniform vec3 lightPosition; + const vec3 lightPosition = vec3(-0.5, 0.5, 1.0); + const vec3 ambientLightPosition = vec3(0.0, 0.0, 1.0); + + void main() + { + vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float distanceFromCenter = distance(center, textureCoordinateToUse); + float checkForPresenceWithinSphere = step(distanceFromCenter, radius); + + distanceFromCenter = distanceFromCenter / radius; + + float normalizedDepth = radius * sqrt(1.0 - distanceFromCenter * distanceFromCenter); + vec3 sphereNormal = normalize(vec3(textureCoordinateToUse - center, normalizedDepth)); + + vec3 refractedVector = 2.0 * refract(vec3(0.0, 0.0, -1.0), sphereNormal, refractiveIndex); + refractedVector.xy = -refractedVector.xy; + + vec3 finalSphereColor = texture2D(inputImageTexture, (refractedVector.xy + 1.0) * 0.5).rgb; + + // Grazing angle lighting + float lightingIntensity = 2.5 * (1.0 - pow(clamp(dot(ambientLightPosition, sphereNormal), 0.0, 1.0), 0.25)); + finalSphereColor += lightingIntensity; + + // Specular lighting + lightingIntensity = clamp(dot(normalize(lightPosition), sphereNormal), 0.0, 1.0); + lightingIntensity = pow(lightingIntensity, 15.0); + finalSphereColor += vec3(0.8, 0.8, 0.8) * lightingIntensity; + + gl_FragColor = vec4(finalSphereColor, 1.0) * checkForPresenceWithinSphere; + } +); +#endif @implementation GPUImageGlassSphereFilter diff --git a/framework/Source/GPUImageJFAVoronoiFilter.m b/framework/Source/GPUImageJFAVoronoiFilter.m index 4b310d100..511b2aab7 100644 --- a/framework/Source/GPUImageJFAVoronoiFilter.m +++ b/framework/Source/GPUImageJFAVoronoiFilter.m @@ -10,8 +10,7 @@ attribute vec4 position; attribute vec4 inputTextureCoordinate; - uniform highp float sampleStep; - + uniform float sampleStep; varying vec2 textureCoordinate; varying vec2 leftTextureCoordinate; @@ -48,6 +47,7 @@ void main() } ); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageJFAVoronoiFragmentShaderString = SHADER_STRING ( @@ -179,7 +179,138 @@ void main(void) { } gl_FragColor = dst; } - ); +); +#else +NSString *const kGPUImageJFAVoronoiFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + uniform vec2 size; + //varying vec2 textureCoordinate; + //uniform float sampleStep; + + vec2 getCoordFromColor(vec4 color) +{ + float z = color.z * 256.0; + float yoff = floor(z / 8.0); + float xoff = mod(z, 8.0); + float x = color.x*256.0 + xoff*256.0; + float y = color.y*256.0 + yoff*256.0; + return vec2(x,y) / size; +} + + void main(void) { + + vec2 sub; + vec4 dst; + vec4 local = texture2D(inputImageTexture, textureCoordinate); + vec4 sam; + float l; + float smallestDist; + if(local.a == 0.0){ + + smallestDist = dot(1.0,1.0); + }else{ + sub = getCoordFromColor(local)-textureCoordinate; + smallestDist = dot(sub,sub); + } + dst = local; + + + sam = texture2D(inputImageTexture, topRightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, topTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, topLeftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomRightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, bottomLeftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, leftTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + + sam = texture2D(inputImageTexture, rightTextureCoordinate); + if(sam.a == 1.0){ + sub = (getCoordFromColor(sam)-textureCoordinate); + l = dot(sub,sub); + if(l < smallestDist){ + smallestDist = l; + dst = sam; + } + } + gl_FragColor = dst; + } +); +#endif @interface GPUImageJFAVoronoiFilter() { int currentPass; @@ -297,6 +428,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #if defined(__IPHONE_6_0) CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); #else @@ -349,6 +481,7 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); [self notifyTargetsAboutNewOutputTexture]; +#endif } else { diff --git a/framework/Source/GPUImageKuwaharaRadius3Filter.m b/framework/Source/GPUImageKuwaharaRadius3Filter.m index 086154922..98b092c6b 100644 --- a/framework/Source/GPUImageKuwaharaRadius3Filter.m +++ b/framework/Source/GPUImageKuwaharaRadius3Filter.m @@ -7,6 +7,7 @@ // Anisotropic Kuwahara Filtering on the GPU // by Jan Eric Kyprianidis +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageKuwaharaRadius3FragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -266,7 +267,267 @@ void main (void) gl_FragColor = vec4(m3, 1.0); } } - ); +); +#else +NSString *const kGPUImageKuwaharaRadius3FragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + + const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0); + + void main (void) + { + vec2 uv = textureCoordinate; + float n = float(16); // radius is assumed to be 3 + vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0); + vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0); + vec3 c; + vec3 cSq; + + c = texture2D(inputImageTexture, uv + vec2(-3,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-2,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-1,-3) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,-2) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,-1) * src_size).rgb; + m0 += c; + s0 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(0,-3) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,-2) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,-1) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m3 += c; + s3 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,0) * src_size).rgb; + cSq = c * c; + m0 += c; + s0 += cSq; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(-3,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-3,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(-2,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-2,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(-1,3) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,2) * src_size).rgb; + m1 += c; + s1 += c * c; + c = texture2D(inputImageTexture, uv + vec2(-1,1) * src_size).rgb; + m1 += c; + s1 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(0,3) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,2) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + c = texture2D(inputImageTexture, uv + vec2(0,1) * src_size).rgb; + cSq = c * c; + m1 += c; + s1 += cSq; + m2 += c; + s2 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(3,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(2,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(1,3) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,2) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,1) * src_size).rgb; + m2 += c; + s2 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,0) * src_size).rgb; + cSq = c * c; + m2 += c; + s2 += cSq; + m3 += c; + s3 += cSq; + + c = texture2D(inputImageTexture, uv + vec2(3,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(3,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(2,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(2,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + c = texture2D(inputImageTexture, uv + vec2(1,-3) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,-2) * src_size).rgb; + m3 += c; + s3 += c * c; + c = texture2D(inputImageTexture, uv + vec2(1,-1) * src_size).rgb; + m3 += c; + s3 += c * c; + + float min_sigma2 = 1e+2; + m0 /= n; + s0 = abs(s0 / n - m0 * m0); + + float sigma2 = s0.r + s0.g + s0.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m0, 1.0); + } + + m1 /= n; + s1 = abs(s1 / n - m1 * m1); + + sigma2 = s1.r + s1.g + s1.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m1, 1.0); + } + + m2 /= n; + s2 = abs(s2 / n - m2 * m2); + + sigma2 = s2.r + s2.g + s2.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m2, 1.0); + } + + m3 /= n; + s3 = abs(s3 / n - m3 * m3); + + sigma2 = s3.r + s3.g + s3.b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + gl_FragColor = vec4(m3, 1.0); + } + } +); +#endif @implementation GPUImageKuwaharaRadius3Filter diff --git a/framework/Source/GPUImageLocalBinaryPatternFilter.m b/framework/Source/GPUImageLocalBinaryPatternFilter.m index cc1489cd7..1ee1f8d95 100644 --- a/framework/Source/GPUImageLocalBinaryPatternFilter.m +++ b/framework/Source/GPUImageLocalBinaryPatternFilter.m @@ -15,6 +15,7 @@ @implementation GPUImageLocalBinaryPatternFilter +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageLocalBinaryPatternFragmentShaderString = SHADER_STRING ( precision highp float; @@ -60,6 +61,51 @@ void main() gl_FragColor = vec4(byteTally, byteTally, byteTally, 1.0); } ); +#else +NSString *const kGPUImageLocalBinaryPatternFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + + float byteTally = 1.0 / 255.0 * step(centerIntensity, topRightIntensity); + byteTally += 2.0 / 255.0 * step(centerIntensity, topIntensity); + byteTally += 4.0 / 255.0 * step(centerIntensity, topLeftIntensity); + byteTally += 8.0 / 255.0 * step(centerIntensity, leftIntensity); + byteTally += 16.0 / 255.0 * step(centerIntensity, bottomLeftIntensity); + byteTally += 32.0 / 255.0 * step(centerIntensity, bottomIntensity); + byteTally += 64.0 / 255.0 * step(centerIntensity, bottomRightIntensity); + byteTally += 128.0 / 255.0 * step(centerIntensity, rightIntensity); + + // TODO: Replace the above with a dot product and two vec4s + // TODO: Apply step to a matrix, rather than individually + + gl_FragColor = vec4(byteTally, byteTally, byteTally, 1.0); + } +); +#endif #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m index 9265461e2..ebe09974c 100644 --- a/framework/Source/GPUImageMosaicFilter.m +++ b/framework/Source/GPUImageMosaicFilter.m @@ -5,6 +5,7 @@ #import "GPUImageMosaicFilter.h" #import "GPUImagePicture.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageMosaicFragmentShaderString = SHADER_STRING ( precision highp float; @@ -47,7 +48,49 @@ void main() gl_FragColor = color; } - ); +); +#else +NSString *const kGPUImageMosaicFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform vec2 inputTileSize; + uniform vec2 displayTileSize; + uniform float numTiles; + uniform int colorOn; + + void main() + { + vec2 xy = textureCoordinate; + xy = xy - mod(xy, displayTileSize); + + vec4 lumcoeff = vec4(0.299,0.587,0.114,0.0); + + vec4 inputColor = texture2D(inputImageTexture2, xy); + float lum = dot(inputColor,lumcoeff); + lum = 1.0 - lum; + + float stepsize = 1.0 / numTiles; + float lumStep = (lum - mod(lum, stepsize)) / stepsize; + + float rowStep = 1.0 / inputTileSize.x; + float x = mod(lumStep, rowStep); + float y = floor(lumStep / rowStep); + + vec2 startCoord = vec2(float(x) * inputTileSize.x, float(y) * inputTileSize.y); + vec2 finalCoord = startCoord + ((textureCoordinate - xy) * (inputTileSize / displayTileSize)); + + vec4 color = texture2D(inputImageTexture, finalCoord); + if (colorOn == 1) { + color = color * inputColor; + } + gl_FragColor = color; + } +); +#endif @implementation GPUImageMosaicFilter @@ -130,8 +173,12 @@ -(void)setDisplayTileSize:(CGSize)displayTileSize } -(void)setTileSet:(NSString *)tileSet -{ +{ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE UIImage *img = [UIImage imageNamed:tileSet]; +#else + NSImage *img = [NSImage imageNamed:tileSet]; +#endif pic = [[GPUImagePicture alloc] initWithImage:img smoothlyScaleOutput:YES]; [pic addTarget:self]; [pic processImage]; diff --git a/framework/Source/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m index 8130efbcf..9ca7cbadb 100644 --- a/framework/Source/GPUImagePerlinNoiseFilter.m +++ b/framework/Source/GPUImagePerlinNoiseFilter.m @@ -1,5 +1,6 @@ #import "GPUImagePerlinNoiseFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePerlinNoiseFragmentShaderString = SHADER_STRING ( precision highp float; @@ -90,7 +91,98 @@ void main() gl_FragColor = color; } - ); +); +#else +NSString *const kGPUImagePerlinNoiseFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform float scale; + + uniform vec4 colorStart; + uniform vec4 colorFinish; + + // + // Description : Array and textureless GLSL 2D/3D/4D simplex + // noise functions. + // Author : Ian McEwan, Ashima Arts. + // Maintainer : ijm + // Lastmod : 20110822 (ijm) + // License : Copyright (C) 2011 Ashima Arts. All rights reserved. + // Distributed under the MIT License. See LICENSE file. + // https://github.com/ashima/webgl-noise + // + + vec4 mod289(vec4 x) +{ + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + + vec4 permute(vec4 x) +{ + return mod289(((x*34.0)+1.0)*x); +} + + vec4 taylorInvSqrt(vec4 r) +{ + return 1.79284291400159 - 0.85373472095314 * r; +} + + vec2 fade(vec2 t) { + return t*t*t*(t*(t*6.0-15.0)+10.0); + } + + // Classic Perlin noise + float cnoise(vec2 P) +{ + vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0); + vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0); + Pi = mod289(Pi); // To avoid truncation effects in permutation + vec4 ix = Pi.xzxz; + vec4 iy = Pi.yyww; + vec4 fx = Pf.xzxz; + vec4 fy = Pf.yyww; + + vec4 i = permute(permute(ix) + iy); + + vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ; + vec4 gy = abs(gx) - 0.5 ; + vec4 tx = floor(gx + 0.5); + gx = gx - tx; + + vec2 g00 = vec2(gx.x,gy.x); + vec2 g10 = vec2(gx.y,gy.y); + vec2 g01 = vec2(gx.z,gy.z); + vec2 g11 = vec2(gx.w,gy.w); + + vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + g00 *= norm.x; + g01 *= norm.y; + g10 *= norm.z; + g11 *= norm.w; + + float n00 = dot(g00, vec2(fx.x, fy.x)); + float n10 = dot(g10, vec2(fx.y, fy.y)); + float n01 = dot(g01, vec2(fx.z, fy.z)); + float n11 = dot(g11, vec2(fx.w, fy.w)); + + vec2 fade_xy = fade(Pf.xy); + vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x); + float n_xy = mix(n_x.x, n_x.y, fade_xy.y); + return 2.3 * n_xy; + } + + void main() + { + + float n1 = (cnoise(textureCoordinate * scale) + 1.0) / 2.0; + + vec4 colorDiff = colorFinish - colorStart; + vec4 color = colorStart + colorDiff * n1; + + gl_FragColor = color; + } +); +#endif @implementation GPUImagePerlinNoiseFilter diff --git a/framework/Source/GPUImagePinchDistortionFilter.m b/framework/Source/GPUImagePinchDistortionFilter.m index 99e99d045..9a571cc23 100755 --- a/framework/Source/GPUImagePinchDistortionFilter.m +++ b/framework/Source/GPUImagePinchDistortionFilter.m @@ -1,5 +1,6 @@ #import "GPUImagePinchDistortionFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePinchDistortionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -30,8 +31,42 @@ void main() { gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); } -} + } +); +#else +NSString *const kGPUImagePinchDistortionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform float aspectRatio; + uniform vec2 center; + uniform float radius; + uniform float scale; + + void main() + { + vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float dist = distance(center, textureCoordinateToUse); + textureCoordinateToUse = textureCoordinate; + + if (dist < radius) + { + textureCoordinateToUse -= center; + float percent = 1.0 + ((0.5 - dist) / 0.5) * scale; + textureCoordinateToUse = textureCoordinateToUse * percent; + textureCoordinateToUse += center; + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + } + else + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate ); + } + } ); +#endif @interface GPUImagePinchDistortionFilter () diff --git a/framework/Source/GPUImagePosterizeFilter.m b/framework/Source/GPUImagePosterizeFilter.m index 5a04105ea..a438cea5e 100755 --- a/framework/Source/GPUImagePosterizeFilter.m +++ b/framework/Source/GPUImagePosterizeFilter.m @@ -1,5 +1,6 @@ #import "GPUImagePosterizeFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImagePosterizeFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -14,6 +15,22 @@ void main() gl_FragColor = floor((textureColor * colorLevels) + vec4(0.5)) / colorLevels; } ); +#else +NSString *const kGPUImagePosterizeFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float colorLevels; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + + gl_FragColor = floor((textureColor * colorLevels) + vec4(0.5)) / colorLevels; + } +); +#endif @implementation GPUImagePosterizeFilter diff --git a/framework/Source/GPUImageRGBDilationFilter.m b/framework/Source/GPUImageRGBDilationFilter.m index f05f96bef..9702c783d 100644 --- a/framework/Source/GPUImageRGBDilationFilter.m +++ b/framework/Source/GPUImageRGBDilationFilter.m @@ -1,7 +1,7 @@ #import "GPUImageRGBDilationFilter.h" #import "GPUImageDilationFilter.h" -// Radius 1 +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageRGBDilationRadiusOneFragmentShaderString = SHADER_STRING ( precision highp float; @@ -24,7 +24,6 @@ void main() } ); -// Radius 2 NSString *const kGPUImageRGBDilationRadiusTwoFragmentShaderString = SHADER_STRING ( precision highp float; @@ -54,7 +53,6 @@ void main() } ); -// Radius 3 NSString *const kGPUImageRGBDilationRadiusThreeFragmentShaderString = SHADER_STRING ( precision highp float; @@ -89,7 +87,6 @@ void main() } ); -// Radius 4 NSString *const kGPUImageRGBDilationRadiusFourFragmentShaderString = SHADER_STRING ( precision highp float; @@ -129,7 +126,124 @@ void main() gl_FragColor = max(maxValue, fourStepsNegativeIntensity); } ); +#else +NSString *const kGPUImageRGBDilationRadiusOneFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + + vec4 maxValue = max(centerIntensity, oneStepPositiveIntensity); + + gl_FragColor = max(maxValue, oneStepNegativeIntensity); + } + ); +NSString *const kGPUImageRGBDilationRadiusTwoFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + + vec4 maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + + gl_FragColor = max(maxValue, twoStepsNegativeIntensity); + } + ); + +NSString *const kGPUImageRGBDilationRadiusThreeFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + vec4 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate); + vec4 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate); + + vec4 maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + maxValue = max(maxValue, threeStepsPositiveIntensity); + + gl_FragColor = max(maxValue, threeStepsNegativeIntensity); + } +); + +NSString *const kGPUImageRGBDilationRadiusFourFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + vec4 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate); + vec4 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate); + vec4 fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate); + vec4 fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate); + + vec4 maxValue = max(centerIntensity, oneStepPositiveIntensity); + maxValue = max(maxValue, oneStepNegativeIntensity); + maxValue = max(maxValue, twoStepsPositiveIntensity); + maxValue = max(maxValue, twoStepsNegativeIntensity); + maxValue = max(maxValue, threeStepsPositiveIntensity); + maxValue = max(maxValue, threeStepsNegativeIntensity); + maxValue = max(maxValue, fourStepsPositiveIntensity); + + gl_FragColor = max(maxValue, fourStepsNegativeIntensity); + } +); +#endif @implementation GPUImageRGBDilationFilter diff --git a/framework/Source/GPUImageRGBErosionFilter.m b/framework/Source/GPUImageRGBErosionFilter.m index 4fae54186..91e5f33d5 100644 --- a/framework/Source/GPUImageRGBErosionFilter.m +++ b/framework/Source/GPUImageRGBErosionFilter.m @@ -1,7 +1,7 @@ #import "GPUImageRGBErosionFilter.h" #import "GPUImageDilationFilter.h" -// Radius 1 +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageRGBErosionRadiusOneFragmentShaderString = SHADER_STRING ( precision highp float; @@ -24,7 +24,6 @@ void main() } ); -// Radius 2 NSString *const kGPUImageRGBErosionRadiusTwoFragmentShaderString = SHADER_STRING ( precision highp float; @@ -53,7 +52,6 @@ void main() } ); -// Radius 3 NSString *const kGPUImageRGBErosionRadiusThreeFragmentShaderString = SHADER_STRING ( precision highp float; @@ -88,7 +86,6 @@ void main() } ); -// Radius 4 NSString *const kGPUImageRGBErosionRadiusFourFragmentShaderString = SHADER_STRING ( precision highp float; @@ -128,6 +125,123 @@ void main() gl_FragColor = min(minValue, fourStepsNegativeIntensity); } ); +#else +NSString *const kGPUImageRGBErosionRadiusOneFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + + vec4 minValue = min(centerIntensity, oneStepPositiveIntensity); + + gl_FragColor = min(minValue, oneStepNegativeIntensity); + } +); + +NSString *const kGPUImageRGBErosionRadiusTwoFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + + vec4 minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + + gl_FragColor = min(minValue, twoStepsNegativeIntensity); + } +); + +NSString *const kGPUImageRGBErosionRadiusThreeFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + vec4 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate); + vec4 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate); + + vec4 minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + minValue = min(minValue, threeStepsPositiveIntensity); + + gl_FragColor = min(minValue, threeStepsNegativeIntensity); + } +); + +NSString *const kGPUImageRGBErosionRadiusFourFragmentShaderString = SHADER_STRING +( + varying vec2 centerTextureCoordinate; + varying vec2 oneStepPositiveTextureCoordinate; + varying vec2 oneStepNegativeTextureCoordinate; + varying vec2 twoStepsPositiveTextureCoordinate; + varying vec2 twoStepsNegativeTextureCoordinate; + varying vec2 threeStepsPositiveTextureCoordinate; + varying vec2 threeStepsNegativeTextureCoordinate; + varying vec2 fourStepsPositiveTextureCoordinate; + varying vec2 fourStepsNegativeTextureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + vec4 centerIntensity = texture2D(inputImageTexture, centerTextureCoordinate); + vec4 oneStepPositiveIntensity = texture2D(inputImageTexture, oneStepPositiveTextureCoordinate); + vec4 oneStepNegativeIntensity = texture2D(inputImageTexture, oneStepNegativeTextureCoordinate); + vec4 twoStepsPositiveIntensity = texture2D(inputImageTexture, twoStepsPositiveTextureCoordinate); + vec4 twoStepsNegativeIntensity = texture2D(inputImageTexture, twoStepsNegativeTextureCoordinate); + vec4 threeStepsPositiveIntensity = texture2D(inputImageTexture, threeStepsPositiveTextureCoordinate); + vec4 threeStepsNegativeIntensity = texture2D(inputImageTexture, threeStepsNegativeTextureCoordinate); + vec4 fourStepsPositiveIntensity = texture2D(inputImageTexture, fourStepsPositiveTextureCoordinate); + vec4 fourStepsNegativeIntensity = texture2D(inputImageTexture, fourStepsNegativeTextureCoordinate); + + vec4 minValue = min(centerIntensity, oneStepPositiveIntensity); + minValue = min(minValue, oneStepNegativeIntensity); + minValue = min(minValue, twoStepsPositiveIntensity); + minValue = min(minValue, twoStepsNegativeIntensity); + minValue = min(minValue, threeStepsPositiveIntensity); + minValue = min(minValue, threeStepsNegativeIntensity); + minValue = min(minValue, fourStepsPositiveIntensity); + + gl_FragColor = min(minValue, fourStepsNegativeIntensity); + } +); +#endif @implementation GPUImageRGBErosionFilter diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index 849f62652..ca1e6fe9b 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -1,5 +1,6 @@ #import "GPUImageSphereRefractionFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSphereRefractionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -27,6 +28,35 @@ void main() gl_FragColor = texture2D(inputImageTexture, (refractedVector.xy + 1.0) * 0.5) * checkForPresenceWithinSphere; } ); +#else +NSString *const kGPUImageSphereRefractionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform vec2 center; + uniform float radius; + uniform float aspectRatio; + uniform float refractiveIndex; + + void main() + { + vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); + float distanceFromCenter = distance(center, textureCoordinateToUse); + float checkForPresenceWithinSphere = step(distanceFromCenter, radius); + + distanceFromCenter = distanceFromCenter / radius; + + float normalizedDepth = radius * sqrt(1.0 - distanceFromCenter * distanceFromCenter); + vec3 sphereNormal = normalize(vec3(textureCoordinateToUse - center, normalizedDepth)); + + vec3 refractedVector = refract(vec3(0.0, 0.0, -1.0), sphereNormal, refractiveIndex); + + gl_FragColor = texture2D(inputImageTexture, (refractedVector.xy + 1.0) * 0.5) * checkForPresenceWithinSphere; + } +); +#endif @interface GPUImageSphereRefractionFilter () diff --git a/framework/Source/GPUImageStretchDistortionFilter.m b/framework/Source/GPUImageStretchDistortionFilter.m index 967e13811..d38cac348 100755 --- a/framework/Source/GPUImageStretchDistortionFilter.m +++ b/framework/Source/GPUImageStretchDistortionFilter.m @@ -1,5 +1,6 @@ #import "GPUImageStretchDistortionFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageStretchDistortionFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -27,8 +28,35 @@ void main() gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); } - ); - +); +#else +NSString *const kGPUImageStretchDistortionFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform vec2 center; + + void main() + { + vec2 normCoord = 2.0 * textureCoordinate - 1.0; + vec2 normCenter = 2.0 * center - 1.0; + + normCoord -= normCenter; + vec2 s = sign(normCoord); + normCoord = abs(normCoord); + normCoord = 0.5 * normCoord + 0.5 * smoothstep(0.25, 0.5, normCoord) * normCoord; + normCoord = s * normCoord; + + normCoord += normCenter; + + vec2 textureCoordinateToUse = normCoord / 2.0 + 0.5; + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse); + } +); +#endif @implementation GPUImageStretchDistortionFilter diff --git a/framework/Source/GPUImageSwirlFilter.m b/framework/Source/GPUImageSwirlFilter.m index 6fd55208e..5462bc65f 100755 --- a/framework/Source/GPUImageSwirlFilter.m +++ b/framework/Source/GPUImageSwirlFilter.m @@ -1,7 +1,7 @@ #import "GPUImageSwirlFilter.h" // Adapted from the shader example here: http://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl/ - +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageSwirlFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -31,6 +31,36 @@ void main() } ); +#else +NSString *const kGPUImageSwirlFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + uniform vec2 center; + uniform float radius; + uniform float angle; + + void main() + { + vec2 textureCoordinateToUse = textureCoordinate; + float dist = distance(center, textureCoordinate); + if (dist < radius) + { + textureCoordinateToUse -= center; + float percent = (radius - dist) / radius; + float theta = percent * percent * angle * 8.0; + float s = sin(theta); + float c = cos(theta); + textureCoordinateToUse = vec2(dot(textureCoordinateToUse, vec2(c, -s)), dot(textureCoordinateToUse, vec2(s, c))); + textureCoordinateToUse += center; + } + + gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse ); + } +); +#endif @implementation GPUImageSwirlFilter diff --git a/framework/Source/GPUImageThresholdSketchFilter.m b/framework/Source/GPUImageThresholdSketchFilter.m index aba7e1d04..8215879be 100644 --- a/framework/Source/GPUImageThresholdSketchFilter.m +++ b/framework/Source/GPUImageThresholdSketchFilter.m @@ -1,6 +1,6 @@ #import "GPUImageThresholdSketchFilter.h" - +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageThresholdSketchFragmentShaderString = SHADER_STRING ( precision highp float; @@ -40,8 +40,47 @@ void main() gl_FragColor = vec4(vec3(mag), 1.0); } - ); - +); +#else +NSString *const kGPUImageThresholdSketchFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float threshold; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; + float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; + float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + + float mag = 1.0 - length(vec2(h, v)); + mag = step(threshold, mag); + + gl_FragColor = vec4(vec3(mag), 1.0); + } +); +#endif @implementation GPUImageThresholdSketchFilter diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index 7bfbe1688..758f2410c 100755 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -3,6 +3,7 @@ #import "GPUImageTwoInputFilter.h" #import "GPUImageGaussianBlurFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageTiltShiftFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -26,6 +27,31 @@ void main() gl_FragColor = mix(sharpImageColor, blurredImageColor, blurIntensity); } ); +#else +NSString *const kGPUImageTiltShiftFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + varying vec2 textureCoordinate2; + + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + uniform float topFocusLevel; + uniform float bottomFocusLevel; + uniform float focusFallOffRate; + + void main() + { + vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); + vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); + + float blurIntensity = 1.0 - smoothstep(topFocusLevel - focusFallOffRate, topFocusLevel, textureCoordinate2.y); + blurIntensity += smoothstep(bottomFocusLevel, bottomFocusLevel + focusFallOffRate, textureCoordinate2.y); + + gl_FragColor = mix(sharpImageColor, blurredImageColor, blurIntensity); + } +); +#endif @implementation GPUImageTiltShiftFilter diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m index 827678e53..6e1eadb2f 100755 --- a/framework/Source/GPUImageVignetteFilter.m +++ b/framework/Source/GPUImageVignetteFilter.m @@ -1,5 +1,6 @@ #import "GPUImageVignetteFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageVignetteFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -18,6 +19,26 @@ void main() gl_FragColor = vec4(mix(sourceImageColor.rgb, vignetteColor, percent), sourceImageColor.a); } ); +#else +NSString *const kGPUImageVignetteFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + varying vec2 textureCoordinate; + + uniform vec2 vignetteCenter; + uniform vec3 vignetteColor; + uniform float vignetteStart; + uniform float vignetteEnd; + + void main() + { + vec4 sourceImageColor = texture2D(inputImageTexture, textureCoordinate); + float d = distance(textureCoordinate, vec2(vignetteCenter.x, vignetteCenter.y)); + float percent = smoothstep(vignetteStart, vignetteEnd, d); + gl_FragColor = vec4(mix(sourceImageColor.rgb, vignetteColor, percent), sourceImageColor.a); + } +); +#endif @implementation GPUImageVignetteFilter diff --git a/framework/Source/GPUImageVoronoiConsumerFilter.m b/framework/Source/GPUImageVoronoiConsumerFilter.m index d7aeee295..c12c34f42 100644 --- a/framework/Source/GPUImageVoronoiConsumerFilter.m +++ b/framework/Source/GPUImageVoronoiConsumerFilter.m @@ -1,5 +1,6 @@ #import "GPUImageVoronoiConsumerFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageVoronoiConsumerFragmentShaderString = SHADER_STRING ( @@ -26,9 +27,34 @@ void main(void) { gl_FragColor = color; } +); +#else +NSString *const kGPUImageVoronoiConsumerFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + uniform vec2 size; + varying vec2 textureCoordinate; + vec2 getCoordFromColor(vec4 color) + { + float z = color.z * 256.0; + float yoff = floor(z / 8.0); + float xoff = mod(z, 8.0); + float x = color.x*256.0 + xoff*256.0; + float y = color.y*256.0 + yoff*256.0; + return vec2(x,y) / size; + } - ); + void main(void) + { + vec4 colorLoc = texture2D(inputImageTexture2, textureCoordinate); + vec4 color = texture2D(inputImageTexture, getCoordFromColor(colorLoc)); + + gl_FragColor = color; + } +); +#endif @implementation GPUImageVoronoiConsumerFilter diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 2a6d82ec9..3da667ccd 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -122,6 +122,33 @@ #import #import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import // Outputs #import diff --git a/framework/Source/Mac/GPUImageContext.h b/framework/Source/Mac/GPUImageContext.h index 7281bd97c..f04f91efa 100755 --- a/framework/Source/Mac/GPUImageContext.h +++ b/framework/Source/Mac/GPUImageContext.h @@ -4,7 +4,7 @@ #import #import "GLProgram.h" -#define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical) +#define GPUImageRotationSwapsWidthAndHeight(rotation) (((rotation) == kGPUImageRotateLeft) || ((rotation) == kGPUImageRotateRight) || ((rotation) == kGPUImageRotateRightFlipVertical) ) typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180 } GPUImageRotationMode; From 41c631660658021af42a9b8aa91e6229a26656f6 Mon Sep 17 00:00:00 2001 From: DrMoriarty Date: Mon, 20 May 2013 08:07:44 +0400 Subject: [PATCH 380/695] bugfix --- framework/Source/GPUImageThreeInputFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageThreeInputFilter.m b/framework/Source/GPUImageThreeInputFilter.m index 635bc2769..db5ccd83f 100644 --- a/framework/Source/GPUImageThreeInputFilter.m +++ b/framework/Source/GPUImageThreeInputFilter.m @@ -228,7 +228,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; outputTextureRetainCount = [targets count]; // You can set up infinite update loops, so this helps to short circuit them - if (hasReceivedFirstFrame && hasReceivedSecondFrame) + if (hasReceivedFirstFrame && hasReceivedSecondFrame && hasReceivedThirdFrame) { return; } From 4db09e572baa836f1d72e11614f9fa4310a817b9 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 24 May 2013 16:41:12 -0500 Subject: [PATCH 381/695] Attempting to protect against improper deallocation of resources outside of the image processing OpenGL ES context. --- framework/Source/GPUImageBuffer.m | 38 ++++++++------ framework/Source/GPUImageFilter.m | 16 +++--- framework/Source/GPUImageOutput.m | 14 ++++-- framework/Source/GPUImagePoissonBlendFilter.m | 28 ++++++----- framework/Source/GPUImageRawDataOutput.m | 40 ++++++++------- framework/Source/GPUImageToneCurveFilter.m | 16 +++--- framework/Source/GPUImageTwoPassFilter.m | 26 ++++++---- framework/Source/GPUImageVideoCamera.m | 26 ++++++---- framework/Source/iOS/GPUImageMovieWriter.m | 50 ++++++++++--------- 9 files changed, 146 insertions(+), 108 deletions(-) diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index 63ba2d6ba..0dee1b148 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -119,26 +119,36 @@ - (GLuint)textureForOutput; - (GLuint)generateTexture; { - GLuint newTextureName = 0; - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &newTextureName); - glBindTexture(GL_TEXTURE_2D, newTextureName); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - CGSize currentFBOSize = [self sizeOfFBO]; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glBindTexture(GL_TEXTURE_2D, 0); + __block GLuint newTextureName = 0; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &newTextureName); + glBindTexture(GL_TEXTURE_2D, newTextureName); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + CGSize currentFBOSize = [self sizeOfFBO]; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glBindTexture(GL_TEXTURE_2D, 0); + + }); return newTextureName; } - (void)removeTexture:(GLuint)textureToRemove; { - glDeleteTextures(1, &textureToRemove); + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + glDeleteTextures(1, &textureToRemove); + }); } #pragma mark - diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 694262f6b..4558308d9 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -941,14 +941,18 @@ - (void)cleanupOutputImage; - (void)deleteOutputTexture; { - if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) - { - if (outputTexture) + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } } - } + }); } - (CGSize)maximumOutputSize; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 08478bf3e..f9e08fed2 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -230,11 +230,15 @@ - (void)initializeOutputTextureIfNeeded; - (void)deleteOutputTexture; { - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } + }); } - (void)forceProcessingAtSize:(CGSize)frameSize; diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m index 8cca788d5..59e75feb2 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.m +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -146,20 +146,24 @@ - (void)initializeSecondOutputTextureIfNeeded; - (void)deleteOutputTexture; { - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } - - if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) - { - if (secondFilterOutputTexture) + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + if (outputTexture) { - glDeleteTextures(1, &secondFilterOutputTexture); - secondFilterOutputTexture = 0; + glDeleteTextures(1, &outputTexture); + outputTexture = 0; } - } + + if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) + { + if (secondFilterOutputTexture) + { + glDeleteTextures(1, &secondFilterOutputTexture); + secondFilterOutputTexture = 0; + } + } + }); } - (void)createFilterFBOofSize:(CGSize)currentFBOSize diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index a22e10d54..51373acb8 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -189,25 +189,27 @@ - (void)createDataFBO; - (void)destroyDataFBO; { - [GPUImageContext useImageProcessingContext]; - - if (renderTexture) - { - CFRelease(renderTexture); - renderTexture = NULL; - } - - if (dataFramebuffer) - { - glDeleteFramebuffers(1, &dataFramebuffer); - dataFramebuffer = 0; - } - - if (dataRenderbuffer) - { - glDeleteRenderbuffers(1, &dataRenderbuffer); - dataRenderbuffer = 0; - } + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + if (renderTexture) + { + CFRelease(renderTexture); + renderTexture = NULL; + } + + if (dataFramebuffer) + { + glDeleteFramebuffers(1, &dataFramebuffer); + dataFramebuffer = 0; + } + + if (dataRenderbuffer) + { + glDeleteRenderbuffers(1, &dataRenderbuffer); + dataRenderbuffer = 0; + } + }); } - (void)setFilterFBO; diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 3fe2a539d..5fedcb543 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -229,12 +229,16 @@ - (void)setPointsWithACVURL:(NSURL*)curveFileURL - (void)dealloc { - if (toneCurveTexture) - { - glDeleteTextures(1, &toneCurveTexture); - toneCurveTexture = 0; - free(toneCurveByteArray); - } + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + if (toneCurveTexture) + { + glDeleteTextures(1, &toneCurveTexture); + toneCurveTexture = 0; + free(toneCurveByteArray); + } + }); } #pragma mark - diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index f7cdcdf2c..f8a25a981 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -102,20 +102,24 @@ - (void)initializeSecondOutputTextureIfNeeded; - (void)deleteOutputTexture; { - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; - if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) - { - if (secondFilterOutputTexture) + if (outputTexture) { - glDeleteTextures(1, &secondFilterOutputTexture); - secondFilterOutputTexture = 0; + glDeleteTextures(1, &outputTexture); + outputTexture = 0; } - } + + if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) + { + if (secondFilterOutputTexture) + { + glDeleteTextures(1, &secondFilterOutputTexture); + secondFilterOutputTexture = 0; + } + } + }); } #pragma mark - diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index b7c475868..ed8a61620 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -784,17 +784,21 @@ - (void)createYUVConversionFBO; - (void)destroyYUVConversionFBO; { - if (yuvConversionFramebuffer) - { - glDeleteFramebuffers(1, &yuvConversionFramebuffer); - yuvConversionFramebuffer = 0; - } - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + if (yuvConversionFramebuffer) + { + glDeleteFramebuffers(1, &yuvConversionFramebuffer); + yuvConversionFramebuffer = 0; + } + + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } + }); } diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 919f12779..e2786cab6 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -402,37 +402,39 @@ - (void)createDataFBO; - (void)destroyDataFBO; { - [GPUImageContext useImageProcessingContext]; + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; - if (movieFramebuffer) - { - glDeleteFramebuffers(1, &movieFramebuffer); - movieFramebuffer = 0; - } - - if (movieRenderbuffer) - { - glDeleteRenderbuffers(1, &movieRenderbuffer); - movieRenderbuffer = 0; - } - - if ([GPUImageContext supportsFastTextureUpload]) - { - if (coreVideoTextureCache) + if (movieFramebuffer) { - CFRelease(coreVideoTextureCache); + glDeleteFramebuffers(1, &movieFramebuffer); + movieFramebuffer = 0; } - - if (renderTexture) + + if (movieRenderbuffer) { - CFRelease(renderTexture); + glDeleteRenderbuffers(1, &movieRenderbuffer); + movieRenderbuffer = 0; } - if (renderTarget) + + if ([GPUImageContext supportsFastTextureUpload]) { - CVPixelBufferRelease(renderTarget); + if (coreVideoTextureCache) + { + CFRelease(coreVideoTextureCache); + } + + if (renderTexture) + { + CFRelease(renderTexture); + } + if (renderTarget) + { + CVPixelBufferRelease(renderTarget); + } + } - - } + }); } - (void)setFilterFBO; From 158bb79c92d17af112e30ee54409d0ecd9ad82d6 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Fri, 24 May 2013 16:46:57 -0600 Subject: [PATCH 382/695] Added color filter Use case: Set all the pixels of an image to a color, for generating fast background colors. --- framework/Source/GPUImage.h | 1 + framework/Source/GPUImageColorFilter.h | 12 ++++++ framework/Source/GPUImageColorFilter.m | 53 ++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 framework/Source/GPUImageColorFilter.h create mode 100644 framework/Source/GPUImageColorFilter.m diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 3d170df0b..00383cfed 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -24,6 +24,7 @@ #import "GPUImagePixellateFilter.h" #import "GPUImagePixellatePositionFilter.h" #import "GPUImageSepiaFilter.h" +#import "GPUImageColorFilter.h" #import "GPUImageColorInvertFilter.h" #import "GPUImageSaturationFilter.h" #import "GPUImageContrastFilter.h" diff --git a/framework/Source/GPUImageColorFilter.h b/framework/Source/GPUImageColorFilter.h new file mode 100644 index 000000000..aca340356 --- /dev/null +++ b/framework/Source/GPUImageColorFilter.h @@ -0,0 +1,12 @@ +#import "GPUImageFilter.h" + +@interface GPUImageColorFilter : GPUImageFilter +{ + GLint filterColorUniform; +} + +@property(readwrite, nonatomic) GPUVector4 color; + +- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; + +@end diff --git a/framework/Source/GPUImageColorFilter.m b/framework/Source/GPUImageColorFilter.m new file mode 100644 index 000000000..17c5f5c00 --- /dev/null +++ b/framework/Source/GPUImageColorFilter.m @@ -0,0 +1,53 @@ +#import "GPUImageColorFilter.h" + +NSString *const kGPUColorFragmentShaderString = SHADER_STRING +( + precision lowp float; + + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform vec3 filterColor; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + gl_FragColor = vec4(filterColor, textureColor.a); + } + ); + +@implementation GPUImageColorFilter + +@synthesize color = _color; + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUColorFragmentShaderString])) + { + return nil; + } + + filterColorUniform = [filterProgram uniformIndex:@"filterColor"]; + + self.color = (GPUVector4){1.0f, 1.0f, 1.0f, 1.0f}; + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setColor:(GPUVector4)color; +{ + _color = color; + + [self setColorRed:color.one green:color.two blue:color.three]; +} + +- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; +{ + GPUVector3 filterColor = {redComponent, greenComponent, blueComponent}; + + [self setVec3:filterColor forUniform:filterColorUniform program:filterProgram]; +} + +@end From 98ee5593b52126a5f23d34f16fd0f964e1e9a6f1 Mon Sep 17 00:00:00 2001 From: Jens Daemgen Date: Mon, 27 May 2013 18:43:54 +0200 Subject: [PATCH 383/695] Add convenience method to GPUImageFilterPipeline to get a UIImage with specific orientation --- framework/Source/GPUImageFilterPipeline.h | 1 + framework/Source/GPUImageFilterPipeline.m | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 0c6a06b3c..90b565f17 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -23,6 +23,7 @@ - (void) removeAllFilters; - (UIImage *) currentFilteredFrame; +- (UIImage *) currentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation; - (CGImageRef) newCGImageFromCurrentFilteredFrame; - (CGImageRef) newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation; diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 84057e95c..f719c17ee 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -201,6 +201,10 @@ - (UIImage *)currentFilteredFrame { return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentlyProcessedOutput]; } +- (UIImage *)currentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation { + return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; +} + - (CGImageRef)newCGImageFromCurrentFilteredFrame { return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; } From 845df55df7b34002c5600dae2830769872500e8a Mon Sep 17 00:00:00 2001 From: Fco Javier Valdera Date: Wed, 29 May 2013 15:13:12 +0200 Subject: [PATCH 384/695] Fixed an issue that caused an app crash if the processing of the video was cancelled right after it started. This caused the assetWriter of the GPUImageMovieWriter to be in an unknown state instead of a cancelled state. --- framework/Source/iOS/GPUImageMovieWriter.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index e2786cab6..6a5d38ade 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -267,7 +267,8 @@ - (void)finishRecording; - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; { - if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled) + if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled + || assetWriter.status == AVAssetWriterStatusUnknown) { return; } From e5f64ec714b55d7929a0ff0044a8073d475e3167 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 29 May 2013 15:54:28 +0100 Subject: [PATCH 385/695] Added GPUImageLoopingMovie to support looping videos --- framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 1 + framework/Source/GPUImageLoopingMovie.h | 46 +++ framework/Source/GPUImageLoopingMovie.m | 387 +++++++++++++++++++ 4 files changed, 442 insertions(+) create mode 100755 framework/Source/GPUImageLoopingMovie.h create mode 100755 framework/Source/GPUImageLoopingMovie.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index eb9e59990..574fe3154 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -348,6 +348,8 @@ C04C8D1815F8059F00449601 /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */; }; C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (); }; }; C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; + FC1D631E17564925004E2166 /* GPUImageLoopingMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = FC1D631C17564925004E2166 /* GPUImageLoopingMovie.h */; }; + FC1D631F17564925004E2166 /* GPUImageLoopingMovie.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1D631D17564925004E2166 /* GPUImageLoopingMovie.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -691,6 +693,8 @@ C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorBlendFilter.m; path = Source/GPUImageColorBlendFilter.m; sourceTree = SOURCE_ROOT; }; C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueFilter.m; path = Source/GPUImageHueFilter.m; sourceTree = SOURCE_ROOT; }; + FC1D631C17564925004E2166 /* GPUImageLoopingMovie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLoopingMovie.h; path = Source/GPUImageLoopingMovie.h; sourceTree = SOURCE_ROOT; }; + FC1D631D17564925004E2166 /* GPUImageLoopingMovie.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLoopingMovie.m; path = Source/GPUImageLoopingMovie.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -961,6 +965,8 @@ BCB5E7D914E6003400701302 /* GPUImagePicture.m */, BC982C6A14F33C290001FF6F /* GPUImageMovie.h */, BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */, + FC1D631C17564925004E2166 /* GPUImageLoopingMovie.h */, + FC1D631D17564925004E2166 /* GPUImageLoopingMovie.m */, BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */, BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */, BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */, @@ -1334,6 +1340,7 @@ BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */, BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */, BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */, + FC1D631E17564925004E2166 /* GPUImageLoopingMovie.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1606,6 +1613,7 @@ BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */, BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */, BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */, + FC1D631F17564925004E2166 /* GPUImageLoopingMovie.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 3d170df0b..61fcaaa3c 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -7,6 +7,7 @@ #import "GPUImageVideoCamera.h" #import "GPUImageStillCamera.h" #import "GPUImageMovie.h" +#import "GPUImageLoopingMovie.h" #import "GPUImagePicture.h" #import "GPUImageRawDataInput.h" #import "GPUImageRawDataOutput.h" diff --git a/framework/Source/GPUImageLoopingMovie.h b/framework/Source/GPUImageLoopingMovie.h new file mode 100755 index 000000000..38672f8f2 --- /dev/null +++ b/framework/Source/GPUImageLoopingMovie.h @@ -0,0 +1,46 @@ +#import +#import +#import "GPUImageContext.h" +#import "GPUImageOutput.h" + +/** Protocol for getting Movie played callback. + */ +@protocol GPUImageMovieDelegate + +- (void)didCompletePlayingMovie; +@end + +/** Source object for filtering movies + */ +@interface GPUImageLoopingMovie : GPUImageOutput + +@property (readwrite, retain) AVAsset *asset; +@property(readwrite, retain) NSURL *url; + +/** This enables the benchmarking mode, which logs out instantaneous and average frame times to the console + */ +@property(readwrite, nonatomic) BOOL runBenchmark; + +/** This determines whether to play back a movie as fast as the frames can be processed, or if the original speed of the movie should be respected. Defaults to NO. + */ +@property(readwrite, nonatomic) BOOL playAtActualSpeed; + +/** This is used to send the delete Movie did complete playing alert + */ +@property (readwrite, nonatomic, assign) id delegate; + +/// @name Initialization and teardown +- (id)initWithAsset:(AVAsset *)asset; +- (id)initWithURL:(NSURL *)url; +- (void)textureCacheSetup; + +/// @name Movie processing +- (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; +- (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; +- (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; +- (void)startProcessing; +- (void)endProcessing; +- (void)cancelProcessing; +- (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; + +@end diff --git a/framework/Source/GPUImageLoopingMovie.m b/framework/Source/GPUImageLoopingMovie.m new file mode 100755 index 000000000..9d5d2ac56 --- /dev/null +++ b/framework/Source/GPUImageLoopingMovie.m @@ -0,0 +1,387 @@ +#import "GPUImageLoopingMovie.h" +#import "GPUImageMovieWriter.h" + +@interface GPUImageLoopingMovie () +{ + BOOL audioEncodingIsFinished, videoEncodingIsFinished; + GPUImageMovieWriter *synchronizedMovieWriter; + CVOpenGLESTextureCacheRef coreVideoTextureCache; + AVAssetReader *reader; + CMTime previousFrameTime; + CFAbsoluteTime previousActualFrameTime; + BOOL keepLooping; +} + +- (void)processAsset; + +@end + +@implementation GPUImageLoopingMovie + +@synthesize url = _url; +@synthesize asset = _asset; +@synthesize runBenchmark = _runBenchmark; +@synthesize playAtActualSpeed = _playAtActualSpeed; +@synthesize delegate = _delegate; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithURL:(NSURL *)url; +{ + if (!(self = [super init])) + { + return nil; + } + + [self textureCacheSetup]; + + self.url = url; + self.asset = nil; + + return self; +} + +- (id)initWithAsset:(AVAsset *)asset; +{ + if (!(self = [super init])) + { + return nil; + } + + [self textureCacheSetup]; + + self.url = nil; + self.asset = asset; + + return self; +} + +- (void)textureCacheSetup; +{ + if ([GPUImageContext supportsFastTextureUpload]) + { + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); +#else + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); +#endif + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + } + + // Need to remove the initially created texture + [self deleteOutputTexture]; + }); + } +} + +- (void)dealloc +{ + if ([GPUImageContext supportsFastTextureUpload]) + { + CFRelease(coreVideoTextureCache); + } +} +#pragma mark - +#pragma mark Movie processing + +- (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; +{ + synchronizedMovieWriter = movieWriter; + movieWriter.encodingLiveVideo = NO; +} + +- (void)startProcessing +{ + if(self.url == nil) + { + [self processAsset]; + return; + } + + keepLooping = YES; + + previousFrameTime = kCMTimeZero; + previousActualFrameTime = CFAbsoluteTimeGetCurrent(); + + NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; + AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; + + GPUImageLoopingMovie __block *blockSelf = self; + + [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ + NSError *error = nil; + AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; + if (!tracksStatus == AVKeyValueStatusLoaded) + { + return; + } + blockSelf.asset = inputAsset; + [blockSelf processAsset]; + blockSelf = nil; + }]; +} + +- (void)processAsset +{ + __unsafe_unretained GPUImageLoopingMovie *weakSelf = self; + NSError *error = nil; + reader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; + + NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; + [outputSettings setObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (NSString*)kCVPixelBufferPixelFormatTypeKey]; + // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding + AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; + [reader addOutput:readerVideoTrackOutput]; + + NSArray *audioTracks = [self.asset tracksWithMediaType:AVMediaTypeAudio]; + BOOL shouldRecordAudioTrack = NO; //(([audioTracks count] > 0) && (weakSelf.audioEncodingTarget != nil) ); + AVAssetReaderTrackOutput *readerAudioTrackOutput = nil; + + if (shouldRecordAudioTrack) + { + audioEncodingIsFinished = NO; + + // This might need to be extended to handle movies with more than one audio track + AVAssetTrack* audioTrack = [audioTracks objectAtIndex:0]; + readerAudioTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]; + [reader addOutput:readerAudioTrackOutput]; + } + + if ([reader startReading] == NO) + { + NSLog(@"Error reading from file at URL: %@", weakSelf.url); + return; + } + + if (synchronizedMovieWriter != nil) + { + [synchronizedMovieWriter setVideoInputReadyCallback:^{ + [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; + }]; + + [synchronizedMovieWriter setAudioInputReadyCallback:^{ + [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; + }]; + + [synchronizedMovieWriter enableSynchronizationCallbacks]; + } + else + { + while (reader.status == AVAssetReaderStatusReading && keepLooping) + { + [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; + + if ( (shouldRecordAudioTrack) && (!audioEncodingIsFinished) ) + { + [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; + } + + } + + if (reader.status == AVAssetWriterStatusCompleted) { + + [reader cancelReading]; + reader = nil; + + if (keepLooping) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self startProcessing]; + }); + } + + /* [weakSelf endProcessing]; + if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { + [self.delegate didCompletePlayingMovie]; + }*/ + } + } +} + +- (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; +{ + if (reader.status == AVAssetReaderStatusReading) + { + CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; + if (sampleBufferRef) + { + if (_playAtActualSpeed) + { + // Do this outside of the video processing queue to not slow that down while waiting + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBufferRef); + CMTime differenceFromLastFrame = CMTimeSubtract(currentSampleTime, previousFrameTime); + CFAbsoluteTime currentActualTime = CFAbsoluteTimeGetCurrent(); + + CGFloat frameTimeDifference = CMTimeGetSeconds(differenceFromLastFrame); + CGFloat actualTimeDifference = currentActualTime - previousActualFrameTime; + + if (frameTimeDifference > actualTimeDifference) + { + usleep(1000000.0 * (frameTimeDifference - actualTimeDifference)); + } + + previousFrameTime = currentSampleTime; + previousActualFrameTime = CFAbsoluteTimeGetCurrent(); + } + + __unsafe_unretained GPUImageLoopingMovie *weakSelf = self; + runSynchronouslyOnVideoProcessingQueue(^{ + [weakSelf processMovieFrame:sampleBufferRef]; + }); + + CMSampleBufferInvalidate(sampleBufferRef); + CFRelease(sampleBufferRef); + } + else + { + // videoEncodingIsFinished = YES; + // [self endProcessing]; + } + } + else if (synchronizedMovieWriter != nil) + { + if (reader.status == AVAssetWriterStatusCompleted) + { + [self endProcessing]; + } + } +} + +- (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; +{ + if (audioEncodingIsFinished) + { + return; + } + + CMSampleBufferRef audioSampleBufferRef = [readerAudioTrackOutput copyNextSampleBuffer]; + + if (audioSampleBufferRef) + { + runSynchronouslyOnVideoProcessingQueue(^{ + [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; + + CMSampleBufferInvalidate(audioSampleBufferRef); + CFRelease(audioSampleBufferRef); + }); + } + else + { + audioEncodingIsFinished = YES; + } +} + +- (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; +{ +// CMTimeGetSeconds +// CMTimeSubtract + + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(movieSampleBuffer); + CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(movieSampleBuffer); + + int bufferHeight = CVPixelBufferGetHeight(movieFrame); +#if TARGET_IPHONE_SIMULATOR + int bufferWidth = CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) +#else + int bufferWidth = CVPixelBufferGetWidth(movieFrame); +#endif + + CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + + if ([GPUImageContext supportsFastTextureUpload]) + { + CVPixelBufferLockBaseAddress(movieFrame, 0); + + [GPUImageContext useImageProcessingContext]; + CVOpenGLESTextureRef texture = NULL; + CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); + + if (!texture || err) { + NSLog(@"Movie CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + return; + } + + outputTexture = CVOpenGLESTextureGetName(texture); + // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; + [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; + [currentTarget setTextureDelegate:self atIndex:targetTextureIndex]; + + [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; + } + + CVPixelBufferUnlockBaseAddress(movieFrame, 0); + + // Flush the CVOpenGLESTexture cache and release the texture + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(texture); + outputTexture = 0; + } + else + { + // Upload to texture + CVPixelBufferLockBaseAddress(movieFrame, 0); + + glBindTexture(GL_TEXTURE_2D, outputTexture); + // Using BGRA extension to pull in video frame data directly + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(movieFrame)); + + CGSize currentSize = CGSizeMake(bufferWidth, bufferHeight); + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:currentSize atIndex:targetTextureIndex]; + [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; + } + CVPixelBufferUnlockBaseAddress(movieFrame, 0); + } + + if (_runBenchmark) + { + CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); + NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); + } +} + +- (void)endProcessing; +{ + keepLooping = NO; + + for (id currentTarget in targets) + { + [currentTarget endProcessing]; + } + + if (synchronizedMovieWriter != nil) + { + [synchronizedMovieWriter setVideoInputReadyCallback:^{}]; + [synchronizedMovieWriter setAudioInputReadyCallback:^{}]; + } +} + +- (void)cancelProcessing +{ + if (reader) { + [reader cancelReading]; + } + [self endProcessing]; +} + +@end From d80b056bd66cad67820780c9a4af8fe07a7b3c79 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 29 May 2013 16:12:35 +0100 Subject: [PATCH 386/695] Removed duplicate GPUImageMovieDelegate definition --- framework/Source/GPUImageLoopingMovie.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/framework/Source/GPUImageLoopingMovie.h b/framework/Source/GPUImageLoopingMovie.h index 38672f8f2..976b78b63 100755 --- a/framework/Source/GPUImageLoopingMovie.h +++ b/framework/Source/GPUImageLoopingMovie.h @@ -3,12 +3,6 @@ #import "GPUImageContext.h" #import "GPUImageOutput.h" -/** Protocol for getting Movie played callback. - */ -@protocol GPUImageMovieDelegate - -- (void)didCompletePlayingMovie; -@end /** Source object for filtering movies */ From e698ccb64637d748987cdb17462dd7e1e21b9cdc Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 29 May 2013 16:13:14 +0100 Subject: [PATCH 387/695] Bugfix when recording input from two inputs (mismatched timestamps). Now always uses time from first input. --- framework/Source/GPUImageTwoInputFilter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index b4a5d9dc3..669f03e90 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -249,7 +249,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; // || (hasReceivedFirstFrame && secondFrameCheckDisabled) || (hasReceivedSecondFrame && firstFrameCheckDisabled) if ((hasReceivedFirstFrame && hasReceivedSecondFrame) || updatedMovieFrameOppositeStillImage) { - [super newFrameReadyAtTime:frameTime atIndex:0]; + [super newFrameReadyAtTime:firstFrameTime atIndex:0]; // Bugfix when trying to record: always use time from first input hasReceivedFirstFrame = NO; hasReceivedSecondFrame = NO; } From a1ea5c26f3514bb7c4f976e4d26d2177dff88704 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 29 May 2013 16:26:19 +0100 Subject: [PATCH 388/695] Fixed #import --- framework/Source/GPUImageLoopingMovie.h | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/Source/GPUImageLoopingMovie.h b/framework/Source/GPUImageLoopingMovie.h index 976b78b63..1dc39106a 100755 --- a/framework/Source/GPUImageLoopingMovie.h +++ b/framework/Source/GPUImageLoopingMovie.h @@ -2,6 +2,7 @@ #import #import "GPUImageContext.h" #import "GPUImageOutput.h" +#import "GPUImageMovie.h" /** Source object for filtering movies From 02d5a890c0bfdeefbeb7e464d6f94e914ae894e6 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 29 May 2013 16:57:24 +0100 Subject: [PATCH 389/695] Improved handling when looping ends --- framework/Source/GPUImageLoopingMovie.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/Source/GPUImageLoopingMovie.m b/framework/Source/GPUImageLoopingMovie.m index 9d5d2ac56..d9976f354 100755 --- a/framework/Source/GPUImageLoopingMovie.m +++ b/framework/Source/GPUImageLoopingMovie.m @@ -192,12 +192,12 @@ - (void)processAsset dispatch_async(dispatch_get_main_queue(), ^{ [self startProcessing]; }); + } else { + [weakSelf endProcessing]; + if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { + [self.delegate didCompletePlayingMovie]; + } } - - /* [weakSelf endProcessing]; - if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { - [self.delegate didCompletePlayingMovie]; - }*/ } } } From 1f6f1302ce3ff5cc8af7940c9bcfdb1c37b4a3b6 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 2 Jun 2013 21:50:01 -0500 Subject: [PATCH 390/695] Fixed crashes related to dispatch_get_specific() on iOS 4.x, removed a deprecation warning. --- framework/Source/GPUImageOutput.m | 13 ++++++++++--- framework/Source/iOS/GPUImageContext.m | 3 +++ framework/Source/iOS/GPUImageMovieWriter.m | 3 +++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index f9e08fed2..0ec129745 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -18,8 +18,11 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)) void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; - - if(dispatch_get_specific([GPUImageContext contextKey])) +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) + if (dispatch_get_current_queue() == videoProcessingQueue) +#else + if (dispatch_get_specific([GPUImageContext contextKey])) +#endif { block(); }else @@ -32,7 +35,11 @@ void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; - if(dispatch_get_specific([GPUImageContext contextKey])) +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) + if (dispatch_get_current_queue() == videoProcessingQueue) +#else + if (dispatch_get_specific([GPUImageContext contextKey])) +#endif { block(); }else diff --git a/framework/Source/iOS/GPUImageContext.m b/framework/Source/iOS/GPUImageContext.m index fd2bef1c4..91e386aff 100755 --- a/framework/Source/iOS/GPUImageContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -27,7 +27,10 @@ - (id)init; openGLESContextQueueKey = &openGLESContextQueueKey; _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) +#else dispatch_queue_set_specific(_contextQueue, openGLESContextQueueKey, (__bridge void *)self, NULL); +#endif shaderProgramCache = [[NSMutableDictionary alloc] init]; return self; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 6a5d38ade..48fa3c92c 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -289,7 +289,10 @@ - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; } else { // Not running iOS 6 +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" [assetWriter finishWriting]; +#pragma clang diagnostic pop if (handler) handler(); } #endif From 04ffd2557ca6ac99cd16e7ff8d9f8502a8554b0c Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Mon, 3 Jun 2013 22:00:25 +0100 Subject: [PATCH 391/695] Added shouldRepeat as property on GPUImageMovie to loop movies instead of a separate class --- framework/GPUImage.xcodeproj/project.pbxproj | 8 - framework/Source/GPUImage.h | 1 - framework/Source/GPUImageLoopingMovie.h | 41 -- framework/Source/GPUImageLoopingMovie.m | 387 ------------------- framework/Source/GPUImageMovie.h | 4 + framework/Source/GPUImageMovie.m | 29 +- 6 files changed, 28 insertions(+), 442 deletions(-) delete mode 100755 framework/Source/GPUImageLoopingMovie.h delete mode 100755 framework/Source/GPUImageLoopingMovie.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 574fe3154..eb9e59990 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -348,8 +348,6 @@ C04C8D1815F8059F00449601 /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */; }; C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (); }; }; C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; - FC1D631E17564925004E2166 /* GPUImageLoopingMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = FC1D631C17564925004E2166 /* GPUImageLoopingMovie.h */; }; - FC1D631F17564925004E2166 /* GPUImageLoopingMovie.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1D631D17564925004E2166 /* GPUImageLoopingMovie.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -693,8 +691,6 @@ C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorBlendFilter.m; path = Source/GPUImageColorBlendFilter.m; sourceTree = SOURCE_ROOT; }; C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueFilter.m; path = Source/GPUImageHueFilter.m; sourceTree = SOURCE_ROOT; }; - FC1D631C17564925004E2166 /* GPUImageLoopingMovie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLoopingMovie.h; path = Source/GPUImageLoopingMovie.h; sourceTree = SOURCE_ROOT; }; - FC1D631D17564925004E2166 /* GPUImageLoopingMovie.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLoopingMovie.m; path = Source/GPUImageLoopingMovie.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -965,8 +961,6 @@ BCB5E7D914E6003400701302 /* GPUImagePicture.m */, BC982C6A14F33C290001FF6F /* GPUImageMovie.h */, BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */, - FC1D631C17564925004E2166 /* GPUImageLoopingMovie.h */, - FC1D631D17564925004E2166 /* GPUImageLoopingMovie.m */, BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */, BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */, BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */, @@ -1340,7 +1334,6 @@ BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */, BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */, BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */, - FC1D631E17564925004E2166 /* GPUImageLoopingMovie.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1613,7 +1606,6 @@ BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */, BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */, BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */, - FC1D631F17564925004E2166 /* GPUImageLoopingMovie.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 61fcaaa3c..3d170df0b 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -7,7 +7,6 @@ #import "GPUImageVideoCamera.h" #import "GPUImageStillCamera.h" #import "GPUImageMovie.h" -#import "GPUImageLoopingMovie.h" #import "GPUImagePicture.h" #import "GPUImageRawDataInput.h" #import "GPUImageRawDataOutput.h" diff --git a/framework/Source/GPUImageLoopingMovie.h b/framework/Source/GPUImageLoopingMovie.h deleted file mode 100755 index 1dc39106a..000000000 --- a/framework/Source/GPUImageLoopingMovie.h +++ /dev/null @@ -1,41 +0,0 @@ -#import -#import -#import "GPUImageContext.h" -#import "GPUImageOutput.h" -#import "GPUImageMovie.h" - - -/** Source object for filtering movies - */ -@interface GPUImageLoopingMovie : GPUImageOutput - -@property (readwrite, retain) AVAsset *asset; -@property(readwrite, retain) NSURL *url; - -/** This enables the benchmarking mode, which logs out instantaneous and average frame times to the console - */ -@property(readwrite, nonatomic) BOOL runBenchmark; - -/** This determines whether to play back a movie as fast as the frames can be processed, or if the original speed of the movie should be respected. Defaults to NO. - */ -@property(readwrite, nonatomic) BOOL playAtActualSpeed; - -/** This is used to send the delete Movie did complete playing alert - */ -@property (readwrite, nonatomic, assign) id delegate; - -/// @name Initialization and teardown -- (id)initWithAsset:(AVAsset *)asset; -- (id)initWithURL:(NSURL *)url; -- (void)textureCacheSetup; - -/// @name Movie processing -- (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; -- (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; -- (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; -- (void)startProcessing; -- (void)endProcessing; -- (void)cancelProcessing; -- (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; - -@end diff --git a/framework/Source/GPUImageLoopingMovie.m b/framework/Source/GPUImageLoopingMovie.m deleted file mode 100755 index d9976f354..000000000 --- a/framework/Source/GPUImageLoopingMovie.m +++ /dev/null @@ -1,387 +0,0 @@ -#import "GPUImageLoopingMovie.h" -#import "GPUImageMovieWriter.h" - -@interface GPUImageLoopingMovie () -{ - BOOL audioEncodingIsFinished, videoEncodingIsFinished; - GPUImageMovieWriter *synchronizedMovieWriter; - CVOpenGLESTextureCacheRef coreVideoTextureCache; - AVAssetReader *reader; - CMTime previousFrameTime; - CFAbsoluteTime previousActualFrameTime; - BOOL keepLooping; -} - -- (void)processAsset; - -@end - -@implementation GPUImageLoopingMovie - -@synthesize url = _url; -@synthesize asset = _asset; -@synthesize runBenchmark = _runBenchmark; -@synthesize playAtActualSpeed = _playAtActualSpeed; -@synthesize delegate = _delegate; - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)initWithURL:(NSURL *)url; -{ - if (!(self = [super init])) - { - return nil; - } - - [self textureCacheSetup]; - - self.url = url; - self.asset = nil; - - return self; -} - -- (id)initWithAsset:(AVAsset *)asset; -{ - if (!(self = [super init])) - { - return nil; - } - - [self textureCacheSetup]; - - self.url = nil; - self.asset = asset; - - return self; -} - -- (void)textureCacheSetup; -{ - if ([GPUImageContext supportsFastTextureUpload]) - { - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); -#endif - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Need to remove the initially created texture - [self deleteOutputTexture]; - }); - } -} - -- (void)dealloc -{ - if ([GPUImageContext supportsFastTextureUpload]) - { - CFRelease(coreVideoTextureCache); - } -} -#pragma mark - -#pragma mark Movie processing - -- (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; -{ - synchronizedMovieWriter = movieWriter; - movieWriter.encodingLiveVideo = NO; -} - -- (void)startProcessing -{ - if(self.url == nil) - { - [self processAsset]; - return; - } - - keepLooping = YES; - - previousFrameTime = kCMTimeZero; - previousActualFrameTime = CFAbsoluteTimeGetCurrent(); - - NSDictionary *inputOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; - AVURLAsset *inputAsset = [[AVURLAsset alloc] initWithURL:self.url options:inputOptions]; - - GPUImageLoopingMovie __block *blockSelf = self; - - [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ - NSError *error = nil; - AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; - if (!tracksStatus == AVKeyValueStatusLoaded) - { - return; - } - blockSelf.asset = inputAsset; - [blockSelf processAsset]; - blockSelf = nil; - }]; -} - -- (void)processAsset -{ - __unsafe_unretained GPUImageLoopingMovie *weakSelf = self; - NSError *error = nil; - reader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; - - NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; - [outputSettings setObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (NSString*)kCVPixelBufferPixelFormatTypeKey]; - // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding - AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; - [reader addOutput:readerVideoTrackOutput]; - - NSArray *audioTracks = [self.asset tracksWithMediaType:AVMediaTypeAudio]; - BOOL shouldRecordAudioTrack = NO; //(([audioTracks count] > 0) && (weakSelf.audioEncodingTarget != nil) ); - AVAssetReaderTrackOutput *readerAudioTrackOutput = nil; - - if (shouldRecordAudioTrack) - { - audioEncodingIsFinished = NO; - - // This might need to be extended to handle movies with more than one audio track - AVAssetTrack* audioTrack = [audioTracks objectAtIndex:0]; - readerAudioTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]; - [reader addOutput:readerAudioTrackOutput]; - } - - if ([reader startReading] == NO) - { - NSLog(@"Error reading from file at URL: %@", weakSelf.url); - return; - } - - if (synchronizedMovieWriter != nil) - { - [synchronizedMovieWriter setVideoInputReadyCallback:^{ - [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; - }]; - - [synchronizedMovieWriter setAudioInputReadyCallback:^{ - [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; - }]; - - [synchronizedMovieWriter enableSynchronizationCallbacks]; - } - else - { - while (reader.status == AVAssetReaderStatusReading && keepLooping) - { - [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; - - if ( (shouldRecordAudioTrack) && (!audioEncodingIsFinished) ) - { - [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; - } - - } - - if (reader.status == AVAssetWriterStatusCompleted) { - - [reader cancelReading]; - reader = nil; - - if (keepLooping) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self startProcessing]; - }); - } else { - [weakSelf endProcessing]; - if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { - [self.delegate didCompletePlayingMovie]; - } - } - } - } -} - -- (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; -{ - if (reader.status == AVAssetReaderStatusReading) - { - CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; - if (sampleBufferRef) - { - if (_playAtActualSpeed) - { - // Do this outside of the video processing queue to not slow that down while waiting - CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBufferRef); - CMTime differenceFromLastFrame = CMTimeSubtract(currentSampleTime, previousFrameTime); - CFAbsoluteTime currentActualTime = CFAbsoluteTimeGetCurrent(); - - CGFloat frameTimeDifference = CMTimeGetSeconds(differenceFromLastFrame); - CGFloat actualTimeDifference = currentActualTime - previousActualFrameTime; - - if (frameTimeDifference > actualTimeDifference) - { - usleep(1000000.0 * (frameTimeDifference - actualTimeDifference)); - } - - previousFrameTime = currentSampleTime; - previousActualFrameTime = CFAbsoluteTimeGetCurrent(); - } - - __unsafe_unretained GPUImageLoopingMovie *weakSelf = self; - runSynchronouslyOnVideoProcessingQueue(^{ - [weakSelf processMovieFrame:sampleBufferRef]; - }); - - CMSampleBufferInvalidate(sampleBufferRef); - CFRelease(sampleBufferRef); - } - else - { - // videoEncodingIsFinished = YES; - // [self endProcessing]; - } - } - else if (synchronizedMovieWriter != nil) - { - if (reader.status == AVAssetWriterStatusCompleted) - { - [self endProcessing]; - } - } -} - -- (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; -{ - if (audioEncodingIsFinished) - { - return; - } - - CMSampleBufferRef audioSampleBufferRef = [readerAudioTrackOutput copyNextSampleBuffer]; - - if (audioSampleBufferRef) - { - runSynchronouslyOnVideoProcessingQueue(^{ - [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; - - CMSampleBufferInvalidate(audioSampleBufferRef); - CFRelease(audioSampleBufferRef); - }); - } - else - { - audioEncodingIsFinished = YES; - } -} - -- (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; -{ -// CMTimeGetSeconds -// CMTimeSubtract - - CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(movieSampleBuffer); - CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(movieSampleBuffer); - - int bufferHeight = CVPixelBufferGetHeight(movieFrame); -#if TARGET_IPHONE_SIMULATOR - int bufferWidth = CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) -#else - int bufferWidth = CVPixelBufferGetWidth(movieFrame); -#endif - - CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); - - if ([GPUImageContext supportsFastTextureUpload]) - { - CVPixelBufferLockBaseAddress(movieFrame, 0); - - [GPUImageContext useImageProcessingContext]; - CVOpenGLESTextureRef texture = NULL; - CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); - - if (!texture || err) { - NSLog(@"Movie CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); - return; - } - - outputTexture = CVOpenGLESTextureGetName(texture); - // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; - [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; - [currentTarget setTextureDelegate:self atIndex:targetTextureIndex]; - - [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; - } - - CVPixelBufferUnlockBaseAddress(movieFrame, 0); - - // Flush the CVOpenGLESTexture cache and release the texture - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(texture); - outputTexture = 0; - } - else - { - // Upload to texture - CVPixelBufferLockBaseAddress(movieFrame, 0); - - glBindTexture(GL_TEXTURE_2D, outputTexture); - // Using BGRA extension to pull in video frame data directly - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(movieFrame)); - - CGSize currentSize = CGSizeMake(bufferWidth, bufferHeight); - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:currentSize atIndex:targetTextureIndex]; - [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; - } - CVPixelBufferUnlockBaseAddress(movieFrame, 0); - } - - if (_runBenchmark) - { - CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); - NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); - } -} - -- (void)endProcessing; -{ - keepLooping = NO; - - for (id currentTarget in targets) - { - [currentTarget endProcessing]; - } - - if (synchronizedMovieWriter != nil) - { - [synchronizedMovieWriter setVideoInputReadyCallback:^{}]; - [synchronizedMovieWriter setAudioInputReadyCallback:^{}]; - } -} - -- (void)cancelProcessing -{ - if (reader) { - [reader cancelReading]; - } - [self endProcessing]; -} - -@end diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index b81bcd785..b2db12233 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -25,6 +25,10 @@ */ @property(readwrite, nonatomic) BOOL playAtActualSpeed; +/** This determines whether the video should repeat (loop) at the end and restart from the beginning. Defaults to NO. + */ +@property(readwrite, nonatomic) BOOL shouldRepeat; + /** This is used to send the delete Movie did complete playing alert */ @property (readwrite, nonatomic, assign) id delegate; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index cb0397fbd..e311b3667 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -9,6 +9,7 @@ @interface GPUImageMovie () AVAssetReader *reader; CMTime previousFrameTime; CFAbsoluteTime previousActualFrameTime; + BOOL keepLooping; } - (void)processAsset; @@ -22,6 +23,7 @@ @implementation GPUImageMovie @synthesize runBenchmark = _runBenchmark; @synthesize playAtActualSpeed = _playAtActualSpeed; @synthesize delegate = _delegate; +@synthesize shouldRepeat = _shouldRepeat; #pragma mark - #pragma mark Initialization and teardown @@ -102,6 +104,8 @@ - (void)startProcessing return; } + if (_shouldRepeat) keepLooping = YES; + previousFrameTime = kCMTimeZero; previousActualFrameTime = CFAbsoluteTimeGetCurrent(); @@ -169,7 +173,7 @@ - (void)processAsset } else { - while (reader.status == AVAssetReaderStatusReading) + while (reader.status == AVAssetReaderStatusReading && (!_shouldRepeat || keepLooping)) { [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; @@ -181,10 +185,21 @@ - (void)processAsset } if (reader.status == AVAssetWriterStatusCompleted) { + + [reader cancelReading]; + + if (keepLooping) { + reader = nil; + dispatch_async(dispatch_get_main_queue(), ^{ + [self startProcessing]; + }); + } else { [weakSelf endProcessing]; - if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { - [self.delegate didCompletePlayingMovie]; + if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { + [self.delegate didCompletePlayingMovie]; + } } + } } } @@ -225,8 +240,10 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac } else { - videoEncodingIsFinished = YES; - [self endProcessing]; + if (!keepLooping) { + videoEncodingIsFinished = YES; + [self endProcessing]; + } } } else if (synchronizedMovieWriter != nil) @@ -349,6 +366,8 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; - (void)endProcessing; { + keepLooping = NO; + for (id currentTarget in targets) { [currentTarget endProcessing]; From bb90abd31337c5b31f7190bb44f837afa2cc4048 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 3 Jun 2013 22:20:51 -0500 Subject: [PATCH 392/695] Fixed forceProcessingAtSize: glitches for the bulge, pinch, pixellate, sphere refraction, and centered Gaussian blur filters. --- .../ShowcaseFilterViewController.m | 4 +- .../Source/GPUImageBulgeDistortionFilter.m | 30 ++++++++++---- .../GPUImageGaussianBlurPositionFilter.m | 40 ++++++++++++++----- .../Source/GPUImagePinchDistortionFilter.m | 30 ++++++++++---- framework/Source/GPUImagePixellateFilter.h | 1 + framework/Source/GPUImagePixellateFilter.m | 35 ++++++++++++---- .../Source/GPUImagePixellatePositionFilter.m | 36 +++++++++++++---- .../Source/GPUImageSphereRefractionFilter.m | 30 ++++++++++---- 8 files changed, 155 insertions(+), 51 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 32bb7c271..376f85abc 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1278,7 +1278,9 @@ - (void)setupFilter; default: filter = [[GPUImageSepiaFilter alloc] init]; break; } - if (filterType == GPUIMAGE_FILECONFIG) + [filter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; + + if (filterType == GPUIMAGE_FILECONFIG) { self.title = @"File Configuration"; pipeline = [[GPUImageFilterPipeline alloc] initWithConfigurationFile:[[NSBundle mainBundle] URLForResource:@"SampleConfiguration" withExtension:@"plist"] diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index 4883d54cf..1f778ada7 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -67,6 +67,8 @@ void main() @interface GPUImageBulgeDistortionFilter () +- (void)adjustAspectRatio; + @property (readwrite, nonatomic) CGFloat aspectRatio; @end @@ -103,6 +105,24 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)adjustAspectRatio; +{ + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } +} + +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + [super forceProcessingAtSize:frameSize]; + [self adjustAspectRatio]; +} + - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { CGSize oldInputSize = inputTextureSize; @@ -110,14 +130,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; - } - else - { - [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; - } + [self adjustAspectRatio]; } } @@ -132,6 +145,7 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg { [super setInputRotation:newInputRotation atIndex:textureIndex]; [self setCenter:self.center]; + [self adjustAspectRatio]; } - (void)setRadius:(CGFloat)newValue; diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.m b/framework/Source/GPUImageGaussianBlurPositionFilter.m index c9174f3ad..d73a227f8 100755 --- a/framework/Source/GPUImageGaussianBlurPositionFilter.m +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.m @@ -116,6 +116,8 @@ void main() @interface GPUImageGaussianBlurPositionFilter () +- (void)adjustAspectRatio; + @property (readwrite, nonatomic) CGFloat aspectRatio; @end @@ -157,25 +159,43 @@ - (id)init; secondStageFragmentShaderFromString:nil]; } +- (void)adjustAspectRatio; +{ + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } +} + +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + [super forceProcessingAtSize:frameSize]; + [self adjustAspectRatio]; +} + - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { CGSize oldInputSize = inputTextureSize; [super setInputSize:newSize atIndex:textureIndex]; - + if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; - } - else - { - [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; - } + [self adjustAspectRatio]; } } -#pragma mark Getters and Setters +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self adjustAspectRatio]; +} + +#pragma mark - +#pragma mark Accessors - (void)setBlurSize:(CGFloat)newValue; { diff --git a/framework/Source/GPUImagePinchDistortionFilter.m b/framework/Source/GPUImagePinchDistortionFilter.m index 9a571cc23..76d790967 100755 --- a/framework/Source/GPUImagePinchDistortionFilter.m +++ b/framework/Source/GPUImagePinchDistortionFilter.m @@ -70,6 +70,8 @@ void main() @interface GPUImagePinchDistortionFilter () +- (void)adjustAspectRatio; + @property (readwrite, nonatomic) CGFloat aspectRatio; @end @@ -106,6 +108,24 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)adjustAspectRatio; +{ + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } +} + +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + [super forceProcessingAtSize:frameSize]; + [self adjustAspectRatio]; +} + - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { CGSize oldInputSize = inputTextureSize; @@ -113,14 +133,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; - } - else - { - [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; - } + [self adjustAspectRatio]; } } @@ -128,6 +141,7 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg { [super setInputRotation:newInputRotation atIndex:textureIndex]; [self setCenter:self.center]; + [self adjustAspectRatio]; } - (void)setAspectRatio:(CGFloat)newValue; diff --git a/framework/Source/GPUImagePixellateFilter.h b/framework/Source/GPUImagePixellateFilter.h index c101dd533..d0f6ae048 100755 --- a/framework/Source/GPUImagePixellateFilter.h +++ b/framework/Source/GPUImagePixellateFilter.h @@ -8,4 +8,5 @@ // The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored. @property(readwrite, nonatomic) CGFloat fractionalWidthOfAPixel; + @end diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index 1be736b05..88430d090 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -42,6 +42,8 @@ @interface GPUImagePixellateFilter () @property (readwrite, nonatomic) CGFloat aspectRatio; +- (void)adjustAspectRatio; + @end @implementation GPUImagePixellateFilter @@ -77,6 +79,30 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; return self; } +- (void)adjustAspectRatio; +{ + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } +} + +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self adjustAspectRatio]; +} + +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + [super forceProcessingAtSize:frameSize]; + [self adjustAspectRatio]; +} + - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { CGSize oldInputSize = inputTextureSize; @@ -84,14 +110,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; - } - else - { - [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; - } + [self adjustAspectRatio]; } } diff --git a/framework/Source/GPUImagePixellatePositionFilter.m b/framework/Source/GPUImagePixellatePositionFilter.m index 90d70618a..fad31a4dd 100755 --- a/framework/Source/GPUImagePixellatePositionFilter.m +++ b/framework/Source/GPUImagePixellatePositionFilter.m @@ -62,6 +62,8 @@ void main() @interface GPUImagePixellatePositionFilter () +- (void)adjustAspectRatio; + @property (readwrite, nonatomic) CGFloat aspectRatio; @end @@ -112,20 +114,38 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; - } - else - { - [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; - } + [self adjustAspectRatio]; } } #pragma mark - #pragma mark Accessors +- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; +{ + [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setCenter:self.center]; + [self adjustAspectRatio]; +} + +- (void)adjustAspectRatio; +{ + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } +} + +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + [super forceProcessingAtSize:frameSize]; + [self adjustAspectRatio]; +} + - (void)setFractionalWidthOfAPixel:(CGFloat)newValue; { CGFloat singlePixelSpacing; diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index ca1e6fe9b..b0f540423 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -60,6 +60,8 @@ void main() @interface GPUImageSphereRefractionFilter () +- (void)adjustAspectRatio; + @property (readwrite, nonatomic) CGFloat aspectRatio; @end @@ -113,24 +115,36 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; if (!CGSizeEqualToSize(oldInputSize, inputTextureSize) && (!CGSizeEqualToSize(newSize, CGSizeZero)) ) { - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; - } - else - { - [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; - } + [self adjustAspectRatio]; } } #pragma mark - #pragma mark Accessors +- (void)adjustAspectRatio; +{ + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + [self setAspectRatio:(inputTextureSize.width / inputTextureSize.height)]; + } + else + { + [self setAspectRatio:(inputTextureSize.height / inputTextureSize.width)]; + } +} + - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; { [super setInputRotation:newInputRotation atIndex:textureIndex]; [self setCenter:self.center]; + [self adjustAspectRatio]; +} + +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + [super forceProcessingAtSize:frameSize]; + [self adjustAspectRatio]; } - (void)setRadius:(CGFloat)newValue; From a29f15a72528e152892f6245abb2f37271fa5a70 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 3 Jun 2013 22:35:44 -0500 Subject: [PATCH 393/695] Remove unnecessary -forceProcessingAtSize: from FilterShowcase. --- .../FilterShowcase/ShowcaseFilterViewController.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 376f85abc..9da98331a 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1278,8 +1278,6 @@ - (void)setupFilter; default: filter = [[GPUImageSepiaFilter alloc] init]; break; } - [filter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; - if (filterType == GPUIMAGE_FILECONFIG) { self.title = @"File Configuration"; From 6c785e4c0275b037c6bcf0f4d8dab59c3601c872 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 8 Jun 2013 22:39:51 -0500 Subject: [PATCH 394/695] Experimenting with changing GCD queues on video encoding to improve audio recording performance. --- .../SimpleVideoFilterViewController.m | 2 +- framework/Source/GPUImageVideoCamera.m | 32 ++----- framework/Source/iOS/GPUImageMovieWriter.m | 89 ++++++++++++------- 3 files changed, 62 insertions(+), 61 deletions(-) diff --git a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 7a741e2bd..f72e71864 100755 --- a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -77,7 +77,7 @@ - (void)viewDidLoad // [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOn]; // [videoCamera.inputCamera unlockForConfiguration]; - double delayInSeconds = 10.0; + double delayInSeconds = 30.0; dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index ed8a61620..5da27bb4b 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -122,8 +122,9 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return nil; } - cameraProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.cameraProcessingQueue", NULL); - audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); + cameraProcessingQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0); + audioProcessingQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0); + frameRenderingSemaphore = dispatch_semaphore_create(1); _frameRate = 0; // This will not set frame rate unless this value gets set to 1 or above @@ -257,7 +258,6 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; -// [videoOutput setSampleBufferDelegate:self queue:[GPUImageContext sharedContextQueue]]; if ([_captureSession canAddOutput:videoOutput]) { [_captureSession addOutput:videoOutput]; @@ -298,17 +298,7 @@ - (void)dealloc } // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) - if (cameraProcessingQueue != NULL) - { - dispatch_release(cameraProcessingQueue); - } - - if (audioProcessingQueue != NULL) - { - dispatch_release(audioProcessingQueue); - } - +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (frameRenderingSemaphore != NULL) { dispatch_release(frameRenderingSemaphore); @@ -817,17 +807,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM { if (captureOutput == audioOutput) { -// if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) -// { -// return; -// } - - CFRetain(sampleBuffer); - runAsynchronouslyOnVideoProcessingQueue(^{ - [self processAudioSampleBuffer:sampleBuffer]; - CFRelease(sampleBuffer); -// dispatch_semaphore_signal(frameRenderingSemaphore); - }); + [self processAudioSampleBuffer:sampleBuffer]; } else { @@ -835,7 +815,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM { return; } - + CFRetain(sampleBuffer); runAsynchronouslyOnVideoProcessingQueue(^{ //Feature Detection Hook. diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 48fa3c92c..3b16b7b76 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -76,6 +76,8 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr self.enabled = YES; + movieWritingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.movieWritingQueue", NULL); + videoSize = newSize; movieURL = newMovieURL; fileType = newFileType; @@ -138,6 +140,13 @@ - (void)dealloc; { free(frameData); } + +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) + if (movieWritingQueue != NULL) + { + dispatch_release(movieWritingQueue); + } +#endif } #pragma mark - @@ -262,7 +271,9 @@ - (void)cancelRecording; - (void)finishRecording; { - [self finishRecordingWithCompletionHandler:nil]; + runSynchronouslyOnVideoProcessingQueue(^{ + [self finishRecordingWithCompletionHandler:nil]; + }); } - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; @@ -312,12 +323,14 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; if (CMTIME_IS_INVALID(startTime)) { - if (audioInputReadyCallback == NULL) - { - [assetWriter startWriting]; - } - [assetWriter startSessionAtSourceTime:currentSampleTime]; - startTime = currentSampleTime; + dispatch_sync(movieWritingQueue, ^{ + if ((audioInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting)) + { + [assetWriter startWriting]; + } + [assetWriter startSessionAtSourceTime:currentSampleTime]; + startTime = currentSampleTime; + }); } if (!assetWriterAudioInput.readyForMoreMediaData) @@ -327,7 +340,11 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; } // NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); - [assetWriterAudioInput appendSampleBuffer:audioBuffer]; + CFRetain(audioBuffer); + dispatch_async(movieWritingQueue, ^{ + [assetWriterAudioInput appendSampleBuffer:audioBuffer]; + CFRelease(audioBuffer); + }); } } @@ -509,13 +526,15 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; if (CMTIME_IS_INVALID(startTime)) { - if (videoInputReadyCallback == NULL) - { - [assetWriter startWriting]; - } - - [assetWriter startSessionAtSourceTime:frameTime]; - startTime = frameTime; + dispatch_sync(movieWritingQueue, ^{ + if ((videoInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting)) + { + [assetWriter startWriting]; + } + + [assetWriter startSessionAtSourceTime:frameTime]; + startTime = frameTime; + }); } if (!assetWriterVideoInput.readyForMoreMediaData) @@ -527,12 +546,12 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames [GPUImageContext useImageProcessingContext]; [self renderAtInternalSize]; - + CVPixelBufferRef pixel_buffer = NULL; - + if ([GPUImageContext supportsFastTextureUpload]) { - pixel_buffer = renderTarget; + pixel_buffer = renderTarget; CVPixelBufferLockBaseAddress(pixel_buffer, 0); } else @@ -551,23 +570,25 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } } -// if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:CMTimeSubtract(frameTime, startTime)]) - if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) - { - NSLog(@"Problem appending pixel buffer at time: %lld", frameTime.value); - } - else - { -// NSLog(@"Recorded video sample time: %lld, %d, %lld", frameTime.value, frameTime.timescale, frameTime.epoch); - } - CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); - - previousFrameTime = frameTime; + dispatch_sync(movieWritingQueue, ^{ + if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) + { + NSLog(@"Problem appending pixel buffer at time: %lld", frameTime.value); + } + else + { + // NSLog(@"Recorded video sample time: %lld, %d, %lld", frameTime.value, frameTime.timescale, frameTime.epoch); + } + CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); + + previousFrameTime = frameTime; + + if (![GPUImageContext supportsFastTextureUpload]) + { + CVPixelBufferRelease(pixel_buffer); + } + }); - if (![GPUImageContext supportsFastTextureUpload]) - { - CVPixelBufferRelease(pixel_buffer); - } } - (NSInteger)nextAvailableTextureIndex; From 4d9f9303b00284419151e8053e980d4816e54be8 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 11 Jun 2013 20:42:49 -0500 Subject: [PATCH 395/695] Fixed the haze and levels filters under iOS 7.0. --- .../GPUImageMac.xcodeproj/project.pbxproj | 8 ++++ framework/Source/GPUImageCrosshairGenerator.m | 5 --- framework/Source/GPUImageFilter.h | 4 ++ framework/Source/GPUImageHazeFilter.m | 10 ++--- framework/Source/GPUImageLevelsFilter.m | 22 ++++----- .../GPUImageNonMaximumSuppressionFilter.m | 45 +++++++++++++++++++ ...ageParallelCoordinateLineTransformFilter.m | 43 +++++++++++++++++- framework/Source/GPUImageRGBFilter.m | 22 ++++----- framework/Source/Mac/GPUImageContext.h | 1 + framework/Source/Mac/GPUImageContext.m | 4 ++ framework/Source/iOS/GPUImageContext.h | 1 + framework/Source/iOS/GPUImageContext.m | 11 +++++ 12 files changed, 143 insertions(+), 33 deletions(-) diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index a24850b63..426d80aa8 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ BC78B713172DCCB800342C6A /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */; }; BC78B714172DCCB800342C6A /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC78B715172DCCB800342C6A /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */; }; + BC96A4F1176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC96A4EF176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h */; }; + BC96A4F2176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC96A4F0176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m */; }; BCA20B571746C9EC0097C84A /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B4F1746C9EC0097C84A /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA20B581746C9EC0097C84A /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B501746C9EC0097C84A /* GPUImageBuffer.m */; }; BCA20B591746C9EC0097C84A /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B511746C9EC0097C84A /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -326,6 +328,8 @@ BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMissEtikateFilter.m; path = Source/GPUImageMissEtikateFilter.m; sourceTree = SOURCE_ROOT; }; BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSoftEleganceFilter.h; path = Source/GPUImageSoftEleganceFilter.h; sourceTree = SOURCE_ROOT; }; BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftEleganceFilter.m; path = Source/GPUImageSoftEleganceFilter.m; sourceTree = SOURCE_ROOT; }; + BC96A4EF176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNonMaximumSuppressionFilter.h; path = Source/GPUImageNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; + BC96A4F0176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNonMaximumSuppressionFilter.m; path = Source/GPUImageNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; BCA20B4F1746C9EC0097C84A /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; BCA20B501746C9EC0097C84A /* GPUImageBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBuffer.m; path = Source/GPUImageBuffer.m; sourceTree = SOURCE_ROOT; }; BCA20B511746C9EC0097C84A /* GPUImageHighPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHighPassFilter.h; path = Source/GPUImageHighPassFilter.h; sourceTree = SOURCE_ROOT; }; @@ -937,6 +941,8 @@ BC569577174683620081491B /* GPUImageCrosshairGenerator.m */, BCE2EF8E17459D9300C0628C /* GPUImageColorPackingFilter.h */, BCE2EF8F17459D9300C0628C /* GPUImageColorPackingFilter.m */, + BC96A4EF176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h */, + BC96A4F0176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m */, BCE2EF9017459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.h */, BCE2EF9117459D9300C0628C /* GPUImageThresholdedNonMaximumSuppressionFilter.m */, BCE2EF9617459E2400C0628C /* GPUImageHoughTransformLineDetector.h */, @@ -1197,6 +1203,7 @@ BCA20BC517471C4B0097C84A /* GPUImageMosaicFilter.h in Headers */, BCA20BC717471C4B0097C84A /* GPUImagePerlinNoiseFilter.h in Headers */, BCA20BC917471C4B0097C84A /* GPUImageVoronoiConsumerFilter.h in Headers */, + BC96A4F1176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1409,6 +1416,7 @@ BCA20BC617471C4B0097C84A /* GPUImageMosaicFilter.m in Sources */, BCA20BC817471C4B0097C84A /* GPUImagePerlinNoiseFilter.m in Sources */, BCA20BCA17471C4B0097C84A /* GPUImageVoronoiConsumerFilter.m in Sources */, + BC96A4F2176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index 9adb94f19..a2f1d70e7 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -1,9 +1,5 @@ #import "GPUImageCrosshairGenerator.h" -#define hash # -#define wrappedlabel(x) x -#define escapedhash(a) wrappedlabel(hash)a - NSString *const kGPUImageCrosshairVertexShaderString = SHADER_STRING ( attribute vec4 position; @@ -25,7 +21,6 @@ void main() #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageCrosshairFragmentShaderString = SHADER_STRING ( - uniform lowp vec3 crosshairColor; varying highp vec2 centerLocation; diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 8e0c555b9..a2fef68f6 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -4,6 +4,10 @@ #define STRINGIZE2(x) STRINGIZE(x) #define SHADER_STRING(text) @ STRINGIZE2(text) +#define hash # +#define wrappedlabel(x) x +#define escapedhash(a) wrappedlabel(hash)a + extern NSString *const kGPUImageVertexShaderString; extern NSString *const kGPUImagePassthroughFragmentShaderString; diff --git a/framework/Source/GPUImageHazeFilter.m b/framework/Source/GPUImageHazeFilter.m index e9e8db822..f90fc22f6 100755 --- a/framework/Source/GPUImageHazeFilter.m +++ b/framework/Source/GPUImageHazeFilter.m @@ -7,7 +7,7 @@ uniform sampler2D inputImageTexture; - uniform lowp float distance; + uniform lowp float hazeDistance; uniform highp float slope; void main() @@ -15,7 +15,7 @@ void main() //todo reconsider precision modifiers highp vec4 color = vec4(1.0);//todo reimplement as a parameter - highp float d = textureCoordinate.y * slope + distance; + highp float d = textureCoordinate.y * slope + hazeDistance; highp vec4 c = texture2D(inputImageTexture, textureCoordinate) ; // consider using unpremultiply @@ -31,7 +31,7 @@ void main() uniform sampler2D inputImageTexture; - uniform float distance; + uniform float hazeDistance; uniform float slope; void main() @@ -39,7 +39,7 @@ void main() //todo reconsider precision modifiers vec4 color = vec4(1.0);//todo reimplement as a parameter - float d = textureCoordinate.y * slope + distance; + float d = textureCoordinate.y * slope + hazeDistance; vec4 c = texture2D(inputImageTexture, textureCoordinate) ; // consider using unpremultiply @@ -67,7 +67,7 @@ - (id)init; return nil; } - distanceUniform = [filterProgram uniformIndex:@"distance"]; + distanceUniform = [filterProgram uniformIndex:@"hazeDistance"]; slopeUniform = [filterProgram uniformIndex:@"slope"]; self.distance = 0.2; diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m index 8f692b33a..4844340ba 100644 --- a/framework/Source/GPUImageLevelsFilter.m +++ b/framework/Source/GPUImageLevelsFilter.m @@ -23,9 +23,9 @@ varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; - uniform lowp vec3 min; - uniform lowp vec3 mid; - uniform lowp vec3 max; + uniform lowp vec3 levelMinimum; + uniform lowp vec3 levelMiddle; + uniform lowp vec3 levelMaximum; uniform lowp vec3 minOutput; uniform lowp vec3 maxOutput; @@ -33,7 +33,7 @@ void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(LevelsControl(textureColor.rgb, min, mid, max, minOutput, maxOutput), textureColor.a); + gl_FragColor = vec4(LevelsControl(textureColor.rgb, levelMinimum, levelMiddle, levelMaximum, minOutput, maxOutput), textureColor.a); } ); #else @@ -42,9 +42,9 @@ void main() varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; - uniform vec3 min; - uniform vec3 mid; - uniform vec3 max; + uniform vec3 levelMinimum; + uniform vec3 levelMiddle; + uniform vec3 levelMaximum; uniform vec3 minOutput; uniform vec3 maxOutput; @@ -52,7 +52,7 @@ void main() { vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(LevelsControl(textureColor.rgb, min, mid, max, minOutput, maxOutput), textureColor.a); + gl_FragColor = vec4(LevelsControl(textureColor.rgb, levelMinimum, levelMiddle, levelMaximum, minOutput, maxOutput), textureColor.a); } ); #endif @@ -69,9 +69,9 @@ - (id)init; return nil; } - minUniform = [filterProgram uniformIndex:@"min"]; - midUniform = [filterProgram uniformIndex:@"mid"]; - maxUniform = [filterProgram uniformIndex:@"max"]; + minUniform = [filterProgram uniformIndex:@"levelMinimum"]; + midUniform = [filterProgram uniformIndex:@"levelMiddle"]; + maxUniform = [filterProgram uniformIndex:@"levelMaximum"]; minOutputUniform = [filterProgram uniformIndex:@"minOutput"]; maxOutputUniform = [filterProgram uniformIndex:@"maxOutput"]; diff --git a/framework/Source/GPUImageNonMaximumSuppressionFilter.m b/framework/Source/GPUImageNonMaximumSuppressionFilter.m index f65b9c10f..1ea131673 100644 --- a/framework/Source/GPUImageNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageNonMaximumSuppressionFilter.m @@ -1,5 +1,6 @@ #import "GPUImageNonMaximumSuppressionFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageNonMaximumSuppressionFragmentShaderString = SHADER_STRING ( uniform sampler2D inputImageTexture; @@ -42,6 +43,50 @@ void main() gl_FragColor = vec4((centerColor.rgb * step(maxValue, centerColor.r) * multiplier), 1.0); } ); +#else +NSString *const kGPUImageNonMaximumSuppressionFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + void main() + { + float bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + float leftColor = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightColor = texture2D(inputImageTexture, rightTextureCoordinate).r; + float topColor = texture2D(inputImageTexture, topTextureCoordinate).r; + float topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + + // Use a tiebreaker for pixels to the left and immediately above this one + float multiplier = 1.0 - step(centerColor.r, topColor); + multiplier = multiplier * 1.0 - step(centerColor.r, topLeftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, leftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, bottomLeftColor); + + float maxValue = max(centerColor.r, bottomColor); + maxValue = max(maxValue, bottomRightColor); + maxValue = max(maxValue, rightColor); + maxValue = max(maxValue, topRightColor); + + gl_FragColor = vec4((centerColor.rgb * step(maxValue, centerColor.r) * multiplier), 1.0); + } +); +#endif @implementation GPUImageNonMaximumSuppressionFilter diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index c7f2efcc1..6baf14fe9 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -21,6 +21,20 @@ void main() gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); } ); + +// NOTE: See below for where I'm tacking on the required extension as a prefix +NSString *const kGPUImageHoughAccumulationFBOReadFragmentShaderString = SHADER_STRING +( + const lowp float scalingFactor = 1.0 / 256.0; + + void main() + { + lowp vec4 previousFragmentData = gl_LastFragData[0]; + // gl_FragColor = vec4(scalingFactor, scalingFactor, scalingFactor, 1.0); + gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); + } + ); + #else NSString *const kGPUImageHoughAccumulationFragmentShaderString = SHADER_STRING ( @@ -32,6 +46,17 @@ void main() gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); } ); + +NSString *const kGPUImageHoughAccumulationFBOReadFragmentShaderString = SHADER_STRING +( + const float scalingFactor = 1.0 / 256.0; + + void main() + { + // gl_FragColor = vec4(scalingFactor, scalingFactor, scalingFactor, 1.0); + gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); + } +); #endif @interface GPUImageParallelCoordinateLineTransformFilter() @@ -47,11 +72,27 @@ @implementation GPUImageParallelCoordinateLineTransformFilter - (id)init; { - if (!(self = [super initWithVertexShaderFromString:kGPUImageHoughAccumulationVertexShaderString fragmentShaderFromString:kGPUImageHoughAccumulationFragmentShaderString])) + NSString *fragmentShaderToUse = nil; + + if ([GPUImageContext deviceSupportsFramebufferReads]) + { + fragmentShaderToUse = [NSString stringWithFormat:@"#extension GL_EXT_shader_framebuffer_fetch : require\n %@",kGPUImageHoughAccumulationFBOReadFragmentShaderString]; + +// NSLog(@"Supports FBO reads: %@", fragmentShaderToUse); +// fragmentShaderToUse = kGPUImageHoughAccumulationFBOReadFragmentShaderString; + } + else + { +// NSLog(@"Doesn't support FBO reads"); + fragmentShaderToUse = kGPUImageHoughAccumulationFragmentShaderString; + } + + if (!(self = [super initWithVertexShaderFromString:kGPUImageHoughAccumulationVertexShaderString fragmentShaderFromString:fragmentShaderToUse])) { return nil; } + return self; } diff --git a/framework/Source/GPUImageRGBFilter.m b/framework/Source/GPUImageRGBFilter.m index 9946554ad..7a2e56811 100755 --- a/framework/Source/GPUImageRGBFilter.m +++ b/framework/Source/GPUImageRGBFilter.m @@ -6,15 +6,15 @@ varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; - uniform highp float red; - uniform highp float green; - uniform highp float blue; + uniform highp float redAdjustment; + uniform highp float greenAdjustment; + uniform highp float blueAdjustment; void main() { highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, textureColor.a); + gl_FragColor = vec4(textureColor.r * redAdjustment, textureColor.g * greenAdjustment, textureColor.b * blueAdjustment, textureColor.a); } ); #else @@ -23,15 +23,15 @@ void main() varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; - uniform float red; - uniform float green; - uniform float blue; + uniform float redAdjustment; + uniform float greenAdjustment; + uniform float blueAdjustment; void main() { vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(textureColor.r * red, textureColor.g * green, textureColor.b * blue, textureColor.a); + gl_FragColor = vec4(textureColor.r * redAdjustment, textureColor.g * greenAdjustment, textureColor.b * blueAdjustment, textureColor.a); } ); #endif @@ -50,13 +50,13 @@ - (id)init; return nil; } - redUniform = [filterProgram uniformIndex:@"red"]; + redUniform = [filterProgram uniformIndex:@"redAdjustment"]; self.red = 1.0; - greenUniform = [filterProgram uniformIndex:@"green"]; + greenUniform = [filterProgram uniformIndex:@"greenAdjustment"]; self.green = 1.0; - blueUniform = [filterProgram uniformIndex:@"blue"]; + blueUniform = [filterProgram uniformIndex:@"blueAdjustment"]; self.blue = 1.0; return self; diff --git a/framework/Source/Mac/GPUImageContext.h b/framework/Source/Mac/GPUImageContext.h index f04f91efa..146d744b9 100755 --- a/framework/Source/Mac/GPUImageContext.h +++ b/framework/Source/Mac/GPUImageContext.h @@ -23,6 +23,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (GLint)maximumTextureUnitsForThisDevice; + (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; + (BOOL)deviceSupportsRedTextures; ++ (BOOL)deviceSupportsFramebufferReads; + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - (void)presentBufferForDisplay; diff --git a/framework/Source/Mac/GPUImageContext.m b/framework/Source/Mac/GPUImageContext.m index e7917f913..31fef7b2d 100755 --- a/framework/Source/Mac/GPUImageContext.m +++ b/framework/Source/Mac/GPUImageContext.m @@ -113,6 +113,10 @@ + (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; return [extensionNames containsObject:extension]; } ++ (BOOL)deviceSupportsFramebufferReads; +{ + return NO; +} // http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt diff --git a/framework/Source/iOS/GPUImageContext.h b/framework/Source/iOS/GPUImageContext.h index a3fba2f3e..d03135829 100755 --- a/framework/Source/iOS/GPUImageContext.h +++ b/framework/Source/iOS/GPUImageContext.h @@ -25,6 +25,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (GLint)maximumTextureUnitsForThisDevice; + (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; + (BOOL)deviceSupportsRedTextures; ++ (BOOL)deviceSupportsFramebufferReads; + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - (void)presentBufferForDisplay; diff --git a/framework/Source/iOS/GPUImageContext.m b/framework/Source/iOS/GPUImageContext.m index 91e386aff..2e26a8e78 100755 --- a/framework/Source/iOS/GPUImageContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -132,6 +132,17 @@ + (BOOL)deviceSupportsRedTextures; return supportsRedTextures; } ++ (BOOL)deviceSupportsFramebufferReads; +{ + static dispatch_once_t pred; + static BOOL supportsFramebufferReads = NO; + + dispatch_once(&pred, ^{ + supportsFramebufferReads = [GPUImageContext deviceSupportsOpenGLESExtension:@"GL_EXT_shader_framebuffer_fetch"]; + }); + + return supportsFramebufferReads; +} + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; { From 9039aa79432be1bdfb8486b2be3fb29a0620f290 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Wed, 12 Jun 2013 20:18:09 -0600 Subject: [PATCH 396/695] Allow matching existing alpha value in color generator filter --- framework/Source/GPUImage.h | 1 - framework/Source/GPUImageColorFilter.h | 12 ---- framework/Source/GPUImageColorFilter.m | 53 --------------- .../Source/GPUImageSolidColorGenerator.h | 2 + .../Source/GPUImageSolidColorGenerator.m | 65 +++++++++---------- 5 files changed, 34 insertions(+), 99 deletions(-) delete mode 100644 framework/Source/GPUImageColorFilter.h delete mode 100644 framework/Source/GPUImageColorFilter.m diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 00383cfed..3d170df0b 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -24,7 +24,6 @@ #import "GPUImagePixellateFilter.h" #import "GPUImagePixellatePositionFilter.h" #import "GPUImageSepiaFilter.h" -#import "GPUImageColorFilter.h" #import "GPUImageColorInvertFilter.h" #import "GPUImageSaturationFilter.h" #import "GPUImageContrastFilter.h" diff --git a/framework/Source/GPUImageColorFilter.h b/framework/Source/GPUImageColorFilter.h deleted file mode 100644 index aca340356..000000000 --- a/framework/Source/GPUImageColorFilter.h +++ /dev/null @@ -1,12 +0,0 @@ -#import "GPUImageFilter.h" - -@interface GPUImageColorFilter : GPUImageFilter -{ - GLint filterColorUniform; -} - -@property(readwrite, nonatomic) GPUVector4 color; - -- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; - -@end diff --git a/framework/Source/GPUImageColorFilter.m b/framework/Source/GPUImageColorFilter.m deleted file mode 100644 index 17c5f5c00..000000000 --- a/framework/Source/GPUImageColorFilter.m +++ /dev/null @@ -1,53 +0,0 @@ -#import "GPUImageColorFilter.h" - -NSString *const kGPUColorFragmentShaderString = SHADER_STRING -( - precision lowp float; - - varying highp vec2 textureCoordinate; - - uniform sampler2D inputImageTexture; - uniform vec3 filterColor; - - void main() - { - lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(filterColor, textureColor.a); - } - ); - -@implementation GPUImageColorFilter - -@synthesize color = _color; - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUColorFragmentShaderString])) - { - return nil; - } - - filterColorUniform = [filterProgram uniformIndex:@"filterColor"]; - - self.color = (GPUVector4){1.0f, 1.0f, 1.0f, 1.0f}; - return self; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setColor:(GPUVector4)color; -{ - _color = color; - - [self setColorRed:color.one green:color.two blue:color.three]; -} - -- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; -{ - GPUVector3 filterColor = {redComponent, greenComponent, blueComponent}; - - [self setVec3:filterColor forUniform:filterColorUniform program:filterProgram]; -} - -@end diff --git a/framework/Source/GPUImageSolidColorGenerator.h b/framework/Source/GPUImageSolidColorGenerator.h index 3c1e19c9e..8d7a5ed12 100644 --- a/framework/Source/GPUImageSolidColorGenerator.h +++ b/framework/Source/GPUImageSolidColorGenerator.h @@ -7,10 +7,12 @@ @interface GPUImageSolidColorGenerator : GPUImageFilter { GLint colorUniform; + GLint useExistingAlphaUniform; } // This color dictates what the output image will be filled with @property(readwrite, nonatomic) GPUVector4 color; +@property(readwrite, nonatomic, assign) BOOL useExistingAlpha; // whether to use the alpha of the existing image or not, default is NO - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m index 9363c72e4..79ab9fc57 100644 --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -5,27 +5,43 @@ ( precision lowp float; - varying highp vec2 textureCoordinate; - + varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; uniform vec4 color; + uniform int useExistingAlpha; void main() { - gl_FragColor = color; + if (useExistingAlpha == 1) + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + gl_FragColor = vec4(color.rgb, textureColor.a); + } + else + { + gl_FragColor = color; + } } ); #else NSString *const kGPUSolidColorFragmentShaderString = SHADER_STRING ( - varying vec2 textureCoordinate; - + varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; uniform vec4 color; - + uniform int useExistingAlpha; + void main() { - gl_FragColor = color; + if (useExistingAlpha == 1) + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + gl_FragColor = vec4(color.rgb, textureColor.a); + } + else + { + gl_FragColor = color; + } } ); #endif @@ -42,8 +58,10 @@ - (id)init; } colorUniform = [filterProgram uniformIndex:@"color"]; + useExistingAlphaUniform = [filterProgram uniformIndex:@"useExistingAlpha"]; self.color = (GPUVector4){0.0f, 0.0f, 0.5f, 1.0f}; + self.useExistingAlpha = NO; return self; } @@ -52,27 +70,6 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)forceProcessingAtSize:(CGSize)frameSize; -{ - [super forceProcessingAtSize:frameSize]; - - if (!CGSizeEqualToSize(inputTextureSize, CGSizeZero)) - { - [self newFrameReadyAtTime:kCMTimeIndefinite atIndex:0]; - } -} - -- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; -{ - [super addTarget:newTarget atTextureLocation:textureLocation]; - - if (!CGSizeEqualToSize(inputTextureSize, CGSizeZero)) - { - [newTarget setInputSize:inputTextureSize atIndex:textureLocation]; - [newTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureLocation]; - } -} - - (void)setColor:(GPUVector4)newValue; { [self setColorRed:newValue.one green:newValue.two blue:newValue.three alpha:newValue.four]; @@ -86,11 +83,13 @@ - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GL _color.four = alphaComponent; [self setVec4:_color forUniform:colorUniform program:filterProgram]; - - if (!CGSizeEqualToSize(inputTextureSize, CGSizeZero)) - { - [self newFrameReadyAtTime:kCMTimeIndefinite atIndex:0]; - } +} + +- (void)setUseExistingAlpha:(BOOL)useExistingAlpha; +{ + _useExistingAlpha = useExistingAlpha; + + [self setInteger:(useExistingAlpha ? 1 : 0) forUniform:useExistingAlphaUniform program:filterProgram]; } @end From 53886db4a0f0a15a2bf3548f924f0ba8bb02a91b Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 13 Jun 2013 09:06:43 -0600 Subject: [PATCH 397/695] Put solid color generator overloads back, improve performance --- .../Source/GPUImageSolidColorGenerator.m | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m index 79ab9fc57..9470d87e9 100644 --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -4,46 +4,30 @@ NSString *const kGPUSolidColorFragmentShaderString = SHADER_STRING ( precision lowp float; - - varying highp vec2 textureCoordinate; + + varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; uniform vec4 color; uniform int useExistingAlpha; - + void main() { - if (useExistingAlpha == 1) - { - lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(color.rgb, textureColor.a); - } - else - { - gl_FragColor = color; - } + gl_FragColor = vec4(color.rgb, max(textureColor.a, 1.0 - useExistingAlpha)); } -); + ); #else NSString *const kGPUSolidColorFragmentShaderString = SHADER_STRING ( - varying vec2 textureCoordinate; + varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; uniform vec4 color; uniform int useExistingAlpha; void main() { - if (useExistingAlpha == 1) - { - lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - gl_FragColor = vec4(color.rgb, textureColor.a); - } - else - { - gl_FragColor = color; - } + gl_FragColor = vec4(color.rgb, max(textureColor.a, 1.0 - useExistingAlpha)); } -); + ); #endif @implementation GPUImageSolidColorGenerator @@ -70,6 +54,27 @@ - (id)init; #pragma mark - #pragma mark Accessors +- (void)forceProcessingAtSize:(CGSize)frameSize; +{ + [super forceProcessingAtSize:frameSize]; + + if (!CGSizeEqualToSize(inputTextureSize, CGSizeZero)) + { + [self newFrameReadyAtTime:kCMTimeIndefinite atIndex:0]; + } +} + +- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; +{ + [super addTarget:newTarget atTextureLocation:textureLocation]; + + if (!CGSizeEqualToSize(inputTextureSize, CGSizeZero)) + { + [newTarget setInputSize:inputTextureSize atIndex:textureLocation]; + [newTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureLocation]; + } +} + - (void)setColor:(GPUVector4)newValue; { [self setColorRed:newValue.one green:newValue.two blue:newValue.three alpha:newValue.four]; From 4907ea77a5b1acddceae57233ec2eb56c5a36400 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 13 Jun 2013 09:21:10 -0600 Subject: [PATCH 398/695] GLSL fixes --- framework/Source/GPUImageSolidColorGenerator.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m index 9470d87e9..ee9a18d23 100644 --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -8,10 +8,11 @@ varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; uniform vec4 color; - uniform int useExistingAlpha; + uniform float useExistingAlpha; void main() { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); gl_FragColor = vec4(color.rgb, max(textureColor.a, 1.0 - useExistingAlpha)); } ); @@ -21,10 +22,11 @@ void main() varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; uniform vec4 color; - uniform int useExistingAlpha; + uniform float useExistingAlpha; void main() { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); gl_FragColor = vec4(color.rgb, max(textureColor.a, 1.0 - useExistingAlpha)); } ); From 3f5c9ce95cb95a0c6fe2e79dc0caeea33de0a5d3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 14 Jun 2013 12:50:29 -0500 Subject: [PATCH 399/695] Fixed some poorly-named macros that were conflicting with other frameworks. --- framework/Source/GPUImageCrosshairGenerator.m | 2 +- framework/Source/GPUImageFilter.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index a2f1d70e7..f127dac33 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -38,7 +38,7 @@ void main() #else NSString *const kGPUImageCrosshairFragmentShaderString = SHADER_STRING ( - escapedhash(version 120)\n + GPUImageEscapedHashIdentifier(version 120)\n uniform vec3 crosshairColor; diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index a2fef68f6..e6d8da81f 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -4,9 +4,9 @@ #define STRINGIZE2(x) STRINGIZE(x) #define SHADER_STRING(text) @ STRINGIZE2(text) -#define hash # -#define wrappedlabel(x) x -#define escapedhash(a) wrappedlabel(hash)a +#define GPUImageHashIdentifier # +#define GPUImageWrappedLabel(x) x +#define GPUImageEscapedHashIdentifier(a) GPUImageWrappedLabel(GPUImageHashIdentifier)a extern NSString *const kGPUImageVertexShaderString; extern NSString *const kGPUImagePassthroughFragmentShaderString; From 1380f615500f114bbf6af92b1e890df94590951d Mon Sep 17 00:00:00 2001 From: Mason Kramer Date: Mon, 17 Jun 2013 18:02:59 -0400 Subject: [PATCH 400/695] Remove obsolete flag for appledoc build script --- framework/GPUImage.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index eb9e59990..f3bf11f7c 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1427,7 +1427,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--docsetutil-path \"/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n--logformat xcode \\\n${SOURCE_ROOT}"; + shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n--logformat xcode \\\n${SOURCE_ROOT}"; }; BCF1A34214DDB1EC00852800 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; From ac7c548aab30887de294e31846d9874473d04a19 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 18 Jun 2013 14:22:36 -0500 Subject: [PATCH 401/695] Edge detection filters now have an adjustable strength. Hough line detector is a little cleaner with the use of iOS 6.0 framebuffer reads. --- README.md | 10 ++ .../SLSFilterShowcaseWindowController.m | 25 +++- .../ShowcaseFilterViewController.m | 29 +++- .../SimpleImageViewController.m | 14 +- framework/Source/GLProgram.h | 1 + .../GPUImageHoughTransformLineDetector.h | 2 +- .../GPUImageHoughTransformLineDetector.m | 40 +++--- ...ageParallelCoordinateLineTransformFilter.m | 45 +++--- .../GPUImagePrewittEdgeDetectionFilter.m | 12 +- framework/Source/GPUImageSketchFilter.m | 8 +- .../Source/GPUImageSobelEdgeDetectionFilter.h | 5 +- .../Source/GPUImageSobelEdgeDetectionFilter.m | 41 ++++-- .../GPUImageThresholdEdgeDetectionFilter.m | 11 +- .../Source/GPUImageThresholdSketchFilter.m | 11 +- ...geThresholdedNonMaximumSuppressionFilter.h | 2 + ...geThresholdedNonMaximumSuppressionFilter.m | 131 +++++++++++++++++- framework/Source/GPUImageTwoPassFilter.m | 4 +- framework/Source/GPUImageXYDerivativeFilter.m | 14 +- framework/Source/Mac/GPUImageContext.h | 1 + framework/Source/iOS/GPUImagePicture.m | 3 + 20 files changed, 320 insertions(+), 89 deletions(-) diff --git a/README.md b/README.md index c26564f7b..f9e552c2b 100755 --- a/README.md +++ b/README.md @@ -214,10 +214,17 @@ There are currently 125 built-in filters, divided into the following categories: - **GPUImageSobelEdgeDetectionFilter**: Sobel edge detection, with edges highlighted in white - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges + - *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0. + +- **GPUImagePrewittEdgeDetectionFilter**: Prewitt edge detection, with edges highlighted in white + - *texelWidth*: + - *texelHeight*: These parameters affect the visibility of the detected edges + - *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0. - **GPUImageThresholdEdgeDetectionFilter**: Performs Sobel edge detection, but applies a threshold instead of giving gradual strength values - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges + - *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0. - *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.8 as the default - **GPUImageCannyEdgeDetectionFilter**: This uses the full Canny process to highlight one-pixel-wide edges @@ -379,10 +386,13 @@ There are currently 125 built-in filters, divided into the following categories: - **GPUImageSketchFilter**: Converts video to look like a sketch. This is just the Sobel edge detection filter with the colors inverted - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges + - *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0. - **GPUImageThresholdSketchFilter**: Same as the sketch filter, only the edges are thresholded instead of being grayscale - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges + - *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0. + - *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.8 as the default - **GPUImageToonFilter**: This uses Sobel edge detection to place a black border around objects, and then it quantizes the colors present in the image to give a cartoon-like quality to the image. - *texelWidth*: diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 88d9ae2f5..9f2b1eb2e 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -453,12 +453,20 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; case GPUIMAGE_SOBELEDGEDETECTION: { currentlySelectedFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; - self.enableSlider = NO; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 2.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; }; break; case GPUIMAGE_PREWITTEDGEDETECTION: { currentlySelectedFilter = [[GPUImagePrewittEdgeDetectionFilter alloc] init]; - self.enableSlider = NO; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 2.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; }; break; case GPUIMAGE_CANNYEDGEDETECTION: { @@ -486,14 +494,18 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; case GPUIMAGE_SKETCH: { currentlySelectedFilter = [[GPUImageSketchFilter alloc] init]; - self.enableSlider = NO; + + self.minimumSliderValue = 0.0; + self.maximumSliderValue = 2.0; + self.currentSliderValue = 1.0; + self.enableSlider = YES; }; break; case GPUIMAGE_THRESHOLDSKETCH: { currentlySelectedFilter = [[GPUImageThresholdSketchFilter alloc] init]; - self.minimumSliderValue = 0.9; + self.minimumSliderValue = 0.0; self.maximumSliderValue = 1.0; - self.currentSliderValue = 0.9; + self.currentSliderValue = 0.25; self.enableSlider = YES; }; break; case GPUIMAGE_TOON: @@ -1192,6 +1204,8 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_POLKADOT: [(GPUImagePolkaDotFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; case GPUIMAGE_HALFTONE: [(GPUImageHalftoneFilter *)currentlySelectedFilter setFractionalWidthOfAPixel:_currentSliderValue]; break; case GPUIMAGE_CROSSHATCH: [(GPUImageCrosshatchFilter *)currentlySelectedFilter setCrossHatchSpacing:_currentSliderValue]; break; + case GPUIMAGE_SOBELEDGEDETECTION: [(GPUImageSobelEdgeDetectionFilter *)currentlySelectedFilter setEdgeStrength:_currentSliderValue]; break; + case GPUIMAGE_PREWITTEDGEDETECTION: [(GPUImagePrewittEdgeDetectionFilter *)currentlySelectedFilter setEdgeStrength:_currentSliderValue]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)currentlySelectedFilter setDownsamplingFactor:round(_currentSliderValue)]; break; case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; @@ -1205,6 +1219,7 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_LOWPASS: [(GPUImageLowPassFilter *)currentlySelectedFilter setFilterStrength:_currentSliderValue]; break; case GPUIMAGE_HIGHPASS: [(GPUImageHighPassFilter *)currentlySelectedFilter setFilterStrength:_currentSliderValue]; break; case GPUIMAGE_MOTIONDETECTOR: [(GPUImageMotionDetector *)currentlySelectedFilter setLowPassFilterStrength:_currentSliderValue]; break; + case GPUIMAGE_SKETCH: [(GPUImageSketchFilter *)currentlySelectedFilter setEdgeStrength:_currentSliderValue]; break; case GPUIMAGE_THRESHOLDSKETCH: [(GPUImageThresholdSketchFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; case GPUIMAGE_POSTERIZE: [(GPUImagePosterizeFilter *)currentlySelectedFilter setColorLevels:round(_currentSliderValue)]; break; diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 9da98331a..d421456c6 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -475,8 +475,12 @@ - (void)setupFilter; case GPUIMAGE_SOBELEDGEDETECTION: { self.title = @"Sobel Edge Detection"; - self.filterSettingsSlider.hidden = YES; - + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.25]; + filter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; }; break; case GPUIMAGE_XYGRADIENT: @@ -538,7 +542,11 @@ - (void)setupFilter; case GPUIMAGE_PREWITTEDGEDETECTION: { self.title = @"Prewitt Edge Detection"; - self.filterSettingsSlider.hidden = YES; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:1.0]; filter = [[GPUImagePrewittEdgeDetectionFilter alloc] init]; }; break; @@ -564,7 +572,7 @@ - (void)setupFilter; [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:1.0]; - [self.filterSettingsSlider setValue:0.5]; + [self.filterSettingsSlider setValue:0.25]; filter = [[GPUImageThresholdEdgeDetectionFilter alloc] init]; }; break; @@ -624,7 +632,11 @@ - (void)setupFilter; case GPUIMAGE_SKETCH: { self.title = @"Sketch"; - self.filterSettingsSlider.hidden = YES; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:0.0]; + [self.filterSettingsSlider setMaximumValue:1.0]; + [self.filterSettingsSlider setValue:0.25]; filter = [[GPUImageSketchFilter alloc] init]; }; break; @@ -633,9 +645,9 @@ - (void)setupFilter; self.title = @"Threshold Sketch"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:0.9]; + [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:1.0]; - [self.filterSettingsSlider setValue:0.9]; + [self.filterSettingsSlider setValue:0.25]; filter = [[GPUImageThresholdSketchFilter alloc] init]; }; break; @@ -1551,6 +1563,9 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_CROSSHATCH: [(GPUImageCrosshatchFilter *)filter setCrossHatchSpacing:[(UISlider *)sender value]]; break; case GPUIMAGE_POSTERIZE: [(GPUImagePosterizeFilter *)filter setColorLevels:round([(UISlider*)sender value])]; break; case GPUIMAGE_HAZE: [(GPUImageHazeFilter *)filter setDistance:[(UISlider *)sender value]]; break; + case GPUIMAGE_SOBELEDGEDETECTION: [(GPUImageSobelEdgeDetectionFilter *)filter setEdgeStrength:[(UISlider *)sender value]]; break; + case GPUIMAGE_PREWITTEDGEDETECTION: [(GPUImagePrewittEdgeDetectionFilter *)filter setEdgeStrength:[(UISlider *)sender value]]; break; + case GPUIMAGE_SKETCH: [(GPUImageSketchFilter *)filter setEdgeStrength:[(UISlider *)sender value]]; break; case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)filter setThreshold:[(UISlider *)sender value]]; break; case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)filter setThresholdMultiplier:[(UISlider *)sender value]]; break; diff --git a/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index bfed5f935..5ad9778db 100755 --- a/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -49,10 +49,9 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updateSliderValue:(id)sender { -// [(GPUImageSepiaFilter *)sepiaFilter setIntensity:[(UISlider *)sender value]]; - CGFloat midpoint = [(UISlider *)sender value]; - [(GPUImageTiltShiftFilter *)sepiaFilter setTopFocusLevel:midpoint - 0.1]; - [(GPUImageTiltShiftFilter *)sepiaFilter setBottomFocusLevel:midpoint + 0.1]; +// CGFloat midpoint = [(UISlider *)sender value]; +// [(GPUImageTiltShiftFilter *)sepiaFilter setTopFocusLevel:midpoint - 0.1]; +// [(GPUImageTiltShiftFilter *)sepiaFilter setBottomFocusLevel:midpoint + 0.1]; [sourcePicture processImage]; } @@ -65,8 +64,8 @@ - (void)setupDisplayFiltering; UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; // The WID.jpg example is greater than 2048 pixels tall, so it fails on older devices sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; -// sepiaFilter = [[GPUImageSepiaFilter alloc] init]; - sepiaFilter = [[GPUImageTiltShiftFilter alloc] init]; +// sepiaFilter = [[GPUImageTiltShiftFilter alloc] init]; + sepiaFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; GPUImageView *imageView = (GPUImageView *)self.view; [sepiaFilter forceProcessingAtSize:imageView.sizeInPixels]; // This is now needed to make the filter run at the smaller output size @@ -105,7 +104,8 @@ - (void)setupImageFilteringToDisk; UIImage *currentFilteredImage = [vignetteImageFilter imageFromCurrentlyProcessedOutput]; // Do a simpler image filtering - GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init]; +// GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init]; + GPUImageSobelEdgeDetectionFilter *stillImageFilter2 = [[GPUImageSobelEdgeDetectionFilter alloc] init]; // GPUImageUnsharpMaskFilter *stillImageFilter2 = [[GPUImageUnsharpMaskFilter alloc] init]; // GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; diff --git a/framework/Source/GLProgram.h b/framework/Source/GLProgram.h index 2c5b21523..572d8ae9d 100755 --- a/framework/Source/GLProgram.h +++ b/framework/Source/GLProgram.h @@ -10,6 +10,7 @@ #import #else #import +#import #endif @interface GLProgram : NSObject diff --git a/framework/Source/GPUImageHoughTransformLineDetector.h b/framework/Source/GPUImageHoughTransformLineDetector.h index a318c6db7..bd1bb3ff3 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.h +++ b/framework/Source/GPUImageHoughTransformLineDetector.h @@ -25,7 +25,7 @@ @interface GPUImageHoughTransformLineDetector : GPUImageFilterGroup { - GPUImageCannyEdgeDetectionFilter *thresholdEdgeDetectionFilter; + GPUImageOutput *thresholdEdgeDetectionFilter; // GPUImageThresholdEdgeDetectionFilter *thresholdEdgeDetectionFilter; GPUImageParallelCoordinateLineTransformFilter *parallelCoordinateLineTransformFilter; diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m index 2667d4db7..dbd73d872 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -25,8 +25,17 @@ - (id)init; #endif // First pass: do edge detection and threshold that to just have white pixels for edges - - thresholdEdgeDetectionFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; + if ([GPUImageContext deviceSupportsFramebufferReads]) + { + thresholdEdgeDetectionFilter = [[GPUImageThresholdEdgeDetectionFilter alloc] init]; +// thresholdEdgeDetectionFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; + [(GPUImageThresholdEdgeDetectionFilter *)thresholdEdgeDetectionFilter setThreshold:0.8]; +// thresholdEdgeDetectionFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; + } + else + { + thresholdEdgeDetectionFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; + } [self addFilter:thresholdEdgeDetectionFilter]; #ifdef DEBUGLINEDETECTION @@ -39,20 +48,6 @@ - (id)init; }]; #endif -/* - thresholdEdgeDetectionFilter = [[GPUImageThresholdEdgeDetectionFilter alloc] init]; - [self addFilter:thresholdEdgeDetectionFilter]; - -#ifdef DEBUGLINEDETECTION - __unsafe_unretained NSMutableArray *weakIntermediateImages = _intermediateImages; - __unsafe_unretained GPUImageFilter *weakFilter = thresholdEdgeDetectionFilter; - [thresholdEdgeDetectionFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime){ - [weakIntermediateImages removeAllObjects]; - UIImage *intermediateImage = [weakFilter imageFromCurrentlyProcessedOutput]; - [weakIntermediateImages addObject:intermediateImage]; - }]; -#endif - */ // Second pass: extract the white points and draw representative lines in parallel coordinate space parallelCoordinateLineTransformFilter = [[GPUImageParallelCoordinateLineTransformFilter alloc] init]; [self addFilter:parallelCoordinateLineTransformFilter]; @@ -66,7 +61,14 @@ - (id)init; #endif // Third pass: apply non-maximum suppression - nonMaximumSuppressionFilter = [[GPUImageThresholdedNonMaximumSuppressionFilter alloc] init]; + if ([GPUImageContext deviceSupportsFramebufferReads]) + { + nonMaximumSuppressionFilter = [[GPUImageThresholdedNonMaximumSuppressionFilter alloc] initWithPackedColorspace:YES]; + } + else + { + nonMaximumSuppressionFilter = [[GPUImageThresholdedNonMaximumSuppressionFilter alloc] initWithPackedColorspace:NO]; + } [self addFilter:nonMaximumSuppressionFilter]; __unsafe_unretained GPUImageHoughTransformLineDetector *weakSelf = self; @@ -92,8 +94,8 @@ - (id)init; // self.terminalFilter = colorPackingFilter; self.terminalFilter = nonMaximumSuppressionFilter; - self.edgeThreshold = 0.95; - self.lineDetectionThreshold = 0.2; +// self.edgeThreshold = 0.95; + self.lineDetectionThreshold = 0.8; return self; } diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index 6baf14fe9..4b9b0a2e8 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -17,23 +17,31 @@ void main() void main() { -// gl_FragColor = vec4(scalingFactor, scalingFactor, scalingFactor, 1.0); gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); } ); +// highp - 16-bit, floating point range: -2^62 to 2^62, integer range: -2^16 to 2^16 // NOTE: See below for where I'm tacking on the required extension as a prefix NSString *const kGPUImageHoughAccumulationFBOReadFragmentShaderString = SHADER_STRING ( - const lowp float scalingFactor = 1.0 / 256.0; - +// const lowp float scalingFactor = 0.004; + const lowp float scalingFactor = 0.1; + void main() { - lowp vec4 previousFragmentData = gl_LastFragData[0]; - // gl_FragColor = vec4(scalingFactor, scalingFactor, scalingFactor, 1.0); - gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); + mediump vec4 fragmentData = gl_LastFragData[0]; + + fragmentData.r = fragmentData.r + scalingFactor; + fragmentData.g = scalingFactor * floor(fragmentData.r) + fragmentData.g; + fragmentData.b = scalingFactor * floor(fragmentData.g) + fragmentData.b; + fragmentData.a = scalingFactor * floor(fragmentData.b) + fragmentData.a; + + fragmentData = fract(fragmentData); + + gl_FragColor = vec4(fragmentData.rgb, 1.0); } - ); +); #else NSString *const kGPUImageHoughAccumulationFragmentShaderString = SHADER_STRING @@ -42,7 +50,6 @@ void main() void main() { - // gl_FragColor = vec4(scalingFactor, scalingFactor, scalingFactor, 1.0); gl_FragColor = vec4(0.004, 0.004, 0.004, 1.0); } ); @@ -77,13 +84,9 @@ - (id)init; if ([GPUImageContext deviceSupportsFramebufferReads]) { fragmentShaderToUse = [NSString stringWithFormat:@"#extension GL_EXT_shader_framebuffer_fetch : require\n %@",kGPUImageHoughAccumulationFBOReadFragmentShaderString]; - -// NSLog(@"Supports FBO reads: %@", fragmentShaderToUse); -// fragmentShaderToUse = kGPUImageHoughAccumulationFBOReadFragmentShaderString; } else { -// NSLog(@"Doesn't support FBO reads"); fragmentShaderToUse = kGPUImageHoughAccumulationFragmentShaderString; } @@ -222,14 +225,24 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); - glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_ONE, GL_ONE); - glEnable(GL_BLEND); + if (![GPUImageContext deviceSupportsFramebufferReads]) + { + glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_ONE, GL_ONE); + glEnable(GL_BLEND); + } + else + { + glLineWidth(1); + } glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, lineCoordinates); glDrawArrays(GL_LINES, 0, (linePairsToRender * 4)); - glDisable(GL_BLEND); + if (![GPUImageContext deviceSupportsFramebufferReads]) + { + glDisable(GL_BLEND); + } } @end diff --git a/framework/Source/GPUImagePrewittEdgeDetectionFilter.m b/framework/Source/GPUImagePrewittEdgeDetectionFilter.m index b5cfc1b97..a9906930a 100755 --- a/framework/Source/GPUImagePrewittEdgeDetectionFilter.m +++ b/framework/Source/GPUImagePrewittEdgeDetectionFilter.m @@ -20,7 +20,8 @@ @implementation GPUImagePrewittEdgeDetectionFilter varying vec2 bottomRightTextureCoordinate; uniform sampler2D inputImageTexture; - + uniform float edgeStrength; + void main() { float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; @@ -34,7 +35,7 @@ void main() float h = -topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity; - float mag = length(vec2(h, v)); + float mag = length(vec2(h, v)) * edgeStrength; gl_FragColor = vec4(vec3(mag), 1.0); } @@ -55,7 +56,8 @@ void main() varying vec2 bottomRightTextureCoordinate; uniform sampler2D inputImageTexture; - + uniform float edgeStrength; + void main() { float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; @@ -69,7 +71,7 @@ void main() float h = -topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity; - float mag = length(vec2(h, v)); + float mag = length(vec2(h, v)) * edgeStrength; gl_FragColor = vec4(vec3(mag), 1.0); } @@ -85,6 +87,8 @@ - (id)init; { return nil; } + + self.edgeStrength = 1.0; return self; } diff --git a/framework/Source/GPUImageSketchFilter.m b/framework/Source/GPUImageSketchFilter.m index 6e793b307..3cda2203a 100755 --- a/framework/Source/GPUImageSketchFilter.m +++ b/framework/Source/GPUImageSketchFilter.m @@ -20,6 +20,8 @@ @implementation GPUImageSketchFilter varying vec2 bottomLeftTextureCoordinate; varying vec2 bottomRightTextureCoordinate; + uniform float edgeStrength; + uniform sampler2D inputImageTexture; void main() @@ -35,7 +37,7 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = 1.0 - length(vec2(h, v)); + float mag = 1.0 - (length(vec2(h, v)) * edgeStrength); gl_FragColor = vec4(vec3(mag), 1.0); } @@ -55,6 +57,8 @@ void main() varying vec2 bottomLeftTextureCoordinate; varying vec2 bottomRightTextureCoordinate; + uniform float edgeStrength; + uniform sampler2D inputImageTexture; void main() @@ -70,7 +74,7 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = 1.0 - length(vec2(h, v)); + float mag = 1.0 - (length(vec2(h, v)) * edgeStrength); gl_FragColor = vec4(vec3(mag), 1.0); } diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.h b/framework/Source/GPUImageSobelEdgeDetectionFilter.h index de57476bd..d6b2c13a3 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.h +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.h @@ -2,7 +2,7 @@ @interface GPUImageSobelEdgeDetectionFilter : GPUImageTwoPassFilter { - GLint texelWidthUniform, texelHeightUniform; + GLint texelWidthUniform, texelHeightUniform, edgeStrengthUniform; BOOL hasOverriddenImageSizeFactor; } @@ -10,4 +10,7 @@ @property(readwrite, nonatomic) CGFloat texelWidth; @property(readwrite, nonatomic) CGFloat texelHeight; +// The filter strength property affects the dynamic range of the filter. High values can make edges more visible, but can lead to saturation. Default of 1.0. +@property(readwrite, nonatomic) CGFloat edgeStrength; + @end diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index f0d8d011a..503318a19 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -21,6 +21,7 @@ varying vec2 bottomRightTextureCoordinate; uniform sampler2D inputImageTexture; + uniform float edgeStrength; void main() { @@ -35,7 +36,7 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = length(vec2(h, v)); + float mag = length(vec2(h, v)) * edgeStrength; gl_FragColor = vec4(vec3(mag), 1.0); } @@ -56,7 +57,8 @@ void main() varying vec2 bottomRightTextureCoordinate; uniform sampler2D inputImageTexture; - + uniform float edgeStrength; + void main() { float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; @@ -70,7 +72,7 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = length(vec2(h, v)); + float mag = length(vec2(h, v)) * edgeStrength; gl_FragColor = vec4(vec3(mag), 1.0); } @@ -81,6 +83,7 @@ @implementation GPUImageSobelEdgeDetectionFilter @synthesize texelWidth = _texelWidth; @synthesize texelHeight = _texelHeight; +@synthesize edgeStrength = _edgeStrength; #pragma mark - #pragma mark Initialization and teardown @@ -108,22 +111,26 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; texelWidthUniform = [secondFilterProgram uniformIndex:@"texelWidth"]; texelHeightUniform = [secondFilterProgram uniformIndex:@"texelHeight"]; + edgeStrengthUniform = [secondFilterProgram uniformIndex:@"edgeStrength"]; + self.edgeStrength = 1.0; return self; } - (void)setupFilterForSize:(CGSize)filterFrameSize; { - if (!hasOverriddenImageSizeFactor) - { - _texelWidth = 1.0 / filterFrameSize.width; - _texelHeight = 1.0 / filterFrameSize.height; - - runSynchronouslyOnVideoProcessingQueue(^{ - [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; - [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; - }); - } + runSynchronouslyOnVideoProcessingQueue(^{ + if (!hasOverriddenImageSizeFactor) + { + _texelWidth = 1.0 / filterFrameSize.width; + _texelHeight = 1.0 / filterFrameSize.height; + + runSynchronouslyOnVideoProcessingQueue(^{ + [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; + [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; + }); + } + }); } - (BOOL)wantsMonochromeInput; @@ -155,5 +162,13 @@ - (void)setTexelHeight:(CGFloat)newValue; [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; } +- (void)setEdgeStrength:(CGFloat)newValue; +{ + _edgeStrength = newValue; + + [self setFloat:_edgeStrength forUniform:edgeStrengthUniform program:secondFilterProgram]; +} + + @end diff --git a/framework/Source/GPUImageThresholdEdgeDetectionFilter.m b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m index 05907c3c6..8e7ad6543 100755 --- a/framework/Source/GPUImageThresholdEdgeDetectionFilter.m +++ b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m @@ -23,6 +23,8 @@ @implementation GPUImageThresholdEdgeDetectionFilter uniform sampler2D inputImageTexture; uniform lowp float threshold; + uniform float edgeStrength; + const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); void main() @@ -38,7 +40,7 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = length(vec2(h, v)); + float mag = length(vec2(h, v)) * edgeStrength; mag = step(threshold, mag); gl_FragColor = vec4(vec3(mag), 1.0); @@ -62,6 +64,8 @@ void main() uniform sampler2D inputImageTexture; uniform float threshold; + uniform float edgeStrength; + const vec3 W = vec3(0.2125, 0.7154, 0.0721); void main() @@ -77,7 +81,7 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = length(vec2(h, v)); + float mag = length(vec2(h, v)) * edgeStrength; mag = step(threshold, mag); gl_FragColor = vec4(vec3(mag), 1.0); @@ -98,7 +102,8 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; } thresholdUniform = [secondFilterProgram uniformIndex:@"threshold"]; - self.threshold = 0.9; + self.threshold = 0.25; + self.edgeStrength = 1.0; return self; } diff --git a/framework/Source/GPUImageThresholdSketchFilter.m b/framework/Source/GPUImageThresholdSketchFilter.m index 8215879be..d24e9dead 100644 --- a/framework/Source/GPUImageThresholdSketchFilter.m +++ b/framework/Source/GPUImageThresholdSketchFilter.m @@ -19,7 +19,8 @@ uniform sampler2D inputImageTexture; uniform lowp float threshold; - + uniform float edgeStrength; + const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); void main() @@ -35,8 +36,9 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = 1.0 - length(vec2(h, v)); + float mag = (length(vec2(h, v)) * edgeStrength); mag = step(threshold, mag); + mag = 1.0 - mag; gl_FragColor = vec4(vec3(mag), 1.0); } @@ -58,7 +60,8 @@ void main() uniform sampler2D inputImageTexture; uniform float threshold; - + uniform float edgeStrength; + const vec3 W = vec3(0.2125, 0.7154, 0.0721); void main() @@ -74,7 +77,7 @@ void main() float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; - float mag = 1.0 - length(vec2(h, v)); + float mag = 1.0 - length(vec2(h, v) * edgeStrength); mag = step(threshold, mag); gl_FragColor = vec4(vec3(mag), 1.0); diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h index 8ddf93c16..9c6e5d721 100644 --- a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h +++ b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.h @@ -9,4 +9,6 @@ */ @property(readwrite, nonatomic) CGFloat threshold; +- (id)initWithPackedColorspace:(BOOL)inputUsesPackedColorspace; + @end diff --git a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m index d1c6c482e..883bba944 100644 --- a/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageThresholdedNonMaximumSuppressionFilter.m @@ -50,6 +50,64 @@ void main() // gl_FragColor = vec4((centerColor.rgb * step(maxValue, step(threshold, centerColor.r)) * multiplier), 1.0); } ); + +NSString *const kGPUImageThresholdedNonMaximumSuppressionPackedColorspaceFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying highp vec2 textureCoordinate; + varying highp vec2 leftTextureCoordinate; + varying highp vec2 rightTextureCoordinate; + + varying highp vec2 topTextureCoordinate; + varying highp vec2 topLeftTextureCoordinate; + varying highp vec2 topRightTextureCoordinate; + + varying highp vec2 bottomTextureCoordinate; + varying highp vec2 bottomLeftTextureCoordinate; + varying highp vec2 bottomRightTextureCoordinate; + + uniform lowp float threshold; + + highp float encodedIntensity(highp vec3 sourceColor) + { + return (sourceColor.b * 256.0 + sourceColor.g + sourceColor.r / 256.0); + } + + void main() + { + highp float bottomColor = encodedIntensity(texture2D(inputImageTexture, bottomTextureCoordinate).rgb); + highp float bottomLeftColor = encodedIntensity(texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb); + highp float bottomRightColor = encodedIntensity(texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb); + highp float centerColor = encodedIntensity(texture2D(inputImageTexture, textureCoordinate).rgb); + highp float leftColor = encodedIntensity(texture2D(inputImageTexture, leftTextureCoordinate).rgb); + highp float rightColor = encodedIntensity(texture2D(inputImageTexture, rightTextureCoordinate).rgb); + highp float topColor = encodedIntensity(texture2D(inputImageTexture, topTextureCoordinate).rgb); + highp float topRightColor = encodedIntensity(texture2D(inputImageTexture, topRightTextureCoordinate).rgb); + highp float topLeftColor = encodedIntensity(texture2D(inputImageTexture, topLeftTextureCoordinate).rgb); + + // Use a tiebreaker for pixels to the left and immediately above this one + highp float multiplier = 1.0 - step(centerColor, topColor); + multiplier = multiplier * 1.0 - step(centerColor, topLeftColor); + multiplier = multiplier * 1.0 - step(centerColor, leftColor); + multiplier = multiplier * 1.0 - step(centerColor, bottomLeftColor); + + highp float maxValue = max(centerColor, bottomColor); + maxValue = max(maxValue, bottomRightColor); + maxValue = max(maxValue, rightColor); + maxValue = max(maxValue, topRightColor); + + highp float finalValue = centerColor * step(maxValue, centerColor) * multiplier; +// highp float finalValue = step(maxValue, centerColor) * multiplier; + finalValue = step(threshold, finalValue); + + gl_FragColor = vec4(finalValue, finalValue, finalValue, 1.0); +// gl_FragColor = vec4(finalValue, centerColor, centerColor, 1.0); +// gl_FragColor = vec4(vec3(centerColor), 1.0); + // + // gl_FragColor = vec4((centerColor.rgb * step(maxValue, step(threshold, centerColor.r)) * multiplier), 1.0); + } +); #else NSString *const kGPUImageThresholdedNonMaximumSuppressionFragmentShaderString = SHADER_STRING ( @@ -100,6 +158,56 @@ void main() // gl_FragColor = vec4((centerColor.rgb * step(maxValue, step(threshold, centerColor.r)) * multiplier), 1.0); } ); + +NSString *const kGPUImageThresholdedNonMaximumSuppressionPackedColorspaceFragmentShaderString = SHADER_STRING +( + uniform sampler2D inputImageTexture; + + varying vec2 textureCoordinate; + varying vec2 leftTextureCoordinate; + varying vec2 rightTextureCoordinate; + + varying vec2 topTextureCoordinate; + varying vec2 topLeftTextureCoordinate; + varying vec2 topRightTextureCoordinate; + + varying vec2 bottomTextureCoordinate; + varying vec2 bottomLeftTextureCoordinate; + varying vec2 bottomRightTextureCoordinate; + + uniform float threshold; + + void main() + { + float bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).r; + float bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; + float bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; + vec4 centerColor = texture2D(inputImageTexture, textureCoordinate); + float leftColor = texture2D(inputImageTexture, leftTextureCoordinate).r; + float rightColor = texture2D(inputImageTexture, rightTextureCoordinate).r; + float topColor = texture2D(inputImageTexture, topTextureCoordinate).r; + float topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).r; + float topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).r; + + // Use a tiebreaker for pixels to the left and immediately above this one + float multiplier = 1.0 - step(centerColor.r, topColor); + multiplier = multiplier * 1.0 - step(centerColor.r, topLeftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, leftColor); + multiplier = multiplier * 1.0 - step(centerColor.r, bottomLeftColor); + + float maxValue = max(centerColor.r, bottomColor); + maxValue = max(maxValue, bottomRightColor); + maxValue = max(maxValue, rightColor); + maxValue = max(maxValue, topRightColor); + + float finalValue = centerColor.r * step(maxValue, centerColor.r) * multiplier; + finalValue = step(threshold, finalValue); + + gl_FragColor = vec4(finalValue, finalValue, finalValue, 1.0); + // + // gl_FragColor = vec4((centerColor.rgb * step(maxValue, step(threshold, centerColor.r)) * multiplier), 1.0); + } + ); #endif @implementation GPUImageThresholdedNonMaximumSuppressionFilter @@ -111,7 +219,28 @@ @implementation GPUImageThresholdedNonMaximumSuppressionFilter - (id)init; { - if (!(self = [super initWithFragmentShaderFromString:kGPUImageThresholdedNonMaximumSuppressionFragmentShaderString])) + if (!(self = [self initWithPackedColorspace:NO])) + { + return nil; + } + + return self; +} + +- (id)initWithPackedColorspace:(BOOL)inputUsesPackedColorspace; +{ + NSString *shaderString; + if (inputUsesPackedColorspace) + { + shaderString = kGPUImageThresholdedNonMaximumSuppressionPackedColorspaceFragmentShaderString; + } + else + { + shaderString = kGPUImageThresholdedNonMaximumSuppressionFragmentShaderString; + } + + + if (!(self = [super initWithFragmentShaderFromString:shaderString])) { return nil; } diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index f8a25a981..f2ca8837f 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -344,15 +344,15 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; } + // Run the second stage of the two-pass filter + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; [self setSecondFilterFBO]; - [GPUImageContext setActiveShaderProgram:secondFilterProgram]; [self setUniformsForProgramAtIndex:1]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - if (!currentlyReceivingMonochromeInput) { glActiveTexture(GL_TEXTURE3); diff --git a/framework/Source/GPUImageXYDerivativeFilter.m b/framework/Source/GPUImageXYDerivativeFilter.m index cf81f33b9..7e19e9d4f 100755 --- a/framework/Source/GPUImageXYDerivativeFilter.m +++ b/framework/Source/GPUImageXYDerivativeFilter.m @@ -25,6 +25,8 @@ @implementation GPUImageXYDerivativeFilter uniform sampler2D inputImageTexture; + uniform float edgeStrength; + void main() { float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; @@ -38,8 +40,8 @@ void main() float verticalDerivative = -topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity; float horizontalDerivative = -bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity; -// float verticalDerivative = -topIntensity + bottomIntensity; -// float horizontalDerivative = -leftIntensity + rightIntensity; + verticalDerivative = verticalDerivative * edgeStrength; + horizontalDerivative = horizontalDerivative * edgeStrength; // Scaling the X * Y operation so that negative numbers are not clipped in the 0..1 range. This will be expanded in the corner detection filter gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, ((verticalDerivative * horizontalDerivative) + 1.0) / 2.0, 1.0); @@ -62,6 +64,8 @@ void main() uniform sampler2D inputImageTexture; + uniform float edgeStrength; + void main() { float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; @@ -75,8 +79,8 @@ void main() float verticalDerivative = -topLeftIntensity - topIntensity - topRightIntensity + bottomLeftIntensity + bottomIntensity + bottomRightIntensity; float horizontalDerivative = -bottomLeftIntensity - leftIntensity - topLeftIntensity + bottomRightIntensity + rightIntensity + topRightIntensity; - // float verticalDerivative = -topIntensity + bottomIntensity; - // float horizontalDerivative = -leftIntensity + rightIntensity; + verticalDerivative = verticalDerivative * edgeStrength; + horizontalDerivative = horizontalDerivative * edgeStrength; // Scaling the X * Y operation so that negative numbers are not clipped in the 0..1 range. This will be expanded in the corner detection filter gl_FragColor = vec4(horizontalDerivative * horizontalDerivative, verticalDerivative * verticalDerivative, ((verticalDerivative * horizontalDerivative) + 1.0) / 2.0, 1.0); @@ -94,6 +98,8 @@ - (id)init; return nil; } + self.edgeStrength = 1.0; + return self; } diff --git a/framework/Source/Mac/GPUImageContext.h b/framework/Source/Mac/GPUImageContext.h index 146d744b9..12e124611 100755 --- a/framework/Source/Mac/GPUImageContext.h +++ b/framework/Source/Mac/GPUImageContext.h @@ -1,5 +1,6 @@ #import #import +#import #import #import #import "GLProgram.h" diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 49d2901ce..de7a36c9a 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -149,6 +149,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot { glGenerateMipmap(GL_TEXTURE_2D); } + glBindTexture(GL_TEXTURE_2D, 0); }); if (shouldRedrawUsingCoreGraphics) @@ -206,7 +207,9 @@ - (void)processImage; NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + [currentTarget setCurrentlyReceivingMonochromeInput:NO]; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; +// [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; } From 6921f0908c19395faa5399afecfae8c7b548f956 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 18 Jun 2013 14:37:40 -0500 Subject: [PATCH 402/695] Tweaked the documentation. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e147d1d25..27bd32d29 100755 --- a/README.md +++ b/README.md @@ -36,10 +36,6 @@ BSD-style, with the full license available with the framework in License.txt. - Devices must have a camera to use camera-related functionality (obviously) - The framework uses automatic reference counting (ARC), but should support projects using both ARC and manual reference counting if added as a subproject as explained below. For manual reference counting applications targeting iOS 4.x, you'll need add -fobjc-arc to the Other Linker Flags for your application project. -## Build iOS static library ## - -Execute `build.sh` to compile a universal library for iOS simulator/device. The produced library and header files are located at `build/Release-iphone`. You may also change the version of iOS SDK by specifying `IOSSDK_VER` in the `build.sh` (all available versions can be found using `xcodebuild -showsdks`). - ## General architecture ## GPUImage uses OpenGL ES 2.0 shaders to perform image and video manipulation much faster than could be done in CPU-bound routines. However, it hides the complexity of interacting with the OpenGL ES API in a simplified Objective-C interface. This interface lets you define input sources for images and video, attach filters in a chain, and send the resulting processed image or video to the screen, to a UIImage, or to a movie on disk. @@ -499,6 +495,10 @@ Also, if you need to deploy this to iOS 4.x, it appears that the current version Additionally, this is an ARC-enabled framework, so if you want to use this within a manual reference counted application targeting iOS 4.x, you'll need to add -fobjc-arc to your Other Linker Flags as well. +### Building static library at the command line ### + +If you don't want to include the project as a dependency in your application's Xcode project, you can build a universal static library for the iOS Simulator or device. To do this, run `build.sh` at the command line. The resulting library and header files will be located at `build/Release-iphone`. You may also change the version of the iOS SDK by changing the `IOSSDK_VER` variable in `build.sh` (all available versions can be found using `xcodebuild -showsdks`). + ## Performing common tasks ## ### Filtering live video ### From 6b3ddd9c8de20b00bfa7331fa8caed783b7dfbf6 Mon Sep 17 00:00:00 2001 From: Cameron N Perry Date: Wed, 19 Jun 2013 22:01:59 -0700 Subject: [PATCH 403/695] If GPUImagePicture is passed an empty image, create a small 2x2 image to prevent a possibly fatal error on CGContextDrawImage The empty image passed to GPUImagePicture will trigger this error when CGContextDrawImage is called on init:: ": CGContextDrawImage: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update." This should prevent the error altogether. --- framework/Source/iOS/GPUImagePicture.m | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index de7a36c9a..44e8330df 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -67,6 +67,17 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot // TODO: Dispatch this whole thing asynchronously to move image loading off main thread CGFloat widthOfImage = CGImageGetWidth(newImageSource); CGFloat heightOfImage = CGImageGetHeight(newImageSource); + + // If passed an empty image reference, create a small 2x2 image so we don't trigger a fatal error in the future on CGContextDrawImage below + if( !(widthOfImage >= 1) || !(heightOfImage >= 1) ){ + widthOfImage = heightOfImage = 2.0; + UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthOfImage, heightOfImage), NO, 0.0); + UIImage *blank = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + newImageSource = blank.CGImage; + blank = nil; + } + pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); CGSize pixelSizeToUseForTexture = pixelSizeOfImage; From 4568c4b8159cf204ca704d6f98e1f34b54c29939 Mon Sep 17 00:00:00 2001 From: Francois Lambert Date: Fri, 21 Jun 2013 15:22:18 -0400 Subject: [PATCH 404/695] Fix static analysis warning in that new Xcode --- framework/Source/GPUImageStillCamera.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index bd535d04f..2c78bc33f 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -256,7 +256,8 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); - CFRelease(sampleBuffer); + if (sampleBuffer != NULL) + CFRelease(sampleBuffer); } else { From fd893fff5d157bfb794dec791fa1eb98dbec139c Mon Sep 17 00:00:00 2001 From: Martin Robinson <0x4d52@gmail.com> Date: Sat, 22 Jun 2013 22:22:05 +0100 Subject: [PATCH 405/695] Added GPUImageRawDataOutput and GPUImageRawDataInput to the Mac port with necessary modifications. --- .../GPUImageMac.xcodeproj/project.pbxproj | 16 ++++++++ framework/Source/GPUImageRawDataOutput.h | 13 ++++++ framework/Source/GPUImageRawDataOutput.m | 40 +++++++++++++++++-- framework/Source/Mac/GPUImage.h | 2 + framework/Source/Mac/GPUImageMovieWriter.m | 16 +++++++- 5 files changed, 83 insertions(+), 4 deletions(-) diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 426d80aa8..3a6362ef9 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + A87E5E12177648F3007FD5B1 /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = A87E5E10177648F3007FD5B1 /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A87E5E13177648F3007FD5B1 /* GPUImageRawDataOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = A87E5E11177648F3007FD5B1 /* GPUImageRawDataOutput.m */; }; + A87E5E1617764B16007FD5B1 /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = A87E5E1417764B16007FD5B1 /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A87E5E1717764B16007FD5B1 /* GPUImageRawDataInput.m in Sources */ = {isa = PBXBuildFile; fileRef = A87E5E1517764B16007FD5B1 /* GPUImageRawDataInput.m */; }; BC56957A174683620081491B /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC569576174683620081491B /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC56957B174683620081491B /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC569577174683620081491B /* GPUImageCrosshairGenerator.m */; }; BC56957C174683620081491B /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC569578174683620081491B /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -312,6 +316,10 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + A87E5E10177648F3007FD5B1 /* GPUImageRawDataOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataOutput.h; path = Source/GPUImageRawDataOutput.h; sourceTree = SOURCE_ROOT; }; + A87E5E11177648F3007FD5B1 /* GPUImageRawDataOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRawDataOutput.m; path = Source/GPUImageRawDataOutput.m; sourceTree = SOURCE_ROOT; }; + A87E5E1417764B16007FD5B1 /* GPUImageRawDataInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataInput.h; path = Source/GPUImageRawDataInput.h; sourceTree = SOURCE_ROOT; }; + A87E5E1517764B16007FD5B1 /* GPUImageRawDataInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRawDataInput.m; path = Source/GPUImageRawDataInput.m; sourceTree = SOURCE_ROOT; }; BC569576174683620081491B /* GPUImageCrosshairGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageCrosshairGenerator.h; path = Source/GPUImageCrosshairGenerator.h; sourceTree = SOURCE_ROOT; }; BC569577174683620081491B /* GPUImageCrosshairGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCrosshairGenerator.m; path = Source/GPUImageCrosshairGenerator.m; sourceTree = SOURCE_ROOT; }; BC569578174683620081491B /* GPUImageLineGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLineGenerator.h; path = Source/GPUImageLineGenerator.h; sourceTree = SOURCE_ROOT; }; @@ -706,6 +714,8 @@ BCF40F1817248286005AE36A /* Sources */ = { isa = PBXGroup; children = ( + A87E5E1417764B16007FD5B1 /* GPUImageRawDataInput.h */, + A87E5E1517764B16007FD5B1 /* GPUImageRawDataInput.m */, BCF40F191724829B005AE36A /* GPUImageOutput.h */, BCF40F1A1724829B005AE36A /* GPUImageOutput.m */, BCF8679B1727585D00912E34 /* GPUImageAVCamera.h */, @@ -746,6 +756,8 @@ BCF40F2217248811005AE36A /* Outputs */ = { isa = PBXGroup; children = ( + A87E5E10177648F3007FD5B1 /* GPUImageRawDataOutput.h */, + A87E5E11177648F3007FD5B1 /* GPUImageRawDataOutput.m */, BCF40F2317248836005AE36A /* GPUImageView.h */, BCF40F2417248836005AE36A /* GPUImageView.m */, BCF867521725AF9300912E34 /* GPUImageMovieWriter.h */, @@ -1056,6 +1068,8 @@ buildActionMask = 2147483647; files = ( BCA3F3651723A96600E28AEC /* GPUImage.h in Headers */, + A87E5E1617764B16007FD5B1 /* GPUImageRawDataInput.h in Headers */, + A87E5E12177648F3007FD5B1 /* GPUImageRawDataOutput.h in Headers */, BCF40F1217247D68005AE36A /* GPUImageContext.h in Headers */, BCF40F1617247FD8005AE36A /* GLProgram.h in Headers */, BCF40F1B1724829B005AE36A /* GPUImageOutput.h in Headers */, @@ -1417,6 +1431,8 @@ BCA20BC817471C4B0097C84A /* GPUImagePerlinNoiseFilter.m in Sources */, BCA20BCA17471C4B0097C84A /* GPUImageVoronoiConsumerFilter.m in Sources */, BC96A4F2176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, + A87E5E13177648F3007FD5B1 /* GPUImageRawDataOutput.m in Sources */, + A87E5E1717764B16007FD5B1 /* GPUImageRawDataInput.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index 5fd0e436e..b1dcc8ba3 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -11,6 +11,7 @@ typedef struct GPUByteColorVector GPUByteColorVector; @protocol GPUImageRawDataProcessor; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE @interface GPUImageRawDataOutput : NSObject { CGSize imageSize; CVOpenGLESTextureCacheRef rawDataTextureCache; @@ -21,6 +22,18 @@ typedef struct GPUByteColorVector GPUByteColorVector; __unsafe_unretained id textureDelegate; } +#else +@interface GPUImageRawDataOutput : NSObject { + CGSize imageSize; + CVOpenGLTextureCacheRef rawDataTextureCache; + CVPixelBufferRef renderTarget; + GPUImageRotationMode inputRotation; + BOOL outputBGRA; + CVOpenGLTextureRef renderTexture; + + __unsafe_unretained id textureDelegate; +} +#endif @property(readonly) GLubyte *rawBytesForImage; @property(nonatomic, copy) void(^newFrameAvailableBlock)(void); diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 51373acb8..4d5564a33 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -116,14 +116,25 @@ - (void)createDataFBO; if ([GPUImageContext supportsFastTextureUpload]) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #if defined(__IPHONE_6_0) CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &rawDataTextureCache); #else CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &rawDataTextureCache); #endif - if (err) +#else + CGLContextObj context = (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context]; + CVReturn err = CVOpenGLTextureCacheCreate(kCFAllocatorDefault, + NULL, + context, + CGLGetPixelFormat(context), + NULL, + &rawDataTextureCache); +#endif + + if (err) { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + NSAssert(NO, @"Error at CVOpenGL(ES)TextureCacheCreate %d", err); } // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ @@ -154,6 +165,7 @@ - (void)createDataFBO; attrs, &renderTarget); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, rawDataTextureCache, renderTarget, NULL, // texture attributes @@ -165,13 +177,30 @@ - (void)createDataFBO; GL_UNSIGNED_BYTE, 0, &renderTexture); +#else + CVOpenGLTextureCacheCreateTextureFromImage (kCFAllocatorDefault, + rawDataTextureCache, renderTarget, + NULL, + &renderTexture); +#endif + CFRelease(attrs); CFRelease(empty); + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); +#else + glBindTexture(CVOpenGLTextureGetTarget(renderTexture), CVOpenGLTextureGetName(renderTexture)); +#endif + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); +#else + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLTextureGetName(renderTexture), 0); +#endif } else { @@ -179,8 +208,13 @@ - (void)createDataFBO; glGenRenderbuffers(1, &dataRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, dataRenderbuffer); +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, (int)imageSize.width, (int)imageSize.height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, dataRenderbuffer); +#else + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, (int)imageSize.width, (int)imageSize.height); +#endif + + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, dataRenderbuffer); } GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 3da667ccd..dcd836806 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -8,6 +8,8 @@ #import #import #import +#import +#import // Filters #import diff --git a/framework/Source/Mac/GPUImageMovieWriter.m b/framework/Source/Mac/GPUImageMovieWriter.m index 889fcda2f..e27e32e21 100755 --- a/framework/Source/Mac/GPUImageMovieWriter.m +++ b/framework/Source/Mac/GPUImageMovieWriter.m @@ -4,6 +4,7 @@ #import "GLProgram.h" #import "GPUImageFilter.h" +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageColorSwizzlingFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -14,7 +15,20 @@ void main() { gl_FragColor = texture2D(inputImageTexture, textureCoordinate).bgra; } -); + ); +#else +NSString *const kGPUImageColorSwizzlingFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + gl_FragColor = texture2D(inputImageTexture, textureCoordinate).bgra; + } + ); +#endif @interface GPUImageMovieWriter () From 6ef37a3f22088e42e5f8c3beb0f965379b894cd0 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sat, 22 Jun 2013 20:40:03 -0700 Subject: [PATCH 406/695] GPUImageVideoCamera: make class methods to determine whether front and or back facing cameras exist The new iPod Touch doesn't have a back camera, so it's useful to determine which cameras exist before initting the GPUImageVideoCamera. I have left instance methods of the same name so that the property getters still work, there are just class method alternatives now too. --- framework/Source/GPUImageVideoCamera.h | 6 +++++- framework/Source/GPUImageVideoCamera.m | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index cc84e5ce0..879c3f8a5 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -50,8 +50,9 @@ */ @property (readwrite) NSInteger frameRate; -/// Easy way to tell if front-facing camera is present on device +/// Easy way to tell which cameras are present on device @property (readonly, getter = isFrontFacingCameraPresent) BOOL frontFacingCameraPresent; +@property (readonly, getter = isBackFacingCameraPresent) BOOL backFacingCameraPresent; /// This enables the benchmarking mode, which logs out instantaneous and average frame times to the console @property(readwrite, nonatomic) BOOL runBenchmark; @@ -128,4 +129,7 @@ */ - (CGFloat)averageFrameDurationDuringCapture; ++ (BOOL)isBackFacingCameraPresent; ++ (BOOL)isFrontFacingCameraPresent; + @end diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 5da27bb4b..496e670dd 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -419,7 +419,25 @@ - (AVCaptureDevicePosition)cameraPosition return [[videoInput device] position]; } -- (BOOL)isFrontFacingCameraPresent; ++ (BOOL)isBackFacingCameraPresent; +{ + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + + for (AVCaptureDevice *device in devices) + { + if ([device position] == AVCaptureDevicePositionBack) + return YES; + } + + return NO; +} + +- (BOOL)isBackFacingCameraPresent +{ + return [GPUImageVideoCamera isBackFacingCameraPresent]; +} + ++ (BOOL)isFrontFacingCameraPresent; { NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; @@ -432,6 +450,11 @@ - (BOOL)isFrontFacingCameraPresent; return NO; } +- (BOOL)isFrontFacingCameraPresent +{ + return [GPUImageVideoCamera isFrontFacingCameraPresent]; +} + - (void)setCaptureSessionPreset:(NSString *)captureSessionPreset; { [_captureSession beginConfiguration]; From 860ef84903ab553f243789cdd5d4f883bf872937 Mon Sep 17 00:00:00 2001 From: Frank Schlegel Date: Sun, 23 Jun 2013 20:18:21 +0200 Subject: [PATCH 407/695] Introduced outputTextureOptions for GPUImageOutput. This allows to modify the texture settings of a filter to, for example, allow float-typed output textures. --- framework/Source/GPUImageAverageColor.m | 22 +++++++--- framework/Source/GPUImageBuffer.m | 18 +++++--- framework/Source/GPUImageFilter.m | 25 ++++++++--- .../GPUImageHarrisCornerDetectionFilter.m | 3 ++ framework/Source/GPUImageHistogramFilter.m | 4 ++ .../GPUImageHoughTransformLineDetector.m | 3 ++ framework/Source/GPUImageJFAVoronoiFilter.m | 44 +++++++++++-------- framework/Source/GPUImageLuminosity.m | 4 ++ framework/Source/GPUImageMovie.m | 31 ++++++++++--- framework/Source/GPUImageOutput.h | 11 +++++ framework/Source/GPUImageOutput.m | 18 ++++++-- ...ageParallelCoordinateLineTransformFilter.m | 4 ++ framework/Source/GPUImagePoissonBlendFilter.m | 19 +++++--- framework/Source/GPUImageTwoPassFilter.m | 20 ++++++--- framework/Source/GPUImageUIElement.m | 1 + framework/Source/iOS/GPUImagePicture.m | 1 + 16 files changed, 172 insertions(+), 56 deletions(-) diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index 750db9fd8..d475c1b60 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -149,10 +149,10 @@ - (void)initializeOutputTextureIfNeeded; GLuint textureForStage; glGenTextures(1, &textureForStage); glBindTexture(GL_TEXTURE_2D, textureForStage); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); [stageTextures addObject:[NSNumber numberWithInt:textureForStage]]; // NSLog(@"At reduction: %d size in X: %f, size in Y:%f", currentReduction, currentStageSize.width, currentStageSize.height); @@ -220,7 +220,15 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; #endif // NSLog(@"FBO stage size: %f, %f", currentFramebufferSize.width, currentFramebufferSize.height); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFramebufferSize.width, (int)currentFramebufferSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, + 0, + self.outputTextureOptions.internalFormat, + (int)currentFramebufferSize.width, + (int)currentFramebufferSize.height, + 0, + self.outputTextureOptions.format, + self.outputTextureOptions.type, + 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, currentTexture, 0); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); @@ -339,6 +347,10 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg - (void)extractAverageColorAtFrameTime:(CMTime)frameTime; { + // we need a normal color texture for averaging the color values + NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); + #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGSize finalStageSize = [[stageSizes lastObject] CGSizeValue]; #else diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index 0dee1b148..84b9d9345 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -127,14 +127,22 @@ - (GLuint)generateTexture; glActiveTexture(GL_TEXTURE0); glGenTextures(1, &newTextureName); glBindTexture(GL_TEXTURE_2D, newTextureName); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); CGSize currentFBOSize = [self sizeOfFBO]; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, + 0, + self.outputTextureOptions.internalFormat, + (int)currentFBOSize.width, + (int)currentFBOSize.height, + 0, + self.outputTextureOptions.format, + self.outputTextureOptions.type, + 0); glBindTexture(GL_TEXTURE_2D, 0); }); diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 4558308d9..653dc1e51 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -186,6 +186,11 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation { + + // a CGImage can only be created from a 'normal' color texture + NSAssert(self.outputTextureOptions.format == GL_RGBA, @"For conversion to a CGImage the output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"For conversion to a CGImage the type of the output texture of this filter must be GL_UNSIGNED_BYTE."); + __block CGImageRef cgImageFromBytes; runSynchronouslyOnVideoProcessingQueue(^{ @@ -316,11 +321,11 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; filterTextureCache, renderTarget, NULL, // texture attributes GL_TEXTURE_2D, - GL_RGBA, // opengl format + self.outputTextureOptions.internalFormat, // opengl format (int)currentFBOSize.width, (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, + self.outputTextureOptions.format, // native iOS format + self.outputTextureOptions.type, 0, &renderTexture); if (err) @@ -333,8 +338,8 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); outputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); @@ -353,7 +358,15 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize; // } // else // { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, + 0, + self.outputTextureOptions.internalFormat, + (int)currentFBOSize.width, + (int)currentFBOSize.height, + 0, + self.outputTextureOptions.format, + self.outputTextureOptions.type, + 0); // } glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); // glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 8a35ec78b..2a1744f39 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -203,6 +203,9 @@ - (void)dealloc; - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; { + // we need a normal color texture for this filter + NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); NSUInteger numberOfCorners = 0; CGSize imageSize = nonMaximumSuppressionFilter.outputFrameSize; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 94643c9bc..59d725aad 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -263,6 +263,10 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { + // we need a normal color texture for this filter + NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); + if (self.preventRendering) { return; diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m index dbd73d872..6bbcba27f 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -111,6 +111,9 @@ - (void)dealloc; - (void)extractLineParametersFromImageAtFrameTime:(CMTime)frameTime; { + // we need a normal color texture for this filter + NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); NSUInteger numberOfLines = 0; CGSize imageSize = nonMaximumSuppressionFilter.outputFrameSize; diff --git a/framework/Source/GPUImageJFAVoronoiFilter.m b/framework/Source/GPUImageJFAVoronoiFilter.m index 511b2aab7..46efee024 100644 --- a/framework/Source/GPUImageJFAVoronoiFilter.m +++ b/framework/Source/GPUImageJFAVoronoiFilter.m @@ -370,19 +370,19 @@ - (void)initializeOutputTextureIfNeeded; glActiveTexture(GL_TEXTURE2); glGenTextures(1, &outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); glBindTexture(GL_TEXTURE_2D, 0); glGenTextures(1, &secondFilterOutputTexture); glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); glBindTexture(GL_TEXTURE_2D, 0); } @@ -459,11 +459,11 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize filterTextureCache, renderTarget, NULL, // texture attributes GL_TEXTURE_2D, - GL_RGBA, // opengl format + self.outputTextureOptions.internalFormat, // opengl format (int)currentFBOSize.width, (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, + self.outputTextureOptions.format, // native iOS format + self.outputTextureOptions.type, 0, &renderTexture); if (err) @@ -475,8 +475,8 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize CFRelease(empty); glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapS); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); @@ -488,19 +488,27 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize [self initializeOutputTextureIfNeeded]; glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, + 0, + self.outputTextureOptions.internalFormat, + (int)currentFBOSize.width, + (int)currentFBOSize.height, + 0, + self.outputTextureOptions.format, + self.outputTextureOptions.type, + 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); [self notifyTargetsAboutNewOutputTexture]; } glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index 5058954f0..ecc4c3dc2 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -289,6 +289,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates - (void)extractLuminosityAtFrameTime:(CMTime)frameTime; { + // we need a normal color texture for this filter + NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); + #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGSize finalStageSize = [[stageSizes lastObject] CGSizeValue]; #else diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index e311b3667..19a5246cd 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -302,7 +302,18 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; [GPUImageContext useImageProcessingContext]; CVOpenGLESTextureRef texture = NULL; - CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); + CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, + coreVideoTextureCache, + movieFrame, + NULL, + GL_TEXTURE_2D, + self.outputTextureOptions.internalFormat, + bufferWidth, + bufferHeight, + self.outputTextureOptions.format, + self.outputTextureOptions.type, + 0, + &texture); if (!texture || err) { NSLog(@"Movie CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); @@ -312,10 +323,10 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; outputTexture = CVOpenGLESTextureGetName(texture); // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); for (id currentTarget in targets) { @@ -343,7 +354,15 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; glBindTexture(GL_TEXTURE_2D, outputTexture); // Using BGRA extension to pull in video frame data directly - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(movieFrame)); + glTexImage2D(GL_TEXTURE_2D, + 0, + self.outputTextureOptions.internalFormat, + bufferWidth, + bufferHeight, + 0, + self.outputTextureOptions.format, + self.outputTextureOptions.type, + CVPixelBufferGetBaseAddress(movieFrame)); CGSize currentSize = CGSizeMake(bufferWidth, bufferHeight); for (id currentTarget in targets) diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 6fda9496f..ad26e7b76 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -16,6 +16,16 @@ typedef NS_ENUM(NSInteger, UIImageOrientation) { }; #endif +typedef struct GPUTextureOptions { + GLenum minFilter; + GLenum magFilter; + GLenum wrapS; + GLenum wrapT; + GLenum internalFormat; + GLenum format; + GLenum type; +} GPUTextureOptions; + void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)); void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)); @@ -58,6 +68,7 @@ void reportAvailableMemoryForGPUImage(NSString *tag); @property(readwrite, nonatomic, unsafe_unretained) id targetToIgnoreForUpdates; @property(nonatomic, copy) void(^frameProcessingCompletionBlock)(GPUImageOutput*, CMTime); @property(nonatomic) BOOL enabled; +@property(readwrite, nonatomic) GPUTextureOptions outputTextureOptions; /// @name Managing targets - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 0ec129745..c76516b11 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -79,6 +79,7 @@ @implementation GPUImageOutput @synthesize targetToIgnoreForUpdates = _targetToIgnoreForUpdates; @synthesize frameProcessingCompletionBlock = _frameProcessingCompletionBlock; @synthesize enabled = _enabled; +@synthesize outputTextureOptions = _outputTextureOptions; #pragma mark - #pragma mark Initialization and teardown @@ -94,6 +95,15 @@ - (id)init; targetTextureIndices = [[NSMutableArray alloc] init]; _enabled = YES; allTargetsWantMonochromeData = YES; + + // set default texture options + _outputTextureOptions.minFilter = GL_LINEAR; + _outputTextureOptions.magFilter = GL_LINEAR; + _outputTextureOptions.wrapS = GL_CLAMP_TO_EDGE; + _outputTextureOptions.wrapT = GL_CLAMP_TO_EDGE; + _outputTextureOptions.internalFormat = GL_RGBA; + _outputTextureOptions.format = GL_BGRA; + _outputTextureOptions.type = GL_UNSIGNED_BYTE; return self; } @@ -225,11 +235,11 @@ - (void)initializeOutputTextureIfNeeded; glActiveTexture(GL_TEXTURE0); glGenTextures(1, &outputTexture); glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); glBindTexture(GL_TEXTURE_2D, 0); } }); diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index 4b9b0a2e8..15987971c 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -141,6 +141,10 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { + // we need a normal color texture for this filter + NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); + if (self.preventRendering) { return; diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m index 59e75feb2..105031a68 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.m +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -222,11 +222,11 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize filterTextureCache, renderTarget, NULL, // texture attributes GL_TEXTURE_2D, - GL_RGBA, // opengl format + self.outputTextureOptions.internalFormat, // opengl format (int)currentFBOSize.width, (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, + self.outputTextureOptions.format, // native iOS format + self.outputTextureOptions.type, 0, &renderTexture); if (err) @@ -238,8 +238,8 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize CFRelease(empty); glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); @@ -256,7 +256,14 @@ - (void)createFilterFBOofSize:(CGSize)currentFBOSize // } // else // { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, + 0, + self.outputTextureOptions.internalFormat, + (int)currentFBOSize.width, + (int)currentFBOSize.height, + 0, + self.outputTextureOptions.format, + self.outputTextureOptions.type, 0); // } glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index f2ca8837f..47d61bc1c 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -187,11 +187,11 @@ - (void)createSecondFilterFBOofSize:(CGSize)currentFBOSize; filterTextureCache, renderTarget, NULL, // texture attributes GL_TEXTURE_2D, - GL_RGBA, // opengl format + self.outputTextureOptions.internalFormat, // opengl format (int)currentFBOSize.width, (int)currentFBOSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, + self.outputTextureOptions.format, // native iOS format + self.outputTextureOptions.type, 0, &renderTexture); if (err) @@ -203,8 +203,8 @@ - (void)createSecondFilterFBOofSize:(CGSize)currentFBOSize; CFRelease(empty); glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); @@ -221,7 +221,15 @@ - (void)createSecondFilterFBOofSize:(CGSize)currentFBOSize; // } // else // { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, + 0, + self.outputTextureOptions.internalFormat, + (int)currentFBOSize.width, + (int)currentFBOSize.height, + 0, + self.outputTextureOptions.format, + self.outputTextureOptions.type, + 0); // } glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m index 2c554d62c..3c154a7e4 100644 --- a/framework/Source/GPUImageUIElement.m +++ b/framework/Source/GPUImageUIElement.m @@ -90,6 +90,7 @@ - (void)update; CGColorSpaceRelease(genericRGBColorspace); glBindTexture(GL_TEXTURE_2D, outputTexture); + // no need to use self.outputTextureOptions here, we always need these texture options glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)layerPixelSize.width, (int)layerPixelSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); free(imageData); diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index de7a36c9a..110f0bba2 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -143,6 +143,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } + // no need to use self.outputTextureOptions here since pictures need this texture formats and type glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); if (self.shouldSmoothlyScaleOutput) From ec99dcc86fb89cd280966c2e6f459db0c8dce34a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 24 Jun 2013 22:02:12 -0500 Subject: [PATCH 408/695] Experimenting with some fixes for iOS 7 issues. This does not solve them. --- .../GPUImageHoughTransformLineDetector.m | 19 ++++++---- .../Source/GPUImageSobelEdgeDetectionFilter.m | 34 +++++++++++------ .../GPUImageThresholdEdgeDetectionFilter.m | 37 +++++++++++++------ framework/Source/GPUImageTwoPassFilter.m | 11 ++++-- 4 files changed, 66 insertions(+), 35 deletions(-) diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m index dbd73d872..a0418f873 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -25,17 +25,20 @@ - (id)init; #endif // First pass: do edge detection and threshold that to just have white pixels for edges - if ([GPUImageContext deviceSupportsFramebufferReads]) - { +// if ([GPUImageContext deviceSupportsFramebufferReads]) +// if ([GPUImageContext deviceSupportsFramebufferReads]) +// { thresholdEdgeDetectionFilter = [[GPUImageThresholdEdgeDetectionFilter alloc] init]; // thresholdEdgeDetectionFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; - [(GPUImageThresholdEdgeDetectionFilter *)thresholdEdgeDetectionFilter setThreshold:0.8]; + [(GPUImageThresholdEdgeDetectionFilter *)thresholdEdgeDetectionFilter setThreshold:0.4]; +// [(GPUImageThresholdEdgeDetectionFilter *)thresholdEdgeDetectionFilter setEdgeStrength:0.25]; + [(GPUImageThresholdEdgeDetectionFilter *)thresholdEdgeDetectionFilter setEdgeStrength:1.0]; // thresholdEdgeDetectionFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; - } - else - { - thresholdEdgeDetectionFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; - } +// } +// else +// { +// thresholdEdgeDetectionFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; +// } [self addFilter:thresholdEdgeDetectionFilter]; #ifdef DEBUGLINEDETECTION diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 503318a19..6cfa77558 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -119,18 +119,28 @@ - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; - (void)setupFilterForSize:(CGSize)filterFrameSize; { - runSynchronouslyOnVideoProcessingQueue(^{ - if (!hasOverriddenImageSizeFactor) - { - _texelWidth = 1.0 / filterFrameSize.width; - _texelHeight = 1.0 / filterFrameSize.height; - - runSynchronouslyOnVideoProcessingQueue(^{ - [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; - [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; - }); - } - }); + if (!hasOverriddenImageSizeFactor) + { + _texelWidth = 1.0 / filterFrameSize.width; + _texelHeight = 1.0 / filterFrameSize.height; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + }); + } +} + +- (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; +{ + [super setUniformsForProgramAtIndex:programIndex]; + + if (programIndex == 1) + { + glUniform1f(texelWidthUniform, _texelWidth); + glUniform1f(texelHeightUniform, _texelHeight); + } } - (BOOL)wantsMonochromeInput; diff --git a/framework/Source/GPUImageThresholdEdgeDetectionFilter.m b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m index 8e7ad6543..553c600fa 100755 --- a/framework/Source/GPUImageThresholdEdgeDetectionFilter.m +++ b/framework/Source/GPUImageThresholdEdgeDetectionFilter.m @@ -25,25 +25,38 @@ @implementation GPUImageThresholdEdgeDetectionFilter uniform float edgeStrength; - const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); - void main() { - float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; - float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; - float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; - float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; +// float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; +// float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r; +// float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r; +// float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r; float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r; float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r; float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; - float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; - float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r; +// float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; +// float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; +// float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + leftIntensity + 2.0 * centerIntensity + rightIntensity; +// float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomIntensity + 2.0 * centerIntensity + topIntensity; + float h = (centerIntensity - topIntensity) + (bottomIntensity - centerIntensity); + float v = (centerIntensity - leftIntensity) + (rightIntensity - centerIntensity); +// float h = (centerIntensity - topIntensity); +// float j = (topIntensity - centerIntensity); +// h = max(h,j); +// j = abs(h); +// float v = (centerIntensity - leftIntensity); - float mag = length(vec2(h, v)) * edgeStrength; + float mag = length(vec2(h, v)) * edgeStrength; mag = step(threshold, mag); - gl_FragColor = vec4(vec3(mag), 1.0); +// float mag = abs(h); + +// gl_FragColor = vec4(h, h, h, 1.0); +// gl_FragColor = vec4(texture2D(inputImageTexture, textureCoordinate)); +// gl_FragColor = vec4(h, centerIntensity, j, 1.0); + gl_FragColor = vec4(mag, mag, mag, 1.0); } ); #else @@ -66,8 +79,6 @@ void main() uniform float edgeStrength; - const vec3 W = vec3(0.2125, 0.7154, 0.0721); - void main() { float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r; @@ -79,7 +90,9 @@ void main() float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r; float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r; float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; + h = max(0.0, h); float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; + v = max(0.0, v); float mag = length(vec2(h, v)) * edgeStrength; mag = step(threshold, mag); diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index f2ca8837f..be2906d1b 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -347,12 +347,14 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // Run the second stage of the two-pass filter [GPUImageContext setActiveShaderProgram:secondFilterProgram]; + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, 0); + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, 0); [self setSecondFilterFBO]; [self setUniformsForProgramAtIndex:1]; - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); + if (!currentlyReceivingMonochromeInput) { glActiveTexture(GL_TEXTURE3); @@ -370,6 +372,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Release the first FBO early From 8986763eaf1061d150356c3ccfaf85bba679ad89 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 24 Jun 2013 22:41:35 -0500 Subject: [PATCH 409/695] Repaired the broken assertions from a previous pull request. --- framework/Source/GPUImageAverageColor.m | 2 +- framework/Source/GPUImageFilter.m | 2 +- framework/Source/GPUImageHarrisCornerDetectionFilter.m | 2 +- framework/Source/GPUImageHistogramFilter.m | 2 +- framework/Source/GPUImageHoughTransformLineDetector.m | 2 +- framework/Source/GPUImageLuminosity.m | 2 +- .../Source/GPUImageParallelCoordinateLineTransformFilter.m | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index d475c1b60..4f3ac74aa 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -348,7 +348,7 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg - (void)extractAverageColorAtFrameTime:(CMTime)frameTime; { // we need a normal color texture for averaging the color values - NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture internal format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 653dc1e51..386d751f6 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -188,7 +188,7 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrie { // a CGImage can only be created from a 'normal' color texture - NSAssert(self.outputTextureOptions.format == GL_RGBA, @"For conversion to a CGImage the output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"For conversion to a CGImage the output texture format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"For conversion to a CGImage the type of the output texture of this filter must be GL_UNSIGNED_BYTE."); __block CGImageRef cgImageFromBytes; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 2a1744f39..b4ea4a31a 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -204,7 +204,7 @@ - (void)dealloc; - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; { // we need a normal color texture for this filter - NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); NSUInteger numberOfCorners = 0; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 59d725aad..b060be0e2 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -264,7 +264,7 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { // we need a normal color texture for this filter - NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); if (self.preventRendering) diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m index 5c7b72951..4d94d8f1a 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -115,7 +115,7 @@ - (void)dealloc; - (void)extractLineParametersFromImageAtFrameTime:(CMTime)frameTime; { // we need a normal color texture for this filter - NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); NSUInteger numberOfLines = 0; diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index ecc4c3dc2..4b6caa0e7 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -290,7 +290,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates - (void)extractLuminosityAtFrameTime:(CMTime)frameTime; { // we need a normal color texture for this filter - NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index 15987971c..a50df8cab 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -142,7 +142,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { // we need a normal color texture for this filter - NSAssert(self.outputTextureOptions.format == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); if (self.preventRendering) From 586170139bc9f2e88414f6bea4ea3bc113e5a22e Mon Sep 17 00:00:00 2001 From: Cameron N Perry Date: Mon, 24 Jun 2013 22:17:41 -0700 Subject: [PATCH 410/695] Swapped out silent/graceful failing for an assertion when somebody tries to pass an empty UIImage (not nil object, but nil image data) --- framework/Source/iOS/GPUImagePicture.m | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 95cd88ab3..8b069f2ba 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -68,15 +68,8 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot CGFloat widthOfImage = CGImageGetWidth(newImageSource); CGFloat heightOfImage = CGImageGetHeight(newImageSource); - // If passed an empty image reference, create a small 2x2 image so we don't trigger a fatal error in the future on CGContextDrawImage below - if( !(widthOfImage >= 1) || !(heightOfImage >= 1) ){ - widthOfImage = heightOfImage = 2.0; - UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthOfImage, heightOfImage), NO, 0.0); - UIImage *blank = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - newImageSource = blank.CGImage; - blank = nil; - } + // If passed an empty image reference, CGContextDrawImage will fail in future versions of the SDK. + NSAssert( !(widthOfImage >= 1) || !(heightOfImage >= 1), @"Passed image must not be empty - it should be at least 1px tall and wide"); pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); CGSize pixelSizeToUseForTexture = pixelSizeOfImage; From 82276bc57af60587a12dbabcc6f003eb9c935850 Mon Sep 17 00:00:00 2001 From: Cameron N Perry Date: Mon, 24 Jun 2013 22:17:41 -0700 Subject: [PATCH 411/695] Swapped out silent/graceful failing for an assertion when somebody tries to pass an empty UIImage (not nil object, but nil image data) --- framework/Source/iOS/GPUImagePicture.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 8b069f2ba..8d6016667 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -69,7 +69,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot CGFloat heightOfImage = CGImageGetHeight(newImageSource); // If passed an empty image reference, CGContextDrawImage will fail in future versions of the SDK. - NSAssert( !(widthOfImage >= 1) || !(heightOfImage >= 1), @"Passed image must not be empty - it should be at least 1px tall and wide"); + NSAssert( widthOfImage > 0 && heightOfImage > 0, @"Passed image must not be empty - it should be at least 1px tall and wide"); pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); CGSize pixelSizeToUseForTexture = pixelSizeOfImage; From 8398d078458bc04daa2eab3dab8b096ac2e0430b Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 7 Jul 2013 09:14:55 +1200 Subject: [PATCH 412/695] Tone curve filter: bug fix, always add the last point as it is never added. Previously the last point would not be added correctly if the last point's x < 1.0 as there would be fewer than 255 entries in the output array. So the output points would approach but not actually get to that final point. If the final point was y=1.0 it wouldn't matter as we go on to extend the returned array out to x = 255 with y = 1.0s. But if it wasn't then we'd miss that last value. Also clarified the question in comments about whether the length of the points array is equal to the length of the second derivative. It is. Also made the n variable a constant in the second derivative method to ensure it. --- framework/Source/GPUImageToneCurveFilter.m | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 5fedcb543..126d0ed7f 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -303,7 +303,7 @@ - (NSArray *)getPreparedSplineCurve:(NSArray *)points // Insert points similarly at the end, if necessary. #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CGPoint lastSplinePoint = [[splinePoints objectAtIndex:([splinePoints count] - 1)] CGPointValue]; + CGPoint lastSplinePoint = [[splinePoints lastObject] CGPointValue]; if (lastSplinePoint.x < 255) { for (int i = lastSplinePoint.x + 1; i <= 255; i++) { @@ -312,7 +312,7 @@ - (NSArray *)getPreparedSplineCurve:(NSArray *)points } } #else - NSPoint lastSplinePoint = [[splinePoints objectAtIndex:([splinePoints count] - 1)] pointValue]; + NSPoint lastSplinePoint = [[splinePoints lastObject] pointValue]; if (lastSplinePoint.x < 255) { for (int i = lastSplinePoint.x + 1; i <= 255; i++) { @@ -354,8 +354,7 @@ - (NSMutableArray *)splineCurve:(NSArray *)points { NSMutableArray *sdA = [self secondDerivative:points]; - // Is [points count] equal to [sdA count]? -// int n = [points count]; + // [points count] is equal to [sdA count] NSInteger n = [sdA count]; if (n < 1) { @@ -408,16 +407,14 @@ - (NSMutableArray *)splineCurve:(NSArray *)points } } - // If the last point is (255, 255) it doesn't get added. - if ([output count] == 255) { - [output addObject:[points lastObject]]; - } + // The above always misses the last point because the last point is the last next, so we approach but don't equal it. + [output addObject:[points lastObject]]; return output; } - (NSMutableArray *)secondDerivative:(NSArray *)points { - NSInteger n = [points count]; + const NSInteger n = [points count]; if ((n <= 0) || (n == 1)) { return nil; From 07ba35eae8d5b22d3cef24f7ac62721d7311436f Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 7 Jul 2013 09:17:01 +1200 Subject: [PATCH 413/695] Tone curve filter: correct application of RGB in conjunction with R, G, B channels. The RGB adjustment must be made after the R, G and B adjustments. --- framework/Source/GPUImageToneCurveFilter.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 126d0ed7f..391cd90a0 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -510,9 +510,12 @@ - (void)updateToneCurveTexture; for (unsigned int currentCurveIndex = 0; currentCurveIndex < 256; currentCurveIndex++) { // BGRA for upload to texture - toneCurveByteArray[currentCurveIndex * 4] = fmin(fmax(currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); - toneCurveByteArray[currentCurveIndex * 4 + 1] = fmin(fmax(currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); - toneCurveByteArray[currentCurveIndex * 4 + 2] = fmin(fmax(currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue] + [[_rgbCompositeCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + GLubyte b = fmin(fmax(currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + toneCurveByteArray[currentCurveIndex * 4] = fmin(fmax(b + [[_rgbCompositeCurve objectAtIndex:b] floatValue], 0), 255); + GLubyte g = fmin(fmax(currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + toneCurveByteArray[currentCurveIndex * 4 + 1] = fmin(fmax(g + [[_rgbCompositeCurve objectAtIndex:g] floatValue], 0), 255); + GLubyte r = fmin(fmax(currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + toneCurveByteArray[currentCurveIndex * 4 + 2] = fmin(fmax(r + [[_rgbCompositeCurve objectAtIndex:r] floatValue], 0), 255); toneCurveByteArray[currentCurveIndex * 4 + 3] = 255; } From c7f89fb9836ff6812471cfaff044872c15fe5d05 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 7 Jul 2013 09:52:10 +1200 Subject: [PATCH 414/695] Add HSB filter Uses matrix multiplications to perform hue saturation brightness manipulation. --- framework/GPUImage.xcodeproj/project.pbxproj | 8 + framework/Source/GPUImage.h | 1 + framework/Source/GPUImageHSBFilter.h | 27 ++ framework/Source/GPUImageHSBFilter.m | 481 +++++++++++++++++++ 4 files changed, 517 insertions(+) create mode 100644 framework/Source/GPUImageHSBFilter.h create mode 100644 framework/Source/GPUImageHSBFilter.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index f3bf11f7c..2c3895d69 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -53,6 +53,8 @@ B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */; }; B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (); }; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; + B81F2D751788C95500118374 /* GPUImageHSBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81F2D731788C95500118374 /* GPUImageHSBFilter.h */; }; + B81F2D761788C95500118374 /* GPUImageHSBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81F2D741788C95500118374 /* GPUImageHSBFilter.m */; }; B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (); }; }; B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */; }; BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (); }; }; @@ -401,6 +403,8 @@ B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminosityBlendFilter.m; path = Source/GPUImageLuminosityBlendFilter.m; sourceTree = SOURCE_ROOT; }; B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorMatrixFilter.h; path = Source/GPUImageColorMatrixFilter.h; sourceTree = SOURCE_ROOT; }; B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorMatrixFilter.m; path = Source/GPUImageColorMatrixFilter.m; sourceTree = SOURCE_ROOT; }; + B81F2D731788C95500118374 /* GPUImageHSBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHSBFilter.h; path = Source/GPUImageHSBFilter.h; sourceTree = SOURCE_ROOT; }; + B81F2D741788C95500118374 /* GPUImageHSBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHSBFilter.m; path = Source/GPUImageHSBFilter.m; sourceTree = SOURCE_ROOT; }; B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLevelsFilter.h; path = Source/GPUImageLevelsFilter.h; sourceTree = SOURCE_ROOT; }; B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLevelsFilter.m; path = Source/GPUImageLevelsFilter.m; sourceTree = SOURCE_ROOT; }; BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGlassSphereFilter.h; path = Source/GPUImageGlassSphereFilter.h; sourceTree = SOURCE_ROOT; }; @@ -749,6 +753,8 @@ B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */, BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */, BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */, + B81F2D731788C95500118374 /* GPUImageHSBFilter.h */, + B81F2D741788C95500118374 /* GPUImageHSBFilter.m */, C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */, C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */, BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */, @@ -1210,6 +1216,7 @@ BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */, BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */, BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */, + B81F2D751788C95500118374 /* GPUImageHSBFilter.h in Headers */, BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */, BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */, BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */, @@ -1565,6 +1572,7 @@ BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */, BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */, C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */, + B81F2D761788C95500118374 /* GPUImageHSBFilter.m in Sources */, BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */, 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */, 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */, diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 3d170df0b..87f1f0268 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -117,6 +117,7 @@ #import "GPUImageOpacityFilter.h" #import "GPUImageHighlightShadowFilter.h" #import "GPUImageFalseColorFilter.h" +#import "GPUImageHSBFilter.h" #import "GPUImageHueFilter.h" #import "GPUImageGlassSphereFilter.h" #import "GPUImageLookupFilter.h" diff --git a/framework/Source/GPUImageHSBFilter.h b/framework/Source/GPUImageHSBFilter.h new file mode 100644 index 000000000..65a9e1deb --- /dev/null +++ b/framework/Source/GPUImageHSBFilter.h @@ -0,0 +1,27 @@ +#import "GPUImageColorMatrixFilter.h" + +@interface GPUImageHSBFilter : GPUImageColorMatrixFilter + +/** Reset the filter to have no transformations. + */ +- (void)reset; + +/** Add a hue rotation to the filter. + The hue rotation is in the range [-360, 360] with 0 being no-change. + Note that this adjustment is additive, so use the reset method if you need to. + */ +- (void)rotateHue:(float)h; + +/** Add a saturation adjustment to the filter. + The saturation adjustment is in the range [0.0, 2.0] with 1.0 being no-change. + Note that this adjustment is additive, so use the reset method if you need to. + */ +- (void)adjustSaturation:(float)s; + +/** Add a brightness adjustment to the filter. + The brightness adjustment is in the range [0.0, 2.0] with 1.0 being no-change. + Note that this adjustment is additive, so use the reset method if you need to. + */ +- (void)adjustBrightness:(float)b; + +@end diff --git a/framework/Source/GPUImageHSBFilter.m b/framework/Source/GPUImageHSBFilter.m new file mode 100644 index 000000000..6af8048a5 --- /dev/null +++ b/framework/Source/GPUImageHSBFilter.m @@ -0,0 +1,481 @@ +#import "GPUImageHSBFilter.h" + +@implementation GPUImageHSBFilter { + float matrix[4][4]; +} + +- (id)init +{ + self = [super init]; + if (self) { + [self reset]; + } + return self; +} + +- (void)reset { + identmat(matrix); + [self _updateColorMatrix]; +} + +- (void)rotateHue:(float)h { + huerotatemat(matrix, h); + [self _updateColorMatrix]; +} + +- (void)adjustSaturation:(float)s { + saturatemat(matrix, s); + [self _updateColorMatrix]; +} + +- (void)adjustBrightness:(float)b { + cscalemat(matrix, b, b, b); + [self _updateColorMatrix]; +} + +- (void)_updateColorMatrix { + GPUMatrix4x4 gpuMatrix; + gpuMatrix.one.one = matrix[0][0]; + gpuMatrix.one.two = matrix[1][0]; + gpuMatrix.one.three = matrix[2][0]; + gpuMatrix.one.four = matrix[3][0]; + gpuMatrix.two.one = matrix[0][1]; + gpuMatrix.two.two = matrix[1][1]; + gpuMatrix.two.three = matrix[2][1]; + gpuMatrix.two.four = matrix[3][1]; + gpuMatrix.three.one = matrix[0][2]; + gpuMatrix.three.two = matrix[1][2]; + gpuMatrix.three.three = matrix[2][2]; + gpuMatrix.three.four = matrix[3][2]; + gpuMatrix.four.one = matrix[0][3]; + gpuMatrix.four.two = matrix[1][3]; + gpuMatrix.four.three = matrix[2][3]; + gpuMatrix.four.four = matrix[3][3]; + self.colorMatrix = gpuMatrix; +} + +#pragma mark - Matrix algorithms + +/* Matrix algorithms adapted from http://www.graficaobscura.com/matrix/index.html + + Note about luminance vector values below from that page: + Where rwgt is 0.3086, gwgt is 0.6094, and bwgt is 0.0820. This is the luminance vector. Notice here that we do not use the standard NTSC weights of 0.299, 0.587, and 0.114. The NTSC weights are only applicable to RGB colors in a gamma 2.2 color space. For linear RGB colors the values above are better. + */ +//#define RLUM (0.3086f) +//#define GLUM (0.6094f) +//#define BLUM (0.0820f) + +/* This is the vector value from the PDF specification, and may be closer to what Photoshop uses */ +#define RLUM (0.3f) +#define GLUM (0.59f) +#define BLUM (0.11f) + +/* + * matrixmult - + * multiply two matricies + */ +static void matrixmult(a,b,c) +float a[4][4], b[4][4], c[4][4]; +{ + int x, y; + float temp[4][4]; + + for(y=0; y<4 ; y++) + for(x=0 ; x<4 ; x++) { + temp[y][x] = b[y][0] * a[0][x] + + b[y][1] * a[1][x] + + b[y][2] * a[2][x] + + b[y][3] * a[3][x]; + } + for(y=0; y<4; y++) + for(x=0; x<4; x++) + c[y][x] = temp[y][x]; +} + +/* + * identmat - + * make an identity matrix + */ +static void identmat(matrix) +float matrix[4][4]; +{ + memset(matrix, 0, sizeof(float[4][4])); + matrix[0][0] = 1.0f; + matrix[1][1] = 1.0f; + matrix[2][2] = 1.0f; + matrix[3][3] = 1.0f; +} + +/* + * xformpnt - + * transform a 3D point using a matrix + */ +static void xformpnt(matrix,x,y,z,tx,ty,tz) +float matrix[4][4]; +float x,y,z; +float *tx,*ty,*tz; +{ + *tx = x*matrix[0][0] + y*matrix[1][0] + z*matrix[2][0] + matrix[3][0]; + *ty = x*matrix[0][1] + y*matrix[1][1] + z*matrix[2][1] + matrix[3][1]; + *tz = x*matrix[0][2] + y*matrix[1][2] + z*matrix[2][2] + matrix[3][2]; +} + +/* + * cscalemat - + * make a color scale marix + */ +static void cscalemat(mat,rscale,gscale,bscale) +float mat[4][4]; +float rscale, gscale, bscale; +{ + float mmat[4][4]; + + mmat[0][0] = rscale; + mmat[0][1] = 0.0; + mmat[0][2] = 0.0; + mmat[0][3] = 0.0; + + mmat[1][0] = 0.0; + mmat[1][1] = gscale; + mmat[1][2] = 0.0; + mmat[1][3] = 0.0; + + + mmat[2][0] = 0.0; + mmat[2][1] = 0.0; + mmat[2][2] = bscale; + mmat[2][3] = 0.0; + + mmat[3][0] = 0.0; + mmat[3][1] = 0.0; + mmat[3][2] = 0.0; + mmat[3][3] = 1.0; + matrixmult(mmat,mat,mat); +} + +/* + * lummat - + * make a luminance marix + */ +static void lummat(mat) +float mat[4][4]; +{ + float mmat[4][4]; + float rwgt, gwgt, bwgt; + + rwgt = RLUM; + gwgt = GLUM; + bwgt = BLUM; + mmat[0][0] = rwgt; + mmat[0][1] = rwgt; + mmat[0][2] = rwgt; + mmat[0][3] = 0.0; + + mmat[1][0] = gwgt; + mmat[1][1] = gwgt; + mmat[1][2] = gwgt; + mmat[1][3] = 0.0; + + mmat[2][0] = bwgt; + mmat[2][1] = bwgt; + mmat[2][2] = bwgt; + mmat[2][3] = 0.0; + + mmat[3][0] = 0.0; + mmat[3][1] = 0.0; + mmat[3][2] = 0.0; + mmat[3][3] = 1.0; + matrixmult(mmat,mat,mat); +} + +/* + * saturatemat - + * make a saturation marix + */ +static void saturatemat(mat,sat) +float mat[4][4]; +float sat; +{ + float mmat[4][4]; + float a, b, c, d, e, f, g, h, i; + float rwgt, gwgt, bwgt; + + rwgt = RLUM; + gwgt = GLUM; + bwgt = BLUM; + + a = (1.0-sat)*rwgt + sat; + b = (1.0-sat)*rwgt; + c = (1.0-sat)*rwgt; + d = (1.0-sat)*gwgt; + e = (1.0-sat)*gwgt + sat; + f = (1.0-sat)*gwgt; + g = (1.0-sat)*bwgt; + h = (1.0-sat)*bwgt; + i = (1.0-sat)*bwgt + sat; + mmat[0][0] = a; + mmat[0][1] = b; + mmat[0][2] = c; + mmat[0][3] = 0.0; + + mmat[1][0] = d; + mmat[1][1] = e; + mmat[1][2] = f; + mmat[1][3] = 0.0; + + mmat[2][0] = g; + mmat[2][1] = h; + mmat[2][2] = i; + mmat[2][3] = 0.0; + + mmat[3][0] = 0.0; + mmat[3][1] = 0.0; + mmat[3][2] = 0.0; + mmat[3][3] = 1.0; + matrixmult(mmat,mat,mat); +} + +/* + * offsetmat - + * offset r, g, and b + */ +static void offsetmat(mat,roffset,goffset,boffset) +float mat[4][4]; +float roffset, goffset, boffset; +{ + float mmat[4][4]; + + mmat[0][0] = 1.0; + mmat[0][1] = 0.0; + mmat[0][2] = 0.0; + mmat[0][3] = 0.0; + + mmat[1][0] = 0.0; + mmat[1][1] = 1.0; + mmat[1][2] = 0.0; + mmat[1][3] = 0.0; + + mmat[2][0] = 0.0; + mmat[2][1] = 0.0; + mmat[2][2] = 1.0; + mmat[2][3] = 0.0; + + mmat[3][0] = roffset; + mmat[3][1] = goffset; + mmat[3][2] = boffset; + mmat[3][3] = 1.0; + matrixmult(mmat,mat,mat); +} + +/* + * xrotate - + * rotate about the x (red) axis + */ +static void xrotatemat(mat,rs,rc) +float mat[4][4]; +float rs, rc; +{ + float mmat[4][4]; + + mmat[0][0] = 1.0; + mmat[0][1] = 0.0; + mmat[0][2] = 0.0; + mmat[0][3] = 0.0; + + mmat[1][0] = 0.0; + mmat[1][1] = rc; + mmat[1][2] = rs; + mmat[1][3] = 0.0; + + mmat[2][0] = 0.0; + mmat[2][1] = -rs; + mmat[2][2] = rc; + mmat[2][3] = 0.0; + + mmat[3][0] = 0.0; + mmat[3][1] = 0.0; + mmat[3][2] = 0.0; + mmat[3][3] = 1.0; + matrixmult(mmat,mat,mat); +} + +/* + * yrotate - + * rotate about the y (green) axis + */ +static void yrotatemat(mat,rs,rc) +float mat[4][4]; +float rs, rc; +{ + float mmat[4][4]; + + mmat[0][0] = rc; + mmat[0][1] = 0.0; + mmat[0][2] = -rs; + mmat[0][3] = 0.0; + + mmat[1][0] = 0.0; + mmat[1][1] = 1.0; + mmat[1][2] = 0.0; + mmat[1][3] = 0.0; + + mmat[2][0] = rs; + mmat[2][1] = 0.0; + mmat[2][2] = rc; + mmat[2][3] = 0.0; + + mmat[3][0] = 0.0; + mmat[3][1] = 0.0; + mmat[3][2] = 0.0; + mmat[3][3] = 1.0; + matrixmult(mmat,mat,mat); +} + +/* + * zrotate - + * rotate about the z (blue) axis + */ +static void zrotatemat(mat,rs,rc) +float mat[4][4]; +float rs, rc; +{ + float mmat[4][4]; + + mmat[0][0] = rc; + mmat[0][1] = rs; + mmat[0][2] = 0.0; + mmat[0][3] = 0.0; + + mmat[1][0] = -rs; + mmat[1][1] = rc; + mmat[1][2] = 0.0; + mmat[1][3] = 0.0; + + mmat[2][0] = 0.0; + mmat[2][1] = 0.0; + mmat[2][2] = 1.0; + mmat[2][3] = 0.0; + + mmat[3][0] = 0.0; + mmat[3][1] = 0.0; + mmat[3][2] = 0.0; + mmat[3][3] = 1.0; + matrixmult(mmat,mat,mat); +} + +/* + * zshear - + * shear z using x and y. + */ +static void zshearmat(mat,dx,dy) +float mat[4][4]; +float dx, dy; +{ + float mmat[4][4]; + + mmat[0][0] = 1.0; + mmat[0][1] = 0.0; + mmat[0][2] = dx; + mmat[0][3] = 0.0; + + mmat[1][0] = 0.0; + mmat[1][1] = 1.0; + mmat[1][2] = dy; + mmat[1][3] = 0.0; + + mmat[2][0] = 0.0; + mmat[2][1] = 0.0; + mmat[2][2] = 1.0; + mmat[2][3] = 0.0; + + mmat[3][0] = 0.0; + mmat[3][1] = 0.0; + mmat[3][2] = 0.0; + mmat[3][3] = 1.0; + matrixmult(mmat,mat,mat); +} + +/* + * simplehuerotatemat - + * simple hue rotation. This changes luminance + */ +static void simplehuerotatemat(mat,rot) +float mat[4][4]; +float rot; +{ + float mag; + float xrs, xrc; + float yrs, yrc; + float zrs, zrc; + + /* rotate the grey vector into positive Z */ + mag = sqrt(2.0); + xrs = 1.0/mag; + xrc = 1.0/mag; + xrotatemat(mat,xrs,xrc); + + mag = sqrt(3.0); + yrs = -1.0/mag; + yrc = sqrt(2.0)/mag; + yrotatemat(mat,yrs,yrc); + + /* rotate the hue */ + zrs = sin(rot*M_PI/180.0); + zrc = cos(rot*M_PI/180.0); + zrotatemat(mat,zrs,zrc); + + /* rotate the grey vector back into place */ + yrotatemat(mat,-yrs,yrc); + xrotatemat(mat,-xrs,xrc); +} + +/* + * huerotatemat - + * rotate the hue, while maintaining luminance. + */ +static void huerotatemat(mat,rot) +float mat[4][4]; +float rot; +{ + float mmat[4][4]; + float mag; + float lx, ly, lz; + float xrs, xrc; + float yrs, yrc; + float zrs, zrc; + float zsx, zsy; + + identmat(mmat); + + /* rotate the grey vector into positive Z */ + mag = sqrt(2.0); + xrs = 1.0/mag; + xrc = 1.0/mag; + xrotatemat(mmat,xrs,xrc); + mag = sqrt(3.0); + yrs = -1.0/mag; + yrc = sqrt(2.0)/mag; + yrotatemat(mmat,yrs,yrc); + + /* shear the space to make the luminance plane horizontal */ + xformpnt(mmat,RLUM,GLUM,BLUM,&lx,&ly,&lz); + zsx = lx/lz; + zsy = ly/lz; + zshearmat(mmat,zsx,zsy); + + /* rotate the hue */ + zrs = sin(rot*M_PI/180.0); + zrc = cos(rot*M_PI/180.0); + zrotatemat(mmat,zrs,zrc); + + /* unshear the space to put the luminance plane back */ + zshearmat(mmat,-zsx,-zsy); + + /* rotate the grey vector back into place */ + yrotatemat(mmat,-yrs,yrc); + xrotatemat(mmat,-xrs,xrc); + + matrixmult(mmat,mat,mat); +} + +@end From 60f44bdcc123d5774f61414c2925aa91cd351b25 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 7 Jul 2013 12:07:10 +1200 Subject: [PATCH 415/695] GPUImageMovieWriter: finishRecordingWithCompletionHandler must happen synchronously on video processing queue too finishRecording runs synchronously, but if you call the method with a completion handler you don't. This results in a race condition to finish recording. --- framework/Source/iOS/GPUImageMovieWriter.m | 50 +++++++++++----------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 3b16b7b76..7ee4d66c0 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -271,42 +271,42 @@ - (void)cancelRecording; - (void)finishRecording; { - runSynchronouslyOnVideoProcessingQueue(^{ - [self finishRecordingWithCompletionHandler:nil]; - }); + [self finishRecordingWithCompletionHandler:nil]; } - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; { - if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled - || assetWriter.status == AVAssetWriterStatusUnknown) - { - return; - } + runSynchronouslyOnVideoProcessingQueue(^{ + if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled + || assetWriter.status == AVAssetWriterStatusUnknown) + { + return; + } - isRecording = NO; - runOnMainQueueWithoutDeadlocking(^{ - [assetWriterVideoInput markAsFinished]; - [assetWriterAudioInput markAsFinished]; + isRecording = NO; + runOnMainQueueWithoutDeadlocking(^{ + [assetWriterVideoInput markAsFinished]; + [assetWriterAudioInput markAsFinished]; #if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) - // Not iOS 6 SDK - [assetWriter finishWriting]; - if (handler) handler(); + // Not iOS 6 SDK + [assetWriter finishWriting]; + if (handler) handler(); #else - // iOS 6 SDK - if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { - // Running iOS 6 - [assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; - } - else { - // Not running iOS 6 + // iOS 6 SDK + if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { + // Running iOS 6 + [assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; + } + else { + // Not running iOS 6 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - [assetWriter finishWriting]; + [assetWriter finishWriting]; #pragma clang diagnostic pop - if (handler) handler(); - } + if (handler) handler(); + } #endif + }); }); } From 9734ee6090d18dddb3b552df3ca425295632002f Mon Sep 17 00:00:00 2001 From: Carsten Haubold Date: Mon, 8 Jul 2013 15:05:21 +0200 Subject: [PATCH 416/695] Add processImage variant with completion handler to get a notification if and when processing finishes. --- framework/Source/iOS/GPUImagePicture.h | 9 +++++++++ framework/Source/iOS/GPUImagePicture.m | 13 ++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/framework/Source/iOS/GPUImagePicture.h b/framework/Source/iOS/GPUImagePicture.h index d6d1ac061..627464284 100755 --- a/framework/Source/iOS/GPUImagePicture.h +++ b/framework/Source/iOS/GPUImagePicture.h @@ -21,4 +21,13 @@ - (void)processImage; - (CGSize)outputImageSize; +/** + * Process image with all targets and filters asynchronously + * The completion handler is called after processing finished in the + * GPU's dispatch queue - and only if this method did not return NO. + * + * @returns NO if resource is blocked and processing is discarded, YES otherwise + */ +- (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; + @end diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 95cd88ab3..f25b35d4f 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -197,6 +197,11 @@ - (void)removeAllTargets; } - (void)processImage; +{ + [self processImageWithCompletionHandler:nil]; +} + +- (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; { hasProcessedImage = YES; @@ -204,7 +209,7 @@ - (void)processImage; if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) { - return; + return NO; } runAsynchronouslyOnVideoProcessingQueue(^{ @@ -226,7 +231,13 @@ - (void)processImage; } dispatch_semaphore_signal(imageUpdateSemaphore); + + if (completion != nil) { + completion(); + } }); + + return YES; } - (CGSize)outputImageSize; From c56e965171b32642c34cdeb305a6a045c3b058b4 Mon Sep 17 00:00:00 2001 From: howang Date: Tue, 9 Jul 2013 21:23:51 +0800 Subject: [PATCH 417/695] Also build GPUImage as static framework in build.sh --- build.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build.sh b/build.sh index 3963a33c5..83f2a4c86 100755 --- a/build.sh +++ b/build.sh @@ -20,3 +20,12 @@ xcrun -sdk iphoneos lipo -info Release-iphone/lib/libGPUImage.a mkdir -p Release-iphone/include cp ../framework/Source/*.h Release-iphone/include cp ../framework/Source/iOS/*.h Release-iphone/include + +# Build static framework +mkdir -p GPUImage.framework/Versions/A +cp Release-iphone/lib/libGPUImage.a GPUImage.framework/Versions/A/GPUImage +mkdir -p GPUImage.framework/Versions/A/Headers +cp Release-iphone/include/*.h GPUImage.framework/Versions/A/Headers +ln -sfh A GPUImage.framework/Versions/Current +ln -sfh Versions/Current/GPUImage GPUImage.framework/GPUImage +ln -sfh Versions/Current/Headers GPUImage.framework/Headers From 42a683802cb4bb71f411e2a8d66c12747ca7efc6 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 18 Jul 2013 21:27:19 -0500 Subject: [PATCH 418/695] Fixed an issue where audio sample buffers were being invalidated earlier than they should be on movie writing, leading to errors and crashes. --- .../FilterShowcase/ShowcaseAppDelegate.m | 1 + .../SimpleVideoFileFilterViewController.h | 2 +- .../SimpleVideoFileFilterViewController.m | 25 +----- .../SimpleVideoFileFilterViewController.xib | 80 ++++++------------- framework/Source/GPUImageMovie.m | 32 ++++---- framework/Source/iOS/GPUImageMovieWriter.h | 1 + framework/Source/iOS/GPUImageMovieWriter.m | 11 ++- 7 files changed, 58 insertions(+), 94 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m index 9c43031ee..f154970e4 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m @@ -19,6 +19,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [filterNavigationController pushViewController:filterListController animated:NO]; [self.window makeKeyAndVisible]; + return YES; } diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h index 95175f880..c95318751 100755 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h @@ -10,4 +10,4 @@ - (IBAction)updatePixelWidth:(id)sender; -@end +@end \ No newline at end of file diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index ff2bbaf42..ad4ebef03 100755 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -25,19 +25,11 @@ - (void)viewDidLoad movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; movieFile.runBenchmark = YES; - movieFile.playAtActualSpeed = YES; -// filter = [[GPUImagePixellateFilter alloc] init]; + movieFile.playAtActualSpeed = NO; + filter = [[GPUImagePixellateFilter alloc] init]; // filter = [[GPUImageUnsharpMaskFilter alloc] init]; - filter = [[GPUImageDissolveBlendFilter alloc] init]; - [(GPUImageDissolveBlendFilter *)filter setMix:0.5]; - - UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; - GPUImagePicture *overlayPicture = [[GPUImagePicture alloc] initWithImage:inputImage]; - [movieFile addTarget:filter]; - [overlayPicture addTarget:filter]; - [overlayPicture processImage]; // Only rotate the video for display, leave orientation the same for recording GPUImageView *filterView = (GPUImageView *)self.view; @@ -63,16 +55,6 @@ - (void)viewDidLoad [filter removeTarget:movieWriter]; [movieWriter finishRecording]; }]; - - /* - double delayInSeconds = 5.0; - dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); - dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ - [filter removeTarget:movieWriter]; - [movieWriter finishRecording]; - NSLog(@"Done recording"); - }); - */ } - (void)viewDidUnload @@ -88,8 +70,7 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updatePixelWidth:(id)sender { // [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; - [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; -// pixellateFilter.fractionalWidthOfAPixel = [(UISlider *)sender value]; + [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; } @end diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib index eb8091fdc..6dda94cd9 100755 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib @@ -1,19 +1,19 @@ - 1296 - 11D50 - 2182 - 1138.32 - 568.00 + 1024 + 13A510d + 4457.9 + 1242.11 + 683.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1179 + 3682.9 IBProxyObject - IBUIView IBUISlider + IBUIView com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -32,7 +32,7 @@ IBCocoaTouchFramework - + 274 @@ -40,20 +40,16 @@ 266 {{18, 418}, {284, 23}} - - _NS:623 NO IBCocoaTouchFramework 0 0 - 1 - 5 + 0.10000000149011612 + 0.20000000298023224 {{0, 20}, {320, 460}} - - 3 @@ -67,6 +63,7 @@ + NO @@ -74,7 +71,7 @@ - 3 + 3 @@ -83,19 +80,19 @@ 13 - 5 + 5 - 0 + 0 - 1 + 1 @@ -103,18 +100,18 @@ - -1 + -1 File's Owner - -2 + -2 - 4 + 4 @@ -133,47 +130,20 @@ - 5 - - - - - GPUImageView - UIView - - IBProjectSource - ./Classes/GPUImageView.h - - - - SimpleVideoFileFilterViewController - UIViewController - - updatePixelWidth: - id - - - updatePixelWidth: - - updatePixelWidth: - id - - - - IBProjectSource - ./Classes/SimpleVideoFileFilterViewController.h - - - + 0 IBCocoaTouchFramework com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + YES 3 - 1179 + 3682.9 diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 19a5246cd..79576fd0f 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -87,6 +87,7 @@ - (void)dealloc CFRelease(coreVideoTextureCache); } } + #pragma mark - #pragma mark Movie processing @@ -115,15 +116,17 @@ - (void)startProcessing GPUImageMovie __block *blockSelf = self; [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ - NSError *error = nil; - AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; - if (!tracksStatus == AVKeyValueStatusLoaded) - { - return; - } - blockSelf.asset = inputAsset; - [blockSelf processAsset]; - blockSelf = nil; + runSynchronouslyOnVideoProcessingQueue(^{ + NSError *error = nil; + AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; + if (!tracksStatus == AVKeyValueStatusLoaded) + { + return; + } + blockSelf.asset = inputAsset; + [blockSelf processAsset]; + blockSelf = nil; + }); }]; } @@ -147,6 +150,8 @@ - (void)processAsset { audioEncodingIsFinished = NO; + [self.audioEncodingTarget setShouldInvalidateAudioSampleWhenDone:YES]; + // This might need to be extended to handle movies with more than one audio track AVAssetTrack* audioTrack = [audioTracks objectAtIndex:0]; readerAudioTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]; @@ -266,12 +271,9 @@ - (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTra if (audioSampleBufferRef) { - runSynchronouslyOnVideoProcessingQueue(^{ - [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; - - CMSampleBufferInvalidate(audioSampleBufferRef); - CFRelease(audioSampleBufferRef); - }); + [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; + + CFRelease(audioSampleBufferRef); } else { diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index b46e908ce..914acb0b6 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -37,6 +37,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; @property(readwrite, nonatomic) BOOL hasAudioTrack; @property(readwrite, nonatomic) BOOL shouldPassthroughAudio; +@property(readwrite, nonatomic) BOOL shouldInvalidateAudioSampleWhenDone; @property(nonatomic, copy) void(^completionBlock)(void); @property(nonatomic, copy) void(^failureBlock)(NSError*); @property(nonatomic, assign) id delegate; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 3b16b7b76..f9176007b 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -56,6 +56,7 @@ @implementation GPUImageMovieWriter @synthesize videoInputReadyCallback; @synthesize audioInputReadyCallback; @synthesize enabled; +@synthesize shouldInvalidateAudioSampleWhenDone = _shouldInvalidateAudioSampleWhenDone; @synthesize delegate = _delegate; @@ -74,6 +75,8 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr return nil; } + _shouldInvalidateAudioSampleWhenDone = NO; + self.enabled = YES; movieWritingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.movieWritingQueue", NULL); @@ -319,6 +322,8 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; if (_hasAudioTrack) { + CFRetain(audioBuffer); + CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); if (CMTIME_IS_INVALID(startTime)) @@ -340,9 +345,13 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; } // NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); - CFRetain(audioBuffer); dispatch_async(movieWritingQueue, ^{ [assetWriterAudioInput appendSampleBuffer:audioBuffer]; + + if (_shouldInvalidateAudioSampleWhenDone) + { + CMSampleBufferInvalidate(audioBuffer); + } CFRelease(audioBuffer); }); } From 72ad3564366b5167d4041da758e0c98fd6a47ac2 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 18 Jul 2013 21:56:40 -0500 Subject: [PATCH 419/695] Put in place a quick check to prevent the final callback block on movie recording from firing twice, leading to a crash. --- framework/Source/iOS/GPUImageMovieWriter.h | 2 ++ framework/Source/iOS/GPUImageMovieWriter.m | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index 914acb0b6..d3a209be2 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -17,6 +17,8 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; CMVideoDimensions videoDimensions; CMVideoCodecType videoType; + BOOL alreadyFinishedRecording; + NSURL *movieURL; NSString *fileType; AVAssetWriter *assetWriter; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index ee6322acf..ca37fa22d 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -78,7 +78,8 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr _shouldInvalidateAudioSampleWhenDone = NO; self.enabled = YES; - + alreadyFinishedRecording = NO; + movieWritingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.movieWritingQueue", NULL); videoSize = newSize; @@ -243,6 +244,7 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; - (void)startRecording; { + alreadyFinishedRecording = NO; isRecording = YES; startTime = kCMTimeInvalid; // [assetWriter startWriting]; @@ -265,7 +267,9 @@ - (void)cancelRecording; } isRecording = NO; - runOnMainQueueWithoutDeadlocking(^{ + dispatch_sync(movieWritingQueue, ^{ + alreadyFinishedRecording = YES; + [assetWriterVideoInput markAsFinished]; [assetWriterAudioInput markAsFinished]; [assetWriter cancelWriting]; @@ -287,7 +291,7 @@ - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; } isRecording = NO; - runOnMainQueueWithoutDeadlocking(^{ + dispatch_sync(movieWritingQueue, ^{ [assetWriterVideoInput markAsFinished]; [assetWriterAudioInput markAsFinished]; #if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) @@ -628,7 +632,11 @@ - (void)endProcessing { if (completionBlock) { - completionBlock(); + if (!alreadyFinishedRecording) + { + alreadyFinishedRecording = YES; + completionBlock(); + } } else { From 96c454e15b3029602f30260db8b5ff0f0476a271 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 18 Jul 2013 21:27:35 -0600 Subject: [PATCH 420/695] Handle orientation changes --- framework/Source/GPUImageGaussianBlurPositionFilter.m | 5 +++-- framework/Source/GPUImagePixellatePositionFilter.m | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImageGaussianBlurPositionFilter.m b/framework/Source/GPUImageGaussianBlurPositionFilter.m index d73a227f8..8ecd9246f 100755 --- a/framework/Source/GPUImageGaussianBlurPositionFilter.m +++ b/framework/Source/GPUImageGaussianBlurPositionFilter.m @@ -191,6 +191,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; { [super setInputRotation:newInputRotation atIndex:textureIndex]; + [self setBlurCenter:self.blurCenter]; [self adjustAspectRatio]; } @@ -210,8 +211,8 @@ - (void)setBlurSize:(CGFloat)newValue; - (void) setBlurCenter:(CGPoint)blurCenter; { _blurCenter = blurCenter; - - [self setPoint:_blurCenter forUniform:blurCenterUniform program:secondFilterProgram]; + CGPoint rotatedPoint = [self rotatedPoint:blurCenter forRotation:inputRotation]; + [self setPoint:rotatedPoint forUniform:blurCenterUniform program:secondFilterProgram]; } - (void) setBlurRadius:(CGFloat)blurRadius; diff --git a/framework/Source/GPUImagePixellatePositionFilter.m b/framework/Source/GPUImagePixellatePositionFilter.m index fad31a4dd..f1bd09ccb 100755 --- a/framework/Source/GPUImagePixellatePositionFilter.m +++ b/framework/Source/GPUImagePixellatePositionFilter.m @@ -180,8 +180,8 @@ - (void)setAspectRatio:(CGFloat)newValue; - (void)setCenter:(CGPoint)center { _center = center; - - [self setPoint:_center forUniform:centerUniform program:filterProgram]; + CGPoint rotatedPoint = [self rotatedPoint:center forRotation:inputRotation]; + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } - (void)setRadius:(CGFloat)radius From 68d930a9abdfa6808b73ffbf88c58d68cb29142b Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 25 Jul 2013 01:00:25 +1200 Subject: [PATCH 421/695] GPUImageTwoInputFilter newFrameReadyAtTime can't always pass on frame time from the first input Sometimes the first input will be a GPUImagePicture with a frameTime of CMTimeIndefinite. I have added a check to see whether the firstFrameTime is indefinite, in which case the secondFrameTime is used. The behaviour will be the same as before, unless the first input is a GPUImagePicture then the time will be used from the second input. Because the frameTime will always be indefinite it will always use the second frame time and therefore will be stable. --- framework/Source/GPUImageTwoInputFilter.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 669f03e90..65702774c 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -249,7 +249,8 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; // || (hasReceivedFirstFrame && secondFrameCheckDisabled) || (hasReceivedSecondFrame && firstFrameCheckDisabled) if ((hasReceivedFirstFrame && hasReceivedSecondFrame) || updatedMovieFrameOppositeStillImage) { - [super newFrameReadyAtTime:firstFrameTime atIndex:0]; // Bugfix when trying to record: always use time from first input + CMTime passOnFrameTime = (!CMTIME_IS_INDEFINITE(firstFrameTime)) ? firstFrameTime : secondFrameTime; + [super newFrameReadyAtTime:passOnFrameTime atIndex:0]; // Bugfix when trying to record: always use time from first input (unless indefinite, in which case use the second input) hasReceivedFirstFrame = NO; hasReceivedSecondFrame = NO; } From d434d547499f9e25f4120bcd99aea448ce16ea38 Mon Sep 17 00:00:00 2001 From: Eugene Rysaj Date: Fri, 26 Jul 2013 20:21:21 +0300 Subject: [PATCH 422/695] fix a couple of memory leaks --- framework/Source/GPUImageRawDataOutput.m | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 4d5564a33..e6798a833 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -243,6 +243,19 @@ - (void)destroyDataFBO; glDeleteRenderbuffers(1, &dataRenderbuffer); dataRenderbuffer = 0; } + + if (rawDataTextureCache) + { + CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); + CFRelease(rawDataTextureCache); + rawDataTextureCache = 0; + } + + if (renderTarget) + { + CVPixelBufferRelease(renderTarget); + renderTarget = 0; + } }); } From 36d4d8347abf8090583e23d2e97c7501f8f4e56d Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 1 Aug 2013 00:18:03 +1200 Subject: [PATCH 423/695] Turn off front-camera workaround on iOS 6 or later As discussed in #462, there are various problems with the workaround for corrupt images on iOS 5. Given that iOS 5 is quite legacy now, I think it's a reasonable solution to turn off that workaround if GPUImage is running on iOS 6 or later. This could of course be adjusted if the precise version of the OS required for the workaround is not 5.X. --- framework/Source/GPUImageStillCamera.m | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 2c78bc33f..3de6939b0 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -51,7 +51,9 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi @end -@implementation GPUImageStillCamera +@implementation GPUImageStillCamera { + BOOL requiresFrontCameraTextureCacheCorruptionWorkaround; +} @synthesize currentCaptureMetadata = _currentCaptureMetadata; @synthesize jpegCompressionQuality = _jpegCompressionQuality; @@ -66,6 +68,9 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return nil; } + /* Detect iOS version < 6 which require a texture cache corruption workaround */ + requiresFrontCameraTextureCacheCorruptionWorkaround = [[[UIDevice currentDevice] systemVersion] compare:@"6.0" options:NSNumericSearch] == NSOrderedAscending; + [self.captureSession beginConfiguration]; photoOutput = [[AVCaptureStillImageOutput alloc] init]; @@ -263,7 +268,7 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi { // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageContext supportsFastTextureUpload])) + if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageContext supportsFastTextureUpload]) || !requiresFrontCameraTextureCacheCorruptionWorkaround) { dispatch_semaphore_signal(frameRenderingSemaphore); [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; From 6cf6f00a756a8e89f0ad46892d94a829468c06a3 Mon Sep 17 00:00:00 2001 From: Paolo Moroni Date: Thu, 8 Aug 2013 17:06:43 +0200 Subject: [PATCH 424/695] Fixed a problem where these 2 filters would not correctly set the frameSize through the forceProcessingAtSize: method --- framework/Source/GPUImageAmatorkaFilter.m | 3 ++- framework/Source/GPUImageMissEtikateFilter.m | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageAmatorkaFilter.m b/framework/Source/GPUImageAmatorkaFilter.m index 4d9fa9d78..dbb29f458 100755 --- a/framework/Source/GPUImageAmatorkaFilter.m +++ b/framework/Source/GPUImageAmatorkaFilter.m @@ -21,7 +21,8 @@ - (id)init; lookupImageSource = [[GPUImagePicture alloc] initWithImage:image]; GPUImageLookupFilter *lookupFilter = [[GPUImageLookupFilter alloc] init]; - + [self addFilter:lookupFilter]; + [lookupImageSource addTarget:lookupFilter atTextureLocation:1]; [lookupImageSource processImage]; diff --git a/framework/Source/GPUImageMissEtikateFilter.m b/framework/Source/GPUImageMissEtikateFilter.m index efa595c52..9117ad834 100755 --- a/framework/Source/GPUImageMissEtikateFilter.m +++ b/framework/Source/GPUImageMissEtikateFilter.m @@ -21,6 +21,7 @@ - (id)init; lookupImageSource = [[GPUImagePicture alloc] initWithImage:image]; GPUImageLookupFilter *lookupFilter = [[GPUImageLookupFilter alloc] init]; + [self addFilter:lookupFilter]; [lookupImageSource addTarget:lookupFilter atTextureLocation:1]; [lookupImageSource processImage]; From 796919d857f10568d6ac6a00381be86d88288d35 Mon Sep 17 00:00:00 2001 From: Jamie Matthews Date: Mon, 19 Aug 2013 11:08:37 -0400 Subject: [PATCH 425/695] fixed gpuimage benchmark suite for live video streams --- .../BenchmarkSuite/VideoFilteringDisplayController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m index 82f583e42..c9412de63 100755 --- a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m @@ -260,8 +260,8 @@ -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMS CIImage *outputImage = [sepiaCoreImageFilter outputImage]; - [coreImageContext drawImage:outputImage atPoint:CGPointMake(0.0, 0.0) fromRect:[inputImage extent]]; - + //[coreImageContext drawImage:outputImage atPoint:CGPointMake(0.0, 0.0) fromRect:[inputImage extent]]; + [coreImageContext drawImage:outputImage inRect:CGRectMake(0, 0, 0, 0) fromRect:[inputImage extent]]; [self.openGLESContext presentRenderbuffer:GL_RENDERBUFFER]; elapsedTime = CFAbsoluteTimeGetCurrent() - startTime; From 6bce7912091300370cd234fbbd39bc5dc8757308 Mon Sep 17 00:00:00 2001 From: Jamie Matthews Date: Mon, 19 Aug 2013 13:03:28 -0400 Subject: [PATCH 426/695] updated video processing benchmark - CoreImage processing now uses entire screen --- .../BenchmarkSuite/VideoFilteringDisplayController.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m index c9412de63..d1f35676e 100755 --- a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m @@ -260,8 +260,10 @@ -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMS CIImage *outputImage = [sepiaCoreImageFilter outputImage]; - //[coreImageContext drawImage:outputImage atPoint:CGPointMake(0.0, 0.0) fromRect:[inputImage extent]]; - [coreImageContext drawImage:outputImage inRect:CGRectMake(0, 0, 0, 0) fromRect:[inputImage extent]]; + CGFloat scale = UIScreen.mainScreen.scale; + CGRect s = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width * scale, [[UIScreen mainScreen] bounds].size.height * scale); + [coreImageContext drawImage:outputImage inRect:s fromRect:[inputImage extent]]; + [self.openGLESContext presentRenderbuffer:GL_RENDERBUFFER]; elapsedTime = CFAbsoluteTimeGetCurrent() - startTime; From a231e2f5757f01e77c60d754b8fb5b446d2e1779 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 20 Aug 2013 16:57:59 -0500 Subject: [PATCH 427/695] Fixed a Mac build error introduced by a recent pull request. --- framework/Source/GPUImageRawDataOutput.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index e6798a833..e5e701356 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -244,12 +244,14 @@ - (void)destroyDataFBO; dataRenderbuffer = 0; } +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE if (rawDataTextureCache) { CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); CFRelease(rawDataTextureCache); rawDataTextureCache = 0; } +#endif if (renderTarget) { From a3705725bea00b49ef603e6f6890625760c2a38d Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Mon, 2 Sep 2013 08:53:27 -0600 Subject: [PATCH 428/695] Check that the session is running before trying to process frames - fixes crash when backgrounding app --- framework/Source/GPUImageVideoCamera.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 496e670dd..6d813120e 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -828,7 +828,11 @@ - (CGFloat)averageFrameDurationDuringCapture; - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { - if (captureOutput == audioOutput) + if (!self.captureSession.isRunning) + { + return; + } + else if (captureOutput == audioOutput) { [self processAudioSampleBuffer:sampleBuffer]; } From 846abb02ef787eb646abfb02060cac5a47969584 Mon Sep 17 00:00:00 2001 From: Jens Daemgen Date: Tue, 3 Sep 2013 20:24:32 +0200 Subject: [PATCH 429/695] Fix type in GPUImageHueFilter --- framework/Source/GPUImageHueFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageHueFilter.h b/framework/Source/GPUImageHueFilter.h index 49c7e3d64..eef246515 100644 --- a/framework/Source/GPUImageHueFilter.h +++ b/framework/Source/GPUImageHueFilter.h @@ -3,7 +3,7 @@ @interface GPUImageHueFilter : GPUImageFilter { - GLfloat hueAdjustUniform; + GLint hueAdjustUniform; } @property (nonatomic, readwrite) CGFloat hue; From a2a16ad1ec79f5cd2effac17988bb3e121132da1 Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 10:40:04 -0700 Subject: [PATCH 430/695] Adding .svn to the ignore list for hybrid projects. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f57d52bb7..f12bf8782 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ examples/FilterShowcase/build* # Exclude OS X folder attributes .DS_Store +.svn # Exclude user-specific XCode 3 and 4 files *.mode1 From 5e6c1f99e7bead999db8e99b3f6f1e060faf00f2 Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 10:40:25 -0700 Subject: [PATCH 431/695] Marking the headers as 'public' so you can use the project as a direct dependency. --- framework/GPUImage.xcodeproj/project.pbxproj | 320 ++++++++++--------- 1 file changed, 161 insertions(+), 159 deletions(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 2c3895d69..074c8e6d6 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -21,196 +21,196 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; settings = {ATTRIBUTES = (); }; }; + 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; - 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */; }; - 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; - 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; + 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097716B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m */; }; - 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; settings = {ATTRIBUTES = (); }; }; + 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; - 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; settings = {ATTRIBUTES = (); }; }; + 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6EE27494150E8FC60040DDB6 /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */; }; - 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; - 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; settings = {ATTRIBUTES = (); }; }; + 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; - 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (); }; }; + 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */; }; - 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; settings = {ATTRIBUTES = (); }; }; + 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96781B3515C39E80005FA0D7 /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */; }; - 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (); }; }; + 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; - 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (); }; }; + 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; - B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */; }; - B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B80171FF16312800001C8D16 /* GPUImageSaturationBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */; }; - B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */; }; - B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (); }; }; + B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; - B81F2D751788C95500118374 /* GPUImageHSBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81F2D731788C95500118374 /* GPUImageHSBFilter.h */; }; + B81F2D751788C95500118374 /* GPUImageHSBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81F2D731788C95500118374 /* GPUImageHSBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B81F2D761788C95500118374 /* GPUImageHSBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81F2D741788C95500118374 /* GPUImageHSBFilter.m */; }; - B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (); }; }; + B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */; }; - BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */; }; - BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */; }; - BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */; }; - BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */; }; - BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */; }; - BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */; }; - BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690D1157C2EBA009274F9 /* GPUImageRGBDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690CF157C2EBA009274F9 /* GPUImageRGBDilationFilter.m */; }; - BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690D6157C31C9009274F9 /* GPUImageRGBErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D4157C31C9009274F9 /* GPUImageRGBErosionFilter.m */; }; - BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D8157C33B8009274F9 /* GPUImageRGBOpeningFilter.m */; }; - BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */; }; - BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC0690F8157C5075009274F9 /* GPUImageColorPackingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690F6157C5075009274F9 /* GPUImageColorPackingFilter.m */; }; - BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; - BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC185E7B16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7916B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m */; }; - BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC185E7F16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7D16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m */; }; - BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC185E8316B866F000EA01AD /* GPUImagePixellatePositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E8116B866F000EA01AD /* GPUImagePixellatePositionFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; - BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; - BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (); }; }; + BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC1B715814F49DAA00ACA2AB /* GPUImageRawDataOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B715614F49DAA00ACA2AB /* GPUImageRawDataOutput.m */; }; - BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC1B717D14F566E200ACA2AB /* GPUImageSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */; }; - BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC1B718F14F56C1D00ACA2AB /* GPUImageSwirlFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B718D14F56C1D00ACA2AB /* GPUImageSwirlFilter.m */; }; - BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (); }; }; + BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC1B728214FB16AF00ACA2AB /* GPUImageMovieWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */; }; - BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; - BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */; }; - BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; settings = {ATTRIBUTES = (); }; }; + BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */; }; - BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC4D03D0160919AE00F64358 /* GPUImageHalftoneFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4D03CE160919AE00F64358 /* GPUImageHalftoneFilter.m */; }; - BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; - BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; settings = {ATTRIBUTES = (); }; }; + BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D8291579779700CC9C1E /* GPUImageUIElement.m */; }; - BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */; }; - BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */; }; - BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */; }; + BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */; }; - BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; - BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */; }; - BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */; }; - BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (); }; }; + BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */; }; - BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; settings = {ATTRIBUTES = (); }; }; + BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; - BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; settings = {ATTRIBUTES = (); }; }; + BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC95C4091622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */; }; - BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B5414F07F790001FF6F /* GPUImageColorInvertFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5014F07F790001FF6F /* GPUImageColorInvertFilter.m */; }; - BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B5614F07F790001FF6F /* GPUImageSaturationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5214F07F790001FF6F /* GPUImageSaturationFilter.m */; }; - BC982B6714F092EF0001FF6F /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982B6714F092EF0001FF6F /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B6814F092EF0001FF6F /* GPUImageContrastFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B6614F092EF0001FF6F /* GPUImageContrastFilter.m */; }; - BC982B7914F098CC0001FF6F /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982B7914F098CC0001FF6F /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B7A14F098CC0001FF6F /* GPUImageBrightnessFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */; }; - BC982B7E14F09F980001FF6F /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982B7E14F09F980001FF6F /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B7F14F09F980001FF6F /* GPUImageGammaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7D14F09F980001FF6F /* GPUImageGammaFilter.m */; }; - BC982B9914F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982B9914F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982B9A14F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */; }; - BC982BEB14F1CE600001FF6F /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982BEB14F1CE600001FF6F /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982BEC14F1CE600001FF6F /* GPUImageDissolveBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BE814F1CE600001FF6F /* GPUImageDissolveBlendFilter.m */; }; - BC982BED14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982BED14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982BEE14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BEA14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m */; }; - BC982C4714F29E580001FF6F /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982C4714F29E580001FF6F /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C4814F29E580001FF6F /* GPUImageKuwaharaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */; }; - BC982C6E14F33C2A0001FF6F /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; settings = {ATTRIBUTES = (); }; }; + BC982C6E14F33C2A0001FF6F /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C6F14F33C2A0001FF6F /* GPUImageMovie.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */; }; - BC982C7014F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982C7014F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C7114F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6D14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m */; }; - BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C8214F34F0C0001FF6F /* GPUImageDarkenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C7E14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.m */; }; - BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982C8414F34F0C0001FF6F /* GPUImageLightenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */; }; - BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC982CA014F35C2D0001FF6F /* GPUImageToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */; }; - BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */; }; - BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; settings = {ATTRIBUTES = (); }; }; + BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */; }; - BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (); }; }; + BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */; }; - BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA632821623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632801623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m */; }; - BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA632871623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */; }; - BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */; }; - BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */; }; - BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCABED9115263CF20098A93E /* GPUImageStretchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */; }; - BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */; }; - BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */; }; - BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */; }; - BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; - BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */; }; - BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */; }; - BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */; }; - BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D1015718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */; }; - BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D1515718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */; }; - BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */; }; - BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; - BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */; }; - BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB030BC173400BC001A1A20 /* GPUImageThreeInputFilter.h */; }; + BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB030BC173400BC001A1A20 /* GPUImageThreeInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB030BD173400BC001A1A20 /* GPUImageThreeInputFilter.m */; }; - BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */; }; - BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */; }; - BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (); }; }; + BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */; }; - BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; - BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; settings = {ATTRIBUTES = (); }; }; + BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E75D14E2086300701302 /* GPUImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E75B14E2086300701302 /* GPUImageView.m */; }; - BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; settings = {ATTRIBUTES = (); }; }; + BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E76614E208D700701302 /* GPUImageVideoCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */; }; - BCB5E76C14E20AD700701302 /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageContext.h */; settings = {ATTRIBUTES = (); }; }; + BCB5E76C14E20AD700701302 /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E76D14E20AD700701302 /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageContext.m */; }; BCB5E76F14E20B8000701302 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E76E14E20B7F00701302 /* UIKit.framework */; }; BCB5E77114E20B8A00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77014E20B8A00701302 /* AVFoundation.framework */; }; @@ -218,92 +218,92 @@ BCB5E77514E20B9700701302 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77414E20B9700701302 /* OpenGLES.framework */; }; BCB5E77714E20BA800701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77614E20BA800701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Required, ); }; }; BCB5E77914E20BAF00701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77814E20BAF00701302 /* CoreMedia.framework */; }; - BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; settings = {ATTRIBUTES = (); }; }; + BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E78014E22E4300701302 /* GPUImageOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E77E14E22E4200701302 /* GPUImageOutput.m */; }; - BCB5E79414E3275200701302 /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; settings = {ATTRIBUTES = (); }; }; + BCB5E79414E3275200701302 /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E79514E3275200701302 /* GLProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E79314E3275200701302 /* GLProgram.m */; }; - BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E7C314E4B6D400701302 /* GPUImageSepiaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7C114E4B6D400701302 /* GPUImageSepiaFilter.m */; }; - BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; settings = {ATTRIBUTES = (); }; }; + BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB5E7DB14E6003400701302 /* GPUImagePicture.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7D914E6003400701302 /* GPUImagePicture.m */; }; - BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B838150400030041703B /* GPUImageExposureFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B834150400030041703B /* GPUImageExposureFilter.m */; }; - BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B83A150400030041703B /* GPUImageSharpenFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B836150400030041703B /* GPUImageSharpenFilter.m */; }; - BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B85715041A920041703B /* GPUImageColorBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85115041A920041703B /* GPUImageColorBurnBlendFilter.m */; }; - BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B85915041A920041703B /* GPUImageColorDodgeBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85315041A920041703B /* GPUImageColorDodgeBlendFilter.m */; }; - BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B85B15041A920041703B /* GPUImageScreenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85515041A920041703B /* GPUImageScreenBlendFilter.m */; }; - BCB6B8701504234A0041703B /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B8701504234A0041703B /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8711504234A0041703B /* GPUImageDifferenceBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8691504234A0041703B /* GPUImageDifferenceBlendFilter.m */; }; - BCB6B8721504234A0041703B /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B8721504234A0041703B /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8731504234A0041703B /* GPUImageExclusionBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86B1504234A0041703B /* GPUImageExclusionBlendFilter.m */; }; - BCB6B8741504234A0041703B /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B8741504234A0041703B /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8751504234A0041703B /* GPUImageHardLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86D1504234A0041703B /* GPUImageHardLightBlendFilter.m */; }; - BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8771504234A0041703B /* GPUImageSoftLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */; }; - BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B8BC1505BF940041703B /* GPUImageTextureOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */; }; - BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; - BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; settings = {ATTRIBUTES = (); }; }; + BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */; }; - BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; settings = {ATTRIBUTES = (); }; }; + BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */; }; - BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */; }; - BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */; }; - BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */; }; - BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; - BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (); }; }; + BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */; }; - BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */; settings = {ATTRIBUTES = (); }; }; + BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF617916E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.m */; }; - BCBF617D16E4F69B00E2784A /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; - BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; settings = {ATTRIBUTES = (); }; }; + BCBF617D16E4F69B00E2784A /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */; }; - BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E5A9151E74B20006EFA5 /* GPUImagePosterizeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5A7151E74B20006EFA5 /* GPUImagePosterizeFilter.m */; }; - BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E5B9151E83700006EFA5 /* GPUImageFilterGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */; }; - BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E5C8151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */; }; - BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E5CD151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */; }; - BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E611152156620006EFA5 /* GPUImageUnsharpMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */; }; - BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E634152239090006EFA5 /* GPUImageBulgeDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E632152239090006EFA5 /* GPUImageBulgeDistortionFilter.m */; }; - BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E639152243630006EFA5 /* GPUImagePinchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E637152243620006EFA5 /* GPUImagePinchDistortionFilter.m */; }; - BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; settings = {ATTRIBUTES = (); }; }; - BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC1E66E152368130006EFA5 /* GPUImageCrosshatchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */; }; BCC1E67C152368840006EFA5 /* GPUImageCGAColorspaceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E67B152368840006EFA5 /* GPUImageCGAColorspaceFilter.m */; }; - BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */; }; - BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */; }; - BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC93A101501D1BF00958B26 /* GPUImageFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */; }; - BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC93A1F1501E42F00958B26 /* GPUImageTwoPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */; }; BCC93A301502A90F00958B26 /* GPUImageFilterPipeline.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D69488A1501F58200206FF8 /* GPUImageFilterPipeline.m */; }; BCC93A311502A91500958B26 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */; }; - BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; settings = {ATTRIBUTES = (); }; }; - BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; settings = {ATTRIBUTES = (); }; }; - BCC94ABB151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC94ABB151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC94ABC151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */; }; - BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC94CFB15101EB3002F9BC5 /* GPUImageTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */; }; - BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */; }; - BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */; }; BCF1A33814DDB1EC00852800 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; BCF1A34614DDB1EC00852800 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A34514DDB1EC00852800 /* SenTestingKit.framework */; }; @@ -311,45 +311,47 @@ BCF1A34C14DDB1EC00852800 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33414DDB1EC00852800 /* libGPUImage.a */; }; BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1A35014DDB1EC00852800 /* InfoPlist.strings */; }; BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1A35414DDB1EC00852800 /* GPUImageTests.m */; }; - BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E54115669907006B155F /* GPUImageJFAVoronoiFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */; }; - BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */; }; - BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E54515669907006B155F /* GPUImageVoronoiConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoronoiConsumerFilter.m */; }; - BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */; }; - BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (); }; }; + BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */; }; - BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; settings = {ATTRIBUTES = (); }; }; + BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; - BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */; }; - BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */; }; - BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */; }; - BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */; }; - BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m */; }; - BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; - BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; - BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; - BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */; }; - BCF866C8172589A500912E34 /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; }; - BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (); }; }; + BCF866C8172589A500912E34 /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; }; - BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (); }; }; + BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; - C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; settings = {ATTRIBUTES = (); }; }; + C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; C04C8D1815F8059F00449601 /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */; }; - C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (); }; }; + C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; + D443237A17C81C0C00204484 /* GPUImageMovieComposition.h in Headers */ = {isa = PBXBuildFile; fileRef = D443237817C81C0C00204484 /* GPUImageMovieComposition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D443237B17C81C0C00204484 /* GPUImageMovieComposition.m in Sources */ = {isa = PBXBuildFile; fileRef = D443237917C81C0C00204484 /* GPUImageMovieComposition.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ From b7cac767433ab42ffda9ff48f7d5f567e32489e0 Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 10:41:54 -0700 Subject: [PATCH 432/695] Adding missing rotation mode. Fixing some of the exiting ones. --- framework/Source/GPUImageCropFilter.m | 52 ++++++++++++++++---------- framework/Source/GPUImageFilter.m | 15 +++++++- framework/Source/GPUImageVideoCamera.m | 20 +++++----- framework/Source/iOS/GPUImageContext.h | 4 +- framework/Source/iOS/GPUImageView.m | 8 ++++ 5 files changed, 67 insertions(+), 32 deletions(-) diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index 188c87184..a783a1c40 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -137,19 +137,19 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = maxX; // 1,1 cropTextureCoordinates[7] = maxY; }; break; - case kGPUImageRotateLeft: // Broken + case kGPUImageRotateLeft: // Fixed { - cropTextureCoordinates[0] = maxX; // 1,0 - cropTextureCoordinates[1] = minY; + cropTextureCoordinates[0] = maxY; // 1,0 + cropTextureCoordinates[1] = 1.0 - maxX; - cropTextureCoordinates[2] = maxX; // 1,1 - cropTextureCoordinates[3] = maxY; - - cropTextureCoordinates[4] = minX; // 0,0 - cropTextureCoordinates[5] = minY; - - cropTextureCoordinates[6] = minX; // 0,1 - cropTextureCoordinates[7] = maxY; + cropTextureCoordinates[2] = maxY; // 1,1 + cropTextureCoordinates[3] = 1.0 - minX; + + cropTextureCoordinates[4] = minY; // 0,0 + cropTextureCoordinates[5] = 1.0 - maxX; + + cropTextureCoordinates[6] = minY; // 0,1 + cropTextureCoordinates[7] = 1.0 - minX; }; break; case kGPUImageRotateRight: // Fixed { @@ -165,7 +165,7 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = maxY; // 1,0 cropTextureCoordinates[7] = 1.0 - maxX; }; break; - case kGPUImageFlipVertical: // Broken + case kGPUImageFlipVertical: // Works for me { cropTextureCoordinates[0] = minX; // 0,1 cropTextureCoordinates[1] = maxY; @@ -179,7 +179,7 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = maxX; // 1,0 cropTextureCoordinates[7] = minY; }; break; - case kGPUImageFlipHorizonal: // Broken + case kGPUImageFlipHorizonal: // Works for me { cropTextureCoordinates[0] = maxX; // 1,0 cropTextureCoordinates[1] = minY; @@ -193,16 +193,16 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = minX; // 0,1 cropTextureCoordinates[7] = maxY; }; break; - case kGPUImageRotate180: // Broken + case kGPUImageRotate180: // Fixed { cropTextureCoordinates[0] = maxX; // 1,1 cropTextureCoordinates[1] = maxY; - cropTextureCoordinates[2] = maxX; // 1,0 - cropTextureCoordinates[3] = minY; + cropTextureCoordinates[2] = minX; // 0,1 + cropTextureCoordinates[3] = maxY; - cropTextureCoordinates[4] = minX; // 0,1 - cropTextureCoordinates[5] = maxY; + cropTextureCoordinates[4] = maxX; // 1,0 + cropTextureCoordinates[5] = minY; cropTextureCoordinates[6] = minX; // 0,0 cropTextureCoordinates[7] = minY; @@ -221,7 +221,21 @@ - (void)calculateCropTextureCoordinates; cropTextureCoordinates[6] = maxY; // 1,1 cropTextureCoordinates[7] = 1.0 - minX; }; break; - } + case kGPUImageRotateRightFlipHorizontal: // Fixed + { + cropTextureCoordinates[0] = maxY; // 1,1 + cropTextureCoordinates[1] = 1.0 - minX; + + cropTextureCoordinates[2] = maxY; // 1,0 + cropTextureCoordinates[3] = 1.0 - maxX; + + cropTextureCoordinates[4] = minY; // 0,1 + cropTextureCoordinates[5] = 1.0 - minX; + + cropTextureCoordinates[6] = minY; // 0,0 + cropTextureCoordinates[7] = 1.0 - maxX; + }; break; + } } - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 386d751f6..2f6408997 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -491,7 +491,14 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM 1.0f, 0.0f, 1.0f, 1.0f, }; - + + static const GLfloat rotateRightHorizontalFlipTextureCoordinates[] = { + 1.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 0.0f, 0.0f, + }; + static const GLfloat rotate180TextureCoordinates[] = { 1.0f, 1.0f, 0.0f, 1.0f, @@ -507,6 +514,7 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; + case kGPUImageRotateRightFlipHorizontal: return rotateRightHorizontalFlipTextureCoordinates; case kGPUImageRotate180: return rotate180TextureCoordinates; } } @@ -849,6 +857,11 @@ - (CGPoint)rotatedPoint:(CGPoint)pointToRotate forRotation:(GPUImageRotationMode rotatedPoint.x = pointToRotate.y; rotatedPoint.y = pointToRotate.x; }; break; + case kGPUImageRotateRightFlipHorizontal: + { + rotatedPoint.x = 1.0 - pointToRotate.y; + rotatedPoint.y = 1.0 - pointToRotate.x; + }; break; case kGPUImageRotate180: { rotatedPoint.x = 1.0 - pointToRotate.x; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 496e670dd..c89527d3c 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -926,8 +926,8 @@ - (void)updateOrientationSendToTargets; { case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; } } } @@ -937,20 +937,20 @@ - (void)updateOrientationSendToTargets; { switch(_outputImageOrientation) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRightFlipHorizontal; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; } } else { switch(_outputImageOrientation) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipVertical; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; } } } diff --git a/framework/Source/iOS/GPUImageContext.h b/framework/Source/iOS/GPUImageContext.h index d03135829..71bc81680 100755 --- a/framework/Source/iOS/GPUImageContext.h +++ b/framework/Source/iOS/GPUImageContext.h @@ -6,9 +6,9 @@ #import #import "GLProgram.h" -#define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical) +#define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical || (rotation) == kGPUImageRotateRightFlipHorizontal) -typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180 } GPUImageRotationMode; +typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotateRightFlipHorizontal, kGPUImageRotate180 } GPUImageRotationMode; @interface GPUImageContext : NSObject diff --git a/framework/Source/iOS/GPUImageView.m b/framework/Source/iOS/GPUImageView.m index 015c29e18..483796b9e 100755 --- a/framework/Source/iOS/GPUImageView.m +++ b/framework/Source/iOS/GPUImageView.m @@ -331,6 +331,13 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM 0.0f, 1.0f, }; + static const GLfloat rotateRightHorizontalFlipTextureCoordinates[] = { + 1.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 0.0f, 0.0f, + }; + static const GLfloat rotate180TextureCoordinates[] = { 1.0f, 0.0f, 0.0f, 0.0f, @@ -346,6 +353,7 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; + case kGPUImageRotateRightFlipHorizontal: return rotateRightHorizontalFlipTextureCoordinates; case kGPUImageRotate180: return rotate180TextureCoordinates; } } From e98cc813bc7e330394597a2e5fee04911653a5a0 Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 10:43:40 -0700 Subject: [PATCH 433/695] Fixing issue where the first frame would always be white because glUniform1i was failing after this switched shader programs unexpectedly due to the need to initialize the second filter. --- framework/Source/GPUImageSobelEdgeDetectionFilter.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 6cfa77558..449129b5f 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -125,9 +125,11 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ + GLProgram *previousProgram = [GPUImageContext sharedImageProcessingContext].currentShaderProgram; [GPUImageContext setActiveShaderProgram:secondFilterProgram]; glUniform1f(texelWidthUniform, _texelWidth); glUniform1f(texelHeightUniform, _texelHeight); + [GPUImageContext setActiveShaderProgram:previousProgram]; }); } } From 6321801210d2e67bc9cdd468a279a9ae16e2a083 Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 10:44:23 -0700 Subject: [PATCH 434/695] Allow for chaining the output image size. --- framework/Source/GPUImageRawDataOutput.h | 2 ++ framework/Source/GPUImageRawDataOutput.m | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index b1dcc8ba3..762e8eb6b 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -46,4 +46,6 @@ typedef struct GPUByteColorVector GPUByteColorVector; - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; - (NSUInteger)bytesPerRowInOutput; +- (void)setImageSize:(CGSize)newImageSize; + @end diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index e6798a833..ca46d3da5 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -470,4 +470,14 @@ - (NSUInteger)bytesPerRowInOutput; } } +- (void)setImageSize:(CGSize)newImageSize { + imageSize = newImageSize; + [self destroyDataFBO]; + if (_rawBytesForImage != NULL && (![GPUImageContext supportsFastTextureUpload])) + { + free(_rawBytesForImage); + _rawBytesForImage = NULL; + } +} + @end From 2ad3e9cbbc9a2943f61e1cde1587f09cc180c738 Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 10:55:29 -0700 Subject: [PATCH 435/695] Re-working GPUImageVideoCamera to use the YUV->RGB transform method shown in Apple's AVBasicVideoOutput example because it produces results closer to that of the built-in camera. Making GPUImageMovie do the YUV->RGB conversion via shader rather than asking AVFoundation to do it. --- framework/Source/GPUImageMovie.m | 303 +++++++++++++++++++++---- framework/Source/GPUImageVideoCamera.h | 6 + framework/Source/GPUImageVideoCamera.m | 70 +++--- 3 files changed, 306 insertions(+), 73 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 79576fd0f..f49f1c9db 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -1,5 +1,7 @@ #import "GPUImageMovie.h" #import "GPUImageMovieWriter.h" +#import "GPUImageFilter.h" +#import "GPUImageVideoCamera.h" @interface GPUImageMovie () { @@ -10,6 +12,17 @@ @interface GPUImageMovie () CMTime previousFrameTime; CFAbsoluteTime previousActualFrameTime; BOOL keepLooping; + + GLuint luminanceTexture, chrominanceTexture; + + GLProgram *yuvConversionProgram; + GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; + GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; + GLint yuvConversionMatrixUniform; + GLuint yuvConversionFramebuffer; + const GLfloat *_preferredConversion; + + int imageBufferWidth, imageBufferHeight; } - (void)processAsset; @@ -64,6 +77,39 @@ - (void)textureCacheSetup; { runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; + + _preferredConversion = kColorConversion709; + yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; + + if (!yuvConversionProgram.initialized) + { + [yuvConversionProgram addAttribute:@"position"]; + [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; + + if (![yuvConversionProgram link]) + { + NSString *progLog = [yuvConversionProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [yuvConversionProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + yuvConversionProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; + yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; + yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; + yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; + yuvConversionMatrixUniform = [yuvConversionProgram uniformIndex:@"colorConversionMatrix"]; + + [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; + + glEnableVertexAttribArray(yuvConversionPositionAttribute); + glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); + #if defined(__IPHONE_6_0) CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); #else @@ -85,6 +131,7 @@ - (void)dealloc if ([GPUImageContext supportsFastTextureUpload]) { CFRelease(coreVideoTextureCache); + [self destroyYUVConversionFBO]; } } @@ -288,66 +335,147 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(movieSampleBuffer); CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(movieSampleBuffer); + [self processMovieFrame:movieFrame withSampleTime:currentSampleTime]; +} +- (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime +{ int bufferHeight = CVPixelBufferGetHeight(movieFrame); #if TARGET_IPHONE_SIMULATOR int bufferWidth = CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) #else int bufferWidth = CVPixelBufferGetWidth(movieFrame); #endif + CFTypeRef colorAttachments = CVBufferGetAttachment(movieFrame, kCVImageBufferYCbCrMatrixKey, NULL); + if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4) { + _preferredConversion = kColorConversion601; + } + else { + _preferredConversion = kColorConversion709; + } CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); if ([GPUImageContext supportsFastTextureUpload]) { - CVPixelBufferLockBaseAddress(movieFrame, 0); - - [GPUImageContext useImageProcessingContext]; + CVOpenGLESTextureRef luminanceTextureRef = NULL; + CVOpenGLESTextureRef chrominanceTextureRef = NULL; CVOpenGLESTextureRef texture = NULL; - CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, - coreVideoTextureCache, - movieFrame, - NULL, - GL_TEXTURE_2D, - self.outputTextureOptions.internalFormat, - bufferWidth, - bufferHeight, - self.outputTextureOptions.format, - self.outputTextureOptions.type, - 0, - &texture); - - if (!texture || err) { - NSLog(@"Movie CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); - return; + + // if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) + if (CVPixelBufferGetPlaneCount(movieFrame) > 0) // Check for YUV planar inputs to do RGB conversion + { + + if ( (imageBufferWidth != bufferWidth) && (imageBufferHeight != bufferHeight) ) + { + imageBufferWidth = bufferWidth; + imageBufferHeight = bufferHeight; + + [self destroyYUVConversionFBO]; + [self createYUVConversionFBO]; + } + + CVReturn err; + // Y-plane + glActiveTexture(GL_TEXTURE4); + if ([GPUImageContext deviceSupportsRedTextures]) + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + } + else + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + } + if (err) + { + NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + luminanceTexture = CVOpenGLESTextureGetName(luminanceTextureRef); + glBindTexture(GL_TEXTURE_2D, luminanceTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + // UV-plane + glActiveTexture(GL_TEXTURE5); + if ([GPUImageContext deviceSupportsRedTextures]) + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + } + else + { + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + } + if (err) + { + NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + chrominanceTexture = CVOpenGLESTextureGetName(chrominanceTextureRef); + glBindTexture(GL_TEXTURE_2D, chrominanceTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + if (!allTargetsWantMonochromeData) + { + [self convertYUVToRGBOutput]; + } + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; + [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; + [currentTarget setTextureDelegate:self atIndex:targetTextureIndex]; + + [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; + } + + CVPixelBufferUnlockBaseAddress(movieFrame, 0); + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(luminanceTextureRef); + CFRelease(chrominanceTextureRef); } - - outputTexture = CVOpenGLESTextureGetName(texture); - // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - - for (id currentTarget in targets) + else { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; - [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; - [currentTarget setTextureDelegate:self atIndex:targetTextureIndex]; + CVPixelBufferLockBaseAddress(movieFrame, 0); + + CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); + + if (!texture || err) { + NSLog(@"Movie CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); + NSAssert(NO, @"Camera failure"); + return; + } + + outputTexture = CVOpenGLESTextureGetName(texture); + // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; + [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; + [currentTarget setTextureDelegate:self atIndex:targetTextureIndex]; + + [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; + } + + CVPixelBufferUnlockBaseAddress(movieFrame, 0); + CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); + CFRelease(texture); - [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; + outputTexture = 0; } - - CVPixelBufferUnlockBaseAddress(movieFrame, 0); - - // Flush the CVOpenGLESTexture cache and release the texture - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(texture); - outputTexture = 0; } else { @@ -409,4 +537,93 @@ - (void)cancelProcessing [self endProcessing]; } +- (void)convertYUVToRGBOutput; +{ + [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; + [self setYUVConversionFBO]; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + static const GLfloat squareVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat textureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, luminanceTexture); + glUniform1i(yuvConversionLuminanceTextureUniform, 4); + + glActiveTexture(GL_TEXTURE5); + glBindTexture(GL_TEXTURE_2D, chrominanceTexture); + glUniform1i(yuvConversionChrominanceTextureUniform, 5); + + glUniformMatrix3fv(yuvConversionMatrixUniform, 1, GL_FALSE, _preferredConversion); + + glVertexAttribPointer(yuvConversionPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); + glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +- (void)setYUVConversionFBO; +{ + if (!yuvConversionFramebuffer) + { + [self createYUVConversionFBO]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); + + glViewport(0, 0, imageBufferWidth, imageBufferHeight); +} + +- (void)createYUVConversionFBO; +{ + [self initializeOutputTextureIfNeeded]; + + glActiveTexture(GL_TEXTURE1); + glGenFramebuffers(1, &yuvConversionFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); + + glBindTexture(GL_TEXTURE_2D, outputTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageBufferWidth, imageBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + [self notifyTargetsAboutNewOutputTexture]; + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + glBindTexture(GL_TEXTURE_2D, 0); + +} + +- (void)destroyYUVConversionFBO; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + if (yuvConversionFramebuffer) + { + glDeleteFramebuffers(1, &yuvConversionFramebuffer); + yuvConversionFramebuffer = 0; + } + + if (outputTexture) + { + glDeleteTextures(1, &outputTexture); + outputTexture = 0; + } + }); +} + @end diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 879c3f8a5..3c0b59357 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -4,6 +4,12 @@ #import "GPUImageContext.h" #import "GPUImageOutput.h" +extern const GLfloat kColorConversion601[]; +extern const GLfloat kColorConversion709[]; +extern NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString; +extern NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString; + + //Delegate Protocal for Face Detection. @protocol GPUImageVideoCameraDelegate diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index c89527d3c..4f6a5ea76 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -2,13 +2,30 @@ #import "GPUImageMovieWriter.h" #import "GPUImageFilter.h" +// Color Conversion Constants (YUV to RGB) including adjustment from 16-235/16-240 (video range) + +// BT.601, which is the standard for SDTV. +const GLfloat kColorConversion601[] = { + 1.164, 1.164, 1.164, + 0.0, -0.392, 2.017, + 1.596, -0.813, 0.0, +}; + +// BT.709, which is the standard for HDTV. +const GLfloat kColorConversion709[] = { + 1.164, 1.164, 1.164, + 0.0, -0.213, 2.112, + 1.793, -0.533, 0.0, +}; + NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; uniform sampler2D luminanceTexture; uniform sampler2D chrominanceTexture; - + uniform mediump mat3 colorConversionMatrix; + void main() { mediump vec3 yuv; @@ -16,18 +33,7 @@ void main() yuv.x = texture2D(luminanceTexture, textureCoordinate).r; yuv.yz = texture2D(chrominanceTexture, textureCoordinate).rg - vec2(0.5, 0.5); - - // BT.601, which is the standard for SDTV is provided as a reference - /* - rgb = mat3( 1, 1, 1, - 0, -.39465, 2.03211, - 1.13983, -.58060, 0) * yuv; - */ - - // Using BT.709 which is the standard for HDTV - rgb = mat3( 1, 1, 1, - 0, -.21482, 2.12798, - 1.28033, -.38059, 0) * yuv; + rgb = colorConversionMatrix * yuv; gl_FragColor = vec4(rgb, 1); } @@ -39,7 +45,8 @@ void main() uniform sampler2D luminanceTexture; uniform sampler2D chrominanceTexture; - + uniform mediump mat3 colorConversionMatrix; + void main() { mediump vec3 yuv; @@ -47,22 +54,11 @@ void main() yuv.x = texture2D(luminanceTexture, textureCoordinate).r; yuv.yz = texture2D(chrominanceTexture, textureCoordinate).ra - vec2(0.5, 0.5); - - // BT.601, which is the standard for SDTV is provided as a reference - /* - rgb = mat3( 1, 1, 1, - 0, -.39465, 2.03211, - 1.13983, -.58060, 0) * yuv; - */ - - // Using BT.709 which is the standard for HDTV - rgb = mat3( 1, 1, 1, - 0, -.21482, 2.12798, - 1.28033, -.38059, 0) * yuv; - + rgb = colorConversionMatrix * yuv; + gl_FragColor = vec4(rgb, 1); } - ); +); #pragma mark - @@ -81,7 +77,10 @@ @interface GPUImageVideoCamera () GLProgram *yuvConversionProgram; GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; + GLint yuvConversionMatrixUniform; GLuint yuvConversionFramebuffer; + const GLfloat *_preferredConversion; + int imageBufferWidth, imageBufferHeight; } @@ -132,6 +131,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD capturePaused = NO; outputRotation = kGPUImageNoRotation; captureAsYUV = YES; + _preferredConversion = kColorConversion709; runSynchronouslyOnVideoProcessingQueue(^{ @@ -169,7 +169,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; - + yuvConversionMatrixUniform = [yuvConversionProgram uniformIndex:@"colorConversionMatrix"]; + [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; glEnableVertexAttribArray(yuvConversionPositionAttribute); @@ -559,7 +560,14 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer); int bufferWidth = CVPixelBufferGetWidth(cameraFrame); int bufferHeight = CVPixelBufferGetHeight(cameraFrame); - + CFTypeRef colorAttachments = CVBufferGetAttachment(cameraFrame, kCVImageBufferYCbCrMatrixKey, NULL); + if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4) { + _preferredConversion = kColorConversion601; + } + else { + _preferredConversion = kColorConversion709; + } + CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); [GPUImageContext useImageProcessingContext]; @@ -757,6 +765,8 @@ - (void)convertYUVToRGBOutput; glBindTexture(GL_TEXTURE_2D, chrominanceTexture); glUniform1i(yuvConversionChrominanceTextureUniform, 5); + glUniformMatrix3fv(yuvConversionMatrixUniform, 1, GL_FALSE, _preferredConversion); + glVertexAttribPointer(yuvConversionPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); From e86a27dd92d602a2e119a428b9bd17835737323e Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 11:02:12 -0700 Subject: [PATCH 436/695] Update the view geometry on frame changes so we don't end up stretching the image if our view gets animated. --- framework/Source/iOS/GPUImageView.m | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/Source/iOS/GPUImageView.m b/framework/Source/iOS/GPUImageView.m index 483796b9e..d63491916 100755 --- a/framework/Source/iOS/GPUImageView.m +++ b/framework/Source/iOS/GPUImageView.m @@ -134,6 +134,7 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N runSynchronouslyOnVideoProcessingQueue(^{ [self destroyDisplayFramebuffer]; [self createDisplayFramebuffer]; + [self recalculateViewGeometry]; }); } } From 24d4c944ddd2fef18aaf5c4842d6fb2e20f59fa5 Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 11:03:46 -0700 Subject: [PATCH 437/695] Don't enable the audio track if it's already enabled. It can cause the system to have two AVAssetWriters for audio going at once. --- framework/Source/GPUImageOutput.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index c76516b11..0b8608e06 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -456,8 +456,10 @@ - (void)textureNoLongerNeededForTarget:(id)textureTarget; - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; { _audioEncodingTarget = newValue; - - _audioEncodingTarget.hasAudioTrack = YES; + if( ! _audioEncodingTarget.hasAudioTrack ) + { + _audioEncodingTarget.hasAudioTrack = YES; + } } @end From 003dad5c25567e64bf9e2f5389c88d6ce1e7dd9c Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 11:12:21 -0700 Subject: [PATCH 438/695] Lots going on here, but there was no logical way to separate it into smaller changes. Allowing GPUImageMovie to take an AVPlayerItem for playback as well as an AVAsset in order to allow it to play AVComposition objects. When sourcing from an AVPlayerItem, it now uses CADisplayLink to handle the timing to ensure proper A/V sync. Adding GPIImageMovieComposition specifically for reading from an AVCompostion object in non-real time. This is primarily so it can be connected to a GPUImageMovieWriter in order to render a composition to file. Lots of changes to how audio/videoInputCallback(s) are managed to make rendering to a file reliable. --- framework/GPUImage.xcodeproj/project.pbxproj | 6 + framework/Source/GPUImageMovie.h | 10 +- framework/Source/GPUImageMovie.m | 202 +++++++++++++---- framework/Source/GPUImageMovieComposition.h | 21 ++ framework/Source/GPUImageMovieComposition.m | 70 ++++++ framework/Source/iOS/GPUImageMovieWriter.h | 13 +- framework/Source/iOS/GPUImageMovieWriter.m | 222 +++++++++++++++---- 7 files changed, 453 insertions(+), 91 deletions(-) create mode 100644 framework/Source/GPUImageMovieComposition.h create mode 100644 framework/Source/GPUImageMovieComposition.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 074c8e6d6..01c145df3 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -697,6 +697,8 @@ C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorBlendFilter.m; path = Source/GPUImageColorBlendFilter.m; sourceTree = SOURCE_ROOT; }; C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueFilter.h; path = Source/GPUImageHueFilter.h; sourceTree = SOURCE_ROOT; }; C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueFilter.m; path = Source/GPUImageHueFilter.m; sourceTree = SOURCE_ROOT; }; + D443237817C81C0C00204484 /* GPUImageMovieComposition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMovieComposition.h; path = Source/GPUImageMovieComposition.h; sourceTree = SOURCE_ROOT; }; + D443237917C81C0C00204484 /* GPUImageMovieComposition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMovieComposition.m; path = Source/GPUImageMovieComposition.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -969,6 +971,8 @@ BCB5E7D914E6003400701302 /* GPUImagePicture.m */, BC982C6A14F33C290001FF6F /* GPUImageMovie.h */, BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */, + D443237817C81C0C00204484 /* GPUImageMovieComposition.h */, + D443237917C81C0C00204484 /* GPUImageMovieComposition.m */, BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */, BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */, BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */, @@ -1340,6 +1344,7 @@ BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */, 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */, BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */, + D443237A17C81C0C00204484 /* GPUImageMovieComposition.h in Headers */, BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */, BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */, BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */, @@ -1616,6 +1621,7 @@ BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */, BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */, BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */, + D443237B17C81C0C00204484 /* GPUImageMovieComposition.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index b2db12233..7952e8584 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -15,6 +15,7 @@ @interface GPUImageMovie : GPUImageOutput @property (readwrite, retain) AVAsset *asset; +@property (readwrite, retain) AVPlayerItem *playerItem; @property(readwrite, retain) NSURL *url; /** This enables the benchmarking mode, which logs out instantaneous and average frame times to the console @@ -33,15 +34,20 @@ */ @property (readwrite, nonatomic, assign) id delegate; +@property (readonly, nonatomic) AVAssetReader *assetReader; +@property (readonly, nonatomic) BOOL audioEncodingIsFinished; +@property (readonly, nonatomic) BOOL videoEncodingIsFinished; + /// @name Initialization and teardown - (id)initWithAsset:(AVAsset *)asset; +- (id)initWithPlayerItem:(AVPlayerItem *)playerItem; - (id)initWithURL:(NSURL *)url; - (void)textureCacheSetup; /// @name Movie processing - (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; -- (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; -- (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; +- (BOOL)readNextVideoFrameFromOutput:(AVAssetReaderOutput *)readerVideoTrackOutput; +- (BOOL)readNextAudioSampleFromOutput:(AVAssetReaderOutput *)readerAudioTrackOutput; - (void)startProcessing; - (void)endProcessing; - (void)cancelProcessing; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index f49f1c9db..5659fd800 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -3,12 +3,14 @@ #import "GPUImageFilter.h" #import "GPUImageVideoCamera.h" -@interface GPUImageMovie () +@interface GPUImageMovie () { BOOL audioEncodingIsFinished, videoEncodingIsFinished; GPUImageMovieWriter *synchronizedMovieWriter; CVOpenGLESTextureCacheRef coreVideoTextureCache; AVAssetReader *reader; + AVPlayerItemVideoOutput *playerItemOutput; + CADisplayLink *displayLink; CMTime previousFrameTime; CFAbsoluteTime previousActualFrameTime; BOOL keepLooping; @@ -71,6 +73,22 @@ - (id)initWithAsset:(AVAsset *)asset; return self; } +- (id)initWithPlayerItem:(AVPlayerItem *)playerItem; +{ + if (!(self = [super init])) + { + return nil; + } + + [self textureCacheSetup]; + + self.url = nil; + self.asset = nil; + self.playerItem = playerItem; + + return self; +} + - (void)textureCacheSetup; { if ([GPUImageContext supportsFastTextureUpload]) @@ -128,6 +146,10 @@ - (void)textureCacheSetup; - (void)dealloc { + runSynchronouslyOnVideoProcessingQueue(^{ + [displayLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + displayLink = nil; + }); if ([GPUImageContext supportsFastTextureUpload]) { CFRelease(coreVideoTextureCache); @@ -146,6 +168,10 @@ - (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieW - (void)startProcessing { + if( self.playerItem ) { + [self processPlayerItem]; + return; + } if(self.url == nil) { [self processAsset]; @@ -177,48 +203,69 @@ - (void)startProcessing }]; } -- (void)processAsset +- (AVAssetReader*)createAssetReader { - __unsafe_unretained GPUImageMovie *weakSelf = self; NSError *error = nil; - reader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; + AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; - NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; - [outputSettings setObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (NSString*)kCVPixelBufferPixelFormatTypeKey]; + NSDictionary *outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; - [reader addOutput:readerVideoTrackOutput]; + readerVideoTrackOutput.alwaysCopiesSampleData = NO; + [assetReader addOutput:readerVideoTrackOutput]; NSArray *audioTracks = [self.asset tracksWithMediaType:AVMediaTypeAudio]; - BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (weakSelf.audioEncodingTarget != nil) ); + BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (self.audioEncodingTarget != nil) ); AVAssetReaderTrackOutput *readerAudioTrackOutput = nil; if (shouldRecordAudioTrack) { - audioEncodingIsFinished = NO; - [self.audioEncodingTarget setShouldInvalidateAudioSampleWhenDone:YES]; // This might need to be extended to handle movies with more than one audio track AVAssetTrack* audioTrack = [audioTracks objectAtIndex:0]; readerAudioTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]; - [reader addOutput:readerAudioTrackOutput]; + readerAudioTrackOutput.alwaysCopiesSampleData = NO; + [assetReader addOutput:readerAudioTrackOutput]; + } + + return assetReader; +} + +- (void)processAsset +{ + reader = [self createAssetReader]; + + AVAssetReaderOutput *readerVideoTrackOutput = nil; + AVAssetReaderOutput *readerAudioTrackOutput = nil; + + audioEncodingIsFinished = YES; + for( AVAssetReaderOutput *output in reader.outputs ) { + if( [output.mediaType isEqualToString:AVMediaTypeAudio] ) { + audioEncodingIsFinished = NO; + readerAudioTrackOutput = output; + } + else if( [output.mediaType isEqualToString:AVMediaTypeVideo] ) { + readerVideoTrackOutput = output; + } } if ([reader startReading] == NO) { - NSLog(@"Error reading from file at URL: %@", weakSelf.url); + NSLog(@"Error reading from file at URL: %@", self.url); return; } - + + __weak GPUImageMovie *weakSelf = self; + if (synchronizedMovieWriter != nil) { [synchronizedMovieWriter setVideoInputReadyCallback:^{ - [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; + return [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; }]; [synchronizedMovieWriter setAudioInputReadyCallback:^{ - [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; + return [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; }]; [synchronizedMovieWriter enableSynchronizationCallbacks]; @@ -229,7 +276,7 @@ - (void)processAsset { [weakSelf readNextVideoFrameFromOutput:readerVideoTrackOutput]; - if ( (shouldRecordAudioTrack) && (!audioEncodingIsFinished) ) + if ( (readerAudioTrackOutput) && (!audioEncodingIsFinished) ) { [weakSelf readNextAudioSampleFromOutput:readerAudioTrackOutput]; } @@ -256,13 +303,60 @@ - (void)processAsset } } -- (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrackOutput; +- (void)processPlayerItem { - if (reader.status == AVAssetReaderStatusReading) + runSynchronouslyOnVideoProcessingQueue(^{ + displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkCallback:)]; + [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + [displayLink setPaused:YES]; + + dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; + NSDictionary *pixBuffAttributes = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; + playerItemOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pixBuffAttributes]; + [playerItemOutput setDelegate:self queue:videoProcessingQueue]; + + [_playerItem addOutput:playerItemOutput]; + [playerItemOutput requestNotificationOfMediaDataChangeWithAdvanceInterval:0.1]; + }); +} + +- (void)outputMediaDataWillChange:(AVPlayerItemOutput *)sender +{ + // Restart display link. + [displayLink setPaused:NO]; +} + +- (void)displayLinkCallback:(CADisplayLink *)sender +{ + /* + The callback gets called once every Vsync. + Using the display link's timestamp and duration we can compute the next time the screen will be refreshed, and copy the pixel buffer for that time + This pixel buffer can then be processed and later rendered on screen. + */ + // Calculate the nextVsync time which is when the screen will be refreshed next. + CFTimeInterval nextVSync = ([sender timestamp] + [sender duration]); + + CMTime outputItemTime = [playerItemOutput itemTimeForHostTime:nextVSync]; + + if ([playerItemOutput hasNewPixelBufferForItemTime:outputItemTime]) { + __weak GPUImageMovie *weakSelf = self; + CVPixelBufferRef pixelBuffer = [playerItemOutput copyPixelBufferForItemTime:outputItemTime itemTimeForDisplay:NULL]; + if( pixelBuffer ) + runSynchronouslyOnVideoProcessingQueue(^{ + [weakSelf processMovieFrame:pixelBuffer withSampleTime:outputItemTime]; + CFRelease(pixelBuffer); + }); + } +} + +- (BOOL)readNextVideoFrameFromOutput:(AVAssetReaderOutput *)readerVideoTrackOutput; +{ + if (reader.status == AVAssetReaderStatusReading && ! videoEncodingIsFinished) { CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer]; if (sampleBufferRef) { + //NSLog(@"read a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, CMSampleBufferGetOutputPresentationTimeStamp(sampleBufferRef)))); if (_playAtActualSpeed) { // Do this outside of the video processing queue to not slow that down while waiting @@ -282,50 +376,63 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac previousActualFrameTime = CFAbsoluteTimeGetCurrent(); } - __unsafe_unretained GPUImageMovie *weakSelf = self; + __weak GPUImageMovie *weakSelf = self; runSynchronouslyOnVideoProcessingQueue(^{ [weakSelf processMovieFrame:sampleBufferRef]; + CMSampleBufferInvalidate(sampleBufferRef); + CFRelease(sampleBufferRef); }); - - CMSampleBufferInvalidate(sampleBufferRef); - CFRelease(sampleBufferRef); + + return YES; } else { if (!keepLooping) { videoEncodingIsFinished = YES; - [self endProcessing]; + if( videoEncodingIsFinished && audioEncodingIsFinished ) + [self endProcessing]; } } } else if (synchronizedMovieWriter != nil) { - if (reader.status == AVAssetWriterStatusCompleted) + if (reader.status == AVAssetReaderStatusCompleted) { [self endProcessing]; } } + return NO; } -- (void)readNextAudioSampleFromOutput:(AVAssetReaderTrackOutput *)readerAudioTrackOutput; +- (BOOL)readNextAudioSampleFromOutput:(AVAssetReaderOutput *)readerAudioTrackOutput; { - if (audioEncodingIsFinished) + if (reader.status == AVAssetReaderStatusReading && ! audioEncodingIsFinished) { - return; - } - - CMSampleBufferRef audioSampleBufferRef = [readerAudioTrackOutput copyNextSampleBuffer]; - - if (audioSampleBufferRef) - { - [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; - - CFRelease(audioSampleBufferRef); + CMSampleBufferRef audioSampleBufferRef = [readerAudioTrackOutput copyNextSampleBuffer]; + if (audioSampleBufferRef) + { + //NSLog(@"read an audio frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, CMSampleBufferGetOutputPresentationTimeStamp(audioSampleBufferRef)))); + [self.audioEncodingTarget processAudioBuffer:audioSampleBufferRef]; + CFRelease(audioSampleBufferRef); + return YES; + } + else + { + if (!keepLooping) { + audioEncodingIsFinished = YES; + if( videoEncodingIsFinished && audioEncodingIsFinished ) + [self endProcessing]; + } + } } - else + else if (synchronizedMovieWriter != nil) { - audioEncodingIsFinished = YES; + if (reader.status == AVAssetReaderStatusCompleted) + { + [self endProcessing]; + } } + return NO; } - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; @@ -516,7 +623,8 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu - (void)endProcessing; { keepLooping = NO; - + [displayLink setPaused:YES]; + for (id currentTarget in targets) { [currentTarget endProcessing]; @@ -524,8 +632,8 @@ - (void)endProcessing; if (synchronizedMovieWriter != nil) { - [synchronizedMovieWriter setVideoInputReadyCallback:^{}]; - [synchronizedMovieWriter setAudioInputReadyCallback:^{}]; + [synchronizedMovieWriter setVideoInputReadyCallback:^{return NO;}]; + [synchronizedMovieWriter setAudioInputReadyCallback:^{return NO;}]; } } @@ -626,4 +734,16 @@ - (void)destroyYUVConversionFBO; }); } +- (AVAssetReader*)assetReader { + return reader; +} + +- (BOOL)audioEncodingIsFinished { + return audioEncodingIsFinished; +} + +- (BOOL)videoEncodingIsFinished { + return videoEncodingIsFinished; +} + @end diff --git a/framework/Source/GPUImageMovieComposition.h b/framework/Source/GPUImageMovieComposition.h new file mode 100644 index 000000000..00e438145 --- /dev/null +++ b/framework/Source/GPUImageMovieComposition.h @@ -0,0 +1,21 @@ +// +// GPUImageMovieComposition.h +// Givit +// +// Created by Sean Meiners on 2013/01/25. +// +// + +#import "GPUImageMovie.h" + +@interface GPUImageMovieComposition : GPUImageMovie + +@property (readwrite, retain) AVComposition *compositon; +@property (readwrite, retain) AVVideoComposition *videoComposition; +@property (readwrite, retain) AVAudioMix *audioMix; + +- (id)initWithComposition:(AVComposition*)compositon + andVideoComposition:(AVVideoComposition*)videoComposition + andAudioMix:(AVAudioMix*)audioMix; + +@end diff --git a/framework/Source/GPUImageMovieComposition.m b/framework/Source/GPUImageMovieComposition.m new file mode 100644 index 000000000..c71f7e1d7 --- /dev/null +++ b/framework/Source/GPUImageMovieComposition.m @@ -0,0 +1,70 @@ +// +// GPUImageMovieComposition.m +// Givit +// +// Created by Sean Meiners on 2013/01/25. +// +// + +#import "GPUImageMovieComposition.h" +#import "GPUImageMovieWriter.h" + +@implementation GPUImageMovieComposition + +@synthesize compositon = _compositon; +@synthesize videoComposition = _videoComposition; +@synthesize audioMix = _audioMix; + +- (id)initWithComposition:(AVComposition*)compositon + andVideoComposition:(AVVideoComposition*)videoComposition + andAudioMix:(AVAudioMix*)audioMix { + if (!(self = [super init])) + { + return nil; + } + + [self textureCacheSetup]; + + self.compositon = compositon; + self.videoComposition = videoComposition; + self.audioMix = audioMix; + + return self; +} + +- (AVAssetReader*)createAssetReader + { + //NSLog(@"creating reader from composition: %@, video: %@, audio: %@ with duration: %@", _compositon, _videoComposition, _audioMix, CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, _compositon.duration))); + + NSError *error = nil; + AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:self.compositon error:&error]; + + NSDictionary *outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; + AVAssetReaderVideoCompositionOutput *readerVideoOutput = [AVAssetReaderVideoCompositionOutput assetReaderVideoCompositionOutputWithVideoTracks:[_compositon tracksWithMediaType:AVMediaTypeVideo] + videoSettings:outputSettings]; +#if ! TARGET_IPHONE_SIMULATOR + if( [_videoComposition isKindOfClass:[AVMutableVideoComposition class]] ) + [(AVMutableVideoComposition*)_videoComposition setRenderScale:1.0]; +#endif + readerVideoOutput.videoComposition = self.videoComposition; + readerVideoOutput.alwaysCopiesSampleData = NO; + [assetReader addOutput:readerVideoOutput]; + + NSArray *audioTracks = [_compositon tracksWithMediaType:AVMediaTypeAudio]; + BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (self.audioEncodingTarget != nil) ); + AVAssetReaderAudioMixOutput *readerAudioOutput = nil; + + if (shouldRecordAudioTrack) + { + [self.audioEncodingTarget setShouldInvalidateAudioSampleWhenDone:YES]; + + readerAudioOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings:nil]; + readerAudioOutput.audioMix = self.audioMix; + readerAudioOutput.alwaysCopiesSampleData = NO; + [assetReader addOutput:readerAudioOutput]; + } + + return assetReader; +} + +@end diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index d3a209be2..7368570c2 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -14,9 +14,6 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; @interface GPUImageMovieWriter : NSObject { - CMVideoDimensions videoDimensions; - CMVideoCodecType videoType; - BOOL alreadyFinishedRecording; NSURL *movieURL; @@ -44,13 +41,17 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; @property(nonatomic, copy) void(^failureBlock)(NSError*); @property(nonatomic, assign) id delegate; @property(readwrite, nonatomic) BOOL encodingLiveVideo; -@property(nonatomic, copy) void(^videoInputReadyCallback)(void); -@property(nonatomic, copy) void(^audioInputReadyCallback)(void); +@property(nonatomic, copy) BOOL(^videoInputReadyCallback)(void); +@property(nonatomic, copy) BOOL(^audioInputReadyCallback)(void); @property(nonatomic) BOOL enabled; +@property(nonatomic, readonly) AVAssetWriter *assetWriter; +@property(nonatomic, readonly) CMTime duration; +@property(nonatomic, assign) CGAffineTransform transform; +@property(nonatomic, copy) NSArray *metaData; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; -- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; +- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSDictionary *)outputSettings; - (void)setHasAudioTrack:(BOOL)hasAudioTrack audioSettings:(NSDictionary *)audioOutputSettings; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index ca37fa22d..0f95cc113 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -27,10 +27,11 @@ @interface GPUImageMovieWriter () GLuint inputTextureForMovieRendering; - GLubyte *frameData; - - CMTime startTime, previousFrameTime; - + CMTime startTime, previousFrameTime, previousAudioTime; + + dispatch_queue_t audioQueue, videoQueue; + BOOL audioEncodingIsFinished, videoEncodingIsFinished; + BOOL isRecording; } @@ -79,6 +80,8 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr self.enabled = YES; alreadyFinishedRecording = NO; + videoEncodingIsFinished = NO; + audioEncodingIsFinished = NO; movieWritingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.movieWritingQueue", NULL); @@ -86,8 +89,9 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr movieURL = newMovieURL; fileType = newFileType; startTime = kCMTimeInvalid; - _encodingLiveVideo = YES; + _encodingLiveVideo = [[outputSettings objectForKey:@"EncodingLiveVideo"] isKindOfClass:[NSNumber class]] ? [[outputSettings objectForKey:@"EncodingLiveVideo"] boolValue] : YES; previousFrameTime = kCMTimeNegativeInfinity; + previousAudioTime = kCMTimeNegativeInfinity; inputRotation = kGPUImageNoRotation; runSynchronouslyOnVideoProcessingQueue(^{ @@ -140,30 +144,30 @@ - (void)dealloc; { [self destroyDataFBO]; - if (frameData != NULL) - { - free(frameData); - } - #if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (movieWritingQueue != NULL) { dispatch_release(movieWritingQueue); } + if( audioQueue != NULL ) + { + dispatch_release(audioQueue); + } + if( videoQueue != NULL ) + { + dispatch_release(videoQueue); + } #endif } #pragma mark - #pragma mark Movie recording -- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; +- (void)initializeMovieWithOutputSettings:(NSDictionary *)outputSettings; { isRecording = NO; self.enabled = YES; - frameData = (GLubyte *) malloc((int)videoSize.width * (int)videoSize.height * 4); - -// frameData = (GLubyte *) calloc(videoSize.width * videoSize.height * 4, sizeof(GLubyte)); NSError *error = nil; assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:fileType error:&error]; if (error != nil) @@ -188,10 +192,11 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; // use default output settings if none specified if (outputSettings == nil) { - outputSettings = [[NSMutableDictionary alloc] init]; - [outputSettings setObject:AVVideoCodecH264 forKey:AVVideoCodecKey]; - [outputSettings setObject:[NSNumber numberWithInt:videoSize.width] forKey:AVVideoWidthKey]; - [outputSettings setObject:[NSNumber numberWithInt:videoSize.height] forKey:AVVideoHeightKey]; + NSMutableDictionary *settings = [[NSMutableDictionary alloc] init]; + [settings setObject:AVVideoCodecH264 forKey:AVVideoCodecKey]; + [settings setObject:[NSNumber numberWithInt:videoSize.width] forKey:AVVideoWidthKey]; + [settings setObject:[NSNumber numberWithInt:videoSize.height] forKey:AVVideoHeightKey]; + outputSettings = settings; } // custom output settings specified else @@ -201,6 +206,12 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; NSNumber *height = [outputSettings objectForKey:AVVideoHeightKey]; NSAssert(videoCodec && width && height, @"OutputSettings is missing required parameters."); + + if( [outputSettings objectForKey:@"EncodingLiveVideo"] ) { + NSMutableDictionary *tmp = [outputSettings mutableCopy]; + [tmp removeObjectForKey:@"EncodingLiveVideo"]; + outputSettings = tmp; + } } /* @@ -247,8 +258,12 @@ - (void)startRecording; alreadyFinishedRecording = NO; isRecording = YES; startTime = kCMTimeInvalid; - // [assetWriter startWriting]; - + dispatch_sync(movieWritingQueue, ^{ + if (audioInputReadyCallback == NULL) + { + [assetWriter startWriting]; + } + }); // [assetWriter startSessionAtSourceTime:kCMTimeZero]; } @@ -270,8 +285,16 @@ - (void)cancelRecording; dispatch_sync(movieWritingQueue, ^{ alreadyFinishedRecording = YES; - [assetWriterVideoInput markAsFinished]; - [assetWriterAudioInput markAsFinished]; + if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) + { + videoEncodingIsFinished = YES; + [assetWriterVideoInput markAsFinished]; + } + if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) + { + audioEncodingIsFinished = YES; + [assetWriterAudioInput markAsFinished]; + } [assetWriter cancelWriting]; }); } @@ -292,8 +315,16 @@ - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; isRecording = NO; dispatch_sync(movieWritingQueue, ^{ - [assetWriterVideoInput markAsFinished]; - [assetWriterAudioInput markAsFinished]; + if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) + { + videoEncodingIsFinished = YES; + [assetWriterVideoInput markAsFinished]; + } + if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) + { + audioEncodingIsFinished = YES; + [assetWriterAudioInput markAsFinished]; + } #if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) // Not iOS 6 SDK [assetWriter finishWriting]; @@ -342,22 +373,49 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; }); } - if (!assetWriterAudioInput.readyForMoreMediaData) + if (!assetWriterAudioInput.readyForMoreMediaData && _encodingLiveVideo) { - NSLog(@"Had to drop an audio frame"); + NSLog(@"1: Had to drop an audio frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); + if (_shouldInvalidateAudioSampleWhenDone) + { + CMSampleBufferInvalidate(audioBuffer); + } + CFRelease(audioBuffer); return; } + + previousAudioTime = currentSampleTime; // NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); - dispatch_async(movieWritingQueue, ^{ - [assetWriterAudioInput appendSampleBuffer:audioBuffer]; - + void(^write)() = ^() { + while( ! assetWriterAudioInput.readyForMoreMediaData && ! _encodingLiveVideo ) { + NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.5]; + //NSLog(@"audio waiting..."); + [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; + } + if (!assetWriterAudioInput.readyForMoreMediaData) + { + NSLog(@"2: Had to drop an audio frame %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); + } + else if( ! [assetWriterAudioInput appendSampleBuffer:audioBuffer] ) + { + NSLog(@"Problem appending audio buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); + } + else + { + //NSLog(@"Wrote an audio frame %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); + } + if (_shouldInvalidateAudioSampleWhenDone) { CMSampleBufferInvalidate(audioBuffer); } CFRelease(audioBuffer); - }); + }; + if( _encodingLiveVideo ) + dispatch_async(movieWritingQueue, write); + else + write(); } } @@ -365,13 +423,50 @@ - (void)enableSynchronizationCallbacks; { if (videoInputReadyCallback != NULL) { - [assetWriter startWriting]; - [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:[GPUImageContext sharedContextQueue] usingBlock:videoInputReadyCallback]; + if( assetWriter.status != AVAssetWriterStatusWriting ) + { + [assetWriter startWriting]; + } + videoQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.videoReadingQueue", NULL); + [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:videoQueue usingBlock:^{ + //NSLog(@"video requestMediaDataWhenReadyOnQueue begin"); + while( assetWriterVideoInput.readyForMoreMediaData ) + { + if( ! videoInputReadyCallback() && ! videoEncodingIsFinished ) + { + dispatch_async(movieWritingQueue, ^{ + if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) + { + videoEncodingIsFinished = YES; + [assetWriterVideoInput markAsFinished]; + } + }); + } + } + //NSLog(@"video requestMediaDataWhenReadyOnQueue end"); + }]; } if (audioInputReadyCallback != NULL) { - [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:[GPUImageContext sharedContextQueue] usingBlock:audioInputReadyCallback]; + audioQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioReadingQueue", NULL); + [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:audioQueue usingBlock:^{ + //NSLog(@"audio requestMediaDataWhenReadyOnQueue begin"); + while( assetWriterAudioInput.readyForMoreMediaData ) + { + if( ! audioInputReadyCallback() && ! audioEncodingIsFinished ) + { + dispatch_async(movieWritingQueue, ^{ + if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) + { + audioEncodingIsFinished = YES; + [assetWriterAudioInput markAsFinished]; + } + }); + } + } + //NSLog(@"audio requestMediaDataWhenReadyOnQueue end"); + }]; } } @@ -550,9 +645,9 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; }); } - if (!assetWriterVideoInput.readyForMoreMediaData) + if (!assetWriterVideoInput.readyForMoreMediaData && _encodingLiveVideo) { - NSLog(@"Had to drop a video frame"); + NSLog(@"1: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); return; } @@ -572,6 +667,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &pixel_buffer); if ((pixel_buffer == NULL) || (status != kCVReturnSuccess)) { + CVPixelBufferRelease(pixel_buffer); return; } else @@ -582,15 +678,24 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glReadPixels(0, 0, videoSize.width, videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufferData); } } - - dispatch_sync(movieWritingQueue, ^{ - if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) + + void(^write)() = ^() { + while( ! assetWriterVideoInput.readyForMoreMediaData && ! _encodingLiveVideo ) { + NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.1]; + //NSLog(@"video waiting..."); + [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; + } + if (!assetWriterVideoInput.readyForMoreMediaData) { - NSLog(@"Problem appending pixel buffer at time: %lld", frameTime.value); + NSLog(@"2: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); + } + else if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) + { + NSLog(@"Problem appending pixel buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); } else { - // NSLog(@"Recorded video sample time: %lld, %d, %lld", frameTime.value, frameTime.timescale, frameTime.epoch); + //NSLog(@"Wrote a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); } CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); @@ -600,8 +705,12 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { CVPixelBufferRelease(pixel_buffer); } - }); - + }; + + if( _encodingLiveVideo ) + dispatch_async(movieWritingQueue, write); + else + write(); } - (NSInteger)nextAvailableTextureIndex; @@ -731,5 +840,34 @@ - (void)setHasAudioTrack:(BOOL)newValue audioSettings:(NSDictionary *)audioOutpu } } +- (NSArray*)metaData { + return assetWriter.metadata; +} + +- (void)setMetaData:(NSArray*)metaData { + assetWriter.metadata = metaData; +} + +- (CMTime)duration { + if( ! CMTIME_IS_VALID(startTime) ) + return kCMTimeZero; + if( ! CMTIME_IS_NEGATIVE_INFINITY(previousFrameTime) ) + return CMTimeSubtract(previousFrameTime, startTime); + if( ! CMTIME_IS_NEGATIVE_INFINITY(previousAudioTime) ) + return CMTimeSubtract(previousAudioTime, startTime); + return kCMTimeZero; +} + +- (CGAffineTransform)transform { + return assetWriterVideoInput.transform; +} + +- (void)setTransform:(CGAffineTransform)transform { + assetWriterVideoInput.transform = transform; +} + +- (AVAssetWriter*)assetWriter { + return assetWriter; +} @end From b0ee10f319d9bea8963fa69129cf5570520854fb Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Thu, 5 Sep 2013 11:13:18 -0700 Subject: [PATCH 439/695] Moving target to iOS 6 so weak references will work as expected. --- framework/GPUImage.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 01c145df3..e1f684d0a 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1695,7 +1695,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -1719,7 +1719,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SYMROOT = "$(PROJECT_DIR)/../build"; From db8d81623cbc921c3027af956d956ad47db9e222 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 5 Sep 2013 19:13:36 -0600 Subject: [PATCH 440/695] Notify delegate that play has finished in more cases --- framework/Source/GPUImageMovie.m | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 79576fd0f..e9f14fe4f 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -200,9 +200,7 @@ - (void)processAsset }); } else { [weakSelf endProcessing]; - if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { - [self.delegate didCompletePlayingMovie]; - } + [weakSelf notifyDelegate]; } } @@ -248,6 +246,7 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac if (!keepLooping) { videoEncodingIsFinished = YES; [self endProcessing]; + [self notifyDelegate]; } } } @@ -256,6 +255,7 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac if (reader.status == AVAssetWriterStatusCompleted) { [self endProcessing]; + [self notifyDelegate]; } } } @@ -407,6 +407,14 @@ - (void)cancelProcessing [reader cancelReading]; } [self endProcessing]; + [self notifyDelegate]; +} + +- (void) notifyDelegate +{ + if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { + [self.delegate didCompletePlayingMovie]; + } } @end From 6c6a0f3062b5f954efb08f7450b5c5c9eb05da3b Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Thu, 5 Sep 2013 19:21:25 -0600 Subject: [PATCH 441/695] Change delegate to call back in end processing --- framework/Source/GPUImageMovie.m | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index e9f14fe4f..cd714c901 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -200,7 +200,6 @@ - (void)processAsset }); } else { [weakSelf endProcessing]; - [weakSelf notifyDelegate]; } } @@ -246,7 +245,6 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac if (!keepLooping) { videoEncodingIsFinished = YES; [self endProcessing]; - [self notifyDelegate]; } } } @@ -255,7 +253,6 @@ - (void)readNextVideoFrameFromOutput:(AVAssetReaderTrackOutput *)readerVideoTrac if (reader.status == AVAssetWriterStatusCompleted) { [self endProcessing]; - [self notifyDelegate]; } } } @@ -399,6 +396,11 @@ - (void)endProcessing; [synchronizedMovieWriter setVideoInputReadyCallback:^{}]; [synchronizedMovieWriter setAudioInputReadyCallback:^{}]; } + + if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { + [self.delegate didCompletePlayingMovie]; + } + self.delegate = nil; } - (void)cancelProcessing @@ -407,14 +409,6 @@ - (void)cancelProcessing [reader cancelReading]; } [self endProcessing]; - [self notifyDelegate]; -} - -- (void) notifyDelegate -{ - if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { - [self.delegate didCompletePlayingMovie]; - } } @end From c4e9452c41a473e9f9fcc2b2873221bea2e3bf68 Mon Sep 17 00:00:00 2001 From: Luka Mirosevic Date: Fri, 6 Sep 2013 07:44:22 +0200 Subject: [PATCH 442/695] Fixes issue when building documentation with spaces in the project directory path. --- framework/GPUImage.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 2c3895d69..f7c1707d8 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1434,7 +1434,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n${APPLEDOC_PATH} \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n--logformat xcode \\\n${SOURCE_ROOT}"; + shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n\"${APPLEDOC_PATH}\" \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n--logformat xcode \\\n\"${SOURCE_ROOT}\""; }; BCF1A34214DDB1EC00852800 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; From a121ecc310e245d89a53270b365b275b041b6a3b Mon Sep 17 00:00:00 2001 From: Sean Meiners Date: Fri, 6 Sep 2013 11:29:23 -0700 Subject: [PATCH 443/695] Allowing the movie writer to be paused when in callback sync mode. This is primarily useful when the app is going to the background and you're rendering in non-real-time. Fixing an issue where the write loop would keep retrying even when the writer had been canceled. --- framework/Source/iOS/GPUImageMovieWriter.h | 1 + framework/Source/iOS/GPUImageMovieWriter.m | 23 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index 7368570c2..9662146ac 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -48,6 +48,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; @property(nonatomic, readonly) CMTime duration; @property(nonatomic, assign) CGAffineTransform transform; @property(nonatomic, copy) NSArray *metaData; +@property(nonatomic, assign, getter = isPaused) BOOL paused; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 0f95cc113..4d749dd53 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -58,6 +58,7 @@ @implementation GPUImageMovieWriter @synthesize audioInputReadyCallback; @synthesize enabled; @synthesize shouldInvalidateAudioSampleWhenDone = _shouldInvalidateAudioSampleWhenDone; +@synthesize paused = _paused; @synthesize delegate = _delegate; @@ -388,7 +389,7 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; // NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); void(^write)() = ^() { - while( ! assetWriterAudioInput.readyForMoreMediaData && ! _encodingLiveVideo ) { + while( ! assetWriterAudioInput.readyForMoreMediaData && ! _encodingLiveVideo && ! audioEncodingIsFinished ) { NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.5]; //NSLog(@"audio waiting..."); [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; @@ -429,8 +430,15 @@ - (void)enableSynchronizationCallbacks; } videoQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.videoReadingQueue", NULL); [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:videoQueue usingBlock:^{ + if( _paused ) + { + //NSLog(@"video requestMediaDataWhenReadyOnQueue paused"); + // if we don't sleep, we'll get called back almost immediately, chewing up CPU + usleep(10000); + return; + } //NSLog(@"video requestMediaDataWhenReadyOnQueue begin"); - while( assetWriterVideoInput.readyForMoreMediaData ) + while( assetWriterVideoInput.readyForMoreMediaData && ! _paused ) { if( ! videoInputReadyCallback() && ! videoEncodingIsFinished ) { @@ -451,8 +459,15 @@ - (void)enableSynchronizationCallbacks; { audioQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioReadingQueue", NULL); [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:audioQueue usingBlock:^{ + if( _paused ) + { + //NSLog(@"audio requestMediaDataWhenReadyOnQueue paused"); + // if we don't sleep, we'll get called back almost immediately, chewing up CPU + usleep(10000); + return; + } //NSLog(@"audio requestMediaDataWhenReadyOnQueue begin"); - while( assetWriterAudioInput.readyForMoreMediaData ) + while( assetWriterAudioInput.readyForMoreMediaData && ! _paused ) { if( ! audioInputReadyCallback() && ! audioEncodingIsFinished ) { @@ -680,7 +695,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } void(^write)() = ^() { - while( ! assetWriterVideoInput.readyForMoreMediaData && ! _encodingLiveVideo ) { + while( ! assetWriterVideoInput.readyForMoreMediaData && ! _encodingLiveVideo && ! videoEncodingIsFinished ) { NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.1]; //NSLog(@"video waiting..."); [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; From 1af8e98dc2095e379471b884495f263064c1b7e6 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sat, 7 Sep 2013 14:33:28 +1200 Subject: [PATCH 444/695] GPUImageVideoCamera: Add -(BOOL)addAudioInputsAndOutputs and -(BOOL)removeAudioInputsAndOutputs to manage audio inputs independent of audioEncodingTarget Previously if you add or change the audioEncodingTarget the inputs are recreated, which triggers a pause in the app. --- framework/Source/GPUImageVideoCamera.h | 11 +++ framework/Source/GPUImageVideoCamera.m | 95 +++++++++++++++----------- 2 files changed, 67 insertions(+), 39 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 879c3f8a5..379f3e58f 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -79,6 +79,17 @@ */ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureDevicePosition)cameraPosition; +/** Add audio capture to the session. Adding inputs and outputs freezes the capture session momentarily, so you + can use this method to add the audio inputs and outputs early, if you're going to set the audioEncodingTarget + later. Returns YES is the audio inputs and outputs were added, or NO if they had already been added. + */ +- (BOOL)addAudioInputsAndOutputs; + +/** Remove the audio capture inputs and outputs from this session. Returns YES if the audio inputs and outputs + were removed, or NO is they hadn't already been added. + */ +- (BOOL)removeAudioInputsAndOutputs; + /** Tear down the capture session */ - (void)removeInputsAndOutputs; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 496e670dd..6fdd82495 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -84,6 +84,8 @@ @interface GPUImageVideoCamera () GLuint yuvConversionFramebuffer; int imageBufferWidth, imageBufferHeight; + + BOOL addedAudioInputsDueToEncodingTarget; } - (void)updateOrientationSendToTargets; @@ -312,6 +314,50 @@ - (void)dealloc } } +- (BOOL)addAudioInputsAndOutputs +{ + if (audioOutput) + return NO; + + [_captureSession beginConfiguration]; + + _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; + audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; + if ([_captureSession canAddInput:audioInput]) + { + [_captureSession addInput:audioInput]; + } + audioOutput = [[AVCaptureAudioDataOutput alloc] init]; + + if ([_captureSession canAddOutput:audioOutput]) + { + [_captureSession addOutput:audioOutput]; + } + else + { + NSLog(@"Couldn't add audio output"); + } + [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; + + [_captureSession commitConfiguration]; + return YES; +} + +- (BOOL)removeAudioInputsAndOutputs +{ + if (!audioOutput) + return NO; + + [_captureSession beginConfiguration]; + [_captureSession removeInput:audioInput]; + [_captureSession removeOutput:audioOutput]; + audioInput = nil; + audioOutput = nil; + _microphone = nil; + [_captureSession commitConfiguration]; + return YES; +} + - (void)removeInputsAndOutputs; { [_captureSession removeInput:videoInput]; @@ -860,45 +906,16 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; { - runSynchronouslyOnVideoProcessingQueue(^{ - [_captureSession beginConfiguration]; - - if (newValue == nil) - { - if (audioOutput) - { - [_captureSession removeInput:audioInput]; - [_captureSession removeOutput:audioOutput]; - audioInput = nil; - audioOutput = nil; - _microphone = nil; - } - } - else - { - _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; - audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; - if ([_captureSession canAddInput:audioInput]) - { - [_captureSession addInput:audioInput]; - } - audioOutput = [[AVCaptureAudioDataOutput alloc] init]; - - if ([_captureSession canAddOutput:audioOutput]) - { - [_captureSession addOutput:audioOutput]; - } - else - { - NSLog(@"Couldn't add audio output"); - } - [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; - } - - [_captureSession commitConfiguration]; - - [super setAudioEncodingTarget:newValue]; - }); + if (newValue) { + /* Add audio inputs and outputs, if necessary */ + addedAudioInputsDueToEncodingTarget |= [self addAudioInputsAndOutputs]; + } else if (addedAudioInputsDueToEncodingTarget) { + /* Remove audio inputs and outputs, if they were added by previously setting the audio encoding target */ + [self removeAudioInputsAndOutputs]; + addedAudioInputsDueToEncodingTarget = NO; + } + + [super setAudioEncodingTarget:newValue]; } - (void)updateOrientationSendToTargets; From 949def062836a3801ddce97e0b3f03296bbd2e60 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sat, 7 Sep 2013 14:34:51 +1200 Subject: [PATCH 445/695] GPUImageVideoCamera: begin & commit configuration when removing inputs and outputs --- framework/Source/GPUImageVideoCamera.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 6fdd82495..398896424 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -360,6 +360,7 @@ - (BOOL)removeAudioInputsAndOutputs - (void)removeInputsAndOutputs; { + [_captureSession beginConfiguration]; [_captureSession removeInput:videoInput]; [_captureSession removeOutput:videoOutput]; if (_microphone != nil) @@ -367,6 +368,7 @@ - (void)removeInputsAndOutputs; [_captureSession removeInput:audioInput]; [_captureSession removeOutput:audioOutput]; } + [_captureSession commitConfiguration]; } #pragma mark - From bbcd306e1e2c6cbaae79265fa854d322295a144f Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sat, 7 Sep 2013 14:39:53 +1200 Subject: [PATCH 446/695] GPUImageVideoCamera: nil ivars are removing inputs and outputs --- framework/Source/GPUImageVideoCamera.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 398896424..4878855a6 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -361,12 +361,19 @@ - (BOOL)removeAudioInputsAndOutputs - (void)removeInputsAndOutputs; { [_captureSession beginConfiguration]; - [_captureSession removeInput:videoInput]; - [_captureSession removeOutput:videoOutput]; + if (videoInput) { + [_captureSession removeInput:videoInput]; + [_captureSession removeOutput:videoOutput]; + videoInput = nil; + videoOutput = nil; + } if (_microphone != nil) { [_captureSession removeInput:audioInput]; [_captureSession removeOutput:audioOutput]; + audioInput = nil; + audioOutput = nil; + _microphone = nil; } [_captureSession commitConfiguration]; } From 1c360d43c9435995155e117e9ed5a943a98a062a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 7 Sep 2013 21:39:13 -0500 Subject: [PATCH 447/695] Reset framework minimum deployment target to 4.0 from 6.0. --- framework/GPUImage.xcodeproj/project.pbxproj | 4 ++-- framework/Source/GPUImageMovie.m | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 83c84f03e..7a90590a1 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1695,7 +1695,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 4.0; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -1719,7 +1719,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 4.0; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SYMROOT = "$(PROJECT_DIR)/../build"; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index d334ee3f8..7ca4b30b5 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -256,7 +256,7 @@ - (void)processAsset return; } - __weak GPUImageMovie *weakSelf = self; + __unsafe_unretained GPUImageMovie *weakSelf = self; if (synchronizedMovieWriter != nil) { @@ -336,7 +336,7 @@ - (void)displayLinkCallback:(CADisplayLink *)sender CMTime outputItemTime = [playerItemOutput itemTimeForHostTime:nextVSync]; if ([playerItemOutput hasNewPixelBufferForItemTime:outputItemTime]) { - __weak GPUImageMovie *weakSelf = self; + __unsafe_unretained GPUImageMovie *weakSelf = self; CVPixelBufferRef pixelBuffer = [playerItemOutput copyPixelBufferForItemTime:outputItemTime itemTimeForDisplay:NULL]; if( pixelBuffer ) runSynchronouslyOnVideoProcessingQueue(^{ @@ -373,7 +373,7 @@ - (BOOL)readNextVideoFrameFromOutput:(AVAssetReaderOutput *)readerVideoTrackOutp previousActualFrameTime = CFAbsoluteTimeGetCurrent(); } - __weak GPUImageMovie *weakSelf = self; + __unsafe_unretained GPUImageMovie *weakSelf = self; runSynchronouslyOnVideoProcessingQueue(^{ [weakSelf processMovieFrame:sampleBufferRef]; CMSampleBufferInvalidate(sampleBufferRef); From 961c103420cb2b4ca115eaecd9e442e38a5cbfe4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 9 Sep 2013 14:42:22 -0500 Subject: [PATCH 448/695] Removed -prepareForImageCapture from the imageByFilterinfImage convenience method, because of how people were misusing this. --- framework/Source/GPUImageFilter.m | 2 -- framework/Source/GPUImageOutput.m | 2 -- 2 files changed, 4 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 2f6408997..e76b2d16b 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -252,8 +252,6 @@ - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation { GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; - [self prepareForImageCapture]; - [stillImageSource addTarget:self]; [stillImageSource processImage]; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 0b8608e06..21a15872f 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -289,8 +289,6 @@ - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation { GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; - [self prepareForImageCapture]; - [stillImageSource addTarget:(id)self]; [stillImageSource processImage]; From b47cc28a171a3504e93ee500f299930eeac0eed4 Mon Sep 17 00:00:00 2001 From: Pierre Rothmaler Date: Tue, 10 Sep 2013 13:55:31 +0200 Subject: [PATCH 449/695] moved header file back into project scope --- framework/GPUImage.xcodeproj/project.pbxproj | 320 +++++++++---------- 1 file changed, 160 insertions(+), 160 deletions(-) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 7a90590a1..c05f47d1e 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -21,196 +21,196 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; }; 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; - 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4308B1D715F7EED30014437A /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; }; 4308B1D815F7EED30014437A /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */; }; - 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4686952F155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; }; 46869530155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; - 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 46A8097816B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; }; 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097716B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m */; }; - 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6D13DBE6151AA804000B23BA /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; }; 6D13DBE7151AA804000B23BA /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; - 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6EE27493150E8FC60040DDB6 /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; }; 6EE27494150E8FC60040DDB6 /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */; }; - 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83AE9F981540DFE500F7FC13 /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; }; 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; - 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; }; 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; - 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; }; 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */; }; - 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; }; 96781B3515C39E80005FA0D7 /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */; }; - 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96781B4615C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; }; 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; - 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; }; 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; - B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; }; B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */; }; - B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; }; B80171FF16312800001C8D16 /* GPUImageSaturationBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */; }; - B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; }; B801723016313151001C8D16 /* GPUImageLuminosityBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */; }; - B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B81521A214F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; }; B81521A314F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; - B81F2D751788C95500118374 /* GPUImageHSBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81F2D731788C95500118374 /* GPUImageHSBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B81F2D751788C95500118374 /* GPUImageHSBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81F2D731788C95500118374 /* GPUImageHSBFilter.h */; }; B81F2D761788C95500118374 /* GPUImageHSBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81F2D741788C95500118374 /* GPUImageHSBFilter.m */; }; - B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; }; B8EF4E96162F85850036E5B3 /* GPUImageLevelsFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */; }; - BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0147E415BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; }; BC0147E515BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */; }; - BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC01E82D155CA3F1004C75C3 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; }; BC01E82E155CA3F1004C75C3 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */; }; - BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC01E832155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; }; BC01E833155CA5E2004C75C3 /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */; }; - BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690B8157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; }; BC0690B9157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */; }; - BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690BD157C1B38009274F9 /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; }; BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */; }; - BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690C1157C2368009274F9 /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; }; BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */; }; - BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690D0157C2EBA009274F9 /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; }; BC0690D1157C2EBA009274F9 /* GPUImageRGBDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690CF157C2EBA009274F9 /* GPUImageRGBDilationFilter.m */; }; - BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690D5157C31C9009274F9 /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; }; BC0690D6157C31C9009274F9 /* GPUImageRGBErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D4157C31C9009274F9 /* GPUImageRGBErosionFilter.m */; }; - BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690D9157C33B9009274F9 /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; }; BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D8157C33B8009274F9 /* GPUImageRGBOpeningFilter.m */; }; - BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690DD157C344D009274F9 /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; }; BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */; }; - BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC0690F7157C5075009274F9 /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; }; BC0690F8157C5075009274F9 /* GPUImageColorPackingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690F6157C5075009274F9 /* GPUImageColorPackingFilter.m */; }; - BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC114898155AF65400F107AF /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; }; BC114899155AF65400F107AF /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; - BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; }; BC185E7B16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7916B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m */; }; - BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC185E7E16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; }; BC185E7F16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7D16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m */; }; - BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC185E8216B866F000EA01AD /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; }; BC185E8316B866F000EA01AD /* GPUImagePixellatePositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E8116B866F000EA01AD /* GPUImagePixellatePositionFilter.m */; }; BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; - BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; }; + BC1B715714F49DAA00ACA2AB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; }; BC1B715814F49DAA00ACA2AB /* GPUImageRawDataOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B715614F49DAA00ACA2AB /* GPUImageRawDataOutput.m */; }; - BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1B717C14F566E200ACA2AB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; }; BC1B717D14F566E200ACA2AB /* GPUImageSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */; }; - BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1B718E14F56C1D00ACA2AB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; }; BC1B718F14F56C1D00ACA2AB /* GPUImageSwirlFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B718D14F56C1D00ACA2AB /* GPUImageSwirlFilter.m */; }; - BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; }; BC1B728214FB16AF00ACA2AB /* GPUImageMovieWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */; }; - BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; }; BC245DCB14DDBED7009FE7EB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; - BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC27A3CB15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; }; BC27A3CC15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */; }; - BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC3AC8B015E6F6170065144E /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; }; BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */; }; - BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC4D03CF160919AE00F64358 /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; }; BC4D03D0160919AE00F64358 /* GPUImageHalftoneFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4D03CE160919AE00F64358 /* GPUImageHalftoneFilter.m */; }; - BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC54D563151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; }; BC54D564151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; - BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; }; BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D8291579779700CC9C1E /* GPUImageUIElement.m */; }; - BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC56D84A157ADA4F00CC9C1E /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; }; BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */; }; - BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; }; BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */; }; - BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */; }; BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */; }; - BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; - BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; }; BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */; }; - BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; }; BC7CC63615605A3500468085 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */; }; - BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC7CC69C1562C4BB00468085 /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; }; BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */; }; - BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; - BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; }; BC95C4091622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */; }; - BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; BC982B5414F07F790001FF6F /* GPUImageColorInvertFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5014F07F790001FF6F /* GPUImageColorInvertFilter.m */; }; - BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B5514F07F790001FF6F /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; }; BC982B5614F07F790001FF6F /* GPUImageSaturationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5214F07F790001FF6F /* GPUImageSaturationFilter.m */; }; - BC982B6714F092EF0001FF6F /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B6714F092EF0001FF6F /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; }; BC982B6814F092EF0001FF6F /* GPUImageContrastFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B6614F092EF0001FF6F /* GPUImageContrastFilter.m */; }; - BC982B7914F098CC0001FF6F /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B7914F098CC0001FF6F /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; }; BC982B7A14F098CC0001FF6F /* GPUImageBrightnessFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */; }; - BC982B7E14F09F980001FF6F /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B7E14F09F980001FF6F /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; }; BC982B7F14F09F980001FF6F /* GPUImageGammaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7D14F09F980001FF6F /* GPUImageGammaFilter.m */; }; - BC982B9914F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982B9914F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; }; BC982B9A14F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */; }; - BC982BEB14F1CE600001FF6F /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982BEB14F1CE600001FF6F /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; }; BC982BEC14F1CE600001FF6F /* GPUImageDissolveBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BE814F1CE600001FF6F /* GPUImageDissolveBlendFilter.m */; }; - BC982BED14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982BED14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; }; BC982BEE14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BEA14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m */; }; - BC982C4714F29E580001FF6F /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C4714F29E580001FF6F /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; }; BC982C4814F29E580001FF6F /* GPUImageKuwaharaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */; }; - BC982C6E14F33C2A0001FF6F /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C6E14F33C2A0001FF6F /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; }; BC982C6F14F33C2A0001FF6F /* GPUImageMovie.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */; }; - BC982C7014F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C7014F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; }; BC982C7114F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6D14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m */; }; - BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C8114F34F0C0001FF6F /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; }; BC982C8214F34F0C0001FF6F /* GPUImageDarkenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C7E14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.m */; }; - BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C8314F34F0C0001FF6F /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; }; BC982C8414F34F0C0001FF6F /* GPUImageLightenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */; }; - BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC982C9F14F35C2D0001FF6F /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; }; BC982CA014F35C2D0001FF6F /* GPUImageToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */; }; - BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC99234E15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; }; BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */; }; - BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC99235315EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; }; BC99235415EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */; }; - BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; }; BCA464CD1627C1BD00C0F68E /* GPUImageLineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */; }; - BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA632811623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; }; BCA632821623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632801623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m */; }; - BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA632861623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; }; BCA632871623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */; }; - BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; }; BCA6328B1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */; }; - BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; }; BCABED8F15263CF20098A93E /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */; }; - BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; }; BCABED9115263CF20098A93E /* GPUImageStretchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */; }; - BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD0978154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; }; BCAD0979154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */; }; - BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD097D154F3CB000278521 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; }; BCAD097E154F3CB000278521 /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */; }; - BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD0981154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; }; BCAD0982154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */; }; - BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD0985154F931C00278521 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; }; BCAD0986154F931C00278521 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; - BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD099F15506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; }; BCAD09A015506F6F00278521 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */; }; - BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4C9E156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; }; BCAD4C9F156F0D8F001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */; }; - BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; }; BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */; }; - BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; }; BCAD4D1015718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */; }; - BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; }; BCAD4D1515718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */; }; - BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; }; BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */; }; - BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; }; BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; - BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; }; BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */; }; - BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB030BC173400BC001A1A20 /* GPUImageThreeInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB030BC173400BC001A1A20 /* GPUImageThreeInputFilter.h */; }; BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB030BD173400BC001A1A20 /* GPUImageThreeInputFilter.m */; }; - BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB3B46515F2BA9300EDA3BE /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; }; BCB3B46615F2BA9300EDA3BE /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */; }; - BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB3B46A15F2FD1B00EDA3BE /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; }; BCB3B46B15F2FD1B00EDA3BE /* GPUImageHighPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */; }; - BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB3B47915F3108700EDA3BE /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; }; BCB3B47A15F3108700EDA3BE /* GPUImageMotionDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */; }; - BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5DE0D14E87F32000AF3C2 /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; }; BCB5DE0E14E87F32000AF3C2 /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; - BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; }; BCB5E75D14E2086300701302 /* GPUImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E75B14E2086300701302 /* GPUImageView.m */; }; - BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E76514E208D700701302 /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; }; BCB5E76614E208D700701302 /* GPUImageVideoCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */; }; - BCB5E76C14E20AD700701302 /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E76C14E20AD700701302 /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageContext.h */; }; BCB5E76D14E20AD700701302 /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageContext.m */; }; BCB5E76F14E20B8000701302 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E76E14E20B7F00701302 /* UIKit.framework */; }; BCB5E77114E20B8A00701302 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77014E20B8A00701302 /* AVFoundation.framework */; }; @@ -218,92 +218,92 @@ BCB5E77514E20B9700701302 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77414E20B9700701302 /* OpenGLES.framework */; }; BCB5E77714E20BA800701302 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77614E20BA800701302 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Required, ); }; }; BCB5E77914E20BAF00701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77814E20BAF00701302 /* CoreMedia.framework */; }; - BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E77F14E22E4300701302 /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; }; BCB5E78014E22E4300701302 /* GPUImageOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E77E14E22E4200701302 /* GPUImageOutput.m */; }; - BCB5E79414E3275200701302 /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E79414E3275200701302 /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; }; BCB5E79514E3275200701302 /* GLProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E79314E3275200701302 /* GLProgram.m */; }; - BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E7C214E4B6D400701302 /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; }; BCB5E7C314E4B6D400701302 /* GPUImageSepiaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7C114E4B6D400701302 /* GPUImageSepiaFilter.m */; }; - BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB5E7DA14E6003400701302 /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; }; BCB5E7DB14E6003400701302 /* GPUImagePicture.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7D914E6003400701302 /* GPUImagePicture.m */; }; - BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; }; BCB6B838150400030041703B /* GPUImageExposureFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B834150400030041703B /* GPUImageExposureFilter.m */; }; - BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; }; BCB6B83A150400030041703B /* GPUImageSharpenFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B836150400030041703B /* GPUImageSharpenFilter.m */; }; - BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; }; BCB6B85715041A920041703B /* GPUImageColorBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85115041A920041703B /* GPUImageColorBurnBlendFilter.m */; }; - BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; }; BCB6B85915041A920041703B /* GPUImageColorDodgeBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85315041A920041703B /* GPUImageColorDodgeBlendFilter.m */; }; - BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; }; BCB6B85B15041A920041703B /* GPUImageScreenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85515041A920041703B /* GPUImageScreenBlendFilter.m */; }; - BCB6B8701504234A0041703B /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8701504234A0041703B /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; }; BCB6B8711504234A0041703B /* GPUImageDifferenceBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8691504234A0041703B /* GPUImageDifferenceBlendFilter.m */; }; - BCB6B8721504234A0041703B /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8721504234A0041703B /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; }; BCB6B8731504234A0041703B /* GPUImageExclusionBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86B1504234A0041703B /* GPUImageExclusionBlendFilter.m */; }; - BCB6B8741504234A0041703B /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8741504234A0041703B /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; }; BCB6B8751504234A0041703B /* GPUImageHardLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86D1504234A0041703B /* GPUImageHardLightBlendFilter.m */; }; - BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8761504234A0041703B /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; }; BCB6B8771504234A0041703B /* GPUImageSoftLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */; }; - BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B8BB1505BF940041703B /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; }; BCB6B8BC1505BF940041703B /* GPUImageTextureOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */; }; - BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB6B9041507CA8D0041703B /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; }; BCB6B9051507CA8D0041703B /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; - BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB79E1015EBE1A700965D92 /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; }; BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */; }; - BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB79E5F15EC131A00965D92 /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; }; BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */; }; - BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCB79E7A15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; }; BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */; }; - BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBC604D16C58B0900B11741 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; }; BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */; }; - BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; }; BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */; }; - BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBCE9991595021B00E0ED33 /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; }; BCBCE99A1595021B00E0ED33 /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; - BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBCE9D5159944AC00E0ED33 /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; }; BCBCE9D6159944AC00E0ED33 /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */; }; - BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */; }; BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF617916E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.m */; }; - BCBF617D16E4F69B00E2784A /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCBF617D16E4F69B00E2784A /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; }; + BCC11D72154B44DC0044F5A0 /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; }; BCC11D73154B44DC0044F5A0 /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */; }; - BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E5A8151E74B20006EFA5 /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; }; BCC1E5A9151E74B20006EFA5 /* GPUImagePosterizeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5A7151E74B20006EFA5 /* GPUImagePosterizeFilter.m */; }; - BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E5B8151E83700006EFA5 /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; }; BCC1E5B9151E83700006EFA5 /* GPUImageFilterGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */; }; - BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; }; BCC1E5C8151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */; }; - BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; }; BCC1E5CD151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */; }; - BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; }; BCC1E611152156620006EFA5 /* GPUImageUnsharpMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */; }; - BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; }; BCC1E634152239090006EFA5 /* GPUImageBulgeDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E632152239090006EFA5 /* GPUImageBulgeDistortionFilter.m */; }; - BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; }; BCC1E639152243630006EFA5 /* GPUImagePinchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E637152243620006EFA5 /* GPUImagePinchDistortionFilter.m */; }; - BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; }; + BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; }; BCC1E66E152368130006EFA5 /* GPUImageCrosshatchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */; }; BCC1E67C152368840006EFA5 /* GPUImageCGAColorspaceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E67B152368840006EFA5 /* GPUImageCGAColorspaceFilter.m */; }; - BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC46E5E15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; }; BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */; }; - BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; }; BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */; }; - BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; }; BCC93A101501D1BF00958B26 /* GPUImageFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */; }; - BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; }; BCC93A1F1501E42F00958B26 /* GPUImageTwoPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */; }; BCC93A301502A90F00958B26 /* GPUImageFilterPipeline.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D69488A1501F58200206FF8 /* GPUImageFilterPipeline.m */; }; BCC93A311502A91500958B26 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */; }; - BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC94ABB151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; }; + BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; }; + BCC94ABB151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; }; BCC94ABC151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */; }; - BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; }; BCC94CFB15101EB3002F9BC5 /* GPUImageTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */; }; - BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; }; BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */; }; - BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; }; BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */; }; BCF1A33814DDB1EC00852800 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; BCF1A34614DDB1EC00852800 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A34514DDB1EC00852800 /* SenTestingKit.framework */; }; @@ -311,46 +311,46 @@ BCF1A34C14DDB1EC00852800 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33414DDB1EC00852800 /* libGPUImage.a */; }; BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1A35014DDB1EC00852800 /* InfoPlist.strings */; }; BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1A35414DDB1EC00852800 /* GPUImageTests.m */; }; - BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; }; BCF1E54115669907006B155F /* GPUImageJFAVoronoiFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */; }; - BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; }; BCF1E54315669907006B155F /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */; }; - BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E54415669907006B155F /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; }; BCF1E54515669907006B155F /* GPUImageVoronoiConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoronoiConsumerFilter.m */; }; - BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E57B15673599006B155F /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; }; BCF1E57C15673599006B155F /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */; }; - BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF1E642156AB332006B155F /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; }; BCF1E643156AB332006B155F /* GPUImageRawDataInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */; }; - BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D68B153CC124009A1FE5 /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; }; BCF3D68C153CC124009A1FE5 /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; - BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D6DD153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; }; BCF3D6DE153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */; }; - BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D70A153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; }; BCF3D70B153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */; }; - BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D70F153DF9E7009A1FE5 /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; }; BCF3D710153DF9E7009A1FE5 /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */; }; - BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D71D153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; }; BCF3D71E153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */; }; - BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D722153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; }; BCF3D723153E0E0C009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m */; }; - BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF3D730153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; }; BCF3D731153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; - BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF6B41115A7849F00FC6F58 /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; }; BCF6B41215A7849F00FC6F58 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; - BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF851BA15CF29B3000EBC8B /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; }; BCF851BB15CF29B3000EBC8B /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; - BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF851BF15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; }; BCF851C015CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */; }; - BCF866C8172589A500912E34 /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCF866C8172589A500912E34 /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; }; + BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; }; BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; }; - BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; }; BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; - C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; }; C04C8D1815F8059F00449601 /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */; }; - C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C2EDA90615BB136D007CBA0F /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; }; C2EDA90715BB136D007CBA0F /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; - D443237A17C81C0C00204484 /* GPUImageMovieComposition.h in Headers */ = {isa = PBXBuildFile; fileRef = D443237817C81C0C00204484 /* GPUImageMovieComposition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D443237A17C81C0C00204484 /* GPUImageMovieComposition.h in Headers */ = {isa = PBXBuildFile; fileRef = D443237817C81C0C00204484 /* GPUImageMovieComposition.h */; }; D443237B17C81C0C00204484 /* GPUImageMovieComposition.m in Sources */ = {isa = PBXBuildFile; fileRef = D443237917C81C0C00204484 /* GPUImageMovieComposition.m */; }; /* End PBXBuildFile section */ From 23991bdd7bcef1a5d6f1226d9f9d1c0e509ab487 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sat, 7 Sep 2013 15:18:52 +1200 Subject: [PATCH 450/695] GPUImageMovieWriter: synchronise finishRecording with the movieWritingQueue As the AVAssetWriter gets started on the movieWritingQueue. Also ensure that the handler is called async, otherwise it is called on the movieWritingQueue, which is dispatch_sync from the video processing queue, so if the user-code in the handler calls anything that dispatch_syncs to the video processing queue: deadlock. --- framework/Source/iOS/GPUImageMovieWriter.m | 24 +++++++++++++--------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 4d749dd53..edf0a2530 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -302,20 +302,22 @@ - (void)cancelRecording; - (void)finishRecording; { - [self finishRecordingWithCompletionHandler:nil]; + [self finishRecordingWithCompletionHandler:NULL]; } - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; { runSynchronouslyOnVideoProcessingQueue(^{ - if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled - || assetWriter.status == AVAssetWriterStatusUnknown) - { - return; - } - - isRecording = NO; + dispatch_sync(movieWritingQueue, ^{ + isRecording = NO; + + if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled || assetWriter.status == AVAssetWriterStatusUnknown) + { + if (handler) + runAsynchronouslyOnVideoProcessingQueue(handler); + return; + } if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) { videoEncodingIsFinished = YES; @@ -329,7 +331,8 @@ - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; #if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) // Not iOS 6 SDK [assetWriter finishWriting]; - if (handler) handler(); + if (handler) + runAsynchronouslyOnVideoProcessingQueue(handler); #else // iOS 6 SDK if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { @@ -342,7 +345,8 @@ - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; #pragma clang diagnostic ignored "-Wdeprecated-declarations" [assetWriter finishWriting]; #pragma clang diagnostic pop - if (handler) handler(); + if (handler) + runAsynchronouslyOnVideoProcessingQueue(handler); } #endif }); From c80666c3754ea335986b1456677d8b87fc7d6473 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 13 Sep 2013 17:18:16 -0500 Subject: [PATCH 451/695] Fixed two precision issues with the levels and lookup filters. --- framework/Source/GPUImageLevelsFilter.m | 12 ++++++------ framework/Source/GPUImageLookupFilter.m | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/framework/Source/GPUImageLevelsFilter.m b/framework/Source/GPUImageLevelsFilter.m index 4844340ba..158815fd5 100644 --- a/framework/Source/GPUImageLevelsFilter.m +++ b/framework/Source/GPUImageLevelsFilter.m @@ -23,15 +23,15 @@ varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; - uniform lowp vec3 levelMinimum; - uniform lowp vec3 levelMiddle; - uniform lowp vec3 levelMaximum; - uniform lowp vec3 minOutput; - uniform lowp vec3 maxOutput; + uniform mediump vec3 levelMinimum; + uniform mediump vec3 levelMiddle; + uniform mediump vec3 levelMaximum; + uniform mediump vec3 minOutput; + uniform mediump vec3 maxOutput; void main() { - lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); gl_FragColor = vec4(LevelsControl(textureColor.rgb, levelMinimum, levelMiddle, levelMaximum, minOutput, maxOutput), textureColor.a); } diff --git a/framework/Source/GPUImageLookupFilter.m b/framework/Source/GPUImageLookupFilter.m index d9bba913f..23f45b9d6 100644 --- a/framework/Source/GPUImageLookupFilter.m +++ b/framework/Source/GPUImageLookupFilter.m @@ -11,15 +11,15 @@ void main() { - lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - mediump float blueColor = textureColor.b * 63.0; + highp float blueColor = textureColor.b * 63.0; - mediump vec2 quad1; + highp vec2 quad1; quad1.y = floor(floor(blueColor) / 8.0); quad1.x = floor(blueColor) - (quad1.y * 8.0); - mediump vec2 quad2; + highp vec2 quad2; quad2.y = floor(ceil(blueColor) / 8.0); quad2.x = ceil(blueColor) - (quad2.y * 8.0); From 05bafd2d22abc396750fd9aaea9a77d593247a76 Mon Sep 17 00:00:00 2001 From: Andy Dayton Date: Tue, 17 Sep 2013 22:06:21 -0400 Subject: [PATCH 452/695] Added kGPUImageRotateRightFlipHorizontal to the GPUImageRotationMode enum to fix build errors --- framework/Source/Mac/GPUImageContext.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/Mac/GPUImageContext.h b/framework/Source/Mac/GPUImageContext.h index 12e124611..8d54ca22d 100755 --- a/framework/Source/Mac/GPUImageContext.h +++ b/framework/Source/Mac/GPUImageContext.h @@ -7,7 +7,7 @@ #define GPUImageRotationSwapsWidthAndHeight(rotation) (((rotation) == kGPUImageRotateLeft) || ((rotation) == kGPUImageRotateRight) || ((rotation) == kGPUImageRotateRightFlipVertical) ) -typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180 } GPUImageRotationMode; +typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotateRightFlipHorizontal, kGPUImageRotate180 } GPUImageRotationMode; @interface GPUImageContext : NSObject From 8a0260afa34a17ca2d8ab5ac2e3b96799784834c Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Wed, 18 Sep 2013 21:01:37 +1200 Subject: [PATCH 453/695] Build static library using iOS SDK 7 --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 83f2a4c86..999f66b65 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ set -e -IOSSDK_VER="6.1" +IOSSDK_VER="7.0" # xcodebuild -showsdks From fe6b0c775ec75c9b4ec99ac6edf3bc688663f833 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Wed, 18 Sep 2013 21:02:39 +1200 Subject: [PATCH 454/695] Project settings to enable 64 bit builds Requires setting the minimum deployment target to 6.0. This is probably not acceptable. I'm not sure what to do here; create multiple targets? --- framework/GPUImage.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index c05f47d1e..ece2af897 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1730,11 +1730,13 @@ BCF1A35914DDB1EC00852800 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/iOS/GPUImage-Prefix.pch"; HEADER_SEARCH_PATHS = ""; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1744,11 +1746,13 @@ BCF1A35A14DDB1EC00852800 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/iOS/GPUImage-Prefix.pch"; HEADER_SEARCH_PATHS = ""; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; From bef5fd663411cd8f3627c5f0380871f450dbc3f5 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Wed, 18 Sep 2013 21:08:23 +1200 Subject: [PATCH 455/695] Data type and casting fixes for compiling as 64 bit --- framework/Source/GPUImageChromaKeyFilter.m | 4 ++-- framework/Source/GPUImageHistogramFilter.m | 6 +++--- framework/Source/GPUImageLineGenerator.m | 2 +- framework/Source/GPUImageMovie.m | 6 +++--- .../Source/GPUImageParallelCoordinateLineTransformFilter.h | 2 +- framework/Source/GPUImageVideoCamera.m | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/framework/Source/GPUImageChromaKeyFilter.m b/framework/Source/GPUImageChromaKeyFilter.m index 25c548098..7ee0d675e 100644 --- a/framework/Source/GPUImageChromaKeyFilter.m +++ b/framework/Source/GPUImageChromaKeyFilter.m @@ -95,14 +95,14 @@ - (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent [self setVec3:colorToReplace forUniform:colorToReplaceUniform program:filterProgram]; } -- (void)setThresholdSensitivity:(CGFloat)newValue; +- (void)setThresholdSensitivity:(GLfloat)newValue; { _thresholdSensitivity = newValue; [self setFloat:_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; } -- (void)setSmoothing:(CGFloat)newValue; +- (void)setSmoothing:(GLfloat)newValue; { _smoothing = newValue; diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index b060be0e2..4201e750e 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -287,19 +287,19 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glBlendFunc(GL_ONE, GL_ONE); glEnable(GL_BLEND); - glVertexAttribPointer(filterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); + glVertexAttribPointer(filterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, ((unsigned int)_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); if (histogramType == kGPUImageHistogramRGB) { [GPUImageContext setActiveShaderProgram:secondFilterProgram]; - glVertexAttribPointer(secondFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); + glVertexAttribPointer(secondFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, ((unsigned int)_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); [GPUImageContext setActiveShaderProgram:thirdFilterProgram]; - glVertexAttribPointer(thirdFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); + glVertexAttribPointer(thirdFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, ((unsigned int)_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); } diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m index ecacd2f4b..513250e9c 100644 --- a/framework/Source/GPUImageLineGenerator.m +++ b/framework/Source/GPUImageLineGenerator.m @@ -129,7 +129,7 @@ - (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger glEnable(GL_BLEND); glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, lineCoordinates); - glDrawArrays(GL_LINES, 0, (numberOfLines * 2)); + glDrawArrays(GL_LINES, 0, ((unsigned int)numberOfLines * 2)); glDisable(GL_BLEND); diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 7ca4b30b5..178dd27aa 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -444,11 +444,11 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime { - int bufferHeight = CVPixelBufferGetHeight(movieFrame); + int bufferHeight = (int) CVPixelBufferGetHeight(movieFrame); #if TARGET_IPHONE_SIMULATOR - int bufferWidth = CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) + int bufferWidth = (int) CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) #else - int bufferWidth = CVPixelBufferGetWidth(movieFrame); + int bufferWidth = (int) CVPixelBufferGetWidth(movieFrame); #endif CFTypeRef colorAttachments = CVBufferGetAttachment(movieFrame, kCVImageBufferYCbCrMatrixKey, NULL); if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4) { diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h index 69a6e4a9d..aa8f3f471 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.h @@ -10,7 +10,7 @@ { GLubyte *rawImagePixels; GLfloat *lineCoordinates; - NSUInteger maxLinePairsToRender, linePairsToRender; + unsigned int maxLinePairsToRender, linePairsToRender; } @end diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 40a2aba64..ca9e288d6 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -613,8 +613,8 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer); - int bufferWidth = CVPixelBufferGetWidth(cameraFrame); - int bufferHeight = CVPixelBufferGetHeight(cameraFrame); + int bufferWidth = (int) CVPixelBufferGetWidth(cameraFrame); + int bufferHeight = (int) CVPixelBufferGetHeight(cameraFrame); CFTypeRef colorAttachments = CVBufferGetAttachment(cameraFrame, kCVImageBufferYCbCrMatrixKey, NULL); if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4) { _preferredConversion = kColorConversion601; @@ -753,7 +753,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; // Using BGRA extension to pull in video frame data directly // The use of bytesPerRow / 4 accounts for a display glitch present in preview video frames when using the photo preset on the camera - size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cameraFrame); + int bytesPerRow = (int) CVPixelBufferGetBytesPerRow(cameraFrame); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); for (id currentTarget in targets) From 16754763cecfb549d50021305762bb8fbc52b847 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 22 Sep 2013 12:11:49 +1200 Subject: [PATCH 456/695] GPUImageMovieWriter now obeys its inputRotation. This appears to simply correct the issue of the movie being written with the wrong orientation. We no longer need to use a dummy filter to correct the orientation. --- framework/Source/iOS/GPUImageMovieWriter.m | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index edf0a2530..fdbbef557 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -615,12 +615,7 @@ - (void)renderAtInternalSize; 1.0f, 1.0f, }; - static const GLfloat textureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; + const GLfloat *textureCoordinates = [GPUImageFilter textureCoordinatesForRotation:inputRotation]; glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, inputTextureForMovieRendering); From 8eaf9ea381345a1f2ede014fa513fc3c4228bfdd Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 4 Oct 2013 16:49:00 -0500 Subject: [PATCH 457/695] I believe this fixes a crash on iOS 4.x, due to a missing GCD function on that OS. --- framework/Source/GPUImageNormalBlendFilter.m | 16 ++++++++++------ framework/Source/GPUImageOutput.m | 4 ++-- framework/Source/iOS/GPUImageContext.m | 3 ++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/framework/Source/GPUImageNormalBlendFilter.m b/framework/Source/GPUImageNormalBlendFilter.m index 52477227a..f5b5069da 100644 --- a/framework/Source/GPUImageNormalBlendFilter.m +++ b/framework/Source/GPUImageNormalBlendFilter.m @@ -37,9 +37,11 @@ void main() // outputColor.a = c1.a + c2.a * (1.0 - c1.a); lowp float a = c1.a + c2.a * (1.0 - c1.a); - outputColor.r = (c1.r * c1.a + c2.r * c2.a * (1.0 - c1.a))/a; - outputColor.g = (c1.g * c1.a + c2.g * c2.a * (1.0 - c1.a))/a; - outputColor.b = (c1.b * c1.a + c2.b * c2.a * (1.0 - c1.a))/a; + lowp float alphaDivisor = a + step(a, 0.0); // Protect against a divide-by-zero blacking out things in the output + + outputColor.r = (c1.r * c1.a + c2.r * c2.a * (1.0 - c1.a))/alphaDivisor; + outputColor.g = (c1.g * c1.a + c2.g * c2.a * (1.0 - c1.a))/alphaDivisor; + outputColor.b = (c1.b * c1.a + c2.b * c2.a * (1.0 - c1.a))/alphaDivisor; outputColor.a = a; gl_FragColor = outputColor; @@ -67,9 +69,11 @@ void main() // outputColor.a = c1.a + c2.a * (1.0 - c1.a); float a = c1.a + c2.a * (1.0 - c1.a); - outputColor.r = (c1.r * c1.a + c2.r * c2.a * (1.0 - c1.a))/a; - outputColor.g = (c1.g * c1.a + c2.g * c2.a * (1.0 - c1.a))/a; - outputColor.b = (c1.b * c1.a + c2.b * c2.a * (1.0 - c1.a))/a; + float alphaDivisor = a + step(a, 0.0); // Protect against a divide-by-zero blacking out things in the output + + outputColor.r = (c1.r * c1.a + c2.r * c2.a * (1.0 - c1.a))/alphaDivisor; + outputColor.g = (c1.g * c1.a + c2.g * c2.a * (1.0 - c1.a))/alphaDivisor; + outputColor.b = (c1.b * c1.a + c2.b * c2.a * (1.0 - c1.a))/alphaDivisor; outputColor.a = a; gl_FragColor = outputColor; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 21a15872f..06cba87a7 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -18,7 +18,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)) void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) if (dispatch_get_current_queue() == videoProcessingQueue) #else if (dispatch_get_specific([GPUImageContext contextKey])) @@ -35,7 +35,7 @@ void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) if (dispatch_get_current_queue() == videoProcessingQueue) #else if (dispatch_get_specific([GPUImageContext contextKey])) diff --git a/framework/Source/iOS/GPUImageContext.m b/framework/Source/iOS/GPUImageContext.m index 2e26a8e78..8f0008bcb 100755 --- a/framework/Source/iOS/GPUImageContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -27,7 +27,8 @@ - (id)init; openGLESContextQueueKey = &openGLESContextQueueKey; _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) + +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) #else dispatch_queue_set_specific(_contextQueue, openGLESContextQueueKey, (__bridge void *)self, NULL); #endif From 53e958c9351b182dafab387a8572d2b29df03a4e Mon Sep 17 00:00:00 2001 From: Masaya Tsuruta Date: Sun, 6 Oct 2013 18:55:32 +0900 Subject: [PATCH 458/695] Fixed #if line for iOS7. Previous version occurs memory leaking on iOS7, because there wasn't called dispatch_release(imageUpdateSemaphore) and libdispatch.dylib's malloc wasn't released. --- framework/Source/iOS/GPUImagePicture.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 3689e0317..774547db9 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -170,7 +170,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot } // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || (!defined(__IPHONE_7_0)) ) - (void)dealloc; { if (imageUpdateSemaphore != NULL) From 59503faa069262307494446170950eeb8e0316f4 Mon Sep 17 00:00:00 2001 From: Jake Van Alstyne Date: Sun, 6 Oct 2013 16:56:35 -0600 Subject: [PATCH 459/695] =?UTF-8?q?since=20the=20delegate=20call=20is=20op?= =?UTF-8?q?tional=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/Source/Mac/GPUImageAVCamera.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/Mac/GPUImageAVCamera.m b/framework/Source/Mac/GPUImageAVCamera.m index 75f8df21d..eed7a9148 100644 --- a/framework/Source/Mac/GPUImageAVCamera.m +++ b/framework/Source/Mac/GPUImageAVCamera.m @@ -719,7 +719,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM CFRetain(sampleBuffer); runAsynchronouslyOnVideoProcessingQueue(^{ //Feature Detection Hook. - if (self.delegate) + if (self.delegate && [self.delegate respondsToSelector:@selector(willOutputSampleBuffer:)]) { [self.delegate willOutputSampleBuffer:sampleBuffer]; } From 2c3e15a91809053a6b4ac219050a24bcc2ccdb7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan-Manuel=20Flux=C3=A0?= Date: Mon, 7 Oct 2013 18:54:20 +0800 Subject: [PATCH 460/695] Fixes iOS7 runtime warnings: Deprecated methods setVideoMinFrameDuration/setVideoMaxFrameDuration for AVCaptureConnection class --- framework/Source/GPUImageVideoCamera.m | 62 +++++++++++++++++++------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 40a2aba64..c43181406 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -527,25 +527,55 @@ - (void)setFrameRate:(NSInteger)frameRate; if (_frameRate > 0) { - for (AVCaptureConnection *connection in videoOutput.connections) - { - if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) - connection.videoMinFrameDuration = CMTimeMake(1, _frameRate); - - if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) - connection.videoMaxFrameDuration = CMTimeMake(1, _frameRate); - } + if ([_inputCamera respondsToSelector:@selector(setActiveVideoMinFrameDuration:)] && + [_inputCamera respondsToSelector:@selector(setActiveVideoMaxFrameDuration:)]) { + + NSError *error; + [_inputCamera lockForConfiguration:&error]; + if (error == nil) { + [_inputCamera setActiveVideoMinFrameDuration:CMTimeMake(1, _frameRate)]; + [_inputCamera setActiveVideoMaxFrameDuration:CMTimeMake(1, _frameRate)]; + } + [_inputCamera unlockForConfiguration]; + + } else { + + for (AVCaptureConnection *connection in videoOutput.connections) + { + if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) + connection.videoMinFrameDuration = CMTimeMake(1, _frameRate); + + if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) + connection.videoMaxFrameDuration = CMTimeMake(1, _frameRate); + } + } + } else { - for (AVCaptureConnection *connection in videoOutput.connections) - { - if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) - connection.videoMinFrameDuration = kCMTimeInvalid; // This sets videoMinFrameDuration back to default - - if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) - connection.videoMaxFrameDuration = kCMTimeInvalid; // This sets videoMaxFrameDuration back to default - } + if ([_inputCamera respondsToSelector:@selector(setActiveVideoMinFrameDuration:)] && + [_inputCamera respondsToSelector:@selector(setActiveVideoMaxFrameDuration:)]) { + + NSError *error; + [_inputCamera lockForConfiguration:&error]; + if (error == nil) { + [_inputCamera setActiveVideoMinFrameDuration:kCMTimeInvalid]; + [_inputCamera setActiveVideoMaxFrameDuration:kCMTimeInvalid]; + } + [_inputCamera unlockForConfiguration]; + + } else { + + for (AVCaptureConnection *connection in videoOutput.connections) + { + if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) + connection.videoMinFrameDuration = kCMTimeInvalid; // This sets videoMinFrameDuration back to default + + if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) + connection.videoMaxFrameDuration = kCMTimeInvalid; // This sets videoMaxFrameDuration back to default + } + } + } } From adf85c2324739b480928bab8ee4b5221739ecb65 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 9 Oct 2013 18:15:44 -0500 Subject: [PATCH 461/695] Removed the default building for 64-bit, because that limits backwards compatibility. The framework supports 64-bit, but you'll have to enable this for your project in the framework and your application yourself. --- .../FilterShowcase.xcodeproj/project.pbxproj | 2 ++ framework/GPUImage.xcodeproj/project.pbxproj | 6 ++---- framework/Source/GPUImageVideoCamera.h | 2 +- framework/Source/GPUImageVideoCamera.m | 13 +++++++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 55c5ffcbf..7760a5433 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -353,6 +353,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -380,6 +381,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index ece2af897..bc57dc4d7 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1675,6 +1675,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES; @@ -1706,6 +1707,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES; @@ -1730,13 +1732,11 @@ BCF1A35914DDB1EC00852800 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/iOS/GPUImage-Prefix.pch"; HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1746,13 +1746,11 @@ BCF1A35A14DDB1EC00852800 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/GPUImage.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/iOS/GPUImage-Prefix.pch"; HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 33f828e6e..cb5ef0e34 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -54,7 +54,7 @@ extern NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString /** Setting this to 0 or below will set the frame rate back to the default setting for a particular preset. */ -@property (readwrite) NSInteger frameRate; +@property (readwrite) int32_t frameRate; /// Easy way to tell which cameras are present on device @property (readonly, getter = isFrontFacingCameraPresent) BOOL frontFacingCameraPresent; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index b86e2a863..86d1993ce 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -70,8 +70,6 @@ @interface GPUImageVideoCamera () AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; - NSInteger _frameRate; - dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; GLProgram *yuvConversionProgram; @@ -102,6 +100,7 @@ @implementation GPUImageVideoCamera @synthesize outputImageOrientation = _outputImageOrientation; @synthesize delegate = _delegate; @synthesize horizontallyMirrorFrontFacingCamera = _horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera = _horizontallyMirrorRearFacingCamera; +@synthesize frameRate = _frameRate; #pragma mark - #pragma mark Initialization and teardown @@ -521,7 +520,7 @@ - (void)setCaptureSessionPreset:(NSString *)captureSessionPreset; [_captureSession commitConfiguration]; } -- (void)setFrameRate:(NSInteger)frameRate; +- (void)setFrameRate:(int32_t)frameRate; { _frameRate = frameRate; @@ -542,11 +541,14 @@ - (void)setFrameRate:(NSInteger)frameRate; for (AVCaptureConnection *connection in videoOutput.connections) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) connection.videoMinFrameDuration = CMTimeMake(1, _frameRate); if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) connection.videoMaxFrameDuration = CMTimeMake(1, _frameRate); +#pragma clang diagnostic pop } } @@ -568,18 +570,21 @@ - (void)setFrameRate:(NSInteger)frameRate; for (AVCaptureConnection *connection in videoOutput.connections) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) connection.videoMinFrameDuration = kCMTimeInvalid; // This sets videoMinFrameDuration back to default if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)]) connection.videoMaxFrameDuration = kCMTimeInvalid; // This sets videoMaxFrameDuration back to default +#pragma clang diagnostic pop } } } } -- (NSInteger)frameRate; +- (int32_t)frameRate; { return _frameRate; } From 94853d6b94becb4c7ec705434be3a1e3dd3679a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Thu, 17 Oct 2013 16:38:09 +0900 Subject: [PATCH 462/695] Fix Xcode 4 compatibility --- framework/Source/GPUImageVideoCamera.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 86d1993ce..8e4a5c88f 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -532,8 +532,10 @@ - (void)setFrameRate:(int32_t)frameRate; NSError *error; [_inputCamera lockForConfiguration:&error]; if (error == nil) { +#if defined(__IPHONE_7_0) [_inputCamera setActiveVideoMinFrameDuration:CMTimeMake(1, _frameRate)]; [_inputCamera setActiveVideoMaxFrameDuration:CMTimeMake(1, _frameRate)]; +#endif } [_inputCamera unlockForConfiguration]; @@ -561,8 +563,10 @@ - (void)setFrameRate:(int32_t)frameRate; NSError *error; [_inputCamera lockForConfiguration:&error]; if (error == nil) { +#if defined(__IPHONE_7_0) [_inputCamera setActiveVideoMinFrameDuration:kCMTimeInvalid]; [_inputCamera setActiveVideoMaxFrameDuration:kCMTimeInvalid]; +#endif } [_inputCamera unlockForConfiguration]; From 7c7070426708338bae1755b1c5a899910bc48cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Thu, 17 Oct 2013 17:06:06 +0900 Subject: [PATCH 463/695] Apply Xcode 5 suggested changes to projects --- .../iOS/FilterShowcase/Default-568h@2x.png | Bin 0 -> 18594 bytes .../FilterShowcase.xcodeproj/project.pbxproj | 27 ++++++++++++++++-- framework/GPUImage.xcodeproj/project.pbxproj | 15 ++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 examples/iOS/FilterShowcase/Default-568h@2x.png diff --git a/examples/iOS/FilterShowcase/Default-568h@2x.png b/examples/iOS/FilterShowcase/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 7760a5433..7eb8f6cce 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ BCF9D9AC15CCD1AF007E7FBA /* lookup_miss_etikate.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */; }; BCF9D9AD15CCD1AF007E7FBA /* lookup_soft_elegance_1.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */; }; BCF9D9AE15CCD1AF007E7FBA /* lookup_soft_elegance_2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D9AA15CCD1AF007E7FBA /* lookup_soft_elegance_2.png */; }; + E5530A36180FD1D500597F98 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5530A35180FD1D500597F98 /* Default-568h@2x.png */; }; F2F3361E156585C400B0FBB8 /* voroni_points2.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F3361D156585C400B0FBB8 /* voroni_points2.png */; }; F2F336271565906000B0FBB8 /* dotletterstiles.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F336261565906000B0FBB8 /* dotletterstiles.png */; }; F2F33629156591CA00B0FBB8 /* curvies.png in Resources */ = {isa = PBXBuildFile; fileRef = F2F33628156591CA00B0FBB8 /* curvies.png */; }; @@ -102,6 +103,7 @@ BCF9D9A815CCD1AF007E7FBA /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; BCF9D9A915CCD1AF007E7FBA /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; BCF9D9AA15CCD1AF007E7FBA /* lookup_soft_elegance_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_2.png; path = ../../../../framework/Resources/lookup_soft_elegance_2.png; sourceTree = ""; }; + E5530A35180FD1D500597F98 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; F2F3361D156585C400B0FBB8 /* voroni_points2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voroni_points2.png; sourceTree = ""; }; F2F336261565906000B0FBB8 /* dotletterstiles.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dotletterstiles.png; sourceTree = ""; }; F2F33628156591CA00B0FBB8 /* curvies.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = curvies.png; sourceTree = ""; }; @@ -132,6 +134,7 @@ BC982AF714F046AC0001FF6F = { isa = PBXGroup; children = ( + E5530A35180FD1D500597F98 /* Default-568h@2x.png */, BC982B0C14F046AC0001FF6F /* FilterShowcase */, BC982B0514F046AC0001FF6F /* Frameworks */, BC982B0314F046AC0001FF6F /* Products */, @@ -243,7 +246,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = Showcase; - LastUpgradeCheck = 0430; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BC982AFC14F046AC0001FF6F /* Build configuration list for PBXProject "FilterShowcase" */; @@ -304,6 +307,7 @@ BCF9D9AB15CCD1AF007E7FBA /* lookup_amatorka.png in Resources */, BCF9D9AC15CCD1AF007E7FBA /* lookup_miss_etikate.png in Resources */, BCF9D9AD15CCD1AF007E7FBA /* lookup_soft_elegance_1.png in Resources */, + E5530A36180FD1D500597F98 /* Default-568h@2x.png in Resources */, BCF9D9AE15CCD1AF007E7FBA /* lookup_soft_elegance_2.png in Resources */, BCB3C3C516BCA2EB003D26B0 /* Icon-72.png in Resources */, BCB3C3C616BCA2EB003D26B0 /* Icon-72@2x.png in Resources */, @@ -353,8 +357,13 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -366,11 +375,15 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -381,14 +394,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index bc57dc4d7..d66c0a331 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1396,7 +1396,7 @@ BCF1A32B14DDB1EC00852800 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Brad Larson"; }; buildConfigurationList = BCF1A32E14DDB1EC00852800 /* Build configuration list for PBXProject "GPUImage" */; @@ -1675,9 +1675,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -1692,11 +1693,15 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 4.0; + ONLY_ACTIVE_ARCH = YES; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -1707,9 +1712,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -1717,9 +1723,12 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 4.0; RUN_CLANG_STATIC_ANALYZER = YES; From 6fdb6541c73349d63814452db3d94cc62cd95ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Thu, 17 Oct 2013 17:10:04 +0900 Subject: [PATCH 464/695] ShowcaseFilterViewController: Avoid retaining self inside blocks --- .../FilterShowcase/ShowcaseFilterViewController.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index d421456c6..791f71855 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1497,21 +1497,22 @@ - (void)setupFilter; [self.view addSubview:faceView]; faceView.hidden = YES; + __unsafe_unretained ShowcaseFilterViewController * weakSelf = self; [(GPUImageMotionDetector *) filter setMotionDetectionBlock:^(CGPoint motionCentroid, CGFloat motionIntensity, CMTime frameTime) { if (motionIntensity > 0.01) { CGFloat motionBoxWidth = 1500.0 * motionIntensity; - CGSize viewBounds = self.view.bounds.size; + CGSize viewBounds = weakSelf.view.bounds.size; dispatch_async(dispatch_get_main_queue(), ^{ - faceView.frame = CGRectMake(round(viewBounds.width * motionCentroid.x - motionBoxWidth / 2.0), round(viewBounds.height * motionCentroid.y - motionBoxWidth / 2.0), motionBoxWidth, motionBoxWidth); - faceView.hidden = NO; + weakSelf->faceView.frame = CGRectMake(round(viewBounds.width * motionCentroid.x - motionBoxWidth / 2.0), round(viewBounds.height * motionCentroid.y - motionBoxWidth / 2.0), motionBoxWidth, motionBoxWidth); + weakSelf->faceView.hidden = NO; }); } else { dispatch_async(dispatch_get_main_queue(), ^{ - faceView.hidden = YES; + weakSelf->faceView.hidden = YES; }); } From 46bb9ad9a49700d8878ae83f3701f49a16c5efaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Thu, 17 Oct 2013 17:10:31 +0900 Subject: [PATCH 465/695] GPUImageHSBFilter: Comment-out unused functions --- framework/Source/GPUImageHSBFilter.m | 172 +++++++++++++-------------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/framework/Source/GPUImageHSBFilter.m b/framework/Source/GPUImageHSBFilter.m index 6af8048a5..48f7194d3 100644 --- a/framework/Source/GPUImageHSBFilter.m +++ b/framework/Source/GPUImageHSBFilter.m @@ -157,36 +157,36 @@ static void cscalemat(mat,rscale,gscale,bscale) * lummat - * make a luminance marix */ -static void lummat(mat) -float mat[4][4]; -{ - float mmat[4][4]; - float rwgt, gwgt, bwgt; - - rwgt = RLUM; - gwgt = GLUM; - bwgt = BLUM; - mmat[0][0] = rwgt; - mmat[0][1] = rwgt; - mmat[0][2] = rwgt; - mmat[0][3] = 0.0; - - mmat[1][0] = gwgt; - mmat[1][1] = gwgt; - mmat[1][2] = gwgt; - mmat[1][3] = 0.0; - - mmat[2][0] = bwgt; - mmat[2][1] = bwgt; - mmat[2][2] = bwgt; - mmat[2][3] = 0.0; - - mmat[3][0] = 0.0; - mmat[3][1] = 0.0; - mmat[3][2] = 0.0; - mmat[3][3] = 1.0; - matrixmult(mmat,mat,mat); -} +//static void lummat(mat) +//float mat[4][4]; +//{ +// float mmat[4][4]; +// float rwgt, gwgt, bwgt; +// +// rwgt = RLUM; +// gwgt = GLUM; +// bwgt = BLUM; +// mmat[0][0] = rwgt; +// mmat[0][1] = rwgt; +// mmat[0][2] = rwgt; +// mmat[0][3] = 0.0; +// +// mmat[1][0] = gwgt; +// mmat[1][1] = gwgt; +// mmat[1][2] = gwgt; +// mmat[1][3] = 0.0; +// +// mmat[2][0] = bwgt; +// mmat[2][1] = bwgt; +// mmat[2][2] = bwgt; +// mmat[2][3] = 0.0; +// +// mmat[3][0] = 0.0; +// mmat[3][1] = 0.0; +// mmat[3][2] = 0.0; +// mmat[3][3] = 1.0; +// matrixmult(mmat,mat,mat); +//} /* * saturatemat - @@ -239,33 +239,33 @@ static void saturatemat(mat,sat) * offsetmat - * offset r, g, and b */ -static void offsetmat(mat,roffset,goffset,boffset) -float mat[4][4]; -float roffset, goffset, boffset; -{ - float mmat[4][4]; - - mmat[0][0] = 1.0; - mmat[0][1] = 0.0; - mmat[0][2] = 0.0; - mmat[0][3] = 0.0; - - mmat[1][0] = 0.0; - mmat[1][1] = 1.0; - mmat[1][2] = 0.0; - mmat[1][3] = 0.0; - - mmat[2][0] = 0.0; - mmat[2][1] = 0.0; - mmat[2][2] = 1.0; - mmat[2][3] = 0.0; - - mmat[3][0] = roffset; - mmat[3][1] = goffset; - mmat[3][2] = boffset; - mmat[3][3] = 1.0; - matrixmult(mmat,mat,mat); -} +//static void offsetmat(mat,roffset,goffset,boffset) +//float mat[4][4]; +//float roffset, goffset, boffset; +//{ +// float mmat[4][4]; +// +// mmat[0][0] = 1.0; +// mmat[0][1] = 0.0; +// mmat[0][2] = 0.0; +// mmat[0][3] = 0.0; +// +// mmat[1][0] = 0.0; +// mmat[1][1] = 1.0; +// mmat[1][2] = 0.0; +// mmat[1][3] = 0.0; +// +// mmat[2][0] = 0.0; +// mmat[2][1] = 0.0; +// mmat[2][2] = 1.0; +// mmat[2][3] = 0.0; +// +// mmat[3][0] = roffset; +// mmat[3][1] = goffset; +// mmat[3][2] = boffset; +// mmat[3][3] = 1.0; +// matrixmult(mmat,mat,mat); +//} /* * xrotate - @@ -399,35 +399,35 @@ static void zshearmat(mat,dx,dy) * simplehuerotatemat - * simple hue rotation. This changes luminance */ -static void simplehuerotatemat(mat,rot) -float mat[4][4]; -float rot; -{ - float mag; - float xrs, xrc; - float yrs, yrc; - float zrs, zrc; - - /* rotate the grey vector into positive Z */ - mag = sqrt(2.0); - xrs = 1.0/mag; - xrc = 1.0/mag; - xrotatemat(mat,xrs,xrc); - - mag = sqrt(3.0); - yrs = -1.0/mag; - yrc = sqrt(2.0)/mag; - yrotatemat(mat,yrs,yrc); - - /* rotate the hue */ - zrs = sin(rot*M_PI/180.0); - zrc = cos(rot*M_PI/180.0); - zrotatemat(mat,zrs,zrc); - - /* rotate the grey vector back into place */ - yrotatemat(mat,-yrs,yrc); - xrotatemat(mat,-xrs,xrc); -} +//static void simplehuerotatemat(mat,rot) +//float mat[4][4]; +//float rot; +//{ +// float mag; +// float xrs, xrc; +// float yrs, yrc; +// float zrs, zrc; +// +// /* rotate the grey vector into positive Z */ +// mag = sqrt(2.0); +// xrs = 1.0/mag; +// xrc = 1.0/mag; +// xrotatemat(mat,xrs,xrc); +// +// mag = sqrt(3.0); +// yrs = -1.0/mag; +// yrc = sqrt(2.0)/mag; +// yrotatemat(mat,yrs,yrc); +// +// /* rotate the hue */ +// zrs = sin(rot*M_PI/180.0); +// zrc = cos(rot*M_PI/180.0); +// zrotatemat(mat,zrs,zrc); +// +// /* rotate the grey vector back into place */ +// yrotatemat(mat,-yrs,yrc); +// xrotatemat(mat,-xrs,xrc); +//} /* * huerotatemat - From 08d1521bd76dca6e31c1d2af4c9c7785396fe651 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 17 Oct 2013 08:50:58 -0700 Subject: [PATCH 466/695] GPUImagePicture: don't redraw using CoreGraphics unless you have to There was support for this but it appeared to have been disabled. --- framework/Source/iOS/GPUImagePicture.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 3689e0317..2b5510621 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -74,7 +74,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); CGSize pixelSizeToUseForTexture = pixelSizeOfImage; - BOOL shouldRedrawUsingCoreGraphics = YES; + BOOL shouldRedrawUsingCoreGraphics = NO; // For now, deal with images larger than the maximum texture size by resizing to be within that limit CGSize scaledImageSizeToFitOnGPU = [GPUImageContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; From 6272c28975ba0cb4d96dbc68dc62aa16600191a5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 17 Oct 2013 23:06:02 -0500 Subject: [PATCH 467/695] Completely reworked the Gaussian blur filter to use optimized, on-the-fly calculated shaders. This uses the techniques of the Fast Blur filter, so it is no longer necessary and has been removed. --- .../project.pbxproj | 8 + .../FeatureExtractionAppDelegate.m | 24 + .../FeatureExtractionTest/GaussianTest.png | Bin 0 -> 1439 bytes .../ShowcaseFilterListController.m | 1 - .../ShowcaseFilterViewController.h | 1 - .../ShowcaseFilterViewController.m | 21 +- framework/GPUImage.xcodeproj/project.pbxproj | 16 - framework/Source/GLProgram.m | 11 + framework/Source/GPUImage.h | 1 - .../Source/GPUImageCannyEdgeDetectionFilter.h | 4 +- .../Source/GPUImageCannyEdgeDetectionFilter.m | 4 +- framework/Source/GPUImageFastBlurFilter.h | 15 - framework/Source/GPUImageFastBlurFilter.m | 195 ------- framework/Source/GPUImageGaussianBlurFilter.h | 26 +- framework/Source/GPUImageGaussianBlurFilter.m | 504 ++++++++++++++---- .../GPUImageHarrisCornerDetectionFilter.h | 6 +- .../GPUImageHarrisCornerDetectionFilter.m | 4 +- .../GPUImageHoughTransformLineDetector.h | 1 - .../GPUImageSingleComponentFastBlurFilter.h | 5 - .../GPUImageSingleComponentFastBlurFilter.m | 70 --- framework/Source/GPUImageTwoPassFilter.m | 2 +- framework/Source/iOS/GPUImageContext.h | 1 + framework/Source/iOS/GPUImageContext.m | 23 +- 23 files changed, 516 insertions(+), 427 deletions(-) create mode 100644 examples/iOS/FeatureExtractionTest/FeatureExtractionTest/GaussianTest.png delete mode 100755 framework/Source/GPUImageFastBlurFilter.h delete mode 100755 framework/Source/GPUImageFastBlurFilter.m delete mode 100644 framework/Source/GPUImageSingleComponentFastBlurFilter.h delete mode 100644 framework/Source/GPUImageSingleComponentFastBlurFilter.m diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index ae8cb3e1b..d2dbc1af8 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -20,6 +20,8 @@ BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC18E0C9156C836400AB8026 /* AVFoundation.framework */; }; BC18E0CC156C881700AB8026 /* 71yih.png in Resources */ = {isa = PBXBuildFile; fileRef = BC18E0CB156C881700AB8026 /* 71yih.png */; }; BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC46D52315D03D9C00CC63CA /* LBPTest.png */; }; + BC8A581C1810782200E6B507 /* GaussianTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8A581B1810782200E6B507 /* GaussianTest.png */; }; + BC8A58211810862F00E6B507 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC8A58201810862F00E6B507 /* CoreImage.framework */; }; BCA464C9162785EA00C0F68E /* LineTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCA464C8162785EA00C0F68E /* LineTest.png */; }; BCB3C3F916BCA61A003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F416BCA61A003D26B0 /* Icon-72.png */; }; BCB3C3FA16BCA61A003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */; }; @@ -75,6 +77,8 @@ BC18E0C9156C836400AB8026 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BC18E0CB156C881700AB8026 /* 71yih.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 71yih.png; sourceTree = ""; }; BC46D52315D03D9C00CC63CA /* LBPTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LBPTest.png; sourceTree = ""; }; + BC8A581B1810782200E6B507 /* GaussianTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = GaussianTest.png; sourceTree = ""; }; + BC8A58201810862F00E6B507 /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; BCA464C8162785EA00C0F68E /* LineTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest.png; sourceTree = ""; }; BCB3C3F416BCA61A003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; @@ -91,6 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BC8A58211810862F00E6B507 /* CoreImage.framework in Frameworks */, BCF867031725A53400912E34 /* libGPUImage.a in Frameworks */, BC18E0CA156C836400AB8026 /* AVFoundation.framework in Frameworks */, BC18E0C8156C835E00AB8026 /* OpenGLES.framework in Frameworks */, @@ -127,6 +132,7 @@ isa = PBXGroup; children = ( BC18E0B1156C830F00AB8026 /* GPUImage.xcodeproj */, + BC8A58201810862F00E6B507 /* CoreImage.framework */, BC18E09A156C822E00AB8026 /* UIKit.framework */, BC18E09C156C822E00AB8026 /* Foundation.framework */, BC18E09E156C822E00AB8026 /* CoreGraphics.framework */, @@ -152,6 +158,7 @@ BC18E0A1156C822E00AB8026 /* Supporting Files */ = { isa = PBXGroup; children = ( + BC8A581B1810782200E6B507 /* GaussianTest.png */, BCB3C3F416BCA61A003D26B0 /* Icon-72.png */, BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */, BCB3C3F616BCA61A003D26B0 /* Icon.png */, @@ -262,6 +269,7 @@ BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */, BCB79DC715E9754000965D92 /* ChairTest.png in Resources */, BCA464C9162785EA00C0F68E /* LineTest.png in Resources */, + BC8A581C1810782200E6B507 /* GaussianTest.png in Resources */, BCF2860F1628A5140051E9C5 /* LineTest2.png in Resources */, BCB3C3F916BCA61A003D26B0 /* Icon-72.png in Resources */, BCB3C3FA16BCA61A003D26B0 /* Icon-72@2x.png in Resources */, diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index bfab5deae..1ec773b9e 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -105,7 +105,31 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [averageLuminosity setLuminosityProcessingFinishedBlock:^(CGFloat luminosity, CMTime frameTime) { NSLog(@"Luminosity: %f", luminosity); }]; + + // Testing Gaussian blur + UIImage *gaussianBlurInput = [UIImage imageNamed:@"GaussianTest.png"]; + GPUImagePicture *gaussianImage = [[GPUImagePicture alloc] initWithImage:gaussianBlurInput]; + GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; + gaussianBlur.blurRadiusInPixels = 2.0; + [gaussianImage addTarget:gaussianBlur]; + [gaussianImage processImage]; + UIImage *gaussianOutput = [gaussianBlur imageFromCurrentlyProcessedOutput]; + [self saveImage:gaussianOutput fileName:@"Gaussian-GPUImage.png"]; + + CIContext *coreImageContext = [CIContext contextWithEAGLContext:[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]]; + +// CIContext *coreImageContext = [CIContext contextWithOptions:nil]; + CIImage *inputCIGaussianImage = [[CIImage alloc] initWithCGImage:gaussianBlurInput.CGImage]; + CIFilter *gaussianBlurCIFilter = [CIFilter filterWithName:@"CIGaussianBlur" + keysAndValues: kCIInputImageKey, inputCIGaussianImage, + @"inputRadius", [NSNumber numberWithFloat:2.0], nil]; + CIImage *coreImageResult = [gaussianBlurCIFilter outputImage]; + CGImageRef resultRef = [coreImageContext createCGImage:coreImageResult fromRect:CGRectMake(0, 0, gaussianBlurInput.size.width, gaussianBlurInput.size.height)]; + UIImage *coreImageResult2 = [UIImage imageWithCGImage:resultRef]; + [self saveImage:coreImageResult2 fileName:@"Gaussian-CoreImage.png"]; + CGImageRelease(resultRef); + [chairPicture removeAllTargets]; [chairPicture addTarget:averageColor]; [chairPicture addTarget:averageLuminosity]; diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/GaussianTest.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/GaussianTest.png new file mode 100644 index 0000000000000000000000000000000000000000..161bdd6669b99b58e9d24d8290e2390a053d1d5f GIT binary patch literal 1439 zcmb7EX*k;l9FA!INUK^Q?kRDkOckwEg0vGORK!_|23?iLQ5tHEtgKoUTh-A^9jl|R z#Zg5aq0EsXCCWrJt~p203bMLpPq%*Fp67SG&-;FOfA5!HB9UMt4ONDMKp<(nEzWsw zU;4WxfxYP(W6%o%?b8afvLfQGtd0;P!UBSV_w-YTZ@Z0!jkwBLCWblZ!?8y^Y!c}0 zL_?Inu1lNu+Q)9QF|%3B?1d4W1u3XHL&@##!_u;>Uabdd zh4A!j2YP?ifW7!Y={&(8rJF5#tVMp~&BBBlU9ww{va~~3M>O9^ddErBbbK8uuSQc6 z9dPOyAlKN-HA`%Yf@*K+R_b1#-hw?=s+b$Gv<5K;2S{upqyx|6Utl|~tzwIPuha-+Z~gvz;ExZh#(N~950Rk4z@ zroHf(g*Y`7d0Dn9Um4 z>W15OaOQPxG6HT~KFs4n8nP95_jCCDixfcdTQ0T{Z8!s{j`$2X``6^Xwwc4>5Cph^ z|6s8lCZCvXoZiO#+SFXzm=%Bfmu^2JO~-!OVE(se$-j5T|L{VAX^`twfaxs1+Wc#! z2i9d+Y)jq0YVo+rWmtX%iu-g?(!K@Vau5QI2tmv1y`>@7RvR57UEyc~@x#_>8uG5w zo8e{UkL=`~I~f)B`a*w_w4%*@f|Qp-txFh1QUaFCpHQrCshMV(TZPTy+WdSR|oAy-HGBCT+Wxw0s=&OWfM z##E$0tFAayQw`qlQ#>J~4P*gB9j@*1r4+d5NKV>wXH!-OSBNN#^3I%oNRLKm({*hV zmy;aZIwwuQwb_lL3nHD0=i+NSX|UsH^mxdZXSG=-lUe9+cWWV(^0bfb^BpjDFc)7M z^_yvz{JG)slJcWcFHAYB#E_p=HzUi?G%vWg02|bRGYV-$_9zwMeV-j6IKBi}GpeIoma)0IOKe>xophCn}oNf^^E?gOnuk?8sl z^I7_zpsNM>K8fei6X|n(ojmEG(HAR^xD@U{~q<1^-!=Q2+n{ literal 0 HcmV?d00001 diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 1fd7adf13..75a26d984 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -173,7 +173,6 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_KUWAHARARADIUS3: cell.textLabel.text = @"Kuwahara (fixed radius)"; break; case GPUIMAGE_VIGNETTE: cell.textLabel.text = @"Vignette"; break; case GPUIMAGE_GAUSSIAN: cell.textLabel.text = @"Gaussian blur"; break; - case GPUIMAGE_FASTBLUR: cell.textLabel.text = @"Gaussian blur (optimized)"; break; case GPUIMAGE_MEDIAN: cell.textLabel.text = @"Median (3x3)"; break; case GPUIMAGE_BILATERAL: cell.textLabel.text = @"Bilateral blur"; break; case GPUIMAGE_MOTIONBLUR: cell.textLabel.text = @"Motion blur"; break; diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index ea7806b25..3ae93382a 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -70,7 +70,6 @@ typedef enum { GPUIMAGE_GAUSSIAN, GPUIMAGE_GAUSSIAN_SELECTIVE, GPUIMAGE_GAUSSIAN_POSITION, - GPUIMAGE_FASTBLUR, GPUIMAGE_BOXBLUR, GPUIMAGE_MEDIAN, GPUIMAGE_BILATERAL, diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index d421456c6..cf3a6e05c 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1153,22 +1153,12 @@ - (void)setupFilter; self.title = @"Gaussian Blur"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:0.0]; - [self.filterSettingsSlider setMaximumValue:10.0]; - [self.filterSettingsSlider setValue:1.0]; + [self.filterSettingsSlider setMinimumValue:1.0]; + [self.filterSettingsSlider setMaximumValue:7.0]; + [self.filterSettingsSlider setValue:2.0]; filter = [[GPUImageGaussianBlurFilter alloc] init]; }; break; - case GPUIMAGE_FASTBLUR: - { - self.title = @"Fast Blur"; - self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:1.0]; - [self.filterSettingsSlider setMaximumValue:10.0]; - [self.filterSettingsSlider setValue:1.0]; - - filter = [[GPUImageFastBlurFilter alloc] init]; - }; break; case GPUIMAGE_BOXBLUR: { self.title = @"Box Blur"; @@ -1599,11 +1589,10 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)filter setDisplayTileSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setVignetteEnd:[(UISlider *)sender value]]; break; - case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurRadiusInPixels:round([(UISlider*)sender value])]; break; +// case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setDistanceNormalizationFactor:[(UISlider*)sender value]]; break; - case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; -// case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_MOTIONBLUR: [(GPUImageMotionBlurFilter *)filter setBlurAngle:[(UISlider*)sender value]]; break; case GPUIMAGE_ZOOMBLUR: [(GPUImageZoomBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)filter setOpacity:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index bc57dc4d7..237fc1f20 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -190,8 +190,6 @@ BCAD4D1015718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */; }; BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; }; BCAD4D1515718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */; }; - BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */; }; - BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */; }; BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; }; BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; }; @@ -289,8 +287,6 @@ BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */; }; BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; }; BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */; }; - BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */; }; - BCC93A101501D1BF00958B26 /* GPUImageFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */; }; BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; }; BCC93A1F1501E42F00958B26 /* GPUImageTwoPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */; }; BCC93A301502A90F00958B26 /* GPUImageFilterPipeline.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D69488A1501F58200206FF8 /* GPUImageFilterPipeline.m */; }; @@ -540,8 +536,6 @@ BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSingleComponentGaussianBlurFilter.m; path = Source/GPUImageSingleComponentGaussianBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUimageDirectionalSobelEdgeDetectionFilter.h; path = Source/GPUimageDirectionalSobelEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUimageDirectionalSobelEdgeDetectionFilter.m; path = Source/GPUimageDirectionalSobelEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; - BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSingleComponentFastBlurFilter.h; path = Source/GPUImageSingleComponentFastBlurFilter.h; sourceTree = SOURCE_ROOT; }; - BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSingleComponentFastBlurFilter.m; path = Source/GPUImageSingleComponentFastBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDirectionalNonMaximumSuppressionFilter.h; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDirectionalNonMaximumSuppressionFilter.m; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageWeakPixelInclusionFilter.h; path = Source/GPUImageWeakPixelInclusionFilter.h; sourceTree = SOURCE_ROOT; }; @@ -638,8 +632,6 @@ BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHighlightShadowFilter.m; path = Source/GPUImageHighlightShadowFilter.m; sourceTree = SOURCE_ROOT; }; BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFalseColorFilter.h; path = Source/GPUImageFalseColorFilter.h; sourceTree = SOURCE_ROOT; }; BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFalseColorFilter.m; path = Source/GPUImageFalseColorFilter.m; sourceTree = SOURCE_ROOT; }; - BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFastBlurFilter.h; path = Source/GPUImageFastBlurFilter.h; sourceTree = SOURCE_ROOT; }; - BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFastBlurFilter.m; path = Source/GPUImageFastBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoPassFilter.h; path = Source/GPUImageTwoPassFilter.h; sourceTree = SOURCE_ROOT; }; BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoPassFilter.m; path = Source/GPUImageTwoPassFilter.m; sourceTree = SOURCE_ROOT; }; BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminanceThresholdFilter.h; path = Source/GPUImageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; @@ -1011,10 +1003,6 @@ BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */, BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */, BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */, - BCC93A0D1501D1BF00958B26 /* GPUImageFastBlurFilter.h */, - BCC93A0E1501D1BF00958B26 /* GPUImageFastBlurFilter.m */, - BCAD4D161571957E001E50E1 /* GPUImageSingleComponentFastBlurFilter.h */, - BCAD4D1715719581001E50E1 /* GPUImageSingleComponentFastBlurFilter.m */, 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */, 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */, 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */, @@ -1219,7 +1207,6 @@ 0DF3FA2B14FA00C9006AF7D9 /* GPUImageVignetteFilter.h in Headers */, BC1A483E14FD1EF900D552E8 /* GPUImageGaussianBlurFilter.h in Headers */, BC1B728114FB16AF00ACA2AB /* GPUImageMovieWriter.h in Headers */, - BCC93A0F1501D1BF00958B26 /* GPUImageFastBlurFilter.h in Headers */, BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */, BCC93A321502A92100958B26 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */, B81F2D751788C95500118374 /* GPUImageHSBFilter.h in Headers */, @@ -1287,7 +1274,6 @@ BCAD4CA3156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h in Headers */, BCAD4D0F15718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */, BCAD4D1415718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */, - BCAD4D1815719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.h in Headers */, BCAD4D1C1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */, BCAD4D201571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.h in Headers */, BC56D82A1579779700CC9C1E /* GPUImageUIElement.h in Headers */, @@ -1493,7 +1479,6 @@ 0DF3FA2C14FA00C9006AF7D9 /* GPUImageVignetteFilter.m in Sources */, BC1A47F514FC759D00D552E8 /* GPUImageGaussianBlurFilter.m in Sources */, BC1B728214FB16AF00ACA2AB /* GPUImageMovieWriter.m in Sources */, - BCC93A101501D1BF00958B26 /* GPUImageFastBlurFilter.m in Sources */, BCC93A1F1501E42F00958B26 /* GPUImageTwoPassFilter.m in Sources */, BCC93A301502A90F00958B26 /* GPUImageFilterPipeline.m in Sources */, BCC93A311502A91500958B26 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */, @@ -1558,7 +1543,6 @@ BCAD4CA4156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m in Sources */, BCAD4D1015718AD2001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */, BCAD4D1515718F9E001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */, - BCAD4D1915719584001E50E1 /* GPUImageSingleComponentFastBlurFilter.m in Sources */, BCAD4D1D1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */, BCAD4D211571CB50001E50E1 /* GPUImageWeakPixelInclusionFilter.m in Sources */, BC56D82B1579779700CC9C1E /* GPUImageUIElement.m in Sources */, diff --git a/framework/Source/GLProgram.m b/framework/Source/GLProgram.m index a0de43861..7ce6ece7e 100755 --- a/framework/Source/GLProgram.m +++ b/framework/Source/GLProgram.m @@ -97,6 +97,8 @@ - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type string:(NSString *)shaderString { +// CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + GLint status; const GLchar *source; @@ -127,6 +129,9 @@ - (BOOL)compileShader:(GLuint *)shader } } +// CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime); +// NSLog(@"Compiled in %f ms", linkTime * 1000.0); + return status == GL_TRUE; } // END:compile @@ -157,6 +162,8 @@ - (GLuint)uniformIndex:(NSString *)uniformName // START:link - (BOOL)link { +// CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + GLint status; glLinkProgram(program); @@ -177,6 +184,10 @@ - (BOOL)link } self.initialized = YES; + +// CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime); +// NSLog(@"Linked in %f ms", linkTime * 1000.0); + return YES; } // END:link diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 87f1f0268..e419ac5bd 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -48,7 +48,6 @@ #import "GPUImageDarkenBlendFilter.h" #import "GPUImageLightenBlendFilter.h" #import "GPUImageSwirlFilter.h" -#import "GPUImageFastBlurFilter.h" #import "GPUImageSourceOverBlendFilter.h" #import "GPUImageColorBurnBlendFilter.h" #import "GPUImageColorDodgeBlendFilter.h" diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h index 5df34c501..3474a1017 100755 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.h +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.h @@ -1,7 +1,7 @@ #import "GPUImageFilterGroup.h" @class GPUImageGrayscaleFilter; -@class GPUImageSingleComponentFastBlurFilter; +@class GPUImageSingleComponentGaussianBlurFilter; @class GPUimageDirectionalSobelEdgeDetectionFilter; @class GPUImageDirectionalNonMaximumSuppressionFilter; @class GPUImageWeakPixelInclusionFilter; @@ -22,7 +22,7 @@ @interface GPUImageCannyEdgeDetectionFilter : GPUImageFilterGroup { GPUImageGrayscaleFilter *luminanceFilter; - GPUImageSingleComponentFastBlurFilter *blurFilter; + GPUImageSingleComponentGaussianBlurFilter *blurFilter; GPUimageDirectionalSobelEdgeDetectionFilter *edgeDetectionFilter; GPUImageDirectionalNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; GPUImageWeakPixelInclusionFilter *weakPixelInclusionFilter; diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.m b/framework/Source/GPUImageCannyEdgeDetectionFilter.m index bfb52143b..5e96d28bb 100755 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.m +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.m @@ -1,10 +1,10 @@ #import "GPUImageCannyEdgeDetectionFilter.h" #import "GPUImageGrayscaleFilter.h" -#import "GPUImageSingleComponentFastBlurFilter.h" #import "GPUImageDirectionalSobelEdgeDetectionFilter.h" #import "GPUImageDirectionalNonMaximumSuppressionFilter.h" #import "GPUImageWeakPixelInclusionFilter.h" +#import "GPUImageSingleComponentGaussianBlurFilter.h" @implementation GPUImageCannyEdgeDetectionFilter @@ -26,7 +26,7 @@ - (id)init; [self addFilter:luminanceFilter]; // Second pass: apply a variable Gaussian blur - blurFilter = [[GPUImageSingleComponentFastBlurFilter alloc] init]; + blurFilter = [[GPUImageSingleComponentGaussianBlurFilter alloc] init]; [self addFilter:blurFilter]; // Third pass: run the Sobel edge detection, with calculated gradient directions, on this blurred image diff --git a/framework/Source/GPUImageFastBlurFilter.h b/framework/Source/GPUImageFastBlurFilter.h deleted file mode 100755 index 6cdd3fecf..000000000 --- a/framework/Source/GPUImageFastBlurFilter.h +++ /dev/null @@ -1,15 +0,0 @@ -#import "GPUImageTwoPassTextureSamplingFilter.h" - -/// A hardware-accelerated 9-hit Gaussian blur of an image -@interface GPUImageFastBlurFilter : GPUImageTwoPassTextureSamplingFilter - -/// The number of times to sequentially blur the incoming image. The more passes, the slower the filter. -@property(readwrite, nonatomic) NSUInteger blurPasses; - -/// A scaling for the size of the applied blur, default of 1.0 -@property(readwrite, nonatomic) CGFloat blurSize; - -- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; - - -@end diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m deleted file mode 100755 index 7d09abcc1..000000000 --- a/framework/Source/GPUImageFastBlurFilter.m +++ /dev/null @@ -1,195 +0,0 @@ -#import "GPUImageFastBlurFilter.h" - -// Code based on http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/ - -NSString *const kGPUImageFastBlurVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; - - uniform float texelWidthOffset; - uniform float texelHeightOffset; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepLeftTextureCoordinate; - varying vec2 twoStepsLeftTextureCoordinate; - varying vec2 oneStepRightTextureCoordinate; - varying vec2 twoStepsRightTextureCoordinate; - -// const float offset[3] = float[]( 0.0, 1.3846153846, 3.2307692308 ); - - void main() - { - gl_Position = position; - - vec2 firstOffset = vec2(1.3846153846 * texelWidthOffset, 1.3846153846 * texelHeightOffset); - vec2 secondOffset = vec2(3.2307692308 * texelWidthOffset, 3.2307692308 * texelHeightOffset); - - centerTextureCoordinate = inputTextureCoordinate; - oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset; - twoStepsLeftTextureCoordinate = inputTextureCoordinate - secondOffset; - oneStepRightTextureCoordinate = inputTextureCoordinate + firstOffset; - twoStepsRightTextureCoordinate = inputTextureCoordinate + secondOffset; - } -); - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -NSString *const kGPUImageFastBlurFragmentShaderString = SHADER_STRING -( - precision highp float; - - uniform sampler2D inputImageTexture; - - varying highp vec2 centerTextureCoordinate; - varying highp vec2 oneStepLeftTextureCoordinate; - varying highp vec2 twoStepsLeftTextureCoordinate; - varying highp vec2 oneStepRightTextureCoordinate; - varying highp vec2 twoStepsRightTextureCoordinate; - -// const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); - - void main() - { - lowp vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2270270270; - fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.0702702703; - fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.0702702703; - - gl_FragColor = fragmentColor; - } -); - -NSString *const kGPUImageFastBlurIgnoringAlphaFragmentShaderString = SHADER_STRING -( - precision highp float; - - uniform sampler2D inputImageTexture; - - varying highp vec2 centerTextureCoordinate; - varying highp vec2 oneStepLeftTextureCoordinate; - varying highp vec2 twoStepsLeftTextureCoordinate; - varying highp vec2 oneStepRightTextureCoordinate; - varying highp vec2 twoStepsRightTextureCoordinate; - - // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); - - void main() - { - lowp vec3 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).rgb * 0.2270270270; - fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate).rgb * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate).rgb * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate).rgb * 0.0702702703; - fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate).rgb * 0.0702702703; - - gl_FragColor = vec4(fragmentColor, 1.0); - } -); -#else -NSString *const kGPUImageFastBlurFragmentShaderString = SHADER_STRING -( - uniform sampler2D inputImageTexture; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepLeftTextureCoordinate; - varying vec2 twoStepsLeftTextureCoordinate; - varying vec2 oneStepRightTextureCoordinate; - varying vec2 twoStepsRightTextureCoordinate; - - // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); - - void main() - { - vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2270270270; - fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.0702702703; - fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.0702702703; - - gl_FragColor = fragmentColor; - } -); - -NSString *const kGPUImageFastBlurIgnoringAlphaFragmentShaderString = SHADER_STRING -( - uniform sampler2D inputImageTexture; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepLeftTextureCoordinate; - varying vec2 twoStepsLeftTextureCoordinate; - varying vec2 oneStepRightTextureCoordinate; - varying vec2 twoStepsRightTextureCoordinate; - - // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); - - void main() - { - vec3 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).rgb * 0.2270270270; - fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate).rgb * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate).rgb * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate).rgb * 0.0702702703; - fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate).rgb * 0.0702702703; - - gl_FragColor = vec4(fragmentColor, 1.0); - } -); -#endif - -@implementation GPUImageFastBlurFilter - -@synthesize blurPasses = _blurPasses; -@synthesize blurSize = _blurSize; - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)init; -{ - if (!(self = [self initWithFragmentShaderFromString:kGPUImageFastBlurFragmentShaderString])) - { - return nil; - } - - return self; -} - -- (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString; -{ - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageFastBlurVertexShaderString firstStageFragmentShaderFromString:fragmentShaderString secondStageVertexShaderFromString:kGPUImageFastBlurVertexShaderString secondStageFragmentShaderFromString:fragmentShaderString])) - { - return nil; - } - - self.blurSize = 1.0; - - return self; -} - -#pragma mark - -#pragma mark Rendering - -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; -{ - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; - - for (NSUInteger currentAdditionalBlurPass = 1; currentAdditionalBlurPass < _blurPasses; currentAdditionalBlurPass++) - { - [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation] sourceTexture:secondFilterOutputTexture]; - } -} - -#pragma mark - -#pragma mark Accessors - -- (void)setBlurSize:(CGFloat)newValue; -{ - _blurSize = newValue; - - _verticalTexelSpacing = _blurSize; - _horizontalTexelSpacing = _blurSize; - - [self setupFilterForSize:[self sizeOfFBO]]; -} - -@end - diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index 549663439..3b61aa009 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -1,11 +1,35 @@ #import "GPUImageTwoPassTextureSamplingFilter.h" -/** A more generalized 9x9 Gaussian blur filter +/** A Gaussian blur filter + Interpolated optimization based on Daniel Rákos' work at http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/ */ + @interface GPUImageGaussianBlurFilter : GPUImageTwoPassTextureSamplingFilter +{ + BOOL shouldResizeBlurRadiusWithImageSize; +} /** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 */ @property (readwrite, nonatomic) CGFloat blurSize; +/** A radius in pixels (in 0.5 pixel increments) to use for the blur, with a default of 2.0 + */ +@property (readwrite, nonatomic) CGFloat blurRadiusInPixels; + +/** Setting these properties will allow the blur radius to scale with the size of the image + */ +@property (readwrite, nonatomic) CGFloat blurRadiusAsFractionOfImageWidth; +@property (readwrite, nonatomic) CGFloat blurRadiusAsFractionOfImageHeight; + +/// The number of times to sequentially blur the incoming image. The more passes, the slower the filter. +@property(readwrite, nonatomic) NSUInteger blurPasses; + ++ (NSString *)vertexShaderForStandardGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)fragmentShaderForStandardGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)vertexShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)fragmentShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; + +- (void)switchToVertexShader:(NSString *)newVertexShader fragmentShader:(NSString *)newFragmentShader; + @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index a33b513ea..5bbc69541 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -1,112 +1,42 @@ #import "GPUImageGaussianBlurFilter.h" -NSString *const kGPUImageGaussianBlurVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec4 inputTextureCoordinate; - - const int GAUSSIAN_SAMPLES = 9; - - uniform float texelWidthOffset; - uniform float texelHeightOffset; - - varying vec2 textureCoordinate; - varying vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - - void main() - { - gl_Position = position; - textureCoordinate = inputTextureCoordinate.xy; - - // Calculate the positions for the blur - int multiplier = 0; - vec2 blurStep; - vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset); - - for (int i = 0; i < GAUSSIAN_SAMPLES; i++) - { - multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2)); - // Blur in x (horizontal) - blurStep = float(multiplier) * singleStepOffset; - blurCoordinates[i] = inputTextureCoordinate.xy + blurStep; - } - } -); - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -NSString *const kGPUImageGaussianBlurFragmentShaderString = SHADER_STRING -( - uniform sampler2D inputImageTexture; - - const lowp int GAUSSIAN_SAMPLES = 9; - - varying highp vec2 textureCoordinate; - varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - - void main() - { - lowp vec4 sum = vec4(0.0); - - sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; - sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; - sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; - - gl_FragColor = sum; - } -); -#else -NSString *const kGPUImageGaussianBlurFragmentShaderString = SHADER_STRING -( - uniform sampler2D inputImageTexture; - - const int GAUSSIAN_SAMPLES = 9; - - varying vec2 textureCoordinate; - varying vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - - void main() - { - vec4 sum = vec4(0.0); - - sum += texture2D(inputImageTexture, blurCoordinates[0]) * 0.05; - sum += texture2D(inputImageTexture, blurCoordinates[1]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[2]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[3]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[4]) * 0.18; - sum += texture2D(inputImageTexture, blurCoordinates[5]) * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[6]) * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[7]) * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[8]) * 0.05; - - gl_FragColor = sum; - } -); -#endif - @implementation GPUImageGaussianBlurFilter @synthesize blurSize = _blurSize; +@synthesize blurRadiusInPixels = _blurRadiusInPixels; +@synthesize blurRadiusAsFractionOfImageWidth = _blurRadiusAsFractionOfImageWidth; +@synthesize blurRadiusAsFractionOfImageHeight = _blurRadiusAsFractionOfImageHeight; +@synthesize blurPasses = _blurPasses; + +#pragma mark - +#pragma mark Initialization and teardown - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString { - if (!(self = [super initWithFirstStageVertexShaderFromString:firstStageVertexShaderString ? firstStageVertexShaderString : kGPUImageGaussianBlurVertexShaderString - firstStageFragmentShaderFromString:firstStageFragmentShaderString ? firstStageFragmentShaderString : kGPUImageGaussianBlurFragmentShaderString - secondStageVertexShaderFromString:secondStageVertexShaderString ? secondStageVertexShaderString : kGPUImageGaussianBlurVertexShaderString - secondStageFragmentShaderFromString:secondStageFragmentShaderString ? secondStageFragmentShaderString : kGPUImageGaussianBlurFragmentShaderString])) { +// NSString *currentGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForStandardGaussianOfRadius:4 sigma:2.0]; +// NSString *currentGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForStandardGaussianOfRadius:4 sigma:2.0]; + NSString *currentGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:4 sigma:2.0]; + NSString *currentGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:4 sigma:2.0]; + + if (!(self = [super initWithFirstStageVertexShaderFromString:firstStageVertexShaderString ? firstStageVertexShaderString : currentGaussianBlurVertexShader + firstStageFragmentShaderFromString:firstStageFragmentShaderString ? firstStageFragmentShaderString : currentGaussianBlurFragmentShader + secondStageVertexShaderFromString:secondStageVertexShaderString ? secondStageVertexShaderString : currentGaussianBlurVertexShader + secondStageFragmentShaderFromString:secondStageFragmentShaderString ? secondStageFragmentShaderString : currentGaussianBlurFragmentShader])) { return nil; } self.blurSize = 1.0; + _blurRadiusInPixels = 2.0; + shouldResizeBlurRadiusWithImageSize = NO; +// NSLog(@"Calculated vertex shader: \n%@", currentGaussianBlurVertexShader); +// NSLog(@"Calculated fragment shader: \n%@", currentGaussianBlurFragmentShader); + +// NSLog(@"Optimized vertex shader: \n%@", [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:4 sigma:1.833333]); +// NSLog(@"Optimized fragment shader: \n%@", [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:4 sigma:1.833333]); return self; } @@ -118,6 +48,373 @@ - (id)init; secondStageFragmentShaderFromString:nil]; } +#pragma mark - +#pragma mark Auto-generation of optimized Gaussian shaders + +// "Implementation limit of 32 varying components exceeded" - Max number of varyings for these GPUs + ++ (NSString *)vertexShaderForStandardGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; +{ +// NSLog(@"Max varyings: %d", [GPUImageContext maximumVaryingVectorsForThisDevice]); + NSMutableString *shaderString = [[NSMutableString alloc] init]; + + // Header + [shaderString appendFormat:@"\ + attribute vec4 position;\n\ + attribute vec4 inputTextureCoordinate;\n\ + \n\ + uniform float texelWidthOffset;\n\ + uniform float texelHeightOffset;\n\ + \n\ + varying vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + gl_Position = position;\n\ + \n\ + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", (blurRadius * 2 + 1) ]; + + // Inner offset loop + for (NSUInteger currentBlurCoordinateIndex = 0; currentBlurCoordinateIndex < (blurRadius * 2 + 1); currentBlurCoordinateIndex++) + { + NSInteger offsetFromCenter = currentBlurCoordinateIndex - blurRadius; + if (offsetFromCenter < 0) + { + [shaderString appendFormat:@"blurCoordinates[%d] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", currentBlurCoordinateIndex, (GLfloat)(-offsetFromCenter)]; + } + else if (offsetFromCenter > 0) + { + [shaderString appendFormat:@"blurCoordinates[%d] = inputTextureCoordinate.xy + singleStepOffset * %f;\n", currentBlurCoordinateIndex, (GLfloat)(offsetFromCenter)]; + } + else + { + [shaderString appendFormat:@"blurCoordinates[%d] = inputTextureCoordinate.xy;\n", currentBlurCoordinateIndex]; + } + } + + // Footer + [shaderString appendString:@"}\n"]; + + return shaderString; +} + ++ (NSString *)fragmentShaderForStandardGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; +{ + // First, generate the normal Gaussian weights for a given sigma + GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); + GLfloat sumOfWeights = 0.0; + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = (1.0 / sqrt(2.0 * M_PI * pow(sigma, 2.0))) * exp(-pow(currentGaussianWeightIndex, 2.0) / (2.0 * pow(sigma, 2.0))); + + if (currentGaussianWeightIndex == 0) + { + sumOfWeights += standardGaussianWeights[currentGaussianWeightIndex]; + } + else + { + sumOfWeights += 2.0 * standardGaussianWeights[currentGaussianWeightIndex]; + } + } + + // Next, normalize these weights to prevent the clipping of the Gaussian curve at the end of the discrete samples from reducing luminance + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = standardGaussianWeights[currentGaussianWeightIndex] / sumOfWeights; + } + + // Finally, generate the shader from these weights + NSMutableString *shaderString = [[NSMutableString alloc] init]; + + // Header +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + [shaderString appendFormat:@"\ + uniform sampler2D inputImageTexture;\n\ + \n\ + varying highp vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + lowp vec4 sum = vec4(0.0);\n", (blurRadius * 2 + 1) ]; +#else + [shaderString appendFormat:@"\ + uniform sampler2D inputImageTexture;\n\ + \n\ + varying vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + vec4 sum = vec4(0.0);\n", (blurRadius * 2 + 1) ]; +#endif + + // Inner texture loop + for (NSUInteger currentBlurCoordinateIndex = 0; currentBlurCoordinateIndex < (blurRadius * 2 + 1); currentBlurCoordinateIndex++) + { + NSInteger offsetFromCenter = currentBlurCoordinateIndex - blurRadius; + if (offsetFromCenter < 0) + { + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", currentBlurCoordinateIndex, standardGaussianWeights[-offsetFromCenter]]; + } + else + { + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", currentBlurCoordinateIndex, standardGaussianWeights[offsetFromCenter]]; + } + } + + // Footer + [shaderString appendString:@"\ + gl_FragColor = sum;\n\ + }\n"]; + + free(standardGaussianWeights); + return shaderString; +} + ++ (NSString *)vertexShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; +{ + if (blurRadius == 0) + { + return nil; + } + // First, generate the normal Gaussian weights for a given sigma + GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); + GLfloat sumOfWeights = 0.0; + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = (1.0 / sqrt(2.0 * M_PI * pow(sigma, 2.0))) * exp(-pow(currentGaussianWeightIndex, 2.0) / (2.0 * pow(sigma, 2.0))); + + if (currentGaussianWeightIndex == 0) + { + sumOfWeights += standardGaussianWeights[currentGaussianWeightIndex]; + } + else + { + sumOfWeights += 2.0 * standardGaussianWeights[currentGaussianWeightIndex]; + } + } + + // Next, normalize these weights to prevent the clipping of the Gaussian curve at the end of the discrete samples from reducing luminance + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = standardGaussianWeights[currentGaussianWeightIndex] / sumOfWeights; + } + + // From these weights we calculate the offsets to read interpolated values from + NSUInteger numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), 7); + GLfloat *optimizedGaussianOffsets = calloc(numberOfOptimizedOffsets, sizeof(GLfloat)); + + for (NSUInteger currentOptimizedOffset = 0; currentOptimizedOffset < numberOfOptimizedOffsets; currentOptimizedOffset++) + { + GLfloat firstWeight = standardGaussianWeights[currentOptimizedOffset*2 + 1]; + GLfloat secondWeight = standardGaussianWeights[currentOptimizedOffset*2 + 2]; + + GLfloat optimizedWeight = firstWeight + secondWeight; + + optimizedGaussianOffsets[currentOptimizedOffset] = (firstWeight * (currentOptimizedOffset*2 + 1) + secondWeight * (currentOptimizedOffset*2 + 2)) / optimizedWeight; + } + + NSMutableString *shaderString = [[NSMutableString alloc] init]; + // Header + [shaderString appendFormat:@"\ + attribute vec4 position;\n\ + attribute vec4 inputTextureCoordinate;\n\ + \n\ + uniform float texelWidthOffset;\n\ + uniform float texelHeightOffset;\n\ + \n\ + varying vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + gl_Position = position;\n\ + \n\ + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", 1 + (numberOfOptimizedOffsets * 2)]; + + // Inner offset loop + [shaderString appendString:@"blurCoordinates[0] = inputTextureCoordinate.xy;\n"]; + for (NSUInteger currentOptimizedOffset = 0; currentOptimizedOffset < numberOfOptimizedOffsets; currentOptimizedOffset++) + { + [shaderString appendFormat:@"\ + blurCoordinates[%d] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ + blurCoordinates[%d] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (currentOptimizedOffset * 2) + 1, optimizedGaussianOffsets[currentOptimizedOffset], (currentOptimizedOffset * 2) + 2, optimizedGaussianOffsets[currentOptimizedOffset]]; + } + + // Footer + [shaderString appendString:@"}\n"]; + + free(optimizedGaussianOffsets); + free(standardGaussianWeights); + return shaderString; +} + ++ (NSString *)fragmentShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; +{ + if (blurRadius == 0) + { + return nil; + } + // First, generate the normal Gaussian weights for a given sigma + GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); + GLfloat sumOfWeights = 0.0; + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = (1.0 / sqrt(2.0 * M_PI * pow(sigma, 2.0))) * exp(-pow(currentGaussianWeightIndex, 2.0) / (2.0 * pow(sigma, 2.0))); + + if (currentGaussianWeightIndex == 0) + { + sumOfWeights += standardGaussianWeights[currentGaussianWeightIndex]; + } + else + { + sumOfWeights += 2.0 * standardGaussianWeights[currentGaussianWeightIndex]; + } + } + + // Next, normalize these weights to prevent the clipping of the Gaussian curve at the end of the discrete samples from reducing luminance + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = standardGaussianWeights[currentGaussianWeightIndex] / sumOfWeights; + } + + // From these weights we calculate the offsets to read interpolated values from + NSUInteger numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), 7); + NSUInteger trueNumberOfOptimizedOffsets = blurRadius / 2 + (blurRadius % 2); + + NSMutableString *shaderString = [[NSMutableString alloc] init]; + + // Header +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + [shaderString appendFormat:@"\ + uniform sampler2D inputImageTexture;\n\ + \n\ + varying highp vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + lowp vec4 sum = vec4(0.0);\n", 1 + (numberOfOptimizedOffsets * 2) ]; +#else + [shaderString appendFormat:@"\ + uniform sampler2D inputImageTexture;\n\ + \n\ + varying vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + vec4 sum = vec4(0.0);\n", 1 + (numberOfOptimizedOffsets * 2) ]; +#endif + // Inner texture loop + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0]) * %f;\n", standardGaussianWeights[0]]; + + for (NSUInteger currentBlurCoordinateIndex = 0; currentBlurCoordinateIndex < numberOfOptimizedOffsets; currentBlurCoordinateIndex++) + { + GLfloat firstWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 1]; + GLfloat secondWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 2]; + GLfloat optimizedWeight = firstWeight + secondWeight; + + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 1, optimizedWeight]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 2, optimizedWeight]; + } + + if (trueNumberOfOptimizedOffsets > numberOfOptimizedOffsets) + { + // Do the overflow dependent texture reads + } + + // Footer + [shaderString appendString:@"\ + gl_FragColor = sum;\n\ + }\n"]; + + free(standardGaussianWeights); + return shaderString; +} + +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + [super setupFilterForSize:filterFrameSize]; + + if (shouldResizeBlurRadiusWithImageSize == YES) + { + + } +} + +#pragma mark - +#pragma mark Rendering + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +{ + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + + for (NSUInteger currentAdditionalBlurPass = 1; currentAdditionalBlurPass < _blurPasses; currentAdditionalBlurPass++) + { + [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation] sourceTexture:secondFilterOutputTexture]; + } +} + +- (void)switchToVertexShader:(NSString *)newVertexShader fragmentShader:(NSString *)newFragmentShader; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + filterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:newVertexShader fragmentShaderString:newFragmentShader]; + + if (!filterProgram.initialized) + { + [self initializeAttributes]; + + if (![filterProgram link]) + { + NSString *progLog = [filterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [filterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [filterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + filterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + filterPositionAttribute = [filterProgram attributeIndex:@"position"]; + filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; + filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + [GPUImageContext setActiveShaderProgram:filterProgram]; + + glEnableVertexAttribArray(filterPositionAttribute); + glEnableVertexAttribArray(filterTextureCoordinateAttribute); + + secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:newVertexShader fragmentShaderString:newFragmentShader]; + + if (!secondFilterProgram.initialized) + { + [self initializeSecondaryAttributes]; + + if (![secondFilterProgram link]) + { + NSString *progLog = [secondFilterProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + secondFilterProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; + secondFilterTextureCoordinateAttribute = [secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; + secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; + + glEnableVertexAttribArray(secondFilterPositionAttribute); + glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); + }); + +} + #pragma mark - #pragma mark Accessors @@ -131,5 +428,26 @@ - (void)setBlurSize:(CGFloat)newValue; [self setupFilterForSize:[self sizeOfFBO]]; } +// inputRadius for Core Image's CIGaussianBlur is really sigma in the Gaussian equation, so I'm using that for my blur radius, to be consistent +- (void)setBlurRadiusInPixels:(CGFloat)newValue; +{ + // 7.0 is the limit for blur size for hardcoded varying offsets + + if (newValue != _blurRadiusInPixels) + { + _blurRadiusInPixels = round(newValue); // For now, only do even blur sizes (based on a multiple of two of the sigma) +// _blurRadiusInPixels = (round(newValue * 2.0)) / 2.0; // Only take this in half-pixel steps to minimize shader creation, yet provide single pixel blur resolution + +// NSString *newGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForStandardGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; +// NSString *newGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForStandardGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; + NSString *newGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; + NSString *newGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; +// NSString *newGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:round(_blurRadiusInPixels * 2)/2 sigma:_blurRadiusInPixels]; +// NSString *newGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:round(_blurRadiusInPixels * 2)/2 sigma:_blurRadiusInPixels]; + + [self switchToVertexShader:newGaussianBlurVertexShader fragmentShader:newGaussianBlurFragmentShader]; + } + shouldResizeBlurRadiusWithImageSize = NO; +} @end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index c8e719426..a737ad452 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -3,7 +3,7 @@ @class GPUImageGaussianBlurFilter; @class GPUImageXYDerivativeFilter; @class GPUImageGrayscaleFilter; -@class GPUImageFastBlurFilter; +@class GPUImageGaussianBlurFilter; @class GPUImageThresholdedNonMaximumSuppressionFilter; @class GPUImageColorPackingFilter; @@ -13,7 +13,7 @@ First pass: reduce to luminance and take the derivative of the luminance texture (GPUImageXYDerivativeFilter) - Second pass: blur the derivative (GPUImageFastBlurFilter) + Second pass: blur the derivative (GPUImageGaussianBlurFilter) Third pass: apply the Harris corner detection calculation @@ -23,7 +23,7 @@ @interface GPUImageHarrisCornerDetectionFilter : GPUImageFilterGroup { GPUImageXYDerivativeFilter *derivativeFilter; - GPUImageFastBlurFilter *blurFilter; + GPUImageGaussianBlurFilter *blurFilter; GPUImageFilter *harrisCornerDetectionFilter; GPUImageThresholdedNonMaximumSuppressionFilter *nonMaximumSuppressionFilter; GPUImageColorPackingFilter *colorPackingFilter; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index b4ea4a31a..829b23dc1 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -2,9 +2,9 @@ #import "GPUImageGaussianBlurFilter.h" #import "GPUImageXYDerivativeFilter.h" #import "GPUImageGrayscaleFilter.h" -#import "GPUImageFastBlurFilter.h" #import "GPUImageThresholdedNonMaximumSuppressionFilter.h" #import "GPUImageColorPackingFilter.h" +#import "GPUImageGaussianBlurFilter.h" @interface GPUImageHarrisCornerDetectionFilter() @@ -111,7 +111,7 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS #endif // Second pass: blur the derivative - blurFilter = [[GPUImageFastBlurFilter alloc] init]; + blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; [self addFilter:blurFilter]; #ifdef DEBUGFEATUREDETECTION diff --git a/framework/Source/GPUImageHoughTransformLineDetector.h b/framework/Source/GPUImageHoughTransformLineDetector.h index bd1bb3ff3..3ab6977ff 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.h +++ b/framework/Source/GPUImageHoughTransformLineDetector.h @@ -3,7 +3,6 @@ #import "GPUImageParallelCoordinateLineTransformFilter.h" #import "GPUImageThresholdedNonMaximumSuppressionFilter.h" #import "GPUImageCannyEdgeDetectionFilter.h" -#import "GPUImageFastBlurFilter.h" // This applies a Hough transform to detect lines in a scene. It starts with a thresholded Sobel edge detection pass, // then takes those edge points in and applies a Hough transform to convert them to lines. The intersection of these lines diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.h b/framework/Source/GPUImageSingleComponentFastBlurFilter.h deleted file mode 100644 index 152d01966..000000000 --- a/framework/Source/GPUImageSingleComponentFastBlurFilter.h +++ /dev/null @@ -1,5 +0,0 @@ -#import "GPUImageFastBlurFilter.h" - -@interface GPUImageSingleComponentFastBlurFilter : GPUImageFastBlurFilter - -@end diff --git a/framework/Source/GPUImageSingleComponentFastBlurFilter.m b/framework/Source/GPUImageSingleComponentFastBlurFilter.m deleted file mode 100644 index 4b4ed5de5..000000000 --- a/framework/Source/GPUImageSingleComponentFastBlurFilter.m +++ /dev/null @@ -1,70 +0,0 @@ -#import "GPUImageSingleComponentFastBlurFilter.h" - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -NSString *const kGPUImageSingleComponentFastBlurFragmentShaderString = SHADER_STRING -( - precision highp float; - - uniform sampler2D inputImageTexture; - - varying highp vec2 centerTextureCoordinate; - varying highp vec2 oneStepLeftTextureCoordinate; - varying highp vec2 twoStepsLeftTextureCoordinate; - varying highp vec2 oneStepRightTextureCoordinate; - varying highp vec2 twoStepsRightTextureCoordinate; - - // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); - - void main() - { - lowp float fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).r * 0.2270270270; - fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate).r * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate).r * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate).r * 0.0702702703; - fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate).r * 0.0702702703; - - gl_FragColor = vec4(vec3(fragmentColor), 1.0); - } -); -#else -NSString *const kGPUImageSingleComponentFastBlurFragmentShaderString = SHADER_STRING -( - uniform sampler2D inputImageTexture; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepLeftTextureCoordinate; - varying vec2 twoStepsLeftTextureCoordinate; - varying vec2 oneStepRightTextureCoordinate; - varying vec2 twoStepsRightTextureCoordinate; - - // const float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); - - void main() - { - float fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate).r * 0.2270270270; - fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate).r * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate).r * 0.3162162162; - fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate).r * 0.0702702703; - fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate).r * 0.0702702703; - - gl_FragColor = vec4(vec3(fragmentColor), 1.0); - } -); -#endif - -@implementation GPUImageSingleComponentFastBlurFilter - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)init; -{ - if (!(self = [super initWithFragmentShaderFromString:kGPUImageSingleComponentFastBlurFragmentShaderString])) - { - return nil; - } - - return self; -} - -@end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 7670091e6..899626bc3 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -31,7 +31,7 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade NSLog(@"Fragment shader compile log: %@", fragLog); NSString *vertLog = [secondFilterProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; + secondFilterProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } diff --git a/framework/Source/iOS/GPUImageContext.h b/framework/Source/iOS/GPUImageContext.h index 71bc81680..4491ccf38 100755 --- a/framework/Source/iOS/GPUImageContext.h +++ b/framework/Source/iOS/GPUImageContext.h @@ -23,6 +23,7 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; ++ (GLint)maximumVaryingVectorsForThisDevice; + (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; + (BOOL)deviceSupportsRedTextures; + (BOOL)deviceSupportsFramebufferReads; diff --git a/framework/Source/iOS/GPUImageContext.m b/framework/Source/iOS/GPUImageContext.m index 8f0008bcb..c8229b79a 100755 --- a/framework/Source/iOS/GPUImageContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -98,11 +98,30 @@ + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; { - GLint maxTextureUnits; - glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); + static dispatch_once_t pred; + static GLint maxTextureUnits = 0; + + dispatch_once(&pred, ^{ + [self useImageProcessingContext]; + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); + }); + return maxTextureUnits; } ++ (GLint)maximumVaryingVectorsForThisDevice; +{ + static dispatch_once_t pred; + static GLint maxVaryingVectors = 0; + + dispatch_once(&pred, ^{ + [self useImageProcessingContext]; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryingVectors); + }); + + return maxVaryingVectors; +} + + (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; { static dispatch_once_t pred; From 4fc4cfa90baba06bb327bba8c3da01b8d9e75720 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 18 Oct 2013 18:10:54 -0500 Subject: [PATCH 468/695] Expanded Gaussian shader generator to support kernels beyond the limit of OpenGL ES varyings, using dependent texture reads after that. --- .../ShowcaseFilterViewController.m | 4 +-- framework/Source/GPUImageGaussianBlurFilter.m | 34 +++++++++++++++---- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index cf3a6e05c..8656714e2 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1154,7 +1154,7 @@ - (void)setupFilter; self.filterSettingsSlider.hidden = NO; [self.filterSettingsSlider setMinimumValue:1.0]; - [self.filterSettingsSlider setMaximumValue:7.0]; + [self.filterSettingsSlider setMaximumValue:14.0]; [self.filterSettingsSlider setValue:2.0]; filter = [[GPUImageGaussianBlurFilter alloc] init]; @@ -1589,7 +1589,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)filter setDisplayTileSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setVignetteEnd:[(UISlider *)sender value]]; break; - case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurRadiusInPixels:round([(UISlider*)sender value])]; break; + case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurRadiusInPixels:[(UISlider*)sender value]]; break; // case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setDistanceNormalizationFactor:[(UISlider*)sender value]]; break; diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index 5bbc69541..edc377c0f 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -14,7 +14,8 @@ @implementation GPUImageGaussianBlurFilter - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString - secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString { + secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString +{ // NSString *currentGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForStandardGaussianOfRadius:4 sigma:2.0]; // NSString *currentGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForStandardGaussianOfRadius:4 sigma:2.0]; @@ -32,9 +33,6 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad _blurRadiusInPixels = 2.0; shouldResizeBlurRadiusWithImageSize = NO; -// NSLog(@"Calculated vertex shader: \n%@", currentGaussianBlurVertexShader); -// NSLog(@"Calculated fragment shader: \n%@", currentGaussianBlurFragmentShader); - // NSLog(@"Optimized vertex shader: \n%@", [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:4 sigma:1.833333]); // NSLog(@"Optimized fragment shader: \n%@", [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:4 sigma:1.833333]); return self; @@ -286,6 +284,8 @@ + (NSString *)fragmentShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE [shaderString appendFormat:@"\ uniform sampler2D inputImageTexture;\n\ + uniform highp float texelWidthOffset;\n\ + uniform highp float texelHeightOffset;\n\ \n\ varying highp vec2 blurCoordinates[%d];\n\ \n\ @@ -295,6 +295,8 @@ void main()\n\ #else [shaderString appendFormat:@"\ uniform sampler2D inputImageTexture;\n\ + uniform float texelWidthOffset;\n\ + uniform float texelHeightOffset;\n\ \n\ varying vec2 blurCoordinates[%d];\n\ \n\ @@ -302,6 +304,7 @@ void main()\n\ {\n\ vec4 sum = vec4(0.0);\n", 1 + (numberOfOptimizedOffsets * 2) ]; #endif + // Inner texture loop [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0]) * %f;\n", standardGaussianWeights[0]]; @@ -315,9 +318,22 @@ void main()\n\ [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 2, optimizedWeight]; } + // If the number of required samples exceeds the amount we can pass in via varyings, we have to do dependent texture reads in the fragment shader if (trueNumberOfOptimizedOffsets > numberOfOptimizedOffsets) { - // Do the overflow dependent texture reads + [shaderString appendString:@"highp vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; + + for (NSUInteger currentOverlowTextureRead = numberOfOptimizedOffsets; currentOverlowTextureRead < trueNumberOfOptimizedOffsets; currentOverlowTextureRead++) + { + GLfloat firstWeight = standardGaussianWeights[currentOverlowTextureRead * 2 + 1]; + GLfloat secondWeight = standardGaussianWeights[currentOverlowTextureRead * 2 + 2]; + + GLfloat optimizedWeight = firstWeight + secondWeight; + GLfloat optimizedOffset = (firstWeight * (currentOverlowTextureRead * 2 + 1) + secondWeight * (currentOverlowTextureRead * 2 + 2)) / optimizedWeight; + + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0] + singleStepOffset * %f) * %f;\n", optimizedOffset, optimizedWeight]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0] - singleStepOffset * %f) * %f;\n", optimizedOffset, optimizedWeight]; + } } // Footer @@ -379,6 +395,8 @@ - (void)switchToVertexShader:(NSString *)newVertexShader fragmentShader:(NSStrin filterPositionAttribute = [filterProgram attributeIndex:@"position"]; filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; + verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; [GPUImageContext setActiveShaderProgram:filterProgram]; glEnableVertexAttribArray(filterPositionAttribute); @@ -407,10 +425,14 @@ - (void)switchToVertexShader:(NSString *)newVertexShader fragmentShader:(NSStrin secondFilterTextureCoordinateAttribute = [secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; + horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; [GPUImageContext setActiveShaderProgram:secondFilterProgram]; glEnableVertexAttribArray(secondFilterPositionAttribute); glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); + + [self setupFilterForSize:[self sizeOfFBO]]; }); } @@ -438,8 +460,6 @@ - (void)setBlurRadiusInPixels:(CGFloat)newValue; _blurRadiusInPixels = round(newValue); // For now, only do even blur sizes (based on a multiple of two of the sigma) // _blurRadiusInPixels = (round(newValue * 2.0)) / 2.0; // Only take this in half-pixel steps to minimize shader creation, yet provide single pixel blur resolution -// NSString *newGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForStandardGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; -// NSString *newGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForStandardGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; NSString *newGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; NSString *newGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; // NSString *newGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:round(_blurRadiusInPixels * 2)/2 sigma:_blurRadiusInPixels]; From 619ea47ea243a27449fe1092d1b97799df4250f5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 18 Oct 2013 22:47:19 -0500 Subject: [PATCH 469/695] Reworked the box blur in the same fashion as the new Gaussian blur, so it is now truly smooth across various radii. --- .../FeatureExtractionAppDelegate.m | 27 ++- .../ShowcaseFilterViewController.m | 9 +- framework/Source/GPUImageBilateralFilter.m | 37 ++- framework/Source/GPUImageBoxBlurFilter.h | 9 +- framework/Source/GPUImageBoxBlurFilter.m | 225 +++++++++++------- framework/Source/GPUImageGaussianBlurFilter.h | 9 +- framework/Source/GPUImageGaussianBlurFilter.m | 61 +++-- framework/Source/iOS/GPUImageContext.m | 14 ++ 8 files changed, 262 insertions(+), 129 deletions(-) diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index 1ec773b9e..c54dea2d4 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -119,6 +119,12 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( CIContext *coreImageContext = [CIContext contextWithEAGLContext:[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]]; // CIContext *coreImageContext = [CIContext contextWithOptions:nil]; + +// NSArray *cifilters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn]; +// for (NSString *ciFilterName in cifilters) +// { +// NSLog(@"%@", ciFilterName); +// } CIImage *inputCIGaussianImage = [[CIImage alloc] initWithCGImage:gaussianBlurInput.CGImage]; CIFilter *gaussianBlurCIFilter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues: kCIInputImageKey, inputCIGaussianImage, @@ -127,8 +133,27 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( CGImageRef resultRef = [coreImageContext createCGImage:coreImageResult fromRect:CGRectMake(0, 0, gaussianBlurInput.size.width, gaussianBlurInput.size.height)]; UIImage *coreImageResult2 = [UIImage imageWithCGImage:resultRef]; [self saveImage:coreImageResult2 fileName:@"Gaussian-CoreImage.png"]; - CGImageRelease(resultRef); + + GPUImageBoxBlurFilter *boxBlur = [[GPUImageBoxBlurFilter alloc] init]; + boxBlur.blurRadiusInPixels = 3.0; + [gaussianImage removeAllTargets]; + [gaussianImage addTarget:boxBlur]; + [gaussianImage processImage]; + UIImage *boxOutput = [boxBlur imageFromCurrentlyProcessedOutput]; + [self saveImage:boxOutput fileName:@"BoxBlur-GPUImage.png"]; + + CIImage *inputCIBoxImage = [[CIImage alloc] initWithCGImage:gaussianBlurInput.CGImage]; + CIFilter *boxBlurCIFilter = [CIFilter filterWithName:@"CIBoxBlur" + keysAndValues: kCIInputImageKey, inputCIBoxImage, + @"inputRadius", [NSNumber numberWithFloat:2.0], nil]; + + NSLog(@"Box blur: %@", boxBlurCIFilter); + CIImage *coreImageResult3 = [boxBlurCIFilter outputImage]; + CGImageRef resultRef2 = [coreImageContext createCGImage:coreImageResult3 fromRect:CGRectMake(0, 0, gaussianBlurInput.size.width, gaussianBlurInput.size.height)]; + UIImage *coreImageResult4 = [UIImage imageWithCGImage:resultRef2]; + [self saveImage:coreImageResult4 fileName:@"BoxBlur-CoreImage.png"]; + CGImageRelease(resultRef2); [chairPicture removeAllTargets]; [chairPicture addTarget:averageColor]; diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 8656714e2..10eef6865 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1154,7 +1154,7 @@ - (void)setupFilter; self.filterSettingsSlider.hidden = NO; [self.filterSettingsSlider setMinimumValue:1.0]; - [self.filterSettingsSlider setMaximumValue:14.0]; + [self.filterSettingsSlider setMaximumValue:24.0]; [self.filterSettingsSlider setValue:2.0]; filter = [[GPUImageGaussianBlurFilter alloc] init]; @@ -1162,7 +1162,11 @@ - (void)setupFilter; case GPUIMAGE_BOXBLUR: { self.title = @"Box Blur"; - self.filterSettingsSlider.hidden = YES; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:1.0]; + [self.filterSettingsSlider setMaximumValue:24.0]; + [self.filterSettingsSlider setValue:2.0]; filter = [[GPUImageBoxBlurFilter alloc] init]; }; break; @@ -1589,6 +1593,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_PERLINNOISE: [(GPUImagePerlinNoiseFilter *)filter setScale:[(UISlider *)sender value]]; break; case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)filter setDisplayTileSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setVignetteEnd:[(UISlider *)sender value]]; break; + case GPUIMAGE_BOXBLUR: [(GPUImageBoxBlurFilter *)filter setBlurRadiusInPixels:[(UISlider*)sender value]]; break; case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurRadiusInPixels:[(UISlider*)sender value]]; break; // case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m index b30e834f5..c149019e2 100644 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -1,5 +1,38 @@ #import "GPUImageBilateralFilter.h" +NSString *const kGPUImageBilateralBlurVertexShaderString = SHADER_STRING +( + attribute vec4 position; + attribute vec4 inputTextureCoordinate; + + const int GAUSSIAN_SAMPLES = 9; + + uniform float texelWidthOffset; + uniform float texelHeightOffset; + + varying vec2 textureCoordinate; + varying vec2 blurCoordinates[GAUSSIAN_SAMPLES]; + + void main() + { + gl_Position = position; + textureCoordinate = inputTextureCoordinate.xy; + + // Calculate the positions for the blur + int multiplier = 0; + vec2 blurStep; + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset); + + for (int i = 0; i < GAUSSIAN_SAMPLES; i++) + { + multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2)); + // Blur in x (horizontal) + blurStep = float(multiplier) * singleStepOffset; + blurCoordinates[i] = inputTextureCoordinate.xy + blurStep; + } + } +); + #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageBilateralFilterFragmentShaderString = SHADER_STRING ( @@ -161,9 +194,9 @@ @implementation GPUImageBilateralFilter - (id)init; { - if (!(self = [super initWithFirstStageVertexShaderFromString:nil + if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageBilateralBlurVertexShaderString firstStageFragmentShaderFromString:kGPUImageBilateralFilterFragmentShaderString - secondStageVertexShaderFromString:nil + secondStageVertexShaderFromString:kGPUImageBilateralBlurVertexShaderString secondStageFragmentShaderFromString:kGPUImageBilateralFilterFragmentShaderString])) { return nil; } diff --git a/framework/Source/GPUImageBoxBlurFilter.h b/framework/Source/GPUImageBoxBlurFilter.h index 6e7451fa5..3fd880bfb 100755 --- a/framework/Source/GPUImageBoxBlurFilter.h +++ b/framework/Source/GPUImageBoxBlurFilter.h @@ -1,10 +1,7 @@ -#import "GPUImageTwoPassTextureSamplingFilter.h" +#import "GPUImageGaussianBlurFilter.h" -/** A hardware-accelerated 9-hit box blur of an image +/** A hardware-accelerated box blur of an image */ -@interface GPUImageBoxBlurFilter : GPUImageTwoPassTextureSamplingFilter - -/// A scaling for the size of the applied blur, default of 1.0 -@property(readwrite, nonatomic) CGFloat blurSize; +@interface GPUImageBoxBlurFilter : GPUImageGaussianBlurFilter @end diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index e6a984ea0..00404bf78 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -1,97 +1,149 @@ #import "GPUImageBoxBlurFilter.h" -NSString *const kGPUImageBoxBlurVertexShaderString = SHADER_STRING -( - attribute vec4 position; - attribute vec2 inputTextureCoordinate; - uniform float texelWidthOffset; - uniform float texelHeightOffset; +@implementation GPUImageBoxBlurFilter - varying vec2 centerTextureCoordinate; - varying vec2 oneStepLeftTextureCoordinate; - varying vec2 twoStepsLeftTextureCoordinate; - varying vec2 oneStepRightTextureCoordinate; - varying vec2 twoStepsRightTextureCoordinate; ++ (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; +{ + if (blurRadius == 0) + { + return nil; + } - void main() - { - gl_Position = position; - - vec2 firstOffset = vec2(1.5 * texelWidthOffset, 1.5 * texelHeightOffset); - vec2 secondOffset = vec2(3.5 * texelWidthOffset, 3.5 * texelHeightOffset); - - centerTextureCoordinate = inputTextureCoordinate; - oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset; - twoStepsLeftTextureCoordinate = inputTextureCoordinate - secondOffset; - oneStepRightTextureCoordinate = inputTextureCoordinate + firstOffset; - twoStepsRightTextureCoordinate = inputTextureCoordinate + secondOffset; - } -); + // From these weights we calculate the offsets to read interpolated values from + NSUInteger numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), 7); + + NSMutableString *shaderString = [[NSMutableString alloc] init]; + // Header + [shaderString appendFormat:@"\ + attribute vec4 position;\n\ + attribute vec4 inputTextureCoordinate;\n\ + \n\ + uniform float texelWidthOffset;\n\ + uniform float texelHeightOffset;\n\ + \n\ + varying vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + gl_Position = position;\n\ + \n\ + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", 1 + (numberOfOptimizedOffsets * 2)]; + + // Inner offset loop + [shaderString appendString:@"blurCoordinates[0] = inputTextureCoordinate.xy;\n"]; + for (NSUInteger currentOptimizedOffset = 0; currentOptimizedOffset < numberOfOptimizedOffsets; currentOptimizedOffset++) + { + GLfloat optimizedOffset = (GLfloat)(currentOptimizedOffset * 2) + 1.5; + + [shaderString appendFormat:@"\ + blurCoordinates[%d] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ + blurCoordinates[%d] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (currentOptimizedOffset * 2) + 1, optimizedOffset, (currentOptimizedOffset * 2) + 2, optimizedOffset]; + } + + // Footer + [shaderString appendString:@"}\n"]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -NSString *const kGPUImageBoxBlurFragmentShaderString = SHADER_STRING -( - precision highp float; + return shaderString; +} - uniform sampler2D inputImageTexture; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepLeftTextureCoordinate; - varying vec2 twoStepsLeftTextureCoordinate; - varying vec2 oneStepRightTextureCoordinate; - varying vec2 twoStepsRightTextureCoordinate; - - void main() - { - lowp vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2; - fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.2; - fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.2; - fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.2; - fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.2; - - gl_FragColor = fragmentColor; - } -); ++ (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; +{ + if (blurRadius == 0) + { + return nil; + } + + NSUInteger numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), 7); + NSUInteger trueNumberOfOptimizedOffsets = blurRadius / 2 + (blurRadius % 2); + + NSMutableString *shaderString = [[NSMutableString alloc] init]; + + // Header +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + [shaderString appendFormat:@"\ + uniform sampler2D inputImageTexture;\n\ + uniform highp float texelWidthOffset;\n\ + uniform highp float texelHeightOffset;\n\ + \n\ + varying highp vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + lowp vec4 sum = vec4(0.0);\n", 1 + (numberOfOptimizedOffsets * 2) ]; #else -NSString *const kGPUImageBoxBlurFragmentShaderString = SHADER_STRING -( - uniform sampler2D inputImageTexture; - - varying vec2 centerTextureCoordinate; - varying vec2 oneStepLeftTextureCoordinate; - varying vec2 twoStepsLeftTextureCoordinate; - varying vec2 oneStepRightTextureCoordinate; - varying vec2 twoStepsRightTextureCoordinate; - - void main() - { - vec4 fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2; - fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.2; - fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.2; - fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.2; - fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.2; - - gl_FragColor = fragmentColor; - } -); + [shaderString appendFormat:@"\ + uniform sampler2D inputImageTexture;\n\ + uniform float texelWidthOffset;\n\ + uniform float texelHeightOffset;\n\ + \n\ + varying vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + vec4 sum = vec4(0.0);\n", 1 + (numberOfOptimizedOffsets * 2) ]; #endif + + GLfloat boxWeight = 1.0 / (GLfloat)((blurRadius * 2) + 1); + + // Inner texture loop + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0]) * %f;\n", boxWeight]; + + for (NSUInteger currentBlurCoordinateIndex = 0; currentBlurCoordinateIndex < numberOfOptimizedOffsets; currentBlurCoordinateIndex++) + { + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 1, boxWeight * 2.0]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 2, boxWeight * 2.0]; + } + + // If the number of required samples exceeds the amount we can pass in via varyings, we have to do dependent texture reads in the fragment shader + if (trueNumberOfOptimizedOffsets > numberOfOptimizedOffsets) + { + [shaderString appendString:@"highp vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; + + for (NSUInteger currentOverlowTextureRead = numberOfOptimizedOffsets; currentOverlowTextureRead < trueNumberOfOptimizedOffsets; currentOverlowTextureRead++) + { + GLfloat optimizedOffset = (GLfloat)(currentOverlowTextureRead * 2) + 1.5; + + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0] + singleStepOffset * %f) * %f;\n", optimizedOffset, boxWeight * 2.0]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0] - singleStepOffset * %f) * %f;\n", optimizedOffset, boxWeight * 2.0]; + } + } + + // Footer + [shaderString appendString:@"\ + gl_FragColor = sum;\n\ + }\n"]; + + return shaderString; +} -@implementation GPUImageBoxBlurFilter - -@synthesize blurSize = _blurSize; +- (void)setupFilterForSize:(CGSize)filterFrameSize; +{ + [super setupFilterForSize:filterFrameSize]; + + if (shouldResizeBlurRadiusWithImageSize == YES) + { + + } +} #pragma mark - #pragma mark Initialization and teardown - (id)init; { - if (!(self = [super initWithFirstStageVertexShaderFromString:kGPUImageBoxBlurVertexShaderString firstStageFragmentShaderFromString:kGPUImageBoxBlurFragmentShaderString secondStageVertexShaderFromString:kGPUImageBoxBlurVertexShaderString secondStageFragmentShaderFromString:kGPUImageBoxBlurFragmentShaderString])) + // NSString *currentGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForStandardGaussianOfRadius:4 sigma:2.0]; + // NSString *currentGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForStandardGaussianOfRadius:4 sigma:2.0]; + + NSString *currentBoxBlurVertexShader = [[self class] vertexShaderForOptimizedBlurOfRadius:4 sigma:0.0]; + NSString *currentBoxBlurFragmentShader = [[self class] fragmentShaderForOptimizedBlurOfRadius:4 sigma:0.0]; + + if (!(self = [super initWithFirstStageVertexShaderFromString:currentBoxBlurVertexShader firstStageFragmentShaderFromString:currentBoxBlurFragmentShader secondStageVertexShaderFromString:currentBoxBlurVertexShader secondStageFragmentShaderFromString:currentBoxBlurFragmentShader])) { - return nil; + return nil; } - - self.blurSize = 1.0; + + _blurRadiusInPixels = 4.0; return self; } @@ -99,14 +151,23 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setBlurRadiusInPixels:(CGFloat)newValue; { - _blurSize = newValue; - - _verticalTexelSpacing = _blurSize; - _horizontalTexelSpacing = _blurSize; + CGFloat newBlurRadius = round(round(newValue / 2.0) * 2.0); // For now, only do even radii - [self setupFilterForSize:[self sizeOfFBO]]; + if (newBlurRadius != _blurRadiusInPixels) + { + _blurRadiusInPixels = newBlurRadius; + + NSString *newGaussianBlurVertexShader = [[self class] vertexShaderForOptimizedBlurOfRadius:_blurRadiusInPixels sigma:0.0]; + NSString *newGaussianBlurFragmentShader = [[self class] fragmentShaderForOptimizedBlurOfRadius:_blurRadiusInPixels sigma:0.0]; + + // NSLog(@"Optimized vertex shader: \n%@", newGaussianBlurVertexShader); + // NSLog(@"Optimized fragment shader: \n%@", newGaussianBlurFragmentShader); + // + [self switchToVertexShader:newGaussianBlurVertexShader fragmentShader:newGaussianBlurFragmentShader]; + } + shouldResizeBlurRadiusWithImageSize = NO; } @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index 3b61aa009..eda3a901f 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -7,6 +7,7 @@ @interface GPUImageGaussianBlurFilter : GPUImageTwoPassTextureSamplingFilter { BOOL shouldResizeBlurRadiusWithImageSize; + CGFloat _blurRadiusInPixels; } /** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 @@ -25,10 +26,10 @@ /// The number of times to sequentially blur the incoming image. The more passes, the slower the filter. @property(readwrite, nonatomic) NSUInteger blurPasses; -+ (NSString *)vertexShaderForStandardGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; -+ (NSString *)fragmentShaderForStandardGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; -+ (NSString *)vertexShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; -+ (NSString *)fragmentShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)vertexShaderForStandardBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)fragmentShaderForStandardBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; - (void)switchToVertexShader:(NSString *)newVertexShader fragmentShader:(NSString *)newFragmentShader; diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index edc377c0f..be973d448 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -11,21 +11,10 @@ @implementation GPUImageGaussianBlurFilter #pragma mark - #pragma mark Initialization and teardown -- (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString - firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString - secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString - secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString +- (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString { - -// NSString *currentGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForStandardGaussianOfRadius:4 sigma:2.0]; -// NSString *currentGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForStandardGaussianOfRadius:4 sigma:2.0]; - NSString *currentGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:4 sigma:2.0]; - NSString *currentGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:4 sigma:2.0]; - - if (!(self = [super initWithFirstStageVertexShaderFromString:firstStageVertexShaderString ? firstStageVertexShaderString : currentGaussianBlurVertexShader - firstStageFragmentShaderFromString:firstStageFragmentShaderString ? firstStageFragmentShaderString : currentGaussianBlurFragmentShader - secondStageVertexShaderFromString:secondStageVertexShaderString ? secondStageVertexShaderString : currentGaussianBlurVertexShader - secondStageFragmentShaderFromString:secondStageFragmentShaderString ? secondStageFragmentShaderString : currentGaussianBlurFragmentShader])) { + if (!(self = [super initWithFirstStageVertexShaderFromString:firstStageVertexShaderString firstStageFragmentShaderFromString:firstStageFragmentShaderString secondStageVertexShaderFromString:secondStageVertexShaderString secondStageFragmentShaderFromString:secondStageFragmentShaderString])) + { return nil; } @@ -33,17 +22,18 @@ - (id) initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShad _blurRadiusInPixels = 2.0; shouldResizeBlurRadiusWithImageSize = NO; -// NSLog(@"Optimized vertex shader: \n%@", [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:4 sigma:1.833333]); -// NSLog(@"Optimized fragment shader: \n%@", [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:4 sigma:1.833333]); return self; } - (id)init; { - return [self initWithFirstStageVertexShaderFromString:nil - firstStageFragmentShaderFromString:nil - secondStageVertexShaderFromString:nil - secondStageFragmentShaderFromString:nil]; + // NSString *currentGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForStandardGaussianOfRadius:4 sigma:2.0]; + // NSString *currentGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForStandardGaussianOfRadius:4 sigma:2.0]; + + NSString *currentGaussianBlurVertexShader = [[self class] vertexShaderForOptimizedBlurOfRadius:4 sigma:2.0]; + NSString *currentGaussianBlurFragmentShader = [[self class] fragmentShaderForOptimizedBlurOfRadius:4 sigma:2.0]; + + return [self initWithFirstStageVertexShaderFromString:currentGaussianBlurVertexShader firstStageFragmentShaderFromString:currentGaussianBlurFragmentShader secondStageVertexShaderFromString:currentGaussianBlurVertexShader secondStageFragmentShaderFromString:currentGaussianBlurFragmentShader]; } #pragma mark - @@ -51,7 +41,7 @@ - (id)init; // "Implementation limit of 32 varying components exceeded" - Max number of varyings for these GPUs -+ (NSString *)vertexShaderForStandardGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)vertexShaderForStandardBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { // NSLog(@"Max varyings: %d", [GPUImageContext maximumVaryingVectorsForThisDevice]); NSMutableString *shaderString = [[NSMutableString alloc] init]; @@ -96,7 +86,7 @@ void main()\n\ return shaderString; } -+ (NSString *)fragmentShaderForStandardGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)fragmentShaderForStandardBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { // First, generate the normal Gaussian weights for a given sigma GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); @@ -168,7 +158,7 @@ void main()\n\ return shaderString; } -+ (NSString *)vertexShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { if (blurRadius == 0) { @@ -245,7 +235,7 @@ void main()\n\ return shaderString; } -+ (NSString *)fragmentShaderForOptimizedGaussianOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; ++ (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { if (blurRadius == 0) { @@ -455,16 +445,23 @@ - (void)setBlurRadiusInPixels:(CGFloat)newValue; { // 7.0 is the limit for blur size for hardcoded varying offsets - if (newValue != _blurRadiusInPixels) + if (round(newValue) != _blurRadiusInPixels) { - _blurRadiusInPixels = round(newValue); // For now, only do even blur sizes (based on a multiple of two of the sigma) -// _blurRadiusInPixels = (round(newValue * 2.0)) / 2.0; // Only take this in half-pixel steps to minimize shader creation, yet provide single pixel blur resolution + _blurRadiusInPixels = round(newValue); // For now, only do integral sigmas - NSString *newGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; - NSString *newGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:(_blurRadiusInPixels * 2) sigma:_blurRadiusInPixels]; -// NSString *newGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForOptimizedGaussianOfRadius:round(_blurRadiusInPixels * 2)/2 sigma:_blurRadiusInPixels]; -// NSString *newGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForOptimizedGaussianOfRadius:round(_blurRadiusInPixels * 2)/2 sigma:_blurRadiusInPixels]; - + // Calculate the number of pixels to sample from by setting a bottom limit for the contribution of the outermost pixel + CGFloat minimumWeightToFindEdgeOfSamplingArea = 1.0/256.0; + NSUInteger calculatedSampleRadius = floor(sqrt(-2.0 * pow(_blurRadiusInPixels, 2.0) * log(minimumWeightToFindEdgeOfSamplingArea * sqrt(2.0 * M_PI * pow(_blurRadiusInPixels, 2.0))) )); + calculatedSampleRadius += calculatedSampleRadius % 2; // There's nothing to gain from handling odd radius sizes, due to the optimizations I use + +// NSLog(@"Blur radius: %f, calculated sample radius: %d", _blurRadiusInPixels, calculatedSampleRadius); +// + NSString *newGaussianBlurVertexShader = [[self class] vertexShaderForOptimizedBlurOfRadius:calculatedSampleRadius sigma:_blurRadiusInPixels]; + NSString *newGaussianBlurFragmentShader = [[self class] fragmentShaderForOptimizedBlurOfRadius:calculatedSampleRadius sigma:_blurRadiusInPixels]; + +// NSLog(@"Optimized vertex shader: \n%@", newGaussianBlurVertexShader); +// NSLog(@"Optimized fragment shader: \n%@", newGaussianBlurFragmentShader); +// [self switchToVertexShader:newGaussianBlurVertexShader fragmentShader:newGaussianBlurFragmentShader]; } shouldResizeBlurRadiusWithImageSize = NO; diff --git a/framework/Source/iOS/GPUImageContext.m b/framework/Source/iOS/GPUImageContext.m index c8229b79a..6f1d60840 100755 --- a/framework/Source/iOS/GPUImageContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -2,9 +2,12 @@ #import #import +#define MAXSHADERPROGRAMSALLOWEDINCACHE 40 + @interface GPUImageContext() { NSMutableDictionary *shaderProgramCache; + NSMutableArray *shaderProgramUsageHistory; EAGLSharegroup *_sharegroup; } @@ -33,6 +36,7 @@ - (id)init; dispatch_queue_set_specific(_contextQueue, openGLESContextQueueKey, (__bridge void *)self, NULL); #endif shaderProgramCache = [[NSMutableDictionary alloc] init]; + shaderProgramUsageHistory = [[NSMutableArray alloc] init]; return self; } @@ -201,6 +205,16 @@ - (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragm { programFromCache = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; [shaderProgramCache setObject:programFromCache forKey:lookupKeyForShaderProgram]; +// [shaderProgramUsageHistory addObject:lookupKeyForShaderProgram]; +// if ([shaderProgramUsageHistory count] >= MAXSHADERPROGRAMSALLOWEDINCACHE) +// { +// for (NSUInteger currentShaderProgramRemovedFromCache = 0; currentShaderProgramRemovedFromCache < 10; currentShaderProgramRemovedFromCache++) +// { +// NSString *shaderProgramToRemoveFromCache = [shaderProgramUsageHistory objectAtIndex:0]; +// [shaderProgramUsageHistory removeObjectAtIndex:0]; +// [shaderProgramCache removeObjectForKey:shaderProgramToRemoveFromCache]; +// } +// } } return programFromCache; From 165aac0522be13d83f3bea087086f6cf55bfd4a5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 18 Oct 2013 23:56:43 -0500 Subject: [PATCH 470/695] Restructured the interfaces of classes relying on the blurs to use the new parameters. This will break anything using these classes, so you might want to read up on what the new parameters do. --- README.md | 47 ++-- .../ShowcaseFilterViewController.m | 18 +- .../Source/GPUImageAdaptiveThresholdFilter.h | 4 +- .../Source/GPUImageAdaptiveThresholdFilter.m | 8 +- framework/Source/GPUImageBilateralFilter.m | 2 +- .../Source/GPUImageCannyEdgeDetectionFilter.h | 8 +- .../Source/GPUImageCannyEdgeDetectionFilter.m | 24 ++- framework/Source/GPUImageGaussianBlurFilter.h | 6 +- framework/Source/GPUImageGaussianBlurFilter.m | 12 +- .../GPUImageGaussianSelectiveBlurFilter.h | 4 +- .../GPUImageGaussianSelectiveBlurFilter.m | 12 +- .../GPUImageHarrisCornerDetectionFilter.h | 4 +- .../GPUImageHarrisCornerDetectionFilter.m | 12 +- ...PUImageSingleComponentGaussianBlurFilter.m | 201 +++++++++++++++--- framework/Source/GPUImageSmoothToonFilter.h | 4 +- framework/Source/GPUImageSmoothToonFilter.m | 12 +- framework/Source/GPUImageSoftEleganceFilter.m | 2 +- framework/Source/GPUImageTiltShiftFilter.h | 4 +- framework/Source/GPUImageTiltShiftFilter.m | 12 +- framework/Source/GPUImageUnsharpMaskFilter.h | 4 +- framework/Source/GPUImageUnsharpMaskFilter.m | 12 +- 21 files changed, 285 insertions(+), 127 deletions(-) diff --git a/README.md b/README.md index 27bd32d29..856b5354d 100755 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ There are currently 125 built-in filters, divided into the following categories: - *threshold*: The luminance threshold, from 0.0 to 1.0, with a default of 0.5 - **GPUImageAdaptiveThresholdFilter**: Determines the local luminance around a pixel, then turns the pixel black if it is below that local luminance and white if above. This can be useful for picking out text under varying lighting conditions. + - *blurRadiusInPixels*: A multiplier for the background averaging blur radius in pixels, with a default of 4. - **GPUImageAverageLuminanceThresholdFilter**: This applies a thresholding operation where the threshold is continually adjusted based on the average luminance of the scene. - *thresholdMultiplier*: This is a factor that the average luminance will be multiplied by in order to arrive at the final threshold to use. By default, this is 1.0. @@ -167,23 +168,32 @@ There are currently 125 built-in filters, divided into the following categories: - *sharpness*: The sharpness adjustment to apply (-4.0 - 4.0, with 0.0 as the default) - **GPUImageUnsharpMaskFilter**: Applies an unsharp mask - - *blurSize*: A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 + - *blurRadiusInPixels*: The blur radius of the underlying Gaussian blur. The default is 4.0. - *intensity*: The strength of the sharpening, from 0.0 on up, with a default of 1.0 -- **GPUImageFastBlurFilter**: A hardware-accelerated 9-hit Gaussian blur of an image - - *blurPasses*: The number of times to re-apply this blur on an image. More passes lead to a blurrier image, yet they require more processing power. The default is 1. +- **GPUImageGaussianBlurFilter**: A hardware-optimized, variable-radius Gaussian blur + - *texelSpacingMultiplier*: A multiplier for the spacing between texels, ranging from 0.0 on up, with a default of 1.0. Adjusting this may slightly increase the blur strength, but will introduce artifacts in the result. Highly recommend using other parameters first, before touching this one. + - *blurRadiusInPixels*: A radius in pixels to use for the blur, with a default of 2.0. This adjusts the sigma variable in the Gaussian distribution function. + - *blurRadiusAsFractionOfImageWidth*: + - *blurRadiusAsFractionOfImageHeight*: Setting these properties will allow the blur radius to scale with the size of the image + - *blurPasses*: The number of times to sequentially blur the incoming image. The more passes, the slower the filter. -- **GPUImageSingleComponentFastBlurFilter**: A modification of the GPUImageFastBlurFilter to only operate on the red component - - *blurPasses*: The number of times to re-apply this blur on an image. More passes lead to a blurrier image, yet they require more processing power. The default is 1. - -- **GPUImageGaussianBlurFilter**: A more generalized 9x9 Gaussian blur filter - - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 +- **GPUImageBoxBlurFilter**: A hardware-optimized, variable-radius box blur + - *texelSpacingMultiplier*: A multiplier for the spacing between texels, ranging from 0.0 on up, with a default of 1.0. Adjusting this may slightly increase the blur strength, but will introduce artifacts in the result. Highly recommend using other parameters first, before touching this one. + - *blurRadiusInPixels*: A radius in pixels to use for the blur, with a default of 2.0. This adjusts the sigma variable in the Gaussian distribution function. + - *blurRadiusAsFractionOfImageWidth*: + - *blurRadiusAsFractionOfImageHeight*: Setting these properties will allow the blur radius to scale with the size of the image + - *blurPasses*: The number of times to sequentially blur the incoming image. The more passes, the slower the filter. - **GPUImageSingleComponentGaussianBlurFilter**: A modification of the GPUImageGaussianBlurFilter that operates only on the red component - - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 + - *texelSpacingMultiplier*: A multiplier for the spacing between texels, ranging from 0.0 on up, with a default of 1.0. Adjusting this may slightly increase the blur strength, but will introduce artifacts in the result. Highly recommend using other parameters first, before touching this one. + - *blurRadiusInPixels*: A radius in pixels to use for the blur, with a default of 2.0. This adjusts the sigma variable in the Gaussian distribution function. + - *blurRadiusAsFractionOfImageWidth*: + - *blurRadiusAsFractionOfImageHeight*: Setting these properties will allow the blur radius to scale with the size of the image + - *blurPasses*: The number of times to sequentially blur the incoming image. The more passes, the slower the filter. - **GPUImageGaussianSelectiveBlurFilter**: A Gaussian blur that preserves focus within a circular region - - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 + - *blurRadiusInPixels*: A radius in pixels to use for the blur, with a default of 5.0. This adjusts the sigma variable in the Gaussian distribution function. - *excludeCircleRadius*: The radius of the circular area being excluded from the blur - *excludeCirclePoint*: The center of the circular area being excluded from the blur - *excludeBlurSize*: The size of the area between the blurred portion and the clear circle @@ -197,17 +207,15 @@ There are currently 125 built-in filters, divided into the following categories: - **GPUImageMedianFilter**: Takes the median value of the three color components, over a 3x3 area - **GPUImageBilateralFilter**: A bilateral blur, which tries to blur similar color values while preserving sharp edges - - *blurSize*: A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 4.0 + - *texelSpacingMultiplier*: A multiplier for the spacing between texel reads, ranging from 0.0 on up, with a default of 4.0 - *distanceNormalizationFactor*: A normalization factor for the distance between central color and sample color, with a default of 8.0. - **GPUImageTiltShiftFilter**: A simulated tilt shift lens effect - - *blurSize*: A multiplier for the size of the out-of-focus blur, ranging from 0.0 on up, with a default of 2.0 + - *blurRadiusInPixels*: The radius of the underlying blur, in pixels. This is 7.0 by default. - *topFocusLevel*: The normalized location of the top of the in-focus area in the image, this value should be lower than bottomFocusLevel, default 0.4 - *bottomFocusLevel*: The normalized location of the bottom of the in-focus area in the image, this value should be higher than topFocusLevel, default 0.6 - *focusFallOffRate*: The rate at which the image gets blurry away from the in-focus region, default 0.2 -- **GPUImageBoxBlurFilter**: A hardware-accelerated 9-hit box blur of an image - - **GPUImage3x3ConvolutionFilter**: Runs a 3x3 convolution kernel against the image - *convolutionKernel*: The convolution kernel is a 3x3 matrix of values to apply to the pixel and its 8 surrounding pixels. The matrix is specified in row-major order, with the top left pixel being one.one and the bottom right three.three. If the values in the matrix don't add up to 1.0, the image could be brightened or darkened. @@ -230,22 +238,23 @@ There are currently 125 built-in filters, divided into the following categories: - **GPUImageCannyEdgeDetectionFilter**: This uses the full Canny process to highlight one-pixel-wide edges - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges - - *blurSize*: A multiplier for the prepass blur size, ranging from 0.0 on up, with a default of 1.0 + - *blurRadiusInPixels*: The underlying blur radius for the Gaussian blur. Default is 2.0. + - *blurTexelSpacingMultiplier*: The underlying blur texel spacing multiplier. Default is 1.0. - *upperThreshold*: Any edge with a gradient magnitude above this threshold will pass and show up in the final result. Default is 0.4. - *lowerThreshold*: Any edge with a gradient magnitude below this threshold will fail and be removed from the final result. Default is 0.1. - **GPUImageHarrisCornerDetectionFilter**: Runs the Harris corner detection algorithm on an input image, and produces an image with those corner points as white pixels and everything else black. The cornersDetectedBlock can be set, and you will be provided with a list of corners (in normalized 0..1 X, Y coordinates) within that callback for whatever additional operations you want to perform. - - *blurSize*: The relative size of the blur applied as part of the corner detection implementation. The default is 1.0. + - *blurRadiusInPixels*: The radius of the underlying Gaussian blur. The default is 2.0. - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 5.0. - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.20. - **GPUImageNobleCornerDetectionFilter**: Runs the Noble variant on the Harris corner detector. It behaves as described above for the Harris detector. - - *blurSize*: The relative size of the blur applied as part of the corner detection implementation. The default is 1.0. + - *blurRadiusInPixels*: The radius of the underlying Gaussian blur. The default is 2.0. - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 5.0. - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.2. - **GPUImageShiTomasiCornerDetectionFilter**: Runs the Shi-Tomasi feature detector. It behaves as described above for the Harris detector. - - *blurSize*: The relative size of the blur applied as part of the corner detection implementation. The default is 1.0. + - *blurRadiusInPixels*: The radius of the underlying Gaussian blur. The default is 2.0. - *sensitivity*: An internal scaling factor applied to adjust the dynamic range of the cornerness maps generated in the filter. The default is 1.5. - *threshold*: The threshold at which a point is detected as a corner. This can vary significantly based on the size, lighting conditions, and iOS device camera type, so it might take a little experimentation to get right for your cases. Default is 0.2. @@ -403,7 +412,7 @@ There are currently 125 built-in filters, divided into the following categories: - **GPUImageSmoothToonFilter**: This uses a similar process as the GPUImageToonFilter, only it precedes the toon effect with a Gaussian blur to smooth out noise. - *texelWidth*: - *texelHeight*: These parameters affect the visibility of the detected edges - - *blurSize*: A multiplier for the prepass blur size, ranging from 0.0 on up, with a default of 0.5 + - *blurRadiusInPixels*: The radius of the underlying Gaussian blur. The default is 2.0. - *threshold*: The sensitivity of the edge detection, with lower values being more sensitive. Ranges from 0.0 to 1.0, with 0.2 as the default - *quantizationLevels*: The number of color levels to represent in the final image. Default is 10.0 diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 10eef6865..a150c998a 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -559,10 +559,6 @@ - (void)setupFilter; [self.filterSettingsSlider setMaximumValue:1.0]; [self.filterSettingsSlider setValue:1.0]; -// [self.filterSettingsSlider setMinimumValue:0.0]; -// [self.filterSettingsSlider setMaximumValue:0.5]; -// [self.filterSettingsSlider setValue:0.1]; - filter = [[GPUImageCannyEdgeDetectionFilter alloc] init]; }; break; case GPUIMAGE_THRESHOLDEDGEDETECTION: @@ -663,9 +659,9 @@ - (void)setupFilter; self.title = @"Smooth Toon"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:0.0]; - [self.filterSettingsSlider setMaximumValue:1.0]; - [self.filterSettingsSlider setValue:0.5]; + [self.filterSettingsSlider setMinimumValue:1.0]; + [self.filterSettingsSlider setMaximumValue:6.0]; + [self.filterSettingsSlider setValue:1.0]; filter = [[GPUImageSmoothToonFilter alloc] init]; }; break; @@ -1450,7 +1446,7 @@ - (void)setupFilter; // Provide a blurred image for a cool-looking background GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; [videoCamera addTarget:gaussianBlur]; - gaussianBlur.blurSize = 2.0; + gaussianBlur.blurRadiusInPixels = 5.0; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; blendFilter.mix = 1.0; @@ -1561,7 +1557,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_PREWITTEDGEDETECTION: [(GPUImagePrewittEdgeDetectionFilter *)filter setEdgeStrength:[(UISlider *)sender value]]; break; case GPUIMAGE_SKETCH: [(GPUImageSketchFilter *)filter setEdgeStrength:[(UISlider *)sender value]]; break; case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)filter setThreshold:[(UISlider *)sender value]]; break; - case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)filter setBlurRadiusInPixels:[(UISlider*)sender value]]; break; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)filter setThresholdMultiplier:[(UISlider *)sender value]]; break; case GPUIMAGE_DISSOLVE: [(GPUImageDissolveBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; case GPUIMAGE_POISSONBLEND: [(GPUImagePoissonBlendFilter *)filter setMix:[(UISlider *)sender value]]; break; @@ -1573,7 +1569,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_KUWAHARA: [(GPUImageKuwaharaFilter *)filter setRadius:round([(UISlider *)sender value])]; break; case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)filter setAngle:[(UISlider *)sender value]]; break; case GPUIMAGE_EMBOSS: [(GPUImageEmbossFilter *)filter setIntensity:[(UISlider *)sender value]]; break; - case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setBlurTexelSpacingMultiplier:[(UISlider*)sender value]]; break; // case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)filter setLowerThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; case GPUIMAGE_NOBLECORNERDETECTION: [(GPUImageNobleCornerDetectionFilter *)filter setThreshold:[(UISlider*)sender value]]; break; @@ -1581,7 +1577,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR: [(GPUImageHoughTransformLineDetector *)filter setLineDetectionThreshold:[(UISlider*)sender value]]; break; // case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)filter setSensitivity:[(UISlider*)sender value]]; break; case GPUIMAGE_THRESHOLDEDGEDETECTION: [(GPUImageThresholdEdgeDetectionFilter *)filter setThreshold:[(UISlider *)sender value]]; break; - case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)filter setBlurRadiusInPixels:[(UISlider*)sender value]]; break; case GPUIMAGE_THRESHOLDSKETCH: [(GPUImageThresholdSketchFilter *)filter setThreshold:[(UISlider *)sender value]]; break; // case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setRadius:[(UISlider *)sender value]]; break; case GPUIMAGE_BULGE: [(GPUImageBulgeDistortionFilter *)filter setScale:[(UISlider *)sender value]]; break; diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.h b/framework/Source/GPUImageAdaptiveThresholdFilter.h index 7d9f031f8..32785560d 100755 --- a/framework/Source/GPUImageAdaptiveThresholdFilter.h +++ b/framework/Source/GPUImageAdaptiveThresholdFilter.h @@ -2,8 +2,8 @@ @interface GPUImageAdaptiveThresholdFilter : GPUImageFilterGroup -/** A multiplier for the background averaging blur size, ranging from 0.0 on up, with a default of 1.0 +/** A multiplier for the background averaging blur radius in pixels, with a default of 4 */ -@property(readwrite, nonatomic) CGFloat blurSize; +@property(readwrite, nonatomic) CGFloat blurRadiusInPixels; @end diff --git a/framework/Source/GPUImageAdaptiveThresholdFilter.m b/framework/Source/GPUImageAdaptiveThresholdFilter.m index 7b49e6647..71fa6abf0 100755 --- a/framework/Source/GPUImageAdaptiveThresholdFilter.m +++ b/framework/Source/GPUImageAdaptiveThresholdFilter.m @@ -87,14 +87,14 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setBlurRadiusInPixels:(CGFloat)newValue; { - boxBlurFilter.blurSize = newValue; + boxBlurFilter.blurRadiusInPixels = newValue; } -- (CGFloat)blurSize; +- (CGFloat)blurRadiusInPixels; { - return boxBlurFilter.blurSize; + return boxBlurFilter.blurRadiusInPixels; } @end diff --git a/framework/Source/GPUImageBilateralFilter.m b/framework/Source/GPUImageBilateralFilter.m index c149019e2..c2a8c8675 100644 --- a/framework/Source/GPUImageBilateralFilter.m +++ b/framework/Source/GPUImageBilateralFilter.m @@ -204,7 +204,7 @@ - (id)init; firstDistanceNormalizationFactorUniform = [filterProgram uniformIndex:@"distanceNormalizationFactor"]; secondDistanceNormalizationFactorUniform = [filterProgram uniformIndex:@"distanceNormalizationFactor"]; - self.blurSize = 4.0; + self.texelSpacingMultiplier = 4.0; self.distanceNormalizationFactor = 8.0; diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.h b/framework/Source/GPUImageCannyEdgeDetectionFilter.h index 3474a1017..e01a64339 100755 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.h +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.h @@ -43,9 +43,13 @@ */ @property(readwrite, nonatomic) CGFloat texelHeight; -/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 +/** The underlying blur radius for the Gaussian blur. Default is 2.0. */ -@property (readwrite, nonatomic) CGFloat blurSize; +@property (readwrite, nonatomic) CGFloat blurRadiusInPixels; + +/** The underlying blur texel spacing multiplier. Default is 1.0. + */ +@property (readwrite, nonatomic) CGFloat blurTexelSpacingMultiplier; /** Any edge with a gradient magnitude above this threshold will pass and show up in the final result. */ diff --git a/framework/Source/GPUImageCannyEdgeDetectionFilter.m b/framework/Source/GPUImageCannyEdgeDetectionFilter.m index 5e96d28bb..b566e77a7 100755 --- a/framework/Source/GPUImageCannyEdgeDetectionFilter.m +++ b/framework/Source/GPUImageCannyEdgeDetectionFilter.m @@ -10,7 +10,8 @@ @implementation GPUImageCannyEdgeDetectionFilter @synthesize upperThreshold; @synthesize lowerThreshold; -@synthesize blurSize; +@synthesize blurRadiusInPixels; +@synthesize blurTexelSpacingMultiplier; @synthesize texelWidth; @synthesize texelHeight; @@ -50,7 +51,8 @@ - (id)init; // self.terminalFilter = nonMaximumSuppressionFilter; self.terminalFilter = weakPixelInclusionFilter; - self.blurSize = 1.0; + self.blurRadiusInPixels = 2.0; + self.blurTexelSpacingMultiplier = 1.0; self.upperThreshold = 0.4; self.lowerThreshold = 0.1; @@ -60,14 +62,24 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setBlurRadiusInPixels:(CGFloat)newValue; { - blurFilter.blurSize = newValue; + blurFilter.blurRadiusInPixels = newValue; } -- (CGFloat)blurSize; +- (CGFloat)blurRadiusInPixels; { - return blurFilter.blurSize; + return blurFilter.blurRadiusInPixels; +} + +- (void)setBlurTexelSpacingMultiplier:(CGFloat)newValue; +{ + blurFilter.texelSpacingMultiplier = newValue; +} + +- (CGFloat)blurTexelSpacingMultiplier; +{ + return blurFilter.texelSpacingMultiplier; } - (void)setTexelWidth:(CGFloat)newValue; diff --git a/framework/Source/GPUImageGaussianBlurFilter.h b/framework/Source/GPUImageGaussianBlurFilter.h index eda3a901f..dc2bb785e 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.h +++ b/framework/Source/GPUImageGaussianBlurFilter.h @@ -10,11 +10,11 @@ CGFloat _blurRadiusInPixels; } -/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0 +/** A multiplier for the spacing between texels, ranging from 0.0 on up, with a default of 1.0. Adjusting this may slightly increase the blur strength, but will introduce artifacts in the result. */ -@property (readwrite, nonatomic) CGFloat blurSize; +@property (readwrite, nonatomic) CGFloat texelSpacingMultiplier; -/** A radius in pixels (in 0.5 pixel increments) to use for the blur, with a default of 2.0 +/** A radius in pixels to use for the blur, with a default of 2.0. This adjusts the sigma variable in the Gaussian distribution function. */ @property (readwrite, nonatomic) CGFloat blurRadiusInPixels; diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index be973d448..ad390ae7b 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -2,7 +2,7 @@ @implementation GPUImageGaussianBlurFilter -@synthesize blurSize = _blurSize; +@synthesize texelSpacingMultiplier = _texelSpacingMultiplier; @synthesize blurRadiusInPixels = _blurRadiusInPixels; @synthesize blurRadiusAsFractionOfImageWidth = _blurRadiusAsFractionOfImageWidth; @synthesize blurRadiusAsFractionOfImageHeight = _blurRadiusAsFractionOfImageHeight; @@ -18,7 +18,7 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade return nil; } - self.blurSize = 1.0; + self.texelSpacingMultiplier = 1.0; _blurRadiusInPixels = 2.0; shouldResizeBlurRadiusWithImageSize = NO; @@ -430,12 +430,12 @@ - (void)switchToVertexShader:(NSString *)newVertexShader fragmentShader:(NSStrin #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setTexelSpacingMultiplier:(CGFloat)newValue; { - _blurSize = newValue; + _texelSpacingMultiplier = newValue; - _verticalTexelSpacing = _blurSize; - _horizontalTexelSpacing = _blurSize; + _verticalTexelSpacing = _texelSpacingMultiplier; + _horizontalTexelSpacing = _texelSpacingMultiplier; [self setupFilterForSize:[self sizeOfFBO]]; } diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h index 3bf8e6200..023245665 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.h +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.h @@ -20,9 +20,9 @@ /** The size of the area between the blurred portion and the clear circle */ @property (readwrite, nonatomic) CGFloat excludeBlurSize; -/** A multiplier for the size of the blur, ranging from 0.0 on up, with a default of 1.0 +/** A radius in pixels to use for the blur, with a default of 5.0. This adjusts the sigma variable in the Gaussian distribution function. */ -@property (readwrite, nonatomic) CGFloat blurSize; +@property (readwrite, nonatomic) CGFloat blurRadiusInPixels; /** The aspect ratio of the image, used to adjust the circularity of the in-focus region. By default, this matches the image aspect ratio, but you can override this value. */ @property (readwrite, nonatomic) CGFloat aspectRatio; diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index 7bf419a06..7ebc9e192 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -57,7 +57,7 @@ void main() @implementation GPUImageGaussianSelectiveBlurFilter @synthesize excludeCirclePoint = _excludeCirclePoint, excludeCircleRadius = _excludeCircleRadius, excludeBlurSize = _excludeBlurSize; -@synthesize blurSize = _blurSize; +@synthesize blurRadiusInPixels = _blurRadiusInPixels; @synthesize aspectRatio = _aspectRatio; - (id)init; @@ -84,7 +84,7 @@ - (id)init; self.initialFilters = [NSArray arrayWithObjects:blurFilter, selectiveFocusFilter, nil]; self.terminalFilter = selectiveFocusFilter; - self.blurSize = 2.0; + self.blurRadiusInPixels = 5.0; self.excludeCircleRadius = 60.0/320.0; self.excludeCirclePoint = CGPointMake(0.5f, 0.5f); @@ -109,14 +109,14 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setBlurRadiusInPixels:(CGFloat)newValue; { - blurFilter.blurSize = newValue; + blurFilter.blurRadiusInPixels = newValue; } -- (CGFloat)blurSize; +- (CGFloat)blurRadiusInPixels; { - return blurFilter.blurSize; + return blurFilter.blurRadiusInPixels; } - (void)setExcludeCirclePoint:(CGPoint)newValue; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.h b/framework/Source/GPUImageHarrisCornerDetectionFilter.h index a737ad452..1492b8b88 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.h +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.h @@ -31,9 +31,9 @@ GLubyte *rawImagePixels; } -/** A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 +/** The radius of the underlying Gaussian blur. The default is 2.0. */ -@property(readwrite, nonatomic) CGFloat blurSize; +@property(readwrite, nonatomic) CGFloat blurRadiusInPixels; // This changes the dynamic range of the Harris corner detector by amplifying small cornerness values. Default is 5.0. @property(readwrite, nonatomic) CGFloat sensitivity; diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 829b23dc1..1a191fb75 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -67,7 +67,7 @@ void main() ); #endif -@synthesize blurSize; +@synthesize blurRadiusInPixels; @synthesize cornersDetectedBlock; @synthesize sensitivity = _sensitivity; @synthesize threshold = _threshold; @@ -185,7 +185,7 @@ - (id)initWithCornerDetectionFragmentShader:(NSString *)cornerDetectionFragmentS // self.terminalFilter = colorPackingFilter; self.terminalFilter = nonMaximumSuppressionFilter; - self.blurSize = 1.0; + self.blurRadiusInPixels = 2.0; self.sensitivity = 5.0; self.threshold = 0.20; @@ -262,14 +262,14 @@ - (BOOL)wantsMonochromeInput; #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setBlurRadiusInPixels:(CGFloat)newValue; { - blurFilter.blurSize = newValue; + blurFilter.blurRadiusInPixels = newValue; } -- (CGFloat)blurSize; +- (CGFloat)blurRadiusInPixels; { - return blurFilter.blurSize; + return blurFilter.blurRadiusInPixels; } - (void)setSensitivity:(CGFloat)newValue; diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m index 2690aabe7..df13bbc25 100644 --- a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m +++ b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m @@ -2,45 +2,182 @@ @implementation GPUImageSingleComponentGaussianBlurFilter -NSString *const kGPUImageSingleComponentGaussianBlurFragmentShaderString = SHADER_STRING -( - uniform sampler2D inputImageTexture; - - const lowp int GAUSSIAN_SAMPLES = 9; - - varying highp vec2 textureCoordinate; - varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; - - void main() { - lowp float sum = 0.0; - - sum += texture2D(inputImageTexture, blurCoordinates[0]).r * 0.05; - sum += texture2D(inputImageTexture, blurCoordinates[1]).r * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[2]).r * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[3]).r * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[4]).r * 0.18; - sum += texture2D(inputImageTexture, blurCoordinates[5]).r * 0.15; - sum += texture2D(inputImageTexture, blurCoordinates[6]).r * 0.12; - sum += texture2D(inputImageTexture, blurCoordinates[7]).r * 0.09; - sum += texture2D(inputImageTexture, blurCoordinates[8]).r * 0.05; - - gl_FragColor = vec4(sum, sum, sum, 1.0); - } -); - -- (id)init; ++ (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { + if (blurRadius == 0) + { + return nil; + } + // First, generate the normal Gaussian weights for a given sigma + GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); + GLfloat sumOfWeights = 0.0; + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = (1.0 / sqrt(2.0 * M_PI * pow(sigma, 2.0))) * exp(-pow(currentGaussianWeightIndex, 2.0) / (2.0 * pow(sigma, 2.0))); + + if (currentGaussianWeightIndex == 0) + { + sumOfWeights += standardGaussianWeights[currentGaussianWeightIndex]; + } + else + { + sumOfWeights += 2.0 * standardGaussianWeights[currentGaussianWeightIndex]; + } + } + + // Next, normalize these weights to prevent the clipping of the Gaussian curve at the end of the discrete samples from reducing luminance + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = standardGaussianWeights[currentGaussianWeightIndex] / sumOfWeights; + } + + // From these weights we calculate the offsets to read interpolated values from + NSUInteger numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), 7); + GLfloat *optimizedGaussianOffsets = calloc(numberOfOptimizedOffsets, sizeof(GLfloat)); - if (!(self = [super initWithFirstStageVertexShaderFromString:nil - firstStageFragmentShaderFromString:kGPUImageSingleComponentGaussianBlurFragmentShaderString - secondStageVertexShaderFromString:nil - secondStageFragmentShaderFromString:kGPUImageSingleComponentGaussianBlurFragmentShaderString])) + for (NSUInteger currentOptimizedOffset = 0; currentOptimizedOffset < numberOfOptimizedOffsets; currentOptimizedOffset++) + { + GLfloat firstWeight = standardGaussianWeights[currentOptimizedOffset*2 + 1]; + GLfloat secondWeight = standardGaussianWeights[currentOptimizedOffset*2 + 2]; + + GLfloat optimizedWeight = firstWeight + secondWeight; + + optimizedGaussianOffsets[currentOptimizedOffset] = (firstWeight * (currentOptimizedOffset*2 + 1) + secondWeight * (currentOptimizedOffset*2 + 2)) / optimizedWeight; + } + + NSMutableString *shaderString = [[NSMutableString alloc] init]; + // Header + [shaderString appendFormat:@"\ + attribute vec4 position;\n\ + attribute vec4 inputTextureCoordinate;\n\ + \n\ + uniform float texelWidthOffset;\n\ + uniform float texelHeightOffset;\n\ + \n\ + varying vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + gl_Position = position;\n\ + \n\ + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", 1 + (numberOfOptimizedOffsets * 2)]; + + // Inner offset loop + [shaderString appendString:@"blurCoordinates[0] = inputTextureCoordinate.xy;\n"]; + for (NSUInteger currentOptimizedOffset = 0; currentOptimizedOffset < numberOfOptimizedOffsets; currentOptimizedOffset++) + { + [shaderString appendFormat:@"\ + blurCoordinates[%d] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ + blurCoordinates[%d] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (currentOptimizedOffset * 2) + 1, optimizedGaussianOffsets[currentOptimizedOffset], (currentOptimizedOffset * 2) + 2, optimizedGaussianOffsets[currentOptimizedOffset]]; + } + + // Footer + [shaderString appendString:@"}\n"]; + + free(optimizedGaussianOffsets); + free(standardGaussianWeights); + return shaderString; +} + ++ (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; +{ + if (blurRadius == 0) { return nil; } + // First, generate the normal Gaussian weights for a given sigma + GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); + GLfloat sumOfWeights = 0.0; + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = (1.0 / sqrt(2.0 * M_PI * pow(sigma, 2.0))) * exp(-pow(currentGaussianWeightIndex, 2.0) / (2.0 * pow(sigma, 2.0))); + + if (currentGaussianWeightIndex == 0) + { + sumOfWeights += standardGaussianWeights[currentGaussianWeightIndex]; + } + else + { + sumOfWeights += 2.0 * standardGaussianWeights[currentGaussianWeightIndex]; + } + } + + // Next, normalize these weights to prevent the clipping of the Gaussian curve at the end of the discrete samples from reducing luminance + for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < blurRadius + 1; currentGaussianWeightIndex++) + { + standardGaussianWeights[currentGaussianWeightIndex] = standardGaussianWeights[currentGaussianWeightIndex] / sumOfWeights; + } + + // From these weights we calculate the offsets to read interpolated values from + NSUInteger numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), 7); + NSUInteger trueNumberOfOptimizedOffsets = blurRadius / 2 + (blurRadius % 2); + + NSMutableString *shaderString = [[NSMutableString alloc] init]; + + // Header +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + [shaderString appendFormat:@"\ + uniform sampler2D inputImageTexture;\n\ + uniform highp float texelWidthOffset;\n\ + uniform highp float texelHeightOffset;\n\ + \n\ + varying highp vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + lowp float sum = 0.0;\n", 1 + (numberOfOptimizedOffsets * 2) ]; +#else + [shaderString appendFormat:@"\ + uniform sampler2D inputImageTexture;\n\ + uniform float texelWidthOffset;\n\ + uniform float texelHeightOffset;\n\ + \n\ + varying vec2 blurCoordinates[%d];\n\ + \n\ + void main()\n\ + {\n\ + float sum = 0.0;\n", 1 + (numberOfOptimizedOffsets * 2) ]; +#endif + + // Inner texture loop + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0]).r * %f;\n", standardGaussianWeights[0]]; + + for (NSUInteger currentBlurCoordinateIndex = 0; currentBlurCoordinateIndex < numberOfOptimizedOffsets; currentBlurCoordinateIndex++) + { + GLfloat firstWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 1]; + GLfloat secondWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 2]; + GLfloat optimizedWeight = firstWeight + secondWeight; + + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]).r * %f;\n", (currentBlurCoordinateIndex * 2) + 1, optimizedWeight]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]).r * %f;\n", (currentBlurCoordinateIndex * 2) + 2, optimizedWeight]; + } + // If the number of required samples exceeds the amount we can pass in via varyings, we have to do dependent texture reads in the fragment shader + if (trueNumberOfOptimizedOffsets > numberOfOptimizedOffsets) + { + [shaderString appendString:@"highp vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; + + for (NSUInteger currentOverlowTextureRead = numberOfOptimizedOffsets; currentOverlowTextureRead < trueNumberOfOptimizedOffsets; currentOverlowTextureRead++) + { + GLfloat firstWeight = standardGaussianWeights[currentOverlowTextureRead * 2 + 1]; + GLfloat secondWeight = standardGaussianWeights[currentOverlowTextureRead * 2 + 2]; + + GLfloat optimizedWeight = firstWeight + secondWeight; + GLfloat optimizedOffset = (firstWeight * (currentOverlowTextureRead * 2 + 1) + secondWeight * (currentOverlowTextureRead * 2 + 2)) / optimizedWeight; + + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0] + singleStepOffset * %f).r * %f;\n", optimizedOffset, optimizedWeight]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[0] - singleStepOffset * %f).r * %f;\n", optimizedOffset, optimizedWeight]; + } + } - return self; + // Footer + [shaderString appendString:@"\ + gl_FragColor = vec4(sum, sum, sum, 1.0);\n\ + }\n"]; + + free(standardGaussianWeights); + return shaderString; } + @end diff --git a/framework/Source/GPUImageSmoothToonFilter.h b/framework/Source/GPUImageSmoothToonFilter.h index 353f2926f..f89caac5e 100755 --- a/framework/Source/GPUImageSmoothToonFilter.h +++ b/framework/Source/GPUImageSmoothToonFilter.h @@ -16,8 +16,8 @@ /// The image width and height factors tweak the appearance of the edges. By default, they match the filter size in pixels @property(readwrite, nonatomic) CGFloat texelHeight; -/// A multiplier for the blur size, ranging from 0.0 on up, with a default of 0.5 -@property (readwrite, nonatomic) CGFloat blurSize; +/// The radius of the underlying Gaussian blur. The default is 2.0. +@property (readwrite, nonatomic) CGFloat blurRadiusInPixels; /// The threshold at which to apply the edges, default of 0.2 @property(readwrite, nonatomic) CGFloat threshold; diff --git a/framework/Source/GPUImageSmoothToonFilter.m b/framework/Source/GPUImageSmoothToonFilter.m index 7addb12ed..03828f488 100755 --- a/framework/Source/GPUImageSmoothToonFilter.m +++ b/framework/Source/GPUImageSmoothToonFilter.m @@ -5,7 +5,7 @@ @implementation GPUImageSmoothToonFilter @synthesize threshold; -@synthesize blurSize; +@synthesize blurRadiusInPixels; @synthesize quantizationLevels; @synthesize texelWidth; @synthesize texelHeight; @@ -31,7 +31,7 @@ - (id)init; self.initialFilters = [NSArray arrayWithObject:blurFilter]; self.terminalFilter = toonFilter; - self.blurSize = 0.5; + self.blurRadiusInPixels = 2.0; self.threshold = 0.2; self.quantizationLevels = 10.0; @@ -41,14 +41,14 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setBlurRadiusInPixels:(CGFloat)newValue; { - blurFilter.blurSize = newValue; + blurFilter.blurRadiusInPixels = newValue; } -- (CGFloat)blurSize; +- (CGFloat)blurRadiusInPixels; { - return blurFilter.blurSize; + return blurFilter.blurRadiusInPixels; } - (void)setTexelWidth:(CGFloat)newValue; diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m index 5727c0038..fc643e0be 100755 --- a/framework/Source/GPUImageSoftEleganceFilter.m +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -32,7 +32,7 @@ - (id)init; [lookupImageSource1 processImage]; GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; - gaussianBlur.blurSize = 9.7; + gaussianBlur.blurRadiusInPixels = 10.0; [lookupFilter1 addTarget:gaussianBlur]; [self addFilter:gaussianBlur]; diff --git a/framework/Source/GPUImageTiltShiftFilter.h b/framework/Source/GPUImageTiltShiftFilter.h index 419910886..e41adee7e 100755 --- a/framework/Source/GPUImageTiltShiftFilter.h +++ b/framework/Source/GPUImageTiltShiftFilter.h @@ -9,8 +9,8 @@ GPUImageFilter *tiltShiftFilter; } -/// A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 2.0 -@property(readwrite, nonatomic) CGFloat blurSize; +/// The radius of the underlying blur, in pixels. This is 7.0 by default. +@property(readwrite, nonatomic) CGFloat blurRadiusInPixels; /// The normalized location of the top of the in-focus area in the image, this value should be lower than bottomFocusLevel, default 0.4 @property(readwrite, nonatomic) CGFloat topFocusLevel; diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index 758f2410c..e2f632b1e 100755 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -55,7 +55,7 @@ void main() @implementation GPUImageTiltShiftFilter -@synthesize blurSize; +@synthesize blurRadiusInPixels; @synthesize topFocusLevel = _topFocusLevel; @synthesize bottomFocusLevel = _bottomFocusLevel; @synthesize focusFallOffRate = _focusFallOffRate; @@ -87,7 +87,7 @@ - (id)init; self.topFocusLevel = 0.4; self.bottomFocusLevel = 0.6; self.focusFallOffRate = 0.2; - self.blurSize = 2.0; + self.blurRadiusInPixels = 7.0; return self; } @@ -95,14 +95,14 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setBlurRadiusInPixels:(CGFloat)newValue; { - blurFilter.blurSize = newValue; + blurFilter.blurRadiusInPixels = newValue; } -- (CGFloat)blurSize; +- (CGFloat)blurRadiusInPixels; { - return blurFilter.blurSize; + return blurFilter.blurRadiusInPixels; } - (void)setTopFocusLevel:(CGFloat)newValue; diff --git a/framework/Source/GPUImageUnsharpMaskFilter.h b/framework/Source/GPUImageUnsharpMaskFilter.h index a2997902f..9d8aff010 100755 --- a/framework/Source/GPUImageUnsharpMaskFilter.h +++ b/framework/Source/GPUImageUnsharpMaskFilter.h @@ -7,8 +7,8 @@ GPUImageGaussianBlurFilter *blurFilter; GPUImageFilter *unsharpMaskFilter; } -// A multiplier for the underlying blur size, ranging from 0.0 on up, with a default of 1.0 -@property (readwrite, nonatomic) CGFloat blurSize; +// The blur radius of the underlying Gaussian blur. The default is 4.0. +@property (readwrite, nonatomic) CGFloat blurRadiusInPixels; // The strength of the sharpening, from 0.0 on up, with a default of 1.0 @property(readwrite, nonatomic) CGFloat intensity; diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index 169b5e737..542c5ea3a 100755 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -49,7 +49,7 @@ void main() @implementation GPUImageUnsharpMaskFilter -@synthesize blurSize; +@synthesize blurRadiusInPixels; @synthesize intensity = _intensity; - (id)init; @@ -74,7 +74,7 @@ - (id)init; self.terminalFilter = unsharpMaskFilter; self.intensity = 1.0; - self.blurSize = 1.0; + self.blurRadiusInPixels = 4.0; return self; } @@ -82,14 +82,14 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setBlurSize:(CGFloat)newValue; +- (void)setBlurRadiusInPixels:(CGFloat)newValue; { - blurFilter.blurSize = newValue; + blurFilter.blurRadiusInPixels = newValue; } -- (CGFloat)blurSize; +- (CGFloat)blurRadiusInPixels; { - return blurFilter.blurSize; + return blurFilter.blurRadiusInPixels; } - (void)setIntensity:(CGFloat)newValue; From 66b70be50c24b7437a11db954edd6cfbf60d6671 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 19 Oct 2013 00:31:03 -0500 Subject: [PATCH 471/695] Made the Mac side compatible with the new blur changes, fixed some 64-bit compatibility issues with them. --- .../SLSFilterShowcaseWindowController.h | 1 - .../SLSFilterShowcaseWindowController.m | 39 ++++++--------- .../en.lproj/SLSDocument.xib | 49 ++++++++++++------- .../FeatureExtractionAppDelegate.m | 2 +- .../GPUImageMac.xcodeproj/project.pbxproj | 26 ++++------ framework/Source/GPUImageBoxBlurFilter.m | 18 ++++--- framework/Source/GPUImageGaussianBlurFilter.m | 34 +++++++------ ...PUImageSingleComponentGaussianBlurFilter.m | 18 ++++--- framework/Source/Mac/GPUImage.h | 4 +- 9 files changed, 98 insertions(+), 93 deletions(-) diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h index 64991abf0..8c191fc01 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h @@ -70,7 +70,6 @@ typedef enum { GPUIMAGE_GAUSSIAN, GPUIMAGE_GAUSSIAN_SELECTIVE, GPUIMAGE_GAUSSIAN_POSITION, - GPUIMAGE_FASTBLUR, GPUIMAGE_BOXBLUR, GPUIMAGE_MEDIAN, GPUIMAGE_BILATERAL, diff --git a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m index 9f2b1eb2e..c34208206 100644 --- a/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m +++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m @@ -528,9 +528,9 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; case GPUIMAGE_SMOOTHTOON: { currentlySelectedFilter = [[GPUImageSmoothToonFilter alloc] init]; - self.minimumSliderValue = 0.0; - self.maximumSliderValue = 1.0; - self.currentSliderValue = 0.5; + self.minimumSliderValue = 1.0; + self.maximumSliderValue = 6.0; + self.currentSliderValue = 1.0; self.enableSlider = YES; }; break; case GPUIMAGE_TILTSHIFT: @@ -609,9 +609,9 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; { currentlySelectedFilter = [[GPUImageGaussianBlurFilter alloc] init]; - self.minimumSliderValue = 0.0; - self.maximumSliderValue = 10.0; - self.currentSliderValue = 1.0; + self.minimumSliderValue = 1.0; + self.maximumSliderValue = 24.0; + self.currentSliderValue = 2.0; self.enableSlider = YES; }; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: @@ -634,20 +634,14 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; self.currentSliderValue = 40.0/320.0; self.enableSlider = YES; }; break; - case GPUIMAGE_FASTBLUR: - { - currentlySelectedFilter = [[GPUImageFastBlurFilter alloc] init]; - - self.minimumSliderValue = 1.0; - self.maximumSliderValue = 10.0; - self.currentSliderValue = 1.0; - self.enableSlider = YES; - }; break; case GPUIMAGE_BOXBLUR: { currentlySelectedFilter = [[GPUImageBoxBlurFilter alloc] init]; - self.enableSlider = NO; + self.minimumSliderValue = 1.0; + self.maximumSliderValue = 24.0; + self.currentSliderValue = 2.0; + self.enableSlider = YES; }; break; case GPUIMAGE_MEDIAN: { @@ -1089,7 +1083,7 @@ - (void)changeSelectedRow:(NSUInteger)newRowIndex; // Provide a blurred image for a cool-looking background GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; [inputCamera addTarget:gaussianBlur]; - gaussianBlur.blurSize = 2.0; + gaussianBlur.blurRadiusInPixels = 10.0; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; blendFilter.mix = 1.0; @@ -1208,9 +1202,9 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_PREWITTEDGEDETECTION: [(GPUImagePrewittEdgeDetectionFilter *)currentlySelectedFilter setEdgeStrength:_currentSliderValue]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)currentlySelectedFilter setDownsamplingFactor:round(_currentSliderValue)]; break; case GPUIMAGE_THRESHOLD: [(GPUImageLuminanceThresholdFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; - case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_ADAPTIVETHRESHOLD: [(GPUImageAdaptiveThresholdFilter *)currentlySelectedFilter setBlurRadiusInPixels:_currentSliderValue]; break; case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)currentlySelectedFilter setThresholdMultiplier:_currentSliderValue]; break; - case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_CANNYEDGEDETECTION: [(GPUImageCannyEdgeDetectionFilter *)currentlySelectedFilter setBlurTexelSpacingMultiplier:_currentSliderValue]; break; case GPUIMAGE_THRESHOLDEDGEDETECTION: [(GPUImageThresholdEdgeDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; case GPUIMAGE_HARRISCORNERDETECTION: [(GPUImageHarrisCornerDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; case GPUIMAGE_NOBLECORNERDETECTION: [(GPUImageNobleCornerDetectionFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; @@ -1221,7 +1215,7 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; case GPUIMAGE_MOTIONDETECTOR: [(GPUImageMotionDetector *)currentlySelectedFilter setLowPassFilterStrength:_currentSliderValue]; break; case GPUIMAGE_SKETCH: [(GPUImageSketchFilter *)currentlySelectedFilter setEdgeStrength:_currentSliderValue]; break; case GPUIMAGE_THRESHOLDSKETCH: [(GPUImageThresholdSketchFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break; - case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)currentlySelectedFilter setBlurRadiusInPixels:_currentSliderValue]; break; case GPUIMAGE_POSTERIZE: [(GPUImagePosterizeFilter *)currentlySelectedFilter setColorLevels:round(_currentSliderValue)]; break; case GPUIMAGE_TILTSHIFT: { @@ -1247,10 +1241,10 @@ - (void)setCurrentSliderValue:(CGFloat)newValue; [(GPUImageTransformFilter *)currentlySelectedFilter setTransform3D:perspectiveTransform]; }; break; case GPUIMAGE_CROP: [(GPUImageCropFilter *)currentlySelectedFilter setCropRegion:CGRectMake(0.0, 0.0, 1.0, _currentSliderValue)]; break; - case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; + case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)currentlySelectedFilter setBlurRadiusInPixels:_currentSliderValue]; break; + case GPUIMAGE_BOXBLUR: [(GPUImageBoxBlurFilter *)currentlySelectedFilter setBlurRadiusInPixels:_currentSliderValue]; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: [(GPUImageGaussianSelectiveBlurFilter *)currentlySelectedFilter setExcludeCircleRadius:_currentSliderValue]; break; case GPUIMAGE_GAUSSIAN_POSITION: [(GPUImageGaussianBlurPositionFilter *)currentlySelectedFilter setBlurRadius:_currentSliderValue]; break; - case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)currentlySelectedFilter setBlurPasses:round(_currentSliderValue)]; break; case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)currentlySelectedFilter setDistanceNormalizationFactor:_currentSliderValue]; break; case GPUIMAGE_MOTIONBLUR: [(GPUImageMotionBlurFilter *)currentlySelectedFilter setBlurAngle:_currentSliderValue]; break; case GPUIMAGE_ZOOMBLUR: [(GPUImageZoomBlurFilter *)currentlySelectedFilter setBlurSize:_currentSliderValue]; break; @@ -1356,7 +1350,6 @@ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColu case GPUIMAGE_GAUSSIAN: tableRowTitle = @"Gaussian blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: tableRowTitle = @"Gaussian selective blur"; break; case GPUIMAGE_GAUSSIAN_POSITION: tableRowTitle = @"Gaussian (centered)"; break; - case GPUIMAGE_FASTBLUR: tableRowTitle = @"Gaussian blur (optimized)"; break; case GPUIMAGE_BOXBLUR: tableRowTitle = @"Box blur"; break; case GPUIMAGE_MEDIAN: tableRowTitle = @"Median (3x3)"; break; case GPUIMAGE_BILATERAL: tableRowTitle = @"Bilateral blur"; break; diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib index 1e5ce4911..a089258b9 100644 --- a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib @@ -1,14 +1,14 @@ - 1080 - 12D78 - 3084 - 1187.37 - 626.00 + 1070 + 13A598 + 4510 + 1265 + 695.00 com.apple.InterfaceBuilder.CocoaPlugin - 3084 + 4510 IBNSLayoutConstraint @@ -44,7 +44,7 @@ {94, 86} - + 256 @@ -52,7 +52,6 @@ 268 {{0, 54}, {507, 359}} - _NS:24 @@ -64,10 +63,8 @@ 268 - {{18, 18}, {471, 21}} + {{18, 18}, {471, 20}} - - _NS:9 YES @@ -89,8 +86,6 @@ {507, 413} - - {{0, 0}, {1440, 878}} @@ -190,9 +185,10 @@ 1000 - 8 + 0 29 3 + NO @@ -206,9 +202,10 @@ 1000 - 8 + 0 29 3 + NO @@ -222,9 +219,10 @@ 1000 - 8 + 0 29 3 + NO @@ -241,6 +239,7 @@ 3 9 3 + NO @@ -254,9 +253,10 @@ 1000 - 8 + 0 29 3 + NO @@ -270,9 +270,10 @@ 1000 - 8 + 0 29 3 + NO @@ -286,9 +287,10 @@ 1000 - 8 + 0 29 3 + NO
@@ -433,6 +435,15 @@
0 IBCocoaFramework + YES + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + YES 3 YES diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index c54dea2d4..ee3437ef6 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -211,7 +211,7 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector { cornerDetector.threshold = 0.4; cornerDetector.sensitivity = 4.0; - cornerDetector.blurSize = 1.0; +// cornerDetector.blurSize = 1.0; [pictureInput removeAllTargets]; [pictureInput addTarget:cornerDetector]; diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 3a6362ef9..c7e1befc9 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -27,7 +27,9 @@ BC78B713172DCCB800342C6A /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */; }; BC78B714172DCCB800342C6A /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC78B715172DCCB800342C6A /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */; }; - BC96A4F1176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC96A4EF176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h */; }; + BC8A583218124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8A583018124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC8A583318124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8A583118124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.m */; }; + BC96A4F1176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC96A4EF176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC96A4F2176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC96A4F0176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m */; }; BCA20B571746C9EC0097C84A /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA20B4F1746C9EC0097C84A /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCA20B581746C9EC0097C84A /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA20B501746C9EC0097C84A /* GPUImageBuffer.m */; }; @@ -163,8 +165,6 @@ BCE817BF173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817B9173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m */; }; BCE817C21736092A0071D084 /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817C01736092A0071D084 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCE817C31736092A0071D084 /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817C11736092A0071D084 /* GPUImageXYDerivativeFilter.m */; }; - BCE817C617360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817C417360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCE817C717360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817C517360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m */; }; BCE817CC17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817C817360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCE817CD17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE817C917360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; BCE817CE17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE817CA17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -249,8 +249,6 @@ BCF8681D172854B900912E34 /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86815172854AC00912E34 /* GPUImageBilateralFilter.m */; }; BCF8681E172854B900912E34 /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF8681F172854B900912E34 /* GPUImageBoxBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */; }; - BCF86820172854B900912E34 /* GPUImageFastBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCF86821172854B900912E34 /* GPUImageFastBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF86819172854B500912E34 /* GPUImageFastBlurFilter.m */; }; BCF86822172854B900912E34 /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8681A172854B600912E34 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCF86823172854B900912E34 /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8681B172854B800912E34 /* GPUImageMedianFilter.m */; }; BCF86828172857B900912E34 /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF86824172857AD00912E34 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -336,6 +334,8 @@ BC78B70B172DCCB800342C6A /* GPUImageMissEtikateFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMissEtikateFilter.m; path = Source/GPUImageMissEtikateFilter.m; sourceTree = SOURCE_ROOT; }; BC78B70C172DCCB800342C6A /* GPUImageSoftEleganceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSoftEleganceFilter.h; path = Source/GPUImageSoftEleganceFilter.h; sourceTree = SOURCE_ROOT; }; BC78B70D172DCCB800342C6A /* GPUImageSoftEleganceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftEleganceFilter.m; path = Source/GPUImageSoftEleganceFilter.m; sourceTree = SOURCE_ROOT; }; + BC8A583018124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSingleComponentGaussianBlurFilter.h; path = Source/GPUImageSingleComponentGaussianBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BC8A583118124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSingleComponentGaussianBlurFilter.m; path = Source/GPUImageSingleComponentGaussianBlurFilter.m; sourceTree = SOURCE_ROOT; }; BC96A4EF176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNonMaximumSuppressionFilter.h; path = Source/GPUImageNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; BC96A4F0176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageNonMaximumSuppressionFilter.m; path = Source/GPUImageNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; BCA20B4F1746C9EC0097C84A /* GPUImageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBuffer.h; path = Source/GPUImageBuffer.h; sourceTree = SOURCE_ROOT; }; @@ -478,8 +478,6 @@ BCE817B9173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageThresholdEdgeDetectionFilter.m; path = Source/GPUImageThresholdEdgeDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCE817C01736092A0071D084 /* GPUImageXYDerivativeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageXYDerivativeFilter.h; path = Source/GPUImageXYDerivativeFilter.h; sourceTree = SOURCE_ROOT; }; BCE817C11736092A0071D084 /* GPUImageXYDerivativeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageXYDerivativeFilter.m; path = Source/GPUImageXYDerivativeFilter.m; sourceTree = SOURCE_ROOT; }; - BCE817C417360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSingleComponentFastBlurFilter.h; path = Source/GPUImageSingleComponentFastBlurFilter.h; sourceTree = SOURCE_ROOT; }; - BCE817C517360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSingleComponentFastBlurFilter.m; path = Source/GPUImageSingleComponentFastBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCE817C817360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageDirectionalNonMaximumSuppressionFilter.h; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.h; sourceTree = SOURCE_ROOT; }; BCE817C917360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDirectionalNonMaximumSuppressionFilter.m; path = Source/GPUImageDirectionalNonMaximumSuppressionFilter.m; sourceTree = SOURCE_ROOT; }; BCE817CA17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUimageDirectionalSobelEdgeDetectionFilter.h; path = Source/GPUimageDirectionalSobelEdgeDetectionFilter.h; sourceTree = SOURCE_ROOT; }; @@ -564,8 +562,6 @@ BCF86815172854AC00912E34 /* GPUImageBilateralFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBilateralFilter.m; path = Source/GPUImageBilateralFilter.m; sourceTree = SOURCE_ROOT; }; BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBoxBlurFilter.h; path = Source/GPUImageBoxBlurFilter.h; sourceTree = SOURCE_ROOT; }; BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageBoxBlurFilter.m; path = Source/GPUImageBoxBlurFilter.m; sourceTree = SOURCE_ROOT; }; - BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFastBlurFilter.h; path = Source/GPUImageFastBlurFilter.h; sourceTree = SOURCE_ROOT; }; - BCF86819172854B500912E34 /* GPUImageFastBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFastBlurFilter.m; path = Source/GPUImageFastBlurFilter.m; sourceTree = SOURCE_ROOT; }; BCF8681A172854B600912E34 /* GPUImageMedianFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMedianFilter.h; path = Source/GPUImageMedianFilter.h; sourceTree = SOURCE_ROOT; }; BCF8681B172854B800912E34 /* GPUImageMedianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMedianFilter.m; path = Source/GPUImageMedianFilter.m; sourceTree = SOURCE_ROOT; }; BCF86824172857AD00912E34 /* GPUImageMotionBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMotionBlurFilter.h; path = Source/GPUImageMotionBlurFilter.h; sourceTree = SOURCE_ROOT; }; @@ -931,8 +927,6 @@ BCE817B7173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.m */, BCE817B4173608690071D084 /* GPUImageCannyEdgeDetectionFilter.h */, BCE817B5173608690071D084 /* GPUImageCannyEdgeDetectionFilter.m */, - BCE817C417360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h */, - BCE817C517360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m */, BCE817D017360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.h */, BCE817D117360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m */, BCE817C817360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */, @@ -973,10 +967,10 @@ BCA20B561746C9EC0097C84A /* GPUImageMotionDetector.m */, BCF86816172854AE00912E34 /* GPUImageBoxBlurFilter.h */, BCF86817172854B100912E34 /* GPUImageBoxBlurFilter.m */, - BCF86818172854B300912E34 /* GPUImageFastBlurFilter.h */, - BCF86819172854B500912E34 /* GPUImageFastBlurFilter.m */, BCF867F61728494B00912E34 /* GPUImageGaussianBlurFilter.h */, BCF867F71728494B00912E34 /* GPUImageGaussianBlurFilter.m */, + BC8A583018124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.h */, + BC8A583118124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.m */, BCF8680E172853A700912E34 /* GPUImageGaussianSelectiveBlurFilter.h */, BCF8680F172853A800912E34 /* GPUImageGaussianSelectiveBlurFilter.m */, BCF8680C172853A500912E34 /* GPUImageGaussianBlurPositionFilter.h */, @@ -1108,7 +1102,6 @@ BCF86812172853AA00912E34 /* GPUImageGaussianSelectiveBlurFilter.h in Headers */, BCF8681C172854B900912E34 /* GPUImageBilateralFilter.h in Headers */, BCF8681E172854B900912E34 /* GPUImageBoxBlurFilter.h in Headers */, - BCF86820172854B900912E34 /* GPUImageFastBlurFilter.h in Headers */, BCF86822172854B900912E34 /* GPUImageMedianFilter.h in Headers */, BCF86828172857B900912E34 /* GPUImageMotionBlurFilter.h in Headers */, BCF8682A172857B900912E34 /* GPUImageZoomBlurFilter.h in Headers */, @@ -1173,7 +1166,6 @@ BCE817BC173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.h in Headers */, BCE817BE173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.h in Headers */, BCE817C21736092A0071D084 /* GPUImageXYDerivativeFilter.h in Headers */, - BCE817C617360B750071D084 /* GPUImageSingleComponentFastBlurFilter.h in Headers */, BCE817CC17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */, BCE817CE17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */, BCE817D217360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.h in Headers */, @@ -1216,6 +1208,7 @@ BCA20BC317471C4B0097C84A /* GPUImageLocalBinaryPatternFilter.h in Headers */, BCA20BC517471C4B0097C84A /* GPUImageMosaicFilter.h in Headers */, BCA20BC717471C4B0097C84A /* GPUImagePerlinNoiseFilter.h in Headers */, + BC8A583218124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */, BCA20BC917471C4B0097C84A /* GPUImageVoronoiConsumerFilter.h in Headers */, BC96A4F1176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, ); @@ -1321,7 +1314,6 @@ BCF86813172853AA00912E34 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */, BCF8681D172854B900912E34 /* GPUImageBilateralFilter.m in Sources */, BCF8681F172854B900912E34 /* GPUImageBoxBlurFilter.m in Sources */, - BCF86821172854B900912E34 /* GPUImageFastBlurFilter.m in Sources */, BCF86823172854B900912E34 /* GPUImageMedianFilter.m in Sources */, BCF86829172857B900912E34 /* GPUImageMotionBlurFilter.m in Sources */, BCF8682B172857B900912E34 /* GPUImageZoomBlurFilter.m in Sources */, @@ -1386,7 +1378,6 @@ BCE817BD173608690071D084 /* GPUImagePrewittEdgeDetectionFilter.m in Sources */, BCE817BF173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */, BCE817C31736092A0071D084 /* GPUImageXYDerivativeFilter.m in Sources */, - BCE817C717360B750071D084 /* GPUImageSingleComponentFastBlurFilter.m in Sources */, BCE817CD17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */, BCE817CF17360BFD0071D084 /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */, BCE817D317360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m in Sources */, @@ -1433,6 +1424,7 @@ BC96A4F2176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.m in Sources */, A87E5E13177648F3007FD5B1 /* GPUImageRawDataOutput.m in Sources */, A87E5E1717764B16007FD5B1 /* GPUImageRawDataInput.m in Sources */, + BC8A583318124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index 00404bf78..582d08a06 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -22,13 +22,13 @@ + (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma: uniform float texelWidthOffset;\n\ uniform float texelHeightOffset;\n\ \n\ - varying vec2 blurCoordinates[%d];\n\ + varying vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ gl_Position = position;\n\ \n\ - vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", 1 + (numberOfOptimizedOffsets * 2)]; + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", (unsigned long)(1 + (numberOfOptimizedOffsets * 2))]; // Inner offset loop [shaderString appendString:@"blurCoordinates[0] = inputTextureCoordinate.xy;\n"]; @@ -37,8 +37,8 @@ void main()\n\ GLfloat optimizedOffset = (GLfloat)(currentOptimizedOffset * 2) + 1.5; [shaderString appendFormat:@"\ - blurCoordinates[%d] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ - blurCoordinates[%d] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (currentOptimizedOffset * 2) + 1, optimizedOffset, (currentOptimizedOffset * 2) + 2, optimizedOffset]; + blurCoordinates[%lu] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ + blurCoordinates[%lu] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (unsigned long)((currentOptimizedOffset * 2) + 1), optimizedOffset, (unsigned long)((currentOptimizedOffset * 2) + 2), optimizedOffset]; } // Footer @@ -77,7 +77,7 @@ void main()\n\ uniform float texelWidthOffset;\n\ uniform float texelHeightOffset;\n\ \n\ - varying vec2 blurCoordinates[%d];\n\ + varying vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ @@ -91,14 +91,18 @@ void main()\n\ for (NSUInteger currentBlurCoordinateIndex = 0; currentBlurCoordinateIndex < numberOfOptimizedOffsets; currentBlurCoordinateIndex++) { - [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 1, boxWeight * 2.0]; - [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 2, boxWeight * 2.0]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%lu]) * %f;\n", (unsigned long)((currentBlurCoordinateIndex * 2) + 1), boxWeight * 2.0]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%lu]) * %f;\n", (unsigned long)((currentBlurCoordinateIndex * 2) + 2), boxWeight * 2.0]; } // If the number of required samples exceeds the amount we can pass in via varyings, we have to do dependent texture reads in the fragment shader if (trueNumberOfOptimizedOffsets > numberOfOptimizedOffsets) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE [shaderString appendString:@"highp vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; +#else + [shaderString appendString:@"vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; +#endif for (NSUInteger currentOverlowTextureRead = numberOfOptimizedOffsets; currentOverlowTextureRead < trueNumberOfOptimizedOffsets; currentOverlowTextureRead++) { diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index ad390ae7b..7d720bc9d 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -54,13 +54,13 @@ + (NSString *)vertexShaderForStandardBlurOfRadius:(NSUInteger)blurRadius sigma:( uniform float texelWidthOffset;\n\ uniform float texelHeightOffset;\n\ \n\ - varying vec2 blurCoordinates[%d];\n\ + varying vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ gl_Position = position;\n\ \n\ - vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", (blurRadius * 2 + 1) ]; + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", (unsigned long)(blurRadius * 2 + 1) ]; // Inner offset loop for (NSUInteger currentBlurCoordinateIndex = 0; currentBlurCoordinateIndex < (blurRadius * 2 + 1); currentBlurCoordinateIndex++) @@ -68,15 +68,15 @@ void main()\n\ NSInteger offsetFromCenter = currentBlurCoordinateIndex - blurRadius; if (offsetFromCenter < 0) { - [shaderString appendFormat:@"blurCoordinates[%d] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", currentBlurCoordinateIndex, (GLfloat)(-offsetFromCenter)]; + [shaderString appendFormat:@"blurCoordinates[%ld] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (unsigned long)currentBlurCoordinateIndex, (GLfloat)(-offsetFromCenter)]; } else if (offsetFromCenter > 0) { - [shaderString appendFormat:@"blurCoordinates[%d] = inputTextureCoordinate.xy + singleStepOffset * %f;\n", currentBlurCoordinateIndex, (GLfloat)(offsetFromCenter)]; + [shaderString appendFormat:@"blurCoordinates[%ld] = inputTextureCoordinate.xy + singleStepOffset * %f;\n", (unsigned long)currentBlurCoordinateIndex, (GLfloat)(offsetFromCenter)]; } else { - [shaderString appendFormat:@"blurCoordinates[%d] = inputTextureCoordinate.xy;\n", currentBlurCoordinateIndex]; + [shaderString appendFormat:@"blurCoordinates[%ld] = inputTextureCoordinate.xy;\n", (unsigned long)currentBlurCoordinateIndex]; } } @@ -128,7 +128,7 @@ void main()\n\ [shaderString appendFormat:@"\ uniform sampler2D inputImageTexture;\n\ \n\ - varying vec2 blurCoordinates[%d];\n\ + varying vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ @@ -141,11 +141,11 @@ void main()\n\ NSInteger offsetFromCenter = currentBlurCoordinateIndex - blurRadius; if (offsetFromCenter < 0) { - [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", currentBlurCoordinateIndex, standardGaussianWeights[-offsetFromCenter]]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%lu]) * %f;\n", (unsigned long)currentBlurCoordinateIndex, standardGaussianWeights[-offsetFromCenter]]; } else { - [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", currentBlurCoordinateIndex, standardGaussianWeights[offsetFromCenter]]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%lu]) * %f;\n", (unsigned long)currentBlurCoordinateIndex, standardGaussianWeights[offsetFromCenter]]; } } @@ -210,21 +210,21 @@ + (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma: uniform float texelWidthOffset;\n\ uniform float texelHeightOffset;\n\ \n\ - varying vec2 blurCoordinates[%d];\n\ + varying vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ gl_Position = position;\n\ \n\ - vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", 1 + (numberOfOptimizedOffsets * 2)]; + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", (unsigned long)(1 + (numberOfOptimizedOffsets * 2))]; // Inner offset loop [shaderString appendString:@"blurCoordinates[0] = inputTextureCoordinate.xy;\n"]; for (NSUInteger currentOptimizedOffset = 0; currentOptimizedOffset < numberOfOptimizedOffsets; currentOptimizedOffset++) { [shaderString appendFormat:@"\ - blurCoordinates[%d] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ - blurCoordinates[%d] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (currentOptimizedOffset * 2) + 1, optimizedGaussianOffsets[currentOptimizedOffset], (currentOptimizedOffset * 2) + 2, optimizedGaussianOffsets[currentOptimizedOffset]]; + blurCoordinates[%lu] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ + blurCoordinates[%lu] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (unsigned long)((currentOptimizedOffset * 2) + 1), optimizedGaussianOffsets[currentOptimizedOffset], (unsigned long)((currentOptimizedOffset * 2) + 2), optimizedGaussianOffsets[currentOptimizedOffset]]; } // Footer @@ -288,7 +288,7 @@ void main()\n\ uniform float texelWidthOffset;\n\ uniform float texelHeightOffset;\n\ \n\ - varying vec2 blurCoordinates[%d];\n\ + varying vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ @@ -304,14 +304,18 @@ void main()\n\ GLfloat secondWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 2]; GLfloat optimizedWeight = firstWeight + secondWeight; - [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 1, optimizedWeight]; - [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]) * %f;\n", (currentBlurCoordinateIndex * 2) + 2, optimizedWeight]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%lu]) * %f;\n", (unsigned long)((currentBlurCoordinateIndex * 2) + 1), optimizedWeight]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%lu]) * %f;\n", (unsigned long)((currentBlurCoordinateIndex * 2) + 2), optimizedWeight]; } // If the number of required samples exceeds the amount we can pass in via varyings, we have to do dependent texture reads in the fragment shader if (trueNumberOfOptimizedOffsets > numberOfOptimizedOffsets) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE [shaderString appendString:@"highp vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; +#else + [shaderString appendString:@"vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; +#endif for (NSUInteger currentOverlowTextureRead = numberOfOptimizedOffsets; currentOverlowTextureRead < trueNumberOfOptimizedOffsets; currentOverlowTextureRead++) { diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m index df13bbc25..f3712fe25 100644 --- a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m +++ b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m @@ -54,21 +54,21 @@ + (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma: uniform float texelWidthOffset;\n\ uniform float texelHeightOffset;\n\ \n\ - varying vec2 blurCoordinates[%d];\n\ + varying vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ gl_Position = position;\n\ \n\ - vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", 1 + (numberOfOptimizedOffsets * 2)]; + vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n", (unsigned long)(1 + (numberOfOptimizedOffsets * 2))]; // Inner offset loop [shaderString appendString:@"blurCoordinates[0] = inputTextureCoordinate.xy;\n"]; for (NSUInteger currentOptimizedOffset = 0; currentOptimizedOffset < numberOfOptimizedOffsets; currentOptimizedOffset++) { [shaderString appendFormat:@"\ - blurCoordinates[%d] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ - blurCoordinates[%d] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (currentOptimizedOffset * 2) + 1, optimizedGaussianOffsets[currentOptimizedOffset], (currentOptimizedOffset * 2) + 2, optimizedGaussianOffsets[currentOptimizedOffset]]; + blurCoordinates[%lu] = inputTextureCoordinate.xy + singleStepOffset * %f;\n\ + blurCoordinates[%lu] = inputTextureCoordinate.xy - singleStepOffset * %f;\n", (unsigned long)((currentOptimizedOffset * 2) + 1), optimizedGaussianOffsets[currentOptimizedOffset], (unsigned long)((currentOptimizedOffset * 2) + 2), optimizedGaussianOffsets[currentOptimizedOffset]]; } // Footer @@ -132,7 +132,7 @@ void main()\n\ uniform float texelWidthOffset;\n\ uniform float texelHeightOffset;\n\ \n\ - varying vec2 blurCoordinates[%d];\n\ + varying vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ @@ -148,14 +148,18 @@ void main()\n\ GLfloat secondWeight = standardGaussianWeights[currentBlurCoordinateIndex * 2 + 2]; GLfloat optimizedWeight = firstWeight + secondWeight; - [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]).r * %f;\n", (currentBlurCoordinateIndex * 2) + 1, optimizedWeight]; - [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%d]).r * %f;\n", (currentBlurCoordinateIndex * 2) + 2, optimizedWeight]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%lu]).r * %f;\n", (unsigned long)((currentBlurCoordinateIndex * 2) + 1), optimizedWeight]; + [shaderString appendFormat:@"sum += texture2D(inputImageTexture, blurCoordinates[%lu]).r * %f;\n", (unsigned long)((currentBlurCoordinateIndex * 2) + 2), optimizedWeight]; } // If the number of required samples exceeds the amount we can pass in via varyings, we have to do dependent texture reads in the fragment shader if (trueNumberOfOptimizedOffsets > numberOfOptimizedOffsets) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + [shaderString appendString:@"highp vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; +#else [shaderString appendString:@"highp vec2 singleStepOffset = vec2(texelWidthOffset, texelHeightOffset);\n"]; +#endif for (NSUInteger currentOverlowTextureRead = numberOfOptimizedOffsets; currentOverlowTextureRead < trueNumberOfOptimizedOffsets; currentOverlowTextureRead++) { diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index dcd836806..41176dcb6 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -43,7 +43,7 @@ #import #import #import -#import +#import #import #import #import @@ -104,10 +104,8 @@ #import #import #import -#import #import #import -#import #import #import #import From 97dd3ceff98e92e9f5b4e7c8e171df147cba8ca8 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 19 Oct 2013 14:39:14 -0500 Subject: [PATCH 472/695] First implementation of a blur that simulates iOS 7's control panel background blur. --- .../project.pbxproj | 4 + .../FeatureExtractionAppDelegate.m | 9 ++ .../FeatureExtractionTest/iOSHomeScreen.png | Bin 0 -> 1120041 bytes .../ShowcaseFilterListController.m | 1 + .../ShowcaseFilterViewController.h | 1 + .../ShowcaseFilterViewController.m | 7 ++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 3 +- framework/Source/GPUImageFilterGroup.m | 1 - framework/Source/GPUImageiOSBlurFilter.h | 26 +++++ framework/Source/GPUImageiOSBlurFilter.m | 89 ++++++++++++++++++ 11 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 examples/iOS/FeatureExtractionTest/FeatureExtractionTest/iOSHomeScreen.png create mode 100644 framework/Source/GPUImageiOSBlurFilter.h create mode 100644 framework/Source/GPUImageiOSBlurFilter.m diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index d2dbc1af8..48e153c27 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC46D52315D03D9C00CC63CA /* LBPTest.png */; }; BC8A581C1810782200E6B507 /* GaussianTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8A581B1810782200E6B507 /* GaussianTest.png */; }; BC8A58211810862F00E6B507 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC8A58201810862F00E6B507 /* CoreImage.framework */; }; + BC8A584018130DCD00E6B507 /* iOSHomeScreen.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8A583F18130DCD00E6B507 /* iOSHomeScreen.png */; }; BCA464C9162785EA00C0F68E /* LineTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCA464C8162785EA00C0F68E /* LineTest.png */; }; BCB3C3F916BCA61A003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F416BCA61A003D26B0 /* Icon-72.png */; }; BCB3C3FA16BCA61A003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */; }; @@ -79,6 +80,7 @@ BC46D52315D03D9C00CC63CA /* LBPTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LBPTest.png; sourceTree = ""; }; BC8A581B1810782200E6B507 /* GaussianTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = GaussianTest.png; sourceTree = ""; }; BC8A58201810862F00E6B507 /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; + BC8A583F18130DCD00E6B507 /* iOSHomeScreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iOSHomeScreen.png; sourceTree = ""; }; BCA464C8162785EA00C0F68E /* LineTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest.png; sourceTree = ""; }; BCB3C3F416BCA61A003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; @@ -158,6 +160,7 @@ BC18E0A1156C822E00AB8026 /* Supporting Files */ = { isa = PBXGroup; children = ( + BC8A583F18130DCD00E6B507 /* iOSHomeScreen.png */, BC8A581B1810782200E6B507 /* GaussianTest.png */, BCB3C3F416BCA61A003D26B0 /* Icon-72.png */, BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */, @@ -263,6 +266,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + BC8A584018130DCD00E6B507 /* iOSHomeScreen.png in Resources */, BC18E0A5156C822E00AB8026 /* InfoPlist.strings in Resources */, BC18E0CC156C881700AB8026 /* 71yih.png in Resources */, BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */, diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index ee3437ef6..65ec66cc7 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -106,6 +106,15 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( NSLog(@"Luminosity: %f", luminosity); }]; + // Testing iOS blur + UIImage *iOSBlurInput = [UIImage imageNamed:@"iOSHomeScreen.png"]; + GPUImagePicture *iOSBlurImage = [[GPUImagePicture alloc] initWithImage:iOSBlurInput]; + GPUImageiOSBlurFilter *iOSBlur = [[GPUImageiOSBlurFilter alloc] init]; + [iOSBlurImage addTarget:iOSBlur]; + [iOSBlurImage processImage]; + UIImage *iOSBlurOutput = [iOSBlur imageFromCurrentlyProcessedOutput]; + [self saveImage:iOSBlurOutput fileName:@"iOSBlur-GPUImage.png"]; + // Testing Gaussian blur UIImage *gaussianBlurInput = [UIImage imageNamed:@"GaussianTest.png"]; GPUImagePicture *gaussianImage = [[GPUImagePicture alloc] initWithImage:gaussianBlurInput]; diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/iOSHomeScreen.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/iOSHomeScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..25be047dca624482e48c8dc777d00814e6fc715f GIT binary patch literal 1120041 zcmZ^}bx<5pw>>&AxD$dyAh_#5aQDI8-3AySxCeK4cXtnN!5Q2kSa1sxAZYUP-FtuX zUe)VAx=ycNd+oD#cb(ej)Q(bBmc>LPK?48)nDTN`>Hq+IAOL{ijDqwJ@ku!RcSjS4 zNJ^^8OG;9zx;R-w9IOBUIn2CtPfd+=f{5APPrY;Rs3>XgNPJK!7X;<-5!9mO16AR} zL+L!E5M|!uGHP3D4#3GqP+3U7M-K@$Uq!veQ5_vrlafB%inT|*s^j^!o&7eZx3hly zb#>k5%73*Bp!yn&Fyy8S7YHiSegE@((C{7J)bMY3A{;m@UATcgYik7AM=AKF*IwbQ ztV+4jmWQ8gftKByEd8o-e;M>j_HaVqPV2r6aS35g$JOd4)gc8V8uM~+vWqj%54s!5u)VH z%W+pTA%`d9*3UOB8c*h&%&Fg$_9DF$XYX1u;yDNd8=TUm;b`@sS++@+b!3;9dMih^ zPyOpV9|APqgvWhev~K7wX7j~k^YwNdE^66(2>=f?`Z?q+eQ8>NRw$C#;a;uE6(!&n z5zxAw`|CrvgK_fk4-9(rn2QSsSGWRuHs+I0F9pF)ll|fRzq6)(zGw@U6N&~=%j0uf zNgtM1l!K*UFbu4WS4#=~AZ|iOX@DJlx?T|+vcM=9jQUhrmMSbA?&kb-m(Z>6FZ0nL5Tobr_ z{v1D3pc_Uz?kS2>X&gOZBv`u87PAnS?1VZD!oN#Ib}K{!1+j6!vzTI%1#&wBw<@QcN(6A4POvm{n6yUs!E(+<5ltiK~4IJ)A`y{GT_$uk_M66QM&N#WG&j&!Hh$6F0 zB7#xk{Rq9-J#%fd6>|lS_huP_T|G)0>x-QeIlwpf_*Ud$8<^>2O3Qr5|m?q8J%*Z^)v;PCbZbeqN=G3 zbnjIZ$fPCKmH8Dq#k|G5CCk(?D;<|~t24Xu^i_JL{1yD!WmC8_er4=W)TPuU*{7Xn z_|mGRu4Z^172-VY)~Vpq*1#_X0LTfI80tTyEx4}(mdNd$~@!; z&xjgrPjXQ5*LNyaVyBG@v}GSjBo@oO7dl#%S_L+&HaN&-Kb5{Lrksx4QJnPNp<2;e z85}Ykk{yy9woIxc4RM%0a;p=U#iqn|$0qy&9d*v`&u;QIK#c$PFs3~*IWqaBQKea@ z!KEcsD{46{zhBO)hE}UAaoEw>nc1z|y)3iU#LZUBdgjmOnSlNtyhfZgc18JgJloxW zI}<)jA;~7`BOxZyBFO-a@(^b`W=~`vW*>vbT5a{w+Ys~*^^e<(InuIz!ZfXETVnW& z>gq2mSm#Abw`zpzEGk=cZAz3|X7G%X*$h63e>ME7;VGd4X4hpmX;8Z=5>YFtD=6)k z?Kk)`IWR}LVHzWzGgw&^UDR)uZ&tErL0z3xGtX3_Um`flXVLyS`bK2mfUYqrPd-^b zZbC_8ZE0K6v}?9?7Q_C?mJU?I(>+$)_+3x0R%WG;|C`XbUx|0l6EnJSjBZRG!4`oD z%O#5j>p2UB9-|(jF0}Qm@%h`vaJIdXh5uN%-M&T3O!?MPTU{0Fjz|BczhJge;}$`; za`)^5)&tcG-3uqOaD-PxFV^ohHxGvHQ2%Az^OL=fnVZ;sWO`rvrbYRRojko6#u?0+ z5_Am0Yr-W~BA5BkdmUshNo@cLWF3o|wt zJ4rTXEVUx#m}C~+I5ML_CrPK_Yw~aNE4!--5do1XkvI{&K99Z{fA&YSH~2S?=dE9> z*T>JRFDeLp2(_puXr%};2-?UZ=v=7p5Zw{J4Z;m}2UD;wn9vw55x`5lN_vC|q4HoD z;Xk_)v9W+^=`OrGw7demJP}yUrKKc?yX6wb7sh2{;t0S5o-z}%Bht&VO47d48Pebk zT^7BT1DRO;Sjuu?0t!-mUm6dWs^1G+;E4T;A87kO*|-hUTP`+S+77FxX6qA82K7EO zeITVE-@*ACg*Q}ns91kz(&>4Ku$s~x@sfNz%6uGmWAteCnuL%M+8jDBl`(7-Wg%ZL zk1xLuuOi;I>)vc~8+1^WnwVO`$XzvGH4O=EeQaHnpf!tbWH#a!rtf9{1}fo@?3#ou z|J1@O7Mo8}WN_89?#_(=qj)bDOOrzzqKDpM*Su{bYgI6*2E#qNJIFq8oFbq2HSrR_ zW6k5~Zqw)SC;WAg=cheZUD!&!;by0@r_o^7-hJPB0+bRew|+e(GZkk=y5ktVy`)yC z*4Sri+j4a@D$yySw%5x#V}Ru_;(+gPxn}4i>vQ$HMsIBJh3WzxgrtNO6^qA++ut?O%OL|5otOKBph8U$pXlC91uY7vihvyK@@2 zm`6TC&MKPo*Y7U&AuGFO(gr-6G=ra;!(ZSTa4Rtyb`ujt7$KnJCeqb()9F&R+57UUl~H3;&u=8?pXc9u8U7Zx@}WCF-Q*$wa@uwU?LBpFc}w4~i|<49 zKYliPVc&k}@;{9Kn@0+aL3;kl*5~`z_`C3_|MuHFauv3*D9nfN&GyaWV!xOkO@%4H zTD0zM`Ek{{s`u`qaMg6SCDJA#yhD=xZ`xCX$~VN>s##{4R+%%|I@#ISr`Ro@rn`~r zso0Fg{jh$0Cx`}m(%9-zmTCkKn3kgM{F=Vrea)E+z9n=Kr3AschZcoCVm~Jv}|yJh|DNTx{4m z`T6h$^%ua;sf2{xi8UJ4`6&Hxrzo`Gq`hWTU zzp?+}3$gzv@c%0j|DEOkLjR>%1Wkzje}6I&G=8^sI{-ioATK4Z=>-StMeeE7az7DV zF?RpGcq)w}6>SRFRDx1z>U1)aO~iAc-#AJDULtZTo+aSS_M#Y-Dv=op$1IhX6<5t( z;Li>4*s1CJ`vumk+<|&@*tgUDyZ0)$ZB>8g)6|ItjB~2G=P+|QB+7^9EKOYVj9Lx4 zWIlH_;^ND{k>|+bX2;3B6W`>+%3GTiJt{|^E^v7wMXO(@zhvLmVI%mPAjAC9Qn-Az zE_%HzY|ZO;e5DTQJP}l;Wj=Bw&vicEB=WTCCNtM@WX+5FjJmfH#MHW+kS9pp4mFB( z-(Mzb%`kWDBPHck96Ru0l_9xb>vEU9v(7O0G3P2K;H=ax-lzpKJL^z&QKzl-Kny_0 zZA3LZC0s;OuJ@V_IeAe}P}e4FA1b~Xe? zX}icbj83HT`f~6rnk=ULSYWLd(;GLHUjws5UeW>p^55Is8PmI#*EkrJzt>=OfJJ*9 zK`&{xQfafxx<4N*9JBg7VE{1oN`n!8o-(okcCmg9yd?YP`3*0Z1o!vzhr(%?-%{b> z!K1EQp%VV<`E`{n`*m@Pv^R z7S~_ROfUiE{U4kzp}*#{&gZbd(vdXTy?MddJomS!H!a-jDC{fficKhDc<-vj8hC}i za|#ls?D7eVD3FrN>BjLw-K24hbrR?2o8~JeGFe;Do2-ugF8a*4R_aMYy3#T$T0|~m zgM z_u7hzN-}K0~UnHmW)-rVPJ#eWqK9U9~`a6aP_+>bH4pU1TpxM^dtMDXDT06hLrfV`1(hls&Fp z77z23HHSEI7R=7FQ?a*Y>MQk62Y$J(R!@k_IZC`4S@VCBTH1YMxyufsPZ_^?q-o~d z5UbxkJX+V48Wm@v3+kOGk?*Ygq~C-h48bH(qF4De4I5VPj#HLw2;=oDuG5OMWoMVs z@Gr^A%4^{aW&w?6bBcDO{K3_zp)+^06X12+4*mm^Xra4g86&cy8y&;HU7LB!B6e?l z=UWe*H{s!(W;L^C;#{yF)4!0#>|=k}RGTjsE5Y*X@ch-D8A^A)q9lX3j_0*^UJ~=$ zaRbd{v&nAjxx@Zg0@U@Z>3254z3hO|TkRNwB1uUDv4c(n*Smc@)@wba^emzriIv@i zXMVW)dlFs;2&2389C6fTj*U5~PjSAAqL#&Sb`w#E3JA#GJ!hg-FGZ34QAmDjQjT@w z()fE6lx!^ivTybM?be{SW6b9}+slp9wfMaA!l}ur@=nL^UaN|rKyQ-#II(#)=+`2R zmf-I!i~m+$iwK$Y4bJG#Ij5|WEdh$3WJ`Fqqv5VK=Pqe2eFCf*pQpg%j2_se^WsQ8 zb2Vxq`M>hkn*EUv=T*G;;-Q86x>A3Sih}rfnq-w;rSP-cn3WtXDSQbZqdizyirCxG zJgRV~PBi*gVvxyNWi=C5r#&5`mTUBztnV#hjs?g&)2D*vtMxI6yJu`{*JOfWe5Uh_ zQ`gw!RoVtk$0FyA;`bfLGthbaea5*uxa(TIHZ;LcVXRw0b@1%hnL(oaYs+o++SEXX z=EnBMk87Jn6Lj z)y^fQCd9~aIDBc4r;#xx&&uI5t@fZGU!woR{5O*O)HbC@_^0l29<(|LFu*-2VtUhh zu;|^3M8mQM^%_=Ai0n9Q)R$NK3k1ivAtL=TllH=X?DrE~b05(Z$^^-)3%H+WVRTz@ z7~?K0Cnuq*sws126kd_kuTktoh5VK2WMD?O92S0GV?pu)lBl>8xeNap$^X1LMyqLl z?y(;g;IQUTCS=#tGa%`p)E0L5^V5F%&NjKHLv|UaIq+2xpM3SWZ8N6H&WFk0pTekK z;%nZV0%_yeS(I+rw0`b7u|ZG~xSPkaFybfdqsrtFpNDzvvJ~cx#`qjnfYX=@z5gE{ z^AM)r?U!p=9QW6rP`45uG^ah!6t4=l#T!Nd4)-_~%Rrx`i(dp6e?{Hii-^5!NiPSX zYs+=`OUmRB!{_&}3no0ZpaIc+x;zHOLI_*!awTB-D|OW7Y_>rejv`l%yvTG{=bFe~R+eIg^CQCQxet zH%?0NP*oKZ<1uB_^!6Q%DJWTTAqQ^<2hm5liDcj1msx zA?=Y&ITN?4)*uI z^~j&JxE@;pQMwqX6;im!VHM{Y^)}^HKM*U2k1o2cTJ1Y*x!cRahsJ4n?LV8n6 zrHpit?(hYHWkDjJ9k+6V!kg;yB~|SYQtB1_E|t~t6kS1DKiV^L#~gMC0BOQzz`^~e zBz51A8ZCnGSHFj8C|m_Lc~Q_dS$t94KDk=PGm&wAf-QQQ=O2Db98dW)b|TiZs@1!) zdO=f7_O__tD_2M|7dv@n37LJ%ZQiW#os_=@Z{1SRr-wDbLl;PVCLQ&|OE0H_B=+-J ziOEo59JlwJY`%jeiT39^qifBpGafP?;GSLBF4N#qJJtZa=Q?>3AH1Hrb_Qs zE+q8W0}aX~=JMJ(Cepp+DEzB?JOdpYC2YpSniV(4i#)d57mrN$Nyo3n9(T)nJZqbV zU6GYrW3fZGcXdm?94hc%mi*m#B@rm;O^inpjER{f5@!TnWXDoh-uNOlx*)8VOZUa( zTrUyHDVq_#G(j7=_v+`^6Bv<=N^v`42hLlicZ>7tuJcr~k=_BpQhgzrl}a=Yj6CD1 zl?E!=6$P5L^nYH9N_*Jvin(`(3g%|0LL%6F?1vOPSJ>gaCmX!% zoj0B_kY!r;23C$wNl$C!6YU00x0WzPw5|oQ9ERHxa@%jxz<2X{62^^1>C(D|a1S^_ zo3CJRxO!fWhe7YuE^`Iy3E8N+-e8=81#7X*c-*{tWi?7#Rn%nd$fyN5OVp(hT`tWL z5XZ#s>}Us8;BJF{_F(Z*ofh3<--z`I!ToE{Ee&AN@*wR42 zj2*KTs>U>hxj8+MatzAwdN!)4tbkFDdYH<^CAnjU$EacQ!H(A5FyTOe8-@I}cX9R? z!Bop=uNdt3*! zy!n?=w*5eFINxcc6y0WepW$ifX#)cDIOQclSw#6Q-uidYc& zk&q`0@!LrM^iWq@S+a89N&EwA-2pg=6kZP@kmAcHETHf4i<|a3I2WG0OhnI>=jRg)m}-(Z4@z$!ME2$uCbC zB)**m^i<7=C1CtXyl=&BWpzM`TuBQDx=jpB2P7BFZ3Y^UFDBe2Qd`-Y`%ytBe+14AoKpie-q%u#j1bJn1L56FE2%{&HZZ*TmW-y(YkScWa)s6UN`-$H7KOlyr_!08 zYhUS3J1kTe=zJ^2eZDYc{AlPO4~()Qf95 zhU?xF3dGB85E#?~KH*`XYApB7%~Q2tpOt3(ZVQ=g_){UDSN(wHMLy>P`3BwgMaPh_ z&bs0JRW^HD5Srm(hb>(g*Gx$^Qm|&T!5D45IdGyF?7ZGC07ZUgwdv13>77Ms}_xj(o2zEP$6zcy`^7b??w51Tk|)|K-?h;V+SNeISEj6-L~Z+icK|imsn*B!#fJ|)+s_#4E zNZWG+P!z3Maz~w0&)xD$W|#1~mMNn@O_y@swZK_Ue7GI?JEuNIncFUiFPtn5()J0sip0Yy5Qpcc7q@H}z3t+0S4$fmj za?cO)z10z**718VPJ3vLsKT@iPerlX(PKVTBMo1pbxM`(?>GQ&<_D#N+JJ$x#2@%L zf?*I}Y_1{+(Psh(sb+7<yv39mfR&{_Qf2m0B!ubYSQ~w1XZQ>wk)-zM3e>fJkMrL4z zdoe4!F}NG0fk+`uWz32%SrdU#uX>1Bm+!U#4jeP!71bt)=8U}Yi!bhTJkv$)l)!>i zNXp|}JjT>1W&YFmLN#&10+@QOB87b>8L_*3P{IS}ACRU@GvX|U7e^^0$AaXal3XeV z41F|mMQgJ|1Nc%ZDwe1ef3yte%q{Vt#Y((bqJxranDB1qgacIwd8&x45)otC8l{2- z+o=nO8S;rv25&Bt{l@_T_==zdn;#A)1R*-akrtt@t;&M(6pv0pxGQ$Hm4rljT?EaD zELaYHx-#1&La{{(V^D+T6M#EYQ}lPFpKifRTpX}kmS$$Mha#Yxk95{dRTSc!unv==^=+LTbAo9~>byrlED zg?*VU5UBNw=NVflB#u>T&X?V&vQZX~PH=tZ^14QWiTztrJ^c4q%)`0c~Rlr9b3hG&usRJoUwQH7Q_r~RWcpe ztwR2E3$VCTK852VdW1MsSYxi}p=30(U~+T721C5$R-26#=r`QO-`nSuC0W%lgg2s8 z_$j>rB`3u+H^#jjS{=TGc`g`c>HIBC;7lO~qyL^mx65b7<;*Kkb@?rJB7=(=id=P6B9w_M20;(jMfhOw3_y z&xFC6K!)HLjDts(x)kDFvwjQ9Vj0~}nflm<^;)-FnMMN>;EL+_xMr;8!=QGZvC1zv zeF6ea<6S~lAY?UV?`8)6%ecEx`RsDSBP2hWklF4*w`7#n6RVvoFz^? z>(;8UBK`qn3M$-Ey|O0MZBQwwpXPRT;wnc7#mNi5m*np#HG`nnXj>x>hLo2*cG!DH z;VzM~p9&2zDCAVvVL!gxJkR_y6E zVvvl(f;xf-eT0D-+W7EMo2u3xU;L6GBiSV(cHsHDsOpOqwMv@cXzhhFftq9mBn2D< zZ=#<*@GXfX?@2u-y^=?!;~$#^0T~zZZqTm?f%-y-GCxvr-M!2Ag5{V|(7#n?1;XIz z2>6W7#7c8TirHv(%c5((f4g!X^+h9RuP}c1AvXSRN0!8{TPaTp(_Pk0p^4XN?ldU- zp)G!NIj~jU;2keed856N+BkJDd36%t= z&hg@dNGIB){Nx5Df0RZM8@+)22G=M6eQ`k%3Yy~i5ii#*$Yq0rQ(=d+@%+X79=nU?vUeX?S|YIDaxap zxI}*~roQGSXTJy0(O#OwMnJQ}76u6s`rgvDM+gam6L5&5l z6LBZqp zA+ouKe!111%4uWBs5Bc$WhOlC_EreJNT+wn|w&E5zgKU6y-8c^KN{E?TzHJng zGCAwXZqkXW3CJ8F2s+9Df0C)BBX5Rj2CSC=?VL-)6O_S-ZTVXy=MsN7#1j_Sp zWm&=%BCfmDc{t(t{OZO_tf%!M+VS`zeC<>e(#j)6h}b701S^cl5VXBoGz)_4mgD z9FP;S@vL`GtfI@T$OXctJfCb5k4f|ocPKl%BVQXCYvK)UJaoHDzIPrav<>sm6_M|8 z1(G5)U@aZ5+wx3}Dp-lyB|s8C6o&$D$HcSF|hzbinp3o?!^Qv4XwO}JyUQ;;)^|n!2O6l>8#BN30j1a zS+{bsSg)h&s%n0ay@c7V(jV5chlVEYu~0qhL{kGLOVf8d7bH@r zXB-DXxj<|pA+JFU>JUN`bd2kCZ=L~GfAZ#jM~X&88SO#V+QnuA!Ui1k%Ug zFObp?D$0!?qdn5#+_l7UWu)NpDY2!lCkVn4z~4==A8~O!(*qmEWKuaVf`Omh3)i@j z!)}K%?SsT$xS+u$Nf*&S;DWI9EGiNS!vM~S%S6=!Fv@Zch5>7|UK@obt8C)JX_q8z zOP%P^?`?cw2*Z|Yp(OCv`)yb|NATy=G&RQY^3OrIT)c<{B4PZ5Uw|co)LN97(J{xg zrUuBe1xTrLtvDgDl%z}<+3IRl{>kxKX(A=uuQ;i+9=|Jz9#YORogL78>n%(_(_@zH zX*HTj2ZRrCAefO=uKATWm-sGjA(7MC7bYol=S&`(KfS}?E|xCD2$jK+0fs5oEQTu{ zIXxs1i$4<(>}jA_HgZ&wEl{=ur^*{&3+E+D?ONSkjq3xCMB}2;j9mB9;!!t_BfX|J381F&elb61sm9_ zwO4vxJSjBP3O2$dNYI!m1v*Ru#t~;pFirf?o!51K$bLlT#kW0jl$avg?Ox+uWw_}% zLPBnPk7!htc6Azg5elYe@&o7x`|t{9-Mhuhf$LfJFSg|0~!^b*2f6%qQx9B6SriI0B@hfvbQmZwwi+NmUCY(&g`22+6Dp_C>%PXZu>3(s)KxTIFKB z!?^0FLahje#&sOkBH(X9&X<&tYT7XcOEYFPWUs(f=ewybuZrH}EyPAZaUf9@b1pxi zBol6ofvb{r$$O;=yiIlnhYm`f#bR>M@kR#PEsACUi7U>Ai!ida9YBpX&XdFD)_+hK zWKXEMr{=Joqm_#ZCspR{3CnEwg5FpK1nlTYvnDS@U&nWm^Q(3`-4HhOx{y9B@BkG; zaNPnMynO<(kd(k1-Wq);QkV%Bx#`F4mlIOYwKf$1vW8Aqe3i~C7M!@C=+V4Jt4 zj;5$*BxC;W;y*%w8K^1afB(9kyRg8kL>}|>M zgBg>UqmnOO!}L7{t_spZ{9h0qDEo1}0C9M5K9TR_F%aQV^&?7|8WB<-o8Ns)EYGvf zo@*UVog6!63-!CWc4vL%$ESj!sv>1cgxK8~9`zeeSV?_akd6F%xs;3x$*0SZzZ1uydSs`9 z+@7G+Rs%J!3TT8|qIEJqCL%>BEd;5@`eWF4t|1HhbS3@ID$i$p{zqU*S{$oXWt1TJ zgI1tbo;tzkLf}DBuO&P5*Sai;<*6S0%R>1b=`Hmtl|04ueB(H^i2#!964NV=2x%&o z{FlkK3@)aCL-lQF4H5Ppp~#aZ^`xEv;3vIP2mQ{)=9TfSH$%eqDnnHI9oO8v^Q4It zE4QzvMmrwwBuc?xj2}st_ziLF z4xA)5BZ0@UgVOWRTOPY+=5l=y_K#c>*)M_us1+xT(cNg_KmNNhjh>Xdk z26C1Og0*LZE47(iXChsDq7{m98M^EX5sMwODH>?*k?M*sg=A(d16qn%XoSoo*(Dja zgqbIqb*tgAM4I~%I$yAAeXYXg9RqKkouW^QnZxhA^E4%z**$nRJ~7*2G+No~WM{s2 zuH=s_j8&EyyAt4hnKx!i?u4TG(sGf+#`CJyZe~MhU!^iEcV+} z2TKI%D!xD87am6cWXM4>-i7mT11@}O!0$)`9RU6;*59{6vB;KbH@UwtU6PS8ShS}+ z!xxeppV9KvW%K5IEd^t3Cngxa#9?K{t^8!+l0MlTuqdTNwS7mQCAD^B3Yo>_jTulm&ZKS9V zRS_0shFtfVZdCXSi$i>nS0~B-%HwGx7M|Kb_VKNYWa}fVar8FVhxSDDZlgJL#*bC zNzLM@kW^$m>Y|MkD#9p75aR@(G?b)iQf@ed4o_CVgZC&1CR(z{#J1Op(Rjm_jpBr4 zN~r~LhRDppnc^6cbBu>i?2^Pq*&h%aXtHf9b<0h8l&?RcvN$49kQ~rZhBmQZZDx*6 z?Aj5bY<8TU4f#n&B_Ygy6ullWJ!4`(s}(Pv;ct-z?Bc@ZcOSEHtWtJ3f9FX(QbZ{UwOlmNrETv)~Anp(Yuj*ShVzP3RCJP;6&l;|(^G$HSROE*%WNB(g z0Fm|1HnQkSEN7ilWE{QJ#ko=je=U)RAv3tTB0E=Sip(Y5u)Zv2Mtu>`o3y1t>ql8B z%sW=GN`&O30%4`dq2NwtAi)N}iK6_qlG#t2n1|roeC;jGg@DTH^mrENlH{FRoh5b{ zVWT(Q9R$a_{>)1zRpYxn7!5U}`I2NxNI&Y9IF_n=tpuchtCKnXXkh%b%2x>#I0ETk ztJ5=FDCe3PP2C|kV%D&!{3CC3~E-G(n zj*BqwkX#D*M|Iz3`bz*W4L^JlFCT-mC)87=x1W>pb_>07ftQx;E|xh;{m54}2;?Pe2U4j~o+P_-3Ww1K6(H_&Rq0~{kc+rd zwWwS0(=}9KKjpv)G2@t~xV0nP`DMl>zKmGKKg~WBDl0JYg_xg(9qNC> zaPDhDVP25+B=r+kJ3;^S@p@7PDW3Vcq5cH?{cSTm{8Z!4Y|b+ow$7JRNt31VXJL9^ zVt1w_U#4PZ7?>cOL>zWgS_V?r5iYC5st+(JrvPQwQaod@n<_YZs5{!jqz=_(Y>$07 zQ!>2|l#%>Lj%;PW=h9-r=BmH2{o=G$mu&-|HSM(oEY-I2oqlZ-Kyt~qPNFB&RWS&R zn=gmJn8*F}%*!^#!qfCl636!Bxc{6-xSCpdKg)MYG^Dyc(SH#JYV|I9FyT!?CTZQn zKKcvZxek=feumb!KsUaVp)l&A3H@!sgl58(iqracLME;Bo~iB)!Rm{S3mNX|<8I09 zY|uc@vHR1xf!&>TmUD;`xv6rq__v@u!PT<5o^+kbKcFcQI>~Hec8`F?3A4h+rBuJ45=kN71|fy z+q`O-19#Isk>l4TF||J*w93fNEZXmCGN6|Sm2#V-r1Y`G3DLDJOC z<`^tV2iRIk(6$+>hU#0#Y!GQ=8+ld8Kf8G*q0{=8hp^gx&=x5<~cc104(Zf0u?Kp<80c z`e*5T4tArPjuGpnFSRL9sg&VC)z~~=sCJc0BD+dHyufT2z0in|#A%a{hY%WRC95r1 zOK4xFcwDY|&Mgo^!DV=as|6GGr_~Zucp=Do>Ib3eK{cr+MHRjC6-W#>hE)|8nU~xs z+QzQY>EQ}U=o{jhrHqHY>Nl9qiPD>ks3M#q^m@))A-)&&zPx6(+ceD7XCh^Y%@c;Uts%;y87&!t%zzEx^sY)q^8=Uy2p}(U z|D`yP7C2u;0I70_`WkN~NBa5qIFOLphWJ^zqC6xK{RhLWyXo~jufxt1T%Nx|&C-`M zxyA3QtyC?O$yiI0U+@duhIVNZ==nJeI=KNeEU8{Vn@8v^HG_G>+8&r6 zV2NHmv9DbAWq&59Gk8#n!;Q8(-K6+znM?#y$>!j?-+YEc-6po81`@lqAYv)e_uvQ% zoUxMO7KEP3BCgcZ@!4C!mx+HJpbOFh@~$BtUgos}kD|ZJ;a%D^i7qr-66PYg+pzbD zD~C?EiQF0!vwC2Y>_);Iy(eml(aUbg+7=uB9bgNXW>i>j9;ji_KuEc0zCgi+7+CHw zYZX|#Rk`FQO7j96P~KhGmlf2s(^FZHqxQ%YmnM8pYlzzI5)$h&EB0yim|yZ_S|=QAu?<_b4+F{w1x|+;zU?N%Mc%WH84yIp+cwi zT6AJeu?A1q#wES!6x0@o(>YJgnm4p!Uk_&n2{7smR9+a!W}^jqr6o)1MlF5a9OllV=NRxDP+PyX1AkuF+OH_AxY@I5pZ1V%g(-;M^^?8#)8P z2J;u!`!+LLRo2pg_*vQ!&bH_=eP|gI@o50vbyYT2rJVc^iS2nv8lnfxc}!CqnBHeo zhpNhZt6d2EGz!j-w9dp-)=PS9p@dQdYw9L8u=xXL6Y|K-1*PRF6x!K~(5!)^SOqhT z(8<)g(1ZMM*5Ci~ z7cTTSrjH@^@jN!GGEN0IkAH@9_NmL=T8Zd<`XEVDu6{Dz_h0HbE=Hu6XR7%5LJ5;s zuNps_Mah(YdV%-V5I7fCZc&WOEeJgHJuG#C(eX)wN?1*-MbbZCKnWOiPNyhgfyP0p z`Ao=>fPX!@qWqU~p9cicD90jPSn-jI0{TwwXESw(tLfT2flp*c|4Td-f?g0 zl?z}{X>#bMLbC>E07_m@8PtZ`TD)+Y1PXt9)WYdbHTaW15qZQ37A!=n8zasHQs(G5 zRZ@Rw%?e`nd+)^Vy|3wCuUD#ujdp*nhUwq_@yqFyj{q~~`w(#gKla0urCkF7iS|-S z0lt;K%+C`%w&PJ*CuC%mqyuI$NvcfT2*L#1_Ns#d=f`(k#CvEib!yxxtYpN7^u4z5 zJ^09&GGT>0tEM+v@22SDUbuM0^NAKR;y{)HWO^n0lTo8;!yt7dCiwyq$RE1rgwht7 z=qe8DI0K{rYXWCy0fWt@LjFJ(ob;|*R#lTgm2L0b)G?8@zHpHWNuicmN}xVQu5#ef z?FhuPWmh%LBPJ;HS7-jhy?p(zW)*HYYYEtj{I^`0l_i?+0XSm;ciSKC;z5;TEgbi^kdFqoU0dkdW^KQ_kMT>;9Q!o~ za~VCj4$`Ajq{;XwzgUB#GN=P8z%Q`5hRP)b@>YIIBjpTpOfbWKxysu~v$WV;?UQTTI=pg20_{}cy8{U`NoJQJW7-OJ(LtB^ODl*C(!BFuJ<8qd z(9Nkek8!CW!}3ErKoc}#P>~;CaS4X#HFY>|%Xf&?1uqX>*1Rcm>V!VlAb6L3pzqPi zRdMJOo*uvZ`A?!Vvk|(OohG1VdQXnZhDG3YjhM$((bBHWt=?SwpsiANoLV*j@z{P3-e? zSyg_~!VM=&)a$WyWK!S3a|cmulI^?WB11(K}BMX|fj1*@yJk7%c4vrWKfI$3z7-VY_~kf$TJaSn!WIjk8>q(7k(y4xl%Nb0SOr#qB!U8@kuk_y!a($K8vb0A zMvek2N&yq|f?&KWFgj*CNuy00GINjywFGMenB%;+6%4R+Buy5s8ZcJT&Ro>4bkUZK z&j{W=H7LHQm(xHHMFlb-(=kYJ7mMmFRZPqICj$>YCV;>-gs)4Wk?SK=5{-^^p+Qms zVbNhab?JP%<a6#7d$ zP;M5;Q%{2lS_OA_JGy#xw0CUdJ7i26svrn0@Q6?LJ31Lne#+0EgR4$30#iW2ZPheu zby%?4px;rZB}OI<@R17?V^HUy)@_^UQsY45Tuv_-TsqS8<)NYFT)tv7k`KU`YmRhS zpegN@sRNEaJ`R4wlj4A*j)^sUAHYw^O|$TSf{hom;I=bnH{TI=-f&G^dEO6W`}OBj zSEmR~`EQIk%t*-3oDx<}!N&l-g@Mf-e-I3*;GZ1iqHMx~ESkyCAS#yw)9>(IKI9pO zv}N$1k#o1PvY9))MLXq9T`2*HvMBxKssEC??37G} zsl+k*@$5EAQ3q)ON8imTAx+U~P=_|1YQnSdjxoZ>41*ej*_1u$3+zSC<+fr1o)`id zAkLQ4*k?8$7)xfP(4t5EoIb;tHlRz6_JzgF9J|=&*qC8<*@or0fNFT_YyxqSbQ?n_ zOM-Gk#B^1v-lxOwdpku|7 zW4G$DX0HdZ_GmJu`DrRAi>L8g^O{^rRTyU;V{TDlU$}AuvyM30kDzO#d@u0^(Jq~}$OJePQha@film6x3yx;fUeLvr~{Cz(U%iQ;#pS|w; ztlTMorS0(Lot)X?-uByn9anwx%((PlzL<%dR%<%jm}mM}8}7PCb+3mHFqU#qE^Xzh zF@`bQy8Rv;`#t=G*nG=Xl+`v02ZJzp#jHM`l}&U>-YPEe+X0SiO7o~5W!%F>ReqkQ z(eOh$3{3@&P6t~Qv^aGI&P!%1TwWP8(F1b7qHK&Zfu@Vm(~w4=k&VU`L*NDs&*WpG zJr!bvh&=_LejJsmAUZ#lFb#oT9awZ^I;nJQKRuHu`u(-pp;n5k0HldYTM%m&pGzfYz;m~>IrWS-1 zwa(GKk+^G494tBdb5#DqKmAxd^eNA$^@wl0{Y7!t)#uW$YBPujKjGPN;-7pppZ(AL z`TDy~jZNo$H;rqn!C~CH?GulG&4**}BOeP-QBsuYH$VJJocG!HqKNZFIDkn`N~;4< zoX5QS!@svn>2=?0`2C+>_ng@J>kDXu#wd~*Q-c^robn^K-K8}Rj;`H3 zj(p}H#=%c~Zj4Q@xo;P{KG(-4!`I~cy<^Wq9~H+u`_=po$?mF~)t86WJQR*=BLp#V*3@svGaN2;^^Tq{Xg zN1gtpP9Fu#AOa@mu_biqNX!gRi+Z{pU-_5z?9aBPg*4C+>xdjJyX)S5%$PW^@jNZp zK4x8HQHPUL^jJ~XuV_>NidJyA1X?|Ir)PGD(Ie`ReV8q8c@z=@G5eHN%DONNr#Pfb z4z_rxp;&N~49}&J=K`8-^5EKL>Xc{iVeqN{fMcH;hn?`^*mnEP@!h|E12kr;5x#r5 z#&?Rr$0MHqy4df?$H&@z9+>yH-g!&haK#1j-A})rHs%4JpqQ-xD7!*ktLRAGqZvHg zO~^=mw)x+8O&oWvaQ_@dsIC2onQJNs-E+aKZx6|`YC!tfG>Q~pBJK( z?`FT>@r|ofCWaNiedY(^XP@~u84Bh3}C*>!n%kEO};Gw$bKlyAQdC0W7 zYJktXQ*kK^)DwT5PzDv!A9+@BKg?YFD-s^kyLyW35)U%_&7i}e-v#sr z?gp2_tPL0)n?RNc#(6dgerP#mWvT%_HUZmQej2dIk%6wW7Y-`)IT^4~T2hRv002M$ zNklWicefrM?EVS|FPdXIhM(J%Yc*z3qg$ErQ|i-oQC z#LPXvjcd>OeEjB;AHhp(BW)-(9{1#cOB-<5NiU6kjy^GVJLn<6(2N~--4gd+dtUtN z+h@iia-K)RftkFb0=N(;LxUrq^5S^NDK7)x!(zwXx5n+4{2(qv7sSB?L!SUXkH4W$ z?H~=s^WN~mIR0g?kFUM|j~HZ&BpF|_z3xSD{qZPg`MRUm%K?nm6qMsZY@m7Y@h^;T zfAsZn&Bd32cR7=E9ll7s434`5@tgR4aCe@sT{9IM$O6{^y2k(-OU`pz!k*{)JLGI; z2fuL+{;SCDO_McS=-Lx4Ir zvm@8y`up;02;Lt4l0VD)zrFBmXoe0zi(HDQuGyZn=iMbMsei!LM|tN+sH`PfbK;x- zHm>;k$24z=ySndB!PZ?z4Ib*08FpdPU*w_C@G=u}$YTCvpoc(`@=1rG-^{=Z2KZy^ z{+?%^TLV3uV!-tPC{hKnDw)0&FnlGqls(z7NNQZChu)?TseHzTGIG)5s%7Xv?EH+Dz$iD@Xd)YZFvqaq{4437Sg64~Pp; zPG101IxnXiG#nh}I0|9%2tu}8n;ux+InTO|={Vv^&marYO}X&9hPJT$0VZ@VRKxkO=yz)U_dsnv1#DX)q{pZfB+{>NX$5Pb?hkcF{R5HRQ-@Wbjk zy62us)Mb197&K2M5XV$5s9+EUoIMWDHe}SmYhKFw9_1Ukkq=1{%JH7ANv(qi20AWV zFn|p=rfHdL$e@GNkc+aFEfq&{=b2*AaulLXPE0bYUy6k}e%PA;kiEg+ zVgSYn4(8}U&BD2%D91TuvYk#v3MfO+B7gix+scK3dPTaEWk-u>4M&ZPY7FZjv?T5# zMtu+NR;h$tW1PF&=&$_dE!m0zo|I|hJk|ikoLsXZp700niRs<a=J>q#E{8Fsh=OF6+>t!JLXkLdr^0@fwTb@JEbyo(L);Gx1xlNA|D6u4DX;$NG zPyh)D0KE1-;+R;EBl?f7ojA1)=bSAw@L99xfw6Y~BmSe}yPoOXMqr}yi!nidbzOYNBM&v^OXM~__MxQWQ2j;(q@aXM+68O``&^97)Y>t04+c~kzedf9UEz| zZx+E!lDyOy=X4-;-(MQ=H*u8@6rIn=8uFpF)$VEA>a?l-WE`0`H+wKsy@7A6Pgt`YYP(E&I)ZqfhL zm{ROGbK{H>Su8W*jZqyp7}A$I?ym7V>zg#Z4(8U>IT+aWgtJVS;{2tL`sD1+;u2Y0 z9I}C{gD17V3BFBqv;iC%u=G{jSEt+fzxtZJAUe7iZ?> zhd$<{XsulzN1t$V+;s7eV|M4(3{>(=OO|9g4Qf`FN@=6=r{$QItT3oj_x+_DeQ$TU z68jwf*m%ZAzMeH>w-1D}V0z@V5>D;bH;$m|+p+!X!1S8&3`pf)gV;x#I!8OFyyd;IYOe>zw%=S9)m&T2b7mUd z4ef85_X+m(BAAI+1ob)&z|j|hg=;2ridHyynZ;E0 zJy2OgkZTY~zl;$`Hs~`qs^GNAzQ!?6KP^X4KmFW?;^=3;A`UqAq?lm$+WeiH8BzD+ zcUSz3k=13fIJ=NX=`bwDm^9->AO36{e*E5X%SGRhOaJ>{@qCs*fi+XWGtO^kI%Qqt zxF7qmi_GBfw?F@Wob#bqV3;a#F*rT$Mq#sC?4;w#$AN_uP09 z_`(m@Zxo`$ac}$#*|}%MO+Pz3uKb6;Od&Kg<&^4947wX#Jh;0F0c@*6Kgv#3`H>#- z6WZzo`b=RcFMAwuY@G16&%_ik-uJrWno9|OzZW}hyN>Cw+hdU_v0Qu(W|O<^8M{63 z(3pI{5wXuhjw7S<$gJvA>ftB7Djx8Nr^Wdn`;(Zt`$tKK3P!x^Km|qUf{)5G!V-f9 zff$kiOlC-Ml)U6UcetmcNBoed3ImAzVQ`)azw+f&v6(&3uT+-Yai_yDkjrA!bBxr7 z4zBaab}8>*RY#p=6k6_;9hd48^rm-}U$rp6V+K)?r7vIt52raZYfZamH8M!$y$61- zR|6XK3b`~0rG4w=+A_+QhRkM|)v*r)K;FeyICzy~5nNW_?lp9eHiSjm=I9f^l_7Tw zPE1b6`uz`z10Vea1~0FU(N*hhDRHweGffTy2EC;?@%10s75v@t%M0UXM!WUaWIX6e z&yDqD@z(750J7a5iGO_S3(L+%0v3apy$*Y5oc!vy$IQmx#ScFDL7V{DA!JEKb*J4P zha8oC`e*xHHv%^>12-he%Xfpy0X#SO*?#x$VtVaviIaF+OkQ|~srZdgvm|4WB8#2* z8A4q60UuqH)TU1}O436=Yk+FD@xB3IkAVG`|MF@2w?FJ4`dTIMSiAqBvFDM;B~1H2 z@`O0znXis(ze73NE1RM6(XK!H9dja^xm@@To^Z&)lLJ>}!656Xm05#b75LzpZmzL) zh@Al%#x}De$g%5b9h50M9W$vKDQz7%JNV8W(h$oGv(H=`qytfg%(yuXl}lf^-(RGz zK@o4Rzmk9k$5jT;u4goPVEKmqPW6{TzL{ZSHi8`2@a9f<6s%e!>%zL{oWXHK3IE#|SM^g_)|U_t3Mw>2m%-f~ zwA$toW``%HCt_~$G-;dz77k!DOLIDlbj3rymOZc@*knR^~~Y&`LmZ;SnodUTc_ z{yFE&4-%j<@WKu|Rp&s#HG<0|0L*$$7>KIdR8SqwEKcvXH~bu7I)C4I(6PtI&A&Jg z09@0?pp`N?TZXUjClG&e?swzR$3Gce*)I-z+{tn6h3Bv)a1(qYpk*4oMSHGk>|x__ zy_s}{9-gmgRy$|3q!9zWlivMz8T?)G<-dw^KJ(rX_ca6=8xA=-j(gLY48~s_8?XIY z+;rhZz>D1R_wZ+&p26R}H(nKIz4=*D-MKT?tX~}y`|J~sebrwwxOr4O>5Narci(?1 za>Otc8{~|cn-Y(C(HXJ%ch|>1{MqTzC!pPS^X0MUgAa>CPk3=$`cEH?!OUFhVJ_K# zI1_93h?jln3uH!bitm2(&729UPAhXHV6eFz+IIs-ZYb$OZxSnJtozWdjlG%P>p&7H zzm0p&IC+IVQr$~Q`2XOd+gz?jMlp>CxMZLUO0)Og7OVF?IDMu;duF(ivs}i345(v}UAW#Q zowt@3gpPggE1>=$e))qh#RNNtj(Nf9anKW=A9sG?|0u=|17_yN=4u$e+!hY*j@rG< zR5}e~fwJ~M;ot#A8+5tHZ+EWQJ+RXUcz2cZsESRFOs5hrzF#V;VSajf2_9Tu3hL6mraC&|?L^=dVz}M0I$t{SS;cefgI_bUzpE zOTVl`;I-R>9~JvQ;>x8D82@(ka4$v3_buloB7aDaQq0gpN{)*Wzg+yGm7rygTu?Lw6uT8h#73Y4QDI@5bSxK@byB}P#f9-{t_~yG$VaF&7!I`r5mkAtH z8Wb%r5QG@CL)@Qy`mM2nBa*rX2GGm}8%vzRf7jjH*#Oav*M8xL834LW;^I%fF=fX< zPaV|WDa!^s@^YAsOW;=ibXgRB?b)BDRdP{eNh<_@>e4bJ`JV8Cc)N)_jR2JZRAoK=&7AhkF>?*H&w9@w5tp| zn9AQl=c8erSK0;wV;GRSvXkF*)>=BHMPukwaaK;dGw{;?Jo6nN&-L+t^~$HAJF~29XR`;`81!j>?0161l5^jFZzGp( z&T;vOI#BE_?;5fDUJ^vY{BOSW6$argV4L7qfF`Ec4a`8tq(-abI!tsDIj-}*#MG`y z2G?QNTkL6I+M1OUg|EniOXsH6?j6s0=Vud(d&&MeU7ZJxBm3GqQlnHr3VG=VjJFH~ z9mM&g93~lD9%qoLu%pLxjNx=NYC-9gJwmOFBx%HZ0;&N(PqLzw4?Oy~c-J>CkH?+* zs#v}I-XL0!X%;mf{j`_GAO7umEXF+1)({>5qoRW7y!~O1eoDOYpDvC^zu*sZB;;c1 zNv4X9WqR@tK7Ua<1T1OkkNPDriP-m%PmWW+cu^ejj90`Yj>CEr1a^n9zTkytUcmZ< zYi@sclG2%IND2=K(PXgs_?FAgNg zeDSA#M6kFyzV~M@j4wX_z&QJz&y9JeJfHr7Z^S+iJq{RDFomrsq|-XCdo;)}5Xd7! zC}S`w6ZSgf$k+qtb^9+bj+sq�@|DX7+c;@h?gvES)v5n6P|_he3L_w<5uo@t+Hn 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

)0CGrWRvM8Pc})iKLqB?o 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

pJ>+5CrBSY zK~Gt!o<}1a;~W?d&z8`1bDSZkUR+*2t{g(3H+)zU<>)v;XgI6BX;tT!PViqD{OY(c zX>znc$e9rguQRPmZj%K;COybj(UHbS2@VbMT~u7}tj^xl&+OWbFUSfz`Mk5FqDYzI zl{8w*+LCX!pz+1(!LaJGNo0zXsV`s|6MqJu(wPzymT`+68qw+zB9Rl*#D! z0B734g3R%56E+ddWEDdUBQcI%ZD|K#L}-lSM05T2M5;OyGz6v?hZ&ShX+jc3#p|9( zwtht!+JLC#HATP51!f42nUsw{A{58Jj57jB!9?-ka_y=gzK2zwbRM1v#lQ%WOZHQJ zUivI(uLDS)-O?DN3oBA?GB~1qDeRgb;X~E87&~TPIE7DoEI8nVAOstO2dHs+6-a<> zxZn(7Vvnsk+ZX(gF{-Xijva-wz_bP?>aXQ7o^VNEhKuny=Fv3l`Oj2COcE?;O!-a( z?Ln6kV_Y+^#)Oum%%*%X+KfHTVWl{es&xwAZHHmCcG?rfuhN z?;5~YW3($<<+&&D}7Zh4=^Gbo*f|Y__eNsNY4-ZFQ-zf_;8;2kqiw-BEhRYgS^w(m% zpKy&N`V1yYP2ixeY{;w~B9*~!S-_ibcE)Er&1AU1i{}MN_(Bl3!@&X2gFsJKYY!&i zMj%MW?0)uM?mfyjg?%8_WcOxgc5v*vM&P!xrxss3(y7fc;n0}DN9pQcMi$r5VWyTC zQb&xCBMvgmamcJOv^;@qTH8c1PX?`W zrt{#CR8MeGwq#@_SjgM#9!8HKoItVf@)_f;P)YMWB@O1_+7~N9K^acAcd>wAwXWQ_x?*cCnSVn`-v`e0R zC;#|*I7r*cDtVpDIQ`bP%f3PGvY%uH9``@v zFl(c8GjG~4j?qy$L2yB}A#*w5yWp4l)_XJaS5 z10H?w+nNnqI!?ei@CPINF6lEFVGbEuEJP0+c!R@5mm7;`=z_-^ni;%&d1t6z~+lI3s-@1%}#PQqAV%IZTMFuU#1^=YBUv05Kj#x5ghsM1;7! z$gS^{ql9XqNHb-Ukb%@L9%=oR&JKp!*QozsxI5L45sT{Wioz@$yBT=jdBXKR9y%}E z(HaoX;1~}_bsU%gphz$eWP*{_%I+~zvQyAFhFf&l-${|YXTvDrPalI7 zgpDB>h>3=41N}JaBb?w(I0%8PDg#R4EyK~hd1iBph3!k(!%59lCj&_72Fz8wA|o(N zn;@dkw9)4*mTuq_4`yd9WQRojgl2Y?wwsADMsrTZ1PtT6MX#d7FgP&JA)CQ2NLZOn z2J|3cP*fd<;&Sl7aJTn86H+j{Co&TSGh7t-L`P*+WMwEGWx+Utn(%UF7+>(r{o#@5 zf&h&d?4yLkV}l=jQReOue33f?&Y>W5GQH2@A%EK7s4F+oC=gu*HUWANf(3SKq` zjVOAN;aXM@PKU)CcrfBa?HiRUrH_q1>YfBL@*9h7ITDBuqr<)1uQ#G!pF$p zfltxU6xYZEe3M%|6)dudc2Yj=RcR03XjgIvDBHO>uYL@lXBJwA8^*XU%ABRB`>lQ1 zE!lZ;K>2`8dw7Jhr7TC5f@8AD2Usf@UbGQ*=>uzkgGW}ULrlk^#ZMyix29YhgUuEc zWQZ6!@EH}l7oO3!@#ym^<2P&0GKS>sW>dGjK9C6(%xYkC2HMvTS-9WsP;x)-4bHin zqbR~2L{()cRSD8 z^#A}s07*naRLdZ=_O9__oXMor8aiu_gEm>R?!l{TjB0e)9aD}UIq{S%m?EREM+erY zYQ}|^@HHbdIFCLMkhl%qtWC8@9gpHMD8|chN+(%sY{~^M;~SZdg@x5e4@R%jJ!B7j zkIN1-z;q{BAV26-RmNs`KQIG)@B_cMl4s-M zxOk(X~r1bRyuP zzw3VZK%b!jc<~542%_q@Y@+q+hUgfs^W>QWIMd_tQq^Y+urZE3_~ERM@s)tgA0DCq z=v+2mtw&|hhX>MyPua_0c7JTo@L$*=yn#6xxOk3E@`4BBLw63KvCIb1>evV1Z}e1r zr7ah{&TIJE6g969O%BlrUs@071Oq&2N*Vu*tqj)l&W;`DF&YT$^!cRaAMn{g!ZC+G zeH4#7=NFUnMP6xrsq;elB6JOT0h2!HEce;Su`y^CjV6|@%q;clw+pH`-pgrp1I;~Y zK;cl>5XWAt!+*l0Tj zoTD&Gfq}1(sMmsTF3YTqDC%T1O>Hd)BY}zdA~ME71R|1y}#)cG^C}Q;tnRlNsvX%rrP{xHy>iIvGi`%7SCItDt$W#qt@S}6biz5 z*Ds4af?VHY(CU{1;F>ioQ7|&rW?+?~zLhb#>QxnEgu^XmVET7<`1E_G2!h|H6NKf+ zPDB#JQxeu&92RXhvLevx-a0V2ZjFn2PmK%|6r`v}|EeouO*ur(8KHi{el zVnUfr)6FtWvBelXj7mR@V;F3lCg6+WO*IilJHe&jA3yA9hUohsg=}rq#mgt1$>kV> zgg1Pgo!pJz-ZnJq*c<{Ggw|R_3%SwSnQmuyGwL}2?sMqpaNNc_J6xmZ?tq$_b3_Jy z8>cRqt+SCssj`blDNvUw4pS4R z3oALij98PMIed=82uIkz`9+4SnO&kWM&ac+Ae5C%Kyp({M@=uvpc=#MvQ8#udb-{0 zoW{u#*j?ZAS;i3hS1=f?jp?HIQ_4;`uQ6!bbklCU;kODlE^TSMj^ekRRO33x@B|K( zF$OxqrycW?9T=P}Lp_0@y3x&ahs|*u7}HV#Ho6Lqv;jZQf-992vKOoqyyc9?dclx` z6HJWPjdu2GCo%^UW8Ty_{l#&ioT4qcCMS#&`Exm=>!ghk#zrnCYoR_PQTui!&a1|v zf2`A5)?n^AT{6aI^hbOV0lbs;c@F3e0a7Uv_2?XQ*5u0eq}wYu z_>5nMKEeF5`W#883y{aja9LhbMM;I*>2$V;a5bc<&#+BzjeD}{3^n-+cQRHSsnO@r z*y4OJz)gtD0a!4MvxaZGIB9~V2|~l2%_Pog1g`*wZcRdJHz4>5_2bV{fN2K~m8}m! zK0e~Gk6x>9I@yT2^6@*}|FG=8Sp^#**h6gsXq@3ZD7whK zN7?UG$a)@5`6w$Otli13HimqbD1aqqjMGQ!47;@)Xz~ye@OqSuM~%Tbdry1EFlTVJ zPp${<;MW))7#*MPa17jWipUP@{u$c@7Uf@btPI|uTgVSA(wWM>M5p)w?_X9ALg&AD zR5q5(DLW^1;A^-Jn-h=)*lsWIiKRhkNIq_aBR&E7c1?gAJ@5%R=`6Ns+p&9m9vdt1 z#k^m96gprCarG%FM~FZS#X#}Ps5rI$EaVI5ducM(=Is1 zdDgqD_BRpoBh5jie$_|qwBAQB*bJ#JXJ~DOFw(nl4GYZ&ev^JGxEEMY~;mT0H z+7LYj&Cq(jTPUBPS|@syQ;W|jI|^)GITYXE39x9B!r<75)LQ~Ec!ygNo^>ND>TOUx z4mFA$kdpw9h!h@yJnd4Y3-- zWM0A{SqgxlIWS$%+mh;loSq$0-Yf#oIZiDQGaw5lhJ! zqk#qjk=ya%RoR=#s?v$@6%S~WqW7IKt@7Y1>@Gew#%KX=cm&S<2TnR0KiC+xrW2`7 z7{ND#(!s&-R%0J0V`SE>NV*AK8vBk@I!M4iYsU{b=5*b!|FGs=f zsCAe48p*~O)-N5TV|~mxb7U(z_t^?%*(<>v9dCJwfLIG2jy&|urO!P>g(t^mbl(U$ zfHON2F7-FYvis<(?}e$wBh1RuXY~_`=&F;F7Rwp)OliF@CsJ+M;dy^KnWEdsQ8>ao zp*$WI09C27bf#dD{JGbX!$z~{BxsTGnPaoY0aTw3Uk>1l7xdSXJN#mnfz6}ie3JL$ z?6QqBbmL31Mq5IXW(rT_Jxm_xN-G@~IKcbxNF%4mBGBMq_;UDq zJ)b07Fhs#{VVs;(Hui10>Thfn`RPI*ydNTF4XeYdCrDvy!r#&J^gv@!X5=VXZrn&= zv^KeDsURv%A;uRSn&|awH=YE`vk=#7=t%51rU~Cw2mjtYO=0JapNEv^DfAbW zm)Q&47Nv^dTez7*y?r;uc%v!H7Y~c%W8&vB2wpoA9Mw<12XFZ5SefG%j>{_8JsA&_ zVQGrakh4hSeg^DzS*RmgM1Pf+c0WQ7%#?5~Cui6z0K!+&Inz*; zds*AZ9X9M8m=`ArO=lY3ig{%7a#?$cdJ4swn%MIguasSSKFDhf3HU7=eyX!zYXNg- zG1&lOQ%&L+f3=Z;gNz5lidyI83yv`IK!9|bdmA3b8Xgt zc2e%k4xcq;H)9Q^;m`QQ6puAQM@@BL{3qI|&sB5u910!opDS}rI4!=td6vB0O*wr;S4MI z8D&7n$3a-%MdkG$Sm8JWk7s)BxRQ(L9cs55Z4|odK;m%{lhHdVl9LpTcibB1#hW>k zWi_)HGgkDrV115!K(pj*;JC;^ew=JPjDPBHtWLqiF_<`(<6H(+xN=t27=gz5qQkwf zVq5_NTHmZs{Wj8ZY_2j=0UO@R0I-}nv#F8jHR__W;VgRJ;N(>H=xK7#!En%EyW#IW zFwGW!Jx`Ifb8rGj?_`a}x7t~F8jT1>BG-a;x}vd%d`i>d(l2B!;~BYtIHDN_O+~Z# z+F{i%I-B$+=R4TE#_d)cx@76^H~_p)MlS~4&QpwYd`L2O-yzBwpG(&AZqtb!9vk`^ zTRaiI63B(VbiniAj_D#`ne_TD-duVBj`35nB9q2&&QgWOcG3I9pH==zboQ#lTQAFo zc8Iuh-zey#7?I9MbI+!Ndkkj!L59z6=uztFUGi}{hZ%?SXfTJ4XOLdRdji>)@$AjM z&wEL$`!XGIqI@!BtaLhu&xs4O45jg%qdh$)_|8sTRR3w43E<+S!5t-Ua}apryb+F~ zLb&KNTpZWmi!y^R;`^YB-d_D#7V#_`RX23>JKAti(qkNyOXE&gB%Q(4S#Rm#^-A0X@ zy|#_+;!sBT(Hp*k#-vGKE1mP!EXM6u+BDXth;^(;a*-|x%t>kla&LP(-yVN9{qUrE zRg|20UL$neX*$Jw=Z7VA5WeA-U3{Khe3Jfo7Tzue&}FZbyb*ugZ0yi;-0>(<=Yka* zh6IOUJo+XZ!5?Oa{u~jygMOm((b`cgM&xY1m(l&%lXyEGa*PSz;}V>K z!s>c!)0MH%`N4adQM;9_ALV115wdh_0-W$DfknNT0(QI^-ys7M?Fv5eRAX|q(#4Zb z;7H$3HnVmc=E`i{YI`QH&{T?hFJc-y|Bj-Zbw3V9G>t2>W=)1D`T5I$t5efKjMYi^ zu8LGbZ35XY#1sz4E3#!YDNlooAOxbj3}o2s8HCmTD5M4+9W5yDL8TCMITPwkRw6}D ziSn8WtMvhW8Nr!_(6uScBpWapjqo}Vd`#{697w5N&w1Cgpf+LX&M@&4ugvP%+W8x- zAzL=XoV@!opeq8yh#@uQ;VmE(=fGEgwt(Ahh{3BonHt#~|}>zx?-6$!4fQOeV9 z^+}VcpR(f&;W-f~$K3ijPWfb;028Oc#k_+%dNho1kr7SVnoglqCp(<+o;51rRTe>Z z7qkL4Wh{ukP0@uzQ|tJY6EefDd|l`0Cqwa}^*8uWJNmBW!GWxY%o&G#WFq*;oLASG z7JFRaPM@_>Du8}cpE-}vuHMs zea3Sl_Qn`m77prL))Akcp5EKePvg0!p>F3Wo^%lQc^hFSfUWPDEoty{09^NPtdiM` zz;v5Gu)@KRq5E{y;GlYouT7aoAG{7rmAB;LdF_y$c>_vL$X!{K=t~-n8~=mDbpFV7 zy2lg|BewG_`LKlKRyueV)(;(UAF+yF@wLp!&@k9dGm$&;3}BoCZZi%t^!l@egTpNA zA^YfLgLULmI7Aa%+M@a=x)UmLP#+)++`twH`8i9-sCvUL`j- zIsf(V)q|PA?GmVtQ^2egmO;l>t^U}M0>6*-V zbxiXD#`qX|x)IL^-emnvHOmCzS!<{ljU-9XNUIIaSUK|Ha58YU$I->>d$x{)$7wwi zXa(5ImNneGm!9BUK@faYe(g{NzhEX@#&Mpra0hcHKJq#t>$lNqxB zi_P@cu%@0RCUmYDobxhkYm-eGyzD8RGCCdqb;*2L9>w_@9&J1Var|y7+H+aEWtaOM zuKk`&U*F9R)nIU?59Cu2G)q7Z_vuVy#Luc(YdJnbNw=GmU5L21UdHegV?-v*$348v!Gk!jth&rI zb{qkQgA~(#Jn3iF#8mIBHG8G(wkO-8+Q|Wk(VxxkzNfQZN(Sjg4#iPh>qU2_YHdbv zme$=OpC@qzB#Veen}$f?6O6|#+O(d}8kbj2dwFw0dzmMDk>?K6V8Q4RNU<}f69r_2 z=5Ii;eO@0gTO%OzAcR_PI4FXwABOTpUc1PW0`tlk zYZF8|*6nc`jLY<+>CseNqh)Y%qR}MSZWP%qh1=Sq+Le=rO(QtjWJL3*L~_5JrTipDPqdRr!`+a3{KBdhVd86M=1~Q_F#?$ z8Rsq7(LLG`?l~68c*BqNJXbkL7tbFLzmI{5-o^-!i}>a$dF6zdO1mGRWXL!e(eeX8 zAKFgvmQCAJ&_NgZLC4N;kyoL6A}59CK93n)NYvy;C(B9LW^)AK5IR zp8igAJ~>PrKkI<$mQh-@C6Ka~&zlMa3ILUx>I(qy zEWUJ)BWR}~+)TzI{=Fz`0I`hGoMsSDUe&Q)DfQ!EGP7bQ{cTDf z&Eu8fpT;xqi>)vo6JW`bc~zovoKx#GA2*v}?bDNZ{#kr-=6&vUbdv71_H_;@Z#3kT z!6w&5)Hf^~3I@Ppq4Bj?HHNe*ln zi)Z?`I#=;TF=sdU=SUwIUDDpa?f-4XVYJf%GteaQ)4iDaW@-c z(-LQp^Fn5g5x((U?&-*P4}jBHmyQ+S(EGFAHy&C+0X_&H;n@1zXSKtL!$+MSIB)4rG`?-AMGmF4faJo` zAQ@oxhF@Tcex^*L-~^O(axj@KGi?fYk$SSq)}20kR93I-uo)Na!=Wstam^iLm|;-BSS=@rLHt<1J(vc$nf*EIH-fgy|aMW^1$ z-vH!!?`uX2X&wQg_3`YO8K-U!FS0R~M%X1h0iE$xRuW;dp6LsE=`^Lmw$ZnA^i0d9 z|JZ|h*+OHPY$Ul=F5a70+4WreSYr}c;k&M(abRFS$jiR0%Par^!S|Sn4q-Q)Gl~C4 z*t<`+E!~}t2@iCkUFu_F!(Xav+BXyXysY&kf$IAt-z(V$!aN^G>gL7DbTBHI#ru6{ zS77OA4kE?ttSm~}qSmJu?R3nLcwg>BDx8A`Nf6Itbe_D(^;zpUZiGnso02Bw586p* z=b!=1E=!Cbu?UMyBWWd!SJo<&g__+`As-`%Rv&fz10^7;)VJ&c4P?jVGiytN)dq^t zHG(PoWI-_^*m2Czi?|tRy+Pva6k}{VMIKz3fy9`6T zcZyo~Gm7DH%Cc3_w^I_g#(}C%c!cdar>t>~QK-Gykm5=AC}RvNl7izEg*gAMX<2}} z!lA|M6ft~pXef<&JhV&X>k9LNQDiDwrz{CGNBe1M_0zQajEM}z6tcUFAH0kM7lRK& zW_TFyIS!z5V|nVwSOf`UoMZ4O9RO;IiP9l}06q@~cxRk9G>Rf39dPC#dlChwGtqVzsah?X> z(Z`W6VD-}N)1p{{`zW5H@Mmm+G;2_!@rpDl{16PuJp(svfWtwlmCgyrBdZ=`lscH= zv!J-rjL^_GMZy@7IlL(IGfrdm;mw;LOrhZANF7X^(pWuIj&oaEc;7pXxozYFo+zZ- zDa&#Cz#qI|=EzMu;f=zQ`QxVHp50LCpKh44jmFxb$%>?G?>bC1xpRVmHHb1BUUSCj zc$z}4`Dl6=Px$fOyNzGD|H?QJYq7VrjL{<*^seaJXB?&I7GQKtdNBTEShvnUdnH3} zJpCM5UA)D3f)Czg7|Aau^6u@s1#Hi@$1fiSCR%4Csyn9^R95zi!yzMdvnfsOSl2jC zRc*|gp6H411%?7TZ3_X zda-f9sf}%T&M{9M(X4yr)4}AiF!L_`xef1w$hP zJ)3d$+(Yy^YufsaH{Wcmm)rej9vD=+g=eE#pAEmZ_RnzMj1iosH5cB36}=XojG>WK zX`J-N3)#cZ^(|0US4PyecxK2uWzgCaju_iH<4~?YPuPYzIKQ^`K#b018_{5FOz=N5 z#TZRjQb7aY2y^Q7P13_PNeQiYbFyr;h1z&=W?35RWSA?ij|u!B1c9mp*Ki|QB+pW&Cjs4={zKYosOhi2856%CM~A6cA?vN}~IuahYcf6odK zyvz5*`HHoNE`yJL9M``#IBRRlzaIMSw!(|cm+oe>M~4TS{Sh|RvTw#Rna8^JX;#tN zZW(pFr;PvhG1Fr=3jQA4zmHES5q?v>iQ02MFeHGUp8@;n_gdKr?CuYJezW%)R!Y^y_rbL z7JdqU&W<`56ht-+ZillrMHu093G#tZ@HgkCH3skaecALOc;RlMn8P{=n@40-laPV2 zYQa~z1Osz3q!@z(bJl^M&x+Wkx24xkG9ju2LqawIeai(%mS^keGa zop}{eeV`M88ZR!G#@JT(MvB^4MT@flnB$4^^-1s;##!*5v+*qDPtm<-(bWVQ8G$?T z%`5_|xM-@L4I|@mXJ`{dv13!Z;rjeZ@5POFr!oDl)^?rVh$m0)wh*}kq~nJ>jotfy zpC&Nqf2VA=SLaY@6v3nu*g=++)z@45bZdZ z^GdT(w$%!7H0E$j6pQAS!_|v+vWn_)ARL@N0Sreq-GWzZYRb_w3@zDk6wFyi39TbX(st4KaR+Z(2YDk$ z4m~)2oVm#kp?UPO@k92W1Niif^jJpXW_pI+yAcmqKlCh|-tKKjm&u|xBs{g_urc3C zpWck0;AN)RE_29&CFCOT@C+Ck*`@pi<>8!s6=ZONIAdrfgJWuq#vGaK_gO)#4Knk} zz1p}L45m$OPVw3_;erN`@FIE$++}?Tl4tXZwZ<>AZo?j(@1zD!51Pn+oF6$^VJ$1T z^Gdt!gZ<$f$yIo{olYQ|9GNRw`Q$eg)OL8+m*AaIZ03XEGUfkt@YjLItuvhfDLf10 z9=+Ki!ttJCl8n`VoKo^In>Q*a=(gDc7l2X5@A5J|5q$Up>G2|d52;hmGl&06Owg(L zdRQbn#Dd|AJg>m=Mw#R{os*Y5b0TaI<80@q4J~Hf7=90}c4l(Q$byapS=L>luQv%< z*9F%CbL_~ba=v8B!DHrU9UatI@Okn?N6=#z=^jgT9(NQ}D*_mwbU{3v0g)}VS#h$P z_$b+zB|EC0P&7d#d#qEsZ8l1VUpDSET$nB5NbCPenL$B69ZA38MY@FEGd7|;2e@Z9 z>Ac&wS|>{{)xSW;w70aeVh@eQoR0RW=vQwl&tqBVjl01bWFkR8Wcg>-Dm){Q&u8I9iqf|m~f0t9Ylobw0;AB z7*~|!RY-W**+}$UJ5WX-=VblvL&gw!kPuNLv||?-DNZTx-T-7fW@ec#!*FN}jwma|p$ad#FU$fnP_XoDy_g~*m&K?9uyGJ<%Ex>gd>v7qi zF@7*npZj;u-}xING1Xqi^ZoMOGoO3C{Zskt_pi6Tm)Y<6O$l8uzt`VCufwr_SAPiY z%i&V~MU2fs*4~ph-zbu3ny9IR7a6-}55KUTf9c1!2Y>yqY@hwX?{9;^PnJ#TwKoj+ za9}uykqG2fhQw%Bb}?mYOv9#}+nBTLwQGb9qeZ95>W&h#)+a@tQl!iYi}sbJ;27DX zXk8~M@)#q5CWxjBUf>7e3c;ZWvR<-S&ti6KjGP@c(+UAsvyD%7BG_t!Fd6r}eki4d zzwo_dS>WdJ>?BK(b?-7^w=;C6d4dtoB~JC#_!tKcpoMNZBPZ|q;CAxv4{kRfygzR( zzPkHhJ9buBQ{hJ$`n2C*h9Q5S-+!Cy^}o&i|2wze^D|V|&j){o`)*OgwoSQST_11# zd;RzIa&Hw-XY|J6*XE(3VF6M1?wmhLNp>dU^LXy_Ke`=%=`-8QFaG#Ud%cpA&q1s} z^k2>;V-*LFQs>OGm}oS#raam$O?5H|bI>~;ss=XY#4{LvjUlWqx(QwcT<#A~&`IfY zPRM#4VEh7J0YbXuN-&sSYfnN7x?@x7<5oI{;;h;PFOC$s6Z{;&CvV71Fbp8;zuLc( zBeM?37b9SFvi5x?yDdA#P*&Ker&t>uAf!C z*S9+he-})B&9F>n?{IhjIEeTB+-n5F5~4$) zFE4ZWHD$EE_q2MS-*4ZXekW5lT7s@v80AEf5r(Np5}0M z7qj;#z_3o)6uwP6NAc|i-sLC-105;w7Nm1AGI-`gir-`Fp?D=UaXMOl6eY`}X{2xL$ajV)`X^ z$<{cZvKL2`2)lUvaC`Hoi4Vz zk2V}r!88BGCr6%>%T}?8j-VnBva&XP@sR|Uc*}ss36BS6nL~ZiEo{57`b7JsE!d{z zQ>DPh4qvvh%&Z>N7E~t#8QPq$ zp0DZQH82lW#%KwS=s`3x^W?!y2*@sh!1x5qV(MEN;;;YIui8HPi+;uSo{xV^PDEqW z2}pz8cZl=J=~&2QTnNi@Hurn#D7TCchhrHi_kH)bx4D1r?e6uAL1f~&YrnsjcTYQe zJ-_#BujBa+vvS(pe_wYHmAiiJ^>-NN{GwxiW4wxyYXIl`T#9CR36VIXg9X z0g5*T3`+qwt&;ay& z1Otyuh9iDmuinEG1;*(ZGKNR-uB?l!2HP%6aHBN9vDZA70y9;#XI0F8tTkQta!Ara z{decJuiAdrxBT+$lOO-K?cE>yc?B-%T7z-b{^*asaws@-#y`&ux@#Z%d>^mjP<`4s zl$nRCjhRMXx80pf0z#XI*5}?db%5j0)hc}W_gc#bAjolTRA=mj0ta|FgA4F$O=x=> zQE9)g+}mS3DoFQRn>U>EnQ!8x1e=Q09k~1YRiE0npBHYQ{P_R6J^J+bZ9n<_e>z&k zW7#G2;?zBCYEJO`vH;++Ox3J=Pxdt=aA1_t{b5e0q=HvZ(wlURWd)aItQS2Np6IEd z>Tzvw$a3B%6V+{cd3N7}v2u7+W^;mA0d2_?wikP5&4M5v?z=T;vPV|}gL?%VWvOqM zI589PP=M02$$G_8f)V=C2^!=YDX479)5ba%p2%@z8ekX2~Ge%wBmNd%9&>GRNzn&e@>c6+v$`EqMmslAh`?6utTxBs5D=7#KF%T{i^vK_tp z-tFwQk8O8<_B@?2ekA_-!l(c8_Vh=;Z~OdT{?pAg{ovS_h>GA-W-_G#V;!(H+;B6q zHSqwNTtuVuGT$CVZUTwmQnr&U-LRxV?-v#y;!w`)ywY z+bVFl>bzIkSetS=naUgo`?Hc9ozf5kX(WKIQn)rMJTFSV%=mkGHZm}rQu$uxWH+#s zvy{FgGo)Zmvjk0xKx32yDGzYg40%7^JY&>zNq7;P3tw;IG+ULc9F$6 z5cOzKGB1^q@wG`-$eWgn4OdKVv>}ggrwN%tH1eIZy)+4zhQgzYrk=rLVGS_ zoX`4)q@7`QX4yZL_eWUwd!uZx)#t?{;NIR|XLrK(`#!aU$a|aGa?kJm`}Oj^>(}%B z+J9e%X>VgMzr*Nr|5HynmwVS8Q0;rZ|Gg6)zm-2KjrZC|zh(YD`Ro6g?Tt@=|MrlxsbEKGM>QZK5Z=8IN5+i8pZKgpo+@>JFBYlrKXJLGFD?l0p$mmnL zGZkJ8D>ZLTh-n>J=NcTmh+bZ_p42?cS~MQZO-6aGCESA<(>ya}oo`6d&a_X}OrP9% zy4GBrcYc;>w9}>p&P}Jrc&4K%&u4a^2CL~t`3CD(f8@n0+h70uYujfpT3GyL*W#}) zyY-bHe@6_M8u|1aH~QPQ|E|2_`&%OM^$(7>kGEmSA>Yr+RKM%=)u9m{Gxhqg>3nY> zIj!uh4^BV0Mmc6Qod_^92k8%nmTHgv(?{`KJY$^~8SXTw_$lia(Y-@jX6W+qo3UBE zoO6P2uZqkoIm=cUWBeh~CY_!=dzj+Rp`)wTbY*Ro)lTG-3DebW%_n(4va&C)9>q5ufm3E#rf@d$H21cSs}Wpq+k%wY z;zY)Kf)P%bpfmGc8-n)qV9)8wefO+oRP(l&J{?De&*;Hfn&C8t+PO+mUbL~}W_I^D z=g*qkrw`-Kl#>lYaa=q{M>h4}`nijQ>%0s+yT~7n!MA%~`yJca$A0;C`o2#LUD5W< zPG?9f4y*K~`_;hUb1nO8Sc?XpM+X2NcxF9YytuR5$ld&?tWVstle^C$VRvW!>omN| zu=T6_+htb8`k!_dRI91grkeAtFVo7jze>0@#Rc?*XgWt&2~ca zELY&?q$6~wJ(=aPt9{2$D4Xh3LE!}3;%X+{GKH{&TjsCRL-vk-8Y!+1` ze6pj?&HGZDw_e8A+2R~48mmGgkjJHkkImc1u(E@kE*TaJS~+$^7gwv46L6g$9kC_JrA*D7CwV_>N4Jad04toF1&g}XPR-apfRZA`YX zr|<}Zb-n#3H7#(b?cUWp2NFBfs?bZ`ftS*|$~HQu=> zFg|MrjH58;$u>TQeAiRXsFVq!SD$7}AC@#ZJC08~qmh1g;nV#bRcG;z-KpQ{uIF&^ z;NySq_TXE7V{Za^eQ-LvKpPv{kt1U?j;W(UO^@wR8@=Yg?sut!k7w%IW91LJdA{~j zAU|2o>M2KNHLmXd4Ciyg^kcm9**)c4%KD`p&*tO|kGiQ(wqoqCb~xOXnVQ{K@6gPY z-`if!VC5RBc4vQsezd8|e4lS~W3{AzE?;P=PD2Ylcxrk(j7^8tfA>eW_x|eNy{jwpjn;FU4nT-Rja4rfX$@=@9^|nTwSfv<9877&uGBEeIDb1QcM6 z3S+BmNTc^8FO;*SPJe9MdDGaIJXqW8Em;-{n+i75#*Z)ISVSCCj$FntX=)&Y$DVQ)@cxxd)J3QzWsuK%#U9YEjr^80=55pti( zxqtoHo`u}o@VU3K!@A#7&pm&>@7LbmUT<$}FMqw<{#}`~*S~uE#^3z=wuisuH*bI8 zKmJ|Ymp=1@(aDa;44Yu0KwyqcL1jXd01;SSQ+Al05D63rqiHd`BFi!g*_fj*4dHw~ z8AHZWYTVQyrMSM+RPhalj_t^p z!jI2OGzSeMy*7Bnxr6gBcKGXGdhxZ}=U(os;@-yHj*qW={y&d_H``77KW!i09-O|m z-P=C9y~k8rjDmm2)zmo4OHFer6O z5l=iXT7TX-sC0}r1s(G`#~8z=hjek_a7ho`vJXUjFO9W?N7WB?RULZQX%FgqW&;E?P6n!hP9|_{oV8*xDxFwa&Vh|iXndaC zb)?u$Jl0{$-r@U<%?)N5Ag4gUxtSR7(&@KaoBZBi_q(@~_kMh)bdT9m7#Wmgx5LHK z`Pr^+E^2v>ub^$gzP_(|a6WiG*e&zP1KlATz7hn9*(H(eM(qpo8bv8={ zDsQtDu%`Atpni|-obvf-%`ABHmZQ_0MxlFnWG3fa$=ajS@XMUwfsbQQo3YsBld{4` zIfTz1_TJ}wGf6m;wKWIHHD2_x(v98BV?1uRtL^gAkxyCx>8zmByD>im#7G)26UXth z_JHD)O?;lUWsrHK&W8ewoxXEebA65D5(X`Ft>*@|qL!Bl5#)%*OcU;iCsZ{**+xj8 zg~Tc4k9_BE+CK4Jzq1EmT@DwfS8u<3-<_cSo=^97A}ix>uj{*Ku6N$s+na~|vxH~= zg)x@EsOP%g&t7Ve-1cXCAL_byy-nk~4yUp^Y}cP5@ZRoq7~y*FNB`H`@_Qfm{{5ZL zueZ6E@wvnB$_Kw;`_%9GW83%t(SLpWk?;90=l<+uZ7hpeXU zm{^8{)ZS_uV}#y)opdqO-k<@_{hp~nsc=Fh@;2Q;xe69c|IW_3zTeEqGVtfp?KrJE z{_rEgaD;{O@UxZ!^2QYo*`u`3CUuyl$pZMav?Nj$J zwx9Fr!*qx2dVyoc`l@qF(UPM^7g=_&pIzsKe9Dj>TW=yNIIv+SI$D!udhJ<9&!GKe zZ#Zo6gz1$DOh%t9`K6?lGo7g2l-=+RB|JxZ#9MgXQ5+IBoJSi?1kTPnmGQV;pb>Yr zXusX~jp6Lx$@ZRK@Lk&ne(7(gYzfqG7!$l$O+$<0*OSA~>ulKfWwH-t=l7~rbB8Z| z`rb9R?eJZjQ{?b_3JeV7tY^CRtiSa!koCjUnx4 zHP)YhR>SMFJAS_XPx^WNIJDtmkHaq=vKpBNrqte)C!Q_mX8l^ttZ_W}&^K&9{~!Ag zx6gj>f4cqjU;HDZ@4-GBfTAz{lJ%J^o9VLFXl1yDx9DGvpTnkiSZB9+j^art4a{+0 zec%lNiXfJuK0dL^bJ;Uz9kRW2qIIITTc*I?f(|a7PBE{Ptb$E<>f4EWvw+B$z~zlC zD+A766%2C(YUAF||E}%q7yZ_p)pgX_*vRT=mp<)deIC%_!|idj=H3CH)!BcpY+h~9 z$CZ5>mxp`Z8k=&cgFe2#$lX1{>S@3@quwT(qNj?&cW!S47SKpgn?v2gkaKh^b|zwuV`LLct+A*j=yezd>f zQOBJHA3gH&)vw(i{F;Add-NCov+eN@{;BHLes$SvM;FaCrk2Q5$USc`H&6Xt4Th9w>!7cG7t4Uv(jirY;z1HEMG_y4aZugcb%bje1n)ffP z9lHTjUk2v9FQ-*sw#yEUFsEr@2RtSdL9-mRC%wSgYu03HY(GD#-m9-YC=%|~Jt;hk zw~fkFuoJhvBFH{U?+T1>tDACe_s-`FWd4p0?@4wse^w=j2f6 zKkpy>m$nc6qQC!u_yaKp`H0@YDAg_w%64a&mHmC%k1|Skyl&$ zJ>}fj?*808eJNwj5jZ^adl6_o+uPV-Qf4o=KilsqMOJ{!B1jACo%Dc!l3L{lU@{lFjj*V;LWzMQ(o+TTQDefqDFx7IUy!wuy{ zK?Zx+T)zuPtWg*hm~t4!-Ixi-KIRb#yc*-%oa6xVqpNigs~uI|n>uSKsslc_xYzL% zcM4t@Z4tZF_*v(_*|DW}S;uh%5->+*eDA~eZ9n|{f#G&hSzo#S|H1(5|H;33Yx~jH z?{2^NJ-z!G|Kg+^Etlh`?5e$U+i^l2SrpAP9ZSaI2f9qgjss!(_w>qUrLu@Ep0cLd za+jN}Cp2|O&)li(trpr_&uoWi(e5bF`>)1lj7e#9iZ2k2MXm^H&fUX zZSU}^Gmrbn=b?IERvXi1w&y+H{*P{VUjNAUq2few`d^mB;7-i!MnR(` zPvU?c$5)Q+>DV3%j~3A9-4J9Q^6j_8S!4cnBBbD zHqW~S%-)PMryEo!CTp2>S>$vRJ4q+9Z(faelAX=Ni$B{5O-asRZ*KQ~@o(RbKk}XR zmz;p3PtMTTgK=Jh3o`m!_m@qmXl2$t{by;b1uJYI&1?n8tIedHHI-KvGP8lt%OZ{;kyRT&}xTiccDu2DsJXfwS zbC%=kvhggK#y0hQ?{77@+THKX@T#Xy{~mk|aP0UBmKr+!1^;ks1wXPq{oX&6;}@Ny z9|uf9_(uzV*z8WPBkT3NMM*NkSmyBT27!Kb&YBGkXFAG&#Z~!IF=alJ4VszJk%KuJ ztM(q}tKEGydsZKh%l@6)G+9|b*kk|!;ZWWCue3(SdoojcvtYFfvvqie7jws`ft*t( z>MoM)9IM%(CIgf5n?WR86s~&aqGk1@A00eu7vJrE^Zws_qb=6;YkNHmK7RA@0Q$W5 zQbLG&oKMJhnzt0Y9bn(~-M@c(?v>xZ#g4}?|a?7&O}=WCvAupJnH$r*VWcu{+;*tzV^PA-LJj=UdH{soc8qX z@_ql@%U=K7`}PSpVDPusyZ&7}`|rJty_{$6ec)SvU9ZP_efx|5(eLUlEp4Fao@rVR zzw`CxOuCGv_ofbn{;>mu05Xu)b+%}J1U??q{!GacmWs*_Hqic*?~Z6X9H}cRpC|i=@~(rQ*Q1^*G9?XU ze!Sy@(Nm`9np!^&CFjPq`m2dUE7Q)Z3KC_tlW_{KmJ7+cu0U@sTxZl~(^fPY2WtRT z=TKDx9It%K{hI2>C-6p}A(5jyZhHBAGhLp+g+solzrb^Fx9oE>Z}DmT z5)WObUj!vK{>=K&_(%4*q+Vyl6)d-Q+bo3aM?!fkc>Z^mA~dQxd` z!p|Ki=q0#X^m1R@i*m*fXXv0VJE1L~vTMY673jN)%1!|t^mn+1Z>J$Qw4`01>+)Q2 zpL5^ufgA0VUX9Ja>+7mm6Kn|Qe23NN-ue1kLkGNQb7d&^e*3JAe6spwvy6Q@Uf=tw zy@CIOe^2jh@9f$C;SZ!R+B|0b!NpIaXXqyVvfu2UgS`270tGL7m~!c{@tLxqbeMa6 zd&@QpirG&Y;p33*{9c;#?E3S)%nrle{(gUlbFZ`a$1(rb-}d{r|MB1b9j(J^ z`akE&8c=IUEy+7-*M%uv>n-M-$P^z(KTExwz;>gdI{{cm+rhOxs}2P*({V981}AtJ z9xRg$>UaMSKfN`zd%#6aj=<@cgK*N$zl(UB6KO}EU{q%C&wSza?Z=*VAgBsox&E%h zz^5PPgk8LM`<5Ht#$a7vL1%hr@i;li8A)e7vkWCgNS7hym@{&m4luokPv+R6zA(IA zF=-*aDK%#bYR4brz+j)2^)XZ7b%U3^BOSl3h}}^QYYKYbG(e`Dcu>*$u&XqE*hUq6 z{dK?P_r2}>!LCAc)mh*D>f77wceuCiX51*#Db)u%)6aFMXZ;5c;C8J$eeR8VHc$F@ zZuWpIPKBOLV+)3-9gzMLKlbC>XFvPd?WceGr?=04{`1?Lof+!QOHcayKe`+of4?^j zJb3V+H$A<&z3+YR-`@BB_itbI{`XDxbMT>F`t9MA^L5qQ&OZFj+sFTb-?M$sANm)gU5;D)FlFK; zOHAmyae6y6`BnyyezU8S2lhPvV8@ir9*?2N zliFk1=u%|oVE8iY+4|h=k#cw+{-*2{TUg@I%ow{jS*$)?93ybJ^s&>_O)wzzy61PY zTIb{R4NVTbi-x*6TyMkEjml}?-$0_h{*!^6V{#67(17RUe{X8!LTNV+HCQ|aK;ftS4K)8*gEWP)XGtv;u2b*?*>0@bT`e{wth_J4f4{Ih?c8P&J| z9x9B-fH8hl{?Uw}-)vQ{3Mn8>4>f}-DQ8{idCON;Fi|FWW*t_rIth>fp_3x|?3b{U z{pOw4kT&i6h7G>?dS}V#lTLZ@GKia3om7ARB%*r5g#(rPeD-EjuX&4CMLY4?_WJAh zTRhmywL3TI>Llg*EP!$wv)8Sql5vT-GPYr((M0WRy7x++7XjapUD2$wiOMWesCLXr zd7t!x^;-$a^Bjbid8ji{6GlWuRaxtLQn+pD+`i>E{od`pKj%B){jF<=*RMrPj^xT@ zDS%1$=lgdI=yHGmJ~#Sjh%v-{yWTsWDYG->?mP`sV~oR}I?D){lP{|^24M-;^)kxs zb$u$Q?Y)e9`*USo*T`WBe&Y1%HI^CBSN{3C4g;S#N6W9-K6UiP z6m0a2&WzhtIzqsB*~^7vnOSO3*qTbCT;sR?Y)taiE9*?Zc~i%&GxSd<(Ra0H!-l8N zypbeFQpV>-%LgudX|9apF{W+0_p-CmBxgohr(AE;w_TgoJ0CfttIXdmufL49J85`( z|EK<`asI}Py@SQ(-T~7x19Oona_pn;9ELI9z8o$lcN~;{&$C1Mx7wI;HK57bT@H^Q zUGuTNJ5czCe&~m`ANuQmZTs}6KfQhKbDvvf{xAG%O5Wd3{nStW?`psP`s>?=KK$YB zqaXd)_OXwBw51vMAuw2i!}ty``Iz*3)+1^f>es;D0O6>p6*Tav6 zgS~7TtoC5BYx;k=z1G=_Klj)F?(K*F_#Y^Vk)8Td+0JyB?3{J+FS3E&XtMQ^fsAH4 zD%+R-0Z^7B^BP~JhhAjYl)uqb?M3fyy-~2){6_t>p+us@Y}z5f@CJw*8Tym-+>?io zw>Lgpmb*4B$9mGyFVEUoa+;kz)qf29)LDLqDZjY7!=j&WU-v8j$?fik9DfEE%b|cH zJnQ$;)tr~0G*-5z`~3_~%2(EVIWRqr7U8CQ`+EH2o+Ua{zuSY)p;!Ox4iP7CoVt+7 zM_TlprpMtMXQ!&1CJ9W>C+pakaWv<5_bRjg`SLdQ+pE9T!Lng*6`uer3u(hs<<;kV7xEVhif^N9G-y5RWiuU4RUU@C zQR7Emc?8J*=F{jJxajw0`D%=7$tzFwW#8l1n8-p_2OM^+Lem@;NkbZ>%mUU122J%@ zo4j6`uLQ9_f+BNh{h!|uI4R5qzh2eW4wgLMPyVvsx_#(de=TUHAALde{s-3G(elji z{h7~q*4v$&d2nb`efK#+KGoBXKiA&Qbw_P)N1uC{z1;5nd4^#7edVshxc}Ziuea&D zOWo^z%*}V)-|OxD>~O2MKij`wufLaf&v$=&d2Oh(-}n8UzdhUU`&9Qs-}Y;JlgRgN zf8&q+CzJK1*p70t=D^&zfxdLahBc=aM_V_AXRMbYSpOS)ZvwUFQ5|U3zi-+XYqwTg z-go2Ocma$7W1Afe*eneVBn&x8NYW?M$;>%3Ihmg9kcK3XAr4^nuo$7kNdKy~JoRswa@B7wrtLoORTeoiAs)D*;h|mqNU1sa# zNrVviyw_BGnwJK!GC0rCGM>BEHIy|S5kkw8n@pqv>1~XONYEK&2u&d{p4>I5tlFdS zSKC@#{JVSUVqnccUwLHrP&s?5{6xM1A7OUkF$mIx+P%=eK?5E_uVzN=9fVBW%80F< zy|x-S~bdJv98hzgHhVT{xsGkvTUrZ?C-~f+^ssbM_ z7y{0CdeYf%gs>Zp-h&VRtUUbCLuLK?_2YalK>wQls7ds9|9zapM_bIBH?JIX>~ZCU z6F6Q9ZK1B#&AQaG))u3#R6gpTWsAB;ts_-bi#pfZ3B|YiNI$U@F~F%$Q`_VHB7^F~ z>w;5WRd%m`tZcmFJ8ay+4wM+Ku1H&uzrPoFtmWw<<5#tJx_|-fev-C)( zfW~{4!F=$DPoq#czeTv^FlE>Q@)VBR!zgRyXWP`2A=6MY%MgCC>?>Y`S>gB^LZo@} zZc@t_0(XFcx6D7Iv@Lt8v_7+<0mtOf7_`vFWI_Jnid4uVUA10e_lLZtqNCb5Q!dIG zSK~r!ZiI|-Lj$r5S4Tp&a?;Dm7jEM9W-II7&ZO6gs@IgpdWgFvMXq0d*+`xWXf|+-ZS1H+KlBHrY~GxPQ3Et+h9K_xz{~uYCed3UFvl z%=}z?V zD`0r!6(BYFLPG-ppoc~PnnaZiZLu^1>FMuj2*z+Q$-#I6*H6wp?;7$kMjaIF1%64R z7Sys25Xh98v0iQTIvHPHvHBCGa+M>N3SY4h&)C+zUlTL_C9;l6# zbl_O$*eQ?mn3gs-ztI@OXz#32@GzG|C}kW~g`Y|zVUNJ)`Z*TMgGyP430m@K8cn8! zrxw)3x-QbRO`2Wiz5Ly=MC^n%CPdOZajaJe1!P!-Pmv;46jBI>dCI#zhAV^{!U7kh zi%B%!DU?Mbl2&b4#Zo{r4X|Pipe|G!SPk5gNct0|aQvryU^j|-L|JMcm1hf4*x<=} z@}^*IdZYTSQ<&1KSN!_Vvh%67#aKw>mgj3}jQ&!vt9-xtycCY4^mDQ1lxCsaTESwxn zK`)L<6FhBXKEh{a8F-Y&0x=GPq=~jBZxtc7hX>sca!zmj+eckU$LNb9##@aTKasK8 zE?++JkGoW7(<&BQrsJxs1S97RDIaz9ehiqcOdHD?Uf$kjM<9&|>Oey%vb0rjz1khY z9toq}f=j#;w4re)FYpv12T*Ib;2*~SFjCWbAFC?pN$eQbjyeu>MKHPOcm6)^@3nLJ z)A_W5A~+jMKi@Ns@q#EDY5dkT3p;)%EZ>tTed-K*F}RtpPw|u*sph;hZKh9n2bWQQ z%b9{-bD5jdnywP06jIC9Tu#Gv&3=AonKC^6GM@hCsmnNqna;ZDm;PC{{7zUIC-d^@ zrl9FZoLHW@h2s?zFdFr056a<&1k76Ypt*sDv`5|#-MN&aomF>VPwdX! zy<-=Q5Z*M2dwiiC2PSQmr62j+j;%Y&o}JuZjNcfm5Nh*+Cz7v|k$upX{0q>*H)YHo zR_|t!4)~v%ZE1etW&dmGoK$aQCMr(KliuoAc*Peq%fDtyG=^~x_#a4D!%SVn>sxbp zefMuaOS~&q{HT28%U>!FJn%r-v15nPf1z8jU_tN`H#(%7Gk0#e`s%C8Pwu+w1-#|W zZ+T1Lv3coNd@WkE=$FcG`}XbSA%xR=@3}XYwX_>lBT{h{!zo2b+*z86KbN(upiC%U z;oFdU#ioAasrBc7O_?AncEwYM7%n|bTClvVLkkFHu(aj|4tTX=9$~e8D{kGi*vX(Z z1W)o-7{^1E7etNmZa))_IKl%VPT|vWaX*5frx8eRd$1b^2}HNR%x9uBkB~`p)65;;5v5u9(b_o4Zjq26f$bPtvk-h z3x=V+2xDbs%O9pzF zoL6o+k=g@eEEK5Aqg(8NOiQeQ+LCUBKku__LwfX#zrp=nCXE{0`#GbdQD+;+pJ&c= zb@hiWja7FmbIdBp!@_lNkLr#cyCLGLb=0V_n@uRDb@11CdfA0nlxa)Y(S);6bs|)k zLQ49FCw~qQzySd<{frY#yb;fDo#Fmc;IRzC^_K#p;X3^c&u^dUmt``Z{{D=cF2gfz z#xuP*N&n_&z8g2omGDfLFtbeh`O}%!pJ5rUziIN@`dRNxW4K|)F|Gd1Ps9H;mvBro zWyuL;=|yiUk6r(H@W>Jw)aOoI&vxvB*=eL7_Z(VYI)=iT69c!vyR1US{)dr4hn#gZ z0wIr~b@ssDA&jdL;bQ0IFu1cr4>C!SK|#1I(KU?vfupv16g7Bf=akSKdbMFEcOpKv zZ*p0`TU?Rm-`&4C3~Zq79_O&#!#l9wW3X_g!TT{i?!}S9!*GCnz@kNq%N18%S^n?;@_)U6zsPTruV#Mv+`W5Ox%sA>${pl+=2>Tzv(DoB zGRBguSmGt(2Lj*`RvH&i{6gDnSPV)PAAy&~cf^gfzTw1wMIrBeH{K^7epET^#0$&1 zJFiFG#^5QNAl$piTUoVoaMmoUuqrmpLE;YU)?HI46(liPm9Ifd{wkk!3AHLcMtac4 zFhTWTdNt33tbT|W{sW1@TSW}N4)Ep02OS8RW7v5CnThXk>0NqeX_>w_U(-E=gC!NC&Rk zgy0#G@Z%rcJcK1D@(e5dDugObQ)2s(V-imVdh5b#)WxW=TuXlX`Nw=*GOt=z$^*i( z9O6HJp@}1nN8}hD0$9x&*#4_9?b8GX+?q*!H>zcVF5A;tjOAqr*Qm87poc)+V1U$-Dyyv%F%?#geOmh%)StWUtX94yh{1|V@ zi*n1f zO{5PxBL3Ylr1FM0&iZi`y2<=8Dxq-ygf%C|?LdZ6%VYPjHKl<_yl=XMr5JHx= zp=}5PP8z~Ag*FE<@vagj@*2Wh521qb z7TR*Tc#NwMM;K%kPSo~vK${&1Z87*uW6;`!)81f3LMX6;rgeE#`V1{v;3A4hJcTMJ zER{*xRs43tT?lrhF|U|FOP`IOC<>v2u%tJ`!ax34W-4vR(KW(+=pQ?D8ROm9;J28q zxTdf8MS1;>R^+MhBu=9oJVOIVJUpXJ!VkXAx8C&}V#Cbb_!VBhhqoa_*C}6w#*TPV zU;LszM9gt4WDQ|iZp#4hI2NyF*@#CyfZyjAURf7{sp-aH8`qLFp1>2Xb!j%jlyn&}f>rb!sad(CTJlfeNi^AMiz`ONo( zk%=-q^Urubb?Kk+Gd$C!zt8CCq{}=KhGCXf|4gr+t~pMo*RT1#Ij<~F!tqng){0=ch%YogmfMP&8wA7N-a!k+DRj-wL!I$J>K72wxemMXEYc0 zkiH+rp!%nO`lsc%@1PrCq)>G%r98NGbC5S;tp$&ecc37vtsElV=@GWUw1`N#T0}zb^yAufQ zfFwTCxNO(YQk*Wd)(*~SA$t#hS!tUvv#H-z<}M9}lYQ}Se(54?oUIwiZ#O`9U_oH=visdg}(>5n<~nAr4@em<8hSz6|i)}6-5TlDW{ zx1w6gW*(!z`QG%yAC~*>y|=vfb(fVRj#Q)CTyNXQnDNJ#fEzFV0e|Lm;3>cMvk{+1 zv_as#0V{FNvv=z3vhd7H%C5&&vMPoL%VaUmA@n+qt;bmZD86sdXz3~Dl72}Q2 z>J(rUbnEE~b=)vSK~v#J+BUvBR!5!80LMubC5pW50s(_KDWHXIp78|4AG0={oLtc| z%y86-;inK9b~I{Gx7afr@$eOf2| zh2t3K#L(}EFFjEBwysH~@5r;t?p3#u*72*FLWxnw$5C!DQURhFz#yw%-f-oHx7h5a zfJfdsH|E*~o<$l$wTK~9dt`Tvw-Hw}yxs}D@$3psA!DRRu5gGx=h84cU~sh2CeX<> zs<)udLiW3kj1bsG!>W>W*QM9QnY}!ylL9$2jC%-K;T-O%40JG2%qf5uO zT5lhMUm%mHZewO?&tqb`iFeHFu8BrbXw%uS`8>~3>#rvC zsfm0G_Fbo(a!UEw$37NqeC@T@9?~)$ocTk$ddo2j_P~=EDBxE^F3Z84+TBP7CAo9g zFzxdUlRwG6wab#}4zVe%jdzJsX4^Ulv&MLO2#s@B9Cq)@1hh_?QSEb};TD%`7)ZNV zPT8vvso}EAFiccBM%&AjV=sxkgYgA5S30%q_Uy1-!(Ter$H6F^+CAPw$!AQ;V_B=P z7jF#!#xtofTFPFu+}D5iJF&^50($Yk9>Mb3%U)mp`Y-={oR8R7H*VZm&N=to5CAh} zEF06Wk2?D3^3(h8k3OxCVo??P?rW5J?!5WoC$CQ@9Z%wpcQ<*YGoSO$KR+~!J9qA^ z8a)E_f6H6nTAp~~$@1en@5tyccxof~&)5D_>=?fEwXb7Ym_vRV^>+-SAuBqX{u-fT z%yuOo5idR?u8BmUp1cR%MQs2(;K$p7^R6flKXyBT4#@I7M!r#al1I77_El=gXW(mL zx7ZkOIuY_5#6w8n-3f)`tD7I4w5mB(u_7O}{HCXXzEX4#IA?PtCRY=>dl3$u)WY7v zw1wU0%Pt5$=Zc9!VqBg;`J%qU3rC)m*BVugV6D46yK1DYl9_2^<_b-%z29otq^-aX zFsy^Zn9hgqk(O_Q@u)B6FYKDD0o93Kv#O4K8ZgZ#ViVP+d)tQOJXJg$5TM4#76KI# z&C}9FdpJ1wT?rvzhX&)WerDK+d$z}XE|**l~I@JqjN)p02F;KZ^B%UFN z?Au)0ZvRN>*ti0X5VnkgcCg<$sf^A!zYL%INzT(b41eW>DvVio(+X2q>HLlcGJ8jd7IvN2bV+t%-5NL@69gr6n^GmoP=pyDFUnq(9AI z{FcT&w#Z3@_nYhX?A;TBRxh_EIn+v>?ld+(kIGVuBM^0H>lnsNSPn0`ksKe~MPyWfqp!u)T!pZ)A-W$oIv)#kllre!I zj<$Ir2$970bj3nNiVBahuwx=Ie%fn!o}>e`8tDD}+(hC8WH%c?vIGv+I_=9ufr3a} z2?rgtF`0q$hS1nKeQs&R_Rq5`&Dng#ne~!(q2$mSCOn^jinzvU7UoQEy&Z#n4Iz(W z2*-krb4bfZfeiQ6K>L+_CgL(3msYC~RZ}UfSck~nG^8~f%h1S9KzhV?lrxexlpN+& zBSiUXzLbd<-vQMKuglmJ2mglBBg2TOIgtJ?FFQ=g3tm8D`q#uEJPB7}Q66Ca)-mik zdDqqQS9}MKjYK{c-4a(E)u%85j%6kf;|Gp-Dl_}uF%vEO4EoT}Ht2(uQoqB`kJLD}(AKBo=6{L2IH@n(Exa%&%k&ic^KYY#0ik)O%8y76zf zgZ7Mg3OR)buoc(#!vl3YAZB2Os$1sfEXjKdU6#|il+ew(vga7OOzc*5F*ZiH1m%Us zBF4cv5F_HLi~?jxs|t;jv|Zy?I}>Z@Uc)r|=r;MEaSCQ6+O&I1Qe4oNh z=XbL+Fa6TLxg0?#gk_vem;RRB_xw&6e(U_s`uLr&Gt6gmxbT|e7?!Y%t81=HmMio3 zJN=BCX-#8UGR$WRd&cuS%i(+aWgPwd2}78^AAa_w<Z3)eZehvC1X0R17TImQq%!G$J_D09o_!Z6vy+}jij&eyu%&ffv$4N^EX*wr* zx3y|>v_VW(G;MhBd4+-lZ5$Oigny=R2HNXiU(dPJ*6zj|Z#;yh`T4BHl}poSa7@Rd zMT^SY-uAZm{`r`P&gaQ3?6{qY_LoC*JuWDEEi}{$ZwZDBqqV=pY5Io3qx5fqXE{3# z0Z>x{H65#zTA z^g;WfTD?`PR+Wn{zPSACfuC~2hZE%zww?mk-p<{)YNwp^>lD!5{~tcU?H*I=d40r_ z4*uwm|2IM{DUSS)Jo3o$JHPw!vIA}1tU0ss*GRr?^BM!9oBt+63gPO%lmbw#MIv zR|A&$%g24xvKWx*d=FUEPwnii&;=CiL{LgeStSGauF4gU0LM+epthcz+98^e>-dyCyO9eNVI(inJ8njpi zA$Tb~t%JHN3`nn*hY>blRX&b?V{8k)95o|8Wr;C_G}?oS3#(^9<-3->^2w;TbqIvA zBE`6B+vPam(;)j)jw3Y(!BJnwdLrm&(;GLmf4oTP3M-aPO=TSM74eNlI0-9EVb?g; z+4zyK<)XxZ2|wdljVf%_vCO=M69QZ09?cl>qhO8r3g4k+vs8`pAi`0uT9zoS6=-sm zPJl<*g|F=I)3OQM`dOyj4J?dk=SH|TyB!NoDWgyQFxr8{#I5ud8=8zq8u2A=w1r7h&TxbQ&< zgiGTf9BL0iNrD(vrO!G3{6<4cG!^mL*yF@SBN*m)$Mu&~!hIjMiCgX~W#z{>BjUCY z{6Y|%3*$NNBc%}D{+-v9*6UwYhF){SczR*i#;%=4n8Hr@wzc89EKkPK-}e|?n#vlH z`IB({Hl8kF7?$t)OEAqsRKm?P2bV#A{jw8enS`0Jn}u5ArT@V&6OR7EX@;p^I$<~0 z!*rQPbH4if6EDV}ecZX_(d+-g%13(#e1NKkR=A7V8FwVA5gZ!?|JbBZ2c%$M0km~$G41?3!n*YWi%V`n2cVQ{bQC4UgbOT@UXMus19#a&~C3HgV4B%U1Cf5h-oNFlMH$kZM{Z?cw~?FMa8YW&OH!3HaxpE}Ncl z#+h-Y+dcQ(9pU!H#~ypM9C_68^6E=pQ@(WF7o(qge2dTzKYU^N@NfKPEb&&`EARsE zU$SIr7WxG|%fY=m$_ni1GiI#LDSbaA^bu@CRjlw z%GM~JkHF`+P*`!SudZU2yyLUs7Y_xSmNNB-Q_Gfnz7pe=gSlg-CmOhM&AVD#;4Rf| zo`IUo9eiO(0arRx0F*#FSvecT3E;Q- zxk*GCarJK)T!lcxx0)xFL-J`ijmS?;tDi!NZKR8`0?<$WVyp+QdDyh_eVzW6QPYJj z&uxx_$@|$^?dBg>h^&t*iE@AGN^Pmv>v`X_E0KK@CX~atX0R7?wZH-RHm>zG^O{So zlOe7iS)LfXD2wGz7ycA31jhyr6soEqsE`ZW54^QM8drMTujlb@8A1j=_tRv)YEd@IWmev_aoA z+zM+e8as&t0Q?TYQbE!qv3fl23V*esuIknu>a<;GWXME;Py0S+l@he)_&LKF!O(Sp zUBT3{Oqw#8j9Ch%5zK6mkB%I>YnZatJ5G z(m&xDuA8y!MCbzIrA`v7^bot0AWD}-?7S*oEUy}4X(=vVM~f`8AcLUMb_Bq^+v~Ym zWiq?*5cst5k_Ob=*coI{9tiDDJSdp*VdvV3X#<;!JYoNt9hLD#!4B~s8JjkCx;xnM zxO(;Kct8Kr)^gsfE55_y5d2Z_eD#}K%aaccmsO99m2Z6G8|5P(`ABH~-}uHimd}3n zvxlHmFP`N(mh?4lmx+iqg*gQ>iA`qh!0Hh#6X9LM@-0?5-2CQGEub{!KQ%GFD=@lL z(#?Px%VY4np2;k6G9li-%U#FSOvXDl+c_e{32|&Vf&X>SSOOhW3P(NvH<~dX`C)F- zHUArbcs-D&rVSA$!VUAw=+ARU?-#!C&o9`>A(Vri=l|Vz|9$0kmt7XNc$+qDjDGs~ z_D0&G+f78~Vv&<{BcO}ib%x&E2U&lxDRkPdX0mQO%;M>OXe8c>O&_sUHiVsaM z94C|)HmqOABw$0?zRe|1>gGxzz{lHU`*WmXuceKrgIz5YGWT*1oCa zDEWB5s|O#3dK=7z5kKjs%wLYC=YWBJ5|qya#94`~W&d+^+4p_hP*tGedjt*BzvdJU zF`6u|`)+Cb3_GZf=a`vE3nN9s_aomkKc7K#gvpEy&+lkt{0|UWB?1W{{d{juMp0H@)zUmqMXoy3Eh;EJGuCw%{F zoiL1YE#UxzI0pA}A!p<*F=?SpFyI*6>6CG{Ai|)uYA4^c3nOeaKra>dy4Ss~%)~ZI z_jz{M*0y0O?h@O|1QkQk@e|MlIJN@*RmAAj+9p!I7`H9f5 zxC3|3uH9%eCzLn7@y+8PLThE&!iRyzPFg?k;idV#`qZ={IKx4fwGPJsN5_u(r$B4G z$tV&oxbVVq!37r(4c-cWcxu(E;6Il6EpL4r%gvL^_22o<3;2lqNsZy{x7`+#pNfGh_{c9I+=wp^suL)MSL#C^DM%V$m}<9zUsJyr->JLglJRUS1+m?G zb_cC(+W2f)|I8Y+eOr(<*p14jw+U0Hm)TQhlqs_pl_~H*uLJCxGy$QGizKK#)gmwI zf&OV9M>F;B-5-au@7%Gy?Af-ZY~8e`?B21hY~HrFJiYF2WR=^P1k5apmn>eNL|E!<8&Gcva;c6=N{n4+DxY1Uc2m_M{$-4AB@4YUE1%K6i!DkfA=M0BW>`n8}3U zBPz@|nnCKaLs>xF6X+BYmtRA=zbGB| z{HHQ}@fX5dxGD75u=yT=jX&Z=f8!n;C;bw4`JM68Ur^RZr(lyBIN_Pbc>Z*mhu;~V z0+)Wm*57y2>Y8DsU#87ECEN@*UB*ejW|+R~4t^$_<~nA&gx8#I%KRhBwpBla4iMIY zNh+AxIZ*M#ELxmGMFL4evbH`4=)lMdjWUP!c4jvW)c)LUr@DKL3$DY~1kFt?a^2}U ziZC#YUk9`2O}kwRsM#FqzvAlM?|yd_!zH-e7}&)B;^myPHmBnJP?ypCk3XIE>C&#U zl&^j50GvQ$ziT17_-1@TKB5?iwzOCwnmcAhTXJpTV2d3d&%m$5`TmIXba* z@N(mZOgn6FSlMu9-j7lKUY1wYENEBbX$CUX{Y*F<07kh1L|d;>U`S*=2vMz`vxU%U zdv;Em6Kxm-DD74WW1QwBJ%?Xi^WTslYG4g%ygN`wMBpeSd7FoP<6vhW^uY9Mu6b|y z3>vY14uQ7LE|IQ#=9#kK@WacMZ+Ihie-D%k5xyp{gckh(xKdhVXI6gu5q{$@QC9~$ zeH1=jx=UW60Mf%H^xX{H)=t2c4^$`s4Vb33Uyj$w*v6%to(*{O%|GObn0aOCvSnq@ z?mc0PXdQGu)e35Ne#^}_2mAG+o{t!(i+z*MWbGNk=ae-3}%*gV3*LRVr3ur!E_eJWN=D&Q%m)JAQ`I7s9uA z(kn_&z5Q0;agr_lTMo5=aTE;S`ne>ikkZANTyIo@&Z(0_v*V2?f#{5DU5#to$HCG@ z#8Cod+Zs;=QUBilvgz3k(CiaTTGqt%i_;LwjyUDCGJC<&GI#NkGI#!*GI=7x7;N9X zJf~Iox}Y`k2$0-|JBC0!Ho2<|&zX#{G%plJ`$jG-J9dtiO&gvqo7O#9Hg9;kY~Q@D z+AzjvHGOzly!41LOOW2()TI0pf*p0K!fHcs1*g`j{wjG`Puo&-4vS0Dh`*>Z z-@e->wu3^UWsi4YIi_`>BpV`L2+P3nIjn$AJNpYqI?Lg{iXN`SgVN#v06+jqL_t)I z+`ILe_;#gK7n4{G@1VcIKnVYr+@l2$I&mpjqiKrpJ_91zkN53<;eKW>CH=jU2|D8 zZNiKQ{4s6T)AuZ6rZrx38s86&lXb}Qm`1;Yp9yE`f@KgVJdGE`!8GBD+z8Tgn4> zjg&_peY8CM@Wa@49b4Y@u6M<<@Jpqrn|6_))bj}0pF96XBUUX1&P;9o;K_LifE@v>?2Mh<;`j%B+|WjmWSk}oyq?YnrNh-Swn<=NP0&7C)|EMBw- zTdi4S29GhP0B+8_@PK>rXDnCgdK&zk$v!&G3>X{>a{w^Lq~&5R7YJgg6@V9nuiDbndo9e%0NBXx|i#? zIFz@KbKu%1l^tlFI~b(f)dIFNS@o<`cwi5MIdWiaFmTa1bU z*I&WUW$;HId5C4+^=13k=itGU%aNy@SB^RP*mBrmbD)K((TBVj-YaKY>7$+WO<1~% zL;=e`wvYd;gU%;Kr|qqWeR8-=ppMg~w3P*u=9ht^=W{)1DH}I!Ezetaky;~P@TYlNyyK@f4k8F)%yiYR zk8&YQ)p12Q;1V2}hjnn-RXmTwARp=1+6^KHh1QOWbu+=}2aldu;aDi5T3O*@0XGl; z_X?Xov>ZVX>fLB1$sGK5aHZTn_}d5@Dw$Al(uMMx()9>3*dX-RGct))w07tRL6~&i znklG)uIt|l0UXfG@<9)gyxTC2dx7XUewVU?6cFYm=^pVi)XA(^=E{*9u1B|XPLVTf z2QiH`UEUQrBWh!))EJCZ#Hy;)(6b9eP6$b>ou zG5qP8R?3E(BkY&{^X!U9*D|;x@@Y=jEDZUc`DK|bmo5bzznk9;i^j#@a;K1`eFHL(rvk3&(ZVuD?5jM-e>6 zSl8?GtjX>vcD5{%q#b1mpUOId@sIlxaA26LNsTrRfsbdNUR%EQ)vrW;2LRW*L$&kM zS!Oro{OFcj$}3*^s`9RPUmZfA0+brH5C;Ni6%0%>o<{)CqYfskpL!~;W7Aep7yS|V z6)$yHZv-6lM>W0sj|KBM~478!p$RwGJl z@8n8Lq_xcgFAZJ-dIGNg@*FiYt-+J%Gti51WjvZvQN^G~<0v?I3zFIzSJ>Ra?p?p~ zNRO{-;pyZ=8Nf3tJ0?vJyvi?=4~qkZIB8g3r+^l9U`#dPJ|;4T#TZNe^32dQ5~{zh z;shlSacyVeDZtb*8|4FW6r4OXI_%qAtr0II)KtKBew^coRN|+39n{YYDdwDE{P3#yP+C`ckG=&r9Pb%|fO<^lRnD|jq zbdhDb{poy)4z+jEM~oe`kxGdi-xQL4H;F=?@x);Rgisp4ic4i0apYzmcM=a8k)Qsy zf7mTI;J5ZpwHVY>fgPL+m+xG`(56&vyBi+OC(2G8v|D!g40}K(w*A;Rw>pua{o`~3 zw1Yuw^o>@ODXwf(0h_V7lckO^TEeQ-)-*@enk;p&TWQK<&d`I$^zYtTCXktGO@}9U zVTyPt7+V>%FnkYkMO-_}5IqQYGF7EpTdy`U_Xfi(l~&`-HegU<+Cbz&OzxPX5(yf8AA<>3-pJ-}5yc83vpNykvByw~@1hnSX6`ab%Sa2ya=o z2x$Bf=D}$VGOlS2Z~p1;Pp5x#yzp%Jr!Z-_@pKv2r+LaS6Gr9{%%>4I%hepm@bnjE z;yu%6e)%*`^LwV%&$On?dN#-Fole_Q>>36xV8~(EEJaavXOSJ01t2gxo-zQYIf0t! zM}~9oE|U%oVq5wuzBGCjj!bk1HYdXzpgNIG;u2sO<~!eUmdA`}$6gsr#kKV~RBjoA z@;T?66WQO(EeC7Xtcmv}N41ryGY)2fg%8=qY>p_dqvjpBbsz zVV*?^RN|235C6t*ly7|PtL5>>>jnx1ffXx$R9=QqK6lRC@}Bp+ zkNQj~lP66C2bo7gs99QyC?b8rC9PUvp6xA|&tdDNlNk z^ZPtZTA0TkcYGW-<6+U_LmY%7ZbColq?5~%rAx}jXE!1|9?e)Z635wC$1H=I#<#!Y zs`8Dmf9(YaPFErD3+27uz{N;|Dl!o4HiCBFgUt2}8( z^XIN|wQL~-z_(mJcJ9&IH$C!ENO5CDo8u;F#j&(pwLT4g3Wu#G2uyA$v-b_t1wyz} z092q8SfD@tRBf32S>ZteC!vq{ov1jTGl`PG{@C+m*dX5 zu$*zx%gd};GwBlWY*5sL9L%8& zKFXxkkucx(=*0uMnKn#vnatXtMOX*k-L`UfRYeFb1QekhO{Cvd_um&%Pw zuWksj&;=<~$v8HOFX_UuO1@-zQ7^t*CrumoH;tOZ(6S;Q*)t+8Z$yO$)gy=MRd}Qa zU0!kNz2=@XscV6jy7{%RTA}PUj2&ew-%cn-od~;uO|6K?)_z1gDrMhx0NLSefGTy8 zIYj7X#F$3MQX6d<19Ug*LmI3Oj-iFYj-d@zFm$0G*+Yj^de0-qopkwX?ULd6AvmXS0BjjS}GyVRXh`mKgqfguot-DXD z6TVLPFP3)-HW@FU>7Qwv%Nb=QK))bt-t!rqjl43x>GM5d`kgM{P2Ze0ab!IG)A`;U zmj2E4OTT<(9+_5uVKgo5rmg<2#}Edw_R08`+7~FuR=G=Ij|XIAHi9vm4}?nSH3p z$6TvB#O|uAt{TVP*T4StaonDA_DgH|H_6OqaLznKRe!9ISOb5+VRd_2W4mM3TzNUOa^3-PDtgLvD1!t($NTMJtbd5^uZly z0U2Pu9b|yPY9BWj^_=AwJvoT};0He_ zZ+g?4Fodtm(KSEwfu{u=^NG?mz8tKE%V$3GccH!W{J&;F>!7Uv)z5?ZfRW`B{?uy8 ziyrvt{ao#K59bCh=g#X(>T+$CEKnvd;M9qUlgh;9lOpYHx8D|;up)+*St551FB(-b|8<&TeOdV@>{ILm*Ydjw|+C|cXGT`Ad|t`hJ>%Q zc!z7GLH?%<3RaFS3KiCY7~s;$s75TTs-aPVBgh&woKuw?*5ciNu#s} zn?j_Ec6IDE&o(w&GK>an|B6=y5?2gOV_8#Rk$)O4ty>mpL+w&%)*71Dx=cxtNv|d{ z9BHZ+Q9-9_7fmB5VT&uBD~4*P?`65(-S7)J%=@fMUQ?DHwHT&M|DfAp;s?)X&j37n z{pQ`}+0D)DPHpd+LfsfX^0lNRJx zr<`^Mw6{2fZYPR~H;{;6gixrEW~KSrAGEnsIJD_wH#L%&RN|OrSz{@krwXn(_fb#M z+CJiwkDw2aoRS5lpc%LYP%Cu^fsa6GDK=$MesB6vRuUUIw!8Wu@92U@IeBnIlVp{@ z_O~)IRhtY6^>RZSBPknk_CR|~KB8||e#bUSOb#5Vk*JkG_hL9~$C(1NlYB>zs3mS2 z%5V{*)T&e;S{gES#^UnGDCe{VWfISV3{n6GXSPx#vTm+ai7D z%^4mNU;lj)^WE%ZUqtmb1KN(>J@~62ThUG8AGr#6MvOHOa%)>a9KtOE6>8CSp z!t&eqgP)mqhM7<1VcZzVn&4zS!!n;NTZSc!%-^`W4ENbV+d6B`&fv_c6Z&X(R~wxs z1UQx;+M&A<=+Gh;piiF2N}I#(qAl{!6<`%X)BL+agcQ2Gl_PAPAD{xSF@zn!(ECTvJe8I z%o!?kCJk)bkO@m<6269zZTzk8(H-ro2fFU~s|-DzgU{E#@}=>En$tg@_QRWRz6mYa z(sJP|UJ-V7-}>giu;;FeBVA5x6rsY4zrh~rATImPGA6t`R<2|)e>yaD&AcGP|3{w5 zZ-gQ27)+t})vKQ>pZLUImt{vB5rW{NMT^IAL5mPO3e6K6!P&E8y6OW4n zH(&kAm&bXM@SB}N@>jv(RquLt47@cA95f;YN$@V(^|PGyeLRLFgJ1o2fHq?6=EYxa zj_sbt_729@&C3itDhqwcJhKg5aXb)c#@Ywh#hUf`A%$6#Wa{W}c3l z3JYDFHz^-;&~HbXGK#IM%a8I=cf2cfT22K-d0h$?Dq>WsbiotFWe6`+z=_0(TK>%W)HQctgasyu||uLV2BvoF28oPP0zp>Zm#7*0h% z>p^JS&Fwj>p50nDZ`oG%vQa0FeL-8khrWu%VR^p4wQR$Fas<1zUiJ-me9ka99H361 z46P?)M63dhg%CO5Sg>b*nSkx>v@Z4?jO|C*+gJKJ_mo|%Qf@@RoH(HmL2!DRHo3P< z>SgH|ytcJ4t}I?$CQX1Gyae2!j&vsK4daUyZ5l62e{JTwY=u0*APj3XMy;2v@kTXBvif6&U^# zh9{~F4w6_!6VesOi_y;)!e}f8Q{A@RS zT`XZhWZh^^JcM!##^>Fcsu&@)ID5vGGw<&8{2!lYRMp@}%261qMH~&VJCMLV?!_6~ zAhQE2(}$Y29Y#7#J{tEsW0BxgQI0Y&JBW*f6mIMUIe_{eor21zkTEv*g3|Kjm+B$U zp7r<3IuC^=-RPVPB8ALf*a=t9$_#4$hUu~l%}?WH+UE9j~Qxo2Q+lv=~{n6sP$=a1`B~JFlztjq{QWeVT494iucnI zy3%PKNnjry~0LjF}dcaM5&hBteNgLH15_zuTf=-%*#H-vqY z?_RZ*w=pbS)?Q}Jg7dsY-3crMfBkcnE^fW`*0`m?WjM7>fA(j87DAr8gFpGnPrjfA zTeohFtK@FF>82O>|EfQ*qvxP-1+wl6JowDUvSr&&`18Kd5US-H>6}{DZf`BSIBIUv#GWz$ zj-J`Ex$JxH!LolVyM?!HECYK@(~m-kev6>o%8^WM{5r6~?4B~av`<@Hrp{Yl=FXnW zF*5^YI{kby$|P<2=l1OiI^D5z2W{0;X3m&aW=)$^=1gS|EW33&TBp!QPC*u#Se{<> zaJm29yUT`k&y?d&Jh{wgr@TUP722xsMMK19pL%my6|kdkfe}{{l#jxJ%pq2nKzQJ) z#!;@aB`R5o?;KkVulR@}&wC`v-1N0fFZBC&ZF37A%-9c_5vN)xU6P&8Ilhr2v+2eVSfa`O9>E z`<{7aKKiHgz1hDxO>-U@FY9Ug%*XeHnSKeUIsb%b{7zf_3w4 z;Mg+#s-2oJZ^}5>d1hYXB9DGCj+;NSJj;(iFpwRb{-yAJ_|o>cm1NH@m>tZ+rRxuT z-~-rMO)H*fXkC8vqaVdpW7;^Tn~q@e=}&*UTzTb{VaT8Uzv`#w)!WYU7k{-6!0c#m zr~$sjb~ZL^sMQ-`=`PF);6Z97hFOwAZ3CUb`~VS?P+pvzbTQ~UkqzF*Zn}69Ps&mN zgmcAlF>pl^Rv6hAEDGd2UaWX0rR50+5aGz!qjLcF$yHC5dmA@*)JU~1@BhFDF|>cQ z+;Yn;A%Mys-1y-Jk$0lynvIssiYF-PO4v1fGm=k5Zj_i35HXg8@l#++9%P;hak>=b z)Vke#(~Sr+gQ1CAiq<3rz(tFf#B!MepfFy3!9|?m_pM0ZEzd`2P}6d-6G!6NddLH` z5q$iy$I9z3zoMLg7Soc~C30#&8NEw5&dj79YCqLj+Ahh5jywK@a^Zy+mcRS-r$R8y z{O6My+5uOcfPvBez|Se@gZ^^^kSqY6k>7_i5T%@z=s4w)^8ap$qP^bb#4OeV(Kzr+wY%JR$%=Pa_Py{dTZtm>qgJwzJ zsg?*M|G=HJT{TeRP(KA=@gZEDn&c1)@l*4pz@P#rG?$b+w1!rapN||@LTeuIfJOO} zo;^(b$9LWy_fDU5?j_~)OD-v0Ob)tP0GtcSXpepWBWqah-BtxZ_yiU^WlziW^4wr& z*~vMqV(yvsYs=P0Z!X)`Jz93}+)h0ei2cE*DM%Oy1@2|#2(7e*qXjx6%3qhI`>>gt zy5JaYnR+G1W-S7DbJ+>Z;q802mbpXwN^b|t%$ybbJVNN4!#FH@>Lf4%<&X8^zYxt@ zN7?Yq<7M;4_2u5X?~L(e+VmMgi{82+sX!XFUsyKA4#`FwGm1r-9g_5u$HdPDiFe1j zTtcowr2s?WMSL}g(!71tdYe}(ZA;8Zrx_lb#50LTnZ4Kq z8V*Vv+P-+^%x+YR-7VUTP$=NE#OOKbk`TQ)BmRGWr4DIE_bSC?-r zn8uz~RDzDqWevk0vf*7q%x6pQ>@srXHKpylmvOlB_lO0AgKq+f)Qvyh1ai)wmGYfS z%gC~;nW`*|x)_=SUXcts8hK^%=I@Ma10HCY8q@TKr^~wd^e3EyT{8^dO)uURtBB&fYs%GM1)XzU##1 zp_PH&qm48%*vG)$%N@d9%&tZ-5SBr|NE1Zy{zw1JpFh7`!Sz)KJJ0xY$yEHEfByO7 zN55>`xDliM72|F5%<7@?(;ssj1oat0P@(uQ8P_|ZrR>aWeEHgd=a;fnH=;o`+MJj_d5t+ zt7CBAx@~I+X41cqBBzA;0zeK@bd?%oyaaaVNgUszQ14GS5&JuZyp^}Fh;Ic6HGNM# zwJMgG9VpYOaa@NMMK@>eym9{H_wmP{$UVbc_0w)G-)0%yoze2aW_SH}zFicc-JmFb z020Cet>2D62mB615nBgB94o7qh$TQiVi&jrF^yPF3Q%kySPgU5l{XZbR)N7Aiw4+K z8K*R3r{xY`ukrGxh9S>H0SE4G?L(_Yq6>V+({HO3V z3jP$3k|$eFHQ3ceK`mlbJMa@q93c4ApJE1YjI`8Kx_6YR_!;APm5t@DAFmAI`rOyP zr5t_E1;lSF(}=KO;%Iq#!*k`q$Dd|GzBk4$CuG}3rj;F|lgfszyScq&V_Egn73G=x zZ{VEAogAHn?JPF4T%AMTLHot8wF@&L?07rT__=&-`NvomAETeLyN~}In2knpl;0k% zn|*%kt!35S-!Hurr<8>!Us7fqbzwPb@%-|@?%}eqYfG7g062veB6u6rN*DgHNc%9R;TfeEO^W zYGphVrg(OYag&IqM&eE$P{+!Od*2=VKzpR;Zz$Sg5)tE{=i4HKq3r0uF4^UN`I#%O z*|v&?@-&5F)BE3YDVv4)6oPP@_meA6sg*=>9%c25%0MTzOqyJU%E1O#1sSSC;5l$Q zYf*@k$lY<{**hV<#&aQd$w}%4=C-JL2tC6Zq^3 z)R^q{b;HNp^Q(q%<|!fkIjbK$`>%tzWg<3g!puBuApQN;`Q7ZYY?dL*lxds&Od}kB z&BB@f2_y5+ueqM)>9@~}ljSsS=9}q~>1EtZ+gu*Q{3T4^Gdu{LZ_Ao^$uRTK<#*#vVIYJ>xSrK=6=*OxE+^R;OEu8ynEe)h8m%H2QtNqH+bXT+VL4R{Aq z)wf1TqA0N|njF(FL|_IdFUefI?IN~eb}Tr@5K z_OV*zlC;9y<;v`Kg>>Y`)`s5RjML`t4&O85ta>EaSAf0;>5MK z#8u1c7^Mqsu_sz+;zWIHLwR8HPwlVOGKIG8><15}7>0Cce)%>KRD^x9rcFY!ouoI) zBH#0{@J=QVu4arPce$x3j;=y@Mn;eH@-I!M+}u_bZLFNdk_R0?!f;UC52JIimWWj5 z$w=Kz*Kg@Q=;Q1VKxsKe(QozDO2r;2n4Uav9zuHXz_ZtayA;ibN;dl zehm15*?n6|dFrby`(9i|j<}`_pHqcD;mEA)BvnAMzBC5@`E8!&V>z-+KGPXrmpC)7 zzbt!}IiJGG_k`Z9_9AiZ+}6Xj0gN1da(`)fI9C9e(!tV8-3+tANv^R;`NnFSRzWN zCNyaw{eG3tes+(CSqZeEecwcEj)(dgoS~6c>|loBPhq$0AOoNCCWb*7C3NnAurRQo zuR(bsX$CPWjKK(IE5no?V;0Ro;HB-64l2`Lutlv7lUdHepi083bZPw*2BYiQ{dlh* z2l|$A^i%8gf;Tb9 zj}Je5VY%oPuVks1Qxh5yBQAeVJozMU*tn&fapu|O1`d>V;^H#qQAZ!c((HY~7w2%a z%xR~eQD((bb1AQQ)vKc)+UGs0MXjN`D&2gc-?Af?N14;c^<`(Ai8gRk&6~e!TD;e| zStDpY<*7c^9BLc*p7*?uO)iHu@MiKB4xFA`{^N&!gM2C;SN!PKa@&d(A^auZ8_%fm z@+cFQqmDX;-N#1&i*$`9kS3#98u9e5<6w&j}ZtR zKV1rSBZ>l=0;73L6CpTQMjU91dMRjx-5NrIOP2~H##fuTm!8bKq zo#ZdS-pn;_cd_iNU~|T+-dN^wzMgi3$9eTKwtBbUx4JyLaT6&yA)ueKq0!siGPOK` z-Se}L-d3B{J|a1meu!sw`_Xorm}g>8@R>jm8JXeB}}TGEr$*7Dbv8i zx@TM16+D?;!&5>gi92&gXK_QxNZGt@O}U3%&1ar_9wrB~;bqE0P6~6ik1@q|2mcE1 z5{3etPvZ>2gA~rgbRjTYacrBp+&%~_>toC7q;t_A&PUrgIGm>|UBYSUsDh%qeC0z5 ze9~PA_PmGr31My^5}+n_0e^(uz2*(v0d52tLosI_PJ)L}inKCOb@Q&=jd-M#upnU9 zjompSVbs|SL40>o$o&xE7>4#1ChQLo04Jbv!ITD-Z7t4X0{WC z*<>z58K!Vy_XiS`QXRzI&8eLskob|>JR}S&PTu*+j%W%&5W%zBYI7ewt)WLMR=6r;i&iDMz{4;KT`_yGwe9y4-mndXt zrZrv)ZoW6i&3FC%r9f%?^fQjX^z%Jk!pnSpCQS1;O@240%k<6hEvxw(PX?pQa{F#x z>GD0xYnsGUbGfs8qpI?uS2caCrU6S~&$2>WG6KobveE$*4Lxx`&dYKs&rYXWom*<0 z8EX*V&zXNtEIK)Fpc|%X2WcuET0=S&bS>ld%qhjT#ezg3>U;IS~93TAP2V;k`+QDsH z{QgIO^hZHQzpiT7wrWoHGf_|wbobnV{Kmn8ZzwLV@apU9g?^aSGB~?iuLnLR-*V90 zFP+E_VX!Ve#p(w%yNAJCjeyKo&0o*tzPRgLn`dXu+_A9k&4?Xx`*x|i~WzXn46103=se@dccz^qw z-zY!*=})6CnojrVqmPtF9(foWyDQ7-FFQT_qL>tB`t+Hh(VIJWUTFHB-|}1>%zGRH zrnYsl>yQ-3pP+4Cbu(uolr`LRmW2K36cpe2?rQ>9_E9y3-Vow$%kO;aUm}hNJ)e2z zIptrz!NmMUoMo2x^rLb8yTAKX2!WO@Dr}+ouka@Z)l%Moc2C@7U444q;D+_VEzQ_roFjRN0s2|vqY9K-!Kjj+QX<TQ+YkEAM*@Mb7Rh^Y+on<++h5W$W{$Jh1Y*vgXdOmz``JYMZgBbkX)L zF7NhCAPc04x3Upf4b>|QnL>M@dQCjH)h{$#WW3x#-(7D7n`^5<-AVh z1?tiw-Vuz)CLLBJi3bhJvyJ_baSoTV`b%Sw=&r|D<(8*&1@Hc_EVKzA&h}L?-tIn zFYG^AZnho7WgC4GGzUKMB0c_$#V+*@U`kVQ4hjP2L?k>EZKTyco&XZLVum)E@lr*c zeIhQ`fPPdgc7RI-eN72^df7z{pV|je)$=658FA!WU8HMaf~vC4anw;)mLayOm%bWs zGDCqFB_Jhm2|)qP-I=jW3!@pNf-Tr6^}uo5Lig^cRMB(q;J*u6_wmzYI@e zG(4St#>q08pDxRi@8QWGVWrS$+Jn<&JfB$}<0Srk`fXVLvV2Z7Y8{Q^4lg={<##6? zG(@2!&G_eF>jC3o1gvl;eK~7J7?eIWfFHvaq=&)0YFS*)gL!#l12#A=zsRij?}et@ znPgZ-@>0P3b-CaE?ce5Ti%*2W=kX^xarvoFeX1;8y!h9Z?Mnu(La#SA+<4=Sv6Sf! zVe9R3u|oK-(@AU6i{u@%a!AGH69+uC%}gsQuQQ%>0yFR8EWd6J*CitJS8RhA)Z@@p z1{ hUms%+R7 z^LhB`5p2a6wR(XiIwo5YW5 zSHVwsE;)^T)^=n#2;v%QP%FA z$Z;>vm3zPSH)Z3~kCu_{X{B??aiw+gtPuW?(h#uZ`7CX+lsRu|FB38Z*8SYbwf(U& zxc%8Ouyacp-p^(tYOI`KeWeh-P_ARkJ^8TGJ8f>6IQ8%{3N3ic$%gHmE7(~2Z0$n; z??%w%H_Ek)1JA80cYp6QW!vhz%Xx49?efqr1imqjfa9#1iNId9VOv=`X9l)`gXO1B zY($YTvrL^cT%Koh%EJ#mP^L|v#)hbg@B)-q$U*jDaic&cjxAZ;SVKQ+;GQTk76#uz zzOf!vaFh#C8}hX+{AmWonicQXQfTlYX@@+BMs~n8KgP14FX%~|d0nK3222_>0j!)z z_|(RkM9`F~6wVAp$tJB>QqA$SS8O+9i6jb1M{`!(fhy9>ERI*b4I*g|v6ZK-hr&|0 zHr3NgvFwN&QXp()U0Q-9%xWk&DgY{-dr`V~)V07+9SFO-+c^l5bffqY8FHW?*k@5N zYb^2B%7co=cOuI$e|{TB=X-OS{MIkSeHvdsnYzym_uFzAZrUI?^7WZ{G`}azESqtB zKR93GWj+blr!G2SQyntBVZK`)pZU{2%iCP0^fO+TKf_I4zZV?|+618uRcLBsFx`@U)t19P`14LeJ3d zp%6@axR#)e`!d@`p$rF3X>E^#IFna|LhY1?G*N-JIy5cdu--wAdFf$iXFJPha7t(s z-i2^D!enFLJ_aFHLS~V(yvRBsi%iF&>J;2V~p<=d?8elqE?ezZZL}f`@j2iXfadxYX+G8@YK^@#zD;YhP~dD z$=qBL|5z5|)(p6BXb`hsH>dyq`Yx;(4*>AG%dQCRu;;<1ZQyJ)hG(96cKOyfzy5Ps zm{xx2;QRT{Ut2!-!4IK)!1M@by~W{K2z%~MbtB6e2(cbnvk7yIFA!fGCO5l?fJwpfXf=OMVk_C^t=6u>;@%)7_c){!wc zv7iLeR+4eXan_yaNDRRfHD^&sAY$ZGH)T{f+G#N#VF)Em!IEFQ8zbbUmK7R`F_XL; zZ}oT6ftotudB8rN!B54KaaFb$H*C%XfuBNv+P;8AO8bHFE&o%io+!_At=kc&zoyJO z<{Zx2E9H#&r98V~bNLa%-zcYhIBy^7oK~LLHMu;(Rd5e}`@fW3EOEC?TU0t`AA`mZ zBS8c{)+_0MU9?RvclRO)4(u!=8}2Rxo1ZK#`@Mb^fpEt3a@bMx!*oRXgW}U1b?kCn z*o`*vx#zZ&=hv*ogzQ$9nmHC`*0QpE_VO~?HMOkYHC%S>VFL<^ECtOrcT7)USMR1r z%2TT!D?9%7x5~Ni_|Ihxwux9Nf{Xq#bwX=-5+QKOoWshpJ$uR{&+I}7oKq&w+{e=Q zQ`~F(Fh|6k(!hJ5hBkN1XZ%r!rjX*!m8bugy*B~&^QaCz`|gXbcFD4}S&}V-E$?8A zV`F0=Y+(&sfRJQT$yB9klBrB(-b^Z~Jcb#PK;})BS9$dkl1cJ1*bpEg1Y-=?c*oer zo4m=AWm}6kZPs#i_j~8}JN-XbpZ=B!7_2fcY3YBz@9X9CcKY<`)2C1Oz!Q1Nfa6k~ zcGiT%b<9^L&^a%yo`jS(ut^NAE@%&n%W>{1N3aNvk(RzuLagaLnKtKDPg-}PSL!u^ zb^Bh1u;vrIj651`-h~wx&aDN{qvTH9j9S6xcSP|bv0G$XP$lpSU^lu;B&F@5>0Kgx=4X=Zx!uDMzF#X%p7_QSl z)B9{PX@+Ond~Z7A>atu3N52fqaKDXby@i)B^F7asQT_6Y*dF^2!|Wge60$^vSX4wOy}6%6H4nHz&TBSf_(XME~1=`&%S|zZ!E*hFkvk{_OkW)AvoA9xh+_{O6)C zl161*pH86PMbGQ?Z+H{*K`cqvdP@(&qEY-Qx zi{x%0x@KJ-0D&p-z@!X=Kk-H>*a(v4I5|rHd9u`#z)EU7#O8io$29aYilN-5E~I0J zjy5u%q_t5*{)iKRiKksy>n~SV`?E573R&uR&{p1UW7}NaHs7Dzz6~9|jb+)obIaNb z-@(GCyIgcK{kG>ox&HPC;R%rZk>4nizvpI_mOJjesXXwtKgEDEdU-3(DV<2@I+*Kc z7>}K(;Vh;dPM8D#aDY?758PL}p4(C8&mAnQPdhnotg#;c%-df&>yvd{uyA2nv0`P^ z&3Qs5f7`ar<-n8ol!G4$E1o;k>Mw?pNzrw)`=z#bmiQXbq%-z`{M`nVEu(?buG1q&9Hl_#&M zZPqHAeKN~5TV@Iz_xkeGUp>BPPa;|$=Ovehv6Txhi%>J1%2h8faEf+!YuVj}g9p8G z(_J_iWpGMCo3@oJ0|!3_?6^55wtxAi-ymrLEAA~OtqlACTkLKZ2c00?{5$beB}yBM zE)u#YU`u;JrkQDsPSU9i4jl-6B@TXcVvy2R#*~GG=*_TKUyWK4 zj&a8U^c@%qu|n36VIPW&9axB*;3jCaYsia}bLh;3*oU2HS3q5?#yhdtUHU3QTOn6` zc6`$%a@hI0{Px{SMnzlx`JPB6OkE;V6UiJT!ZeNHzGry8Uw!q}k={5NrbqKT^K1`~ zg#6L}SaCA^2YI&V*UZcG8UBOh(~R4Mlm1P3&9b$JH^Y2y*0ViqctT`mTZA@;tb=Zy zEGD>D0cAfCQ(~w=)R-~Z?(Lk>qz4NQaBYA=)B!U%!4dbV!&7WWAiZJnGYpQ6bM4Py zA39r}3Slq}LUayex?_S#W(bC)6XTZMScBJP+q9SMrTA9**KFIDB9E6NOt%+h0Mq#O z@hGG1+&!U052A^(^9)-hL+BTcVosq0sbJ@DouFBBK#(D5h-$c{DpXuNDQA2rBe;p8 zJqzDCcn*V`)6lMIG+9QF)Qw>bdH|bjeN5gSIO^m#GlEp;AoORXj_*1h@NK0*NB#rX zKeLbeLC7$Z%sp(g9RRaHOux%nA8C{By6dhjntOTAd*25>1&W8i@8a{9vB~JY!N+3$ zj3~3SW%DCkowlVs!(FJm*s5E1%KEt0PklU{B{okPU`=zieK7YX2d-}iy2i`&8;RMBZh=G^nnFIQjnFGr<}zGdQk z=IN))KY#hlKHvg{q`qj~Hwncj#66n46-cv5%P|6&xD%F{s zxfW+{)z0#-e%0HC#)J9Lg{i7eZqLPp|)^9P{L!iMgd`Xc?!2?S-Un)sXq*( zwrkTj%gp?>W!<{-%McR1-TMxNL{P@5bgyS_=`9C$Y%JgT;-|{RANhFc;9yZ#hXMW~e>q7{^l*7AfN41Q$vHeWb)8gr;#Ff6aPPDlaV-I`i^mFkrZryl_c-_pCc9~rh z-2?u}$8@tO=tknE6q-(j|MJ0;ZR$~Q&FZ@C%OU5`PoC&NzY($A`Sq~NecgjrZBP7Qk*_|qWnFk8f91gMPY9jsoq zu2fH;V<;zT(APWr`q@gMdqWHw=xNI^xw{(ag~L@3(1x&K{pp%d!^7_p0d^b+B+?gi* zg=w1hIL)$TzWO;Jn{hLq&n9f&Gc40vcm2#S%h`n$03m8Rey2NQ*V=SbrL}JvHCII+Y5e8aOIXvjYQRJx@1yf@^b=( zD#fHOUE`-@BW!AckD9XbAVW7diip=S!2%HyO#N(W_FN`>+sgXNC~n{O1ix)Ce*40&3HMm< z>L)H=v9hdPyRIxf;mARe_PEwn=Rpt0_UWf@DCfQE)#a+M{&RcO_%=>G1aluZgRDo_ z?`#KiZC@ua{y(y5Q!v5VW-@{6PB{g0G^dwuedFuVmjaW4upKVGoAVcguOQAPZqb> z&{ZNG=l~>lDwO^>Pll8(>qnT>P6?7_uk=}_f%%g(#!bm!FXbYcrH-eI>Y&f0*M+Vi z{T=%Eq9IN=Zed!!O%HC21^24+-dX0KxVpUdWK6yEOqFYIM*ZN~XM=g%vahc!Te-6Q z%XK%E+rISwl*#^irDx@NVd6z;k<8yJj4!X8-&2Mkyq23+A1kM?SX$PcdnsGILy>2W zA)mQ$v7DB{r$3!|XnlR=yWiOkruFo?hRC9Y+Jvv?ASk8wqyTK{-g7R zQ#rpdrySgdKJDi|QC|OZ|DklBxRMMA?--_aw8c2LoO8z7GJMw~sBs*{gc$UE(wJEHt*naL%c=CS;JAz)vI|+UpM@ChP z2ln?Mb{D(*Cgn=qYNJ6XJShkAQ20)`e+$U^m&FML2!h#zVxnt;?R2{TkN!eGE1hw42@gKUfM>}OIukUYCznKQ3)OTsh#j6!!|Zq) zJ(0n%bot(lpYd!IUB=Nr{e+oFr+>PX8k#0y8ZYDIGvf0uzVY?<+jno7 z5eX%r4x}JXZiR5Yk$#3*`?!)z^r9^xy`;yNv<@uR3E(IzX$DCTD{OTgTv>^OGpHvx zDXTZ=fsxp95f6bG(nZRV?Pq;nO6P4D*({S8Zf$KFh^L;!thnY@j0ZS0 zn}H4)ldltov_^@Q#6AwJfm7m}6L(d0@k&9q>P+JzB5(7RBIccni;ccFoPi+kP!Y-`z;@s7V0SBLQNt(!SH zy$#0im1Wt6x0JJ1m9moc!5w#RE?b}2S>|GwZrg#bvJ#`<_iox!zWa}VS|)oq5x+|2 zZw2Fn#WprImoHvWR`(B={kMIgEbbmJ=UjMxS-`?TW-XaLpY~GHTv>hoJId5D%+l=PfE7B6T?du9EF>(Gl2y0Q?FSyg#3==iMFeeYd4egUX&p+i2?N=@d;8iHqQIFEEwKzBKtU*n{_7lYtS`j7%z@&I zs0uE6#h|*ZnCJsB19$~88FfN2#HQ3b3~o;_pnVnXHX-Bm{~y4nk0dAecZ8n z7-a52YUn+}peBW-pybp~=en=$#M?_HG?coZ!99H7IgZ71?Fsq0jp8x+!{loN*|_QK zY+aO%r(rS}e)}$xWE`KnxjEr?HlkAl{Xo~-HgdR>A#@opTwKZ@oYPqrA{{WTKj8=? z;pBHSKl9JHKGS8KWcJM8pRjaUmv-10FJbvizl5DI^f$a6R(n3#CZ;!Smd&*JtzR-{ z`uodxrb|DcnQy*l`7$5NBiu}5c*4&#KK1k2bdn&6lX&8yBlJc=ctEfKsVBu{3}x>0 zlz7uiNU4=Vvt7ajW&QwWn*rj8u8dapotTyQxj6CI{**U2Fkl=&U2G4B9XRsSS>EH} z;@Ya?kEB(!5p#vWE;X#+ua5mBX7sv>lE&k5#F^z4SlDG2c7rrXDHpS4tn|AFTe ziq~+`Oz1=#~y!-0~7D!){j?&p4{s%e?vrz_7qfWd|dU_uf#ZW z5^Z-LE_usaf2KVC_||eS+ssPx^mD6L=h*ac#&i4k!$>WpZo*)U;4fpf^n|4^iUADZ ztv{Z+{mv~n2eWknHU!tMJEa*s`#yx!QRa6uldR>^DD?&y$8TIyRc~e^@*?eV^1u43 ztIE%P9O1)b&cAN4f9umcD^tBik@ELsVo#locr zSeDN;ZtKE+kT+$H7%+h#wFd!omPtlrgl&CQ1PX^T*PQ=WZq(>68$9v*)ShzJ{adJ8 zXW2hWdFGuMlJ>9t{U4P{^!&O{+5ls<3I>+NIEMIFEn8HUPCi=>-Tvir+KMGG|F4Jx zHh*15%s0c&Lv4pd^!gt11J;dw@+aSSKaGJz@;sBe1RK6-ctrw zoKUtuvyXX!TVfWhD!nVm%l;=HDA#}PkIQR5@E^*+vVpRF_d(3U%ts$^UpaFPHZM^% zx^FuNzviD^w%mJtdF;_gxi5H4=xpgb|sv@=4|w7%zeBx>bhT`hwy%<9Wg*`I$qs2?9`=qKd4maSq-6L%C<|S$j z_6FTEid0dj9|_{?{*CvAU-OUn>?G!)mCs*!1%{r_E^mF?&xDR$a3>X5WTD~cCpc*x z69i+V-Fa)tx4!xH@-v*gU9)x_%m~*awwOQTI<`#f!L02&wwE<0ud$$&X!2BAxRpsS zX^LrHtn*Ic>%V<%=pkPGx=W8LN5WK(P~+0pUk3D=tG`wbz?`-ORnX zoTfhI?AMhu&p)%Axtw-j(e$0W9sri}K{rB{eoXN!ELVKyKb2j~<=rQpQM#9`3!}_R z{#Kv3q%0ZTRz~l?ro8&hQ;`&&95`nE-SYQm|KwBrvkaA zmb~j%%N!)Ld-fkHCm_AtvFlKI#aiwb9>>6S|FSZ^e|>pu^8>We!$=v=C2wu*F&EKY zwx8vRwxm4HPj1WC@<|gYD@Y(CZhd4Dr8oQ!DPU_YN4LX^QGOECc=SnCO|fU`TWF6v zuwJ8Ed8;ZZR2Nm)Uei0JR8btlsRm=)xEKmaGLplHL$H@~=(;CCI*Df3vtnzcbYWN* z0IrCGV+v%$K`1Mlc58=splAHQ$1 ze0R@GFn%(E7cTB7zj%t_edS}fOb~yneD=aB#WEjZ=*&y!w@8!-r(ed)r{U>uyey~T z{_@)};bk7y!}n%9;TTUR+>F~E$8TM`f97FWmc{&iH*T{m87Iq-X*0h5meKE~6OLg` zSXrKgk>&Q;d>2mE+x37F;ci6J>P8#}r(B7vlT~#<#T60&gSR@tMp?i$Cfpt*&LQbz z!Fd%5I?g9EKh&GE2$tU%&yvM^W*wF|*pOD^QZUOqF zsgEgE^PawxX3dZfd?AFq>M(1OKgJ1#iEziONC;jA#>K0P;SP-D?ukPiS?=aD$C%Ft z9=JcYLErk;w*ypA{Ncat`mJw%BPP1`vASl>+Bjvq2aCMg67*(|cf9L8u^rpY$9Ko+ zUg8PsBR~K1+!At9jY1ytxY^^?n2hnnY>wyl^grzPjvd>}KmXI0%H`MroXx8NL?hC+ z;Wb~sD)bKx(yWUoKzD54HXGAAJIR0Jnrq7cxOQEoS9T#W+&%dAb=Q_#kvz&^G->KA zfY!^-ojXFeaRJxaMLz+c)x-d*>{hGc1GY?5FlOjw1&M0Wld9k6;+;ttJn$zo;`MhF z4w&E}le9R~!>)yD2dyudbhMD--FwBBLcN^N|tM-=`8~ z)eB^Z?tbW-<%DzIRYsOBDm$M=uhvZ?%07N*50bqH%EEhYEsI`@I>4cQWzoEea%gm_ z931K`r>$C8o<1;B&N}ziW&7isFoCn9-f%=<(gw!()gHKz$b{Xw7QGwJAzz z7HVq<-L1k!>QsyzXjD$ag!Hg7brTx3#04ziI5@0u?O?PGiSO#i0VmQ1XH3Ctz;t%F z@e?V0CPEnJKW?-ky2=%o^pyVt#_#X89?d8|%?Z7K-r;Y${Ng&|UEEVXatrAmm?3sT2xXo|hb;1`xC8);hfZBoIq*Ldw zN*vv$h&VJ;-J0MT%pLydOu0guMyJ$7{tG=Vo|;t<&qmQD)FcNRfHAp?ZxSAf!xRHU zm*t6%m++5UpvQ8XHf`eOf^P)T)t=iM-tdOmb~{%5m!sdaD1(3HD_>!2?HRUsPAl(x z=R2#Es!>?m-Gc^7qK=n~6)*Hk!a0rlO5lmQq3+eP?WP1rqUdcNPDD8gPO}IObpwd0 zepBdWjUk!tWSq12RVP;Bdl)37Kg4sAXJ)Qr3w#!yI2le65`+y}j%)b^mFElpO`9I7 z@mhaRShfs%b{8|jJc&)aC*!oMlbpDE&bjA34`=Vjj-Q7z%(LBjTKLUxep}g((dc_I zAnlnzyW9#^+fFI$*iTRqVuL^_H zYuBCfJV?@pAr1<7$M9L_oLiPJUtX^J);FIQ&pO!#4^TdDE78$=&ZJ!Vc6!)Wl;#Le zeZmt@Itf@Sf~jum6>i@2NO{!-uOa1Z?};|S@Y!>An~?2FrN#P57iH$$hI7Jpf)%%9 z%EUqY&5I2*wJ`#dCleAlNm+DC|6Hsp`HNHM&^;iKUc6$?Q_2GlOAjrTi{sGY18$bb zLI%C1KptAMJq&ZPV;P-KYkHdmAN~j9;R2j6y{wNo z=U`cL(&Dm{E#Wg(FGg<;8qmG4oN?y4+=_BrTwl0+$Kw{PYTu{h=bx(72d4}tfI@soA?!>eUD*|-#)Ni5KM1V1)s2)2G z-9WxY)lLv16s{>#T+j?r>tRdIe^XN6YQ|Ip=c6Nm1?|1H*ELT2m1HG`5ImA3%`Foha zGyY|){OVd1TnFv6N*qNdo$&LQ(9Ewr{Ds02hG}%|_0T`_%((5(ATY$sy5=)s`bM|^uyv##b`uUxHS%!q+w{djF$@m$rf5vJ0rGMt_x6V8>uj*6%7!N^=ys+9+=RM#_ z2Mn7nY5JCo6{n=(lhd4vUdWA!%W(j z0e|tvQ4S>lt@q|bN-g8nbl!=(?TIHa@cdfTV=f^I^bNl~oYGweb11xkMOr6wrEZ^9KCK1?h<`^X(g&~}%BQ!gr=Lnj~=?=1^3>9b}*ZyEmX z7m%2pP*$D1CZupK{*>&c1W+c;KJ)3g^F8MX%k83A|0qA@YC7@7pUmE;KJ}@HXSi__ z4}@WQ>*&vXe7XSjj%p1_Z@Ta5vgX2%lmpyavLDk;o!kP{z3dg`;MVVO#o~Qs$&xpg zeVAEUAOk8Ryj=AknirL8tQq)l-pt}uzKaKl^JJlzwE4B~|zC*dwO3Hl%0c)xcRcVn{cd*$P`(KGCYp2qv&$(`jtp50wOwP~{a z=kplut-P9ylgOmYu=aNm&kjsRNkmJRgV3-HZ%^;HX$)`XWq!@?gqd~EupBte_?9OJ zkm-coEPs~EcnQyVO;~9G_X9gp=RG%y;WKn5;>4{=&<9bS5 zf}sf*Ct=0up(_ZJ?^=m<1FjBmWa%ND7HgC`+kN(y#KEh)T-kWy$pDERNJ#$mSbTe# zh5AxC72BK6yMI6V$xk-D;{ApjZYaO@Yrj^mxZ;ZEg}vN7lwN-9V;_qxm}c3wZrxfw z@PQAMyY9Lxh<}FV#GBtQ_0yBzGb}{Mpl4&6G69d&2lP5Y89pZk52m^O5e^)Qu>iif zLlO7{j%wDytzoD1No-NNHQWQu>XC7DTba1xn#$fYOgc_-N^~R}vVAfUm4y&9kI*vT z_G3rSyOEnt-2E;#?7nyB9o*AY^CNwm z_f0UM-t5u79W2do{`nfrpOR3W^g(~OE7M6kY)cjX*Pr$Z3Y-l!!(FZy63y=tr>Jkf z@rJmSCYgi?;E(lkk&@;~YMLW(B3^Bbn1JI1IQRqW!Ge>U8f2)5BwedgIu;x-g}oez zux{Ggod#E=bux7_io#IhEQ2@&zvy{HwHD z>7f3$jf`V5K9s8V+CJyR^LZ69Yp3tvg#D_?mA zW8>Dc=b>+vr6<3o98xk1{7y~=cP&1dgB~}QGdG-G`cFKe9OMM|NsEWd&Rqv!aOp=> z$)*@zr*eXR=eEZYc9pW2ddsxctMh7kWV)TZq%O*gP}weOhM_-9%fvS8{E-gRNLTLFs;-wt>>w}O>a zyI_^yaP{+u$&+QbLHz!*gOOj}%$6WpZ3((Yn z&UF>UyZg`M>NRv@KWhZWl6V8GEMP#X1Pm%iln3Wx#*Kptc z>7R&~;lj%JK6RNUKKPSy{T5+$rpt2ZC*1b*8CQ75)fvb4EO$OLkBn#Be9u9mpYe3U z$#Q1e49jQMwLPxsg`M#IHjO_Apz)h|5?d@ZT40o?;0D7k6q7DUt5UxBpe1!p6olB1 z_UMakINAn+*@L0l4n+K+g9V&XSIJEJ6B;E)nka$nU{JVP0X zR6nZ=#r;VZwQ*RDiPkHbRH_!fI?*#2a-BrsRQv?fMXsQe`PaPN@{JoOM0?7%ZO683 zp4q44$MND=x%s9WWBc+F4oke6t;rZO{%yg&>#jS4Ml{EqfMgt$CJV>I8#1(-duew{ zM819PH)m-~hD!rvgp{aV^192S-)bH+#Z$2E26dl&Ci8|v?L5S6URlX5<&4inZUW6G#^68J#dAE!ANY= z$q=9e$b2c|=R#NJ&FwrVWp8hAjtob}*2^o+m|#OV!&J@I<}jx>(Sc)eBdxTu8lav+ z1;+R?43pH6f(97ts}8>94h9S$3Tk9jjUmqLc;Zn^vprYNx#0Y=Xg+18>2^N3t311B zAGdYPDTgMz%U+C}?|l5hFgrAO#(7-vHlG6a!u%~Pt2(&>=ittA{%g()22Ms!$)8X2 z%mW`$AKMQ+(^cH6PyPIsaWr1DpTrRvAjgLIX?VJ0(H8v@UdGM5E_l_e%FVamRR%lv zltYyL*Kw{-p_H-n6qLokC&7b^7XDJQR6U+%m6 zj`H}UFvkiaD2VuAd-FfWl=<7n?qpeRzhw$#;6TaAq&93zHvmYw4Q zLAI*$Ui>9)7iNWOohYY1#nu$a7);$dOI))BlGVZ8M?`&(nOKB%}f(#h7;Xg zgQ!hCwq<8Ojahas+<>QyJpNnB}7FUqaj zota=OWMr5Nl@FnW%#9&o#Ftfg7ssnT&FSJhM4b@VZbj)#+T++G9H-E=LF!<#;j%Mn z66#x#r#A3(;p)G#u(zY!@~lnrgS*>y&tTZHBhs5nc*6FVc_zYSo*B>biCq4&Z2BdW zlW_bNi4%5~&U88v!??!L8DE!h+tWp0>rZ=_-#X!C`?aFZmeFs+nl8&?`ut_M-_3CS z{Wg!L^V_&t{tVB0WSNZPyZ?f$GHBF^aGOLTp`9`(XL=Z-SL1XeZK*}(n`~Waxk%^) zsbeb{JnVp&I^i=9bNUx!p0wj4wtKvN#>8Pv+BO!yDTB_k91o}TtLZjx-u!}jTc*bz zd+cS;0DiwZSl2CEwlu38(tzXD-exRu6(2ke=hm7#59(XFxR9QWL5~LKW4eL~*sWbx z=n}{Yn8iM5*B}$uG^gn%Fm4aGM;zjThg~p_9Y~fI*6?pqkw6-5sQlRsYc- z;>4^Hvop^+r<`~Gt7gYs=v*Iu`v(C>pv}SIksYx_a}Gpn`m4WI8rzey{}fUGptUTIfLLNp{Jc zh?!5vF$dG(_5}={H#LO$4*a{AD?O1pjw+P06i9h+da5lx`yH zD^GwEk3PCJBw+^*C=G)TqtAL-yaclo_~TZgOklMSXIX8-x%8*B)rFBvOYDx2)7{@= zL4h9M-1&>bM&98=<7M;KCn7xvUxvrg5qu7b;BDV1J&RYz;g1gDclQsL<@3-DeDt2O zVf9Je0<(Bl=P$Q?W&SKz6Tf}erJv!!oZ_F%qTf*;;yJgtNNdiSrnOG~a$d`P{I;)k z`Sd;V!%Wa=CoeDeZM(NDKjjT&-$8br80y{`+_QL9dE~BdmkZSgMUr;lu<9L1%lGUr zOBN2X^{=dptJ=74_!gweE&$bCufw{vJ4HU0*K&DaR)$~ctn-%fV{RiXP7%{@#^XDO6TVOA-k+rP9WWmg-;oiHtIh?lXm zL74NV#--yh2?)|XcW6EtA?4#Yjg34-gHF({4C3S*XeR^cwyp!r%fpwTU(rFw?tbRk z(j`O4%FGG8ACcloD^8-2=vyHP+)w=BvAyWquo~d{B=uzu!@+ym`W*J3dxyHq9MX)j z+TODdMR6u=J1jdi5yXn>-|XzDJZ&c`?ZV8<599V~teS+gf?Ceb^E-nC$eZ(j86VqyYmAU8LlchpH7iH{Sy z#4*I#79ZSlwPPB$Ka@r*p>}ny>5Og$hGlS~m}YSHA$?Zez+vj8+Q-wmozZkFR;-9E zsHR`@{pBwGv#i$P`#BZ%o34EuyczaVy(`^NDx-_TYpmj9cY$vS~F0*he6f=O`v0Mz7iePU`Ix%ID0Fi)N~ zos1QOfeB-nh4rD3au}}hWc^K(?jdXkI@ZMTrt{me=s3IY-n%Kwba^#f$?Zk);3TF%6?7SeOdFl8J@0{FzHyEzB~Gjr0)(3@k$Qx?n{ zDho%S>k@XFAKMOF!d?x2Y15>Dn1U)1@kaWmdOX7&3)E zbFNBU5T^dwCe8QLko0axD%?-m7huzHH;Y4c0o~RfIk2Z}+;|VVxE#njFkW7>esS6I z#M9+8#=Bdx^A;^BuQ=nJa$wI>EVRx-$F!avmo7xTzy$>vah)6Zqa;vXO**1VL(-wx z3RaMTzfxQ0NTsdg;u7T!dyw>+ec7j3AxzX9cy1(c&$e-KD`Et0(2wdMhiZVl3pl9c zP`k?qIA0NM#2gqq2rNRx1rb-;)xEG61_ML6J?wF7`bEx2d>7rg7^L)5fg$#ucOhcY zy7WB6zVoqW-i?;%DA&VycU?bw|D6Ey+L1YZ+TnpqW%V+{$>Qfa$MA#U8vtrA6#{Vw z*shxg5$?t&RUfD7yrQ+2OI=6F!;aJ0k-Gf$-A+#b=xCxCdnslAVVJ;0NDZl0FoD8P zn29vWtmv;_^Sk+OnT*pcm+=#3!b`t=CJdhJ>-jc{&Kxr5R%tI}X9^p6(@ygReCxTjjQl zFST>BX*zZ1e(Se>tLZiS?$+JfwQFa;U#>6K;V=L4FQY%(%c#EE+ux44l7@3auKP6r6^xo5`4iQy)z@<-boZ2arL%23?YiO2v)Bd#?_1-;NhFlY zXJPr$Q8qJK=lDw)J}Jm%TEM7(%#Mkbeincd zwoawT=+Dcdbs?4MV&UrLz#$n1ZPdfGuLtMOr;q1yVwt!||6~B&nea~6JhUSHt2b*= zZs5-#QS_i&Jjp>!2t_5H+~kWQ0O=0ThY`-Fl2GNVeJh}Of(lvK!>6*VBi4@}j25{X% zww@opudG~tQkdyc>X(wgWZ-JK9FG-W#4X?Tx7?~Ds5;`i&UC)Z2pU)CJZOEBj_jnL zw;{3hz?t+#W-8}0;~UR!^T~Jh5M!+4Z{DkxpI9E+xv{K!#j3LR07l=z3G3E1cSm{j z{@XDmeOcKDKFC-d;xL5*s^!bj1Ex&feM2#S?bxxiY*>)Do74qB%-Pn>{K0|AP%(kg zf+y-iP!_j^$Y0Pxr=V}0@LuA-7jXJP%2tn!v$a_lVWigA22f`Bq_Ci3+=< z@tmZACn1t5Sj%}@uxSvVKMV*8OsPHH2R6J<|NQ?=M0-K*#D7if& zXDlMf9qSTV+TU#;J1@iMfyetm*q>Tjkt-7a0DoS)q@z5?cJn;PUke#cCTx);5iJ^* zZ=LVypGchk8P9Ov(-}`c;Wo>yU-~DEOq2PDNX>LvF2nO@nuMia=HYuf!%b_L@9B)= zcjl96EVIru`sJ@ZUHWI9S-wo0@taTc8v~cBy(HQILN}@|3!?3~vW7!K6D$H`){N@} z*pI}}tr77^g5_ZM#)iO0zLmtp6w(}w?3CL0*##rlA&&b2{%I^+D+EeK#5WlP@iOk&gm{ZT>JF-V8rz|f&hY_0 z3f{3LV)4z#?05uSTkrVQ%=q@e0TXV+iRZW6d}H~q|K&fIfBMHSVrX`Az}9fNd8@2X zfg-Jn?9XC$C&y|73=+F!(9v1E@aH||ad2NIxC>@(a2}E@%Hs85Prv{! zo<9^8Gp0Iv%ahOSDhHv{oothK&f`!L%U6t-UAOj5E3dE%f?CEGfwlDFpXne1qb)udvA;<^OV8Mx(g#=2_wto(|lzz zPe0>K%D%fG%+uQ)_H`_OnS%{SV_ z0ukG@wr>hl^b1?c@?c1}#h7a9r7i@7?~O&$I8U;JfliU7d&HF{_|Xf4Hr|>jRU7VP zVii$stdO3J!^9OPR1!_Wow864fRsJ-uU!4iK|0t=15L1%E72G`Oa<7U1szyfVGoI` zRXQo4;%^Du0P|xv*L!uNMD4XVFr-JhCgKEVP3POOf%wGysl}b;E86!vr7P_G9hLa| zd>G$!7cHp`o=lK%g)h?74yoS>Dv>(lHOrFejGN^XZghGJu3>&B9Mkxn{u!pf2%lw$ z2>kIoky}6Gr8BL+rl0xiGEJ5{<5|y4XB@*bEa7At;bgn`uD{N7rm?)u{0z%DhG#sb z!&6vdm)L0p+#)I|?&;_$i-xc>g~u=qp^FM2fN|4hfYr6)cUQpb)AS;78DJ4I1EVd$oYj!zAHq zxeFT9!Bv){;7l(Q+91*wO;=61&_L4B0kbIma+}T*!kSAEL;FahsSb5jJ?+V84r0eE z_^4hFiw`*f2(^po4t_CysBj(Cj?p^iZ3Dxa_UH6-oQW4cAKSW>n=Mc-XA4aeCL7L7 z+jfz9)(~=zO?{ir$^6N$>+aFoUE)@XP7Rws3&=Rs$`p{4d7pBy{fQuA5_&g-%FFZ=stM#He$61RAt>_hg?^1f(2%pA#y74m=MVjK#+6>$-|8ewV@@~$$uKVQLpaVyKK&U- zIQg5;iQZ*gb@;@y4^x+m%El*PaFO12Qpd^tPn8{8A1cc)yrk@hhdFu4+;ab>$4keC zweTun6o#*5^bc{Rt;{*#aXzVM=z3H>P&D~_K=QPmS=<|Ol$9g&UcQ=OZsDH%i>8oPp4 zG92}`>Y?L6C)oLOD5!3nG!9Vjtdn8%rxRWxfSnk7*eyoGMzY~_zqet!T>9;qxZ&fM z)^(M?-C7x*2z-G*#ye|4XZg@gW98b{+t?Le)+LigXOgG+WqEw2Gravf5ib2r+nfOP zH(jPRT<3Q_t+)OOE8}LmYT zfgq9x;goptbE~GG?cmNF_=vvi)>3V^EZa-@Oaj)-!}ff~JKhn$rvFdc`vurd^Y^d0 z<1GOUNuI}i!H>|(5x27~VqA9FG}x*4gKx-&$|f(O#bBW7^$QFo(yorPm%Wzs<+;+3nrFNUYbFla}9Cp8h_%gbC+|eQNhl$x6Ff7!OqShgp?D)I2aRf+WX#gO7I5=4>0LU_cjS<)naZUN7b zkEYZrho-Q^F#40UCi53G9tbitq0dZ-rE4;CTF(%=d5XJE`r<~=LJ}(h3Ol++BApUI zUwy`I3Fs(%K11rGj=ylNN9acb%M-Qg_Rm?cw9K7{L1$>Ny8H(?aEvPxxOMB+*a{YwW2ep+m07fPOru{if%-Xry7ThX-4B(8Yr$>#7RGZI zb)4XOxLr?ff!VnnVZ=DGW<6!PIjR2jkj8+qd>WlL^NOc!SaGDk``DqXRy z>~$GQan5(hAoC+{;6|qmpj@Os8#R!Km4Tu{k;PQn02Jfhg45;J1m&eOsMv}R8DVF^BILFh!bteuSPp4ut2*g$m zW6;Gai`ecVR_vHPV5Gz(7?U#eCbmx)8?KzYVE|n$Xz5^_$yY2j<6Jj4{ND z8jE)2t!-2-^G`#g#5pH$$Cd<`Kf!F~B3PfGT>LqB=)em$hhs!(h`*(5TM80qs&h4n4QmU;f7Oo}Ya`CkjH>Vs5MlJ1kda_MoYhS;itILLn`}FY7P<8CTp%znBZ~ zliApX^gi^gEg>{>n&YrfKf9+4GEYyCc8Xn@z1#+}?+~X~`#C{82wovQnvV&kzVZEK z2#MK>E znP1usR1&DmKF++e9Qyk+ZKhwjVr7}z%^8OA=b}#5%{p4weFsOm3FQ#N1(+wwyl}z1 zvTNUgSnTy8S)+3F$^vi}6sXlS$O!??-)8*%3 z>i+Jhddj<3b(X(-bgF3T#nZkX_)zE1ZC@pS#&cl&UuW5hM_km)&Y*tg<3RD5{^qIk zTbBswx4#U}GMZk0kxqiq?k^0(g_C(T;bwfFx`c21Os9XwOFy5wY@?=smN{W$T%Y-F zSpI~qf7ZqJ&T^QC@iLC@hGluP4EhTr(@Esi{|p^anp6ViyOL+X+bAIEXb{6b&fO~~ z6i>uOw_V~^5V3~;4y#ejbxebUD#2=Q$Tdpb0Sk_Xoj~BLGdO|z!Sr!v03~WaiO$JY zqWt4Rny>6 zOv_Nf9_W(#eQuSAcW%)!s*vtEeo4CC)#kc z{Ye^9O5bGAAT~(-uuVq>p8SQ(OS*#Lb4NoHFJ7!LfN3EY8eYT2%uF1J9t?!$gw%gm z(pML}B<8mAHI07$Wa$3*kN>!+CoMB~1_q@Q|MMCB!5`!2oax-^ zg2_9tRYyrH1i_@Y<|FeqFX>w5DHAveFA_JF9oSBt&MF(RMiPg6sO#9s?y_(1t}?l7 zHM>*OWeE)6ei-4U*h%b>0iyI$r$xv7e`!Xgy-3i!mc;M1U0 zKs@Q!>W;J^&LPc!elN*+>`(b#||=`&PFwzota3WU%R{FqK>k5aJp>x>R5U3 zxta2DZuz+5ZN25O_w>cn?+5qKMEDvegU`O!)~QbTweyZJJGCPkbt0-|vTTO=^F6;4 zh7j}JFr8&@I`hgpG+||&%ttsnpT^5F8t%ITK>v1U{7jo+*`Ar7>3wg)Zho82@*AGa zU&c+C&HC%tgqd;l(`7kLqYjI>Qx#@C5W?gPgQsbZIVeiIwI<`&=i-6nu4-*V?{B5X zF^E+b_cRqffL*lVkoH+e{S=drW7Ky73Kqnb{7tVUqrF|Ca6bWmKKaQ{2Jz2T>`VQ8 z)0^J(JiPr0Xr?Hl(hwK0N;W`Z^qU5P)_5{}E~jLrOHQt7N(khPgGKr&nTcHs{Niwj z3se^$q#-z@H_qR#q7S-?CXadZxD%B;f@XqeF(mnuPhWD}iGL$Ze(Ci8{FPUfFMi?k zufvA33Y-=m=h8wcL|<>3AyK%>4Oag_qv7Q+Yj!D!Joz??TU00YS4jq<2FXW8xk!(8cS``BlR zCt2oN^jiK11CETB_>%1-Q|`Orwt;j+ymEfz6MDrBY)FbV$wvW$rpff1r=4kCV#^n} zmdC!WKXF$&M%k!~fyzJltcTv}AQ=Ve zM-h^RG0dMx52HW1;vmCN|qvCTXZX8JYLr?d9ng|~!wvI0%a$;N*UZm%{o3o5-%S|4>wIQ-rq8;VPr^5@-%3q_Sb=A; z0>Q7FRi(_FV(HEi#o!+OpuGH52<<64C4X{+;+ES*WLFqy4nMyRhHqIMtVmutH(LlS=v5^>G8SHqF*?0BipeG&UX~YT+ihWk$|oip%L`4C{4;yo(bdNv@0kpl8sp zxV}*75jY?dp-bi=X{@J%D^5xBq>DZ+?UA@HjGPY?@Tjg8v>2vG6&fXg!$^ouSh~18 z=QWDdV`TV1ET+2H7L_@Y0rUW8*TkW+{G?N6nK+p#%aQn!PyPJKu&J-76^CR1O(P?f zXxl=WY)X(j&xpOc%6BlJ5#UreXeiaww@U53~s0^Ui z3>5!~J6dp&uF3ev-P52NJwsm5HS(DR=O(>1qzdoc?zQ8pq(n~EAro730JQnlqw*NL z8EXSbF{BBGSuNPmLp|KzM`m7+WQCmMy;{kqd(dwC$vmq6FbyHLl6FitagEO>ap+VT z$d(hX&W6)9zngygJBWQQg%u3D@B|P&b$d@AMDzLol-u9zLnT`+)?;EQq8^;5?xBrjxX3%i9e z1(75HXzVHtqQaY2&V8!mM?oPjtu12S6^XkNQWsEDGfJ)JuJ=IJ(Su5OQ4 zp?{K2B{$n7`h0@P3tS2vDscvUnH)tj%(h(bTx>H!)WXaPG)Y1Y^27uP2NyUaq0~FJ z>7Y(ZtvgX^ahIf*Q|O17WRxI!ou%8y9-4F9298V3TBIXJ41Xv}_$ifcI>(RW#WClE zWO~QZKA4m$xjGWtiLE&XGepxa-p-+^l#`Y(kCVf~Y`Q~@tJ9kPKj^#V6Xv~a1-Bp0 z5XRbdr<7GNfo{?6*uD)WLWTJs&FH#PFWaNtJp@IdI!z3I(wDXZA}wT!j> znF@z2VQls4Qw&-in#VY)Hcck zFHrFdWQsY~Clj+1zX;|;KSF-J+%>JbROCZFEOIS%-R_*|=1>6mrVu7fz<{4hk&N%R zss~=aAVb>80!P({gdsjzJ{b&|yX!;>doUJMaIf=Wylwa9FWa{1m+y(gLG!^Uamt^}p-<_Y))D^XPyPgRUh~5* z`qT=vobXLA%Y(jBEE? zkjaE=K57I;Oddk!->u{Qum#>ZZvHZ1&TCFjv+hWi(NA`SRdH^$A50T{M_H#Z#iG9v znEfP0SR=qD>7e#(JrrUeTbIh4S%;8RlbQ8X;N~@NE@A+OXYKP)PvJv+kwyhx5y5ex zZX@j=mk3j&7ohlYGbF%_*pm$Vg?dI1dHYnh}{qKHVpSX3>%I76hxKI9Kv?n$k;Fn()FTeD`W>{$0btDHY_jA&X0;w`1H%p zH-3|m5gF1i=?111l4%U%JfO@2r2* z&$tQCXS#&#cf$5P^K1HBuXLGrdz~_V#%s^Bna;FX#(ejgFq>r)j_h0f1AjtCluTG2 z;K%q;Wq_AhnbIukH|QMnA(>&Zg#oYH9qCv74lsEL?qa4YWC1ox``7K9a?WoCy+ zG)HHEeaZevzca5B&<&t3*oSm)0;x-E@wqStha}vt_a02=s(TzA>CV~PGAd8#`JK(3pvNsGtWF7 zKTqg788)3;l0T|*e0$g=#x=n9?0&Y~c>VR!HkV#@Ioo&3FuHt3{C>2&Y`-J)unEh< zI7dvx5YGl~Ma^GD<{m64Je=;>m+P+b7$Ko~Cj zUq(#Bx*^1%?-ZoSH1r_(n_+%cBCXWfoeA%shFZn$ns)wb5W6_!n>165vE-tG=3msg zpTj|s6PGQGg|2a}tGfEh%s9WrHZo5c7u6l?HVy@zojb77wTA|K!+F8kg5=`Zgfeeq|R#nb#L zwfo{1zgSdvaq)Q~w~fVI0UTX(JeW3Jvp;3tT2tb!gOhaR=quH8jBh&m(by%`exgCrs0Goi=!=KQAr!=)G@V>%-8oSd6jIR}HLA14k z*>~O~3^4Q?8Pp)1LBg_LfFx6qgaYqeb5jNAj3Q`(m4(S%w-iF#Fh@?)Qz2^%V#1~ zc((pzr~9;%6ZuS&@w4*{(`7v0Gk*FTmhtt=yhSwOwKGhn&-e+ynRmj?a%P+?Z~8aC zGf&eV%Nf@=nRl~3&G-phzbs>>ZRTfqej6{}_19%Sz8ltb8P_Y{8gz zid9<74*>9f*STEm9iyXJn4ggMH@@+W+;#dy-2eGf7ul2g65}72YZB`p7tHSm$Hl<} z_A8uNWyrjv*TZWnQwQa842c-p0EDJ#Jhc~z!2|>n$`p%J7YZuxYeqa@dX}}U(-4Hz4G)8A^Gs0RwW=xsdIca<2teF z-|m$BE#TDeP$PYNoO%g;yYCP8ZQf3>j%(dFuel}+FZ=%WuU%C>_KW|6uP^MPL0&lc z=#W|kjB%}M{SKJ%Bg4_XzgwH2lX4(b^tw>%k^?@5!Z6mg2f z7LSl8rqtecDt0r~f2=yzmR)9MigiO6?#I8Q2gy0*aeKTQ6$=^4nBS>e)~8vwe2<2U zqSbk#$#^9*=u`KpPkkz+cWKj4zbtdUJJ(24Y`^R`{hT9&ZT$AUO>2CeVLHG4RalH& zsDtm5<1%1_v281lq8d>!)iC;_dLkP-C5MMN-vd`n}rhT;4tj|Iqh`rida(pVm6KRzUvQUuFnpRzgSg3&TT}-&CP7r$$tYQLRNbY3L$c^-_jFsG|q$?5Y z$Le^mdlzMY7V9VK>3DIw;@{o(Z-E&Yz!9xL%K%Ck!JSbSt>fU4Y6PGf(hF!3D{Bu4 zIk9R=Rov7Dmy3?Ll8bFL?Z3rj4~bPvK zZ&`z&dyE6^+sSP9tGi?%@ZzPCi+BwwWF~Ap=OJlcxOg$lV`U(vThDVXy7N5$AHu`- ziScXMa563_X$;kxmVc|r5yzPEoi8=%QDM!X_OubP`6nYc{F+`Bynh?Myh>wi7u(98 z{pFp@>Q(OMlxs2)g00KP+6BUCK#E*bAKufv3NmD-JalA5g*UDQ89b3u(qt9e6D%$) z5)0G;4UMa>Esd)ST=C8L?poMQZq15G{@n6K*hF}p&un5B9)TaNKCKV?#^Q;AK3dP# zyAPeT)L$nIoHRBVCQ>*D@8>XG&}q`j%y`0Ay4vL&9#Snbmq2Wd0If6P8>5?kJcp>k?%IMiZ80@|W{|!pbrTGa1G# zQztY5Uz(0KxAm!`Mz520b^WTQQb`eM&v^(512`7qCIST@{YCyj?RALZ|hn6 zAwLYNaqTwJLZhTz)0CsmVeuJ@feMcKPJKTx)h1W^><$MQ9+EPIDVNuCT}^*4l3h zDXV|wPXyNWQ>aixR3b{cNf=5SM)9`?M*2Ho0HS5605JNot}fRbjX=#3v62DvI~&S| zZo2GfpE~0i$L|cwv_6{%k>C1d`V7y!{eIiq-Zl$6!}Z8_^AlFW%lG^?Uc%Qe>yZBX zCA>u5W2H4td)-_?DPGU?J`+aP-+VH!jF)+4Tl<~uoax%jkZ^?24705=&xB(fT{GSn zKI>p|5dm?bPf_?|`WK7)I17rW{{bZ`U)V661d#~g!OH~;SbyKaG)K$&2BJt)NDa}*p>v0W*RTeclc zXc9~4C-{Mc103mO>^PxmkJMFm2U6rt)diGHI8pmJ%$S9fz-$-{8`nuO33+IVl`c5z z!dU&Fs>gbyft?iVxCYVV-;uC-TJ+|dZivaqG2+h&?&LLV<8EJ*CWMrdG}HV3D7tO_ z(!KwKKNrkke)~*Dt?Bn--n}e9=E*X>=E93Ov~n|L=78O6FLIF2*0c$m=BjmQ)ukDh zEz^AZE__|4^*!S7C)*?9@GW!KbVt%hiU_idciw(md5S|Uo}@nHVGKN_SIIae4BOd$ z&?SU?n!CKvl-vL~B-7x8-O3Q-?97 zQHHsgmTp@w)43Jyd~xL!SCnnrw=;iZ8?JSlRf(5OkPP6&;D z({{=^A?FeOd{2L$e%rP_YndvO=DWX)W4OPjGfeX__TBIQ{_n>Qh2zaOiaPPk`N#e= zeZmutaSTttOyhU-KXd|#1bi2l514n5;<@ckM!{6O-Rpd2n;+Q*W}c$$WhCS92xSkcB0cO?rknoy=isYqn}}@m zGHF=^xLAcY2~P}>w{mw@$)CJh93UY?#?(Qfj9PIMx1jAuDAu4T!(WZb5o@22r-xW7!Fc{IzWpWiyu=rZs4;7`KI z@Jyfi8_#!L)+=EqtW2A*jGKO0KEE?uIGK;{`E5GeFw;~8Yi(q)lHz2QxaU77)zR^K z%w8fSov|$HFX#fdTzS>12h1>XDem$k%NS&NeU4j!!VcS(08>n!<*yL`{qKK|E#SS- z;+i-I5sQgV(TD{;`>pZ<*B-fLYgV-PB}FgRljU&8AHvtY~S`o*gDMdZupCF9%wPYrgM9C z`}S?Io1_x{!i9^=iWMtn+s4*bSRw5=;{2G2?M}CRr2$UTNu%0nf^%H$ixv<7x^opU z>0i?+Iq~3H%w1+Ea|W$(&h@649uEwGC#o1IO%^AdaBY(~%pp_APk~G5bwLM(Qn&D+ z|9tuFA5VEoyTk$D-^vSANuzT(w2^xCg9o9D3f9E@%H%Jei%qpgz=y87 zE8-o$d$G!~_{4>jQ9UybNx>+{Tnu3ty{{L&ICcS}tfUbRn}9H}9I|NPS+=83ow(r7 zcFmvuzDwhMMp=34d{3s$?`C+$+r^cH!u-r?fmpa@t)_50vfQ_gn}oHa_%7Fv&8w=9TJh zHBa-UM`_>K#d1z#{+9U@k7NvW;^d-*T!jjQ>9wfQXOy|#>nk0ri&JqZbp605aVmCR zMLc-4aJDD3PW;i^`LhEatc%?>op|iw4{911fx3Ylt2zoG9fb%d@v~qcpQ~g_PUWkT z;_PW9;&yY`qh4`B{t%h|IoR|Af#z^@d7Kk8)1+}fdq#M+9vQn`JgKs&48Rzb=w-6+e%h{oIAXX&N+wXS2>_q(!cOEEL?EX(>^VmIQbQ+O%3+?+m=alt*=avsI z{$I+xPVO@VwoZi5nN~On+h-zF6KOI$^USdH&u?M2=i#@%jN61^I=?eb^J$0Yw{Ud{ zLuAvLUcdAgmVP?ZChQE?&-V;VV%?0Fb(_OuGFmZ?CG*H~~(Ll7f()3Lsjm8`V zw_`$c*|O!Nq$k^*q_J)(RtNs_;(y+&lNLEHnob{82;S0K9)Q6 z)YFQFpBJ$W+zu<_&ubWPPQMrPT)+M_iA`mO0Fd?3p4@G>-5RHnvraEmmLD|V#fz6b zFRBtq8BZA%ndH0gzO!8O^{dK;4QG`LFj?e*o@j8}p7x6}@C?U8`jX{)9`Ke&WflZe z+do=g5YZp@CjH37ODjabjCwl^xYIiiMhSmaot%I@7}*7F^U!1H%`@|MA|#Pf48!B# zOyC!Aom*vsm=$6ENFZkigK1q9sC2Rw*~y6vO{r7*BbpalW8uJE_38G)(a1(H2 zAxvITZ%QvMb}kl1T^LATp{d~g2&Q!g(OXo-YXMiiEk-{-B!J8_Gu#p)p%%Mge>vPT zgx=stnYUo!Y@0Uw-1gTs=LS#bHs=Q0I&mobs~O+)GDL3u{_gMoZh7~+-yNo8GH&)| z!Zg08yfg0%_nC2;e!d4YiSD>Z5Urbfm)6yGUySkRMYKV8SGB_@k97!1sf_hFG)5OD zacE1Wq*c;te?(BUwaj#70PPz4S!NU_lQ~L3#}xf0a~OJtgt?1gpLsYp{OCi=Zd=8U zS!+J@j&d113LLm8|K>U*_ysvu{rT^$A`{H1qx9`0hVC^&Ej$(H!Gie4=w$l$}gSt z+huMSh{->P>A|Ue<<5iGmfzj+bLHZpx0eqt{GVsxH5r)9FX5V3B2LCLzhufXo__hB zPyL#%iM09)&$#(BJb&qzaS~3#hz@MQ&@aD@R|!}hdQgl(9=bj|mS?^6f*c!(+Tb@das#ejqk2=U8}+;O&8#Al_1GJ?}4V1jk=5T~%f zwa`1VcY$jhky%u({lyB+152!4+&UiYpA*}GN{9a4z4#V*{PD+MeB$GjQhQjc7jzC) zdu49HsZ{U6VT>DyB&y=SII7O5QsfTOOyD<+vb|Ob)L$k=#GQfaJK1Z9RiZlvZ5&2n zez2R#(McOZD^ABBTfL2;h zfF8>|{`l6Aisd%%S!bV9yeh5f7A;!T{CrXG3xTnE&Dv-S>u7x>9h)A0FzySsJ)0(0 zUQ{NHL@QUViUR=+ud-$HBjsW8)7d_rTy?x}+<0%<#i`_Xyz{*@7lq0u0LMG|Rr_u-WYAN#32lRMXo{*Ty;De@ z&?fD0aZ6h$=~Mb5?x;IDNo04`EU)=`i-;1vy3nOTov=Y4C5NQOAN-UEA{d!5F23Tf z45az;mnT2cg-#*3DSZ2+{>+1jAfOm*-AEGoMLOOSXC}v)m0?^DV(55?-8&CEEMBy* z%pc^6w!xv8$0x=)5keYaGX%I9WIci8OQ&hz4s3C>$(m!Z|80_a?U^_k^mUMOfX0! zm8oD^mL>0OdAHVDS8c7Wku~$r{4pL+d8%Bss~yWbTP|BoRYQsh{Iwh*XmgR-h$F3t1*VbtAJ$Wdt7)2!klG&7(6Pu@Edk8_|4Sjt4!pwYyr%MEQtr;%?5Wg4VjpoQ^9*otslK{C|} zk`J)}NqcE-w}GM1unHbD7s3jGRPoiek+eYoJ$>oQtqFgb#)7$zL9ZJm&z4E3DokNz zj{Xg^e3bRwKkwWY7`&n;D1;gPt9B%OZud%LlomIGbSzh-NUXg1G0C{`Taa{RxV$ykA z#zfbJ2^4R_@CKcq#aYf`l;F}HsGfgf#7xM1EOb7_EQ zF%pL;SX{_V$P~E15T=r!QJA6;4k?9E=rI{mbqw7(!@sxkyv>OXW8vVPc|ds&A_&yV9G9RBh%VC%<5jMXwPL|QQ{&dN3WtiU+UB=a4SpG7P zjGK96o`z>!)BB!bna1ygm3d@2e5PN<^E>m^FY~C!%XC>DpN9KPKjYYk)-}tN3?wZB z-``QL3||f@vpP%aJvF;rR^eIV#zX_SFz_q^b#iM)FTzR2!KXrOwKZ(KDlb>k;u(dB z@^~x21T02Yr3B$uU|$QiSaMfsk+k1?u1)euB@Hd z7*(+qqInCA-zv?~P`HvjafWqhs1;bwH~|bQI?^TNZubZyb}D$6R>l=y>Nbm~6Js?We_C%!rZ_?^G|R?y1v@k7~^gumzh2g10siIj2+Y$_*xPqOWn z<1w=0kEe%MvNh_pY%^wDUD~&F*|MV1=%2+cUADZ;!OoxjUoy6rXuBt#cr3=GV|!wm zewKVP&B8^C^YsnSJMO$I^bYr6aQXn!Xm| zJHJ!D_O-7?nuPB*v686dj#c*b>=?svxZnc|^RB1SFa5I&`E9(ckLlCZVHr2m zxw6jk`OLHv%ayS5nc>2zPYlA=RVyEfHb}^TsoK86KbZvyp-f)5NF%ODNNt-6M?>eu zNe8@g(20*OA{-Rrn+&8k*K{I{&U`IT*!XII{)c`@l)O6Yr*U4T~8B22s2gT?7BYLH-jU{j2=+w;Y;lNmq?G?5o1mDcN%(b}^)# zx>FeamH{nlT(#%n6mKaxhTXp~nvKNJZQ!I20#izA%BsJ}QAN@UlOzjKI) zCOvoZS1?n($6QPLpsD6dw4AFWfhDneB(PlbVCs$Q7PXcX&YV3L(xua9&W03i3MXK1 zTD=e^a6UVONW72&N^ehH8ZH-FxysdTV2p#?h82DT8@Tl!HI46_XUuOY%%im4F_q!A zX*%Ie{26XKuc$O_<{=En%o0=vOk+I5>goN~Kg-~^?%2^|vHg3Ix}4(f*kIuLVRWhM znq^DM`en0YoU0po>J(Q9%CX^;#yVcjL+QPJ5E5O+icj+~i|CI=U1H9XXy9VZz{J~) z#tjA@81|K6v>>tUfBKiavQEy8aknqw!j|u%5Rt!WEl<^-;G>Ksae^)Z%`g`wu0S*! z)7Chg+uZ7j6Qn32rP;c;uw)WUnX)#vKU(+&QwM^oh%0f_h~SXR6$&bh7WaV>4G$q= z?1z{R_91a0xP#S$gGGB>a;qw*s#l{Xptc5w;f_7UX_&ecHi*tjXD5aSf3joq`>VbG zNBQiW&zD03yUSzeznR`Y@o7Bce|FA4FJC|ZXXE*qC=tZG^E>nO>96YC>S_7(%MS8A z(-~H;L&7#ZVHv0Hu2$bHi}5nQd}etJ^SutQ{+{K_vS!Jhuz_VU*9?9)$`M}G8!_|+p> z4rvi{W>wbOQ;Dl>><&Wy{I>1u<)6l3nV=t$wwl1LuYLfHpEwhD^{Q@y*(yzpj|x?N+y9$?3; z6V;fI)qQq*&2mVTI9FPjJPh2`p@FWJYZP@@6aowU&S>82Vk&ebd=1g z2YBinTb>~NoT+W)mJMqeE7bMeQQ$IOU=q$^7HM?aqPSnV-j0DM!1I|d>3@cqrwp5U z<^9q1_@=Xr^lAhCJ&Nkc zXxVhrb?`nmO(p%aE$lCMpU$4`g;uadOZ)kY`qReFUFJcw@%l%9;U9UrLLeXU!Lq7% zEG}fb=%-F{WxU=+C>_Xunmm3^cbenzpXG{r;Yk$A15Ox$$kH8iiR^fH!K;p^i-F<<=<=lpmh| z|Kj`Y{xQDkOfUR8;)odj^wXJd44mlLstlP=FdUR6kyBW{ngTaRCd<9mi@TH$7WeI}fGewof^*4=R5>*Y6nx`Y)cEkQ=N z%Ul&#_o#xT;7K5&4-hs2O-vsC#4iU&PL`HCY)TS0TEnuq`l20do*>%bY7z`3auabZ z%k~fT)MnM5J$v33_``<}m*4;W-+xn9WoiX2SH6Z)zh&jTz|fgzCi+5udici*6cauW_0a7`KzBUYp%JrN=KfN zmLV~B?)-SKr>noqJl%EAy`^Wx%DQ*FJ1)Jd?Wb|-#9g~?T~&@Ke^rlXo_-?QN0`58 zw{G2rpg9xa_VlbQ8<9lHz`d1gV3p~E{8RN`HU9|PQNIgYFqN?s%2XhP^mo8zj!hwxhJUQE#gx z0-IK*SLUGi>?s(MF{FUKWzNhgn20$Oc&)zK9oJtQHuuLatA7cdCEf1REXHT82?OaG zaMsyI*{=0x1UAB}cI1>XZLLHvnZTTHGj9EvuoB;ltK`qL!tjuja1GC2rq43@ZQJNw1eY$0lE8i>e_`+v#nMr@Wlurb3O1U|-v~;FvBg56RGReE?;!ip zZW)gO!_#+eCtD6Hqq7p(`Qg#e0--*xGi2$t#UFbvE1h8t$yJ~Li!6(>BO8RmPoO+8#cf7vd=u$+Me z4fvT~mMgy#zG*X`tF?Q^&phgJlgZLA>zFVyolnEu-jIlCH?ofb>@`ONNQ@v`8tDyIGu5h8J<=F}_9OXd<1LQdJK8{R?JNB< zo#qSP_rCX)?|%2YKQY@!AAPhu@W2CXRUP|@@&0QF{L+_Dq4@mgOK)%QTNcN#FMjch z<&Xa8kKQuQKU6@)|029C)@imOVF zoT%f3IXEe^*oMNO*IN#8m@RA$x*Y@#yN%Y4bWq$iAIAd!tEa3;<9)^i+jf@C`)xn? z;g6R4-}k|yE}yqDNjC!)=_*EogLFvnJTZJVcN@l-Kk+NS8hU~+Z+$5wBNOATTeltw zCK8{w;Vl0RH{QfpMLsCut3S*1rAMU502)E#c2y7BW5~?7}7PR(9j3{de&$p6 zPx$UOZAY5i*D<5?mT6HJ^RaFt7fzOIdzO@SE9OSK4Z|GoKXeo$%1Zn(HOJwc^S$TE zb11fdWgKlw9i&H2rrdF$%$?nv23S+A_IW84n#DnU>SJR%*mNR^Z}er(m^1Fm_Z zLq-o8A)ROeXc?(sh^D?#~YOfMs;F_iZc0Y zM@U15lU->yCg(aMk{w3kaOSC>Fr&k0CL8_2h%1w~?=Fp;CzZ_X>kOH7N%%gq9Ojq) zzEAWw*VjAxb%Zxfx=f#bS%-w3@hpRWx{OmVm;Qe1vJL9-BY-~>2Z6a{aQNO71+y(d_`o@+DEKQ4lW;PjdvX)p z>L5)JVF+bEx_(|0Hwk=HH@Qtb3tR?gjR)Oo1*d{Jf(aDA;x1tE4ETz7l<@c(xW~h9 zPx4MY2`pm1%E1O19Zwft;dzrt3YI$(lsi5ooL5O9?b?eHyLvaB(=36sSYLV*{yJQpo)mU!-DWWF%CjJG)?js=r|WJtOe zyJ_HySFVoJrN9|xqXr(y6iQE95t=kLv5kz2-7=UlX{G`d%Wa;ORLJ=L_$Hn2>9n63 zy7s}4P|$#lAGqy8XVId?Vau)`2Ej$l;7|t)CpRY{IXZRbJiB$1sq0wz*n96NTmI}X zO8dFPrFj-Qe3XCd=~5QVUtcaCelm38Y-91ypXKytIkSy(j_|3UbX=x?83&YHEZ1E< zo$t;a{&ds0&d<}t2}3{g%Dj!2-&qFZ=x-dijy>@_y5N@b5_PaH&L1PxZSd0B@~IDg zDj0JQN*p?Rl71N~-ILfgps!D}H9kZichPq9Ih~w4QqDQPN8QQ8vMJ0+r(i<;W2J5~ zZOxc)q54SX$eZ}lHng+z7fE@m_%RRQDD;+v8bDWBX|ATzoY%xmW5)a^67o*>M*j~1 z#07+m;^06ZbfvF!cT#`glN}8PBgn2USHan^oGOW9!4wLHP(UIVxDJB`VhzJU#89wO zHXj20&)|nLia1I2oxSOcS(XXO-ZD+bOSpd9#ts7E zW!GW|zxp@$ zL)%NNs#X^%B{8NIx2mU;opAjrIaUGIz|a-sHRL(=13z`Jv@xl4u#eNlGLK#DlMsI^ z8AO`MVk1s}wpM*=x!!gEa4qnU#r#>Lz$10{=y$h>#2ay1s|3}`7h($$mUybL&zd7} zL@9EIdRUGHa1N?iO|FojQ4WE0Avv22^VWDjUQT?x& z!0@cdHE11@gCmCzRleZ#_HA1O&-KW$>+|rDLuKi*<@i>3E5%#F_l{S#jmI;M?t%v( z8g40vB;IPfR~v!5ckPS=5E=h!&l_bPX+uiXXjCSAB#UmHJLZ4UZY~EB-m1)=Za$9f zzEh`8M*gQxo_tgG(kTyzNI$9qSM7c9wbzhVpDX9jqqkKBM%s!|su&SH;*@iCTEyT_ zqw3N8PO$v%!f3E`%ef1_0R2(sGw{K%I8_M^1MRRK2VwxrKs3K0SW&9%!axR~+PWi+ z=7zw@7EP!@`$j-Qs2ofoal|Fsy$O?PwzK6FxJ;iGi`m2HU0t0dcGYq zHmys_YrUMR=iexYKL$_jFKd@9DEHiSEo0vdhRf40yv&o+w=Lb}Zxxkaz>jmFFT(?*PwXhsgQ+m%BN1e^v$a* zxdq8B4?Nn5V8OIFjskUuo8ADl5k+2^IgMm?ax&?&AVpO&0*$6|F`4TbZsQvh0;ZO^V12>cYo%UWvC;p{<P!1zp8SS2!|qPU1?5yExS=(UZ{|Lv6vUh}y%{0*Fp^ z+CcO$LB!Cg2qUX8klsmCod*vmjm6?7Yw+&#o!A2E=c#9`pHO9?W+r1|BFe2lKVfJJ#%~rLqgj zW74ZPr~27_T-4qBp8Lk@UWasG|GtnCedMDb=MczC<%Q?BjMKY%JSCQzs*AdSNU0u7_sQ{-ytjNQKMo8eI z?WE1XWcv<^6^jAE3@CMG$E$-*b@Ems0vi~YC1~C%{zc;pL<$COQGS`k1&bDz*=%Qv z5Yo_K5=rmjO7pdz`pF0?4iaY-)Kr3=%1=p@^OMZH#2cN|xME_HO^XvIyz)^v2B~N%L(> z-?RN~*ZgJs`(2-FGCUfeKYrJp-{N-q=lqx7_5Q2pA&iS`AHRCwP-$NCfwC1N4SkGn z+3yU9{j|o%MA25X|i%0J;)O$PM7JOm5}4e$%|nSdJ;F6-F)-La?R>hAz5~t zR=&snuO0a5u_w8W#TgG5(zM46~mnp}Ty7vdEZ);4ZINj@!<`CuCE6gGPLP9RGKv`9Wfkvgo9R8$$w;b}pbpkB z3kbL2+Q!i95+-;qF1vH$mYuha_^h^YstHT{R&b;tb4O9-+Y|QCEJ?VV4E;DwS(pf;HRH@A|`mpzEZJ?2Pf2Au;RXupBu1$l!+*=>XWmrS@kBqzi*|;?uG@2eS1Ra5^y=g9bw2 zl4>wY0iC41uI(}^QZi|sT+1d6bYee#rng*xQFH!v!QtXJE^DCQ>~9%R3u>5nFVg7wzwJVmE zeFtAG-P0G9Cd|O>JKbNlPM=dY&h9DCJo8Ms@4oxs9ja5~IiHw+&YAX=^M!snpVr4f z&J{j0z3+9WziI0JzNcS?`>ek^PdxF&6J>P9lJZjD?6Ut13>ED&+IPP6?SHPU!|?N_ z8`fb6o^~Vcp8W^muZGGLuC_gQ;YvAn63J`-IgHFB1#X*EPOu%^)d$^xZ=n}xZ_6aw zRLrSml19iox$EHk=1J=?>P;Ic`4cbXkCZr0Veu+nG`Wb7sc-a~f)3{}uMiZcrCou8 zgzNlvdo>P|5H9X|;G;z&;`TWIgL;rpSawl26}@Hq0h~nwM(-6QIgwP3D4%Dq- z?+a{g(`bvxgV?zpqS%jUnF7ULGzIpWH;WRw4iMcDDrrlo`094BMhX>s53*u#WvysZ zDbO%sU0T^kY2pg$@Cl^NPK(+Jm%OsG>(5`C@w??;ANh^)zpwmmxo`Tfl^^x~{ilJA zx3ptz`O@LvEq}1^&jW5Ej`<|g)bsRRXM-6xJ7%$WLo^{es zm-Y8M!!t~{`JQDJe!|Rrg_CI=e7@Jy*7M1-*YnHx8D{)C>@0)+nYVt%*Ci~U8P|9s zyQ|SSumKLZ+7xdjRZg}NZrgbX$xKW@E{?#H>Yx%*JjQ@Jt0J~0i8RUK0j1b>yaEO( zeplR1ogGXbNOGSqbaI&J-*xZo7PyFh&x}qa``|>}cR2)JIT3?HAr%1^`q*)JUDc(5 zBTyfZkS!LzW8!ufq?21~Sn#o^7=mC9F(J32Bc;u>t{|dZ8O4xQ8V&k_r^;w>j%hur zuXt3fNdyKnfc6Z4l5dU{rr!MpB>YuwV$@wsO0wXx9m-JcaZdE!_(3S+4xEyr@E z`FWprQpQD#7he^Ox}?|Nuo0=>=Fp9FtNdzC!NiiK%YzwmmWp!IP)fICWMpdYg~>d| zDfS&Zwjo)0;{hfQe{^XBuA1!SgNWTJR)t{HS2U=aX?kOndd#jOiFG1?hjgHVh z+&DDKB2}i$Njy}hpl5glZZ&g5gImGTvZ_~Ml87mhoel6*`3amr;4TrYhxhb0;{jIk zJ<46QeQ{+Q=p20^!)Lz?1K%rEn^>$UiIRr87?DwkTW|=km@cG02xw&fjAOZ*n1g3? z!u-(TEu8*6jWO}5EPC9XD=|a_R7cJtj&N)SfRjH+MGQR#f z-}uzur}LdIaaBLxx3LK5Z|yFF%Qls5+c^|L+3CSDOkIZ09x4xf;8SJU!ui}%R?122 z{%zf{mphRu3w^U6pw7CoE6wKEc~m zWyACf@hzXbr&T%aTes>fCcT^fXoctUx5R9<$eXzvF~Dww zsw+X?tSfk;T8jGgs@=J>s+xi#x=tj{U6Uu3vzOh$Fb)ZcLIGVF&>R4eU~1P&WR!!| z2y`~IOrQk{Lzt{MOfF)oz}m!W$d$B{u)`)B!47R{Mz^4~FOb}hRdOS8T4-ULhezv$ zoh})Ux}W9s+u!uo+1%~>;qo7j{>$=(MSpBTexfmGC4Zlp{rU3cBfnSf?EX-h**Y(? z8b=%liRBS~J+G>RtGtclceaTg>31?>KGRP)4z%<$!-SQYXMHlyM0~@uEQZzF!*}86 zd>Wpv?r%BjakI>shjHtEew#*kb^nB&>GC_{WS$eljhAK5ccpY;Tg?T6(qa)6Tx&-H z6GC)w!vUeqCAV3O6GW0Ks+ez0#Z6b-;-RVumr-(6pJftwhA6O6eg+Ov4QnAJFmp%+pUsxxJ-i)#^3zZcdg~{oLm_KNszDwXr=B=G*t4?=2O4I zP*2f=FzeP|7dl^0JpSXLOB3PS-j>-pt74LEp(Yr{OXcfd{c9%4j;Q}^bPVUrnHL9Z z9)Ii+PI8_b2Net`Z~|5ErPhspbaG=Zz%N2soCaMdhB{y3l198MGiNd#selRfK6htDQT;t9jVNj+4pL11K&K#0j+aqP|Lw-K}5<5Fd#n%q1bw&z4E2x(m}O zZ71W1L^0Ab&sum&9w(P%*gXBy+6_0#J#?^t6qN>+xf6AXI*PuZnJ7kPVEG|Jhkz zEMGqHg<$GFzvxTlwkhuqCQwr^p7!;?hdO^Uf6F@8Mm#&_vopUK`DI?oyb0HQ5}E4n zS-z^%s6Q^>jhFAHHLkyOK{y(IhG$&EGY{V<*4b~vGc4atpYOuXcjNo5(=UG+C+nHz zF@Baa(`DJSj6O4+VF@eCYFIt)#4=kJ!*#BF)GHZ6;@sATgoPEcgM%ZLp)2alYqL23 zkOc;#=RqOkxLv_LI3POhK_5DpM$tEILuXay(Se{%t1%?at-~Ch0*-M;yo!hH9dz%y zcXkU%;I!K((-wMBGG_F>L{lcNne81VBr0qx8BxMA!lWopw;~A{aPpOT6z6z)I#N>~ zZQMyH6>DZ$9;Y=2*n(pc9mZ4)vI*`KhOVJIm}A1JzQQ&#t~p16Xt;Rs(s2gRG@eNH zrV8J4{CPssaii&#^&75hK&jxZShc3?+qai8O6=e0R%7q()mL|+n7=pDADenKCgdFF z_1M?0TOUS-AARJ9W&L$GP-bW!G~fTU7{+pU$IT>8qQ597EVrPSFYmc3Nb9_1^Rq!G zwj;IC7`3KycD%CvP4Qg-x+NalzqG4XGA#P;UAr2S=vdtR;UN;+R=Og+N_r{41u)}P zzuC6*uW+K7?L~bWe@I{TPsPl1U@&~7AK94KOp>e8KIc$%vLsQS8b!Y#-h&wgr<$5O zV;-#HRdYnNH)*Vc!$h7K8yO*LAP$}tLPPOjdxwGurd#Ft7Uc-I3ePwFLBo0EnQa=3N+scaB z?PbsDk@AsyZZH4uw;nG2yB;Z%ZumGWj!9+9p?>rfrdXrFH%L%MVXZD_ag< zjxor#WVy2I(J~p6PM`kJ$I6PubIS~Dr5`_fy!`m-7chd|5o#nSFOI+<&Mx13@%v@P zs?~7{o$R9?_7PbJBW_)y?e!yX`y*B5qMRhMoNmuMwse#-%BnR2z3k86?1ACZV-Of_ zT{k1j(@4E%G~~xxTEIQ>2>2 zzv)q32iL`s-m>N5kJ$G8eAzVlL*>7j{VxM?gq6;j>-*v`|&TPcFTAF%# z(`fFRV$1tzX)jjspnrGs0lA& zWuDm{Sth|ueAh3_DjX#kq4UXvJIrd!8ymz0ajCi{&_#(8Fkbcp_^4gL0qWsOMx1dK z8s*U2VU>FZwHnS;bgdmUrDdxdqU(@yfQado{pL26zCWa<{?l zJXZn|(F00u?75|9 zr3{Wx2{Rb7<;3Rc*sGlgu5XpfM85C+AB=j+EMDz45KYT`;KL7+A7dr*ArG=sSJK-z zqyv`a7vVgt;UN_D5U=K394cA6?}7K1?|=8(QSO(wzIe5$(I&Qm^G~)YBf|`yo-zk`fiEx5s-mH6&qxgz|rQ^jGv`?rMDxGt$^MLUk7tZCHCz?HbUO6%CSUG)kU)eir zF1l~+WhVM(7ih!R4xcP5=Fci;E}bb;S1vF2-+W#9&a+#~(BZA6eZ?J=sj0khw7<;g zo?mWWcVBsV$0MPlv%IG#%9`}wGUWVV9rPEsEYJD#)k${o&0jj>7Atb z9fqk7hInS#vi(R|ylh3;^7unxM#%B#K`iTF8C@$X5Q}enruy$A+Si+c2BA6HN|q^9 z2oXXF659Ti)R6ka)XDhkWEw;AM}NyR^>G_aGb@{xZgff^X$(nB6M6)4 zuchfSWr66yAP%ehMLsRf6cA?_EO2&sB1{DGCy~Ktg~(0iGc&$W9-Q&tm%ljurSi2i z|7YnRr7Zljt2>*!%j%9B%fDOvmt|`6%z!N{;p*yeGEe;{zWZ(549j=F^F8C_bE1Ey z^{KO-#<48^5^?M44forh;nq0^h++DfHq!{#cU`9S>Cbrip5LZ7eugC+!+lR!!ZTm} zojCJ7!!y3|vMvc*KjTqL76r5;{UU4T48@&)dD28wQ&}y!y$t>;RRm{|4~9|mF>c^)XEH=H$fCUK-k~j^F=mWo zggS}3eqMYoy+gA)q`=;h31%Tk7V(glpu|1EHeMG8LRgQ$_>mg?9(8M&m3lj7G?-gq z{J^U&;K<}br$<^)SAn>W4g&+iD?WFCyCelJKVK?R(Rk)Z1cIAQ=<=;7FK>N;$RuHG zVzo>T+fPC<=|@vLO-tZdE;N1#P@yRL!}p;x9@!Wp^%b4__1FJ z2CE*kqM?-C`BMgnaYKQ^SguT?jOowoWa@6*coR2^YzW$LHF&CUJoK$^FqB*3Mw9p4 z$1P6}e=q3G)#7)foWHzh)f>a312DD2mil||e_wfJ`!?EWf3)w_VD$8?plus{!(+Vv zj2w)cp1e2uv}4V`bmoAh!9FAz6F@*{GVlZh=sLkNjD7wZdl-DSs-zVe}aZYxJlpDr)Hwj~Zkv@O3Gow~8|*#0Y}WySJx z(+wXgFK+!_9K5;yh8qzevD-t&{&G&pr%i3y(ut4txkUertAACu3XWmcVzHa<>-eIjAO=a-t8*EaEs29Mj$7v2uekLNCQF9 zF558qj4?<=Se2^tG-xt(cCwwGh>)EeNK1nyLXc5(i18Ys43u7+iv_4J0DCe!CL^D~`s z{8=8;8YjOqEaUmie0;ZUgp~s@VffUq?kq>b)j!LU@0r#(hWV{iH!DoCfLmhru*+JA zTran>XJ=K3IaLa9Aaj(*yLPCr*Lq+mVCN(7^&e5X~Pxfy? zKUU7DCG;be_BIBke`A+NPp6#bG3n zSCy8)V`;cdL`4F~Lps2CWX8Z3n|@1?;Jpl;1bEFUCAG7{5lpC~v5c5Hc~ zIB8Tp%}?`gf4GIKzM;BDKgmgZ>??1hc<67x0kgP1?gh3SS990hxG~zmI?%8Zzt98T z`r`9(pl06ug=NF_H*o5DelXf$(xe7R26^G4B_@mhuwNuTPPoy3jlYJ{K(;vBe>2!p z<}@htm|41==Rpj^q_?UK2*(Lu)h8XBaKXS;x`KEx`BtYqrHRC*&K_igYV*zl26)XJ zwq#bV4o=$N%#lOTJTWWgF!NyUweB(-ZV5YI%NR;;{Rv0r&v(n^JZoOQ!%sw;iHBAB z$Koox#V|Z)VFHgF*k0PYr@S7jKznuMx zZ)t3N6X%>}JofnGrN5=COuF$Si$vmH++ zW#ss-a%tydW$l8g<$wCjuTk%=vUXt?H!&S4KYDUYnakF1D}6N5JgLl|Gqe27Uwk#j z;t~v_cfu#xhT^J1u;9&T3(Me^EQO9bDJWJAMTsoF_&FChm_Yg@aV7KxMFUX}7tB5H zN()HIIlW>9tbgj3}pRv*UYh2O>DvNm|VOZ`wO z%HSc&xCun5NgK?ZS8s*ETsX-t3q&I*&bCl?PKcR_*9LTqF%)24?Rz@>rjp z0>>%{{-}E}Mgxeja?Xl7y#_8W)pj**O2w$;R}pI~6*Y|S`a2*aED_0XorA)(Rl_RY zt~x?w$#9>Ebcr+x+pv5$O&yl+hQ+`GZszUNUp;L-Uc#%#kI4KA#`8P# z(l6^JysI&1S=LOS?PL6e<9n9T_l)biaqM%`Dedz+^PQMJ+bh!jG&Oza?86%fA zU2a_n+q}$EWY#su@`c3>hl*N}NIT#}G*`OSsW2vJeAEdEEA-+(#IXGwJn9^Jdd;6fZY0_S3~4cvAds~is=$`!IC z*CN6w62dX{Ri#}>Y21f%nbN`yH6yKT&kVpkA+nLVX=x#Dj9owhLLwfRY{vZDUc{@4 zL!K>2g*^GIu3kDNB{$r3OF44rP%wUHPM?agXZSV@F?+9V1-!!V=`&`8+~A$(=cKI!+_samQWdz4twUjl!=5El_%QHD?*;6t@nCdG&t8G0QKGmwQmkVxcVyKe9iB;l= z(mU0uNXyT87OV*-&zUk9Od{r1uex7Kq@826=PP4rJ{2Qc8KPF2Y}xvyqtaJu6FP;Y zl`Qf_%|zIyvb<*{r@l{=E3fV-#}DkpZ(W%-1u5W^?s5*P=ZmlGE9+J*DO(SmjYCHN z^QS*pzWkTpE=RU~zf6HiX_>dSTw=lg#A_UmDbve)Hh!Xv?tQ#G`q&d?&5C8HEnLF^ zipfEjDM;XK&SmzcxKf{IaxTfZ)%dFBV*N6$44Eh9_rAKj?B4%cX`Z>bH1}*O44{Nlxx67bt7boXO>1eeO5Pyg9SVs`;4R8N65?`oU8O94?pn^QV>GOM_+R zoJHmFA3hXD)30GMvV6sg5JI>m@AkUeu2C-f)A_|V4?LkBzFQ9$cQWT;8;~bKxGJ4> zk+%{bJV=(#IR0YpgznIN5l4MKa>AcBqOU|xVcDl+jf*^#B8pqiqY6;stOWu$Oa^${!DcI*vxanfW2i__X63d93JWeU{?k(_yrmpXhB*3wReSS~3o z3=8>)8r7#6Me?U5^GFYV#vmac^sce$rgk)#TYth-hsHhf7|dBRo=G@-Mq}9k)H?l* znrWTB8_o;PdLW&muWNILk~SvD_PY!Z}6yn)M5FaFzQdE*W=Za zzu`60zuov5&%Elco>%=ncrE93gS8mvrHFGJQtW6fv_fYc5m0q{;yJ?LSP zEwzJ5QFoY3kiN+@vTdS0Bu&7GuSyXeG%7^5x_Dtl-tXPgAh(Ma@k+(oz)!|j>m+Sy z$w0pA-pMTx_`%8DG3bdBJehz|=$AyZjXhq_iir|t4LauT#t5r&Z#B}E7xO37kjWal zq|~{|36m8xvGIaVz!18HH>{y(7^ES#mHXK$Zifywp>s3h9x~%yS3RU}@m2kW!x$fx zjd(pUGBQ{>j=T!)I}d#`=#O;F^7}O0ZLKOEP?K8$;HuTv7H`M!KG(N$ci(ew9E{MU zitY^e`6`jQ=pC?@1qLR#ftX@O(Qlg+G=BN=p5o6q8qw93o)fK-R2Ns4&4U;+z>}HS zXU>`(w>rF4Ij-h^llDl%55QdS-@7LyIDY5c;B)zk)ln~D0wLxppZ1zPH4eYgi{^0!X{q$d zE#6_(pOoq_>3ZXkyI8>-f@{LjvW1hgxMz73iVV<)L(GpIquv_9d`a1zABQzf1l}q$ z90R9F1`L@3B+i4>)5DW|1Enf6Y0N_%GMS4gF?3SZ7$uwODn^m?G?R?skb)V?V*QC4 zu;QI>X>v2F4lCEJ4bwm8dykf>o!6BY_x6@s*S40awCnbryI}~s%e6~pl-)-!l;sQN zmVfhGpDh3OKYgD=>dg$89KU7ELcFun#zO z&N6W4)$+>ATQHF`H}Fk75B+uMg?Y=og|j1YnpIKtEttLN6C|zRhGh-*js|yeN$W>i zwUq4TN?Qq`2za8ZfH8b}NX`EChN7yk$S?XGyrC~ux088PTB#W!5Hk+Ib(Tq})&Ylu zm74goJZ>{fGJ@HZ-iecxyVbzz#9TL$JxHBWJ#?=`tPni{)D>dCOd=xaF3guJ$#dl_ z12_U>rvYat*JidvL`#`5;Dg-kJ!53j(o^0*OxVW|OIlbFRjH1rsfIP~OG{+O+Q7d1 z)A=pj^hhH$MH0CkU=~r*3%(L!i8ewLb@aoQQ;bh+R@T=u%+KiiU zjF)io-8}#N|M9dg#7u+;^kx+VE;OM>Wf{Yfzbjb@t!cv$FOru|?ql@&q$c$Ea^)Qg z%t(D)ajW?6ma^Mqu^OgYVninv)?Kl;Nl4#y@8}k|i0Kf`AV@GJc4D?TB%VmO+%5}~ zA>uc*&#e+AFiz5y=@=GbG;j>ulwk}*&!nA%F<)`liN?Gt z%qCy+<`-p%CwcOG-G`kPq-EZ@d+6YS2+6T7Jl}H+t$YLqGBx8Annp?~(SFS2so_j8IoT8NkXK9%gWLjL{kB>(}EXP#Lh4}kL zIJcOec;d0RPt_C7J2|PT*_X$D{76U*-zpFL!aIX4YZ!aB0c>Dfmgn8?xi9W3J_n;} z`&oyeA@)1p>1^{5VnjPu{gh$C3C0W$51=_wM)UAjW}{WZ$uL9CUtR$y{9z_z8A0{5 z;0npB%GYhVuyR2D&UN-x+!Vr7nyG|O-0MgGv5E9Dkmk+07Jtj(b}ft@C)M3uvp(W- z<(SKyXd|xhlqivw^nrygZdlByb7sEIWlB698#b2ZsAxM(2KBKX8Wo;7b9TAz1}<56 z`iZh<+mq$`J0C1B?LA%YSht|e?rtuRKJ#Mv;CpT@E9YZ8`t+4Df98zxum0Ny%O8K` zyXC;{CrSr8W^K!EDx>Y)W$&5catae&hv&~Jw=934Od2>?jvv`ke(-}Ipm*DW8KAXc z2Qu1(GS&Oa_jLAMl+QM!F8&T4JQ$0bJ|tX2UDHcP&mHA_$FlN+6G(!O_i=cIIo0+V zx?Bb^^)i6Y-+CClfAibFfvwGHWzOX0GNWUJZQqy5^IKmjD;G>*{9yQb=0diEkCz{P z?;Bxy<+|%PmT5DlN88(1wq4?u<+EItlpe48F4~x#D(1P^rVkop-RMIa->d&zs0u2i zcho5ubwLALx@6VkN6A89MTbN|G^-lo)UcsunOm7MA>@gr?5pBSyt)c zkYVs;X5bDi^o{K_^sH3CZ5ral3M-Tr^w|j+e%tM4&p;Wsv@v#%~9kaWcOQtAE!K(=_Rflg{$!9Dq8%g_U)X zaW$_xtjsIp*YnIU{d`aOrq{1tugoJd=8y5s%Xt1Kx`by~mdAJf{pm8D-w9v8w`zCu z(;2QF%8>0ELk3vl4-=;obE^ZSk*@6N-Yy?+mD!Vqjf?~lk27~ynduO+RvXD5137V+m=fon~I?*bzQr}O7XjKnf;JRRl zg$B6hin#?wPm@+n;MT>9m&?Ef^hu$YEtA^Hpp#J0LRaSEvn%y>BpFj+Cc3$YS_vHi zqBJkAxGOZb0K|_+q$G^|2$YFgwQ5b+|I<{6IG^LC>Zzu(Zo~Cqr%h(y1jdZ}Fg??= zVpRecN-#4UZ@RT?e)g$xdQhdW{wDM1*KN1oQ8qvK4CS6|L922aVA)}$y1FLE7|L<3 z?=Q+ZIeD9;a1xcuth7FqKm!jY?O279RX*cm;IZCt_BAytlp^L%N+@4<;?bN@Or$ zP#fqjlXOIrc0yy>mV-K1k}Ja0VOEvE13>DFIqA#2sn_MC&ZZf73T{c`z_mC?2`8w^ zRm=~hl?KWTK-HjiG7dy#^0ysm9&kIj2yj5!EHhs*20^EZVEY4@FjKrfzuLC`JQ=Tg z#G)ljkSJdli;A5uJXY4{eD`n-9dF9`J z?vv$Dzxso+`PJvj(3yj!Yr_Xi%jDVR0vAU-! zWmkE2^X4f3(xpoWW#=4ab6PI@`aCD*4;@4`;t=>jom;@)RBB5d)1~9({tZ3lU;O4L5eQ7?z(-SAFqK0q&%A`mmzT=Y zIb0zLAJf!1r)=AEqCETPw@_0%Up8*Mx6DVE)`f>s?zqAhNuaQ0tn1DZtzgSuciTVa zVZ5x1bDzv*#oQ5xzS9MLB92VHbqwYV-pl?Yi^#_@8Mp-;ucRc4m?x!av6!VTs4=mi z9pJ?XxHQxcAID+14(Syrp{X>LTl+aM>8)&)twMMbw|6a^h-9Yfii~(q92Mw54C%Is z;z-TFI{YN=9T#w$9MhfF3T7Mn7oXm%d|f0l0xH|CgT}5^R2_4_?~G@XP9sjMm~k5%RFpT z!~9NvpKm1iuh+{wvOebF&$y=dJ;U-TEZ;NS?|NCX92uT*GhIbos(Kh^9+}=W^>@?g zOk>Yr(Z)d*lQ0sin$JCI)2<;qFMZPe40?$O~Bb%huvu7xQfaFwO1u_L{B zcKOrPdd;&XrU zAU7Sb?E@~f)5kHkTm(Ra5;ye||HL0n5P@~zB)b^x9PKtEW|&2T3zIe^ zI~rkdkt-1%0T-_V_Sf|DXFX>@rloCMc@(nlGZ<;z!~ z3%DoZNBcX@J-PZEjIU)@vbXlybsYYq!cJu6nmu0U+@Hu}YW zkgCM9?nfR~BUSy^MxS`ltYYpeI!Crl=rVCky2I*PRr4bmBiInr#4u2c`Oz$t7Pe9c zc>uR;p{$^TEL}x2mGrqACcYXTw|y{?SNH-B0gM#jpL0P~Y!}wT@RTs9Ug14q1FFt= zG89^;gwnL)tu_mF(sg0D5RXG6d{`eVy{u0ozbTVe-d@_~tu7-R&^vK? zteoA?)p5sL%F<~w%5`(^Eb|w!r9awRT6&L^6BkaE!!PY(%(2Z5mlINM+t32hcCFYX zY-QVa((2pF2v^ZvXr5kw&qB2I#v`22Z?NF7J7|Oy|V)Z~y88 z<CsJ z+etj*3etRCtPXjK8G01+7i}VLiC2T#2P9kxr8fVhU-*QdFchQ+Uz{?Hz3(DGJd6o6 z>|PPcLS8)0DJM8ebpnA-q6)E`NS(aB{Mf`E>=+|Mr8id06{@5%EDMPP-cFVnUVxnkH69A{OvQfunw)&T_;662QCepL`35cZtg?K=(mY5*I^S0&*lC zsk7AvQ5r;wCiBqBYTnz6w8}q(zY7jfvRuNRWIuYQldvzTZLMZk{m`dT7(FND7HH!1 zX;YwC9pxzI7EYbMP)?k>Snj+ZOs&X)~3eGq{ZWO^z*{yeMD%;ueRljed^T1SZ@A+~qCT3n| zq>MFI_U+wM?%Z@&7-5!~xntAaj3e|Ke-5WkCX$xy*&&giiWR2}u{C zmzaCU{ZYC$txSN|W7>wXd&j%;_>kf<>fz$11u^6ZiyaS4OuTz-}Ep4wkFu31uk z?=zn&H(k4?T;f320&M+FZR;!F`r)(X#cjLGl9`=l+N9RfH`-Oc_teg^<0bI${65Cx zYVc$Yx6n*Q0*fGw#ff-O^<^c9vF*I)S#${ozR|YogXT7UNC}A`ZzN5MxFCo9NHWq} za{IHIgYEw|>Wm&sgvIUzF-)tJcvuFIz7fA-{F1-(nfj*!6c@b?5R3NkaI_8d!vGg0 zmLbNE8RJ@j)2g*{O}luFn~g1iD=OKelQ$KlYKF7)l&}aCgwGD)o#cS6CTMm|RFPp7 z1OoH3GL>!v4Mf~#Rx`$Sl^v2AMur!$JL$VZ5l);80BRJl@eE`qj(J;2!+h!t%Xhzz zd=mxb=dP5cAD>Z{|N89GHkpA@joUH==Jam8Qg;3?r^<|5y2_%DR~L^9&xTFrM>y#+ zuPl%8bX6x->CE49WLfHI($6%RPo}Mh)x#z5`Ry~~`^;aKC!hMKvpjwaf1)#f{xToq zW&Aq)gqhEYu-?kwcGOu8^U8A6VI$-t0{sULNPOF1@?3Vf^$~a_LA9*ZBYyTb#BY=V z5&caXf_ZmP(s$}aaEQp2Hnm4j2E1a=PR0IVB8qRF4BmDo@RqLbC|{Q6t?Chx-u?4W zrUkM;EwF@F$wAx>12d>VK;rBK?1ICE0hE!`yMx#`n~cP(rCf$S#K}!?5trY%N(SXd-v{%1=os|t1!E=I1asd!q@wd9n(oC z>hSX2a;Sqf2U9NNWzM4er0zG~Ty1?{LBc3)6P`D#_><{LdMC`av|DVuMbe6v2qr;F zTx?GJE%qI|*PN^qH zt&D+!copZH|rzK05M;UFCJzF26O^=tm@Bc`7cE`zb z%i6hR;k4%R)Uz*?Ypz*cZd|tl1`PocO#fZiuPWECTvQ(3va@_0Y2c2hzfwA9EGQid z)|QqzD@&Qa0EUi(MVC=)xIA2*KL&frLY@C{_ih(FiA=93KFGW>FvOuFK1f14R8L+j zK0`*V_gEP@wYLl$+f^=~Ia+RBF|YiyU;lJ@-_7f&dq=1X^~`B2r&&1t7bKU54j(Pc z=XP<|FB0)HgXPCtUZH-Em-fMvW!cJ=<$6>N7A{x}y{HZkswXTS#hhdxD(?e9>?@^p zjz#-jOcMX(qrk4{udqoQIApr2orxHdK9McYS_mVAYYHr^D=@@Wg>G6~85zWWAF6e9 zkor$Brkv=FKBZIXGkG$1%9JpNPCe;7=%&81YJ8@1;ZSMafg_ZqRfHU5YmCsSpi0rP z{|sOg4fT6ZuMC*sZWBNR*+*9K*^|HH1*CCAOr3*nlqFS&LtzMA$#`M9@HARz)3l=3 z;5P6jR^oA-nhD*8QvBQERtzpGN5kb)1Wo6=NNd>s|9CF)-uQ=0%9SI77QXf)2|N0ck{J;*2{SH{PSDbz9$^N zO`9+?%;!Xxek1g49QXj2WZYaVi1eN~cl8`Pd%|S}+HPK!iFi)np1u-CD<;#`5Cj8- z{B{PWvj9TBZlhIidNvjw!?U){&+RIT2NyATjg#_nKj zpGdN^=na_KM8FHr>jv=(E?B~Trd;{@NEny10zN-f4q@H36^&795YFKa%>4? zI(Fz((AS+faV+cusu$;^-GIasprl{4cqw-dFOB-TOQUquFqwdg6U`*tjY__nZF%;Y zr|`t)At!px|7C6hxg4i{`?x>1xBTdb50~{w4{y8U&hqE~`9H-WmQQ{9GhxO>b2blt z^y3l#7|fSU;m1Dl$(RqMEzff2@RDVmuH3&b@_6>?DzEss${(2{w{qPAPns268T}xQ z+P!moS-NaR++wj2Ch)muo`f#2HBY(y>5}&NF5^6(8$yC^=`rrAPO%?+OI%PwY@0gi z%LF!Yb(r&@{g!Gh9yl6Sh~bWxldL$!e8+4@8LI`cG%g@Pp8ylINgHfV_V$~!FzBd| zi4c>2W4=*3s9#*4DXkm=H-X&_W8eZ;yzamxQNRJdMQ~0Q$1CY3^p6VVIEd0y2FoE` z6}E+oN7N0xV?JmNB&o)ZcPMXw3HM;Zo;^FuvrlxE^&2;pC%2s}o7T@Mi)VFkEg^U3 zvU9lUmi64I(OphmxKt*w;QsadZ!NdO7(VjC?((h2pD+7&{=2)^MeW^kl$k z$9R1^2W`XNBk3%I3u8*nK@mG$P7wmv3Tqfr6ABfp0FZA0fK1OEMTU6bU#((>xh95F z!*b|A(%7I9zE;G?tmmkNs|N<4g@m|H>*tPAQ-xcb#9nSuVSL6wjPaF ztqN__I`Q*cr(ZCc#8vVqI9pCViBdq#4V@n;XJ5P$zd4&Gm(~B{-16%G zb+R1&#>KMeSEfeC3D=+b3OgAf-*p+Lzb+ZIYLLAiC*wyX{+Lcb;U;rsnBVoZej7LS zUlM+%&ot)mFXQWS(G$!kG1(Zfl&Ccl<#(nr`etO-*xZI77*XY zSj>7u2i?vj4dp^gj7=f%z;O-1g*M6j$P76`B(x#*0H-u?uaWwTNWq4{!&r?oxeiIY zoD|vaJ&zvKzC)+cJG;X6-Q2S2_Dx9JZssNd@YTs^_!`Kb69(ui9{VC43H;_69tMit z4F{d%f4KG6ZA9_@k#YKvq7|fsHG7vZ2e0z+WahR_|XF_KT z@TZg0{ zwF6}?(mI{?{Z4QP?=;M|_^$4u2e;mi>*jhk8C_3FJ7K-Moewsh`__rgmGF&lOIf}_7$t~WEKCj8Zs`yf2wcM|P3}bBteMl0Biy(ZlQ-KU zQ5N9l7NfA8cUwRV^|=P+;u^Gl5ZpArxhpku{tF3ql*Mu~9~+maMU^2*`W%dFFp4l0 zr1S8B_Tr@RRxA$LS+}6)%;~h7cw?VlcjK)wR(9=pzPtn@I)BAY>wWwv^k&YfBQyAR)4K6>{J<;ksk%Qs;J_nz2UhOx1`OAlQ zmgAaFI=-{?pV<@A@f*0UX2C)wf0doauy7KR$m9>IxsGOKzN_Zi5PX3H&PmZ1(e}*K zw5PuznQ3sxHg&v(%3Pz3onKSmvyJUd4|LcU>K}STk?}&( z2wXETFBdJNnBx;yT!?CeFwDug8zK$hTfC6^sA?s|=zI$&()rXGCEr7TMnnLef>EGf zf^j6nr~s3zD{saIz?JM&6>*@+EsI<-eiADgw@$>a7S^hx3;+61nRPFSFr$*{C80I%7z`x# zJvxo@$=vv^U%E`=Gv5vO=eKZ7<8LBN;pq}yrqM6+^gW$^I#+VW%{b=cxA3zJ#`8UY ze%sa=o=^QvmtnpOD}TnzdS{x6`3l4MI^pOtu4(l%TtEJc5})-eE0Ze}fzLxddFC^WDk616!q?sGW2u0pzBSu~v0##La39R8nFWYTz(5tE(F` zC~*}ggcyCK%PewFojFksox@%#5{v7QIBmM?ZnjewVla1q`OeqBhsq3kT=%Y`QQa!y zA-eg55XT4aZ$v-+tBCqL7CeOEHsvdgtzaUAQ+j>ls<{jI&M!nPr3}-$75L&{^ z{479~gCUNT{A=9m+k{H3dXYRPoszlRwsotK!a43dX{*y>#98bJ>KxmeT=BwsoeZEi zkfeK&TRH0P7^j&3KIa6ydhNAQ7V8zx#-W_nMW+2S+uErQxogKZ^d}F7d6?_3zo|UG z<(W5Sq0Xb*c>&H@SQig)hF9Un?94|{6~n45d1=Il9x1tT?sLZh$w!pY309gTuKCXe zuF^myhtc;WkA*EN2BuRt-b0mc>y05miFDFVBu(y;4YJKA9u9_j6mtmA5p}pMk2-$r zmWj6^VS;AMP}n~JpluMcz~EH}Iw+!LAx=2U0WL(GMCe}=o@Z+;pMVp&!KYHE!QH2 zn}L*)TbqVj%FM}~|W7zdZibE9KOQBjw65%nzM8QhHXbD%ZjM%|$}&9IKE@NvO@k|BwDuIeXe z#A=Rq%Q+Z-pRouKew8nOqYuTuL2h?bfH$N*C;c53Fru8~(;zgOMRT_1CJ+>zTjjPv zB%moNk!Yyg>=uZH^l*l{S|(=Qz^cHBoeI&Zqcr$1%86q%I!!}biU3D$!;4TxwS>QoF~zQ~~su5)T2Z88&8gG4j=8t(YFE}`=`vs^jK z(eJ;9`O7rMn{{hUsK zY5g9!axu2tBw}IQ6jW@t2aIfF-T6?;!~7m{WPp%LQr9Oz;^2c)Yc(+b-Q zua!=BO>yF;jUn<9H}len^cd1Z?-f>k;a&I6YyqwKhZ+F1r-K~@i6H0#eSu*5faZuW zE(pTx6*!@upIg9A`lC|%CJo#Vu;anj50lvy6wXhhY<`qehUfY@Og8u0a`*f0DI0HF zk2K<7*|qs^%g!gZmUBmrmB}-?CQ4(?GM|z{^A1uWa{Dgw>dC`!ksjO~|MrE?MT?if zRGkiHF9P|aG~-$9vR%3eeWZR)QjSHfHh4N#Fkbm2Q5e10tGkz8d?B`U_46Rf@#DwGgMIHul}D$s=$$)vjEB7)hA$&~GsfyQ>)3wd za7z@LhZUoqO^oH(Dy0pT?B9sVn=Q{h72(n#>;A-JkCZuc=LOx-FP&TA^W6H?19*)t z$SfjS6_zO)&qf&{q8&yb*tTKp7tc5xi8NLTPMjd8vngftMMz_ugqiDj1Y^f?Iy&AR zvFdK#%0JA5P_Lk8WD|6d9gW}#!5HWgD^sZp8VVB_?8hjkVZbZX&!&CXb09}%diSnZ z%86Z%K-bTev#Zv_aJpO%j?G`OqP}Z+rT4r!hJ6bsC&Q|#?pF6dz zUVMA`XCK~F&Rys$$IqPSceWfpc?JgU5+~|0!2|V;OU|YJ-U*O|&(@<@W|P-7<`QTjIIHrPSUnTLo$|0vB>pRc}-Vol#ZYx!YH1;8sE|`CDK|}Xcnmu9=TjI$m3+^%$ zS^+FKso4WX+!jueXh%0hMgnBxpm5($hW%7v1VnA?aMi$;11lVgLSe{&jNHBRPF63@ zCK!87+&xSMJb}~<3=3^T4)tF~=vldJRKE;!P^X_n@X|g+yq}(34t@P~!qrIn6CbA@ zXSMRlndQiLdm~=L^us*ND>{*H!*toX|37eWC$Ob1rtwzfiZz`m?2|=Lp}myz`!>#I0M22kBwLGBFmDjy`^rc zTixniy}$1F`t95Ney8qvef2Eac(5TepQ`)+?!C2~I(6#QsZ*ymzw?)VZM=+|;hC-t z%Xh=`X`EyrpE|?yJ=3Nlm5QkT8D@NONI&CbeEkg1?}VHAWIEFr*LWG$hOb|Ko5o+_ z;xp5<;~Bpl=Gu!sgpn3%q+R6=c%g&o4Z7>#F-M^Q52n`Y;nWipkItvBA2aykKnzBD zm~!jIV(8jFTd1`pKjKjbDGF@-i1%FuSjy8p9}YuM;q#Osn+`An3Va!5NDVr-rfaV9P0;WAHXjafbGI{QP7& ze0-veBEWWB|MK#hH@>x8wQXZL|HQ*(_s%adz4R;{AnQ>X6i+i9)yJ8YWpOA3u3QNQ z@lNBZ1a2v1t}D}5-t}pee82Acm&Jw*k519q-n6o*`1x*|)?N3~8)y&RY`i$m#*6#o z9K2WEdV45_w!egL4zZ>UTGS4|$;${h@6CPo=#l#IJbw>i*-PhiuD^5-G9BA??YM3K z7kalmTRFbvGS>4|IaS+pARme9y3G6UzX!QEUtam@*RV#BougM?!xZpSkwzHGHm#8< z!%XU}Ax;rXi=?dvj#})d@WfjRd!BbgBmF!bw9{tDBp1`qV7Xaj=EA$5wQqQ8fkO_> zBw?*VNz;^DkfyA7cpSz>OiTPMzQluxo&!L z>wFF#pYI$%*44qcl^Kiv(S8(py%|mbLuKZM*KzprTzSi_SCxJ) zg}8L>Fg$#seD3b!4CIH)78Ey?!L_SbQ08j6be-q`ZScx1Ys%HzH&n$Z6jt)GQux^} z>>5?LT@!AZd#MKl`q(i%#LYa+50@jyyi)LBdG;jtfU{x3-Mv?AL|5tVFAqM+dfC%s zEOTJp?#ai?iNkwY=CHcF>@~0Fy1*UmQeVw7G}p;$?TmCk?wg3+s1-3>(&e6hxnKg(R8qbmx!7~rxJ zLB?4qeE>iX1{0ac!cBwF=-Bx%;kp|RGNACG9Kjr&jB?eIT?aVNy80PL(rk#LGBMS1 z6h}XdJ&BNY+j1v@cpgo5k<2?VZ})JfP&Zb-vGY?Qko(C?>x>O&3I(z5(FOm;Nk|DG zF?~qU+Ra1f$}d5CKcXBqLm=>GpnfqAUEUC5;# z&iHb4-N9gVz7rWlXW=N@&fBxHNO~YY5BVBz$@tOTwWO z9FX6?vApqZca&GK)^7@VxbxG0QqDj6RV;lRMBa~;kgbow=PYAUh%b^aO$126j{L2% zqWbXO$cc~|{4umj4$>JWI&^|JzT%Y}p>j_Qer$&+Gps%HyKKjm(Q)nDx2NoVYIlS? zHR`>bZM=u>fs zi1@3_5hySDr2n#)^2iNu%i^V|dki>8b!jPz41y6}!-`BF>eL{t<}Gf>Bjg_Nv`V`s zRb?iQe4)H@BMXKp_YaVD+sEW1jHXY9^% zC85W#sU(C2T=>9LiK!Oh>aUz#>e9eVJay8K|8*vi?|Mud%9^s5a;o4=aCMqD!d!E$ z_xi2~CGaG>)t|WMqh;&Wx0EkDZ0z(AHlaKSUB_9bu%%p&<$U}0OJkj>O6~v_Xca&S z6B~cXN`)=fP(l=Ci1dlIulRSV3)xRu9Zi+^RJpc#MAZ1wJ}hs%TmAO2{-k9rWkbof zZFgz)<>%5UqQ*wY{vp?3ny+Z#Pd$+|6n6&^E+KG9fVW-6^fLSbg?-E#5@K>^QH_YqpE05+bE_c0=9(H$=o`b*mwQ& zDV|b#c8n5!6K;;J=TSqXw<5%I2_|q-ky)O%@ytJQYiF7Mrg=VG^>4$=wEDH-`JR4l zf8%HRd^bEhg^VkXI&sLb{Pvk;_1&`TvRwJCmBDvm`pafgr0@GP(48J09mKhsT5 zjKc69rGW*8Z@2e5baoNGjO~_sN3WfZR(Z;ob)*VsF**So(j&|m(Q0w=d?v$V1Wo5| zV;F`@N9LJy>aIrtkQ)YJUES(QLQieFf zVdIrod{c;OVRmPE7qbskeqAVykn3V%hNe6d*e;7G&9x|v#68LG;%}$3likb-z}`0D zRAMDkP>XkPX>irrp#{o|2(OT6(!E2-8!-(5?tOZlVhQ-QAQ1Pu`=c_?q2 z&m~$%mj1yfD`Y7N{y{P*$68Pq(a&=C9=E?~r;rN&PK3OM+Mu&o1ZWIy>$duANGP!$i~UG_y^*KngGF|GZ* zilv614%V0T^$l>C`1TlB@87$JTRNU8hoAUj8Ctu!Tzb__<%k4s+yyKwR$2tta2DX26~o*!JP^ub9}2eCHd)kDNbDOXSmJYj zY_gmk9V;W8(|PXv7<~lyDx>tQz~HoYEmm1(A_rN&yX%?L<(b2W&`svbIJ<)n?s=@7 zIdv>90oZos%gYsmt8Gz%-=NDSK1cLLcyHsonVCHwQwTpniB=I zovB-)dwVb)vgXQBfD2Vk!Ru&&V8Rft2xB{H!{#sxdmWApYC#p& zGO43=*Lf|#WaDR#NB&traY;p{tyF}fL&KzurDp|G$=`$$*v(EL(?Q9AZ63N*bW)+w zKk^~WcYhg{IO!L}ZNi1)cgFL(4a0YT3J2r)o|ZS`F3(fHgsXz~jF*0XC(I1Xyo^)pPEk|w@|k&>f5uH*49oDTb0bTrmnMpO&R|6Un?EJ{6=n?n*^Lv>Y%ff%au8l<%|W%JI|FW%G`!%6Go)P34;FuPVp(JXjv!K;{m@Rtyf4-X$qKnzdY zyN4&QTfd?k*P*zB^bmgpF-}DDl9w7D*b>PiYI(%-|e(4wwO?; zye*>kh4h;YCbZ%zQ?}&XJyM}*OcQu<7MyuewK}`E;qkq3&$Hyu!e7S*|5TW1-4Jlo@5Q-adr?N zR==f?T1M>#K!+UaAJ7H|`X8RC6U-QOmdn?pBz6t4(|DSrnb2Q42FlKTXUmDx&y;~K zEdLYdINW?!IsD9?*ol5EH^gXhR%z|WsAV}ko=zE2_aHc3P6o(_T6*xIK73b}XbqHh zUKOdK!k=pprMGnuZIGw*bD$7yExxHA^qpGIDuPwHi!+gpYk7guF?F6in$2nWD^F}U z;#c{KdIYN9(KiblSSpbIltCUF(}(qS3OObnoyxcF;t0OrAp9twXID-$bJ6YbE@nc0 zjD(rKWh~o+b|0j7^dLeq1zNU#o+NJVOBRW>=mJ%?KZ8;T!(Nm-ck8(RW&&kWMBO1J z>M~^~+u)tLldvk8j{a3b2Uz5}i1wTvwCR?+AOd-3qwX4@AQKB^#g%<=%**olFZ8|Q zioQtK#X7RKQk8JcC-b*5b@`oPna(uE$#CQ9m+^dW$4Pimv6Rs;8K~{_(+M-vx68i# z-MAUgr+FABop2IA!&AXC+;^Sfl@BUI8ZXmi`b^u-KhtHH&kWCWncplOw2h|M4w~xq zB6Vw7p(O*x(|q~G;iohj`AR`C$CNSNu&{W+cfK1Byd9W0MG!)g5!(zFMmewcf9TGL6dLvM@8r1opqEUbx0TF{W7&T9cRrM#OV9uQCu+Ht!!v$6&!q&ssQhX9 z*}Qpk$O`!+MzXseE7PC*TI6{K0?U2JyV_DuABC-z#$| zs9Bcc0CW-MZoz3c!dzFiz>TaA)nM`T@_hb8oXW^21nr=M%f#9j9Qn>}9n>f5>U^{OQWFy*If{zBFX7bkqz zMXp`Dw&oL>oV1miM&K9p^%)XS)Eu-L$7OVacYZu8+J`q)CjGR66U1e`%WUQP(;Taql zE+g#rJ@D+=&{aBS&T$h67RE#S%dx`;Vrtamgx12(TAcf#rMxqMqNGyfF*jO?y>B`0 z_HL9b^YcW3AdqzC7dxh@d#$B*+2SVcp1rZcxCT`e-A!Wg-_Va59O2pVU*m;&Rp18IwKju}_f zRB&UxGfSb+_~AM5Bz3TMqGfwwEXq3wqX)RpJ8Ov zEzsUUGV;z$H;TX@z_LvRVIVGsamqBt$bPuo==Rz4h z{!C>w2%E~1&m@vh8PVs^6+LByGyXi}*|Yxss?PYP8@{rRoZB#EX5nX^2{ZkI*&ENq z&oEs(%x}Z>TOKd-GhH36RZTw?CBrjL!W2g4W0?Lvb?NVW`e!;}w&NK$!;G)PC z{G-)Nry`~z_k7McDo00IVE?b*|Nf;YDt|xrqd&Uz-G0%E_=7+258GZ#?^+6fh_Ekw z`R?Z^j!O|<;3X}6;wiq*=Zs^%zxlxrh6OLTGMjbSm7d#fjrcG0XX5lh zf{+jLicN!`0$M>&E-?^L0aT_TR_nA6CmAd4?m@{tr~68zW4d?4bD{ z9ZI8{R7CN$Plyh~RCeG#;bj#Ok47=nBTsBgwuiRUZwCsJSI4<-&~$dv`d@n4j=<*> z8$~9Ww)DVh7mbUrYNm1dPkRz#{T9zvoCUa&d$aYnJx#JaXPQ|b?@zX!X|)hb!=;U#AlkMP~YyMOOA9~=v@`_j9 z1|7C@{^6l$`}S3qFJ+E2x&Ea$h5}-FV$GdTa;OF5S^K{zW`r16BQ$*%LDD180x#2s zqXVABLW3--%9Aq6j-L&X_J1tKw?6Bs2H*q?EiLt^6|8W`R=aUCj?)RW4$@(39n?Z6 z3NfJN+a*?B;pMt56%~~(uLz83Th70;>LYF=ufu>qUeW&oNRq~d4#1K(7ZH3m0Tn`J zskAUhLNw!*1r{=@a7hSp^Xx&Lb)ugeNR-*J1G=G$`0Cu;8HOE@>Y8zPdN0?*y|%1czqt&r=2#i_0*tcL-dO;rBvoW8W7Zrjiwd*t zSmoQPVd*u-*|75N-1LbudgeG+{v9i4Q98%R&JjKn7C#lgE!(yQAA7L5{9>C>>FZ_p zyc;}}4WVG6TuML7AGD3aRRzz(wi)$BxQelKGtMmaBVLilbn*uOG+0PCl{{g}80tS= zDvz2t?E@*8e4C13^tW7LCl6^bbF)rZYH4F0VP-lvi&VIkD{XVui*Wo|Kf-e@y#1rR z8B@|Mdm3DH`kmAcRH$DE9P%;>U{x$UL4At5^12X)9;DiXX6_=wc?#3d2-ov(qTx#n z*19OHVp~2>3r&fb9~U5%0&sWTdH-sx|5H1anGhOyL>#9=T$khG*>04)kvDP^IqFm+OepuorU18{FDkp8Cxb<(i+YC(I`S6(;`L z&M=+$`0leUbTVz?9Eu9@GLHVboI2ItI6nQQ5Hp_s8DF>=&-95$`ei)BGOvWKUxsHo z!=BG&cs?_&-~KY4@chpFeV1u7e&VjbF5_i-{m&hF(q;ks)HM{2j9tXq?Ol(Ya1IAY zelhT}acQ|hR5`t3qq4)9g_$7}LJ2+sCzZ#3%zv(r=ypn(c#HJP3QKqDEwD4m(KN>G z(t$;K{KPYX-`D%&^yTRJs@!?3MNZF}rfnVDwtZVz=(KjVom0O~539(fQ|Y?nj<+l+ zR?nA4WhoW4Oy^U0?J(a>|NZZLCwW|)5yAw^In|?To}b9(<@=_{e`KgFp4tW&X&~GV__w zmcp;|`fE$qEgZ4(;1g6b{H18wvA#^-^^q4;0F%ciPaZ&cI*?FcBczc*ZX8l5!Wm_O zO<$eNSU5uWCZaAn0uO$k?HVq}SVHpDVb++fSW|9$`{s~DW(}<^|MaT8H_3T(%r`WQz(E6N1biKcFqH~_y5IbeQi8zJj>do zD?OxLOX4zv>$!wevXN`4t_ltvdFwI%9}2Z z!?`i0ucIvDL0;w^bd7xLJAWfAp7E!Ntk%0!8WS|GdF`2H2PuP1r}GwBrc$T=kWk1c z`}tZ*EkYHFyMIwDn4!?v!J0W@1f}>^0hmHAF`R{8RU#OuGWeasI!#4}>_P_!C1aMU zW|vhtZ8tY}B9=?3uW2c>tYJOmNzNfJ9WYq-DxYh?jaS$Bu@)a#RbHzIRz+X|MJQ-V zeONBv!}906Flk*MCtrEINUc>$3(ti`5SgnYqMO4Es>0$Ox~>uIhhMf`wgcttbW9JQ z@owhxXUnsPpAIFZAKqNKdR-Y_xw;Jb8(M*4HpI;pDlAYhcnoEWsc+ZvO#MKWE+EkjZBAf?jQL}r`WKHp(*Z&N5_dy1lSZU1~Z-X zHI^Xg8D-?XX~!BZRDxCJ!ZIqYBW*Q?nZ{rChx0CB60o#I;qsr>M3q3}1gU6u?jl!K zWu9FVr z`~p+DeH>mo=Xya1=I$sv_*!geAYv58>vCpgZk$XnF+GjHhjX_)&SSQz>=Bd%O3K~< zrdJ?XHgIuhzstZ~D?7@%R}Pk^KXj^G{ZBkQio;r$-2@UDHh;VcWcxc-m%YDzs;s?v zu=K9JsE8Rwm^$ z7iPX^m{0w5zGph0S+-1*Va7{3``-RGPTM6M? z&Ik<}htsn%wWH_`M<)$D{hR_ZzVI9@IJK+U+Bp^1diAK)!C-dgZepsg)}8B4yBVm= z0CS3tdiny>Wi-eM6hQA(?C!2>qMAg{d1wJkx7-@{2mkRS85BsedYJ%hPBT)H;~XY1?=G$er=ow!|67yxRD*r*>8T+F=5C!)srcU_+_= zjoT*KhOv%%?BnqVo5#KmSCeSzb27J`8PAS#=sc%Xrrx|8XdQ@=WL6 zeWioxnYkzSl-axQDRV!}HBR?o-Miz>Wq}(w=I{S1qoryq31pNXtm~YA^0D}Qp+DB? zS(LRkYgeJ1Ih{r4N~hbyy5ny6lj9DML0IeC*9NF@Rr2gd>nD~*N z^*uf-R>q^{R{!+k6YxvU7{<#|pF2N7XFgso*}9GCH>UsS;KXej3+0n+1iBt&&ZB8m z_H6$ufurX+JQxL6MW*fS_`NdDovGDTx-H>P)<~(qp#Ev6ZiV4(DIz8W5Z5RI1##DD z_teQy!0DclnfwTpk344$Rg4cjaVpGO|B%M9NyCV$7yjfMIIZ;43H#4HoYkwl3ZYZ5TBy&QJ{fDWwd}f)#sis;9Y!wOcS2{a%i`PA7%ULM~rz;3;5dy*|w}-(2qPL|0sX07Yi9{ z_d-bnABZju{pn0spRTE_O0%9*C|tVi6SZL4)<{7xvLng~Jt?b7weY&IF!oGwxH?L6 z%wA~;g>QlnNLj6YzyK#pQZ0+(>k!g5i<@MMnLZOUrqD-lMWjC^L8n(1;44Qw`Y;IXpdCATgSP{x)> z7NRnFRoo=-rtcam2Y>f`D0NrexuL9m1@{nQ3G}EJcl)~G!!>_t`BV9mz+1kz3Jc-s zgx!9&{e53l4kt)^pbrb@PTmRG3ov^IK&|B`v3V(~_uFF`et~+G*Z(CrVdK0TgCB z*W0BvE|tm*`$kWdu~f*6`*T14-X-PFZ*jQqzKhmA6+iQCm(MujtFvr=YgN>_Aw)l& z%Ha25^~>quBZrTK{}|Uk4%~lVnfS!V%D@l*qww?kzNz2+z0&#WSC#JH{%tmbFn#$i zf1z~bLBrNB(~h0oDDd^%>3xsHARyLNA@t9)fuRd4v1^3-l-wwO9V`W~Sk7B z1|B}ckwgcNUnu=6*O$NZ_B*&z?dG!gOJ6Eab0=;u0=2&km2RvcL!93>!;vvlSUCES zV=lP2a~+4rv}E@o_h_2%BXVryNSRxAIfyqHD`IT3`OT+Yk6m1}HDU3ylZYt!$0rPq zdRPJ3HhFVR-7UA=7DuDxIyu{?u<~aDr{nA(ccV~EO-?My8`t>hjvYN5=jeHs-laRP zh}$>xw><;M*TB=y>Y^a31xqes@h8&Y8_DcgNpvw;L*(el#R<`F&#wivIQWv!h;;npCvFk(`^f(r+Hbkb6#lq$r z8Cut{3BDLh=pF5Mdoi{w5Xa4s-F;r))CgAXm< zu?A4wm7xIFDi;bI@8%hDoqR2;n>Mu=swC)9jX}H%+4#h&uO0VBEK9sTksPFCDcZ32o!@z%(JEq4`e&>+!_5sRo z^$aowFVVFBt+W;guV{2FpH~d_qXeoH${W^&>%4s$-#*I0f$s!Br%=-YtI};;Xaaok ztvhiwzShBoil0-kmOYf)K!rbiTQAb7(uLIcNqdMI_(mP`9k2=0dKgP4;0^1-pSc>( z8`6Z?J8>fF*ulU8eB(KO_H}W?4Brb(J47uBl%J1kWMWVNu1@(bSSI4hJIXc(2;$j= zpB6x~g4;|Ok^>H_ACjw695-n<&iY7A#uv$^%kPfVR9WbVq)alXE5(B_a3ERnr zHAbykqLYRy59^I4eu*6LXV7-B#`LodUJIZ)c3(6gm=Y$iz@fn+a!>8PyR5tVRbo?# z3vM!jLZA}8DnBujftZ)QYgKvnV;ACjw@bf!P1*K6YfAU9TD|}i%rg}q!`uFuMt@zV)!+9FPdK&mAv5$!rObGSXMEpvnKof1 z>)xhBd>B}Z3|5#}ONxJpMj{9|@Pt`o-5>nqN%&LnQtaa5TZP_5uQqm%S(w36 zJ;QParFl0ygB4aW`hl#xmSd0nW!b`^rQZtI-i3R|Ti)_DAhr0l-SVl^t&Kv}j`KqA zseHXq_}BAynz!w8O1AB{b?dhF=hwVDif_C2_jT;B`$nz{tIr_vqJ#CA(_gtSqR(Re z3wQN3baqU&UeEOJ2Y#ijde@yOe)W9M#S3y+Jb}2?nMu8Wx7n> zK_+>^{v5D|g69xy2*+;j0v&@zj-6v_cc!D<%pJV1xZzp`pHG&(k8#w?g$rfl$`uG+ z1UQ|!7C_I=TAYTLxQ40=1ybwu1f7<5ZrUk%r!Ha=<#kV4T)QLquhB*tltCaw3~i(- z4oQjPAA+j*iMU7)o_M5R#3Ap-uMexrD_-%cxQ)R>ptGGc8ATiP?%-#S9VsWd)x!?b zIJQ}pLO0+&z4xi;v`yn$GZ8p_>Qs3QYoQ9*RaajZRyC~_fuNd|4&=qZVknLxkG~H; ziEm!|oj!enU7^o#gv+^d`)l72i}F3PBCIkb+4JNR<>pu3$~vvJv2j3oA+CG5W#VSm z{JD|DTRwEl%czC$>Z`BC3WstLX!s}oNBp#?;??-W4{bW?9f1+uq)}b9d~HDVh35~1 z3;_xFtjW z!ArVEIDVn9(Z`F6mMg;?C_A7DOB(^wS~(qxm~>Ij#yN#%qEbU#U@<*aY9iQZcijoWcx8e)dhFOMok%Q8pF4 zI!)|g2i=4IMMc|qU9|h0qP8vh&vH|es3zg6l!c?5OZ^$VtFjsvNZvzv1D-dn1U~o~ zw^|TY22rIXEY9+YT+l`Qc@H?09S||#i}LYZ73iuA3S)SJjd7I0WlNTw0tTzwQ)mjpAI3G|AJfpCr@yrn@^#R51IQRr&MMqiBeTY2q_mzR6YOdJox z+Ct%}$wO)U5Y+tQU`z-o(M~@8g>vn8zZ(Rt>?9;)08gFiYb98jmHONNi`8YzTUM3B zca4-If6h)I7XL?$5$w+6q04*Abw9N+j*Ky_urjUh`k7zbWw`#CcPeg{+3@@&4B;3@ zXPkuD&M(s#H}lo64a09;rZ=8Wf8X2j)8DuWGvgTMdmE1L311v_iE|r19|JMz^}m0SL+pNn!N9ct(||JSM3RO&qb zWw~ONR=JH?IqkTv2Fa@kr+qHbD-16ul z6~p7lIey~QXu15V>&h*+zPe0|oGyDgZe{G;`51+}?4S!_IkUhK6IiRgJ;b4_OA|Z? zO#WSD8G;?B-9ra*(aw7Q2)lK!yQ5;uH!apsz8fa=OMxCS47>P!F_xjGs;T2Wm^fq5 zrfG{W;dYYM?0DVx^qx8uRCA5Lr`f^lnSOSZmR+YcM5XHKy}Oa+b*-Rs$75myfB4XW zXyZ<|dJK$wbM(mJn3mOg^YWW+E~}X?9^o!v;|ljm&Q$Zv!sEw|mc4s+$C}$$-}c(D zRE{#OFD%8`p+nEa8a_MxuG4jJ=h{B6i&H7xxA;`xnDXNxrh9!C|F%;GT}7T7Q2?cn z9aGRZ=#w(i6m1$d-_&W1R;eH91%YR!tbgt3jBh}#zroS{L6;~9n~m07wWkx>KH0UzJ#Ap;YVx38?emPHOeY&Dob%*py8C!0YnLZL!2(a>X?s`m_&0|2#FMO@M;r>oxJ`bhE-XLKSBO0M-+v2v4NobAY(4BMiL zNf*<#yhK^;SIk44s&Z<5kQP5{LdD0Y^pM^vniftTkuStW8c9E&(XT;I>7b4wE`HcA z2*eFv;wauJLrf3D4XY+-OXdMq;-x+%UeZUarU4z)w?Ai3LxF^5%Ba}DL*F+kA5rtt z)s4E!r9KARF*pUENp!Q`erP~DmM$7gm{o(Akts-7p=kNNLxaIQfux-^ziw1a7k9>D zP=Lu8VW#Hk*n_S-knTk=E^thOhe>uaMQ3LnXX!8nEHj4|PUY5vplio$VdAX7Mo>+# znEUL$hs)Y4U(pbr_z+9trn5rw+jqk`2B>WRpUKAC5oi_V5_Isn7`@C=R021Dj#iXYE7VV|NxYA zwG=i8g|5349q^1D-&cKq*LK? zdh~C@iIaKf)Uij*{N`_ca0wq3)tp`yzw2N6jV*fLY&p7bys^xE>@KEbvFxGbEwZzA z;qk`<%q$kC?hpNbbc}jjZ0UTw;SFW+pZ?Q`xBQR%ckY?T%IJwhu#9z22L+D|W0C7( z8e;+8LIRfFK^H=6QDo4`u=vD@ai&1eqdcuIultVM3P%o>op;|?P9NHbpllAnN4PTc z%fZm|`6?E2TI?T9pq=bvOKj!L~Gvo zmZ$yVzk+)y%ojr<$awtsy@}6jD3FnmuuYq`#7@UOPwtAtl1*z{wH;-<)lXV^W}Ej3 zA3Jh5tR}|O4RV&9%GfAYTCFLzTNMcNP?2k=4 znmdkNlV^KN>!Y_tTzTfQ?qvpN%zB-go98^j(PL$C%{I9!;t4R60tBndkIufmDmBPQ@Ko5QQqqS~p>;`x zrdO*OIEfV)nH4ZmhIocNCQwBq(0~WjV;o=!PphPgT1+#NP-RqwSKQ4zdK%Je`Er0R zKdSheN%SR>R6GD0`T_A&%EY}B%OMh8#DbsY3l%`)IV1>J&{Q2G6geB83_u>@8t**h zWz(2me<3<+qzfgKa1}?xVhWmXt%K4*x&SVomcc$tnmAP~E!Az}$QshB5C^>?AN3~a z0Su3yl1Aq1GA5nMnLqPcwQ!o{CY}LEeIrOZImgztR+)9LrP;*6*Su;a6epEK2LW+3 zA8}%!MEDGNOwjLjuoPy1`;)yL$t8FT%(BjR)Av$0%9~i|zi$En06+jqL_t(1FFIOf zB!rs2+Pxb;^mnA|8k7!y?)R2L76_!{KwdiZ00y)4FfHQo9kZ0!b)gm@4mZR;?mWMR z)9P0h2blyI>%ReZqFTWALs=$$RRG?3tl_}G-1)Tm8K|-Yx z;?ubP(gh*;Fm1jYmT}tg6Hca$N^0O`KDA62)9asb+xe%Tu-bW>pWnvKIQq5UO#pmA zgTLdq{)tn@Nm%;(p8lEMw26oB%UvpJ`nTh?%W9b4I`hy8Kl4u9^w0b={(;Z`VZ;qS zqaiL?0WA+~Zl|HJux(gNHqJOCT9j>W3sa(1F!L@NJTdw8P(w5G3aetfc zAK!WB(z-mYmf{*ao|{b{ZQP9et#-X{xuZ<|&IhSd1Txn*DN7cPaj-A90G#`Q|FU$v z{T*ffM?b<198=}owJ$4!H{DbgPzt2sYp%cUdC`&Yo`JuVNin@bFD(Dr8EQdMA@rz? z5TbNk3gZbDq95m4u?1w)cfR?p<=U5ARSxZbq?|+1nL)uBXT#F4f)&~0&RUErSe6-8 zW4VkqI|y4lf<-KX16Z>bdbNsh{T1s2XD5_<^X0Is*YjO*)k^|K;$hrpnUZ#gukSkLhcKVy z+&}vi{WE^zXFT)wn43-9AQChsd4*tTrHM~Z6^LFlL!o2M3;&DJB2CaV-l{TC>!reL z(2F!(hrSZaN;=tHq(U2g7xe9M?icvtA4lTAgHy;O?`LIqWpudSQsk7byMU*(puvM) zlcuH4jh1;=`P?jbNF(RmFmYz$0&(jMhV0=~rnFFj)N(z;n%I?Rca^g%F9A0A5+)t} z=gv}(8;P}K6vDDwPV3R~=|WKqnG5~H3z=y+@5+CAOy~`Mz>OWxG$X)|p{V$Y zkMTp!N_TKU%0^o>SCt_mM1L-RegiV9AqEQYpm{38<+V_-pi^v^0G7&4RV)P~KRT#! zjd)egVsHTt)>ZaH(j)oDG*!XFvvKwxIXhrjOsf+n4jwNf4xkitGp_H#(^l(IK5-n2 z>pMeFsr0M((0>tEdJ4<5^=Tie;&*W-&3p~3`7D(6Q*3;t5Yc9_F1r>K=~Wd=3ul?c zi9gkf3@q{F=lXe-#5g{UZ`};CX_^7+3ifvlal49B5%+`c#(hG{s6u2Sb=&%}s^ z;eu%iu;{c&a2yp$I#e064PskPg>^6i74huDpDxqq-d+0FToM(K6&$D%S;kg~wVf3e zr@~8doZry^i0gaX`5nwI5rI>Mgk`EqVN?)tjOXtYpZG*1&v^Rz?o-!(504l4(@vjJ zGHr(G--g@%Zl_8AOqXf&Pnhla%fmDM^7zjOZ+V>MaGx(t_;GI4?7jbYERtVvLG%oD z&Z_yis)kRu$Io+KUmtbgp`gK60FQMl@)A5GTSs56ydXj}AQ;DW3?9KCzZpkCX=^jp z_yi0;$5mJiW}E_dP;Z(YoB zFU;AC9bLBeXD%@<-wo6~?w;xIm1-nk~c#mM^vN8sL!sPV;6LIsM z^d{hcz$M*_w*N+yyop|WqK#^w{fQ2A6E z89dLgq;)bVurj^EQiBF!ET(rgrr4*NPMXNC8b7+(t=vZaJoi6n=8HR)fwfKfs-g;L+AIx$FD5&Ju5(~_C=y^5ySEq6yjTaQKUq{ z&Q|(rwVHG-w&IdL*F&OB*N^;FNz-~~Te8odVo_@cd>#%UVZ{Uy6`a5mSm7vV-R-JU zXlA&kK7z)8&_Z_6)v^a2B@cL1E1r1SH>)^dObP{0nP2;S>%>8Zc$!N+X2oi)d0O_+ zHHa6AnTnFAH02UC{e$*A9XR?fUqv27Sb_x}VTt5vJc$_V?(A=fXIt@%z?k90PZx$U z%4wMNh`tH~nfPj$P_Iz=RnH-q-QbgD!~BtQj&G->dzod>-}t@Mhn80jYx0$w%^X-* z-x^UDpt-PgE~8Vqb14Re4Qg~EkUAV_khYWce_{0mmNaz0>U4c~y@>;$nwH%uNyY+j zy37XbXm%I@;f4=)?0E;PR@-hEW3B_!HB7EqmLw1dMuz#l5M2VrnQUmYT3r^6!_Ni4 zF-imm>=tWmJiwevzZ4Z_!_&0|T2@^8hj3^r(=eUsvckiI zKfxGOrePUwSR0=2hGl+ld)wP0xeX|o1;QK0Z{hjVnMP-v{3R~>C)`ZqcjjT*_P6hC zxcRQXF4M&ae=@DlcG|=_@oC5RUH?q89A?ISp*Z4X+H}6RVSM?6KT(du9Q9;(%;v29 zkXJmj&rWRtPNwOz(TL>&G^W`pc#IZc=i@n&4oVymI$r94Cp$cl6XB+iwSmRKmRzI` z07f}<#weJud@M;&-|WV6y~s36C;7^!n$J}e+>w6ohyS;7$Gd<1IrwKezL}>AlN%y( z*X#1MTG`r%AukXAoBGx&=}|2|_TT*I(z?ZV-iEu=SVi&M8oxkos&n(;m7YS zlOrc+%iQg&oZ`S$<-PaGj87v2k!8~hJ!Oh@h<(UAH!jhSbAT>_yob>~Jj%KIY+rNg zkH!3I7~pXB?oXEWZ~wt1++$M$IFp(mPya^`SiNd^6C7MlyNo!*H<=DxOdg*ha+EW8 z36cQ)?R+l3@@kG)*+l$M`Atd`~9~ZE&3(RJbjf zKjlk2_~Hdxs|@-K5)hO$s@~GakceI57(L?Q4}s%-DZIk3i|?Vq)1M{|9WcD1!9$hO z6pJV(TE03keo)x~&^xI6u~04AxiUpP*F*nEoCVfid1v$h*5qz>pigsVkuB%D zRGLu&k!8|wg7s$evvk-fZ5}G!ztTLhkXbht4Sc;%*N@Gk50}GhUth}*mQQh)4weWU zebA38U&De${b4gy}kR z6-oOfm$O+i`BeO@=TN=?BrU|l>2>3phyRGhw`iJKpo=`X*xwsB2S55cYRUR=lWjkG)I=A%_UYC-kufTmT?P1w9vRdK|+!rKRR3rXK0s%;1?HOV_BJIeM2u>)dyLlpk}#1=Q@GO(W~XG zv?&_>j60QR08ybzYYc{KC7$MU{_xJS z=ia+G0F|?uT*MF4dm*(TwKS%sXl?9g?N<-ho7ow5uY2@|Eknj5jtzA8Uw)+A^j-g?Y`o^? zC0Yj1)*m-*s1SJ^%JK~!t!QE0bL!V=UyoDqAZg>P{N1LHY&j)l0*i9=wSFT!FZoReQy4>>jt~>9HaMKCD z?fl-oyB>q%UBYemLbzxJ9Qs$kQpSJbXHde{u_*+l@5F_w{9S!@IrOtXTlzMvj}r$@ zojzS&_EM~djQE#3`Rw>p50-s*|0gyzcy^XkC|Kwaf-8_8UPU>lmIj}}Jn$&;2A(*1 zhJ$2hd&`Y4zol$kzq*`z^4>Db`mP>ioz`SKv{;bO?s0dUBeF@$lrD!zkB!qlxPFor z5(3w@?`9A?{7ICeArwpxS#`=;0Xw$qp|bi_uPa^aFEs^SffA25!k3)r85Umtq5UJE zYmBB_YR7LP%l9>Qg>*5!5CRMqoqjfGT*vuqJ2+?UU^&GUcgljAioBcltHmzmK!%+> zaSY3xH&0xY8(Od2EMz*JPpyJ8q}Te9{-$y5pa)T>Gt4|Zx+deb!+bZ~JAb!qyEN7n zTAGk$Q7X%fjJNC-7A9#7MJ>4;bSd;@Sb{@tX_dqvzPjddG(7K1} z#)t*_$I%NIS>#hTP^ip!JWPKdeVJ*@pZHQBHXxDDsEUb3RR2cgr*d1|=#Nt= z5*^@7z?-#{Ds0Mhl{5QGQRUsi60n^m2@9_|sesWZOYc`nYfxXCE`#jU=vcGZ~ zH(Ew0vW8649%XFlWvfwHvn^Gn5+w{AETcF$MJ{eabseQvJgr|^C$+k%K&gWy-&odc z16t>TA5e(8n4T4m^&y-n8R^a2IM!?E9D%;^P|i@~!k9p~x=@{^6mJw^t)s-vw6=Lb z@l8IYOL)?#E@P^^X`Bg89CSJUeK@3u8FB(S{u?Egle?eQq0tR80cv{P%{Vn_|orweupgS_E;}3uQ z+QrU=-g26w7N)THt>s?6?o}vYB)%}pHgu*-)~#H_)X01}bK(?;p`otk!r@i@6pABT zPM(R~C+pU(EWmmeMKdtcVmyL0l?S|748x%Qyr_ntW!w z_IJY7FViPX^UL>km~nN6wf!@`Pn~%9zWm#;^z*6UYr|>dlyQZnzs#LDC2YTSnNI)Z zaoTY5y`3iGxADk$ZMf|+B~FqLb4s#-cr8jmp=|{ z?)YqIXqjJh-(CtV964Ghf9L-wbB}UB@mzN~$uTnf?|4hJiM5>hw=GWe-~7Bt$lG&R zQ9k_7-pEE0HXCqUi^}52xiKuUtIPUJhDzTsofk)GbYr!Q$+Bwe z73J;U_YbiYj+Uc4zg#BI9A#w9RcCZ~M^2n82M(U+vihNN`6i~-6V_R6y2@BMcScpU6i z`DI6-u98-!rElUZHB?lHQr~$EWrlBF;8CCa8W&OVtSKW|4Xy!^hf&SX!L`=F&i3rjHj#>GWIP*4%{Ru`U}oZAKxf zmc_^qyhCwoo^<*~HYa z7NKdT*2l5Vu(5;d4kylW*fZCmp#{(>cNE4j+@QhPwd=SQ1DU8t~IqrHS=tq;opjX-k!c z2<4CQ{3jmzscdPDk~eD|SAS56y4T-#61h>$1M21$g4sZro3D8F*B!fGjBJ} zXve5%Qf~6A)4(;4zyTQ2PPn1ylCSL~cIT2%{(|iHo^hhY~b3wo%RD7=SD`#s!P_g zH-imb421i!ERG#NM;o1q>m83?Kn`*pXSbTGra`r617)s36fnu`ymFFT)4kd_G$s)T zI+6y8gcj+E+zJB=$RE~exj6$Sa#toupU01EV1l}BTfJFQX}XkHGDLU;<*huY@=y#| z?0S;*IgkIz|6X49&i^UmS_!7fiq6WG(1xYUIDRizu8bRuOc{LYd?w7yBf|_gY`MRF z2`keYH~kWyc3R(c?f99Gc1j!4?6C0@K1G-yHKSx{g zQ&k*^fS(OZ>(IQT8S4+ERraR6wI+ZmTmXs-ItW@tn{{V4e1+rL!%vkj|JHlUcl`J- zN4yvR{LN6HbKBN3^z*;Cl$m>@uUh(g;TP-C-`&6SFU!gOyO=6o7n>1WJbwY9Cf|gB zc66>q$|V5E9|qjz9Gz?jcaC3w{mVjrJ^lEuGDAlmLk*@-7El6XWGp|0{6bz~NpxX9 zqN+~G;7_FB#d*$hQ|37>S4ZwlxsZ=jd(&7;9K3X1I92+dxw}kW{ssy~06+hwQX(Th z_dC97)Fws5pv)0BK-5moS6%RSeGOQ_+`KjaYY3n2iuYy^e-{`KonaTR_or(8TkdR6 zww2}1j?pvGQWhBQyUJf%CitFld~dt_cIWUq?pRlf?eW5z2LfEq_jUu;m5r=oW?o$&3~>JDnYLaFjQ?xDqsC>|;b=IUSl2Pv63Yvi0l(<8<+e2^t0=L7dB4DpuW zlit2gD{R!Mc`0My!9_+R-Uu_te0?XDXBFHi7Ye0t;<`BESDlKw3z+bs1($cRpzq?qOk~Dlyf` z8GsUs0#I>k?wy!@wDS3`sd=6S(~gwl3_<+jz)X;|Ae4ys6cj<#h2ZYybo36aIQ#DY zqq6pj8_U*PzRTi7f#ZcgL3r|#xqMHd<$F4r%kYeoj40v!rN0&Gd)v?N^wVD_?2KcW zt{o?F&_D6>U6*);z-THj;rh(@3C}daXgu3~`X?TSCqC&f4hc&?!!u68@tHs4`b$`* zF)W?$NyjXo@N}lrW&CHp^3k&ElOHOZH?5(gWne%*;*tSP)FH5C%O=07(7CfqrmQ1N z8;-KnI0^u|RF3#@lnC>Zr(WKR?T$_g70Tf(7Gtdlar%DnF#fDvm_Y%IB8!y%dc|vv;fHB;(f*9S^e!9|#NUWh zGcN27Tv3KO`|q;Lu3)&HTy$OonsalCl3khmy*^C3!h{b11~i?>=};sy-UNrQHJ@ebI=(A7XKuyMe6 z5D>qbS(!chNa;KLKv`Vjk|tymGY}MznJpB4l;186x>b?V1QV)8^qqE^Ds%Kh=C2Hc zCt{NU`MG&Qr()>!mv+$gxE2&L{}EY`Ls*!HJUWJdahnKFrvOz{Jx|xtdysDjGR{ui z-P>Cy_m$DERpr9k>w&%>2j$<7<5#s7;I5y<*M{mWmI{o4t&8=g_K~*1S|<8OyYT5octE)i4%Pt zVeYo=5C-vSZb3);2d&|C%GRlIQIU4!ZJEhgV>LxSLL38D_J;Nws10(hXb;h)%8+l941PHDk7 zrt4ovUdFdRsumsu=6ku)(~f8SWMtn>(+S2+4b0|2hD6Q|6> zur_SNQ=!to4Lj3|hjDxgC*K1Qe-aPBGmY<==klj{L<4K$8#nQ6=b?W(VI*wd{UzR} zNtlWM>3#Q=hySnlMI&%wEQv`&Jf30Vr-8-sLf~R!)9TWN(yy?wbJddK>KNOb0tQx~ z(XvaJ-T9Dx`WQLuJ?M$vA z4Edrw@!ZHUtis;7aLqLwO#>XK?-08L8S$NWcZXEwW zq{xh}C!j+-7&tEl(5aE`s#ByurcYa>eG3YrV$GTb5r>qnQ`%`7)G=1bS)=Rb+|4iWuhO)T&a@h*_Rq;_#H9sk3 zf9vTUmZ>UxC`7>G{jGTakOn4x29G37DgzBga#~t1PzEI^*r~{^4PuwVgAw}6h7ndvo2g`r&CT? z56TT;2VIFX2!CBZ`BiR1s=LZVQ3sB3gQuh~{bKY>-kL;SG0TO&ycGAEL!Y?O108LS z`b8rSe8k1s4lEmyA5@2)=qZ$SMja2Dr)5$;bwK7?Wst2*-p!F2J&bl-YX$mrxcrr2 z_*wZPpr-9H2r}!8a~%pr2pwi}*6&$xr*BbTvGg%&vQkA9f9M{{rLEDOF*6VcvavRd z&YLG$1QDmPII29x$R`-s=|R?%{l>e?tMB~fa@j3!ULvZ5m$?3-5+y=I@Tdv?1fvj7 zmvMb>$M-#5!Zck9J>R2(nn=dUZ_{Ra{qjAZ3D>-JZDljz7?x=>ongk!@AiAbG%Ulj zY<`C_)<{7sUb8IN{nY#a+wzw8{Ce5($~QfSPa>li|NN~{ zK>qS~Z0G08eZT#a)T=^Ke&z*jZJv7eoX8$6BQ#?-_;__CUkn7g*~zzP9xL6CRBuf5%DK*AE>V(K_*h)z9j{-CpSSFp#)z$%fi^3K7Ahu*7T zb_KuHb~*#EhioGaas{IPh5| z+Chw+xPuE%>A3No<$UiYK_~NehQrwxl9)S;HO zq^D(22M|%?I;Ceirw4;L{w1yPoJompoNwD+?L#VktFGr@p0?7YkLk!Jz5c?{0#_Bp zs-&op=&SdY24K2QU+<{jWd=hWT?#T;go%BUGIeHdQb!{32*uW*^>@X?R`FF(wbFt-WdBy2DZ@0AJaGb$xw)Nk?DWt<=Y zI2dnvSi(zxzx|mu)8|u|8830kuv#&d>5V50;~1Wd?RWb5)IZ^6eADXE-}LRD{+Xxg z6SirDnQ)Akc^Q`R^hhJv|%*t*;>fAbWr<3>p zb~0t+bgLIyPhv?>nYS}hxH;0%Im(HHPHokd#T^pF0%WHNgeBA4u;r8BOVY%e9KQSD z+j&N_r%#+@W73Jb$ldaTr`CrdtPl$N8FsA44I={Q3X-qh&;wH$zrU73g2(yOr!hdID zw8XpSduWI@WxL`xI6M^AJ(pG3K&xD6(gLJ{X`be(hq%=YY90+8B2~?<`s-nuT9}%~ z^meZJ2_iltR(+2Y$d>T;Pk7XbRk0z=&Mo|FnxPB3%chY}+i?jR`Q=6qHaa4|V%Cee zDuB*9%+T-26DnqkF9)IZgaP_QX3UIZXFkgyL|G#bX%(H}dy+fKm1j=(sgTGwtJsCV zlEcu4SbHDWti?ggbn1vgr|^6#lS4tFpLG47R>M#nAb_%5sfn4YTz2k@W#jBKpjZ0> z2i9Q~qn#KhEMJkYc-u#WCvlL+z^Zbdetzwt9efW(2Hn9r6Nd1TPR5t$r~|ay8ed%@^ab%CTuY(wBM;yhKiUP)x_k{>joYM) z%`3nnr}(LZC?}jgb`YadXW1>EH1Y6cufmna`kAK(cZ<7aRgSoUBb88+N{G;Hq+3oa z>sJ*)`7M|{%DSF9*>U>wpi`~3>QTn4eI>>VkcqNI9_U&0ek#hIgF3~)0n~}B9wJQW z6zm)oQ1c^hFH7dUCQkgt(=td8zpZO$Xgym{jj-|uGEFVd9Y(Y4IC0CmF*~u0bV0l@ z;gX-7>jFe`9z7KX34DPm0(9fIXTR1+#+8&_)*x4`ix&m`VYr z4Ma`dh5L@%*=bJ0(nN{kAhLux`f%qA#Vhy!{?C?k2X~bl-uWJccylEX1V}|j#<0Pp z;FMs7Bsee07#+6CysIC${05pG$FM$oud^0@55>7ij{c1y_L6P2fVP#n2-p0?c zjFa)&`L*Nf@3--M=KBk!H-5rQyxM*l=2P4fj&aql-GdidQcmGOb0**mBDHF%WuQu{35EL?uJAmN9rn|m1x1> zG*sKUf^iZalApV~*gX|fDs_}(=LIR?CFnxF@}@$1o{_tFIlzf>!ed|fcmHD<+50fo z=Jy7F>7O*P%rClcKLwI+=Q&Ma_b2{M+5P$7hxgzY7{zH?g|WQY&mhr(q>6{@jGgYV zc4J2%amMMaN42srAl<%+U6}Ce*qM>w1ZyX?L+a;Q&nF*waIRBbPT$ad(g`?# zMIOd66Y?M39&)cSU3y#r+F{ACLg{dnz;fvK=Y?gt<{j4BoM6aUIYSG6W++CrFgt7VccXHG5KTJ%tf3t zev(Qr-?KdCvE+xpG&EJDH*o~|tUjjegkRR4`eGTJ*jeW3OEiYr*~&+;BbD`2F`&@m z8Q2JqK2b%O0Yt^cTxtoFDJ;-~Pq7yA9(dD#IS}<^4Lfw7&O%5MXDk3i@~X_LRASQ! zxb~UK9aUY=)DxD9gYwt>>=#`^<4)YLN;{=TTezt_Qua-8uXXQD6cu>%u_`fcs;ciX`D)zH>t$^ z#gsJ+LB!RmTxsDHvhTvxg`B56DsNF&K{xAE+{hCg#8@aE;gr=YeS|N^#`LLl;#>J4 zUeZgYD9XdTbrCqo54K11G~9mxH=Xgt&uiCI7()?k%4t1GH;oy_b>`Hg%EU|zcT7E6 zE}7fUYykWK9D$0nKjDO4#Cs^`O^Ey=Z6}$T@+csk`5UZmWW9JR5nL7jgkfLn)4Y{` z<`a6C`j=@v*!PTMx{RaHZ>N)K+Ibo;{Y)23)#RV>)%txGmM(EOZN@R3F7xxd9qzm7+AuP% z=?u?j``t9lUFP|G@l){=hB%x*@K|{eW&Fhc#~FRl8P9Y0Dbx3^eF=*(@aZ$@?C3;U zknBB&Azk4Q)7vN=$$(%mWAGUD?aec;1Dt0-B434ou|W|zb}}L8Iyl>^HcA*CGda{n z@uM-p)Gi}o#6Uw}(1L|I7Uv>pXQUf(I{R6xs$~+Zx1%E0Pr-k=?`uEGJ zUH6pRfBgMreREEr@OQu_LUQd4wjMABSfR!v(VZF)^<*w zy=EWpIevrO7Bc{UbTAz@&2->6YvMcxE2f2jZzrvA1{JK1bmsVJS!t zOAk5kUhFSx)@>};+;%H#P0yC&J0HMuc!6UXj+OrDL*@MXzf&eUH`wr>L&*FBO~v*_ z*Zz+8CRDmzjJ5P0zDohp)<{iU-j{;(MRq^OwF6r*FXpry&T|q_TbaSdr;^B6S>G4) zBk$S(!z&;+-|hSiY?CVC)c6%zhDY+qI&y3R<)R9)ckbH?D(HG%ex%3yD9s8@)2o+$_Xq5#rM1)oZ9 zF(ZdCz$km|^ZLA$!9GV!9k41xfoDwVr%ZHq4GCF0ai;=_U;ED5Pi&ulrmUJgQ=aU* z1^!x(qM?z&{>i?>_58IDRPl>}a5FHLxGMJ2)ft&krg%4JWnT;$z(HljJtmf0dOP^a z!G(sPs_0qFM%D{A3_{Zjc;Kk!?*P4Zw1Kn6}kCC{q#R(T9E;AV|V z8(o~681dCN>XCDyuu@hBcIGKu*9hvYUuk0)xzzgRE$Br=X^?%N)!?x>vG*b3TUElN zFGDAC6Nc7KaT=UHS+1RVvuAZT zWnp@Xyh41@(R4E(J^&#LLtth(yd_&CJtH^$BsQ+KKIK%Pj#6wNAbQrq*8VykXVl87wVB@-KGEp(OGd zg3X4kbufeve?wuU-WQp#t7U;V$a~RIb%aB2o^kvEtwXbZ*R*`b$Ou@mh?^7c`)EA+ z*{Br^-3%%e{+@mhRhZ_Z;n0bnKeDI%`A>g$+4kCZlv{rIXUZ_QM@SQ0n`Z6z2z>F+ zUx@;>4r^53^EYw!Sb6ME|7|(;;K$35=U6o(V2EDp5rL*m3R%I^={Gm7IWSaSslek+ z91p>rWZe-{V_P-?i?c=#9AS4br|ctF?X-i_9FeR?7qI8SKJ?VE0@ef5iFVdPX z0`#U%l^r7=FC$$$%E=YCuv^~i?#u(nAK#Sk>B7QC!So7icm!0rRdcfyM8?sEgdiQn z1JrpTG}6~R!przLQ~DRc&7*w7qb_RLMN40{P z);`YmV%{oM@r89pU znQ5#OeIqJQX(0a5UO~Zt;Cr4b?ij90GsgKv}hMO`K#B#35$jP0=ie{bE?DNtbjnPw}-fr9v3b z;J4^6p+{YUM|r_@8U>DVK+s2JS=}H8BFHQGu-AUfiXlu(xBa5aUg8)a)!E8qKDPR3I)MHf?x_IVo~{SC1w;MUBi09qQ!X-aTGmyfulGWg}YeQ;rJrh0XY_E zYnhqkgv%*}xlnnAqb%78z};&4Oxl+|%60**`mgWr^uQnAwVRE_{$XK|S6> z>rQBw_#e9e&&ts!{-SKX;jQJW+y4Pa#@rAEx1z0(?6g5SD&MCr7?N`NOeaJ6lWBeG zOm7_h()ry^pK%ON|4g4S^*5ey{P}K}IA%JZ%i|{;h?`8>ro#GsI zjV+lDx-tDzOsYHhrKed~@3;3H%1d5i?)09fZRL3=he|cxgI2uM^?Q~7l#ApV%M(0y z0h=E2904ycQ?7dR50!OS-V}9U?nyu2Uv%F*1(FYaoVBt$EL=am}f-OMOGLVP2CqPX^^{kv3qu)n>B(5o=LT*l7nmMa^2oyVk1v&v{SN;OAY#(c&dTO(+6eaBcU*1uHL;zc0U2h3X!FKv zB1ir;(f`BVdxvX&m36=O?tOaC%w#gjq$eaH2?+@#3IQQV2?!`4qJj+&UteAk^jJ{A z*McHeD%d_`BpU?NVpGiE|biyWjV^*IK#iE4I80gxpN)*#H-|esV)HCr|ZJN5L*7qE!@tNagkx~~lbjnrzU`9r}WL7a#o_VedwsSG1*TuYH64Qt4Ao}7U5w+;KuoQ~K;(?M#sG~{$FT20l;M5csW6#tJN zo#Z;okE5G1C;(tAbj;Jfz;DRO9}QDwE*l<@ZOk0{GlT=ECui<=JIsmAHP|4phD@|Id5v>ushDa|K91qzyk$zUKFK z+x~7lXg*_Ge)rRUCyIn?5;}|~zWKY|w$HZz_MIoU>Am(l?e^Nw_?&L@kvEV5($;fL?2L-*gz3g4S*W^8XQv6-&*1JXz#>_Ax#_Ob~t#mzHJ z|4OU5B^VGck|tRJOub(hSv!wJvagIC-spgU$tcsG*Ik{qgoEZN%tS{Cq$ha^BcCIZ z7D=IRZZg|91gflwm@Qk|zSX|#^E2Ow8 zglSv&&<*IPaPp@($w+>2`tIPtLv`#p$B?1I203A&mtZz$t`cNAb))_|QIkVEiNg6U zI~Yw5z&~A_-KsogiVL`u0qb4e3v7;nr^Rpe-Xh9<=UHdgv!8PftBn`yz$5pe@69-< zZ#7KRJ>!@zxa!iZHimx9{C%~lb)X*HH(k>sJ8N$BPR{n+k}QCFncf1EzZ*@-cQ5CE z^0SY4XZeHiT7Ij2C4D!}9Cw!WMIPd7-fM31_j23$-n8QrJ|igNI*)i^8LZ}RLx%=j zjoK6KJUMG=`?k@3CvB!t_5E`D{ILDU0v#wnKK=8obl`I z6~13|S%Y(RKf1ys2E1lTle{QQ+E6Sd<6>m_TSt$YICPvrOAnDn7j`uI6!%V}Z>@5( zM=m(zyOFcA6z<#SmLxJ|GF`ysLMH##sjv)YmPCoEWA*$jTU2K*_pR^y_=CfS$Z_tsp(mvPx zcz}g%`9EnSjIPA?n%{laSCW zMdZL!sdebbFfLLHGrR2ksWgpVXYe9D{Mlmrt`2@Wot{;xVrU_htK_Cptj?K>bRD-A z(XqmtlrV!8zD%Q#nsnu!ig6L8jwEI9JW0xuHW0i_IYTI;clSc_<8&f`<~TZQcwDVF zd+@Q^`-KnIgJ1kRgo(_~(8<-mdTVXmd1ei7+EzpBHdg=08i?+mha77+xFR^{Wu<7c zMBqYZGNt-tXG!At@m`y08^#s4-~ojDEFX!i0#l;m7y=yZv4+E?@U= z+wz{zwEOb!_WNx(+OYY%-M{a(zuT7YyAwUc4Ls8vht`_qNGKJ^9FElF(V9Jeu*NtY z>cx$RpX{Qu?QE5~oPMFj_In>4fHH z1y!^z8fwi?N1!Yx5Js;Pt^y;^YZlSCmap!N@3bfvDZ$%A|A z?*I7PdITObqUu_EQmsDev>Ms8gDLTKoEN(SXL1N(Wsw2=)yZ#1kp)Y%|NrR^cryZx zGGaxz66(>9^F+jBoGm*uy1#mtScEZqxMn%VZI)xO#tt51lj4{UXEy^9&cWQ%*!j;fVj7Nihxza zx>N&$Zdn5B!$(meh((O7G?qV-wGQ|=oYKxC37JCSzG~KP-F_z7KX`Wv$8Tmv=a0Ma z{MKDN>*^Q(Fq``J)!uvVpiJQiJ1sP@q!fXmd46mb+2DD$acFT4I!6@K?m+d-9zESNP(0?<{}y?-=rqGn2TSUo215a zf@}!KXHjF>JwIA2x@OoDl(WXMWitzt;RE47JJYbn-1Zx%uO}x&Am{v(pX9f|?UOub z_6Md*#?GK4*%lp9+sQNVD}3XitmD(hO)XIqkJIQb8V+fiz{O;U4H}SG6KJ-vi@?AK zqz%fmfzB6f4j{D8Ieh`pw40v9V!)tHNss_kK&!v(JMyt|V)HmW*4n$^WR{YIL1t#>sa~!f(f7gL+7G^qF46|Ix0;;lQI35W#2y_8968iCieBeRDGmlW(+=m63=cy>h+#YobT^9! zmU$_=!B}ps z!?%ALWlH@9wL*P3u_9>+D=_-_k(xS8EVOn7)0(|Fwm27LA387+Jw#}ojBoG5`-78C z6*3@i+PRHLXQ7UBxcpwuI%dME*1P{54ifGU${9i+*zTC__7Td4`$Cy|?qwYFSQYm_ zT)`R2eeCh0^P+Dc(fYvgao`@qkgebh%0bSH>>FZ%1>zb#B(V7V6;h`r2FpQU&ome+sRnAZ(aqB zXb7V?!+TSVYXJw&lRR7%Y0ZWJF7h3!fjOB7B?bd_GmgF?V3^b~#KB_)Zja8-0D>wX z!JJ*dE1w{FIVHx$BJxHjiq}O$1{G5>I_(fs3(9)#w)5tw-@G`>|Q_nS?cIHZLLCCU~14*dREI>$SrH~ zPX`um1P zsWAHCy+xdc@v$+^1nsMl^_&(#c|<4sAs#t!7#)x`mJ2EGRjN)F-^vE`sjF$ zY#ijgP-!qnyOU!xlwr&yJMOkl6BEb5D+(VTa@=Fkx|eM23gDDCU8FUI{2yXbgi3ky z=JjlsGl(pasR!?7OlLEl&{Ic`P1GbtcH`C!wRJPj2x!>z$bMvVuD0)3Un|zF$RZo} zahx8Ts)G+42*0g6WnE}A!B`%D=n&5@abD$G?x8Hr*uonK1@N)W6InmJLpBZ`gr~tF z8RKc3$Zq!NlM+tL;U1y`*l-miYw3U+qBb?iI_(4plk@Q5d`{qC=a-rwKvj{=v$1i9 zF(c!$&n}Fw`f0W`m9f(mg?wDIX0(rYkfrff4|@pmF7?Ta-R!r*b!Gy12Gto9@f zGETrbhQ63$>URo9W1eeU&fH!vdHD-#+m_+lbJv$^apFjgz%a+)L;19G3f%T=LohLFOCD7=zGdYA9`wbzLRsUXRCMqV69qWN@?o*)cwrXG4Si={A##a_{?ln zAG%WfxaXW%M$cgn9l`hTFnVxi0v-o%?CFgMq*&dI6i`(SXW4fU{B?U4%|k z-#`H59i7T`^=l{iwD#0fuk<(Pp)Fdd`f0m|-42|hvl)w=tfguJr-oT)&uy>N=e@_^ z?-}$SwC{y36X<0#bndHbO?=9mkUQ}|Pc}H6(Tn@dsgJr1IB0Xp%rdsopteOoy1L436PmLGUlDoSYAXhd;!h3l6Nkbs?77I2~1O)C9W1+DFgm_5__{ z$N7$&_Jwxn!=q#2n}NZBI*x-nLA#qcx3(Xd+xy7jw7vPH^|fx(iiQr#FZ$SkUta|- zs8RT65`DIYY;G^Q%tS`VieY>d&us3my$?NBt%;>tf6`i}N)J=AG>xpG6QR>ucx26p z`xsL;B)_9Kj&TOP3&7OzmWi}*_$=XAN5zKhqAd^Coh85r%BQGKl9uPna z2$aSX=Y#gN9A>~`v_P`^BDoT_8-}C_7zlx<9fdF}u)@rZqUbear&5Bs=S`vWdx`IH z3>mfz)vJ<#DHl;D-8dYkqjfX~U_NLAJfd5#pZokQpa2BRHuT)hV5&rQbQgn6uF;Oj zbcgmu1(kl?2z3!6xap@}_^ew^fD@;QobO*!ctBSV|I11)j0l*eBbfogCL3U;%zL&c zu4Qn#hsZ>>2$gkBQDndg^nB;2DipF2ig+?w>7uY*&#fEbv52`vRIG#D0c~7#I}Kbi zd9&*+eRFLAhVpmLpX8F+6sHwjb?deQP27PiZ6qSdz{dmpiJ1Md%vj+#-=>?K=jdDZ?%#I);^bK;vA26#xvj-9aDXnZ@5mNP-nHCRDCA%k+ z&U6>iX$QQeFr^C_X0zcNrUHj zf6=Th*S%&imnl>61a!k#g~G1 z=qmyj>3*E!<0f&|T{+1B_(2!)j%RUpAdBv8d7QJSkMLdxnLC4{lTO}J&wR-XaEdq8 z!@F;->Cwk(CA!GWdGr;KNe44B>JX=r5zI?7@+lPSAtX2p(rAJz)UDr7q5UX5^7?c?r1Y zH8k)`CwngT(dPh$W{&S;I6Y=&lAS>|JXbYAJlC3xplDLJ0xK{Wi~&OEqyd!h>QS#7 zrYUPY2uA2nEXdS+<005mQ$HB1$ z@Hy>4xd*3io(vTd$l658pzM#2a<5(J#z|`LZyPxQmM+Gu4X~I>=TE*)u*jb}b;^F^ zpO!V)Tt)VQ4;$CJaxg*5G|sd}e1Sk25&#eSgHC%0D6;P!@4%SAEq>7<;71Qa`{0;b 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

l$L7MGh4Hq45 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�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

sUk1 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%0Di}qw7-da*0$V^<>*)wZItm6 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

!p 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

M@J`)*@`h`wZ8nGM-vkfx(G=J;%kJd{pn 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index 75a26d984..d55ecc75b 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -180,6 +180,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_BOXBLUR: cell.textLabel.text = @"Box blur"; break; case GPUIMAGE_GAUSSIAN_SELECTIVE: cell.textLabel.text = @"Gaussian selective blur"; break; case GPUIMAGE_GAUSSIAN_POSITION: cell.textLabel.text = @"Gaussian (centered)"; break; + case GPUIMAGE_IOSBLUR: cell.textLabel.text = @"iOS 7 blur"; break; case GPUIMAGE_UIELEMENT: cell.textLabel.text = @"UI element"; break; case GPUIMAGE_CUSTOM: cell.textLabel.text = @"Custom"; break; case GPUIMAGE_FILECONFIG: cell.textLabel.text = @"Filter Chain"; break; diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 3ae93382a..00966e61d 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -75,6 +75,7 @@ typedef enum { GPUIMAGE_BILATERAL, GPUIMAGE_MOTIONBLUR, GPUIMAGE_ZOOMBLUR, + GPUIMAGE_IOSBLUR, GPUIMAGE_SWIRL, GPUIMAGE_BULGE, GPUIMAGE_PINCH, diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index a150c998a..57337e1f5 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1195,6 +1195,13 @@ - (void)setupFilter; filter = [[GPUImageZoomBlurFilter alloc] init]; }; break; + case GPUIMAGE_IOSBLUR: + { + self.title = @"iOS 7 Blur"; + self.filterSettingsSlider.hidden = YES; + + filter = [[GPUImageiOSBlurFilter alloc] init]; + }; break; case GPUIMAGE_UIELEMENT: { self.title = @"UI Element"; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 237fc1f20..3b160284b 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -126,6 +126,8 @@ BC7CC69D1562C4BB00468085 /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */; }; BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; }; BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; + BC8A583C1813060F00E6B507 /* GPUImageiOSBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8A583A1813060F00E6B507 /* GPUImageiOSBlurFilter.h */; }; + BC8A583D1813060F00E6B507 /* GPUImageiOSBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8A583B1813060F00E6B507 /* GPUImageiOSBlurFilter.m */; }; BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; }; BC95C4091622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */; }; BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; @@ -472,6 +474,8 @@ BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageCrosshairGenerator.m; path = Source/GPUImageCrosshairGenerator.m; sourceTree = SOURCE_ROOT; }; BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageStillCamera.h; path = Source/GPUImageStillCamera.h; sourceTree = SOURCE_ROOT; }; BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStillCamera.m; path = Source/GPUImageStillCamera.m; sourceTree = SOURCE_ROOT; }; + BC8A583A1813060F00E6B507 /* GPUImageiOSBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageiOSBlurFilter.h; path = Source/GPUImageiOSBlurFilter.h; sourceTree = SOURCE_ROOT; }; + BC8A583B1813060F00E6B507 /* GPUImageiOSBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageiOSBlurFilter.m; path = Source/GPUImageiOSBlurFilter.m; sourceTree = SOURCE_ROOT; }; BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHoughTransformLineDetector.h; path = Source/GPUImageHoughTransformLineDetector.h; sourceTree = SOURCE_ROOT; }; BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHoughTransformLineDetector.m; path = Source/GPUImageHoughTransformLineDetector.m; sourceTree = SOURCE_ROOT; }; BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; @@ -1087,6 +1091,8 @@ BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */, BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */, BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */, + BC8A583A1813060F00E6B507 /* GPUImageiOSBlurFilter.h */, + BC8A583B1813060F00E6B507 /* GPUImageiOSBlurFilter.m */, ); name = "Image processing"; sourceTree = ""; @@ -1176,6 +1182,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + BC8A583C1813060F00E6B507 /* GPUImageiOSBlurFilter.h in Headers */, BCF866C8172589A500912E34 /* GPUImage.h in Headers */, BC245DCA14DDBED7009FE7EB /* GPUImageFilter.h in Headers */, BCB5E75C14E2086300701302 /* GPUImageView.h in Headers */, @@ -1552,6 +1559,7 @@ BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */, BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */, BC0690D1157C2EBA009274F9 /* GPUImageRGBDilationFilter.m in Sources */, + BC8A583D1813060F00E6B507 /* GPUImageiOSBlurFilter.m in Sources */, BC0690D6157C31C9009274F9 /* GPUImageRGBErosionFilter.m in Sources */, BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */, BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */, diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index e419ac5bd..77ddd8615 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -150,4 +150,5 @@ #import "GPUImagePoissonBlendFilter.h" #import "GPUImageMotionBlurFilter.h" #import "GPUImageZoomBlurFilter.h" -#import "GPUImageLaplacianFilter.h" \ No newline at end of file +#import "GPUImageLaplacianFilter.h" +#import "GPUImageiOSBlurFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index faaee993e..c6bf5af00 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -159,7 +159,6 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; } } - - (CGSize)maximumOutputSize; { // I'm temporarily disabling adjustments for smaller output sizes until I figure out how to make this work better diff --git a/framework/Source/GPUImageiOSBlurFilter.h b/framework/Source/GPUImageiOSBlurFilter.h new file mode 100644 index 000000000..1fccbe06b --- /dev/null +++ b/framework/Source/GPUImageiOSBlurFilter.h @@ -0,0 +1,26 @@ +#import "GPUImageFilterGroup.h" + +@class GPUImageSaturationFilter; +@class GPUImageGaussianBlurFilter; +@class GPUImageGammaFilter; + +@interface GPUImageiOSBlurFilter : GPUImageFilterGroup +{ + GPUImageSaturationFilter *saturationFilter; + GPUImageGaussianBlurFilter *blurFilter; + GPUImageGammaFilter *gammaFilter; +} + +/** A radius in pixels to use for the blur, with a default of 2.0. This adjusts the sigma variable in the Gaussian distribution function. + */ +@property (readwrite, nonatomic) CGFloat blurRadiusInPixels; + +/** Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 1.0 as the normal level + */ +@property (readwrite, nonatomic) CGFloat saturation; + +/** The degree to which to downsample, then upsample the incoming image to minimize computations within the Gaussian blur, default of 2.0 + */ +@property (readwrite, nonatomic) CGFloat downsampling; + +@end diff --git a/framework/Source/GPUImageiOSBlurFilter.m b/framework/Source/GPUImageiOSBlurFilter.m new file mode 100644 index 000000000..652032416 --- /dev/null +++ b/framework/Source/GPUImageiOSBlurFilter.m @@ -0,0 +1,89 @@ +#import "GPUImageiOSBlurFilter.h" +#import "GPUImageSaturationFilter.h" +#import "GPUImageGaussianBlurFilter.h" +#import "GPUImageGammaFilter.h" + +@implementation GPUImageiOSBlurFilter + +@synthesize blurRadiusInPixels; +@synthesize saturation; +@synthesize downsampling = _downsampling; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + // First pass: downsample and desaturate + saturationFilter = [[GPUImageSaturationFilter alloc] init]; + [self addFilter:saturationFilter]; + + // Second pass: apply a strong Gaussian blur + blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; + [self addFilter:blurFilter]; + + // Third pass: upsample and adjust gamma + gammaFilter = [[GPUImageGammaFilter alloc] init]; + [self addFilter:gammaFilter]; + + [saturationFilter addTarget:blurFilter]; + [blurFilter addTarget:gammaFilter]; + + self.initialFilters = [NSArray arrayWithObject:saturationFilter]; + // self.terminalFilter = nonMaximumSuppressionFilter; + self.terminalFilter = gammaFilter; + + self.blurRadiusInPixels = 24.0; + self.saturation = 0.6; + self.downsampling = 2.0; + + return self; +} + +- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; +{ + if (_downsampling > 1.0) + { + CGSize rotatedSize = [saturationFilter rotatedSize:newSize forIndex:textureIndex]; + + [saturationFilter forceProcessingAtSize:CGSizeMake(rotatedSize.width / _downsampling, rotatedSize.height / _downsampling)]; + [gammaFilter forceProcessingAtSize:rotatedSize]; + } + + [super setInputSize:newSize atIndex:textureIndex]; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setBlurRadiusInPixels:(CGFloat)newValue; +{ + blurFilter.blurRadiusInPixels = newValue; +} + +- (CGFloat)blurRadiusInPixels; +{ + return blurFilter.blurRadiusInPixels; +} + +- (void)setSaturation:(CGFloat)newValue; +{ + saturationFilter.saturation = newValue; +} + +- (CGFloat)saturation; +{ + return saturationFilter.saturation; +} + +- (void)setDownsampling:(CGFloat)newValue; +{ + _downsampling = newValue; +} + +@end From 21aeb1bbe66f7f70e9455846c5227195c2953775 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 19 Oct 2013 16:50:34 -0500 Subject: [PATCH 473/695] Adjusted the color for the iOS 7 blur filter to match the color correction seen in the control panel. Added a better example of this to the FilterShowcase. Cleaned up after a few of my tests. --- .../project.pbxproj | 4 - .../FeatureExtractionAppDelegate.m | 9 --- .../FeatureExtractionTest/iOSHomeScreen.png | Bin 1120041 -> 0 bytes .../ShowcaseFilterViewController.m | 14 ++++ framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ framework/Source/GPUImage.h | 3 +- .../Source/GPUImageLuminanceRangeFilter.h | 12 +++ .../Source/GPUImageLuminanceRangeFilter.m | 76 ++++++++++++++++++ framework/Source/GPUImageiOSBlurFilter.h | 4 +- framework/Source/GPUImageiOSBlurFilter.m | 37 ++++++--- 10 files changed, 140 insertions(+), 27 deletions(-) delete mode 100644 examples/iOS/FeatureExtractionTest/FeatureExtractionTest/iOSHomeScreen.png create mode 100644 framework/Source/GPUImageLuminanceRangeFilter.h create mode 100644 framework/Source/GPUImageLuminanceRangeFilter.m diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index 48e153c27..d2dbc1af8 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -22,7 +22,6 @@ BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC46D52315D03D9C00CC63CA /* LBPTest.png */; }; BC8A581C1810782200E6B507 /* GaussianTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8A581B1810782200E6B507 /* GaussianTest.png */; }; BC8A58211810862F00E6B507 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC8A58201810862F00E6B507 /* CoreImage.framework */; }; - BC8A584018130DCD00E6B507 /* iOSHomeScreen.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8A583F18130DCD00E6B507 /* iOSHomeScreen.png */; }; BCA464C9162785EA00C0F68E /* LineTest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCA464C8162785EA00C0F68E /* LineTest.png */; }; BCB3C3F916BCA61A003D26B0 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F416BCA61A003D26B0 /* Icon-72.png */; }; BCB3C3FA16BCA61A003D26B0 /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */; }; @@ -80,7 +79,6 @@ BC46D52315D03D9C00CC63CA /* LBPTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LBPTest.png; sourceTree = ""; }; BC8A581B1810782200E6B507 /* GaussianTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = GaussianTest.png; sourceTree = ""; }; BC8A58201810862F00E6B507 /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; - BC8A583F18130DCD00E6B507 /* iOSHomeScreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iOSHomeScreen.png; sourceTree = ""; }; BCA464C8162785EA00C0F68E /* LineTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest.png; sourceTree = ""; }; BCB3C3F416BCA61A003D26B0 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "../../SharedIcons/Icon-72.png"; sourceTree = ""; }; BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72@2x.png"; path = "../../SharedIcons/Icon-72@2x.png"; sourceTree = ""; }; @@ -160,7 +158,6 @@ BC18E0A1156C822E00AB8026 /* Supporting Files */ = { isa = PBXGroup; children = ( - BC8A583F18130DCD00E6B507 /* iOSHomeScreen.png */, BC8A581B1810782200E6B507 /* GaussianTest.png */, BCB3C3F416BCA61A003D26B0 /* Icon-72.png */, BCB3C3F516BCA61A003D26B0 /* Icon-72@2x.png */, @@ -266,7 +263,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BC8A584018130DCD00E6B507 /* iOSHomeScreen.png in Resources */, BC18E0A5156C822E00AB8026 /* InfoPlist.strings in Resources */, BC18E0CC156C881700AB8026 /* 71yih.png in Resources */, BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */, diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index 65ec66cc7..ee3437ef6 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -106,15 +106,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( NSLog(@"Luminosity: %f", luminosity); }]; - // Testing iOS blur - UIImage *iOSBlurInput = [UIImage imageNamed:@"iOSHomeScreen.png"]; - GPUImagePicture *iOSBlurImage = [[GPUImagePicture alloc] initWithImage:iOSBlurInput]; - GPUImageiOSBlurFilter *iOSBlur = [[GPUImageiOSBlurFilter alloc] init]; - [iOSBlurImage addTarget:iOSBlur]; - [iOSBlurImage processImage]; - UIImage *iOSBlurOutput = [iOSBlur imageFromCurrentlyProcessedOutput]; - [self saveImage:iOSBlurOutput fileName:@"iOSBlur-GPUImage.png"]; - // Testing Gaussian blur UIImage *gaussianBlurInput = [UIImage imageNamed:@"GaussianTest.png"]; GPUImagePicture *gaussianImage = [[GPUImagePicture alloc] initWithImage:gaussianBlurInput]; diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/iOSHomeScreen.png b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/iOSHomeScreen.png deleted file mode 100644 index 25be047dca624482e48c8dc777d00814e6fc715f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1120041 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�@|DX7+c;@h?gvES)v5n6P|_he3L_w<5uo@t+Hn z6_(slMR^UXM#F&T-rro6?TWib+);=)?RD5A^8Qw)khxQYi~Bicolm?=z=Oii&9Ug0 zQ}~CM_YH6agXX}Gmx|_Rp2=UYBdeD^&sjvv1N zm9dlQWj7Ew?P$P6A^z)xY}6o(QISHKoHo{}(fNvRyVcaBF?&bnd!PXI2&gar3f1ySPrE#a-ocggdkkZg-@RJMt zNgQ~$f7j8tgUkR%9CX?SjAfmnPFDkg@c>Y1rXJ{Ibnrtw4QM@@;rCsVMtN87d>w%P z46p0H|0M~MU!}$T?2h==x!)Q-MlX&c2=G8vj2~^(S;8>9>I5xjW(;OCc&F{%n11rw z{JUQz%%GSVBH>eC7FbNJ9Ez*!(WF~0=%;TpU#UX?V!aby`z~z6_15b% z&{PKs4Gn^{UlfMA(owtV>%Ny|4GzW6pxofxz~k5F{L`*t&B@g<%0SYq1Z?HeGHa-Y z*8?8&tPIc`WGHutQ0j%tMuvl?Md&xYgd#J0yeD3%Hw8B3!GVf$l7SoFrHl9&V5YFp zzJYZH4A9y0_|z2#5vjM7^WA&e9T61w#B-%gkt^uqWA15#q&W=8zB7Xg|1uy#zJw2uTR(Qc!JqWM>R-M9JkSrg zbB87i_~!`v4ergX8|-O!oh9+*y|nC9y6KXi#$7l6ChJZSEbaS{$B`xFcW&Xk`ss$F zRji+V$P-VF)%YzIb;WJJ_!*}v%p?zTBaO7=r5y8?vXV>yHuZH#2YElby2#yD0zhYu zY+qe-upn<2m~HVYN6(bZ+HR~>Gt;{9nhT;mw>9}@hE@6rr|Yn{GM(wQJJZ2s(+mSl z@Eax}X18vH;w$_Dui0&zv;63EIkPeK03IImyjR6RWJACGiTA|qzrH$UQrZc-vxv^% zq;H|DGA6H*uFyPng?q|^zfb({FFNLbzW)8g|7CZI-6*!!VB4Q=u32 z2mU^O_p67oKy*{CB~*RKr#8e3-uF4yY21Ik20K2V{{FM#?@v2A28#%~#)n>z%!{ob+RYOjNsVmO+G>z5{jY$JEj zAuQ4W{mggks$A{}RskGQsrW7yl}GNBl*#v!`J27>_SpNV$1@%L)VTHXAH^}Jy@d@F zN5}O){W{a6w-jLjF4qR7b8rft_H1`h(O@AUc9_!PUmSuXPy-&PVZg7>y0RLu&~*m- zeTFO=CYK)dsb3|d;Z(pZ>3`+MKo{DftRh&~;61H3LT={G1>a@ScOsoM5r2R1+ki$ZD-G0@ zTnFhVt-tl)lbNT?n8Gk``#2pVA9QYtfdQxi9mGm_724L5ECuw>F5oBOF8ap zbcKNKQZ{-_n^j%&mD5$iA|BA4GC6H)8)hcRs?2gk3_xa3?xrQDh&;P64`K#xcP~Pj z?7Kifwt@xDC|?O26=d31#kBjlLFW#6kBT;i?Nh_|YUAON+z*er! zH@n;b8X+4_!|5z7KfJ_koDuH=YY@$Le(&RNjpJYOme_XJ@8a^WeLivb2q_Kb?gt*i z2-yr<#8v`8*MjZNw32IU7w-Kn%ODBMZwtoGCv*NBRzMt7BX(dmcQZryQD6y77c1K4+=qHhlMs!mn@`m2+nzA2mP2CbQ2vzDPTu7JRcIixnN&9m?0PT0xLQOJmV})ammp# z8I^`pgvdZ+w5*YI(~vf-N2X*z8!l<+keO4}}qSYSZ1Pbzv8^ipze0?QP7Fx0fVJt^E_&&7HbbUJaN74iXUek6`n`)QiMS)-Ql6}fK{thg)-Q$$kah10|NOUX_+Tv?+0UHDr>)$HPF4$$Qr=L>419a6m2p-IuBOb{p8?VTdl$fi z)Bn>eZH`$tX4G2XGw6G?5%P~c?gG1Z$*kOS|L*G8bloL!$=|(;b+dCC|Mbi4E<3^T zS+0vc;`wKgz&UmoD0dS8q6N7gbd)kMMiY(C)wa|4L8!@<(yMVdB4-JB~C%@)xan2{-1_O-4z(+S5_mLL(WFyR-N({QYB@Y`Pk+#Tvfn!}z7R^|Eu=(ZrMl#^R<6z7A23^*Y~ zZb?`1F&Zsi8W#hX%(!5Loc8s*+x;6Jy+WA;lD={vfg$`IYr$^0n2jy~?`VjKCJued zY4NC6ydx%Yg#Y$(RJ#7a!}4|LlV22%f93n)qW|+Far*_|B(P#_<@S5x+`l-L07Yj@ zC_~_q(?C530=ft~2M(xdrN{dO(ZNn&QlV!ecIZ=X9T0{!ymba_WX@FC7)W2)WgOm(1vZ3`21U$`gD92G4Lz zx|HTv7O>2Y>&-EWd_V+#P@Y`?iB)z69vXgR2EP7=4BxFdNi#WH3FOQs+OAXC%IYD^ z1Pre&1adm0d5@XE1K#$Fi{jhwyO#E6VtJOS5fC)1qQl?w(4&UcVw%kzr+(t%4E}~U zXUVL8^*t|(&B%Pqs!D&(haov_Xs{!n+Hhd*&xjAsM`?7H-KXw8=Fy14J4@R%3B ziMrKzz$2d#H{S9$DXZ3*ShGG3T**=z{4J1q8D92fVC9-pZG-2MmJkp*gU)7#l@9}v zlA#ng@A<6AuW~594hqbjDWhp;aIRg>GgOY0ncVHD{Q+0$CU3QU+BeJiGJ`)L3FFcO z0|a+&4hY8RlFwxK32b`En)Cv6`gDqz%&!AB05$t(He-(UZ|oF&8LafxOu=4**woTtBT&``Pzf zuDTc+_K@p`#QHt=&2_8(g4F>>KZ&)etC`W*8o#~thv*dnFIiQ%1N}@e5G+GK1P zH~%7TyW%Gd!U))rr&}-kL44znF92q;+1L?}-|0Fv56wim$xi51tYd>I1c|=}Mv@cs zqip3GT!^!Vb$R*Q!~iRg-3{zDv+-77L{`c0zx=Pi%vAi2_{w`HYyxd(z>SPG6mVZ$uABV-%O(8MAC|y>f?8qJ-^nLg#U(8b&^C|(e%yck zcwG9a)3E{gRdySTlfHN_)>%IExo;>HR{p-|(<{rnR=!_z_UGgLGvA9HV4wl5wfn{z z`Xl+`Y@vr$`xBg%IrSHvw}YH2#ZaldnaRK?KvODG21dFTrc8%u7FF^}9L$2||IFpC zH5ZTfNPjy*cEtUkxelP7iY~_u0{3T~(0}II|IsI<(C8=?TG#IVXD;j6pJP$~?#G&j z>wfrEl-E=#bb(aT!_OL5)2qL|=vy4Ia-1CGc`^11zDg*aRL%@w!NJW02Os;i41RB7 z*U!#vTQUoxA-?g#Zv)~W4mGiU~XzdZYM@!bzFvc)(8P~tmWd|P#t4=j#84W4o_H^yDT$tf3l z&$KjIA^cMcw6GiGYHZ5%BUHfgI|>({**O+{GxE>k5JLl17woBIv^b|HSB536_IH%@u$r{k3O{R1iS)fuGdIOrmsMJfOero$-TYe+r>e#NP- z;Lo!R1`S#PJA)KH7^tc^HYo2)!{Em=>ExhjczjAud0KgRsZ;Pq;|>{khXTljnGQ#* zDIWr~@=Cpf4mu4i18@}CDZx|;`qFS9XC9rAMv;bv!K{b@nmXoaQyF$GOs*k?@~V)F zi?uy%{zW(pEf zFV(I(`^$0BSs#xpzV>O>+s)9law^)Dcf`~Rja%e#4h6Y-o z)9I7*ec!LnZkel&+V52Y zC;cl~mH~8K<;m2QL601dg#i~1^@;cp?+J1u2(?q?zGvYk)O05U7#+HdW3ACJ5Bhi!5DNRpcKzB z_&n=5vIrf0(l-l6bSkY`6?^K!$OfIu*V?I3GD}XUSto0)tMcLWo8xi}{&Q5YRM~Fd zH(k zLnJ_A-%tat=y~qT6tL-Y8Cc`!qu%H%DJZ^`k<^=_H42}B7?D1itB0b~2)*rKkb3$2 zWG)wY08aW&_@2k1uMuJ&!z+x)FQyLnC}<+zP1d~V>ehhhYs{z)nq0?Ba6 zz|h0Uibt|A#NSN0+OdwIjB34*$d9TKsbmGVf9W9s;(G+T zM(~bOXHC3n{IczWhQ>a81Ue~{*4>zrkE}t<@P{9`oT~1iZzfsjzkcqb&|Um1mpb%g zEHsD#qb>d;8n0ynu70$(R$~(*2W@m3f<*1T7ZlBO9JfVfHJhN-(6x)z0+un@_l|@$oOdPqC5iEvFr) zW`g&1r00mw-OBJN)9a71(sIMCb}H*{@jU9HpH`;tU6n;T&wbfz)23OHdwzE*o2Bou zu8%l(;HvJuhaL#3)d%WNjzhsu;#~e$5X@33ze++* z3gHG%1~Q9b_Dz0h=kGwyFyv*}oOd#HeAa<$1IK;b(++P=@jlGnXx7KcA7-p%P#5Z0 zQqs--hGqesmaV}BSVE?f<)UFw51csgIH*0n?5@y*1IX_NLkg6EdLJb;~Y`WzfdRPWtI^n+X*+-ml$JugRm$$eam? zS_T3w!BYpN1>3yjK-yQ?`MH1Hpf-8#i&-G}{&L&7-;G|3W38T{KUek2w>{F%Oe*x+ z<6Xy;r|~p#3q%TBv*~R z8y}^$Ql5$4|N8?DFTXnJc=jN?BIh|D_%B~C^1IHxfz7>qf7WN;S!StG6i-Qvuw9o^ zr|$9C#0;6ce<%miI+@jVqk7^W3?{uk@w@-Ge^+}`9aH@RPX?1eEW?>})i&@tM&Gr& z&FuK$F}Z68Mj7jDna8Z*ZvXJ*1eAXbQV&V^&DY--9X<-Lc0sRhcHEd|_DcuS1diM1 z>D&0vq>Huy4Fr$yrAEoAUN3L9Al9hKulSjVnIb|FD{u&eap@Ve>j5GLqYI|E`7Yb_4xDE8&Q^y-}5(}x;3*T{%Ta7 zZu39yG5R;sPUH)2vRHueN-c3Cd>R9dj}X^iDldt{Fue+n%l2+L_j_!O@xy$+^TJch zNryhaT>sN!%POV?-OI{roTC1vH~+3&bK;lE50BWrTz6i*|DLPP;@R&-;Ym30X1^+6 zje?GqM#Fv@`13dK^|R4g3_38Iy%bgvVkXcFaD#itQL)cEeT3$Gmw*8r)TxN-JlmIj z>qya4Xr;IrXxVDAKfq|TFD|@%^Es8C^mL1zPK;zo&X3BS_X@fh91WXOZBh7q3FsNS z_tl4VV&oa82VGQw{NWhezdY%fRqRpnd>b49UosNFAuJVVz-hJxg7P!>Ii;*41-sL) z2a>P5fY0oOPDGAo!s)b*DOn+&pTFrAlNgGV159R{m)&rA`TZHkmur7^3^k;0!vNjKJ#4o6_=Dw&?|q0>nfC>x1x!6{ z{OrGHB^~%v|L6oETgvLr2Odf0a9-}a@r-}xYn^5s253Sz-WCU5!y&^7I1qEwS2Mu#!oNL*m0NKdFy3o z;UwYQRJO@?!dox-$K4jxSGHaGNtp9DgNl)a$)$<4fxhxv=sgz@@u-==EFMvokP(rB z{}&+;Px6w1R`}n5LtaA<`fji#40(oey0TH{Mdv-Ww%l*VQJRda!_4{uo3iWFtTst| zVL!qd-eZgw{LA0{>>=lLsx-@jDV;!IllPPv`A-?s_)1SN$1RULEoMJ{Z;iHi^s_hs zTksd{0-rbwt)Y7(Lz9O1-{{~#x#P+Uku!sY>RfxSYHwdpjyu(%);Tk?uI-qiPcu{o z%Cd~SYS1>qw7445GmEVU-wfxdXa4&1UkR$7dB)B!p%#uQZQvI!NgyAJ>zw`ooz2wy zodj|$30`PI`BedB7K=9LvE|ZXKf0!D_2O5TThIPpIr)(1lv59XUisPEwvPiL&2~NX z6Xp4D{%B-G3mUt_7-Mtjvxm&)({|jWyz=M^;`}{!_w_8|dmZ|DZD3+zDS?7@vu0pd zJaAw6#v!|xpM30XaR4tl_Mgj1N9@J-i<8vZ`yanp9$tJ?IrG?$GqR?#-}^ov=kMf? z9$t=m+2-Z@?>(SAW2YCC13vj}_z^mRKuaBz$zc}E$mNb#+{k+wGs%pKL4N#izQn0C zSFg*fPQ%w7B=mv>yod&y_|T+=H=vfY+1hd#?8vf@7n7L zqna(h`R+%`5cU4*<8k_vC&h^w{dNLw`B&#s-iQqWmiT#mhl8khDjF4D1de}-f>#WP zzpFrLILoXdk}HPq`Q5L|&TL@(x32rIzdQ!Z2*RnTyV>gH?+WSp@((GiGagwtMND(|tEZwMSj;ia*_} zyyg4G|2Ew6Ic$mX>@0RrLAr@>Cuv)Y^w%i{g`eMa9Ay?%CA1`a`Dk`D+e8aarwJ9e1O9FyE&zWLQ}5C+1%Mnog@6oO7QnIhTiDG zYypGLJ## zDjG=7@ii-2YpiIOjFAqqjk0@A)cjPXT@4SXC6z7^Wad!CKQufD zz55u4(?{S=UJw*$&_W7F1ut*PZyGV3bDc={C^RGO7_1}l<$iHI#>S+Ko9E`C(5015 zeG7c%bdfxu0TnlDFISi6vc$+=9t_toOS2cNdiBzwZ5Z!&Vbpmln3%@Hh87)j1LG*5Z1Jw|lNW7w(g?CNh8ed!?U>Xh$c2uc z2GR^%vYp`2g&b%wWCPldkRhcHWvGr>OxNp|Cx4szM9v?kZS{Uu6LXB8dd|(+eYt&! z`&GJ=!Wgi3GnRJnGtS@E$PG}RXaL{Q#(k)VXY9N?3nVuHzM8#skJ>4Y_3R`YxYcg2 zD2so0A?<-zHnCAxyOFhhs}IdoM}PCXqUg3ajZzkAk^8{=uJ8B+iHJ?gofn=`uK)2D za$g*5q~qZmE-ot{Sz2E6<#Wqcd%dAt@o%4tE;rD1_F)`ntE*>z*@Y8Cw#JruUhU1l zIHue|@IJHM<%hD&kWnL&d79ULjU&;R-wvfo}# z{q$itMP!00f7@0%hmW(5U=lF&!>!i!dv>$6(*}*+Bd_Q@Hx@Bs zoAg9AP+UCJNFf_B`B^tb!zBPl&?4Wdq03G@mICqWMAV1>{Qr{_bpQ4z$ED3iJ6D`^ z46Cy&)c@<(B+PTePmYgrrgIEtbGhl~-@x$y?f$Mi`553v5D<6~cI%nn#@QME>z(n7 zaNc;zu^Dfbq}g)QFTRBlIf7_sw;){{Xrwhv{{7T#pU|ADuLWI_StOM+)7dHy}$ki8|2=Pl9AXOQ% zGMzP6_Wt1U+a%WGG;Mzk_V~>^RM$#Q<@m z_c{$Fj-|1N#tYD5D0QZ)fu#?=vme`)4}?G244#R@2=I%z3K||fR?B7g}c!_gko6u>i z7adUc`_Q-I{7Lsk$o97ndtn)1VThm2TC0@2M7{m$NOaF%k1;S-?y*f*p*poKpQ$uQ zhB+yP>`~~&_>%*Y-5E z(zI^WC!KTDOtH$(`c| zpV47+bLU|)K#j}qZGU294f~A3*IXNHwpH1D+a1d;`&DOk4Xfan-F{tgoIy1n_T52p zg(u~Od;x!gzt9z0OCQjfdy<*p8TGy2+jn(z;V5*NGHSLWfkb#)ol}FSx~QRUwIXfg ztt{^1ce8K?r`7SoxMA1_*0Oi!;MxRC8Yy*+&-wC_=HgvG5I}WX2dDLjV`be11gBF`= zdwa^3yX;*{mFRET9XCWb@F#)HWpQ}gIQDCs-CtR{a0b-_I^Jey)hp8009W32{KD=% zPWdUz28YRfLWfN``pxUE%YdK0#bA0LDOO{ocX#q$!Tiq#|0p|rV_!vP%2Mq6wb`Z{LylKqWxf=sey;x}*rfw&i( zKfC_&w|{oqfB53R^2`$&khg#*JdG~zCRkOD)JF1Pj$b|U&7%z+ zrugPam6S?-3&ol0d`RFV}N?gec`f8Sl$q&j`%EcItbQh*Q1~0&!n{UKRVkW^f9$~}<#f;K!&&=FmrmSypMOVLv1|!SpcW0=>00XQ zPWaHlf7N-Mz!|&jtMAULL8qppih*%x<-??!-}+abK>NGk({Cw*%V8!iBOte%7@+^F zzVa@dyuS>m&f%}V_^vX-Cc|Pf=jSoSHS$OLJNn4-`Y-)7D~soCycttQ-JId~tn&Or zKU`k=(G$uw-~DhIcKV7)&$=(8TzArUlTr&U01S?l2kz&(Qd)k2L~N{QQ2~j1KGIrsc|wqitf4lA5soG@hWP(_KE`Yne4YE zL(9V&5wccht6bS9IQ~C;#0Le0Va^#Rg#ZXO9yrbpB#RehNEt=p)oO&S-TP! z@>^9P8i|~N&3LTif<<>jng9Sm07*naR6w+?(}?pUa`@cX>LK9rKgXp)9`k4|@bpZM zAKdqYUuPUmW$>{F%SE4kQ@QE~Um$}3Ox_PJyx$CfIQ2da#tRPlKsoaCyUM$Nb~hVB z?}X6+UvSiVn`~AN`{51c?QENH_%|+x7A!KtDb%3X3>L>NvA}xMBPiT@*&SaGc$jg;+1ddQ|HC$HRaOaPeG0>=XUr}{LxsaK>;|Z z{9|y1K9G0#PAAB+gxi{&0OPO6RM9TmMma@q#zRBs zsYV^(OG>$y;{*m?-mqTSfJ28O`<%i5cwL46xm%h?Uw#`fEu{^2 z4PcZ6W;r>C1wE4-#pzk*{R{e7aXOC^qI!6BMQ1o>ZNr9JJ+JJ3*hhV~M zCitK%DHjV~+~nTC+U)8yZF+UF>xkZn3J)!CfQ)*wzSMY{Kqt z@U-pNF6!yo7VWa*@oQY=%fD&tyS(aV(dsFKWrIAoXz~a-XV0Xu`bFp28N8~;U>J!K zg#i-7>Iwial~}SQHXMi@j@~3Mkbdu?UzHP%+`B9~@07CU(T5SNNsjMYUT(eg)biu^ zal8$C`i$XJ7;#xVO*b${E9vaZ$~O+%z1)7usW^7a5l)`tebG55mG2z7E32L^tNqRO zTbYySh}xeYu|MFQ=bwb*^+=u@;{A?`PANb8$34n}oIs*t#@&fRP;oc~@gV!oo%jB| z%3T+oyzV)lzvr@3%Q+v~k9MyNAvAV6ARLKRt3E(&igwmFj!WeSm4y^HLjl z{=e*BmT{7Z3>D`Crlf0_P@=-36j@IY4XT{C+4~KQguVZMbw+R?r5b!Fj4CG;^s*bT zOpTxg<(u!aUtn@HD%lB7f&lMcMn*DD6uyj4r?sAdD0Xgx*m>;0j($cd8l7^#Q(WA4 z$K_{~rHspKg5punt(4Bzbq!OXo%#}>lfDK6GLrwi?B6IvCXzq=tN~ZC#SqBhFrOJc ze}`pZ92v82iKAnZwj2k)>qGc%drrsHS4Vl|*58&tvK`J}y4;p$*=@hgSYimd$?Tok z0%56(EPxw6GYVC3#Fc!k@lvVlv`Mq@3Ew4Rk|_K)2Um`c40UuvH~Mp`*uX|X)wxj78Sy&hoz-{1E>4s)c|TLwd~U3~ zjBGNF)ODO0(@iiaBX*`B}3!_|4H z{O_ac3i(x8^BLvR&z{EOlx`PJVISx1iWjrDIwEGa8*<|hI)Bz4+g=9?3=D$unRn@^ z4s+p1H$nLP1-&>Fo~D39#qn|@PC){-`or;yNi&hzN&{XrTd4e+HA^i!{iz3Z4j*5+ z2076YuMSkkLR$t@%7O4Yb=SBqIq~ZmuNi2DiG$J^*ixp#7f!=R4}e>z)_oathz|oT z?X0?C-Ud%C+q1H}opZk(-;(REC^dnrd5E-kHOMK{~&B{<0a zj8h#}vuwhWqu?R~l@9jdJx<@I#vi)47pK>PEq0)7sLAunz4&*W?wh;87CYvil`Ot< z@uf7~^&LlLrTv+ocnkH`r&NC7dHGP9ddi5pOP%Wq3r~7>C!@-MY!$4$|{RX{yIhN6Tm2;8Y)i*ESJ40rj@DNku){UA~G`Nzc zp*#1=!!7{&pK=LTb^_sD-C@w@VlsW6M)2G>AKAb@o4hb{t}U=Gv`a^jZH&~7^0dCp z=DWNifB*7p|CECy4teWBxkK&+xC8Zlj#px`I&#R(SkvVt~!A7{tA1J^6+6OTNM!+~QD3oRt z2EkM|c^x_4l59j1 zMVEDZ1&s$aDg93=n|neDc>BYZ=fp^5gJ1By&f5UUMCC+N_YoECaKI6%8C-Jh1sS_r zslYBUj8R(620$mXQwZUr6m00e7Nt&-i4Y z)zrNZ&~up$g>jqRs|m)HCiJhvlb1>dsn;N?L{xTY02rNOX{N8e|NJi;#zx{lLm@q< zcFq4EzT@}h^bfrrrKuyMQmxLH0%Imf{xvHhzvxtH^sADBAEA+di*rYz(St(aE6>vP zr;J~&@i$;_)GBA0NE`?+rj5^h=UCul@vd_eV~Me8M#(o6ryW_#V_=~fFq@hH1z3dN z0^LsF1aR7fFOe}f&7R=%D2lF$^G-E{87KJB0ptTPpxpUvmS7m;r_<6*Em5*k8C4Z} zr=2qu%QMwkg_evp$1&2+Bz!f(zG_V<+g_%_RH&0Ud(9jP+2r1U@R+iS8UYTSy&4d- zxREdT*1&538<#j0UzQJmt+MCgAHp!Og$LIl0oP6ky$`x*B+MMKLYTJQ999Ex*A-`! zyRW^RVtMN1czPKp2RQq8nznS@y&5GT zp&_&h)Q&06nslT@0K=kl)PZxaXsT=FxxfT*TA-J(MRx+Ta$v^IwhS)p8;BwU_B#e& zIfK--elOnxG4kzw6BM_quXDs6bZ-LZz3llqHIHBg9il^516BJV8%RIWM7g#WFAf|$ zI=_2y#4&6Tr-2>QeT#Fg8g%CvORC1o=fmF)h`&y`C)x0s|2NfhKd8BFeb z;SonC;Ch^u^=?07S6lA3U)g|F>GxcHLAm|1UzCkD+938-C(lfGHr1w2wW zBDbtk|Aej}R@=D`cFZ~29__0UGkVm&tX@8TZXXN_Roh; zDJ7s@-C2w=b*22ybZQfNa*87cC+SB$=0!Ikpa1C){Wo83^`l-CHv>4XZTKm@20wu3 zX6asS=#$YAc#<(X!(iUnds-I4D=f6~=tdW1PBE+UEXrwaV9}b}>$FiGs@yEFQz}e%k@q*26vIdwFEdqU z6!0TxTSFQG`*`*A0eyYGe)XzsgbD#h}leE4n(6U zhl>`cQZ(AApD;b$(H@^5swQ5=Wo86lGm3{sQpDZ_)6LMY%9YWizX@P~3lohxa0|vY z(wTBY;3kS^pN^RkhGX|&^_l_TcVLqV9e<)f+M9+5Q!waEJb7>j zF`vEH8)>tJLd}ct;MbH1hRCh}JTJcJ6gApTk*7Me1*2>2o(|w9+rNM*f~QjhvIONs z+ob8;lEX_{C2~{Q0Ea$=hQ$c;5o!sI(sp>&p=2%3Wi#G0sWrU0tjDPgo9?g&PT!U+ zFj-vA`pBEhfnWL&)6;vFJ&*iSIsdC{K1thcoTsLHB82|4}zYHAItz4txZD6 zOjm+ir(v3>$kud01LzlL6lFCHtt>8YsfD(k2FF$9JFJk;|Mgs2)_((om>+I z_c{O?Ek1y5dBUj**$EhVSKu<;gYwEh5y1UAS!OW6MtA|H1y&q4aL_IdfYa?&X87K{ z`#cFC89R8FZh4HcbH6982wh4ncsH=>;2Dd?VHz?RW8ext!vH&7=~g{6C_W}~!{0Pl zr@Amuo!}0;gn?qv7(->(0K|Km7;g~6o0;87jM6CWxb;diay&CN;;^z9p@p%pL>@=! zudfSvheyX;RR=n$*^*7f>C(Obl&EV;Gr+$$G<#%R7 z+3neLZ=5+7`o-U%nY@io zX~uxYfda4A=~&-3&X@;qB&>bZ&Wy3w*@pkY36qbwq=)=MJL61cnZ=sV3eP5r-cgM_ z&q5V+N;|vt_lm&A#d8{O9Z{XT+b=x*KRAHbU;MM2Bw>&@4ey!ZZCpB6>a=m58$~Y) zgU*%N`&oFJKammm4<99ZhC^B1y~n9yrw-jrK3M{oN!WGla;`M(+U6AcyA5HTW$fyB zgRD6Fh=vPu7%K2E^@mg2%ErnnY=bz@Tz1yMGK7&S77~p4EO0PR9Y~FO8+cf-ejg_V zAs6)1F3i(R;lZ!1;0&}QMi?|`2t(q~Ld#LwVB4)OGKC`~6(*W-IHZMv2fw>%w2p$C zZFh8mmyxcrYQ-QXfYV{RF}@hr8KzQO(RH0<5W-!^_{(Rio-xbQ)=r|p^J(W~xJ})IZtKCIn~i;tSq^|G zYd8sNhCp5mIf5-R;B%W8Y2#v&CJ43V3tv`xp1KJeTMw0+Ett z?DXLES8@F7i#R>&kaF8)XRx4#87pQ7+%8Mq)Qv7=c&dE(TnD+i3_h}iGLg;8`WM|< zR=iq$1M_>$z10s-_W$)E*x|o?IfIm~U2wdH23XLkep`s0M2~iDx_KE|en0*La>zK` zR;fz?g|}wm;f}U>$Pt^JgCF&A|1)=FihgCe_D5ex&{A=0z^Oc$P>{E(&6-9IbbGW< zXbfxv@`6p!e$237ZHCiGG``yN2x+YyB3goZM@L{nNDHr{6eX}P6#&YFRuL5t0-(9e z-!y!vSZ-Fq(JVjPut1;;5KN;C2RQ*l)ahg$AlpOfG3X|QiYFKh?b3V(2Mlp4`5aGH zr-?Qc5`R}Q%Q(~YL#up-F)(I~Hw+PNN1N^ueI?Mrh;2RA*9pTETmr&?9y+o2s8gdVcl*e5?z3o14@XW(Es54i2TYQzkAzu>Q%qK{yda@f+{iV+`ES zQo_*&U2IvpiCRz@gUBa)W9T^Scs5hg7#?)5sF|4+)QlZmUi7}>%SB&&UyA!ZOVKCn z(}tS89~?HJZ21C~gGO3B{uak(I^y)(DSg&rb^ZX~K4;c1*;nY<6eA;W8p62?;(B)? zC=Ht3!s~AAZImti9z1UF)X~JW6fEO+u8xcofx#414}@={zZUk#GjnDn*a|ONnA<49 zaEj3tmEzQhy%YW+1dMY$NI@{OD`i1{CxXs%8e@#0r3P+|;KOA zwo~1>?`0m-I9>hgHGcY=?=_=~{(wK6!Z0cP0LQX9?csMi=ptXIyorP0&-loz%Pt3h zpzO$ECQlM*TrTLkgP`Z??|+(lG*0lrNj9U}u8=~>{!O-S+*;PMNJ>?pe5Y=XcWY*5 zF`^8G-_UeEM%QET_5gdt8E`aVP=}GVQL?3tE4PVza1}gpr#Q3q1QIA>GayFt>MR3P zjdHQ3njDui8agHN8D9o;>Cyr(yYgAl z*MW+j)QN#Nl9i^Nak77?`b^;puK|480yeW8ef`ji$k>gJar4ri^@Ob$MR^=|2=Hnq zWN;-@zUZ5d^*ADu0LM+eb#`0flgJ;_gU&250%j%Pdw6_;87aWa!jL9y0I)gR&@`_< zMsjk5Y<7E3>F=1~l$A9agxCb`j9y#)$OG`z1v#RO#0!v+-6F7U$C+;BH5>f{zSM6R zZO1mrcoYwHayJVgn%D!?CnwEXktEOw>_MNUmJYem9>U}xQT>A~!@FDT`m)kBe?zj# zqvggc&c#t)og)+5=+pW<2{cO5!)znl#wB|wWrBB`0xv9YPED?vwlhEe*0S51k0?98 z;h)$9`!MdTmpbhpvha&e`eK=+Tq83$*tGSYSp%l0JZp#I>p#10IrG@yOb30MRn(S_ z=+x*i_HDdndC|L%F3Tw4x#9=MlzwJ$!f>IIdK>-(zB9h~0W$Rc<&dvX?f{-zfZ>*3 zo>R^{?!!2>?w@EPM0w_KGq%Vf=z_1&Tj1`dGrm(^_v!DJi;nwHdHkH8r$oT5YvwV- zVO{npS-7<)`%RBlc{)Y3)R$Hu3l7ZPjXxofqHMn{(vs8U#dq<#irt_sK261Evd(A}S#@lRPp8L)( zm%A@KfpOwB@VhvNVxhc;3`9~dwj)te<4Q-5OO*{&@i7NTQ#F}-X z2FnwZ1XJ9njB6Wge1dHIEOxmWp5-V;jRpwd)kqU&g&+E$iD=FUPR9z#1R%Q7xEdZI z?Qy8+SkJrGQ3(qIgQCbBcNCzTX;ReL$`ljx_3m>+COpJWh6rU=>#Q6I!jkC%oCzX8 zmBb8=Ct?*ttxyI#C?mR!akAKT79yqSpRuU99cQL6)P9Z+#Apb`6~oMx)G6OoC9lBI zUgJlI!6;BXb_Y>)a6nv~7hv%nJ%vG5@u09_9vwrcD9rNc(JO#X4gB!!yOy!FquH3T z86_a%_0}c!B+TsQz#V*_v@E!Dh24*jd{GosZ4bo?ce= z*-YIG{Y}uXHyO1#ZJXucSDQ6}`I+ix&lzSzF%ipyz@|XKDUig_ek#V6P3`b*XN+V=h!3@)t z!fowb1O=X{PMyZMI)AhtI!b&=th1q07$YZQ=PsXD26Q6BhxBK*Lmts+W@Br95BmeN zk6Lcv)Qdc)!ghNSgC?g)Y|ooC$OsaAXuAqD0?%ik70-^vIvuml_#WXy#mtu*DFZO~ z$dRH)WPu;rlxJMITr-98P?bY}*YS0*(nRM_5a>BD8LT)3Hd&F(w>XsGUN{_w_i=l4 zg0xG3r?V?xg9xW2#G#HO4VL5fe@a=ka~eV@&$SXcAeo7l%WeJT+P|ROoHc0gB{RkSOp%GLtvOD zyLKa+D&Kzow^*Ub0xix8U;XgXvhojiq2!S%rbA|?F}P${qvJ5JE=0QV-0zo*|NSdv z;{^-Kg87`uD_(VqksFV>n#EwMqg)UaJd1P2s`4M#F@*k|$d0P$UNRIX9I#nw?$i+% zI$bTFl6Q4x_Rx2>9JSvLWjPxq zH=}G8&hIAUVci^!bDjThpD$;9$KY_bETFz_J;rCgX~Ip~Wf3mNmRS}4Hb761jxNmX z3UFn`C~$duY6RhT^@MuY;I1)_=q6=A-sE3+NnYWPT6-m5>FfYEOsoEnBTb(@EC_MI z#~6;e(|TR-vzjL+;7pj)2I zUYy`&oPMWyF{I3TXroLV=y;5>?U(iVtvET0FFvK*cg2sGap=pL_h>fuk$V{Vr0x_1 zYMXGSakR$E_usKM@-R&%8~pWml?^vqk8%;<#!jgVyw{bgGoCI5%qDDXw~U|<;}LhCl2|&SDY6;{pyc>yDZ#%8(>lmO3?b=_*?mGT(Je* z)A+4%?_YX<;&+Yb|JrwcADaRb#TM|nI{7RhdhpJ2*QFsd&ZZ+<^R3+-6FWU;Vz;gWx>Tu2F7# zyLEs{H+PY7&9F!&6uM!_3Cu6jw>JePxvc?R2XPC|I`)S z!&BCbCEDj1`_S?9JMnBGbMQ^O**6eOOD9T%gKHhS z28_00!)D$zV1D%3I*QsBU&tnNuWIPB@wG_eiA*Vbi#*GN;nnaawDBDSt}`ibO9wY% zHf!K#Gq@T|qfWtc?A~K{HPc0O2M=d&J~J7>R-eJZ;keCGgQ@ecvFYrhhL$NL9SgVT zkv{GN=Kfk{0&Ua(3ATBB||It*qMePtxTp+jtarnt4p-#vpL=9lVTl+)$3vPZ<=) z_}}3fPaJWjbrv^3Q`?}UWGx3C{zI8~>^|!KP?!wTeJLGtWZXX>c#5%U)b~Wt@(g{* z+to=H5`$TFocGPi2G3O5Rys>l^`dZ9?yd9@2Q*aq2w0U(+tMt?dG~&K0&rXboa{3W zgk=h@u60p_b-7}%;)ZsGk6y$@bRxlm!H25^GbYAh&87OmtQJoMXVSW66zZaf6nsk~ z_|8mu^c9R}n_UEx#d&z#`w#b>vrhmS<~Lv&v-T9ef5Sz@TjN5u8F( zUh2zkXyH`&AnnPU2Dnq4CtiqkFGPJfPTj$&FT2Qzh)WpuxPA5*7 zb8(PKFF=O*@s}XoKgZL#-Xw9{7u`*MGwA*lI8h$lzAm zCP0IpI(cz~xnG{Y|C;m5eSEiiB`dCl2Oh}qL9~wjtoZ=J23IDOM%Xs!p*wG8{3Cp) z48k$&%W0q*xrPSz--eDbFjX(if?RQN*X3uGn>ohSzr9@TI*-LC_OlizcP*=gdl&S> zAIw#ZQ`Rv$1D~?!qK|AdZMDGXgE-4WW-y80?8lQ^blByu;qf|MKSH3h(WdK{?Y7#0 z%rLYdySQT6-#dY)shJh_{LYL39omRYGiUUwN9@gf4;C}Mq@v`5C|04Vn&7_}eE-%6s)AG^ zYAKaM7XsDG0L*|O!Z8L$1FgKQ53x?fdJPfG4Ye=+b_zl7HmnANn2|9;SAbnfs@FTo z;6;FSBxWem14=BVg->&EwvqgQ(#VX76#zR&*G#iPty|e4&EWNv(7P4Zx(L zt>cEC3?PPrwt`b=?(~jrTBt2!X?!$DJee9Xg_OS>K@5okm+Y_r^PP^Mk%?H9KfL4_ zqkc0k$R3UY8Dj8jK%xUfcZukvO@a~bbw6RmxUam+lY+}Vjy0&J>joYC%>W>o26>W~wR~RU)Jtc^mr7sU z2Os=ov=8!4!SFrK2Z~+#Pcm?)by6?Mb2?9P44|hNjMM1vwh3H1W^T9S82wF$-EDnD zb{udemG=Ftb15&&=Pf8#GeOBrArJCcHwwhXE8$7xzzm(o%*i{#G0s$?3F0~?0|68_ zGHs2ZTLLN5eH=R8#R@>{9~A}_k0lF$M|-plFKA#r++IgfmZ7I|ZxZS0{wtzy@aE z1^AT!NcaJe-{o-~KHo6_4wQSfyy_#TPgA18S2C(w<0xm!h*NylzNv%cFAM*Tyv-C^ z3oUGBVG~r!2f%I?)Xj6J)t>+)5JBFO^-8|SuGdXH5&l0=<(uyO*xH9$MTZ_^{`vV@E(;4B3*3JN&rS&2A*+>aURXMKlb>_vW8k?lM7}}UC1XX zomrh?d}GMa7}I5z7}=g#eYbG&7(MHBJNSx;$boNYm_0Z>z+Xn+&PQ2hWL@+<#?9@;f@9!_mLPId*H=~gG?D%c(j?DUTY6^n%xd4i@+F57Pj!NJdFXL2@7rmR%k-j zP$4WU@hAqo6 zxO0|FUm!jL@A8i`JUU}zI7Uvd1`p^b^|AUxCd`Z|>cNr+e^;MWIo5b9Na$zo*KUgk zYw{wKa8^6PRu3~I%Jz^nrO(C&``TLsmt>K3w{SD@yFHh>r{W3uc3xbW&$+As9q$rB1G78~VHk8aYLz%5 zokqcVRDnj*zcunI8ij`+Kz1dL_xf9i#gDcv(p3=NsQ0VVPj<$KxnD%5{zxOi-&G0! ziQst-!a8qm)F`1V6U)3X7{5tuUtW$uqAPS>ac=!xh7k^6RnaPNDn^|o$B?Mq?|Igx z=VoJ~I1xJcEi=kecr!&2*wcKNtS)ZhOUKOf`6H-f%8rOwe7O438X~%kVOM#@5f(3e zXa7EHKN@TmwflLg)N95KA?AAxy^(ingBYXf_&AIis|JIy(w{;uEp*Bn(?K!Fb_Sqg z3*88Q#1lA#P8tM%6K6V=)#*S*@mZ$xXWJHM!qT{3#qM|Vfl96h64aDJYiTMT6%N@f zUC;(M^O0I1B25)w`jgkV&*vRS!=YdIH_r&6%C0)$3bG1T=T4{3=`Iy2!b3YgZ(Aus zr%Su_yVRA@mY;1;_`Kq@*e^f$T<*_(egYOXl#4Vx#UYTqRE<} zIBZkil`f6@Y(qSz9!)+5e)mO_r^DAg@3d?1Cp@+v;Rkl$^6v_Y3Wx;(C}SgW+sTH; z!pgrP&SV{A!&^t|HVWd&zTHM63!C^Jtmma3um;QLbkqSEo~-cLmzavof~Ppmd}+j+ z`Yn{72E|K$u~yL;0>_u^4EM%Crf+-e0u~F_`Iyhy#zx-u3%-ey&X}cVV`~~SB0BdP z4dv13R=7rR9^D#4nA4YzoP5A{G*sy>PxDM8OY305m-HqN*^j(vc0<~Q4>A^bi+%%V z=pcAC*oxMn9bq>+rG8U(jmmvV$6=g`A+iwJat3 z4tzOKaU%~!MuI0rsq(D+5u?Xg98W{1)JOe|KG5swhyLZ`sza3_XoP%PcjcHg@`2H| z`K;lUD$(!i3OM_CQzt_AZK%!{6PTNbme(nT?M zg}#eP)C2B^r!jXSi&LBK!{!1vVKVSffXw&|f@+{&RhW_}51Dy2C>f;&aTxy7lo(KD zrbXH3)wowVP!}}pPFC}RTkjQ*Lj$YItyiAUf)1v;X`=(#=}OHSnIB-Z48!-(iSf#t zN|8>SdRLwox9Y}$wQQThy9;hCLy^W%FnBgFfXPA^alqH1k8pIem5YNgIIJpBClZ~4 z45^ppDQ%%oXa~*2`8hie@SGVlosnt-E8p5tk{Udlz?1&9rfi_rv3DX4yW%tOJCL-%KQEv+Y5~yi#sgLr~JjOah$!-c38e4?9Q6l zM#c%8^1gCYe%rrUr;9q+vZWCqQC3%it*kNjJ>w8xgA`MfYxoPzr~m`xIl7}P|! zP;0H{jGD~9M7t172Thxx;zAneycV3td4N|`M%Ce?dp^g2(wWG15WaE=0E2gMQYU95 zViasQwI1{;gZcb8g_UMMVnie&5BaQ(h53L}=8hAo(L*sM#G?%riucGoGN|s1L^Vqg zB+!=GLLLHGfrBaL7$Zfp5W*TCqaCN2C@V{0a;9eyVvQo8(E%R14j=*`L(cYqD}+-A z)~O7DBQmVa+tlpzg%Je?nBOIk_c;|iG)Vdt1tHUS^*EJAWX1Dl*rcdt+H8UhWVc?9 zN5y9ZC~=cTnM1b9C$&SmqJDHfB{@`ZQ@5Ad$|RnFE;ts?l=FCiJU1wK)FnB$5=WI{ura%u!l zDk3Ro5M@`Ylci^=4*%mNBLBKonoGVk5uSBo0X){gwZe_4Yl=D@Hvgw zG7d-tygDHo><$c!(|#IjYk#|$8!@;{2?1?t_@$H1px85GnAOXmpqCZrSdCy*T{HxY z(p7_|BN-_8-kLFSQI!~26>g?z+;(D`B7O-3y1^}Yk}s(#6Z4s7Wb78ar|yszl^2WY z+voUMT8aZ}v070I>JZB%93SY0Pc#@f!aBhk5qV18gj{tpcI84ImtyKsk21?*2lUk} z&W4!}Gl1%oUKR~?xByIG?U+kksuMMy%2OkQ?0Ch4vX&M9@b4_N)Ce<5@S(nD^Ks_U z%>0T!v;U3F$c4F4-XTs9{?IczmN9^y=;SPfB9o(mx3*4r;uwHIGY4i_3>a$G2cD;0 z+n|NO;NS8Q8i;RjQs4nIxptWvSOi*HNLOXU%f%_9WHr=BC_?aPpV%dIZEOaxYCvIN z;DYzS`&u?{9vrYhzb_eG`7v$MgtJSo7zg;&T#LIdGKMSGP-3!XEl1ML4`1|oVhHkD z10bDD@#eI-PP?Z95%^OlrNgdM*@Z(Zj>lO=Y38OGht>ss*86E_M_uTGGtcH6ZupPc~%3Bo7GL>lG zGw_@lK393F&n@9-Lhs4=@`5(ejFvU@qfBwO!4I9-nr_dRr@tnHI`E2gW&CkC#I1}d zpD~4;mE?3f!(x`{>Cxy7any;!tW2q+bY!%B(K|4rE1#!X;R-Xw&KpGlW_>{ux>VHw zru3Jequ|3sW^!dpk3E$pX2R7Cu3WXIcL-h4;OVMcl~qfw7^?!sv~X~WzR~8Y*V~Y< z=yS$qFfBiOt32U?H>Y%GSVN#*5-{y(UBIWKNoE$CGdxIpwAIp9gHeMjGnMLlOX3oG+TFfAeN!l%q{@k4jAP%K#AE ze<~XX$KM(|jlBlJzjXqPwDitZxL!VI3;8T(1CPoXAX2*T$SLrzkmJqN6iix0=)xHLqL zS!E?JDTu-s9uwERj0@yVnY}@8g(S~Fi>er$&a6?Ne3XEP_sVO+1#aa7Ad_!YAkr-D zgR4*+Sb(59A-oHbFP(87VO;zzKk>IOQ}&*x>6pZG3~Sn-!!zIqA9MT@qr`VKiW3bl z;uuBg@w}h;5FC4Ii@^=(4BTKtFzK_(l+HV!;%o|sIMk7_wq!nwGo+Monk_JB&>>0` zkD`*M7HR9nXUY}jZ}4L_$FohXt*x2xpoV@`_R<{ZkUj8bF>W0g3eRqyW?HTbSYUsV zlhTkrjFAIOEiekn0KgksakAVJN#4>>L}SYbjNM>Vy2xi5OKYGsqBA&vD&hR&U8l-S zgoeosVXGDm61s>W)2`Bpdm@YBCwY*5!2v&I%G8pE;2k-4-$N2dS;U}PXiJ5?fiZz4 zumMz@+SG6%_!x7J}OF>}_w7ix8$3V87#VYcd!Hu%uVmSl5f}7rmw&6n`3#S_SO@^qw_=`*F!(YF;OQdK<@VuNxL3WIBms|jfB4ktZRnI^ z)fk74lyvKa4?Gf3*t25-{8H@+Uj-vL-#qKf84a~Lw}wvgLngw2ELmq@jI#&aW}dZO zJtT6}q1Aq~5DA=SF{S}B&)1R*`eM9Z+RW9f2Fr>SYf(c4IXGV~Tuk{2`XX6wiu7li zfCq=vz|H*uncH_A8;q`8Q@^RK(ZB7gl7t&?rpgO_PDMro{(ptys+fNFrMou_JifO)zOX0|>olna9o~q>Za^EUwg( zh8JiL#+Nyfikgmu31BihiP4&Cp67JnDzftbIq3aLMzaUsMX3FF`Cj`DNVR_z(cD1& zR_Dz*_dL)4?L*@bW6EdSQ-GXnw>=G7llx>z06cWNQhBG5^a?;W1_!DXgJ=QfRUH+l zwPk#il%%GCZX7wYI=1B|s2WoVpuZ(SHEbC=xV64RCo_&K&!{jxVlF9cev9LPaA=5i zwA*mZjOgNsLS*~(nd}V&j4D+byGA=iGb{^NV001{^-&a!<1uR?+#a8&&{x`Jz`zEe z+@s+8j6$H0sk~ZdnL@M=o>3{f00JuIZ_(m&{x4Y<{xaia_SJD{B;=n=U-C?p3-{Q9 ziirP#59(C7>a>!*JN1EK2WPRI&_J5HvT_z*lCOfGHPbrtUz78%V%(?BMg** zO?jueWE5t>%@{`{ifZX1PgC3JUqK)@JMURPLk=x7#s;Ab-eG$#B`7GRVDder+vi7poI%a0T9wJz;UCB7pNL zTP}fD@#t)VQ&iI`HM1=!;<}(g$G6f)Is*cDWnBC%z0x;rYJT`SJXrC_c)_(98|k2| zI0dBgoQFZtXe%ev?ym=r7zW8F@@sqr{x%CF&Es&uCmILk)AlMaF&6IgX?aC@7;!ZC zUj5{Bywl-r+J4~G>6b6n&DONFG{Z|gq1+}znkK*%P3N3w+UGI)u^0aF0m$Gbcmi50 z-{Cjt&CvK8$%4L3;Lr#CO`W6On8E2%u3Ti)&R!!KzXk|ib|q?L3i#zuGoV!u`aF&a z0jKye%k8U+;6a+T(vEdwuKagOO5LJkX!gQPp*o=xy*Z14^EvBL4PNYPlC3uAj{7Ya zsIxn=?Iilpc7$8G&dE;TOFX!U%q^q59Isg>Whss#@FlCGuHgCc@nN>>u$EUtOke`P zDpzSo9j$W*O`XkAze-bAE=PQl-lL$>?C8--WX3dVHQ@N6>i5Aen9rKaX#a*LGe90!uiSQUUjFozDvha z7^`&US^M@<&zSXwZNUTl15MH{t3bq~b}id%0WZjNNZbei5kNX+ns)e7c>EyWs&91A z^&tQv?U}$*7r5cNe8XJ{x|HV@?5TWYc31swwz~3g)$1OKC@gtr{7%2yosJ#gPDN84Q+voJ;bFvH8e=ZxD7haqA#?O&|3XGKsm!W@NCe#e(GbHhoKK==8zra z!sji)(owb?hT+1Ozy$Qkw9dVE0nZrta0aP&fk8B*gQ>=u7S6uA1iaaa1AK@l^+pZO z>V4U90$#Vx)@&lnsIrMIgHFVV5FIiFb@RAvgwJ7FdGLxh`{&!t+9|H z_yBQun!%{ZZ77@O%K7}~#T~iASO}NP`XySk>+2DImADLPb})-Ad@crvpH&d!G6zh_ z;G*#61WzTT0#ymQv8(;5w5{9dfbecKJA$A&=i5GGR?E#oS*ZpyBooPf7REa@>_(xg zO;@0qWvrW^I$mI*U-4q$b_~BTqYSfZ4SZ(m2;zqzqJwsv4)O46z>Z>33RH$ZpJ>xe zhL|Ch?bsckc&+s<7&>5+DxS0w2Bm!!j7n3d41Nb6+yNuSKmn%Fr{s{Srcs>5mGEMZ8e)$Rcn&T&@ zgw1ZKpdk&7X(Swr8r|P&UyPH76=2)Ru}qGf`!u2|r92ZJ(<#;vN{2dD)8V!ihZbJp zsoXE!cr=kMBgh9G58E>f7NDdQxYvPdCxT^QVP*c0`DExMF#^N~fyJ41Pcyg8aXP}! zlk_jzMVn7KJ!XxX+0-T)m8UH)5Jx)I-e@4A!7%HUAc}rQ$eIkXC53c0QV$<l4XI8x@+tt}i!L#U9CQv~BTVO6x6)Uq7~-dQV>q(-N!i1ws_5}2 z;8_L%jUoePu;^36V8ow-cW`0!-B|G87^JOEn@7e;<0%xj8vwUu&o}lQVVk``j;*{Z7=MH39f?_bG{SYgQU5K&}rQ658f}`No0d*(@ z^slav2vROixAb7OYC9W+wzs?TT7zHpU^^SJ8VI@vs}7BNtEc-#3uBf zV=GU@5eL`GrFJ2D&bISBJP)xoN^wHdH1a>k%T76aMJ`|l-F$ga=X`>GhT%0gTy|eL zOKX%Rv&-&#X>AuOmeYisCBQiZ#_$<3fF=uX0TkacO~*K0RqWPF-N>iYqq90R0tpOF z=uS_Ss7^D_=f$cDiuquJ{drx4tWK$vFlI!_B>xTT+|#kwE^KB6Bt8}BOy14b8e$Q$wx06;i!!k^MY9peA<}02sIOr;a1V)4GQK&u0Y!Gd$*X+Lw$IfH- zv_ZlkIzUM1K0Qmx5xRZ~n`#MxIustN#Fq)3UQzgyabs{IOCrbF3wS&cL99g3sd7$R z#&HTsBP8LS)}3IpznXFc2|8u;6T=TcddwQ^C|#75N>7GTD0TcavMG)YY$10gI?(ux zzsFH^Y+N-XL+Vs`9k8%VJl-43pwf|fRE#<=bzuvN2PzqPI&OtiB&JQ9;bn?jB`wD} zHq+v9nD|jROhem`#?f&r5cM;L8iS_L@=d;1L61_`WQy5{Q-RR=h@s2?9xnzaCknSF<>xqlo#-M_GM*m?}s6I#*CQ^A(Lr%#DxtwMwO%g@*P9f z7$`KhFK!!`ec6`J2&Xp)U%sb(okwA*LZtA{Wg}@Xih=h$$Me!BeR6-CImRSUI0mDC zS0npwErSXoZSst~CM|p=;$s|%z@UAU4#MgRG@a%waDaaKJvh_3!C3IPj-Lip*b^++ z9`NSM(BOMMB=t`pjzwofr7f@5%nSSq4RuNzLTVdgK#8sB|8;6!3bs8&gm|4O3W31vzgDVe;<4PA4D)QuW;%$qtE!IMw{F@)S;|?4^wWX9XWLb46`x^XOZeWnA!zvXP?nzy|JV!|bYO zkoGXeEN*y&TART#$Vmz|npLaZBb^Yd=p8dU!d4fJNLP3lWiLL>(D<8W1sX2l7a3+^ zyhq$zX6Ka^pdWiKYfN5`A!b-3NIm}$viL)X>UL37WIXf@53zO zabcRzOMh+&jzcor;W=N*ymgT3RfAj?k(v2-)wM8to~mQXF=OD{_99aN7^w%WWHM<- z8g{@(@=lyoq2@dLl-K0F=y_-p-4lIPVRu?o{!&-EU#XmE788l%UfQ9}F?6B5k$mZ*eD>{uaD@V#!k2VZCh=Xp+hmau` zyl8{0C)XASC%O^PNL4Fi0*a##Q-9^eb~hqJTgbACz&d0ck8Ljw41CrLa`RqcI0L zhJQp6Itcti<3t=p{NCS)W@QYW9#fDhtRw;ez5px8p)L?;oSlS}DP?BR2hkB=+ENJ# zqnSIEUvr3~GIH8YfdCO8L?kzuL2n%%=QCf1N%XWaWc;nCtD={%VG8b(C=EuC0VN0k z*eQMRFZWgixqEz3QC$eA?h$m&n4=R^YeZBsF=!(FEKY45y~d8adzJB2jRh zjdG@8q*-v-0pPXpxkj=YHJREY!gR2$yHt4)*D)THk+Bi|io0ZUXrqN`V+*vMGE+fz z^n!QVaU9ZDYWs|gZl+46aQvwg;d|-K|3wjf-~bXySl`4?5mp%qqSB$vtwT{AVb7Co zfl)IJ$M|GC+iBp(x&?zQf{qAtSiz>aD=(+ofJfm}!MVcAB7aDnz0EwbEHn`={t1T4 z!@qUH7)JOcz-8=QLLgHDVJ$@)e&+%@xytK~z$#FN~t zsswv^HydDvFuVvcY~EkxcLNY*VG0Lm2*aQ(C^w?tc8#uEi2AJ6NG20Flo7|0=?!_< z_U8KFM_Lx&qTXkCfU!m3b+GtOgD!q1HRjOX{;a{v;jM>-K;WSUu} z%0SHwOwXdcor)$iGVSyRa@;z_G#l^2l`V*9(~ZQle*d$ zLeuazv&yxtm%2e#TAC4ar-)`92{vl6Y+xaKzpY%wnY+q7JmG$+^80|B7IR#Y3kF;e zq%)y?>f)%rfuXf!hSM9wiZU|7_8kUvJp>pC7nx1QL_aQea{Aj^ElUHGYfoJnM~*!G zDcV)JmWSzkoXwKO*)+2P?HqyW)cORAVce(FW+qu^qHc>Ll@n4bub7dOheTIq$sE6n zrNC_yS?^isYOSFeo@riTYud3*&qFo~C^XU-G(vN;h6F#c;|3GjB^F?^P@LW4GwY#U|4}PLHoCZ3knYaB+jqyAlImy3LVgRMHn!DBFQk^_tGO zJW}~EGmNw!D50q^YU4d7&~2E^LOb^OEsWCv>d0w-Tz#Fs*mE~Galf_a)=)YdsEtWU ziioAdYRBO3hU~zI!_dXez~x{4A*YLHoO$8czijeNe_22X@HGRkV@Pvc!6j|Yx3;uf z+f;3ovy0AXc+Ri0Cd$=_$FZ%3ZevVeLlcf&Zr;aNEWhr+qFuxcX^`2LTPG z0O&DozOp}wT#J*;D1py*W+C*elvi=?J^Tkg(Ni#?JnoDgHGq}jRj?X6J61_3Tro5# z6b-Y{iEL99n2oBKWvH4Om(sSSa9F^tQqyBK5=m6a4HjcIkt!7^w?mPEP{H&?y8vr{ zvV{amR3{YTf_7~?kv>Wi8^rG@UzL#e(zgHC*!g!H1p1Jf9f@PJ_*w_RJ{V#B=RN$( z_uQz1CJ}rnjtuX5_SMlq`5|1kr$QH0Q_OXLFNBTXM7UA1wJ93Q>~#gVdq}lH)9f@= zgt00xomMem)a5F~W;U4g(zwjBI#dBNveh9_Sv2Y;I#C$nB$+y%V;JP5>u)l@&p)7xcS77t1^p`*A7kbHh;!56<&W^|5toISVIBCiR|0NLeX2->S(nP$6 z5gaElC@1oz*^F_dEI)IvG^jj7Ka4Xqay)9ir8SCpV1k!t%`$XgL{xe@edvl9W-|xE zWudgrSuLt|u-prtEa<287<%z<1l@)b2>pT8g#oTWjRAoUE_l%SP!T9Y1~obfIwqs= zopL_IepHU#VapTpSndG_{0YAc6TbjMGU0rlnL|Y z0{JbOGMo-|&J=R2juII4O|5CF8HK>icgY|lYvNfx(;_^F$B~DfsddZWmuT z{Ob6?RQUlIVvO0Y0=o3ESgEtS+Lj6ED*q^F*+Y}DrXTuBxeFw5p~E!0>`y>LgJvfE z=f(rv$>fsLM^As zhX%wtVA_Gmx^@S=I%Z`gWfbxVV^&^;Ri2jrB$~P}wBk26>UD}Y&O1&)GEK;swT^Ab zuNg-job(IMtsi#3QAi5Pbf~iMAR{(i&sLfoA|Xa>|N2wZdp;X8k)`**>SE2IJZl zZL8b2Enxr3N!MCP7#vyy7iq4)XV%}<`>s{vOJHF}7Tp%77au}Ask0^tY|RE+k8EAE z)5loe;5}t6s6uhAj#5|nTwe4ek4iu3I0@ax(H-CkglY`fvtEG=F<^>6W!9>LGRp}b zqtsqV7>zr$qj|crH<(-omPw3wTHW3Npj9L)2B)VWUlgkk$b=F`=SFWjo3CA6Y z(&{0*F-2`yD>xsgJ>j%XEwPuLl}Vp2MDr`o6fn+?bZWMml_c%kk0#$ zwv8}#QI~gTDwXf)A%>m@qf~|6i~yvD2{3xltvcTrSR7XdQH?r^DAS72Fbf{#S#V9j zj4_`RTHvg84MZZqWFKJ&P%57MPNtl6>lWd#U!GAQn+Osddz>JZ5V&xKGH+xrsU;(G zC=D%SwgyI};h4g83_|5(rpa;Wj5wXZpB2yip;Cg(kVdwL_VPCW?BDOuHf-60a1z-{ zdmXV^R$y^QWFY(xlV_C{&qSd)KJf1-T^a2?W@+3y!^~Cq8Rg^+sbPUeMx2>ega>j3 zM-@NHhuPfPM^z%?Mx13;8Do^)rBC33XVy(`0Eg2r<2XoN$c+3Y4B-uA&}YP#8zbY= zaId8eb?nLk`Um_1KQE1*ziE8LkH;Fwgz_nU zv(Ycz`nxhdjW_Gm%8WHm!S}Qe$!JPmWWw8y%$8(#_fav(N!Gt=oI)=^Y z#azImUQ)MdK%Dt#L9u#7Vs-pIdTRtH)6s$(V3nU-Ko-9eEGRqb2s2;GR*XA{Q643y zdeR`)O_;@lPKM{~D*J95k~%!_5?UiiI>%E4ov>8KYR!}5Y~?xmR9a}T-5y0=s=A84 zxX(puj#a(tDGD>R@21EW#GAF#K=)Apms&8KbHD`_0uloabtGBgZchK{BWt3RXxOET z&f^GKF|#r~%xLJ$j*@vYBiq_W@Qs|P^HZy(A*5YxlQJ#iNOzqSX)4c4_Fg>EE^4cq z=|kKPtR+|ght~gTi-^&gIZ}QZGvgjp_W%q3#fIs`CA$Y~$-L54FR*tLSQv~6c$2o(!*1+s2HWhkj(0z`ejfAXf`I`XQK@b6z@W`w#2F$4l!c(ourQXC zSm6Ky7#mQNSaCY@f3tU|v9|B$Vb|B5_de4d>}$u4$E2Curb!bwZqqg)Rf_~gfJ#(V z2qEz%5(24}KnPR>qP(M&7f3*P#UMaPAc0DxQcqMbRDw{}Icu-A{{P?j%+K?Ce!qWs<3MvpE`tBF%E2l4+8}uAPVGg< zhm7~;K>wi?uuQyW$CNHpFviYdPK@(u9|!Zx=#dQdSjMLZf(Nl-j_Dc)rvNQSN5O$1 z9yF>GKAVL@vh9>c8+8U1Q?9R#m%hu1%6V|W^_(mbEtB60k~3sns3)X64p+Lms?6kRC+kv) zy^>kY;UZkq&GI*I(9{qZdnj5-)>NVq#V7PsZIc%qiIF$tUhNq}4a{=9jeaG$hVSs! z{N=Zc;MG*7gO$Dv?w0Qv%}=W@zqHn7PGl;5OkX?q@;G2xf}V%iG$*-`R_ts?{zw(I73gy;ZKr&sSaNK3evVQjxif(d2IqZY1)px{$m4X&|Cu03ghXZ3Sc zzaC(ZINGf;0*N5@1PA)mvJyt>TjPunA*u25O&r$cv_PbYs~d3V(O@qnj23Ld`!ZS>R~Js=EsoKz1+v&Lc0jH5A7g998%@SJxrl=ORa0;ws11g6k10=V6BDFMJRy|i04L1H<<*@QPS zI)c4QU<8^l+CQ*oLj}`;Lol7FX>Hk`;AC-9fuMjC`4tV_Kyl?qJ&w3W>UUg1m z?1MA&OfZT()Gnr>k_Wd9+EU;|=3?OM==v(yQe+ardCEs<#Iklq3a963r`XHgvny>9 z%o{(DIZHVfzs(W1r=$ zNePe;&p0Iv?ed?9TJ$nF*G9Z@JTw&@N0WOQDCduZX)wQ)GDe34TaBa$qy5V7W^Zheq( zanadn_a7B4Dhc{Sh88~InlYAmi{1%1#M?aUx7jssLO9$-??;WdUZde?th&5&$?J>- z3E~m+c+8=F+B_OwEDF@vvuvZc+U~0j6qjw;&W4$D$M81Ukc5eRGuXOddF^Qcms^GB z=^Dl~=k1{7%BzPh`?WLE(^Jg3-fI)x2lU#N267T`@%}Ss?%@gaI|gRBOtzkP9^GS0 zd*SV@@rU{`<}^0x6w%-zW2DaESM*KZ>&T4wWB(*NwDmlJw#Uf{Z{Qg<1jlF~I&h4L zUDvY_urV<3IK%_r=yyMPg67WSpT{j@9pwZc*6yT@1gD@jOZkThkE7bY$WTb)ri=q} z?TK`sM1RlQC3=4KN^>NWNyK=Fe1AkfHLvF6+3zEq20tm=+P59y=1zF&|Iky4{_yZT zSr|+^*AHzy%K?zxoyXmgOi)6W!MdD1Kd%@6ueovLFW%1I*KQbi?=U` zs2+=W(ol}Wk@N2kTCrkmUhgq#8+-iE5aQhIM_>0|TT9~yIk^|X`)NFX68sNaGCYsA ziT&f|GLFJFT6WU2qYEqWXbh3@d_DMxL zYWL|ZVWUWRq`PtynQ>-o`#E$?2Y=o!Wn-WCbXAaSbiUo(XFbYtJ;fv%P3CfS*&sG*+|&rigf5;l8ly2Q7lCz7Rd^nb z=7^nm=}GhVyT?b@cm*npxUQp_qYO^F(VvElOxl6XP@#S2uVz zw#=4vPS3OMY*CxcBH59r%_t+XbAF$iUykmB=ph+Kx9`PIU;WzKojn^J^=LUx-+soo z{Oac!$av`HN#%p7^9T2wKU+H-D<>$-1`#s3fe3J9Ce4PjSy7GSm?Mez;F+A3CUB=Q z1k?6%We{Tas0W_hFA|k zwnOPzZBLlCC8WIwzz(O`%?ePBiNV5?ZT>SM1Wk5FY9X(&GYXo+tb^B9t*o(EcbA*O zcoLRpi)8vHkZM4=+MQ?Wfk0zJU<@+Qo*oIu6z?vQAg|9{2uzPL5_xIT5l8Lyj{X}@ zN-Ix=_pg1g-4gUfaq0vA-AeGt8+7j0Oeo~6C_uPijjGx;yA62&(~|Lad5rV=fyiex zR%oHf%*&gBHp{(*nrG)*bAvyRLu#s;t;_1y?i{+BppfV;+T!2jTcHd6)~6f@-Y`b7 zJZ6~|d}hfy9C*NbGNFbOI@NPbjohL;8Krv(Z8@1Dn!BhPrNl^Q6j=gdRPx3}Q%)H* z!GuC{-keD5!D&WB#D3WrycmvkI&?WWYg_BywqHcTPD1546GPk8n>@ijuUZ;dsLF?7O$8xewNX}3zw&)4S8*x0*cS;CVIZ{*s28NGD}|)M$2(@El;L_`k!dY$Y~Dd3@OqBM7SN>0Y{V1S2>UD^RxzXNSQA63aSmnf!DJk zE2DLG`_+%}ia21+ah4n38Y>~bBC$5Xpq<(27>pS{csleYTf5%a9V#4zQ$+eCTbAqv zJaE4X@1iclxA8vufU}5k=oa6K{2ny!XBppU#n`l+#H7Q2EP-+U%xq3vs87zAc@uTx6h?3&p0WKnQ4R%8O$V3yYi1J}Z`f8R zCXyzC2p5&d&)^J4LwA)s?}--|IRqy;7SDw>f(PZk*QNrGtQ76$++g`AepWmVqgg2| z&35Et#5TB>-^*~Q>(No}Go&7N2($@^MjqX|laeoDmxFD&+M&)iYmAHtCzf%giNKLf zB^N8=5YF2zJdbf}yk2rVU%B^EbU-e0Ohv=mTvD4HhM+S>9UUlQCDJ=* z<0g;IYvfFLy=a*cZLgz{((92G?1MX6W~Yrl2msQY&>cF|CWnRNev%V6t0nbCM~DzV z$su(HsN7?+m%M3^i-xy`>%cC0#K&+EN@u=nC5=uO;ikiyWAJjwGFdN*IQ$!(j*JZ! z`^mM@!Qnb9BKYR)BvT0!s}dTeuWG3G`-*M?)`1nkxmYQjzMCY#9!&Jnu2 z*Ljgv!Q{qr{=jOCO3H>&#I(R*lUQBjkjMZW4o4C7Itb3Q;sFC@Ed`*$@Cj8$(0R$o za+Shs#Ur=|;G5;U5u_34Bq7F0ldxI8k<Bp1Rm1&)(WA+uxC`R=#zWk zuY_&_Srdau3;;~da57U-9$vC_Z^Sd_g~h<0v#K&=&v={H9K76ba6!bA;N0($C4)`# zhZ3Il^z5`vL*ac*0n+5V=seY2p@?8rF}@^#?*90atI(foX<{d+$nV3TZCqoVa<1NRT~Xlln$sw8wOh47gZY}GGnOS z+OzCo2b_qdsPg57B^ezy$J$Y!aXz8&<|qnfsl{2D4jxvH(=bOPz}^_}4F2Ag)l>r? z7;6{G#)xR#vn1Saa6lgeMgWSQ`a4RjLX9)%HV$tz15eX%hOec!iSAX$JP56Q+wMp3 zhl^nDO=(VKwfe?@q0uu^T+A7)!g;!=``t@;@Q@j5h+=X+8VFhplrS|+ZVn6(MvUd1 ziBwdl?iw@#iVuywj%GPLob3!^?VvFaMz=iZ(Np6H)DOdjuyJPK=Bb^GZH~yRmDhAq zI>TW~i?SJ|Sbug;&PJM|3^xhL^NvyR^c?4c8K0LNM&9sMk*?E@I(d-63h%}tQJNEA z87tz?qpm_QvOMB#B>}A(7p1zE5b?v36rm8Rk}3;N_z0kZ!P1@F)_D#nL0)^{%urO$ z(I_L&qAUE5wlgE<9*2fO*NsKT!G^q<4GGa>Pzv8Gt$^WxrpZz`q+pTbkSSRZtUZ+@ zX_s=!AYcyb3 z34*K;nE{UplJuKl>ZuOqOM1d!Q8$KslKRUY^#hq?Ti8BhHH^#l_>fTFd?bt2X zc8q#zK7P$$U>t}ZF$O&=S2}C<96dvu`;0kGfYbu`W)Rp^ zLDARs$ObqT%z2hoaI5H(W1G;)`T3)f-NMQ_QyI#|& z-k!)IU~}5)4Q{ANaHI=R3^L^mqKD*9b7hpBL=;V9-grOsHs8h{J{aVe=>h$)C)g6A z)%cSRLX)!rVyIO_m7@`S>TmAXj&uZakS>P5vuM=H89DFTaUGr+02tNYc{DMBf8>h7o zE|cz)cX%a;Q}9Kg<-FY3houGFdd2hCNecEC`)K7NqESH;t8t>G93<~?)SDyzljcE! zO)hrhwGv~gdj=V7mei_Y93wh0Ia?9;Qj7~ZJa-L)lh+6dNP{gGL(V8e$m~t|50NFn zC7N0;Qx?Ndxe&=>m#7Mmn8zmr5QC8v+951F`*7v1MA^L)oT%%+4#q*N9YWR z$)PajN->ZKIe<1c<00_JOQ|eD0%@}hS-+@IJ!6=6<27z|8A1#|eNXO1M+giU zyUn`a_3_S{n>MuX?d7N)29r+gLK~y0c{2=#Q5&lfV051OZ2qXSF|0QNT853p_GK)) zw-^md7=I%W{ODz@lGZ5{4DNV=(Q2j}+y*a=a};6ln%tp2;T_RcAhc}Ts&CE03*{mT z(uhX6ixf7Y?k_x<`v`#QgNtJ*C?NvGXn8uA#EbB7_~{(Q0KPGxe)UQT5zGUlRk-hs zvwp(T;04XX5e89*k^{#sjghdJ10aK4Z5tOuOdC^Ae`@+&U(-h4t1vL|&CiB3?P?t@ z`a}cTn|8NtTaJcw?W<&dfqH0h=qdbC7MLIJ%?69wTl7tciH@dxHBxMvLamFkbN*nPQzctIZ`59=5M5vy=l|LDu-4*#4$ z%G1(qgB_Zk=c%^t3;+0uVWwa7A*q}qLR)wdo!0ciU-Mo39Td~hK|UHtm<2=mIq-5I zN>T;+s;-YxscpsroDL2sn#O6Y`1ej{s5u5kUsI>SfZsT9ea=JeqdRj_pK=&554>u8 zuukEYr<9<6T<(^mn(QW)w-`2;(hp|vYyMUOF61t*yqe}N&Jm0T{Y&oXL;!jn9%et_%p8mxy)mH3Ppw$OC*y|qD9Z!@=LfvjCW6&Am>Sl~ z{SI6iRAk!FQuAT>z#+Pn&_2t;O#+QrW=2==VZ3!aa@u!&FqGE4=(BN-)z$o0dI3H$ zo_^P-@5Vn0zrGq~eMdLFCbzHpcG^1r<4*a7qGnUKzKmVxXuxI`^Bnrh@Bxda7rxh= z;1H}htzO0_>e82FB1cI}>)%9dgDn{117~DTgb~bo;am0L#9+{uxAJtClN$8SfMF2I zp`(zUiD@~XP7q;TLs>jUE^v6vXn2R*=%r0#)Ac%@EO^CN@Q1dRvA4zo4r_$9Q6Ec2 zWI)BI%EK?+G-HoO(9h_SYLU@s)S%Gv9G}$2kM#tPB`fBBMd(g#8ZSp#8+19DGn)yU zix+w}el)(*p(9hfM(>bUWv=ciII>H><`*sBd+APnqh)6RcC9zLg>KCmZjG62F`xTA$KC4M zv9o4Jj^#{tAD$iYWUgzqpe1kPi8mPpvm%!P2tUrx)ON?fAVh=&m=IW}ItG+rZk!Xb zF-czYV5Jcn6a?4V5O3uh+Yl_ZND0aFuq5fh*bnpYj?2Gr9+OF9Ig_cQ5fCL$4AW2| zmLMI%d(*KLq6t8tkL88dM?^Sn)Vc9P1|d1dOyj$XAS6hicF^;2QLu?l1Q^TH6Rkve z+N)I&KJx<%LTH3Bx3$+Y?v!-9J|Hp0d)fV^V4FjTqMR@~E1xo%$M*y{bs!ldtW)zB zG8r-=EQ}%wkn$U>*AIo%g(VDPc;4-iIqu-x$kk8oLs4VI^h;q7ARgyO7!tDeI(^R= zgUM0(7T|4M;3|SUOInC1Z}#AdcW2C$4uzqUyplc!-gT(1H%65cM`0N+;UPNrys_Cv zKZZ~9YUFyHa+FbEl6BBBZp7ES!A^g2LV0(N01*-qQ5(afGM2C|9DLfG(1wT~Ts5rm zmKjC|5x)ppHOI4==r1_HZysu$%s)%}9+S1k9sPtqBu^oY@TrtR8vo2GYZY_t=b(iC z!HdY5glu#(ur%i;#ZVQgmJBT?r)pciTJ%D1$v+|h4nv&WPY3=EDjFdp#dv1(L-l7T zt49Nslr%dOL2{5@+2C$z?0LrsT!kYZGGWL-qj)LZnvWj(U0)+WlP>s6ga*ku%g>Q7 zHg@3u=e$F}s2@U;XL~8qQ$0#|r6f>3yzK;e^fq2Ry5q<-b_!zXqkeCqpQrI0!Rnea zD3EvTP-szPu!T$X%7b4|36O)MesdtG+8l)!5j+}FVQ^9#bTK*!2wm$lIzDSYPaKrm z_|0c>zRY2ZQ!oJ=lu7n^i!v}0$fSw<)#eEK=wh6?;B5{fnde2@@KmE3SS1$2ee<)a zD4w-^#>tuu2*K*A>mobG?J(qlRp}3N;580u9^}|4oknFj3qBb=u3OHvA&MLm*^Wwv z$IL+8%V-LJGUAYjv2iXYLfHuSq7zG7@Q2UP{v__BkM28;=ccIII*V_>Jag|>pJX{> zG#V%W!}S>BQZt&{jqMJH0jg=JH~CYh#D$v491L}@oPoH4p2EMq;|Ky5{Bp2?@{YoKdL z0tCS|J`n{YE5Z0_8xn4J?2A72f!-OzLvxK!G^o*Zzj-zf&jThi$pjnp&db%DBX_!Y zn3H`IOwW5ZHe>#NPZbgIdigGgzcFCG=nEZiFhsv?Lh+OoE*%_RI#_tIZbiw>cwIE9 z7g&)|4$Y3;qP-l8_?`SmlH?ep6Ryu%u{#Sc?5B}Y(ac2Ct9TjFW2*_$)Gi0YS$=W? z@dkv_P38`+_(ol)QHYKn2V08CF;TQn(b2pva}Gq$V7Wv=jw4vkF^hUP&B?u<>$T08 zgtGpjt)MmZaLe&_n=?2JZH<8dN#AZ9hKIX~{)$-V5T)9fkB z&{xSG@;Jg6_&XWkUPe6mH8AayjO0Mr^?a-J2hmSX;^8a_1Uy@c5vDp2-hY%7STLf2 zqyXw;tmLj^Y>Y$5NCIUwTSF&=dBcz}=SGF(H{b5b0M7lA$JISnDq-eXp$4Wc!WD4F zNT_Sd9?@cw5%60?>QheL^1cFo_bVNN#5hJ(~ItFIn$MXdI+C-A0bRqx(2yrdr zOh16Qgp5aR&5}>|17GtdpzYM*IS^m~gjpA0N9a}(%*J~sM9>5rbbT1Wz`D;;x06W@ z4rZQljS&}&f^|&>KVEb_M_?-ijTy8lr0CtrzXwe0MK1Z`4gvy$q<7*f&W9l^q!VzrX z{%N%EESj=(am|DBkaPkf2H3;Q+DT|lWUBjkBTTzp@DqLpY$yJ*67 z<0Iq|#YvBq@&b#)mZJx4m7NMT${-*pMLnumnKphzXAhs;?~JtahX%g24|u)jjK=0e zKpC&Ycs=9wNs03!LgpR{H>daPB<77bzRK#-ce$oxq)|pG89Zd{c-Qi`Wnl*;Ux!Ed z>3>QhC*rsz$D9Q_VL5ONagLBkO)X6ygbw93H085~jT-!QGI@V}PO3Db$1D=lQi{#GJ3F-FXc_`?mUnzta?sNYq8Vg0Ch;!2Mvs zFoypn|ICkquq)AqgP7WqX@-s+xOf1KT$adBM#tE7gJyz3w5n$*8Dy&+*v8C3h0`QU z^bxIu!=sD|5q!_~6|LASLU=1f?DAPMBO2)c(1blun~7r$saGbTIj>w1vN`Hc{X~DHUWc17hTHZG^x8 z$(Tc@E3oi1TJ@d0O>j0px+f#6{8^^yob4LUu{oGNEv`)eCv8V?yT(PDBtT97-7=IB`ZgE8DNhpsp@ zizniv>Uq@T>>3Wv{T#XB$wrJvDLx!|b>~PP32(`2I8oM1-%~z5vcHM(ZvVhR&LV@6 z;d2=-k%Xp$a z4Z*{F4UFS(CmOq5q|Mj`b?)3QqIc7hdhI!nk0C2+ny8<^3O!8cixip~Sujp`?T%bX z_&Lmb?|tR@76HG>PI#95m|zk9&gswe++4OnwPXIGhPs5so4!NR#_MuG$?XbEyaWKbVPZN7u93{WOCo8 zwOZ^Z3!37ab?*kF491x-cAtK0ZbJ7lLCp*y4imc-(8u`8>LmnlCC^8`5kmx%<7{nW zfF04U_8VhmB_Hp{z~*ZSY&_$DJ`uFqrto}8Q+=L$y; zoB*eGjE#UErilob@?dB$h26&x+(bVrw>*{@W9ymT>%rfT+I=SRA6UE*9@x}+3H^*JlBE&K#^Pfe+WiM2$BUUi;t>)7VxQX4f(#`XF#B zKfTo&IOYYXmBM1t)#%9XLebg1m|#47?M2+maHV~QrBErU6I}-tkb_oG(!-=*q@Zh*M z7=EsS&)^JS&l_$Ry@Ipy1LLl(yuu~$H1>eRx;|yfMatzYSTW%ert$U_0WA2OPZOU(! zCa*j00Nm=g0>K6D!dvx?fs(RpG{#Ft?$A`7kI;zKJqy#Z3EJnRNn-#D2S=ODL>__< z@7HVOL@LBk|{#NsR=l=aMKJFwSMQQLd1vje{ zF|B9CGOEV-t|`lt1Zadk(KEQZa{x|2vA_3jd5Y0i^MF4&SUbmTo;90-ac&wQn>#0^ z=?xAi`ct210z5}3XG~b)8FMLIQxqeUg6EKNM8h~`T-dSBfC|{45pJW4zEV<7FgQAD z`={1xgAun<5#ry7CzUyP2Op6Jj*xNb58e56Z)hOJUFpiJgZGv^o~RZ>rhnZXTCtSw zx8NdC;h7r*x-o4H5`!p6D3o=n`nDd6*B0KlPBl<6k#$iSzjjH}95+3a_QrDbB)H0shOHmePBArSJfs5 z#4~rFwaVA5iJ<1zsSn}o#iRHd6P`hn_?jVQxN`@kze#QYdD}bl1Qd2S|^4l!4{wmD@QYoMJR0{pzYSJ)1&&m~5+=NHzIa zG`se|WKvby)lL3b;zd*DC04)ymZPT<88&lh{OCo11uYpG`SQ|BFZH=(5IUSC`}8m% z%&KT`MZJu8+5c8VCXoHeW> zBpU>QVbW_yECnP2z<4Y4++Y!cP8Wmefg)dCI;B6=n*d;7V$lZ!^&+$}mIU`n*l!$` zGLh<7u^|&7Rbc=KQM3FvOji`ZSmp@_eL~t0Sjb>#U>bzrI^pJYZ~)X2 z<+=oY#FEf)90sOQr{YtG#g3T+ z1n8L^xsW&|O_c}0&}^qz^Y);Ad&Z&Qmo9hP2ln|2y6yxiVkDi5n7Rf zxA95Z=4o9<>>>z1kqu+67WGd4Z|g5Fwz)g(eWj39$agC zlwo7>=`{ufq1I0{0^bdGzR$ta!x%cunS&ah}&;Z@{0 zfggS?4_$=2IU)s``p28MEN%JuS;m;i%0X1P0WUP@1D}VDfenN0wBtw~ zrBEpSqYh^#OHv)<6gq0b(^#Y#G`!}yWEZ2Akt)9lA3g7o>UtTN;2AV+lbZ7`DKq#T zSrJ@T4q*x^_?a;8nUbKiq)W)Pi3Mi7C#A12GRam)$LzNYlaZ7^7Tz zo12t{anweT#^9?y`lv=w+~jMtUpyE!8fzvG2Y8Va{$ zWe!8ZL5k_HXdZZ)qt`?l$+)6aj`|U845c%E8-o}Oj!H6piVt8ZmI)w$MdNoSrTGN4 z?)M&nl-!N4uZt2Mb};u@aH0sWGt#VVFa+QN57bJ0!hqt629wf33Z|^plH`!5zHp+u znZAG4?(xTcUsO1Hp!;){XtXQMK*Z#^{IDEKMzLo((;W=iwfPYdSzg5ih<{)KA3uK3)rChmFIL zV+}nRjFUze$v?f@b;eO(6iw;aooFJM z(}!39hJ7-a=u!NtZ_CrC8I*IxQUyfKE!8^)DUCR|ME~j<7jEVpOp8M|qWL}hy9qf% zbvY*j4GS%6Q&8zJ!Pm+a1IA$F(~+ZiYEDEj|Hi`LVoMOV6RoNb$F)eS8RN7v<^nK2 z$@7L+d%>%;7_~ zbihGyJxsTHQVy9jOHGvr4NegGh4#_qJMX+xRN6Diqn8HYz8$}KacDmPP0*n+>XXAj zk0EWg0bL=2`?wrbIA@5HCw3vTBi{GEb`G0gvW(OBJR?;!+Ma?(%q6n3aqEMA9-I$8 z7ah=T;Ed)+pDlm|p-%-y#Br25TPx9YQL?2(FBA*9jZD8AUqfcg@4UgW==`b?u@t_kZB3ECQN`O;-m& zYD3xhV~wv5`EeM~rjrKL9H)VZ)^gwSd@Ls(c``$DlIw77ZoTa;bZ+2L%jDj!@uW_Q zq#ajIR10CxyRwucoT4AN0mnu*3eS=j@7ZgVKU#_YW=XMm5Db)?d$T->c4EjC4PM^; z(4*D|&dnX2L_6qZqPexnn2{6bq4)EQ&mGhd05i3yvq<>%Ovn< zoWZ?$%%}OfRv#l1g0D6g+}0)_X$;25LzTY?>gdW#9WXR5<6v}9b|S=#{D%)7&+|rM z4IC}o^StE<;e|S%u@Q(GooH2`1B1$2KG8RPdwL0@WKu;ECUqGOI(nu#4~#O9;*6QU zcHmAFlfpGeFY_m5$SnP7TRsuR2j1YaUOsWbjJ)>yCA!*|QQnm&4;3I&)_9lWKpyyq z=q5E`n(B}FWdQZ1YPHi`$ioI4Y~iMBjSp^B*=-VGkh?}UnCF5uItvq(H*0N(BI*OJ zg0Dz9`E@S`Q{(|G^<&T@o02Vbz-(d&9P5zV3=F*0Sjej}?q}$tP)k;UF*xl&rHs0k z-|;6HD>Fxfgc~a#=8X0kgU@nI`nfHK-ZE~Iea=Wj6H7L)v76Eu47KSAEo*6P_3+X_S3)X$-Rh(}X5CQa9*!WJ~=p zT1KCQx1~pb3_qAZnrUMFMz^E$y1^Jkm-vZcGIF46+JO^!hr?p4se$)eg3Q^k+!~*8 zE?ml~Rrj5DO6hpi;nvf~8Y2g29;v6F0jMFxFa29Q8qLyr1Oe4woDB^ z=m*XMN9hY5+t#SNK1NxCLQkE&T>@;GCC}B zh@j3Bbu)HWJ>>)AtY3W-bOhcE(J*^ORs--|w9qxAIzlu=mUlaICXi-7Ob2vYPS_J2 zZ36`(Po$I=i|DloiIdBtvA$1#%@3jUzy6kxmaj4JYfK`X&sz$bU17}?K~SP1bB+Lb zBEdG8Nc`5~9DEwm97HWrIBh<0C>!dLz5}v1~!6VLhQkWaJ#g$T3^Ey z$&MAJ4RS?9c1Ax!9jJsug5H6rgq~v2gax7RtG$lIOu&N-o4R1$ zcQ7|jeXX&>$1>nVgdNUGSp|wote+kGgU7~LWJoo}7%$!VZtSL!Gr@*J~pXzv8oRd>PEVRX=7N%Dnr71%@c0$P&hT*3X?0Nq?_{?&B5J))ADCU%C8z1 zdNlzvN6Qn%gzv5~f;ejU{dReZcZ!0^G2Cxlbul@BRRFS~6|F2Il>ADrGzw7;GR*kN z6?h(eW>8Z?@}6u?B5TIzuQ?IU12Uz#h1NElrMOHUPl@=6y2U#-c!j!t(wdFE*xwd-t7OY9Hq@QxwnTsi8C zEX1{`&e|*wvD`&CyVdwPF?1H0W-fTd=96YxzE!Z!^mvT6Yx{OeouR!E*g zw;O$L=!2Jo3@*{WITy8dCyE@*=q!h1dmR+56A>4wZeoMKl-DeOVuGjXQ7cubWf}JA zq~w|7YP2v1r$?9Cj@yIxGU}AY->31~Gph(&n*^W8uOv&&{n$?Q%E0+ibj9hG-eM)q zQ($JNbufUjx8HmaE3^WXu}z+Y-i*a?{8GFVo&>Mv;R9rS^BlvlF*^U0KA)Vv#zpob z7*7_O{R7ecUXeqvWIN3Bn#(`EXhq`cDw-r{02k4$XnQ9F+MEp|GYUJg=32E zAf`b4gii$`G`rN=o!K}KYlqa|i^!jLV*Hz(qW`>eurBxC>HFjH;`e&6`bl_|fPNjJ zJt|5W$_up~Ct|Ss>YbKGFxk_D#=&8NGZ=-Q#`2^S`CC?q798OE_(9${Z>HBl z%WHPC5!zS5ZO#QmPqkxC8X%ZNx#WMK5gt+nSN-sXCMd>b1Pu7PS2?)r<=%wrD=V@Y z;DC7A8qcsYl%dkv=in@Sg`dXHv*es$%86VUM}-e_BJj`9T|#^pA!3xcK73N&BE#sk zkqs>y8~T9D@pzM%%Nvfl;kq&SXG{#3q0dGj*NXyHmjG@Q(T5zbneEWN*;M zr)t@i!c8F;F}mB)2t4e=^ZKtT@EbhVHn=(B0iMi<0vTK)q!-~bo-X=-$$>=-Moq)*pKE5={<5!I2!;>zS`FWi;gs#1l4oET`HW2mD@W0h9t?r>c64O^qmP2|@J!=(iU#98Of(PlXeGyY zb%JQ`0Mfk5aV*;L_FHdHbjt4S;ql;%N6@|$2V|#hvQt~9?IgYGT*W8Rs#Fwpj;iY* zHr) zpg`I`aBE@#0RT1c+6bb)%Lz0HzX>{rWeS~M4nkC3iZTdJ ze+Yh#ENOy+@EYT-jR20x27x;znISd1WxFU35r9_|r=}Wv-48+-FcTH&69PwQH$RMH z*Z@KyV~BOaeis`L!N8i&m5zRDzqjj>;CVGRMx36N_^Gd;K_JZ%PUA5SOwx3E>0vw1 z`BZiZa11-1cS!R{E5ddZMhg0<8+Jxgfx^*4tQj-}I`lyLVcrbIF27_j()X9IAFQy5xmC z432p+VEf?F<>u}C9irNiEia`oE*v^d$Tx?Bl-EVZ;f13NA|gz4@#f>H=kaxkR`NW< zFZIQH>N~k@Y4<$i{xZXHqQs5+Rzm;kqFjw~BII(Nc+6BrsU+5ykMi0@8+k*Ju=482>-ql3h+0|D|o=`qT3)FO_;}GzzhU)2#!-e z94&zn&8Q#JFh1u1peIt;wX)qoHM@~qJJH`<#WBg$ zl>0ha%W1?(eZ7GVObljtm)u;Ux43~L!|jL(b}@IG!n zcG_LTStxp#5Vup?d6o_W_mqNGayE}1f^8I8d>xrS4E@!B*!Qz zaGiU>Bkm6N)foe1<%yE{B2m|p3pE6e{U1Xj$BMHxkI0NyjnMefp0QKhYbuSp`Jf4M zha9Ft;jBx;3+F{{Uw;29!9ThO*T(tKa&+@M%rGo;S6ht{?Nr}$&pEW{$8r}Mji{5^ zPcyt8)eb{1$G$OP3s3IQKL-&H-A>-$;9<$c$sat0N1o?6c@oE7d8TLaB|Snnp&RKw zj$c6=T;+M*HG0bsL5H4W?)*ZJGJTLU>@^YEK0P1#D#uxpCRH*{P%=%PBYOnbkO7e(WrcYlKWsK5HpboK5~HGMgU*WgMoxfRFm0T}`^HlT(zQHt z@}0NavHUn${)*+r;F4VStX?_#+JDkL4*F4%c{~eN^5+;XjyB@xfiqdNqo1%69IHo{ zHHXoyjnT69v*d>to+sCyH|J;aS%WDYPGg8ET!X{VP91P$I3)+sgA^z3 ze>_nBZ(jagbY#|ij=6`tw6 zj@Jnm_?e^0#tBHH(<-Mgj^|5GPUs0#<6QI`9OWQld`>4rFi|l)C1*V&a2ZOHWkpdvPg#Al&=nAkO=C;X_1CIMbl1ub}h^NG=?*Q>9s+Qq7sJf zI^p19+n&|8m+-)R#MScvcGR|f%3_2CYRB9OHWP3_DU9v0Sb70MQyt>I5&Dc#m1nk& zK}mqHb_w3bK=4muW^E;o0;pC1NLzi2K$MwXXG$ath0rlLVSpe++ZYb{0Hf%cHG_<< zpxBA%?UoZlnBBv4k==KY%QO__JVik<6bZmk1(P@+!eCIPJmjm?-n~x9A44<4uE8~* zq7#;MgT427UR}2&MyQSv6T&V1NvNHt1XR_Sz2*Ahud{LjZoP6R&!Z*RJWV+awH8!v zBBst7ifHF7w%{V%j>sJNdh09!Lm)J_dnvWqj^47t?VjCv)Oa7>f7A}L;29%f(g#Hd zEf3t{F(rI4og+J(VWuznBDbQ0M{>gw;386R{YqY}V;|mn<3aPf+`RO1yZd71C-5-> zB3#Ez<6Xi_WnhKzHG;Fc@_H--EaRWT3)g{t7sd5kS#Jb@4nxwktL^nd=ZldTfrDf8 z+8fRAOwGeGtt!;pc=DLJ1~4vT4&LR!JV~(g&(-SEw1M75iftMIW4Vu_2!trw+BsM9 zK^QHMgOR+cTM6mwym(PpbG?qvQNQyD2_E?(yCs-8cP#qgxQOwJ$78K5 zxQ|hcRuUc@k9j&l@I8ok_cQDzLwh;<%q}{7^}Mk>4EMKeWQq3g-c2wP=0U)&aC5m9 z{pnmrh7NpqnH!}ce^SmS+`-Ay#$@S};D!%MK*Z4bT@QjKAqUUzIzj;t9@v#0+GE(4KIoEu0W<(>= z-#iDsF-+tT?1GI)tX02bO)kkTJS>M3i=ZnlGe7}=19)h;Fx-nA!_RfjnADAdVRC5l4Wn;P0*8xC zvplvO`t|$WAj4X27B#$${%aEoJp~9(IY@X_BwFgjNzO^dg7=EHh~}BA`FSR|@x$#| z5kmCMF>_SQd319-=f|9u;VW{}nWQ;Qw_0KYKg57m=#kTzPfk-j?3vJq^bwHF;=-u&r(<@8Nnkb#a&5*j*h^^HT*5q=5#n31=LDWk^fRADO= zeMfAwN~>H7%E6ikzSO5W>qCPS14dqjtdlNoih6#m^$c1OE!&AJX zg%h&vJFf%)2tECc5=aT9GMY}4?0Qmhevd&HF_=8zGy*Cjv*Qg>k<6@^WBga#ma<0|~Z^Q8?B5d+2MtM~BxJRfFPB+8gwb7iF2a_Rm z#!f)i{Rqr0Vb5_h!4)i+2XK%1jj8{^CYS}Q<^9)KuYn0d4A91=pCMTDXl`SO1KKwF zI)XaSbI)>Cu$Xc630DV|JIxEd1Hp(bBEHNhjD>opWrDF~OG4Y&o^?)?`i#cIy@>l! zkAo{wb-#$+ot9IMFko8_k7FzceIibtz}J&r3mO91kq=4`Us7qyuPLBN-L!wBQ$dzLjOb3P(t`EuX6 zUxXi6HPzq*W<$4q2lw#`gX;_Lu=~bFFni&XG4Ps$s0<^_WGHa-ZrP7gYE3DeZSiPa zBe+HIY`hRfq>!r9{+DU5vIa%)-E>9t8tjN zzrmT*1vm6#4C6r$j%z#4kf(Wgz&T2Wbe#-!__-#)gaHR<>0GQ@4)iD_jd&U%qxUAG@D{W*B5#BmLbvi7!L8ijaCQo7J9i3{^-r~KJD0t_rZC; zXI?{RqMXrb^F%{r%+N<2Yn#)6M&&I|B6;~j2!jF6D6~8Lr0)z6$Mi4|e7DkYmNWRY z`5z?vy~xywT(dzKHO)>Uyu)&xM+)|7h;931V08xX;h^uMqHV4^3B4uIU^`oFh2-Y0>&Y#)`3M2hYeew){wM zP-J+Tj2tH$KSnQB;m9v9^v@{1%pTZF?_39O<&Vj}KBWj8x4DhXsHF)I%(VhA&!Q)W zle29{)`l;*q!-MST--UEvl*iH=&{2XZ|DU)nxElM&T<+^lnsu^F0#^wMffm3#`G|$ zuW;Ju$mc%stmAHsnLK}dCGb<)K=uZ_o;TL(BCb|^EUBBfF;%oCE!pP$XS)ah*Z@U` z>Q{OVSaG7sw!3#5L&m3hsc&zBmwKls%^SP-k1eo&QNRVi7BTne&8uY9gNuhVu9kp9 zQ8R}I`B*0@(Sss67;Bh=;G6FN)F23#evk0+I{}c4OR)neM6z6$g1c}nqaoDBhyl5O zB2m1xA3YeG!q8TG80&m2fvY15f z?(M};#-m0~bj01ro9|WQi)A9{`sy1-G$$cZODExe1P24!vSXu*04R>2;Kho%fMxSV~_iTKMDjk3dbo=F>a3Cb3$H9}Iauvhf z)b{h*rX0sxHqL~v!*ma0wCA-Q7Y(ft?j%7)gKsd7_MzXR*hFs7MEK`<4q422GOC+) z+(G07+aOz+3Wi_w6zvl})x~Fo)^$XAlgBvAezi3xx>pt)gKFq)4jElh#^zxJBiHIM zJf*^FZ}BwRung&NZU!3RrR~#<>p4;+`aW)Hy`X&Xq_~<3*oIF^n8KeYDkM}8rGu+2 z>)1p_;fnh1S*j;1g13z&Xjo3$qlXW|YZ$k5kERiI2Eg4SEzdhQ@r{1PEYZf6o`VlT zdDC)~yGk7@d7VRY z)%`KR7&wia(lZ+FPUsu@#orEwy$NYktY=j3JugowhvKqB$@fxxqdck?*fNY-Hct^z z1c`*+JqI}+ATN$HrjIi4FMEQ;QHJ^$1fe?-GxDNz^kMVlr z-!u2dcO7q_jl&f2dCujtcmr)&F{sI?s?kT6hh%v9XY;g-0JR_N$&J{1^Sq@!@{R+3 zNNY4++C$2TBWw<9^P~+MoP07))CH-p$V@kK4=D*rAKKOm%*4W*x!FL zD@6D9Q)spI^ht6he!kra08%zGDZ^n=yyhQ~4NWwpXo;bkEJCBv5gM)Fr1OrWFS>|6 zqn9*GxM;pTyY?*Eb9B%VEFxNo(WAfYA%-nke;G`#g4tgDF!GYX?YpCq4l=&T zef%ojB@(OUsHVA&o=^UG*7W}2+2;OR55vX%9QBU8I=$1JFFIamfAjLwc!#WNjFZk0 z?cIH)6EK?W^QRr69?V72n^iO%?L9x*JZuTxD&<+n)*Urhn?%l)p~s8N;z4PV39`-J z8K$jvx_Dn8EV`23Q+I)`d$S9$=FQ8S7fUcOwC1^%3oG4JV+n5F122pB;!Q!!L6wyd zGQLW1BXE;Yk0(uOlQWWguY6#0c;}UJHC_&}AtmG*IGeZ@vC&o43FGOPja;!Ow3V zeff*Cq!g8g8zRd)nAZuuZd*`X}$;MpL3{>X#qi56@5HrIz74H1*<6#tS3-4e)G!@s3FCjWe&lYBcM0 zQ%;tbmTxw%t?ysmUFq}fxzwNcuP=?|AYMQCN_7~`&4fYHs(&7E%d%uk#t)p_+MI7* zPQWnaM7&*`-LK*OC`CQ8C3>+mZAp&-1t)gIC;F$q+vOgi6&^N)*9@YiaKkW-2K-JB zGMUjq?5AI#}M59Qp zA84tMelSo_HmBy8Kqj9u*!Q-I_(fi-F(SU^SLrcSCTdYz6CFqay;0=*A7p$yYL0I| z+27nxSv(JSS6_HLxgGtb2(4CJZysbwn)M9T-*;bo4+f7eEUa#k_oA=~Y+v(Lc)H*5 zTmqxdH@EfO3>E-;^LpQ>P=6oxz4vOo`~BSBTR-A~&+Vw%6^ABv-s7s?_Ymauw|{MY zZvU=P?Id6MX2}b(2R%5y_V}=C@#3wF+PgUouVxT@FeB!h$`U&15sI+pTu~ZDhsBP_RZ^eqz`)HrmFU(WSjJUoYhTlq?MNkPEV7cBuZ^eNJnTex)K z9ElZOlN*zMk=}E()f49d)}}dWpZt*vKh8qLDRSnqml4o7)i!*2vIfHjU2#^VNigsy z`dm3qtOzBVb01_yuNcioBGg^mrJ{(w&8iswiM}2`Zlg^4@8Ux_GT-sR&DA%*w0Zpl z89SZVczOIv21Dac?sA5&Z$8)@Hk)7V`+9wJ^XB%Oj|cDh{(txNy)q3fXkTnvY~we4 zSxk2Sy=CAQ)p<#$K}z@i_y#Zi=-0ccZ@&G>_icXc5BFR7`0D2V>tEh{?MuI~dHdHsxB0?ne=!}lRvI&zgR^w2;2wQg^(5OE$5vXT zjy=s#6}&jg2oq3R=Mt_c>?<$d8#bdiQ7;UucIfSAI0y|+yc~26tMlof;va3df zX_%$K$q5^loO&tyEO!we9P?K+n3f6bRxIMaaV-a9QlOz++9BHXr_7KeV~`iQh5a z?g$znQMXSoMB(~-ueoWPx4S;pccoohuMyY-fo1Dlq+lu_TF!R~od-1U=UPA{WsczIc59I7swRO1q{m|T; z+X>2x&D&r2+0EB}>2GYl_W8fMdGPud!jtG?3Nn1~U_}m|Wc-U3O8^dS3pbTuh#4?k zie&8{6a#cAg(6aFlZaMS~PC8mKSAvcc3A#X+q4 zu90Xh<}yBpF5}eaEQNFxZTrm&LGL1M`bU3&uAK3jAsxqwSepb<3-Ul|1-~a8K zuf6oq&6BePBTs8^lYx@ZB;1XpUjC83R-X&G;~2$H=Na{Hzxmb8J8ylp{L%X(IEKd? z&=`Atnxi?pKD^g>d9R>`hX)_-^`3IuYrDy~_U^0i{om21HoV{m42U6l@6$Gbbl7t? z?z}!*r1yOpMISDo^pm$*HcJ_z4>WNo{9Zrg3Ry9VG+AM%;PWDImTFE8#0vIm$l27s#CxzD+RlYMm?RZL`iSy(i$c zJr2OYbkQ55#6~W&2cE%4^R+qRm;x1;txYsH^cs8|e}hW)iad?c8NEqhKX22?=O15h z{(d&nuNEQW_(tM2KydqB8-z9AMz62?tzrY{TI@d&Ao8pD zfUx(f6RhAh>{N^km6;lTKl#ex=68JPa`U|(KH7ACZuAsxI~vJzR4;|!(?w@}m!=}s zW%4u)6hGG`l_KI3l3Ly_pDvyd4HUJLibE&O@fyhtj_%;MdX^8-!#paDT{>HCW<~P3o|BpLI!Iiu2 zb$X{WSpF|w&x;^`>F55&=9m7L|9bPzSAKT$_{keN0}iP#y(wDUnjW)W?Cban8^U~=mo1{dw^}(rOXOY)r z)YJG5Z}f9=F6(x4ccP*#%jZnbQ<0)81+vhLjY6$~h7&T4CJdX`ko()nCG%P z>(=@*x76ES+!fNq_O&jp`|oXgx|^FCS@(CJBLi3AX&VgO+kFm)PMx{EdTOq__NV@f z@$cGREzCS$bXl9Lv$;I&zFWL@cXQkJJ>zxRZ=c)y{jf~*zVG<{&HKLd`#0Zt^JAO) zzx;EXFaEXvVe`h%|I`$dFpJpNBd$__DcGw*?F1ZJvSS-HkUO6IF@{wNPPAs84O|}# zEK3X%Wzlv2CQ|CN;du5VoDrs$L0s$Bdi&@eI^FFsqew*-73A^mqLTnQQzLv^0_3Ub zcg`DIK%TZ%uNA>$833Y<>Z0+lo_+J?YajoP&6Cp)7{zbeYtb-NEqWHsWAJ_D^_fH{#;wfyV_WDIW3 z*NkTi!`;2X(eNN-txDUfb4xjmJnHr@rUZZS{!MwPFKym;=T|nb9w+n~Bc;oUK+fo5 za$S={6f${Yx%GMLz{_}&UsJsVlPKTAhfg*ym27_Nwr83q<}7VC4zk90m$0K+vGFayjKw+SnwT zlzUTov{`%6mL;OuWt!9Tw|?bf^OIl9@Ovjq1=xBe)+UOzgJRuH{RK<#@As7Tr3!uD zm7NB5KU@b=zjuvKfo=J1xh;qNLnT(hsk`lC8d4{GfWhkgy$x!2!DiQ(dB5m>>h@~3hUw`(jf6`B3y^L2akGx?sD_v5!uIIKHU7khc=r} z97!2?XOUbANI3^MCg*h0o+vn2_s70Zu+-=?{(+az5ildGq9w6BQgN zKEbUBb{*@pWV0vTJZMwoX&ZU=_C28|gRTunHbGgD6KNd!H0k)~BU-Qb{O`FbSo;C0!^dU zrh04Kh>$VmF+;pm2E842D>}C&%F2qeM6J~qCCPwst0Mj9np08JyGGXc-EW_}qE(&R@0sfw^%}EcbARX*pEqZ; z8&l(J_lBpFZ)C$)S~~mlUo3a6T*M#wz|+ldznugqaPh21!`*r;hjE>O$%wbHM&du? zOCG6|riby<{hspi;7L}c)@xJb_oa4rj%*6w*Et#-GO`1GEQMU8uASp{UQ%sVK*%gI zX&&pxX<+DajJ-!rX80%n?wsD96$pGFdU+fT8V`eVcEv|uc*3SQ%$W3zMjKmw4<4ek zw?1*Y`RWgrqH;&{`L|yGs37qE4}AN^`*(i&k8ghFZ~k|iFaQ0&+KO8%7UiW%c^kVW zIx0pIz8UQiLo`%ITj;Vx8(za#Zo&v7yRj$Lq+*U6V)%_gkM5$EL&iRx+uOztJAdT^ zlTjp?sJ30^j6g>LRlQgBvY!NrI3un2QmhHkh}Key9VNVzMBXrBb%&9ntvZdlswhvv zaSmzeAv%_9KO#6vwK*A3?aXeu+CD3%z)q*9g*h*;8dQx6Uox5)h_msbMD<9!z5`1H zZ7hx*5plHK!+T{+%y~O0KD+mBfB0KA-~BKB>CN3we)kKZv9)E)6sP$!Uwx~C_0yz$ z?ZdYhm%Fg4Brv*Y&KOw%W81w}b+y)Oj6Y-db9Y%=@A>(nz3xxD+j6_nVb(Rcnt0KM z@9!2|-v&zESb|oq-O#4L7j>2EO7*AhuJ3NC;`^H4_Lug2?e7{(U#G$Cr#n-r(0GRS zr+)O`+PXotBXenhFw zijAjji30vP4hMzB8EFP#7vX71)|9T}Uqr45bY*?kLTzLaMlgm~Uqlf`5jA(umn1Y^e);7E=dIy4cuE#b3dZW97Pepd zKubY;uDNO~=w$fC@7|EPGft=M0;xOerB2^=G%fnEE(G_!Pn(swzCPW2;pXMdSFavy zUOo8PaQA4ONRc%d5($3%;8BXQsM{@BrwLQSu*T(M-L%2Tz(jvNlXcKrRR$uXaVh3# zv-y&D`@yA)$(-O?BS%#j1Gq7Xrc%`MPet`CF^>@#eTWiKzH%2G1#))Jqy5UyYY9^H z7{om8(s_@2ZG>0@X^iEMf#+U0`)lvKZ}a1S?`LvwE;k?g@Hf|1G7n>d(-yv9=8DhV zYg?k9@8ZS1UAcANg4tn=rOGxYJ++Q2fAl@vQ8 zno~>faZDUg>%F7KEMse6MrF>Ry;&W|uHk{qRXzaMO zoyYRDIX!JUsOZQkkM*LDpGDTP2+Uw21?QQLrK~2$HZAq2pOlBoev_&S9@9lR&JVJSpA~ z!O80yp=h^T5j(BUd45CW_0WAxNsvA+RBrdtEyqSwSG)SVnE{qSS^f+Iu-UCTgmv{k z_9K66^X-51PqyTfx4dO`%z)|5!MwWM-+qCL7vV5v=jvP{1l97nYsb9j+Ei0^y{6PE z_TtLioqo4{Xvf7}KL#-uFzvRtDZ0u}zgpW>pD){ayrsk!TC+Vx|N@6JcQYx4*Ht^aCs`@j7UHb4Ip|5M9g ziZ}?Rhx?twJ6GRL=t-8UPAm? z-mb(~bC~0C@^+jb+3nt2#a>%zYw~uq%eEW3)UFhV>S&>{nCMcryE@?1<;L*Fy>k5C z_nEvV4gBW6z-VV&F>2m<>-7$9eWwS5zdAf-c^5-JX?e;n?s>**9w45b2zxwj>B}pdx|=fLGZW_x7gmyBDKs{qEEE z{!zg5t{g-C`PK2}^$-1l&F%f4*&IIk<)JA_?{G@d$_M6hsxv7h&EFW!d7^c-LFvln zD|o#6sV@or6IHXkU%%i6&C*yrxSkxGyuTFm&<7z$QQD zsX8fRbDZVB`VGp}OHP(#^nvgDCpPy!{m*T_{8N8*^TA(yeecg-8b8uEi ze(%~2KC9Ta%zRAbgX|NGAP>l-FaFZ!gYD(!qaXd~=39T@M>fCb2mX!C=l=Yk+dTUG zPu2!mWKv5mi2BLf@;K9p%tUlh?Fk$A&hBj9$>Mrm#Lu$bG8R+N4GBHY(L4-C(ZKqp zBWH-=R3PKDYx5|%l()?uU}=Xdl6w*jdW@<`NzoA9_w)uU6J|DPSB-4~FpbqXK|=b2 zN7>nx`r!NSY`*#j?oKqZTfg=CO@P3wuYKF*5C73Wv-v-M>ObFn_80!wJkU0wJa|}q zuVdF<3O5mxl#`qC^3DY|LgML#gZs&ZPA#_B9C?jjv*23rct&*H$QlZklB7POC zPX-^4JkKg6mIW|glF13Kf7g%x>zi--%pVz)nz;Ynih29eYZ$F@``lfd>)i(&|b9SrckajA86!SC0XQ1>@#f6e#& z$-^S)Jx?-DcS6Y(2(Q=aQRu&=G9 z2)DCnNblt#ef`6~UtAkvnP2|Ac!PAfY?#=## z4>aa44(`dad$;e-^4)Y2p5Ype+4cWw+5S)4C}IbGha1ZOB1!>=*> z2TqP6InM}8(JZS>n%R?T&D z{=TTYs{=moDb;;Nmayq_OWyA(G38f(wW$2`HJAIoI#@k+?LDt|?|{L!lKRRRMzRQv zX&d~1=I{KiHb}j>`N&5;viY9x{oc)|KJ}^1H-GeFn@{}7KePFzpZ=dWpZ|-0F22eT zs{*4KTu6nBbfk!`=-o^0D88Gn^2}HeS}*QnM9T{_*M9ac@{@DzdA=9V)J>ts z18@IR@7p~7p7Kb4>-C!s0Y@2q=7;~)%?CdGsm=fXzx`*O7um+OmD`nBf^k=JxZID5?nLQo%Z2K0tFQ9gS`#_gwlnk5V+FT!TlH1! zHSP9i#^LAszRIYw`?eLXGw!Lj>Q4jPwh~673t`XI)n@hAxLv7@^|AU@&HWb_r^sqN zT&*#8ZC<;Ie)N6*`!kKaTXy|iHC}wb*?jBo`=>j%=(Wvf|NDQxCW&b|Y)!A1XlLo6F~Z@fSKvuAO9^nRoi~GXBih z(+t!U*^?r%l6>Rq_~-T4zcNNL!_bBXyTo?)!9bZ64KuV_+0J`W!@@t9t;<6cFJP$C zwR~Q+`X4&;WnM47ES+Bi3<(ltNAqjhb{XKVjlo9(UTT zTf&>PmuQCq7qLlf4sC034(cwYVJZK`dy?}nBdC?0(CG*nd1DxYZM#js@5lbb&Bs3d zhsJQ{-G9e-e&^-~fA9yV++Y5QpV<7}zxg+N0?*5v-|;=)Jx^AV*Hg_!H$K1awUZfJ zikX56nAuElzT>~9Fmnh0T`^K*B28TppCZpWm`V&S^i5r_sRK6CP`|qzix0e~M)Ol< z{_1)yd@DB%YI)sPnGu9nCstO08QaLa3Qhg_SU;v!bt|WlUb^&Me_rTf zMb)l0fBmO_YV(E9e|~ePjftQB^rtt!=QE$#eCu!f*3G?p_onQ3{P2%%Zom4$&FlZ^ zzg_A_hue1*y~>x>E55&KL*wma(^-bt>wGhW002M$Nklgp1wK2|4nl<>KX>rx&9IMjk$3W7$-hQ8sesSwS@SI)!cc%8FTc`kvlR z78XA2dpsTyvey`obg&>@N3~&Dc~|8D7M&q*oMS|0&I7q|6@t}qO47l)bADerF=|pK zgrvNj1C%N>Q%53%7@E-KfqSp~B1~T0${r@XJ?GUxMH{O#`{-}P@sDxvSUbTwh&ux6-?L^j+Q8KJ|My2Y>wE+5El#=1fkmwNk7(cuoLd=>#}7SYOS7(=atgBgpAGLD2Ll%tkkI0X(Tw)E%VXvcue zW5`D9QrJA1=q-Y!&@dDgB1d$T`OvF~BeepaYnEedpwluhG6R~=!RAZv|B=nTPkuVO z>%rwO<^~e)zCQSYwh>0z3p(#!2Nt|w*B_(m8@>Wy{AU#3@bO?MA%b8=KC{0`?Hhl_sXlHe&ya~L~3stec{Y^ z1O|V*Zs&7UahKOcf0rS!<)0?2ABK~&#O#1Ie@2hj0v*_HU-RX~uXVkj=o*|+kEkVu zZ8>YVb9;=y@XG_fOb$HU|EA3^baL-^G6JhNIa1Ng$c~|dg%?Zx_cC~&wlTx`Srd&J zMq81-ad`6xP{hbTV`=Q3uj$Zs(ZMD+X(>Y*emAyZJ5B|1NiOo(MUpu$JbfF~Y-;mZ zsYyqv-U#^mIqrPRANmu2cJqlJ_{T>GqZNm2zrQH%$3On@c)_`Y!7_vXCx7BEZQkrC zpYQ+OKQP9i%{*YWxNM;XPFx$_^}VmIL7CxtFKEOM{qTKge`_TTPP;*FZLvM=F9UGf zfEE?>QwRQUm5U#o(HU3DXdJA{=_8hl(EU*6|77n?pgp^)`^@v^q2`imRB4_;fFuI~ z6PqDTf-xRKn|5NG#2ruA%U-mXJ9ON37VRY6Nmlo=la80i*tFXQVKW(wCo#ze0b9H%cFXXe9miKi*o910gt*n)T?By;FT?EZ#-^rE(Ob?s>zq@4ZvZwdqF zUG)5R!#{juyZOVv$i~blzu@2Ux~b{aEXq5H>_vZvd6X^k6l8gnssBmL0wxgfJ;G75 z6U|p_Qyu~8-j(tYXAbQBT1d#~i>}DK*v}7%}TUz|ghIJS4X?(;7X) zkc{bQH4W7kEn)fOGEqAa8I>BoL1zjuCaBbzb8-nQ!xl;zOKAwnykg)BnUjWb)RrtN z+>u9^KJn%dLQm7-dy0mgsjbrv>xzH$Gi~D)H}IuXetip!hUxxs;2pS^gDi(F24tKH zZ*;FdME_iNftw^P5z)sfmJ@-G#*9y0gA9u)CSrVuM`bJv6vQ8VoA@As$l=sDkE@p!Hg6}*)d?5`T)ExSi)0}NtWm`ynN_ya{25qmiN94U0w-*2W6?m z4b<8>SKrXC{GKomR zj8r0*nCpl%h?miKMmjPl;y>x-u&;+VexS2ourgc_aL8WKKRk%F?{^B3|xpv8mUm1Q_0=P89Cf@t@wVQ9gx!wJRFNE%g zso%rcYJLIXU93Ipn&;(&1=Ex!{j(Yd7asDWxbjXhx)8K&{Rk);q69Uf4oQJHNl!Y^ zjm!F|w=P`&;irFfS$DZeSl5&UN8jUxyClS?|0}NYk0zeHWvLaY=pxl+8oqFuPr=B$ z;Q^FK`PGB68OZ-iTW9Ilc>DM7Yj=G9^Xx}o1x!(@4fB)?|(n`mKU_E zuDUVxrka@y zEC~1YIbq8?YTGcen!$%8u72zJOFJgLPD`(P_^1q#$ZGrZ{VE z2{%)gsb+NDdzd-u)tYk5~Q*koj(-8d#7Tcppz5*`;-S*Aj-8Mh( zm6eiVdF#u>XBb9!hVOXT_|2%}4GC*37)`SrgLgSRct~hUDNXth5>}YW{A{Ka$F7*rrG6J5R!uYrgO7wNj*>F@s)qe z&1-SpPS31myR?rFiKGasGFUshOP>Lo;&H(hnj+D3&CLoM&MDU?Nm!3mDnM| zOy{A(ahk*_X0=?d^z{fNHQM58jA<7;_8HE}k>2;OzOwC~xH!|kRaf94<+r?NUgaK) zoZ+Fn=Ndb($u#{LzJ*S!KYhcK{GR-2TDG@ChYqyg`G4Qi?z-dl_PW>o_e`O0NPBqV zi6`1e{^Bpv*<63!b#24OjU?eTJKH@VP~5`8g2P9TwC{MyH%HSUBd{?<@E~L~f41M$ zCwQ-y2u+kC^-+{iv{djVaCpL=J&(1Iee{+HUhCJdLxVx%w_v8jzrvUGW!p6cr}@?5 z>lV9AI!d)CsW-yQcTS$1VAop6> zQ|u%6&_fTk-~R32YVUc^d)od(PqfL++uPWh^~9TN$Jp2L)=zvQ^{Jq;VFQbOvWdI& zMdG=Fl`~#-5mM{14<@UVmv$8nV7v=oUi9E1OkuhE$RmMxBP6d$d-r}X}m5C;aSca$6QJHjBv(@Am4?kU|qN_nrRhF(}CRio@GV$fdl*7qYppS9)0AI zHpITQ(_6Q*Vw^34jva1$4?N!9`ObHu-J5N%fBoy*v#|v{=bUrWfoewZod521?bsuC zw+C;2JG_Hr5%lI+g*%P_C>#NKY_7s|wf-sKaVpno z$!Ty49Klevv*&1yztq~Xym3utqOxGPZ{8La1wTpHG@%@?coP?_%k>};3m>BPsc-)tLN=%C*X?4-!y)t~5bRXX*x1oKl zObVdVBqlYO2qEH3xP&)s<yS;fO~nQTcA|6Egq=CIvPxr@pKj z1qC}=J4#1BwW%%|V$BFhSUMbn_|(uWV1K0s2qG)eAst8I5^yxt(v<@j%N}9|JhJNr z3ZL^+8{5ux-z1uz_N(vMZKz-T;sfn>fA=jszu2z3?%GTfs@d4HXHUE710To;@C7e; ze!J+RivqV(!Vf&~#r6q=hTUv)@%LZxiU3r} z!RkzedzPDJR$&?wgp|q7nU0$hk(wK@)?mb`6yXUO@DuH*G{fb9!}5780E_hPB~IjT z!ejW-1_3APZ5Is~Z)(eq_TnG@x!5~f261TghraYs`=j^&QM>W&Z*RxY*p9E;NLaKu zXpj{EEzHTsceeZPxtoO~2eN8)!^TZ$jTEX2dh5-w2RA6RzG3SxHuUNrRx7LhkSw*pj~ylVsq@TbCKNX)IFfG>N=-L5p7n z?LyVTCZJqhbYfAq{1zOVBOF5b+xh6D!J8V@NozeS+CMUCvm4R$ymp5uIeUErVc@#!zP~+i$6v6$&o0c{umhEEvKrW93d0wn zDF*@W#^Slmr!lqhJZBXH(&)G*ck&Y6!)<8@+5Ljn;6OxP>jGLA1!>bF-_(ZLE4o7X zq}vKciPk0%CS1~9cBhB(% z;Tivq2lWieP{7-{62DRk!_>=fTQ<*VyGXY}l%GE3kihk^9Dr}#%fS($4xGhS84PLk^$UFC7A8t z?E-gsC!z`Tor^&A_@&OC_q{*YKKq+*j6mj8M+7#I;r>RWtkAUXW4I4_ox(Q3efg#^ zjJH!YryR}1bf2`O=E#oL{kCc^x2`@UQp=&R04$l#gC?~vG>%<;?5zL|kx>Yvt?@;z z&CcyF1_uCOB|VK-)gddLF$Dkgr$32?;tyEB@mOGg>9>3<+Vv@>uI_6e`0$6?(IZFO zHiWO|KIb`Y6;nlaI8FzD^441;7@m9XrgqIW*RUdZRfG_Q4q9Y{kFEx*q!5bu5PwBN zgbJPN!VON08QR5N-mq`~{wzANp47&9h`auV^>Uv_1v1OCh^E9GtT*?`^QpU94d2bh zxG`={>=yWsu~ou`4ePUc^SrzVhGt%6z}#tqVO|eUUEQuc`ibP%PrsR-IP@fxA$U); z#fX8@%@CH)W~;qSU-IB1g$EY$vhyFsUmj?hB$w?sq$N<1>E2)mkJzsA%;`nIBfT1? z(nb(KsJ!L}ewJx%w4~ILvnq-!yLRquzx`Xk)o#4;#&(<$`V^W!1;uQAa{}Q2Ajc3? zR&BqqoqTLp+kfC78-725mg?NL4sCCl83ghUYu!Vqs?a>Dh4kTgcK$g_JG|}8=tk{B z_dW(o^X`%^e^S=nK*3!fT9-;i9E5JVFu_S8Ku-jbt0XLs`mXe#7Tlp#<8h@paw355{S5JBkKy5yitI3p!LntiJHlHnVz7JGtl4 z_O`daE%sNNH*aS3_2uxROzyYoHLKeVKm2dor~mICXRv}0$JB334&-CNsIBNEbv`w% z*?|Kej)(&Y&#y;4mx0oNwuKoOPa)trB|JkLQ6L`!mPwQ^+SR96gvmMRxN8DYW(d+5 zv@7XwWy===OHZO;`1>zp)~&}@f}H*N2Ec$e!!LW)o7x}W_(tfnY==*y)EGg?i#ZAP zy$X%-nNLH;}kTHfwV#u(eKX%gguIA>bs+3dVb@SsU(#J*1x6?vPj$d={e zAqOn-$kCjb0JGCTa7f~(Q)b)2j!`OsqHad5JwMNm)+BL!7GqTC&2tv#9MN+#c|rp~ z7YLO)J2K(ii~KU9YDe&{=v-i=%LxRiuqP%I2I!3Gm{g;m8gZo+5-Y!y39Su@a31Ey zYhTt@U2t{r7@chRJbR{7jV4iXwmJA7R#UI}UGdYWVOZWPsV?3in4Oe9Tpj0I)^-uL z<9vd$5|#?jZ=ak)wVq3M`3BxZG_-K`K=4Uk2|nnFIK*+_w)Xt1+qP?7(e~W_XJKN< zTM!@KNP{1hga+QHQqw&N4$b{Kg29^&54LgC}4 zoBp)@*`NJ!J94CsHNWPXXSegt+ZN&O=9@oC2QZht{4T!u;&$0(mql}WD}vvxpZXL7 zEHn_5>zl4;T9}QV6+o;W@i7qOsv@hf5e#WLRhi}Hdso52R8%8;I+uX$jDbQ=`AZjG z=H$BqV_tiw2w}PyK8{^l#*?nqoLL|GpJI?`Qfg+@3Xh+JpAwV?)^Kj05YGX#n3Myvp;b6&x0sw)PYfHPnvG*FW#&ZQHY+ zpXoc{b#StK_n!9Fx4o^s^Ih+X=5K1#wl=wGJF_4_i1sQ15M^{gBau&|6`W-;%iPgJ z?J))fhYlTNF%?_=pnY0-c5SMS*j`mpF=}NsDST7H1!={<9k_2 z{`18@uep*Q3He>&93*&^9u74{@&3+#5RQ5Y8|ipz_ef0P@L&Olx;?EHKdC&V-7a#T zJ$$C^tvQJcWsV#^%+uol(WtCDr;V{ykU-93_or4EiJm>zs7Lx9{YB1+JrB3{zVCh6 zKIw;k=!e>KpZi>B0{VhkY`^LSZNqb3(e~c)AqI(*la0qm*_NoChFUPl@+@iV-cj@j zbw7rk)*=S`OE8`+l!RVR^FE{I#X%|BKR0ro;+^vuu)opF@-51m1yD=azFtfDF2q*w?DY+afi2swZdW|_HSOTOPq&5B3|Nq@Y@0SA zd7OgYIDA8!z;Ol|E}T6*d(`9Gu=VCFYiMS1h?x%d16*V}Hw~HvN1luBc-%p`1Nuc) zucwVeZ$9Tak!JP;{A-qzmhi_-!s6zcDI*yK3D{fOC}}oX9efh?MFA%8bSd=D7TY0m%ipl zEJf$TD}TMFO4nXclS%pQwH(?nQ%tP#Az!a(*=TGsn+o5*EQgJ|Kis92!_RLnHC16$ z{&bfylUTmNLc;Q6MRd%sXS0J?eHh?0?WB?S>I?@NCY%W;5Wj;II#~Dyrs|L@aHVG) z{5rsc;|^x?Dj1j33IvI+o4JJj58@X-{WOqaEN4M2XaG<#3WPXa^bdZp?YZ*Lj#h@!IXL=N%SVR}ok`f)%a1yhc@ij$ zaf1EZG?vX)A;eW{WRbCTpekq_!st8k_MP)Qa(a5NUikC*NALT?_Tig96pe&svOT_p zsi~X)@}upOpS(3F7yh+u_wuY~Jv;T{l<%iM^BLq6wDELY4yc~w9PYr)+hh8%+RZ&MQO%A!)K64EYor0X*bbz#cJwD!3JhEIB%Hm60nywcEV=Z zGLToBQXAw7iGq=JZa%IkHtvoc=MCzK7eV8q&V*4uHRhHG(g51D$;;c0`GcVsLq&5= z*&HFySq?f}Hdag76au7IqNPn{TAcK~q|McgxF;q~Fy-Q^I%%^seqzru#&!}oLYqc% zU_ttB|6|$Qsv)+^)WbaKUGTDhim=WI9yqKw3-Tv_@+a*BH{H|@K5@8>v)#+Yxm)3X z2<`}(=Bbgt>E;~)z&7F@sUsWDZKn<&il8$ybCAyAc+MkaQ&4RVGL${ z_gB9AkN(;F>-jgho-(a2exFpIw9dH6gKVE&B`+5t;mTt`iPjx>ESi>LKozugf-O;w zyTVt0a5cVmLxlAOW}CDTPQ4*hrJo>-bhN}F1>+mfK{!0#P9NOYZu;|^sMnG9@BaP2 zOB<55oSnGpH9y++-SbhZ!9f5WEz|pR2y$xh9E942Y)fugHH*8#;3zyuZQ%)4`Fc+J zJoU(SxcE6OhgkrFi(%faGR-8^;M8_Ak_u)P4t$_h2Ssk&t`f$rV>DNgehtqkxGlVD z6N#R^zL7C-{fqxe`=fV!q8;3O0D9m=Cj>nyRa%t(=+>Y+=>a-s#YVORf;Q$j>wJcj zX~tPg;r_S|9PL{*CpdvJMD20eq~cCo8<~TP(i;~I!*=N(ag^EQ;CmuDAhdzGQe;6* zp3)q5R^>s=aBFy~ngum7FiD8irRlME;N7$&>LG-~8AfA{v?Y9WJ$c&DEtDfC*jyT? zLgy()&9gE>`D5{|AcgSg%Ia@;OGOLvCf%Jlm%%dvtF%VebPF|l?_+r|Q(y?1^v40H^e z8HrS(A_9lR$@>h`b)E_{F*TjloKSO)$#Hb-f{sN74z53+gn2HhZK15`4CoLfaD@!W zF^pFba&#AT1bJZFX#V%Y<~$D~j?|uN6jweEAhvD0g*BPvtL6 zxSxT~5`Yw@KKOw@Z?}B>qjVy*_o1c}8|k3#y6diX-vbY%O%zQG<-Ff*Ter5GSqO65 z?RO+m8HAgDikuJbsfulcnS7mut33TbIGI7{zkd36> zL|1&PZJ|*oOg}|x0qqbKh!pyKKT`lK{-B`e)x)-b|ADr1=kE6ESHFq@CC6dW398Ms zt`-2=nTaqkp3$aJw{D*?LmeI(-rm-XvgM2XhjNTCm~iy04d5aJ(~&VcY`4y^WMnG~ z$yB%DL$3&-@U<~C(bEXfC&({wQ-%y+eOhnuLxX!%oVKd=;8|3{K-SJ$!)qLggOGmd zi`&NS7bRQJw37hoHm8dz@*apU3+yV@KL20YTZ8~sB40oTsl+wD9i2sn4`+P1iX!Ohw08yW-C92>V|#|yCs zd^@YdClLSUJZ2DDm6pcfJq})MFERl6 zR%ASx9Ai|bMKl( z_HY|_=Y0NT>;V83x=d66VozgYLIfPWwlUHs4KarQJZ-CX__W-%gO$I0at*qvDh+9r zJHbG};N7(O=v~Y$%$|HR@-rm^3rD>eh@D;WaH{t$mxx~gOfO2Y-`0y} z2i^3Cfz=M@AoEV6qUOWQ6$a)Ue9%d*rlWShwO+`uGqAo~(K!MQxebbG`R5QrfKnzK zK!Fb)hB+VeTDDqP7646e-MaPd{2e>kdyR7%`@$zy{g}=rmtIPHv5a4SNxM#6TE?e{ zUJ=~8DX}R(IN1Bx?)GPY`u=w7t)DYb(`j=np(LwZu`{h#@&GsF6YUoM!c!Drfbt8?fIG`0 zPK@tyWm5>&w_|s>f8YKHcnW#h1evFBdOHg3+q&Q32c+dwSPREXX#Q%SyVt(MAoFHGCifp=BT)hryP?`gUQH!m3rP9oU7}zXqWU zO%HB`!=?724}LJKQW-+CVtEwcR!5fRIKO z7%(g-2o1S?2!kfv9Z);#pg`ij+vnz95tts70-|nFc$eF1aXV22icF-}eVn5qy+RG3Flhd9HO+FlxTZpsQGXMiuT=VL7(;vRQom!j;FV$8l zr&~ee;V%xPp)L2jm8|7`ww26|LEsK{6b9vs^0o+Fxc9PDH0FL+?1a(0z{}whiQx%> zku6lGCV^2qgr`8}9I>M=SI)Vu#v=RlN!U5Z6=pk!k-j4n1w$LH$!g1`3S49Vc^XI< z8~!;aiva0x$SX_^qOTTeyDg2)It-%MUvyOpFOYWTcH~K1hrIMmB@Pv4g`dl#(+S8( zE!W`c(!rlMlJa+DTAh2xJ$fEu{uQ(Yze=%BtAnu;9ORUjxS2)wLL&9%ule=?Dq6nd z#ZUbgbmCV4%s7A~diQDsVv2wKvJy`xt^xeKCw^QzPai!V^w%$LhV_GsXI>Ld=%5na zy7DAk90&_+eSUp>W31kORh!&+UORPQXJFLEMGc@royWXQNVF-Rg9ggL=R%0Rh#bNo zUBg61SOhwSKrs?ytBifZ@OR#rxYk|KP@U_uY4b7eG!UqHT!| z-nBtH%7O^nOEqq$kmxYfdVJ~Ohbf-|51l;?-`jmNFS+EBY=_dntbgMlo3jUN? zFbgJO?&ImAv#3*u$t42l;Kcp*?c3Y7ZQEFoawM8Sy{ZGZPKpjqt4|M5^DaFYzl5FA z6q@!XjPPv@E-I;MfB6x4QOBm6I9+yA;Lpge%ZFhZivrar$mXZ5%=s2d&Uymz|^ME=P#%aR7|g6^W1@qi*>mv=$)~ zzG>&aG`XRjd)ad{P|;m8gd?2R@(1sD2P?Gqw2Ad>+RdJHiwJLv#P@94fxy?}tjCeW zAPy`jPp}wVh~p8oeh!B002bJaOM!bHZL;7gSSSpuadLYk<5!zOFqd8i=@FPqx=utR ze+AcHA532-fd8BdMshyw-2DkN5$kI4I{0DyEVh-z5 zTgz(WX*AS}y_l55CE4O^e%W~-P6D7O7x^zx-y^iM@%0Wv3^bl?&d}u1v3vfsX}EE(Gi?f;((Ek4q6_6*yhhKPwm#~hcne#oU5J*kFGrQ; z?C;ZzfdQ}k8^Uq!)+^e%n|HKhPwb(M+GioE(QQHH8SJP%9>LbwqjFC(OSTBzTJ`P= zISEb8&>rmj?F*!RO{LuW%8t-=7{k~Ej2 z02;Ka!I4S2-A6CUZn*lJY3vk*24T3clb+aZ%{q8>?}G;41y&=}$El!w9P$u&(j8LJ z=+mjhh=ZHn{Q9(osoCqlI;Xf-xC&3L$xDLNq-}^wz$Cf?1fnD%<46Qk<~=^-V;Y7} zeujx#0#`ca$?qT_Z@gO&an+T(3T8ah=pIJ#%6DRQag2{+B~fW7ovv&|5nf?3iQfKk z8F}VQdWK0leY|933~oC3tG>DI{OIqe$Q>Wbv)gSuEhNuvK_PHu>h{?1U%y4D| z`zl(*ELv$-nY!8+FZ|hC5CWf_*X|6rjD%$Nb_`?+O_c^akSDI?IJV{jqd&!^>r?wY zMc}`YQ|cxa3`3`F-F4^ftn|IH?PEjb()!U3(wRx12q3KPRnW^6C{9iV*}wR_R#N{-~>EhE?x&sKSsM3#{VOT%=8D zX1Q*A4cRW#k#jKW!ga$=sE0i)c<1 z)N;e*q8Z{_!OF54Zr9A3cGcP^Xo`-8U7ZZGL~vljmb6Ki4%fynp5#$7%-TZ|CW}VL z&emxYJs|8gU9h%xfRZT{2biZ24n2dJu`yGEXr&>YMd)yR$F;$; z*itwdX8*W5(3U=mhG`Lc9(F4d@UI5XEni9i?CQfdWIUe{{Kzox<(~K8R63!itSoTg zN>}Sa+%E!?aJzpTh)BJ=XlI-$Ch14*ld~7*;b|3`^7KNr!gikrDGN&fQ?GtL5YH7a)cok1=M$HINK|uvL@+CrXqmHM)C1xaelj)Ya3b_2o_~gY+r|g9_y!{lSZF^hoHeCT=|h8!mZ%d+g)y%+y(R<_H>H=N-)#G!Pglury(br3nQ9 zDc(JeED__C;6G_ZV1Z8Q*hWWLKtP9VXC^b1hVeF))VH0@h@As)pImdk9$(k1gs@uW zdg~`|Y47{PcSeA4(bI{Ou5?Ar0On}XK&cxD+X0Cqr^?lms3B1J6CaN9BK#3Xfhto) zH0b;9e<1HC=|oSu-3mgLf{pojV#jK>zi?_QG+@Eypy_n4&Q-DJUYnw&p|(Nm9$^U3PO(lirEEKk27&mgze=*&eKNtB%kpNLsbfj0Q+kv%HR41Q zS^!Et#0aqY6-OdnyjV91d7cq}8a!10V4_^WH_Q=gqbM7wVAAZ{29+SbNoN2OS(r;X z0EPZM)S_qyoIEu;@9T(mW(xSmO**pE4c?B{{Ty5OWR+^gP>|sbK!mcmUtl={COG4aU;>Yuf&Q`*8@~McS0~rQNEw*Y2buKd`M7-z^?!f1)?wOuvG3emYkn^Gt`sca>6L>diz- z`0f1&Zn_E5XMkVuRPpdlnAPW9MN#Oi(el|{j(QffT4g#?J0JJM8iUU4Acp9;%t5}b z?aa&+M&B^ln(iS8_6tMW($Nq!d|hH1#wnN)M&L4IIC?UbnaVuXS}Ig11ci2|HwUb* z$B*@+fFh$m%*xN3Z@!rohkpz_?!`3DYFg~LEU&l$pc1T{GE%!`yQA|6LvR$=vQpJf zDH=1{jH?XYU(*E{pZUz^+Q)BkUp&(zyb-uMa>%=tVcHv5%&}?nCZ=(>VuZY-ZDn7< zjck^?kyXCh7*;%R+tU(HUn$BN>FHl#>Sf64Q|1ts{-yqL z%gEeXNac#db@6if|CEx56Lk$^(hi;R-y7Y|&-PzWWxpdXK{yKgLfe z=m}JSr)aiD6?WAQphYP;uvOdwdw z5&Ss=7fnBK$Oo&ZNRYxWfZC475da;CNOL=${Q^sH_Id_kU_0AIowFI!B-*G0(i7MQ zALTToesRz=eT7Pl6PN@o!B57=r(*InGlM-bedLl;zU-Uavl-fMcYc$cQ9hGYj*!(GVughj39@!@S&+jb;#ObJ%$iTa-=9 zw7As3D1mw_R4Q#6LQRDu=QSMBB%?9E>dfF;FqF01F5!V)3t`E%lC=?=w2r-dz1A=O zy@*u;ir*F2s0CAf>#nZ}M@|`}1H4@-$+XK$@1$X?RX8J5t~_Kpm2O~7d~s!{O3h$~ z5<`9CUXcJ{%g1C2bEHT#_nCa+6O;)Q@iDskCk9Tc@-vvPlQ@$R*(-b+nJrQX*h7Q1BqaV+Y=lc zcAUN8Tw&+}nUs;v(hg)y4Poe@s;$>7Ssg`dm6x5I_XGFeA2<~HT-G_oM4!S<1iwzek?)efS84o!BW+I?+&e$N>YK+3Bveejcq6S`JRB_L&)F8H z!6!GY$>zw~;VvQUIPkUsW#eHs&zwKOYHHv;!4xu*D=;2inN9NSYq>I6{w)v(kW_gT z7Qvm1Efhq@&^RmP#Z7nM0AT=1`Bee{Z$Oa0VCS?5O;hm*T)0^l6XuR!mrR!PSk66I zq5kx<{PG|lKx@MGGqO=*7h6> z9rS!#8c-XrDS(3)X>St2QMynF&6X`>L!TQnC&LQ3c@sMN5{51M?3CaRLxNl$f;!r9yg7U{q|p$D2|Q|U-;|%ySPS-J2+4lkkAUedPy3+TjJo7|IU%e^tn6Q3<97= z)YDknABA=#UWEk*0~%J_38*brHdtb>H}uVD2Qj8*)O{F^sloIj40Bd^9b^EPo3^U; zar+04Xwu+2gb$UuZy?TW2Fw75>8`n{FSl8A$cI0~mM(W@x;6PwK+ktnOBC&2ud$#!P6y?ncpA0Zf!MRr&_$?1#-T%p zC|7kh=9fX7hQq+`)eB$wutK?d&7yFhSvKf|vY%kO!IMV3oo2r5^2^$lS6SBPedI=0&8Z{+IUD0WdQ0Kv+bpc$)^(rCP zx}*;06bfD7P(pHqefZa*lk6+HN^S+8GCsoV9NJOiI;fHsG^U11;9w36aD$n;0A!98 z=qLFb!(e}6?KEvh!3{ro6KT6ZL7uflxkv_{rS^5Mtx_;x73v(L^&GXd`Wyrm`B|s! z0vBp&t;YdAfG~m$^&7@V*nyw}?1h^F!gSEJ9=vr`8lLQDJj4@s*m?R!)~9VmJorbG;oD;0%!U-d*C_Ha1g@n2H1hIGA9uEm_4*OG^{4g zry59Z8**T;GHTE~ki2TyRbaVRuxRa)^<(`?Zc%H@kr2TnLx1qbuk z8@d2w%OzJP?Af1ZAO_eH<~V1#LmW}8*#~$Ia86XC4bNi-udJo{Ky3yNUC@5iT2C@K za8Sh${0dIRo`JAP7JyV+QXq7X*afGUZ3gy-@HFU@FFYkYGlDHvW9S-=f}9P<4JdpK)si{%|!29md5bH%cZEPr&4c3padlR$}|Y4DqRj*u}sf&^hkun)xj_2 zKFeGA8lww?Th9pXl;8Kh_r`wYz=8ca$)Wa1BlzF)aw=;boBwXwv^jfJeaCCQD~Fd4 zrdowlJalk{yLInz2i#@Y1%}dECU6$_u598k#ScCW)}`q)5h`weMM3YbgZTxgzM42s zqvxf*C#YLWxFY^JKr-l&qzk5I?0MU8S5;29@$~fD`Y|N zPD#z9<;iIuBo^U;@Rnskl{o)S8>U0%`#9Q~<8;x|0+-3O)pgu7y_d~&5*0|gZB`q z7nsC{Fluw`)S;cL0`Lrs&Mi1>Q=S&$-ihA6s|j_Qb^kGrj$B)H9pRC5onk`_2`ve0 zI{B1Y+FEKyJZ0m!vl1)gUgJGO2 zFQ>9S$s*hBfQz^zU<`Y!Aw@&y3S-|#*?Z89yN8(0bjv1*-|6JRMIM&5Y#9~qT-4GD zi)a+pChAsq36Khr4%Q+}Mibh>Mp{*-DubF(OPKQTzVaHl4;+^%F_;OCmT@DFOBf|D z;)t_oV4;sC7Ma=UQgNY8J4^ev)C+x>7JcBpW zbw5vWF6@%KW*evAUA6(WeV%9}8<|^Tkxp=GABhl2SO*fq=nRH!VGMecwaN?L^Z2Fh zm;MW$XRoIX10VU}zniSb)@^4~^JCe>-)&m#Bc~W#PIRY$NR#O+p}jf#NH!&x&uP>*QQg9JmxG*M$@4@h@Bk5>2Eg8F`a!+ya-9;kq9q4G$P8_Zp?cn&@ zjcGJCfL`WMdr<-oZn*1LKR!~N#ECNjmi>!?2y?>4!%+2I0qZM{y7w6bqvaaDkQ5A1 zY3h?S3IBeM68g>G{EZ-7gL-X8JmI9*$W$s{{cqoycnsA0-uvG6?svVrz2OZ%-oEYC z8lU!s;@Q3WNHOx=!P`3|ScT|2B}2r;4npD))Gn^ilr!He+zEAtyKz!a%XL%?JgFtk z@ik~i3fizb^5}PAsy^Lt^AORWVf{P{$M&-JR z`7ERD35eT)ingVCN;8tajCppB&IoPWPImr(WbcE5FvIy;Gw5(MB}0w0}+9RluZ8|;8>XW9+<4I)^q(5-@WWW{Y-Q>^q< z1865Aq57BUbK2diwW~1e06s$?Rw1Sd=tI|1Mbrtcz zk)~79xb0=kmFwV88XSi%Pt(`VtU3?q&R)+%42-YY0(BzzA^AH;F%7?W@sBfHYV|y> zSJQ%+qd+4n2r_F+`*onKnb49)szOsL-)vX5jak~l2<>0`ayuCL1>~3`V-f% zL#OM0{nvjrb|l~RUEfvk1QC|oa&&mI*j?F56WA3_@H>dAT=iAB5W|UBA-dOu=+o0D z?<>OkoqFo>CPKyWrQAlD9_vVir-F|*NNBQP#P)|FZp^3D1bUpC0)?wCG17t03YBb| z(GNn1Zy8vieeRdN%k(qNM-(rGqrM|9BlxBE1n0vZoB47Lpm-3s4oW6YG1v+4mCnjv z8`@v#xiX+<#nNVM2MSsWJko<`^0I6SU+D@cgL@nbyQ?-wN2itrNm^=c*@1150wC=s z111d8CBxp?x0DW$}@v5L^dvu>M+oE=V9_=P=DU2RNGb(LKZ^G(R zTnoE`peI=vUccjPoGh)o;>@xbR>4f6P>prDQDa#R$y6!R%JL4~Wl-Wo7_xl|b!&V( zKH<3RdH%(C1~nDd_Fz%-^=?Vi1@fd7NUQgR5}iJn6ur&2#YK zfD;;-MF5QO0X4xcGleTB{J25y;VY79CWA}pg5gdwMAYWmrH^mmmu!FhtS2^P>$ zHzb_f7Si({VXf&{achqJfqR7rzl~!wUi>ln?#-8S(;;u2r;p`;_}B)$B6*me5oj&R zgM7&^X93I46#~I|gdkv!pdz6p8Ovp2gy;O@-c~PsUVJ2Dldkkl*SfALRiE6{bx!4w zKKwRM>aM@5?6?VA@BqF$8~{xRJL!9M<*hIL3JdY-an{46V~?&xGZMTZoAn1DT`ELa z>Tw_*EN_>OFaa6uOYrogpPN{X-MfQVI#Al78dPVmvbi$@PifY2%t4pVjE%bh30z4I z@+t*I1-T_o?9uGWK31FfAv7r2SJ#e{U;&qS&Rke08C0fT=#N)zw|Hl-XCMYPY`vhZ zfp>Zu%p#hHTVM(pF^+^)`>UE(2#~>M3PnF!0O6y8ruU%XLy$4bR{P*+2-__gDjl`< zeYO-Ib}A*b@Z?+iwc{Xm(l(GC-V!TR46mQp@Ys}~Ry!n((0wEmeT77pO9Vrhm)}0q zz(o&N|C3;*%S-R3f4(a}fvY^?vHX+p%b&iHMXqAjLm2k6bNt)h7Grrk)6y1Hn6Krp zxG`;SJ6$_iJKh^_d~18b3tyNGd8?FtIl-G)5?(63$}Wz@mu`hSQD~X`G=7**Ub=LA z=Qa3F9KHu>$WX<5#Z6vGBM~a1-v%HNe}`GQWO_15M>T3(LZ;B0Q}Pi8hSefL+(eLR zN_`3qBO?>h%$*$P$T+5Q#fcrd3A@p47Ld@%lmJz$>5?a56gFd zcbv&|8qL$O6J?Zdr)1~htpGjGIm%TB#vzXT=SHU z>yq}Pi31N2mPk8pGD$;qWifOgr;AyS{x{($NB3RTZMi5jexWJaUN7{R2L*-cSAJ9k z-|}DMP!-m|I}~Am0)}aD>eYriN820+)!9+soZU2_CeecUQM7& z#OlbPvty7+$#bQF7Zk)C!7X5>r_lJ0Ku2h8><8^PT{&!7LN_UwupmI%zmm6u(o89L z^ya454gm28v<@0wS?&hFq)OP@>n&|n!c%Jc)&)j3st*o4(93@TZZggmx z5eNp*!!&;7xG|^DmdG5zOqJpc4S9$W@w~>UFt-U9A!F~@C1mvz0FrJRj+-|xAXX}q zo`%01!A55lqo5_2_ADx$Q2-gHai}gI#h%M8VmvE&0e{=;2#sr$5qP!1Y79?)w@{r= zD!-bz4XobulL1t`VrB{0{pemSfG9TZL)O;V#GbR&=x}Mf-OH+wY`)h<$#K)!|sQ~(}hPa zfuBoH7tp>YKUL?@2bpWAJ%=D>=c$&drk=aTTNq3S5uAxPg@A&b_=Q~Ua80W&OQq0B zW2Zftrga|MSvyYBsQkeX@jWlMuKo#5D%sB6N3{*(IU2O%Q_FY!_(}3Pm_;h?6L=0A zJRjxsiv9cdM+h^01t9J29({CY&KusbV>=o~il>+K`Rb;|QNhi)GBO1> z%Vb!$!4Vdw>UV;4W=QiCG>M3cMhCktR}Q<>4O>!eaombwfpA0EektCK zF#WuAf}__oW3djfAzK_H%nVEzzFE|-;D{eM_8wdc9M(zd4;qCgbCaWV(O*@s{g=<) zZ@F%D>%YRw6mDGDfH0yEM}<|a1mY)Cz_vx-rC9_uUgc}V>g5l3biqF43fWPGI_d@- z*}!VhWrE(q%s=@gF9j(&Fp1UU?WC<}0C7_r*xL!#lQ0U2hV9~uhr9n z*5)x$fvGVVrNai#ZaHMX=>XSls-l@8*Ca*x#?bol1>HmAI1baU9egMx&Y&R#)zC8h z3beb!hy2TZ1y`P59-z+tJYz60&J522J2Sam%Od6jr%p1%A-zEilk|N^T?m8F7Xnx9 zBgxDS?P>8}>2!=JUavcX`Iz)#kosMF5g(L=pf?1{k z)A>qxLkfEkrK8?C8i{I1bxPXXjKK^YWy>)9o5f!vSpODbK6WZlau|!YTGLA!2zH}( z(zlOt6GH}b^Ng-RPg-dCqCX@ z_dTy`>z$hG%NckJ_+s{8A)n&Gmkuw3FWu`}#@CAY#7W5|E+s_0d~|g*cpu;szeE=h z!&QXgF-|L>k`=^YkJPuTdKqLuxbvKy=~Rd-pWN^mvP#FV-~bP#W7hWT6tV35Nw4cz zOK`%K5s;ZhqfMxEzCc|D-LAN+YgTFSYjoLRB!AMIong8W_!MruwUc$Fsw*9{Hz8pR zuP~#qVp|ek1(}p5A`0|R`E{$#$TmeAq%(C}7`0utv$T)IF1+fd))*jugO#*G`>WtUwRyT}6v4ggDOUKPZg4tBcs^2;yH0;SRps^tTg z2y6&f8EsBRfHZA|yk1CDv)AK8e3_r=T1Me?#hNtkrCSMx*xNB}F4=jjLABGArc8Sl z8n6i{Kg=+wIK>q5)M_?4hJr?L?6-drh32JT<`i8tE25HgEMtTgjryQ7g5YMopuGVw z2dQd#a=rRBA6|h+TazVb9TZS=b#bk`(6a5*c13t+Fsye8B4z|sv~55wsY;H}7l}y! zuHdzuGu$CK{=73pOSZOCHz%)lCtZSXeM#F5q>UFiNw?Y)9X4)iZx+Vbr}FIejKskB zv0* z-EaVoGKGG|Q)*Por9qjf0qyBsLTsn){zr4Jq~xA3APqJT!p6uDFPVnG$xxy45W2^U zc>E2yk^vn)L~UG}5{-lOjU&hGG(=ZgA3RMIo}{0zY@qQfc0smrUZ5zebhLVUxn0* zaOqqKWVn^(KI7dO)LDMJAN)sQpeCD6$E>=}SAtLoaLXb8>>$$_sL9~Ylq{XS({EwM zFiLka*I?RA%ILN11!0vDn4%@aQvuQ|OqD$6HGKFQTt$<@=^_A*u0r^8m9Ep3CHxg# zgc9vQEIHtMiNkr?h8;y3Yp{|K;DHr}mftWmS~Xneu?i#cIqlH!%hf%6Hyzuc@x1%1 ze?6mW1|QTV@BL>w@qCxN_IJB?KgM*yLg2$-g$Ss=9*_G%wv!3 zjh4?2Uk$YyKhsf|Q==E*ijGWpt?!!ZRj}7SxHN-SsG7`Kw7jKRlp%IP8gcDR>$~V@ z5uEhtp4JZm%xUpx?g%fe8cK(^K}&Yv3Vq^M*wmQSjc`XjDRYATOpgpXT^dc6bZ7?; z?GVO6g-mqy8W#h&5QcQAcb3zjCBlf+i?Drt^!U;l>=qC5P2}@m*K%F-E>HcWepAK% zR9%~db=}ux;_;!aUxKLhP5{1n&lI%qDUkJkL{bxIioyuStIW|RnhxQ?qvfw$>o=jn zd#|~RVAoIentlX9^MQ_g!7px|&jX+1TBqtQMCfiQcCC%%?obX&P95G zS2@rfc9w&(I9PB6w2RW9XlMzVBz?8}+OArD{}%0gz4C1~^rfS#%kAv%GY$jethgV8 zpF~?n{}6j`O_tz|Sph8l+hN0_=ouoP$#t)c z+QKl?hNDb7Iy#f46j&5`i&n%X8qRbel#31_S{DFw@;|BKnV>$$p*Tv5>5ev z_zwS~0{kdId6`FD{j>Y*N?!H2Oan!`epf!xRuIUJ(mJw(d*qQvIXPrKXAN(Ujo!X} z`)j~Q(%SLecH3?3y6djxM3L<*7I`RxB4N_5P{B_viJjgW_Ej@Kr+pRLeAgbuGHXxh z(^9GBb6{m*YXJyM3!%X@Ow+Im{n{0}VXB)upPa{yG@Z4uV?E9JzS{BGbLQwRjKjfLY!+S1Vj zZRv?!s6ScA1H6_=%~4us=t6qp;$6ExPqyeU>mos1kPx1X#z1>q+bUWz3W7gnBh94O zN94=6J?~b?i#;8*Ol2$!fC_yp?u5}__-q5bOM8WvR796gS9XExI=3|XWt5~m6>k6( zVSVSvc!|q<{;dmN3T~e{-#mD#C`q3M|c|X1wEP<_=JNNJL?HLUjF$}6TwUz#>gd81}i5E$rm_G7uu zR+RSa>oWiY*0ppY{n-c4(T`|bDow}}89}gDrzdB@wV+q|p)}^1zuLj49V%<#R*M0l zUEFgz4YU)QXCQW(-4PT5Az7w}WsX^hQA|q4n~f~#P{=-=lMTcXilmp0$;RDXHF`tJ zv@s+T7&YW9V=V0r0cm88t~HW%)vw!j^sA^AIL~eYX?KWxZ3a*{!AW02Hye=wAhMlY ze)|`^LvSH7RFfcVmwDOlh|`<6g!HIR+g^|3i&(8a5N)9yLCl675&T;|7aQ` zocSF9@%`IfPD?&OCMg(@l>73_HiV9j` z9(FKYeOZl#E3n3gw;i%+SS}ZZD0q2v-1+C9k2Y{`F(vX-nET9UKHFaS!skaD`0&Gz zbOPN-rgqijDY%)A={Y)8fK&K0U-OZU#i^^;4BHE$E_f1GmdW@f2&%#B7t0`oqRES< z7kkpuw#*@vdrC*e@j&&VDGjtNBLfI9>gr$%?{SqU-A@Z<>HtKB>Ln9hpxsEX3kX2k zwgoT1r%);FMpJECz^$Lt_cCkC7=fQ~Vd~(yzYLc`=ZUM&!PUR_&)x(2u?>%}M(Eq# zCNF$eo4D+nHgWN@+UUCV892-x+SlgxKH5&-_qjIn=)G;>iG9r6^C=Q0gw~OyBncf=ANyO#xLv3^xqa+(Fb!6Gn_It3v1SxjuLXd>1DPV;?zkS*s zS3G@}&Y_vKQ{b@;FHW*;*4je6yn^c^F9zgJekn(}>m6;c^%o%w7wLk$tXH=IT3Emm z9=eRsO59O2H6EN`T6SNyw-JOrv#?*(wpXFfLBkAuP0Y!+s;neUo0P_Bm^p+&A=4@w z*!+@428X0`_IhSwK)&IAlH)9Rbh>{6vnVGTfOqDox=r-_K4W+Rc^ezE1-X@k&lEgfZ?cto8`odge`$YrN&VpRhFn!cV|G=l~ zz|AwvCxI%Qr2sAEVj>CDy(Ce+WPt45_s4&7X1MxFM!WYsmg86sapcy%eUGmoJ+0Lu16ng2rhC1_d@dK+CNSM^^LNn1!?hLCl8SLAsp>y0k()L9B-e zRA6xP=5w=2^BU?mdl-_6el<8VFb-UPyCLfZ(+KK zDQEYIv!F}x%>@P_M|T};kAM6l?cgmRXeVyHiBoe9BS=t((iSje07M(JO%1y!#QgOK z#%QHE$9T=Rd^@t{+IHfuTifX`+{zJ*`#GTnA$P@qp$9vyKV=c0ynuv(&}W`K9a2{j z_?!yHJp&@bg0i+SeNLOa;Z<$Z%l{#Dpav3G)8bOQap3c}wPPQAN1K22Zpw>5ie`8G z>Kod`buYty{Zu>t&i_PkY(tG_rBjyS^R8?g-tceQiBEjEo&K}m04{5((i8_(8+@A& zcVH{;q@f1a`jc)(sL!mTMCf$uD($Mqz@>|i9B?B2MY$n)I~U<>fQprcXjq{e-mQOo zO#55uUehSCPgNuzXDEb_8p4f11#NYazELv@w@f2AD~>1F0NR-OHb}irZiS}<}k_ zHp483HG0YKByGXLOuZiwKGeci?=I+okW)N)`i=w8|AnNS0CU zU{*HL4>%R52HHzuNZYWlZ17xhdiZ>b6YJZjC%!!Nz zA!hL7k8XCd3JNX&F&ERzlqK!JcG7E$bWcQ{c1&Xke}PJ8{?cB+iD%AEgUj;~##SNx zshc`Vxm^t5;w|kY#f$Z(JR`L$a!=B^pU*ZdmyBGP>41Iv4z>da52j{Ps4TGvx#6P98tSzJjd$b=ntU2$?^cAV=GdEUY^X`^Awo zDPE-E+#;2Ds5>J}q2(mSQ|NGms{^kGLwr`$p$M)`N`#*JeJ9zH{ z?bN=#2q(1r^UiPU&fng)Tzzrd{sXUVdtdp=cF%v@hT!xzv}gMR<8U{fY0h2|mw+RK z6Ko-~8w0Lew@Okl z>W%I35B(1IbftCc6AunxItp9>5_nT0J}sa1SF;mkmZ1>nl&s}C%~`FP2Bv=17)$rr zvkwt2+CJ!J#Qh{mJDOtRxUemG^P2$|SsE|23lzmKY5=1!=%8?p!Bgm-JUkB5w()m$ z3I$;O|NeUUe|h>*Fo7~hrNAtwM2(^BP_sNd#QI~ELcFW+bFaV|Mr@`v4hQuN$f(L;u*2G(&=CrtaP+@E z{WenGc@0cD;~*bO+w#W%EvSWo;V+sKCSi@WT%Ysq4>Se+(7_tVjh<()LzMw8I>2yv0zElnW0gAKsQQo* zm+)?580Fm#BD?BCH>1#@2d8H$uw%+n+y-0;*5 zOQxVABOgo^S$M8=aKN7_V7~S51#z`~rmM!q+jsHibYyTxJl*)u( zT3{+^5kczE+VyQe2E?aXtxGDU2D;_7ps zyRBV+{k74QA31Uq+<6WqTj+u(8JD)ehEuS0uw{B)6LgwV&WuOcx*-aWM{MpSUHgr zmws2f{B=Ljc0BLWHu9#QX}6&bJ^AOqnfw&QB2ebbcd|;I@>H{6&eWCXhn~ah_D!qX z`q#d^-F?voZRh*{pv`{%rZ#l?SlV3}uQ9}{<>{W5qXa(EleW#%dW*oMujH~n7-s|QRXms-oIORsM)`uU$~8(;p)cI*Sc(`NTS(uO!JVC}h^ z+j(oyrZWh+|Jqly(~ms>NaRJ`j$V3gyZoPge{)yMg#$a2SEbnhnt_Gq@-;;Ow%!4} zm+fXZ08pSy#d?Oh8eZBJ#85VkR1vn!wuJ@iKpOC9z){+=X(%&l4#F$AW*V1%Z)u6u zyiOlOd-A6druxR%<^#fM#}O_)1xN#a>2(yXUr+NZZ8ihy*`H?|2I#41k`5hsg9czP z8I(@IKk0>_BWV)dKeSFWjWWc2|6E8X0oz|XScwg?ZO@I)X|ZM6!W(?jeFRB@K3+PL z(40Dv+-Q_CQ5lN8?>q^pRjE@!OvF3{4q7!KRNv9m5GErP((*g@U3O;dP2<#wD}rr5 zi*z`%PQd`Yj8-E@3t<6FGd#p9^@Z@d`JTb1ZgK3t{lpDVTx=`xu7p~94}0`!pS5k< zwn)i#5Iqwnl1wer8RXndgd8%3R2@`6>fAmZgk+=)b5#f!4uhpt0HY&x z?^zhD8kljX2@#Tny)I}2+RT&+>E!&x&gZ}O=<8WJpM{QgqRrZ~dl#D4RcPDTtQd`g zZD)Z!(&pwA1YzNy#hgxQ(?>E1^m^3m!JslC{Hx#0M-jShShx)dD^bj zI=HYz4Z%F$-iyz=x(&Vl``W6lo7)uAtn){Yw*|Cq^9p>J4l_o|DV&gwwV%~75qvN6nD0LO(cX*8&rkE z!-o$Ct(NI7R@p!IxzCL~-;pE7QcooS8dm{Ko}pcn^`(8M!k+}vve3kBWfYp#Y%AR_(`4?v#1~HZ0FtB@*OGX^_$wn#&g>$ zx~bLYZfToe@#^;IN8iEbk%!vwxfir;|KeBMbFN(9jx!E8zVl)FH|s^f`m4jgpTWCu zb^fV;c~1=(rJ2lz!Dnpm&R&co%`HHCwqy7AnY%H=j?}`w8{)zqY<=C(bloX z;suElk|P40q`OYauOLjPkxGM6owcJN8^H*ho{mna*(>G>6cHBPWxiD5*b712c2qLn zNgFf-P8K0%YtZSbnFxTmr$LZ69YG3Z0C|9okw+S*FMT6UTji&J>gBcK`wL&VE7O=x zKlKgL#(ehr$}nK3YNxBs<9(cednWFrnnHIyt1e`+eHFyLM|UWaIMk``bZe-wJu6s_e4J$GcLZANo; zDO1XO_w9?Vp!ij@+&7<^-gmLdScE>|R1>H$)Y}9qJl=o*1MCxcSu}np5j5>24XYsM zr2wZEP&!lV=+m;BU$t3y6KRS(g<u6a(o_?oTli~scJ z+oAvPdSpfgdT7qpMdM4GqYO5UT4+UiDYFZb_8vIaPVD967wB#M*41s(`iXYQ5B#Hc z_vb#?79RaP<+LoeUL=;jRz2>6iWw?fREr z(uR*fi&ND9m*8E{PphW4=#E{BvdFZXVDSipsW;FigqE1_VAwjP2{}WE>0b%EklE6 zuV*#}NjX-0r+v-WxzD?qiuH5xtoY^5ad3KT4urmU* zHFqb9B89LjT%@@XX_JUXAC<8=Wio+4=SG7zVmEX)up?y|nk$!j&Bh4Eh$CY#XjabI zp=r!702yIpuS@$poWejb+W!PT6fToB~oXn{nrSBHK{x47A-zXGj@I za!}B;OTy{qJ2CR~&G(g8`D6cw7Q|7#S9KCAL!Ev9N-$RAXn8y>WX(Y zZ6SuPP7+#fo_JMfs<5RQH7SmMSEJq1zRHe!6+?P!)V^ImnPnI#4AHdgtZ5502!w_a zrs1R)m}FKq0cQ_SrrF5X&UZn(QaU|t!fIMYxc~Y~kVg0h-}z2;9?MNi?-5uBPq?KbIN>45Ar zO%o+!TUv$g1zbc(b{dj)G>qnK0ikaZdS68FTSU-P@LO_1B3GS{|@VhhG%54C7&1GV8(LssRs_EWnEN@JP+RaoA- z6+slOh{B(j8o^z=c6aWz#f4=l0Z{uDN4nbBI>kB{cX8hfoUsuOuAmo%G4SCf3`6XY zD!*{bP3)Pj?fjH@up=g@wpwcI)TD^}G2$840Yav6c^Cgoa1 zmk`9OPs_UbiuRoEe@zxH-Tm+1+~)T@7y+-s5fnJ4h&GXtym5fXz2g?Jr+oO{cHb}l zLfiW5zt*1p+LyMEz4e;5_~5PoAA4^C@7ZzHch=kY*Q?Z8TIyD}WLuVO$&oEvHa6?v z7~8-=0Fw*@31JC*!h{$Mm;nCZ&j2BlA;4sYAtb?ZuDVSRd7U_kZuLTkEM)=bSoqstVk(FPRtdrQh5Dra$#g zJ={-m_no(whu{6~viQi|rDxj<%Fv5$E@Q8HP3eEptIEQzzbsv>+9ji=xWu>2z}=L5 zUMu+FOS%TG{?d8gd(pb?yq;;R#d6~QyXfHHjY@!s>6C{BHRIPjA3>Z!-JS=_(iCTS z1D62?L<4BXPEAagLti{p1{r*;|C(`Oa^TYsl;f14=f)S5g}u9)G%Xov z=HeE&@}6?HzO;oxpLXl=C;PBkT<;2d4#cEiGFk^D;=WR=f}eL+c6ibUyqM}hpYU?i z-7F9SH{3M72Q!ymaA}tQ=YVjCek_GFEqW+@gDtW+6FdW1`us5afX>plKXcpfH>G^; zcCHZk2e)4Qyt*Bm!J#VBq#2^(qsRE7HZ$D>4MANqD_!_SGpsy(q74aT#2-TRERH#oPv?b zB836vYnKw~`6n9TASy(5^eo{_X8M^vm+EZ~RLbg18933L4)!<`38`h!NiLEbX&6?#Bp~O>~il| zIeWNLDS~pED+&54d=oB733s@Uc z1wUcubZ;xwkest@Ak6yj)%+Dw_H&MUiS56=E2)DsE4{|XP0QL zOeW>?!G!2{+@syY?y(!2yK;12IrZ5;E0eeW3dct=qk`R`xD*$d@&nvbe(t>Fc|{2H zd&LI}+qQ)}K8#=ULU5V=G#|Vtu%tzeUDIBFDGOURmTB;C{=hzjTQtY?O*hQ##$4gp zkNj?sDoN`yn3LpR%Qq>QB-Z-g)(w z`rAG=U*8=tM4-c0o)#J-gR`Cu!10caslsACMp=c4^s@HpEF$9F(?*P+g+d6B3U$K1 z4?4HZHfXa9m^5D*WC5R={gdqDD6>WhoxVY8WDA7>*Dk*JvI?8$e$NR42M<1WPVrBV ze7@QxEAc@r7d>`+L?Ibv<_DaSUdcx*?kXUH8Q_KJ2u8)uy_M%YHZ?LE_^P5#)LmfK zqZ@+Q56{Sk)8G^INtK{P1e*k;NeSwlE3xPR86CrT=no(wkzFuC0&4N>(00^pn*j4S zY&uW`fvT11WrROZ*aZv`9c8l1^oQZi8`&cb z%@WmeH}@KzI0ys1*iH7pkQdR=F2h7}HJZPU_D{i&ORb-<^NJP_*jcH{jLF#oHdmkh z76Iq6nI5)Ln`Sx~WfWQ#VWC#9UC?2@BFtDrqI*)vwry8t@yFxrnQ3@Ov+fyq<&{@9 z$vY)4d^pFFwvx68Dg8`Wn0VPaBb7<0H1BjsMc2=(Vt#+pn zSK>N2u|3){xX>tbG$aw6Z~$TjYbCA1D%bcow`6NL%gWsiTt^X(+zRa2-M3-?cG61L zv<$2e32m+R*-f%Zq~za-OtsnTgP#5_B93yngTeZy5I_S`mTdY?L@^bPwmM$ z)(UUnrvCQJ8I%JMuHce;!yXCQRInW=Tkdobj-A1U3;) zqUW+?33-1n`_d3rN0J$xsHKsxsv%j5q-kLk644$)ge5TAODKZ2fcI{CUITP!iFMD6 z6@f7DXN6==-tx1OsU9oNpiOWKW^iA1FTeR^jbV9xfA06`LqN^V`+x5PowjeG9QqH? z+vZUV(zbEacq^GUfna6=pEgI8J%)=QNLsb5rBAcZ@5g|}pK=(`3xgFEt z!$-1pjJRZbw>E_l=AbX8<#d|v52s3?yRSOf%XXn(NQ+4uI!=aqMH#csZMYN9;xvA-zW|LM1suXyJN+2=9|_?x1R5^mzuLfP}% zZ%5dBuzsXG6AUyS`oljfbGtuRmYAZRJMvhW-})l#7n$+{QfAN?%b#{3GI zI8$ZWn(~{tt^;%ZTlnQmew^Vjh*d~Ed03(^$mg^@6es;Qj|R^_+fyx{16=8qFcLq+ zQ6iBL{hIa={Nk_M0lBVI9C!NH#5A?R`ik!i{#cmRL;sA%ob+mbF!$%&vl;@*LY|W5 zz;4-D4e(9zDGS%&eVQUDUsWXvN)f)t#+|!v9tBE2GZAV4>uFB-i;K!r;Av*0IQSzx z6*}2F%g0_WN8d786x0}+V~`EOwOxh@s&;(<|LfE4iua{5*^g zLaGo5Y09X_!D9~uYY+x56PGA^Qi!YRlvI&F(MmXttR~34%=!xE9F$&yNkJ_uKh-!| zzuJA{ZGVM&*g5Sq`YDLyn_lVY%h~$H(>|Va=MDjxdGIGm1>!Z)Rc&AkfoAcKAjq?1 zwYH0`lEB~?xPi8=51bHBPO?f><~lF{?id(NOMgH1V&GFYo<-}ohz2Hm(jj;m#1T@? zX~hg7v=wA9?+5`EG021TNKkuLozr$bjSvwJeq=;CiL3TvPdvT{JDXEw{knAw9xloL zhZ5kUOaqe|ozBG&Y~w(ZSy@G{3Y}KX6~I-PlVOs!pa^3YkIknJu2M#TDRT(^@=XEI zbQLZ#Fd{cp<$;*{LS?~-H3VR-FzXf)3V_-bMFWVy8sQHCDYkyx>70!a2%y#eDflT! zc*%?`17&HNF=ez7Y^zL3^V~xorwDT&i%edyUR$|!fpcpUNTjBI70wEHZV}_Lal3av zSYbk5o*S&)udtTsc`4xNWPH{?0|D~V{>hcUE)20bWuksFuFNyI21pg!`yq4+#kvSp z(5G&2DYFfks+=p6)OVgaI*+{^g0OLHCJua{enSw>ZW*8U1h_+{MoYeYhF^ej1NMO`^#gGoWz6%7}&15if+L__oGXaehX6i**5l9 z95CmK0}7X&1tu1R`U!W1n!vWE-pQgZd(E(Z46ZljCs~|7*2i1z3l1XG;digQvJ6~y zT{(I9RGB)&_Cw4tSw*Aw1LuK@E-o|OY?(s;TlN$XKMbwU2_LeG>HT}CGlJ5U&o4v& z>zm8uuly)w22ZYfSy^J=!1>*594(Pq?aV-cw61v%+*?2HDK7UKR7k;y#Z4J2i)qp{ zAq3P(%?$9*!Yl~fGBiOAvavNoS%i^KX^H`SHIW&_q{Br*?%gIf_t1tj4*D3BsP%DI zj(N61QeV^6H4JU)#VDoU?KnjKmbWZK~##!0E=@MS%WdlqWKYcSsyfUp&N4;2%q-J zOb03->=z4b`uxX9ybSHXex_-dQC2aoqw>$W zbB90`UtBByc{ND7k^#+LCg^;H@I|SFeX@gJV78poi7#Mk0Ovejn{L0ig6@qD& zQ=Fr^VclpMxOh`EIc}(Z62bS;M<0pS$->ScWMxGsd5mJyrqHsEQ&#HKr5bU{Lb$9B zT-8s=jej-clwCnAu&AZ6zxmlC67^B@hm;bSXy@mVKngwf!K(d3T$Y(rhHeBZ8C;$E zRq%7l&M9A>DN8%;8;zeDK;yy0q7CKlbIQ`fg4bvo@Q)@^0>lZtXfzF@0ODPNQ9+SM@~Df(yc?&&kOBZZXB{k)0|=+?`w{%Q85LVL+uWVx6XWY`uS|$I`7SueB#&m8<=lh*zk>i!*`Y&->|LR`K#|Jhu-lE z2H>Ck0;9gN-5G$}ZZjdt|&^`Mp0@F1ukkcs37#xAV!K+*#5^X-X8v08=#FRm)v0=zWvz)PCbXP!!Y>F zxB8c!!Fx+MEQfv2L?x1WHi8cS5YA-Scr|@kV(;~wJ9h}Ig=GWN7PM&)+CjLt&pi6M zzVg(D#m|*TX-l5Nh+v!|`7qlac)q67dD93Mtm$C10zv0bLYRdMw5P-q{0%{s={g8O z#0w571V(@X*VF*1(N;)7A_AXHryG)3jQsCNG%{R=PG`%wj zOZqk%n3Y2t6$7tnCbo?t)092!nqw23e{%BuZ`PA-(I$9p(So0A!i9ZO%9hExGd zCTObV+P!O)GaT>v6{>odd-II0PBy4iR-g)XO_ zO{-1?d#19Q7EJ+|nSi+tb6l5Llj&a4lYzS5mD>ZkB3B_^0nY7*)Y^#~jJE|tU=qBL z=%iuml!?>G3YoUCh?eFdjBv4ioq}=TnLmc($fOl5Oy+cF62ja>)J|hNnh3@SF(ZJ_ zOkK`?;sfR2v7ati-gIf%b;H+{#lQUT02g}v*S}wmed0qTBt8>X_)-qrG?(SXbfN#+ zSC%Vpxw;%VHdUrS@!|T7>}ocYA=I8U#x5`AlAWatt}opiFQMPCu*ePjov#!}tdM0s zy)I{arwsnpz)g9YaJHKtymiyx*FXO{1ZXsQkMAvuN1ou5bsz{hScXPRKMRUx5yBVt zKa3$0<-vb+$MehBC6|}E!~4t3Blnh`^_$A*3vMd?^ns4Zyr_c`wo1M}R{gc_**t#P`6gZ6o;n{96$z##{23f@ldW?&0{6HgsTNVl9d z&|YhR6HPo(W)2+Hrpp!S=xLIkI3$nEpn|xA^apxUVS@oY$%s14r>$v==iIXz0-jhU z-Ymf{L^Ah`>_H$@%PfA_HDH*b(~@!*QrcxCW>KoC8DyavHhg$iyq9On3$-DaKqoxE z@pmNZpJ<*{OJo`*%e&|{2cvU;zCH|VqrxVvNa-B)oO96>z;(S6#~?8NBD{>toU-9B zdB8Ub1Jd(N{-eRZ!lDvuy&&57RU$#g9oKX^-%YQ%*Uyx?^`IQ9o#~vJ*6I+??6XH_ zJ^uwSz!-je_Dmb+&~sqec^d?~;9 zn_noOx$k(G%u|W~RKiqP5>i+P%$*1PeAdxUo#*P4FCtOXG~OH~JJQY{0jf5u(Hw)g z9u4RU@*XrVYKKf;;#dVBcS0u(@JYVpS%@HA5FShnZdphNDnl5U8(jjdj>CQ1{AL-$ zfVt0dD#pp9PgGnbR24vm%K^@RKET3-XuioS9gjjpOOQIaJw#J4@L2)DbThS?9$LS- z&533cu1GZvryvchP@>krt#7K$kgK5SxP$Z=dbL`rXy9Qk(+GG9M+!8SN1HbVm>y32 z=tTp#gm9DF<nV$B-NS$)72!T~wcZ#VCg*(qFe*EzRNn4>!EuN+sZWp8Q zUibb(_CWYnP}DxpJkL$qA%bm5*^<%d z<}&!Ye_pn}{#(k1D=yA{h(Qb}hehCY)!1)7v>J%{3@xxnpl%91Lm6`iK zTjrm5v<$360K8%cVL0v%oa(vqg=KU@e>rj|@28G61zjnvPkFOGUJ@7kw)X(2tw{=> zlE(+wIXKN=h!k8n#0WK-x~u?K8`$Y5_8GexwI*553-3mO;=Z^JY@7)Y$EAht7wW(; zCRF6%_tCMDGQr-Q_I+2Yi({szIn{ISSq=djTKsU|R}csb2kvhE2X54z9KaDaiWax# z*d1ZO*$F@*P0EfMm4Jl5D*r9Qb7sM#Zs?WxqpTOD3CfU68QU=>yb>XMhRiY3F!aTo zNymuOPD+US4F)Ii?dv6BN3VoekW(PcXqZAPK*|hNe@h+QYC*wIqj{bE+>W6gRaVZ~ zQ6QcndR8D^R5H~Fe~hlHU0I^%rzNi;Eb(bOtS@$EvtI2NuV?f}Sl)2MjpgQ7yn=It zub}?GI8?Bfuhv1$5p(?5oL#)-l5*Yk*O!0z4XMk&(3q`@kcYosw&;QEc4#IdozXEsfjp5JNm8~Fu08%VR`jaAn~&9 z1dCRjLeL@UUc!vN6%7*Mv#%xtBm0YjP1hKVgtTVRgk^(g1q|ZYK@|*#5%6qZSD-3f zD4;Gj0!jZkQ=Wct@I(fl!GK%thvGoj_4WxlJ`>qgj-(JaVlN#7a;3#|kNpGRPu zM__W_K%IgWCAa%V@NtS?Vck|ggwkyUA#fZ<)h_A~eri~&CJ>qcLv)xAkP6PA4P?s@ zHH`fX1gJXkDvmkTCZ4FF>E}b*UG=U)fbA@ECLaeHR2UdKu&w#JucYPd#l~hC;~U!~ zbWPkLzG!YV%ZNvP@o|;Qv2n3=(=5SwT;h_*gkTo+S^3Da3@7?*5a`8X=xpKp+cY@DH%M-u;7UqQ5h?{yO zoN+jUZPVM{U2gvR>vJx2FT!jC1{VI5vd831&p6WgwsLy&jPEM9>Mf7%mA8-Lj7q~Nr#?rxodw%xY7Y$1vlQsos9fURcSZ}q2{r3N51UYcW2!;c7s!0N6 z$zr9@4BFQs(s!N07owuXbMDy<0cjZQAw1A$@ny~#EOCc^lLaE!#aHbz0}AMj<|$ch zM0k)dJl366;1=N>?)U2Su~;mPj)oDOl4tg6bO;~DK#);}BTIN?Kg8d8Wd%5=rREt% zyFXbp9VEloGK{unp3P#V8X+taO5%iIq*JLGQHrHAGsRN1ijI7sYh>)PaL`lwU?mFm zyA`m3{Q=?mr4QuQ4&a|1S6Y9o<&cEL(&Qnp^P6`}Fl%WJ;!tICHz{Gqb@fd_z9ps}Vl z3J6Qb{=AfNY)fqLqaQ_R*qM>!ntbNxo@1zLsm{^#0BT^ch$U%rXQOiwN(m()sC;Z z^WKHltryLL8$Nf*fMm)TiL+Xz(3218y0FA_jFSNY?HEld;S|!c1LfKA=v2^N?ZCNoDy5}vU#%Cpk*hHI3oJG4UCJB+?J)66GLSD z3Tu2KJc0}a(7EByeGVc^uie~c|7)D+5N8nRyO~{ zk6w|wTZn@Or1NM+$g!!#0ibrLCLP1dyewBpv( zy?&`)Jo`Z1yN5^1Ad6Tgjxp#s@W@KsJRyKzb~W}(y=8L$J_b2c#G~J=+fs%$k0X3@ zwBaG}iAL+Y^a{4TfIm%ebRcp2H*A6-au5MW3DPh%KfeGY@vp*n6|Wu3iCC6?=bqx z@uV>*P1Hy;dRqop9n3D0UZ(I8`?;TID+H9KGSElnk_HUY2Nux=EQ}!S1Nw`FBKM2RcYpWymQQ`^ zljRRT^ar#{B_ONo`LF+7@JO#5Zj%d@aEP3`t%{39}4aY~NF_bM151Z5PXmP}+flghBfqrqWv>jt}<#t+9;l|{5KlmVb^Qv|5 z>|*QU8Nr@7qkV;%pdk%zo$i6~huBk9g%u+%I2TD6<5}j~_6TAMB!sswv{S9=J0P}c zD2%Bcj~$&tj_ptUUTpx$m($}**CfmS%X+p2ahn!k0qp8YA2JV^3+bzA>mT1x#yK)* z`uMSOeC8nVL!df!62?-`@Y-Mx!@ZrQ&&{hj*TRKbNv+$lk2sQ1|QMHPGud9HquUf!*ul9e! z$+kAU=}gmpIgFL#ty^X~$T$0OQ9buV6;~Bp=a_2g9+ioUj+F-15?QhpXFGREOQo3*NAb@xMuJGZ zAV`g>uz;|0;{Cr-?l^U%yznh=Eid^;UsaC1bQ>pN9N_%ihsz9RBevJ@rI(fQty{{a z*Ir)6wr(xQS-^DPzy0^+*dM=-G?3P8jH-ns%k#tR3XM5(wJ8e<%gEsMbb(wjMYwO3oC1q}n29jitHq8{K9O%$rv{{bH z!V-gW1{;I)(LVa!VeMEMSoUk{iV1{_*W~53;)2A{1!We%fsHsl#1!)&c}z~RXC?2N zi=2)2r;JbI$McPc$2L>;!|Cf!BZ)Jj3@~j!Ja!R6%X$W!C(6{sAxt+tzHc>P&xrPv zJRBri-f0Fsi)q)V6z$6{kOS2D*fk^6LHDvDH2bkiD{cSE3gw*2YAQM^9h4qAfN)2G z;Bs)g(k~Y-)+h6L z-El`4owiQn*g$PW0}^6H*(|4>e&61`<-y&%%dPMFo$|7qZ!X{QrhiOYS5UWQ1j?6{ zEgZG=&UgHFG$C!3Y{)xz50x9fr`r9w`f}a6s!eLcoa=opEGztzrfpy&tafPW06$Ln zdtV9Ud+giTK4=N8ULST|1DrH5HNoh{(JqV{bbvs@d>IV%!l38H32@4GS4*6`)w z4Kj);$PkRJYVr_lh+8k=RRY7!n>Xh)5X0!4Nzm5MW9B4W3gE^O=4$k$3GNA~P$@jU z>ugs|2&6U&t@fD~2PBZblVF)aDAs-o6iNH{0bA2oL+Ak1so%^_@I8c7;!3{M8loz3 zgis=!xf$;qc7f6}Tb^7QZ6oZ{z7sJ0Nobt*f>V>&Edm>-h6#i-)!h7D z7C2}#*x83qfN^;XrKh~+>f(kYAACo->p0u%yy^SOB{yDQc3icyY=6y7v~`7@o2M&G zc&y^?zq-9V{(*OviNF4%vOIy75d6_qDAwN@w1S7A!>mmx{h)!$tw}!Z<^11=KlFie z;*a0U9!=QMiLXYXOf_bb%6o8ijc4=CTkyPnUlqu@VY|8T_`~JlKlme7H2-FV+%{yr zvk&9le^DNI$L4bCW50uznAQ#_gKF9$KyBe$?}0V=B*T;jq?DGgb!{BpE0-cIaMR-@i2!bi zuMAe{Gtm-D`@q#1a64x}BgCnlaZgD#cn;cTh--87hn7JD$X5pKc26$GbitCE9O;A_ zzZ@$V`iEHr_;9{l9~(=r+jM0a-*^S(J%)wAF@!Y+gMSaa`k@ehDSFQ zF9(t{Y{u<1J9F~yC2UHA29o}UGBhH;)Qp9J9cevV-88FzRsKeq5W8q?{lF&`a^Ryg z4a#Uv4Nrqt3(#VzM9z7KRxU^*K||XnI15sTE{f+WP9Ta7T*X0Wh_VVed!|W{$Up+C zy4w9^>>x7T-s~MiO8mEk)cIqxkf`R|Qxfx=ms3_UyFP4PEVNTGj#4Eeepi509T~<( zI6I)kU51ybmrmKsd|p>zTk1nV}Sw( zYf}dpR#6<*U*Z%YiD&Z?28MInn?cfb|1iV4;78n$LAc;W*ewx8q0LBD-~mRwnWknL z(Vp91D6a#lZqgd+-%tjZFD~8VBM5n3XM)F6QA!3XcQJX3B&Zq zwp>>FPhdYa|9F|`Wv@qwiFg)mpY@`>+(6j4hPR&j2|G8#Jpqx}!1!*Qf!`^#fG!46 zc*``n?Mr&j4mfoyjwX1+Eos)5&DVS|FSGR@lf)W!lq89V>w%=_Zqj#BWjBF z<0}8w3!Gj&xTl!Jo9r53W2YESGKg*Y{LUOEN1c?5d%Ft7Aq>LtCd>7(`PV*bJ$)188=!sN5nNo$3fyir={3{koSO`ly?RGdI(Vw+6ZY=hO{sQgB)U^QFv%=sAx z)o7s?7_>^WgYTLJNxQJCW?v^M6X4Stiqt(6Oq3XG?$8 z=fC%3O|OADaIUT4yRK~~8=&>m-+**(ZuvrcI5nbkq^owgOW_X9ij3H;TXHNHgvO4b z<_+o><2d%WDCWa(g!I+nplza4Xs6@o-2g67 z5-)8V@yp}r-1zz6frG*QXqLobi61y@xlFGzkBVbiRN(HNR4pBtvU#qoxE<9zf>5{x zc{sotfQZ>K7sz*kHub2oIW(BAYWD6iQR0--MX|f3KIu0h#u&Qy43)9X&tnnDIMba@ zDXkU!Vx$f{t+Bul>=6bRCm`xfjne;-c+i;9&($Ul9YO#d>Mv8HXb%CVbOVK0a;=jb9b!JR{h=45uKd5NW*y zq<+Fkzc3-{V@1qIdJ)%!t^{^M_@u**?*>i&lH01NFSO~gg5h3Tdd}; z8#tP%aPk-~waO-xmFVIgwa&D!_(2`J`x(GcZ}CvV8*L$Me|DLLEts%$i_aD^7q_#x z2!9fI%0Xes&dXQYocql-atOC#<-&!U<&RMu@*V1>9JuZ#_P)Fv4JZqy9=f+IJbW*eG2oil^0b^~crEHEjE9F+dcA(<5d6cDANT!&&Lo4xBx-4^7`*JkzlCBU?7j z-}xu?*?6Rt)zFE~kL~j4y}6_hI$>MW5GR{w?!ui$sBHiZNxPg@qa?8E$Joo@P#=3g zE<=~J+sgv7uBixrv?O%656u^YGSZ@1xJ%d2tneuWbz?1e|HW`3=C&J z{)y6yO?>}#*G4e>yJLO%hR`M(vWhZ;#eoc*C!w9fbA*B30whCjDgBciO85Gk9VXoR zYe~8+CMs(I0u|B zF`0i;mih9Nsnc#pGT>U`^DNQTeyng}gIYTWBnmJYNjZwe*h_5`RG0K6zSw(3YbEYF z^*hI6k0a$c+7vU4-76!pOg-ac81dCUVaL)xupwWGwDt6xIH-^rO*exdg~+<8m!MK` zKvSSLi@ar2+SHbUDP)niFtbgn5T`KcrqT$&2(oUhttQdw zV(EhEnU2~uN5h7ZX)YqXnvQ9@5;~i?Y;f% zT|e{jZrKk$Ql<~>Ez{6;MHT(RSrW%|+Iqx;pC;|R`fc@l6DE21yf*IIx)`;I+X>&q z_tt)k*IDv7BTNF;cx|yxi&jg+ul2WV+{IDbAeX!i>8yrp(({e7B%HB$bYPAVE7X^XgW+4?YeucytPHfx(vpJvBA` z;A)ORL`&mIH3O6{HZE<^&hg&YXaG;W@Au2Zt?$KVy07$Iv$OO+|C-XbeS7KIg7yxr zeFS3!T96$Y!eETOKNlDrFFdlR%su!}ncuZ5^y`e`0FzmSK`))ca^KD!rEkYorFZ+b z(!2F?&U9wqNq8K9W6%LDQ}{s`UEfho*4R zxJsunZFc`yDS|xF6F{KwLKA%A2|gn3dM@>1L)Vqxl=DW0g zARL*wa#ID38XxJTE2cse>`3;k1e2k*{n+#g=(`p1nIGeXNailtsw6Yt$-wwJ!<|8N z>ZkMeYx>)^UsYc5id!h7^(f_+fB6?-gcF(aQh2j&Pq!S#mBBfE<|zuM{c~^o`OxT_ z$@4B2lsx*#!xet#tyX6y)WR}NU?bWh%}pe;-om|l@hd{{uiO@wh6g_S5up-YHKH(K z@IVC5`L_yB;K~RDrik)cv=#Lv!JP+eWY_?v_g<(DC6mBrp|zYJLKZXWpyUoc_b;y^np= z7RXxxkicl!753mdk8$Lj!lXE&wr+8;+6^lBh1O74VdDTP@JYKR%5CkbWHREcVJrG&>5#CPmv{EZTZsw6X+IzXsJXL1{>uTX`{n}R5ckOQ*w)(a>k+*zW`+ZGZ^L{e-rM{glPKsK~ z+bL^(ZQ7!#P2k$}Kl)^}{=%O2_M-7>tqpgYv$WElO!pepJ^$!0o+mwnNyRJ+tK6H- znF%+2SIZ)fs^ROyG{7x5WYX>fXg_ejHmRODIlJZ|3PfPQ3%>-XTE_0oMmD?0>U992 z(#^}ymvb6dH+%QJxl2dp?nU6@x)4qwZf@7^Tu&$cxu%@GOb>VP_vs|`|MNK6W(s_8 z@yGNO5+KN@5Uy+{ZR=yuIsom;-mlTj8VBTn35wh^^+kpND{ z?Npz_fJ9omKm8w|wijew$z_Z@@nA*Z;%+ z83ul?`TU*ng}aRrIQwG*aL=uN2;);EPnhO=62^mn+07i<K?5-~z*@!#D!! z1+TRM)UL%sD~TB0KPdzaAmzRJ%e^tGy*VT-8KHaNyg?lM|WR)K*Z#>AH1@ zZBZr!t@YYw2_a!WJI&k0saVji>Bf!kQHn05<;e?^ic(X{KYF*7&aJ#{L|1hUu zFr}@>n1bLa_!HrjasYc7Y(ETJ;ZGqB>;RsmNjY6q0opL=pzOd#vx4!lVW#!8y`lb8 zXbSkvLY$oq$x2V!L>}(QT`crZSAX-^`H8?68Y!LRl8_1{FQMB$`{+A~oYC(Lso&UO_8dYGl?K^v$hC$z08*16m?U5J?n^ke@1UFVY2GZuIDo-ZUX+pw1@ z>IGM}KMS3Th`#=j(6sC}f#8IY26}-D(By2r>^K0qY5`@3i-}yII|p1eB^q$hEUg3O zLANYUR5{07MzqxOlr9z3;J$RFdxTNB0!Csq0QF;gw3~9GBNkQJ5=;d-nO#e??Eo?Y z8^*h-LPzsG$>CKcQy%OnTxmqo(74snk#<;>Y|^1Z1R5gBa~Kc_>1{`|tL4JO3i`J8 zuWB#+av`1Ndf|1~!>}$**^XlT`bQuB!w72UOZaQcFT7eI@FRcp;c}Ec)y(t~Hjcjb zg`NN+L@unWFc;dDn04C4HX;9dDKHR*c8O-rXFS?xKTe{xItA00p)bLV)tGsllG>Qy z31|X>fW!(xm4F&XeDiYpG&T;+yLL5U{zTJ;D<%cR)%Am0t}Hc49bE`*9Rfh&Dtfv? zug2HjOyMt6$BjVI=BY5E-9_E3SiD<~u%brGYu&mHoR7=7t85{&_43PeR<1&d0#T-s zDZfq)nZl5p5!bUGvH8P>W&t5B%l}~(3UV@m9398q5ni-^L3ZGP_F-^rV}v+`y;k^h zpD2KuZtSMe3!Egdgmxm#3AoQQwLO0b8!?4y>TFx&m?1T*2riLBAOn3T!8KR9($Wg@ zGCyfR*c*Xb%}Lwm)tk&f6aamgqwOk|Sddz6)2{-pFm9cAQNsw^h3vDqfB)m`7kHG@ za<0UWbBNJo$}FRyq|Ic$K3950Y%-88nNRMaL){2`>@i2XOH3(7!prcqsi_-RYez|X z?&(K4+P^j*_i&@8w84Bifwok^dXTcKEta8cDxikdP{Pr{Y|LYXPxa;Z>@GM?UFw}s z6n?b^u*TBgr_)n8{r&8DJT2d}$J2`W)FYY4+46ZZ|EHevSwgn3^4>lRZk}71(+&z& z(aMTPTz*^QEL-Bxe;p9I(=U#NY(&Mvf@ppP;raiD0w zcF{=s7kQ|FvA5N@^f`o6-=&`+Y4X?e;9O*(TX^Kr3>eQtk{3LQMK+UPI#pMLKbxn4 zT~sCx%|pAKv5+RoW8_V4ktNBAU?{{ZqYZvY-*n=N@x`w`Obf(!@ktz$cWP&^36KXA z=!Y$QA4Cl%7%M%z#54{e>_MY4h(^FsZZG?NEwER>63n6x!|6f7E@CJ=1ygjROLj9r z`Xmhy-w_b>5&H(>A+9=VTAl;3@ed=X6A`L(u`R~{g>d%&6g0T{C@C}FT_ zP$aGjYTb-{7nhtW^*AKXh6U@O)nXq0ATmPA&7U?=r=>w+*7}fXm zk>e8fHB2SP174@jxY-Bmfe1#pd3caNAC)~ zGR5IxH#@I25mvP)*Mtlwj6Dufc)2I${rBH*krT&QItAnetgnH)X$pVc5YJ<7iK5~K z{5pvMcMQRAn7yyMIWa`VN+0%oJ!UvA|wGX=k;FD{{)aq*>n zBd65BJMEjXZ&f%Af>@VxbM5qR-!)g4tM+_(XaHB&IMcv|WB#6nuA3bd`kC>Xf**JS zl(VNQ+#okB8q}_j*%@gqG<67?COuk0zH-P;@bI)AjR(!g9nb7n(S zz9^IRM&$@%b;Fc1vH|)0lL_`f*gY@PmA&z^gV3SEq!I@0A0u?9QyiU>b_j7j9GyPk z=t=<);w%g6rsFV246-9w@+bk!DoyNfVk>2zTh$5Ec~hR1mNuGBk+IW5c?!KU`S#hb ztJC8Be7Z4C@3?BmPV!(S62sHcejUc@}M$qcxpcNc&SCLPkF;^cEdu$%KHJLZEe8blUvb z1cYF|Y@Qh{8;+qpd*nzt&^KIm53%(PRK!)krlS$Nl{TK!oeGd@(IQ7puE!qsWw_3Pcwa$OdK zIQ3h#|Jv?x{xFL=<|vy2dD@FQWiL|F8&b$5V+r02_MVeW)t_Qf$j}&@Nt3U%X)xQl zAn;KM%fMJ7^k)u+4aLgwd0B+Qv~@oOSQ7#TPla6bRI8KK-ogMvtX8lG%IXSHs~q7W zH9yNwXUdVV)HOg-`u1OdaZ$`wZtdHu4?Na*XZWr4ILq6rG{u9nxz>NB5!Z%l{o`B9 z-3b76K#RZ7#?^yQac0wr)8x52ToY{Nc6!~~gjPc2Dc(RlX}5JTZVjKd@VRp}Fo*Zh zL1_ah1$Zef1(OfATye z_zWfSBe#_Dt8ai_HTH|oP`1x#HcsbiJ~Ru>v+bpK%2r~w<}Z%a!*jsLET9Ch#Y4Z% zK%0g!7f|`&Apu=o?kItx0L4M3{CP60tA&HRAT`^-u!0Y%)4l&ROm|fh(fD(;&vXi- z;vs~?IU-6t7tju78yNajm;gm{<6CK&#L=0kOqbEIT-9hFSICpbX&h@D?;6Xh?(B#9 zE;9m;A*_t(bfUm}?cC&NQ{+82-*C0l*WXHSqNO0*8EMrB=lp8}?AW<8v_ZOZ+ijnS z5F>-TPfkQj1d=o1_kB#pS3t zH9~s&W?K-wCe|h&qp!Y6$~<3}T{*a)j%7hP9m${=l_U2)MI^9iqOTg&nOM zf{TXGZt+p4l_9Eh61CV_-i~ddD}y~}cu4IZVVA&HH(>SnFKzGIQ$$EG1Xdi?;MTI) zu9m^kzA(1l83>V%`CA9=*qj1%YO-B4lDZN$8U^Cor&jR5dh04~yV`e>el+KbL4DCy zb;rI8TOUp)8DIg*5)5D*BCy0Y&#Jp61fuyT5E2n+%&TvBJc6G>nHp^~EdyM_H z5QeWlzNKtF%3fU$GK!oZE1SDV%a*bApqJy^+0f0zy?#BNmoku zvG-kYIm9N#jKHmUqX52)_Dmu|g(Enjw+t$1KHSz@^w70;g<{k6YGGMJB-F}d;&ibO zW1Swq-@G8a-)|gMpNV%m%R|tlQ@xs6mfxHVL9rbiLGB;n%jc z{i?ZucrA^p3vUzzY{waFPfd2*m5@v)n~RHe-1t}11cJoRnG+XgIK(x4E}x&owNvO7 z&%`x*6@S3f=y3wgLdC;p9y%Xah4C?A4U9WIO!YnUcTIYxZNw*uoNuQkVV)LHqMm|! zTTOeOBrTI^(`)l=?|zFTO_TMf1BZCj&&{WNGn-BrpYag%tzVl4_t2Kce+BknH090( zZfOrlWUlHA9+&Eb<1%GCSq8eCNzkqpS_AHnAoO|k<2(Z|nYNl6i{hYG`Vrj4j;n6Z z#7+e8zNJZL%m^3SLw^I7+Mh~g)cysW42~V-IuI3aBBVA&I+vR^bh_L3o=YmveB2MC ztc(D7mi-5x`O;jN9Nmt}ZRDJNa!a&n1h^Ua$vO^>aHh)n(@H5Sz0!7mngMQB1%o4= zN!^ucUUoeojmTsSm_1%pwTOJuJ|g|=M)rzm=}OF~2_XVG<_JWdLl~4`>Rhp_5NH3$ zbdDVZCep=r8%mbZ0)fnRm6V;xZd6AtZW1j5tJN9co~8-4DxpKCNp zl%XYX=P|$2lTst~xzByBy!LgkD<{z&ZQH)ReC9KEcFJ&i_;Y=4>tx$k0+|-ev)^Q3 zm9RVZ^*s%g25~^)tA2iQF@Q|eDKtoA1P8S{Zl$5BdlqD$|{b8%s6Q5&G zhQIA>Sc$NNTzf)o$Pyo6Q77{t2#z|K9+!gTYF8N!Axw(^+F#5QZ-G-A78v<^p06iS zWQ(K-G?X3Y;T9$RXbgKdUQ|XeVH=h4OTy4VJC_8_WKoW9hGI{p>V=DE-#{rv{I?1x|*bj64f7y=+r@dFtqU zT3m*NU#c2UfKUOky6QX|uh!j|j%FQwDm3}6g-rsj`Vm%YP!+NzRyyP8=am5ga5TQz z>ZhB5rkrGp8($Y05Dbkl{f3!u*bAx*sJQ!E)pPHB+rd1X=A;S|u z)c(1W&gr=fu8@z#$NoMC58z$$q%P7$pcJm%l%s`3EtMq;lGHGA_x7Sp&6g%feKTI3 zD!_RYr<&CC^O9bgIXIh3zcvg{XLqK`rDP2JvI5u+raNo<)lc=e$=9-5&-M;XQl8a8 z&-R?G$;*5~7ku_2u$RU6r|n4e0f3Je`L*>*7{je{)Vovkbbjh(k+Qnkhc;64?0b7P zd1W;)c%O)?l1@?E==M4K8bpTvpgkx!035Xe^^~Cu7Qw47X1O%hcdt?L)a{)5sIT;i z+JKj^ar_<7SWf9*2ElYjk7o7gwdwR$+bIdM)J0DIH6y1Kdd;D^8hnq>R z)hCX8IhFsZl+_(DCOxPCd~vWn0e`S>4=@9z4WC^NkBYva!~7xwBBlsxvHR&O%2b*v zI9SlO-UUX>F1mzPWabCI@LzCF-qq{$ksG7B%-qqe`-FkQ^toy;1RiJPyX-;3WTJnj z+2kBNyCgZ&XxQ7>nPr+OA_PKpwwfA8N|xBT5_1pHHk?yxuvIEmnX)26=s_x}U+t&y z=cN*RDMdpsd~5_k$gq8h6eK7sjNY*4+gbK4m!hemOoK?=4?Xn7FgBUiGvQ=L=BeiP z#EFTrg~cG2N#=SXTm&8)rh%}uTW7lj=1sk8{rTuW9}L$7t>H<-pq{WG&dq70O0p78 zFMhxk_j$vl06cWtgsB;bE}tBPh#bjV4+k90rNFg-z{pslYN)_9aV%*Xf$$C{7F;R3 zT%4Z)h(2)Wmq^TrV7UfR5zIH>*fMT#vL0?W42V$LjGhB0v7N64bS2 z#7*lKl_tvH>PFQElSl@v*j2o~2e3;jF6@=`rIkBONm7v#r|?peMT z!jlHt1MM$JW@kxMA~DIPoNA+VZa96q*6A$K&dIB`Lxpe)e-m7Rd6PUI^?O>f(|&EZ zK6Wn8GXlvn#?M)dp@t14vVCKl0FDe`dZ55F>u8yKFJ=Nz&S?C^DMg_k?_B=5g3o6= zMqj2-@C9))I#(l1Iw=fc)$(b!;K*AInq_cW)RCnlc7==q1c#P@=WJN~wZ{KxPV}};K>|l|8is$on7YWuI}{oX!wvss2dtA z7(fqxG7rma4r(LZ=MO4Dt>}9QLS^4U>bkjfO%Oj@<5c0acO7uYo>F3SC`xJ2IV?S>X5^R_2-Z!Y{%Jet|c4X+!F3A~@^DZ=TQoV>rv>S6VOv)02nKXjTSE zKDLF^WPmUO9bwrHM$OmJEkr6N5z;3Y<8&iHx}tXujh>_49*)f$9d{4KIvNgqq)8N^ zkG5M@JBh#?`!3N1oKt9bwXg!?0vc8KYSWHcAx=Kz=^q1ZIit;vi$<(mL&XRe3Rodh zLBw}569BEyQmZFGgbe<9T=Sz>O^Py#)K1|6kM0}aSa!bUXUY{XzPfB2ZU$3?Jxdau z^n|vGq$5=0Z-4onW%_sDR+djZfiGnjxJrp>lKj+oX)sb%+ep8O=5T0T>A&dmGJ=r2 zEDXP7t}9#_Pz0~<)uIMgXOYK3|cJKQ+3pB z&#{^EnIHc*W#P~NQ`*!88x`i(!N)3u3&Y?L`Kocx3Xas3;xs_?)`9-xxa>pbp)f;iGU2-eTK=R*4uG|X=C=$$ zYs7J9J}$rO<>10FaiK%3PFn8b>KS8U3LD7xjPpFsrob1K#a?y_=)bfq3~c3o8R4W? zjce-orGza*vV&Ini+^6qbr-i0OSyS#DIfe_O8M4zRRPa0?o#sS-&@K}m)CF#YL{T) z^FuE$B}6# z*@kr^@CY<};LrdAV0n)xH%+UcfKF#%00K#?o%PW6bQC!X6s3P@=7VXI=5^3Bx4lx~ z!I+kd&P1ZHAXp5uydFZmIA2Bd9LDap8U(7$&y^)iSCNqfP{OLzNghFRr^XZn=NQ>Y z_6A_?c9KjLl0ls^q_7Y@{cZhd3Ao!y+ATdSY`4q{|H?#cUINe=yxS>Ooc^uDzYW%U zJp*^ksDR*IV|0ZAiOMtO%*#CMbR;uPT6KRe1tj?HiAR*cKAf&a^K0*$0D0 z+=>8Y9u7vd*D(!+K2_xkgZlRWv5@|SfFb|xfbb@9C7N$o&sjYoF!VIt!@qj_vrBmh3L;Qt_uoGUUp^Gq6AJ6zT zE%93c%vI2}-GD!}QrOEBFkvcPfeEKPX${h4DwpPF?$tW;OX9236`oz6nSr@6qO z1ptNcF=eql2}|1XYr@vWHua-iX`810HAV%!=`N8*cqi>z%~-@6aFMo{2NzD! zmz_m(n+h827T6X z)Sr7z&biRd{&OSLfSnPHgCSup-~wtnQH{8mh((rHsaw#(aZVxh1-u^ER_2GESLQ}u zRJyjmgb!>l0`1k*^~u~1++2k+x=wj3%3?Kjzxdixc5Xzo_th%`;5VZkRQNNk*Zy`X zAAh8j8!j#7Z@$0Yzwrg7y!W1(i<-n%`1|=kFXcafx|AOzpP%|l_O&J4>z`kWwti=G z>liEOqz%tjrvgMrE&$o;;!{W6owLkgiP&1Tt}G( znL%)z$d(swf8kVc)s9rc3M-)_$h;BklQoh(<&iaPoffRnp^&&1H^fuzVa<36hOod? z<06;)@?~RKg<0#yMPliTR7#PDg$<`z$+{UKM&X1uC(a_}5pDuw;V3JHPfe94y64J6 z7e7(1II#i7gP_QEOJiS!@VEQEa&&OQ^PIi-~(Y( z0Bg0iZe^pfbT$$PKGGrm+z@(_?W(3>&O;G;HHzlgI93r_e%m@SDfMtBquM=MAZZp1 zU;HtQfrv1VM$whgGn@p{gC?k#sb5e35N2)+?BX-a>ImJt_||bvRqZADC{W_s`&nK) z;1OzZ1kV~yK?=vd|lak(ZywidM?5*W&xAUa9V0jqHAxgohkcIEtbdL^By$C zdpV!mezq)qj^(KEm~!#8Wy@RtOL_6Dc9t!!W>i42Ub?4{ zg>5>=wQKK0nfS>2OFw(GF6=`?zTp0G4P-2YkJQWlm_es)3>-82#kb(IdBz#o%*6$0 z%mSP4o|-EY4B(&wXi!E_kaT0K1%6@&IE*Gv#ymX6c4=svQ8p8bR=03&+u@*#yt=i0 zZ{TL1uFSj+5bY;k(ne>+AY$M;ZMi)vc8-c`!K`*?kJazYK>i?*!fvu#6tR`B!E-Gxm0w~v}rF*C}{ETbPU~iuPQP_S;7%}lo`&G{q9w#5jM!-zZG~cZPX=mTa>~Lo8?Q3=T=zh#$Xgo= z0gmuWq$wZ;veUVJhbveluu)gCpv0~xLo;M5)<|+4O@Z&}G$OjG)!)ig>a#&QOe$d$ z?7aWD(r{#Stc+j}X8vtwKJOVlNrL9*0nw8%w`ms=T);AFYOJg}4eIpmf5{GqiNSKG0oMj=u|%7DZs0I6D71rq&!Ss|i%tGc_5q(=8Fw zGBQGlLLkUD@X4@_a7;_1YVlhfq<9Ha%W3>N#iz!HO+}JkT^)r$fu<*#BH}rn7;PbC zwI@{m$tCp$8Yd)p+l#I+J>NBj!>Vgq;J7uWtAN{8afDko>Kl7>?h9O9sjT5N*QDmXo?&@#{QYIAHEV;}3~#PH87JyIUpaj0xO39|((ckFtg zObpJjfWf{-nSoWN%WXo6X@49T9RmJ!(AMQh8@S0|1R2SuPx&C2m$@%0Xd8?lHDq!q z1ylR8uEM(Bg}pElK7l>$=e-S+2&esMcUcAT-q`+;QrgFOY+Zm5rtP1M(>6exLR(uN z4WHTFKAM?Wh>w7zL7@`QO%3oD&^n{C@}G)xUorPUx>7xQzoa0e1h2XP2w#vID?({~zU+@BgN9722ig znXYoruEU&N?X(eQ0M_Yj39RvBzypIhdfT6trH{R%4AUlE*bi!NyENtAYPHO3qJRip z>n|=FzW}kd-lt9N;^!gfl}bDhx9?%iMy-6`D$C?2fm9- z&Mw&2(g$&55L{!dNlb7BO^p3?kSV)ib~xzfn&TX9wfEwZW+PB1l5~)Q)Rz8KaY}QJ z&^74ZAi}R@RI}_|R7p{Jep=3G_US<$(B2{bb6rw44wdqRTEZuBFS)FKxYOW`d(>mn zajVf+VNUm=OE5dZ));f`MUD- z{6>&m%Hp0C|7X*aI2LC z0$$sr<)@YAR&AlQ%Jf<2D^act(|!76mN}Y6ex&UJ0lPp}ZC%13(v|H)0DnCP&__AX9Dq(6FFFw-Xv>8oNEGfYnOrr=SuTQEvxG3a05FmdOe>P69v4 zplW!Gdci>E5OPSQYX9gT5&Wn?Hg%@HRwgi}j9qA(=CJqcVcupL!BN{mw{TH7o<79! zZVUvnX(;vT#TIU&Yo?sqh;1+66Am63TScBa!hHK|_i1E|1S zVe4QKVON+#i~1JpzNLn?o#gov@_L4i(1Ik$*wYeX%pqb zFSHQ+5;yyqc5@%LtW0M*Zw{vKkzC{0Qug*~o1@N@d>JfTKFhTX+_O+esW_dYt&#Vp zegZ|pnG5fL%JSr)M(Ds|m7kC6FE87_?&ak&whQVbkE77*hyUQel_R(PSy?{(C~2(< zUsGE7P4>W@w3iW@T~#=UxsTdAwY~E$TdhDL9Rr&dcOMbldN0~mwtwX-%0<{eqLOBt zCDI|!#bZYp1SmKX{;b(IX~>v1T~Rh&eSNv+%CR!aG`d>TL1%sV)^o*+%JXjCUN+2Y zdVml?|M=p+{a0n-&>r$rInX3-dDb{RxEy#0H`;6zp{y@jB5LADn8JLq|Fr`-AZY$7Y&Z8HDKzNF?00OOcew3UQ7o1AX1u> zI6xNF#OZG6#f;Oww1K8A!lRpT;$?f}nYe1$^WqjBLIZeH1hjh(K6#2mKX>N0Z@I4e zJ#=*C+eaQK<=1X2ywS^DOp*u{Snk8K~?1vAA>4Mx2;GAwECGH|8_C_HNN{Pfp{TQQh zMm3q@CAUnOP!N&d(F(WpED5nAa|!4yn!P2Bu$g)pSoByY2rUKIs9#1bBT^+v3LtnZ zrPjVk$n;4oLkaR9&6330s_W%9%g#L{3{USD(#hoZ@84gp*tRWGdOLUSEDt{TV2H_u z%(qQjhO>h_qm828`}XYvb^`yxIrCiO0&INnuT8)mzX$|)RA0X1mzYf(4YLw+W@!o> zas(n-RiHzo1A|?L=#L;!_h2p{VRgF>X}1Fdr%f{2;SAOVh@`~Pk1l#tEjju19_E?S_J4wf+%n=@{;Fl?2%0c9M znFQBj|8hBX{7@O~-qP6pRZZudN0p(CR!~%Mv?j4n6CejIJ85j9QWXWc9OYQcS$SY^Pc z0MB#95x<}5#0BB)#@lLH9UQi}C(O;=ck}X!&}KvUg*zZ-k%xjVHjyV0iq+B}v@f$M zYA*z@Z;<>266FR6wLF$lqDeIuF@wq3!oCnrS~mmEO-@Xg4Yb=ZIH7sUlJ%hNoH}&C zEDcNoflP(bS$kx_QtLp0Q|4NDD_|W`k^10^?{)(JFWp(zZ5}WE3JH|$1XGbyd%sxb z_rigXKUVQ25t8ECAIb|NSRpi|8<3L}GOVM62yhv=uXQy~!?SF<^j?Z^wrPxw(P1on zI&~Zz+4BXZXIq4*UT1TrV|k(PgCk{l+YY9!fi+FZGN^L$(LE%HHf`Irz?XKzA2v~r z97L#Tc>n9$UE}hdIr9v z69-Jr>ZzqZ1KuUj-srNvyrV(})NP7so$>7*o%l7y5ocnw!Bi~kDjK=OgcR%&G zPT&6IYijsgNuqVG0N%o)51pF7ue_>0OKz@WdUz9>#&!!AR{-lc!h4Nt7o?0e)4Xdw zHZScWlleJRjL%XxgxQnFSc25CEtLkwUY-H13Ik1l><qp0+EPAqT>4dN-mEiib>yl zP1s8FM=+l{UA67VtL`#`mT?&Ud^$VngJ0ZTUUADU(G0!##W$2)yLLes0N^v=WRf@D za3eMW2u=Jw^u;QCUa0yeUExXHywV;%Hy*yXpcfb7Bxd+_+K~stY1g+f3r>NYS?vbQ zWYWUa9rE4CQUTBvsA`RJejzxiU?G0F5-JNnKx&zP)#8Ciq@U?!kT{DdWYDB7gYHpl z0h3lp41wjFOukQMNV;mOEu8|!AOeEIr5YfG>V7mwYWSRXSSFnjHX62nxFtzd&HKHD z2to&D6eA;>A{a(6T7`#>;7@Sk$F^J(aqz9(Q7i~!xPX^yGinWG#bXP*IHo`vjjdJg*{;MswVPFk{Q(`^}*13vL}_|mOq zWaFmNGdx;mj~+%jdzewCnxQ0_rtIY;11JUgu_-lhv$o zAK^LMOodTY%ABM-Kc-iwbSsS2aO)fx*bdoL7uX1MH}uvyfV6EK2`e-PPf0v`_oWOD z4#W|W4^0;^bH#3CH47n5&RV&rDz8+66+2!)nj0hZ;%o zRQy_YX()N=POD=4BCy(C#BB!+rdwn9>$gBJ;qzlzalPAK$c%%60BM6ilSdFV4nM(= z{)7d`^E9rSSo|2@GUX23n0=8MxEfVKb`cmVtR&-393KLJ(ls<%dbeJKxeI;DY&c5q z_~R!zt>#gpSW7PIaCT?jTnJ~qEQlDn^h)|;&1o7~Pds!#xv-VWRo7-w0t@R4CpwnN z{d-V4Oj57P@Djr;8d!Al;@wiFExEbrJ5`IbNbZ@bFj#YJKIE2It3A&CoIHtbUviMe zy8@tFZp?!BZquRm&H<|1a+&HBwzv#WgDcK%KnkOQ0n{V}BZhw1-~T`M-UQI|qpI_* zyRW_PTRQ3PtPm2CfCz+DHenQS2T^?L%p2EnMnz>DSHRKdJf9mrM|~eQ)Iry3Un>B zQD5-ncq!lb)>1yWx0J8kR&@o{?L$4Xy!vf5{3r}QR!z!)BzK7et>YfbG>y&vG}6>f zO`Ib>tls}y{5q+S4$9zp?_)gdM*nt-aYYq9>5mhQ{5jS^!=y)5Kv4yGPUfVUoia>i3~~r98@J@5@9Q#vc5>~@gx?+%xXW93$25%1=G_(Boad^<7p6*!u;VMW1Iyy31p8cHXq_Hk^J`a_ih+&>1n1Yc& z+(lWMHh8EwkHvo}EQNWKRt59oyW`rzckrMI=UwM_&;IRaiAKD0Adm?QqX%QCf^k$1 z2&mL~K;{hQK|I5-8_0?zhmJ9gbPtw{NdtH%6UU#shTXJ~H`C<8R&T~V39d{?h6>Up zTHvLBv&5LC7~+V-k)V;M(kJoPE%@G*2xivLpkh4zOt)E@u?;+uuTO*Ld~0;Zta}54 zaSWhq#-(45b$BSutOKx;c%^@hap&A=XWKVSE-)OQ87`-f@6R9{eIu5Ar?rhIeC>z) z`KT$As9c~+=;;-CHhtP8JEUO-EVmNBWt+E_E>sDeA)Y#L2QaRTb=tPohW(o_D=V+M zp)B9|#L~BZOPFRVmmo3@^DyNyGmFbq6k?&y=A|B`C#cBG(MG^VCoFZoD}2BzGwU(hZw{NM(BVv6tbw#lyphlX zMjD%|<(hV1`ffXf!MFZ0P&OKoLbnpvpCD<2tlUvQ*nW8#v>))n$-r%p8Kn1T_U@qotOHv9 zo9HaN&>qt*U zO|!|v`;zx1uuHkc3Gji`EqIn#wXf-GCM!IoO8Hvzs=ov<%6XjOZ5O35=D}ilB#fOh z(e47L40GVpAe$fumoaGpF}g6*(}NDZ%k-VZ%MpPPG|(5E0iLQ;Io`Fdw1xD-w8)Px z4?dYL)s%gRU8R9=a%9gI?ONlzq#kbuy+p z+0)FPG84w|<}4xf zvXL4h=WI!$%}|-a*}_*d3+jC#6{OHz%noG&D5G^u{MJLB9pI8C-+Zp`mBDD3!s=J! zh7q}l4e#JNG<2ribN5}@1-*X#`f}4vPpRd;i20hdaJcctn;0n9ml2i|@45Hxl*KY# zOeaj6wpj}6>bKZtz9%3kSf6W~RcQxHtRQ$F%s>|iNJ~QGpmrdcXBTR?Rl=RE?%++; zZ4iINL+<#ww4z9R4&ti5jJOrtg?K9DNL)Kf%3(NX(c&cdN?5%mxGuL;CW|n{6|P2# zgobDT#A)L+6C3Z%lCZd|R8n(5G9JeFE(2(seoly~&NR){yH!PZi{ssT!1a}wc9?P} zFX<`~u#@K*m_+x_A{fc~GLVg<>_5^sQifRyo*jYt!w9&?*qM3^K9hDPWOk&~(GvL8 zd}We_Bg}Pge;L@u8PY7rb+fG5(bZQ@-S@dN({UOpBGdI&c`a)fyEgl`TvobQGI;O0 zwye31O#s(EJ@1xlo->=3Ix3xzQPV9lzSi0Et3BWxb&xQCl~Ge#xP1AtvU>F@7`}Df zSC?fh|I1`I@MAUHTpr5H#0~x?Zuf~l>W}%eWRg9xYPL^SICriV`5&tZoOM2qAEQS|9 zamlhi)?ezao=*A$bxFB}cXJuh=Oqa^$pP75);H&9M4OjZLih6^x}QTfek+byG;z;! zw^J~ocUOGX(OL83}7!|Y0ffE`GllR{PZt2mg$5NOq_?foO zf)N!MIeC-WGnNyKId+HFG@4s0y+rVfZNS|)$%Akf;vARnaNe%EIN6lmdKpss9UzvFIP`4i1W~f zvA>EG_!TXkzVoH4nV80AAKC`xm48x-J9a_!vz!t=oseDX8ry#XN$W$iq2w#JErz5! z$G)IG&G*Hx^{LsBJUM;_dIN&|Z|dd{?RV2Zdzk1++h^gXmHfFXBW+h`p}8tiRr)C1 zck(WgaTNBxFTDOLGix5>Pi4#kefU*#QF2Aqhy+WFVCcg7hl3^3=)pc+c*f^_V3p z;~*}|MCS&4R0-SQG8g)jG|pe%%}2^(m{uokaIh63p=Br@59a{y;Qzk&{bSj6`4#NK z8!q4cEwAEuwp$;M?8~>j>Q&@96a;wxKi-nESf-2WWRjZpAR}9;wuddCtL>J?N;@@v z^?UQR1Kp!GmXKzd5d%et9b4K(RN_EK!D<+;AOZs_ltJtFvCZc4Axp4xY$|F;8NXu= zWCSlg?x`KqE_0q#1Fm}3ZU-Ge-9C43W+2B1>O8aZ4o9AOB|I$uLY0J>gLmW9S@mQa ziM`B58}^oFMyvjxOOkadm~yq^#_lC$wsXmp7|--ZkP6GpXw*|C#isF__6H4n^yu+& z<&_M2s6re)J%o7|HW5ix#q9tJOy*f|n63#-o#8BC>I2Bi(A=>yeQ*dfVAuwOlk8!c zKsAav2Ta080_L6gk+_+Jm89IgYd4g^^&3k6sx_sHW70a1%$&OK^Vl)livm0S*K&}v z`O1v;UvdQ!BNTh^bAwJd@qC`WgV`oe^HVUe)Y-wd>i^-%7pqe1-UciB4Z*$s5?PD&rS9&2B1c(ICb`8AA$2PH!$yEsoI52~$4kru!5W49O zPH$lhZ3o|GfZZ&((cv~{#Lq5=6PR?V8`mV8IL2ApaDmtGb0DN@hm)k&gY+fk2E;M^ zi_+3O0w1M0g$)hru*|gc5m!r-#|Qt|kIYw`50Gs0<{~)H!nOXiqFZ@({`IZkI6x=h z1aRl+T z9x^NQ;9tfzxKPV3UV?Pzk7bbNY95jo3B@&cU+CME*D**lPAg~&Q=P#?mD1R5>en`h zuAaO1VXjmI@Lb_J)T%V^Bs_$X9=S1xsch6&x}a@2F@%2K zJ=hzm^Vkf`vP&8l$_@WE=a{~xeD_V*;``+J6aBGgmGayj_1kOT4l@YPe?I4#!e6zs z6zv8YMkdZ3z}olIeRyBJ`}_9K)#YMMzWnFsmh$_bF6BFKEai%|HH;=_&UJ$@nBPS? zb)!Rd!()BBu)mkAto7A~;dY+YXVjfW5bf^g&m1h}{d=n4#rmDWX5%y>@b*DAX+Z4T z+3Bwui!?(ai5qgK860?vSxo_d9e3B+zK!3cDo5fUAF-g{si z!Ar-|PIX&c>XOT3xMax#NuGKWI^Eap{mJ`7dnoWkT8EaZ?0mD2lz4WrOd(U3-ejsI# z*|^v)poIu7z}O4}Zhow83-tBDa19JvAB;;t37|R(lSsdmK7@dRFSYr^4R&pUW9?zm zzz*>d+?$5*_M$}YjMxERTp>ti`zpeUqu?`36X2%0aD;J5P8@WmJ_lo&U3-=rC%!sZ zI2c+c+swPpoxj3b`+)i_`unT_?#Z)ueygY}BO(){J9X-G*|KFb?Sq7d@>Hp!gDs^b zAEkuq!!3si>1PRd2BtI2h(PutOoKzd&LWxetNO>BRR(a;{?qma-~}`*1|!H^2<3kum{r^9oU$%&5qsqsWLjTuS|9@%cQI>ODUaG z3emS=OX=Hm3FU#ILYmP5qiOj@5A8!A5W9nhOI}syr0MU%uDLAp%9Sg#``KsfC7gUV zOl?cU*G)Gbv8N=&@4~LxJzVdaHmC-1XOKKL#&nh7Hfc*JjSpoCjMcgHbfP{+kskW2 z@W=`WcqDkj;D85JnpoS%w4yd3uF8y1-Wl+xu8343tHeeWm*6_U=ge#3r6QqY)QRN1 z#QVl6;SvAC1R8D$tP(c?7h~2Gh(CaYbmMwdCa4*om6A=II0}tN@k-z=#A`jCbtAq- zpui3wl4WDq7ET%>X-ioQ(?o2=A$-@G^<~96HfND1LU&dkVCMIIq2?Q!(8M|CZk_@e z{OMc^E?shY@vteym#T4`*$<~Mdb)I6|J<^26>U!XZsIy~5d1!PADIE4r7jJ&)T8y> z$|p;uEiZSdXU8P4wo+*gi?UEZ1M(v5yugd43~iGYzBP^y08yNrK=oo0SWeQG-EKH) zHM?}GS__~qGIPMxqS>d^T~(bx9aJZ_p#^;P?uJX-LY&~Ol^(bVUP@cC6BN96%(-B0 z;v*o?2g_G%dsdjY_wIgh%K!E$i+*o^)#7vW)b{%N^rL@U$_Kuyl(mqQPkc{hm>T9u zoxUI8d*l9seM5hDPbn|Dyp*5&s(Llw-gW2sZ2*1;3?hPKXx{{|cgOjKchaKYeYx~y zGS>_zDIGmi@lSfNop!$Bs-E(i>l6^w3IByJ1vCq_hdCwy)#fTR92`?>OwY}xTF0Wg zK^M}Mu?zl5-VA3Qq^)hxB;JBk@>tRv&!<+}>?v;&#~Glm4fS@o<$7h>4~ zVIO4Xk)<&S7Rl8^(fKY?6W#&FLB~Q&vZY5NDRD~&Goy5vD#_3c#{>wh9*~vMR-ocd zXWe!_^H%RrC0L`{5feS#CpEM0`H=7eqkgYm`DO=h9EmgoP~&x>?;?c*&7Z#YkID~W zk^cmC*uL#G-^ON;JIkK??hEiQWS-XNvdb<@9_A&Y{@Gjqcww;g`^9nEQO zBv6Q`1}t5w^ju%DQz=ICE!l%Vsw#MHr&2m+@1Q&(xoR;8E)!`d@{41QY51gnO*6;u zkgrUN9cz&p#D*U@TNxG2$MnT6Si{(yIB}xv+_@wEBP=Oa_?fmPs4zNm&{=9KUIfhk=;Qy&JkSwTeh=&cmzfMJIhSx5a*c6yfVWijsu*_=G`dlFT4CYBC~`A zL)?Kvao51|EIXdM+bw`d#3ngU7J_9QVPM&n@-5;E^Fs!(6)Tq0KlX$XZ(u9jg{SY* zgvvlyM$-2I)|E`l0a8YD5@}1LcPYc0vVtE@46YxhItpfdg#~ICCb*~iNPp?3fC_4%KS1xe1n|3@xb7}f# z$2-p(WsJlWbhqAt1@NRmXQv||ga+;3$qw-WI5#J2@WEwl7?__t^eD1TA|wOMP$B3? zf0PA)Kw}yy+1Q~604#!pO_vphhSCNv>*kh`V~ATK=^;atpm^tXeoG_rkVy&>68(r~ zZ9Fquvq!B#$-oOAZ6`zJ&$=5fV~GAb!=CG4&wxAI&}i@455*~uw=~}wPwOB`-RTal zkyOe0Mr^0x)xsz7urT8XOD4xyJKyFTKCK}QfRqA?R0J{;&O-85&T7zfN8HcWlbDmhk zv=yNOHU*W+#V9O;3vH9-IMA?;91PkHKpGT`wRdNqxF9%>wa-An8IZamhT3TB(PB%LmxPX^nHrF8f?h` z-J-seNU$^%9X%qM5CU0#H;zmqLG0Ruq+tyBoj_W~@}*`aJTI7H=Xf_jP#HlXOBrSl z9mKdhOVeFY=w77x>hD1qD)XmQl|cy@FTdug?EXYa*nY|qa0kzRJ9XD>WqSBD^#Sgj zgRP%15LVXl?5ku$hf+Hk`%1jrpi<4exU4R$I-ngg;KER*Texa3Q9ogtL(a*^c2Ln- zY%)J-Qy53SMFE;GS~U=K!dmIf+I6eSs7oqB9Y3YOki4XAI)ORuvB(aTrUU;wc{xQyR~a22K=HwZu^ z<~lQN0`R?!KGn5y4a@0x(p{&)xslVD9U3}8IO7@E`ZbYEWQj9x^6Xu+t}KIwbrMBB zW}J2%-+NbzHn8o|(nl~;K_djyF!yp!I9!2cF0>iYUN!kN3rq*u zEYx8;JBeZ}Q_Tf|3pfN_;edn~e0Q9MHmQ3V2{h#uN6n$x&Auq9p^Yia*yI?;KX$=v zsD2`jTbK*z#&1Ca`!>wMd}H~(r;A4@ zjo(Av-|#|c$N+f3&fl>SaP9&+`=wSJ?s?!u`KkAHm3QC26|JJQ_*uCeo9Ko{cbAVH zTUmbdj=A!(ZO6*bJa?pAzI9FLm4S~Qg$up_t_zbcj#(ZD=Z45kj@fbJ=E=IrjPX%i z1V=LtfIs$Qd#}{Y{_XgoDJ-Rb8FSKCoY*sN5=L9ReWcd|y@jcST>}tum+Hq%LS*GA zGh+eqRXEIP1q>3i=)$z2Pn8{Y;I4$+D~iRTlbN+TGIsf>i*%U-0ZitKE1 zcQN*wx*;e^HO3eSlsq)Ed8(BTD$%vW#=NOQIX;Fn#tz5M(e-dKL&O>ej$wgIiju3fvzkNx=Tv+Q`^-hJ78@{Ygw^W<$A zmJTo%qozq8Vg;K)``2~}kVUK(yfY9;RnsbIkq}dnlRzn!pR10iOcv?M_``r?kVnEG zF3Nm4!Klf=m}EdFJa}d~BH0Q)ffwMZdN(eq*ejGGccGut24NP5RXfo1&^Vo3yJIR* z8?@;>;;x-aWn8(w_{fp6dDF(SmSwzsEDLubxeK&NH-mxY(WC_R03sBT z{v`8Y2P34+*EH=igC1b-WehYdMa~Q%&4(d`C&>;(gL&4AMx~(Zc)JI@=@oV z0`%;>76Zo&0#sv~VxBp2qRbpe3g@OB>YGa}Nud&R@kiLxW?r2z^i2@4+47|vW@Mu+ zxSD1=CSZCtZZBHTkpY~d6Q5Q>#}RvoAX@o0`7cDS4`yWEoD|Z-4(~w@xL1!5;XfxB zA$2}(I@#~r})ZcNcNb@P6%v++zH_?V8SFzTiX=mjvHlK~`1+BIw%cj-v&8@2Ct(;sHA3F(TK0jin_^Z-eWV^#iIWtIN;9s}&q zj4q_%GJljVWy)ljEIT=|Mv3w)I6A{>8t6&8Fy4}frEmihnA+0wN)a#I&x!xQYQk5Q zH@t9l3^qTUVdx8&>7z^OrB_zt(zey<<9i-mq(>RbG?n_j=QGF4_q=aYIX=~QSkR9Vw9u@#SbdnrF z8i?Vlh`25CAtnheQaxq@{1s27htlLqf52Uz39q0-=S0Vq4Npvxj_+2Onp@|cL$z~f|C_>w?MAoNOo|VC&3(qBNZfjzY5#N$xuY5qN z?(4{oV9jyxA*C>l$y4lj6E^gz3>MVE!LHg6t9_=X$#N%4fm3j~p5oDY8B4&sVA`%g za(4www>)?47%cOvnBcJqW&(yY?Pgn8UjE!*((P`~>z-LUk@$3C{MXGN9s}8hjlijq z)8)YX{s+Msz8F|%*nMi=!Y&N7P_^vR2kzEclP>mem%+2tWm^JMVQV~_*uGo7of1a(WG$m#rh)ak;2iJ>%GW}M z9#(0SaB5wxK0{&^7Q!Piu?AL(8T%!>FfBs}RZ5VfeD!sOh_67SV6e?+0whQWJk08E! z6)SSH+3~Bi?O%i2wWgG}d;={BJkFfh$K>{0N%vzbrK=L}{`9f(?SH@RA(=lnrd-+D zoN{h%GK|JG4UYx9P_7#jV$u}_8`9*u-vXQkt%Ha1T)g-$rUyXaorfaSS9_RYT?L~v z0l?_Pf@2Cuq`h4TEHwEi{pplgIl!6XObniqfrN&L4$5=rXt{jrvMyZ)Cpt<#6uKY@ zkl2!VavxJ{r~Nk{%iT(@B4vt+HKpnm2dmD*Oq5J>pA7m z-}YzaQ=dX|@G+XJvuG$qEp~xM3h{~OgO`m z(J-9LEp{;de4m-&_%(1-CeJuiFj{s*8A6@$^|uVYNY5lJzU%ffA-M9&%d;6o_-U2B zGBHTwsGE|nBS(&wZCkgLP3pvucm3*Q z5^Gz)sBNbJ002M$NklIs%Zd^>|1}1lqD~-Hy_~VH1-laGT(h|lz^@q!~J2%s=a!HTP1)WL4@kP3(AVj@T4b4jvq}f>>=KBPb9G|6G z+H&@;9aJZ0@>!Yq(wBp?(tpx$)eVo}Q)rzZJEFT%i4pV+1V^0ipel36cZr0 z#^6R?`E9+0#p9bypker_|9o$S=U(F)@9}eXT=kj41pe|bmRG#;8_M&Z|NKZmwsTzE zkNoJ5MsM#!|MbD~+0Wiy)EhMHQfK__mtI<~z4qF2^UcpjcS&Qo?9$}SVaa20>RE{JcK7h-3yB)kTC zwYAmLkF)?n>0qq%NWwUd?YkbAF=0&9ad5CzoM1_G4zntkE1eO!yV2K@L5!K1;8HD% zj6>5|l`7Urg^Z$U%AD27h=a4?8b;B0GAuHSO8aaF8AWx|#9iN=4N73d{X>TivwXjU zlRvhVJ$v@1ET&)khH4ibVQ`MKsb>@R@P;v^e}q#~9Hb{P4upuu6IL{x}xg%sV6AI+%UGnNhU%P><+sSV_}Z7-7^z~JIeB%dT}xhw6m8qE>iEb z3q`D;B@QV-S3;2m?S??fYsN&EmxJnul>Oa^Wa7+Y~rP8{NN|r z@T2b83>z3`KlRo!e`+7u&;}mwsRU4G;$BJ1yBF=Ivin+KMp2oEuqzrfVY|Mfbbag2 zFkA}}jr*Xy%@?LDqiAz!2o0?O0#W$=ct zE?rmN9K20=TCiJ8pUhHD(igX>!wmR2bNf59`UJ?SE6g0YRtZrP-qPAja1ETf+a~E( z4sxl7eMAPZwv~f!X+uz|fSbEgCT9P9wD^^-P2<`bBYP{x7oF$gbcYDu46s zrF_j>IF9e^A?l)Jdv2mTR+r?j1aN%xBul^h&JFUI-tA{2sMY+xyRR)LCY5VHv~vks z_sb8#0Q$`|e(HVQ*sk=U&MJQPMG>qVyDd_U#~M8mS*~t0FZS>c=HfmUuhBS^*6ZS^%n+-E8iJvvWBMcgALA z?3gLOy)@6}X!-m`r}8Tvd`h?k^K$^Q&K7F57-t zS-W;^S;KK#uXx2Pb6Kd7VHMp+Q$7d1K_nh=)XRbNBu9K5hxv0^`A`4kk6;@2#Ace3 zzsH^VqhMi@Y6$~(;cPoqNH4y{uW7@kLdI{!RR_yM(QQu$di|9!JM$OeZS5FEmcfA_ z%RIRJreWXHLnCEX7xuzfB0&|EBtU4H3-TL-QJ5p$h`B)q@j9~|?f^8BGxZ7S78SpV zCovG`D&G5zcm$V05pQMwgts#>+eD_X?nc$%EJqqrm!{*%px99-CkMh5%IJupcinYQ zx$e5_&uYWJz(ga>sQyyWUKz|ta+cl08CBpFElI%GKd2k4XR zP=422%JBZ(8J(vYoTi5{!$70kpBJTnP9Dv>GJ(SH^2>L{98MS{BB-OM=^Legp7Sg0 zG?pzcD+v|WN(2ojoF!y3)21n${O%548Sc~@detQ}#^lotMb=x`S}v84r-&~((d3kq z&PJN&AWKz&3rwc)e3Sd$fQ^IiztXi+uuQKG7QMb(uV>{b!9y@6p%EW`N?wf>ZgU%pU zk3fU4;*!Yc3Rf&!kfwbuOTkWJq!X@dXU>6iRO`RD(WcKE|m+}!baxu;)J$~(Wcl=Un_j}0F$ zr;hC*YwCXio%H_B!&Bu$qt`!ds_s61=Jp!I(^5Rf!c>MC7G^aeUn-vJClLJI_rajtUcDt#6Iz-9O&1$LSma$KB*_NhwH?l>dP z@n;&NW24x1ZZFGbIpWcYtW2Jt{ODjP&5`g{-K#2_m-+L=kXSmWG@03Q&wy=Q#Ev1T z5Mc>(7wNc_T_(_FkT8D~!Who16_rakCzuV6qp&S=C!r2;w`LZm)mwc`Z)wfC^Q>RW z=>wmMpXwP$X#EQ~2Q#HbBEg}92g)0N_GikqPr4py;8!sqUQt$nARfQc2UF2YxB&)2 zokT{-l9D8kmK%aObh-Ea|M=c=`)!{|n%Yux5UdUUFHkw#xB+Y0rIw-b1N>pcv?Pv%)=7q&i6+^&FvTD{$Sz9ZGKxLANQNbP5I@te2<$*FL6%5^Me;x}K5mn5 z!*6VqbA&m!Nc=Rb5N*DpnO9+kO-td&s8a`L@Urf#rQ=X$+d$?++-#P2Wda)}&pIig zQd(vCWln7G3>u{BcQ21KbJ0ykpLKkF?nu&;I5e8mi zw1DH)SJ$9E&Bz(*Zm}D?XfOLsl;ta)3K1$za3DD;57y-qPX+&boxzF9qu1O(&>T6Y_ zy-tWNCj&VHzIX!oS-J2O7M6f1=O~iK`Kk68(U%A>!bFC^$wn<>mVgmI3O5;i8lg5; z8qNl?NT%9EAR}ny^!xv;-1ejwmaqE8r(i!4l^yDaoqn75Q8`mvP2jl~UQ=$l`}@o2 zTYf0aXe4ACt}30|uSMUFbEz%+;k(P+-dhn-u>tAC!E)p;e!u+FvdhZTzy6tJC%6!S z)T7Fk{0L_mF(+Gw8PGoS*B>vZ-ug>4xW~xxj~&3nzxu=F1FPOyp8LX`WfMEL=f2qG zM>1H(v411q`110Z-ADp=|KDT`jw#v|u8tc50GC&xD~#|JrFQ*Hkfu>ln1D%ix25BwamhZCWnn9EG2N;E0>gP%xqR(^FQ5G0p7I0lF6ICG)WyuO z(y1SNb}2ved{7;9A3C|8(~b^ZluTVw_^bQY(n4hPFz&0bq<@36x))zj%AcIaKz02} zTS8PdA9KU5@#u&*{$I)+RG_Wpk)$`SZZPJ9H?Cy(u8zC-neX6?G+vtLyFxTqgIpHQ z*e3Rw7Wl~new9I-`qZC|6(e1Q@}~%f?Nc%NnGD9`r0= z#$guRG;sLPfpX71_mnT(@%bF@CNnAH*Q94-{!2Lr(4~ZQu^n1v0{CeP8^Lns#YjsW zej=kGL5)aSW?6bu0tjj|NdPG!npNit$qGA?9O%WPx$Lm4QXLhd!xUm0Zh~cDb!b9R z#TL@H6Om9lMF=+WD-MO-shvg2%bdOq>-;@*vM?W%U0t(IcH{N2k;gVv;w1cC!fYht zzRR#EC9s1UPG&^LL|s9b0;&#&x;!1_^Pj&1UC^5`4!x=D-~T|$wus1eN36`hOyD~3 z;>wkDU;us;iHWD6DB`HgzLjZJ;<-q_YDc!p8Rw{0?Njupey zyYUhXL$8nI&&?jQ4AN(I-&ziS=snr&VPBnQ$LBO>&St=*ZDsysrWct%2QbP?{Wok_ zU$$=DLS2q$BILkkxM3zWPK;#Yl=w+^ynAIZreMM~rDMQTT4;D-E^OT$UYFM$j4Ly5 zn@^w|-sB+x&?xFGwnn;{1@~yNfO>0S*d;hOb5NMnT|5bG;hSaeK>F-1anJv4XEG~% zP1lLAQcG7xET?$qvWlx04%FhBmJO!4l+sGUY_BlHG7m^`Lb_5j;7|U6BX`TuE6{jFJJlZUR*wW z;@&d$=WlQwvh=>_yUG*3^Xtl{E$hm$(fP9PE&sh7c{4hOnEA2&waGX7m;bHYv4Q2_ zm)ukaE%u|y*nFwZ9MY3%l2X@q=T}@=PXFU`%FJ!=q>ipbRi^&TAH1&IzWL2%?kVd_ z58!V>;SqCD-qH!fIKi^`&Xvo`?0@*T<<|ReE%SH&0~wnNmp4bsR;spR^a8otzS@ke z44@D-JZ(waJD}FP!Vq;qr^^6%HH)#rsHe!-kJ^4*q^~0Ww3|>+F2e=) zpn0@s2k+BNaHU3IM~XQKJyFu{eiE=ye5LMJmeO%ngAA>A+usiz?%kRDN z8f@Q{@_p|r<(?B4KKG|?E#)`9rj(nufX_(yk005CzV?|5pHVAC>FljTyB;z9X8G5E zK0h1-Xqb;3U6B>N$9gD37eX^o2D)GIBXkP-slDb-XlBqD+{`3_eC0Q!H9DC?$D}Ff zutI&&UTX(kY?5sAM7CC%hOHA+nMDa95fm{;FGnPF{I+9|MD(xFeaKR+1Z^5$GR)}= zY+0{cmf=t#fQI**1C-s(Of*243@Nlq-5T(9(}%>>9mk3^dsWgW4vCU)4R0Km_?$nd zKvpN;Oj*Z!J|)-sZ2o>;l173)&OeoNud_V|HFd*;?QNg=bot~bK9+&9Hb8AS8_}x{ zkj^B#A}Of@Anjv={0lpYoWKouA*>ZgEEMgK^4V^!ateQ6^Ud3$zwO?MjS>f1m7(j# z00<$t;vj6>IT5L`m3HwSrB-l>XASnMh#(`W6wFNp&h%x_R3%ViW^OLGWXXjW;g=bG z281LX#w-jSJ<6g=tTnfw)Z5J;=@+Cgvm;Jg?ty`2sj3W#4C55i3K>4b+J3gNIIiL2 zF~scJ`ZKOX=Z-tRfLWNUW8==2l-XIO-9Fdlc;RaibS}plPsymu!_~$haR_5t9s}r7>o`(% z31^HqLmZt9L&gHodOFS=Du;geP37pGSC?)_sPuUd@*$n| z!U6>LBR5}pRk`ZwU1bAjhqhm{y*%(OuPz7f{vc~nM@#3LjYv(H2(#RG->>{=dEi;E zC|$H!9qAq}eKH1C-L%ujU00STJmraHJyPBFt5%o$zxU_L@$dh~v~g2R;hPCkFyFEn zy^dFD3uw-~x&XEl{&O;61_PHo2~#A> z;Q|Lsm)WxIIjwa*g~ylRrjP(1cq%(Fe!9GH*AJA>{a|+_fxker?LGA+q<2n~Yd2KG z(O>t3+SFsLE}S{BpE_6Ce@^fV_G({$U~<*Nrl%BAsbAxKRvO4^{X@EaqXW>9k%#>L zXg^5jq+vNKkV&V~<~df$q8Cph8JD;#B#}@>FaWMd+ruv~IdOB6^iksGNm_N%s$fMG z0&$BA+*0MB(_KdG&Ti5Hnq@H%RYJ-oCOU&h9S9?x*yX}dp@sD10L9}z_duv*)NDE> z2wf`#3L?)txl*xSK{CWza9gA1|9hMngu%r5f8oVlH#& z0Pi<(N~d&C#x-FxONZz~P~5R>Je|yo&zgU6SwD;lZTY|h2g+(TdR%wilgh_G{)sS) zPUywwR@5+8kpvz;k)`DA=mhp5K{|w8ztd75I}>F~r>9OStAN2J|CF7&SVz&v2^4DC0*Spid&vL?7(To-ZKvbMS?kim8{=>|Crwty%VM@K_iuNGWJf z>;1$hJ|PU7jI8j}$rK+?eU?Y(&-w{_(YrF)RiY^U5xzAZZU*6bMefBnG?oP^|wZ# zFnz1bmg_Gmt2I7M(~O}Xb?C!?Q-DG>}a_k`+UPA!;E%pYyv@hk$5pJ3hcU$-Cst2?T1iL zXz8L^?(^m?0-ASw8M*0e%bE?#F(kf=zE5aYkLHH3BRGSNK6G|XzeA}R;k)+VQAU6H z78|KnqSf|GYqaoeLveL%xuW!c_v_gx{lqfsrUeGe`Q!V^h|DO0PMFtmgYpXhT=WLU zH9Lkz;;UXJ?+GFuLUNbOb^mo2bCLor$3vZX);qkAee~ z!@*axFRCVJs>nX9!Qb{d-but|uw;>CK!d9aAvWlY2_%&_0;xy}YBofwZ`&X|$X|$Q*t#ZXVI?$=9)V|GTAo^)GVP z@5?xox2?SUu2O#IlcoH_z0kx~Q$3nw)unq0%+z<@RLXNMt0*!#Fb|#eC!=jk<4;Q+gY+pB}!SM zm}qC=a)vJawU~m9?a}4~*ycsZTO~VPTYM8owJ87=>}cd1vdS<*5}q!z$g>Ce=1m|4Z*gfYG+@0>izaewIJtwH+IPd_;_!DbP5agG2dJF!d;-qnfwyvyua zZ@;M%>(Z0YZVs^sewR4}I)RN0%*cU#WoYlc8SG^IBqG}Qn_=0vG4*0y7ngl2V`H6! zXJARXS6y`#o1NAK7Ikxr@X$j3vDDxA6{c>Ksit1qFup7eu+Gz-VuBq*rK>W5(xPdY zIN>c^V-i6;p!+mCgDpctbkoMXO9E_HS2PgbL~nUq9Pp2Ue3Elqdq`XRe#|cb7BCWD z2BC$|fBvN^Gfnb7O-hi3r zfNF!(4+)!a#At;}BT2c}ZR7lAjB?AQ5N(*{&Z)zPV4_a2{K!(7Ty2v_&0_J_dO@$- z7{GcqZe~zPb=kQJBgs*K^DueR+hf1=#&YUUkct48*)ylg?4CPFgSxU2K}l6q4op>| z&yxE*x`D|z99>i3#cajFNH5te*t`Am(#x6B$PVHrh&y`!eRMh)7flY))>)1P?lgE^ zcGi9$12w=W&iT?OG3!S9nk*W;?5b=u5k8Z|8Np0Vjcb;~H;G(6*B4rps@s0#VINWW z&=NoxB#avmZX}Bd7#es6`s9k0w8B0i4%m*&bu9YAqbpQO=wTDeVTqDd{CJny-GD(K(t!qFxSDxL9W@Z4UEzc zcI|8z?;gFa^o-nEdiH*_bj|HX{7V|ExRx+D4~}_`&-C4;9CUGxeZ>^Bi}S1Glah;Tx6Ww&HIe)rMzGl$HlSCOLGGkmNbWUmouX< zyR8Z4IXPa`SI44#~Wu5 z^@B5`8SGA>{!)6B>LFc$4=t0H42t5BDfS(A*R>?I@@s$hJ<* zJW#kcHhaj#wj=h=QVQvNa)Y`S4#I8Z9T-Z43CDlSNlL9${b{~6ez_;`l5nk2MG|ZWe(zxn#dStVJDtQ`#%2zDl?lvw!c;(}PKHIvo(v7iaLGkD zHmVQkvXD|QB}cPih-6j{95_h4YWGilz#DG3KGL$=Z~ts7UQHtj@ne3OsiHS${N*r# z+xol8GGKEWrsx!#4aQp1J*r3geCe{GC31Iy#YNSM??9 zBuIEE9Tbk%)q<-RD5mJ=x4P*`c#q|qd8x~ylC$w$F3JRfQDw&Vq^{B*XVK%s)MEl2 zOwyGSO|r9K3MQ(m5V*V!afLLF&7ecbvPm0~7|+jC)*}6zMA|$$DdvD9a~Ovn2P z9`fJ*gtB}MxF)ToaA!`j6nJnqOSMR5!O^6*(8FpL3%>y?sVeUmfxJKlplyhu1|My*Q@62H z{~Bzc{2)@rS3$pDUS599v$*UvkK};e#6L6h_#ey)-&(rZUOd0+w_!x#tR6=v6TZBC ztel*Md434jFo2?hT~Vjs55K2ApYL}?S7T@Pd|w~E-wM=dq$^UFNcO;?Z0evO)AX5X zX*_l4!c3auRm#UtR?xsjyUY|5h*?%X`c=7L;xdJO=W2TtoX5xUa)Q+^7nM2{Lw7hJ zn_;L7##zw=v7>*RDqR&K#VbCc|k?j(8Lgbx4w5F)^`b{ExV%#Px_s3 zkxEx2YD6I&mK7kT9$gj7{0yiXtj(;;jHyJ$N(*dJ%+C%>pr%#4;4COUH8^*}==9LlIQ6;pyWq9(P(M6m)Fxc(o^brM%D9kM<8R&z58z~_)FI|O$%gjpUAc+pXlwIAIiaXRK zbfWfu<15kZ;+kU+K8-nr$ulFEMBo$(78yIGPZvY z5?P((4Sl3O;*}-yihfqZ09xK$=D)w<4TisUFUMA>O*M|`aDQzhJMNSg`cEPp^V44(us6&5StxVbr!#&)8O*K`}l6u zCT;Gm@;bPxznOFu5$Bn9WD=4=aJCnr#4P&(|SFmPg^7FL!a zMJI>szJy*;wPdH!XfQaFXZxynqi(6f4|kHgYuIBYgG-E?)_htjqYJYQ#l9%brt=mZb_dcE3VqLnxQWFUh&xS{mOKM__x5!!*G zkC~Brep=YCJ8+5L;3{bu4iB-=Fl7jFGCDd3{p?PKDG~48 zydwkR?o*{#N}^25Wnv|Bh7p$)(aSvAUtHewoAu~GdD}Fvx#k*7z}$v;li}1$W>CiO zNl&`ATz~zOiju&(3@vCX6&7sv74wk!kx|lMwE4Jn-p`WKav2rsIKdz`0oKEpYyLGibn&XLT2G361%)egsS=wOxTy@peFn_yJ zZ{ync_1C`T9e3Org6M`A%PeyzZ2a!Cb!#MjO8az%lOd8xuA4hlKXG}!i#9+cLisJ9 z@vV=$cE_=?W_f%U2eLE^EM)FXzmH|~F;*`~g6J;4*)HG&Fp-v-_AJstVP*LneH!bl z+KLQi9Obo5#s8`gTcyP=$GA(Kh+zP;AwT3Mf%h@-}!PU0zlCo;s+R_OrRw_O`2Hxyt znHSulVUxdQh-;Od%ECL!?1XY#>d^RvZ`Gxib!nEZ43iYk{g}O4H9$L5hEgpL%{9#r zxr+dJ$xIoYJRBkB7zcz<%3^gBV3=D{;~;q`crgYe&av3Z3Aqv=o7?bdQ$l!w+*JQHWvc(b zl%b8^QwERzVHx=BJ1Zl&p#jvR%t%IW{O{`ZD5E6U8v4^T8{YQ*XgR*~&9uXXtJ}jB z!wqED4el?ukMB5du$RHZ>fZdZQhwnBY1-oPcz1)LHP^{$rwT-2QZBqY8==Cr{5=I^X3XZR-$PoTK^WS2B^spwDq7j&l*>j zxPRF_b_gu$!U1ClYoxK_MQ*S~i@K%@^P0m!DO{ay4tK&;$1Z9pa-zjz%lLQ0@dy?eW zi|R#|yIq1s_1SS2i@`*yRj#TA;$tR(#TeoVtcfvX)G zwwGlq5oN&lyNo=1oK1R%_E0|4FdPYcNq}2U^AnBP5kFZ24PA#oCpXV$UCqtSf&q;S_9(gu#+6M_>&x%zn-PdSS zz+~(MifEHCCBi4=Bdji&kOyrd9m*%X^VI=T{dSr4#PJPpoK z13=6q4XLgSzstz&++#Y8v9f~+nL5g|&@re2C}i1b1SI(4hZ7c8J#1nn&yK&nz-xj@ zk;kwy=mz#N3(|~>O&Kr1eYR_DIkV+IA{BgfS#j{!O5eTjWoej%)fK$hZX;6n+0T`g z5Bx$owe2S_c5X?(ufMl^_0~h>PmjTOL^0v)Y-RHP>I=1p5JSl_{c|rk=fuV&M{WT^pFBK z3N0<~=|^RWejKxE#1hw}!wOCyi_lRg?GCcwy@Wiw+tLw5a*_`rgE+GECE<4~vdhIL z=m6MBC$tbTRI5;dK{AT501Z-3*t#qt-nwij59%OcKAKtRv@oP;p=yP!9D(_7Jyilx zeR-}Q{A~qExaQ4{nLYyUZo<}{=YW3MJvImk(=}^2md<4Ok@<6wmX0-TAk6a|`dJBO zZHOAjsBww!HgzOHh%|C8Cb-apj@$4wrvf;*k~s4L97L3v&>YJxPC7KuD;|zv_s<+0 zkh6S5o-U(Qi5qwX;}*#w>4SmO{?}11{C^@43*`R8LCoAU=V+o)Cgnv#IzsRD~vJ& zoYDuME7Mn*HsMs^Np7jP1Elc`SMMsP+rPDQb<<5Z#6G3QnMo?JFb&;DKl-thVL3+6 zmB0xXjdfdpX^5_Yd97z<;w`r@HHb`bbb|4dE;xa#Or&(mWinxJJlhWvW1f5&Fd0A96>+_xmAWq4HsP=$h`*k3#yE9rxS%rvM8;lyG3AyF4M<$m63JdaIPG#fTDug1SI8r(`OF9057q&*2 zIS{v9yb{O3ZE;N8R2nE9bqGR z#)a9QTi2&q-jZmEh~w;_n{hS+g@g7%T*#l@nR1_YXeEOly`+sZcgm4`0B-+tFqCNL zxEu(JyB3|*OYAMQ1CpI&j?NomW48n8GgIfD4%za{Gk$nh|Alb$?N*rUpZw&c`B)p| z|L^f_mnXAxRhUb_(jMHG!oD^IZ2>1(|0=;+XeWVapjmLqb_P#004-P64kOruBA@1k zJcCuE&Jt+{TXS?Aj75F!Dotmy0X~T{{-s!i^u2~}4c1~Gk!1!Ys$rVI4pb@PWNhph z8XWfSrJtRcq`+4tO^y}lzoH{1gX7Y!1Av#ynd<+@fcWl!U>Yue%8V%~^4;*#|AV<*E7BylQ?vvlL3dl-X6E@p;dC zPMAP9cL)B|0k1bTnUkIvCP7;AxxH4#!05lG|aCakqEBwJTk)Z zbHGwY*LUN~R9aRURKL0G5yFRkN$rzPkdB*v`j`Q$Vjv!9cvogGj2k$ofo)9+sfVm7 zlAeATRHQUhFu4=>kFtqm9z50Di_%KZ09NwnWCv6Xj<}n5lHJ+%i5}WCCO%*|!_yGX zzK~zaok!m20IkaajxvT>bWQ&WgR^N@S-F-v$RUvZ$PgPq_TLMGAPh_r)uf&hrxreOe+b_&*{c>X*1-r+gco3^vzq87>1 zb4CuqxF|`aQnioOk9jt2VD7WH144x!Nt5acEiDEx;aZ8Ny(k-vI*VTWEK+U$Tyf}EOYiVUE@I7U(vAbG&`W*o zwojD}-6Ln^clnx9UiruH-lESrPQO?1&0Wn)-Nv4g^17#uV&ZFc#+aqwzS!rP3G8oz z4_&P6bh86I^ccD={ThX)jc^4?lpaI##3Hf66)F8)1(^je<*8J?6R#V+K=IdZsUS{% zPQFjU37c`N)Iem+pqkE6pY6>eutc6%wR7X=g9t1zea)=8H2~`2_H~as^P5E9@9rYb zc6K`({?4@JZ0#@(25xs&527yHkzHt`9o4M;sdqbyul`hT@A-%yk$9FMzu*NgN}~|+ z%kE2rfNCsPSPu!L{lo^pp^3vZty?mCDs~bQn(;{P|EjY#RerqIj_A8}? z2M!zvBlDGC`Lr-!!o+VfZJ+qWCy@qzCOd?0zWEu+&wk;+XnqYNxX2hfAlWwq@bojw zZa$i<$@$VSc!Pt>a{1oRjL`CSGMLyd#;s}8JkHI>cgr9wpZ@f(EYEnx(*uvAM~_nG z%HURpZ6r*r%-jIySX!UuoNev1b(BfdU;t`BmA|)3*1|gkiuM~G9)UJEIKqIz*a-_^ zW}Wp*8{*eU17%*t58G8Z$b?(|8V-pQUq)Muule+8VhGx!lcAraeJqdkhs=mS&4Kfn zg`r$7?dzhSOvWyKCy|E8@-5o?r5G8}*4z9mfLl5~WX znOR5RXM3c8+=L6GNBs1!7vbnrxs1aVXFN>E^ljXV`UY)4o!rR9F2% zUg?w4ej4);>SN(>rjL>8j%BMclejt?K zvX`lptp^r{D@XM8kA+1^v3vmW4PrU(KMn9QE{TvrT$j~MGoBdYG zq5vvhxkyoT14LTPaypK8m`hv z)q4zL|I8MjC~@8*lTwBhoi1F!ls%nP_HtrFKb(E)v%eg+f=VV7wp z802RO(B8u&f;f>TL10ZQc~}nO<*e0g0;$E#avq`LNZ+*GO=W$}Hd5RX+krAfHQ&lG8h-Jrd7H0J|9a1D;iuK5sAtn4z$lO2 z>$5Ouo~^TWxbn&?Vz-+%=PYg+EUt zo0^NW0$`5#(@d1a?RoIg-M;F}T4lc}xpBqAanmx`G7w0fNcVAaW2;_VX1ceqQR7Eq zY`Uzc;1|nbsJd+{XNB+iPvzLI-zhUaTQ62lX{Tk_$9v(9P38ZYy|w)KtxqV&rUt*L z{5EzEmp9$`h4O;yw?rMrwtwtyzN~W79DQR7+BnVyAwbnY8PB5@RA?o*Z;?A4DCzDHOvHw?uT3m7DAD96M8JVS zgm&O_Imo3GpED@&Ejg=5YoDS3cBV-N0(Ed2y}j(dBi-mHS%}PTu=$0VnbGcXlpRfn zd?2#z*mtrLDUA0x%fkb~;^mKJG+G?bOI|hMAmj3a7rvx?{WpA59lXhRG5lh*JhjsC z7TU3pZY$jRZkAzbIP>Q{@eO~@x8~hWF2CBiyf-i2`Q~SnKg%`wEzM_XIs{Ifr4g5W z&qved`_lXy|0Y8vKW^;Nl*XRD_g7*@+9B3W+9a}2Mk>6RuZbsc?oAl)ni=T=K+z!u zx##8wS*l~ULwwZ;dO-H5AHZBix+1cRbIz2JIQ4K0lQ=iU0N=r;C9RyB*W5g(3OGoE zqf;{331j<>X;gxPV z*vnj)x%ywpkHNq)%G{W?44;h61X2l?TJ1w#9ucQxQ5efyX)5LL;lqhz$5e`T%PqHL zgT+&xaw9u!ugs3x`|jJFa#$|&t5?&Rg|2?hJ+BY?q4;slpy+++RlmA~-d=X@+?iwD ztgB`8Si6SdYSUa4bypJTHzc;jY{-oUsnAKRhTr-Z<@ z>Tdm9?zNp|B!##5BD{2llgachoMrYTjHc5~Te_0K$LuT@Plm>Z%eb37Wct7>@r=1J zq@)h|-Qbb5DH8@}9z>xHVC)Go0KWCH{ASutTusl(tP~C*3CndAheC)Mu(PCs?a1_u z7Oah%(k+3#t<<4hwmCch8lsKsWeyWeO4zvClO$vl&y`U z+?HV`rCCNE$4=htu?K1aOxQF`kGnM831P=Dk^lfe07*naRGb^N+_f6|4s7k+O1u(Q zyAotwOLb13@ir|gyL@dKSjS){oyXrp049;P&Ye1v{ImmW5zUV#N2(_CZL<8hq~*N@ zJCj{-`cwC|!BwRb{l7kz?hU40((xheSDrjXP=VcC3o*}m@H=VQ2MkO7&nI28DzaU1 zz~1uu=3Tm_E}y#WPA2`+{6>!qpzj295-S|-N8`{`*1EFtA)aT#E29l8=J+Ok=wm#b zW=k`ok&KZ5j$%4NV)DXr{xtNayYGu*R%+qDwBMwCa-1(Qgzd3z-MaGCPiZfgth%GT`P0kFUmw4m4YAt&-%a=Cv3*p64w=O}Un(hN?L&{+ezrMTU%p5-n6JIk)P*@LXfn zcuPyx)FT0xCQ&mduf^PIJU^K8Vh%NElalwwncrD;=cRc+s~+(uCT*!(Odmgvf3o9= ztm=|x&?T4*m;;Wu;rC9~s{#=aIy=p|JJ`E)=rU$Oe^7QHL=*z)3|-=x9Z?L*O7Pru zr^Kk6^HViCEsn;VOgFl$Qx0z62c1Di&E-aycrCJo+~q=_UCNcwld+SDG3+untcb^> zqa4FTXS1KUgeVTnys5KhS@n0>)%0BItP(?Y39H_o;be3?Eu>iZx(IsbI%K+h3zE+7u=a; zW7iu<$?}~H6|^nj1ve{Q5!Sl;R-b)s{1<%c19|js+>qm3(~N+AhEqD))?C8o2k4_* zuW`>8z18k6|8`$_V_Ch7@)CR&_?+B_9l;}eDJx9YAlp6N$e^Px^HXe^qp!vzK~QO^^fbVH9w z$FHG>fuRYv;K@_1mm%;o2DfCbZXVuJOr?Bu^3Q;_P*Zo(G%;+zKNA(Xa)o9 zz+!plMA_DRy4QgroJ|KHwGc-VHgN~qI$H$kAw=p|DYooD8+U@i8AIkQ@iOa%V080MgQK3; z%A<6V4n;oXr-#gdh3alc!UEFIp(tD{M!&J+QHDBDSrlIKo?BimuHh@oKnH4ZggmAD zrV50yD_2qs;PgyHe2AMWSBRMz0c(H-)+j)!e#B1X6eVf!YFz)xTdyR+Jwi=9l5eeu zF9~aTeW+R0k}Z5RExtB6`docl=@Y3|lP?DHYpaY+N&$}kT*+DpQE0y#N4sZDn!Z~v z;h1M`#%o1PIEl3}D&5alLnK}+bSqtNwRW{`e6_HIY)6S&$uCrdH*rU49D@TAm)_t| zWi&YGBZI7j)gn2zcJbh#t4hKo1G+P9&?QnuRTNa#wblkOq_nE6-I(I zl$@ESeaOo&GO0=kH3y>vO=jlMp~JC(Co^H^6q5Jdw&{urApvw(@A~!Y%EpcBVZK&i!1)vs$1mjkUg44@ zs}>xr?-(1wjvvR0KQP?9d2{Nj-9E#~JXv<@Z=ROPdRb2gI{jr7g^h5utTKW!*D_Kv z(#A2oOUE+K?r1Yj%W9q);FaFgwyt!@cVWPUm!-rx&Qb2mrjATr>G(PF2nk9br>S@r zIb@H4wAy#$_CHjEy1b>OC6@Ti2V z-K8BSA!ogki!iXv4dV0DSvi_!!f ziXKa%B$1^*^f_tm;JVFakp45pX1ycmHSYh&N2(!dbn|+j|E;BeHCpWi96xcoOn&$s zW$xJi+FrDQebm1|41?Nj7Dl6e}NcL1h!c;KFU%h8X2lpQD> zK?m+ByO^d7voN83&-nVX3Vp$>RV8)u5C-RS_CeC@Td}6B-@Y}r4Tr#;`;QzfCqD2V zwgL|ki$*tkD-GMBIy~$D0{9lb5LUd?HBlW@#oKsrZ-cq_;DrB4-J3vreq8mP_4ch- zskOEwOV(mrwrue3FotShCb=E#0kt-Tn4$KA-Qc-~YW9GBA^AN%QM||6l#8Zr!?7 zb?erxTU*=oszK$5OEVB=lBmM7>`r3C$9e&?UDz-k3l(iIb*H6U=PQ` zOtwd&1fD<%+?ssO&Wrz#5|%G4SC_6hb93a#k#@`VXOTOnkV(fPcT7qc!}sq$z~9jf z?1$w*dr8^lv%S85es}JRmYpbCuc35VLG&j270*0P->rl~CMi=qWkBAMLEShMg9otg z4xWGyVJ`AulXbx6z!qbNGTi|+`q%{Wje&)Y(YA*ciSVszEv?c8^>zYwMrxodD0eyY zk6wF<1kzy=mW7L01;-4hF}mZ<-F9uR)<8Ker$99wg^AO8S`%#?c8m)Ban9e$h7?bx z=Na06wMlTL5!<| zQq(|29<0wS&?d$VjYo?SdH@eRX+t7B)5nh1d4w$`OhvGE`Pz6?nzZuS9tNe)xVD1` zY&ty8C|u#H1^uN}Wl!bAjzXMT7o}Tau7yj#ot;zQn293h+a0zxX7fA5Qr zQT@-JJwsY6So9X6v|1icX;(UybqxmBqFlKy&oWTat(|F=*HVb897_ot>cBj&b7y2J zhc)eMnB`#D5Z}B-0qn}6>tak}9R9F8JTJ>Kb{&;GB?H>IYe~_ZBTmo$Ghh2rK&eik zDJde?dgb9xXTM$J=j}#X4e5|$wW$so)=S;b*!fd$IR}-U?l!m*Q?>+fOO$^;zV^t9 z-eME9_h*|c)1G?YFSkeDbOYA_G8M+Ph+p}Z8#%`1#!++H3;%p>^E3$yoLk&!Cw7+F z=Rf+#?ZhwtMBCx6=XT_}cFhm`XuIK>LycST+I_blZ;#*iiMD;>aqjwEY3o?1$H%dn zGOzCD8V5n%)?rDd>EP-)+LLtoxU^&asV}tSw|=Tkves&Saix9f-~C!U_XqzzGJtA9 zq2(~^8(!b`f9*TlYrp-Q+LagCC+tD>Wt^rU6;5e$Lti_E1^B6_zSQo1-v`>-2mV!+ z^B}jL7Y7)q9Lqg*9vIvr?sZfmO+LhrKi`pO9G<=bFTxb?BLglvQF&>CL8&8vU?pu0 z9LgQIAlN79fQdqXTnIB*Gn7yJK+~P(49OglPh##Ao|>i~Rpt@V9h=HRzEB=t90kyf zY|dQMPG0w3ri1?`hj2qT%OEb;6D9Cb()wFbJUy@QLOsfIWui)*rz6fN&E<&x4|+14$M#G_;MO%z1~jbZ@c~ zSPQju8eij_x45n1o@{Q!E34%!{T5di!nP!|%^y4rAm27ncz5UkJYQyFf`}k>t%hr| zrpBF4fl*;<1q3AItuWQ}?Z28Hq3}p>mP~9jEvNZg#ljBP#${pK2vh)Ve_P9^GlH(B zL;iFSMveSPv< z&i=tGzvuffJSA@DOs&dxuOob;wG#HJz5S?8hBLTY)~$;b+m52Gy1m*!0+_6 z7C05EEZinsC2CU>Cy8shEQ_EcxLw6_Xk#f4@La>;$|`dYVljD^E8wE&K(}f8ry_RW zefMYMg@dw-E;@`dc2P#LPM;oO4aqP%l@@DdunO89wYI6WsqnesLgmjiR1j7COan5~ zfvLEfp3}L94#}3aUdW@T0Y52)W4)k*FC-BZ3Sa8Y%<%Dr6 z?OIIl;L`Bq*#Rl#sZwSd(jh&%RdiLP-IU?ZO3T(AZx_vS^_xdffnT$nQpv-e$0u2A zuf0WO5W4W7Lsq6Cmyl`7FY6oo4r!RC(UoV?K-ps@G+pa>iq3q3c0#E-fdM}f-}I0r zT8GBCTi5*smQ6jh31n-gg$LgR4dESZcztZlw^N-usu?O4EeV?LJQ8@-o%Nlhz z`MPgxH~-adXs=@N_yjXv)t&7@^JSdY&lVQV#qo{y;Jx>>dw%+-+SYBH*6Z}BotKY5 z{z0rfR1bAj83`SOZ!$N)cSv86Ug-z;NXO)*8`E6poI73NQExVq-=}F)Ie6T)s@ASANm_8o`P$4L7oCx?3p%r9?`DnCM7AD(CI_bOiL+Fi!j#`mM+rS)d*nT@!dz(=6+;5uZ=hpD zA5bYUp*wkrVqWm;X(TiPNj&u=EHu^kkah?I)^AH?D7%U|{B|Ux*N_=v6=Fg<&4Dqz z;-;jl5X9a?E6k6|Nf+uJZhIAlM!c@cgEIL@{&O_#)ZT#wrcSjK^Jn=>yN%Kkao>SE z?-YpRE^fs)2MpVp@aI_&IXPcwKWRX&AG6c0-I-7fKVE(0Ksz;mS=Oa#$(mg)wXgN)okvW4NJN(>%EpGlCo!37Smud;`kL_o81}mhEBfdSz zA{jafys7j)4&yq5(icXG9K?wO=dF2)D#+zIR zxWDq20r+ zD+~YaJKNz=$MoF7+>6eH2$VVhRVjc|?nQd}9f@Lc>(QJ8u$Ep1A|v!HuV4OnHSW{i4(S5o@HO0^pJt zueLmQl7p^aud057Z2aJB?kq!+Je-AEi~02#qA$j$yaD9Dl7TRsMUr99(UWBkvRgjxJ=@|iN?8U3vzVm8pLJRhzwnuvcoU3NO-+*rY#bh##hk{tpcdVC(s;1W9W>*wA-i=Y?@GVqpFjWF{d92ptb)8$)#)8xOY`%a#9_V`wfQL}c^cY!Cote#>JD40sX z83Et(I^V>Db`TCU3njwA;#v4QjUC7m?bPKp#7%1ABz|bO1oACP2}p@_H($#q5QMDr zg25x;w6-wCJIT7LaTK_9)&gSqXk#dX6Y#|}yyf)C1Xi7KHgk;8CvMR3E}=BCpAc&g z9lLTLJTBB9bMb_Q!^k;n4Kvb#zpx%oz--ccm^m?duM|5+Se#eJ=&Jro`E#>Clt7d| zt%Sm=0Oo8uEr9ZFx0tCQM5y-?usBV}^6<}6uqXy)K;Lqg)oD~0mSIRX`>6P6 z{gHP2-}ylp2L+FuZgYIf z&grKqAIe19qXbeH&pyo!BrJO%&#AYel859ZBlL6+>l42nETKDCn#Uu!ksshSzbOgf zDesMk?`)6!y?3>zzw__1%P|aGNEA2E`w&su!L@q#ZEgMbKWgo%hl7g+Y>2Qgn#u^mZ~4oXU8>Hgzqe|i3Jzk7;hCb&hUh9r|9VHLv8g*2434_#2QN> zys*V3&YLW47>8GLlNLPZ;K5CBQ^*$wpDrOd%OK(`yfTaYa*g0NL^=(e*r68PV@XRrB(ZROC{U(n=UEab~4zJwf^ z=SG`aR+F{@uQ`A?_2dbr-6z|TOD^{QUiwXC4m`-rDMNN-7i*y5s~!4F=PukZr2L$O zN3|%f!hfqQBSCSCfyEOH)>zMt@!F1oP8RE)U8D+%3~p!S!op2HTvMZU&Z#d0hvsEN ztW&6wBgBuTg!s%NBSdX72q9pc8p>#!gg_*Ds0Oq~Y&^a`TxcFJcIQ{lol|0@qT%yY`cc&0OoUJkuGzRFWP zD*oWFBn%A|KUDTIh}-bs%@6MQmS6W8k{+djf1rf*KPY^rR-TQb;;H*~2#$JpcASQF z+Rmi_bilBfU5$eU*FZQbRxyAT;SrP?@0C`=mcM`z-qG<6{w9_s29Dxmyr0Gl%@tv~O(o>cvtxt@~Q8XtJ*c%hB+tb3QrA#Z|py-jdMMB=P&W9bKyGo$B z><{I(YvBUEmw`oMk=9d6n6&JD1|{vX%Pz}C3wHoJWqa(2Cpatck@mgx9L>tCK5KVJ5-mvIRAr5SCi zU=?oCNHUdKSXT?q(grBtdq2w`G&;sZh7%8%z<&W$FRvDydREXdJ>Wa=8plJrS^PIin z66SFRvmOHN3L#^N}+2N46E>*+En^(?#|kyT5He z@t~PZTl8%`YC$Ntj)%HvOU%lMuL?{Tk8~8t#cO``x}eU?n-G;h!|EBRwEb#n-8u1C zTl!fPQ7ma8z=Q-!S#%oo7?llS)Oqq2l)yy!^F#L#CxL&)k9n;&Se6sXrtYaL`^2ap1=Q8@v&aW%hL6Tsb}+#-bk^yaE@kR$gZ&*@Pu`5<@oILy^0~4|3+p5_rgsEx z9REoM8!jstXYH07A?+JxEDz)s8YY7j2PC#Nb~+z>^v}rC3lqG<60lR({$#u4f%l+@ za6&TY_+8NFFl9Hj*)DqUAGEWpkF+zFe=o@u4_?r8UqIx`r=CiVW*H2SS$K>xMJL*U zZ@lGZnv+s&{uxv%9FRfsgl$RQo5p&$x`wd>;WdvD#euzR3WZ-`(~<_IeH_j&tSsvQ zLv=CCcAVZ@ zqj63X*G@iDPY4><5>8-I8FN&Q<;Sieow@0rc@n;tXw`t>u~DT7hVa2RAH><)=nKjg zI6%pmHmN;cBOx)wg}D;0#MNE#gJLf%p?NA`&xd&Gb4aIC+hKSGkD)#S_Xzpyu{z#R zgWGZmTn8<>@{6~55~zQR$46Ktkk2SyeT=M;397(aTZtPyVk!lDC=UTG6W^9hIZSzQ z8_&RzU(nWf!1)O|SpBBfPPT2<@HrUBCW8RrR@kN^XHh+iapg7R2PWT*3WfHBpM%xDEdsU$rci07NB1l1o? zF!)Egh|;mEh)h7oHp+qVR7ia6-0Dw7kyaot=CKfTQ%>>YJH=S#VrO8P?J32Il{&@O zPM9Z~qj2xz=$TjD{K|IID{kW6;L~gpc{UqGJT&@=W5;uN^r=&)@LSAus5EIQO6P0E zky0s{9?7zh1;rO#%q~iH|6Xy$1DDMW1QIhk%JBxMBdDudq6_^OAP zMs~2|+q8X~35klI{x~e(su(>am>>Q8Pk6>geDud5Q7nmxgIj!q%pk@t zDon`I$LNxjxS-1iv?l$0>>-(N;l^pRDFgXknzd}0Oo~Em)|4LN<9qP;+ebga{ORu@ zNZ;W}(C|S%iXVX_UCSYZJC$o_@bGVyKmW{zbssAxYfYWOklw6eMW$H0F1VLI;lwL0 z({tdl?H?cVY%RAS2J%$vyr*C&!}Ql8y@{1(g*0*$8den*zzUsVWx&W4WT~Gm2S5fNf%~JfOly0y_xWZ8TatbThhvK+W0*v{xICM2#&z z#=4X1QvQR8H$ze_;XY;}-wJ{5)*}L>!<9EQ;SelO+~x?!NNV*|jE7%fc^iL}U>qVT zkrrI}(lw&8yiFs%^(jJe4c5Bg?crJ=d@9W%$x6=yU=J1|dCOaTra@*+ITYa$96$!Y zALWRDrkxQ!f!>2RlpB|S`JbdK{gkDimBI+7L+=S8s^u1J)yuopVGJ5Y~5_|qMjTz_y_kvx?~(P6K#3say&nR`5nr`TV8_0>5@+O?CO>6Fvp z5h5N{;@Ni|CTjhwB|!oX>6k721Z5al1&|JB;Rf!-1_l8Icfqvok{ zi8JLPY;}Mtt?8vlF!Jc`^lill1Ci}~?Ht9e2vN33FJ%hNrspF~;`XmBwM^lX&t0Wm z<(+f>w$8K}rf0`lPql%}nSp;)Mpu}=^bXA#4vcfUSKe}(WMUS&kZ-w}2;m6hFxY0Q z4l*|B$g~pLW~L~kq=zMEnqxe6m@;MCNoZTfwK|SGB+jJk6WE#Vy3?`6W6=Ey^cj=~ z^5YcWWuED$AjYEOEgKermZTjlit<&y^R{e;M7HII;0~3G|oIpICuk9!DncpH!9yQ&)&mJmzI+9CVXiky>CrZzguk-SQ zM}qd?9h}1P-*lx$4jTUa7EJCR{5((?P- zN%|!CO1U$|wA&W(HLc`YF6voz5snGzsbhH0^G8k3we|A3;W)uTmb4(VJYkOZEYEw} zk+*?p9I<|~F%rgd34&O(E@y@f1kXHtU%TuTw~(_J|5-io_IBoq?{5d5{+F#?WvO4_ zhjKHWnI}KpF1`Q1=E}N%*w*&H+uScwQmQ($L_DT>mX_+b;au+HxA0A(G$nu)ItQ;WJO#R4S#HocT1w zasr=0wy8nssaOPy3naV#0OD7adIX7U7Znuxkbm-BxTLZ2F(_*Tt%3?uZ}Lc4`xiRI z5?mE7PM`etc&U?J-_Te13U)}Z&`AFXL-B-Z5uq%3D%Jg)a!{Gpa+?hxyj5y*OcZ=$ zSe63tcCe7TPazh~M|RGXV#@$xg6UezLPb)A)<5IhmPjtjUOH)rbc)vt)IB@P^Cioo z103z%L5NC&H#oS2V4CvQ;G?22<*5dQVIzb9r7W<>Bo98`IrT93zAiLKhb42%Ew{7} zedt4Ni48k2WcZSdMrq^+q(aHV%0-3Sp2q^tGraeNRqgEch&%NdoP1W*Zp$M+`umWF_>c$Vn-}S@;FYE1Wq^n~AY$;Z$Bwi7Om5(* z0POwg}#_l&+Mbn#eKzlJ)Kxe9l5mxLXohJaHSrSprVC}Ozh2uzbydC?(Z7&%GkYa6TFMW5Lc>JlhaExPq zj#?Wpz{3vViMf;Q$iqL_mX5r$Ene~8(MB)ixil9xPp2OGJat{0A+-o^!-pO@Rs91q z77R$#(d>^V;XSQ@e!K2nS*09x#wI-MT4W@XeWLtgOH#hcSN3;nT9E0l=4Th!he4u_ za2?UjFlA;3>wTI|qeaOhdbMK&Dx-UebQGh_&raHo&r!-IbI+>~#8wY>1G8YBNDBXL z&bAptTU9!W+flLz?U?PPB+&RSSX8hpkS0&u+cs|aOUMgJA4Ef(qmQsz1w)~Zh_aF~ zewhbp=b!&YH3*)HJKzQer;tG&??B*Vhbjgm^V{jk97X(%QFxL_NEEhE4SvBN1q56H z-;LwEe4(f`gMy!;->(7od}nAQq0k1%PzJl;Lp*XS8{$>D zj`E&zF-(y=l+ys)qdk5%j0*Fr%+ay#FcOiuJqAH;as)okh}s>&6D%XxnI=7^J#tsC z3Lchb`x0{;riPpC)a4`NxwG804!Mp?-eh`jg7~hx$@*40ZP%9>|JvCz?Jjx-b7Y;0 zM=O$z%cEK*I9|duG6e%&DjPmguxM1<{UA;|Qsdi(e3zw*6j*qhPA27EWm$?G^mM<9 z7qp2xC~rL>GFs*5OPYsi;q2HY&xObID-TungPSta%1~qvi6o!(F`%zB#F4=npXuC` z6nUs&oRtEAL)Y$9j|1b^bFcQL z+&b{Y6USM`z`?#)6N_h2R*{MBl%)g`A^Kl_1`N-6ci!lQI#gzWQlkm4y4~d?zVT08 z!rS#Ozg>U6sW$+7cwB`)jA#k?_-kBV6d9#k4u36k{&sAPaaS7&VE6;r4r7DHS-fo= z@rbGfGLCveYr+Sg-M1vDeruCGz@HO>DuSXhCn|ub+@-9O2ah`&ls~6Y-F4{^Qd=Cq zu|?fp!u`cx{Z(I0p3Ie4=<_gQEI)duPJA8kF)QI2YRWOLw_A4yxP%Z|%c4~JYD@ZjMC zZFV2)2)(=jS`l^hX>g7M67)KCJI7=P4zr=erXsVuK1!i&2O2R1v+lrv3fwSX8Y>Y& z7_%b?Y?%I~)4+ck$|kt{d!5Z5S$xe1W`e7qoa)e|?R}OR;Rmm#ZWTb9iElfM-eHZc zoZ>*zN80$s*OCY+nrMF_Fo+|lLCImltGNm`fSXCbjFX4=Fjd)u0&8%Zdrx1)wdT-R zG{QtK_YhB{;!oV*uk;NMjfq2mFbS`KqG|BkrOotxsx}H&B14NIDF$$fUl08TD81^z zHvqezyXlLWatnyD3r8IM7#7+pDEJK<#9#pwjv==2Ne&Nb363FVDo3RJclzY)(`|b{ zSJ{LUi-(YL#k}$fmgXHSHA@`x;Rd1!);u^xl0z>U9IUfW%f>LxSxEA$g=%^ZLbm8^ zB5<+9IIZlOtfA8|!=9%l53cj)z+{2V0vEM2ZDpIA2oT09cy{>ym6b_9znxyxk|%x? z2hRM;6e{q-4cCZi@k@G^7x-;2HcI39?Vst$wZnIa7oI<1$w~Mm9VqZV=1E0TJoTt- zTKbfBZ!Ej;y;h)8Kc6T|9{wa>C6i4G=YcN%W;qX(vDG(J3cyIX5AVa?a zMqUVS4lt%v5LR#=vD0_4?fsFMSAvUtN5>x7cIGCDE8y@cPf69`#5LO z_J5WQY9PAy+H2ce-tv|lGbGva)8euF+UA*OvV_2aq3zx&;&ljK9OG_pp#<-{7gPgX(r-KpKdqt)ZCO^o(wki2FIPqJ2@>qN7fxFvf zH@fidCGyZ#+!S(zn?k0>A8w7~TVAl|O7xfg&$NqA{AgP}`PR00^AE!hj) zAMC7|=LKp_lqYi+x-(%A>qa>HLyxeUbnCFDW*0w?!GQ25mKT|gkqV>OF)Vx2vj}I1 zsHry>?b8togQ(Kq2H^QJb4-gs9lLZmY!tyb!2*1xnd>8_=oBH3bzTZ>yj?r!bRFhM zcXx8uDoHxN;ves=2S1j3FGoVa2GgHRf8vhU?hiiF#G??(yJ(IdKJg=2^A@+iI(!WZ zOX3+`0TFacf_(R1KTRuwtzK#ELKz0G&?q^9?Exb<0Y*=tKzrOW0rb^FghE)behzs| zT!RbOF1&F^3GF%uU+@+F4&!Sm55o#k{eoNcK@!Jqz5+LbuQZFcjv?h-Xf_}E1Wahh zW+$(*#k49yG`gT2jGZyBjEq^_It|x5UA)PL4aJ~J*9u2ktgyg!inUymT*Z~$z9c1c zBYkD$D3KEpp!lQoX*rtYC>bq;6If`hOBd&FGitha=XkrPT?U|eGT%kFznaNa*aqb= zJE?$i9i8h7Q4dlrW)W|u98p;50JJRFL8L<^tyqt%Xj0!+T`5A8l>WxASMcn9Q6A(= z7}qQg9bP(4JoS%-(YSu+rKkUUok>_i#37jU_~y?t=c5!%@s)yWxUupMtaMU-BPGD_ zo*rli`EHV3-P@n=^9bhswJ`29kqU z-25dU_=)%E+7paEku9!!#ImAn@}Fw~!xzXm*H}G!`V4$C-Oeqs&e8gXC%v0^KO18< znZ`GXJQic7!PZVc6Gi;0E3RnY@~z*JqoG_o zY8oCw|MYDiOkCxRN4sp(fhk*NP&DUQ%j_UUnp~GyGukI9N>uzA${c0 z27DD|*>dG?oIW+1JNTRxhK-kLUp5kOq-@0rer3>|zxRK&uYV~ifaY#uUpx8opJr$9 z_aYCuGx$h2gOC^C*-u*gDZ3M&Y_s=&sx2S>=62??zs@qBD_(%a|MQYK{@FjEFGLxG zZF2WGecv)?|4q?`X1EkVL!7*_#$oqo*^xiLj~N6kglW4ZEuY9GE>W2ntNY7UNeKAk85kd;Akt!l>YfU;Pw7L>wLpZ1ju-4L%*DH@7Z)3Nld)PgH&e zbOR~`oI=2-&|7KwJpTv32sgt3j}SONhe0q(DzO0`Jc3jt##bDdI|5<^bbgW{Bq)HA zMhNV$iXrWBNgHv+oo6=>g}(>*>TvZcAvLV09HL9=#OArS{ut9IxUKIR{gav&W}=0O zc^7_IfR0z?Pvr|a2aJkb7kng!cREzp?Tk&(;e$8l9Z4_KD=Ie`Wz(9fK8Pe8r03uw zBX00rzWH=}WQWrPIfiDi`l)zK&|oqGN1=0l>Nxyb<%~j+(R$Hphc-budPdlmQ@(UA zHBAFgk(88t;0N`_8GoSXB60j{LcRZ zGF-Y;pa;Cgw@`|ou)g?38IuP8%tt-e*Fb+dcL72xFX`dO=%y287C-%k)gq!_{wQP9 zx9nr_V<4$jPs>YPJ6Yecys^Z@oo!B?YBhAj$t0KLUfxcTkR7He?kW?WFF7~MNSSN3 zyn5~#b_AmVaNeW?3y7iaTzd*3QOL}lH;Sy0_8QYG({Xyq>M7f@3c_ny?m`YT6$K#9f%jyN zI_K1I(vNT`E;Fni(=4}i4smsxhM`mN#-ZQ;NSnR(x;FmR|3#Zc0gU0oJfW!PiY#WS zCQ;sIF1iGZ(Nk^x%qe(ey4`r=jqMx0{u`)Y1_%hk3=p^*0Cqr$zxm|dpG3wufTZVx zJY|!Ejd9|5#E`RQPXCu&2Y@=u&U5oiUZ%Or*X~WF&sw(KIL+rdf}SzyS-Fu;SSAm1 zOvfzB;3hn08rI4D!hWWUy^<2%58rRL`#%1W_O`$By=~vcmxA%7^K4CB8YS?^L*I`a z-J?1Q9 z*=Ake4CnYwvnRt1MBd2bS)A)jOF2Az13sCU)8-A=q^*)?+JMVgoQ2(Hkg~;~MEQzf ziF|Wb%r%9cbvm5jvWAk$kwlmr=`@&H)WO6wK+;oj zi?AR;7e2eKiSD&e8`o5c@v6h8ap)#3J3rZ7<-o=>?amcw)YQERgXicA%z+2ca#!yE zaNBt8yGV%mwtJGX{p%b)2DhRj0eVmvv`1e2q&=FV0mGy45JUH?k2LNPq-gWQXb(P|WzEo!$b?5ENrR6s=*ojTp)~x$-!sLM65%Pptm!7}nVdW|h8?4EZU&ru+d$R1nWeK{) zZ{(T^W<4tf7X=T$Sft=Xr-V1LTHmnw#diPp>(Wq0iV$%A8>S;wOok02AP2RI3*sAE zz1haj(MD(+avj~!AhQEdKRYw~QvU&$1sNhr&ZUnu|r0%pn z4e{w-DVy*-e%1KH4MP$DR^EgUJw{G?g~2qFS_m-6FX@r4;oC^!uQ)}cs4cTjNlzz) z1!09tY51_GZdt164a%UMrb?Y1Zw`Z|Gj~_>y8g@*IGS~XNEAcr#X7oX>A_58h$nUB z$k=uu4bsg&kA#sQluyg&SWk1&LCSWg9XhYdj3ts?`5Hzp1Fy zmyDM>3=z_aAJVXHT=cm!&Cmu3!1)w_yGIR(5R9Mp;k2!cz}_@K@+` zy&sz;D%6SPkW&lf-9a`;8tFKzVYX}s%0&mA&T44v@G3xW*Gdbc47{dm$@PQ8RWxcP z&cM@-8%}jL&6{xK_bNY^OVLjwyV9>xB%l6wzuNxd_y6#7i{nNA-k7~USGQgK@ZW}J z&IsfTzZdi|xl1YOOE}Z>#BaCxd*9zy4t@=rMc&oc_Py~1CFRdb?Ec^TH^>97{hO+R zlGC>iQsuV^jdaB4#>ZY5PizCS&Z9RQ`Ee*5)>rJ>$Zw zo+ao^$OZ$@^(oFeg}YqNqD*pw9X1o1mQ2OR2G%+koen!LT`!^eF`X97m%A>7N0@2( zP>AM%u_w4ue4K<_*gD23{t9k|r;Wj_@{Z1Fer=Z4Jq6y3)=6B8jplC^)m*d!5Kuuhwl)g?`{t8j!HPtn$Y?Y`uVMeNwsh&JUg`t zm7!#MPVpFgLRrVI_}r7zz!aUmWD4U5U(fSEt5_7!BbtX;2({Ix+RTZ2s$-x|wGwZz zK6DPgNar9b%4Bz;r~yjB4KWfR7?;;{Cg$APw>2DIS9<@7*-YFFjV$7OY|lqtp25 z{Ci2J9Md6I9TOPRqV#p#J6e4y;%7PP8NI&*azxkE5F8 zXqSnx{Y(LC=~XbYz&E^QxRv}DY-5f(OGa%o8fMXWs!H#X$x0h*Jci10?%;^ z5_y*2R2ujo+tgg@qRK6Wx94Xle+sC4flX0S4~7j29E=$S(7^cT8-;|oRwly-_lS4( z6Pd6bpYfAclJkdpPaWA_Y`4;_U$yH5>TkOG8Q(vYpe{D5sT(i;WlE&@EGmjTdNXB(?}8|`_g{W@j)A3yuqb`qQ?p#2nML{Zdm^2+Z0pp zn;f^X>Q!|sOYJLP_qz6;?|Dyq+gsn7PSL)}0mU;9+}WPK^P})UwSf%oD68~?q~la@ zlrhrv#-LfIl-D`R!zN{$`ZG_p(d(?@*P{ z|3WK)7KiNPEhU#Qk$CzK+uYNC*ft+K+Lo{ip4|M(7rnqvJ$i3@>aLG-P9FnQ`Vj{j zoBVnF-X;S9S|2itlLz3BC3s4`>=4UU_n`6j> zS>Z)yQ{bzqNpQP72A#`42NUc9cDy0OAp~q^2v*lT@uC@)wkWf$qg~Py!<1M#RP@52 z5Gr@`*wJbxp8_VAucJ7cfa`c%ljGV2(=ihsJ>wA_;+W>Z=k*nYFHUQfu8#EFs2E-zU5V5#~jW9D~f!pa_1XmJMpn0Ay;lMxv>4JUhW3aA85hP7_{YD{>X|eRVrm6~p`0$PA*STRtew}o; zIe0zyXbdGTmt3P{)-JmxYMzcrs-ODDRXGCriI~$z#-I*b126^ z6007d3daDx$6svnooK`v48b|np{aE|p|Nm9xx+iO0#Vdem`H~3;TfG#kg!tsS|eVyFFG>S8^*_*p)jMj2#u3v3o7Lm6xG)N>dppeM8`r{};b?~W5! zyxt)!oOitLFu)jhN{?{crwW@&=MFsU=)IJM)*kuYpKBLi^Uv9pw+|QwF{J;>n{H~~ z^_|}t-v3W1f#<&TV4J=8@-{WkA|}cpYs#b*CDrx=Rs8KKWWIdDJLSqR9{x9^!u;?L zUi2^Uy5pzv*A+m@W2F3bzrZKX5VzjO^P?f>SVlO~p8r)HHau$8=|pUr-ZO-lCN z_Wdr?+ed%rr2x6rgErz40<^6W-SX}Vg9Wb_R9_k-hq{(GYngxs74DC&;}}dmMUF^53l=At<5r<4eUR!?Ue5qkFL-2`HzkK)}1cz>Y{l--QLiI>cU7qEk;7MQw`(^Opms&}Jbg!g9d`G-$w4DP@~0qP2# zZAMNijw+)zGdsC`6RYjzTMx8{*Iy}eee>9nOcBp%9!KJtQr@B?Ax@?f!6W{f_T`O# zI(_}<4DyH$y33+cxQC9xv@#L{Bpn6uY)h8C-7wW*9R{WB7rGro6 zi_a(Zg42A}qq18f!Wfla9Nr_3e|4)YslchYsrZfl2s@1OH_7_a$^93x8N<$WEC(*bQVb%HLHKQBnIjUH zsV}uTmau4j@h)I@)Zs+7F>qi<_ymVIv!4#0a9t(Sc(|YftDf~vU82}U&Uyea0|Ad1 za?O}lXqB2V_+ny*sToJ^40v5zILTF6E~Z{S@nn1K5C4z$@^AcaGCN{kEZ3WFzPY{g zUGGXhKl0H(ic;cq@VLq&f7@J*IOf$)R)qY}>tHC`Kk*hWPbnVOlK+hB-+(7djDFDI zUnzlqQW=DZC@8yA#1*INz2i-K@RKYhFHz=XX!nnDu>6aLqHg$=6TreRZ{iIDT=A>8 zMF}Ka7(V<3eZF+%d-(Coeg-=eT@LFqdE3s&K-%j%@?x96EjAWyGTpYhbT-QR8{Y8x z_U+&P?b-D^4No`=Am7>M@BGbw*)~seH5YiSXE!QNs*t1L!v+}`$g_6XTAw|~FH>!N zE1Tx%guU}zUiNHU2dR_mlWiHkTS7*SbDF^nM|-#se~0v(QJa)06@D!FC89b)C8Vp8g443#Mfw+nH>xRo`-R?IzQ})3f$-T9#=`7};hycFKe3JsQon zMrvu6D1dm7NRDp#+o!XgIsVzUb?|6gyW*B= z`UnEsw*@h>Ug_qa0>u!5>j5wwR6J4~1OpQU3Z8%)x%_!mP~p<;Q)$&Z0!b7VR4FQ? zx}P|uB_4YB@9HSaKX?fsn7^VowD28y7qFtQqwc90Abw+2f*m8iCN|IoL_qhHMS?9m z9fhYOt1=QV-WE>~nFnA)kE!L;w?KubV2x;uN^9=SeeJ;6`>1R90p^HM=dEznBD~Ie z1l{rmvXzbw75h3Tq5PSVf@ z#cx74jn;va4KkytxSd+0;bywoGUPG&;LBI{&J`dgfrIPI#Q-S=K->!P12( zWSw+7XkEwpYZ_5rEl}!w-0LeD@K_2yqEcR-d*Gw(u_ITuYv1(E@$+EngNF{ax4-@E zT)lTBitDYn-r7z+^#rH>bKe#9D+9z3#%(>OEN#%ZwQ5;5!@b{8a{Si9#yeqJ zy6m))S&$fympSt7x6hyqrm>b+{D&XCg!k=KuzZ}dqYQkfwwYntM)BHWUEKmVv%LPz zZ*1>*&-b)9v-U4Hw4^Rk{h{yPKl~5v_@_RIwS{%)D2?m*c}MgtN*d(yN3Bw3WX1|+ z|B?Ns{7z0VjCgRf3++jYoypTEZKRE*aLPdlVUsx>W2Y_9A-kMvZIyiY_Ml>i7z~eX zGO$=<0Akl^TTs?9CP+C?qY*mAY~Op|hu_~WzV^m;EIJL{5(qF53+3L zWY*`s^r(E{D0=eFKWZoMx)uI91aH|NA)jm;)U&4#c*4K|j!a|4Q3e?DtU8p(QK=lp zZ~$zMRHOZ_azxrVGZOpe527?OlWJo?xl(4>FWRShwVdY&=1f(>?bDpSr5{8nhWQu` zBO5(u4c(37Uq}?nwBD#3D&W>Ug9Z&%f>%~(6lke)Fu(nSRzDX%%aLz$ zIN*wVaFrj3E6hCM&X+-sSV?CHPw5A8@Y;-)971J(O1*rYRF9 z?ZTIId)XzA=C6nd;MCcN+kq$lkTbXFaEa{t7Fh(|1rp^RnYqREN7jZSG^dbgE`Xke ze;lE2v5kG3otsk|jF8z_l#M}5@W`W{YqaeSVR+MHG*|?PPy`nv5la`tHR~WYvGyPw z!C@zEhvjsM>W$MU+jPEcPDc=F76%R*>|kEAb#J>9{yIH=CDTVXol${j(uLH(0Tys7 zjJL#_jVU!p{b#qhaP?;>bUux1Il()YSE%4eJh}(#Tt4>lOE6hS zP-$5U%-b$i>?7XKN3a%5;t?*w{O`QThdM;}q`8R4$nhyxa3x97G~Mzr?fNG5#OwHp z8!R1{^%EsM?Vb?6wel&PGS#b_j@dtV25X@?uztK|a zGZe+iw!|(tDhXiRcH{hJIGFFH^>G`qkD!OG&sAm)sBDom)iW? zfp+OFUzIxa*ciiJ`HEMxzw+JR%>a6;-EsTv?fCI0*&J||tLhx&K!|0Ua<$}lpHxjg zt4{WYq@Ln!fnsPaKI1A5j-9z55h-LPyg>f)h=Q~k2{7p z=}1=?1We5-r&v=8-J4id-k(!dVzbQCl64M`{|Q3 zGs1o2bF>v}arb%Vf!o?0zy0&7Q(3>RgrBAlbC4nbE+LD~qFc?ome@LHz-z~*Jbdyb zN5h~?9XhlS1BVvob>KJP&l%e$$D?f_)7Id_Z4}0B3@s{->RZ(~Fl5kYjI#l0i?z`9 zVFWpfa5{!Sh92~Xb@{Xn7XTZ(mz>)e71(xk0yz@T7I+f&3>&Q=cI0ZG3$tANhT^!% zaSLlOs=J@G__-)M(`KeghE)ok$1Y({!u+?5=Qs_t&@A+)5lf%Dk!Sw+-?p_kd{>k} zzyL=2;IPYz8!!Eq1^p?@fR9EW)>fAhaUT#bg)jNY$E|RKTo2NP0+!b zi(&1aorx8mP6Ph&d@Og9Ps2AGAa+W{v|QIGpP5#U8iIyctLdnxSS~O|BXAU*=|uR; z5e@`^+vz%lWu=miKpu1i?VXC5{tQl(4%34FZ{Ge~yOTzDcILA1+^*%%j!y+|u=?q? zQ}nGc?%%khpqaXLE78y~O!cOq@JVs{<`KfD7k|aew?2gOBAH!W18gFUV&UsEeAicg zr9($(>HgyE2^Si8rh8cC{tK!eH{XS_L}_(dRZ(sF|Cj1AhD#gg9dW6Mx@+`*a5|dF2nkV7myoIe&Lht)4%qUaVt3@ zKj=U`j9x|2+dsw`QREZ?j2ZT2upT9AH_k>P)&wexrr}MC+uLANbT^|Mn^W$l&LaP6 zZ}y?DSr~Lc>mmhEM z{QLj7U3v5C&o7LZ$d_mGJ#*tPwu>J5(Kd7Jb1&SraThrMhoAkQ+9mL}N?jUTiMeWu zd)WE-$%XcX&s>DXmsx=`OIYmY+X0UF(YWEDR5=vOcyAM0qqQ!(j7nMI@p>NrlFd}e zME$Z10iJUi0@4cWHb)#e0D%T)F5Cfce<`mk*N{~Fzx=zVLMcJq-jQKFE^nlyc+)CfEKM zAoIJc~_Bp|CoO7JL5KQVS#UsF$gpkzKc zOn3w>v`BAF`2NF;a9cV)c@rl-eB^uhvGDXGVU@-__*s^M>~-mrXa!{? z0Fu$lZ~B{p5TDP8?*og6c{Ywue~)1F8{nj1gg*gEdxTdnpH6FmgWF^WyagcZ>RDgB z%#)Ulw8C_Xl}qCdO5mXQl|rxbN9T+@x@7xUdsVxi^-~!JyDMHQ-h^A| z>`Ty&#}a6KM%2`o9llm<{Q}vCNk%90uYkZO?ltVl3r~boFwbj4)?sn-{ zegn!OxRAXo%gd2@Z+OES+ne6_#&+L*_qAI;{_%GAU3a4dE@rUp(wr*EAr;@9FRIG( zy*D%^K8lnIAlUa%?o}t}$MI_vsRxY`sBihhX9U(Ad5t`aCj$7K`1nbAp&?91{jZQe z3EtBx+?C93Isxyzm*n`#hB2n>o$h_vwb!+;`kJrGZeKSl+MjvQvz2H6=0NY*XFk~O z`mLWMovM4=M%HUWn@YNC?_@d`(Qjbgs{umE70bc)hSkq48u38Kbq^v}2Vd?Z_wMYNdABi5pGqB;;A)EIRp6x&dmR_?3U! z-uhjCqaA(y*9}GSl6r4X9LSo$gHQYvn*@Ke)&&0l_X^)C+m}%Z96KWqf4S$8&mU~J z-E}3h$Np*=nT7QiUfi0YZqbW!H6Z-qwWTg!a><+q3y({qfrHTpFW(5uk$XslxA+X#36g~PQ@(|mz~I9_*0UZQFk|pPqBzM( zsc9Jp|GZ719@9u7z!Z(f*IjW;R$4|+qVC3ze-MkCFMo`$GpH+atbs*X>cV(pNp5?d z^%_i^Ix>D1JBXKiyW? z-np`j1%@M9#<`uywZ`)BnKNu6TVk0AM`)??tKcuVLmq=P^;%;H!|)qb1Wwwaf?vxNjczv#KNSblt?;S|0QNjX zh5PP*g4u|MN0g?gYyn@~7S8AyIIZG`I&fuJWMeb$D%AL?Xr*1@R{mMYk#C?2FHy$B z)NsB{*F2bBhxIM3nQ1@)oM)rO+}yq>Tgz+9$OvZ)iqGV=briwJe*c%+!?*r+`laR) z6zFj&lGEVcNaGcf?kZm0WzY-tNvml))<1L9Z*u44ue*@wj$3*Sz7 zfPBf<1liwBU~tje=j{(>*BV`;&jeZJ$8v^NXFxpo-78Zaj9Opz(<0KIU#qAh;u{`Sgm`yNPDxV^LQ(K~13%fuu10rwF?R@Gz~X^* z+UGuWNxT1#53#;i8Q^Rd3Lg9;kJ?<_cq?Dqx4EQbc2>S(K*8Un`VVZNam>MtJmBMu zmF;E6J`O*5Ssg6Bol6qn4V6jzD3@Kiwp6~Cb>v$&O}Yj?$H2&XCJdG^*e1Q`8l#yV z?$?~dlBeLZGaX}UZ3>NZ+&O9akH+BHHDh$9+boKXBFCt9iSuYySVQBMO z*DFmpwt@HT0d^H5Xx+6p!5KAfsn1R)3IxEUD{Tr>_&kfURer|E!1SY^ZnMkB+R{zm z($*KQ6g&@EEC;_74PU0I7dVJJ3LQBNvtWeo@a5=V_;=V5Zc8zqHfVu6$Oz})sjZ{p zkAga^lnikz{t&09Lf|OQ;21!L5WeHp5smPT9Ae&m%jm#;nAuH3)VZd>NuD9)BEeAQ8j*HW|N&RRd-(#2QOjGOPh&!~*`PbCbY z1-A>%cl{4QK+mgB%VUVU`!-F>^}IknL#Oa@7rf>9Cm;O$FPaWKzy-GvhOka-P#VXM z*Z8*@yD zxV*$EITdq{1@cZzL|#uyCDBa|3P}EF0D+T#z^{zjVqLTAX43x2kONkqy7mucPK8kX z@QgDV*}0BX6RMOE9K;DviHA=Gx1vskbDdqDZnPkKp*4yee0S#aA8HRieP6ru>%OlY zxcW5-%VrGnxWtun%UA^+s5t1!u4dXwWS{iuHckFXm%J%#6e-=xYxx*=Ri%uMQX4+) zJWPB!UJx?EU;a}*ewP<6o+^*Ha1zv?5to$TC?F+6wDKsKqhI+;zRq11G%o|nj+3aV zF9wCfvVd5QtwYLIcl$kMk;k?z~cc%0dm(+XtqHpES-s{`pFZ~#2#vbFu^??yyQe^(WCgzDRj<=7! z@8Y(0c0c?AFVeT!DxCfF!29h!NYD=9QUG~Jd4*tO3K!m|p2smvxCGC;efJ+ckTvnj z8V3$A3cSj40P*5h33M=G|Cw86U`W$bW-7akH!`kK)EefPRa0mYKtvypgIQ-(n+}<8 z1(#;&8MRhnX+ULlF(DK{tT~e~TrROD+z1LI9pO`)3Z9JYVQ@S64HsD3sGu%W$drJM z%q`GS_R^qe$TqS}tOEybg}0imCtv%FpW_1Pdw#vGUi8X#=IGaO-3tY6L+ZlE+?y@M zio%Ysgb%`LB#D$j{|Q4 zK~(9M{*WrJAQ#f7!3cx@b?Qi9oe6xyA-!vKZSdmn<_C zQ-!FVCqNO}-W43>lC+!-PKV0qY5&A}yLsme?fBAsdwlXb&J?3zlD>*xN(=X(FjzSOx9mDxt0sQ<22Z zioh-9AMWrRmPH?BqW4?l2`8faEEa4*E(# zPyUZS_}=sUNpDMo=ez(u6iWK_SE0~@M>@K5mq)p zdo6o-N4Wv2%tma;TM+J20=owm?h2y{aQP8?7eONk@qtt42Ap7V~&>^ z$$ut2OJ}Cqr+;UEyZxgZ+%t}Gf~zP!?L?X3>_V2jQAf&_O=hiPs8A-sr8(k^O|)+O z$pPp#Qsjya#yZWprF_B#g~yF)@Sn30$}+F9L=?i0)h^@<6+rbT`Oao$f2;9DYa~lo zO2DMCK}3W?2w{gWCPx-0w8dwa*vx^cdB#o^%N;^_oaQS2%fnjiyNz zOVXC3X((m79%s@16of6YV7tVqjRF^Nb*u(VPsS7}5m>yV6oK1Dq@U+8?Xc@*8cU>w zWrLkLb$7euMY6F|f1L zoNbsA(W57vVs@9*48lFrw}v8oJv7+$g&qhyjEIaz^yJY6wv*zrArK(mOSVt7!;8n; zGwq^wV&R&0YKwLOyh_|&MecdsK^*WApO{nLV|8ng)8}>(5TRWO}V#zi_G@**Vb` zPcr4p8oGrArbwv_t!PVJgnstyIR?mc?ZANr>V`%2tLL!NFla_rEim0zuy*z=uxC*| zEQ$d12pQxMgAWHD4qV5W>WjsMFiDx_pyo`$%9oY`ezHL180T-v2kvN<_Y|h?Al46r z@EgJ!WuZEEcph&DA~W!q>wQ!x6z;r`Stw=}2X2)!t$s@nf2y5fFg17Wo7=uu|AjVx z$@K_kjte23SopC17|C{$x-o6m-$XGa-6)9;oGd3(a_Xncb<4x_>Mf4pZ;$_oOQ0*n z6@C2jEup?8TADiz@zbYg#xTDu%mU@R!bA~IK2!UGfG@a&>F_}iJSuq9la@Hjwu}dS z+j*wEb&ILs>_}A#ZTFVxkVg3%Un|K52X5cfRv!3h8-Mb4G`9{5Ek$S11cJ~-0T#(c zd^%e@Sj(D%4#}=_U*cR-0jKCpW7Xj+eHnf$+%^IyvTN6Vk7GDkE4sn%-&JPDX5mHG zyE`TAfJC11(QW)0V6FR^87@X(ZL0Fj**EE~UXnf+-f_^wP#`yrxMU_4a0W)>C<`p` z56&m=xV3%egCA-~U-y>w`fvNo?Fjc%zmy(#%RYPck70>@TRZf~KWXDf7VE6OmlBbG z4q8q;Hq-9<)c*GHUEJr3<##_f3e7QCwcYy+0}J`Z0ic7{^nrx=wml5SGG*H~12?sy z3HnTRK(B+deeGM|8>F@ct#~o2WT^r(4k(mcELn0Rqyr|;@pN;NX?m>H7`x6hTL5qE zW6kuW1Tx-0dt_t+vzLjP-W32B<}+sDjzuEb2iwph?3~KuAXKzYpEOX3hiD%=`Y9TV zTBZu1P0~lpiqm!D{{&*y;htvl?jvOlvULBXPJ*ggR_f>@T@4$~R;wc?`gEMZ}By{Mn zYoIHE=C=fvpPiuY*Kr13oIN~fi9@;0aGl!@>y_FQceVYjO~`qW)B$V>Jb5AmnHobG zuW6aWsY%*VNe%~xmy98PEirb^*aAa~)cHShmUOk27}o|-`Kvl3A*!C702@9dT}|I! zza~$lgEJMPSvI+mhGSjolyv}LIC*RexkjW znaE9)jr&fHwZ~Ux+lkG2__Wt8=?_mZ_xdq^5}qXE9-#j8w={_-QG%=J9sJIZEmY-w z@DGm+AJ2Jopy<;gjO_Xwrzm|+B46fnz=x{e4vjChBim=&D=yw_ zS6u9oR9jq=ChyRmS%R{k%E$&GJ6QZ&=Q49>e>&6ZG!<-9tdE&tx|Ep&6(JJv0`*!@ z@2Hu2MK(ELOa~5KuCej>j7%rOL(_EXPMvy;fzu=iDKnhnNZ#NdcZ)OGL2L847dw3w zG3#DIE3RIS#I;3w5A3Sb$H+Ma^%#U%=E_=ULR@30tg}2+Rwo|)Y+HHuzIJ+IUt65M zs!d+{^0xozD?>NZ(pf*)2n5hzN0E^aanp$qs9$)-yh^|P#cy{%n( z^BdabuXr{5g~{k8@T?sAOWf7_hIa7y&$Rj5KhWB>5akUXFVSa{Ht*zj%ZX~e9t5urO&X1Fue^V)Xc zsTtP`rXfHsl$G$MaogaPO!$@J>1dhE^Xv| z@Dz~v2><|>0_(JaaDmad4w7IQG^u zXV%jZPisxqG(ewL8|&K6ED9lRI~h~ZjP4nJp6!+n0iJYlqTsdFX+fdsWC}Tj1*}rm zVshl1>36<8+_^dn!p$9V{R36rc#@zdxrNEvcX$9SgF_cO>ea$`^MYF^V{uW zra9)Z5+8f?$+Y#u3zrhd8Y809nkZS}2^MQQ^&uZwVzZpjHqTjp5rOzAC*~1=Dl$$7 z&(Nt_|K98{$-3etIzFu|N=(mci|~aWc|yf~lW8_LAkD~2*437`G&tK}xPy!?R7qRw zuso)Ms2mchtZiMWf+)1rX|&w9mU*2H!YeejYD*^?WcY~I0X#ebKe>Kv2g~^y0)BdC zK0Lq5?MJ7N-`}1-`M!4OvP;`F*Wc9kAG(ZhbSg*#BqncgQ=cB zzDpKbZj@%G6rnxqaV;-Pk(^RdQ3ClwJ0uIXE$9y-e@i}_Gx6ncbB|XdgXR%T{MeP4 zd*Y(hIe+9ib>fMPRv!6SF2E>zgdZMp&>N%-tTU>e_9X{YCl!ktC|pvaQl~QLO)L}= zFe*x%#Yo4u!={OG56E3xLLQuJ3*H5?{B+wn`xNy=TU=aj>ueO7WRPH6SK+iCso9=y zEWp&63+gwb6x(r=0&%5T8ygc}DKFbUT3Y%$WrA`vR!MeY)RZiAO0yjoWo#X!1BM@R z!iHrPrU4I+8#tyIB&<3p0AHP=QJay*Hjp1EhmlY4TQpk@NPqxW(U#gwLbk#4!qw>AMZ81I@ zEA&;XY%n`}rY$d?~v=-$s$UtA}6!xfn|niyxTGEGFj_LwIv zwrkuC?Q#W=0&>_$McERl8`=W(1bda7gJ&GPZo+71&zx-w99K27Z=N=xqG;=p|CsH> z@TOw7#of?yf&W}5yn|64wJ4+QN@(u9>%UmAPFn zv!9dCXB0}T0hIX_eiJha4G0IuQJ6}ceLLyYTLKj{GGM|~99=tuKVhDV9`Yf`{3{q0 z)+(Le3rk;2K`}Z)h-(=viK0lcn0h)mQdpg_@y??qN#((Fnj&Bk4$@F=8XASIpdMR1 z*5;O;YI6uDlFdomTADmIVurOu&b50y1SfvBv(G%sL7!t>y>g&B6*{T(XB4Vy5IwNd zom#7>yuJ=bAuo%_q^X62?Eo7g&YnKa0oW*2(4pqcLB#H-;-EO94kK7b9mhT(hy?*fK&jF~mEICkfb?>2 zZZF^S{P(@g`1?+B?m6czd#}CvT6^vNTC`4q{4~dJ>`sH5f={@2|-t{eCBwD7CC~o`)9$SV77vOly!@;qNgOI>+U=VGOn}@uARejdGgZ=`;>-)BnmB*RmRK zq|Dr6dTECq*2&5{ot<4}>56q_6EvK&MR)0DOOd+h3CDN?wUk)asoiWHLYv}r92&Sd z%gmI;^O@^6_WxDBlFb z^z;suwLL>+D%0a;4>r1B3nQeX)&+lb^W4b>H*IGssa1mx&iZg_*TW+)7rWGVF%8jC z2KsuT15+JL)2i53uUVHBvomJQ;7J!#p(|}d-vJa%FEpJtr2!p-QGw5asPwLfDWIK2 z@hUY9BtOBI-Zy=t*isWp+x_6I-z=GOLZqxd7=uRYFIRf{G#QZ-dBUk{q7-4MW2mg} zskMOaVjxerxUG?~8SJ^qvD1tyO%bkvwO#x4w@!ipiT^wb5E$)G9y4&2MtQme1=`A- zuxb2LpN7)4d?9esntbPXjkc?Z#i?8*U+SbNhw6jL=Yp!(<*yKYjy2gGtvF;mW^L4_#UN(z` z9y4dR^St6t#(^sm8zK9>F4U(Kr9rn+5^3xWxt9Xg$7c0>jlHa0}fKR;AW=2vLYC# zDTII+VS2`|gXl}e>9g&c(5x0bx6q4OLnCO_o@wte{Dcyfumb2b377Iq#^w_^RGJwh z_xY*vbJPB(iejYa`P0Y_VN%(gJ7wcxl4m2H>> z&65JiTnVo=J|PBeNO=p#ZNdW2$pUmYM43n%~~1(O39&P&Ewp%fHyBR?+k(QAPTe?+-3VSQOyvl;x#F0fq|e|)HZS)A zv#Z_WMEc3KGOyDcj>(!TBUbn48b;yxOv6n3NLS7$@&V2$W_UmaCr!kkzzDDH=|~um zRK9^XI2Q47$nqs{aS>ydMwK>R<6#Y-?1kusHu6`d{lIOdl2okxmQ{lo2m_})#z*u` z+;8!C7D~~kaOj*m7M(-01XU0nKi`F!Rx5|t2!L`-KDU22gdHG)mt?+#Qyy_8nFh#c z&fvjpqvLeTijWH&yPXA8maG}KV=&`{Gz9-m7|I5+{+4q{ah*Y@A+U9fMFpgiss>R$ z5Kd)R2ghP}XAk5>Knh)>Wcb~WGb0a+M}WY|=*OvNL--b+{|w$MPgR-H&{><}OhO+9 zTVv(eHF~L$0VV^4UZ0uDzfJ-g6`-&fSfpMGM}|v+FVSRn8m$q&0sQo*9<$y~Sd$rv zfQSj@i5UQJl-&uqLi*qha|nK!(2eqnj(}0UPh!w9$n#slSJj#H2+k(AAd+Y0`$3T3 z509G#m*?ZCLci3pLMVT`XvC@225|;}Vw4^#O&kz(b~W)ZaxO)6I-^ITQ^5+dFiark z6?l{% z^c&s#4zRW(yx)hEba^qxrupN9$@+~4dc4k)oU zSwO}Q(qT9Hs`wfKj|S-COuZ;CDsy6>gAJrJwWd&sJH{yf6ifp>`>S>goha?VO9IpA zISn>l7{|GsrLjG}@I z#wWbuPk7`XdDJnA=iI}!Q7Bw!01zd`nB*(liV@>_1=+wx_n-U^E!qgjfm=lm2Enz; z3p&uYjvK5RW1sT~p^mon&=Co~XwOuAXvdiR6jl|K{23nPKsBK796V^JaV!{rK*%^~ zPkIQIZS!5l??97HqFu8RX6;lEW@@d)^$8Rz;$$yqu7%PJ?=$19!mbLL{`@C?Z5wzz zZV;woiGl!!261C(B{Q$`_2gcQ*_w&AHGJ}wIE=#NnAeUm?beM^51$6BC^cZ{W-~qu z&_h$kW5K)IK@A(2Kqv8#jIY!~9%G!~89xmKCWAl~Az;%la>{XWssc;lJb`I4lqfNc zp4ns-cqY+HYWG8IbDPOZG(ot%7 zkA01du=owP&T#u#0o`Zwv>mR~d(1^c6=}zMdG9J;qt! zob-_gY+Sw+AGWO=gs-I!r^RDtC%~D~6Zzsg+wlT!jp4Fiai^UaArm8PpfosY1;!Sp zw|$goY`f#*dgas=iak9&IA(ck-Y3l5b6pc#XU!9@H}}*q#<- zd6*zTXKH+uk_PCMEGpNkKjjk>Qyw$Rn;^(8GD4c*>RFpFdax5g;Z&A`@%4`7zu zG7%at)1@R5m*exIA=twz5WVG%WO>uj%08L*Cm2=}}YM?vw`x#wzlP>Qw)Gud8*4rWksc}rxG^ExUro_)s)htL{c888ga z#X4|CsSSDNW;OgI`e1$-3x~vk%dAd$x$$95gX5V~OkTQd2cR=8rC@6`&G^u#e9OHu zn#gQ*%NyHLgVCOFsIzrK#(+!sT#4A(#k8DSl4x7Oleoe!9?Y7F3o}<5&+&1ha1Dh< z+Nn4vg20J_)q;``7RN6hyx*4$8No~cz*&(ToQ05H$1x+;C_L`b!IUW!HVt6Kp*XF5 zOx_n^WQ>k8$6#jbV1$YPX^#PL78OGO!lVKV{phDj#KY3ADiR>a>NvT)(uuLS^3CjM z^a7Zv!pL2WId9-oF-TW&+Jf>lA|EF-?=u2t45qc)Q4VH~9FP4(`N}ws-%sA+y+vH} zMSkH@j=^X2uh2BWHx`!1`SGFG3{qOl_sJM?PJDZhXjU$4N4ltxRi#ezq;Jm0sl+gF zB7BkTkMM{UI-eY4Ew-00!Ik*rovi>uTlxUb@Cry0_r6qgfuBG2i=Q7p)Tz*D`1A;Y zj5Dm_kdNWvO!IN6a9VpNzcL&FN_*B|f&>_gc7a2=H8wVKk5l5sjN7`C@Sc1}J3gjJ zUWiiSv!7ClHk>B6x^T#&225OQ7PlGW0>Wc#XtZV|!L4-%PF45wg!6G9Rm4!MqSAm= z7nTn|7SeQ#RTuU2yL!kEO_(W1Gp283c7PeXhSd zmqtroXld37lXui@HV$t2G)|YMx_?fM4uLNh%Xyvjt}o8fmxjZaM#XJvJRN5fEM&DJ z?PoRwJh_lTePQN{zw}Ytl5-87%+8EBMFtM@NJq}Qg_u*hKJ#{XGqho>>Jc+9F4h?Y zP9GGYzRon3XyKm$j!#b!M+TN{;KRKi&7xZlU@43Am2e5@;X~`?vMA6@m(Cx$xjsdM zsbQxM&HUlYdX0SHy#r)Xq>H!!3n7(LW%8lTw*s&7F1+G&inUp+=GAz&gO3qpaS$46 z#5Fq?Noil#hmk% zL4SZlhahD|;n!%s^G=$lVwiRRTVS;E3Q0 zsOfXvp^ds(ew1GwJB?A=z^)GRD*wl|d5l9o9VIK~K8jteCe}IZ9hNrW)C= zCug>YPsTvqT5!&oj$W z0U$#CAYRFub8ZtQ8wRs2tTGp^%B{LcSd*QE7v%xv+&(GE;9?$h9R?NjTY|O0=eZiV-j976e1#Z08q4(;$EX$m6?4u;e2JsaWSW`)1UVVqtk?_v@p0D zCVuCinPV0>0F@k)p1stx3?2%!O-&l zIEHG7ae0j$X@s4o8sWI9YMHxXBJyoUTDrzrUCZ@u!aF)jeFlz2R;kMy&{;TKxtLm0 z;1$k9THGU4$tEh~@Q4;Iyy@6A_(lspLl`mRYxNSU@LLO33Ckw}2y&U5y{*eKnW2-}xqFu+B zQSb%$Qf|UmjlOhHxvK|8oWlaP1{IREN{q7&f$c(Gt!Evg&dcc|>66FuLH7Y+B2zYv z{i%$KM;VvVbvrWQR9masftS;Y_Km&f{iQ|Ef5hR2)?w&l>490T;SDT2 zi>$eg$p8y>teb`(0kbYTF<{n-;u+5{JQ@<*QNKt#Lj;Ip*q7)p&d1s2yt7x<=!$Wu z8<}=Ia&-~|Ks5vpG*TzpMldmiu5$X^YvrFIYFgb(t(m|Uj>J~sFj7BeJzX<4rK_77 zS)Sg~zp=4wVymKI|!#~KIscivYl4&ofYudkyhGoQpcL8WbDn*P92mPEMQg^o3P!T$bqZmRSiDU zQ^On9gAXA;$D7Ffv-JtMY(@vPqZhnZnvnN^PYG0@pZ3Vjt(}&1YZC2_$(sxlc~qyk zh|AUSgFJIt=iaACbrNuyMRuDXf9qGE(Zl=7y0W%r?Iw6@u*_hy1+Ay4q?D;XQ*(i6ZTXcl{)L^>Rfl;$UYs!6q8m>VEiR3EC)+vOT zQ7qN*aoVYwezRO3X}2~-<0InCQq%}vNPq=SOJqv>rjLDVV3R519=--CVI~G6nIr&xkn=3f=Xie5G@)7dOD@hP@e&!lBXUUI_y=P{kfoaDhQ55l3p+3?FS7oke*= zJF_eri$Mesn;0I9Gm9`f6{ysin%8g*W}3+%KqJ~tMowCBL`TkXW)RW^SPe3a5?zo` zGkxF~zOMUdRYNH=$!qez8GuF=7u~inHdn)2q@5ku>0c#m=8}O1kK#$1hj!3Gcrqox z=~kw?(M9 zKsb~WrxqlY!Xxd?)T;6OFgU%NHwR9ih1$n-Y#)YG-f3=g1sm`hhzKE{%Ap7_QzN-_ z$fa$viE%LGdHR-DROS^E$R%AHz(qII#R=XkA>=K~RCL0!k`pEFkhA&~+N!g(vrY%e zzYRF}3aRMUeRHp&|0G{t}=5$ zn>qtNbz-voM4IRbS&KdSw&u_=`J7_qN#od@%#c8H$g%UbFO5$VG&5i@1D7dygC}LnL4X+vK)di4#E?JDYTM?pwd`h$S(KzBsDZF< zTA-X3^||HILlc2&R$0@mVlFM!B|djeS*?%P0)Oz2S=P{lesyrHW2Qr7OFgMGiPHlQ zyRf0wQBF=f!;@SWI|2OaLfgq^`I4D;oB?3a5jGo{qyn&H+E9FQjSCwbee4h8kv7^f z@t`vpJIt|0@I4Nl#+4IbqqopmzH3wtkqftsF*~VFvld%^x1LVh7u14_=r?hSk}zqM zjIR7oU&8Eo<7jce87VV*_9ec@)ZMlV4dq=+ALL^{Q8clGI$!jPs)FbYL>zPzxVehC z5#7bGVuO6zj*hCcV5!NcUulJ)F&^OtCjj&cUwZ)Ep{|}RL2;HwxpXR58taIRSck3? z%8;FXs(eMVjL6eugBfsbt2)xHUratYYR8CL;eO;${<0QPJxM#bL%eZx8B!-U#bjm{ zWyrUI(-AArlzUh%fxgo3s9AQ#1y8CooV|$IS6}eb7cx7o&21+*))z4Vv2FQsiVF+z zw;Xr41W@%eq%96GiU#2li4rmU`?&+Y$C-1k>0A^B(RrgDaf&!#P#|zhXMHcLcQB+~ z7^F4?cFYv64ie`jp&%-(dir|h5~rOyA+t#RMDC3UL^~@6n^DAxE`YNRi-9|MTTyA! zUTPv}AP99RAWq_WPNFoL;p3hVk$xnJ{drE~S9jJ1DL99X7$~P>Ayb6Pl&c=QBoF|Z z)+~l8Y%`1MgRms+sOSdCus98YOhRPt;cW)5a-TgzXppaRQXs~_n~qVk8o-OGgI%m= z;TrT*quCD?Dui_WPWM?q7`Pp$!pPf*E?bpBEyRu^ zgaHdaf-mTWQ=_mp!;msA%|rn;qIh-aoJtJt!HWu4=iZvGE>=gWFx%mg@F6tHmOkJ? zBZ=Okw&tbFs-r}=L83JjB6@$BaGm{qFSe93@mhhqJ+5L%y1Sc zLA#h_9SQoBA2YQD9O6n`t0g?Ha*cB4xNV!0w1&j-IAHPP7^RbrcX)vDYCv>$6ez9? z-zBPbEF9OoIwp^KKZoroeJdsgGUFHv_nT|Skop817jyufEpTnU#osNad}zb{#>{$} zZL!AEENGld@L-n8el@UmH92KI+%Mmw2>7FMRo4u1-%zv@%77XZ7zd@TV~&BcE%@8) z#SplsQ4Bp9Ih+``qp;RQo+sEwHoz}Dq}yh{t|%qcZHZhe>Xm6|h}cd9W)QKJKon!)R`P7EW^L`GnY)I#cZ z(Ot@eD_C17bViF|@(vkZ5g97Du;2s1Ja1PcUx%6 z_QHsKnE8}xC#@*Kw~^#Q6ce7zkkGE#IZFfNegD)Togdn3 zS`qhVG2LHKyoYXlT4y>aANx|Lz$1h3~TIgMz#;VmPIh|PCNE(gnn#0vv0JU=|rwHG2^yW+Ieliiwz8d)r<8W zsIO3Pt-Z-Z!2qAmnx!2b8O};89U5mBtWnhIke9tz9NSI;O#+N0c)*FXYG~W^8(E-T zE{B%b3)oZrl|%x#Zcxwg*+;fcIqAf2Fl(m{GJ|j6|kLVVWQh0WM|G%4dJ2q8hH z9&|?2nHK}2b~1z=+8O#AWP2$@0G<^0W*(;!bQ^?)1;r-%0e*ogd~%UBg7!|;eR4V{si zq;AD&9UpXB)qZ(%TsWks_e(c3lLFvMIhlOsboMX9dG=Z(a&e{Na3x?K2gi7&V+=5G zIknM&)6~h7wquIZV$Fw+0Uo6A#Tlayh60Yv_$bsG5(I%hbnJCZlC`Aqz{q(W8l}=P zIW`@>F}GBMR&lzxUmoBhcoTtPYTA0K6z0sTf5nArj57zlA*_;rv?Z90mzJx>y_=4AOMR2+AxaHRiCvUQVanWcuX+G z_);GVZsiTfBAum;20`4U?w2ppR76OBcNj49)X#KeNX7lWq+7NnV$@PpI>}-pJ<1u_ zT)nB0b0N>fNlq)%D)8!?Jze!;UYqC*jHZK-=>eBd$Z*uam>>)651 zgYpp9CCdq~W$P1Aq>fOBDt~^~Kn9%Q^mwh@6?uh@(!SPgRa_{;mSn_fL5C@;I>*Yc zuzH_5L7ULps@|-6LETtaHX|d9HM*bv8wkweNPz%hRYtplQx}COyJA`rkuinVT?}4s zPMvxcQ+}g=CTJg8a;;l4HEZjD(T$=btH2$Ouz!H4GK0JZX3jw)c}It~o_EafF?_9l zwog@o_y`wpF8UQXBO~BpvfU&FaPXu<@F%Zxn|BV7RZ^d|wlQ6+O+=n!=fijC7Tbdk zwykZF$8=J_5N|aMuyYU8b0EmSI>}l-;m4j$@U8kK3-P?qaWKwNo@QcAc=R*pYdx_} z4|E5>Dkl}+%9>j>0SRs5h!I$tN!ISCYXr!|irdMUBpARRC=1!mfVRa!%4LRun1MT6 zpbrvT2R^K`lLzh7HXXD63PT8w`Wac4w*1hBwX*-{CLVigCRH8jR#k&!9aGk1JG7q~ zX8alZ*G4ol#h>h*0#9d^j@3ENY$h;BV{s6=f=8#h>$AtJP7r_cr;eVy?kuabCr^m;)X^9MJHoYc$E{ULq>@JtnYxcU=kRBuTE>VI>*4h0`Ihlq7a$k0^m%WlXV3l z0hUVzrJ`}r8h42(u{35HA6e1b8BfUMMq32 z?Vu1k)u5x~^FFOZ7{!_CMVQkrh`;o!Y%`fL`DK!ob@}fm|d#H z@X#rS%qtLVgvmlypOhe6GE^Ky|d0y|y9j~FlDHG0*N z;BEpA`d8t>FJ@#ST+##l38&*trUt_w$3w$we~up*%`&)vN_=SCbXt@>k)bhiT2vlU z0cP43T=vsVKiBnxbM=gmkZfq7#uNB-7Q__{i&JD)oyc40 z=^~AeyriLv;)N5{X9kRe$c0WWXTm4q!R(jthZh;IGzE>3)ohic+$rPeQfEPQ%~d}` z)FetDai+fYtwG8*4>V(7)=RD2IQ%?y3WechNzK5S$yYCH0OcjiM6$P~JOW+qA#Y$) z27JpiI`J}!4xKNZS$Ve?-fRVN-SDc0*ZN#>WF4rqZ0RGI*P(OW~Q3+DTl=Y zQ=4j#B&BtLb@O-SnEq%ZGELvAZDr0IlIfwp4yKCR*q%n&1VFk{C)R*ln#o70*#_s; z@qxd~Djc%M71?rDjGt=b-j!$FQ`K- zugI(ta9gJrVtI{Y5)Nr9ak>~*K z>hOp^a13p$^T7;==YYv$vVt=Lao{})2-47g(mrzCk6mm)hO{|4H@*z~#l7%4UF}XE z%8o0aRUXt?4`+2_?M zZhoPwl?QHx&dQ#v)2;Q_HX#DEqixZl#0F93RUh4`{Mea3fKEEjp8Udf{>~e@OX*7Z z!jVE7@x?Wo3wc!8h-1z7V1w~F$ z^a}%bAeo8-sUkwA(Fi2NWR!uTi$ep@zGOl!3n7dapcDLN)(fEnJBb3w7z$X3uA<-u zk?X)6aQX?sWmr%fCYF&!i1ZbCbOKR~R=i#*&>;|!GLH;9%ntc7aw1HbnxhJ_?`UJ% zN~Qp3cINy&%N*WKZBxp|7nhX5^)HrnOCApK03}Mn&Sg%Glgy|QG!m$eVa*6QuGG6l z@#z#Zei7p*FjyPn7>q!LQQ_;u@(7(-5*ar9>R5nt2mw`SbB?}JT+RJP&_+N*)J`}R zl_7~c?rY`g3Y%QH4V*rI*P%x+=)>zwOWU4?Xi{Lj7UTuTj!CA`KtvH>_!R)1O@9k) zA`5O&jQnS9hwmC`>2yK^0tcsjG%7k)O&DL5l{Di>Uh{LE17r;Np6nYjJ=R zDV;#F6E@Sw?^f|4RHgDcl#Mj66F=vln%0NCjRU=s19EcH1J%(4dt~bK7wQ4d8}W zy%2inP-zg%${F-nldUmQXDbuQAOV9}SoMX!ot|o<#KU`ZhI;9vk$b|J$d&ZZEC*A( zY);66AvPJ8nfR~X6~7uqohKI>NSD^gGr*uHnlZ*(&EB3Vd-V0dI@%R2HPF#GIX+(o zQ*ofs869MG-6zvNbUJnFbXb&ad6#av56749);GJ6yIdkJBPU!S`qe4IMUNSWbniw! zg;BbQpE%eEbNC9}Reh;Gp)c;Wo&2F~ZKL!xU^mFj%5mWrRN#EWk}Z{HsNo()XFAqe4r@DIH79Ey0KNfqT*9&tb3K^Ch)oxs;mt!W21uv8~7 z=RSbt0>@2{^ilcS?74ERy_SS@&)5h&fipf22Ml~O`v$S(L+Rp1$o&QRzV35zSO zt8-~EZ%wLv5kHQ0{Vu%1*)0D$g=hUmBSxT?Iv^E&6;h>KriB?agaS*)E-80F&c(N* zV6#jW`S332EN7$mIi*bs2gmhEN5 zr}NqX?#n4EeuV)YjKon1i!kWOt1_%vBQrTIY@u-IIsaPb?SDMXp(X$O*V@I8mRr96 zFXidKT%Z0$x={oW(~^<{(h*1pNXs#xe#%5Da2-YAR^bQ(XvWDA3dRMJ6(S9%HF`37 z@GH}2ybwcz^V@m@je%n_P2qMk?J|Z0qc1ZwD&Z&`#|pz}IFU;5%LmsA16Kl%(E?M^ z)FLQI)*;#sU!wqwV2vUxt)(;09SU8;V8ktb9Gi;Ftbh(ojnaj~{&0lJzBqm2bg+V9 zTN*2;wDBqeGl0-vZr~=fwE(~rsrTneF|?hcV6K|PPbcFZ!KnKr0%5FEUeZ>9Fq%|Y z{Unnn4dNI$X1~h|@~%#hxJC(KJdgeKC1w7hug4hv|MXwC<^hdXRmro{mknwW}+Q6r|>(@LO;X2=aea}(-O%i+k-qvQnB5JF>FN~dT`KG11<3K0Fj7&Sd*n}$Xo4h*#JEp zT}nw%nv6d8XdFS27)RgWe1S6qFJ)4B(`gK!a)&TV7x`X?P8}dma3Ht?lPKv*&$>O8 zw9rXFmIxk%(rl$cv9eERfk_?a!V7g*4V)UwA@BKOnSb!>X|a@>E;+lr{KTC&C@6aH z%DU#NZ*lt6U9QH|0Zj%A-mARhm|P&>N>mb5;70n|MgtkvOyL5zvSWa-*>V(}V(6vr zFf$Q30A}^Lx@I%7Z<$65PMwzg$%o{p531R%9UhR{uB?m zpmbcj$WjQaZ`%=%+5`=yFmn@sZA5%jeL1O9<75c)B(DOS!KpMzf6z!hHAE&Reb9_F zP_JcmGRjOjlIJ745>1%{HXR{r0-dr06f&Plwa_ldq&4#5<(f0=@Lc)cK{it!lCGZ1 z-gEG~yr(Wxd1{P1NC+5&fCOx)P9H0r&1RuLD__;IGYn*$Kj?C8u6%1-aY%uoZVpU9 zK7oVqBjYm&X@}3IPVFk|*72A;_`?N*@ZxH6gTNNEq#808 zOj5S-)*s%-i0bS2A3LdRdf?6|ht!F}M@^Jm)x-zzf&>3 zp+gJqb~*B({A9voGFg*=1)L}c(nPgnCXz&BWF$NazSU*cR~ra7ATR1wb)4t>UCpZu z+YdfWbP)2ZeKJoc|ER;IyVnbk{*6_D4X#$^RA7T&b)*bbU43q{1ZV?W`~-lM_msl~ z&EPG8Zh|rJjgrxiv90($45ltbggZDMes+M+OI}y5#Cgi$WnMDFd+tI#weX`d; z@5*Ac$IiG6b6lR3Rk9e2>wW5$_P~}cvxpAkxBb{hv(8^Dh;x3vi)U==Ng8Pxsp&N6 z(QBkNz|OVnAXNJRT7k&v2U-naX1GQT4gF0Wgg~oY%}6wxc8wwg6opx2OuWsS3_&=B z#XmA|qHE5}uui=w%nrcwDp*--($TRW1;)A%=l2syfKZuA&Y3=ck8=ElmzVC@+m%f# zmy{QuxT~yv=7G}l^0G2@_Ks!eBTgx^c0Hh+`jsooP5<`s^30!q9%CoGnd-Dt1WHa9 zHj8|#lc7^Ue{hO|3?_nLeJ2f%2Wl~I&0;8EW)#fmIc@IKRm_?Rr-~(o!bD4TGf?{G z8nZuRg!$uSJ;c)pMApy3o&7yuf9SK8u06*z3wM7-=X4X0F^yBFa{n$r?CS)QsW`bHkBY zWE7e(1_cayr#69c1xoO%VEWRi`z_ft0Cy#w{3r7#8s%IQb#ty>cg0?&TYxQ25rW`2 zoVGS|V-&w>j?y9d4P-14g9-dV2y*R#v27cR#!!bnOym6Mq{{)N`!#G5&8!HD0mqhKocFpiyphLu z1s~`UEW*oF_BJlRtdi9X}b4xRAb-tZ=Nb zac~DP77U!9E_6$l&uKnad9hIp4F-da{YeK$rzeVu{Dz&JK;C1XMc9+~!j z1J}tZSY^nm+Bz1-4?G%e`K=FUZp1}-l&HEriqqAM1W@2in)6n+p;sF=Qp0UcY8|_ZG+a~-Ja7-Wa+G$oso9?n9LjTf^dzt~kd4xL zbj5vUkLXwDBtVM`+a|!#0n(0XKb+RraJyJT4o>z6o@*ok_DL$1Ea+Sy=+U9kQH)zs z=t{J*)m9&me{?}cU_qXJ)@({$uMB?hT)+bIm4Ns~ZPUTuM{g-0ASsCU4274is7k-elV{rYgJY0l>80|#r3kL)H)+R*kn;`>O_TOb( z(eF71oj?aSg$MOPhKM$G>P$FjZ%5#j24t$%piczYHb|>FiSCGEvLrK9qLy;FVd~_A z2%F{__hEF;WrHl?OkjWjh1S4hFeuL}2ePWRFPU?cOt#bEpz`FbjlAu+bm-mjVVb2P zl;}94WVy+Zv;}WAq&{^4Qi6-vP1stG)>XMGE|(BHg(re_{xTJ*0)h~r2B3|8Feo6= zh(V>UgXeUMwHEBalg^SpRWZP?+A^J}8Zk>=Wr>3dmx9HA3EK+MWC#iV3PHG5;1eb4 z+yI;DVeb{;8fAq9YXZ#t@i$FJxzWGZb$Zq1h z8$An;dd@K!;nzq==Sd~NKVjmPsVlzA%yrqe3JWEO(sBG|wWLAbj0cQ3DCm%Hvw=FyBcI7 zPx^8-mK`fZ!X!;JX13#Ww?@XBbOHe(xJ!K`(Ik+Io{B5rlvgq~>Bl*<5tGVTxP0`_)p-?%;|t+8q6_( z2dEW1s9>d^CuMW_CD$u>B9aCis?KgB4qgz+Uthr+3@py_0yqBi6$Q_4jYs&5e%gx%!R3B%K^YM z{mHLpOEgxU7&~j>L|k1RSov7&h{_lVlx6aLUPoW*34vFc!0IlWztNy+0ddwMR+l5D$j%l;l)?_)?Mim`uNrxFO zJ$~iEEx5#!G&g(c%#3>8lAlhth%h^CZIe%uanG&+4Tip~s z1Wx%?0~PHQ9p{}v2|TY305&fIM_>+Gva%8fWPGGA{E&UmkcY`x6tfu8L3~#I4^E-C zwnrCe4C7^1$|*P7oE%#mA9Rs{X*PqlKj2a9Vpr5Y91{`3qm6SmASEaSQ0nDoy0LF1 zHCt#gQ(+RsW9lJg3x;sO@EUM{2jyC4IZihBi5s)I*82{kPo23j2{Ov=2hGsfsYs`> zm9fwb(iq4phxC$ven!^mN4zFTV{8os=9Xe<_%jZ0;)vA2)d8P?DUJqk0t*0#2I4{a zaSW3sIF3cxB2fp)D)%m;a*X54yd>EqXO>-Wkt6*ddmBBMOfs3xZ6nGlS zUMIaL%Ddu0vjL2>4Q8s4E0o-es9``j0ZcM|qFBbwk(eGqc6>6DxQr45UNc)}4P_vw z_%J~f@`G<+QmkP+m>*}GPp?&>tE9uAG+G@)?g_IxrA4-pcI>B(>x^+6pVud{5-}X} z?QsoLl$o;4TZOIz;CJf~Yh8tcW+p~v=U&^u;5TC+Qm_qdNvQ*E3(8o=lex_tC@|8{ zBJx(F6p&Xpbk+$XG6WK9Fxp^LrvP={t%Hk^WgJodTqCJFF~ayQ!HZF~Bayb!EYm6e z2JnoPcKE?L86TX(oBN&mkvMZqB?GVYba0Ma%K73HQ%K*=>Nv| zf+sSv+%LZ+y^e8IQK~33pyE$B4PFveiXN^H66qfbf)9Ap^gK~yB0iLXG9=u|BJgP& zzG5K7DSV|ebjnEt*oKPKX`whRT&rBk+rD&QxjGv<8$`%AQ8wT~!zkHw%3bIM^3#T; z4F)!JmvQJ!i3RSj;p5Y$ZL>q!?~U&P?ve6?b51PJ+;uawhknwGYXFgk z;H`np<@$@>ohW(h-S#iDciEdLlr3c74L5ilGi%1B2~rr3PDlrBWUoEO>;v3&p53Ti z9nz@74Nl#7eFPpdTcFZ+YoovlUd-^AZOaQGJF0b$0fzu)K$*WKCiTGq=x}gg7S(;% zbR0yb?YjUhWjGwLnBFPq=uP0^f7!69m#IxQ0LEe0Si0SXPKr84C(s3Y?$pq;xi>Tl z--Am|BAvD^kJG072JG@)C%910h`Q(pK5bW-H2Y_kw2xg3#wkZ~f80(SJ)6{Vf|D{P z#~nis-qjiEei4~5YDAO;f6EA5lNZ-1OFBo+q)qC4^*~mwf<816!4UZ54K{Gt**u%N zIGZt(6d0o~Y_{Uv%$Z}$B8T9Gd%;mk2gEzaVvmA%Xa}sZFW@MF05GLa4IpiE^7Zr| zf6mh;x(Q59zq3HnF#$LR{DUZ|M` zg)Z`sa^(GP;OwU7_T_<^nOF9$Tdt3St5eRkeo+AFfWrIpiAK zZnvC+-+le8T80+t!Rn_-Az*fVyiE)dn8OeO%7ZGQ{~=x?Juu|dqQp>$7c^b7J4Xia?3b6yHSxzZ1 zoa3LamjWUa`*PSiayIIBVbEw#VS0D>6aFC#|M2Bshk&XLkbtr^Q((g~szzGP^xVyt zm%U#9E@~F`fr#uWhVl>=apX8>Y`1%vx8L#96K)9(s4d#Kwyb~t!Ls)DKczqSUvgYJ zqg&43t<2l^;PT?*ca+{$OUlgc_9!!VI-pG7_Ely5l4r_Ow_R6Ozwk(K-pu|}+wXN$ zS;+Y|rZoE2EG>)w`m55n{-ru5sY;thv%Y+;=5_}hM-l!$Y>Tl4*{Vh531HZ;VoApC zHPY0mcgr33EYo+~t1N%$FJ<$F72te2*@HvMR=dBt{OMc&H+5GsT^mzv+w8osY_->s zWsAAnlNsnnv9AOEJIjh^uC5M*Orudk*u|TMMp{TWLDX1UCV)8mBY0Q2nlW|hxlfsJ zn;{i+rX?{R(#q>yOkt#AhNQJw1~(JZTBfqIyLDson~sytN?sGRcAQC(3j^PiNd>kR z_RW~O^$tw$zm?--<&j@rEQGXOSA8WS0uDI_0*AkzX6k>Jqu)_xfrrj1GvI5c5$P{u zMG-Wi$hO_*wPohEyO*vx+p&OTaaq6YiL&g$TTwzh3Bn$tz*J;oW#2cx8^y4>EP43m zbhFj`-OFBk98!ALuPog}Z_{SZDl_IS$bIwnc@2(gcNy>RDa-G++d7<|p8W#)pt z%ADN~4$XVltSC$Wc4t}r^g}3|nvI4kdCfoQX!w3!*|cV5dG4+oA}3LhI0{V|t!Z1$ zg)fiBi5e+)Uh#v#DR59UJeCYJMqEyd{G!|s`#+ydrsSa;E-%ZUdZf%C;LxEkF!QMl zDt(`i^)D?i&)t7pdGPk@&^dKMh&n-@HKSm5r5{C#U^A`a z0t&KGj9YegmGfwm4mLl;Oymwaz?(W#mBte~hig>6Iua?b0CuxsROUr58bDXwgr4Ev zs_W2y8X$R=`(s#sK+ z{VR)C+?x!i1UStM?QrDV;t)P_>#xvrRYy7w4g2)DJD2SbU5KOATULQ{agEqSc7$!a z{f;hMZogZ3^p5LG*Dz7aNtaq6sTUgz$-XW8wrUM!0rxUD>U_pR`+nNn;5jcLFPG#8%m4xUNfTwb{6cRWLNTA8=cp=ItKuSPG< zAd~-edHmL2BMZ;OD7v?)TY@B6056JQ@f95eJ#;d39vt%^eBwZ)lL4NzkjJHmPiz2z z;eQubI^-a)eob8*`mpWXr!Hioy<_r*=}lsSdyJ0TXZ}C}!$ya;6~JU9Y8`jDt^qNF(*7He25<&Mv3KFW{!# zWSf9h-g3(ww~Ly5J%ujV>$G#qPDh=Jy#JPK49Xb~vLl}*vjz0K9C1c&S$x;8vBhWS zdjeS6^l3KYS5jC*y6}Y4%G}-eDKoa&4*U$2H7lN>j`Zr%dnS5_m zOqvCsyZ^Ce#{-Tm)3=&e`dJ0PX6fSc{N2}=KrrH<5BqD_8A z@A^%9(&q-|;H}fGu;4BE#}}8XV z6sj9j$lD+E`Y_m%JFYFgE0^&&J5j}p4|kV$kwmgI!8Y5d;BZ}j=H4^~JV>6kRw>*j zB0KgY-+HA0yEgJae|LZLL*?om%-C+Xa>8eS zgd(nvgE#GRq;VrBN8hnM}&{8ah#SI;UP(`S^|eg0R8 z$mEzmT>5Fr#-p%W${}Zct!%UKn7@O;A3MJ0on^t1XP3**KP5t-LaGJS(3uEEI%%%O ztct>DD^vV-5C8Z()4I^mD95qb_c-*CuTX3G?qi**vEiJ{+7T49jqM2SP!D`XKSo&^ zDM%dt@%qXu9+NkPf|EqoTpnjZ1+)DA8_N0@pAURl;KC*Rhiz5LW{c!GgmuHp^7DV# z!xP!}Nx{vguJG#)I2Nz_MmfLXW-@n!^eX{)N>+i<_e>Oa<DiTg_So?B$>sNje+55$LrZ!O}VU^LIX0uK&h|a5iV7c$ikE7~U+|4*R~gy!yl6EUjI2D(IEL@MYgq zKUD6y{ELkJnq(cb1qN;H_m=ai)!a~)qtM^<$sgjt?D)TKduLg^$F=3E3*KE0JLBAP z*n2+r%DK6G+w40Zz7F*rw zmMr#*34tEUQVa~n>fks1L&o*kO;&nW9Zc@94J{p!+o%rsu$MI)k)P~AcA6!Tok2ukAvp|4s{PE{rMi4r^ z+;`p2(bqN0yX7til|#?EgeknKfn)N|E=QH}n)iH``qgvF^1FTyALxLf1LYB3{>|!Y zaM>2UUCKW2?ZUU6UwYOoFV|oA_6gmuVNxeFm1E!kh4R{WeLQ@XM)&%Or@$O^jyh*@Onge}l{x_=quv$azKH{@@SpGbq*x4ex~i zunPnjW^|IdLhsaF2Ao4e7X$Y&WesKuO(0||BJ6L~mDS$bOPt9B_6`W$nemf-M<#mK zvqBtPcj7#oF`az5d%}u`ZZC7ui|sRKmyHGsjJ*we4%!0alsP+=IXL61pL>vi?D@%C z!`lW)GKeXJoeq3WdE3QT;J8eG_wBZM|bz z`Q)N<#)mE~TWt5g=zi!a<-oU>a{JFODK}jD1(FWjqfJ3)wUV`b!xyi}LZ!d!j32N4 z$4`|9e*K+t*Dt;t`@k(cxPV8jY9q`5q9`W!qpbD!;?M+_j$U0fW8x&Mf~mX2r-e76 z5hN5RZe3(h53?i3+AADtn6K7w8cZDiT!Pn zQQ!?rWg74$Qic#chmK~Z!t2f8CesZaYoH2`a=&k~mD~s@DzQvP%Jdk}tRA65qi2oy zbe`5x3xH)AC>Oy%*(JI#5+Ra=!Lw%&gR)Z@q5%Wow1AO@G#7ZY4=Sr>vOz8pm!J;N z|9ZnZ3K0tK2Ul?zjoeeKfnaJJy)G+1VOHxnRHUBQQA)%FTxNiLnJFdfkliYTY3gg>z1u-c~m9Ch~RfUnq&%Q+VWf9I|U)grAgUj)sytHh+%ffQR z8UM^G(r@Dofkh-gnKJs`=S}~_ipj0ZEth?yJjM!BpNDzK=^vo@|AXbUi>`Z-PgUz+{;$`R4P+90>7*ZY z`p4t^t$gafa@}R0E@K;)mYGx7E@#Kx%f9dUQkg>r;($}%S6;aFhrv_EhSJfo1ASp) z4W3ScS>kr;J_Z}83#DzJ{R%RmX^0zIIwk0HUngm$a!vG0W0M&^BRzQ&4HllUqluve z1`VkZw*n;Nc)wHPWAx=?kj&al+j>6dN?E)3kqDHL+!)W{6eFog^kfAq=RK~{)PA|j zDvLaj#W}kjSWf-w?*qrp1k`{80Oo`BU7iBg>N|vS|3^d`m>A6%a7kz#w~1S zEIP_6mqXrrAz8_{k!8FE-up`FA=@%zoB3tI(PuDKeRetRtG_NkIp_E?uwhLKexG~j zo^r#tKVM#V?nUKIpZQk#(ff}=-Uh-y2fX#XIDac1xuYz)`r8V9g%BL-0AvbYyz*VL zO1jQ1w#K001Ywv~;+#&(u(U?MAUnz~GQ(eKtn4YPu3qmVTJDDqy*NOfTWnJfBZxAS z^ykaY$0`0Z^*Ni9wb|pSGs=Nye5@SwR(SfpKZ>?Q)Y;mA?=3hUZ@A#{vh=|_%C#4r zRW`3(QFhwzfb!~pyqGDdlgg)6`Bjk1(5|4omh(>DH(^ z}=m(&91l zgwgRi()*ooI&w2umM*#}#ztNC95Q^s=^rhxI_90_ezMSx#iDpQZuz1c;sDOu=g9K% zgEz(LkZu}>ZT37gaA`2MAP`vn)B}hXasf>9UbQdTy)Drzcb49DYgi@P&Q?iVmBZeD zDR8$HbgHQ>#*1Cru_N(&-}df;~d`e^9#!QK&PaeBFn> zUVe7&G3Yu=iomgpPUue>`Ihf3B`}!O@%E$+pgPx#uR6&(Se;poLyRdlOgf_JQ*YLh-{> zoU_cz=TMJO;$S^w10@vRXDNYCO%Z`lj5rHm zmP%gNF>k@COQunnCSJnz%*|Jnx%(bbb|DM6YVlXnH%&O8$kX;@sC_+m$JKGF^MgOu zzO~{A$>$w2W|fn_eieOml3x3JW*4px$3(hQ?Ry|5^*w^ti8g&Q>D&Ze>jQYlOj<(G@QRQ4d3V!W_i3gvPoyBX= zPdbN(=qUUKuR0Kq+n#=!8`Im~Ftz*oPU@WO*ur^(GJf!%00tP`kwPC#8u@CRK7AU7 zl*pFBc*snMo5Z3u^5!1S$#6P#bj&rTP|e;nfQD7KkUNuUo>2w*}>$1V7=%QI8 z7T-Dsw&xsqRt)h=r_O;@CgfsXfs4N)E;Uo!>Hz$xo~#J|9|s{d3;dqC&5qvAUVn>& zM43j!O(O4=DNK$lG<|*6vEZD-EaFE8u$}3lJ&rsj2)+F~A0+yIj3*Lwq*i40GY^(~ ze{x~^Sg`O=V5|3euQdq1X3X2A-0@Cag z|4aGBIma<&ys9ib<3lX!F_MA_p^>=sb-=qmS9(^yP_F*uapm^!f0~64zXP%ore5UWcYX#q!4UlfUSOI*#_EtWK3aZ#(b?s{ z&ON1E`>ijQ6;C}}RzCALvRZdQ{}o(S${MCEUSf)G)l&~f@tBR;YL|WE{H^%g9p#z} z-d0vW^AL_ef7wJf^PV4FSnmGC#bwH@xn#-C24B#Du}itX{_@*p$)a00w@o=3qblC! zVfgoa)B7-ztIBQP{%8z@B&<_VI9brlU@UuQnXO9T)>LNB-6`;GGJ}o+G>RQZ!HvT= ze1oRc|Ki{&H{pMdx)QLH1yTm5W`xY5I(6Q{O4j?X{8m}?yYI7|%erJ72a$(|fA?J+ zw+9l%PGgGEM-BFKk1KDno_12E5NKtp; zKlOltQdaD9+&Uh!K^jtLADq_foYEcM_d07f%_7Ai24C5N#O$>^$UQpG>MrRb|7N-m zUQ-9_oT|SBMt$kj^^+++(B*q=xMU5nh48GwJ6+2;$E&(cc|aoHK7x|tiDtK=yWBip|e>rjBL;c zWUYZRT>-xvdz;Z!*TA6BHTe$zgsot)@z(j%{mE>HZ~i%!>^7Jj^|nf8hJpc4Zh~P3J@{D8O0lcHp+vtKWR%i7~Wib z`|nwV)LV8t=5!92q+m8r`NHm~?{_%#Em^hx;==?k1RRsEK31r!GnAvPDSc_{no{n& z>Oab&U;m)=5yqTSHs~Q=xBukJ_yy0?8aSW~<>5bGS#JE!XLD{o zyBH|L@|j~9Aj#rR3nmy~kvM_LU~=9XY<0eLbvB{1o2(vASN{lmXfosu7T>k8yNVloX^W*5c=h2IZ6sGLTTo}1kW0V7zy5mEV<=8n8Y(-ps)C%+2`Vg6OZs zn7eW~4_&80qfr4;sf{uHYx-Lz)tEYsvl*q;2l7m7JHWL+gcZco0zFVnLixLJ=rLeXwcw9#!)zdit{{6Z_BwE_+Za^ z?uCJA>lGsaUZqU2O)Aeab}m4&~%tlafqA19l*1|`PzM#zlAh*^ijR~xBwr)`DN zW$dmj?Q>5gXyX!jGZbi|(!#R$F;-3)En5oE;MN1Q=~fRqMX(m%iTar?*V&-L0A7L* zz>C{}_*~J}PKtMRWmqNXRyl(M)>}X)g#kRqF$4Pwsc&&6?K79bR^M zzx=7exbtThM$uW9Vz#%DwEd_dJ})y~*0DTv)339oQC1X!TZ0TABj=KQUrx_7wE{a+ za`K({+MBG0FCEWja2{vPF@P_SRUZ89e^95{TlP8e9jt1G7eMZ0ZR^dKehg*0y6k!U z8D;Mi-d2tzidOLd^0g0?fwimS%SWD(!SEh`^T;H(*CFC>g>D*<&MhWnh}FLafbQF6 z-%iCS=h-?4L%|Vbki|&Q#RV8H;1Jgaie_6^E_saX-9MMRulzo3WB3?HBMZTXS=gcC z8lB)XYk^W6&#`8Q2-GfsLZHay@Luu@2 zD61D&8S9ujqXw+NVn90#@22zt8O{@Tybry>S*GXMM-iI%h7#$=F*)XJGXn0LkpUIA z(|--L<#e9B)aagE@V%?Ev# z0>*29NG&G1UHT$xBgm!Ch-QzM+|$6mjALvzjJASKN)`A44@2LWFHi?cbhEP5Zj_hhIha&_1%IvhWEUJjQSQA?hfhF;COr z5VIJiOrPd6b?KYzkNe~e`Zyb=+^i#~>Xu9`{J|}_2U1bB6rF+cD=pZ!7VKUlV`#+C zwsB8PmbwW-bm+VZK9KQ&?!S2edopMX$V+jgj)g-Pf0C1i9Pnbx52cORLEgl);0cv!kY3t2x zJUdsrMZ-AkPnKU_cviXZH{V15C>air6Y`eA>YG;!J5LNTt271<@oqq#*em7H>%LEk z&}vu(T?+p-B12-ehx+V?DPu6hzVOt4RJFs;t)*|>%G|g65vRgm+G8)b&2gN-UzGp+ zKMTvE|GorA%Yc~U@bU=#^>OVeZH;n+&sn#uZ7SJDRA9}%q650nd(E^pGRzZ**kY@# zkH)dlBg`UbFSO-u2Q+}*Si7+onxi+tmkBr>^KtC0RaM$n0}SOy+-utawsc`Ly08;t z?#ak_+YL5&#M=n;a<65#gV8VRW#I|lXp$1n(zrgug=;21M1%{owEOM6slA7geF%ll zS37SpLVtrmLNd5?BNRqaIyBi09S4prg-}*w03^eCIXCd%Yn+pIbLhTJK3kYJH2Nw^ z5FlYE9Rcq&>QqpwRXR^V>ONG{Qa2IH>MJHUg1SFBnIJ?H}lcG#kOVo&fAtPciyk;_PTf4A&u&QFe(fipz@uzcx_nrEPRIXfN3}Rl-p)a4huoE>tW*xF}7o5$+>U3~D#F*==tYL+oAV z9az)&wkwWPKSGl!698x3(h&IU-{`ZciN!PF1x+1}pvr}DTVQW=JBb(fjFQ(j!%S`P z4BNj!6XXzM>jUAXOUwM3-zyS(#5?Z1-`qsUiDaC#b_ zduGmmRnARCk#-zD8{QU=7%A?R&&|g5vY^B)-OPDAmY1J>JT_68>?0t!>EAz6-o$n+ zZ}`M_)6V_>{S6jP+zu}@U4SE@vensx?UL1pbz^8~UfU6++Cve(udXfTaQ#Hq)C>48 z=mu2sud!{myZ|5V7OLC2G*Nz`>8izlBP)3?H;k3pbEmP0V^-6wgmhse@0%*$mA?V)%b88>DZ1;XxcmjW}}2LW`L@>|DCGT0q-J zV)$Q^u{s_d6Sw2ZVj7Mb2)yO9|55flw(bMB+^nT@T#V1{fHX>*+1R^-r@Cwr{l>zr zIoopmskDJkpqRadnpF2R#F*gpu1;CcbTa#Es6nfl(sW-|KKB@OBRI$+4D?hVGY;t4 zK_4Z^tDQuKUbR!Obp@`vnE&A3mG8sIbR#;csUJR|?*xRD>%QZE z&8ouQKd1L|rZYnys){2Bf`A}c5Dh9Z(Wnt4`Z5}GRW$0o!4^wQEZ5!*mS~C^yP~L| zAcz8jbOdIY8DM6ZdgkXCUay!T%pv`-f3iP{E7|H!FLy3gCEFlG(Jkryx}86(g1IHytq zh)~Rak=?6qaZ65yM9=0mi%Zh$@Bho+S{@Vs-H;u8&5wOcJWv}2JdbT5lIzC5{a+j7 zUiF;sws9ougB;v@>${daZvV*i3;ta#61(>Cb`bd3sV{uU6Q1djk^L#fFiSC6%K3Wv zNLl|w2M;!5(Abg5#R|#))2)m^6llKd{2LfQP?12@S#rT|V~*eT`|Rp~ueFU%c!%!I(9t zFMqE#VxDxwut5Gn{l<%1TcpC)%ed}}M`!!3+G8*I58F-Q9H~YH(e@{7v!@aU4LTdu zVkSaE%}F^cW>&z6Ic<1o<4!jb#?9$l*zU1WI!>|Rt@?n$bb2A6G2l1@{Y0QJdz9M?Up)mPdWk=Pg%1>dBMU0fkLj?|k z(u-%qaS}AJ^LTbNeH${yp?Js>Kcy_>!CC!$^5~sYXbiTaMU>q#JjpR!9k}|#>9ukH z?Kh1Bc=@&07xjlDQn_&{U=OtEU-pC(inq5UGn>~;@id)Oj$*#r8B7P`Th}Ll{g2Gw z|I`2WU-_Wr{CnO$^hO)B_|RKlzufwkSGVf&Q~LhG^1fI8#>iLEr9$FCcjOf(11+V*) zGAV825Z_$!;72Ua`jW3-9{tQuuf}H`o3;1Thz>^ zv9*Oy)J&PyB}U|BoZa5T0SCuau@3MXzL@&hewVGL54V>lk||YZ%vjithd~Ap+~+>` zDJhJnr-n9I8(CSzt!2Aj1pH-h^7o>jc+PygF<=*s0% zf%SSO_j>2ykK7*o;q}V4mXgAYw`XgRXzZG)^GkcGu?^deDXNv7j25w&T4KQ*-GYBO z{Wg7e=C8Ut^;I&p=lkA+e!pV>mDP$KiB03p?%_mPU`9Yz+rlp82u6Rh&jA!%GGnri zks~su@6wk&GR_@Kq2z^*@+){uot_s_M|ilT7daPWwBlPeX`UI|5${@AYr5ae+H~A| zI>o6j7s|NWertP+A(ip0Q?|hpOn7p&MfIEf_i6aqHa`~0ah~0^d0F|-kGs9njQh*P zKlZsVTweQ=-xf`ae1rLsPyd_(i4RxO@`keg%`i@Qvp!8uEn0CTA&2wohdpL_>gWGo z%OjuisoCD^H@j$2-TMnXZcSG_Vs)Y$@Ah6n_`p4X3*o@pCfA<$JH~h1&T^`=_^JV|^>#F1ay5)1DuT}PM|D#`CZh6C>C#Q5y zdMknrt$Lnbg`-KL1iytyZP*fO`W~&z2olNNjsN7%v&;R5kC!E^9BHfC%vhtgrdE#* zsvTurWEK1ZP%CuVHu(0QePo{nhv?uuy{GrDW&sg61+dneD%`{+eb5NvtMQo)~W_;Rv-go}e z)GFQfwa*@hfZ=-X*Zjm3`k!pOiueBIuQlED=H>o>c-L|w2jkEq%9cIp)d3T%jU8;8 zf;3HeDx$d|C#u{#@z?kcjqg?eJ*V$26=;8; z)tk33+Yem5{FCo_)jT^q0Cy=#=$3&+bG$HPMn}w?0iOuBzQMmeWx6Mxv8m_zR;8g4 zrXD*HIAEgeAcvwQycX%eAV#K{DGQZ9E`rS%37sCffW26Io z-q!~~#%uaB)xv>%&cFNV=)Z6I-IqLPP71jo`_Q%Lz@h1rqt448C$Q&oMT0E|V$XrO z?`#v8(M78`2oc>--Xu%`P`|KWkB{Wulk`*-w5YJ z=U`UHG#TY^ZRdHJr+YeI(-B{S3(kr59{R**<@`N2r>B~b$_bwP4L`d4;lD2%6TM7z zZ>wM#;w|)=U@m@|eXmj$oORuQ;AB~gqM?LZB%X{AV+8i@H*EDVljqy}=VZT54 z^_&d#lmErHwDr)dmJhz|bq%!Bcq+>OqW}Cm6PbSa@BdD@EnccB9ZYm8d>56tNU zozB!ATCIjI{n0;kAwQJ!EKb53XwDH#A52hMBX|%UICo|Z=n@LPC+AuB!pqL48;2LV zcQz;vUjknAA_pK;gJ~*wU;}jD-S8P}7UixFyfe9~ud*C;j7)+ThjGurtLIq0M}6|= zH&y!|#sD}2_}JYyR(kT@#6LL6*x4z+(%X|LpSC$iZ-;{B_dA1sQ_E-JDIDqQ{ zm<)P2@p5rkUiAy#+mzamEHC`FpItucd0(_VyUo^L{vW?EnO^OVd(V`eP|Ia|t6%?) zFP|x^eQgo8zimIP;EY;>mvcD`r(3Xd*T&SonyJmcj|9#~sL9pVvdf(4RgMy*-s1%$f)jy*Js<_H0%3NJPBMKeL#L#J zof~=XK0Hb%n&k2w`Iss6e#2*ErY{X~U}aDHvU}-=p3nQxhB6y^x34nX@l1HbGqy;Y ztIr$^b-ddvxw+U3mPY7hd$XQt7G+mQEY4=meKrFF9&Nj42IznN#~0Y#Tp6q`wts`H z^I6-IunCs8|H-elg7!O?M}P7QmfPO=hs*WPY)6b}`R+gcFYCQEVfO5S3(YHA+Hz{! zBE$DjzTVt@^v)`k4avTb6s%XXnq|zkKF5{?s^t@F6*X&sKZU7hOs#&QvR! zs203tf296%R^fctfptdAR#WI?Z1~{z7Qx-v7EyM^cvQP}kdcQz=~I^L)0JLt`~8Z3b-tsW(Rq_Q+M8^5g^e~twA5K$2m3@m54bn2|^4vpIx1yZ; z42<%fZAR)8!w)hEP464}L~R35zrXh{es_81SG;t&uB{TTY|p&AZhq^G?@Vw|+>TtE zwq?b7cWs;3DpWsR4cBfmH=j3rcOLuDd)+?H-OcS+w6j_t zGl(bdKQ;t)WR*ICIfAJ15qhh-27NteyiL9w<$JG3U<) z$bH@YE3TMm49r1_ZCA&meEMX6s%aSJr(mP+JXl|*>UKAFB?<6KVN+Nl+O^oYk!6r? zX+`Oi{`pJFf;?mPLcG0IwjwA--QpGF5nOP%3DAQ&4v_PAs@l2xZhd!rzkedoI&Lw~ zV@Fw!qh3Hm8E0MwBlvxDTONC&i3qjsn)`x{<|bF11sQ5Tdp`!C`|vg;8=+QY*ZO@Q ze9ypiN2}6K<-qGr(Y&#NSv|?&_Q11p-Rf&{xE6}H2;;J=+Pdh6N8$b6w|(LAsbBj8 z$-yTrANS9{W_joD|6KUAk?pRg;M#|;J>BdB*^tuoDX7{mEjVy;I&OabA1{x7_UA6o zebF~8?|V}Y9li>OYC;t)4_%wulM!n`Db%MKdPl{*X=ueTe%e?6r;(S}{p?GZTV7u# zvM!Fd+V;qiQ=L_MWprHS=v>9@k_CH;4mjwW*KB(b4ml2Kddeb{uDogBW3)1Qf;vHo zqu|y7p+U0HcjsF9>zKVHanNk4`dpdDb2+?fiDQkvj~9}iQR3*9+I*ie!u`f`;CI{CUBvVCo@ zaa)Ume*b&FXu0CDJg5bQ82Z;Q$Y4ri`2}(LqBf$ytcKt{*yj;`I}$)&Y9xH z({$sl1&UAlf^VpX^%Kj=K73GlTl+_%hnnG|t$@7tqYI9gAD>L&eL0Nxe)#6_ho9P} zD_!^rU-IpZZ|CxtKk<#rd;j>?tE+AgvSx}dDS$IRy0;77=&*IhVdedI|J5HYuWrku z1C<%P;lF<0@`x7eT=y~0$Ps+;@{T|GrAa)HU5@j;xBSEC-&>lFyYtT5m#Z#6uw0fd z*Z_JuSdHxa>b@@gl>yUKWyVW`|^g=qRf%WnW!(2Dtn7dq;+@ zI-C)&C!EuC9#eg z^*z}FL8NT*>GauT6Qeg;;2{e$PMs)V>+?8ujeT1Sc-Fme(JXxsZ{qRU@2*-fyqL!m zAFc1L5+{3{dL5hY?~$}cL3O;y!ChCJW}9UL)4gY6sB?I@ej#iE$pUJ8Nf*%{S?qqw z388|*CD!LG(Y00xtC=20aj;pJwKb>8H0}Pb78QN+SA6^O(bXH@_IJPE!nH4)yKepK z-;E};mH?`TH?Ep)jOnp-%QL_HyGAek>5qTY@|HjPrEGF5gLgNjn@sN9$1ZPBIG9uq zZ0R{Vb@Mv(pz90N--ZE`N4S>BO*ngh<-;C5x7}B;GWOOzjd2oH;q%ndd#6VK#v67eK zlS|d!^G7b_WNToYY@g#T|Ewbr02YDNf)Vz)HrQxzn(7u%8iyIzi)siPx7zp%)rp=} z7auQicn^dxB?h*xGIMxQ`4T=T?`!eNzC-)d8Ak_iF=WpKFW+MWh7xF^NzwH1*%(Hj z$1wFJBYW_&0}}!xcQCA<`jQ`-dq3Dlyx<{>*Hq`{`tV!+JVq}Iu$eFo#^)v%_BlmoW41uZ(LT-oh!Ta zh^Ie4rpWoLKM~Qoc`B!D+wz1LeEITuZ4>iRpYbIz0Y$(FO*4ZlZE6dyz-NpPe*8MV zJKp`8##YT#9l|Tc%yGM>gS;QOv{$=eretJ}Omi`2j0(jm0`{rG1-e|g-~o;zC< zaG>!LUH~(E%f>&XVCx|t_nhhL!|(j7@D)!7=QWRd!i?(!uls|r1K%<$c&H3a_gv8? z*{-2sN=p3=B{f%r*3M*Q(2sr^8m?UA|JtHQtXSNfnlujijIms_A|L5ac%WD*)&3(FgTHKKX&?9!Osba$I!xcuKUQ91zZ+lz42GRXTE>> zzkKPk`||7JwX$vLMtJ&Qd&;?<^!zq%?=Ml1QLz_jTBo3A&+_>{_{YmvzU*&?pJr;d z=LT=x>qHJPPlmL=`wM6ewlaHWc(m6TPRG+HPuP^+q6+jYYa8x|##p6$@W0du=aQbD znFV|vZ^a!2)!DeAak>hB$mGBpEPIPlH`$q)uyzg^%m z2KoTc;Y+sDzgc}Q)m5Ktw0=he)zR$IF-@%Bu`_h|s^`+@wY};rH_=b^kFoUqfaBgz z-8hb-(bg|rL{3DI+wt6MPlpf z|1f6VgoqH?^9Uyr!OV~~Dc-*4@KOAIJrPhH4}6>j(@-ODevFyJP(OCBb{n9yz5Siu z{u@6QOlOvBt8sbWcf@47I^m-9^GxMM^=Uun;<;bZMbKr8fIM-I8@fscrc8cBxq|f-u?{7NnDRc6` zYkvMa2mcm=-2ahVmv{cjFQ*i@FQ5F?Ka^8-^$6)0$T<7pHIH1L`Qq;xJp6sepTTZvF$&T95VtH(dcnWyl!)gqci#Ap<*$C_hX7tcp}%_W(sFOX z(BJ>BpU431SU&Zef2O+3G6PnN)epSNpqx3`MzpQ`OT>G{k7eadc^oT(e%GJx$dCTwpNZS;BxO)VCISds(yZ7qHJRwE5 zW-A0K`080@=?`A}hevXp`P_-;HHxU61>;e;G#fL%6mqN81n2YG2#IT=RJKe{UF_yY_pj?TlVOeEsoX z@XhnQ(h|?2C&%SNPM-ZA4f4uIJfShjd<1V!lPyf1^2Ps8HG$X9v&LZY-|Qv1fdgZf zg~P9CaqF92*=Y-ZoKv@_z1@CtuQ{W~`EDh0cL(1JRr*eGH7XDNuJv07K}S#fZ%?RQxdCj}h#9wvH1n(6lJX z`w3LhHU7j)bj)s985th>EFI&5i<#-_@7fYNWqYC(9ASn{JroMYHb?^OuN>yU9D}*q z3ik?1=pygIU@V?dQlNFbKhuaX6FfechQJO(R=V6zGN}iz?gpJAbA-xo?S08W&9JsWK-Vx$Nzoc`P6Uv`EJ;<+|(&F z?A_>+aI$#{m#25eCjzk=PyW(DjpLf@KW6YlkHH`N^vo~)wweB&XTlGeXD3emqZzVC zx0?5{?IX%wu!o#R4$~7$hCJfQ&u)h7o^;VKBIf8)$I?CelU`80;d54e;*U)A-e_{= zwGUekUHkB%@!bVV^y%n%1ZYfSmf5QOAaKYM8zcUn1W5PcHasQx+!?J+xwDIEJ>l{c zUD)^z=9ukkJGt4>r2hT&yMGO3+C+G|0}m;KG7Y?|vIydh7sz;on#?p>gO47*tc2a( zeeq2*6BfR9=d2dDp|x#`&}5wH_{ii%iZRD!dxVhD=v6xd1f~a=;&6<`uUZaId6CQY&-$Dq!fnz?0tTP$1)9u0X{_1)@<;%alsi0?7BUS;dm3kTd zYaaQr?J@RQ%LiWjo6AF<{8=4k_t@F=_@-C?SE@H*<&>@2TFjT*H`^8LDm$6lS!ow@ zGA0BU#W5&mmOa{)({2B(&1p1vB8zZiNfiUxS0i92o1)yaW8a)A!QhGhIn2i7CXu+2 zo+v8~kNTVFsy6No7cXz?iRZrLXPV~v#N`Wq{%_ku?yc3I{e9a9+&jm*U5EZHayZ*Q zjIa3qf4!W`+1^p{E}p~xZ~fh$Y#QxptxWrb<;6ey`sKz7>`%1^<7JO{T*~Bgr)ra3FaD0@QQ`YYb*q2jgyZ`ZPf`>|RU0UA$yFb%3-19o>@Z*+G_*dV#{Kb#{yGR}Gl7BgeNkWkSYDZ=1 zcQyScQ()VfKX3oTd+xexdG5bzz@8(xQ!rwom8_zUO}~H@1lA^zn`{ z%t&7MglEV12bK@K?st|)wVL?pU+~q-JKBi$)JNW1i#^;mK`owdx_H!G#_09G^4-gW z%ceiLEYWjbl)n7EmyJO@+4fYg`q6J$p8wLHUcUZif3dv(Z#%u`!~al8$$|9SCoh*5 zfZJsKl|TD!1r6|3a2`)=bk%o)+w4PfwXG>l3-U~5GpepL(f$;p-Fv6>7$6-z3zsj`G;H%by@N*Mb6WnN4zvsHA|#rj?YF}UR9=b*F-`k6i5gpaLNCPhb%eW2gcKNp$?b`Q9AUCfaSkxZh@IlkP#Z+~*qf}D2U z@Ppu5kS{xgfR{>EY^!0VT}nGRV#C#Cn{2hn0wLC2SW>X-lEH%5nc4#=?0@AG!?}QG>I(yTACu`?0eTVmmx)h~iwQ^H!xxB=7*k zMY--VxOqB2p$|NecwVHQCIhwm}!AAW1c+u6-@oZsU)nD2zqQ=Z zenlVKF=bEw!f#q``RiYwRYf8VnHu}JG4!p^8Ju}<^*F^bnU+x`=&}}E%iLmEjOgOb zsZW_`JNPD$X!?(GoUCQSV;aV$q_SsLPF*aD37LbFxOWtjtdeK8Cjk15JBlY{M=w+i z|DNUdU-Ie8Q@`?iCKGsFyS{sEUg-b6SO3QH#$W$|$_751LM8YGJ)BMH^V3I{Klt{4 z+QNo!ULIG(`NZ}#+q{mo$@Jg-)(Tug_k)u8o^s z`v=P_f8jf(o@;kS*H*rM{`da!WLRGND?hN@(Wc&e)r};h&g@l>_Ua#d$@0&B>`#}E z`OGgZBa@+hOmLs>kF=eG7K77Q7vhBauF8_xP94M%GUJl7u&NHI_oB!@FmzRI< zcULvHrL5&=Rd4$#vpfIYH~;;nh|IkYvvXflQI0O;ICPW{eq!k2c}9XR~H>JTs`Qo$%7Iy2cntFCu7rKqk< zMte*Ay`D#$Q&P>jDN!rVIgj=UovlE!tuuslB)Pg|p=LT_z1Zb+XZPZH4(^PRhq`eI zWF>RX^&6cmpuI6C@S{KTMb*{)QL-72#%GhM3eW4N((A*5zoZc7DapQ!)YXuDAW>4=zX2?@xH) zzpeCS)#(;f-F@TRmOuRdmn^ru=8 zwb)sc`HVuVt~03krvKw9_7(Gv6T6AL=&}BTye#rsUw-yg(2chOni37 z{-zn8R&8U-?%rG4H1d}A+UnrsGGe=O!A~b#qP@#n`Kdmqr4B>b%dUGwQvp|0kN3{y z?2-GI?WI{II6rvju`-DtpYwQXx$BnqO~iHil?U5SB&RmbLfN`b)&5;~bY@~geDzhA z=fy{?qS;d?t-$U`w?hYJ@y6+#SJ~AIMJ_wSk&{QZM?5KRN55=8xUaTbtWeT+{}m5i zE|jr6bMo%SDWcdq(?f^vZDmw8P;J(gSM6U8RYZQNRU@2>Gi`-%_ua=9_Z+xt*K*y% zuBxu9g$!-Qu%msLOeyXP=DpGAOjCD~W8 z<#N7_cke%Z|FVyPZu$AVuh{zFH3yfS9V?eMSnj#=-tbn`TU5JyPyJnW*>Wmla=LvC zcZcV_jT5a!QD>}lN+?dX8~I&#+}plfyPBperJfL7%GtTAjWqX^i98fl~sbIQg{Z{BfpH7vJ2;0&B@QGz0F8*4i8 zVtZ3H6Um2n3kHt2WzyAGUb9^F@W(74sowAOnPW4BXTw)c$cZvD_uPHo7@%t&d`(g8 z-iq4q%OG4_F5kOvx$E8|?GoQ!cn5OW>Q&~#RKbbl<9t)FTN<}|Nx*N5o)h%Qe1!|s zGzU5ZnxV0+k4Siqma0Iw2U6_lC9+q%&S7eiKzpf;)02U)K!Pj^1Wdo4iys|qzw6M! z_+;mDGMfB=1ue&yywh-W&>p!X~lSeQ2-FDk@4RjQAUD+o;qEMnZd6c#yx$WUcGzSThQAv^2_u+3Gnu@!eCR`W6)2TC>HaHQsCZR&>|zdqdaOAQ z+Z1s8_x^bN*hlVNuD>ju*1tOs(>?psg~>s5J{O_x3?B*pawu8Yv9123x zi!vLTk<-chiFD}6cuBpOVEkCwF*@V=WbCpIcd#iiK09;Y>E-U*TKv*M2hLE&r~AT* z-8PJSJ)by!jCaknP3AP7IF;;JHO;X;a8OxB!3vv{ev(nF@!25xbnxDv?Cyz{hgxv3 z<3N22c%-sQ%4}21o4z|y-Rk)kmhRtuDCZ`<&esU1r{dp_+}?IuS3hWZ@b!-?p>Slm z@58qijFfb$-!0Cn&cQvm{m^ox4De-FmQ_1^c=?ha{L2=3Ja+k=mppxDYz`kSQ@6jd zUv}AY_MQ(mn{#5hE4>RxSH&-vU*4XQ;b&_;!^yI@N9%ugGJnOj4;veKUv-SPz5l(- zWi3A1o6S9o81>5*-<#a*j^8I3PLfVU*ONJD7u%0>f2-9W_sGlQ<+UE2bH)KnB~9S; z;oA;pkM=E>_d1h3=lt&4xo;e?HHpx3=ieh=JT}*ylvEC^m8$ug(9=9SH94e?llW_E}!eZ58pd83lev`qP;BQ z?e`sRtob*bKiP-_&4Hgip8-htD3SV)IVzgXIPXf*MGexGd>M*`V&>g*xQsEi;l$g^ZL|mj*pQ7NYfk^2?76BkclPL-Y*&ywT zVkavG-r5qPDbxYJ?u#E+dK;pS|`d~iJ zxaap3%IFbI;-K>pbiDW4qSUm>F@hse$ce*uHcj%O3OzZS>&hX|icCyfOmNwK=sPg< znD+yRfMD!J$GF*nzEwn9ms=W$)ltWDd=3o0Y?~t*y{B_v4_%$p+KBAC3BMYFomqD0iKy( zF9yr(!!!|a_-d8-UGF{8DF#Vv!aFc*jB6sq@UpooSKu+(h9Fs^NBs#33T%Q!Eer#F zv8;}4FH_wOGbZ=rK~2xNa)N~Kln%lYUANub)YYFogixZ-}o+CQfMOu!R$R;+MDulJb$eH4-emaBBvmyrPE?4 z?#YDZ2na^zxT7Fer0?0&t-L#ae@7zbl$$nV*rv=RCuU2ZkKX?N_%WxU@$Ja5m@IHz z!sl$mK(lVp5D+FoW)rE zzUsQz)q;wNrx^yq;1-3t9Dv{DX`BG3#-GQ4O{!X{htjnYAH%V=+Q# zUv{T^6^O46;F>v-HA8do(--(?wjPN?%%IfZ7*$zs*+lYffx`I=+bl{+N7J60*(&sf z2N|l#Q2TALw&H`46%bA4)b}$~vbO4=vmF6<_xn1ga9_{o2$5ek#AjQzt({{ZxhYK1 z{|&BpF3&=&u?XDGHM0{Dho+NZ?l-##oC_CZWaUe8-?)SIzD|kQi`?+q=UK4fFP!u& zyxG8ojEZ_P2=Rc)j(p3WA)yK*V~N3Y`1;jd_EOCm`Q z$TWkaoo*YuH(5mt+8AavZLrSx;V(Ia2haJd4?#qt7r$q}%M##mCvoj+gJb0fZeIV< zEi0dmP4UbOvTqxd5wH3-U!b;>toV#i1$Um=*OaN!gs?gE!LQ>V2FvU@n;zH_qS-{X zwv)9Ft@Ik1IGV$Mw8H>)>^i*MRcVgw-?kD=Q)e1o&v#**u{NcUa}gYF|Iw& z!K1VZ5mP^#pSnLrqFAJS?TVc#3IVZJaF6g{vw$C?KEzqwiHm*NEsd>cA}>ugh|%;Q zq)`UoL3~+AMrW9~XDDAvXBzGgLJ%0rVjPEHG)~N{J z7Vxs{isvZl0GR16(_nBlTbT${(`6HE*5B~FHnAE2qqB@Wop!Elf%gZ>e5y~9&6;QP z)X5fJhF)-abmcWcnaucV{6*b!(ga>%h{<4Wt$gj#f{O6LS(`IPGdM%j=%cS$bvQCS z6b{CCdt`;uhJ%blj)Ke#+QW-12OdqMjU0@A=@W<8^dEQ`@Zqm;W|0Fr(Lp300tm2U(N>{-Igzj$_~~dI@~9-j}OB?Jrkdgti{)8#i_6bk7M$BU}}qZ>IGe^t)j;!NUm)`5g6$R4u%>jpN)^a;PgNWe-aD*-e+_%MTn7x_l+~WZV7H< zadK4<*G%$-H|Uq(fCDy#4#NAs^8MhTd&cps&)I6E-!8^0fjW9?bW_m4_u39#>ut)z zihaBp7x`)EqfZ(5aXy2|Nhglx%pjz*!+CG%1wlN0hF8SYlNoF#fr{n0fo-)n@c>)b zHO@U<)bocfJ2XMq9Dm3GsU4fZ2i@?wbpm(~ey0Y}_yC!Jp!r#gDq$*G!KWa~k+QWE zUE`U?d*I-KzAy7xrc;t;aOo+0jHg4A@-%u(%{ab=V+%8PC4=aV-^m1=^{4v;A0Z|> zamoe#?h)LMT%de6gIQbj<;9T3r}2EMe#I?$jaKxs@)A1RmQU7BIHhD=e1;peMvw@Lve?)qx;TW6%QUrX<%d0V>GmUK43Fh7^X?~*3{E;mBtvH4`&f%i*sR{h zu+guXItv&}xedMPpK+QSr!^S)20Z%bZ*NmsHp=9{ zVFo*m8#E@P7$~BP2_YdFgP5Y;wzJPgKbUYUtV2L8%Zv?x-q$yVnM30-NrM5Te?vxk-!p1zLfkwNp$N%%)e(J+OH38cyJthl>Td)cqb7)s{;yx8)v|8W7J_HA`Bw>17{p7 z^=KFkL1$m73D`0+F|?^L@C`gV?83O5KgJNQhZYGp1+q;MYyA;Yzk?IK6o*o@#s}~* zt_@g=17G*U$BZBF{XpP--cj^08I+U`V=M-{2{_qoRAxhLci!I_= zsF(d#t2elAJm{fNAANSuYEbxSECRsVlewCVS$GPBfkmOYXKc1BN}qkO;+f5?%%)){ zPh`a2li)Wt8AoSFZ)P&d8>2ESDKlv3>pp!$x*B7=vgr(*F7x7d&L}yAyO?>(FgWXz zz1W}=Y0*DiT&_yMT)(c#mFnwBhV_5iD~OgMc-= zAi-gk`l&LJ^sq~yiU*x9?r6)A=WsXK!hR>~vuLfhCTS6r_6p1| zMeK3r-AgE^o$Ok2!)aB{L!W8eViBsxmLP(WDUAVl6#NA#NQdcueA=d5_T)4g>8zxV`< zUXG=wiQrJON4E3syYBJe@CKO1uGY_F(3AfO%p0?$4ZS#eA$-z7obgE<)GnUfT;We% z$eZunwILAmtX0XzA@H5B9FGOO+R9TcRvY(Z%f8_$wtpawhdGe~guP}3YvWwm=vnFC z_~;Bc>CMoO9NB?|VAvOu!^p>~{bpGOUFbt2@Mi0f$obJ`PVb7+9J{-&j z|AHwv@7A%C>3I03Q#(I>MG}ED&A6wPq&g>9m_ZcQoqgUEjMBfH2LtN6HKHbb8IfAG z%C)9ux`z0itq_f{Vf@vJpg63CEqY9WnI<`&*XqFHxePEs8!J*gFjxR>Dl5_KY7jS! zObA}HgFV!L6b&SAD)w<$Y78O?1*bvVW8h$-m$or6Vh@rV1S2r`foi|c7#mx{Vzq1J z=+W>8xqUJvNP(>zT*q_?JzQW?%uA@iW;0O^A7-oB^@TwZy8aomEfLgC^~78BiY5e+ zGVGSYw>CH%`lsMIl#DVZCF+^FI<+kcq->aNCD3#-q~Rbjib;!F)Hmgb)!mE(BT0!9 z40wV|c$sZw031-hH+FPTbB1Q4B)b<8w2n#L171*T&;2#O8u=W+NzuEf$Ixf)ul>yu z1Ij@}gk~a}DUbza01tb=-U5U z3sbj4>!~pgI<M=oAPzSf5EZw&f zGF;bwIOp7t6PmH4>!(iFNaKUkoi=lt1JQjlg!BykOHa-=CEZg`!OWpce~ytW07y>- zd}CN0Oo8L}>=2sok(AIz{o#x3KEX~O*dD5JhfhJ5Ro#&3tW?ivUqG|7Ea~>Lr83Tn z>bHfPy=CC((!Lygz}q;1V}u2iE3c214L5K=x75V&r*Z}Q5H86tT7VTlxk-ED7|(AY zT<^hqU<{IRd_(uh<7|l(PW*ztfi=#E=WIevug?OfXf0r->rOWnsN4!1^c-1YBm6em zpJ>CO!HTDHEX+FWXohbqJsJ+DbSAjrh|@xs7@rrOn!_M!Zyndl$K4X`IaOc|C4@CYE$1iymASm&O2-Wbppjq%|;hi;Jy z^rHj2pKf%K0d286wK#3+kw3s`TLTvRTE=tzFsqg;p#wW#K+iQlu-fPFX!YcD+W1iT zG2D|STLO*0(Q}-%8ZHQJ8>?zX_oXwH!i=4)5BQ6t2B!W$J&>^pYRFps?rkOg)}A>X z?c6wdom(tt3I)U&K%y3AY?i&?q7E?iKZ$=9?qi+D)G$;orLK-nI&M z9Zygz!ZuBGDJ6YzFC$y4P5)(^V%`YV02_Y76XS)Beiu`=)m+0C zMb;Uoi#^XSTs*ISLHjv%&1)dArp(7j^RlcN=t*sh@{9KB<9Ii0@7|qdA$HZz`NkhB zjSvS=%;NX()!~r#xiZyzF?`fwiYYpprt7fzMi$KVSvuL?dLlg$(f)(o8C_3S@Vm3j z!Ir*{le;zLU*DGbOCM9b7T-+GRy5iYEN8}{2se^grO_=?xfG%~gQmB(b+WZBMq;l~ zLNl!rZO+%n`RGN&nlI^3FjSvnCw|7K=F3d2W1MXj;;lwL3inL4ZD%f)o#`w~nMVRX zQ>b_>Ah$)sbp`T}yY?wBO1QDqaMUQ`NjYAq-^O-!vcJBApPYm0CPGB_;ni@G65ZxJ z#l~|XIyifj`^VWT`QBC$Htwil{DUryb*%;Am@s51g2GsaM>M-LUI@Ff6B#JrqTm=9 ziY-M-QE+yxR>Ko$MEN(6Q4TUv#KfYaaXw0mphZ;eeteMPEGoUw)+-!HGNEAnOnh~| zX#eb_{8#=Ciz81{JiOtUP5n(BGitdP$sGqp(SGz~5XMNaNAgjSrhzHCM6GAovE2nE|+23^kt?QSFQ%H_om3FZm7Q2?0PG-x@&vI>k($;%Ko7j ztIydHtRnUvnb*{1^_|6MXIdO%+Vf1G)%f_0(U3K*>ztf$kTY}g-0{Y)RD=$x-O;Jt z+d_(@Grmh#U1&j5v|Ji%>^uf6_phfT2KCljFKRtS& zlAm({Mt*m6w(GX^+4j=o_~TOeI^RNz^VvG*dS7y;d~iAi0zaJMB;;J~!~+Hqyn@1Oju`LgMVycjXy|v%t z+JF!4b2+PUldie6wWP()Xh!XjyXZ+j`{yJNu(4lgb1@yWdux0ft_4~GD7rs&9V8Z$ zB-71!DcpB{HeI~U)-kdx4aZ&Ez3I7~P2q8bkDc!MK9d<)#@)%f46^`12?yCm?5!;* zXcUdZ3{LIEi{#+UO!FqU!5@d#PYp#wy699!=6HB=WT6ExP|CLK2J*^c` z%5|_>X7)H$z4{;NVHvs;C&G)2d^NT7Az9+APnNZ*@%0oHOi^dSuq7Jru7=Noo6{}M zJlldIbOGxcq{Iv9xqxU)>0PsB$>P>vBjYDdSz#PM=FdddUdgFt;o8SbS*=;!CoPZh zX6gvh@NqwnVQ8_yWL`AsxiCSg?`_U{PsUlHD5bG2!G)Zyd9#GV@n8riy9L0oy+$UG z7sIU!9suELQ0N&@zFA)k*7~xy+2$%b_m~z_@S0lf<|4nG81+9ps!=pWre+xe{AL{X z7c<=j2^R@)e=jthI9KnD6VpH{-M!Y!1b<5G0);bUP9ZjKuu;wmqD4d#NlRDTOn6nqjj04bEIS8CQueHVk z4C{C~(sRTRMHwTDVoVXis|>)LQjlN~a7?oc6ZT`RP3A!6*2ymfC`Op^tl5QN31&FL z)D3f9rVTIlc~mxZJ8k4))11A7`px+ApIja*A%A;Y5b2 z;lqX!+>JYY!!`9divpmwc6+dw^@aWMbg(!EZ=${0IMd2j#zKTS(OzvB_a%%Gp&Q;j zW6C_$2dgkP(F!1+eDC)&O8De~( zMhGM09qgQ?XCr0dVvS%!1}88&O#A&RGk3b@WM6l7$oWnyOF4Hb7)ldgiGrt& z&q~~AC%YyJ9i_Xa{px~&jF<*N2UAcN(g`Qj-JLCXEOTRzy)y+Pg2mk(#18*>1Re2! zQ;B3e1rzY^H%e@#UZ|B7H8G13rEB7O$K|1?w&1bL%_9wZ8od!IkQmUHG=|wE_9mNm*Bb3d(+l6Kd_l{ zo^qZ7_Ap`a1E*4ho!y5n4N1y~m-4mSPbQPH4W3~4a z+r|SN`o2tO^w-$BNj6h*Cp7k5_zO>T2zuH>(V`!1ar)S9wsf8!#zZ$+`e2Gi^zgZ4 zt|q2bV#ZycGKbrGe$8}uYcNU@p~=iX#3%5eG{D9GK>JxhWISE6il(=>UZjtbv2@9< z97SiepKJxLqXNfo>2_)ue$-bxrRMZ0hfMShx+Z5+_ZJVzs3tU{PsutM$Tgp4coXl| z7yg$pm@Hv!qiJ8KD}tlv=)jS?Sx7J`T~R<=9qevJ(4~YOYNWv#d>C7&_5v5N6Ka_*UM}r} zB>{D=`w)a8!Q7Os-zYi?g&##3Ar?i;Am+M6G;lI58MY0^E)7uItD}VxMJ{I=!%Wpt zgeeNoH;`be&-y=K))LCj$1oI1|J7f&%n%qL3K(+xKPC;SKJ)&y(};S{xCeF5grYvL z0;C~XwMz-)tk`T!V<75dl=3==2qTTWK4+Z6;9LZBsI4*X+UW;Ia5no4P*EAB!Lf2r zy{$BgVT|K}$Rx(5NUbu{=JrygnYt8lZPsz3IyBzXYR>a*Z*nS}*kV9-rWS_@XUd=+ zz&CYWZ55*k+w_Gbj9$-7t7F#=4S_CxA+w1@}1Z}2X>U$iC5FLhVZ&loAG;|A}<5Z(hUu;gT)%rNAmcd)aJf#8v=`+En z*bsL}9K#Vhd}K=#Q&y*nZ2NfxXJ|h>f=LW2-kdQ9bGQ_NSzN=A<7t@@hIxXg`kE2| zMqLyfezez{{-czWfn?UJ$CXtc4{bhs{) z*!K()Eoh4DbYs>lx^pT$!#SC067O53ZyI?D{uwTC)EilrVKbe(v&a^*;D1}$I9Xr! zz#H{MiBd|O*z-AT&f&!Xc#o05heujqcCbR}-7Sos!5uH@$T7E@O`>PGctqg_p5;iAYQCm zC!DQDfQ)EQ)`^U+by)Z!76xO#ZwW`7a|TOE3!2eWoc4jQ@66`R#?-MON8@yTkB;kZ z${PF;BmL59Wm*4?pdhO;eRE>gb}N)`$AO*c=X>uyI?r&r{7kwTDYk&VjodZalzCA2 zedMWZvN6rh10yHFo-B;>%>MMOBS>+cQ#0VKW=2ooLuC=h$Qe|#WpnLwO|jAic6gY5 z?#M+(o1fBG6O=csV2Vas=Hw)3oUwIbOtKMwk71vlgI_?@zc^v|@l1C2R5**9W*m5v zE;!dTf~`un$?QjO0Z!&}Y?N)$63wB}-p0Wmch~Uh*&I!l91k~;aNNvJnOAZm;h{`` zncyt2VHPZMO6g*9HA$3y+a7);aqtb^pP-pMj7|wx$pAIdAad|lebuMh(N=uYcNe|F z4Jt*!`b{k_o85PnMVga=hZwQZJ0IuTY8r1U>sd@*~{VsaO z28{3sa)VzTsep^P>k7dh&_TeAz{FgXhu0|L;WmnMy$B}7$&gaMt`X`!4{{@>d-dtF zu~BT4N}vof6v^t#_fxOYec+qu5#e$WF~3I;&n1&G0=fY%eo$)~|9O$z9 z^uc&cQG2j6;$WM|AUH*#UW8SrTI8&HO&wv(&@UtCoQzpQ4l;_on^#;lrk-6F9Z&#t z-#T`5z=m)!3MywAGQeSc1B>^P$Z+RNrCrn z&3ec_t_sk7)Bf7fjE!=Dy{Vak-r#nup!%-KCg?X<(U{TM*IsD*d(GyT38`8nPQWH^ zIgr{yL$4a_Ul$~7@B!Y$+v9loZE)pYcoJd7kI@N$ikW5iz`hy5uQCGJ^GN;VjN}}< z#<nQyFEzF=VFK_BHLa)?USn_;HgbYlJMIiTmM8dn@m+e`W6X(axIAr=}@lCC|yoJQNxThR?}v@tZs!@=OUStT2u$S(R!@EdRH(~Cl1 z@e*|D9c?hoaDqPYXS4jt9QT>L%fORYJYeiHqj+bpb40`G3_wHmqhGq_0lgMXW2pPN z9|k|#gHtra+e$gCF4n$&@Bn!j1Jh%0Kt5;2BVIM_jW29(Gr#o&r)M&&BW5T{zrk(N z-)o#vxQ%{z2!G*Ie|=tS4h8b-ZU%T^J;pO$>UP6}UpV3%)YRO&&W7ke9TNXWB0?ds^hkkV2 zI{xG;+~5nC^!#KB8#7Gte zS@vx0Zvy*%V=LfwvaC6%?E0#+8`lQVaHUPo4E_TrJwunfz#HLqXVcAT*O;!wIDe6ts8-=PCXoL$xT*g(H;IA*fjo|n9_Xk*%{AI_hd z60>vq!Xx0sA9xkI$gIygp)=4=z->=p!I{r=FkBeM`s}Lrje7#0?mtlwe6lj4(`-%j znUWH1)y5{y=a|OYV*ic9MOUUZDW9gD@^Bkv9VN8YV2EgCE^JP!U5KoB}B3wMU36A@6I1kZeJqfw1`nTAZz0+_1;J0l=5xcg>W zGdQ*sePcF*1k2f`y=1g5G^c&3O^SKMYPCGm-9t!i%`*SSLbdKMRlO@`LKa{YT1I47 zjK@i$ykr|Wz2p2OfC~3RPFWHN#U#O3^e{>RY`r@d&J^s*lOdQ3j)QdCHEj}w2k{(h zLcFO2WlU#!yx+T{hq^bVZOUR&)V0D1oCPz*A_}i}TACXEMGI=&gf!R;ZpOIRH`=8= zqD}NI#GxpivZC0$9?ISo5j7xitkIipyC>vfpmiT4%j64lfK@lHF?R49E=1Iq+W2!g zbcPsnxw-%BUxc1#Dfi%I3>4(QxFgA44zLDA#WnRZK2QUGu@^a^h9Q=*K3G06fBAN1UA1@v+JiB?yR(;JAgfs;*< zi)d_p3I=^O7O%!4x;B+NwR(+9W`p*jgp8Nc;dnX2SC+w+JtEbEI}ePLUZWdwqRo_l z_)tT+I#@kle}S34=)1C{yIXXo{^j@_v8Io374AjwiT_0D_|%Gc09-($zb7%At@ee( zGmb*vgBf0SHf4OVRM)XKl1(*)Gpq8?E|vU^Q*ait!X5b4GMbLRc(Eg;!u^&x-m)xO znFj_UO_zK%UlnVQQf~0h$A%NrPmBRQ$+1_Th#kf-L=lR7rli5H%Vc*Pz{v;!1|5^T z`sECotr$nBwnFn5UKvk@nk;H>b*N8IJ(3OL>$rBqy}oLvn>PC5U<#}=Ab2?dW*@rh z%#595P52q_O((m-jGS^_x0I0~x8N`x3dTLj(|Q!B=fV%e6Jlg}&(;6I9Ga{ zp2}(5;vCY3O1=?5o!^X=d&ZjSZqCfSeUXO6ddb*q3I8{^Iak#VsqTV@MC$|5O9 zq4$k<=#D<|iz5~*G>fa*5#x@JITUyz=VLP2)y77x&|nrM{n34Npo0X|Qo##aYa8wu zc5)^IC}XuN9wC<@E4wD!D|jKBL*&r`iO}%ox}vmu6YohR#Pbs*2Jb8YOvX+%J207} zh!a97dH0VZ4DnlnmEvP?{1wHC>}4A$ z*2%nRuV*oKjYEpzM@|F(g7+{!Th~{lZsg7c8Xdz`_7yZSslwBYMV+yhH6Iw)6 z^h+4V3D~*{7F_Kv)hZ3&C)!$^sY6rIvG($IjMZ0Uk{D|AeGa3IB*xn6X!U5eQ zDxj1!(~UEB%)TSqU?5HfC3Ut<9~~ZT3Hmq<8H|}yOC!LUnip`60-{j0*|XpT7^8&& zF+W<&R8#`$S3JuAt5dQMp42x5y|t4HWJfqd>v$7TScn#ry6j4#a`M=zHsI_8 zgV=gcPUM*)A*Z)c3X|3jNt2Gx(blOtPA8&RWVH2|FX|)sT$3r>$d;goix?TVHzSmd zYkPS1J={|Q6v{+o37Gu(rK*pe9KlOM9=K+BIe=d97R$wx`dsC}_Z$&X7NaAB0#1s= zK2`%wZLKvi)i-J*AUH*vX?^c69uKK~Khu5PFpFqvkAtBvN}DrnIvmdmTnG-uF1sM_ zL^*04jx%qgY-Qz4Z~BRIsOE~oQs72*XKysHgkQ?2=0>s2cncQDA|8cn&stHce*p^+ zINEq~ua&{Mn|tDeGZ~>%R=(AqRj6PXS;VIquhnshcfr!jf+x|e(>Kl)oZzpiCG1p~ z2oya+OfM^)Pgg4}Gj^aXm$6dJGK_*x2-MDG^$eu{@F70%J*97|7M?j8W6X`O&zzEe zo@rzm*}6!6GWx+En&vfzPg{+FJQ%l2`;#4sHoiY~@_fbJ9Lr7yv0-cD=P+w?O9n4) z>wUacw62BWp*m-r4gO%k>G}BaSStj<3T`#kWN3^>4~_GdjLx)Z{6PoJ{$u@ivSZvB zM)gx`Ef9T>Gf?|sdT5E4@zaccGj?xvC9OG9%`I|=>9*r zks(FDwcMwyd^{|nB6Fvn)lLHwAmXKl3PD@aQ}jt38(O1%cwXCpho-Z04)-K8mp4YI z>71?h+5UHDTI?d@CyU29hTroon$zEoV7#y3yS)GaKmbWZK~xwH=w`Z`9CFqM=A2PF zPaPp=u5}^+8C=U2(Su4Jb`-P*+`x#!^A9a*%WG;QYny}QD7FbG;=6(0`08+_V~%BQ zx{q^2@Fbs%O%QmzQU;kUjubtIS7+60P$^d-lkC^o#st@RpG^;xzCYWkFDEKp;#}GA zIK7o`LyyrjdxP^r*@tn0d%{5xQ~NTwR~I3h ztU!Q5goqIRCdD6vOcDPWbti4C$8)VI_%#}*C=m_P7##vUSr)+Hwf;9wnD+=6kp}Z2 z2vC6Gco2AsoAI2CRD)p5SK|w|3{Au}yjdmK^L{f9eQO8tIIaE;)1`nR3{x5|T29I| zI7Ylj!3RS~bI-Jep+}H=VhEd33C?ja^iF7dVX}T6!efe>?84-t7#W_JxqILWjyIQF?6GI#Q zOu9b?q?{-MFu_GY&V2;(WVJBxCt?)UZYr0V`l#Pi9k+8bfm2flS#auq+8>;RH?*{+ zjOfqzyV^>`j`v`uTt(q(8T}@k%Wx4s?O=YmGo?hJrq(K4Q8?2TeY9ba@D9URGhqQe zYNG%7Oj!M8l!rGr0QG*H)y9q&tY(*)@I8Lj_ml!Ri5w!U0JDKKLRMP#NKs=V%>}2e{HU zJ`$bw#n2ngYYGwOK2fo~_l0PZP2idCOOuilv6^BE6LHfqM2zCr(9^bfwDfUK`5T?hb=`^m)wj|j5QQ^et53&fE%6! zs+>tPH*muNfQ!*z-8WNVo^QC?8u^QVY*s6nfphvMFc6|PR(&ZD*_2y9&f>%RRDY%@ zerLS4xnVu0`K-FZ`h{<>&A5VvBiz%CC7!H(eW2gihUo8peDAl>AC1XicgL^0Eehy8 z9Yao5oeY3jD-koBvbz?-(FGk9`O^qMK> z;6`J!Ct%RVrrgeb-HWzkCkT5NdFPnW6EiyzUi@y%RzQ!e_BqN%PCOS~e9Ih$4_UmC zcjJq1$(4&^p=~gjZs(W|zxFd*0MGq6xE%Y0mbI<#H2@NDu2Y|@4w78qP_s8HPqD>N z;_uAF^%rbxJDWtd=VY7U5P+O3fYdL2z6M$=%;Osb^T=U$;0-bl*{gm`CTnZph}XJt z_=fGAeITRx==H_}-&V&@fExU;!N$1YgWbg659qd@F&ovO2S?r-!^mK5HL_mey*BB1 z^3~6MUVWiW7)Q@UGdwy07KghFZs61Fyuf={h^#d;);%*DKo`+(eaGQ5zG*i+qK$GN zGcFu|PA9)(g$qvC*(|l+7n+TQ2<^pevJ+i>v))rhgswlF8Z3Y zwHli--~q&FQ&Na`x;ABVW^qE_jCSjxvV{#{2!^pn@Pn1Y0)sxZ#Yuv|Zb<3GI4O5yg-Fl4Rv}E#8^`p~AUBmLVF6<; z4x@R(cND-lrc!hLs;^<5Fgw#jeP$#Pg>vtXsn1bc)!XTF#&`o_qc((7F=~&UqWG4GgG{NY2 zaolZyY0*j@&R+%WrpiUj@McBwOu>hHnV?YH_*eX`j)(6PilUj5?OrY`f+iG*X~odj z=kVOWokf_=!=)f)3{90XycELVK3vZ9Rq#Tl@8-mUVAxiHF#IZhH_ba!3*+!No@h=j z?(d9Gt4tXZ$^!nwa`-k*Xd3^Wi^*~{2JMh)P~;hfJfuW2-UWT z`fOvC38w^(o;Y4a+%(NNX80s*;PK#I9q<$fn$mW`X%96<9t9ntn+ z&fQg4UY>!ZU*f&w;9}Xy3-DG(b$eTi?5c!d6f_Ff&KTduV5PM!khYd}2umZ!3_2Nr zD|8eu&eWG(Hx$p{G{>yWBtVlkM5{{e>r{h;7qsmH!O|L z1T+4@doKD!rrUNo=%Ho`9_cYJG9u$+ku|`gI;^G(vG2{KP?JUP#=h8WDADl=YFjJ#@b)y z2V{L5uwY~x1SA~(9+@d$+YXK6)n}3^dm9V(t~#+6u34oI9g!v2`yB2~N77$&7c}+b zIF=jq6(rH-v-qHg)wJ5!O39xu7AT=^l|u^g(uMg9@u1bgnzb(&Y|WAFx7eBhsW9<`Oc=GIpbgS|5Gy0vANsi5+tTmJFqo3fl=cCiu zyLg$-b58b@b!a}u*mN?>Mk5Z2#r$YRc>*w`U(kR~2GZrF&s0u`G2 zj_C5DcQI}p$}R+@JP_ziP7LBJhP=P|YWI$@4fwM~&{NNm^5bM;vb65BJBkL;!vY4Y zn~VnUzk7Taa%b8nL9jx#A%%(lv?n0;naCe(USVfbAhp|rBgCS3DqB0$8DYT0qugrC z79vvDz3s#L+RVZb7-N~5#o9pZ{>&IKAZ25(CyxyiG{zGd(4D&vJaDhfOsHu%;B{ld z57s&qdCLwe_{LnAZn7^mxVaJwbL#+e$TI4S!oV<-2?(DvGWTrsHBN7RfK8NYtC$Fy zka8(8QM3!zan{4Xu_PwLkUE%E;`MdDJ(uPR@1_pabcwpro=|dl(2FC1!FOl8Cc@jG z8^?m+F=X{Ryk_r5a35&3`I+{e8iy^olm~3WM*wG?3d zXyr1lm|{N9`P=ahj|R@u&!fP$R|a8=0ZnnFI59mru&23d!!&c0XgnN?9c4!-dWveY zWWH~V=gw8n$Dx2Dxa;3qMzQkTmg;i_n^w+~K~6QJ;=OW(wTPO+s<#HcJ6bj3aGx;_ z7u$2J4#rwL@2QleW1KEKp2Kw{$1{G}+xg6A3q1Fy*v=i?vfRH-1})lLvGU6Q$KIXB zdcR!LIp-Pfa|aK247Ov(0g{>|B}$_vVG^Z4f+7Z`g%^cF)$pQ92hmn4DiW2b zs#dKieE||x0*wf1N+8fc!;6R}Qb7R{NMd^9*x1+8^&Ow-%;)s`S-*2`Tg<$58W6l8E`rk`xpj!xW+%2=WqI5c@`^c zgY!CL8GVYb)IxlCg#$W;?qz^h#|({E`LmjnE#g>kzGfRIycr+6&o(mn8=u0})UpNF zUVAv6o>oebA8?EZH8IgMoaI zby?&jqu;OWMPwTXCxFz0YuCN9YG#q}#d)hLr|n=RV;f4R{GOd*%Vv+c#&$M);h_or z8~=o_aSpm>=oRea^y9B&iEZ7Cu5iR=v5&KrRpaZD#_abTy8?<_*E;7;~Ds=E&cl5R!HZv66p*XQL|la zN!2DPzupl3!MfIZu8K!iis#s1eb?Wb?UDJ2p*l{8r|TiQQG5(-un#l<+I5^zco0km zL^P-Vh{EF8I^aP zy%=_)0!*A7Sx~dn;tHNR#pHo83GNu^u9u}Wrm4@m!qu$aqp&TgiJ?b%buCLcSxr1p zA9c}dN_3p5m@If^LsYn(C+7n`x~}n@R5P=YAlSlTVC|a8dYI-^OBpYOwC<7F$dT{5 zixl0|He_`0(L~ZUc(aW&XXRT+CD^Bpj}v-c^xGYQ%8(>jHAk7w!~OAVFT+>%4jf}J zBT32Sq+V1nBYU>fwgPIdL~OE87O8AjbbONHVX!HA8yb@XJVT{1)M{uDb+fH?CR+h* z;fUC*NEfY zJ-i!#JgPP^rd>{N4$|GnH-BBW|}WPz(aK51cTl0tXWRTb~TE0fE@!Q z5(Jod5aHo+wx0@L7qeKTG55=Xj8vcwC)WQgaOu9Cw#nHY<4zw(oAAlD3chW#vDyml z!!un`dtF1e?X@~(7x4nTv4^%?>TPhMZ`^>M*(|o)I1WP)!gkISo{h< z24Nh=P59Q4by08|Klu#6o_+4sj2$@820wR2{Lrn9Pwg1q=<1q^kGqCUj!$5qc%kcN zF-aG3R(9L8dURXA38u)`EJndU00Uwz*4w}YLM0MAIh=xMCu0c6I4;UO=wh>HPF11@ z$AKz8yptgQ?gV7c^J16O@_)D-gxC#hPDO)KJv=HyKy#NoBcYXx@4zFf@ z?pEu1GnsL^5ZU4^?kQ8)YB6Ly99S>~%~#{^n)tB~BO^9(=N#fMIs@6w0PvsO#CL(u zSzA%CtR%m!Z8^=TqvL~#r43kkTt3j9{U?a!j zJTG>#U^Og5xGE?JykfSXocgXASnYJ(WTgU>19u$LjAEob2}s`&CPYClOkiM8LrD*Y z`j2wuh)o7CSb5MGo6=N-PWf=KC>%t@}dA)xD2;6)o@ z!x=%-hu>vF2=F+EjY;bu#_Zr1nT!&moN*Fv>A{H-?G0YL&Tr!kX&@pIexPC=so`~6 zic$tbW9+iYzyvpZVZ({E8teY{I`uOb)vl?MiPU1!G1@r^`Xb<@N5)Xb?>y!t3=D{c zA|goF7@P5q(l&r#!(fDrBhFFf$P+SrBRU+s=M*@>V-JrQUu`kMD=#s~wOQMYfIX&6 zU2xneknP6B2)h<94Mw~6e9k*<%$2o6rZ({kxMw3zP=+H;hbc~(*qNHpf-#IyUim`? z_`Ki87$Rc*fZe9W-8yaJy|qT9v89yMIE@3xSm8aCreOMw!r`pj;M#KjgZ9cJ=(92Q z6%Hv>3oq7oS6udCU^5>7)~xM(*~b)W{fPLD6<^E>zes1C;5A)>9%~jLUg&-QhNti< z9F7qPwo&qZR$nq3m8S-bU#6D)QGDdficEHER{KVi;}pHa(4lGg241>O&D@${pbJcg z(H~tG?F=TAHs0`-T*rw0o-qj*Q~ML{^gS8K+MQK>0lpWGp1OCjyuRtdH+=lTa`(C8 zjrDXaady{4m|NEbDYEJy+;2Bxz_ z^kxmRWDwE4e<6Ad^$-$Ilr?CP5q&_nta`5Yg9*Oz6IjUVo!je1 z+7^@0YxYT0*JgULfo2RC-h!Iw=iZ}MP;>lc>}qhPl<|VV2Lbh!PZCTW$ykv+dNWAm z7yZpjtXW~6-Kx)rCwkABBA?n2xZrv;^Y+#*w zuG(c+=%LXe^|hZNzvO7v>^MllI2-Pg(b~{&U<7aaXLMaUq4%fJUEE~6SHd}cR{#@Y z8%wxC3&wdef#H_(Z|r7#tn7Wcz1+qQ4ujA;$yCpo%!rnLgAZf$7>6dBS*+QG(@+0} zBYpX1EZsWxct_dC1aov?{BXhLnZ%l%KnNmNmfB0x@Q==Pip0r@h$ysJz9`ri<3O0*5WkJzE zQp2K({LAPPPxbly+{{mWLP7Tm*ZoTroMF#zNhY>s$2nN>V7Q)=k??^(gthMRUbr-i z!MbO?K3=2(I{e1!(vejAjw=QN#82zP0xFCqhO03Ji33lxTjBBiBIWNV*>r~egN8*o+M03+zeF2K#A{_sp__Qgz^!7pJgIE z2&Q6r4xBzAW*jvHjxiu@2-p9bLEv$b6Oh>!r2!f}XAL7?I7B@rHr?YhLG#%HiP`;q zL~2zG)DotrR9rjL>cM};A;FXp1s>DvF=9`OJ*GNqTY~d47L+rEE-`X!bt3R}eu9Jzub3m?LbO!fKJ%Dv^nE}WMaUazntylIx zI>#fN(+M)_Q)FlwdNPJ7!%Z1g{L*!Eyj1s$`&T~-=e2dedPie=RMd536<+tO3z@oC z5m9)PwYy~eqdmSNf3!S!$)g8a7;7E+Y2MoqRsYw{sCMzQBLZc3ITDAI|kH`9IcxfPxZDWjlAKD36R6#IFD!r zkKuMs(Fy0Kv6J@hPX~r~{fv_{IA5J=x?{&yUGb{E!KX%ew$g~cg142da(I;K7 z)<&+{JPh`^XRruBOhd{l3&@O{?$Z`M%09wlKSc8!RgQg1(JTZ#EIW52m`1-xKiN<1 zo2_yzDOl)@ak>jiPs&)$LOk{+yJMU(mH5=_?9LFb&>ybVn$1SiU9tw(>uarcMLh*m zAdU{6@w&HvbP5_z_PuM>h~IM7cr~jwTYprd<;1K^@^E8zIc~h1;c#N?bj40QEr4CO zzzGZe21dNP2468=+x6f9b^@FsZ|weAW3@01aXGwnnz~+NaINRS?NvT5Cef~7yIaP_ zZaZGD{@f!e;1yo@8Zzy&&3m1AHRV{wTU!$dXh$HDj$XIB@Hv7uHO$o}#fLShMtDWxOtp@wxPW;%6$kDy@Z~D%{ zt<9Tl_kxWWU&1v5t+#9Avl`D8u?E2K$wXmH*U!QQ0@eU2H%O2bVJx)KEjXg*>NQic z=L~3HGXjag%4mduko5~seM>f~b|Hnrn}#4eB=EssIoLQs5xGG!D@%E(JeRqro~Exf%Bg%j$SibnEr&tH|7{vFp{Xgk^P9 zXW>S;avkD;RbO$=D1eE&6KF-V>(cL4xq(5XY&=9sJL!R$X5pl$J&@Jow2UF3yn<6L z)j>kUnP}Ln!H*t;zm*sR2c`ZB^9BpW%W+?$beSQBMAVT1%ZVY!D}BADXo7*_xONDQ zhc+=jd+$*m+9z~19V{yiz4U1Wl+!p0Fv`?i&(%Q(>o|>WiO0rahp)!`fKhAF!TMNv z4Q>rqhM;!?!#LFOBY`8}l&CtOYdmns@t5&3Ow#-m68P{h1*#3k*|;aDX^0xY`)G*g zM38`&QDJnfOjoBTimn;V0ZQ;+kw4EZ&es;*eV?gm)i2xIc;n z-*D34O&#jGHzP%Z2f;*nm>N-sm)xN@jnM;*j9DF*>#u2ct%&Ndep4zkVuG{aUNcHp zxa(f>$^l|<_T#Oo-_$oF)%}=*vF*bc>4PH6y?AHpddPh^YKSuyM%6s>jxh$ zk4>qnz?N>{tlF@B-TZhmFu`nkX12A+;LMSN$s9VYwCH{GG`)&PEub0$(eD#X&^ytY zR=bw{HIPa+qda|uZ^@9p$C-*>WilA=2s3g&PF46JQ`%ow2FBNztcTzQztF+t_4Z?T z#-M3epokMJIPg1%e9a0pHF|X~W2y~hIf6%U2)bq}EB(XKr)y;TC{bB(P8erMkil7< ztR7szL--`OW&=2S$|=YUzCSG!Ix`y_>~K4JqekfnQ)D|Frua=pNCt>J&?6XK9p`Kj zqR#>bR8YsauF75I0X}^;rRHJ$=nJ32b7SMsHQeLvV58&7Ih`v2Ijgqol~Y^v9e=9h zk^y(qEHVhLi?TDP0v8OwHM1X*KBm zmSci9z~(vjjQ+28TfnUK*{dxP0G_8~R%ei&j&Fi(PSgmm_A$&4VAkUiIv!0pc7195 zjSH-v;8y>u>;S&$0S*eCL026n8)!HINHWct_a5(b`QT>iCh3NrbRE4*$I~~f9$)!p z-oIjV1fBKQSU7-poeb3Yr}lL2Zw%c(HZ}UqBFDBPN-a=8t zM1z~z4%<(eTIcBV)yV4IyN^*P@m9F#RU`bf_6scPZSN{ue%#Et3QwR6$ty!Z5{78V z0a9ZPknzWukN{B*RbLHFjMKmv&~}uZgPS+Y@=Z1l7X~gSoJg*F*YtUV?>*5N+$gmF-U9U(Cth!0B_%T(^k(&@K$L_M6d*=)4I zz~9O(`jL8Xl!R{Z>bGziScr}m1Ul%8#vab*o;PcE_B#ybRbW@#&J-@Z)(#~X0tO~c zfji6$&26bdA>a+qQML&vW9T>?@Dc?4;5)}K8OvdKgZufu3@@7ce=>L($}y^;egX`` zsEskKK{0)lQIe8(gyETKPFd#KC0LFrGU%FLU*|LWMYC!hkZBBCcyJM1<4MjThS%5d zy}|at|AWtdH+D`Q82T4{p50%>3MY7LlrSR{5OZC9&iLX(g09ESjG%WXO{e0;8#ius zZ*@*Zl^npDs{K`fIjLYAnd<&J2zT{`Z+i}f`wnN#hT<75JVA-+AMK6PXMCr9Mw~OQ zk6F1HPn|bKC`z8`hJNE57z4$7L;YaCG2FhJBMrM}oT%`{Nye9F)mP2_U>R=~f3own zC1|)29`1hXWO?@okCwOGD+3kIz7&t0wVEbZ3`GDxQL|sM-Pf$ z=GmT?&I8But{I%xhQ2v0f*MX486rD?(D$kj%AhoLj-MFS8#x}1={!5V-xwl!b*jUG z4c4^OMbl*DI|Wle0+IHW%PG_sp0=Os_6;i2GwIV zu=onD+&Twd^1->c8{y|-c+jPs*?6IQILz!#!|3|PZSTwOr*n)~Th~T( zt*s8Oz845_K3&T}8F?Olif)bFHQHYj534?f)6qFs3rq~gcVMUU^>tDazYMzelBQjxwLc5zvMp1?TpQP=B(jEZJ1aqJ<=WYt8q*ZY1dX+Ad>o9?AN4=Y&B~7uJbN^?g7K!Yg5L^iyr*Q~oUGIW_{rsD!s8|5<}VpTzYgx$H{}sB zr*!nX)lv1y>B0%9)Ai&x6%hXD7*1OJ)|h4&hPo20kT)4aHPZaBl|Sky*klSVB;m-0 z!l5nm93{FoNQO1^Z*gPrg%4ZBy?pOw!Cje)R?A6ACx;USns+{HAX7XUVjp?O**(4?A66W13kL|C&J`-<9GW_~%$wb;XkuIphBk*sI#*kYPMzmx z&YiNm5g`wYg3VVKTgL!741zC{7l@Z&g}sOuz!B1v<| z!7c&?-(d>|=q2iWyV`|~25vf9CgZq`66=Kvzs$=d~QIyYDC%XGNkFX=f>?reXs=MhhM7%&+)0 zu1tC0nc(2O1goi*(`h$l6OVLPQIw9$TsBp>^HQt-x^KVxEO02V$45Ukm#c4jP{o|a_hw0RvcHU>0+hRNZig$AOO;KN3 zj1xaHpX#tUfossyHMJ|FJO(YiZ53$m@7C7#?F>Q03bTTq4UvB|-|wUz2JX0$jI*4W zy%1lrDPHf|`mp)`VeKDvRLVgzh_-nT%Sj7udKd8puxb|%`u!l)9!?s^{*9d6`rX>u zpX``m_B0-{$?VPW#z1dpI}S2%_u8ELVGfK9YIi!N;Jh~R?TvIGo#iZ38}!~TbHTY4 z;GYz5Y{xSkAY~2g6WLS)xkWE<3QQ5E3ptNwjV4IzW;MbgAe?dF1RI?mv#U&}&GFl? z{yd)D*pDwcQR&~|#&pWIDZ!mGdg1V}HV;~uL}$^nPO{q1_)91pRR)x(wUKoH)j!&g zp%1o=0@jPh$0n>(w}RbxCK<4P zyX^5rHY#nH3a%6)_~=UY*_5ZO;3eH&^5MZ`%Uhtu`Rh8ma<(mtrl;BBK&X}UQhaB7 zCQh!|5x#}81=sJVC;10z)Xt*wqoy}sXp`h}u*piT!R~HB77HKkCjpniX<>LWk__vo zF+arr`2rP8h10fSy13H?*&RF)>WiTd9KaNSooe8GQ z8RN5GyHeWQ86-}eTEUs`PbfsL9Kh?n!zR)Rc7JHg*fExTa^5$m?Ib}XNDMe-la?3; zypGUJr3Fp*X4F6)jEDgb+L4MCF`&zAFA=`rM)s=4rXFXETWwr0mKm9;C&_8FmB?An zf?{Y#f?1q0(O37bwOvssm}UJ&;K2|)S~lfqS-Y{Rf224XM%S4dB5;j$yQze9J3~b< zf@YZ5Vv|V~_dS?fv=s~0b`Fc|Oe1JK;fKRmo3_?yzF~C&MGk!rRU&gs+wlsgXD^zF z0;6sUR2#uE#<2Ib$!Jne;O~nWt2!e*p&!n!)wQOLMU0yiJX|Dr(%-XsmT$z}QH_u|2_@5U|l$X9~9Q5B#-r5rQVu+k1e3!voGJ4jCZIdyEgd zhet}7!g3({Oeu$($TWk%gADUzI{Oa4pi8%=FoPkue9+HKuME-ZJHDQM7iVnxi$78z zt^*p`3981DTqe{a;^{MJC&hKlj3Ll;W6@S&I8o1p& z4^w#RTXCi=$!0wCh7Z5Iyz}Y%%Tv$KoNSQ)(meK)!S{UhxXjkQe^dLU_-WE)+I?mzmjhOc=Rq7=q_eFp3)OrYxm#yN?Wb$aFDe zTbz-up?msy=+3#3DKJ$B|LWpgM2X9W*sY+Od&bw@y9Of+RzZd7(Mo)VSGt$1)0HuE zzsFMrcsud&absMm9WXHhxQ*Y+*_jTDr(}%qt}KGR+ssUe!v#IN)j7%R;(rC_vcyhc zIIZ0{Ao$Y>@z`!SvzMb4t&@4GkIA^yJN>wwQlf`UQD1K)J~ed4-}vZQ*^vpP!UKoJ z{cs!tYQqNB=#&H0^~wwIo4RLuf_kRMtdv%=0n;QDP?+lg72L|M>;=3CiL! z6}E^T}HiB&h_|%dx1`TpnWYyLWsC` zKFjt&^lU?e7=0#S14oz5i5n?`z|MH5Btkgj28Z0XwZ;p-Mu3nCF3d1B50rFm_yQAi zK31mfg6^$}lz7bUP4HrPIN>ZQ8V08)rt7K^I0o+(W^PQja^b*P3CL88Vh;wwxd$fW z3tyPS7}brK7QSgS>6rLDyzb?A*;ZjF25${+;6!ZUOTxu?<2oLJX*Hg-I@W4V2MoA}l(|5|%m`RN~E}qKWHUZZD{d?8dMSG6NOp(PK zZ-420`L)m7`z3e&))7UYe1|XlQ2e|1^78(7cPv?B=k$;(FjC02BSCD=G?`-r*HxpY zOxJ1N(E;Im=o6M1m~rkSP%ct5Nj}RC(hpN37k&iIgW6vEm_8Jo;XT1xx`E>Ed;EzW z@IMaAs$}BTrjI(ymcikugLeX-Ufn~l$hcjm8_3jI*V!&+R_*qknHzujMO~S(O-7*r zYUtW`0{yMBp)y;7@JHDMr5(4E6JTFEzDzNLHK!Hjco_rT9B?bDyVhVPQ0hjKFbiYS zw;VQ8Yljb-y31g4Qkk;Z9iXgn;3U=&szIqibsXD9&WL)qu>l!IHb(v69tW%I=nKxr zs>|u`;EV6lN@Wq(717j%U=Ys(4{y?)WX<3vAWvt_>f>aQ4dIZYZP=cSI{BTgNYbtB zf+t&H!G;GNN#D?g?ChE$D?@+9Q*a2^2y7t_x=khvEqZbqBEdKqN+~P?$fFO=)p>J6 z@6wSO_Vm9IZiK7L9D*D13)wuX9N;Wx#w>s`1rB&@Uhtlin0*Pl$P}#`dstlq-Eg|v zyp`Y2IE2xXT*EC~u)*s-hxABoM^hTwW2Wu=J;>!6kv6&S)To5W3Sf;1L~3z**JWGIE@e;cgRohAGTK|8arWw zeM4WX`wv>h`*JnSW=dz4px@V6EjR;|BWx!K=NfMp+#e2qO8{79pA%_KK{{h}QLv!b zB#I~k@;&@XdxYcK<4egNszsdX>k=_B-DE9mGiPwp^i@dT}Qw=oC5O@tsa1@W6IC`w*?A78OI|;c|eL3H0FnN`@y~PxEjD*A5O;` zzxtWcqU0z-U-=ApPC#*tZ>DW<`+lAcN`ba4*k(?Q_9#V$Zk)(o8T5V}<7?WR;-I`_ z*)UT7t%^C=w2jv56XVC+2norc>bHr6AhplNT5AI<78xblW%@@P*ISvl*Xo|j;EYSA zZ$fWeqBPfGFzpjWI2%2m5Ub;nB0ejEG)Bq4aa{Bo{Bv#0im}uwiuCfVQpmN?IN=c6 z^86SHeHcH`Mj`Y*2zx?N!q|N$gtcoui7(@WwCl9@iYvT0&K?*_`Huq_tb|RZwzGSf zQdduS#fZjNd*k52UHF;58pdm!1gA;>Y$7FKb&o7!I%kY=U8dCHy`eEjyl0>B!8kUx z<&Q!n5K(>F7^NP-oY5ri>i!fmw;`dJHe!R+U7 zN~xuKM~S<>YtVC|(kpn-EsZfal(iGFS(VvM&@gzO2H~iNBhA1=$@*S<#^t@BZH!hx z4S)ANWvvWivb-+pJ~9h8+eQ3``tN(6;S4_3Xnt*b3>7-2d}MFbjcuE$#w?`7z#k*ZMn^wGugcp1O)z`{jA;m63eQ2VP$8H>LCJQ}KHaEdDW0JVhVT6%%j`4MRp_q+`e|+Q2CuK5Jga zcO1TvzpivO6ru^ok}ewElg=fZQ*&8cQFhr1FWaUNyMb)uYuEULfSuivP_fMIJRq9PW&4QNhGd6uFf_JT;UDn%oRvDT$7POlBvVSMO0?$zn znrxn}S?17th7@iZKjS-&31jAQ1-FGl_;iAp`jE}$Dv+QFrd--*3lVKaL>Gkt- zG(6OO^rG3NIk~5)$nm*mTx6`-5b|!S63+y;2I#o4Gr`O;@c?!}iN8FnPK@l&HctIM zQZ=A83f=1HYR6i^haf8junirW?DFS=p;eYUV4KQ&t@Gp6EnCK zSmjx*f&QB4!E3wet`RxCX5XzLP>pcvjC$3+pZ44)@2T>lV^z%#uG zaaUu-43$JQ&c3XbF01u*{2Wt=<8p#mWJcLqJw(|dG?>Pj>OI9goG>`!D9HdNutf=! zhA2RU?jljpKs;lQQ7PA=!&(`_!UIo#952KJOAgd!&+UkE9DN>TT&)_sjDbv-sI7F= zkE!OP?jL1ao7W1-xUPjdk`3-w#~05Ke#!wR!&h2oPX@I;)8K9vpfu*qHb{1_NO9nA ztVG{xJPzVaMaHxglkuv*v03WzP7WPGi{T7WR&*3YZCP2jS;jfaHQSui=r3Upoalu? zgB;U_;~MBCL96Z9Wq5MUfYj&k#>$hk>bw3Z6=R;P2pWa&Nrh{v>qXhJ$^^lYI5y)p zy#sd?fOf`EN6Y!n;NiFz(*Yi%cqz=_R)TPp@oMBVUNCJ`3pH8K+SKP{(8fsQ0Cw#` zzi%d24kXv&IQ3lzZ>{jDop4Zlj0&YkmSmY{bMJ7V|6W!HHYb+S7ihuHOv6%oWh@oB z&$TnYevFT11by~BJq!Z!=X-Pq>ouM6pnk~fx@T2z$6un&DR1a{G#lA(tnejkLP?sE zJZgd2@p1cnB?4CJ`P(TI{l<@U4qilfz)QrG#_V%hDbe?hs*bk4+__PCiI8^yEhM zS7eJkuk=HIpEI24g3Syx{$boX3$sl~b%S_&D6UET9N$cqs<)G+t?xM-y3Z$0&Y%XDkfnz?ROlX|-uRB_x6z zc1Xquq+J>RRWg%)co08LZCg%gDcIVxXv3^evi!osYQ?se$DfeU;0T>9ckbL?ZnwqA zNx>x@a$YHf{T1nwo$OC5AtP0~E{L2#Y=rwcMx5)}Z6bLYC$H-qS;ui&flofNbAPLuaSW z;9S?H&WueZ6|inYaZd4LZFsFl@wj?KdPU-76CB}lbvo&0G~&mUG0nMCj|-22JFrb@ zPpt|nj!VL&sB6DIq07nm;_uali*digqH;Clel!iXu>`X}C_s7AL znOU8nprSy)hYEEfoek;x6($o_-aU_b!~A={gTo_GXlOhV!y_+=t*yQ=z1pA}2_}pH z06+jqL_t)Bkr+wSQsWiZE=C#U3}%Qdcdj^jHg8P%C``S$5Mgv(gi}Ldk2ZaK=x5#b zV|Ad05{*m5MDcK52aXtI3WZZbtAXZttT0gkH;RNPA;$c?B76=vMXwtQML&~8CFBuT zq;!(vw6Bn8&)A0s5uM|<&ftcpN{&tCb1Dax8XU!=;ijx+KdES5aB$Jp#=@%aF+wi$Li&W7hUKeeezU(RvEI>uK=QedLB0W;5Io ze%#qthfTwxt(A{tlXGy|4@Zq<@Tkw)w>mnLsFhJfxJwPpdgLL6L|o!Me1T0yQFVRf zaKAk(DKUlq_OmqA2tQ=j4g>e^-%sHt>(MApwLJ0cqvahRKWw!x1i#8hGO@hpJg` zF=W^n4Kk_jdW=DMM%A6N0Gxhh5{$gxEM%MWvy&G!YIFzM(5H;#Omju+DZxly)*xsN z($=6DAJPeQV9?esV#NwW-#KZg@d@1Nw5=3}z;KR2Yz*3vfuYwpRCt>{pVMJv|0mfT zoYMv|PByxZ{mFCiPNtcIEXAjg6V`u8&9zL_4`t7aYG zvPCzd%WQWOj&>`rILd)A<9tJ16n$90OhtrMPfs-jYiFfFR)t++*s_)F`Itis#M!%AM zc%Qmn^oVA7?xOMYXUv2&Y^G_RHfI-5s&}0|_~I9KWex0d;NUCTbD-z+kZ$%n=Zh|D zIHNBoQzwweZ=S&uS%&}VV7nxY9ZQ}#Xs!`_JnGb!hw;mPa2VHS$p*8Ont;nSv#hVi z9i3`6{MLNG!Qsed_>mw1Wf45Q4(NsLKkw&+H}tF~gxs>l8?!zilSSq&qVnqhAA+T^5Cic^13KV#G| zPtPsRDK5Zk{bnptrSXKs2HzVNE5byK1bl=JQQTWEu4m9VIirw5?i8fP90WyL#ND!B37z_ZZJ!jQ`T} z_om;8fchREj?+^w+T{$*O29S?Rup@7z>vkO(Ux%~ZnD2!r!X2||HtW#0}WTlinARJYKMSM7O&qp%4-xIoocUtBMWe> zuFML?N845)COch^=5yUJ1A46nL)|D@Ge)Wlele}%?o4~g5a4Z7c;`8Ql%wAy5%B`2 zgrT<$1{iGGt3Qg4@qQ(H9eDV3c%c5)?T>;>gI#aTuM7gbUC+6m#RQdI%u39@U#BX_ zb(9D$S%)$5DGhD+!*XzV(LQ|lmM88Z(5rmhzP&8p^i9k12mZja{LbGQlI!cm7ne3o zT%E$-`dhQkMeQ8G@BZ#(`Ky2R7wrV@WQgAM{OR)SCmt;ye$u{dNM0rhy$0_L)fJyp zr{Qa4*((JbZ{mfs_z%1E<;ri=V01E7Su$h-L5uAucNr$r?arH4Fpd}3dOZ4x?D!_f zfpYJ&{luK|WBV3+rOrnE0m?uo9KnE(hfC*wx{OXT9si)3BsINvZktMr#)xPTMmLKw_2qxuNSA9^Kz63wzpD6%XhjI*MMZL2c8GqYG+ZA2Xit zZQOW58!|!0Fj=m693FP6bIg}pHVPUzriVG6Y8PeVWD6n4s!m&Bm`O2hHoVG6;YaDn zq*wowc?y?(osJ2gIcRi?)y8=(1v_0YyLTK7qnE7g?rgks|C3zYg_lOFY7JAIgo=qfN6`!(F;1kHU`!>gWotLduQbGQ3U>7JDk zfd72(wKIM68wb;Do6}1|d*jS*1```UICohXUJB%bi&dXa z7PT##BoFAZZDnKz7;^Eh@+N_qZY7e?553tUGGW}SF2EaPud&uQ+dZq=`#jfmj{w94 z>n7B6C}#|h_6R5$*8OHSwt|ffVf)dNOxW56^R0Rs;n(*96brsAdRk?)(w&LITp^o$ zu{_q81xH85QFpSe5*%e(EA($=*2U#vQ;YewbsBo=hnFr3P^Tf~W=dlk$N`jHu_x5j z69B_aJuNAh_P1(~shnw3gNT7da|6wToLZdysErLhijL}7F8urDHr z6#hDur0>;vvsAlZ=QAeZQO_o|^KI?Kz@jHxGXNK3i&7@N3YeaZB7uNlkA8mTxsugo zecAn^%t9c9BmTx@A!|oAwF@ZT$r9BW0i3N?!f8Vv;dal|+%(Ra5{U3K_WCzWPsfpo zwybK!z;jUi;K1($IR*%ABkZ+(-#sn4KW*1r84FXple%wP3EL<*7Z8m^44fb7e~OHw zIa7=E{h+Bc*(J^oWdZ?1-*mHa>zCrg;Gz@-xs#1ZNvTy7rDF2gw-JvTXN+h3>U#(# zZLpaAc z>pQB&i<9Z_Q9q4awg+60jNYEwHtjGOns92R7`%)F>}};1 zqkt7YqpNx+e8dPR&EXtPug2f|)1Co8?Z`;X!l8`&WN5G8W2{W=$XpCh8b|PwO*V5D znxr%s2HoHb874C1JL9K>8Hk24^fxYw3;)CkJyT3@JYvYG)j^s9FH@iw$rn1v%ui;l zYk}?xWS&iO!w+XwJCsa6jWJ-{DXHC}-g;baf9h~~qJ1mE(O)iL~`9|~Ade*VXPb+&KG34FfS zL%JrK!i80@w~De&X)4sV*n)x|1IW>d?~Qv(AU0&YT_Z>-i-d>!%%S11Pj;H)GqVu! zMsjG|t9$obMIDH<*hJes&#RrB)tiJbcqnxL*5ENZldH-4`XyM?L$YVG9{T6>yi&W^ zSQt{XIWo90M!Xu2N5}2P*WHt$tM%?%vsz#~jnAAAwO_WHZov0@3~sb`4+DuYcgxz` ze|Uekw-^IS#(KC$Ai#dyXiEDc<1{-5kSSB#-D`|9^AcW;$i-|~k!YkJa41+g8D^j? zZm`gA@H74A5an11r)+OzF%>0pl0md>$6mo*9W3WL5T+%!bG~isQ}4ALUV{@p$r(D; zRR%SuJg1NIZ+nitW+Y~MHK*0I^lo*ve6WhTlS4Y29xdu3Q@*dwYnHRPQATiNF=Ic@ zLKl%!c%DTtjp?!l0plPvPIg5KlmlZyBi`b0%-*rl&=fS@TZ7ZUz$-Z{_M4k2)NHz$ z3foF?h>VsVpE8kn0*C@s*=^hP43@_pAZ0o`oN<~BMpl{q;mmNtCTS4u@tgKIwlZVg zG&G^;g>3FB7-S)J#`-*tjMx>d%Q^UdiN7+Y;_&&J{11_+<*3)!US?{yCF?qypg zwXMq>2^+-xl!H#~*vRp#$;MkBX-&bPvx31`7ldkL#P9pv%5MH>mV*nam4VZYNb#5e;5TM`egh(I8A^U#PxoAfLsYU#OFCf zV1t!`Q0y26r!j`ea};5MBz3Fp$u`vwc%)Vta^AP!P-5BG%E z1chPEP!uUyH7c7z$Xy376u_D(s!x3<3<&Q*U zGpNWRF6$#gbDkk5Prs%|8J%?LFrO8AV6b!fwG%i_O*kBfFo#M8?4WFsd&j#7&uau9 zgNLiV>KG7!((d0HC8zig6z&G+TsyQ|vmrBHc&{B%E~UNV+BjE(siZ1Rn{u)BPkXHO zdFasB_(H!7!6=Au%b-}TSvl|(PE-7xr2b~XO!&nQd?H z+M^T0XsemEzOX1Yy20C~;(pG+6-`haFHY1O(c#Y&KS4F6Ys%FgiGIgJji`Iqap5Zl zYItiXzVf07Po@E0hySC?1Q>lm<|YGFU%v%5B|Yr`D1@E-oW%(n2WLf^fKUkJ$p7}*}X79Dvy>z;~?zxlY!>{Y8ss6Mp z@`nua**C)n}|+t73Sd0an5Q_fKE9~JB?v$k`Si0S3O~W zKKK@FOrR1R9M#b|dZ}-jrmgIY*w(gU`kg>1IoHlm*ns*sPFNSNHD1vqr;&`0j;gKE zZC5m^nc)$E4}O@eS>KVpIaLS^g4YVn39R9xvC)MiUo34ny`T)E*;e&FV?(07El0rP zNvEOCnl(;W)V|s-xH4NZIIIm$?&1Bzk<&H1SR2uDtpQtg!|2OsFhSc@`-q7~_%mva zj+%|FIT7(I-ZCam=49R)Bc8bS1)QJ)r!$q>d$i^d`JIC#W4Bk^&VIfq^T(M+7u`1y z{|675%E4)@Uf~HZrZQ{i3Xg0~i$WxvuI=jBG=W3cj*n5_Q-ht;&vugqd4~T5yij!#lTL4R2E>^$QU+SX z{mbiKYiCZnuU|(&Ff*MP(Eq+c*qbcN{MV_V+JVgFM2~PP64wv znJ6F-qCP{qCxr?gnI+6R*_JMmUIr^+8YS$z46oF+LSoHRG;>z3KBn2c>M00KIC75E zR|NJj5y6=3VQr4{2iTyo-<~n9D=H~Umq=O8)o;n zhG{ry;F<_Z#;qDpjA{C3&M54{{F`xH9WS$2)G`snIR8}3G%-rdRtrZlye%d0#wZf} zRFuiV!j#2q8A3F|FRRhQZ@mpo8I8tBc;^dO)X#Oaqc4iTCd2LOc*!DP6b;H0P*9vY zD>EmOh2S0p!oAv`DJxNLf@`YDYE}ZP|8a)AuU|AV4%gtn-S~iUTa|teZEf$@?#;%v z8(vIbsm+_kHubaCQ}rEMkMa#yW32VFMxkm3xepeSOkGv2kFp}8{W3;cMBWo`7&|3z zA@U{%-BfU>LsQCdlmh(qq+|vk86s4oD2yL%Ej}T)XN`dzpaXf;--heG#!HB3N|TI| zUsId#Xgq{8eGANH4Q`H;V(&PaG_^i^9cKT;C#r#bwU7E=-uvEV`L=JXNU!^U*S@OWc9YpBpKH-dG9#e188cmhZ-)mBFgelP zx}j}y-XG^8(oHSeY)?_I9D#}AM~6hB0<}9&KDO+2;QMjyV(BS(hp^;~F0gkWrw46E zlKP3^LyyT^M1wWpXurIIHrYrzlm=C|DS#&TXi5&WGDc-|2&X@JD9h}Z2c2Cl@RB{k zFKW01a#>8R>dLJfbAWt5q!*Ui)rPKKw6|%ktu~C$)^oQ=`hEp)xk(34FP>^A` z9{tdL0@jmwxhTc)pV4dwnukj@IGWK+MU2H}TJWIJWZIFR)AdD9Cv z(6@QK8bLLC`eP$z1L*q4nq+nyuiBtLl*~*&;ZGuh{n5uvMF%%I4$#1%UkiZi%k(VW z0biV`GucQwH$07VUIS+O*isIL5}MhjrfbJb!K3NYSy17g;5ZIvM@pFDy_>ghO>N{j zpV=Dz(x_Ol#p?iE7j8zobPQBkBtceW%f|5u#zA&{p&h@$I96>O9pM%}jIAs2l?*bP zRR(8srkSzXsQrF0C)|Ff>A~()Z_k;v{(+71+AwM!y}`r(&_4)zAIugM(XD299zM+1 zVUWO6zuU7itk6KgdAVUW#CO5a5KpaV@V`Ln+f2 zLBiKX$|Y%OdLu6Ta?Wl_x7B|kV_EKmhkoBk$&8=2d@8y}lgAst+ z#un3U+`7|y(`LaF{x&+f;IfT(-mxc}U8@8cg^j$U|XIlKSiPQdtB440y%2JLf4r1D9oNJ1KGwE8<&0b754nboe2$*~C+Q}T|j(rJwbfsWL=?q6wLSl!R zr*1O|HU%kDhi{z9AX~TJ3a;IhjX!)ghAKYh)X6O1^PLuQ5O$}`;Gb6_J%-U=-w`}~ z1AWGKy(yoaY)Fx^`)hZjNc-8H_b$(GzkB)c&DSmWZoaW8_&2nx z{o~8Y=6=&sH(Kd;YjAdvu{n+o%bNrEb3F{`4WH|RU*vChKgV^I(tXCqXZzlItJhuK z5nIoLmhyP)>e zOO~(rieLzcpZmFG`5S*@bp$_CE1zs7$KU!}%kqc*P=#sX{yp#cOjmu@?{;$(o_yhC zxpR2AJUcbTG6ori47okj@CcPRflRG1*7zY->^0ris|)Cm9r4nlgiMQp2K!H;xVbwo|gZhYBe%gNg!%o{rr@Qt^ZM`b1-cChPq3fF)7J!!?|7qcX%k<3mVZEL)Iu;-^g zZsp*zQ8eMhrh7NjKbI{sT3+tzm#R(s_`~JmnfuFeNBtdqGW}Ra$Q0(obmje=Puthf z*@8Ppau(U7560$XpUC#;q73h3SfZ^UiE|F@BUv8MEZP;^XWHW)t9fHpZ-0@_-xEkiSPgC(PIDQ!=Lso zozw)`D-R6)*&d&x`ebLLMRU>-G3$*D8!~sg(Z&7j&I`-!lNXmK?|mX|{&UM?TOU~N z?4*Z=R&|6XsQ~ogA32Iq0%NbOmn@(N&NyjpEc1&p2ROmWS-I)6td_{*#+-B6zyO=l6S0mH76K@~ST$&d-3Bo;_&$ry z#&8mr{`pazi2*nEkkFUCow|d7g{b~@PXpm3C8Q7xM*f3T?jWsx4GKaJilpCm^!W0L z=eCz;k9L=L@81d`?Me1eeln1La?Se5CzQVQWkyc!A8T_IZS_aa`p5Z56rMV~Z1r%$VV_%m?MsAjZKPN27r-5-`JYp3F+Z zc%HI|5WJT8t)F|qS2dNb_8SMfKBt(uUxI8E;@S|wo+sei+Y~_$qvhOiM*D7%S09s6 zy8mFg_cy+KdGlkpJHjVtss7OZBHZqVkGqXQlz4nte6;<}<>`}8IUQ-)y^~PXE(Q`b zWZh?+R>!HyP`ort-uvx3(?r(ML=-FgBVs{xQO#~!VHmHB+9;{|tc0&11!~k&||?XJuWPXrJLbBPvs%=5oyn#|xsd6ys$@>Cj<&18$$7Kz3nPwgt{s z3YYV3x@EE@c(6Y>^NNnf%qYk_fc3%dJC>im{cXz!558%6X6LI@7vbC^U*mH=y8mDH z$MNMa7>J{#dz^iC^f)YaE7SwuyX^i z1{40I)6^M%>hxDHKlSL}Sbpl>H!eT_=+~zUuk_bHhr`eOaiIUqKmAMb?JwxBW%+E; z@H)`#jpOA_dq1(fZ{x?8e{JvYE|2eh=*rGV%lO6ddHd;)8=Y`NXCNi)@t<~DRk>f{ zh3-(N&oY{AlZCfMo+A}kJ6ez!Est{MP4!E>vFQ%Jz>js4?&#)tWBij|Igo2Ddb$PA zrEFw{)$7YbnzdoWoo2S}2TUl%Za=c4K2u_*vSganv)InVd5xxq8AOf-r*SrJtnYE& zVoIanBwBKBv{JUSEWFNaMmyeWQ-_eDUT?fnOdmi~m|t6KCa>!=%2S)<_u$~3#@cvz z2F>u7P#J|eDc+)|x1HTx-tod?%dNsraJ-A-^hEt$)z@5#9{VGBmu0^oa;5>h_RDJj zUw`uP5w=GTqfWp^O9#^?M=FPeCo%O2N9}7Qk}R5=6BcqJH*&yMhcLl~^bn2OuD|eG z<3X%M)PFOk)p@C1*L681qaD+5T`-Q2;@-0sX3R7NB0~V>(6v@vnf6c1e-ENzm_iWwm?97AZ zycL@-hl5XMyqGg?QsZ!^d~;g|KQ%Kn-7Zpg|6~+{S(b68HRpHPzctNWH-m4Eqf|Gz&`(_l z3Cv&n(N|{G02dk57G$v_m>;c|2K;H<~+H7l^#dUbmVi*?&1j{Q4UO z#hr=T6xL+ehOtOWIwT#(NZWwe`N#O2Y|>$v56@BRQ#_s|jLu6BkQX}UVT%+F3OFhK zl;N^`^E;ONzvnBL7vA;cKL>5R``Y7GW56+-C+~e?d7?O(oZ{LHh<#SedQS^oaV zM}OD`OQHeQW-3<}F4_sQPn*SdGYY2 zbeCyV#;*&y@n+d^t5ofsJBf*OsArPc6Ust$$_tx+nime$V|DG~O>M!D+K_vE)oT z%&~y%twR&6%sw#}Jv^9GA3c?k+<&nd$w#gJ%|S$eeuc8LDcMT5Nt&#Dkz)q^Eu zAu9%6SI#DI9F*XbO{802Db6-f7dEAmMyMo_N?&COhkCjw56}GRCDMboo6b5)J z%I?c*MTj4-DPbz>OR9foX40sbns_&m8|Q{Qs?gs z$8W3l@I!AuTAqDet!UZa81khDYjLfWf^*~&ud9~OT8-MV!sM84JLPCAfTFT49vQ#p@S*md?`Oe|MIYS{zdyC{Tb94Q_wO$+F2AZ?UVD6@7`V~qxNmy+ z%oldM4W7ThspB91;dR63GWMVK!TI~TuUmh1-TUAFSug!;KUmmytMU+XP?*$Aa(i+X z2%om<)2iF^lr-X%{=!czxBvbN$-5Z~x|<$bZPVy!`k_Ch z82!l(v}Ye(w$<`q=bNXXCexckR1((9wsI8yDFY*&8;*8O2s8v!}-;A1<>C zS%Y{Zry%>Xmu)<)PsL}O0*d;jiSbAmEw^spsSYr^`r^x1ZN_6W8&-B&hADXN;q{|d zmfo#YfD!DWX8R`|{;uV(-~UgS=g;15j={C-?r;&#a&K`UQJ0&n{)XYSPbzv7OV zh$%d2ADpeG5;vM7p2ZC@{H4v1OF3_CHLaO5xN%Y1Jto_(D0ONNGWeV_j!zfPVAWvl z4uAnhX{JbRWid4~UGJRXNpB{6CmHq%=rZP3Ber3uD(mJ16_?uksxjm(H%J2waR)u0 zytuWz>*G0o&G$oq$V~Q<=n%ASu9#hnwmO%lQaL^x)}*Sx?kf5=eMm^Bm@+U3eJ>$2 z6%dS5>l1EL6XPs_NrY%iXJ-0Sam}hskEf z{W!2H&X*CZv$g-Gu{qETmiwp9t#M6FW6DWp5kQp`F7N!O2g~bkpDzFR8>^wru)p+T zN83d2J5RNVakRYeY~OGS7MldyYuT{oR9X|VoH4|?y&vvip z=X#hbwpGlxe(Re3d-~~R`G^1TbKUV7f7^(nk_V`j`;QV#_%lUuujmxKg?!{&AfBU&*`?-593J^GEFCr*AWftQyedBW$Xzam_ zHtv<}JxxcP_uFN&S&{r|#v>-F35x_S(ql8jQsBy{pPyAy)2p1{UUtt0&r?RVcdPdO zUX51S$O(kw4?Lw@XQ#dY&T<5flr9zA+#c|70c7&t}8oiQ+D?<{m}x0j8?DaY@_`~+YO!O2k{%6NgP*2<2DM%Z`rBCk|)PG{@c|H=RVH1 zc6Mz!Z=u#<$4G9rv;LVySlK^z?6}%jGjBI~ziZ)Uy2$y%j!S%a)aLxd@SG1yDT8af z08?;QV~Rl3vv3}`jpJ-&u*b1sX`5-8Ipw?#1L9SRd`$`4JBo+vcTo;wOINCKv5g6- zVQgoShik}RO`7ZG#e!?{;$As)oPivJS&`Sp?>K#GdC#-e_Vv5_#>;MyTU!ZtQCiK_ zM-h2Wn0~b4!J*YoSglP1D2fYK+Yf*_PzLE%FL_*V8zRRf^~$9fXDa71luWj*|5Nli zskJR*q<_n|Wt=9$-8)f7T_gp_XS9?n?rYkRaq zaOq3ia0_TrB|OQv>Z>kiEUQzSb00(4R5EXUXfW9@I&1oAY`w12*UxC_4CB zm&LE?XFzch_g~&xzWUzX<>}XLEk9MAC<^OORv2ttW(zqk(^^|OSAi5QJn_WpltcDR z%XadN!?6VsrtTEROCriVu3O|Zwz)6fs*k~KzoWtMP)_IE+h=Xc;&sRBWTQC;b}-a` zJ-{(hdWeEsnNUvmB{;*y-@E-C%m04+k7wHB)z=vv;T61DqT*QGOX2y!-Gsy=yuB{RI|Ndhxj+dF{6^6$Vb;_4x9^@A{hM zbwBj%ULuC7b>a>^q*ibion^o1>zOI*d%R(W#J$&9WZS77l@y@sci55kdNtd2YfcX- z*gkqV8BCKO!hH#f|MTAOU%u~|@0x^4tpe$_$1gDkK63oE%YXCq_bo%G$0UY?V4eEBq})J7^l$-sOC&S{eSE7038A{?Io6 z<+>coRoA?vZM--8gvOBD>*~q6l99uRWkl3X*=l7g&nne78NS(=xkyC=6kEBr40GFw zv}*OJw6pZ%nhDIA$xmT~F>^P}dk&nvnG90)#e#t;e$H{U%CnEtwhW#rRQv02NKMJg zMA?9qK|d;b`VD#5U-l?vAH2?(lyy{VH~n*z`Wr`x1CRnPxie1N1!p99rjD*x)277H z9Wq}W7VynhA0bB(@T6?rvks}g$^sIz2u1O`-WcbQbw(itFh$0-YR@QJYs^x3xJ*;X z4o;m$X@!fNHfQ=O2z6?Pv07j<1tJ zlgm%u{Pt<*wg0|&7>HxaV3axgVn5=|ITQFd{ibF4!+&^LzU5n1r|&QR#bx{BeWniE5tcW$o%NhfGv%L-+N#85wt1qmvjLpG+fC=1$~){yU(SgU=_QNl zBtGavPj!hK1sPV6vjM9<4y1U{YGOyD?RL(vxwQw!t$Z%Sd|pQBfBD#dx%~Kxzv~LA zukqI}A9rPsn>qbUPydI@(=Wbr`Q4BG@$75%rkS$C<96ndfXWY;#fkxG5uz=%CSjI7 zu^%tfDM2yGx9qv?l9b+={^t~4#;Z1epW_kZ3ug<{Pgbl;UP-Rl!p%c1vW>x;$IV`5 zW7*Ml+ZQf`n=_965*x;VoSd$Te-u00ss2Vxc~HIJQR!vbnf;a(?`^g~r1_4A&0S;O zRX`kH!=Q^)D8hDoFY+DdpwDxxNeY z77~-pq1`z!GH;wd9{VUH3ZikIH|=W+1JNhuKsRH8D_{D)Mv4sK0X;dkzu>U?-t`>5 z>*&Fl956jQ>1(qwjRV!|FkwwnU=Fqh3%IWPd-KulW&efU<>&8Iz&eRlOv)Kt@iw)D zDMjDmC;M~VYA-?#;2@1t7)+z|nl3T!*%oFP5dQ1CF%lLVs@mTQK3Cz8%@sZ2*MOpT@oa}Y@hXYE#r9aDGf7Ac8eDLPCG}6}|Uu+DJk2Cu;#yelM zhgH6|hxr}9W8EbBUGG}Y0RBsVX<7cm(A>vWpgQY-$X_sBgS_3XcyQvB#2ecy8LD_`BJ0762o`as17y;0uB0WL46QboaXOBmRirQ+GrE-li|T z7rtj<*@Ivdbk5$pyJj`=2P}e9AJ}zsf8Wt*)VtNjwhobqxt|J~4!YhjVo!LcKpVKkUUa1pciIU)p@z-~#e^%%th&bc})`OUOt z-+>QaroOOtjcGD)y{C+1W5+?%r;KD^US~NuvTBgDv*N_cv(*vgxUNp;YRK@61r%V_ z$o2L%rXL3X!NKvxNV9hl#}kgD2jeDM=~GV%t2(LsyUVZs`J2o8-)=v{@Dp4!t-39$ zw&zh<5*gX>Ws~5W71paW<&aZ^rr3;+)wN3UMg`F~I)ZT8h<-4R4{jHD+}Lfuui!gt zhg659&v}X6@7SbKvW&G+T=7O6GGm&pUJ|Bp9;21Q{hAFATgzX6^1od^xc|*v_uAu2 zfdS6nz1=&@>k5kgg&%m<_Abr^{=L6@DE@yt%YlY!9z@zY5K{(VD>Cl7&wp9AqctMBMS*_u!M(OEJtU;Z7;v9A%H+(Z`_Y_E zyxstuU7_(gZ)^i?Ne9o?Q!$Eb>1uZ9sJ_&MIk#IW&b#B4NanqQTyc0r9 z-+-IrAk3i9Co z_VQ)V>@Od9OE}_$1=B`M>uw6`tWM^%gPZ}*^o*~*y0xd3-%154u5QKh)^Ta@c8uqQ zUX;z{@NMSs-AFhnL)#nF!2AxlhEN;zSz8=qU2lH+MmMPGJxa2M_bp}^!$eo z{`2LU)X;t2k`SOclt<*$9T5uFXE1Ca_2=Tmfv-IV1OMcuZ&<$P>Hlo` z1Mm4S#=!C~*w)Ngd{I&?x|?OSFQl14-%0+QWdBcFkY?{b+YHVAf!Qv!&%|bI+s&ol zZZ!Ll`srg%W7$Lr5Sz(!7}wG}_A-L>gDK)X6w!(;JnFoUj<#A4FOS(VS_Xc0JCB)7 z&z+v+*jTX?pp=8tDXS|Gb~+xg0;v z3j{pX)Z(4z9T}G1ZM3G6IVm#^u0`J`IakVfeA{v6#_{2R)G)D_g%Baik!UxXmgZ;> zs;Rldslh2Tx!p4AQT$D9hyHN{rzS4JC3K(ucqI!^AB1?{DxMsQ$p!|$tSbDj3piGs zty2k6X&_sjB<)6$nXaC?A?ruC0&$8QdmR|v1q zC-1eL#e?nTqfZ^iWQ`9#yH7i{oI@N>r5KHg^E&{BD^aqx=D3~|oD8P^BX(DIS+p@m zjyMNl-K>HxMv{EP88 zFQaq+MiF;>CUZ^~mBg-SIzAG-qz^}V#Kh#2+~F?YPv$75wvb7g%>Cc^*5$!BsQJV3 zuRVUHW8n0g-nu;h?BR0v$38atEK5Uyu7NuHke;GL9OZX5Ge+r?q3x=R1oCw28i2~w zWoN1;TPT30yE%nU1aU;$L-qvERX)S!{MgIi zvHaA-UqLm?!GG2U{FBlm6usR#7%cvhkv`PTApl6XSs)i0f5kk0{FDFY^444bc=@K+ zfA7qqv3Ya}dvD5ivc>9;2Zh<|_)RkCxYI@0L??PUf)D?}s^ktdD~*zb!EfULPV%Gg z)e^=x+wJx;e#qEPd^j^|F=i`oW%nG7cF%@95i^2 zY11!F`M%*3>k(`=4p#7pp@Jl#5J|0~w-(4Y_y*09BN#IUI#@JKoIsXUnv7J)GF`2q z)0xiAk?QwV*g{NYwQifwagt3tr_<2PX&}gxb`J&mA?S|G!Imgpqzbi&R>E3=E zcqbE>LpyN&KkU5;fMr)z@4c(;TvKML|>s z(eL>^2F2miC;Ida;^&h@jGzHj6p>Mxd58!?o|plWkfDbbhR zlGN$Gb~@`Ss}=}xxQ>9EaRgJkA~~RC`S$V%&HXtkCm?p-!#`ozP5I z*y$25O1wf>YTsWvHGOLA=c8?8UOkTB2+R^t{LYEf54{FxEnRRyN^f{WN^=I5Og@6Qs|tX^87BXG}iACbmy+nI)LgAXE`i~*}UzzMwz{(=|M zc6ohhX}D()dwIFMNhV<3u~aBkAOc`GBAC+X=Y~;?&ZF zrUxF}VKS~yDq4;RO{NxF?atlPXQU6^_ojaSmGRYP3&jf_T~0s$>RMViF_dojKr6lX zgZQ=s#OU4;KiZg0>y4rGUkGn=;nDq5ZB2+@KNT>Na&tgYP)0i1i#TWh5W+sfd$)#=veaL>eZ% zjA7w)J5x?7=Usym%t=t8=4gZ+9mXQEcoz1Q6#zp*_Yf4t%2b4WXi{vXQnpX%lpFUY zWY6^zoW}$#v6^1O7c9-uaCa6FOhqtY%J851Oa1d=n-t2}bnj?@8hCIFL};S`6fFkB zm%xph9j+1#IGb1bO+J0(oQdl@;TB<1o=n{Q0xUs;poba*czG|(tag&CmYMs<;E@iT z5d+3)03iDuph`bK>b5TP6o=_Es1&exRsEi0nd=uY$vE-~L-7Z9X# zT4K~xL0x%VX*GSb&2vPz?^K9+#Kc1Z>SpL^T%U&=gxd6iP6=86zYhLmP2(v665aC1 zNri3K+^z3o(4u+htK$%w8|sZf;g&;Gje8^%+WNn?kA z&~toO8%#vGCr#={BhQF`(2>5)YNBCY&>+6l2zq^a9(c+5vEn^m$bHqhdT&LIfbKze z{>ZuM#9!Z%c}4K;%rgZ0F8(N?$RI3fnAk$zA(JWyTLo)z$eW}SdAJ%E<&HcnEFYNI zvYce%AP7WAs@Z{oLPL_0Rv6D!Xb2AA#PaignU?z(TYeQDtQ?>rE8tN7a^~s7>F;kC zO($*05u;u#SognBY7ao(#G|}>AnALEM4}*EFVAk_pS6}ubWC!bGlO< z$=VOR>^6G@Uw_M6((5mJX=KuMz(Y*qcDwe&MY-YAuZ)G$h)+}!1x$hqNee1zq$RDZ zj<)GOtiBimvRJs0+nLX~r=vcZL(?Z(jRgdPIBeB^+`~|Fp&&&qVI4ql z!rWMDv~h-{9_`?O_-K!nsx^vOZ-5I2#R2sG9KgWAi1d^{1@I7%_z4I`UfwVA_+ema zyV|LI-+K%wmn~C&yIBC99&_e3kA8H1rUA<{0FEYU)T9YW!!%1iAD5<4L7J$YZ1HW- zPm%|Uw=8-?{tT$BV~**{EGvFA#m)e@1gn#npK(k%NXsQ=)4}(oT(-ty!)vvt1gos0<`&>e3xe8A zXp9$QKIhhcjD-x)d{8IjlT9-A#r7CWQcxH(bVm(l?PNx+b^N0p|6IP3y?h@NWmwMY z=g5x1OqB&f>(5Vjj-N(F2YG1vb$5^FJumO```-5+8SqE5+6dvv;~QyeLJd6cIzi1R zr>A2zolS!LPvR_yh%%$?nlbt z0EyJ$1l99l%wP(0H9!jVuI@-0w*ZZr2nB~OcD& zNkHrBG~uL-ssdgMt*#`j7JZaKku_$ts=f6oQ&!68l$iP^ zsNxcERRn^3d^y}nf!5_Tlmit5FcH)-gULcze?M*2z5t?8lZV!c^y=V_-<$&?E6^k6 z9%T!ROyi3dag)d+(w*fK>Um~SEbm~E6zMn@kcRIeO|X98Yk(IAfY&u%%+PMq4hKoF zY!Yw?e;+b0w&B-$H#{tjF21E&?Ti9(~EwW?hsa zXrx~L$Dxo`dtGBCoRbirpJo8dBx{Uu1R&Qg%p}IV1XD_XSAMmfUpFn+QesHzA;`axCFr^buOzCT1OX*`DOGLuWpM8}Ct%KlVTf==N8@$)5v)$mS z6R8PbgbbMk!Oxf_>W)!`Px)?1le#dt(yYdWB_=n#hratgLt8O{-u#?%q1)n38?0gV z{J}B;_g{5ps(Ik1ec{HRd0Ccjh#UdgbkY6ruknys7miqO-PHYAC*Y~`7<H87lspFnb3TBTkW7t^}bq6fs-iMc8Hh-V%}Fv6^z^azQl}` z=2*vq*LflMH1I9P+x}~AtT8^}iw2`;0^WRZ;n&BvOd(38Jc?%#3gKE9a~X$w3ENH| zw{6U4q^8bnjAk4t-}VZW)f(0WqP9%N;rQ@vkjDUi%rf10T2SW`67UHOZJV=JL0yxy zF&1`_eyO1qXsW$4efSyDzPu7!{{%IVG9bp5a+m{$X?I4#^O-Py@+vjPwnfdMF{*0B zdmP(|DXcclRy8w>Q9Vq#4niy{0_3?WSO-|kx6j=&b-7m3v*QR+qs#>AAUnMcOue5(TdwM{@+W*Vm;l zZF*9A%6C4N*3E4_@T%S4*Dc;W#>cY{prK#(ckJAW6VRtq`rPOCmoo0_XEnL5mbPsi z<9&c&pk)b8T8ei8>f$Ymch<=K9X4$*5e(m1hVM))+=4D!m!6SY$2AV9&ecRKcLaQf zlaJq+)_(cEkPDJS_`t(gWHJh3o$uX7)yM@yXj@8vGv$#=3e!X|ak^N8PpWv3zne#m zgEGQ6vhr!=nY4wmBD6O(CaIRGTn(iI_rfg9g!db*E7I0^CPVPLm2?dAD*V|8XG80D z)#db&Ltgw}ugB+J0l~N&$g#Lr2bL>pOV{7jOwV{K)=Pyehh@G0BTUwaU%b+eEpr>w zm+rYNJ^qA`hBD0Y5mz9%7%Om=LYiUIa#hC)q9_!z_&c=F&eLJ zfWCiP)P~8ZTa|?wW7j~@BLKs4)@DJh5VXQy$e|f7v}S$y5e|lEPIPi5LpTx|#oDFl zB1)gBnlBd+M56=}5;Elp*1{)(7sQvs>*ldz_A3NFCxSTp>ODckx-IMvYhF5{KUZkF zLW5&v43PkX>sGGneHN8^h5LqYP$Q)_Qf;GZcY&Q?As?7{Y4!*JY?3&DHMVxjFIU!d z8mCUD%O-=QuVR>q$tZJ=cu@4owg9?mD>FM^aLxmuq8+P}w~c?3jA33h!cF_8X;cke zlkw9p(cc!~3$Hp?Q!0;)dW1GyC!c`NF;Ts1dj&}P8UgN4KJf1b0LSIG-i|3If-eNB-BlN88^W?slvpZ0Wt3n<1D0fNxIK; z3b5~n(h^^2Kx0TCL?#h++NCDYA*kI;t}_?|!X1?7VSrqtbvy@W$JD~}m}kbL8MlIF z(3wn!w7_w$LC~yT(pOSbw0S_AG3J(`j{}_u`mO6f$YHyknKOr`ozkC-nlW{9!x$QS z=}RL&V)oVJD38EYZ9IMXg|P3aMj;F&yT1>uC zhNwBtzVA#>kx%kmEgZ_0;8pO|EXy)^tK<+Ic2Iuk=464$$}XS(XLYP#ZS)%40Asi!M0t)#yPg!$?eY*$tuFO#Uob3Y*j``>&m9A=C( zoH)>?gY_fK7~6$ZGXFG%8QON-v$>nTb!#X6-VL+qlmEy>jfEjA@%Z>%Kb#)3{v&~> zqzA+snmb}CqrmCtO27kG;idIK*SscJOnjhbSz_p+41zg@#kPqIEosf9qxuL+V}ViZ zIC-)^sY*Tuo#7~lxl(W>V6s&8(K;?Avnvr@l>16|ZOjCc&wF0t=9JC``%5TABek+To!9E1HZmkach(0ypIe zW?Tee-+d`9+aVF0sr}L{UFBZX-EVI^81CC28HR}5c4bYS6t6}xn@`nH*$>SEsHlQL z2wsJPY9|G#0yGcHb0w?af;;bN=JtVlEer_Mn}J^jW{#QdRXZraZVC+f2vCK2G9TL( z8d&lo&!Qb%iZVl+XF8lLZ9jivJnVnh4W^@FTmd*dw{FLquK?4f$)Plw>S^cDbOvya zH!X4!;H+1FPwOhQq%uIuaW0ezl7jfHz*TG7=`SgccJqAl-oTVdS)NM|jN}3>a~h^~ zUkK@aTjk7jN9A#*@Yd>a6i2}K^q%ok(#OyIkLfX+|2b`#zW2at-?8J+wsqUSJ*96R zSlAhb^Y-Iw>E2UWi7uT7P4bQ~VK9_}8bDuqU1r*(RWs8S0P=qOk)EZf?#bh6_NCRd9kq$&;!7J;q&9Lh9 z{twKizx{`-jr)lg*3&!xXeQlpGqO+M#xPXJhttWMhSO;$m%?m&>Pe+^;t9iP?V2Hi z{ks++MvbxRr75C2ZQIdJ_dU=}-@Uh!ZojjezI|6G-F+Vm33u}HfrT7bG!g07-pFDt zPOp0T_Vkr6(Gcn~3{4gY+*o19ZQCE6?w>s+Z7AK%^L8_ikqFu1+6eJR_AAATM`Vr; zX4@7K29&`N4%mzP@S_M^&tybbFO@$blcgJ#M$lTs`h{MrXqA=y(viH1c!R(wew5S- zX+mbuJ1tgwq6w2YZIBN1ZF~WTR9W}6DZ^Y-+f)UWMQ~l7LB;qj?E26qHphGkB4!nw z0$#@Gi$Zol9DgKysHCJ>n9mUDqd_*D`bMXqAnMjkYW`M_CFHyynm(fp@&G*rAmQh<4=I!$XDWlEsgTA)=yo8%y=jT7`_?I7TQJ~=2<9ze>0S9|2k zr$#Aa=ph)agCXM{0GZV8m_k$fgANd(9tuXQ=YVIkunROCD?zb~Rq8%S0ICc@ASN^L zMK`bgR8y)CrapWEL4lr&A{-~px&B76%Q+7iK;MK6Yv1Z)OM7Kk-@=<~F{;rKxe zb+i+tPSXHiL%5J6?o)gC>^Z(_^VDjDrq2|#L4a$$j$1G&+8Ha-cutOSj3uMzb5_I2 zr5GcDbI=isK@0{SIz+~*hkc(VEUB`F_>rT`jPVzAjd2}X&`djp6Rc^6QH2|0P}hT~ z-*4(@sRCy_ogARngX|bH)Y@fY&Dn<`Y#!~7@5765!V?RIwTex~0ixHTt zO{CAB{*?6C`~E3C^WSb_p%>hJe}{g5FMa9$QXTSr-<7HHO1k6Bk+g+Xgq0yChVHlk zvu)!S+igPUXqaa-#V|XMxPNE_+wi*~-oG**$UY6RdU)$48{(ZfbO0%Ysjz>WEDFasUb0vg_b?{wO5ul zb$>yEguGy92zhV>c%~d>10)5%!m5QFtYX810^zCi>07f;TXEyFxIyCF1dyBC(oJu8 z$5eXHJ15dxer7bi=e@J(v5&2!$6r`Z7oAs5r=LIfY@gkuIx-yL^%)7Sq`JN?tw zTIrwurIj{O-eb=%ryJfsm%j3OK=wHD)3&VeC2nT5O2W8y*J-OLO&LpkC!5Dlp=V{tl z01Ls-9Che(CwLNoS^vD#a2gSVK$FZbn6Mr}%sc}m01Is!{ni)G^kE{lEsTL6s+d{X zGfm;bLCX>l>BkX1a`e?U3k(Ce(EtHo60ebaaNM4RkJ>l1&TMax6iEZGoAg0rd zETFZKs)+@)*6hwNs*G*8AltO$jy~I8+Z{lZ^lh|%-k+mgS7Sn{QRxyMK;Ygnz8W(g+ocI5oTRBwfUcRFnxjor5o4+e+q#|IILq<5 z>MCGRa$_XA2t{&m?A=Mk@sVz9#GUc%BL*sHPF@@e4S2P|?xh9!yFyfJi!K8$-YbIMqpJws zs@!xDNeciNJPHA?oKeQ~RE98lH3sZFlk`HXtox37)hO|sAv7nPBQGFk^IWg*+9vO|bbRgBkM$TelSt}A}) zI_AtpcdKdK-dxb6EDSu66(OKTDA5&5ZhIt(>A>Jh_#AYY*+9h*rCKUAR6q&}h;KE6 z5;EWn>W4UO051aoN8v0{w?Usmi>gbP$)^S>!X;Q9X=0l(Ivk8t^h9TC^O!W%+)$Sc zcoreACQZg0es8{bBo**E+Y&6&6kbUE(HKDTShk}fXyM)AdM?B3YU2#%DcDj|rjK1X z*V0}G#=~@$qj}bn1U?3>wtSBoW+4aGMH?gzuoPNN+HBi(^>qd}N4;4yhaQhvUzA5# zvIzx@T^96ufnstwlo91dDgYe)6#$O{YGP(cep?x$hjX=mmSuPtAQLO1nOV|l`y#-% zEPWzvxxuwHWoL~fvw}Y3aopWrPIMI}W7<&W+(xw_lI%}lop~%YO~=@BU*J6BGvM4$ zw8BB>`ADDw*)}Hq>M4ZAfCi*9Kdw%4mAT<$I@k=P57B-Zz&3)4cfh>5T2S9ix`;PB2@3;N-FNopaZu<^-lb-Wh#G{RjkW1hvm*7A9uCNAL~( zkbT#D=cP{h(lEX_WoUXXLce61J!YL+t$0~SVES|x9>GUKFvFu-Jrx)TRrrV!4gx{r z0S|(9)CNw?vf~so6vGB<5A-Qlw#eI{A7r8yj~0vEkmIR3I>Ll?gb4;=VYsKSauq=z z6IXa*PbCU`nyd)*G4}ht2u8Q^=!;h%^$4{x1lYRt`zz@=SJcz9uc)On(8?X{-)~mM`Q7WPIO6A79#J(b7jq0$SrAN zPCGdM@b&s=Sh)m+u56s0o?!6^Sq{%bU#fLnUjXq09+^kMq8gDo2Ci|?tQJ=N z<^)j&WY!19T{)bgNMLGf1Qt*`zg49I!e~quo&XOUK-vHxfCRj`V&R0E7|pNFl$wT> zpJ0&NuJ zcu5<$rfRiH;T*};F4`c$2Zb;cENGBPd!0|<6PgnXC}_uwK!|c&Kp|)ejVP4}oCI+3 z;?f`6W1af_krZNbka?L&_nc+FG3p#vOa{U#0fVme(T zMC@u@y|0!t%mZ|o)YKWRi#7;IBQ4(wEWv0kfF0&v+7bShk%9Cd&+CD?I9yilTZuBwYX&!?aDk z(v%;^NBRvKt&-6HT-(xkG+LazSj60`$FUoMosBi=Bj;R|)-<=L7k~8+(gQ zLrizCuclkh8A}fwhY*MMN})1f(l9RBzIT=&Lmi#ry$?jIwynA6*P{a z@e}yL+pm5`J-zWKM$?lo$+U4Sn|U&Us9yyL^z)^!w$eM_HIr`oFsrI3c}4*QSI&Fd z>atDd)LH4c-py$q>+2BDx(5Q(Z6Ja}yKx4fZVsR)^ziyD8e~TqJqJVxwXu3+4!otX zGr~rw-k?dXzE#{1W~Py|lq0_CnqHhyET~XGD#YD|LtnUT-cVTQ*m5>P(_Isybq_*q z%Hbo&?74@q4zsGD2I8*t0BV>lp~dur7R&73+V0bP}L<_ZCJ^vimzF9S>21mnsD z!JMG32?$ZMC@``Qtil1fWfP|W)oW3&<#3+!GsZkHL0$kY^KswycweyNb?XUD9WCgo zq2PL$t8HPwJg)Lg^SHQzSMcfzWLMdeD3`@|g^zgyNRi)uYig#VD9iR&Nh1cczkcUk zP3#+jFaR&aX1ll--%Y?9b<6N#TzTe`iVb}CDiE)AW(^@s(dR&3pMRLBT^dCt_Cu4g zEAU#-Vhwfp$T)s~yd3kCQ$<@%BYBCK@$rHT@tg&pYP4NVw{_yI++b3z9>;zJwvMb% zAAIyR2**yk_UqTD)3$$G>OCqAW7nkgT~_;k^Q@7ybv@=aXj72Val*nxN$Z4su-D+7 zfmU^kF_vYWcYX#_${Y)`8u+hj?hB`W-k~;{MBlpy)8W+ftl@LhBTDC`(}&MarwpHt zV96mo4x}FfLH%^uI4{8BrgYjK*|3A8ySm>=-|60(Zt2{dZtH%Fk<=#f;5lYDj-<-X z0DgFJO}Pg!Q>73}5~#L|M$frJolsY}f`;N`SZj>tVfeAJ{ImkqD#R;=zs*)=(p(7( z2MT~Lyi5gvGD!aH0+VoWL8j<$-#`m(REO`j;a|$d6>@Z3am!dd|GD+_Q!g1!mp<{p z>E>v5;bQy_|Md6Qq%VJMB>j);r_=R+F`HV`JU#pmm0v62_|BFS(eQpHtYJe;0Q7M* z5{b&UCOd1*vm=q3z1}c!O~G6)cpQeNW_RGOhjv*^W;|r+L)SOurfy;-edCdtvy<#< zgl1ZWA7-(jRn>9;86KiSl~GW0Bmas3%@kH2g=mfA2T>XfxQ2kOk1$(-fCUE;1s@2i z`OpBo0ugEp-w5?LYG8EQ7xWpMPYt4Akm{n5I>c&z^&>#5qYZTRuRz5{>w~D|*91C7 zrww>0u%jwwQmRb#Tm#T^Pm^xg`C-u7w*^g%U0f$gm{J86vD*hTGoF7OE^M(tK}u+@ zVE(p2fERvp^i$25nnmFSJ>^5+07&x!63#6u03F}cq#FS^?_l7^^yQ%MnsKdH5GTNk z1r3zr7#YIG{c;TzL9<6DrWSy!N{YPX?AE}jqCQSRFYf$AuE8QL^O8rvdR6Fhlc z7VEjsO3j#NEj5fXEkodVgb9N-N(-j7Ov?%2L_Wcqz}R+~#z}+a87;CwKe-jp)^DGa z;}|8=s2Cg4PCIRxqrcRnpPr!G;LP?>bF$hNpL7IFO)yBnX=})^0hRP-DTFM8U)p+EqitU)O(x zvo!1mUWKrix$+L_pF2OT;O2dR9$oEeXb-nBY!W~^)9fKO?kHs&85&EE9=<4@S9(l( zWa$Fn-tInB%iRnC<(b3h#OEpHE8rc?^lzPiO*ePGmTvC;OPcOYEq9g6Uf$eBV&TG$ z+Gtt2Y?s=F_jQnag22pE;H%JrUQ=D2@|oBV4I{wgLq0U6#%7&I*0?oSnaM+sIFc^% zAP5&};nSLtc_*~O8MkeoII3+Xzb%<7;XgLFPh0kW9ZG@rJMoHM2(bF~|1^=VeCm;< zpF?TmQhC1TF_rX(zqvNO_<1Ag7k_nU`rK!cq-ZYP!~0ktTc%G*>)Sif-eFCoJ%}PGDjDJYXHJ`U<&Twds#=;RiPL8oNiUd$gT04xdvd! z>pVNGVmW*f3F3l@5ynFZf91TIGvSELO>mIfmaf zP+(S9ZC;^`q$3ISs4WsW;xO9<;R4|5nuGSWgj7*bpojUxmyDx#gr$f6J8cXtpHjgrR+RzZ?GA1R)Z(d5KO=V`wUJs@yctq3N zb5>*?>f`A}+gpsMfZR4X<}%v2&-locU8$~*=uB->^eGBh{j(xQAQpv;pOkL8@VcZ% z@T!0NKzi)mUnWG%eaqfH!@Eqbt)@FL`+j{*FKr$zr!ncPPh%x$gwyc3Q3Dtu6QDbJ z6a)obL0brRd71B;bm@E1AEu{q?W z7nYt7AD7PkpU&6QmpY%0Z?&*1@o288;i81aWR|#m<4ime(hAv7dhjjp5x5OinKHwJ zWHh=$k$@gCNr2B9s>(dNTq$GaU`}Xdn)0bwlxg>=$8uGwz`~HT-tVQ!_Ihs~)8Xl0 z?j4&LPH%qWczWF{#twNE@3HK}WoRltb<^?bfBwmIdfR{5neHdF%rItQp2RUb>TAwT zr_?s48CC#qJYhYqP52YDA;RR$oK%v=N5|9XIPn2-mz%-@F@shxb__x0j%1(aG7Y!m+!xDpHCFax0%koooz0*CWi(#AfTYp< zD>LUm;7cIHPx_$t&~PR~T(y-Rp>ZOOpi70BWt$^|Cca4%G5hG7_j3HctY!3GX0i0! z@u7?m8szsCc9fiW$SRoV(Jld>fG}(9W~|eDq_?f6H?4;VUvsj+R(*wIWE*P$oms%A zz|Lh6`Wrg#niuTf6v9l1=2(wF5E{O1w~WaA*5SGNG6fOtNwj`Dj;p2n9(i24rP@vRz+9b3>67X^q@;C1 zrRKOj2bBQ;HM^;m_Tx;vgX=-JrfUO}G2S)lSpPqTH>8*5$MxmPykjp-IqH{dfUQf) zm!bw$xi;hd}iF(qrSZwf8{!OzY$6i|v0vE0$xQu9W7^@oZH*bmfUOD!`q} z3nu+-n76;HY?i?7FyqZ5WVK8fH6tu+C_TDNZ1oj{N}w$SJ5er3ER*M+oDFV_kD!BUHf5oG)H^oYJ3dWRu;TG)R9cCRE>j))Xw6TdxawfF9ZG9)ClG(IL^5@V zpwVLTpyI1Rp5u+DD;q;X4i7hBXUKi}QYYWA5jFsheKk-xc=WL7qFnM44;G@0kSxql zTA0i<73%lm>|9Cj>?T&lQ9%Gbh&X1=LI#o`s?pZqKM43xIA;(@KBz|Rni?*dX_bW> zD)nNUGQdt|mNYN~I8K{4+?YBQ zTsz#=#@&;gGU*!Q;xi{BZJ4bSsFiT2WfSy0wR~kP-dG83+Fu(4sL!lko1R{|Dt)s3 z;Q)i0i&w(ovsIpXDAS6GL4Y=xP4FB3giLc1pv=UC=ZECbnfIh6XvzsP5eXF3FUpT|2Vmfg|=X;W{WT`+*6jR zh;d6daan221i`cMQ6&gd9Xp<)PZ9GSkW21b{8}C^X2RrZs0PpvUlIlgORPM0f;d%L-l@sLT=0Nm-f- zv!;iWK4L`+QDn-L360Tafv0v?k(-Ykm;$}?57IzZINySlZ%rNga57s0QmUQB><@( zNfSeCq4yv>Ty6Y}%Jb5b%TG^#)p~FGO8X1PycZq()rZjhs_Dxz3R-b)3h$An=whT2 z1tNk~Ws6cEKV)cJS7@srA-@6cd!Yej!isv@kAC-IiBkNb1uP8-2#~YdfBEniD-9Fa zqbVNgS7#2(5EmK%eeLoVG?;{`Ra%oU{lqL8hN-qiCKq8> zp!{A-rUwzzXf-D2AtNheRN_)ck{}n0$oeKD=+P$$d4`@Jb8Q z7c9G?KxYELWBBeGy5)J*7pHSr(fd$11h6lv{&>2ibZPpF`5TfUWscR+u9s2+Ez3?e zL}(e60MOPn*emB@4#u#nW^YJ8zv>wL4W0!*8y;B$-(wdUe7ST*!VX4yLSP}NyX*im zKZLIr+FHEeLkUvh_aqMe%E1;3Naj(bsIh6l&*lYyM^QL*rn+h4N#*qCe|SQA^2NtM zEq0V2_I1x3N#~tiPS1Jy{ps7cpd}ka#vG+%u8Z#;ett7swx$_2MyQ4w5=ES=irUZ- z4t{gfO(KeP)A%~HcSK`pz;9-m^y0`8i$P2ZGvWiLQk4mh)1}SJd6NX>A@n1UQn4qJ z3r(Lh-XT^`>Z51)3>Qua;7rK>0B&mj{O!yc8O;f^6j)>rfgGzlQFU`MGU-d>VT>d- zi2}X|^I>WHcV=BUQNxXc>B^YZ06tU?N5o+pJbcL=&)tqZbh}-8DEtrrhGv;jFo3u! zY8Py{=*C4ex&f3}*kg<%om*$7aad(%@i8U^!y^h-S9vpoVOG@XHc=>}5}$`&DN6ya zx!9PBh-8KfHcMG*mJPfbQlDX-Uj={XYgRPR}{DL#AaK!cT}Z@B&AVQm>UXmA&^iRPZ)&_PeR%$Z=@YHLMTqfEALV17 z*tGZD3jl>d%`xeSEmCpbo`+Yt%YyREc()}&;>;t!jf<+~VjE8PYVnNG=E`8zB<^C> z#iw*?3hj*Hs-|$@$Glf#Qc*1tT>`DLbm#_2v3L_xAKZ-y4}dU*@R2@vZCvbe=9%U6 zXYbmOF1{!)ygSm>u7vU*dwvy@@Wyn_D>tXFeg#(#q6Hj{S9-3~fIgI6SQ1pa^+{aU z6c>V4(0aHnWsrVoh2dAOXAq}>p|YX_Q!gZ<`PgeNd~|0lF`Zk+R*AGA@9MF=u1XQ^ z1NtbTr^zE!*_mOw6j?gcA-aMfrMw6@tZ6sm(?Q(MmNkud2xJt%HX>Lpg*$4ln)Ahw zX<~KBGiB=2Ow9WfT0q{8D8oOlE*{hX4uYd4!IHJ~Ux*@YFkp%-ep~K=<~8l&V}E%~ zU(~fY?cnc16cyzU-t*d0zr9|R?RjyS)}y$$RNmrVk;m`F`3CP5=le>t)V;-Z7v=2n zO`A1wsCjW>pzljD5m1A|r2vSU*=A>^iGxIF7eJl?FrBF=h-(O4O(;^m3{w9Z<7Ih8 zI<*|P>{5MRf%crBkSeZQz7E_F=<4y19069F8$O?B49AHHh6v4HHD=3Wtd1*T0vW<- zTHqEjGoc|Z5fEc6s4{Mrli6@lAdx$JR1GV{{a6G?@h-eFy*_~L`Pq;ST15nx5r6Y& zNQ;5zH!-v(y`=V2>Fm-Y2d+N!P6f7CRiDR7<_pswH-A6v>|xeFiU-n-i9kvlHk<(M zwBS!u0sf6zuzmZEh!Z(JF$TEHK(NAYH#6|DESTBJ0S#cK+=ONbpvA;we1x=^?n;fSCS&-gVLXmBeaR<@k#@>ymGt-T+n644 z#)EsY$Dxpjet{nW1U~)Rd(+qdxtWHK0tgiEwFz4`Z{TlzLeb*I;!_nPG5ORN3fu+n z(R3CQQ)FKc1qgx=wg-KRt#BX6E(WBrP%v5S+y!rg{o&t;429<@4`a8lFo!6ZNhm6e zT{-}4J*Zt!7uO)V@M91Oa>!t9M6AlBL27TPHMB8SSYpO30I_VfGcrtAZkSs#v(y~J zE6pbYN(&GzSmqsR{c#XSWX|bj__?tB+ZU!Nvj8i_x7Q0$v$xvzm3MKTBCXd4%Pr~~ zOusno;@_tA+Wztu>58)VRqtROMf$<-!MX;|2h%JrWAOLh@Z!-;+Rm?=#M(8n#a2sadwG=pHjo3;kuc%uQlMY6 z+CJ$kYx+!+-$6Cc?o-{~sefq@U@%r!csi?&i4AoPzJEu0L{BfBonBf08GQZL9OE;nvCo)9SP_QJ~DGNyl^UQAN;VK&z2Xrloy!r2~B zSSO4JYzrS!7E>}6z2~0$5y0>yCaNP$NJg=2lrZs1cSD$iYiLBqi48b5g7z97IZtqC zr@jq*PmKp?Jh$E?1@?K`k?MGt7;~qbT26m;{lgRd72~>LeJOqD-5b-DFSs{-^PBS# zCgw;Ey*$T>r}(HbLNIZ*2yEjnH>AI^TnZX+!--&=8E&Rhh%=B2pm~!aVU1TkKKYgYHIfYHdJ7!<1`z zbI?#3f>SG9$LFRsgV}`gRg>#L>pWy`*j03^$3t-h=7t*V!cb#7MtF4W=4gv3L>u*kfgeLG`+h08@ z-R~j;>xM9E?O+ikauX|AmFGRIDGS-fY!=!P2x=16S8F;JNS0W+i}MOzTKKs0H-acb zf29#z272tyfY2-{w{T?aB)Y=*n^mRN9yR(meH{xz~71K zahO6M?#F4H%IO3DYh!xyv%i}*-^cUiJ?AkVk)sKy>!AH}QtEcD%r7`6wyp|0cv;(t zs|y?Pb+5qSx?(O6-^BPx8YRAP2RdmB^5lI`5X8ebHZYVQhDZ|~wvd}0qL~Mck)$l4 zd8lD=MWsSr=2pY(;WBs8XoNRFaGM5hNNPR-?D*p;U-}GIsKj8wpgS+aJR?!e#v>oX zx&tazW22Ta;%ZTlv6BorzOR#r37iTAX(9_h9W?Nav!uMM8>EpJhl_lxv{*NS|D z-$lBmuI(+aK6wJXAR00{tJd$uSZvaaK~Yt%#4KpE0S#x9?(`Hvw^`Zg1foM4CkNq1 z00@L|&{Ag~t%#k)y^cG8fcTtbRGDoL>$fAVTgmG2kR1Uvd(u>}1n5W&b5oNW8k_9H z$9))KjhI<;AV6JI%u|MxeyV zA3=Vj;v+x2-&eUby`c6oU;$cyhv^~keO3K+=}(*gD}BE84@YGbBDzJtCaqUS9x(Dn z{Dbb)5KA+21nO0OmK40mLETd1iPFt1TAg7`zsg(46B>nA!4nbZaXw4lVHd-3NSD&I zG^xTR_@;982pqa}=|S;Fzq5fDe|raiAN{o)Bo3Zy75Zrq)L9uh zLwr%UZF9@q*Z={{B>lOAM74#R2 z-x$R3Ei|T84;8ao5(`m4>j&duH*;47e=tkJER?xt8hI?@HD)OiwI@Cp2{!xuaSnm_ zaj)KpcFrtkz8~aQqSqW(#n$cWI?y7s?p&L77XV`6TgIB3<=y`2!UePJ|DgE69D^E0 z8qn{n#q4UwV4;fvPtmr;*UeMhEAmGgUt9-i;Qp?>wrux%MH#!&MAn6}m%45WuNQg! zz0~<&-s1k^@0>UO?op;!2ah7J*Mea!>gTTe^btBR9#Mn`f-oBpup7D|P9txRNrHf| zG(LeAuZ?ewG1oAg5CuIZHiqorzTsq?tf=~Ksr`e7A@yjM3q#zU!I@B<6?ftA@05D! zM?2V+gFZid{cw8UOB!hdGw0P~|08hUWG`L&?papn@;sLLh#fn^WeM7V21B?qIaP9~ zNiLp$&_DNe4G7`QqYL)|egJhqioYqCBZw-N3K^_SxdM+Hf}Y%>P&Vc6I|}+1yfaTn zc+a>YogeArNtLIh7uH@L?LN|Vt@QE*z%dpK`)6C9I^xaEiyE0E@J~MHjvk=1m~`lH zFE4@!kZbOm1iL~AcS62O>rNHma?p>;k#O9H*SQ!jcE{qorO?JAhYZhx8f%IFq^fXZ zi5?yq8tYAV(p!IZLwf#Ih9F-0_|Lz!HNEYZ@8_nSSUSxiU!5Vy^yQ;V0>JOGQ^zY` zcb|a}c~K9!hP`KGdG;q>y_NviY!tA>aoHt}^v-u2pI-XPd$DHnMEde=iKK^h$qB_M zijR2|8eOnbsm@MVK7C|YXpT7#*A?*+G!&*@+M;4jdJ>z(KV)nL9)&|;xbg|&)1i%jlh;Vh=BM)c2)EuduN!w46qdqTcRE)R9l^}X4*+TgrA8pUpAlP%3-DRdD z$(NbUWU*{Y(wLopI=T8n*g5RTe3qM{sBZN*CL>V1Abt-DMT3l2d4ar^XEUg$Nuzez zS#AUwXDz#XOqa%qsR^eAmz})M8YE76R7TfT29`>BEaOx4F-`Vbt`2m%qh=HvuBFsHQj$?&~(iR~o^0 zP*J#Za?*evq|3?`N)JUzo>WJrR-E%M*I(b6o!xW=8nD;DYVUC)fBO%%rMLYG;18Dx zSoN|W`nHY4-m7~SZGBaOPtOBSjzrx8`*;1p_OxzIDgFBYv-EB`FS%wSefkTt>5u;Z z?P-Xu@Rt2m=eer6b75qM*+UmARvY=I>~a!1Lrg#AXH8@rkB%P~_di^6vSO5|x@;)E1 zFxp2q3Yx}CXXkF8xipEXFMno+cIbJU#DM1{)N2J*W8Ic@&>TpmDhSq6W>vHzby;(Iv)McqI!$G z)*JmO+G1Yn+10M1{Qh@QU!>1@L&N6vrRueQ>-I0_J}*DjG|5FkRp@M?AI|rYua_)pcK9sE!tl%XChx@O}2VE>=8QzmV1&+n8Gg>sXTxgn$iLM>wnu-`T zJ%Z05(BO3PndSL(=ep_Cvn%P{?>v$I?Bdl{UmXAAh8^kW-i!tgfaaunx$0iJoTApn z-$$-q7g7vi!TF6}dmz2#x3(;K7I-GCj~P?f~d?X?TJ1UF|gTtsz!m<+7r{)jtP3 z0^jqjpWA2J0t8kV^B_)UyD>wC2`W70gk6Ce4^4+x-3q#_jFY_E2y-VokZdqUL4$4s z8CP;2Rk_oGm}pRbq3tn88Nbrlv>lC5EQ#;a)jk`05I5I0hSH5Mtf%Y#bS`TG0XXk_ zQGL}Myl4yq{JjV8*Vp{r_=0+J?07`WdbH5;K}Hc>!1rHT5!}fKbypS-$Lza9IXeEwzQAayb)SI@;X!o6MRO3O{OU*? zYY2$^a=;%3=_676L!wNeSd7sxPrW(q=&{Y;5jcFhDtx7Z;SjW19rVk}K7HZt1WmiC zf$>c>y|t7(ntGv;VQ5LguAJ;TA)zc?t0JTa^0NaC4YPHjX`0+Ooqnpu>9x+~KH?o= z!u?xs-H-hL*X3|gpJmAkgWtUE}ILm|bxALSnK9t`68xN%O&aI|vuii5z zaRUJS&bMtyS6*``*unRHdAka(i^H}UqOYR+5;P<*Y+!K^D;btbI%yIn%~+Hrlx{s_ zWmvhKSa40PbQfHwa!(f91#59DCK5hGBN}+UEU0tVtTs;7;>ZZGia-AVnLW`JbMt?0Cuwb&J|Ei^A5*lpgVV?&G1keNsybp6QK<9mc!d0KZJhbzul zG{VlEnBbUR`v}w`bnLvsnJ8A&=9V(5J3gU^EPqQ9v66T6w5{vUMBcMIPqLP5qH| zSCRfygeZMtv64{^l!4qUu_RN$>~#gV$`wt)Wdy1qu^Adb`?O5`;@#^_cGK0*S(C2W zi{Ia!cem4zz4mUjkF+h!vvT4+kGLv(J*@Y6UwyL%?=M~do-I1GD*{{<2(NhE-Ra!3 z&R`|;b9L7v5xZR;a?(*#AFT?EoAzc_F z(6P>eqnTuY*|c!g>x7O0?1|^vAv@uMF~N0~8ik@1VcW`K!>s9xj|MIlUnrDeg4~Hh zZ9?pS2}pxh8Twq1ATACH^)=93VnGoi_B7IF>mJJW<<0jbJV6C{=)W2TU_}(`1ITS;gt%@y)hc=v;7={(t|Rv= zx2ZVyuI;paeCLWe&-Y#a?NO?YM0<<|F2J^LyGo#aj-OzO{FyK)3$PR@s3;R=(j$t! zN15%4j@02eL_7E%JlB*F^3$F`Bf1^TqDdKPj06Bwb6k^Fh=%WEp#^OT?*)f4Uv6i5 zqibq#B5)=%9k+e6|30G@TXji~Y8y+GFP%B8&d3J_Y+1X$00M7B6DSA-@VpOD_;3e- zdw{>|`kKFD^mh?(apmy7p%?jsLe?2{Y!SypmoLd@3`69bqgGh$aO^6>bvc1ESi^f% zSfL5I1TDGQx-r_g1?`ZE_sLyqn$2#SKrKB^thX)>HLghS&E|LS@H(((?kj80N{=d^ zzvqqBD@%@mWA#JTXQ#hz-n8WX!?~!tiazm51Shd=g6__uH8yasE6ZIPDc{qKt1_eo zADTnv&CJdd4=}q+$qzLV8`I5&NkNB%m}vlVSrCTMA+6DXcrhb;F=ljPaCjd8rAW!!Yj@* z`tG_&M!%p%hx<5sFY<;epR&}V_CFn0M#pvhizq*?Q@*hgyM6Fi6lq%hPi&KW{b^>; zZOUoACrYx6qOJMc^2jsLKA%^-Re31#c~sRy24|UW|7O6`m}5z+YkZ9T>CzYuJC! zxpA1!MNLYLFbY~NrmX}G7;h!9N`?Lx<2_$90&cJ)n zXqfGwIn92)4&m>t#)co6Yc1d3lS`+htLr~JIAW{k2QUIx)t{RjyXAWlxg-fxi-OPE z$OKvz!cQ4q9A;o>M;Z&cN;jXhS2V;~`hMF5; zY(*io1t0v=t1J8poh_K22FY(LtgMP~FqEAIxs_O}hbOz3t5@h#92j=^&VUfFLP{6h z3G*nFd;&c+eb(z?8m#DXp8q)eH*G!wm;~X_TG}5PE4~8&F+QQa5@g8vIYR44p94%O z0KB)vQ2-)uWiZqSUkkr2kJiR`du|SD=!;10XFkdC+vL zb82%&Fbw_hB6J{7V{H{+QBd9naN8zp7Sss}_5G{i2N7_e{(Fy0)RUhVC%iyBOFnVa z1k3fIsKH|`v&9?Has>$71_(qWC=hzM9RdF6`>l+DW8s)MHhUb)^&I-;xCd*d_e^K5 zxGby|zBj(7z86kJOISaKV2TO~8EJ&Xg3i_Ks9_I>Y3M1)CMGPr2hgT23i@VMnO#>Q zwAg_Lf*Oj+3N%L<%k_Ct{pEdLw#Ue=Uf9P7$p0O?<$4Z-01Vj%y(qWp07rKXQ8)*EDggQI)L4F3g=WK_lsbShNG@fuXB_h7 zW%zViy}a@CYI^-otY2~zzwvL)^rrv!-dOaZ=6r8;y3$l_`ftDW#PrG+vVs`Rc!-UC z5&%@g>;XmLnRTxKwKqng42Zm-z?EFlz+`sVf4!T{)#{O>Oyj^dpJ%W0rKL^b7!RH&EqFviV`W? znWoRAm{pRnpDTY^j%|u|McMf|E(pzjn+J2*-`u+0idrbA=;K1U{bc4V;~wD3%Lu6f z5yrM$JPoD_&=*=v2-?!sAP+NXkXdT#RWqYjP-zSe^AYGW-q359c>RXZ^*N2e;%I`@ z=;$kGTeGigoc0HHna(L@@ev^KM|Oe0Yya%w1p)*7(dPy5$5<>0{v0?7YZ*W89~}e) z5jjb9av@C!_~bQ`e+^TdTP->1)M+0Q4{faXg=V`_Q^fCxvyy- zHt)KcpV0I`hf**E$lvAr_xQ@i>D=;pi^*&C_W_Q8W9Jwy-xJ|^%a>$OK6^e&1ckPy zUVn#z0A3_t3Smon_l}nT=whX5PHm1_z@STbmJ<{Ct+ZK3XxE@q2#aV4LH)ccG9a~x-OlxA^Y7g9@1a@)%()q189hx?d+qT9s&BVd;S^%N7vJHe`q2- z;zC>^LJPR>eETYMaa(r%-glYZsSf=qrDs2DB3=KxC#UP4J&~SHT*2-nGR0@ZXW#Yi zeqRMuhxh&M@7%nr2?J-Ngu{8$PZBbQ=X5aT?kjDEAINX$LAs6YPmyD8l;I8_!JnXq zu!tcqV*?F#(JFI)7_+eMDbh=?(B>p zM}{e&uo)0yfA9nv-V-Rv80Fm(ZXiv*%@H$f%9YXj(SM=LOj~^CY`KBoj6z)os~Jzg zqPp7`D31P@=XPfC5p$&?EjI;p&iG6#$aCK0cLqehq#0OQTAx)f+{+roT{T2)4vv?o zgC_b#dPc#q;es!Aw9FUR1pen+zq>GT?<#J$GeW!RIr9t^}9`|a>n z|1hn0B5oen{LZF%@pojaj9QDxd(v6e^qQA0t^NBnrq93mTVma@JI221vYa&=%jvCe$UcMuqIdiPfs})% zA8I?JyLEfWOxO#?Cprn*P(zo`6YuH2vN?PEHp;p^<*}XExx+M^7BjgB-sh zVh?`uV>{D(|8mEYZMybZYtosI0`#I$J=n6BN^uMN;;O6#gJ zU+u9z%=TYiC;!rNCd~-)L_S(^!^JP?NM7eNg_NM%uw3ZVg1>zl)#(&%o=$=>P-t2z zXutd|!>hU^nQt@23Qj4z&kT)-Un2-_%obSc?$TsIlB+f)^pNaS>NQuS_%iT|FB-}j zi-4hRS!N$pK<9ROZ-;=+e;%?~hKz5^VtF)RP!q3^!d1bh&8#?^e=Sw8=%I$t!!(0O z0pbJ_@sh`jx2ru0jbQh5CC(gN`{l0~=)uzZ=TV0J&*g;R8F-2iq6sYg2M>_hwrH=@+W**T+|J$$JGcS=-1p6KsI3^E1oS+1Z0MYVhn9=?Xv_zBA-CyR;be zNG1#t58JIxRi6 z{Di}P9>w!iNuuT?gf0SC9$H4uK|lfIoG>&-M&nv`wigJ}0cWw?lSjEnHG~N1XWG;n z7FL?z-S9Bds%4B_9pGm{SI}ve1r~OgAGCj0|HtvP{!OO=n*B)HEVhk9ExBk|>EaVAhP&6pM zT_AGJ)f4yv9$dM5?SJ@-@~9yIEm~^wd<r)Wh$3Y-2VsJ1Dpdv`{kfjd(i);NhND473e9GFd@tLxNX+@+eB|$j zbNSKdt&27-{`29F?@XWgDB8b~eb=Sw_tMM9(oer)_gym-IlufSw^O61z8Htn-o=e7 zen(k*mN|qBIs43NI(1Vey_kNT!uRcW%%`o}+v(?Cb$mJjp!)-tj-`9P%c^TJ??JZ7 z@w)jd)9F1oZ7W)`+xL&Zczqh74kJ$-Y}t#`ySQT--@Ya*%iAdD3@bFPr9sODv>>k1 z5-~M36N@-hj5uM?0;{|Ws|U1Yv;q$`fyNTdLXr!RPgroFQ+Xv;H3TYqUiM0J5F^?% zDsX#|Z2G|Y(1n<|)zr|U;JOE70$g!F127*lg)rNuRjC4)E0eBF@Kjfv%(Yq7+9OzD z3H4-nPP6n_r&t2G4Rs-M#>)jLJ>qB~<#}KFtBgZBNBcR;9r4A9)A-3RetN`pZcwVP zU|drZ7%ymCr4qi?44OjF=eNMoyk5^`L{|RvAELQn^l^^?4w~Uw0cOM!mYa{&J47Z_hidnku)+?4z28 zd3JnS0y&r+bW<8ZlTzj-U~$qUgiMEcW;(5sk4eTbzFTu#Z#5~KoIU*>^wlt0rh90n zIzpfD3DTKnJ*u({pSEOb+n4o2ar-+01YYyd1%Z2jKl*w=;Lm|u=I5dRXN2j%cZd0M zfU_pdt}S08)JBQee(fn%&-H!!xEhbIIXel%ZRSa=^yP|7-v7DI42*T2?UYz$hgM^1 zW{w$jFOApP(hz#C4maSLFh=NYINT31-52zKDBtUcj!zdPt5pXOW(?fX{ zi}M)tIb;>`E3plr7PKm{*|6H7K!JZjGX{88OQ^petc{N*J17kr^t;EpMV+U5gc|D% zx$4sh5zwXD=`uV|cLn&B@!Z^TW=Jat06?F>EOX?$hxX~Q>&N3B*GNx%0?S;NINtrf ztwGEC)c!&1WkR34^^GUS>$|v^D=(i&&wS?E)SEig_AV~5_)VWfC=K+Tww!@EdzOCv z)SK^0AN}Oc^f!NgcDm^NM*5TAKP{bpN+rGURo_mZ`rK4H|2*u#g6zd*9LQMm9N+W) zr2(KC(5GESNVU)q4z%q+%3YMENzA|L$ypXdswh#;BI5*pT3*Ao0EHdH;Uw0xAx+QF z20Lt|p+*%|7(S_#pG!tT+hzIQPyc(ZrS;=cZ*Gyx*@YvPKcPO_6V~yvSz> zw#APx8E1laQE3#ptDO?NWyDG@Yw6$0nasz97;jtQVF40PA077ZQ$$W?3VvkmpK14h z?A{0H2+DTVrQd4!eC~PHtb-~~1bUE;Vu%@EH88f*F}9D1N_mKTj`VjjyKZB0|tMN%yK>p z%5rN;9iu~o>`WN?a>fg_Kre7F=mGW@_2yk0m|noY=J2_ae`(Q(73Go7;J$88h@x8|Ws z7n#WGNM?q^`v4eT@Z5F06MK&9ckY@`fA=wb-5ON1k9vBO?eyB8+>oB~q`k+H{qKDBab(UOT#P~S7i%>R|N4FsA$tm{aC1_!QKN>9%^q!59@C(2oBq{!Jd*R5}>lR3D8GDRs7?= z(cmd4?iFPf-=>M1aUp6jX zN>uFvBZiR~IW$2&wKRDUXj1O>;eQYGZhxl%0)Kb_1l|M)oc1X`I1k%?Eqz!3fAsC3 zz@Ob-uIJD%N4^t$1zM0dNpCIy5$qXq$d!H4v!t0PIn1NsUD8(ui*OBSFS{DRRAbgH zlZ8eBh^{L3JH^FniV2N?AR=sBz1jEU9G9b!w<9xokBptyYx|Y@~d2tm&w1NO47j- z!wq4VoH~@DR@u{7Urty3z?vnq--w25@;*(COWux)UHtyed~_rI($Ai__e9)z)FW!? z*;k_l3}3)~COy2Hj8&QEaRvT;-}=I%)4PBF^z_zWyE}dEe@~~k{D1ePXI;4_-TBQ6 z)7yU@Knji_`5_%XrVji6{_&qJy-%=U`1no8DFb33#$g=52%*<6!-+x2M&z~{K_Z=MSh+q5%c@RoIG1}0HFM28Tiqk=hp zV!~w>BV#3V8wwwm;Q<_C#jiv{+5m+TEkr6;Rpm%~g4i>myPCzs0z0)dsJdx{71c25 z*(iN$)CeiO_c)duPhX{7RO&B*qc5n3_xzX5yBQLCPfeiRDfZLMzJsO$94s7y2!#PT z_|AyD55}Y(`r!R2h(3g$19`34^n%$v4*D3ggPe-LyV@G#(g#6>!)XYpg*3ar^w!~h z|Ai^ohh}4FuMgM5>ipwa3)DT#<+Y-{{w$6R?E3lQVy+_>WWRF0@ROo`i{ICq6ipl` zC&qvsrJ&L!5YvE(|l;tqh&!?tTeaWBo#_VHWIu>#qcM;(Bij=xY`m|uFB`UH7d z1D(s4@F^)1GiQtf2~5Ku8^4?%iaVGiK;Ux$fg4yItS0b53IcZnfAr->`gG9X&w*Rc zXF*wNSf(-W8a_e35bpr*NDldeNkq+zdI8CaC07=*y@jtJuYXjPf7f$4u*)cO1(3NE%7!lplF8B(<9M07k$ub!-pinGEJp z9z^5?z6(Jcnq@ewe#tu58#r9^n`9Qw`tW5J7lo2Q0Ss*lB7+|VB!&H9bx? z;N5~iH9IBBQ`wO@xqSW*KGb_Q=F&%;wdeL`i0yRa2QmNZj%m{5KjgJ~W!J(#M=r+Kg4*Tvc7nQ(VWu$&YmkMqR zjB}W%rwxbjpltXQ{yK9^qPy}jISlqlZJ9*Ge6UBOFkI9kUMG(%`aa$oX=_HGk4=h6uo*Z z!wAUZPcNT!SkK1iDnIp^XSXRRLcSe55{iw`Ln=IS1R3K zcrTA6_+W~Fe_`hniCbXW;&zs3s*J0P3@efd{)i@GzDBeoUl!o$sQm`S#_9a zgzv~*?ANViuq*jr{8;!SxXFZ~Hct?z8Q3<9eu1+6lsT^{GthGum1iz81TnS$cBN;i z7#Ih~7tR67)mVaWGyfSAHD)oeT$UyHpBqts9`Jtk#aG;SJWc8!0i1x!a&xOajeBw3 zj9&2m?nmVCy6vDG3$vU=O4FH(jd~Dh9a^j7asY`zf9PcKcWF&GBOr9lm|5IWW%W_r zJy&T{OMe(%vXZJ+7^N>ae(T79Q{1xNHGh4Q2L0NV7V-5ZS3mWFxcf%wD-NrjBO*`3<`=~K+ z5(;NvChd7OcpWsvy9Jwy$#1w$aK9rRDb(S23LUwI+6Py%Wq)7=K53x8!}*+EI=t|kr_HUB02+RBjdCNHSZIPq|h`28#@}Gy_ITr7!G9Z*i=igotAm;pN0{Z`Wl_PB~HHwSc9N@60)8DKK^Ion$Ko2iTJS0E} zz2O%3Bp}uPl)0xJ*uL1_epL@zCZe+x%{to&WB;X~O!OcCQ~BPqwnlB>5( z)XxJ~U5Q74KiYWfcH;aI zasS3=RSysR*~uW(XfDa`v4TQhnV=oxl}f059PNpTHTVcQGluG* z7qu`(F%T5W^8|TLE)?jx8#rP0JuAC#jcZ}ifY0sr4j)3d1SzY>kr{#07~8{rKJv^q zd_@_gX3t51G$C+{T^OJflxV?gr6KezSt$3iV6Ko~`Vj;MPt*NKdBX4P>*vM@nf^jt zz!xRZ;B&ziWMX~}?vNLjS(NcT7cIT|_n-e2P-7&8y_6lRhrf3$U3vM^{)2mK&H0aP zq^CT2oX|3?pdH}_+2^tM`g69W?*|K^?H&5~Z8UVRe%)>9InP<2KJn?DX~$ONK48cG zyY1uN`nS(!4c?@lfBeEuuADr0HO?@vDDB(JJ6Of0b>IN zlyK5W@Ju>g{8PS#P=sI_BV%c9=Tykha6>?Y=%}gKa-y4qLURG^BJUb*g;O+@VFFRR z5`YFG&Jpu-&_Dw~Ym-)s;y?=4taOCcaDhB=e&uqmNFNB6F6*P|;{&)EL)j#3d#sMzi?En5c~1;8gd0cdJ|LsZ;+t=Tudi zWPjI~so9_tuaiYa<*rj>c(HOd3|om#NOk6wnwiYSQdWL>NADlb#%QX2Ps8IcO9S&& z>DvaYKNlVGT+SXAB1H>}ugL=_J91*jK%r$-CubxFx>nHSx5l19p$*kKpZTq5Sl zFUhqiu=&(yzRMrjh@zzZuJ|^-^CvEHT$V?u?DZp1YjN>i;a@t*m-+ih8_#T{%CWTz z327e1FOkO{m`p~haY#2NGbDa22P04qq9?$qG1f#v$~@!54?6pr0}}mngn9)VusIPT zeys|nfu^gRd7cZ6M4RnS94+}@%w>Q;fK;{#WKsnHOQ3a6b31}RZ2md{{>)@2>YybI z*U*x8b-^qh5QPfOg;9e>G&6u#IS_(wWQaWwi33@AS^v;Lsv&9aa@{PR#bVIVrZg+~ z^O=&tIXV=VB(g)9V@Vj>O`ULq#_?CSgTOSV4R`vIq^jNlwsgu@kAe`9RZH!5b zR8_S3DB8lB!sR3 z*v)nH7J$XD+cF+$knb0D(B~e0crD%UKJD%QuDyPO1Xe}(NrHvin zq1YH6e;<~bp{y1iSMV|bAG}Ech!c0*%)n(}1Z*K`rcmw6wL{iyD!@HlNK7Wra@7_2 zo|@T)#(wnix#avMd3+Om5jrFul&CEFs1YHoD@2CVj-m;?CUay|ObkJMu)pZERpAX_ z!&L_~DxK+_gQyq*H5%*}48h8P2Py+GGE&MHvN$C$bj;deDUGQRuHx-pmRab58Edf@ zG!jX)UkEr7Y4VZx+Z}K&BxgRSljl!hr2St8b{Xsmv%Io01bzZT?}UMd=bzu@P&nbb zy6FHay{wOuM=KV1JkPCzG}?KT(xn`>4KqvKNVARGH4j@{SK5^GK}AT6R4H$bH>b`g z`5BKa1jN0*iD!IMO*GEJ<>VlBz*`ud>(8m&I{XH6A(ALd>Mwvh9axMudFZG>JCixe zf6iHvCZ*|oU*4DwuUpQ1AJXCQf?uT|yx#8ejRfhpGEO~sHr$ZB=!L^UL{C2qPpON* z6c3iQHdisqF$|n47e3?@4$i8DUDm}w1mnR}2|pH9RYgZwVIM*D#Xhgb&v$m<=9|L2 z$GH*&zTk^U0yiQF{34RTXWVlnfdT$V)2eMs{s4c^K=Q{rU>$KCt`8YoFhXd*1`~DG zt~P(Rbebj(nuQ*u9ZdwJwefLhliSAVj8Ti&R@@`qwNUk=)H$Sw@UL0ctyJQpmP0yo zHoH>%JWzB8qD;4oEt{3q_6zhbHoX1cZ7%`KcB%DaA142IkRAdN`bmWt6$S-rAvB4q zAn1?}%kyAY!SCef(hFQGH8_{sbM*oET<2|$!M?W91O2QkNk3)h?}Q`=wV7T8n1)4w z9((ItESdG{oDebJtzmhTn^v>fuTrZvVJoyb>i&J{`On%j+rRnYKjjI_(=jLXr(3Yk zt0*4bm5aC+$Xl8B1-vvvFV)m-^0TYx_vks*aL4Ua>G~Td(l4F1vpQY7#~*xm3+32M z$sPq8o=9up4fziks|Q{*KFx$QsRkO6FU3O7+-sgD!0U$AL_p#XJVZa2=T_uCws(+$ zD*okPv0gKNMp#5zI(FdOJyD-b{h&mrQfsGYC+)gJ+GF*&1P2T>_$G;)9K$#o0`Kq5 zV&Dm9k-$I&J>3{_i9GFLC-{Dx1y&NJ5U1He^lP>T%DfoEoD(UCi<7QDH5YG0qW zeq5uGhzTAfPwD$yXet1}*SxZMTadE(gy0-M%RS%XX>t zqpDZ+zcVxif{s(2O{vC9@TcTPJ~cU+m+5ezAn$Wx(I9K}0L+^8vNj53l%_kjy9sN*Q`S6_39QK3}&B0C<0ASW6U( zbVJLR#h}x{XQUb4Bt2OFI+q&CfDjBtXO~sP3YOq+99jBYm?uE(Vl#namqZ9yoIz+e zi5AViHzv8c33Ua+>!WjY@87aB?q)RLq>nt|gN_=e=>mflfSkZ)R?#BEn^<3_-x0R9 z4j@;qMkYrwSfo)PO>-+Q7s{_9v~tvAhpf~_>6J^yh)gXomsudKCYg6K()_nWIhqNa zz_6FbTw9mYHR+Naye#%+_?Bw=@yLHH_Vb;-8yu{s4XZyuz6Hxd6~OGAvrtP2Btil3 zMh9q*L;;1%K$Su%?j3FNcDOrTalwZ}a#y@q(n$&672o>ElEP^HIBKS-AD;*DQioBa z5Nc%8x&>Xk^&8NP?6VXQoi3D1M~WZlq5|P-#80mpg9Jt2T*PRlDxIKevq8jU96Ded zB!R{=f{pTwg{7rYn5&00rcKx!opzBBJl^wMfItA&3%*={z%K&=pLX|wzyN=wp$Yz; z)?x5x6=cHbSY=GW-1?WvcLaKXGl)Ze75oNioil^yxDO*~$qc6B(n8Zn0A~gmj56q$ z#g8=A1=EtrN{*7UG_CY+*|K5IwN#(8({|vB?G2I}CF+^(7oVN}{Qz+Bg}0k8E!(Bm zk7fmqGGRRd1f{F!BZ*sHqiY~-bI{Ps;MG~dYMEl`7y3H~7|s_zt4hnhnP zjJe{Oqh#M%fCeN%>hxEI&>Prlxh7U@O`@QMg!Qs**UAGOC9#+^VLPj7f{{^l$^@jU zcy1s|fg&(|GEkxbi6^e9c+cU=lLfKma|A8N zg>P{!4~5aW{IUl(v>)HHAzk(TPp4CV<)tttJ3B+tr=Q}_3(Cl{3(<0Z5u*l3AZQ@o z@xInKkiPq0AL0X@9{J@Yy*SFsap$meUGM}CnhI0^fK|5A@~z|~O!m7_!91H|JgG){kS4NZd{E_tbp={>)E@v*nH+168&Rgo%1UH9^PHR0ZjS^cA!TbM%=B zke_9`Q^hN9lNSA!#PP5BfQPh5kg+zKy~zyQ8pcvtF{n$i^bD1?giQK~aJS@OUn`m;Z=4+w6?e6`KX}4Qzuz0iX^fQ*H55DX8xPJZry*YjLODyOt z?@{foT6&>qI_mRkQNWK5y!IOWssA&sm=`M zEzF^*rWGq!AcS+3i$0MHS&*M01VV(mny-6q3I=m$!mO8B>Im8m^ZIEJ*a^ zf7qI0f9JGzj83b}c#{kq(aI1l6f=_T5D1jSxNx+(HallK;jrPN5b1IOfZA+f^lG9Y zT1>97FYKkWrvZp_Xg$h)1U4=eqfbZU1eCE()QHh;XM(NF(6s2Hu^8WUPg*u}80lxf z&VmU$qF22f={Ey~^LkM*SA|#5oH9_~l>i~fOt^k2|ViQZN9qbq&2;j5r?Fa_Y)JN(BqEuzPA~h zK&m)cX+KkQZ^PQ}f5#FSpJTO)CDsqDDfcb#N2SORQ}8Ay)5UHbhz99R_=AUPYv70h zq6xce>_?R>tvWZiCp59 znR@i0_Q;0RWSV~ibmD`Mk)IUdE{g8=vrXgs)VO z_r;88!^mm%8J7m&d*k7O9k9;$9r;P1dT~S|{e))<*XyulAaH4*m%)g{I!EM&q4|Nv zuhLkggRqn$E8;d^N_xUDo3NBDI*L+_9C@bBj9+8@VE#oK%d{@}YzFs%D?#9c0ANnO zP#PyN+t;os`E$a@z6O70ro;82YPPh+b9QD>AT%YP$`U~h@H0KSOh+E*=2>?^lcYx) zi{*xt#!%$ao~mO<;?t;9>XWQhiFC)spnY#992^TUrMjj3O#%S-yM0pv;|-TPTiTzr zCFqm)IPpw=mH*&2ypqRAFZQ4EE>*>XIQ_+>B5el|w9Lgr`bW*A?9};K^`4TOSeYS9 zOoET9F_Ay^!V`J0*N6PvcBU;}JGYJX|8^NJU}to6hTV0x_c`st*xj=U?B*PV7ahv3 z5rm7~?G3+FcpbFO5(p?OYAhlZxoxH0&;%Ht!XVsP?tr)pk8hqwM&?E>Wkx<0^EUV{`bY>b)>h`zm~cc~AxObIVHr!s41gdNs#IeX19hk> zt3xCWfM6G@xmghOG=|X))U9)jmZ$NcbjHcIsy#GTRbu0^2#s>K(rh&iqJmov;ETOC z@mFJ^)INx}yUVG`_@!K`06>P>B$N;sIa^dphAP=QI~r6pQ)Bwvp zc78|}vLF2VF8q|=@iI%c2vfkrb6s=-eptAOCvt~3@@o=&7GcM)?TI_W&o9Y=C?)O$ z9A1~{j@-4}XQ`GUWHqn;yl(Ypq}wHuP;>E~6E3GD$6yx9vVsI6)`p-*f04fo+9Q0K zS9~9*NT(nxI24b9#$-%}7u5{6WZYGshLj2BjlE%6Qk=j7)P8M+w%{uf|=edIk zjjdIR3jnbPC7l2OKmbWZK~y!PjtL(P=F=f*mX6)Z(EVScsLfBO4uaZO&gL*#Fz*0? z=kHq(7~qdMjLY(wvZIp(_ND7oJrv;t;B#g<#~jR(xsC8EI%*hm!baJ)F~MXu_c>Rp z*BE2hnK5<^VX!+x7?ViWZuk`pDcZ&i15H)BbcoTR%JbY_a2%SM zo)OHu=AV2SLV_lhGt5+3I~U$HZAXv!5ub*ZOkU;68ZbY6!^;@h%3iDR*3gki{ETiU5!KPG z&T!NQyRmf!BVb-vaUKVqcNZ|B1`Ua+*o!T%fB^Oidq3uL#I7N1lR3AIS-=irF~>t~ z45>Lfu~P>Ty2A&dLeh{d_jc?qx#Ggej&e=ACFye)^L5r;9r2`x;>zK{Vbphh06s?C z_;WO*M8-sjP-kbS%~wbU`^b<+j8hoEhF#%&`s7}qRRWx{z-@>+ZTD<@IZ1g0)vV|zJp^`saSb`HCb!19`^;pZPuM3ogM-I93zjsW`rRRQiI^D1}r3W5ZO>ccnE#1iaqi6DLUq}KC)3A-hxQz39;`W(o z*;lTUbrE4nOMp2C0Qb<$do_Hpt{ zr71edgC9U3v?CozTQ02@8jaxXnf<6)(~r#9v-ZqcQVm~~mLSk9RaWT2z0w&1)K8eT z5K#y!A{JxX%Om(ZpS5$Of5Gth_8srOg-M_}&+UR(=-D{ZzxRH4O(E0ROA*7dylAKmDNeu6Lb~RvuPMXT9_0^wCe;9)XE(N>@rke{|JoI`?C@r6Z5) zOJDfRgVQHJ_yE+S)DeJdPHCVZuWi{_4yI*SZs&9^SiY@wDUCow(vc}P`Ye^iw$y%( z=bE5M3u@IMCw&Evn}Kc^mjr#e1eVg|;9UquG>;OKIbaz>i(wzBrk6ew)dlF#?P>-% zT&cXTw=1n&Ih>X+9|FuVD}_jumMKyc#98Q$j3>t@($qMUI$Z+Q0I0a*^E=#;}N1%VdmF43xz%%3$AFD)?s0|fH4v=fvW>LN`9lGB#+V`%X$;popl0e|@S4*!wn zNEg6TCP?S)2-@rL$2&#XwhIZE&!W>cEv{oEO`2Xi;t+9{-$@(PjUBp=RL_-l>9-v_ zB9)!}5pbRPHNoFpI_W@`hxzqddfKtoP{}Ht^Ia!FV1PfuG;Gzr#$}wweLZP-9`E)U z2<&8C7*;S)s0})CDGnD>_1Yf?v@%Wsq6^bU)Tl~St;KqzsN-TGa(WntxGnbK zT_~RI?{*dBynNFK_K~&|Pr|kj0o2X6D(_F}FJ69BdfXEZNb6Qlq?f+zn)I~iU6p>e zYP=cf=B+d7Rd2j8o&KvoNSAzLV|wOu4oS~=%7M{O+DmIFQvsHT!Cinsht4F zli*n~px}G4NdLe9d4s1-y1gJXgOM`E40Gs=l{I8y;jfU|AUedjutji&%Rnr8 z>6B-uHH&j(td@}-ca)VU3bX`y0WP?YLMFr#JmirTMZi0ezN06@upwFy5eE0U%JTOD z81IcLoPeirlzn_78`pz>G5Vqclw|4xcNAfmSn3U5R=ACf!@PtOxC!(;dsr3%J;M59Pt?zW6i!kHfA0-uba@0qprzj)KhPP$;_}={Mv@3~K!Sh}G2DdSscn`3T zjOXv2)eYH2z5{e~SC(VMf|%L0(j-)!-&!9YMJjw4VdwWbTo<^EGLIkL5RUbwUybeU zM>QXC|3eQ`m*aIrlhx+|aH+33Xh->r^(@15U}CUNkr#j0-A@y`wc}Pg7!+XfcJeTD z9dtW^zbDtyfox!|P2i`W+>;)JWG+D9*E<6O1N;$IfIq@E4&yS;PZ4($1mb6(fWS`H z1z}0=j(kHqV0)uSbucqSM=Osi?V7t#@48^GJ0NMS--|@XB|6+|Q#!F@u5;LYwEgo! zKhl=;*$ush2?;cqjSi%-JX2G8UF@-{eq#rzX@5|yC2-yJPZwP;WqnGnIypJqPl5~H zFQ-yEqn4o#&yfyeF<%Cr_D}Mt;6qMSL!%~*$uk9wd07qwWB@&PHgbuW=x>OlpH({g zFsaJpT;qdV@8uC3p7_TKm8j`&b;Cn;z6*z4K{EEKkFQP7dC}GBhgY(_>mInPt{F|w z|NU#yXFjnu`TZWJyKUGz=UaQfKmCIv(*IoWu=LimPD}?MD-S$D1Gr0ND|+2KZ2kw)35B1 zcJ5=cM>E9j7lQ1j9pPTqQ^Y|~4m@2kWljJH59-p)z%(GSbJr_v9cPewDtObL*@}xj zZP8{%LKpQq(lJ08YF^aY*-1$82vDNU&j^pgRSiROdCo8Qu}~(nIGuG@s|^tjqY{}b zy>=|T3Y7==E6dYB7jQPl0D)v!Mjv3oUtdu8o&phYZ3DK+@*?7hpozDP!Vy^M1c&A~ zJHKs77eV-qQZtL%a04LuJWwF%@Y{&b5cDmGGj0h@@MqZNeT2q+dDf3$w7lmszVkji zzl_&DH-7v_I=rW>oA1q^?>VBJd=Z6{!=X~Ru)}MOi~Hic0M>qDy>jr_JAZIFY*QPK z$MKq*5XWH|3v8;ZwYMHN1E0NToN!Oqh;K4m3_r?)Rzd$3gv9-#$ zAb!@L#1tT}pM;qge_hynss5du9%od9q{aqfM=f_K6B&uVXZ-~D18CiVBrYU>Pt4%2 zOl1iIpZ|?|`pKq7I`bRT>AWY^(xHo-9US0~Fq+`+Ng4c=@dXGZ{1<$4I$gU7Ng#ed z!~MZB*G{<(24#{|d4z2#U<^45ov}83EOZOw8)QFLX)L5LcFHix7)2vJ?n2WstEq~E z3g|=?i6-}MAt)o2S1IkW`AE-s0G8=jx~^l|qIm=C-()P>T|NC1TMlH};euIoitZgB zTBg_5uU&HeI8mrk_F2?X3_77H8H?+W5<%YKlY9A;&mDA3F&K3sT4{%8KdMO;6a{^$ zRimTVPL+H6PWKgdq6l3jK}ZW_A7osMpfTuwlZ!pKaR(nnB=E@Hh6|Ybum4z=zJk>3 z>A!JMdggB&oKAb_Fw4uZVgph{$MJVCqxi=^8BJgM+8yb$U)Yc)*o(Kq8n(L)JJPkg zd~Hvo+sPhsRBw92tByr&+m&ATs{2sBWgjJmq0C57^w9u3fl%qTY^59kehLZZ08wR~ z^yBX{A3eGBmLBuS73px+^}Ch*g=49h@(p!$(18jgc6O?}V=Fl9jrZQEW#v2QNqWej zpFGR6=r83tv8)hv<#wr}2)js2#lBkGc?EPKJ?8tsW6lmngQ2=NO9;i0U^DzW*`#}L z5Ti!|D@ZJ8t;*Emsm62~L;BY@$LNEYOqay(43w(tY4Jg*SBafCW3(f|_hP^}gFb#1 zk!9@ZipRP(UnIJZeO~R(wWYB`cE(<)V-zQn$x!E!85?V>n}1(|L@QTU0tm&Sx_D1v z2`((O05lYcne7M=11{3T)po$>a|zA!_V6SQeOqR^<|1L-$5Wn}M?*CKmbYm(&J0-n zR2Qk?C#!Xf{Q4EZP^n3j6=9g(AU6WFW0Kem(|YvV>=Z}m>j>BQb8;da%Pi`JFa&?@ z{X2^~Et17MC3HsRAjGsAKXhv1$QGj<2)LUTYdT^}8$21eQ{nBf$!Pd1Yk)w2+Vj7;9Rz;t3AJ?Wa8cN$ z$K9M)kIbbPU)Tcvp133UD?bkqNLm5}ZZ1F|lEH(K5O&0MD3~%WVfU$|n6_XCE5oz{ zMqaJ38Rn=N0s{sHqApLR*@_ITAOF2DN;~OkI$zZ#eG}{;!fsD8<)C@|!&ad++52(H0Iw9rV|X(KdIC?YS88JLdqgQLn-p(pv6{@`nq2wxiPpwPR* z?Zyf|Yey@SjDyqOIKp1PzWvfAM;*>kC(N%Frrl_&!`SQtnm+sKb?LL8S(kd2ce6tX z0v*7s67y|Lz?c$f(#}}84)9kBGxj90yUW}5_ky?0o2Sz=pMPa~`Ad&Z&j64P^hbe4 zM5jJ@D4k1}sV$!_>M5=iBzQr;vaOz$9a>8dduZO$t+W%|cxOHR8~OXtzphDZZe!OB z!DMThQ@=+YG2dJ(2Y&koRLFE((bwfid+}SAKeRVbj503;$% zmsPNXmgu9QkOo~aP}3I~ZaMq1aNC)zOc+2wX_eq2&NjprMw}&5IY@zp4BPN4h0USC zR#9u0E+l}ykNU7A_3i`yqY=hsJQo`I+^!+6gBut=51X#M79f?Gi@=L}J(~aWyu?K7^7uCF~F*31oHU~;J$++i;L`ovM zm{J}A8MvbhL85Fh=R}Xx? zMf!B2n(JaocXr|Ba#zx)10}cVa*!+kt7FEZHpAq_mPtr=99YCe5a|&$jkM+apzGq= zQd#Qpy~*zx>VDV368PTKWlOFX>oxch^y5GvxQa~1e`rH`@;W5T@U_r9(BFhfLhwo_ zPGW!$AIgJrsE2=fS7^crUwV?RO1@_w_K=t`)MX^-bG9LkYLqE z>*>G0wjurVM{nI}UA|Ym?CA83uRS6?`Y|i8=@W}=??1;?g~JD)^;?IgOTTk^diK-V zsKXqIB*^joy5-~fak4ib-GHc^*S%b7tI#^V`6;enyxzCog>_^SD+N*Nn zh7aUb(nj=^3ey;PXk#i6oCa5^l^t-oJv@((qY0x79PoCdS#w!Fx0aLFRilHX;$tKm z8gDvc0vjA!4xpp(M3rI6+a?VS^+S|OS;hf)07d{}KMShLfFp&oIwEUsL-W<#)q2_q^K|Bm?L)*p_1GIfGA9>ou} z!=lY|&G4)~o#ztNmCw8flr-NJ`G_=@eu_p<{G|)qBjX38MgE$v1U>oSBI?bvot9Fx z3gtqNSOycZ3n>_)4W&BML z=)@4x`aIIy5fHf4@}KwpAWW|x+vTe2H)u?|Qg|W95Cu3fCc1`F(yb3TIS!I#U6yQ>ZbMp@c8?(HZD@UklO7{_#{Vph!deIs#HCD z&+|p6({Fd>%Cym-wTpWRlD~^Cc~tt&`43OW9+Lr?YVOYJ`jO#&=aK2TXC9s^ zbv`WO7I3kMaC*QA`MVtA_TL*;vEQ+-@V~cbwGU1p)g%qlfY&eyh)HTLbw)27{g?fi z%lGwA*uj4aiDNgs3kr-0BkuUs>)z8yW@Gm?y1rR>U^n1zXeH|&qs0w7duMFNMGEyq(|h;t;E#c%WD) zx?52r8E^#dLv&Kq!BwpX>~YXXL?F8{n~c(|Qfuz>g7U&|zAno;Zhp0gWN$1{z^TO5$;(p;BS3 z!=@8-5oS06ohdSHisZfa(6wHd5=s3Dk#k8LZnKD)kK@YWg~Por6)6eQZ+tX^DKzKORAHyK4SuhtPgfHhyY|@ zkQtWz$-|uVp(ae}v(mpT^nmZk3*l|{DM3FBM&*+;(3%6&9{NWCpnS>UgH3|OX5Pn> zI(*mxd{Zl9Jn&{nM;$KJ5u+s0A2qmSxK#~e+6Mf=$6aQ8MHd*r`NS?jqq&lb-d z1HEd1HGOSmG3$4{dv!YPjLXs~kGeFy^Pg5z4}c^<>7TsxnDoAPJ}~or{J!et_esC` zv@G?zeZzG6i`QM39{!li(!+lFvh>~$-IDUc*eM-)XfM(;VOLAs0MC^N)zXQ_w+Dbf zy8!^G0M6i~$BCN&=O-*jdi9=&m1Vzo4BA^b%reXQQb4m14KDq)Vf3 zCJnPp3?v`M`ZZRSoxf7SOjv8WvVELDEWZ~7nG)`N;G(c`&nc*(Y;>MWz+`-W z<1;^M2_u%TH4G`q13%m@FUsh25q3%ul1C1RyI?Drhd<937tJswC0; zMH%y*AdFu=%kh?K)e>m?IAY_X!h+2@@5|o+ei24aZ^VHQJ7q_}im&TPksZlosUo># z#AC)BjHr5>#$K;y5T*nzM(54I!8r2LFVwFSugrr0?h8-qO}_;gyLEIfJqh*fi;wF{4?n1qPFS94 z?S`$5^n;Ca>0>vcu0ccb0OI>BKyF2QGnO*ww&wtWzlu%Zx9aKIEl2`6e}=R#+9t5W z_2D*3Lo@8~1H+RVWQb}Vra0=e05^D2sEAp6G|vd8tvJ{t9fHRy`G~hD*z;ZtK-)*Ol&9ux zAy?#`=4u!FzW3ae{^Luxr^lVKGX2jL+tO;JcrNyCSNfN)z9xP0)3>FUy!fc}vfn+L znbesVmZ9H{n)m%5xjCKt$+c%m_3I=By4C%@C5dNhN(E)&8}w|;W#Riz^53I zyZ@_5Rv_k54XR_b6$oQ~8L?TGx$@pW8;$3-ET&RI)(Gyk-9;M`A$SgEw(w*!0Dje77VmU;2GSIqese^7Tls+-oD_o~(qPK_BsIPpCS1hC`|Ilr~+&NdR}d z3-AYU3bpS_q-wviIPh0yL?Cy;Q)=lGH_oPaTr-pY{z|3HJG%oRt2dq6onCZ&K}$P( z*`p^J1oosCd^>}{Gs(+&iv@ult`F^!C*fT^fIT}?rGGL!C4E!0>0Wju>R~WC<(6*H zo(Ao+vs1AaAmSKkjmc_E5}EDJY9u8ucGA5(>&L#Z3gDLKxbZq(8JW{I8BA8;aWm`# zp4;Ib72|@QE*QTcy=>VZrh~f2zzxh+KL6`?q%}XwpwUSsViE;dt8N%g zKfie_HB<=?m7u#Q6(+YjJ6Nyt-A}I{O&ixS!d?OZwBM_vX^_60FqBPL==Y+}mFFm| zk(!k|=kicWXrGDwK+s^7!G*JyrNtg561fH8EM{plb+jR9Iy8le{uOOp)mbGzj0bkC zB13e}8r+W~rIT1x!f<+wp2xHWCz7#$rA!$Z|7j+_lkbZG-ARftXsQ6-}a zPX=mOs!zg*k;Iz;N8~=w04>MYTFCRNpN!;LcY?p7*5g|VzydPO#$|1JT@pq~=JkD&>*WlVs zJ(|ua$cL(htO~ZM%(-WdqU`A9VkGKh9#t0E;emMTQ`_xI2tEFC{T1FKEJHNBY}@CI zaKlnEtm*@H8B8#kBXrP1XY2DQQi?)4k(tUUW34P`Os1IC!G@K^;4<0(!{jTZ*wE^L zB5?exCXPi{BXcIELx&mL3m4!I;M6Jb*BZ6J?&FWGrB^+uD?Rd%D(m^BIK1|m@0JSw z%J>2V0$fi5z?zpc$jPlOg@Ky6pTA$`e*mHvgs%J_Y;n8R-g?^_q&*|sE~^!NjrwM$<@ zo)#7UF4E+hbp*P1VYW@7#oCg0gaxObvMinZZ>Oc3uX=pC^ukA{r#2sg|rF814%hTK@I!m-qXTI>r^u2FCI^F!^ z$EUZx^Q3gNGo*>D88^bJ(;v2cesFPr(RV3ZRt^wtH2t@xc@M7DXvuw~ljwuxMI5nA z9cO7pJ{9H#da#d%$0;q0ITj3f71)X6oDHl*(QDPnHO=<;)@Slau~~P30;GCj+d$v$ zWDafm>T^>uX&|<=!D9oNE6E};x$~W6pTjZM3e-rtPq8au%prF)908(`#xDd@qtg>K zKma9sZXP&%K_2e)K3o8%& z0H75QgtH{P)_25OTzfD06OsA61z5#1rFw!zzc13r6`~11oq)*ngX{&LFc@bs2Yms8 z!rqPghzB{55xuE1=t`GNir3_?>IQ*4uUA^Qt&&Y zG&cad>B}S8GOA#7mOD(&G(_$wYoiY_HQ~-gd;mHqTFI?-=@Ky1KH-~hJo6zG#R<_j z&+6fi&N|8%=`!gxLrR-N0xXEvCJ}$3-s5{|!WmR9QBVa~8tmQW0{mUn0{$MiG|6AP zd^`kO!iOBtonF=MWrv>y2z)$}!0!~2K=O7T_j{!d?r?oL!K~mO@TD3{R4k)CL!qPW z%Np&82_Mof_J8s@C%iT2wB-x78?_&Ew4oT(!Cd80qb!6!ws|ZhfG*8ZM~mUU%cyEy*&>9H=u{&*lPoKpNePJRdrd z44@vm1^Y@!f(IJnhp+?sQaac@2fdLD`J=$l330t$>`=r2B*HC#-W-|@`58TF&@x;Z z{tn3G311h-BJzV|>W5dN<~4|U?e5`#pyN**N;m$rP@^s)`1zk`j&vvhN@-h;biR-I z_q)qm@t%{Kqh|o}e)k1OP&O4*vbFT3^B$hg|HcMZCYedkd(IKfz;FEdc=`_D>?OZ_ zbkx&Dm)w~ibkeeP&;dQ^Sx-MS{rZy*PVf8R>U7crhtpG@xLxA@>Q@|>Zo+QzBdCf& z@bCrf|BmQOk9-7^W81ikzq_gE#!cs9oPD`flQm%SCrtkWV})sygHHPUZp^4$#CZ}M z(hB`zFFSXr>h5(5NMx`YO-snCcZZh^(uwy);kpxuk{G2pj;bd&Z)NW} z7L*1#YYzcs^G^a0b-N+)ij{e!-NpKWr6er?AbvdSb^wB{bQ$@NUpdN znnehfYI*O2qJBap7;kvQb}1H!jv^y&f~^+e@obX3n{H@2T*Sza=eRDOTL_c07?`JQ zBsvR_27l*|%7~kQ&UBTd6GX@12uPS8srS8Up#o81PE(Gv6EJ})01covM+IA?f-@7* za3M@PF#iN|%=8QpW?gARr=(PX1koH+zi-;S`Xa&}#WyOm+5iBLwDvHI+j2lfVLIHb z+~mgEX?-j33#^BTs;JWD2(Pz)WtzC?<*Eu&7Vo2sqpiE5K>SApynOZPV zzEPT|idQ=YSY0d;WTTF9AY3JUwVr+!Bp+wpBK#xbb`fcp;^;-}9a3lL(A{UsI@PY# zksI_6?K0Tl=mjX|$|}-!7oGzA0hF4OzhCY=_`3_U(~K%WAVBs77Z)IqJf6q>9)rMw zWSRjk@j?pfrUP}dQ5C6ow*w>STAJ^In>zE&Nk}qum${l`)bC#8s*Q&#v{~Qr4+X== zP@zD3T%=P*2kH+Im4x)$ChFIC#CCIbluGet9Pxb|f3zmU{00I^#bo20*l&id&?U}wRj z-P)@T|E{qe>MV3NgPLY$MqUQ(5(aE8`Zf8a^y>c95m@{f>LMI!!Jnbtym`$;y3f&h z)@&I{FG8F%k)ZwKj{t}rumhZ`pCIAr{8}5k?AjAdA|UGzwx9zxx;9j5q$PP-IU(*?iCed;qZr&TuUwJ3>c;^1U_9(7;%3!dsC5m> z3O9&S8fjSuAXADd?y>E`sPq)7T!^N2$Z^=F5D(G#EN`EMml(O4R{RIYqN9U(kudH_ zk1f#TDp8>vYkhQ_mNnn$93m)P)w}*9?zlvy4KQ36jY z@CQH&@V5e+zk3PzE6XuJAbAQ9$lk$clGpRN-y;y%;rgh7_~ln}#R}WKL7k}wb+58^ z#-l+OQw(lLm}JxkGn}4b!CiP(1F$vch#GJwuTm9;)iT%2Hf;2zF$P^O=b;+dPJR|i zU>CF>`*p%k=8&4J?eeQmy31G-@ayAWPfs3rawmhm*N1iC_=V}alb3crpU{csLUQc} zbRd6HBcd{bF)8!|?01}I)CqlN0-6uaK7Ywo6_w!)8O6T3LOS4%6klat_siu6Iz z0m;lVbOCOHH&r3HDswjES5siPk*(Y4=Llg8Z5h}=^RJoUbF75HiY(%VdYv_!A;vib zXZ1P*jssS%Orwphq0XCOk;-nS2U}vXj7DsDULzqeJx0uf?BUzP+A`YBh%{r38dB!W z-YSW5bnF&hiYOg{JE|6(2_EX>FjwoJiZi^GD_Li78mS@WI?iO1y5jNZwYQh+?h0~X z*&*rFU;90fF6hyY#KYQZ2}dLyfHF{s(8UVnPke!!q7jeKNH5>AAsu|giTU9Ye=!kF zHxR~sSrofdZu062kbWJB#O+W-x{TgrEQ%z|uZ{&dEzH1ylrNM7wj}R@KKnxs?}LKu zl#v*#`tzS zE^Tt8N8^sgrOhATggTiH-|U5bi!^c01UY=Xf5MiN+pKqY~@ zlO}Y!J{*HM(1hnSpw$>q1u;SoEJiPHQXS_EUk43tb=k*YRaHnG?S*Un#UKM3tDrj3 z7Fy7!DU6faVz5a&kQVK%6G46(xF|4?uqwbct4wF zH>J02diy@93vEcJF`H4#HK{28CR5rjySagb;TQnGgXDLy%Q&#x^eKP(~&KS5IVK-8pv@{;>R0B`!s6Og8@&FbZOvvGHf!F=s1Z{@q(YBaJedCFy{9z8 zc)$rm>5^}rkuFAU{KA*~Fx>{gRGaj$M;(}cZU8VOo#BF26Y!LL^s&rLKkM4`FXLDq*R|RpQh-6g=n!If(%8d&x69HD6Zb%zrz1#z&{NZhuf~Y>lUU~31LoRwT*Nz$Dze>80U}z8(8VODVuI=^SS}bp!q8I zl`6~wMxqT~mDz*UxaV0#$ty=?JdV_0TDgp-f<&>7v1&rv6`&fB264pX4*;D&DV9Wm zIPxwS!ZvD8gA|Si#NjyuJ<>x_D{h{H8Ht9S1QIzX{d}0gpQzC=yr=A~4=O2grMgS$ z>I?+s6XVJ@FZRGvQ9(-)hJo^w?=>s%Tb~Fh1!$_*C!< ze`W3i1d>PddINbD_*w=Fx=z$VOBiAB3_ZB-rAGPA!gM8kD_g!JT`Im&W#U=8o=~4~ ztzDo494CLM-V2*zk}uD41RcvVKwqK$i;!g2bo#`jJ*w(ubKB`-TVo`>Y2)7pa9FS` z_rDB2_;+`{Ic;ui>3BVq^%{Ionv>_i-=g2*S{|fHlzpXxQ8zmf1j?W6oP$PSykQ>* zTZ##i@-^s7=l;O*z}OW89;muct|#sKr}<2FWl9!t27q0D*+ymqZ!N;w@$@@q9+e4r zv85NlBBit5auR)S&esqc!Z*JG;R+yX_pM{c^z3-ol3&ViBRh|{YlrSi^7Bcgd8Hcz zgf=^3fZ3!1lEQ`UIDKX~+N^5`>Xe#&{L{CFiro7L+)vYBR zU;V~+_VNTFyJq;5>y^Ui zG=~bX2u6q<*PzWTM1cpw!=yo~Dpj{(;5?3Pm21BZusnh*kvsL+E;=(pE!Z+~8+ni; zfejB0vDRM=sm(;5Z9*C5*|_enIgw`uBSCZx!73;!M$9gt3SrBnr&zCRZ0lHvF13Yl zLO}ynr>+&`MPn^!DNtNLt_*UnD9Ohfs)rn`khok5EQP2$eEh}Q{<;~ zl8F#T=e6*`qaZ}ofc^Bo-O$GJIe42OwRu<33o%Sa3RFjr7NS3PT! z!MiG>nJ$isE0_BX?-JMQ^((}VTAc?tawUL+xwxSTJqpN6K|qulq^n(e4~f6oUoC@1%n;By{7FF$xy56oyj7@U`E@ zfy%`V+Ewy8aM5PQ&KgQcBW{BO^VP;sn^eQ==s`)ea{>PTdj=rHI)5uz=kGClx5#t5 zF#k6^3lKMx|@gfIW<^l`=H z73p1@&;H*)0(WZ~KeF|s>C%bII$r)|eL6t3j|qEr_>E3}|sc z1i$y4Hrd(SMw2D@r%YA`O26pf+CFL8P8-^Fxhn_4_NyUlC zcjj*%kxo4WDVG3hF>#Gerx&5}eaaKJ+u|9?bDw#5dhqEh_AuO?l2trt$vgRQGl@TW z)sNHvdCgVn^wTe7hV#behg-K56Hm5IrK64?N`Lu^`!(Oa{?#X>GoFAneGA|bP`b%8 z&RsL!`Q97TX^*&o?d5)+{`~b2We1rmWkpa)gBOgcmBp!NZF7nGQLWcV8Wo%93K3Y=1hH_7k3 zchXzAYKGxeH3ZCiUUG*gXShwWdcHRjvV^P6jFOrldKsP{f;^ol;t~lX+gt=1@D?CI zn+OTrm8#hvn62SLnj`b1Q;rUrhOmug6*g|%7>h(%7oU`0Mgfv&gUXWx3NU0k`BNBBIxhutLL9%3#>?5~)~^uNX6Uu&@>>5k8SjNF zrJL$0YzrtaBN9O6(7Yv7yyob6&UIur&OD_&4K3cwJh+WV)Ik6{fOC13-RbjN^`6Q+Z!2=0jwXlc0QvVLDTrfIR%TS*bxG#>+jQmIX_idlL z_Y%$$b9VmN*U|^Ke0ZOfeOaGPA&3kF+6rkMmtr`1r~`_!fATC(l7G1{dFD@mN4}Gm z1dR5Z^34Hu)UsoiKEw74no~$3jZHygu}Ha$P6A)*ffVp_Us{*6b(`anFh4Ei`qM3|$5_rT z3!jc+mhUDcdN2QzE7GSvbqg{XdU~XXZ+y-DSx$!jW1iFY@Drc8HA@@G+Fq5{{QP(i z?+{m6-&ty$2NmTC14@Kr(+X%oVTh|+h$@usDX@#qk5HTs;X0GjT@U@9bSWRxJW3p= z?Wt+SbkAKsu#d6(g)p5~Ozfz5d(#lB-@CuBjML7!3jkBYfZsbu!BY@t5H*3#DBcYu znt_aJI%h#?zYtQtVhbguIWk@|I7`9i&Dm){v>;U|^Ih4PT0vpyCsZ`VZLwuX10kKc z6lDHp(#DyeTTnK(@Dq=`&IQ3mI3I@(FL0g=KL8#V_T%3B+-F4yaV>ceYxcmk&XHR< z7(tFpc&TKPvy~8`6=$EtVZ+2f*Q#hk3I}6QS}D`9Lvvr>$cp}aR3t`#r?IDyKk5_E z7n37MhafT1N9Z!Lkc37VS)24zSI0bNsQ7%*ESj(McqfdRqQ5^+b~<0@a^>RC&P{O=j3SH{jSi+TUKD1q-xT%7*)&cCC^glhZl&pMW`Wv~_^AL^e!n5+xWOLum#VGk;w zhJDIGRm({;ffRY*1j;EokUpeGt|ag(O>hGBe&2=cdE|s8K_5vcAk**YS6#B8Nf75=hc4=z6H^%4^G-3i`so_) z?EE#}_lQw25h!u-JHg8oQWz0z249v_9vRuWi%cC2W!s6JD=I+5yuxZeBON-KdL*7x zzRKXQ^w$JBycHCM->55!mb3^&N@tVy5dH}0JW9~VfFd_$o|Ru%?G$&g9m6$vzb#!z zAbRo=IoX$fOoJ{8zBuP}q)O-;J&&)f-WI6??g8nEgpPRD+O@>OJx((-~6P~N)3Q3pw(vF&pkSIr6hquY#`Ijb@BKIQgvtxFp4OJupLiwJw zI5IMx#@X6Znv_RLTbdWRn}|mHuAZRzicQ(Uu5EB%9!iJabjRPOFOPnuEaqSM^N%L4 zOt0PWdX_26(zktC{_?XBR#56tLrflmYy#J5X3{II(J%T;K8vO@_>}ifkW|xUzo{Sl zO$V?NV;+7>lWIINkPP~Tp5)QewRInTSMWo5;t~!F+|PQ?^=UIprL=Qzd-KVuCa{91 z?om9XtxA}$_`~Dc1sBg~I_ZVaJu3R5_FB-+1FWdq=)n0 z{MCtB@Gvh~g7<%T=TFH>_SZg73#7SC{gt#Ewx#eeOT;c%Ef!=DG~jhC7){!yFtfAI zQ@EklLvsZC$5`P6;&Z?1VFY>dK)xoaB@PgS2_dau0(SpiMTB<7#yCF4$T#-)MMRA^ zRUNVLFa8C8N(J2@Jr;46kO3lsJXIr#Bcszoyx95x06+jqL_t&q1h@hoOB*Qn9HQzTF8nK< zKMX8b5#a?`myt2r2*4K^@jIVIDZ#v;iP78B;L0N-4W=UwODDo0eOy}ne3?ep|1=0V z)-D22$|fy8-&$7!`Q~QnTzA1R?PLotQ71MGY0Nqo_(k}nTQDdMmg+gxCKJpOo>A(F zy@YgXexu?zb?i(~y0+lYHunqeSf4e3@JYJ@ft{=i!m<+<$ptMippd?5@D>NEO7~`1 z{-8>m=%P(H6JF`FBjZul*p#W-0nfOM2RvyG{^aTsd3{P~i$RnFmzZ=!y}G5Pvq0r% zHcJN`xux&hUs4g1LOwlm-Y+Ie|wFI&xVUIjVi30}^#-q4l7TsA&%m&znX<4N=0Qf+a(2T*wj)mun{`83sfM zon>B`JuLB>2^u$Fvo*c{qc`Qq=KY@W$OF@BU;6+??E=I-hzo7r$)~JHXPn-CmTVdP zV;^-;>T-KE`>kDuTl$`VUN{}2+Wk2ZL#d$sFj0K|D{IrE&iE#K{@xsYg&|&g`JL%$ zPq`?)=C7{~03556I6IkSjbI-c6>8epQRMgj;J)cMpMJ#rgv9;7fA-e&Ki}SfF}nTX z!fD&{_at9h0XsS9j8Yd~!GPvls(~j}8FMf1QoAaS69c(MZmiCNFi3T{ zHm9;jKFf3~zqC)Zux4R;BFCN?I$a_cQBF>cp$e9eSqcVlr?ha2?cq$8yLlL)&cs=0 zg2LftOmqNfC@Qz-uVbj$*V~`^S-Ql9AS2-o#MU=x{?xf8beE$S+=&IghHB5dEcc!{T!R}`2x`quf( zODjlgwMYur@jiReN4}?gTV1Gyl|tB{1Nd-Bd51(VBG14nLbt{!cRT=)jHd|81_U39 z{ItYVaq()spb|Cg2%oU2RF<_M|Hez378i!}FUp2Eg1JzZmXX(ZQ`#4OyU*o4LihJ6a{XPq@}-siBPa&b$I z>{%x|CUw+cdM-rnvK-SRs`e;d^6ktz)p$ydCBayXm3&MhX^svWKkkF*{=b=d=EmYT zIdM6io%#*%cNvnuF>L;n{5=x2?|$&tEZzWtk7Av`@3BP8Hf9G?R_8scJ1-GakXY06 z5-*}7hV1G{xLrt9zF?)tc3reqZJuqTGSgnx@~gO3mi&VD;tmY6(7zJ#Ilgtk>HwsR zFv4ITf~~MzmF+{VMwh!LG3jKQbp&O`%T_FF%e$7CrM9070{?O2ThndzHR&%7_;cty zx3#vO@1+mFI{LNr*Bk%luALoCpCS;`KC7qO-97SBQw~fW0L-G%s`l*ESfx+O%m#u&V&hzyw{@>4vF3SKX5~O z>F?Yp9eT*l+P62p`o#3*udYo$y7Uf~zMwz1KiQQ-({##%meI#9+@SAw-+{E^z@BvH zdgd7@lxTI4uU*6ueOZzBvR`Wb*6Rq4?+t>P$8S6Px^(LrOoB$HQSFxEo5b!wxo2U+KmP%iIzUI&{lefnFcH zY&JAz4ulDhY=YUyF)uAs!G)?g55e64Gd5L^X!~Nvs`_q%S(OsMOTJj*`qS30m(j3$ z8xEp6F%wQ4iH@GaRHSVKk)|>#EI#w z@hJox>GqZoA}?mCl1A5G4FPYX?C?XKhZI;kgDzZ#!`a9o{e!?QgD}dEkv8v0TeLB< zVEVJl*wQv>5I^)I^L4+?UeaTuP#SHq>!SSe?daWXb@B-C_r3k#FA92rp8$aXA*-k9BJ~dJkH(v@${$b|2%DBE!STZC#U`JmVZgF zz2l8(%7vNl!ZLS&9A;9~b*O^jKQW+(FWE5!e}jHxeRRFS$zxDb@NEYbK8&>iNq6uw zG#3skAR%~Img3k42B$UH5JMY0H=T4y!Pnk6lHT~1YubkDGA6)KzO)r1d6>(gK1Tbv;0EuHr`F1K- z%G-GhA9&Ac=>YTI#+~)v>(ftvz}9cr3wP4VZ$gtt`ZK1%W|@9aKBl>f16lhzVOtLa zR!5V6jjO%gexW(w?*>@2b{Cf^@nrc~F6=1&L8;s!ZHR zbAVZyGB|!BP?tRDF?M`L!nhtB8Vr9njA=&LqZm%BQg(K+#<3+J3wt;s$V?NI%c#4b zg{8XzDYDrakZphyh@(84ph#0oDK{&um56e}0}y01D}j+tQIhHPEHRXg$kxWSg=cO` zXLTA>{+f|LcmBmcr!b!6rfl>|6BNG+{JP*oIc*K4}t4fe1Ibhqj^M?I)N9I;5SnjOUQ3lgyhVLQvI0?mcg z(zr-xjTxX7_Bxzk@7LI~HPTLQIeSFG7uoE@^_iEqfWOoCOa3U~UAh2)lu;7|Qg)rF zgVr#*8MMwp1McIEeioqC&%grXXxhJv*Uv#4y{sQPG{D-SoE^ZbQc?0^I5JTOUDBu9 zFUHnNv;$|;SC!Pz>>N$UHeWQ2I_(#Ep*Y5NIt6xlfB<8W?Rm)4<%iIN{hg9N?MgkO%YjKL zxbQ|PHC&6Zln&;;NU4t758D6nX&$^Vm@n;2gBkNx$IjUK{mX}MOcz{)Dzl9{^&u0@1zoMUNAKn51>?;0t&s7CmC!BA) zbu9fe5<8C@e#T%)J9)pci);OsdSIQX^zL_`mY)2C!+g1u`~D9%rMJEn(A-hgZ&9xF zZ8fxFZdZhRV>`@A${RQa=3& z5Viaf00yYyT98;e^Aun)ppM`#`=dqSAIU*@)IZO?i3cS};u<6=XPOLNKW0PsyQ$OW*+zjfBtPEF63o3FMv6quhK(?(`qu2=-VHt(ya)F@cS# z&1rnyrD@`hAEluq9=>CJ627J4lz)P{F>(u9XFt1 zIB7ZS{Qc5?@CR}1)&&TptSmFju2c0;hU5O!P(m7KLfQ;8As@(^2cvQz;3(KO2n|3+ zk_{t_7)d)=$%9>0#d*z1d7AWN816+KgIdj3_)I?F0MZ>HoQ!0cKD#@Pwe@xBch>%1 zde^3Rhf12{-Rs=t6W>qITJzlW&Cv_)mNK?pooJ?JOO2TIU23pA%aU{_`6+wXqDoTu3pLOTUB5&QCT zRvM^Ca=3RnDi_p-ZXHIVw8iOSlrC6;c1ScGcZTE9cx-I*UGtf(3@5{GI{e2cyvx84 zKO&1l@)zIoj;6;aJoh#4^B%}C9EqR;T=3eE6_c6@ah3fEUb0*-tdxUu7`I4U?2?=>R&2-jbOK6uqV>$kg!);3#lNP>HJ?obM?El%>dX9lj=C^S&{qRv z=ms>9%K-@?#5=(t0Wl463`V&H044oV8rFT#ne@u+;aC%qFjW_0ljVJt#k0H2oE7M3 z2{VP9z9P9DI$g_pe-Hh(lH2`muSy`3=w5xYJJ0JkvmZIz&rPs#W)(?x4|Z2msIP`F z_33xEFU)_^K?lbid$G!g+&|M%v2DYF4^)C$7(d!F!}pxM*{d{x!Ez6SASFA%0Q^dC z(jzKk!V6OtuJ10VEb_x!KAJ8VyD+`!pf{vP^*{3NN=irL-HLkqZFjyieSYMNl^%6m$V+I}oLQnovz)AEzJvE16N+rzS^DinBE* z5vFt@L5t=9Jp~`<#(pDKIIz!%e!)JYI67Iv#C`SU8`2-W@(1Y?A8t=GZ~eOmla@w$ z=RaJ{vMambqu3PQcFSmb!c)JU9(?lhbpQJ=W5bBH3A;brQnS-+ z$;j^VR=&4@_Jsrd{mx5INFO-ov|Wb&hBsf8F8RhePAMPW1Vo&b9NU0(e(66k z#XF5EV}H^7I{Zi^IaizoRz(`=ad>YU3eTh`r=M72Yk{IH^dHEL{D;JjFeqRr)P$2c zmDrP*>r!9f|zoN7PD(7>-V`w~DQ158$8m_9{%|Xt0@mV`Lp5Z&S?dtpoZR zGvjoQEUSXQ?!m(X>a(=X70{06F!dRity1HWr8PBxp*tl-hfF(_CrIv9 z2UU<|p3ug<0J3b)cVo%kH2w4R`)gm8o<8){^mhlpiB&C-eE%ts*nVl2_nHUIIk^KH z)CT*r#zafPj+wuBME4^14qB6}n*HCtCZja_Bmls%rp-3o#`*pP6D?I&5?B5YKlc`t6kCTS1;qc5E{d2znLY;C07u z!)y39>;Qrh1)w7*Av~Byv6W$hKSK4JRY&=`wrBaXhzXB^mJIStT?T<=Tsfv#l7-4L zRBFM5QL%tOx*sKFUOPU_jUx(&>+Cm9f=FxHn05?ebYa0C{h z8b-G92WO|@W1gI9_;D+^94wtKbxNwz*lqulw*K(FslNG=)O*;`soKw0c1ZVT0BUZ6 zK8ruIp4tx*gLbbUK@Q;hA+9YHb>AN_)HUyS%`^IQnH4v#zIiA9~hZ9`{ls zymt$dm*zZBJP=|2rFXfBcm1-QSebvOsRNA@)%>{gVaE10( zS&yXDxQgT}CSAgk8~{sG7!bgolv2Y#>8zEq&7cjb(vfT91-ng?@VjpKmrES=bxrP@ z(y-q^g7;^y{C+y_K7;9Tk8xt(j!r)R@sFII4m+fl-u3^G1P;)_kglDaT@_*NJVC6SHgWQFQO1D4*?ERn?-sL)(1K^Q>h_AsKYMZY7Ap7>NNXt)rE^*-%yFHyMv57U8rm?HfO_Qs? zlDaUE?K|K|m;}-XlVrJbG)Rl!)qGg4z{(g!3&OJv1FAIQud%#_lRW02DZf$k9XrY> zWg$GbV4A=TV+!@J<_4-#+>Q%tz);^w2$owdCNU}JL24Lam~>c7``x{+1RQ9&Klw0q zz8rhc2DAyUOj|~$>9lE|@Txkh59KPhAC2*4gdrvNjQV7b0ZE0yi1cVPm1YEvV-VXY z@7>tGAF~8`Pp}c%)if&R0n8#|Ne|i$to0sKw%;84);%UIyGw{_)o+Yl5HozQp2Eof z9_D1X+KAeR1^vJm?R(_?O8lw_Gs=}O`k;{^`qc)0y1Jk__?GIon2`?1b3pI6K2yMw z`60ZCzEQtj3`C?o$M&wep@v5z{t!7AJyXYvhXKzhwr$V<-AmGUzxAYa+_4A*<~h@R z)>}^lGjyka{Ku=&7|}>}0h;E0de6IcfA-!4-qW+H^F06k?)TPSmCC+D76K%QEQWwfL~t4f7hr5{v7J$I z)cM%j+K!{`*e%-QHZt9->Uz8|NnP+-sgRu^PKZL%X1$86!b_gtJI8jr{P<6H4i)4AlIDfBs&A>7?4QS zasUVvwKkdZWr$_Ktf-nzo5Ib#<&ro)z=1K!Ok!Peeth5(GeY%YI}2}Od>qY&m^5Ms z4X)MlQ@Bv<3BN<{*7b>=`Nut!)+f)i8CdJ}`G>j)C=0NZr}Gab7G)I|a*XmglmcPp zGN121yIFwZ6RBbrTYx)7MgjILMv&;oW0og_Fw^@J+o~iHG3GU1?Z$5*czy-+T4xH> zHrdAtr`amw-mv+a@XWkc`!#78LGaB;Xc=YMtlA6gNc_B-K^oJk~%|of0?e8vo zBx%QEU6-j@IhRZjYjIBCpdM`|BH04IpR3G3N?BI63h!n6cb1wYV5JXugqA`xqYp5_ zDOV1`JZ_M+v#3_v$l}(vXHg5tr%(n`C_@Bl$R&ZA9S-U@l}oV{5+~$Wj2T^alAJ3z zcwHCEi?rkQO~wRlm~;wEaC0ocM2+)vLQ%#a!ygR2kv(Nlwgqu)g@libhCLD7zxz7} z;_BHC#Z|K(jD4N`$3?q6StU{-fJWp|$)5mdx!M)|zf4$*@$Yi9VhL1fM2U&j2AVYE zg&|XAJQNJ5 z<@9DCf%DY{&+2(D`-V4` zt*ZlK-~OLp96$Ll&-#kRxnA-c-gHwua3`r_o+=mOS1jdgJCR{#@Q(q)2FyFEj8isC zH^u;ppTrmDEmcvFXK5ug5j3s{lv}+N;sJ1hd`Lm)z3?n$p}Y(5Rq!iiEBvf#yvrh% zJ%NV+r;9}e>gGO8+6YiCY7&>g-;C2rwk<)om{Pe1KRhJyhY-cZf)KBj)GQy z`%l2AAV|RGc{e9^WLr3J`JTUhKESNI1US)B$JB2DJ8^jZK3Ya+mUHYG_+I1rPIE)_ z7aqgng*HeBX9eg))JF)JK}tViC&o%hK`@^DO`qfpVCrNY=rqcv%>E4PosLoT!RXHH zi0=IE{FGrpq#UIlxP#R=csKjRVE4|#G*(1hT{J}Vf#0ETNCI7j&}I+C;yt&=;;s8) z@WSg*hA7H#axSYB2*bj5S6c zW*nEE3$Dt0i_}DLTxdvz!Ver9ev1(W-sp^WH|2_y+*fXv;mz?)3}NwAuyWmZ$0Q)| zGx4zxzcMy&d~$;R7q2-v&cssq(?9!#_`;0`kv}kOch@Lqs9QoixrM8>Km8`Iey-K_D!S zuq~24YuJEJN_sD7`U-vEND?fHRyq`oQK29afE(8@6 znDcSw{j($RHx=LvaH55EVV0Wqn+P1-0lI||LZuRU^D3LD@+cD_9*mfHEE;3qPQ|p! zT6e(S>SjZ7C>u2Q{E;!00gD1F+oJ+lpMNxJ?Ss+T`%xzDJPeR3099!{&#N@(d#)=n z5vT~%1USKP2&C_iv&4_eK`;wg0ULwSIj}bt@BTcsfnk|Z9aD65J=x#^ex;FhSWHF% z&1k;PIO2LSFJCAIkO>_bMqsLhRTnO2v&uO`&g#=nYTAwlX9a7O))n5ss#k?B4Tx2{ zk=aU{#+~LG!3>xx?PqEQw;V7sYkm)Q=VRLTS=*jA=wRt5?yO{<-2 zP3z%MGnS5Yvp7U@1s-V3xIY=Naij7@6O%Vc$I!t;vB*+!S`%HhNTF}MYKFFOpZrN0 zmP^%{aMCBm&GE3+@g)58y0;t;RbdjxWZX%f!dsSZjV~&A3p4yp_Ov?o(FE*V14C)#w#Tiy}N+*WPLw zhEi!&EK<)9PtSFY3JQEYIUvglJsp1}WF}JG@%ck>+} z{OQy>17HqZO{A7J1XORQgcuo}Pks~5#@{=4VJ zC>Fr4v>n40{zGrNF+TOt#|!Y6&;3eQKRw36{;H5zzUYCT+*g}HzTgwmyL9jCC zAuKq3fRN025Y5@#f=w)PGS&7n?o7c=5`u%t@2kI88@eEpT4OlQxafOU4}L@Y`yaj| zUUt&9Z>S7!ZUre;Xx!;zofsN>F_Ucf&>@;#sWUyBz>V|n6P{*oBRKLH4GROIA&OUC z9Skf#RX=(gRy%+nZHLb_%hF|_@G4p(JC7RBnXAvqXHpiEJ9=}6qI=*&(L44@W=X=J zO7}&HKzYGlAK>TKFS7@jlIV|P5D(Te=9JUf2u=GyH&}fln!ESJ(w9B~kzy97&n=@g zh~OM$vdGW`-`7*tFoa26D#QR%hEvYl%jQutUy*>AM_~;%wT{4CkXT{4q_P$mEPJ+B zu401KP}i|-Dis(!?TjZC5NXtzbxq1$GWLPxZ_?}ySnP41vz{D7YCW#cnGDo-vY@r? zS=Ry$tlJgFg!VcW3zu`#dXoAUw6J8D0~)g?y=7whs#y6HwhgQnLkMsAP#0#njJ4U+ zF$VQ(ZEliQs0Ce`{t8iz0iHN5Muf39g20;bI`G0d;-)K$C`)qY<6wL1`k#r@Yo|SB zO&)4K9RF?Ry>Zjx=i+eZNQ{+7?;y zHb!pDGg)hiiDb6ZOm`-ZbdSb?&cWEzemr)x9*qYm{~*6l^sNq0!Hz)BuY@b{O&O-8 zrUd{jq3mX!NG*8^XjrfLAqnP#4*3laGfM$G_!xiu&psVP&}5bc?~-mg1rOA-f#HSn zm8UAX^|Szfi&_$w=bc|T99O>PlktJ~T^<)chZylE*&2iw{n{^I7_YiwYy95Z?uozs z&>mi#HxOVQ54@Jif--^cyz=Dum49<#eCHKkUC!?!mCcX5`Np{ACTMo#%Zw~f^6pRP zp#f&?+FU9IIU$k&P(886&X?g$#vP+}!o!f28s<=Di-av2i?GTr+oU3eRE} z%QK!1XwMjDWndXv)%z;Q)SKx#)YT^DPzxR+Xu4FBuo0Z}ol9!DE~bplP1mia>OSZ$ zmx1HDWh!Ed7_;Fkm=(sRk8uFuQ4UIA1+2_d_U;@Q8v@*`+J^HJRh!#!TO_LN zC`@Ssf1Bw%`-=W?-9k;%YQ%o*D=td9snCGB*bOBZAl*O>OHEE1qCrjjq7u_%HlBTv z)@Yv5r;S(p+ji0gT(pyIw6;B)T0j8k5^seYjyGd$*!Q|XMn{G+%wnEvOy43+Is686 z@v1d*`G6S>7*g|x=TfK_u`?>dXwUGfBDM><7wQE>^Tf5wD1nEUj-<8jiGyojVnCJ%Ps#YtB2WnS zX>dJRFcw$<0XLkqRWmdNIg$Y@YM@YrN<*FF=46%C!-V(;KZjSz19S2SJhz1*rGzY1 zv5+R^YZ-b3Z`XZX>l?x&v;P)sJ_dL219wlw6|ekwyz`wekJnte{VP8B+b-Q0SAXD& z_~^&?#(x9|e)cnhehSewtU3OvHs9;3z1!;fujTa_-?4=JWV__DP4RDk<>L6EA3W`; zY7jTyawOjLV>iaGhsjx(Zr`uvVNY4?*L1-uxEDv{WDWOP`vh%JgU6JO8Z+wV`qR>u znKhsjh^lU=0S2{YJgde1KmcXnDsDl}O1~Zx|0r{-EnF6^<68wSnzqH&82mH=Xqp^b zXv96hnKO}We+e^Z0K)_qSai5W;Jvxzs#pnKa!EqZoPS)bpl$#xssa}(=nUb(ff0mw zDTW7zur$&^l&MS5oJyjx#py%YScrD^d=k{Gwx7q?R%oeiow;WfM2M6?haveXi5q+Nd!GMn0Ioa4& z0N^xKXHo?UVA3?t^B&)^cmci(;B>Y6jsn+Y!W_#E<9UKVQ6mzEN#5)^m2Kh|Kio$f z=L7QG%6Cy>l_jyJ?vLKiKjkqyqB_ouuGHE&=W|Lh660B%^=pJ9R=|>gG4Dm2B`C4K zKwA(R&?g?Td*n!TAOHI(%|8}Z+yR{~GmrXwu(|~kflBLXPs%UXO&f#7k-GI(K%n(> zzVGq^u3+0z!7PwN@T!fZ%Y(j?mg+p$@BsMibTKAAZ9b@unX=6N47deTwZ}fBk6u{4d->>M`p2Er|L1r`4ILPg75& zT_KRyb!|Qcjf$xq^t+ zIbFzNB(JrwE)2A8d=1tnt%L$GP2#evrDJLh4j8X=*!V50u=1_=?lA{gGFw5LfR73# z^5uBm#ene&fvjd#&!u(A`>Z@4{;qttZj{M2dCqZX>E1&_=e3r@d!@ySa}?thd3`bg z-pgY=B+JV3R+vKqKTQr=-E52$Bs?8JZ7FGm<8Nx0Y5DVR2TN9juUxa5qDAYR=iIU^ zL8BYb1q3Dd+w+m=@BaO$Y~;E+@q6TFv~qotJ}2-qj8p(fzeSDnS#M0pJ>oJ)PiCN= zM|qDjV|ahGANT}-@FCp0P|H@_0JyoxOU`*>3i`Y=* z0j?d077ByF+*m$0Ei7s=3T3tB4k-oNy51Vx!Q_nrtc#1YZfSYym;m+%0RJ`2uZ zR%t#=vn`)99;#U5cKYune= z0weUTv&PfIkn)7ShQ>0M4}RA{>DTU8OiYCTNh{EopbxmnUikytJ?7JK;~6qbe;x#&oBn!gaHi*NmG+;GGG_<#TGCFBEC20Zzu zIQik%pPrw4@1KtMe_&^P;ObrR@PpK!a`NSw7{dU1LX;Kn^_AXDN$oj5md@rOfKDdG z^9N)0w6n(I2mYti;*CFYW?cG$4SCs9{h4J6yPx}oFT}h5@*&!vR(6fwG}JuRolo!i zvD&c&dKxk`RXcPqm8&x zOsCdT;4s8Kv8hOH8JHl1`vebMs6|c6ln5nOmqn6zC3L@=AF#}FOJ48nwf0~DHU|%enGL;PzS4s z+jvE()Jtvr6c7pWxY%~_nREs_8?o50{Iyp~#=JqCS%7;%SJsz%a?dfg)EKSrm!CH- zufGiNW@a$%WNVP;vwXjMuQg-yJ27|t$Nnnf*dIpuBojOHA*L@e7|$wU8AP&C7Ovjv zI_~6q#dsc`qxFw`fYBv&%i;T@v*XjzJxapQ0oHb;Z~7hL1+n&(sZ*~7sCRXZ9-xtX zy2~@Th56oa(h6YHb|!YQ=Lf;+@@!4Q0Iarw)ApB^*sM7MR0gO!&0K!2DQWUu^8orz zOMp6;4XhK7CHNLV8f(*{U)o$_7=p)^p$C-?r`Bvg(tI??-+wBU2i&8Oa^%-ns$`fy?1T@ix32^Zp-kF zzn{M@J~(?#+_3Q3gs!XS*7jdt3v8TJoWbu`Zd15wt?9vky*R#jE1?B^KKuD2ar>P|W8Z!}QOve2 zWSCyU!Z`3x3sqjUjpbt;78`Y865!^ogYo=JHpI)meRF&puHF~FXj6=uuH|doKJdX^ z@mv4?&ba?ebgqf5vvXJE>DO4s({tLrRE-CgNchiWKX{w+t=W6JUZNQfT zJZ3&-d66z&O++bUxn2ZisDkvW;Y3-PZ^$3K9{?SfuMpONA0$0kTE?`rB|eC*Lm+Dr zo250aovz#g0{aJWi7cZ@78(k!V_Yq|g1Z(3$WVX_5?e4v{V@hvS3%eUK~d;3aTBf% zG04gv#!NU6W)D8b)7=U{<}quR0I#TaUT1U2%x#wX~M+*bE1fFqBo=~-jzBhdD_ zMIr1J9+aKWwhYU&E`HaV$a$~jQ_D2;Cg!v?*u2Jb-kZYhnOmhiqHy@_$O5@BW zS?7EZ7ZSmW!n1Pa5OV(2hz}$j0quVyJ`dVbVfP_;Q^_s3`{m04HX-RpL%u zE>F{UuLF>WzPx9{^dm(Pl(M!xyINr5p+_J!RT@(!6k!C$Pw8Sa|5_PZKwDwfKW-An zgtXTLxGlloCdNo#1b;HjV0?^)*crnO=+e>Ql5kbDYCoy|L4r9p9da;Um5%wjMGO(0 z*m9IOLjFAy+rQcPi*bJA+;|*I-}Q?(#`O!NuvjEHI}D%RgrAe0}4 zJal%sKuvEM(gVJyfK@nSVL{gEHIk$2)-9HOQ-Ot#LN_uag?fTS$}PNAnjpLuuL!i~ z-3bO+iDsgDfP0=9`g)=TncT5^_gwtzpS&SH^pV~1w%@%hp8FLhh&*u*Uj_)z_>Pxv z&Cf6MduFzkYXskih429^gO5Hm9a~OO#{Khc0Dk_m%eTg+b@e#?jL|s%+;P?$UdMXF zwiO4dWS9_IS(}q-VSl=R#Z;Ct$MU^Z1D_>8-616k zbM}epTU;Sz2*%mf-G7`qK8 z{w!Le*yVUhrp2! ztIC9pL)Q|c_uCPg<^e>4u;LnklM_FP&EvwNoHCX^*9a}oaY)xH?y;jEi{3PA9d`C| z%G51b?+}>fp$!x>MB8EY^EUzYT~gDO%eaGCHm(PFEJFvC#yWuf1pO{}^<8LPK(Fp` zLjjsIli62V?D`U$vcFH`zLHjq$72!DOo2rXC>fi&^U{GoPvC+V(7Hff|#z#vZ>b-DZlu_+%g6dD0PhBw(|xGV?9o{?pMvjz2j1M{%sHn{aJ=I$NLy-JCQ9uQzTK zz9cQkpN(DDi{)>P7|J%XBEWu9SYx3{1y@#0hdEwnkK6-U{D@%BaIa7 zP3CLPw|_8rA)}C6n+Fb(ZG*{|gg88-o3VVvn|<_}$Kta$AB;Es$XW3VZ@nQqn)= z?ccNu>g3ej+<2Tcy#+m$dIkPTYh4=RjA7R}1y;i&Rww@6n8&PG+WWS6XF-Fm_twv*iRRbB(XaCZiqOpuFMxdc9FCfBIln1y6uDvV!ntm z%>hy-KF;9m$;ZAFo6fr|v5SI#bzA)=NOQooo6`&;fCrjZ9!tQemCqK?guV*)EP-cP z7WK;b3yvg4@l1j?wK2ZK__b(i`Aor(jmdEbd_IN0ycdV_m@y!d4?psJRyr+rMR^5X zaRv9R+{E5HsLLuyhzRKdrztLE=fi0n-mx)Y-2riex&+yjkw}+oOtmugIRM~W z$yUDdT=W0sBJj9+%K*p0?OYEK>;evr`KzDAeF(heebGPgQHtCVW%8F*wljdS%o?-T znZ=sXWldiCst-Z-kZN5(pf2BXZ394Tl(rv95MLf(y;UZJ=n5~h)@~O-Nkpi)j3$SU zj_&1oD{n?ymH}YZ>Hz0>KWPS9=u7DIVH*Z&Kt99?HdTvO^XYI5YcoQZ*2=!E3oZeW zecXKZNZph*Y^e#+o?SZF-T-(&hrevXMO_=wv>m$BPoKOy9@%nPUc2_^+0g>0ANo?} z!ZJEfzNA_qk13&?q#|j;R9v<#&grvoa++y`oX>0U)B8iP319LU`EFHX@y3J#q#Y^)K9~R;IYGD75Iblqy!2&d~;2SP&T8bW9fR zIq$O~0zW#V=y}f5&V|dCV=xA$;Ih|R$Dq;@XrT%IJkRm@yCe4h6jKm!^^m8Fm*E;3 zT^BR1T70>5#AeQEL8J^~`1%W^WSQZ<%03v&ZmKW~HUdDg5=r@#@8&*c_U^bPVwUoW z4eSw{(kHQV35L|O9u3wH2K@Dzn9^gFkV=E)vRncV5NBW8HeSn(*=Dl`_VE=Oquzot z-Mtk})&5IH3Bep~r zu9&ihQXsIjEwaC0o~|WquCDX;-V~2)T?2p+!?R{PYv&En8U0S@JJVmrsq41LLs|%K z1+PoNIS*61(ZcN5(=}JdBHf%{j>)Mhf~z|*3_Yuiy0)e{wHhRl^?EgDl~Uuex+p|= zh11$27$`GFI`EG3c2r`=X`EQwo;59S-Y#AR+2pKnjT{P9y#LS+G(hSu-Moel)rf1O=l+wP2a0JOg2rCZ~te)9bIu2*d*)f?~o3~aXL4L2Q# z|N0jX#&w_BACm{L_$hcyRGr)LGe$4jw!44;$SdWfaiHnN06VxEQ4caRrr6^ah= zKFi=()`h*y0>B*2J?wGux<>FyJ>dqN2Vl+L2l)GGz~5oc0n8E|Qaef)=7?!kt4|nh}v=RHfNlc%KqB&-Mz;a^?ylXuK zNz9+AV<4|C_2^M%)s;U0gEF~_pb&!VL2wnUe7^so2dSs;$os$>aU>H+Scc*8{<=wO z#AKN|K|xwsM7x2gd${=Jc>_artbe$W0eyolNLryya&ZIqm$`mfzaC(+#Y!qo^85`E znxL6GXNEfy*z?Bjq*byU7w^74uD$G+sL$H=Y-xeBzI2VcMvM)T?+>f7yh_HXLXyH0 z`Y_C-N^){N232UP%~)wdKM*ru55A_*b`PCawGc9{+r$($R3;dUP$ayL_(Aww8JcpU zk#W3g-6BE5V;p}M-QS68UkR%+Mr9qe(S){ORaksgnE65+{NR8wTCzHX zECRTz779%mNTWa(^dU0gMbMb?0?u64rj%qzRfnMK z3ip^!O}KdR<_F^=JHGSyYg_8aAc$Ekg4bTNGp_y6t~mdq_3`>2I3r&B>Qm!lz8eSl z&D;dq_Y+Te?ML^-2R^tn?!N0N@(#uz@MFy9Mt2-<+l#h6sO_ZyZ^%oHV`j6Ec1)S( zn$XI#Tp|@d1O;j0fk#0{zyuXjIZoZlMD&Act4O{aJ+NJE7!Mi>N(<~z!b4#h)i(5q z*8&L+m_)FaNXwEp^T3RYfmn5IIO}b2q`~SPBQZ;UtenwHg{n^Az$_`yav^LDi)CCO z3h6fJRjZ*XRa~Q0v-vPH^K{7w3b-^DsGNa{4H6ofNK@@xAfS)?*xns+;QlYh*5_Qt zD;2#Zj(cJgobhAx>E9lY-13)rNM`{hxF~4^!9kI#K`WSz!_cxWG?E~YCgxu5=6|{? zIWNe|#IBt6T)JavY@gvLEs4~R0_>q2*z`u0=>?XZ<%{6F&N9+c$4~yHi&+b&l7`O7 zOT2a!=xJ`WZkA2`(uJKv-7clP4&bhF8mF-CB?tsOv4DC^-kP(0V_*lD0T8jU<}z+2 zt%d8M4j7bf-X`ySWEV>S-vl3Gs`&_-5R*d^2se4=u}Pj!J=-!g65sB3Ni6PR;zyt7 zl?GUc7|2$tljPaGGl?Zk$fplTbD6u^*y+3xzzojljO&s!;%p=S&F+5`>k55jm;f_% z)8YpZbmbTqvu<;&L(I$&V9_O$N@&7Gen4|nQqEX8rl)kx5%Y;6qK;x{Wd$ZGBX!+O zwdHKm1nayD?P+|D@e+mt6p2-_K2oQ3(>vp|LwCmRtr#hB-fGrc(dU@3NPwa~TgL~nu9_A+^F7JjH~g|=J*)#X!V z-+HVJ%$GQF@dSvjmGl6;Vbn-Pgli=kiEMU$E&-w`t}0q~oVKJ9F2=E z+z?k>zAavK>83dMoQas2SOI1KgKsj25oyO`vvJ#PN8-Bc_r=}!OvS^G&a$>WGLkVG zX<)KKZpY_%Ja5y%*gSMJj?ROkU`(o@x@YbCoV6>uqUt3S1+Bnk_G%!;l{)h`CmO+v z3{mK6*+Y5tI!t1$(1US>(5wn_yhEsgXi=%0bO{h4jTI(B2vG}H@-=&n!ktW!ZVe6^ zh%a+AEeB zZY~<*AJlN9n4B0u74E(EodCc~?KO_d#TDx8b4yr->-UTp-*iqKdh|1~{kgAA6s)x; z--Bmm+#WB6ESxK z);e6bGk0+g5V#&N*2l_cUOv_i4nSH0#SX68Df(nDu~Ewh2?sRJL`{e~%=j3H1m@Ep zz$)0&N(Xq<`p2pVF5}j71rLw2^jp+$_ZokwRS||)!o^`<_RxMi)BB<}x{--Nlp}am zOF?)Vo4JB?WAefKQ!uth#3clC0Zvg$V78at{hrvp?FBq#Z9CCh z;HCGxC;Q*v`(^k|2_#rX(}h@)9z|>pEfoRXLJVv6GD{R!P8egQ;^~&)4xR>4CXX_& zq>6@aJ^7pQ!%yUX4IriUjumm_@HZwDNmt43I4;6|We5(IED( zV3=BO%x6Shm;qdXJ<}m95Fax?M?N|Vsl(u8j9T0jyy`brpzlDy`scct4Jv9JgF-u9 zpSnLeuNJe&q>wfpI!eH-=r!H0l)36Ibr9|R+=pY~$Ny~%tlyRu*AiK5aB}~{xO*(K zvHkojc;=Dl5a>P(x>j2LC_#^1EF)|*I0p)MYa?4r7UiicY zU=vJY(JKhD0E0zcB{|C$KvF(?kN6-L{?3i(P?6&JYCXKfJF=quK)B>>0!cfhO*~#_ ziaqA*MFz_}!QIRM9W2OoLuWG@0CIzz9|VvI(u}n;txJDP^yYEd&do)C|NYF&Jq)uz zAaY5@1L9QZx3ug5{!;N`U@9n4ZTrO4^~+4+a1CADy;}WBP9g#H^_lG9JM@f4;2L8B zEu*`5jAre`;FgOLQ2vAEm7hL~$2Mmtt@Y4m23bjA30l(y z*E3r=v?C+zagCFgorF>~2Otwe`gSNF)?-V!nTL5fQ@-flU0hxu)BsC13^n_T{&%ZU zUIFH%88mi+Y0td#s+f4mFU9oO$$8D%pA)kMCT91>^B(_1w8%TEGS+dHrDUzxg%9bn zb!=ryDuiqq23vxT^?DdnqtYU6Kv-OaLV>l<{B43dGaxKuy&2Hl%r!2>)pmTs4^2sA zDy*e++wok=S|qK)Aob81c*(={SpRLMm>gNW9XxQ5aOSHl0|v$?NL2*y0 z%)&jeYc_8Blnv&_HOguDcM&|vcQ@sv4S{7fztfh*wt6kspFn_brSiGkI6NCKqc5Y0 z5sr6v;-XX|l#q6+7{~;1hN^U-ExMkzfoAYXxcW!cICySR_L|KP$qo(i#cK&MP`tM^ zg3(o-|x zK?+yFoanXCiXcyjdJuPTska<0&X-}9g(c0nEU*k(x9C)Y);A=RVB{tBju>NCCrf z1dR1iP?h=!5<0EV+NAx~LHz%_an&9n4sQ>Zxf#G7meJvD3>tvgS#JaEokLHOvSt5& z&$IeWCh6fi?hgX?h%M}q_N7m%fE*+*k&+eHwg zGsFSN2tK>0N58KEf>oi}K&Tp4lGa|BoYr35w8mN`t-&}ujL+17 zq1Ci1Ll^#*iJA(g1Hh9;F&1(!Adz*iCrtfzA}nTKSZVQHAdd1pO5%Rw=__&N zIXA@n?s@Hr*|zd{;J!UUHI+NhixOkB%cTIcdOO~%a*=Hi$&pd0{9aXrWLq(IS+)u5Sy)6h8kGNna;+T(!TV`LET5@R=v`FTo!B+8Drd6lTQx>+UsvkncU)u_i#IAl2-e?5ZDnfeCXP^>$11R z?#);**R~U`1-3taJC?Q&M}6BSbgoJqJBme`;Z}$Kwa}F+B&{btt1I~9?etJcn9le$ ze$PbY=9H{Ui_naMxQw!4@HK+~K7}F!({+7U#jci}%*90+Di*qv4a_d1Tu8r=b(Zfq z(cSlL50~Tm=Pbvr&G5jr?SyNA?T`23;@enXbv>{Pwx)Ls5+IMHG=;JOKULvKK!%`( z%fZeH_uVofM#?P1Q@9}cP?LCRLsAA%G73Y1h7VK7V0aNtN}kYSIdfFU)}PX!qWnl;PJ3|8RZ_MTsl zSN_UXj0^@C*NemofMtUfz@pD2g7K3siL(dBW8ZyO#q6PbWAj}!7Z%5b}rwU7{e+WCDN%FllP?C^xe@v^atE~6Sxic)-=|x zqk_K0i0MgE15!VjfsFiZ zNc#1kZR~#;sWCVLSGDj2nABfw%6J_IjdW$4qDj#I<;}kp|Ka=Jiv{v4w7>7SwjFmZ zP$gvJwb%TT`dY?HX{mFqQv4M;ZZk(8N<&rG8Vu6(8^yZjcqbb(SiO|+n zHh^|BI7~bk50?80h;*+gYz04pAZJ54F0>-*!`4cs)l2uBfrJZK5>4JaMr@4)K0nKP zt(wQFwAYLnkH&op{{#n=YsUUnYuntR$Ku|r{~#{>!Czru00i>63=<1T^kF@y9-wDv z;$hd5~XmHG(=0o5&O(L-Ew-*vjm|CL7a%W|pS;lfUxb2l-IshKeEn__^ zWgb7>w*PcvMEe4|gxy?^*KKhRD|5U%N(&z*KHy;VFyi$OaLrC;aE#JEByBE09qtFT z1AP5K>b0=O6-Onj{X^@C6NXkCr|`Ah893g@YADjO`=EJq;uHHH8ZlNjn$4 zWGu=&VCoR>KZ}uYOAKN$D+640nPq$=C7JG}&pQb2B;~uWejgS$UO5Z@8w#$z5s%Jr^To@=XtMX=%xz64iyg1cgOdA_CLfmm;WZEu5Bku3w+OYzZ;vUcN4Op<&Mc8 z(1AhGPAroHX(2I>q#**S_(5|fem2%s2B<>O!uqlduQSgU1ciWwS#ocMGNe8yG`SR$ zF@pj|X;bA`!H+18h1of-QZeR!>L4Ez2n@hjRXnr;ZkcSwm7nazN4|$L*0vL-1-}0? zmDq5QiD~q?;Y!Lpt#fi8zw0?NmRKW+%B$X_1_IldK

)0CGrWRvM8Pc})iKLqB?o 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

pJ>+5CrBSY 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 hUms%+R7 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%0D6;P!@4%SAEq>7<;71Qa`{0;b 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

l$L7MGh4Hq45 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�~(-=0Qidn)+!q#_H|J~|q!qTvkNH6>&Pr_Px7+%Y#_}BA{G*$YD zUgh2HUk~%WuvQNfiV0iHyiZUlZT@Ql0@bH}MCE)}K#KH|EhU{3Mw&p0kH?88uJK)~kN3rH#= zWw+>vEV69SNnId637RJ?-HNc_aRAcQbKJ{H92H!nGpL}*lJl8Cm{Fj?{+la*bpLut z$H9^&4d|EvDNf1Bx+-#l!1!SdT3c_^Gs7BpO4Gv~X?XMY)W9-+16{)A5trr8tNoP` zl?jsx)uc%|fZz&!%a$#34ky%-?boXei4rm=r4mOOW6Kg@$QaEMqrGSApqSqyaY|q< zdvDJA*eBNSzylAA`jvF{iGA}(>rgM-Q_@Ni?GyXPzPDc-3(I$G+TF5qUzSEcaU-W} z(GQ(gACPSo5a?6`Vht7SMB3shT&09%0n*innT>9Yk3-0TI%Wc}!v*Diz{C`A1Nt@x zCW=spq!`$eHcz0quiZ2as=CTilA_UIC4EjRCC^j9n8sFn7Y(H2Ui^zxmuV7nRD$5U zh@g`45Ri#P_NRO2IP2>qRo%dGuDcvJ=auuXhd!0xOMm7z22;@1T;XvFaakZRi1KWl zl2&HRLCN2<^KJIqEcJiR6~B^h`TW16htM_EBnXf|Di|pwC<7?g_4c!9;7-iY4Fo1S zz)PO;RgGZ6v8&>{C<(}-ZtNR_EZK%bqML^t4Ct{=AXogwhA-xcI$|qsD=YQI#8tm$ zY7(fV-aVNA0HD)-qqB#jtgp_x0ns6O`T^zt5!=4!_HYk1>D)5TvpoRP=uaLeki*Eh zsGI!q4XFb?wSiy0A}v1moYa5lA>eeRU(A!S&0EsW?|wIJ|Kz9A_{Tq%8b_VT9qtE8 zm(uj+2h-FI*QKsYo|Bfo{xxafxZ_d}_@xuZa0>h~a`!!H`&Yk~cK)xwO_Q4+N{x-E zs4yN(K%Q-rv(|Hl_=DtOQ<3onPG&eDHUoZLI91Nz%bR=C@ymyS8;b(pNK6rObaE5J z7*}+4jiWCwwVvReJZ1Vuuu>q-n(jo(r`Z=II-ocBF`!NQC$0n6z$cR_8H;BE)`4%b z(y(tQ{papS!^KD($W$7Nx)g1Q8Pr=U*3SYZV{dDQkPbqIxkpot-TP^t%=gT_e!CxN{VcQaUU zXy4Q|1>$1?A4;(xYVGP-aiv64iDPV=sB{g0`>k!SQC3ykXWZlNOUsWq z8$~jYw9j=n-gslW=bn4gsi&Trlr|M7qjSX-SCr33^}Ok(n<6in8_UpCNGa=!U;JX^ zZJYMRxjni!(<}?+qZF+$xC_P6-@1J1OJ9m8fAv>?H7Dw?{_3wL&A9w9+?(F?rdAm; zn!omIzt+mu^5;8&+!$P$I9{95gWqAb(Zz1A*RH|9p++#ktu7-wCP~N1Bw(k%ub)W* z;G-YdjqRc)z(2wT>Z9mBbd6yLQbfsQaQh<+W1_O4(M;{Pb@Q$|gNHnNm?-%&b{JpM zYxr3m9GN*+<}%jn&;E(jyDT%yvskG#r_A8|oR0}C(xbvy=Qt((Gtbfk3-yZ(vo{Ti zcXD4slml7r3-dS22rgZHa60ay=cYS8{$cn4w{o$K$HGFS7h8nn87p9Ln)q5Nj*Ax= z2Js%zGty)_JK9R3)#H=cOPsBfFlIZ#&@}Z9=9I|BS8qrBmA6$?F>tF`=^u99U;^5m zY4p8;vfsv?wC8cy!#u|MQKGecayj}%hDw`@R(|4|&!oQB{9Ic5+AGqslTM6l7uy>& zbK$en$ctW>Hh=yVY4acdNt*oEuM&lRIBIn|@V$SXR$Y2Y>R-E-F<_kP?vzu~)Uz*5 zTVM2obnpBACJn#)U8!;Q1u*nT-dtomm=4%H&VHBH?WmYVjp8azQ$=7Q7&V*iF!kTv z+DxYnl9>PE7uobh(1d`MQS6fLM8DWmz)El3dV}cocyL1k4%;b{p#G?0yV%vBim~GX zE>mKopY;}Ag)Q$jSCTBQa;Jh9!g9Of021(a^!QL3oT}_e1`|T%fT^gY6)((@@5R|S zM9Z%9lh5K=rEhsvFD2N7C7JJ~48tQTe|*Nf5n3;~2tSL9G?s@GhH6o>U;NGf@k-oQ zJxYP5tuifPC7)JX@o?ZH+;=l;MXKKQt6acO$qYYVjo$LN9(a~~N>(Osje{SRYo+(Q zYD1*uld%5bp0xI^C230o15qp#6sDND5@*e{F!-5XGQWDjU86|Wy_$EDgKEo{E$0TJ ze((-@3xvLzQ)DEuv_oD2UWVbwx))df9=^)M?^0k+$?P8Pw^4QpfhLHroOo$lAMDHALRW z6-&*234_QPBya!GpPGr8VRg0sSue|TI$)dm5JOg^fY!den^O4C&sb%NkeNWwFn{*b zBXfo5db(CslkE1+{N=ed%K)10jGuf}`j=1qJ!6uIX*ZH#?=BZT7~ipVdlxn4fDP$^ z2Sz|V#Bt@UL=wcwidZB^Eym&k4~@8`sGY!m_E0(+7$i2oVC`fS zC(~WKcAxWt7#o-AI`aG}aNZ>_f8D%~F@GfXPcCO`sI&7KCSEn6$*+7NE&JWyPwQd+ zdf6pd$l163Yu2Q7uXuS{ddkV^_ILhqnr5NA?l*otEr)5`lWTxWSFrdWJnZmv$B{>- zEpPgT)I9Tix?V{jxOtv_1Oj4A-Obv;*yubQ;%h@@5Zo>VB{Hr95aua}vc%crYi`@QeH_f5OrCvbtrYEmkHBEy zaU`hxlL?G})G;>ll_{$ISjEehCXkiy+Idl0`Ybmv5h~ zva9!~3V&>a{Zw4ZuY8-X63DevB^z+?6_3!YnB_MeHtt-;EkGKQD z1%ftsuFxMxf+sGT3C7Na0~abtE1^B+txBE3xn5{oC+Y;kkr3*YzM6`Otz?S_Pfa7N zYf$G7=BT?IqA6)1kj5De3UphiZ&2z zBr70ISJAFYB;YfM7F|8ZDh6N{pc|O&m_oXjnLTkTNEafkQRrCVxfoY@-VWuzx?cka zu1{SD95!c+)XUQ;O;ggee*OCRh38}V=h|zpjnd9P|NKB4?L~WVqAm%uo<%>eJ?`GV zmF9i(n^_mexJm=-hNxvMt%u`N>UH6T7w#?FA9}bZXl}p#_NbrrX?M*7k4WSF*r*!5 zk73SIxU8$kb})9aWB|qiXt!&XY_zqFh^XQ6A|%q|~!?ZCbkiMBpoCBh{@<$hOK;UE=YFIE4um zPz%Fd7@4+Y&wTDj4}?URv2x7pXNM&-Zoaqsm5gV{?4YAhN-GaupEhm25&WWr*8^;M zn{5j96qTfb0Dd@N%VL0#ko--v-8;^LR=+6M1v7XJ3Z2WwKd$EjZoZo+o@BUYa)I>=AioefY4?dW7 zU~t|%dX_9niw`=8MWHM-eYs?DI_!0?MYV%d*01~d)OGH&GC#sxpU)}4@FcBQmAe0~ zwTZA7%AgB>dlDwxH_}YoNIZZlfh?J-$V%nZ?HhiWt!V&ahA|&^w~Sp2C4UVT1wGJE znal?C)k7glbb`5);RoP?e#*3h?p$_g7f>j5mo1E#Q%2}_2^!)dVT^oMbSzB=O)Z~o zCipJsCwa_uBosIUu&QS(F5VHn4d?=xOD-j>p09r9Tg$fft!GsiCsUMNA`;ZfhOh{C z2I;E&TF>m80ec7kXzp%a-YknJmPg!~QSn>m!PJZPoCRPQ!Vfg^5TFo75eVgA z>R8bXk6_#vQMQttMO_vK#jNxhw4kLJ>?S0 zwp9PvN5Wlx7j}ig9G=DM3?bjbb!GyKw6lz#IX&YZSr6EU!a-*Ka=-hngw-+dU6=iK zhvyQ0$_1CD8^3X55K#~PIEEfJW5~%nONvFP!i(E~E*>=8tYk3A0SO`vFf+mqMmGpD z$|R0@H8Ou%HVF6-9*7Jc4r#Qz7)qCfY1zYVjrnnfa?U%+<2S*#L*Pft_g_F(Zl+Cr za=5C#9jfqL`?<8}4R1_Cul>0>%-?2o{cir>SEVg~@fT_Gflc%dTV5}CVLIrgFG=e! zy)+F}j9_ou%|s*G75&`j(p?|<`!syj|Bmr-Cu#Yce<>aDs#m5p)oo0jEF9PUdv1lf z>+ZDe?Z145Q z3_M9({ld9ivO@@K`59on{1sQdM?4_~*NRVADJO^U*Zit@F3HM!y-uE#DP`NJ0i^QB zu21QBekUHr)j}J%o&zo$?;ZC6+)-5LV=p*UyRx_pv3`rFm&Pj(HmBMW*WUy;Uokj zz}Ymr7-SJVQ5-T7cL7(L)SE$QM`$pYGJxjQ6!C_VJRg$~R6sZ+FiPhpxb`UYBq$*3 z%h&@Mm|gKG%?ptvetHvfa*fK?m&D{nZK}wPeLa zvf7F3IV4N_TAjRy7frsjpH^Kc`s-fzI#y-wv1j+84}B=zbr*xbfb-CUCyHhMjJqdS zB!Bbi?G@83drCiFn8v346{loTNng7pu!Ps2mtTJQ9&I0%xY{#(`O9BkKI0(AyWjop z*7tlbMHkSM(nT^mU%a|s$Eu@J=WU+~0xgJ$D4j9_p|-7tLEIX(92i7m$I3+`s(={r zfhZta2yvUvRkI5Zz&0e$u7YNm=ptst+$bI7)eXp420$dM{;7mtWR0m5<5#}G z>t{ZT5&WY-blom(J>CI+Q95kiB2yO(BdDXqZ7~3j+be}&2~Q5LkT&Kv3fsuSrnib{ z=ywV!p%xLQ$eWx)+S3DGTa1Lcvv&%eza7CKO1!tr07m_D{d{#p_+~uMWU+EO%z|6L zqtr_hR*RYwJkkH=Nx`QX7vA7r?o%(GpU;$isJ47Pkm$KMikE>TEf0w2=ZAl$V2i>PH)re;v+ROkxtnh+P7l%wD z00_p6_6SdVTF~7JZ*cyh99Y{m9Jbh?erb%Y-!Lf!P8vWNpP>z%_U?X}dls!oZan!b zp_Z;HJ(O|LE^6o`^CepdV&j>&g+)aY^UzV`L->%U#-dXMhR?b&C8**oLvbypCx7n# zmw1j@q%kz-GyA=JipX0=NX9Cj#wq#uZuvN~HNSZJZQlHR6hGqzgI1*>D2J7A+u^(U z*WODRt@vhIbESSYugJ%8p(DZU$?%omq4Zny!<+;u9d$@bzx0xne*HZJRCStDj}pJC zW2tM2TY}?R>R)+AAJqI>eMvx!oAEl*+HK3ycURxbK`EFyaE}X0=@RT)?2IX-n1&hD z&T_|6ppW{gdJ=RHt1IfBx`o_qLhHDHd~5`XI%-fXGx+w9ZeH+q1E*aayiA14qcz=H z)2MDBSaMU3kD>!mwfQYstcP3MM^EZRPd(>b++kPn90%T)r+&!}a#CCFd%dRmn5} zE^^fHrEoX_LRK<7!|DV8;u34r2e5DC4Ks1Q4X~olSVx2VGKD4JN}zP1;o%Uad{7JW zQ0FwSv_mq>cPvdH;M)9Ky8ifp*^CQ>b#jRbXKy=WoqYQF?H?I|!h~elH{==j!|j2< zBXqh?ohw|keW8~sBVgOIzE%2`2X6G;91O(gB%Yqc?k@VE721TM# z3WKghTcl}uo|f~ec^OZicYvS7W5S|#QzH%EuCC)Chx%SFUS?(&nWcVU&$N?rehj!h z5O{L28%o=i{co+nS5zV(JQ@aA7hOF6My-2JGnTnF<dLhL^n%{N$ z8O-ONw4DX@SO57_>D2%GiF632w9M~*)Mx(R&%P#&T=(^~=-l&M;jxvKtuAzO2W~$G z=_juFV!Hl0&q>`JIy>~7d^^Q)NKLbBAa)Jd=y1D1BEZweDA z^A~2$Xp1`@zDu*}a8}a#ynBZ<4Fb#fY6)VOwsTn&sQTnBAOiy!g2n=dI}p9tz8z<= z;eu5)s3r`52t&Yk9)t}2Qu0(nV}4mh#Y2+B!(S6avWrdnMApGYtW2PDVH)^7aBK;_ zx;!`H)do5yj?Hea7OxdHpIx0nUjaqF>*!_TJ--@zDPuV6Ioi#td7t;#ICBNk$D9KY;(&+bc18=$lQvp+9eFNQiPyEUlx?QYP z+AUyln>5p_2E86`(c(cQiS*a#)}X<_n36l0IM%hqc4Z_Cx$1SVSjE>K^i{NauDvV? zwG3S-O%poK)ili+uI*wHDCJX+!5bK~UlaG%Ver=r+Q-l(99YZ^9}s--X{^k}&;hP= zf(E0z`zF)!p<{!aofnSV`g&hKU;EnEhUD*k?|a{z?ajSyb?$5a^Tksyu3XP%xTk^N z|Ni&S7j-wkSHJqzVPLuhv`Yeu|D$=HdFGkP-+k!V)FplkA;3pdmT5a+%x3ymr>O@Y z4uJF!hf=*>n7wXbFiu(mf0{g)>XLE`gCIgAE{ixVyaS1`Xi#{`zf7#%K~@1<#Huk( z3A$GH1$?E`4d71$z1hqRljMLyfa|QFUvF!>q|dO7Kb)a51mY8saCx^?&$u5}57@u< za}Y}3vPWdU(0c?{e>AnR;izNMLwDX13imS{Z|io^8l=?B0RnLy|C%UqH9)i~=$p4& zydqA4#yc`ykai&5>i`yc#BCxjQqKpZrdJahl0aFJrKzmq*y9>}6PJg?w9YxBb zqP{z8nYmDkEKIVX1P)xZ+C&#CN_V8ac2cOT@IB*>997gnu&@gPOiM-=L2rRoT^)ep z-S*61|A=4y)YIwL{$1i(?Y+5HS|e9whabKf&58g3KmbWZK~&$ZFoI$sSB38_&pm}N zg?Tw*DdsQxd>hTE~LH@w_K_S&eMW@j-8iDWN$IQcnxbA*+YbO}~ zOzb20H^ZPafaZOgt}?m<(dA2o$0tWaKO$B}Bv#k26QG~sDlJc~sfaJ5=)JzcG___s z4@OQSojp7Qc~U7?E;5K+al$3{qGh@I5wUgxQ#(7B2e;n=YP1X$^? z-3H>5SyL(~a3kIeq#QPlkWLHx5?c=-`BTc`YI%x_-baC3uO4iu%nQJ|Ma;~I?c~re z1pb^%K}d) zbIVu#;;A^$=pnT(q=cT<^gdUl$u3Y~94CpZL`GuWhhW7W50D}S09*KlvhdS5=O0}3AMb{>`ZYrGpNLz&YiX*cx7yYgrF_nYccf(#1L=Ov!;`j?KGXm>To>?` zc`Xk_$`|Zp_f$IB%_3Gc74HiMMFC$dVxX%NoH%zp73}$RQSB~92>YCmN(qT8yfw|R zx2q3;WHl=y6Nup`Cqe-W#1{tyJjkFiVXvkEK{8=v=;THfXEzl+BDJxCO^zxn5%h?O zmeM^Lr5>RK)j91l#`oUt-aryvteDgRY;wX%*RyO*JfHdV)a!xH!PUTycHhtpf>9Is zjRBn9P4z%I>;d4a>ky_|0DWPv17V#8P%~l#1(HrUn-&g%BNr^{(-eZO=v=}t4-hs3 znHa*VaN3CkXYra1t&TNKVf4y-c{&U8e9tqSqH3-+yK8>Wygr&9sE>pBI1a_t-;3XT z&o%20OE+C(T6Y*SGbb_+QwlPG{6b_UBT*qhSI>Z;I5#6pUNWo4)-EvP#p>$(O%kt( zO*lY}JRsJQhNsLB83RdSZ<6C9=G1b6jm7GY0P#Z7Lb5#voFeqe^vBlHXA%{jnr10( zlI_u{@Bbim8~~vP@6YR;OpXE4)8?tCr5*2ofAoJh+r!i7Iah>Y-lR;}JWdbXpC)Px zYK=vA_O1yAu>;{lHF@XcF-)1;Va%2QAToTx?BVCT3(GjnScAJciTT*X9{yoi7at#0 z1%N&PHo7r1-eebJeAi9|bl@z^r_mpw@4gjb3GguuQy6dpBusm(Jy#JIuf)qd9BP!9##G=e+wxY`d)<>?`7z2%H$n4#FO7K>o_j|BV_id z!EP?vPKBavK5Oqrj_Ox_t;Bo>anN7S@-(s@{0i}iaO2?Oy&gWDR!l8U4>eg-fnO%L z2U?wFBdQase%~Z~l0fEt=N+m^0ar4I+MI0g?(PNmrG{#P)>l-)8~6TTXyPu^BAP5X z+y<5wh9HIPn%d->ndwEU=l(MKSa67LlZ3>D6{{yPt;{G}a2*irCPo4$5GN|RnGP%G z-DzM6`WfgzNR&Oj(sT>B8-@>ni@OeK#srL|_x~#Dl$iG-N>@zoHjHVMC`#Nrdy9U9 zz4VNGD)m64Z)q@kqaa)$B39qtajC++`U|d*gAqVnGmezm6Pn;y79(sm0eh2(wrAWb zVMXmpIvK?tfZP+mE`dO`5!Y*(M5NARRSvqjg=C6wB{scFxpkoC3Ugt(<=xQPeAo9c=uOvXF=5BtLbE#{< zd)9`HXZ}99o#W(h`Yb4y@8K7ov*8i96?rx-$-~ux zBEx!~5kU_k)$`V0S|5&Q^jYn@3W@rK=)Fo`^+w`qzm`O=NcUE+D5)O5XRBXJTdYd$ z-Ph7?`$Jd!%Cqhl5sF7dX!*3pFY+-AGjE-P*!5!$P{tURFH`~WP??fE^+FY@Sw+pI zb!mT;f1&HnLQ5gC3j}$ufH7#G3?K+87Q1c>&tRHL9A|jm(SQMzgB0);ImZRl1WGuq z1inE)CA=ZUBLiV_3cWv9O+ACXX>cirHZ%p`N}7M#-*QVB`kQtATu)Pm+i{&zbN;JP zEm~Da(D^Px4zn<Q6u5W(xn_J&|dKnlPpkJK)*{P@J@6kBhW&3QGd42usUr#sOa6_y> z_m;2yX}{W!k4A5@(Z8IPF{hYf%Z01!G@Sr~P@gomVSqtTjO#+GB9e5~Dx822T_E^# z9F^dRAOlH~PaFavsZeVc+W4AqaUrbHmuLpD3TKfsI6tDPBmewvE%My(ZPqa} zS?_1w9(51oezkuy3}o!O@7b7cfJvAk4TT&^ZRMD0!a7 zm@0bI40$HTX5ckmGB}|l#xu6-*coBH8V+a-N#InKhldQt*#Qy96(_Ud%smm$<-l-( zom!L<^>KLGkVjY(`jR8A^Z?8;CSHo`<9e!rGtWv}U;v%#>ib2bON90(9TIW$ui?D* zXz^Xa#mtrmQs0YTGRL0a=!08gtQy`C%!%RRN(&LHB(x79N-PT4g%CfCRa?MH0>x|M z=(@s%=$Oj%(S76G zeC3HxnZ1Bnp2Dm)0zHh`fZl3T(0XOveC{)z5NBE=D^SMHcfI0I6>c0{c$IL!@n}b0 zC9TgG(eTKxdg=56mqu`SRGzIg)pv;y{`eih$?&7s&r0@`@U7bYhA&e;?k?JA#c5}| zi}qBFGG1|&S00n%Ip4EHY)`9y?$?0{&D04A;1wmr!So^4fab}-X_q-9cO+4TK)mEa zWDGbO**1n<%EcTY$!cBlS_&&-K_S!TxRbX|`sSMpUF-uYqGo$nhK}W`bI{d_x-QelL;}c2R0t9Q@?K6vbli1V#WN- z$KJ|%m{W9*)@jPdw%JCVOw`^O;!@_|AS)BvGfS9D$o@S$+4k4YUoQqNr!b-54IP4k zdZgZaxC)ucB7pl-C(y~_>ZcnUNpbfk z3z0DvDlSaC`9ma11{kANhh~1~#L(GJ-!mg9R6e_icAr}q+0s1oRPOuy7#2-8bkU_w6cKVHIm6wKE&Jk-?P=796hOAq|XyXoJ3%+|W>%~?lr7f))OR$hEjT2$dv z?Sqcqd~5Wn%-zfsGS^z3!I+W8Env2=z%KHE-b|JAi!ERl3dRd&OCmUrgYUzUhJ$6& z(k5z8pr2sulrGEc2|sb;k@|k%HJ~U6x5V134@n)8=T2Zjbrlp=0xmUwCRP(n9TVY7 z%L4&rWZWe!rJbB@!o?q+^>H(S-<4l5gT^EO@VAfsj*P2#`c?6L)w$pfMgjlgmqYU3 zI`b20Yk8FK#Ykpf{oIs({A^A>&E0XSXZ3`9ueUFnR`pq{vQ>ZiEldWS)%u|L`Ha3V z3GLU?p@fxqC0N`7y$iiP=OodkZNZyyyP9{9_W*Cb(858?yM#oKT~!w$GhA^r0dP+C z08hZRxT_2Oz_46F9EB&rSQ1w}H-id;JejwSzyKDYXM4=OWF~^Z>^?JE6~F+AD&%Qg znK}VPK$nRN^Dg*%&#Q`yP41}c0MI2kO8sO2Jz!!^8qjq5DIs(-#B$VyU?v1-tDF~!STl*pSEq=7WV!M^QgT& z@4I#K?#&&3_~Fs1AN=44!?vIdlfMlcHY86W&*%0=@ZN(htlMt8EtpyBbjTrxq*uQ3 zl`ST2zC4THZ~fM91v2}CKlp>VndGyd{cP07ww`>!I=JhnZpE z68#1xey)s!DaV@mfl7puXY3rQ1n!VAnPY`6AqUokw?^0Ow$Va$FAPXw1Q&|;MDj1p zs?56MrOJDTa5n%fV>UH5xI1LX9U#$l*o0zNAfvr)By*|bx_=EZK+DAX{8=mHN z5Sge$F1(O7*a&gML+PH+eJ;@&#(}Lf5k{>Kq*j{Ud7x^eCVQk?>Ja-ZbH}{O-1oiR zY1(Dn{K>ly-M;}0^LlfUCy%{~OSrQOg*zEZjXih6a0bq!oN}sM`sp^YC&xiqB*^qM zB#L_2F2Za_P+-G_Iey*Kwq938voy4P=g?WEulU<1B`z672bE`gobp}e)hf$x!%9AW zmpptYOp`1hdOIg`vAOr8bM|tqf5PV(!-6K zn9@Tg4*6Ib=Fo>ixvoj*9$C7$7se)$CX11EybyGcrkb`t{{QKlxX%~B(R5sqexE3B2Jl%!(GO$3uv-TBb}R|Qo}4`M?jQ| zT;&XJ174X3iu(av33JB;dRbJilM``qn1tMVUO0?z-#dA(Z`e`P0g-_bxB72Pbift$e6IL!aV)F_fW4h4berqHpO91-wgT$mKoNSP<5xs?Vw zHL-(xr+2~REdt^pyyGyXy-jqEK$HTz#8-X4PL|1hF-g$-;%!phLYP1&OQQz_wU4e4 zhC&nyQv!%Rp`7(wym)aCuP=Z3%dy3O$iWBWHyDzykQmVjpI>m#X8|G*$%;ewLYG&;y$O*tlG#(2pbNZc2){Qw2$Aw84B#Gv|9k|fQhtk)q;?8V01P; zXKfn$_Gi<|Z~ng)1Gt<;@47d=F@5)^zZ#4E;Bs0O*thKG#ELpYTimL>^Nuw1u6Lya zz(K{``@I{|?f>wR)c3rT>D&j?%u)!b1h(pD>FG5Obfix+|JO^iAc`I^bD<=j6Gtiq z)TuMPkQ+xVXZ#rsEDj8IrxnXN@F4_2KRd{)hkUb272OMrXcx#Gwn-$C4Ro;@!!VB! zco!Yh4QL$|lqQ0}fE(Zo>aHMVit7odW>nfINET3n2wY90`_&yfrZlY8pRJd9sx6RJ z;RW7W(aXz1Ps^N59+|hkOPcVV8|kN?^CV^dYzyrYZhS@)+uLcJx@!-wzDqxqXDdlP ze*Ha1=mJl8MXodpz(MFj9L8H+zqQAlu#zw2XKNpDfwgIv0S>K^WSoxm<&+#w9! zX>fgsh(B~8An3w-yZiK~Kb;=H#K5JOUYbrh<&bg&ANQS(%}TOMFV0F!S38E^-g3c$`& z2^Cwq_U2~U^>+uY||6LSqm(kN_4Er zm~aSe?n2jQ)bxCs9slEx(#6OlKFusU--4Y2p&hztCLOUNPVd7 zwLc6!V8G4=a51o`KjC+qxY}(T8r6Y{z%+VXn&g;98Y(T! zc5!lNlKrqr25M<6`nHC!=B<6!K1m}}kuqO{xh zE@>ltSe8<|V}@V^W|6DlSh<4SfJriDwE~CfwypQikq?QH40^<#j1(QJNbe-;N0+M$ z?o_*gVo7zdrdX1EfLDSKoYW@Z18(24bYWB}( zKJ%H7hIt_20*r_j=hp9h44{*`Ffea?;~RrfDQViD#w&5#!~Av-+{)Dr4GqQ9tymdG z8NNCL*v|MU4cynO>LTOXpS@kRrd>f9E+v?M{^x&QOPM8+^AXar?JM)QCk9Z)`cMAk zPv+#={viWc*K_pBJL@CU+TIV57C;6K=J5{34auVM@}3#T_Ll7ZyPXl- zdx{@j4C^BEEc1QOJ@=%qKo}Q8ATPXNV_dWN_aFac`sR(_4fI9V#r#{bbV>SmmtB(1 zJ?pG=%lE&ZKJkf9B&EcvE-3x*KJ6z0Blu|QU|RK(v*Nrv3J_2brcft|71vIHrzU_0 zSu_92k{N?UA-z*#=YhB2Y5=t{@Yje&Rq;}qD069iX{yN8?A7_o@F5AG>qOorSOtu) zUz8aji#Pq_;+lhL`XMA;7ri7c+xTN?{OA+X))DULzW#4g#~O6D)Sp92W`FF}IWgH* zO6yKa)8GGlwtQcZdjH+4q7MeR-}l)6_>1XlFn|;Pc3o?pollOT-wQE-F~-2gAd=>Rer(+;t>b%=g+?|$4UE}u6dWd~DBtTT zEjM-_B+#_qn`ES;nx(RdZbOe#2T7?6D+C7^bX!>|Hall7V5yggFyC2DoWgJg9ND41 z_^ez2Set)D!OygYTQ}4Ah;P%@{QNBW7`OgzSfnK%+Mn~l>!7(piiq}P`P1s3+_c=s zw%Z2SU!@_w*lwP|{PHOxi2lhzt-g(TRsTePSK*OqJw5)w%}(rCsw1Cm-2w^}qm)?l zdu{_OwUYs~O5z{O5w=uE(axWX3e7W3af(>YQ?d5(c7L4c^1b9(~}A%1e2dCz)fVqyF~hVx%{ zo{y8sy!L^xEzpoh!<;OT<$ifffb4Je{8TG&TXzQ%ywkV^;Xuq{eC7*ZO8@7Rp9*Gp z&1!5eA{o_*E*>KO|NQH}OQ)T9Tzc-aFHWZ)xGH_`rkg`o&~aT&e3?L*!N;?m1&8ie z$5fFWTUWXbwkADHG=)luTYdH!kP>hKxUdZ;9Ek5gO>k#!u?U+Y(N0$33Y}HZ--XC0 zRFuJOfM9IVvE&Bv$|L}<(Z8Z%z?EN-0)|KRCqfDABmNQ>I{3qb#TtsQYy6 zx+zT^b!KXucUctKeZZQu{PpihlYdRWedDiET5}E+oPqe)9RL6Ft37c5JdfU}l8(*yfnTz#_2DWKUza-kgs4+rLfg zHg1e$v?ir{?nvDqdq-Nn7Cb5EWXEQiYs7Kh_dr)RjZCFYO3qkhPKOR3Y9wwa1M9+u z7X`Gofbn0*MSg@YXECJ-s!0fJ=v2YXDfkfMh_N;AGUchwfF}qzFf${Hg8`gG(h_>O zgt_=25WGcN@R{%{aTew#z=H}`Iyi8mIS-k^klsYY`6Kb4Gg$z#@;!$+#J>QhX#*f5 zli6k#Khs5o>S-B;vnz30sj57J`6JM9y-*{2(z-eAE$y>iyqEUZ`#2h0Z>?$kRsCU5 zD+ym-u3F+#_Xazy zW5D$D!HD)~LFDRMqU3fRab>%(nBmdrI2;qL?wYm8W<7w;g1JP>e5aRgP7-A-}=_{ zwzs`)?>V4|Abj`>8%02_@TJ^D(Y6du7$FD#xD(J`A4`dWW#@dS335kFO7=Wiyhnol&*eH>Y~iFiuz9O#54DAsV$fysy~X- zMgukNo08CAJ58vzWyazmo}0qCk`h;yF7H}{zNZ)lK>+#Xb!@xQa=qw6B*%|!V%yC z{3HAdGcFdCWNQF=lvBUu#v2bTX%Z`N9!a?GoI49AhVx`VJg(g=S4N5l-AJNsi1x@}GRK#8kT+of#zKldkoJl%Egru5D~ z{av7-p%RKjpwBkk3AZR{ewyUz!fW3 zrc+KnIp)#hp&w`;Kbn4?LWfN$o(DMG4w2~EAF8D+0-rUzSa2fF)2!7P3x+XZZCqr^ zKh+2V!6Gb@c?<<={HFk(u)fc`@T3!z5LyRrQ;Mjvzf!?@o!(|F4)Wb8us~Eoeguxf z8_1@%emPAaesM~tU!02y+{4|M8ejS!+`@2HW@7e55@7!>OJDf)QR~PPxAuQ^S71x+KD~E zY4o8+zx}PW?hpSko%GtDLw}cTT2e&U{mVyE`s_QXCtJUh!xE7y#2A(Hm9gE9ka7#V z1AQ>|p)t?6D`5+P1Y@G~Ph2XlDa@ew#D!_Q>*e&X`k_`rxQK;-X=$fv)YY;({CPM? z;fSU^-0c{L@Oo0*1%u{lG*<=CaNx*Nz+dD;WX_Ic04X4%uDm;RVIrheCqjeq@@abO z>Wk0f_>NEhM4ZaMyq9M^T}-}ud?Fdo2F0`FtslS0qY8-kTKJRh)dtla4QesBRU0F? z{*FhqyUnkjO?y8X7HO)NRvCZ;a3CCd0Y{u51DAynXlNcgxq&-`-DwsyO849zRt-v> zJ|R{eRqfvjyE1*TnAka*23IVL1%|ww`Fl%SFLB~3IDuXXokZVNv4p;Z)4$eIy(;a+ zO(0ejNR_f!cTZ`0%1-O#V@z&=)a~Rj-$8n>A8|s&UB9FVX#@pphsL;uQGR@@)+KJ- zll%Ff|M>_mk}P%b>QcIrwvWq>+x;~MQ{Vn9am!PEHS=4@)$?qZuq~A4vGA`;Jxje7 zGGJZ$uhdIjJ%0#VN0{^klT6UKaD$)zu@a&Hw|ip?4@5r9yN8Nqko0g6G+@MNo6AQ zNC=q&1Vz9+oI#v`=+o{e!t*_~l~#Ca_j~x{C#a1Air8u+w4i_uib4`HlMw<%LgqQC zx$0Kk`F>yj|LdH6>fEosd+Xj?Riv7qyXt=DoIR{Pt-bczYp=cbr_wEV+?AHY48G*l zQ)1%k#Q3!rDkOV&p0weFw0qA;`rFTbKHYTto$1=|y(XP^&e`daM;}X{|NQ6E8E2dk z`hmuG>_i*313LuYIiDbc_S*uTcvYA~U|S7ZgU}Zy1Y7}aq(yzI8^ElMyTv;)o<><6 zL$-pD=6D)WmC+01_8xGfFW@60j$6rq3S1%UF94)4x$LC^!ER`dl!9EhKBf1VW@|EjW$k0TQOKwDydYKJ$*$ zTD3NHecu~_&-i6rpZC_ca1yaEJ@}Tlq~51l&|G+a!35ea%opLnHQT7cf_$2V&csts zrj!2YkJ5S9U6*>H>o!|p#7$pF>Emx<+xb+=#_CVqzrYn^>~%4((zn|=rEA%ah9Hb9 ze4x%=UXaxtWd6i+od=`D!A{Jd;T|w^g6+|uBV|>JXWs5YD0T7OD^sVKXf=b@N1as_ z5NFgwcA|Efq1g^;Y_qAfPnM7}N&ko!V*s3u`B*&#^$&n6vst)YPoMd{42nng;~7bE zy7oBwXBat7{;tR6JqPEf>EhiVOa0y8s8bB?T*+LowmOPfHj~~yE0;a9NBM34Rq?8q zB2tFsSBXExkdOv3W?Q=TubFKV1c(2 zUB6L~cNr3>7RTJDOHsDc7EiKFpgi58ux=GgL|tc_+(FwPcL4*R2GHLDsFLIUoO*fr zG;B8g(kYD<%<+yyA$cx+x*X>A(OgECg{h>_$;rWaxH!vVT`iwdJr8fnm;GGaiqw+CxOD?Plm6u^x2Avk(hVWKI_cz-D31D%PH+ozwwFrmr=EOr+O~a1 z`p{qhZMyL6Gt(=txHKKPW_5bv@yA0y@buG9OUE2@>~};zFypQ5oZlB#D^bDe73KVL z+btHFO!#rr5S-ow;+9Fqxu=0+@^(@U94web(4@c<@swetUZ5CgnS$X1-#qZ9zO*au zLOI)$$Gm6pV0)oO8(kikf}DMbM%07%Lq&SIU1{qbsd@Ibsq2C(oCjzq{4)&`uPqyY zjU$dq&7XRg^GoW!2_|s;#l+1_ppDb1WO&M`Ozudn{-aYD2knRd{y(H0$DEqhpZ8Ll z7r0DP=ls-9rT!z1NE@-7Fn-I;ssHjT;ues66G#^fQ5Px*6F1)!*_`q5kEb&@@hbyq zwo&e{-jLEqUYF7mjO=%_MLdP%vFNlJ1&jD5pqks&D58JZNP~(LaKtZrRJRaZQ+H|- zhFCgN%m7Z*G_hrb?x?&^jF7V1o+=y|U$IFqYEn$3&^9E2;H1qi<5(2JX_fS*5y$-F zT^PF9)d>75zW3<}t76=EMv~f3PE+&B@%5^|*P;}!9bnGLqYO84hivu%cer~*9op;M zR!J`c@ zhlkn<>H#h z%83?OBzJP-4!S^o5nJLaGmr=5-qzXoE$g%?b-Ip~;cQL@M}yG1{hembFdlsH!Tp}t zolU})VZ0bmnYE98^rMlrSH8{Vl+Y=ud&3*v5Px&U&0%kU``hP~pejAh`R6pVJ;iZP znj^FZ7uYU|euplykdT5@jJ5b%;z&&DBn)HY-D7DSTY+N?ib3=qTs}yQ#nCCYX2wQT zeg((S2P2DET}xy=u(S|DKUeu@3p-GM%cl;WgVX~a9&(cLQ{CXJ==pu{WB)DfLg)4v z&F>&tSPbLWUPc+g73f;6L`U$!$Dc}H+xTF*{GtoeE3dpHO|S)b_g#0VM^-(G{lJU9 zBlZJ>7C^k@PZr}m3Fpcgwm%lOU2gHh_)W5?=yUafR7SgyO8wl1>xFKOH3}L88Iop_ zwj_`|r?v6M)05^wKqa1d#Oj&Fu{$*l@{ktlKdTGkURFw?|DAGH3g)K;pVWHgTT}Pi zV~d>iuRFh^jMQT_Odyg#7wwIkumrFk{k~}cWJ#d$>MrtNYpHvA>e}-V2LVn@&t3Y< z>08fkN+bObq|-1#q;os?v}>tFBIG z{myTv4W+dQbBog6aeYc3d=;I9$KXl9aMJpGlR>5#Ih+T?uc)2&*!f;}{;pOLLYzmqn!&+)C)Pbs0c z+k(!4v!NPAT6O8&DO1+0+LQ|pci{A&QCACL%Lu%aGdPF&uFK!~S$UQbf`Q4ABXI9e zh8Jmz`UX53xnzg;M*d&%tyZV1__ey_X31@r+oPZuRSFlB(J%V!6IahNp9tqYqKn5k zU^<@#J>h9k7?&512n-&HB!k#=b-Q;A^@l=wE&oI>1Wn?oE|P4AX$aovA8{@03WB?R z>adRZjZkHjkIO=Mdf4>d#Tk-E3Q=6j4nrU{ou_lfl_htblE@V0ZQo7< zxlo_nQ?8W#O2SLP%g*zoz+H0F&Pee&^6P-XeCe(ZM%C=sJnFN)EaWEte zR0ZtU*oLDSoXA8IyqMs@GjvJqpL_zdAk5GKh;tuS4~D?U(I&RLn6P6DaMmING$u+S z@OtPS6;RaP4|BEYuGGBnO{sDIr9qSJYdUY=B3NlFZ++bk{+V|%Hi`O`Kj!KU`n@R= zs49>gSgu5wPlFSN9^M<-lD2-&ucbW~T%A^6Y2blxeJgaz)h7<7ij?cQDP$QYrXINb z^7Ir3$$$`l_V_XHes?x72G1oI(!uO!2h(9Wa#?t- zJL+SfZy5nH{iQv$Z7_H;aMGDPhJ3HKfMML`8t0+64n^^MaN3=yo9KRp_6Bc7-I-ZDFK3s#HDuLo*j!vJ)$~3eJSf!kE@riYEL}sV>{B>K)8C`_%^ODIoxmF%eGYQ#4{KJ z;Gw*RDt7Kdj6%!2QO(`iFs%pRP)#Asr!W+dc+#BJLZpj$4q)8a=y>V_M_rIG}=Bs2P`{w_pONK}-!e4{@|xi};>>>eBWR|I|lVf$g!SNGx`5-4z!S z4`5`ov6R8ZMBbVvHme%%2=+8)KS!CTL4GBL8fXn8tri}_>|ls{hB5v-U-zS&2=i|? zCzF$}f}1T)yT6jLEH!Ko%imXDeRY04ET8);f7YQqkisibtsk0M2rRchyac_QNl5hq znSM5XV*q$7jYL$_LFxexw3dPw<>U;`xZHNzPTelm6V&wzWo|H9LM*EHLO^>pw*g)| zKS+!ngGz>Cpe&@YwYW|Shr-ExDfN^1e+G$&#NLy=UODz(Kl$l&=hwcOR(uo^l z0?3orTxGGOw#682DDyJlijRqDf6Qy11dl&%JzKtG>9hZGefsLX_odgp`jzSQmzLS;Hgg5>dtXac&*>Ey}v~%HXNYY?_DQ&thja~Xn zY4oZ$q#^QdAhqh^z{kT6Kg* zGn3~tzYD=dh0$ExrLBhbTp!pf%nz{aAlN}sCe-_PPv0ZV;QV4- zUG2MyS4(4qw!45`^RM!1kN6$@eu2Y9-+B~=?~&rq_bp!VP_~=Jz3sk~-uEl}7Ao3= z2*$~E%hk(utHNmidVHZ7$M8VD@;&_c$?cunG2rrJxPRd|oDqy3x5}u%?)>OH7W1A5 z(OCGy08YaQYJFvtlknZ}d$F2@_NaE}!ol4N)lpmkhdoN^o#~i&yZTuaF@HK2NY~;f z5DB6R_)3RVFzl9-WYW-JWrIxJZt7xNtqa21A|4xRA>!^Pj>n2sGW2h9oG=P7FgV0_ zA)3_8L>;+AXo;$#O8uLPHW@HZ<_%62A1rqulgPm;!*?s318G|i0J&mz)vYuS42R%J z_V)I@@9J&^p77(OtprDW0aap*X#qX#8ljA>^d=55xn)ecLVAs4F*=}3U=Ai;q&twb zvt{WZR8p

E}N8xiIT;;z=i`&;RR}(@nSC30vHiPCDsCDm;HZKPNfI?e-lz)4H`s zMti-mX$z9=p)`cL##|@ub2+_GT#5b3*dL_39(iKmYST zr&qr6mFd`Hk3A$z;DNNYCwt@MuWcsYfCSJvdq40-TmrjdVwEV%lliC4P1yA-3ALyq zwupnl5b`B0mYNC33Eq2Q)%a3sYG3ky76%Xmi-HvIv&1|&-sT6BhCW_;7U|z5Z%vJJ zFNylhD*dZx9D|JVQs#mQ{Et!J#*H6@34{T2KN%^0Fqldi`&Os4?Y=a<;T37}f8(U@ zTJqh-M9k^+<%~z$@hNPvYP0e@n84LYw{@QCJ&^_Vn$u20sxcKzq5d{w;J|ZFru3-~ zr}TyYglQVKuKSQ?j$^q1+jvD|&)VPx5Fm|mm~l&sS(0)pWeZg&#)orV-U9YLp90?B z7O)Fa$A$|_w`qe;IV0j9`lb}gF$gx$W@-TPM%`Tay2x`!jp>%%GjD59R~3nl^Q?0! z0j9O^3PxNUx*%3K5_Weh1hd{CZDuO?ip7WFCigF#@v0Br{Weba%i$fK?NI_=_Vj}^ zE_lMrcm3+&ejj4@+-8_P7`@E!`NR~~3>Q_ST=C?`BHnrbj3|3Qq7pN!k*gGSHN76j z3rbMJ&3+}M+`hSg;#tNCc>LtP%FjsJ6+5l+V;;WMqCt~Q>ArUJk2#{83 z9R=4+0>w!^JiGZbI<{j1xu>{ebc*edF;{71=vJ?UQJ4)f>UFu}-LFv2SWQy_X<%5i zwheJ2y=fgN-XDChoLiv>OJ7e>Y?k~z)Ai#AtB8jL&NZ!%2izNPys_HiI3yV@5-3;# z-4Y>11SV(*BbZjKoJDpBq^J=@lozM#VoQ*fJBtJfcvqvi@Vy5~GbVq-Y(hUcr^G;0 zF)mDc2=NdNIa{a)z#t%tc% z-zb#7X9Li|-|;K+_xkU7WxDE;m&G=Mw}O29)1M2Xqt345d_K;}a5?(D>Igpm+@|z_ zkNjnN(;Hr&UdmOBcietQdfn?^7v;~A!}-9RPaNszV%yuT66C|+0SeIk1x`T6tnrle zjfqv*`iCb0GJs9#9pRu)_`5m|iwKaXN$65Ened2g`x(tEZXFV+1$Ht*e*03G?w%-hz z-}v&MrnG^(gLT^8llj~8U^M0Q8-FYHoO%`~Ku`x_VPhX;=cKfC%a-(&TW?Jl9e+$Z z?yPe;Fj5$%U4{|zx{JH#@47iPKKY-S+`q`4F(->{@d=qfnK|2TKkesCNxVHwj8CI3 zq7=njg`_uLl+A^{Tyxf0d{VE5kd&t;IdiSM*6MMo;P9w;o2h6Z@0l z>UGwm_8qU3QGCvB=Wu>&ds-J=j+?)0Ubzj7V&`S}IZd>eFml=q%QlZhMOb+AlY`6n zL+~xJFm(YS7#146{aR*Gm7ti%m;ytp>@Jai>h>vE@nB@Dmm5E16p=1_3y8J?i|cwx zL%g6}vDod#rY~nPtb>Wik;+VvzroCPL21LF?*#EgIPY2Pl6Wu5L7;;(SXAO!6S+w7Zsuj& zC4KhU=cM2G-S;w~^rTZxI+5|9lJ3G5L{2DAKl@y|=Bg{gtjkkRJ&}%ssl4oEFO7l! z=YR9bbnMYHC)-&IR|aJLz_n{u$CZPh`0N+b&;7)YA_-iT?z-!)bj1}{9OV0imGa8; z7n7{dg*X?OAVc6yupiJCmzORul{C9b);^ndCZ&DB^f8IMwddBGI~ayZRAVc}Ng8l2 zh6Sy&L~gOT1?bgsklyfjwZ4zbiQ>u6jPHG79|RBc0QvinvORToYF_aRsd4tj1zedN z>bH-}Z5$I?tq%I@$6rVSuX_*o*m6MPU$GOo9!3v!3kZ5@Z5~b2*L^5;Uvw2sPh-JE z^=Fu5W*^!YEi6AwKJ{=K`runq^V}ay&DZ~QYMgvpw5Pc`I-5^Fky`)ycd7e-{NDxd zas2rOqdC0?Kw0uf#QnLl+`|Y$zm5$+_E2MS=s^o@-MS!Df{V;8m_Emw&M`C>&MB>% z;;I-`RI~)6>XbO->EH(V;6#nMFShAyw-9j16v)gmwlzv0`h6h61Z}6Z+CFK;iBBeN zaM5wkv>yMoa^s!V12L)FLb!^_;63A0ele`_Gji=CcWupUM)-`lbvV4|v~`gB32UD` zjdTF+=@($|9x1nQdHTL%Hm1#d$_nN3cs&C}7$IQkiLPi9Z*T_b=|>(_uQ)M z0x2$i;dY4i_hrH!gvL_^y!rHYMsXd*WBmCQv^={ z06+jqL_t(Edby}(u;1sJ6cz=PL{2u3J^C11tsBxmfBD9=b=U5seZD*yEflUge=E=@ zeEq9mkv6^XY}$gc-D8ef9|Ys_i!Z`%;N9s7w&IS!l+r?(c%^*m1FuA<>z}T_DgEfR zuOW|3aiAz9D1;vjCqc8V7u(*pX~FIxRc2D1LUkpWLg31T$hfI1gNikHSQvPAYd7c} z{T$nFd@Jd5vKIIJukNXETnK=oT!*RJ4DeaBs{f_G|2n$xCb0l~w~~j-$xv|LZyI?9 zhKo$D{*lyJaYR94Xq!%MYLYv)*-DBwFFIgvG?8CF{^E2nl0fw=yZ`wQQaTaF^7*f( z=Bs`&HD2>Z7HJGT=)3Af0AruCfN7OAkJ1|6nbtpkcUrykTPb~!yQ=T|>oonEccrc? zzK;$-NBs8dQ}-7>ka{1x0~>!7ehA5*`hL)dV!OFyfcBPd*0ix$N2vo6S{qsnxkXZdC^W(l2x*e_gcNNDoyNT`fyAeLB6W9^jh@5GxyStkpFZ zTQbrIUBo4ddJLLGQ2#;e=;GF@mCMqqqgSM*E0(5RtP=Nd_-85GmIF(N0>0Aa0dTVc zMQ(T;bb-zQkw9+0NkFEeaAkoO2%}SUVS18QgRm-i-}{Y?X$>~g)W2Jd6W(SRz90L6 zYq=?8dAjqV2SUG4JtW9NfPB@Jm!&`avyY|KGJuQ7#4XMvFg*SI3(u!5+jekxWf^uS zUr5Ive?mxf7XfnCB#Xscr6tmuf@uJ$BrK(~jqFPQ++uUrLrVmZs=!HiJ!0#P`0B|h z;hSJJEt4RFCmse)5?={YABx)Au+$c+GOjtx91YHo&&4!;uEhSHs?l^WP3h@}QuEdC zNL^=hdRGS?#B5M}@l7GDFEoD7r~W+ko_cN?dg&EKL$t?rz#5;w#>zFR`BscY!|Zi` z?DtdiGIRoe^p`mNw;~v;*rp<$ivruj<_~p_{$^Ts?+t17t-sGnl#hhX>~h2eX+c*^YMa$2?w zS4i1E517m-%?L9de^CT~N>{Z5friH%BOdu)i|1!{Ro(Tl&2YKBtFo2t8X(Fz5syrA z9KUn^IjgEJrm6LXajOat*QxHC(KC5G2e8Q9i+h?lFwm;Lsra8G3@yAD0I* zd*YVhdXO6SfJ04A|HguXIHQC!Zn+RayxVnauBbwT1 zpnKpJuZCmUpkwkKOWp8=dzes1AfiLdm!=g*ERQWZMb}|>4S+I&y)8IK7{KYEvWOvj zKx(8htzks^4nhb}Ys|_5@GxR5t&E$mcu$&s z8inUJxAdK_O-tYTx;EeWeYV5QuqJMQC~bQa+b^Z-UcWjWdGmYnXFS(YPH|2cEv|q$ z|6hNddp}pjR-;#Y9Ttv$550w0nH2IGCkq!4JuD`~|4~-uuytUQ2+i~gJ{9s9wQY#N zz>pzyMKd|!U71TDq()`ygp-e;6^jxtyTOmux&vp*t>Hzun8*My>!h$qm`Wa$GEdMB z>e|W-F4k!d$1CD4I`8bXW%KjYms9$D+vlr~Ku-&I!8vE9lTSE4ZN>1jdVPzjkCHLB z5uA{EmMtl19*ujDo#kJQ6Gz;3Q)nbbiT=+|X;91o;0{RULRNCzi-g$I=q_5-1q&%3 z49wUVccAm#2nh zFkStF!I(uS%~H1U$G)8g|MLI9k~`OY{wg;3&Uz_jvymvP&+P0ECl|(DFo8eyD+v2A zfAjL!rJfT`jac=h6NSUXS)% zElDgC$i#ykNJXMuMz3-wAb9jk+WxGV<1Uz9&ry zw!j5(qD-WJFh^ws8+|tSwFgrAO(e!oK3l}dQH7QBGsO1{r|zG_jF1_!T(CMU{o*?S zb%0m4LC!PAxL@D9YUrlf|%m($s zmw`;0H1hz6woAu2b7B3J=#9Y44WT;JfOpbHq$Y*>)e&`G1kd{sfI!uPW_5#?E>gz9 zFAj4cDMY}B0A-r_r>CF2k6w^W(fF?E-Jqu{6NnudPa=MHMd!pS7wR@pnBYLN*MlzC z@G$yUtdN(i9861=ks%jfE1hw2Z=uWODra(nExTTrN+x3m!Gy*{ffe_mg24 zX)*{dffa@(8B};}dL0yuUJv?T{fN=~*`9-!ButVEK1+O=uomOynh+KPFQ*aDf(eUy zqr=G9VW8#Uc|V1-Y4esa*K#Bau{-a+8^g}4Fc`f)eH%%j6WogBNL+yZeb-!_KKRkU z3I=fA8PpD=q_Q9$WVUEh(_MW87Dj5>z~>CU_2ZBn7v>; zeBb|-y3Ry8r*rUFsqD&c4av5?^eIlw6M#-`>wRxXqrdcbY2bWL3_HO|kZH%t)nGJ^ zK*#Xk|7U2siE$;&Di`8v#-zbvkZBeqL!bL_>U-fSu9rI}bxmw8(s-ytk>7H*dUYHq zOye(5R@=T{tipehKlax)C4dModSQ-t!tiU1S=v$G0`}c8qLUGn2`mnyb?BsEs+d@j z&Zy5mJ;}Vtvlz!PeYArMkU%@0j!maE*B(>o#80qYXJ4pa?+zPC$s}z);3U7&E8AW3 z9X><)V;2CxMR2&lIa|6&S9tpCx62+~eimQFZ<%IqCzXMw!_8n^Oi#qf%fK4E$d;dY z7SSSZco?_M{r?|^`FjRW;FWk1&$ejs890^!w>_in^()tnjv zoGVA2Q6d^YIZd=hZioCNJnH1P34mX<8J|^|%3!_fepT5>Pu<;Rai>)tDU8~K2Vr^$ zoJ8R`PVqK}kmj+FX|n(8fm?A;+*;y2-YgQDs6xpE`p<({z39lRKQEIgHY&Umlf+6?DKjsoOZ;9d6`fH>U9$HqKd@Jjvw=boD>}Dl2v* zrr*U*DN7JF>L~8VJ((;N;#xR-dObwMVqqM;B(R7UN8@v5?NYMtwK-MP~A-Xyd}oDt8$%n;+ScR<0~ zP%J1$iOy2>K?j%To;?{OMuOSN*_=F?PxVPu)ec45ZVR(H?B}O@eH$ zYKLI>G*mf)cu)q<)rmJYG`UZ10*QRJ+qef+G>a2+>VspGa%wzq&2U%jJYp52lC0CNgJ0b7y_X42;f)NSp`KLl zMI0^xZF18?i%G@P=^8d)jLQ?mV$$w6P1K+1#tQCBefFDNCQs?#8(#Yw?EbAycisI} zn8D?-{cB<+8yalR+s*pD>WWL#fBB2QLVt2aw5@&%b+*Z&Y?sBtm(Yb2#R}P|QO>jdt}bMYsFiAEDb%OGY!e`E}l)<~nkGaddiLo$~L{Y+XgiS$?87D9pv8N*p87J-mS ziGGXhYJtq+tfyO-6mUCbd;PDcuG7zr`kPmU^)feQn@piL(YpRqsT)n4wC*%^T%Tea z_`KA&^=m1;|FSgtf5HTMa|rd0MOK{&v=kXue)pLjdAM_A>rLMN<<$4dccw1XRhY`i zpM2e_iV&q zjsN;?lY|Z{Gh!Gs*MIqvD62@PZhp~jbwsl7%T|h}^CP!me$US`UOY-a`%#yZ#7pTX zqEpU5c%PLkBWJG}VO6BPFC0#b3^LAC>5MYtqxjZKJPp?t9$`6%52N`PWi9>dFmwG3 z3XmCYj$41$!|M5#?>Ub;Oo7(Rl=GeqR8a^r&G3CCav6UY)>c-c3m#XSPL5#59YF}R z$z8Cxg@|;X3hu||vT^&^2DUh=CAa_yIwhaQziA}ie)qtmxj>oR1rJ7Fsji~QJ*`(^ z-ft@H8Rp;sh#A{&><1`)cESjIegKdIH5VslH;8-7Ejf*MqC^-2X>#6sBm!)YWfjy-pa8@R;6YSEj_3%dY3x7%8lvUj^=>5TDa%G$gwL{}emEn^SlwSBADh)(cny3G4iyO^Yc|dZqsSVr$L!2jj`Ug`V z(iTm-6qByfI_VTb4i=zIuZ2UB=iSs!)PVv%!9Ax}g)3-jgsPHnPsR%=|JPI`J~z{Vx4|&9HMkpELYTTf&mD zht5{{5;VhQ80J;E3@qaU>2;cL%7Y`9tDV8jRjD$p)hX&z!m7%b^Aa@g?eNSuT!!NZ z?@`{|CS{mG^?Ky8#8cQc7-kzzfBtME%N(6Ad=i;1ry);oD{}kR=w6sGibSxR1&TU+ zB8v3ApD{g%DZZT?BD8DckQKNH6$3X}Jb+7ae>CcO>irF%qNmxuNpPrv@Xp2RIC$Pq zzCDT<8;nrPGT4Xo4~9<8Q9V9obFQeJNXJ<@O#xsT#shoVGM4-FzE%f{1F8XX_i*(uwt`niQcCMkBc9rtU?8Oy>0jAidvAhMenNUpgu5De&e z&WyQ`FQHhn(sdz`V%6V5nm2Uqd(yI#*=mJeN4piB6%kz&*>B?*?%#C%-)o~kHI6uk z6NVfP>vkU)H_3svqb^L1E%&664_uQ5-}&XVPMtuRl`?%1vGZ?c6i0S!O`AUXhpF$G zhf?E&ixB)hOCzr!QLWsaK^(Ae6Q;h8U8ar09EMg0kZzL?jJ%_x=qcL8_K5|fZ4{w} ze|*gH6I;48zqCXtr+TAZ9P&`d%DF9ezo?_8aAXw4ld!#}GzP|0HGx>1(hp73BTP|> z*hJE!q{g|n8%dvskwzy*(-@~@$FQ|Kz^=)(Qf3*GvJQbo!7xb)bv63t*sS$^oH!AY zZU4-WMH=f~)W7o2;YQa*`xpn0GHUVkqbyH7Z_~_hmdi5c#3kTh#_*2%ST|i+M&m~L z^~!ZIefe&<{_(V2mZS8Gcl?AKb_`oH1 z(7a1{5)}f?5P9WlTn8t;118JFAU@sjTocTt@^fG)VMygPylW%5uN=1h5I+x*sLvG) zz$abl%84@hx{;%!iCj_B6JApi_q1~Amzf+QTCTJi5LVgkX17zs z$!JSDGb>(O&KJ{-u~#m`)QzpVRqy`cD9Wz){2l$%m6ny?xqP0`&4)Cy-+Z5WVv`8z zy68|{JIwx9oEiQe@TlkC$t2D2|MMx@vlTE*^vo^}sXRK&38KXvfQXC_;!i71a?mN+2Z8UZ_2Y zF-p}8j32~+JP$V~)8K@#7^mc72&uy>E_*qbFYF8{`r0Gc2A&G<>)Ze`j6JA}&p#{O zdC%S01>BO>AA4M6b@|0FP1oOiTiV9<@G`B>FUUE0l7OEQbr+O+f02dh*vR8!fAQ<# zE*j!ckc&^~ku(WeP|OuEk3e@+H*nS53r>Y0-m(uIg&}>0C>00Zih2g_5yv`PO zZuw#-1H81%!fki%Kql<0K5|4)y6t!vK%x{9%6;Rur=8a~xYOuHCusbM)L4Idy6CFc zre#Q@GAb$bNhh57a>_n86PTGlnU`*VL)^o*^8o52#m<&0A#A@gf4PYAeZE`3h2)ThC7HOp<-F$NKzal~ zaD#b`3DzxL4e#358jDu8F}??VKju|X5FPsBDooi6+rHQd^WC+HwoDsg=4z7pwAExM zjflH;!_i74$+u`qk5^)Jd58ttn6<*0mXpj z)i|>`XK9*&S@DgTDZ``U50Lw7yc}JXCexhwVh2^qG0gDJ3 zb~I!?O^%bxW?1$sQW(SOCC>1%85G@?Y+nvBm>WJRAvr;Wy|V?*&l< zzZ9IfXe}5*`7_PD6bCJf5Fyy+1|=rVH*1LAa}|KMtdHzuRexX#L(9Qs@>+W|^%sD!6~t)MF; z?-5q7!P6{qwv()q4hJW*^w?vM#Q;9xJwF12wSv>9bp}k2#hQAVtDdvL^d$0f z$}^XfQPmy2{m(Ghuq54o%PnbaGuQPUCJdlt6EqCmck+|~i^RSc$jM1PaKnkq)l001 zVT`AzHDJksA_%$CWKf*}fv%rAfxw7umlCg>s1%ipr!Lg6`$hnC2^;bQi?QTD(-JD{#)W1oZ~xAj~p=M0V{gsEUy1(g>IL z&8>744B#mz$T$$)xq)XS+8cEdZ{!;KK1hegHm9Lee9pm!@w9#w3qlr((t=P~k`u!P zlg8X(#iNcHXL7_oc*i_H*f;H2%!gQgyGyKQy7*qfFb^jPjQekbRId71wGSr zOe_=#3u!apB5(1Pe+o@T*}>4pruIyScO%I)AL12Pu3CW7MPc#>PruuXoxk%lN3VbT zo?&Ge?N8I?cpanhx$36yxZf{%GB>|9pK_9 zQeSt$mJDElg!wQQ8}LwZEgbPZEZNtOzq?)H2l%S+t_e+wgG8kD)}vqw!7cGweyzb` z70MTJBtkv?Os*rE$bhpnlh9XS1sujH87q_OG{ng)4eCO`SWP<-i{xSa63L4qN;8n7 z9B@TRhF*}acuy`ijcehWPgXPFf1Kc4eZcAIK zgt?GOLO)LWA|3Rv8;P>U#g)!b6%f~38?YTIevr;Tbs8iD-I#k}T>%vZvBB4F7c#Df z*p``KKtzzMCujMf91E*Ko(OEyL**p={$Gew%A%t1OV2xt1=seNfYklV<$Z=L;U0MS z5u^qq>9)J>O&4EqHcaBZ=mI`pNdYh8b`Vbl??y_f9^t$lWi_8zea<`4!XwITFxxID zq4*?T>B7D#eV(OykUhTCHI~u=yNoCC^m@1kZL0lKv(;#CHw>LS6ovT>!T?+_Qa;JY z%mO}X`8IC5%RKVxrH!;<4MdPQGJyIYI7&&_F~ic_jPB6osqgexK(~v9br;)-R#3bR zX}aSEH}>>hX+ zyH8L7=!#5WR%wcbC6YPIB_rlRkeIh>3}B}*AL;`nGR*$dG?j!Wa3r@2c;eM?V;q3= zk_E{o*c6A-LVbYw)NQ;8Za>njl?z&DUvEencM^v=jP|5LE?8_j?*-S!>5PWVjh-7Z zzWvFK-QnGavf%A5(&D+#vxHGTitzFSG^ny_hd1N9Lw+;DJALE~JA@e&ZjLxPO7$eJ z3$*+_J8IfD^|0+EIOvIUF-ct2(u#H^?R#~Q6|wY!hnVMMsBmSQdU|8( z`5{ggP(O^FE8Y?GMfx!0*@r!+-T_3}*zublL;rySNmz^3QgOE{ayl=QnLdf_G6m>9}LkJzu|XAKkxyx$$O<7>}n_D30H8&)1Lw zUckxV<)IIF*Kco#v8|Etolw47SXqR~vc#)CJW1&ta%w+yK z&q?@PQRm%R+fG_zpl{j5_9Y(SXK)VSX&Px=j&FatV3y%91wp}ViYM*PFr9WOmkvVw z_=dhm`xPOJ{k4P+6dscgq{(&fPhG1{K%Y$B=&#Bxd zi$r0}>YU+GG#|KxJnl_n8-FS7>3V+}I=#5BwQ7Gk%FQ-%IdL z(idtivu1IS0<5PDdN0?fjj~0yWtSRH(gL=9ca5VC!jwn!dPSGL;Vy>ySdODEXq%Ed1tl_c{Df^?>6UcP$z8kMPS%6$o{fzwKq(MIhTYw> zX?H+?=lp5D;$Y#-t?ugnWtd*}OLqA?ys|%@*+0jNr=GeTkEgE@xAd>xdD$;xMdEgl zf~lM^{3!FOGBVTbjF1b#YkbB4EFwhuGD_jo_FIFM`1QwpD)m0vNYE!PZB{E1rw z83}8}n-M>f5?F!A3H7Me!7t{#Nl#7F@6xT{o#;pLQT%WL66TD^yud~9ggH^0lI}>b znh2G?P<LJ-qcEuw_%O80_d#)iTtGUA@Z9RPyt5IogHrAT03uVT z;&dMik10&OxLEKyK?!0=^F(?PnYJ0@kdZdByw4*Pq#Z1Li_X&2n1GFnbWcm^B72{D zl&rp6TDwFlI61;LGkC1M%b0l=SoThn`T{}B8NKSO1)!8C=9LIsbHydt>Ks8QWFn+` zv6Vz_&p!8j`pWHhq92I)B_<9Tz&r1|pPN8VPj}yYZ`cJq_Sp4NuB$J*B;9!HouMnZ zWZqIh2#XV0#@{(>cp!li$c4Gs_P1P4u#5xsk)AKEs zWMTQw2~J|%171p|TqK*UXm4$~fomY6XP9Pl8jN;grw~OxbHtqu#yI5Y zzAcS3Kb(d(Tu%C8VXumX+vnro{)aTU>;FR?=vB12ClsyZ{@~A*_rk)0KSC5c#_7Tr zcAB>f%+PbHXrkjmm$!QJd!A^OxVey=4YyqkG?5&N0Wx|rXdp)5lQ|yf>{h4WiAZWC>X#Yge%?s+*v%r4O_%j67AmcWkl1@KjH+#hJP?IW!x&B0Pu^IR2dfE`VkcQ6;W*8aGF)}y~@Av zu6`>tFitKH&wwXf;pm^ktdHdsg5msS*il#W)6WObznkjtC8_gSMb1ZkJo7F z+OcVx=9IIP=Q{*)^%3%_ouGSAnC$YHo)?1@!*KpO^;q1Qjr7s=M z#S4PzCDjd>w&^jpWyV?AdQT^9Jk1QM-i&C_Kmt7tUNoIt#q$_6pb`i!a{DQx*o6+D zjGq%W7h8u;sdsV49@G!_E;o{;T%%3}M6HM?b?JLPqN~kT~urCRMs+tgo z#;vi~fINM1SP=vn&ZpjhGPFD~-PQ3?btzQa?vWjx;E)gQ_c?~>UV@P{ zQqIKpnlp_~a5>ZLSCv6H{zarBpBxs+N*ML`GHRrYxV3zuTqV4yn-Tc)u|F4S%Sid% zyi6O<5>`aXo`#petGJY>^op09)_T^GRqctVw?U0FUn#$EfyG@j5EkYz-h0?7lk%wI z1meae8?lgKd@F?>mpLZLCKNXt?AUg}I8Hm)5~fOvv@8x^;-`g-o+kIEc6DPX2E-g% zu{2F_DsY-@gq~hbmNB?3r;9(3zmIS;Tkw|fV6YpD1DR;~}FbKo7Q6GkV(uo$?- z1S;NCSh5%}RT|;7*HOY2Is{d$xnC@c3jv*$>2?2;RfZKb|a`kIUPl z2MKjMW+~p;{?>WEIM{+#$#^(5+uvF0=5`!5!4cL#5b+CDlW_61pI;iHxr4EF7WTuwmD0vH zr_uB`X>h|8X=2+Gsq4Xaqnosbyp}M&g-`qi!QW5z3kV*DW_k|ZyX8sfM(3Xx&=}?B&<^$2AU+ihh0|%9WHKd z?|=gRQ3#?CCDf=0bJw-6p93XBoXG&^TmbchW8<{zBy?+<`BL2CG%*B`Om}iYysM$H z-J@~&@Bjk_P7q{=d!)dc)$kgm1~&ZM7M6%kQ2-B#OyM_0q4%(r+w51$$LSR$evC6f z>~6mK<{8C% z)0^Hj<9mM}ZXy5iAOCSMf1mioC-xV8;o;zoHjO;}9g3`M*($MdW!>dzK?akPsuE+Y z9;IP$YRLrmg+c^f|MYS2p_}EAx)4Lyv|B!e4M`A9m?_ruc72jCa=0TTn4Lf4dJPVA-$mXh#k6!ED#I9kwl%O`;o z_k5kx*>E||+)X?um;wj@rXNhx>;7G84z8ul==J19P;?OCP7*K~6T6;Ejc5NZ%G^pQ z0Jf0k1*^KyLQr@lfvxV-ShU@cCLVkjszASom z<9Bl5pX1l-KtRB*C2IeUpq#%SWnTH2%NpOp%W-mkwLEfIJOgltAIcX4*?e+dWwfdt z>dA83mhr2!wR|IbJ1h&4{mLg^!A~h1k>Y?yT1@HZe(xRIcBBz_rezK8`(>I`lJCJI zaX$1#!AW)B`>^FaG0Y7$2-MfyuHD z`)Qt*vc9fxrZ}bB#qzlq01*em(hc`$DZ<_nR;edIT#q3;5jUA=`v;fBk^FI_H|n6c zvQisDDUOGk%v_>5#1!@HAteRbx*&3Ya6=*BT_-6;t>PzElq6f<1& z&cq}8`IMRVukPlXcY7XoRwi6^c%AAPM5i8U5%0EBeN{YL9p~E@^&+TBV23+V`)8Yo z=pyVSTPwW-#Y%k;eKe1`hbb6vss|lDxafAt@ISmpT;suO;1?BWcE`@45PNBv_*%*;u{$NbLJ-ia+a5$L*#;2S_J$szUzr` z0JwOS&ghD=N)y0=l8^@-A&%L^;xpc18VR3}c_OX-pU0n&)cF#Yixl;3GNVw~0PN8E z*~Ylzw z;(cQ6^~mvgX7HAOMzS1dZ>oLYOv7KtsM#|=NnOvY0+z#bd*^Q>_+BL{Q{X2OMSF94 zoii2Ul?zY>W--^1CJaM!4q;Gk6P!Nx29O?vBTRt6 zga2YB>#?ZdzhoSlL(P^m8HfVi&>&%hJ(J}FOAtr9eFmXpl{k(bmP+PBON*n(injZi zr1!uSGA&b}C21*Q@jYEIazGsQB(W1M1Hx0lZv84D9N9C#iAg`!;OYko;?R8Z}j_S$DtlJHJ!^T=09{USMv& zE3UYrBjY^ZzNi<%Vd0_zQ~`;>`*OgIvtn+s0$zsRsgs!IiH4S-9x$>C!pJGUAtpWC zM5rQw%1mrwR|{Plg&DGYq5KL%&hR0o1B6U;Jk3+z!^!PspdX(^O>hDCjZTq(5ts%CX_<7NJ=cF%u`Nl#DxF2RY z4uLpH&Ry&S4wV7hPf=#%p=8EF1%u{-H9}o*6lIkm^4)fDYgbpi7dR3gAf}VQ+s8$i zT~vqlElC@eq&3JXJ==*iu?|&(HuCynSLDR?;S9Kt6^ebcomVySYjkN znOILIgsB}*rN%QKFSa6~*QupBC<=dIg`f@C*=ekX2_7u+hQ>$3L?d->fkWvV^Cv?d zzASAUcHxie5&BPi*fo{GQ(EEy#Nu81p~d~b_F-lUE#LmOfZgJiVNfdF)MM8oI3om}!aV|&oncF1i73pXDi3GqdpXH;>s4QEV)^h4{9`R9n z`iT6(vqX!EqVO2pbio?;)0O6g*3o1_SkP`RkM{Xss>whaSWMMN_OIkB~NKOIU`AwXv(I1DWvjV0?8GO|HX*7?7z@d(3;;0Z=?VrwCPCakbj~vEZ_733u1SfD zFFZGmjSM5H8%-ylbV`iHV~<^*)~sI5LJi#`SB5objq5dVoH;3JC-8;M>H@xyjydMo zNb#CiUX^aW^X@`=q2yu?Crl~A{9AMmU~>l5OFw7C2y|CLC&Omn75!&PGXV|3F*I^en`u9!=AO z-=C&dokKljT&Z&yBBWeKv3y9eG@d^F%&n<^&wuB{-enMarGMhbftCXh!f3H*w0NxSK&#tuMb_MsXeow z&xm6LoR6Xq@fklEM)t|Dj9ezmK>;g=$FnU$S*$94`^${H%d}OR8Z41Fe@1xuU5}gJ zGfd;RGgUcGepWDR@Y>55-(|#rDO~>A(;83z?CNohT>sAH%J6cU3ML*otgO!p_^*lW z+D8TlNDpd7^;BVUoO^i41q=IQEOHUlfnV-&Nw?goQ}{L}^N62C3A>l<@LCkjpvnBn zvw7f1y4E8i#|d0kD6y?ej!hJzC7_z#5aA;t3B7}L3cG+>Jnu&{b(*Ju2ZrD-x$~4TV*e_%P+q?z4^^=t~@OJhd%V7=%h<8y|nVLzub1)ZBf3T|M{QC zW}EkB7Vef?ZrMkgX~^>B%hPZC#&49d=tnwB`+vH(zLk@DmRP5ieBPbN3&X0O^pnwZg-m*)Mm&)nr00V{0&#};F2srZx_W;XJ_qqv)Xaag zfVD1Lwr%GW?^)^0Q%_6}e*3}L`p*4hvb(>&F@51*uSc(M?`dHDZR3C+KV4}%czE%J z7jT2fRcYt09h@lM9E4#FMx<9_C-5px7yskGd^sJ*3F5gJQ}d4e%dur%hr-qCI3M^* zQ4sV*pV@DAp^E|k1yjgmtMn!$fd<;i)`9;ngkxfc7Ma%F4keJ9>ws(&?{XF5BIyj1 zhA9Dx_|E&YxyYmJXdjDm<}0Dx3iEeOn(kW>5&+l!;Q}r{<^}DZ-uYzee&#Qs>qUKH zaKY9_Wfzryr$l3TQm*)$s{uNtJ$Qar**?((%%+`waPk)hN``DmRT9R&6KIz9$&AGo za7?NkMq^U65A$}g3n{{7XSr2ds&u=H`uAZ1y0DuiY#n>=>4xAluu9Ixh z4WZELmhLW3_ma-K#%>EG3~3B`itiTOlXWWd_o0_GF*5rEE#qcDFqec=a;m@=2KLX@%7(t$Eku2`k65j@|$= zUuT{Q^Uu35 zJ^uJ3oF?8CjKsQi$EF{?_O!4REJj^a|@f&ucd&7pL2wM(abL+2PNN*GLq zp>uJW`%xk&&sO{~%euOTI)#l=+E=RPglwKZ3!+IR3h66h~-0ws`ec$$5&%psjrs-!{ar*BTZqyL2Tj|FGk z$PuGtu?3hTonMD{(>_>=SJb%tyA zuYK3^n~{bOqh+x5c= z&_OQF2DoUA1rARzO+j+ZdGd5h1l_%`kjkrjnM1vjx53;fU&kR_BCs;?Ln+BPMxU1r zfpq9#$vJAHFBlNE(@*A;pmZ3X|p2R<-E0=Rzt`gGGxH$`0x zQv#MHfm!nRj(5BxU|o6TmFelHpRORj^PTUkq;i!fFK+o+N6YuNx4kWbavc}K{FzXR zXuXbgsi)<#yzOqbzQ|Hpap7ezd)bU+VZ#Wla1s`&wQVJyNr+Weok9tkk!58%$w3ZL`1vgLY!qflrB#)me*C= zZ24)M^Mv)su-F<+4?Vm!inNDuY2BWD@~L#^*X~DGa&%t0dyeH7P}BH_&wnxf@b|xl z36oQa_-)4X)I^)4et!0FC8Mqz>nM6Y9JS(2{2Lp&8ggG?seFd`W`c1c! ziPPIcGAY@jf+2CXV7ae-FFtsdxK;UeK(gFOk)}g<1^8778vRmLO@C@kc1)Lc_Bf%P`BPxjyN&bWEMrZkRmr zO!}kkTus6FuD#b@q{!-=DqztJjErO~UZ59BtwS$X>B=})gSdK}W>sRu#7Pu*!Zd>P z&&f%n(2*HfuMkDCw!{dl12M_E4KfKFv45$jHzAUm;8?So`+kS15QIwmT#B$=nKs>n zW>OnPV$q;5J=))jMy@x84FX6i7C#05-Zaw`N_=CLZxA*Z+GnsRfgX# zt;^}myIxMWMRPfGxpLfG#|+C8n)S5C&uMd-{4~t6)Z^!{g*+vI^*RbSmou1pRvqnb zw!X-#>&z_ANJm%O%TAo0s8iJ4>tdlFJ4d?oOX|jl%{^TrzJ>bzq#N{pX;P zx-%fcKmb%gtG_C^6)PQyI&eJ+<-)`3Ze#`>Fqz2DD9;=pb4>(uB%4=|WwD){Ak^>B zEW|Lgm+$RP6E3@9^56F-e`dq6x|1`uZHn7cXq0sHx}yr_raf`nx9zZQ?V9u`jN^O% z=tHrZj3~fTZ)B3KF|UkUwQ@zr_KL-z_{ic;yj^IUwiRa{pVEf;yCOFD0bOxL8MIf7 zE5TU*NhfO23)~SKMWdMbg9f@S2U^j@PVgaBHV#ppm*k-|$_p6Mablg-G_j%`TyX5y z%_GXbFf2d2CR6t!{rjObwd^Etom?U4Ejc_&5dU0AVQ00)4Lhx8zQSFhw|U^F0y(&K2wh|7mz;k${nKO)6z#NTp^Y_>XoP$;eBaxr^tM=_P9aQTW~N^p!_2Sj zpowpNNB{?*3DP|85q8e(;!g8P7Wz|N2x5@_?`8C?Fq!!$-ie&~X}`uh`2dT-phpqc zut*m#{AB<96lV4=-^0WATAT_#evx-MKq7A2kAtuRRlT%D^3!6(V+M;#ud=C14PA|eNRtW(?PTuMk;_h|L>)h!5;C2B2iv{PcxH2V+;K-R1-aZgp0Mh5eDJ{s(|h0hUb=vlByc+ss+@MQPuuJ|q?3uxW{7IZg^+0;nhd!-Z4^objZcTP(4? z%QF~C2Ld?UrOqJnC7`Z&n7(7tB4IsToDq49+QKFwoD2}z9_-l1>p&OGl)eG1>4GzV9JRHk$69e1G zUY>58kSv2x##6eZL`Nc9EJkel0#i*ptIK5o#=@KloLpUulmE(>r>P$9ZDtZ^c0t80 zi?FF{276*-iFI~EvtGjxc zbYTbyQymIo6-;5=LgQ{mAYrkP=;zQ{H*+I1J98r2#~AGGabav4%K}Y9p^#u1&$1um z(f*zrf@cJgxeIAqCnR=4!`WbUd?OwvT0oHnN`q7*Q)UoD?9c*Y|-D3_@g zlCy{m={&y!*R5xM_gT`mh+md7Gl_Z3=^brDBqtaFM7>Opi#q#~!+mdarVDsw9#L-M zxazCgqLx13=kNR^Z8gu7<<4b^-qepcWfldqoAagi&>WbuD2Fs(1ny!X>pVXJj=HU@ z1km)F?$g?R;4gHoN2m@5 zn-eCr>xYRJD=!16bFvZ#M_8R`oUjjnCt)RgQ`j@=(GV$xi0xnmf=Ig2QyK=23b!zY zO(!e%rOVE6$J$PEpIRx6hf8L2uF}+_bD-9p-*wX^GA^26In=KG5Q)rBy&PG3mdhbQ z*`FSuo!m*PBCI-W^E%XZw7f68@Io$rJZ;-xHcH>w`og}N&8f#H!itER2@;`|=8Yq5 z*5uIiAP6hsg9}c)&er0iM6kswTf*HPqGxbYyfhw}iBb&~7g{+tZZF>shL8k_)8M7I zh%Cfq+Om)|3yEtRpLEhmY2!D)nJ&HX{B++p9!T4E>`X@>eQR&qn84;JkZrI~7ldS% zMD6hG_i+|^n>KAqzxW@1ITlskLb96E$KvCh%+D-&%*R`}3xZ92X_Ar^C3TJ`b(M3| zi6_pdGHt4yST8nEM5BW7KAeH*OHs} zcd4UlF|_HMog>z@D-E%wI_Yr@_&KH8O54RFX_NFvI^w(i?{{99`#u-GxuvG_8dUR~ zW|DJ9OylE)V5E_jAgRGO?cBOuWCA|YNDik=23=Em3Pw}hgg#BXU}>T<7Ntu0M3tT|BrfHYCB@)|aOKAq_!?eOzvZ2^=N4_&d-)n8v3@@l!1dyb>%62HN#{)#(uQOt5nbSlf#@q?`n#K$h~5c3h^Uj zLguBnXDIw6PWq3*FnA~=R#Q&o5@R^X36vUC&~*hh&J`!)5-s7&UADP1&pb0=KL7ml z>G8)Ok5j<))3y1!vh7?g_j|whd)2D04a_0`{P2fA93tAE`?;TsN&T8@u9fvkGu8s0P`skzSBOm!l+P!;rN$H`i=x_h_ZwKN0 z)nEP9v})C=WL@jq#<`9jl(CK?XS)ks81Ntvmw2icXctl@SN%|NK;}oWwSP|Larg-T zK9De!`xAF(o+5bO4$xH4by(7w_Jp{fbL@H1~tr=NOC`r;SAm|p(!i_<9P zXzI9nu*;fZ+Yb4Ct~^}G648zaOJwbQcRGd?iYEmHE`N;*PC<*@$L z{jt=$`S&66>zRi<>!+Je)A|?j#PdIQ^R|B^AqWEn9sKOWzgP7PGDLxuFA7FM)g*O)nM8fCW^3{ zzln1Eh*E~-^5$~2e`kN6Ieio$f7hPj-{HrsD!65M1GN6exLjbEi9 zjh$SP|2>mKPx^(Q{IPVyZFi=7If?67TM7ObG@~Ro z`#?F!9+b(Pth}U0S<(Rr>5_IYoT-+2{(c4Bb=X9U52E z*|Kz+j63D26gY@D_z*VMz!PTRn1qdwH}xu_L`?}6zI4xe#5G?`=0*&B(Qc_Tc2Shb z(s)V+Qp;?~#g<(~aLtQlb+dG?t*(zt3-}6&{;Dn0~D+97$ z1mHI#zHL{-=p2@x)Hxc~v^Ma9T`hfk+B&%Wo}anQIZq{AmQ(-iXW61M`Dq5cSDygO z@Y?g<8>tpjCEV**bv)~#C?OodE_e{(Szvw(O} zyk&TlUg|b%*bu~Kwt^ggJli|;MUHQs+s)3*miEQ;&wXMUtm9l|_KKR2+9KYzu57ji z%4(}?7(6KKuz^G1kNR9nk|!s}(UI64B%)tGEg$1q3LIzdp@0X!g1**fB0?b+%r#0Pp}BP?V)dnWc$PuPdvoT zU(mM&SJy3Doh$&|UeG0(Kph@&LYP-kCzvNarOPF47FmqmO?&hOfrXfghbEVR(*;2n z*)9@yz1Gsb73tq}yYzsdna&cKzI476UfHJz)K7pO{Ag--^_Vod^epHl`k5>cQJx@} zaQ>7I=~_wvwm*>ixBU*B?INgIv>CnXA<96*P4C9U6Le3-|1Na#H3uWJ zNQW}vG9U8iq9pnmdRer1S+d*#oeEm_1Jq2U<2(0R#ES;pn<6^2%`ZaDUtl`I+w-3R zvxrsvc7oNxFT=~vItbqbeyt3-oKYm;RUml@7?nq@zW6QWinLBH;MdYraoYUq<%={% zY>QK+Enjk3+x`8n=xB)fZQwffPCTG?Fs@8~>BNHvzKr zI1cox`@O!WXD|a|aFPIM5Ig}MfJh6JxFSW6rY>5PBS=|Z(v&QQXiJW;H!PbHZP}I- z+?92BSMr8ex3sZ3)(&e$hO{d!4=qVSB*X(G0D>n#+?c`KN8g9PFYC`Yf4_OJyJt9q zb86=GUw<80S@maSWo2bmjdJ4*CJ&>~2}~$VTRKb_yiU%S^=1{#-Rm>lE#1YoK>pzl z%08yTQTii*Kk?aE;;sGghis-IP6Ez>YVgf%k9xkO_WHpNVZvjA;(?Xku?5N~I` z%sFdW?Q#VP%hzNBWJzlU`c-$B>% zweu{`WA}n~xeEBm|H8LsO9@ zXmygF|kss16dDx;X_kbax0s)QiD6NCKNVjri4| z1w{NYup&G$k}Ed^8@EYDNHo=D=?&spgwFVn7MXPB_gs!RmknDjAra>nS!smN4Tv_V zcNy4OJB%n;UW34flzlHE0a7bpD0f*0g&2N;qe)O&!k}yfXyURq)0xYW2iudE^k^1~-bvWJP`flX23hEvUct zQm=xa1EGRo`g=>j@Fm;$G{<=9hDlek;%oB9tGL`{8Ha{Tb$sf&BuxKUMuX#7fedX9 z)DqH!ypCf&{C;JTztD|+2}{CIsElA=ANM=M`?wvG6%kfQSYBRXr7jp;8!g*DG=mLM zXIzAzhJ7W6Odlh7Up})8%Nuc|&-`1JmBq`HP1}Pj-ykf@H(k3PzNgDP`HXP$Hf}?B z2J%eYA}Gsi;+fPAb_tjCZJaZ4!pvue$I~)&2?KA|sST??ZySI73VTjnO=dr5#s|qP zWBaFxUI)I*{n5+ySgH~EiFC)Z?l{*4LWpP!HGKjHHie8Kvnfojz;F~C)ksgxurpX4 zBYmOE1c~KimSQPL0z}MXhQuZFY%W<~7UOQX;GFD0S_7!ITH1bTs}(0tQ%=mBWS;!A z_gkWaj3UT6NLly-@Z7dM&dkULnPaD~SHpQmpgRsd;o5U=G}PV9D4h}pI_;=je$@u> zso?It_ufE5yS?@j@VA1Sn=v%LPuSlItaFjqUC82d?X}m2-Q$_SjPuvvkdQ*ma?G2C z)e=l>f?@Er6U31yF!D6m)&|w(-6du=+QdNCbP(+uSoYNhCpdE5(dUw}G^IeJ=5K}B zwFl;I$2lmRso=34xWm%e_Z0ZGr@Q|8>!V%oW@E^g?)h@riO~07yzTqS*Y10OrQzGd z7HUuLrkBeZz^)7?YnV`0c)Lez`ny$A?)$d=0?0i=74FnYCLR zgQtr>+LL;YFpiKB#%!r1l>022?3c_ zUXz$65;bYb*B=(|W*+9uFLFMc@?lF(;sl#6z{Zv_oMO}Gjed4`o%c!4tHSt-;2HdH<2H-Z-3)xB2C>1rP(Fb7#x(5fDtIWu~KjA4|`)8jgvC8@fO^TJs6jX?k#t5ufhCO9~n z=~dW6cr-_7^T@1y;gZ|lHR6}6(r9XQ>JCusC8(%}Nsl6M#;#8rFsRpm~9tjusID zI~?oLRfDr_Csdss`H6A1fx?yjOik)_*IidU2>mW>Td%qLdF996@k8bBK6^*`%opzt zq3o>f18K*o6@RqxJ=~a8y!iU-$`8Ed%^U=MMY#`+?tTsj7l*5_zB-o9a<{K|K9TNB zifiK*c6}k*LI+MB+)WO(Sa(QAxlFzqF3emATv0eA&UnL290DX&_C2oSiW~{Y^fgap zs^EHm7vZ!o+qF`Db#Au&>fy_4xNx^>LIup_ljZtLURZv(b8We34trSYGR=f&ihHs# z0WXuRzRcoVWx4VHy5}?HUmv)VwZ%Q)oB}})jc2w;KJnE9rToq#<=X3K%k?|g$}uFs z32#%t0m*<<&rIu67dYx^-h1JOr3*w( z)yK3=@?ISyX%jBYgd;uZq8kuT6l=UzMZo%2RSEmy2Llzve&jow%ehB zo#`X5Ng6ou-ts5BtbaS7I8s434b7co$1mfVW7Y^XqjJrO#u7r@3WD7jW1L!TS5McO zm}-ZjjJC++b`_1`IJ71$I%!a?Cr!l>F=(RYfNpY&4ls=AJ<{bU+BQ4SOdMDU+O+rNj_ESZ(u2sjZC$Mli*w9oIQ|65b$l8q zq*FVn&BGWPK-JuS%;-oC)EaRNaccTvR~7l5E=!|UMP?(uK3yu6$>gSw{;ImH=Ew5D zN0-^m^K@|Hn%~4ainnzbR#8I@jY}+#$yjV}cC+JPrm)0PnA+%ZHa2xzR|pQmtsU0xqwVnX z?Uz0r02H=7fARINe|?;PdCxuflm{PtsJ!YW*Oyn_@Y3?hzyEBx<4a#ggFan$&eGPj zp|rE9Gfk7g0qP{$zQ@omKkvC$u)*U$E!SUjb-Dk6`^%>hI^Jx@c}O~tv_Wi{zrQ{K+FFa>!DEwbtWjj ztFh50Q%33&5+zPUnvG7{T|K;3uH8LR_FXj_jM*jWIJa_R(s)DuM8h;v4no(nqqF5L zm%pG~v}1}*0F|dYadMJWC*^1XF`Kx1-`C2&9=WfS=U-L!g8VV?YvkHq3D)adanUX< z0R8XT)~zJx-Rn2h4%pG@qDPOGIDCa=`;|oxeC9TkP&lZUXif@1kV?N}iF_&s#{qt6 zWRP={qlWcii;QYz@x(mr2OB?^=2?dJySiy8Hg)jcVRNPCPC+~Hq$O4=ToIdqmV!V{ z3(TMiC@W|a0YdGrC@f>AC9hOzQa8OZ;5%+o>u?GijW^6*;=?onK6+*eyhL1+HLBN2 zSAkWWLIWm#O&$@=FtZ3VaKN9!j_-)HHvtf;RzHgGIYzj*r0dM4ia3>--iPxEFb zyiq5^aDhM1s8576@$8#GP(5+{B(jj#pK_ZAG^&cm>~IAkwK*>FS)wh?YBiH`@g~Fw;{YQ2R`O3V*o^ zc$h6p6mHL0py&4MkU>BN?t)fy*Ot9w7Dewvd8p0W=)6$0q^xT^)0x~z8`o50%$lhoK1N44U- zKxoIqQQ@Ba_^+_X&u48lCvpgnN_o)~_2~pw;Uh@I@bL7t6ydVzv8isk>>?+~#7oE( z(1yers&IaMb+NpD`nhHAu8W~|=pEdu21w)p!cSYY;~b&&kz;q40_+!a4A&w!XyR@$ z&uG`QQ!gPb$_GbT>K9l3)Q`L20~3}mg&5;g=*YCdqgoWmuazYP5yKOQLc+yl)%4U&xlg-uR($Kx8U}j7{1Q^8 zf|vt|b__AoA-{Z7>2Zz$X^CCE6Emb`EAax_nyDQw8?TgO3?fRa<1oq<^3Ngsc?`!i z9l<4GJBp|{lTq^+OT`RAuwM;su$Qo9w&&CcYLE0(vHk1ETKu%#v;DN2JR4`-6as|x zRCMBJ9o^MCOyk#&chxdGNx(LbSu-RNPJ0IZu_N8V7(ouM80{xBonw2v%+{roB?+JW z?q-sShbDk9g+J3s@WId-w4FKIQ-hIiqG9gG)BgWdaP~{-+z$WZ7rlsy?hE25AngM$ zMzj1QKZt$cHyRdDH7(htRxS z?)>5xF*2SmuYUEbV@I;|mgoDK@5y&(f&;w7*)2RJPAtHy#!f~pzjlJlpZdZh+J$g6 zZ$?Fg?Zp7>el=Gu;)n%eY*U-HgS}0qV+L;WDPmgUFcTIyVC=c)H1gX3<#8Jao9sTjLxh)`HC{`jrsr)vI;(=V^k-@glZknm@l#wrBD zc#K)Vb3}9Fr2hgR1w2U%ygF<;8fCK4g_m6mzp z{l2DKq6{Z4p-Gkkq}_hk4kA4r{Zxu}oD&CWPZ&P?UGxiSlL+AiwYCx&)ONje?Z6>^ zVVge7ZNu6O=LDDOU;N@ye&yE+C(viixqD{2MBM?Kf?SrJCHdZNpTxgEU8c`=_1!cH zH{X5g8kjEON|R19R-hA)fKl@t69Lk=1_9%S?`RXxU_i(MayBACYb+h%R3PdGVYy_-e;f$0yt}6T z9>C{0-s9*=gu(GC4k2X+7C96YP3MxG$IAq>g^O09J%E=us>3DdSh^GRHk@aX zJ(cX@`cW1?e;)Fzt=!o-ZS9`SbN{x&Ic)*Y#NIJxD-e*gWmsg)c!P2BRy%-wL}uu) z%8W=Yw6h`zzY2IzCUh9WqC8Ay2R%CY8g9C@BUJb^zq2HnYb-Z!RjFS5u-@ED@PvA- zmrJn@SZY^afFS6xF?Zd4S9$IgSC)6b{cYv;JMP3j@GfSJt8tfa^j+JBJcl{YZvjE_ zx@(^og5MQ;F9|!pBbXiB`0^XemB3Kwd-9iiPj6PLzHMi9ZL2ug*?jOPzkS%t@EU>> z@wSojUeby*=LB78F6N;!X-9Htk${+(@K)a;IcQFXtZfee$z-{vALMEU;(9&3B6*qv zN6Uhk-3fTZ1jk-=cZ3F@<3!1D@Cn){zqZ^(XahemVVDpp^{*RKE=c063@h|jYBUD>BP}E!+e^zzYQ{;sMB0KF3PP% zyE5Y@Ggl}4{^&7Kq@iqM6;afJw^8Pbmv+c__s+@q7P(P`J{3#D z2%5}V*{#X-aLeR_wkuQhU`z(~6)SE(R7;3vX9>x5)!l8tdNQ1hAQ^+@%Q$jI_+;R7 zKFW02BAJ}uhp+)sv4lfDHJft&yN`aO{M*Gx$}~%h9&u#KDuQl=Jrt*BKm=k`8O79SWFOa5 zUV>JS@kah3KTjSm?~~uj*X=j*J>T^kmVWz*{#aFL`r2tt#0ANY{YiAo2>Nf2oY z4hm{*=WEbCPiQBEM4xSEnzkme9hdMjPx~Ewd->YsgnR%Hi?K3;oax&?(+Dr0ZG75g z>o;B2>1W@6{)9hq$$BLY`5uTie+<)Qd+0aJcNxjBJXwc?o$m>+fg^92#)i)ouuy_% zdP1H>Cg;+^7<4s`)TT|Tr(vixQ-Ly~dVh*UkRb&+)`bt){*OwW|LX^a%vsp2R-Gd=&w`lo;T zr}_Gfc)smzZ!6Dz?sI!}x$U;wioYk?NkeV|lF8Z^V%ZErObxK62F_fxQkrz z9EnF@vi_5h$JqqZWqAc~z+%}1EjE`gkEgZ|)=zMIx%7Zbwrcvd(H5QANluZbTt5dj3$ivU6gxPD@9+0mH_rtMZb>l1kJ zS8nWO@rRaq+4J0kHjIJ zNGSF*-l0FsQ-ka=FxuWra}MS!DoG$CZ2=VkJeH}m#(8bPh~2=B@_uB&Rge%48T1>c zld(p+)-$MsciJmllqDLY_%vC}lSVIrDghuVdcAiIXVz5CB>7l@8qr zFAtM$(HJtjV4zfWsC}P=8M6%#u%kprfcU~FAA*!wipXLxQ3)I4dW1QzE}5ev#?>~? zWDxjVa#IRj#P4Ph4^o}rjHI|WPJ$$zM%tFGp}$P-f_rASfXk9$TSbSH8Or!1%1Jf@ z&5ttxbC9J=Zca#~9fw+H%`$a`Lg}*`cVar>ATuQ6Ag^C~)j1Emv_Jiv%`c)W< z@7s0a^;CCuV3%#}qc6ff(4X4C`yYG&yIYnKSSB2UL9e5Uc;LY!vHSd%*WMDwzuNgF z6L>n*Qz=Wjh{1LfgkyP5hDe(@F>tVztEk2EXIt?Iy1`q8K*$2}s&q#d*jprUi3BR7 z%(`6X09hxwhF9h+?Yaq0pf2YPca|%Fs0qm`?Phw%y`#imiuUjFagTBl-_TQ98;&-z z9?-cN_;csc`^w*-{hLAfTO?l|`H=9Q(N7z}j|crr!{r1^V@J?<>}3;_0zU2JcZoRO z^w)8$`fZz}ed#Iv86Mws2m_GUETUn7H8B`#I#pM#WJM0zKx6ZxCQX!&Rz@wn$`HXx zzaHwWV5%nBfp~(kPv`L+Y6Qho8uQ9H>D7;I+8P&0sf14(0cSf%Jn4MT*Y-2~8IXy2 z1}vWDvl6|`tvK;8&NRBr6X{#;|K*QG^l5)GT}DJP{OO0A^~m)3wA?qoDRZBnC+0D= z{(!gKtgEGEeY0fa>IbdQOrKAiDRGbdR=9DQH(_R5G|?(ZoTSLNM%>H@4_EOajk+@H zEp2NkG?qOfTpC9(TxYy@|U~IK{ck(LcZ;lp&Fij4J>) zqg}^Kgw>qTWnxerXX#`e=2K@e?mXihDsETsOd9X0o7{m^$%mUn^Kb%@^(5=mI~kz8 zvPh=Xg^)d;MmxV%guPK19Iv#WwhjD3b*`Z^OpFfmM7p=X{q3O@Qxo>fzx>NjWYJGp zS?_tzd&00^ji#E-C*L_|ul9V}y~G4W#s@R#j&l~|$U+Q!_7l%88i~mPOj72_CJyat zMkW*lVZs=?LOyZ*;5q~> z40#HSXMx)mmJsl~i`=ER5okevBW`2xHaHojJI)bFdcUtLX^>hdP3kUk@-_8fSgyQ} z_nFxSMH}sj}J`FTai&?rH;9Ip?p=-leNLlkQcQtZH1eMRg}t?BwK(u;QJ=!GFt8Fw_mFnaEw!g%{Y7 zqyANRLmyi%<*4VqV;51bM<6NCA)JDT@D(0q@ZL9k*YW$xXO0+Y?8z@x}Sgt9A{A1Hxaf2X0YeZxas(dY}UYBo!jmo=HB9OepTXaQ)Jm0#@4S(JugIOwH%hH0ksk?bAb(Z~2Z= zUWw54A6>^0Lu|U3VSU~3hNon57_IjeW`YZ7kSEMjA_!oFBV44G6=*K{5Jb!WV8ByoohO-4 zsPR~XVcG$Ls3CAWrVKO~qZ!Gg-=$@jV;m$6j00KmhOkK6A4k9iM z_q(Taowkd+>EyGThxRmfyz38*GQ39q?PKS5k2@jA0(sq?S;P zG+CK+NMj*P0zfktSsKJgLOp|>F(LNh3Fh3q3)?xn#~NKTaY>nENmtvnuJ>W*1e^k5 zH3dOp|Kj2D$&>d*A>49Z4v|}`57>i?eny7c=e>rn%iuP8NaX?p7cK>+cxnE`_ll2n zDzu%h?LU=buuq}QyH&?wRvo_+LZ4@^X*Pg-$=QD_!>KJMPDA_Hg~@jdK@W2bCnySY z@+E0!3|R4x<-MRDXv(Ly&n^YJ5o8RSkXFM<-02i96jTf{lXaBE>DL*a?^*xo91&ZE zL*Ip=+qJ8d|LP|=U+?>=2%5cf<;2tS6R#{Y@y~b5GfXE=8E)QQ1Jvkq{`Z^r)$+3J z28}33ynRo64AgH}#wjnQ%e3NcJ)-^u=C?9k8&>AyxyX)kZ%L4^~THtQM;_mp+5yttM z-D+UZOqu0|Rc=y<^=4}YfjS$Sh7cB5Zj0|{FzdITFs-!d!Ov>*oPYX0LLLt(RPDIR z8G+Lt;la$v*_Rh!yLP<_Q;Xv`kQmn#9)Yn2;;}=DPH@3Jvs<7JR1BhOX*l~)!A)T> z24M!*b(T>aXqQ-CSwmw7%j8BH=!e@zywKWCr25)fcGyI?B*PL*oNVs=hJiHf8)T&X z6e<<|)aJwy5zp-Aea6;qyZoQej8nK{R*c`P-CX8XxbrHw@t6cuDugXDKDvZLdKofr z+B(NZ5SVsoY8*g`L(B*vOuB_zN@=83o7jvEyl*O`!ax-|b#)1tGMf=(jvFPe9Gxk< z$9BRS)kK1Cuy8e#w@%q`CdM{x zv-tjgUTDdIdXYn&-HEBw9?;3e8Y^UR&@U6)MVQTLl z%fAiX_iz;t%S>FwxBZ^+;*fRO|5zzkTy-w7+6e12pQ>$RXts;~#8JPv_>)%{&i`<> zXXY_nXPq-$hHc18eAc<AoOkQJ^@3rSuh&(EEh#V-*D-%We$p(!)v_g&XiE#; zM z!BzN~M_e+d3;45|_)w!g52K z%X%tLW|+u!pru8|I*&seW%BD4a$zP23hVH(amHdsTj&)Y2L6yT|Dg>D*^2v<$lIzl1&nnbbA~1vev<;5 z7i+8{J2~;_AlSLd(Ni5X718csWsR{REI0!Ck_uq+e!&GKsLa#za%uP85R6 zU^5G~YsZH@AH?Z0gCD{z=XMHb!;7pFyBkwHC1!;+FDi~ph)EZxpp(z|DTsTVtEASr zi*aFbj*3h~1&$p#Rz}b+?wP$LG=vLmZC|AF>mWGA+ICfkGn=LCC(^ma{+aHcYPX2U zkli&N6eI0HICVKrzr!{(#)Lu!Y&z!z#6&tNH*WNRNJC=-!Nd^F%qF(ay9U!RwlKDK zu%`?MPj{ZH`reK^CH!qK{dQnpNb>}>0K7>1saT@r^Ql>`nl}XlSG}N_=CewRVb8~N z8T#TxK~U<|w>5-~{An+n@TKY@aSCPjntZ zpE0Z15?nQEAF50!HjGmn5inoKYIVjFkQyIb->O@mw zkRDtKtGo{0)$k-j={NW<|Gbo2-_iu0 z~8snp$1Q@2vbo$%h$l#m*X#fB~07*naRP=pr z3hgs2A!tMUU-fb_EbkfLp}8Cd$iJ4Dd}!w5WK}c0RrYV}x@a~|)6kyT`=#wAYMv$O z3E)a!Qe1}#N1R6q9D0j0B<%m((ZmcRmd}&}#jP2jgGow61gbua*%HXRq$UDPtD}HX zHjkj3WEMpMq>q^ugZUh122N0u_@?xZWrRvQooBznX<@$A4$P(EvvuBU_x<1h{W0_V zvp@T@vjub3`Ck9}*O$F}_m+=-^rPkR#~(jyIGbg>;L0V8A69|?#V#gaJqyOB!=hR+J$f{aG64s3#5U%tB8A^lZ znZ({^l1YcNpw+P@mXG6HBVa@3(3e7B7{^9yI9aK){OvYQ^nvXrzL4&`wt(MrJI(=C z(W!oa*_{iv{Ky{+5faETzJ6bY0)Nn@>Ev^btIL3zumCYgN2XX^!uLQ{bJW}!+kVzO zmMvzcRj5>b|~8lh!QNyuHlG2ok;#O6~N-M@6Wd}87L%99CmIhfuM<+e+E zHuxO?Z5zj<&IvXTKFSrO*Y99?-(|6?`EwapZJ$oRlS=tWE&;0{%q3v`hASMJ$8l>Y zy*aQ_eoQPeaazJWN}7>Y9LF3F)gt=tpgqCvOMq1##=8tGXq55OGW^wLe}qWJPbaGi zl@9)He)ColK6j)MZa4*pq|*>Ucn3}pS4~m>+D69fnuoB$W!x)nF6Ac9*gIb?`c(s5 zoGn)z60a0S4a+#2De(-Uf%h+bt`wJPZ~l*YIfrf^OUwWAw@=}dpv5Ke@q>$J;+Sdj znfSKrmw7WT->tWPU3|Oh&A*|6wj9PjCyAB2@VTK21wh9%CmP-(9dZ;}V(*$(xZ1Uc zGXbExlU~W&&{gyk^2D()(3JEU8<|kHETff%#ykyOA+T!t1fbo4SdO8}_6P)Ni$rk* zhs;u~A2MIexYkIkv>9_58p>_PUJGZvM=8*yVb`t4F-~+Q%bz;a#dsEPq+g&i9c;PA zlNiW*rp|`*pksGCJ{eBo&+-*W&X*H*`!MJ8Rn9QDS6+E#)UU^gh9%r2JOn<7&%sdo zkU*ssXHOETwtf!A(vybNBk06KDu0qE!C+*d{?i6j84i-;4F?^?#3M2&NWsvE zAZ5^-o0V!p_%t*XlVDRtekUsIS_cLe2Z9QEH18l6=W6BTEdBGmD*gGQv+*bt_?B@HniYM!^Scnp~d9_OTha=k^((^;Z8O+%chK%>%+ ziaLeKQ3hKlLe@uJ;Nl#8$K90{B7yDRb5Q`BpFhbC6X2 z@4fey-}Y zNWk_yzb8w`RkJEnN_#@_d;asEADYi?RS{dzV9F4HBAnk_!3`3OcWF^ZYCl?smR1&F zg8Y+aT^e!zFoE5IgXRJ=edZa^l$l}ffIrLdWF;=N@r*Iuq&NDhJm;)_f6EjGTas&*chb!_S(5b!idppqS*Qw!4t)3b_ z#~y!aC#V3J+QQ&Zk?Zt7T?BJCr#T^Y@YNp6vCWBulh?S;61+mN1W%XUDlKWli6FDbvLG}1y2Ar!`;_rNv1D;PRyN-g3TlYkXAfW%52YsX_|qK=SB6;L8IevTrj-AkGkY()!W3uk9^Y4m zzi)h{!blvl%!DjHHfsu|8Qy-Hw?AJyKK)rnzW3!>;j_o&gEH$)Snz?MFEY|@vFb+L z%&fNrRY9)W&@;X<4tkiltFOva78SyzyaKviVTGZyrUqHw2dAO$%wba>I%U_BJ?drW zj-8T2Gu>4PuC5=GU*t&Jg(y1+fWWRFje_D{RsuQ@sYk_(Yh>t=3V{y9 zOh=p77?%8A{ie;J2rZ3szT3J70Ly3vSUUioq3+U4FD?Gk+3B9lgO2-`eZ}pD8*WJS z&g!XfrMvS^3}A6?R(Ue(`0&FI2OjxH{LZ9~GUgz@hJk7G zk__6=l*ap-9k?tf#jV2_R}m!Ktl=>pu*eV+c|_T#w?O2I$SL?HoHMjUmCwl?rAhFM zMO}T8G)x_V;o+r2<<7+i%5jXm$H5h|@6*9Q>q2NDzG;VVJa(9)$vAlyaSJ5_%f8L# zk5D%7jdU*c<`S@ipx-uyLjCg9Tmo(jj*+?bN50_kWh>Bw#{qd}n`55ixbze@^n5)v zc2wapWhV=Ihrokz`flav z14^mUA?d8EsJgGb@(RwY;n2c9=VlQ#UynZeX!$0$99(qKMe*xP2E0!3ZeKg{?YH0F zAAQc>U-hb2h34Q?lxRO(>&^ycj*+OUxLx9 z1(eLSnHq)QV$vd=60Zi4#E|)g0kr?SJU!m!Fq=F3QGRo^LkfX)*-ZZBRDsDUAcFVG z)1a$35&;@?Tud_`O9?VDAq>)g1_Y0Tzzi1l2&W#nTQBA*LC2JDUIFOzNYp+&^2jkC zcuss2@SN-_D(Dxt6(-NigpIS?Pkauc`MYy@AIH6L>ka>wti%OJyZSxo&K_HKkP{|2 zK-+hDrHOf4UCzqu{#2uFaSPGv=IHR(D3``|ZEmDR>WzfPRfFDm}B9>%xx_%4G#dZd(p%5w1U z|KFwjgIlo+d`&6WUdPffE10YT^_=Z+;y4}YKq>cry_7G0wvx4(sPe)@J;BqLnrM7U;i($hFA1wwVzRi&95awkxn zxnhxguEQizT%1Ixg?3z&9=&6F6gBx2?J>gYYOJsV&81TCGcz1LBJir*&8W$z_)JcM=D#Q7P|6TwC*wQKe94LX~Mw zF#}U*besMHJBZzA;_}J@yQ!u*Vcc`N5J=->^-FeNRCeyY5`Y_BYQui#cYY@Xz-z9# zW}pD5mhqNbZix=}Lpjv8vGKO$+_bj-LYSyWaJ#{^$+wS;t@bm0t;gN+DNa zs^9J6z)tIU^yty@LQP{^8Uqb$%X-1p7KlFXhA_vX z$L31sGR7d9$7QqBO|R<-9=;QPfThsOP9JY0 z?Ya1K$7dQSl-Dj>{6rz2*}=tAe?HA)nyja?M#djKT*{ySY5ggjNdzIJktSUa4gr1> zUFOd+^V!3XH0jT>vu*qF@m<^$)`QXT^t*^lmP1Tb*0kcE-z~zMI36Agq(URkW+uCn z11JC*V0sw5$arYQTaNfwC!fvLhR{e%LKrXWL>O9fQ!jkV^P1%!%2|$=o@^j}?wH+K zx^{w4d&9)yLTYEVs2x4)NJ8`u-!4lJIvHc!M+Y*oRUIOZdV}~V+Czz1#Da}F=psy- zK;fY~0!#*FRrJe9w06eP=p>CckoQ$8cKfG3S;jBAJjxsNN9|%;Fw(}(Wk~Dsm9Kmy zW>%>|%MB9`J@imC${=`W8|H=xXOY_cDflVq>8`!@+OmVAaNHE4lhKH;jOF7W|9FIL z^~bd4F|STo*3lzf?z`{4D9buprgd~S*}puyRT*2wJ4jx2)m4#9t*f}?to4O2d|}il z?Hm2R;_J8Btd1kc9^>1?m^mIudQm`=7}sES45!gQ!>EC?4LunM{|bhxR~jUZtlk2`W;G~R ze*{5;0C3P~IXU9!k)<*@j{rDMZjanzXR)g)!gT#b8rSc2UoIsc#w13Vo`LCfTIIk6 zS6e_{;WF&(F?R1BU`!c9Kw|YszUf$IJNEnKP1+nAE>DpUxkT$gsNaE67yJg^Gsunm z%@|6Z6vVY}(3!MRwS83!$SY1_kRIxQyT%P#`Yq202Y6S{ymD32l%|Z2Op#G-4oVkz zSO|bdHEA%Gf><0E4Afa5e$fv)=jphb@mUpx6kWb&{1?!Qoi72(=>kszGt9aeW?$6#h&p5*o_bUG>%})|6}WnJ*5Aq}?A|+Z{qKIvUb|(!0qLwn z4^ERV9)$aB@HjI1JiVQ0MVgp+aHrDfrcvzY`NRw;*}mde_BoUu$zO_q7odlIIA)CP97 zT>uG%H)k)})>xqGNMCX(&dwy$bXnOoYp)-%lex1^dk8z2X_aKv3W8F=wPQ|T1^K`H z%>PvGxOZRR17fGS4}9PQ zu=D6;ItLz)L{aeh&ENdZ4Vu6Ayyra|?BWy##aH~^{N^`rt7NsDZTm(yllapX@O|%l zUmP=I9bF2xJO#nu_>JG#7VPaN@_W4f?Qf6d{q6VDKmF4i@N>D>pZE={qqKAL^Pf|G z;(7!(zPlPLup33TIN9UII|Mr&H-H-w2uKUCK$B? zIkZ>jq(l017NshEWdWKDX4@pV@OYZEfM40)aHj@Pp?}?DTjV)Pa}0_y&(PdBh&GgA zm}KCxnmlO?ZH$7J+Q2Fx!kL1prvNCABt0N8S?%#l&j@tpZKU=!h=>~zRJywo(tdQg z?7U~9jPKdO;rh(LdjrPC9 zgYr-I?JBfadeN^lF8#ji_h0%mZv+hZGoj`N;anP0=yQqIyT(URo;Vp$^IMOga`3Lo z4z+uhBVVh>cQ6LR*d|z(b91HRq=)r74lgkwR*NV`Rg3M|%-G9HhZ~E$MI>UAFnp4? zsY1m#!|Gd&8y04okN^8p-uwfZ`rJN0`fpjTJw&@SU~5y?_kMq-u|91#=-s@1$)X+1 z*ALfzW?I7&R;I~!^Xb~}rZI1(&GOoC%#-gvGmYVGSibi=4r7;WCT6Kzm%(7h*)3+cMM@~1;xi2lZH-rGT_9{ zV32h}6uW?-lt|adIF|?;KvmW5Mq={AB_0TH%w)#GczOwgd}cCAl)w;a z0l5^cfTsXCMyHbzFR;{XXK|~3Fjy)fgVj#LyM$+VdLZ;%xn$4IviC$~y6rYQeE4t( zcM2v7Ug_*;YXAD3jgd>T3SkO_>5ii*F#b%O!d5Z}^Qw*0c-Zm>x#;i;Ese|ah2eRA zx;8xD-AE#A)3)oVVD7KqS+>i-3f=wqW!?Mp40{)s+1c4%w6oQOF|4ip7HUD$`K~kX z?%f-gS%rV;o>}7NLr{xdn$UyS+$f}Z6OFcku^dMJHD7g-f?}Fe2aGt@I9HJ1OJj@V~XG;gFYm)RCu$8IlERnEt7Rjmrmr> z3XpY^Tcr(x;eAjZgLc?#Q3!fy=&r>N#Fy9gY2ZD6vUHEml#yMR!C#^6)Yc5BklFlE zL_7y1d3FZbAbbY~mNNbMd&|g2?kp=WxDHz>c5=fX<%9Ch5WesyKXQDKC&{bi+45%J z4L3}GC@uh>c?LD`1cV?zQNyBLU)2UfBn-sv(3Yy4+(Ie%aE=W@Um}i!fYlItb=(N& z16sEHZwVXEb$L9tS#bm#!l27_-gE>tGNEA-3_o;prMue0SwIp<5=%R*Nfrc@@ji9& zYy!XV_tiG;#+z!~x%#V}-5>sorYwLauEKA=VH6den#jb-`em32^k<#3PUg?B0Mh&k z80KjO>Nj6}kXE?fjLR~5@5b?B8IiAvXu~lcIt=DuxP@%MtI6MFJyn)z2RO>{mNdVA zTmcAgnVOvjtTX`cf>ydrK;%~=PCB5)G3de-)u3-iPGy8qG%MQwd1kKDT{jMONH0Z> zHG-vhs&DZ)qF4e}z>8yAPzkz~J&0SvCE*xGgw9-CZ+2-yWF+zq1n=^llBly8TQiWO zVVtS#+Bs9Er+}v*Nke)@lFYRZylw`8`4Z=mH*S}oof+f6=;iXBcfO-cUi<3PT1d^8 z8YVYCy!N%P?Zqn?4zh!@QPj@qe)1=Oa)UtCueIv|8{(0vsA+4veyvzLPQOdDY18NX z{rBJRqj+HT@BZ%ZhQI%h8aIzvx%uXs%hgw3-HX2W-g{%|w-?ZO6hb`$NBmOTnQ6Ad zFVp2y;jdlC?PwMK7HvV#Wft9wUi6~S$|mgI^ZrkjBOm_tpfR?9$IKQIh{0ASOaMvM z0?N>t>%wenzk+c>qiPJ@3a@O~<^0O90VJQZ_+^xa2KL%yb=VRUs z&w`q?tAf!%JUn5EFiz8or5iaE7S!a(y9o|jG0f!>S3OWH0aIQDE#eeL{Yj_tGGV9% zR9G~4M1qzbrjv-U{Tlh&y`?in*;hRWfG$~Pg27LtYbk@{pPixfbo(Znjg<+s8<*^f zey#B4L{T1+6J`C`$MyS7{ppYKh&&2{>6a$_ZRTdM0X4m4B_Y;4)il7oK^uHLKf78% zc~UIV@vdo#TE8{MrVh59p&bM#SJkw4_KSyEfxL&epiexp66aV++7sjp!f;k1ai)`4 z469^X(}+Z-lfZQqvBqB?<=1|mO%=b7K|h-)&V_U7_aFaE)&3<;GT|P&cx>u;=TF+q z86cYeBF?8_1jLhfT~n3%()yd>TcvNO(=RR#UHbi5w)pn^8D=-i%*0%};+ zE8y~{-3G$x!Kg6jV`sS=8lh+Sm#3tx^1Z`G-Xx5#-ueL%Lxa*torJiuI=RYDcUNNJ zM=IYucUjw1@1q`HXXFDndCrRYIlnSiJCMoZxIR0=I6{P1gshWl7aFtfC-Ac%X9D+Lf{qjuOpvf{Z(Fi;V;oQ}e#DsBD+a&dT} zHXRK35YEc+1HDdcQ#xa_)2R`2^MitkJ5JLnFy)L+n>5q*-%=rrwv!1cG;P;8E419o z_-O{p@Yi zYd^)i4YR+^Oe^lq=|CmF$f?HK&CP26Sa>_@^6Z4N-xE@}vy-|L}o+*6Lt z{(WWQBGq=$Dcb?xx*wJv`1M0Fyt<8aRD(0FKi5;}y$|icOtky@MR3u9;aQi#?US)S zvo!`4ndubn?z#IeCYiP@f)yjQ z*i%Y9Da~=0r&=F!*E0u!4Itw>+C8@&H0@-E-ch;-kHmy|ZJe1s%r_*?$konJ{aNSJ zW1giUHm=To&q2&1kFc}T-M@Sz`Gy}*USvP_nSQe*kIFcogZ!D!JcHbhv8p{*8zb*g zwuz&Jpd*)ZSzD?(+OfIW|gOi9-h2CX%**7eW{DK6O4M^vt7QC$Z}eu@U5d`|nG6|Np`M zxQlDp+5UCc?LYZhw2E&2pkT`sw-m7S8>S1qn)k%jaO3km((-OvomrzU@m675kN)~a zSgWiidEgTDZg3Ew?^&Md5yA)v4Tb}Wh~dj;`~yIR99Uu?SPko zV~n9_2A3&-=>#-}062xQ=_pGSV^bRWTNq1_T(LEc5Gc7XuW%?d0>~;H&Vw%}K|bn> zoegp*6$X^5M+aGm+ZoRi+Lz-exCZJt9O=155XWCm)g3&`m4VxuY29=%A4Nwrt*nTd?KUEcYf!0mcRb%zm9wH_Uzdc zg2y}F@s3`+9<^j`=K;nFD%*7mHe1=){oK#}T-g43ER0&QU-*SzD8KlNzt}6nqhCA@ zM#1j#%P$Y6kXpOc*16fj%@l63c;JBtdU=2LXMeW5|NZYTH{N(-XxGvfFcT;s_T$&D z^~|)xo-QT#!{|?|=F;VKcOZK#&!BH%9o-0`EnwOxCY+Zne5veK@Kz%O{mes#^PK57 zy4Wex9^T9Hoc(cxvm-~CjEt}p=hDt7MDE1bCB0Z;VYcD;t7bZGV>CmMdu)hF6;obh6X6)VRcC%Xz#@M*4w^#Kdx49K6dYXkHZCKDPpm&7qZCV62>i`e2VC*qVe<)sZsB(!-@uX4oJ-L4p_G zQ_zUU;@x_f#-CvsZn_x6n=r$f7?=OYjOOkr zHY`)Ks0%0P9DGEj$TfvJ2yuZk0arL8X4;)6s3e`0%uujbj;wnGhnD;lI-;hASKg|Aj+oa#M%P=m5mc(<|w@5tO@TBqX%AqiH)mC(r<5;va zbvL*z(CLmhT6P!ZBjUfMafZHXw%A6 zogA;r?;tki!5F+@<|bEQjQ&qqqcYsK6LB=$>(^XXM*qWYW$f1PDhtm+%VN0oYp1>7 zAKC)hPA;d896nN3A9<*ZTz6e;#*iQRou!Q&2lOW&N}~#7=djbvh^RzZX zdnVxNoI;>2sLO1grv`IT7UT&$C$~;w8LS=aAqv6}SQ%S8>{fB`UgYXHcL8@MNejd3 z$g~(3z2##8{f zP7h-am*I(%X_};`Ju|KG3Bxja&U!ZQS#IKHn`His6BqMm zxX%ph!Nij=1nn==nfworfjLes*73dD$H^Vv2)6i>oag|xq zC`%L~0Wn9HfUf6`&zIxJ=VF;|9hJ12LA4_;;kpS#!A(}@OlKb9VJ+0zGF6D5@R3-G zW0r$dTMc8YA>tYxXznB@uTL^F0zcL1R?LbcM4g-EBSs_lGl zA3dVb;ttuiOWV2(`-4CDgY=&D^Y?!5_cjP&2}nG3Y4exi3LN6uFN|iq&)aUhEnxNw zoWg3?@ue?)>4rKAGk5GJynd}`hHv*ds2wwJp07CUTd1Mb<+sz{WyBokLVGW3cjvDL z^V*e8vZN!kb0)7ar?w|{%Rv*%95U{}D(y)PvH6H~<2hhBz>jjYkcO}*vxC`>@va~k zYINv_BTh{5qMAh`!nX2$1?%Q#uZ`b#_bZkVSv6vz-RV7%?o$9GeZc?f6V5EevX72YT(0 z4?g-}G_i~?md;?t3VIq%i=#G#UHFm9A<~a@Wq2;}!eV0*5!z)icc$#xZhRkL`URvI zwKE|Ek|rrA`F@AZZql=}_MQ_?ECX|V$emv*o$IcxT0r>buxsObc`tZs3;3aIQ@-Ws z!9y{|D1`Zi{Z0yV{xm0vU6T5n$+Z1kAx}EeFTFVCII%Fy_qZ(q`bt{sZ+2Kl**nQe z7MMZB?Hth6C_679BnSwa5EEfJ&^nMoFJ7!5pNown5)A*HghGMfN?wySbY<1->#kg^ zd6@#REYqtmW8g=?BzrlyjE?4y-*~x4{i34IN5=s@w~lEWBR29 zcDpiwORSSD5Az5FyfNfBw=zs}o{?ADERbiFS+dKz7Hm41tT#A}GYhh;WsDLXh`SW- ztSdX9?NEH4Nd=X=3u08iu1il(PIB&$6+5se7!_=C$^Y^IbS^jW$ z_QD^v9uAh6VFU4?Ob(FyzWI$9C^a$h*eVBCI33@d$z?OKjdT4NJdIQ|^>6SUc@N(u zKaJ^(H?MFiZ)!jSUxR9CSY|6Y9+6j^4Oa+U8K1JC>IAG75YvvafAf(t`Kp(fqc1_T zLim}~Gr>JOpU{h{Rt3EM2UvJz*_NO+G$dXt>QNZE)GJ?b676`SOTT^B38;c&j79Jg zzoARO#%=a3E}!;5?vc>Ucp^q9L&z(QXiDJZ!gERGXYS+-@}um~LdKPq2yoB_42iO_ zwNE$mkfO|5zV3sIIZOrrxr=QcQRu&ZK zhzI@}>v&5G%&7V2*@82Z&RH;YJ<34sW#|Zvo;Mg}i=4~K4&=1k^x|V>t`Pv=`ObGn zWq-gGJcCY~xO5)=+^_x0xO{43=LUv!+TQiw-J5ZPp1E^32Y(x18@v8x*LL2w zzV)r;PyU2iRO1dFJQ#S&Y|NXmjCS{}Fn{7Fej+;iFa6RlVTX1~K>6SYKe%Zf#m}-5 zrm%kWM}Krv{1UHxdNhsgl+L?~GJ|@{D78hq>Bswj71dDA%ZHzZx zt%%W?#=wo~4EfevloVw(z9HabL_?wowv9G--)jC-&@Ic|a-aL+=V72QMQBICU*r6s z8)nQg2#Zqli{(C=PEHlygYZDvKWbn|Dy^|t5zBiH{Av#6>3D;I#>N8zH2X22cTA0% zrA4kPYzu%S0SSztS!r23QKoLYz06&Cd0E`aW;+E#fnIQ%w*cS9v3r~yz@2^U_MT!x z8to>(Q25g+{5u)Ysp(5PbO6-vFKp0>H=TVyd1hqVK)PGOHn2$dTDi9ocqueUCu_#4Nekr`A*(K8A0nwR)!PQpo^#R8{Z#pT&CA=8mpPGBzTeScf-P? z!!&t>5xkH5`V&mD;C7hm&vrR&9P|s<_{=LlDIjJ$WPGL-zH#X+Kl3Df-xH5EZ1Y5C z=h=^!ak@5Mo53-yW#|H*k@Dymwtq|vIC&2(_99BMg|Y*=Dp$lH*ckWRWTb;~W933R z&QC5-Ckak8masK-0mNdvV$XGT}Z?>#zIt8S5p6zz}EW`Be z{DvzaZB=eNk7@nc*6lO?gq3v^rn6P!+j&iMCS{raT-0%^GKYN&zg2%7cdtAg-*$;X z(;2cmd1c5FX&e;<{RH8vfySwy@pz4eW+ty0f-|AXNlc{2m=R+#;8L~7(30N z{54Kgx5{4uZxjX%8(d~hJ?L+gSR?SZ-UcOZ(%IXGyRF;u+zEeT;WFPv7wsx{|NY;_ z_f-SuVXDE5p((vQV$+c0fcS;xg^6l}14Fuq9p*ek6Bre28ia@Rr4Z-_Bgls|aC*Y! zTd*rAkaz|MziDV2=Qsmxmg8R9&W!Yn^&4JXx_|x`Wyg!JFY~XtiOCCEL}}mn3vNgY z)NkRPxYMjSjXuUn5hxVA;m7;uJvO5bl!LE#Q`;xsb+D9YIU(?u8p0ukZU}ziuBz4Z zXdtyQN^KhK2R{*>v_Y`6B7He_cE(kRFpl!wR~cV5%y&i2BiAZDF=9Ff^3Ss*T^^pE zWWe^_i3?Bh9EazvGtresowVMGt=KJW7Tn;ZAIgef&=UT(8%AD+o3uaP_k`JwvyAq8 zmJz}h5ytns{yYiWf&*7FWWJ2+&m+u1_|#5aOU!uR+WFi5nzAW(NcpB|!_7Q{a5S#J z+{_zw8_*sJFQ25lucI=ek-eaa;7tg7(uNvsO&jEGYV;I~lWZDg`tQU$MVhrn7RrTrf|{SRkykhTRs( z&9GAnb5|6ORC4uXnOc0j%umz=WbD$Ki1E&Vi4!jbd zvuOuaj|#$Sm6;3LVP`$WIeU*yAT0STBkZj!?D>OKg&V3Hp2|elQVIqmrnQHe{VVb_`VoaEx+Y)o)nTtMMDwpVzQ60Qbe5U$ zGhG{I12*t7Z{{;?!pdiVzII*GFT8B0dw(&}!RrejU8OdH0wGC%$a)OL5E_OMgN4fOk-Em$`q@yn`d(t@tD~W2fE%AF_@C3Epxf6!1a7f2+W_R)Nuat*c z0-&8qX9sR;rhM<$HbuhLpVX{n&>#(4#tnP6%QTJnY*wyJsGUcqvsrp!rY3NHo}&WL z7N!%{R(ad$&DXE>OjyI7=5NE0P!gYEdA9p4_AGvd&&sz)gRI?xE(UvuN&1?fTWB_J za6&)AnmgZQ%GP_Db{?bcmdWcNEG@=PJ4j7qe#c^G(F_fd-rb&dZYk0H(!OleWn%|e zjlH$odF-|imTP|KAC<3t{a!TOXD$F*hs|8=b8-$b8SEl9JLiBT##1pM#2;RU!)j-b zd>OFeB?GtnBy;`0X@>0yZuItV373s1NFNIfgx6m4yz;yM>bFA}7=vNTpaLIg0&3%% zn-5xYLd$=5j@yhfMgKWKM?7%~Z|=NQ;0u8e`Vy9O78*qo#L5RSq+)lNTPe@i3Y$O= zqO=U+CQcl|jHOQi1U6D>S>H8VM!xo7+4aGHSC;j~*cn%MX`4ve zAT;u^Um5z=BnlfxCNewOwdrKThOiwzyKtynvEvHfaVb<7?EtNltV4dZ;fTm^Vb}+Z z)A??`CR>DM+IZnl!Z$qq#`UKYhBU70Pv^T)mX*%1gpoL8e$(hTjreLCmM+?XmwuQ{ z(KT5EFzaVv=1X{4cE*|Cp`cxsWu$9)Bgi(^3CBDM*GkGWs>%7rw#YQ*X<&bG?J(aI zEnY0~Bm6J3d0;+Vs^fjLg9I8_XWP zw~Sx(in7!_wcKl4f8Y0gU*M`=m$N*D6*Xn)tj}jY^O<;k*Sp@;V*m#H{LlaV8QI6# z*q$Aj%tB_em2l*FfbP~!*Jel=HthMsKm5bd$uoYdvW!ps^7a$8cZqMp+3YEy==>J8 z*LLy_`xfnT#@9}k*@gRpHazFg<&!F~L6Q8YAn3#;HfPWZeg@U2IBB!s3|gC*H76+e zWp1_aYNo(a3HcqEW1>QSg+OOPaf1Wj%9*-H7zy0(VBE>CeF{zBWQwTJ#yuZUT@WQU=aGX)yh(N~b{Kg7@8t037tSK6F)GzVnHke4+cPE|C*$%0_{lV5U5sOd zJGe@7q3nPrVz35+CM_X!QnvTA2GNo)HoTFptB~kK6+v@}NvfOO+-N!Ls)a|;&;&03 zxsm1Wxg+KEGkXg+OGkLngoLM47zv`3!W#!2M`y@1;1E?;Ako=T4AYs0;(G6yMz~G# zNN0L!RoHDOtjv?);-fQ8_z6oGzW2vF90@nW&7Qd9?ZFXGD-i!F~DR^S^C9K zT+FA?;=4FyoKInkLzLmONryMu&hQLNcs>o!HqhV0t0{v=!aaue@2ks4S;9s6(Pd%? zO&vdevP?h=Q^-}0fug_&7xdu1i(T-HP6x99=-=gDk1kUIB2Hmm1y1s%YA>&iG5Mi0 zCk`st+^-=}d0tnc%>e%){#g?Du6o1^!r#%8z=ZUvlp2(2b^xn-)Y#soG!g7F>jqca z!J3+V6|EnLFM050g+1aan2g=3uxS|%I<(_5;DfNRyt-+L7Y(Z&=v9p`&o7ld2R>gO zyX-pyZvN>%n=Zrc=xr^T9X_2061UwUm`L7p+YTS*SHL=xgQJBbE^T~%IdSqt7~O6qXt(Q?{;h;S(`_qFO&I(rI$;*j_Y`wG zx_{&&^^YE1gjDag{sy3c*Z8)TONO@H^wxbVx1BTzL;BR*#1(|AuDY`P%KLvhjO*pQ zu`xp}9cjW2i|-wR12iFfQe)$?i2|0tYPC#8q&%o21VHIaT8SNZ!NO zcNufSO!;mMvE>GR(RPatir-k!)BjES@O-=p#*g)V2l#FbmW(m$+C?#Dgu;QRbfMs9 z`t)0S{V5d2q>}cIiQqP<_#a%xLDMeF0#{oq+dedLlo8juF>1Q`DD2|-TH>PssGw&r zNt@KQW;12|qEHDd8hm02Cnhu6F-}j-Ku;Z%E}WFX67VA0AI%jkn`Eq(XpcV`%fn7^ z{%-Y1xplnH*3=5y8FX!dDc|LNhWiUXNJNI^)3iz*NqreE-1Hl*^F7l=0Dls8z%aU1 zR^mjTiSW#m&t5!v(#bC}BMo{*Zx^j`2R^xsc2R+_XS*urlfQsl*Uq60g<6(4P!M(Xc$ol+dIg(H zB+g3A-~c%WlJ2yVuqAo{8?WRECDTH+~_Lr4;V5)cqF_Y3`KPINNkx(}D z7!YT_wpHD#fAZu!v#PI^>F2z(%ysvWV{_LzG*_PYkN%>UXvvm(%S`XR?NM_jBiOF9 zP8Zynx43s_Bzx!!7}kdHz-~O$a!yR&tU6O|CF;sG>%-!ID5^ ztZDNgO=?cy;1IKUK4}P%%^koon+}>{P={XaSPB8~Vr7^z_Sl`}8=w0`dC^U;D_^|x zu3)Uv=b1VOoULf2rV;Yyv=lstdPb@(=#DBxpYc&$gyc&+v$WG=HYD5L3&?FB4r#ZM z*ml{jvyJ6fe#4i&^d;p}AOD;3g}?h-vO54X_|m7V00z&233|G-{KOIV$ zpge{p%xubbn0XVX{x%H#y3AkSHvijB+lG~87^V;=E~d?Jp|<_)QU-+^*2ZsGnl_v$ zuN{D2TrzJP_Y7;2ADUP#2lg~hM$C^WM?FMTO65>NVi%^(v{=&QTHEMo^V z9My=VK+B>~hh!)c6yOaWp;iRA5~_$)TLcLfh6&+g&Oimw2(o-Qjs4%88Wm0jAEQ!J z<1@4c+C?him2Wa=1y1d{x~RHiw(H@R%z#vV%TcvO^pJH91u0h@`%L-zo;M=1CZ+W? zcJu0uCevSdv=`~=>*X!a@4dG@S6p#L`}KnVJhZ?l(*DH{|4mt&sdTi&tul*fb*H&y z#v^~$__-wPHAt$cwIS6uPkSo4T(vtT4TKJTOBR*9p+RXU-l4q?1kQLFox|Nw!Kg{8 zuqmysAWcKF@B=?MoiJvV^J>*8l_XeyS433KUpg{2@heIDfN zh7t+P0hx0O$P!-!ek4x4KQV5Y*Rpgz#Ci7Q{&INNa|6GK$Ui1aA@D|a2LHR;%3jX5 zn|SMgQue>#`7HTiPbPEc7wr!$VM;@7*KWfGHKHpHraR?p=XyH%n+j8r(c>q|*a2>z z*u4`$Yq{EMB7AuVy%RT=T5}0lWkuLbQB}jUolKYh&00at@Aq8prbGlX%F>KP+7TNk zt=`}vKZ)!->F#A*43lP=SkSAQ=~_`EAz`E0v( z8p9LsOcQWOWV(pM)89r3BhwCoA-s0FI#^{X^_lU$0ZU%>>DiMk>q;}Mf-w7Gtk`8vd%FVbip4T@S$35y z$3JjaJLov;F-0)}31es(Cxfa3rrV8OstvrZAD+B=>u|K?FJ+F5y2hk!$a z=)l@4MCnvje6LH(7l;1K0w$I9>hpTAU&AOw0uf<=b8i9AgH0dreLMW@Ck{{?9P zP5Ujsf6!PH%Ommy-!d-3r9TJi>H?PK0N(&mK(D_tAiEeVsz9j5u$nML{Xr;>m7)9& zlaiUa1HF1|@cjSmy$P^w*?Hf!?z!ild+z+^*RQ)@&+0*HMQ#nYY$cW*Dp6EKN+@F! z22(|aKmfZ!IVqQM;S?c2L78A;K_FBD*p@3Hu1bRNfNXh?CCkxd$!e*kZb?18dA{>K z<30R-|8@5B)swpY+LFL3dUxM<&e?nIHGK2;t#7R*3EFv`-^cGSt+SWP;s5MC<(^;t z&2s46MGQb_93xOqJh@@j===dZihat>)Tg0$}!LWHDWBjl^yiKS%m6jQV7`E zW}-6`sCrL_RSQ7*qwcdD?@~{;s6w#KI;9LP&yyz9VRf(gQMX!lO!||?o_nGmBPHP2 z;WdsbG(`rzOg?^px^To(l#qO7o$0-g&a79_X9c#`7(;&dqW`rc^=HEi(_i(Sn?DYG z@%^R_hty0hTco*vu*|`Gmho!()ReO?H^1||dB?KN_k*8JS)Y4-)iZ81b=DGp@Ne^O zo=;!&!*NW1-h_?6gRJT6H=pzS=J)9rKbpU3@vr!8d$(Rq`RSuiukMv?R+hWpUyl{O zMv#>&R=miLAqGI4)zT(|3PUT)=%%iVa@Bv*lzNhPoK^FEukbyN0n~;;iS5Q878cb` zd4V#P42eL{91)BK3KPvD?5r%ODVP@s*Lg4DZwx`dy9!e!3@wK-3_}{abQR}ddD zCl5{BZv>^vn11q{ZqVSo-V==BcZQL&8U+sB6B}H8JYuh-u@(SRf<|hN@3GCpaFKkP zM=AB{^~W6oYg=C~E0;c3#(J)J(B>xS^%~_HFGAQ%iH-1NJh6dvP!xN&3|fN-*Wu7) zSP5TZHd=!KmSXvglb{s#PsIkUWlERQVFad0WDcLh5>gj!Pl;crMVjJ@;VAXVDAc>M z@rCm2NB&vqz3H9hu}2>cLvFI)SZLG;&?~%T!ph7q{h|!aApX#D2WyzVlJ~qHS@H+} z94z_@zYEX&{|evxgW|WVSZ}vnQ?p9dV~vipG5Uk|-&@X{J6C@BpZt9J!Y4igO(`0c zZ2$q>Him-vq{%7eAt=s_OcJ8O^$@_jNMy{yHq%rTl}OV1KJ;XyCecICzK^_(7_@ zPkg4VzWqDP=EDz`O$>p3W>(@ANjQw7;el!lTC2T0c-hx){mb!XQ4Bbn;|yRXRC7kS z>v4?zN*`4rf=Rw>4Eou8j|2Esuz7j7+`q6_o;ZXd=V>F*p85)nR`HE6^1DF|Pqos} ztXIX0I?^h-n0OW@L* zpQ(rMmbdJ!*TMS->%6s`znikn=fOVTT6a^XsnhqH{xo&@>D9d3ykosy4Gfy+j_F{1 zmhsuG_nPthytyoAz1H!ET}^wIYx=_17w3BA%L}B~@w`Xshf};7dviDgBR)0eq=`5d z(AhkTW|x;&$PbpTb|Z^yUAphO6%h64wi?9qWSp%X7VcWWt@VfuDg;%1F%D@|XQSKZ z5Duc)%-|BbrURirxXO8F4^210c9s;n!HDTw_V06(Xy=a+t<{4DT3V-RlYwmh9MskrpLI%Jasxy z*?aiH2QdoSGUU*Gl>6#yL_O#4{ex{6hFP)q)#YBj^Ua08>iA+gaqV|7{-77u{ERUC z_m}WA5QeVU>qFRseT@9pLg;5q?x)1*f)52N$pO`g0O=i!wh=@UFCC3QDlkYngt^N(L{UN6;Ka9|8{D+-LjTTz7%p|5s&xS(IbhpJo&k&%EvzVf%55Je_xCO^TJ##p@MY_ zgg&@5m${E|*T?Y~;9x{?LMIx4W8{$go%&8oMG%&K zBGIjD>t*>p|4UgQHR13RkC)!Pr%UhHk+Qq8Tn0=HO`vJZ#yGMoHxWDia_jGxZ1j)w z1Mmyp(2j|c?q9hMr!rJ<*e7!0zG)hK8euBKW-*BHR>^sR<$T`mKliMa@}@;rWulBV zutpGosLnJRI&Klzn_#cIp+jrlX$(+sEhrW&s2D2XvaR&oP4%mGsqy=A_j&I{G)ZE|ku4 zyFA=w*Nn#45O$Q49<3wS!S6n6F5hX&H20g|eja?T0G7B9Ue>F#eegQ?PIKRKUO^<~ zo3?KKtflI|&9mm-t^M)7^)_|-+jpA&H}5x}KKE++VmY7r+waY1^L`3XpF75{b>A}0 zedJ5vbFjVXvrC;p`PAADt9Q|57(x5cPz!yfjjF6re(i2UVPMt9)c^=-7#``!J@`5v`gDp}G2;!;ljFjiJ8BN5gEoEwf_S&c)1F$CN zQ&&7IBO(&DinNOdGTOCz1e4UuAXK&{w)$Tdfk5E&H8~Jn2*ZGh;Y&T~yhDfD5Uzqs z1#bk=tzg_Za~9>Cjiq_XxoYqCb{RPP9~u2=X%r}|W$yWQIr7E#m#x>nyKF9f^~$*c$a8+_4@w^0*Ci6mwShwECa%N6NszqKy>70>WwR`RhAQoFhWtn#9Qg*cqEAi zVGmvHlao5evUAhsE`&PZyOAE#0u-5)OkL8LtD1~9OKL_32TqfWYn~RZB@a-d_Z=B> zVqzDJm+~@X=!>7wyHh=<&wij>q~71*gphkq-;EJ?s+_vxcv2v?wwb<$$-Hc`8f+Q{ zx%D;wX$+p*G47hOwf>i>^lP^C)i)X4H|;vu*V}32<;qvN2yR46epF+7nGNXIR#(9L zsJwXQZ28i&&z3Je`FrJKzw!&?(I_wfFSV`aqi5ys#c19`-B;XaY2u@NE_0`+9^2z`oycoRuq zKV99d>YMtdQZHZ(JSO6CW3$X(yj*73T1Tcc_q=h+GJQIA&@{&WsMl+b&6MvxO-j@C zI!opBuCo-%F7av5!WG^*Elb&>OrtSrK#NQq8?4BdR_MhcQ??T$!}QIeWS>9=<+L?b zOYq4Vbf&?*c#Zw>m9!XF9V@joE|rTmbvv^?=@xo z?&a@W>#0xbzX$7R`gZFWZmqLrT;h!;!1H1z;+uaGWP|G^3Qb>l-0h9 zUPT5W(`J{6Ak!C%3cAQiXwesxVMF9h8=8$ybk&?4GC@%9*lD{(ren?j8;!S-OH{-C zIXXHdI_ES=j58{8n+}hFn_qNiauZo0eCk_R?v@qyw?Y#`#0Yt;=Ok6<9ldisAdkPn z`*GEW;cX0tSvyC+3;^1uO5Azuz2QzddG6Os`}Es5Jo$bezIy#}fxz+pi{*6h_eiF% z%CAMVWrD|&efkh?Z9>ipOb@bdbLQa?8gS*e8(_|NIItSR9P)c-M+2aibE>0*BhnvN zPq;@ot7GqsbMfCrJO6RoU2= z(-+@gE|u>oU;Of*oIQ8G+Id@0Sm~?-$}z zy76uwxnSZ5zHwQ>2s(^Gw7~S~3Q@BA?><=`e&C*Rg3}^a*((t1h@%I4?5%||M^4$M z@+rB-jHi#s++&m8Yu7H8FMa8m^2{@5%Jm!D7=k^7FdOzFhv^1IIRoo_VJ_eG@l%M((KZ zq#dKv!Mo@+Rzg|v93}~=AOU5R(&^LKJZ@CpXT#mnOpB2 ztiS1-_YQvd{g-;ru{3?XwH(!e_&<1VIq&&SQ{TaNegELav*$Yf@{!iHOyhQl<|Tyy zd=B_qjLc(Z!gpv#dUml-7HXhRAr`uZ%){|b%7MxXsz@MC7DrE}i`1Y)yzfj1decLP z>fV)>!C65T$UBKV!dIp#w5@cW5TnzyMrg9BAcc4%l^SApE_#20cL^|MG?lNUZiVq~ zd9G4bpvG%LQ7^EH#bxc*=ZY#7e~-_c{2|cn3?D8y0UXkC0BWMFIXdQkL^;TC>9k#< zf8;~lapl8hZskh3a`?@FVJhGR-mBOD>kv?o-MRVca%M=fJoo&I<;An- z$`Q`qJhX<9!MV~){J9`uiOo1=EZe=k>vqdoTkRYpy1lBu$)(`@X$!BUKg~NY-8oBW zjETn{2bf=DV`tB3zD~Z^I>&yA```PmUoOA*JHKT>B(n?BmUuWqZrr^br}oeT_mwxk z;dSM{2TzxU6(WDz8=PIf0X?En`|IV|FP|+tm(G<{aNFg*5z11zmMKHvyR)%}qcLBO zpIj@azvJ=pC*Sy5@@V$J`&pcT%jMFgYit(2$wIb18{Q)um45U~nXeNN!_T7$rF$ME z5-F`lJ}MV09CV_c;#t_Z%oGjY{L;}lC|?sg4Va-xq&@@-KODuFJ;6J^VA>A%XD|$B zF0(S0L~=GK&ri{SpT@`dqgR%v7A<)pdt(w4+0ZQ<^Qo(2R> z>|eIRqLxoC?Us$%QF*+#SZ8H5P@Q8`PEBbsVnrbO%**@M?d7eetk0YGz3-pJnlgON zmG}A9l=ahc)?>X*-4^zlm+v&+Et_(DHurpPQSVP*;TOO8YkoKVY~J;`_k8aA2cI|J z{j_{ODd+d5zX#iF`eB`3mT#`6?@eD62tF3hUcO5irNvXLqfE()^lAIjqAQ3C8<^|ty3<7k zpRxySog7ma$RTr~)3z&67AV*;tV~I}?}mfUFY9qQB~ppJPQZDVZ<43clxA${nJB>d zCk&wXBSD+HlMQ>BVsZM`tv{^O4hbBIT*I&5BiWuoFOmb%!Af?DP(w0F*L2uOQJdfM z0ANUjz|rWDuWf#=9G!Oem&MJ#+L8M`5-R4Q~-u7TOE08_yq06-4 z{N+!S*{w6B^YFW&yOZSx#>kbcS82m-jOsCfU5r4tG-{@xUKY4hx$v@OZh81ec;%KF zzOg?QQm^=WnU_?MMr57Z=;4hzz0qvl;WXIh)hp%y{)L|_m#?_JQ>!c?Q|`jxyXUUE z%3XKgRo?K#pD2&L_I@JDL_anzmEn!gmCMgxDrcU2x?CoDyKro|9A>)o;<+nje{;R8 z99}8&*JpN(UWIS~A7&7T(IfnuG{Fy7| znddjlnTy-xhk8l_G7mS~)BlmX%w~=PqL|U4Y7M|<$$`v-Le$#lh9AfdnO`}ROp^mS(G-htS zC!CvNjj`iP4vOl&=0#s}HSbx6_4>$rIec;`7w*UP2BCC9{t@_u7oIbXP0mwoy zWCB(VI97KcH0VI&0`%ZkKL*P>2oty2BZPwS&+Zr4Xa?2FjHiI;7(uPjit;n~aJGRf z`iXKg&|Mq5YhVzC{$+R;p)O^fr@4)=)v&Fq0T%^qmX-8_V6h^Pp{Xk-of2lgnm=<7 zWRAqX(EkTq9-prRmvV)(;@$6#1vljs*Et=G1G{1$xSk`IGMsA`5)jl zXLP#C$=%*_ejUP7a<>hQN|k;RAosV*qg%gKuD9grr2M3<>Q)XA-zZ{k{xi;Au9z$BTLgYXrO3Osi^hp^%ab!c~oBwF{C^f;a5RnWc(-FnyQ zhavce$?3D*)}wc-rh_FrL!Ot$>)hyiIr7XuE`wu_lmPoI zd_1;M*uGINfB6&T`nB_A`^IJRO}ANu)+#$&oEHmy9LC@~#+2~2Ya3;-3(YBCRM6%g zqs*a*n$HDIDO;n347Y4<-5>(V0wDT!^!Ukg>hMxI$~FwAj%<*Rc)nb{xE4(|2s}otJHu&72;j+$GiAHARQAnni!yi_ zFdkGi7Nee<5r>y~?OXj(qf=F6--zoliutW4w##b{Ps$1Q>(en!-X6~2EZ(XMhBWk? zo^>PUq?=%TY0Q}dl|@37(a|&jA|BLFs`VkX5C<2LV3a2-)(D!!kVF1;(Q6y*+Tw=M z3ZCx5LRny8&_46R!!0A;jFJDsjn(GTO7LC-=NLE5!|A8bEvEtGtIhZ3zMsCQ zO!T{dUN_~fFL51w-`}^EYs%QarXS5`)6b@krflv{+iu$Pp5L2(HsiH_cEvhu`{0hVX@AM3G>X?@$!%~Q*xa%mO)2OYIoq@&Gbpui}t(OPN5*-q&UOqN9g z8uQpn%8ONUd-r$1tvasd>?+6Q^4~o2N&8Iwm*yBlbSTu}w5}aUV1%!3wKq#3W1mHm z+EmiGmv)$`RtEM=JIDr8E)_QC&r!H4*i8vltSLY=Z_ZV{2u&Nv5hV;%Cds}=+)Jv9 z+J7oYS;Ry%MNbvxfGr$wht8X~;dDr!0nCrd`@^s!phK^iy#Q!^bGoRk1A#A-0IugX zB&Wt)8+yf5bu|DRV2@=YUS1o%SXOq=lo$GIrFZ-drN3~T`>$T#Xb7yZ-_+{X(`ER@ z&k*6&I3Hj%aXu$_QE-`yV&Z}LPF@Ss5QeLv@Lb*>V&pkJ(ne8tq&1#M^z+aLy8wph z$9TIlY~<~JS^Ko1@RZqH`3s@OFtmOz8B3u&ucuCJo)4-sqj1*9>oYwvAt!YfA?ne5 zPW2h_3tz)18gNt@x|jBAgogI%lZ#dSy?Ep4vb6a$XS+Viab0gHgT+(a*PyI@NJn1% z=j(>RndhG?AN$Y;%jZAynbINJcjsN?^4)j3Jp9=G<*`Q|C=cFqnyiBDa_I}d%Yu-P zg6HjW=mdLaK`UMG)LB7HLKl4!qLDPn3zf3T(d3{apCB=4&%9G;136=AN|ZTH>#Qr; z5VkW!6Jrn{SC*l1J@OgaENsy0?(_?M-oHF4j~zQ!HrIRQ%=wLS35Vf2f_7Vn7KbRi z_apjrf}Q2i$8Yorx3U5-+ceOmQ-GtL%`(AhnZ?j8YfST^2yXkD3ijJB|NrBHcdt## zciz(~j~^lGd!vs`AcX@x=bwuXm0_;5RkwK@sS7>~G$<_0!BPzA#2WEU9x$>`!%t&O zhtNGsn@x8I+-qZSb=ktBwau0=H7OLCX{6B^5ZkoA4w0Qj0wL%!grU(LjZqyHonL1| zBp&S+^ZXXkiR$CA@{M~FWTlR?b0(=-qd`dsKV%CK`u+T5yF9sbp}c+-ewte?N5;r4 z1+SL|kXK{aP-mXqdOwAx|M=|IaKe~dQiir}EkZ)ds%Fn&CtXbHo z7*(u#ukJ%*r_9glP646EE&;o7Z{Gx0j~;R9ydD#En+&~;Q0ueR!XkM&p557oa5V;0 z(3$qZ`rUzG4R>l3_7S$`(I_0<8GV*1mN^8sD?L^CnHJ``p0h$aD@O6;-9Lwpm-gkS z%CQ^ImZigY5*0jNdPnXndkZI^l_`dV-Pdsih`b+zR z<7AlaDfH&q=WNVglBOHPc+-2PeZ3!}cnVBcllz&x26@8o{3m*y*3|=-CKSjClS81= zD9xl3G1#OnU?kJHFv(}atHP`@R2wFoIDbsVzUnjM+lPD4mF4H2Dck!jVmbOq8LmB8 zdJCuU(q1(L0naPGj9{F5{<-p{&ws9b{>jgj9dcwmxBIPcetr3lZ+}yH^fh;tyHBhU ziQOw_zWDj_h2QvSX%T(Ca*?Rn&U!g@_Z`X0^h6nDM^~o+<8DYUp(la_E6yI^BveHY zJ`u=Xp(E}?ftk|ReQ?FF$k1h$LO*?DQ8f2rpb2lpEVb#*J!I*8syHbPv5j?vNG61b=Sl(4#*pc7B$!&O(P> zqChyyV-opihzzxmy?H6Ue)XSM0s(Ee`wq_(SNA?lOkkxAji4(AtoAl?XS#>7LOGz} z=f>YgNDNYp(QC^@>vS5Oo&^a!ub!+j)+zk~`l(KPXfSI0Nn6Sc{sYf$IzEFuG6FM? zL!%(vSYHnfbusd@*)N^+-Tr{>U?}e?BF<81;EhqzBQyEYfqT0;$0&57D=KyUm028F zeQtjnZS2uM7i7*l!=dDg@WTDU3AVp4a&+7k_9|irxN_&DTMpsVoMaz4Pb`Vjr_Xf1 zzUQZx#(^Ru~Z zv#Fzbe(+w(9jL4+YZ)2Rt9kF%@BW?^@oTQ>`{Mf?0g9^&lX8(wou5AQA}F4eI}V)) z9rc)IMe%{pIc7YOMs&e<#ErOgcGK2HSyr!{Ei3C!mLqQC zF}qTBXO>E@vsU&ItdsU4Ib~gxJVpmS8XG&e-x$K8=Ue$YapJ_wcHb=w=BD20Jn+*H z>q4X}3$x`gTj?ApitEra>cOq{V%J!8P%K0z;e!2SMv*qIRUoNZjGv$t> z?1qogH6$?76}Ql?DJ5=7FIgKIaQYSB0IY&vj6;R12cw%ueV;`JExMsO4)Zc? zyza4k%e@ahfV^rmm3^bUaONBfQm!P@=vWA*6LDlb^wUpzd>dH$)-57lI~XF45<8ji zup2mb585T@VTrTWmS+cLt+iKPb8?A*>SEc24n2yrIssI`+eS`Qs>%q7KqE>80R z86GV=c4ga$J$<*Jwa=HGa$y5k9-?{V#Hn&8(~e!fcOa-m;)$%8i{sSAaOo%yVF&)L z)j6<4rRXqUgN(qB?_S)_{ac^;+pBrreAc`CO96qwx2FN9v~RhusFNSf^IPk% zUduN1H19UQr|+RXn1!sBVsf(x2OI#`9gOh-h}&j%VI6O69h{se>aV`K`^eEm?%ELK zkYJe6;4Trk1UkTnbkjA!0ZeszJK5Bo02}gXd6iSquz$o~qJ=}=ekmt#v$?%tKa;aWDZ*IM}|<(B8sSYd0{yTvQGDP z5wIh|=DshC;ah1vt2AAn9Gqa3sQg_4s`Q1E;oPj5a zicJ1g3MPAZ$Jfiu-r20Y6A-ez0>CkCan|0I%bdXp5>}5Ns;dYYg{zatTSOOO((aL^ zvVQ(r*|>P49KK_%EUqmvH7#L)LtzPZ^IXC%R`hQ1h7gz z0Bw!&?DpB7Vu$A%GxqDh_}&^4R$OTizvsoofW8@cW4LE`iw3Rsw3NE)QkO;-Abw@e@c0C)3S%KqX zi2+8w(_-^;;GFt+8e*Nry3*5a0V8=c0+{y{XxWrk8et6C(m4clWgN&axOBSE z#YwI^38TfEgXU>hw`rkw4Jm%TbT|P;16yxgr9K?s8D3=T4mAE@aK8v0ox8S)VX%#W zWi=>c()@JM)XFLb3W{bOoXFt9SEq|c5dJ-k0Tw5qjEt1KPu(i3lBKla&0g8WDBkSPlx+;2J?L!)IL$N0 zHc=0aVpnC~0k6IBiPx3aKJuFK&_nmI%?=8gjc++GvTVKZ(Q@|U+0t9TSeD?YWpJ{} z!RanCvOQAe!I`rY(2rJnaL*?Kd4Jc)GPK2sGj2mfmJP;Kl{Nd!Mzp9yL8|a^?L`zV zhMx2=VNuZxe{g^3%(pqq4fwHz436yVJZHnUIeQcOUtU4>!1HiunP+@s@(xKfghv<4 z^3hIt@Luqm>0wOg(s&zGU4d2rZPR_yL1V!4LA(t^2$?CKDq zSR@kZ=F2jnk#x^6bsMGy97p@DeCWe>o2;I`wvH}AMm_Ml)8*LGO1XaFGIR+3mC5V7 zyi3FjzMV%&8XVYl<63BS?dU2~V$dkEURw94v;p#Ob7Kp6g&tvnj{E8nBa87i3r&on z#W5?hchM^ghYmB|xpMBsvk6}4__^of9xKYXIEr+2ZDp$CP=3%shv`+w9iApC0w&E7 zZUZlKq$CK%xbljBBD=EF037QgkeL>+fPa0*=gMsjJ?ol-X6K=Cqb)}6ObO7{bXG)V zy|Tz+B$R*7IaeRq2XveUr*cre=jC^uUHMuW!f4`<5sp1_Ll$dk7x6wlu-6+RT9WM*)2RuNY zsJ|D``5x(d?%V}d&7Uksj~yjnc7p{Dn=xo+fcYHlDc{HF8L@Tw;#JyYmdCtTbloaC zbOOF6L{MkZ!C!vvT)E1^sykWXu2H|mbhsxmnSyZ#i@4NzW;^bZezAL_hmK`4bf#P7 z0f-X#a+=eTBWy#*^gLiNqQ1v$($zE91FxgUG0?a-#Q5ehx^szzSBx83E1s8;V{S<& zmOP0}U7B4hfS>!=4v>2W!j@Ms$l$9P_}|4iLyYNaa6^$8RI8j(y*|7OeUr@8V_O&a zW1?e6qf5wzF(+RnuaEJF6CKl47KJ#??^bt~Q@;*~)T-CC&7@3`X_Q*LOAkh?B|1eP zPb0HUtFo-AGb3lxc&Pn><_c{@U&9+M^s$@cyWN&~f`lYM6ffIYYU3X(wKp{hA9IOD zJ&Vv|-?UYxtcRV7U)&2Mm!0?C1`aGc3r*$oohgJut7$o9Pv zqXFWjcMwix2Jgozwjs;Vt;($FA@A@U;An*#4$stH`ec1Fr53YMM2!p$7S%O~hDjMU zedb@vI8OWLGXbn+t)Vu;lV53(W5jd4Dj8DCI@Y!0vd+}Y`$i&QCWT`kB`f@_$H-R) z0cn&&V>(1ZA01LZ$-5Y~c&+I_@KTV*JC$%~*FHL0ry?AWb<7Z*P%sI5rw+o%2ptu^ zedIOX)rf&4Xvnb#Zs1UO3CDP=RBWGBLLn~d*V#(}jZo?e%&EuyiegkTK3BfZ(Ma7d z5(6D&Misilw1?tF;CU(3&D)cSVn|N=p`jJSo>AEML4+AF;hlIkQ`kARn&^xM5%6|z zGb1B5tT;)xlv7}vTcdMeG_D0ftKx-iXn=afkwQm9 zG-C-ZDLliD5i&--bpjA;p$+Laf|xcErKG;T3AnuDl#I`4IDM)86gSd7G{ZBKfkz~Q z+ule%qvm+|j8#Lqt`_r5Wfcz{;?FTl)AFvc6OStx_G4g$Ud$LANAj2`kqt)qJ;yuy z2#4J<#z0U-Tkx-rmpt3@9s1-s-RAPTZyEJh-H{{5IqQ>z zzkCUU(^G{Yr~MvA6vhmoo7b^&j2NzNZi))VFOe>xX^czJEMN9WJF#HAXUg@-%hPeu zXOy3GI8>-Qh9*uY3Irbo4B#qTbTF;s6p2o#Xj3dzLXsvh3afB|51|>pt6cS_XA!FI z!L_x)8Q3fkTEQUkG@Luw3-yWDKUn5hkD*{tB6G|@fcKs4&9b}0+1E_Ut*+vH^8PFW zIwzCBPcMA=OXasd{Nb|0BA0m#^c4)%Bdqwv9K+bc7=?c9&K^e7EVPqF2i{4^r4q1B49FsN0kwYE}*!j3+0P@GdfkNEQxG_hG&4cAZW=S zz}QRqs1p$$Xg;MmaI#j0`9_|#v%h5 zG9VEKjMb==!K5XeQr;VbKcq?eZNEBGLn%6sa&{uCuca#@Vg`Z4i#A4wU_us*Qn!YT z_4j~@hR=eIGVmQ@TsjWBqf8Yx4IG5Qj!|K7XxfNl5cke7DzB~EAb`fCTkq@{opo%& z1N<@Y81uH_VpXZbolzD^gX?cY>wM2_(^P+kC)DlGu5wf(Fl#M>6Y8U8@!qD4_@MPl zbM%|941jUaXU8vnNmKkExT8ISBjM(N)y)%*Q?>7o%jeam0iTJRRC+L2wu~X%?qd}% zAY5BWTot3h@jo33n-CxZeRBg(m**=8@-`mOK8Q)47eG|NCK`p8BF$-#`KfSCI1*)< z6_~uUBXCUYXDs_36Q@uHP@ejb2wpk~037tL_}E$1h2oG0M1+6{9NU z{7u11d+7|X$^>8luhA$01WiAUeEPg;Ljy!_!0`Fru3Om5C2S91cpnlF2Yi<}eMzQJ zVEIf0#d4oAvVwUBA-2ZqK^NATyC#!sXzT+UKuu(d1YU?LN*-j@9lafBg{8tr@aqOJN-Auz!j5DwTZt)&H+?8Ni&W$M6SRFZh8|y0RRFknUy+c5c>Y1 z=7Wz8IZiE^A+WYD7%Wb&8acsZl!?Wy(aL=VGIgsYjMPyimqxKh;2xfv%qFAeO8@yL zYD5X`%Ot{5T+##j#6!jt;Y)?t7m{&k2qlF;`mo>9J>R3;d2d2r7#t;z<{6A%D@jFC1~NMTg^t0C=g1%v&N zo}?!G6M^D5pr@>I#Td2>P^5Y4p?=@@w?actHhDv~31E`w4V@Wbkw-GMLx-$;hPnh^ zgemVC-Bh6@8iR6hT%y6lz~?aFBwV8_n0L^V4qp{gGmO(DWl$S>>@b#WdduDvNn)lv z054;3IiL^HPn;ciZ;|NFJpJC=+bX+63j0^i;NcU=IeDsdkDe$eR*tbL^Zha2h42`G zx!>C?d*{DcE?&M+&b@F3&;KmZza>`du9O96u{Sc>E$qp&M6PTjBNUiUB`*SpIX>HL zEoJ1dt=s{;`_dez&+NOk0X*WqSy+YqMp=_DY?O08d`E=O=rMGQ2*Rr5J!u9pIY%xu zBLqwedyOlmVHvB@-xjbFUzYCDFSs#|aGQGO;F*?T3ltlYB=p{;4ULo$5!b!z8)c8} zUIwJ3h%+M$OBjSphcS}7Y--FF9b=+{JKK}8HRe>38|O=ZX9HwR%H_-JWq9#?S%L0W zZ~%=>cH+1olYxm2nX*`mt`CjRi96(|QQVO{!S@zrxE=gAasXBXevTZP(xIZ9{gppw z<#~8rCwz`H1|82?^n=795AurtEBNx;s+GI)FOn^F%`tzdQg^0@xFiajZEv6zxBD8i zWfTnrhUy1Vwa_)Pf*eAYN%zWq<*>3q=dmMhLYEk2zyR|cM+jOcYHWVgh;zhepywXA z9}~gcN8cuMP z`sp_BsF$5(Q|`<_13u76F#w?;o^^hV*JBZP{&K*Lq1zYj0Z z5-E!wuvy*_PLPVRgWy~F=q!iu0BCG+Q~6&5NZsq@NhsX}0e~U&I|hC`POZa_=2~{a z!K||hjK_9s(1-@9Q@yTkS*QF6!>+yNackNjRsN-2h*E3@p1{KI+9@td?BKX)ypC~V zoBX<--GDon_q2Vy>DWBYLjyMs2V)bri3kHrZX?@`93m@tW*KSOzL^hOZ7M6E zU^*;f`4e#xgqE*J(x`(|$|9>MeM^QkDp)-n0f<->NOUqsCNT(+CLvk5#75f~F-|Lk z%moQp!v$mkB!!S0Wx7Rz*0)MIMySZ({)mxyc55!EF3gGG2aG}TgeaO*)l#HHl=JQw zfPk6O4dbA0se->K6~?4@XuoAfKm8L})!UKjjWXcIO9b>)BsliQFjeWg5C&;W8NEr3 z4Zbtxb%@0GXJFb%>K3JG9#}gCpz#1Wc^(+q3Uv!IJx~Q`Jyk_8!cg>IIH}-lUtytO zQ0TZ=M}r|}P%>hpKoXB*spBSx3C3~S+KAf(+&LYQZFLlnbfhUCPoKWo5!=*ww13$- zoN;K(2NS##&&jg%CuM=TMv&jlXVN3tojz0L*iT^~JtY5>aY|_Z7g*D;iN;sj6j)Wj z#H*z}GEwO>;}vFh0%p@Iwtv#=KJV9l02}*3F^w$gQegpxd96m@R6c+^eUE|xW)&6o z9pMj-tQR6@obU(_6(I71ipQEfLQF@<6@N96ymG5XYAZ+C&?(wbP~LiwlEfHC^-fWG-cn2sp4OTY{P4oje+p=_K zbjO7>!auO$nf2I~zcuWn-4^&%&<}{7seBywKD6SAEbe{Ajz8gH7dFf?Zb*W5w-ESv z)%$Fij1t~><_kD8?Q-m6V|r(hK>e9q0AL=V1be8@NwrBXgnPxe&fo{=i)I@2!TGe>CAOwPm% ztZO94Xt3LJIMxwHs*A>yXLYIt91w!cNk|~l$R!#UcvX52Yyq+2dZ2*={mGXajdQfW zL}buDk8y(f%qZ+baGOl4w&pGnwJ7BVQ=*$pYpovU=({56n6fpm6UYGNL19{H$fzYULtG{b z2LO0c(MCuE>eyC2ys*T= zGy0-q9g#rW>IU`eoN`0{hF>HF|Kuxefz0+14Ie{0;;OxXAZ?MzTopMlXmvR-Jpv0b z0RLKqtaDF};m`jppn)|{9p)p^9t~(rR)L|x0GP|-s>0RRG+IP7gaZaFucaGH8-!)$ z9vzSIDf2Tj=}>PLnV-Q*C=#awO&1urUW>xbjW!jO636}+&k$iQ@*>PYro<<*n$)_p+06+jqL_t)XPEPa>qHZBvoEi}3 zGR8j2Sa`>XL+bRH4%ocGnVAsAk_wGyGE;>kfTZ3rb#BAREshH6P{#47H#Htz^n>e5 z8F6iK-kHMFlM8Ybk$E@t#p%foNyvdM$PteD2OyfTES3dljI${$BJeO)1+;`HttHxk z5c3M_0c(Y*cnd*`KZKo0+}3|{H~ip@XVm3i&6|;K9SmcpN~3amZAK}@eS`vom2r$h zTgdSnNeNAc=Bv<$ph6!M3LYJdG&e+0#-rpt@t`xaL*7%Hcg^!KKM~5NKj9EmBG)|m22UA$xSby~S9CGnCmQ>XiMI%XqmF&d!Z2?m*l6$6b@vMvQ_ zw(j9`js^&ZF$Ro2fA4RUMRHo^_sJn5pKfLm{sG5iIF|LRI#zCB0gZb;7X4geY%2Ky zQ5I6fcn8OTshwHi(C;xe6r$2LQ{v!NIy0irfMSsBYXs3hqwV6L!K+4yaG>eHPPnNc zcHxCMc&y~xCzn}gK?4Ec(MOe|G{%6aDw{|1+^DjKN&2GE15TWdR^2+ar=pmcZ%7oP z%c@J|+x7-2B`D8j4Lgj1L~=N(q)jeam+g|)aEO-{pks!jvw_HE3>X5A0i2Btf50zM zX55#TS{NWsLk;M6mvU~CHA6iuWR5hy3tdW|RK>XH4+>BvmzfgiTmBehg-Qc)+*MZa zg?Z0zBI|=dEs6uBLFbG(O84&Q0F}oO8;ClfC5tK}fDB_$CWA|0)!#7%09+A0k)AWX z3azUAGXsGG?aaj(m^r292?kD~IXl&!;y9R8&QSZN)BJoNk4Phs2dQTUg(*ICfES5Y zInAoVlgHQA$YpDg37l5f(a6Iwa~n`AQf_2l7%IOV=DN zx)Ec*{9R$ItjbL)Fn3oOJc~T`eg{}Bk~5oymdMe_8~SGImCrToq(}K$`iv~&i!^J_ zb__sgXDGYJ_$+7i(k-~u8Ahbi4@M)cIkNyz_+=Y9r@#vOF?Uxzzd%&i_mv^G8wX!V zz%!Q7z;rB*s78#S5%|y{x_yXw&P$|oIlH60No3fE0wuHn*uk&utJgG|_UNk>%K7q- z8>F|KeSoI??P4w$Wz{qSaHCA7kJb_A7T#GPs=GoS-gWTbW+7kKSuWcLZ>F^vNz>`q z38n&BpZ@WcdLTObOT^e69DrpPS+Y-HM_Qhh*C|6)kqH`h>IL7gGn>Fy$C7)}hk8A! zS+uF1&@mzN12_XC+U=3QsH|{0T0V8uo5-2<8yn^1$>X6T*_zVzU17~{BXjbLy0`}) zwrO(?Z@bZN@~C=$ll@7}Z(jxnrVE)Skd^E_S9b<~z;(!sh<&wg?Ji}3vrI-njdIH` z?VK4Y>U3M^h>eSSrxbt@jD+%`f<3sr&L^vwQScymTzWLdroaP;zYmn{5Fi8DA_&1Lt{9N3an1Lc$qiHk^~^xHMkHpa15+Pn>ag6M z!I8TKXr{=AcqDuPR6wi01fm$vbR|j0nF`^3R28?Gb`}*NO|MOWDIDBqkf*d`!vcx^ zAas^U${w1J<2yzrEKlyiSRrh`V-&;O_Frs52r{3*l^{IZc$NhkU5HZVbbA{(6Q<=| z+Grv8rArNl776AZ_A(nV6{J@%r{-ho$`ExF67P#R!`_~?+eY}&wKCiwqz?QuMTHQE zFi_DE4b{-dwkeESrjHlT_gxrxi$wh{N%C_pvVa*B)FTAV2<6$rLvfmH%vk3bs1XAi zKuF*OND%aOfI?Q#&J($r&>wSK5ML3F8q?6^|71 zSpjKZp{=fMDJVw>BARrnS%s@oqbKy2Pw9epsRaU*0Vt{^%UESbKI(J>UZJ^q;~cIH zYyez`GdYEaf);8BEt+HF*_!)fLil3@lLEjeYGl5ekCP1tXlRd@#eYKf!WtTvR$~MS7D_7SoT`*|oq|=cjWDDJc#(bX4OIAg_}mj89nQA3 z|HD~`fZQslafh@GScA(%ivWTPq_QXlT)59&i$BCm8A9vZ7!8i6OWpD_J!hPlVtDMr z)l8eH6)q$m zfw<2Y5^&I9fld|HLum@(2YFhk8jpv_dxg*3PGQ7Uso3|tW-(@cGo-C#b-Ej^^1jhY zr?aKYM9`5J8r9iR0Q@yG5-vh<8hngQ+hpO&K)U8s2+4>4p)>jgY-ZiZ5*|@jRG3O| z)v1~t*IXu~0nZr^(kM}4X@Kf7y-9y{Z~;90qO(@%)P`J;GN6r3l#q4vHq*hh=_mI~ z3*6$EC&dE!H+C@!e4%VsmV}O=35`$YJ{c#D0+FV!h8xD#$m1oDho(eKOeb>;w5wBy z2%~-sIN+@Ov9DAVI;CT1&3qwht| zQwH`U6q1V4>CBo&q%4Qxr4>jnstow=n%he|9dwNJvCp(|Xqu{Bq@rFk$4uj0qh_83 z7PIO!7KMpFr{~=1z?lr?k~1zHBH?X#Nylafz2O3i5wwKeQ+b}T%!_aMV;7nk1OKEH z!T%jY^3bJfNWH9~K&8MQ+{-OI7$b{~*v~P8XHc)&JsZ#qngSM9Vw(9@AD4$4EZAG3|P!SOQZb-7Os&7q@kkBG|C`7 zLf`(DFZqQLsDTY`*+;I29U)C3NutXX69_Ka#t4PhJAHbCo@|L%9Mgr#3ga~2R~dd0T#Tfim_TD$AP3%B z<_O8DEfKY=Tf^BKVDsYn!j`7qp@5WpO zIu^xj^;*e!r$)I#B(#-WG8Bwfw0kjWm(el2+jS=96Q9CvHK2y zbh=2m-7F8`xL`(4P@^Eqk$Uv%s<&s^8m-hgfbL^_Yk)VA9=&B@DZ$9fZHzN>h-_Gc zNns9|13up2xqTO=UK-DOmo>sf8NP%2OjC)|1rqlyDG?zuDvrQk;F)@?h5Dp##%N?s z*pG}D@P@0dMU=2jbSt2%IWtaqFbwXaBv7{Y-#(kC^o38kK_Q({DtN>z{f?1~kjxc2xmxNAD%nyqQO$92~X%rmqfP2Spd*=O$XFXqyBp00+xr$MQf-%xAKMSi!LdGubB$qOZ z*?Kf20RYd8kgt%}v&3Qv=_UCt;6=gc?zn#sxk7ArjPX|vq=o!=Itx2Pf zQ3G#{4Y!S?Nn0M#rE%_<^9Ni-t+K^&WLAL&EaU8kGTi5J?06@-M!q9*X5W=Bo@d>| za57-w{*um`*jKNlE--fMkiLb1a1{sKihOY_0ja-%tLZyN66qinXpD<*cAsKp^fHU8 z8vQ1XNNDnldRyAGptK^CYQ5Fy%S=M*0bllm@tQ`J>2v9kcD+Koe3e!*TgRu7VCxn> z8nEI&{mo#&wvH}ipC_X0f+sggcRF5*mG8xaGfno@W|UEWk^X~Fc(OWd@`O-91_F1> zDSMnA_b)Kxoq76Gbuh*r{Ss%6Nm`I!)CD^jyf@gIP8-3tjEt&pBD2#U>Bm$lXwYsj zHV2jZU?lsS#c<*g7#QSmW{OuL)9ia>I?u(iGXdcX3MdcU{>79iWmNsdaE;tm*HIti zp@O90NXJT?h9;{Xhl`OV!Xt(=eGI`+QtaASb(6eZr@^b-QMQDifnR7DVc$fw3P?nSX?f3(eC?k?$a?830M*)d>35H?>kbOuh=EKK zArb}^HWcPwA_6is|B0lo9xD}P(@pv$(I}Ahu6!l`sC04b%v+#$j0H>s2bE9^SeXuD zvTWw*g&j=c;N4zE=3`jZ_NT9I!{K{?G5Jv)asY&Xrd3&dvDhWNj;E%O^C-O}6Qi&t zk_c1kk_i&>!AoFN+_2A7!fmGlold8tHL{Sl5HR%9DNMIkF&Dw4ar1^+c$On^#QO{@ z#7w0qVz!(hpUb|wqrHZ*FpkH9Kx$wlOtBEsu44^tQJ+Mc5IC@`ITI=p;3sbBUsW2C zg=0`rX>eBq#t4&Mc>W7@tJJE|B%=ZSz(s>f!CaLrrNtd}JAA)q+Ml|uLPkjB4?2~R zy=06!X7ypqo-4jd1C z@*V%T9Vj_{a|%Pg(EH3n66>aYJy8|b*ibw7#4Vl2*m9b^_L&Zb{8XMQSEG_fN$sb5 zSPdAj$JS|R8vP2AAvp7I9b0k+xo^Zkv7-^Gknz7v;SphSTE%H;H*{AS89}qJM%NU2 z5xDY&@6l&T!Ywd*MCRyTgsQ?{M@>V=oE_Olhswliy?FopEj9S*HU(nNTq>iL!qWtC z`N}dqBO%C;7(L`$&ND5vM5IZ`#&Bos5J$$NBc{-k4zlGGed1*n#Tc%Vm9Lg{+>Rqj^R!`3QeAW* zJvvrsh4$zu^a_5V4f`NpN$2T@?SQk!fbo0AlQA(4-}jH-?!PDzxFv>0q)Ju#kx+G{ zJsUnzWZ);A)-vEoCIj{iEb>4j!ah~rtGptICUwR8zRw>7PdSYi<$;bY@aMCSvhP7_ zKAUGs&d9!exWsDtY=c3+_Shn-$Dh-H;dwzteK8=RZ)w(*=gLb_o707$b+<*4_bE*M z@DETPAgA3y!ZuaH_EUpL$0qq*$ej@pcOx{;oVZ7!vpaAC`CvpOSrlMd`)@RNk+AtZ zkp%Z{b=;nMGiQzkFxB~9gm;#7280EFnG$DwNWsuRi*`4AiOB zv6Vb(U#-jBfB99q%~Wv=822t@%;*l~cw=E8iRLBhn+GW6t7*n1sG6YeXHd3kZUqc{v+B%$aFtlo2cFe)+ZTY8HmG*)N zh!bL#5uN7`v_%vI<9k~75tcBW4>Q*<5l<0oXt#bxkX1gsEISZ12g{?a#>K z`DtIeC`yHImZ~!bi^WJu2}uoNp$+%na_>M_F=r*9edoU>${>7H)GfmCz9k;Twa|?r z1-z&^Fc>IgVN^G5RY+SZUMcY5Mja0@F;C6C)P$+Vi*-^3W5&p{b@~-JW{iq~kPG(_ zGQb^f5Hz_d6Hcfz(GB_);}X~lSMg~3F~WeUbQwtTEW(Mgx*$R?QM_v?SytNgQg}6j zOngNdhq=Hxzl~&T1X^6!$aqezH*^~)13!7k2(~b7)Bg+sPtfw#9~!U@DvGco(CEA3 zN8C6j{9xc$jdy9@DRW_9UFjR-xyv+x?`vo}9t&vb>2=zM(*}Cf8jeN=RP5$aB_arH z9X*3i#7+UG0q9tKN3Ya6voHp9+GZO?k+C^OeplnV;)PKr8moLUXOD-_k&52vI))u% zlTLLAd@m6rjY|03$fz_2Sw~@LV1<79ZA8?+-Azs>LJ)S@^D#z-^+RXL4Q33|kDjva zYhW|`7da*`#rUPq!o;>K4lpVxuVR#DLQio9X_R{u;{zN+dr4bCFogdZr%H|4Uigxg zu%t%VhVQqS%hCW}U>eJr0_i+y08B$on6t%ph|?WB(q9b?>BD+WRgk}>UZdJx!b$^G zy3Wd9?lG*$Hpd>L4ZPB&%A>$Ro^hd;v}F_@kVpAgPa+WXOGkYlnv!QD$0)1JR|bVQ zX~QzXJ#FA8`fi&ldFgflzvT> z+GW-XvdQx-py7f0B)Ui9BHMJ#bAW;A5i=Nr?k(uf1RgVIR5ON}%_zTVN4Y(f!~#aC z0Nj1XA5ZLu^fIP@i|wWC^=Ti4l}?Zm?97hv+xj&2bZjGcsL!j`2Om&=j3EmV<-YPW z1{JzpdQxYH|7kaiB*DKt;`@mhLTd;SXjJ(QjQE+Yb>!12y;`xYI^FMkNi8Eihst@c z%Ac{0IC@iuB6fJ-z-Xyc*(mK+x|K)e-zxvqC+4wg7%QK0MmX>hMlufn(izg;%HSC>RwLNfuYO5s0R zWbwp35jwLIyiUe$?pH7gG59rx0|+yJqqVqNx*Whh+1x0ztjYr;lr?(5MR^GzmD1-- z&46sD3S>lAJ|>|SLKR6GZ7Zi9V2`syW$*H{nflTj=;)crwEU+>=jt)RtUz1gtYh|u0*2r(j)MgJ>N5GDAKFfY=~Log*|;v-W$(kX${XFLg})(uU-U$ z!5D#E6s*Ab_!=jLurV!5k}|EAs38Kn%l>2%@zUW_<>-S?uq^!~N|eaar89UGSIhMm zK1+mIcIDV9@)Jqmz4SsAUflQ1MG3fX7? z!!a6y^fWlw8&vXQJYM9K@W*3|k_H&|iJX2{`Vli=C-4Y{@vTgDz z>#BL`gKzZ;sWJ2>|7bk97{Uk-ltLA5737pEumE21C}G;VN)dR=8?>dltoRk|84i1ZUMZbMRh6$M1VB3otfH z4>@AQF|s4ZLv`*nKufbMBfGw%nU}3sWI+hh*pm=U~#87b)aT3qID*W zR*vZ8B+7<<(0*XW@M7$MBm1XL_gy~?gbc`S)PZS}=N(xIK9y^9w#*$m1)nlKiL4)P zU1Lm|m;O~*CQ(#*$C%(l4Zt=I&jP0-&2KN3BX@Erz=h{C{u()_-_&aq)M->@RE#g) zb$Z#w_MPksB0s<=79stG)Ff!Kvr1d&%gA{9$=F4K>dB_;hsL@F zuZ!gjkoi!#o}dOl#jN;{&c(ZFWg3S%^pQ9GhN8kVw63MEfq^pMKL_HU2n-^De$7(= zK|~xx(u`B0{HO4h8MIKHlXf+s(}^uQr#EX@e|eQ?PMAz&Fa+L@2S5kuGlQ!@ib512 zRA`=cwR8gkc4zar~7%40}pXmpsQ$&2(*`ulz0DK5nRfPANl9y<3IDG8DMUx zplHv&i!jIc*uVT&%VY2Q;qrxF{GZCd`1}89P?jj5M8LSy%JuH z;(DmVHU=_VTOd&N!onyD9AIa(M8cL4{j1(D(=6`!C0w`{BbRCusY2LjM5`Q)04vCN zy9y0pVVNi+wtH~u-yAegoiPzS`7+{4QsYYGk{{PbTb7eD*K^h?F=pE#ri=-mhk_ZW-y$p`nT7?7l~{ zP-6Syvw>ZVK?G+EC!%3?S_4wvaqO;Gb;UjEtilI{V=I~VpDJ>3VT37gr3xbxM%>#( zQ|y;C6JF#!VUnmbFt=}B(zRZw7goEr%)-L^1`IjgOM$SFEULdP?~WOh5hP) zk0n;1ZtvDQrD+{0;hL#`>!2}ZqxVz_^e*t>OPnzmTDiC7BAajjh4=h6&%XAxcjHpo zy!?E*@cECFPrdJdRO3)_rFF+^U+;YE+smH?A7?)POXVZ~;BRECaZDW(|EZ({7se^< zlD2@sJi_RdHk0B&IcFx^p619suPg8Pk$+fT_{1-l-~H+T5E(F))yPE-Q7CWxxBl~T z_Y?2Hh(_CU{a-)!c7`=B@A!%Ll^ZX9zP$H8cq@*2JsNKYBe%PDnp0{n(V2@e6qU^? zLJ3Z&sE3pt;!y`@hdewt=5DnXQNB31;Mr+Xn3w;}<-?HF5dfAtkjc|S1}JN-2a3rv zWmTfS;9)@SuQX)j$Ts$nGue@W@=cUm<`!4h|Di%7X%}f)vp$AF} zUuhyv2=Dg$+c9)`30W7!2So!@J61w_4-> z^uwJ3k{`=6XBE`VtmWhtX;Oaiolg1FKk+NplXA2=|M>@>D1#e2aq?Vb5(gZ- zq-_aExKN+CHlNeFm21sRk!cfc3^w5u-j*MrdwGKY^W8|V^3gH)u5B2(%=9$2OYJVW z7AL&#b7@exN4NPdBo1@PymrYg zaD(73UW>@muyCh#JL$^bAz}784xaX6$YD5-G14lQhy{|Kvf;{QyfvA_c5Fi>JD4LP zL~^)-7m}1UrJD%B2zEO=z3%z0zgV9C*#BA1eeQ!9o5NQ)Xq4KHdnN(dlvY^O=n4!A zz-EEL5TRk6GL1l;jP%^7B}h{cBOrKRgHc3?=yZk}8)az6!yGn4IU^<#f!o1c=g{|U zJiO&Y9N~rGEwar8vM)wV8D82pBA10R94v2?Q{p%8z-c#+F$x30C=yR|z4-C>W5^(! z5wh_@)BIF$(*L z*+9Y(R-rHvB%J|!$6f^~Mz_D|UtOewB4uTDi*0C<5DtAb+ZQF5jj~Srx%sFJk$ea| zDpy3dfJK-wLaNersBp@JYSyfT#C;a8^D9TnJ#YSVL{gc`A)4~QcmHeU!jr!l_}fp* zfYC}LjLFEBxRDmX5_spgf80}0B&nMF3a2D4LksfQ(xGGJ-~9)_SuQ{ORQcI|@4LY# z^$G&s6$VbJC|p!9@%X^KQ&2PTiR2#TY%~u=sL)A14>W6@8-qQIP^q6c-K?`k0TOS zZjkz?{>>jPkG|sv%Wwbmzh5ps`D@UHLJ&s^;8eIw`^AU3Lfb@b?2Hi!f#Ed#%nJEY z``l-2M(T{}%+db|(`~YsJZCIIVF=Lh_E$-pKrs_7vVcb-N^in0`9ZWJU8<{U;uJde>J%nwKBiD3X zUFoSZmv+QWhwmCu)};)LQOOWeH!{H}ue@#KIJtz%Al|NNCCCQ*%AFWxjJvtce);BN!sFP9a_H{Yl#`EqNB&*|J%8+f|6AqBU->_R?@awe2Qi$jg#O4cQAqUFD6)Ln zg6@=~MjkZq%~_Qf+Hzaj^asj%mAC z{>6L$OQM9ESUqJA)9p3S3q zLFakYN4Aph$_T&#ykevL(#ffPSEErm&*cN(aY`#&TtOc(WPrEEy#AN6B!&XBH!9OQ zO<7YpG$7pqO4>=@JTNlix5mPZ5yt}dF-X*p$|PrTH13=|62CgAqRc+%yx6yz{=)WM z_MO$Hl^2mIK4%!p1y|@BQKF0RPt`*jt_t8#hj>#baW76FBh5||R3M!=a%GR>)X;G? zDNv>@IE3eMn5fCR-I>F7n|x_r&GpFl{6Km7m;O#<6_s+2cX>au9sCOuS?Hd(yleVK z{ooP$jImR97W*+C<&=j&&=Uuk4c(Jc!Wdl9pWJ=g(5dKWl|M3vfKszj`#$<~k*%ei za#se_{_{!u&M3ImS@_9k+*`y@HV9LlHR*?T_+yYVQskk4j1fxz9Gj76gJ9YwMi@2R zv`-)ga6!L$RVZ48dMA0)@Uk)kc!-#6r>Cuh+}$D{)ab6q z+j&VJ^VmgWWa{1~wifkvOaa1#Gr!inX63dtxrm%`4^r`6^Pb@m-goOC1APWT6L^A; z+gjK?1lzJxd2}S_=fYI}XI_v5P?Z>r&iCvaq-D+n%OaX608!GoKv5uwhzLgjrKdRN z-W*Xg!KC+Nq)?^P1(Asi0UQ~X>LVBhJX796q44i7x57#Tog;AUXHG_7BR#1Q0`#;!_0gT>XhDp(yA6_ycxP?q}|h+e+; z%m4j{KdZ(f3>{rufC`J z^B;X%2v`N-mJ#A`hQ2ERWPq#+mB~?r(t~+DhR4$f6t4MW8cCVr2Jc;?e$ctUv*!~@ zS@UddAQK8=r`C)JJ9an6m1)!_DpG74;I9I%@RZQ?lm?u0E3E z-i(In?P}n+;W+8zG?Bj+(V3@y@jc~%KluaYjz96eOo<-_mRrDYigW5zu!`i+NqATz z-&-)B0#S;lxI#%IBZ=YQT-wrTjKPxL@SAp>=IC=gn=iRK%&8%1(QPwSf?0?nswvB$ zQ_lRFvED9isZ5MyI?XA$={+hqf&=N?-+cJY-eqBqz2u&P!?rw8M#15fnFe3ri2)tY zy{C|?i!$b+JGX{WNvm+o+f#tMD9hFAyFC`2;BfIcm)>XS4OrN&*Of1Ss(j$T{{GOb zLRGI_VeB-l=_C^bEJI2jPtpre5^Yiy6yS;2^4q>^yjMD4dVBC-M~Ry zSBFl>Wcm-m;bOT&VEgn1l8KSXJcDAReQM5Ho2c&}*h@fEu(WeG8)~6v~JX z_af6k?7L;mf$O9H+mDwUmoJy=SJsgk3!JfQ^b43AIa%KFmwuw0{+O^?6u!JjWr{p!!+^e>gAHI)4J z_3~?f>s@7?v>Xi;>!bt0gDJbq%-%;VY zkWap(mhgnr_c~qTdPqII83R@cAzfu(w!oYp{GSvU+vB11R+(M?ffooWsCZ4gp*Q@g z59vRj&Xl?NuhBr|ug=;o(Ig!Zz{aU19A5^{7=?s+p$CjNzRSDPs9ShsHY{6_;7CHB z>OviEqj}P=8@Jmphi~9P=Ru;>IdLq~ap)F$lNJ(au$SP%{wcRDrVO$zjUL}|xN(Sh z<~87yn)}}J=gSx0|I--T(p{Aw7NjUmGG6}XI!hRU?*yL&5tcbun#-9W4Mq81wE99l z@WD>gj*Zb@w?fNmSN7F)ide%&2g-$9FpY=&WPIjAx}UBx!f93MP~%VoY(U~|@Iphs z`ak@Q(8K5kX(kaU>UW$$;mze(!&~4*S(&lWmB5m&DGz5cyp=8kbkLZo_T=9a&u?Y~ zvh@nE9VX2Sd_gxFWx_PFgx_(hge|z!k#@{do%W2nWFDQP6u`1%(tX!^MMu`1z6Njo0e4Cc@yZ`XL)&-h?^B(3A;q zBr59lp2&)EWINW0aPS@Lw@nQsFO~TVOaU((IaS{9eLw1>Ai?pd^b=<09qaJ2&oWxt zr5)f!d0(n<&_EDS5=Hus5fP&bAWJkUP4TN|zf`U~`y>L9C=~B#o>+$w#Jo=(mX9|< z9Y#VD-lZQJJ|X%*Lx?a&VD4_;BHeLEnX64993v$v9R*a6(-cBX84bh?QN*y|9eQ33 z5!!aN5|UeW=*b3t)UB{M_2^sk_S3)iGn~!JkzO#MeUcgE2fdb$z4vdD3&^hJhwdng z$M4HnoMIC`GMt1f9e|#SGbk&4t{@8R0Aa0DWimyK{Yqaj9AcDC@hz-Xph-d&Z~PZ# zqYe$_?9W6UzN^QiqhVc+J!OL*+rvjn-xP#AaX@y&KQ0xAc~Rou|Ga57Jj zIV5!~j$4mVg=PQjd+^GqE6dF<_2dC_?Govu4kLg(4lhbWp-rISd*)#(v>c~Kwo|*p z%*ceo!Bx$ECS`#-6neoeV>iKH!D06`ss}{(G(OC~3GBHiO5 zeTNx1^F<-o+ukS}XP+*^%_{+>tKj5!1-;Ie3sh7xIso#Ki?f<>R6JJUZQHa24ivID zxbTEDEDt3|&we1Q}!s@qz}q0`PhDhb{V6>Hxc~s zwYb+ImI@iGec_#aXS|t4q@U779t8)=Jl!YbtL<&8ou)Er_1)G=R%uRPU?6#db`1CF>V%3S^K0@r_-R^X5`E$ zVGtlokhaJM^pNH37xbn~OBxS#$v4t|XcSm#2&(b_AHv=POwY2++rMWrEy>KJCxp;K z5;}z5rAS{;kX3MXb#;|RSM08Q?ussJTLoNQT~|fcf)x=#L=lzV0@6VUp{4hk$@G~_ z`OfqA%p2M7IR3}~2`@AAKF@QPt6$fB-Pf%=k*<|5@^5XvM(>O|J6HK4Fz0#4B|lE5 z^iXS?r!!zoLi^E;@Qtt#{_0TWfOO|Fp{0&A0L4-Y6r=1%i0;S(p(E!5fyK$E59i6G zqOf)FQgVnf$Ef3e%@7H{@mz&}rbIi^oO6?gH6AsTC*w%_jPr1;exw`c6HqcRUdb~R ztuY?1m+$*I4&Kxxs70mpmemg(rcj z>dii@`O_w2b3B8{7v-upg**q>#G&u$?V(O0yon5!ewA~Lz+Apo9{9J>(hV;?TQ)rR z7zP<_a8H9b^alKdmohBxBR><&5Uz}~a^lImgQom2P@FP)2N%+tfuBTYeU>pKXOMf& zFLPv0$_sIql@s3w2jO`fC5=8E0_n{$OShGQRs}B-us}vgx8kre;=md7Dqd~Jv6z=y z$v$Pa&IkXb>CDGIDmqCj0W;Itcf86HbOwmyOOYTjL=u0|0SI7lDP)RQk}bp7Tcda< zgXUHd8czjn5Mm;%3PB=JVCWUQ)Wlc3kD;a@;U^GHyID$Nke;qlN0?l%cLzWf(vXY! zHx-llhwXqYgrJC3nAV7;LOy@;d@jcQ$TgRh`3Id?mYn>yvU=IgrHe>|1r$9tMv)Y|mqlEAti|RA%k6sPwTky7rl6W!2+%065;4fEl#&^!Fu4 zomJ-Tv`bmH?ALh5Jy{Bqsq}$jy^BR&2UBO+_1K6dEv>j=BeB8C|E*ZvxUT! zT|2@q|Hew&g2iRm-3}{9&fB{TY+YZvS3XsGp1dcFAaY$cmI#D#?UEohtQE*AFOh7Z z)Z*5dgAgFbBVmXvc}f^ec^Vs7yaq_bx9D~vo4`n;dIUkCA-NsFyz0SUmKl32Et6*~ zDBWwHk3chgZK%Bw*!C0It&JX_gqvd+Ohoe};uw~$t#FA0VJE}8WEO*iF)^WhG-xD- z@hBoZQZ9|_z+YTJD@KN8UKznl22u?xIFlP8-SClaLeKo>KNX7tOQB1nM1owNn^dOn zzF(QP+kR#9^ADB&t!v7fWjB>Yr~Q3d_?kDBm+t<4U|ks!DtKWzsVqL>jfCo_mS=DK zZtx+U%0DU{ulf5OQ)ceES9$TVJ4;9JiZXNFF6FS3&Lx+nE%zr+n^_Ki-8(}A&)#`+ z>F*+nEMDQIRQx9zv*e(Y$}Gm!*tS#Y<;>mQ%_~aRsz>lHRa7qb05awyzIS73Z4AM< z?x9XP1Sgk;BjXyEc{8kKR?Dz5Pb$o@FlJsDPfc z@9|~9;j_w&UH8r$=k0$y=>)S77X78;j$cFox6j$7EI#(E(nD_A+NbV`P?G1PNZ|QK za$D!`e>7t|n0e1Bo$FVZZL6OtL+hUizGEz_Y>o2pPrC3dWLFplSW0drqSWXTP&avn ziL5ARD&tJ&NoC_1!gXvgkw%n(=mtj5PXz+Zp%Rg{q*G;}hJsO^R0;sz9{prAg(p}p zm-1LrC)po~7`!B^j~vx7mM+XmQ>Gdz>;(rN59MYRBQ;EcaY9%0>xMCx9pbcdLxb22 z0K*tHW2D-ssFVRJ4OeBHOYH)LF%Xmm;YWYMQ_5K9@x;wvgJ$2%rjb3${%5|eJa7X! zfjrsD2Czkko&r8rBJ1u)t}`EAGN;#Nt5G6Ra~2;`<}5j+%-BVlw647T@a<*QV|SC! zc@#9ZUs?IcZJhPImi8#7j}yM@0k0vS?|JCz!N~MIk310?T2iJh*ek=Gzwfb-1hNlW z>s#|65#*M#`|+>O^8G6h-&Us2-KFe)_!;Pu%E51Gn^AT@?tJuAL+M%bD2C!nlrnM$ zoiI)=VuMZ&QJ|qgU<$m1X&h1Tru;Fwi>6BsU!y?{;B5q5Wo)@2NC#PmjzhMpQOx~x z*;0iwMij`16v8Sv^q9^8-kC}Sua)vc>N0uCAVhY-gHlr{jQpENM+-P6mU`*O_@h`b z&sjE2gTzfhj3ly91JS@r&Lao0P$%Pq{=lQl?H&XmZfT%ePNfa?AkA|hjI)9ghmGkg z4>VfTk8$ddwaQf;pCRGK^R}ywrkfZN!mKh@;beILdaYfn$=BWcw09BRJGX3jlDt6Z zDzvA}2FAkLXy;xhS5EZu-~Xg6edGJ{db3Nn(60rd)or^Sa7^i3{cKsk;g7JI<6ykV z8D^E0o&!#MYuUDCV|n-&KP=6_x}E(55H@qJFS{T5+A?>qBZ+R$N7fDCw5%&D9=N#- zZrcF<;5~6F^#hkZk2oD!JEN?*_tzYpU>#T;E9b?K`8j*9L(9B<4==OP^)7e!Zdz4V z+;d~uy6ri}t&s%GeHfW+x`Bq2`R3Ts01D1WwpjUO7+oS5&_uq9%OhVr>(K8t8Wc=2l*rbjaU;lN z4lp){uN#7nRm#f>EbAQU>DY%>Y%_USPS_=dbU-79DZMW->M=P)jXa4l%9B2$#F@Op zE>THd&=_H$F={HM&v&$?rS0XrL)*5LN51!|a?B-PD@VNJ-^(4JIXBUSD(nit6zEQj zt1@~qL>mxxyz6F-8H)}thrjd6G6ezl>TCZua&{*5{VZ zK8KfIFMp7uk3cA%U<<-%;Zf(5WB&e%2+&uzAziF`PUX=B+2Lr(3&rDA0*s5haq*w69!gw!w{Q{ z!0O# zj3_z=1&r@VQ#utY&LN6{4pDi(jxsdTfgYU#NFyiQ!ytuoE-J`PbF{g#oK?#8yJNubLXd^g>m;h<{WVOwzBQY z_mr1cJYVMQy11PE;V;>IE_WNBe90H{`_{E9%L@;zjKQThyZeF1mNP&6wbD9!!Nk*l z`LS)?^X0y4K7xn4mU0mo0l-pN9e&|uSxW1E@yT-hNB^g^&D&$gOM92MmIVi#RDS#U zcb9|S^bh6ufB5W&zzb|VZxwSm}y?zw~WhRqp%dd&=g`8xVHTLTC`kGsXxz`J0c? zKT{MGiqgG!)+93T&ZSiRY8(jV3roE4oMTcMN4YW%>Cj!Y+sBblM&tO~nqBDf7$DM) zk%62B0qmtK9lpuXz4v5YBS$U;3753X&qOy7soSW>){XF=)ix`UO&Z`Oas zxb)c8uB@w+ueo>9V`X$YA}=Wm!;*VC3B%|+nhrjV{y9dY{L%%2IfkkwLp0c3eKALT z3}aQTtwHhlhmwNdP_YP@0Ej*&hMBDx9f zCt?UpUQJ)!>t88bRy`M3x@@wojKo|K?lenTPM84*(*b_|4`0DeW`LYcKv>*}7_ZdHm*|@GV9TdZej+ zdO7pb@0Gb!s`!7e!{73;^3<=dE_Yq?Z;9TzYunwo$6WCKvS8mM$`7A@unglo*HTj& z;f<3&`gL-=-|+u7RSvoEqvgS$TvZdSM#`ytCE*OdN_mxu%& zQ1*ZQ2g)vool*Ykv$vMpK67>%>|Br1W#&99g1p=aGl|k18nn%nnK|a&S7B6cpLu3D z002M$Nkl znKxzm5ax?O+RnQYm;%G^>u68N%gD(&5F#K<_?QSSQ+p&}qQKx-d@6AC2$L8*%s835 z%Lhnb9@DV5FKNWK_>Vv1>HB@;1s*d_g^EQyI-cZf$`ryvT=OFvZ1|&!0MZY%==c8Z z6~lpV8dCmQz)f5#ZKF(Uo`14@_d{S5Wv3-e%c19ALN3=S<@8H`Ue;fHR2jlk7T#`FaNbQ* zr{laKCczSKeQi6KNSDS9ZS> z&&43T0vbQFym-$~OGn3TfvfEvdj3aZ{H^=*gXK>@{z4g|+!1L$Wy(&A%Mow=LYYfc zXs^@WUS7WUds+UyzF=D9Y7=aw$;7K@2qJ zYFUtzKJ=~Jd-le!mKX8dUwY<=vg?tjmLt!*>K98qM4Gy%+| zw_!E|u^EmiJWF=qFAi+tk_cenuYAn17JZTQNK^p&fhO}DLlT2JMn0pAN;}{@FI*d?wM?ueD!mM&?cwpkv5Y-toPfP>U^L5Q_9K-l)69~uySg9z$ra_5hksS}IYme099`vI7 z(nA#2O&HPgK0!s}k+x8Mq!}0G%^?OC@YjrNT)bxqc}|2Ai_p8^S!5F zNDgBFR#E<{;)9Xu?aBm#9Li+SrRf8`Fb3!V>?X%KJg)5GW|p?|yL`+_5dk}+%dY$; zh@xSpf))9R%2h**rE2FAWF?&Ff&oY1Kxj^&GWhVU89=OAekKaRKx|hd(&ZS5#=1)i zC5@a)VKZpQ&HqG@;>!WM9eZ{3X4mKA~OaJ{b*rJs2K;yNK-b)?2SSSnft%> zQJA);>~-cvY;xGILSV-J7p1Ha*3;FPl<5wA^JNUFzC8Vluat+r^XW3Mc_p^Wc$S{- z|N6x!xSu1iCzk`x`)C-PK?M22#mk*OiAEtPW-dH5V_g5t-Mse;n4>R9-u&{j<#(Td zFJbF7W#;Y&P=9M?m|lf5d*RX;e;c2BpxpP3_mpiA=U{htS-0Zp^5FL_kMcDdwC|~Z zivaV;JA{r(XyQ8a|6EgE%Z}dTF8;4_{KelauX*3M%LyO+PC54d-!8{qa&~J^wSX`f9glSS>F8ZC(5axyR{tq-mA*OV_uI^BL`w)j!iIJ zV9eXnjORbg7`e^-HR#0$SlU5bhQOQoKp7RSaNp+@lET|%>lT(MP4JgK63T{NlGDH( z4Z%miN05nsh@JN}{LC41Nl4tQ#KnbPco-DN!e^vMFcZ4=*$6Ee(0kH2^O$?ksnpeL zD{CKfX`X8NDpB}i)q^*t?OhHzi%2mC&;z$xAGTe)d^UU(-l%vAaHM~qkuJn>Uw0=$ z>W;GJ$z^$Um>P*2o_wHeeCmNRHbC)h_)hp8@i+gJ@jY_GSIa{``d5yQ6(qz7;}F9rmvMv%bzHHon7VSWw({P{_DdWFV|68=kAdRV~V08%s~`B*4` zu72Ep#XHN&$L@+;?c4ZDdGOjVlzXnZoYj(@(w;C=?mM=cj1bPPt(9T7ZpGte{c{hp zRJSS5ZzH%(jy+4$UjWiyVK*BCT6u>NW2?$Oe>ZF8JY z-vbrtPu$stn^g>EIHwAhRsNT9L6|T#qH&yxK?GJ>&?z*HY2x(+Vtvjpq!F+XycpaN z6GO;Pz>eISnn+3_EzBK45-GkJdP&Y9^dl_9rMoa&*u{<*w9BMeDF2j|u8_I(FW)5^ z2t6TCl$cTOF8}qjgsiKr)1f?3sSop=kwFXRyM#E#7?YRD@6wj@aLn?9ges1NOJx{U zGO)@Cn~0S2d}L>2DD)^X)Go%bF1yV8%C3i3WwOFs%8JNjQc#XOmvIf2bvZI-=gUmf@bR(nCtY zGr##xc{FJer5tq5J1dzEk9dhg<&}KlZgX`+Qo$fVqia*h+fPIm`Iz(x;IEV5+^c-) zDz8-eA@9m#o=OwrnYN@aKk7n{vvkbr3`r_Deif}d7x5as!tbVRDPMHh)K8hVgf9A| zVQ9s`ny|NQSQSb17akJF5rQy*9p)$!gp=WKiNOSKiNwU%7<-VVjmdC3h>14xJ3YJ1 zI;vOACj~SoCZGY35NC}r8JPX0O(&E#++2buDexdHAjxD*es3Y%-i{?tqPfiG#JGG{ zAyd0VxQ6BsORSIl=yCuwsT}-{&qF{6P{vH~68=#j8U$y>#gw!T{_%{r8BR`um3VYq*WDxIVnUndN@n-nVY^9Lvj&$ zFc!ylhiwww^H!m**2!f)0((B*^@4*=Df16Jx$HFYnSao0%Wgz4&F3*cZW4x|%g73x zRe!pzeCI8DmwW#61Jq^v9R^TOXE{dCRX_(9O61Z*Jm`uZf z<1mPK310e9ea5$gMr%y!yVd&@effJ$xku?s5R6E#*tT|Kqleck80!^IVJ7

sUk1 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%0Di}qw7-da*0$V^<>*)wZItm6 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

!p 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

M@J`)*@`h`wZ8nGM-vkfx(G=J;%kJd{pn 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 z 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 diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 57337e1f5..2bb72b46b 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1486,6 +1486,20 @@ - (void)setupFilter; [colorGenerator addTarget:filterView]; } + else if (filterType == GPUIMAGE_IOSBLUR) + { + [videoCamera removeAllTargets]; + [videoCamera addTarget:filterView]; + GPUImageCropFilter *cropFilter = [[GPUImageCropFilter alloc] init]; + cropFilter.cropRegion = CGRectMake(0.0, 0.5, 1.0, 0.5); + [videoCamera addTarget:cropFilter]; + [cropFilter addTarget:filter]; + + CGRect currentViewFrame = filterView.bounds; + GPUImageView *blurOverlayView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, round(currentViewFrame.size.height / 2.0), currentViewFrame.size.width, currentViewFrame.size.height - round(currentViewFrame.size.height / 2.0))]; + [filterView addSubview:blurOverlayView]; + [filter addTarget:blurOverlayView]; + } else if (filterType == GPUIMAGE_MOTIONDETECTOR) { faceView = [[UIView alloc] initWithFrame:CGRectMake(100.0, 100.0, 100.0, 100.0)]; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 3b160284b..02072109c 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -128,6 +128,8 @@ BC7D95D61523EE67000DF037 /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; BC8A583C1813060F00E6B507 /* GPUImageiOSBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8A583A1813060F00E6B507 /* GPUImageiOSBlurFilter.h */; }; BC8A583D1813060F00E6B507 /* GPUImageiOSBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8A583B1813060F00E6B507 /* GPUImageiOSBlurFilter.m */; }; + BC8A584B18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8A584918131E4B00E6B507 /* GPUImageLuminanceRangeFilter.h */; }; + BC8A584C18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8A584A18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.m */; }; BC95C4081622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; }; BC95C4091622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */; }; BC982B5314F07F790001FF6F /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; }; @@ -476,6 +478,8 @@ BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageStillCamera.m; path = Source/GPUImageStillCamera.m; sourceTree = SOURCE_ROOT; }; BC8A583A1813060F00E6B507 /* GPUImageiOSBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageiOSBlurFilter.h; path = Source/GPUImageiOSBlurFilter.h; sourceTree = SOURCE_ROOT; }; BC8A583B1813060F00E6B507 /* GPUImageiOSBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageiOSBlurFilter.m; path = Source/GPUImageiOSBlurFilter.m; sourceTree = SOURCE_ROOT; }; + BC8A584918131E4B00E6B507 /* GPUImageLuminanceRangeFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminanceRangeFilter.h; path = Source/GPUImageLuminanceRangeFilter.h; sourceTree = SOURCE_ROOT; }; + BC8A584A18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminanceRangeFilter.m; path = Source/GPUImageLuminanceRangeFilter.m; sourceTree = SOURCE_ROOT; }; BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHoughTransformLineDetector.h; path = Source/GPUImageHoughTransformLineDetector.h; sourceTree = SOURCE_ROOT; }; BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHoughTransformLineDetector.m; path = Source/GPUImageHoughTransformLineDetector.m; sourceTree = SOURCE_ROOT; }; BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorInvertFilter.h; path = Source/GPUImageColorInvertFilter.h; sourceTree = SOURCE_ROOT; }; @@ -803,6 +807,8 @@ BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */, BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */, BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */, + BC8A584918131E4B00E6B507 /* GPUImageLuminanceRangeFilter.h */, + BC8A584A18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.m */, ); name = "Color processing"; sourceTree = ""; @@ -1328,6 +1334,7 @@ BCA6328A1623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h in Headers */, BCA464CC1627C1BD00C0F68E /* GPUImageLineGenerator.h in Headers */, B8EF4E95162F85850036E5B3 /* GPUImageLevelsFilter.h in Headers */, + BC8A584B18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.h in Headers */, C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */, B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */, B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */, @@ -1491,6 +1498,7 @@ BCC93A311502A91500958B26 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */, BCB6B838150400030041703B /* GPUImageExposureFilter.m in Sources */, BCB6B83A150400030041703B /* GPUImageSharpenFilter.m in Sources */, + BC8A584C18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.m in Sources */, BCB6B85715041A920041703B /* GPUImageColorBurnBlendFilter.m in Sources */, BCB6B85915041A920041703B /* GPUImageColorDodgeBlendFilter.m in Sources */, BCB6B85B15041A920041703B /* GPUImageScreenBlendFilter.m in Sources */, diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index 77ddd8615..fa08e980d 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -151,4 +151,5 @@ #import "GPUImageMotionBlurFilter.h" #import "GPUImageZoomBlurFilter.h" #import "GPUImageLaplacianFilter.h" -#import "GPUImageiOSBlurFilter.h" \ No newline at end of file +#import "GPUImageiOSBlurFilter.h" +#import "GPUImageLuminanceRangeFilter.h" \ No newline at end of file diff --git a/framework/Source/GPUImageLuminanceRangeFilter.h b/framework/Source/GPUImageLuminanceRangeFilter.h new file mode 100644 index 000000000..5a3103701 --- /dev/null +++ b/framework/Source/GPUImageLuminanceRangeFilter.h @@ -0,0 +1,12 @@ +#import "GPUImageFilter.h" + +@interface GPUImageLuminanceRangeFilter : GPUImageFilter +{ + GLint rangeReductionUniform; +} + +/** The degree to reduce the luminance range, from 0.0 to 1.0. Default is 0.6. + */ +@property(readwrite, nonatomic) CGFloat rangeReductionFactor; + +@end diff --git a/framework/Source/GPUImageLuminanceRangeFilter.m b/framework/Source/GPUImageLuminanceRangeFilter.m new file mode 100644 index 000000000..5122c958e --- /dev/null +++ b/framework/Source/GPUImageLuminanceRangeFilter.m @@ -0,0 +1,76 @@ +#import "GPUImageLuminanceRangeFilter.h" + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageLuminanceRangeFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform lowp float rangeReduction; + + // Values from "Graphics Shaders: Theory and Practice" by Bailey and Cunningham + const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + mediump float luminance = dot(textureColor.rgb, luminanceWeighting); + mediump float luminanceRatio = ((0.5 - luminance) * rangeReduction); + + gl_FragColor = vec4((textureColor.rgb) + (luminanceRatio), textureColor.w); + } +); +#else +NSString *const kGPUImageLuminanceRangeFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + uniform float rangeReduction; + + // Values from "Graphics Shaders: Theory and Practice" by Bailey and Cunningham + const vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, luminanceWeighting); + float luminanceRatio = ((0.5 - luminance) * rangeReduction); + + gl_FragColor = vec4((textureColor.rgb) + (luminanceRatio), textureColor.w); + } +); +#endif + +@implementation GPUImageLuminanceRangeFilter + +@synthesize rangeReductionFactor = _rangeReductionFactor; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super initWithFragmentShaderFromString:kGPUImageLuminanceRangeFragmentShaderString])) + { + return nil; + } + + rangeReductionUniform = [filterProgram uniformIndex:@"rangeReduction"]; + self.rangeReductionFactor = 0.6; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setRangeReductionFactor:(CGFloat)newValue; +{ + _rangeReductionFactor = newValue; + + [self setFloat:_rangeReductionFactor forUniform:rangeReductionUniform program:filterProgram]; +} + + +@end diff --git a/framework/Source/GPUImageiOSBlurFilter.h b/framework/Source/GPUImageiOSBlurFilter.h index 1fccbe06b..81c2b920d 100644 --- a/framework/Source/GPUImageiOSBlurFilter.h +++ b/framework/Source/GPUImageiOSBlurFilter.h @@ -2,13 +2,13 @@ @class GPUImageSaturationFilter; @class GPUImageGaussianBlurFilter; -@class GPUImageGammaFilter; +@class GPUImageLuminanceRangeFilter; @interface GPUImageiOSBlurFilter : GPUImageFilterGroup { GPUImageSaturationFilter *saturationFilter; GPUImageGaussianBlurFilter *blurFilter; - GPUImageGammaFilter *gammaFilter; + GPUImageLuminanceRangeFilter *luminanceRangeFilter; } /** A radius in pixels to use for the blur, with a default of 2.0. This adjusts the sigma variable in the Gaussian distribution function. diff --git a/framework/Source/GPUImageiOSBlurFilter.m b/framework/Source/GPUImageiOSBlurFilter.m index 652032416..3aa8a7d1b 100644 --- a/framework/Source/GPUImageiOSBlurFilter.m +++ b/framework/Source/GPUImageiOSBlurFilter.m @@ -1,7 +1,7 @@ #import "GPUImageiOSBlurFilter.h" #import "GPUImageSaturationFilter.h" #import "GPUImageGaussianBlurFilter.h" -#import "GPUImageGammaFilter.h" +#import "GPUImageLuminanceRangeFilter.h" @implementation GPUImageiOSBlurFilter @@ -27,20 +27,20 @@ - (id)init; blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; [self addFilter:blurFilter]; - // Third pass: upsample and adjust gamma - gammaFilter = [[GPUImageGammaFilter alloc] init]; - [self addFilter:gammaFilter]; + // Third pass: upsample and adjust luminance range + luminanceRangeFilter = [[GPUImageLuminanceRangeFilter alloc] init]; + [self addFilter:luminanceRangeFilter]; [saturationFilter addTarget:blurFilter]; - [blurFilter addTarget:gammaFilter]; + [blurFilter addTarget:luminanceRangeFilter]; self.initialFilters = [NSArray arrayWithObject:saturationFilter]; - // self.terminalFilter = nonMaximumSuppressionFilter; - self.terminalFilter = gammaFilter; + self.terminalFilter = luminanceRangeFilter; - self.blurRadiusInPixels = 24.0; - self.saturation = 0.6; - self.downsampling = 2.0; +// self.blurRadiusInPixels = 24.0; + self.blurRadiusInPixels = 12.0; + self.saturation = 0.8; + self.downsampling = 4.0; return self; } @@ -52,7 +52,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; CGSize rotatedSize = [saturationFilter rotatedSize:newSize forIndex:textureIndex]; [saturationFilter forceProcessingAtSize:CGSizeMake(rotatedSize.width / _downsampling, rotatedSize.height / _downsampling)]; - [gammaFilter forceProcessingAtSize:rotatedSize]; + [luminanceRangeFilter forceProcessingAtSize:rotatedSize]; } [super setInputSize:newSize atIndex:textureIndex]; @@ -61,6 +61,21 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; #pragma mark - #pragma mark Accessors +// From Apple's UIImage+ImageEffects category: + +// A description of how to compute the box kernel width from the Gaussian +// radius (aka standard deviation) appears in the SVG spec: +// http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement +// +// For larger values of 's' (s >= 2.0), an approximation can be used: Three +// successive box-blurs build a piece-wise quadratic convolution kernel, which +// approximates the Gaussian kernel to within roughly 3%. +// +// let d = floor(s * 3*sqrt(2*pi)/4 + 0.5) +// +// ... if d is odd, use three box-blurs of size 'd', centered on the output pixel. + + - (void)setBlurRadiusInPixels:(CGFloat)newValue; { blurFilter.blurRadiusInPixels = newValue; From 62c83111909a69c934c67391c6a5ac0ded0d9955 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 20 Oct 2013 20:34:18 +1300 Subject: [PATCH 474/695] GPUImagePicture: only access image bytes directly if the bitmap byte order and format is compatible with GL This correct non-redrawing for JPGs from my previous commit, as they are big endian. --- framework/Source/iOS/GPUImagePicture.m | 34 ++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 2b5510621..18aea6f81 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -98,12 +98,42 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot GLubyte *imageData = NULL; CFDataRef dataFromImageDataProvider; + GLenum format = GL_BGRA; + + if (!shouldRedrawUsingCoreGraphics) { + /* Check that the bitmap pixel format is compatible with GL */ + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(newImageSource); + if ((bitmapInfo & kCGBitmapFloatComponents) != 0) { + /* We don't support float components for use directly in GL */ + shouldRedrawUsingCoreGraphics = YES; + } else { + CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; + if (byteOrderInfo == kCGBitmapByteOrder32Little) { + /* Little endian, for alpha-first we can use this bitmap directly in GL */ + CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; + if (alphaInfo != kCGImageAlphaPremultipliedFirst && alphaInfo != kCGImageAlphaFirst && + alphaInfo != kCGImageAlphaNoneSkipFirst) { + shouldRedrawUsingCoreGraphics = YES; + } + } else if (byteOrderInfo == kCGBitmapByteOrderDefault || byteOrderInfo == kCGBitmapByteOrder32Big) { + /* Big endian, for alpha-last we can use this bitmap directly in GL */ + CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; + if (alphaInfo != kCGImageAlphaPremultipliedLast && alphaInfo != kCGImageAlphaLast && + alphaInfo != kCGImageAlphaNoneSkipLast) { + shouldRedrawUsingCoreGraphics = YES; + } else { + /* Can access directly using GL_RGBA pixel format */ + format = GL_RGBA; + } + } + } + } // CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); if (shouldRedrawUsingCoreGraphics) { - // For resized image, redraw + // For resized or incompatible image: redraw imageData = (GLubyte *) calloc(1, (int)pixelSizeToUseForTexture.width * (int)pixelSizeToUseForTexture.height * 4); CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); @@ -148,7 +178,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } // no need to use self.outputTextureOptions here since pictures need this texture formats and type - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, format, GL_UNSIGNED_BYTE, imageData); if (self.shouldSmoothlyScaleOutput) { From f476a026cdee12b3fb33b2cc14f8e8794d7b8cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 21 Oct 2013 14:09:58 +0900 Subject: [PATCH 475/695] Add Podspec file This will allow people using GPUImage from Cocoapods to: * Force the latest version of the library at any time with `pod 'GPUImage', :head`. * Specify a given commit and/or fork to use with `pod 'GPUImage', :git => 'https://github.com/...', :commit => '...`. --- GPUImage.podspec | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 GPUImage.podspec diff --git a/GPUImage.podspec b/GPUImage.podspec new file mode 100644 index 000000000..fdbf748df --- /dev/null +++ b/GPUImage.podspec @@ -0,0 +1,16 @@ +Pod::Spec.new do |s| + s.name = 'GPUImage' + s.version = '0.1.1' + s.license = 'BSD' + s.platform = :ios, '5.0' + s.summary = 'An open source iOS framework for GPU-based image and video processing.' + s.homepage = 'https://github.com/BradLarson/GPUImage' + s.author = { 'Brad Larson' => 'contact@sunsetlakesoftware.com' } + s.source = { :git => 'https://github.com/BradLarson/GPUImage.git', :tag => "#{s.version}" } + s.source_files = 'framework/Source/**/*.{h,m}' + s.resources = 'framework/Resources/*.png' + s.osx.exclude_files = 'framework/Source/iOS/**/*.{h,m}' + s.ios.exclude_files = 'framework/Source/Mac/**/*.{h,m}' + s.frameworks = ['OpenGLES', 'CoreVideo', 'CoreMedia', 'QuartzCore', 'AVFoundation'] + s.requires_arc = true +end \ No newline at end of file From 21c350f3e42020525823d08ca32915d382653950 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 21 Oct 2013 16:52:52 -0500 Subject: [PATCH 476/695] Enhanced my benchmark and updated my documentation to reflect more up to date Core Image numbers. I've been too hard on them. --- README.md | 7 ++- .../VideoFilteringDisplayController.h | 4 +- .../VideoFilteringDisplayController.m | 45 ++++++++++++++----- .../ShowcaseFilterViewController.m | 1 + framework/GPUImage.xcodeproj/project.pbxproj | 2 +- framework/Source/GPUImageGaussianBlurFilter.m | 6 +-- framework/Source/GPUImageVideoCamera.h | 2 + framework/Source/GPUImageVideoCamera.m | 6 +++ framework/Source/GPUImageiOSBlurFilter.h | 6 +-- framework/Source/GPUImageiOSBlurFilter.m | 1 - 10 files changed, 56 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 856b5354d..7841384d3 100755 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-ma and found that there was a lot of boilerplate code I had to write in its creation. Therefore, I put together this framework that encapsulates a lot of the common tasks you'll encounter when processing images and video and made it so that you don't need to care about the OpenGL ES 2.0 underpinnings. -In initial benchmarks, this framework significantly outperforms Core Image when handling video, taking only 2.5 ms on an iPhone 4 to upload a frame from the camera, apply a sepia filter, and display, versus 149 ms for the same operation using Core Image. CPU-based processing takes 460 ms, making GPUImage 60X faster than Core Image on this hardware, and 184X faster than CPU-bound processing. On an iPhone 4S, GPUImage is only 13X faster than Core Image, and 102X faster than CPU-bound processing. +This framework compares favorably to Core Image when handling video, taking only 2.5 ms on an iPhone 4 to upload a frame from the camera, apply a gamma filter, and display, versus 106 ms for the same operation using Core Image. CPU-based processing takes 460 ms, making GPUImage 40X faster than Core Image for this operation on this hardware, and 184X faster than CPU-bound processing. On an iPhone 4S, GPUImage is only 4X faster than Core Image for this case, and 102X faster than CPU-bound processing. However, for more complex operations like Gaussian blurs at larger radii, Core Image currently outpaces GPUImage. ## License ## @@ -204,6 +204,11 @@ There are currently 125 built-in filters, divided into the following categories: - *blurCenter*: Center for the blur, defaults to 0.5, 0.5 - *blurRadius*: Radius for the blur, defaults to 1.0 +- **GPUImageiOSBlurFilter**: An attempt to replicate the background blur used on iOS 7 in places like the control center. + - *blurRadiusInPixels*: A radius in pixels to use for the blur, with a default of 12.0. This adjusts the sigma variable in the Gaussian distribution function. + - *saturation*: Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 0.8 as the normal level + - *downsampling*: The degree to which to downsample, then upsample the incoming image to minimize computations within the Gaussian blur, with a default of 4.0. + - **GPUImageMedianFilter**: Takes the median value of the three color components, over a 3x3 area - **GPUImageBilateralFilter**: A bilateral blur, which tries to blur similar color values while preserving sharp edges diff --git a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h index e3962178d..5b641d011 100755 --- a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h @@ -15,14 +15,14 @@ AVCaptureVideoDataOutput *videoOutput; CIContext *coreImageContext; - CIFilter *sepiaCoreImageFilter; + CIFilter *coreImageFilter; GLuint _renderBuffer; BOOL processUsingCPU; GPUImageVideoCamera *videoCamera; - GPUImageSepiaFilter *sepiaFilter; + GPUImageOutput *benchmarkedGPUImageFilter; GPUImageView *filterView; __unsafe_unretained id delegate; diff --git a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m index d1f35676e..53e4a9f90 100755 --- a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m @@ -1,5 +1,7 @@ #import "VideoFilteringDisplayController.h" +#define BLURSIGMA 4.0 + @implementation VideoFilteringDisplayController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil @@ -71,6 +73,7 @@ - (void)startAVFoundationVideoProcessing; NSLog(@"Couldn't add video output"); } +// [captureSession setSessionPreset:AVCaptureSessionPreset1280x720]; [captureSession setSessionPreset:AVCaptureSessionPreset640x480]; } @@ -117,6 +120,8 @@ - (void)displayVideoForCoreImage; [EAGLContext setCurrentContext:self.openGLESContext]; videoDisplayView = [[GLKView alloc] initWithFrame:self.view.bounds context:self.openGLESContext]; + videoDisplayView.contentScaleFactor = [[UIScreen mainScreen] scale]; + // videoDisplayView.frame = self.view.bounds; [self.view addSubview:videoDisplayView]; @@ -128,12 +133,20 @@ - (void)displayVideoForCoreImage; // [videoDisplayView bindDrawable]; - coreImageContext = [CIContext contextWithEAGLContext:self.openGLESContext]; - + // Disable color correction to provide a more fair benchmark + NSMutableDictionary *options = [[NSMutableDictionary alloc] init]; + [options setObject: [NSNull null] forKey: kCIContextWorkingColorSpace]; + coreImageContext = [CIContext contextWithEAGLContext:self.openGLESContext options:options]; - sepiaCoreImageFilter = [CIFilter filterWithName:@"CISepiaTone"]; - [sepiaCoreImageFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputIntensity"]; +// sepiaCoreImageFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; +// [sepiaCoreImageFilter setValue:[NSNumber numberWithFloat:BLURSIGMA] forKey:@"inputRadius"]; + +// sepiaCoreImageFilter = [CIFilter filterWithName:@"CISepiaTone"]; +// [sepiaCoreImageFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputIntensity"]; + + coreImageFilter = [CIFilter filterWithName:@"CIGammaAdjust"]; + [coreImageFilter setValue:[NSNumber numberWithFloat:0.75] forKey:@"inputPower"]; [self startAVFoundationVideoProcessing]; processUsingCPU = NO; @@ -158,6 +171,7 @@ - (void)displayVideoForCoreImage; NSLog(@"End Core Image"); + sleep(1); [self displayVideoForGPUImage]; }); } @@ -169,15 +183,21 @@ - (void)displayVideoForGPUImage; NSLog(@"Start GPU Image"); videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; videoCamera.runBenchmark = YES; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; - sepiaFilter = [[GPUImageSepiaFilter alloc] init]; +// sepiaFilter = [[GPUImageSepiaFilter alloc] init]; +// sepiaFilter = [[GPUImageiOSBlurFilter alloc] init]; +// sepiaFilter = [[GPUImageGaussianBlurFilter alloc] init]; +// [(GPUImageGaussianBlurFilter *)sepiaFilter setBlurRadiusInPixels:BLURSIGMA]; + benchmarkedGPUImageFilter = [[GPUImageGammaFilter alloc] init]; + [(GPUImageGammaFilter *)benchmarkedGPUImageFilter setGamma:0.75]; - [videoCamera addTarget:sepiaFilter]; + [videoCamera addTarget:benchmarkedGPUImageFilter]; filterView = [[GPUImageView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:filterView]; - [sepiaFilter addTarget:filterView]; + [benchmarkedGPUImageFilter addTarget:filterView]; [videoCamera startCameraCapture]; @@ -216,7 +236,6 @@ -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMS CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); unsigned char *data = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer); -// int bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer); int bufferHeight = CVPixelBufferGetHeight(pixelBuffer); int bufferWidth = CVPixelBufferGetWidth(pixelBuffer); @@ -256,12 +275,14 @@ -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMS CIImage *inputImage = [CIImage imageWithCVPixelBuffer:pixelBuffer]; inputImage = [inputImage imageByApplyingTransform:CGAffineTransformMakeRotation(-M_PI / 2.0)]; - [sepiaCoreImageFilter setValue:inputImage forKey:kCIInputImageKey]; + [coreImageFilter setValue:inputImage forKey:kCIInputImageKey]; - CIImage *outputImage = [sepiaCoreImageFilter outputImage]; + CIImage *outputImage = [coreImageFilter outputImage]; - CGFloat scale = UIScreen.mainScreen.scale; - CGRect s = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width * scale, [[UIScreen mainScreen] bounds].size.height * scale); +// CGFloat scale = UIScreen.mainScreen.scale; +// CGRect s = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width * scale, [[UIScreen mainScreen] bounds].size.height * scale); + CGRect s = CGRectMake(0, 0, 480, 640); +// CGRect s = CGRectMake(0, 0, 720, 1280); [coreImageContext drawImage:outputImage inRect:s fromRect:[inputImage extent]]; [self.openGLESContext presentRenderbuffer:GL_RENDERBUFFER]; diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 2bb72b46b..836e3c26d 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1544,6 +1544,7 @@ - (void)setupFilter; - (IBAction)updateFilterFromSlider:(id)sender; { + [videoCamera resetBenchmarkAverage]; switch(filterType) { case GPUIMAGE_SEPIA: [(GPUImageSepiaFilter *)filter setIntensity:[(UISlider *)sender value]]; break; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 02072109c..c91b1be2d 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1567,7 +1567,6 @@ BC0690BE157C1B38009274F9 /* GPUImageOpeningFilter.m in Sources */, BC0690C2157C2368009274F9 /* GPUImageClosingFilter.m in Sources */, BC0690D1157C2EBA009274F9 /* GPUImageRGBDilationFilter.m in Sources */, - BC8A583D1813060F00E6B507 /* GPUImageiOSBlurFilter.m in Sources */, BC0690D6157C31C9009274F9 /* GPUImageRGBErosionFilter.m in Sources */, BC0690DA157C33B9009274F9 /* GPUImageRGBOpeningFilter.m in Sources */, BC0690DE157C344D009274F9 /* GPUImageRGBClosingFilter.m in Sources */, @@ -1622,6 +1621,7 @@ BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */, BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */, D443237B17C81C0C00204484 /* GPUImageMovieComposition.m in Sources */, + BC8A583D1813060F00E6B507 /* GPUImageiOSBlurFilter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index 7d720bc9d..cfe1f3b80 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -27,12 +27,9 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade - (id)init; { - // NSString *currentGaussianBlurVertexShader = [GPUImageGaussianBlurFilter vertexShaderForStandardGaussianOfRadius:4 sigma:2.0]; - // NSString *currentGaussianBlurFragmentShader = [GPUImageGaussianBlurFilter fragmentShaderForStandardGaussianOfRadius:4 sigma:2.0]; - NSString *currentGaussianBlurVertexShader = [[self class] vertexShaderForOptimizedBlurOfRadius:4 sigma:2.0]; NSString *currentGaussianBlurFragmentShader = [[self class] fragmentShaderForOptimizedBlurOfRadius:4 sigma:2.0]; - + return [self initWithFirstStageVertexShaderFromString:currentGaussianBlurVertexShader firstStageFragmentShaderFromString:currentGaussianBlurFragmentShader secondStageVertexShaderFromString:currentGaussianBlurVertexShader secondStageFragmentShaderFromString:currentGaussianBlurFragmentShader]; } @@ -427,6 +424,7 @@ - (void)switchToVertexShader:(NSString *)newVertexShader fragmentShader:(NSStrin glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); [self setupFilterForSize:[self sizeOfFBO]]; + glFinish(); }); } diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index cb5ef0e34..3c06edce0 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -146,6 +146,8 @@ extern NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString */ - (CGFloat)averageFrameDurationDuringCapture; +- (void)resetBenchmarkAverage; + + (BOOL)isBackFacingCameraPresent; + (BOOL)isFrontFacingCameraPresent; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 86d1993ce..8bdce3f7b 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -923,6 +923,12 @@ - (CGFloat)averageFrameDurationDuringCapture; return (totalFrameTimeDuringCapture / (CGFloat)(numberOfFramesCaptured - INITIALFRAMESTOIGNOREFORBENCHMARK)) * 1000.0; } +- (void)resetBenchmarkAverage; +{ + numberOfFramesCaptured = 0; + totalFrameTimeDuringCapture = 0.0; +} + #pragma mark - #pragma mark AVCaptureVideoDataOutputSampleBufferDelegate diff --git a/framework/Source/GPUImageiOSBlurFilter.h b/framework/Source/GPUImageiOSBlurFilter.h index 81c2b920d..da1c5661d 100644 --- a/framework/Source/GPUImageiOSBlurFilter.h +++ b/framework/Source/GPUImageiOSBlurFilter.h @@ -11,15 +11,15 @@ GPUImageLuminanceRangeFilter *luminanceRangeFilter; } -/** A radius in pixels to use for the blur, with a default of 2.0. This adjusts the sigma variable in the Gaussian distribution function. +/** A radius in pixels to use for the blur, with a default of 12.0. This adjusts the sigma variable in the Gaussian distribution function. */ @property (readwrite, nonatomic) CGFloat blurRadiusInPixels; -/** Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 1.0 as the normal level +/** Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 0.8 as the normal level */ @property (readwrite, nonatomic) CGFloat saturation; -/** The degree to which to downsample, then upsample the incoming image to minimize computations within the Gaussian blur, default of 2.0 +/** The degree to which to downsample, then upsample the incoming image to minimize computations within the Gaussian blur, default of 4.0 */ @property (readwrite, nonatomic) CGFloat downsampling; diff --git a/framework/Source/GPUImageiOSBlurFilter.m b/framework/Source/GPUImageiOSBlurFilter.m index 3aa8a7d1b..ed31e0d65 100644 --- a/framework/Source/GPUImageiOSBlurFilter.m +++ b/framework/Source/GPUImageiOSBlurFilter.m @@ -37,7 +37,6 @@ - (id)init; self.initialFilters = [NSArray arrayWithObject:saturationFilter]; self.terminalFilter = luminanceRangeFilter; -// self.blurRadiusInPixels = 24.0; self.blurRadiusInPixels = 12.0; self.saturation = 0.8; self.downsampling = 4.0; From 74c9e6650364d62fd213ef904509f7a061c0cc8b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 22 Oct 2013 09:16:54 -0500 Subject: [PATCH 477/695] Removed unused functions that were throwing errors in the latest LLVM. --- framework/Source/GPUImageHSBFilter.m | 101 --------------------------- 1 file changed, 101 deletions(-) diff --git a/framework/Source/GPUImageHSBFilter.m b/framework/Source/GPUImageHSBFilter.m index 6af8048a5..7b1f2bee6 100644 --- a/framework/Source/GPUImageHSBFilter.m +++ b/framework/Source/GPUImageHSBFilter.m @@ -153,41 +153,6 @@ static void cscalemat(mat,rscale,gscale,bscale) matrixmult(mmat,mat,mat); } -/* - * lummat - - * make a luminance marix - */ -static void lummat(mat) -float mat[4][4]; -{ - float mmat[4][4]; - float rwgt, gwgt, bwgt; - - rwgt = RLUM; - gwgt = GLUM; - bwgt = BLUM; - mmat[0][0] = rwgt; - mmat[0][1] = rwgt; - mmat[0][2] = rwgt; - mmat[0][3] = 0.0; - - mmat[1][0] = gwgt; - mmat[1][1] = gwgt; - mmat[1][2] = gwgt; - mmat[1][3] = 0.0; - - mmat[2][0] = bwgt; - mmat[2][1] = bwgt; - mmat[2][2] = bwgt; - mmat[2][3] = 0.0; - - mmat[3][0] = 0.0; - mmat[3][1] = 0.0; - mmat[3][2] = 0.0; - mmat[3][3] = 1.0; - matrixmult(mmat,mat,mat); -} - /* * saturatemat - * make a saturation marix @@ -235,38 +200,6 @@ static void saturatemat(mat,sat) matrixmult(mmat,mat,mat); } -/* - * offsetmat - - * offset r, g, and b - */ -static void offsetmat(mat,roffset,goffset,boffset) -float mat[4][4]; -float roffset, goffset, boffset; -{ - float mmat[4][4]; - - mmat[0][0] = 1.0; - mmat[0][1] = 0.0; - mmat[0][2] = 0.0; - mmat[0][3] = 0.0; - - mmat[1][0] = 0.0; - mmat[1][1] = 1.0; - mmat[1][2] = 0.0; - mmat[1][3] = 0.0; - - mmat[2][0] = 0.0; - mmat[2][1] = 0.0; - mmat[2][2] = 1.0; - mmat[2][3] = 0.0; - - mmat[3][0] = roffset; - mmat[3][1] = goffset; - mmat[3][2] = boffset; - mmat[3][3] = 1.0; - matrixmult(mmat,mat,mat); -} - /* * xrotate - * rotate about the x (red) axis @@ -395,40 +328,6 @@ static void zshearmat(mat,dx,dy) matrixmult(mmat,mat,mat); } -/* - * simplehuerotatemat - - * simple hue rotation. This changes luminance - */ -static void simplehuerotatemat(mat,rot) -float mat[4][4]; -float rot; -{ - float mag; - float xrs, xrc; - float yrs, yrc; - float zrs, zrc; - - /* rotate the grey vector into positive Z */ - mag = sqrt(2.0); - xrs = 1.0/mag; - xrc = 1.0/mag; - xrotatemat(mat,xrs,xrc); - - mag = sqrt(3.0); - yrs = -1.0/mag; - yrc = sqrt(2.0)/mag; - yrotatemat(mat,yrs,yrc); - - /* rotate the hue */ - zrs = sin(rot*M_PI/180.0); - zrc = cos(rot*M_PI/180.0); - zrotatemat(mat,zrs,zrc); - - /* rotate the grey vector back into place */ - yrotatemat(mat,-yrs,yrc); - xrotatemat(mat,-xrs,xrc); -} - /* * huerotatemat - * rotate the hue, while maintaining luminance. From 491832928cd152e8670a3c99cbe09744803f116e Mon Sep 17 00:00:00 2001 From: Alex Burgel Date: Wed, 30 Oct 2013 11:45:50 -0400 Subject: [PATCH 478/695] Fix 64bit string formatting issues on iOS --- framework/Source/GPUImageBoxBlurFilter.m | 4 ++-- framework/Source/GPUImageGaussianBlurFilter.m | 8 ++++---- .../Source/GPUImageSingleComponentGaussianBlurFilter.m | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index 582d08a06..02c420509 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -66,11 +66,11 @@ + (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigm uniform highp float texelWidthOffset;\n\ uniform highp float texelHeightOffset;\n\ \n\ - varying highp vec2 blurCoordinates[%d];\n\ + varying highp vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ - lowp vec4 sum = vec4(0.0);\n", 1 + (numberOfOptimizedOffsets * 2) ]; + lowp vec4 sum = vec4(0.0);\n", (unsigned long)(1 + (numberOfOptimizedOffsets * 2)) ]; #else [shaderString appendFormat:@"\ uniform sampler2D inputImageTexture;\n\ diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index cfe1f3b80..a671f1a55 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -116,11 +116,11 @@ + (NSString *)fragmentShaderForStandardBlurOfRadius:(NSUInteger)blurRadius sigma [shaderString appendFormat:@"\ uniform sampler2D inputImageTexture;\n\ \n\ - varying highp vec2 blurCoordinates[%d];\n\ + varying highp vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ - lowp vec4 sum = vec4(0.0);\n", (blurRadius * 2 + 1) ]; + lowp vec4 sum = vec4(0.0);\n", (unsigned long)(blurRadius * 2 + 1) ]; #else [shaderString appendFormat:@"\ uniform sampler2D inputImageTexture;\n\ @@ -274,11 +274,11 @@ + (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigm uniform highp float texelWidthOffset;\n\ uniform highp float texelHeightOffset;\n\ \n\ - varying highp vec2 blurCoordinates[%d];\n\ + varying highp vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ - lowp vec4 sum = vec4(0.0);\n", 1 + (numberOfOptimizedOffsets * 2) ]; + lowp vec4 sum = vec4(0.0);\n", (unsigned long)(1 + (numberOfOptimizedOffsets * 2)) ]; #else [shaderString appendFormat:@"\ uniform sampler2D inputImageTexture;\n\ diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m index f3712fe25..67d82cb63 100644 --- a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m +++ b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m @@ -121,11 +121,11 @@ + (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigm uniform highp float texelWidthOffset;\n\ uniform highp float texelHeightOffset;\n\ \n\ - varying highp vec2 blurCoordinates[%d];\n\ + varying highp vec2 blurCoordinates[%lu];\n\ \n\ void main()\n\ {\n\ - lowp float sum = 0.0;\n", 1 + (numberOfOptimizedOffsets * 2) ]; + lowp float sum = 0.0;\n", (unsigned long)(1 + (numberOfOptimizedOffsets * 2)) ]; #else [shaderString appendFormat:@"\ uniform sampler2D inputImageTexture;\n\ From de7c1a13603ec7ea7ebabdeb696012ac75252a93 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 6 Nov 2013 13:25:43 -0600 Subject: [PATCH 479/695] Fixed the MultiViewFilterExample on the Mac side. --- .../MultiViewFilterExample/SLSMultiViewWindowController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m index 5287335c7..77724e85a 100644 --- a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m @@ -22,7 +22,7 @@ - (void)windowDidLoad { [super windowDidLoad]; - videoCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionUnspecified]; + videoCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraDevice:nil]; filter1 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader1"]; filter2 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader2"]; From 49fcf22d00910f5439392881839cf1d6fed729c1 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 7 Nov 2013 09:18:58 -0600 Subject: [PATCH 480/695] Removed a divide-by-zero error in the soft light blend, caused by accounting for premultiplied alpha. --- framework/Source/GPUImageSoftLightBlendFilter.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageSoftLightBlendFilter.m b/framework/Source/GPUImageSoftLightBlendFilter.m index 944640bd2..368bce0a0 100755 --- a/framework/Source/GPUImageSoftLightBlendFilter.m +++ b/framework/Source/GPUImageSoftLightBlendFilter.m @@ -14,7 +14,8 @@ void main() mediump vec4 base = texture2D(inputImageTexture, textureCoordinate); mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); - gl_FragColor = base * (overlay.a * (base / base.a) + (2.0 * overlay * (1.0 - (base / base.a)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a); + lowp float alphaDivisor = base.a + step(base.a, 0.0); // Protect against a divide-by-zero blacking out things in the output + gl_FragColor = base * (overlay.a * (base / alphaDivisor) + (2.0 * overlay * (1.0 - (base / alphaDivisor)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a); } ); #else @@ -31,7 +32,8 @@ void main() vec4 base = texture2D(inputImageTexture, textureCoordinate); vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2); - gl_FragColor = base * (overlay.a * (base / base.a) + (2.0 * overlay * (1.0 - (base / base.a)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a); + float alphaDivisor = base.a + step(base.a, 0.0); // Protect against a divide-by-zero blacking out things in the output + gl_FragColor = base * (overlay.a * (base / alphaDivisor) + (2.0 * overlay * (1.0 - (base / alphaDivisor)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a); } ); #endif From abe404b254039fe7a3708843e48cc0a423428496 Mon Sep 17 00:00:00 2001 From: Andrew Chambers Date: Fri, 8 Nov 2013 15:06:13 -0800 Subject: [PATCH 481/695] Fixes infinite loops when call endProcess by adding a flag to check if the filter has already started the end process --- framework/Source/GPUImageFilter.h | 1 + framework/Source/GPUImageFilter.m | 9 +++++++-- framework/Source/GPUImageFilterGroup.h | 1 + framework/Source/GPUImageFilterGroup.m | 9 +++++++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index e6d8da81f..0084a5240 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -57,6 +57,7 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; BOOL preparedToCaptureImage; + BOOL isEndProcessing; // Texture caches are an iOS-specific capability #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index e76b2d16b..7caf9a706 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -1002,9 +1002,14 @@ - (CGSize)maximumOutputSize; - (void)endProcessing { - for (id currentTarget in targets) + if (!isEndProcessing) { - [currentTarget endProcessing]; + isEndProcessing = YES; + + for (id currentTarget in targets) + { + [currentTarget endProcessing]; + } } } diff --git a/framework/Source/GPUImageFilterGroup.h b/framework/Source/GPUImageFilterGroup.h index b30374c86..e18822873 100755 --- a/framework/Source/GPUImageFilterGroup.h +++ b/framework/Source/GPUImageFilterGroup.h @@ -4,6 +4,7 @@ @interface GPUImageFilterGroup : GPUImageOutput { NSMutableArray *filters; + BOOL isEndProcessing; } @property(readwrite, nonatomic, strong) GPUImageOutput *terminalFilter; diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index c6bf5af00..9f4680525 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -182,9 +182,14 @@ - (CGSize)maximumOutputSize; - (void)endProcessing; { - for (GPUImageOutput *currentFilter in _initialFilters) + if (!isEndProcessing) { - [currentFilter endProcessing]; + isEndProcessing = YES; + + for (id currentTarget in targets) + { + [currentTarget endProcessing]; + } } } From dd82b999de9ad5a8d2ba2f1ee0d03039bac5a975 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Sun, 10 Nov 2013 21:51:11 +1300 Subject: [PATCH 482/695] GPUImagePicture: check that the memory layout is valid for using the CGImage directly in GL This corrects the fault introduced by my previous commit enabling CGImages to be used directly in GL. --- framework/Source/iOS/GPUImagePicture.m | 52 +++++++++++++++----------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index a8b862a63..edea1df79 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -101,29 +101,39 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot GLenum format = GL_BGRA; if (!shouldRedrawUsingCoreGraphics) { - /* Check that the bitmap pixel format is compatible with GL */ - CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(newImageSource); - if ((bitmapInfo & kCGBitmapFloatComponents) != 0) { - /* We don't support float components for use directly in GL */ + /* Check that the memory layout is compatible with GL, as we cannot use glPixelStore to + * tell GL about the memory layout with GLES. + */ + if (CGImageGetBytesPerRow(newImageSource) != CGImageGetWidth(newImageSource) * 4 || + CGImageGetBitsPerPixel(newImageSource) != 32 || + CGImageGetBitsPerComponent(newImageSource) != 8) + { shouldRedrawUsingCoreGraphics = YES; } else { - CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; - if (byteOrderInfo == kCGBitmapByteOrder32Little) { - /* Little endian, for alpha-first we can use this bitmap directly in GL */ - CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; - if (alphaInfo != kCGImageAlphaPremultipliedFirst && alphaInfo != kCGImageAlphaFirst && - alphaInfo != kCGImageAlphaNoneSkipFirst) { - shouldRedrawUsingCoreGraphics = YES; - } - } else if (byteOrderInfo == kCGBitmapByteOrderDefault || byteOrderInfo == kCGBitmapByteOrder32Big) { - /* Big endian, for alpha-last we can use this bitmap directly in GL */ - CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; - if (alphaInfo != kCGImageAlphaPremultipliedLast && alphaInfo != kCGImageAlphaLast && - alphaInfo != kCGImageAlphaNoneSkipLast) { - shouldRedrawUsingCoreGraphics = YES; - } else { - /* Can access directly using GL_RGBA pixel format */ - format = GL_RGBA; + /* Check that the bitmap pixel format is compatible with GL */ + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(newImageSource); + if ((bitmapInfo & kCGBitmapFloatComponents) != 0) { + /* We don't support float components for use directly in GL */ + shouldRedrawUsingCoreGraphics = YES; + } else { + CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; + if (byteOrderInfo == kCGBitmapByteOrder32Little) { + /* Little endian, for alpha-first we can use this bitmap directly in GL */ + CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; + if (alphaInfo != kCGImageAlphaPremultipliedFirst && alphaInfo != kCGImageAlphaFirst && + alphaInfo != kCGImageAlphaNoneSkipFirst) { + shouldRedrawUsingCoreGraphics = YES; + } + } else if (byteOrderInfo == kCGBitmapByteOrderDefault || byteOrderInfo == kCGBitmapByteOrder32Big) { + /* Big endian, for alpha-last we can use this bitmap directly in GL */ + CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; + if (alphaInfo != kCGImageAlphaPremultipliedLast && alphaInfo != kCGImageAlphaLast && + alphaInfo != kCGImageAlphaNoneSkipLast) { + shouldRedrawUsingCoreGraphics = YES; + } else { + /* Can access directly using GL_RGBA pixel format */ + format = GL_RGBA; + } } } } From 3c72968883cfea25b9d762da6c555e917d46841d Mon Sep 17 00:00:00 2001 From: Andrew Chambers Date: Tue, 19 Nov 2013 15:31:20 -0800 Subject: [PATCH 483/695] Removed setActiveShaderProgram and moved glEnableVertexAttribArray to renderAtInternalSize --- framework/Source/GPUImageRawDataOutput.m | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index c9b436212..5377a5144 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -85,12 +85,6 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn dataTextureCoordinateAttribute = [dataProgram attributeIndex:@"inputTextureCoordinate"]; dataInputTextureUniform = [dataProgram uniformIndex:@"inputImageTexture"]; - // REFACTOR: Wrap this in a block for the image processing queue - [GPUImageContext setActiveShaderProgram:dataProgram]; - - glEnableVertexAttribArray(dataPositionAttribute); - glEnableVertexAttribArray(dataTextureCoordinateAttribute); - return self; } @@ -305,6 +299,9 @@ - (void)renderAtInternalSize; glVertexAttribPointer(dataPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); glVertexAttribPointer(dataTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + glEnableVertexAttribArray(dataPositionAttribute); + glEnableVertexAttribArray(dataTextureCoordinateAttribute); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } From a65cb5e2d43aa3c68e3ebcd159023dd787aefd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 11:03:22 +0900 Subject: [PATCH 484/695] Update podspec --- GPUImage.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPUImage.podspec b/GPUImage.podspec index fdbf748df..239c6aadf 100644 --- a/GPUImage.podspec +++ b/GPUImage.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'GPUImage' - s.version = '0.1.1' + s.version = '0.1.2' s.license = 'BSD' s.platform = :ios, '5.0' s.summary = 'An open source iOS framework for GPU-based image and video processing.' From f19e28e16653d133ecc4aea27f92b8384c0e4a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 11:12:32 +0900 Subject: [PATCH 485/695] Update GPUImageMac project to Xcode recommended settings --- framework/GPUImageMac.xcodeproj/project.pbxproj | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index c7e1befc9..7d658203f 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -1241,7 +1241,7 @@ BCA3F31317239B6500E28AEC /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Sunset Lake Software LLC"; }; buildConfigurationList = BCA3F31617239B6500E28AEC /* Build configuration list for PBXProject "GPUImageMac" */; @@ -1435,7 +1435,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; @@ -1469,7 +1468,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; From d2e5ca73b5b48e2578e74c49036247293bd68108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 16:47:06 +0900 Subject: [PATCH 486/695] Update all demo projects to Xcode 5 recommended settings, add Default image to iOS projects --- .../FilterShowcase.xcodeproj/project.pbxproj | 4 +-- .../project.pbxproj | 4 +-- .../project.pbxproj | 4 +-- .../BenchmarkSuite.xcodeproj/project.pbxproj | 29 ++++++++++++++++-- .../iOS/BenchmarkSuite/Default-568h@2x.png | Bin 0 -> 18594 bytes .../project.pbxproj | 29 ++++++++++++++++-- .../ColorObjectTracking/Default-568h@2x.png | Bin 0 -> 18594 bytes .../CubeExample.xcodeproj/project.pbxproj | 14 ++++++--- examples/iOS/CubeExample/Default-568h@2x.png | Bin 0 -> 18594 bytes .../FeatureExtractionTest/Default-568h@2x.png | Bin 0 -> 18594 bytes .../project.pbxproj | 27 ++++++++++++++-- .../Default-568h@2x.png | Bin 0 -> 18594 bytes .../project.pbxproj | 29 ++++++++++++++++-- examples/iOS/RawDataTest/Default-568h@2x.png | Bin 0 -> 18594 bytes .../RawDataTest.xcodeproj/project.pbxproj | 27 ++++++++++++++-- .../iOS/SimpleImageFilter/Default-568h@2x.png | Bin 0 -> 18594 bytes .../project.pbxproj | 29 ++++++++++++++++-- .../iOS/SimplePhotoFilter/Default-568h@2x.png | Bin 0 -> 18594 bytes .../project.pbxproj | 27 ++++++++++++++-- .../SimpleVideoFileFilter/Default-568h@2x.png | Bin 0 -> 18594 bytes .../project.pbxproj | 29 ++++++++++++++++-- .../iOS/SimpleVideoFilter/Default-568h@2x.png | Bin 0 -> 18594 bytes .../project.pbxproj | 29 ++++++++++++++++-- 23 files changed, 241 insertions(+), 40 deletions(-) create mode 100644 examples/iOS/BenchmarkSuite/Default-568h@2x.png create mode 100644 examples/iOS/ColorObjectTracking/Default-568h@2x.png create mode 100644 examples/iOS/CubeExample/Default-568h@2x.png create mode 100644 examples/iOS/FeatureExtractionTest/Default-568h@2x.png create mode 100644 examples/iOS/MultiViewFilterExample/Default-568h@2x.png create mode 100644 examples/iOS/RawDataTest/Default-568h@2x.png create mode 100644 examples/iOS/SimpleImageFilter/Default-568h@2x.png create mode 100644 examples/iOS/SimplePhotoFilter/Default-568h@2x.png create mode 100644 examples/iOS/SimpleVideoFileFilter/Default-568h@2x.png create mode 100644 examples/iOS/SimpleVideoFilter/Default-568h@2x.png diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 680a2878b..9bb46c365 100644 --- a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -214,7 +214,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = SLS; - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Sunset Lake Software LLC"; }; buildConfigurationList = BCF8676517263EAC00912E34 /* Build configuration list for PBXProject "FilterShowcase" */; @@ -325,7 +325,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; @@ -358,7 +357,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj index fad7e66d2..96b4b1cdf 100644 --- a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj @@ -192,7 +192,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = SLS; - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Sunset Lake Software LLC"; }; buildConfigurationList = BCB00A0C172B0CC500DB804C /* Build configuration list for PBXProject "MultiViewFilterExample" */; @@ -297,7 +297,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; @@ -330,7 +329,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index 7a9008464..4edc58c75 100644 --- a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -176,7 +176,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = SLS; - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Sunset Lake Software LLC"; }; buildConfigurationList = BCA3F3381723A2E800E28AEC /* Build configuration list for PBXProject "SimplePhotoFilter" */; @@ -285,7 +285,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; @@ -318,7 +317,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj b/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj index 1de7829de..0baf183d3 100755 --- a/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj @@ -39,6 +39,7 @@ BCF9D1E314EC4F7C00986461 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D1E214EC4F7C00986461 /* AVFoundation.framework */; }; BCF9D1EA14EC569700986461 /* Lambeau.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D1E914EC569700986461 /* Lambeau.jpg */; }; BCF9D20C14EC7EB100986461 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D20B14EC7EB100986461 /* CoreImage.framework */; }; + E5066F251855A55B008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F241855A55B008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -106,6 +107,7 @@ BCF9D1E214EC4F7C00986461 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; BCF9D1E914EC569700986461 /* Lambeau.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = Lambeau.jpg; path = ../../SimpleImageFilter/SimpleImageFilter/Lambeau.jpg; sourceTree = ""; }; BCF9D20B14EC7EB100986461 /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; + E5066F241855A55B008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -142,6 +144,7 @@ BCF9D14B14EAD24200986461 = { isa = PBXGroup; children = ( + E5066F241855A55B008C7682 /* Default-568h@2x.png */, BCF9D16014EAD24200986461 /* BenchmarkSuite */, BCF9D15914EAD24200986461 /* Frameworks */, BCF9D15714EAD24200986461 /* Products */, @@ -244,7 +247,7 @@ BCF9D14D14EAD24200986461 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BCF9D15014EAD24200986461 /* Build configuration list for PBXProject "BenchmarkSuite" */; @@ -305,6 +308,7 @@ BCB3C3D216BCA4AD003D26B0 /* Icon-72.png in Resources */, BCB3C3D316BCA4AD003D26B0 /* Icon-72@2x.png in Resources */, BCB3C3D416BCA4AD003D26B0 /* Icon.png in Resources */, + E5066F251855A55B008C7682 /* Default-568h@2x.png in Resources */, BCB3C3D516BCA4AD003D26B0 /* Icon@2x.png in Resources */, BCB3C3D616BCA4AD003D26B0 /* iTunesArtwork.png in Resources */, ); @@ -352,8 +356,13 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -366,11 +375,16 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -381,15 +395,24 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; diff --git a/examples/iOS/BenchmarkSuite/Default-568h@2x.png b/examples/iOS/BenchmarkSuite/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj b/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj index a8a7d98ad..d302e8ac2 100755 --- a/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj +++ b/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ BCB5E7AA14E3472100701302 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E7A914E3472100701302 /* CoreMedia.framework */; }; BCB5E7B214E460D300701302 /* Threshold.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E7B114E460D300701302 /* Threshold.fsh */; }; BCF866E91725A39D00912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF866E41725A38C00912E34 /* libGPUImage.a */; }; + E5066F2A1855A595008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F291855A595008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -79,6 +80,7 @@ BCB5E7A714E3471100701302 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; BCB5E7A914E3472100701302 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; BCB5E7B114E460D300701302 /* Threshold.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = Threshold.fsh; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.glsl; }; + E5066F291855A595008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -104,6 +106,7 @@ BC245DCF14DDC959009FE7EB = { isa = PBXGroup; children = ( + E5066F291855A595008C7682 /* Default-568h@2x.png */, BC245DE414DDC959009FE7EB /* ColorObjectTracking */, BC245DDD14DDC959009FE7EB /* Frameworks */, BC245DDB14DDC959009FE7EB /* Products */, @@ -208,7 +211,7 @@ BC245DD114DDC959009FE7EB /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BC245DD414DDC959009FE7EB /* Build configuration list for PBXProject "ColorObjectTracking" */; @@ -258,6 +261,7 @@ files = ( BC245DE914DDC959009FE7EB /* InfoPlist.strings in Resources */, BCB5E7B214E460D300701302 /* Threshold.fsh in Resources */, + E5066F2A1855A595008C7682 /* Default-568h@2x.png in Resources */, BCB5DD8314E85CB0000AF3C2 /* PositionColor.fsh in Resources */, BCB3C3DF16BCA51E003D26B0 /* Icon-72.png in Resources */, BCB3C3E016BCA51E003D26B0 /* Icon-72@2x.png in Resources */, @@ -306,8 +310,13 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -319,11 +328,16 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -333,14 +347,23 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; diff --git a/examples/iOS/ColorObjectTracking/Default-568h@2x.png b/examples/iOS/ColorObjectTracking/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/CubeExample/CubeExample.xcodeproj/project.pbxproj b/examples/iOS/CubeExample/CubeExample.xcodeproj/project.pbxproj index d8275f650..debe422df 100755 --- a/examples/iOS/CubeExample/CubeExample.xcodeproj/project.pbxproj +++ b/examples/iOS/CubeExample/CubeExample.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 45; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ @@ -27,6 +27,7 @@ BCB6B8C41505C2780041703B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB6B8C31505C2780041703B /* CoreGraphics.framework */; }; BCF3D690153CC5E6009A1FE5 /* DisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68F153CC5E6009A1FE5 /* DisplayViewController.m */; }; BCF866F61725A44300912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF866F11725A41E00912E34 /* libGPUImage.a */; }; + E5066F311855A66A008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F301855A66A008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -81,6 +82,7 @@ BCB6B8C31505C2780041703B /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; BCF3D68E153CC5E5009A1FE5 /* DisplayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayViewController.h; sourceTree = ""; }; BCF3D68F153CC5E6009A1FE5 /* DisplayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DisplayViewController.m; sourceTree = ""; }; + E5066F301855A66A008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -137,6 +139,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + E5066F301855A66A008C7682 /* Default-568h@2x.png */, 080E96DDFE201D6D7F000001 /* Classes */, 2514C27610084DB600A42282 /* Shaders */, 29B97315FDCFA39411CA2CEA /* Other Sources */, @@ -220,8 +223,11 @@ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CubeExample" */; - compatibilityVersion = "Xcode 3.1"; + compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( @@ -272,6 +278,7 @@ BCB3C3EC16BCA5AC003D26B0 /* Icon-72.png in Resources */, BCB3C3ED16BCA5AC003D26B0 /* Icon-72@2x.png in Resources */, BCB3C3EE16BCA5AC003D26B0 /* Icon.png in Resources */, + E5066F311855A66A008C7682 /* Default-568h@2x.png in Resources */, BCB3C3EF16BCA5AC003D26B0 /* Icon@2x.png in Resources */, BCB3C3F016BCA5AC003D26B0 /* iTunesArtwork.png in Resources */, ); @@ -334,7 +341,6 @@ C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; @@ -343,6 +349,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-fobjc-arc"; PREBINDING = NO; SDKROOT = iphoneos; @@ -353,7 +360,6 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; diff --git a/examples/iOS/CubeExample/Default-568h@2x.png b/examples/iOS/CubeExample/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/FeatureExtractionTest/Default-568h@2x.png b/examples/iOS/FeatureExtractionTest/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj index d2dbc1af8..186d59fe9 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/project.pbxproj @@ -32,6 +32,7 @@ BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */ = {isa = PBXBuildFile; fileRef = BCD9A355157EC35E00C41504 /* 8pixeltest.png */; }; BCF2860F1628A5140051E9C5 /* LineTest2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF2860E1628A5140051E9C5 /* LineTest2.png */; }; BCF867031725A53400912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF866FE1725A4E600912E34 /* libGPUImage.a */; }; + E5066F3F1855A75D008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F3E1855A75D008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -88,6 +89,7 @@ BCB79DC615E9754000965D92 /* ChairTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ChairTest.png; sourceTree = ""; }; BCD9A355157EC35E00C41504 /* 8pixeltest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 8pixeltest.png; sourceTree = ""; }; BCF2860E1628A5140051E9C5 /* LineTest2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LineTest2.png; sourceTree = ""; }; + E5066F3E1855A75D008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -114,6 +116,7 @@ BC18E08B156C822E00AB8026 = { isa = PBXGroup; children = ( + E5066F3E1855A75D008C7682 /* Default-568h@2x.png */, BC18E0A0156C822E00AB8026 /* FeatureExtractionTest */, BC18E099156C822E00AB8026 /* Frameworks */, BC18E097156C822E00AB8026 /* Products */, @@ -215,7 +218,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = FeatureExtraction; - LastUpgradeCheck = 0430; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BC18E090156C822E00AB8026 /* Build configuration list for PBXProject "FeatureExtractionTest" */; @@ -268,6 +271,7 @@ BCD9A356157EC35E00C41504 /* 8pixeltest.png in Resources */, BC46D52415D03D9C00CC63CA /* LBPTest.png in Resources */, BCB79DC715E9754000965D92 /* ChairTest.png in Resources */, + E5066F3F1855A75D008C7682 /* Default-568h@2x.png in Resources */, BCA464C9162785EA00C0F68E /* LineTest.png in Resources */, BC8A581C1810782200E6B507 /* GaussianTest.png in Resources */, BCF2860F1628A5140051E9C5 /* LineTest2.png in Resources */, @@ -317,8 +321,13 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -330,11 +339,15 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -344,14 +357,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; diff --git a/examples/iOS/MultiViewFilterExample/Default-568h@2x.png b/examples/iOS/MultiViewFilterExample/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj index ebe0c4527..5c2935a3d 100755 --- a/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj +++ b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ BCB3C40A16BCA69F003D26B0 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3C40516BCA69F003D26B0 /* iTunesArtwork.png */; }; BCB5DD6614E76CD2000AF3C2 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DD6514E76CD2000AF3C2 /* AVFoundation.framework */; }; BCF867101725A58F00912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8670B1725A56D00912E34 /* libGPUImage.a */; }; + E5066F471855A86D008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F461855A86D008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -79,6 +80,7 @@ BCB3C40416BCA69F003D26B0 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../../SharedIcons/Icon@2x.png"; sourceTree = ""; }; BCB3C40516BCA69F003D26B0 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iTunesArtwork.png; path = ../../SharedIcons/iTunesArtwork.png; sourceTree = ""; }; BCB5DD6514E76CD2000AF3C2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + E5066F461855A86D008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -104,6 +106,7 @@ BC01CA7614E7620600967264 = { isa = PBXGroup; children = ( + E5066F461855A86D008C7682 /* Default-568h@2x.png */, BC01CA8B14E7620600967264 /* MultiViewFilterExample */, BC01CA8414E7620600967264 /* Frameworks */, BC01CA8214E7620600967264 /* Products */, @@ -200,7 +203,7 @@ BC01CA7814E7620600967264 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BC01CA7B14E7620600967264 /* Build configuration list for PBXProject "MultiViewFilterExample" */; @@ -250,6 +253,7 @@ files = ( BC01CA9014E7620600967264 /* InfoPlist.strings in Resources */, BC3145C814E76BA700824EA0 /* Shader1.fsh in Resources */, + E5066F471855A86D008C7682 /* Default-568h@2x.png in Resources */, BC3145C914E76BA700824EA0 /* Shader2.fsh in Resources */, BCB3C40616BCA69F003D26B0 /* Icon-72.png in Resources */, BCB3C40716BCA69F003D26B0 /* Icon-72@2x.png in Resources */, @@ -298,7 +302,12 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -312,11 +321,16 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-fobjc-arc"; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; @@ -328,15 +342,24 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; diff --git a/examples/iOS/RawDataTest/Default-568h@2x.png b/examples/iOS/RawDataTest/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/RawDataTest/RawDataTest.xcodeproj/project.pbxproj b/examples/iOS/RawDataTest/RawDataTest.xcodeproj/project.pbxproj index 20d91ce04..bd6ca906a 100644 --- a/examples/iOS/RawDataTest/RawDataTest.xcodeproj/project.pbxproj +++ b/examples/iOS/RawDataTest/RawDataTest.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ BCF1E6241569D42A006B155F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1E6221569D42A006B155F /* QuartzCore.framework */; }; BCF1E63F156AAB4E006B155F /* CalculationShader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = BCF1E63E156AAB4E006B155F /* CalculationShader.fsh */; }; BCF8671D1725A63600912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867181725A62900912E34 /* libGPUImage.a */; }; + E5066F4C1855A96B008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F4B1855A96B008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -74,6 +75,7 @@ BCF1E6221569D42A006B155F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BCF1E6251569D453006B155F /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BCF1E63E156AAB4E006B155F /* CalculationShader.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = CalculationShader.fsh; sourceTree = ""; }; + E5066F4B1855A96B008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -99,6 +101,7 @@ BCF1E5F71569D372006B155F = { isa = PBXGroup; children = ( + E5066F4B1855A96B008C7682 /* Default-568h@2x.png */, BCF1E60C1569D372006B155F /* RawDataTest */, BCF1E6051569D372006B155F /* Frameworks */, BCF1E6031569D372006B155F /* Products */, @@ -193,7 +196,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = RawDataTest; - LastUpgradeCheck = 0430; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BCF1E5FC1569D372006B155F /* Build configuration list for PBXProject "RawDataTest" */; @@ -246,6 +249,7 @@ BCB3C41116BCA74F003D26B0 /* Icon-72.png in Resources */, BCB3C41216BCA74F003D26B0 /* Icon-72@2x.png in Resources */, BCB3C41316BCA74F003D26B0 /* Icon@2x.png in Resources */, + E5066F4C1855A96B008C7682 /* Default-568h@2x.png in Resources */, BCB3C41816BCA75A003D26B0 /* Icon.png in Resources */, BCB3C41916BCA75A003D26B0 /* iTunesArtwork.png in Resources */, ); @@ -289,8 +293,13 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -302,11 +311,15 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -316,14 +329,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.1; diff --git a/examples/iOS/SimpleImageFilter/Default-568h@2x.png b/examples/iOS/SimpleImageFilter/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj b/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj index 1fec12af7..fdb88705b 100755 --- a/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ BCB5E86314E6F05A00701302 /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E86214E6F05A00701302 /* WID-small.jpg */; }; BCB5E86514E6F1D700701302 /* Lambeau.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E86414E6F1D700701302 /* Lambeau.jpg */; }; BCF8672A1725A6B400912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867251725A69A00912E34 /* libGPUImage.a */; }; + E5066F511855A9F2008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F501855A9F2008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -79,6 +80,7 @@ BCB5E82214E62A3C00701302 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BCB5E86214E6F05A00701302 /* WID-small.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "WID-small.jpg"; sourceTree = ""; }; BCB5E86414E6F1D700701302 /* Lambeau.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Lambeau.jpg; sourceTree = ""; }; + E5066F501855A9F2008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -104,6 +106,7 @@ BCB5E7DD14E605A900701302 = { isa = PBXGroup; children = ( + E5066F501855A9F2008C7682 /* Default-568h@2x.png */, BCB5E7F214E605A900701302 /* SimpleImageFilter */, BCB5E7EB14E605A900701302 /* Frameworks */, BCB5E7E914E605A900701302 /* Products */, @@ -200,7 +203,7 @@ BCB5E7DF14E605A900701302 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BCB5E7E214E605A900701302 /* Build configuration list for PBXProject "SimpleImageFilter" */; @@ -250,6 +253,7 @@ files = ( BCB5E7F714E605A900701302 /* InfoPlist.strings in Resources */, BCB5E86314E6F05A00701302 /* WID-small.jpg in Resources */, + E5066F511855A9F2008C7682 /* Default-568h@2x.png in Resources */, BCB5E86514E6F1D700701302 /* Lambeau.jpg in Resources */, BCB3C42016BCA7B7003D26B0 /* Icon-72.png in Resources */, BCB3C42116BCA7B7003D26B0 /* Icon-72@2x.png in Resources */, @@ -298,8 +302,13 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -311,11 +320,16 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -326,14 +340,23 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; diff --git a/examples/iOS/SimplePhotoFilter/Default-568h@2x.png b/examples/iOS/SimplePhotoFilter/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index 78ef8ad36..102dfbf4b 100755 --- a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ BCC1E6D01523E4780006EFA5 /* PhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E6CF1523E4780006EFA5 /* PhotoViewController.m */; }; BCC1E6DA1523E9DC0006EFA5 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6D91523E9DB0006EFA5 /* AVFoundation.framework */; }; BCF867371725A72000912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867321725A70500912E34 /* libGPUImage.a */; }; + E5066F561855AA1A008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F551855AA1A008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -77,6 +78,7 @@ BCC1E6CE1523E4780006EFA5 /* PhotoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoViewController.h; sourceTree = ""; }; BCC1E6CF1523E4780006EFA5 /* PhotoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoViewController.m; sourceTree = ""; }; BCC1E6D91523E9DB0006EFA5 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + E5066F551855AA1A008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -103,6 +105,7 @@ BCC1E6911523E3620006EFA5 = { isa = PBXGroup; children = ( + E5066F551855AA1A008C7682 /* Default-568h@2x.png */, BCC1E6A61523E3620006EFA5 /* SimplePhotoFilter */, BCC1E69F1523E3620006EFA5 /* Frameworks */, BCC1E69D1523E3620006EFA5 /* Products */, @@ -199,7 +202,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = Showcase; - LastUpgradeCheck = 0430; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BCC1E6961523E3620006EFA5 /* Build configuration list for PBXProject "SimplePhotoFilter" */; @@ -252,6 +255,7 @@ BCB3C42E16BCA81D003D26B0 /* Icon-72@2x.png in Resources */, BCB3C42F16BCA81D003D26B0 /* Icon.png in Resources */, BCB3C43016BCA81D003D26B0 /* Icon@2x.png in Resources */, + E5066F561855AA1A008C7682 /* Default-568h@2x.png in Resources */, BCB3C43116BCA81D003D26B0 /* iTunesArtwork.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -295,8 +299,13 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -308,11 +317,15 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -322,14 +335,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; diff --git a/examples/iOS/SimpleVideoFileFilter/Default-568h@2x.png b/examples/iOS/SimpleVideoFileFilter/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj index d9a63428b..ef4b7f9c5 100755 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj @@ -28,6 +28,7 @@ BCB5DDFF14E87783000AF3C2 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFE14E87783000AF3C2 /* QuartzCore.framework */; }; BCB5DE0114E87789000AF3C2 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DE0014E87789000AF3C2 /* OpenGLES.framework */; }; BCF867441725AAA300912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8673F1725AA7E00912E34 /* libGPUImage.a */; }; + E5066F5C1855AC55008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F5B1855AC55008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -81,6 +82,7 @@ BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; BCB5DDFE14E87783000AF3C2 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BCB5DE0014E87789000AF3C2 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + E5066F5B1855AC55008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -106,6 +108,7 @@ BCB5DDBF14E86899000AF3C2 = { isa = PBXGroup; children = ( + E5066F5B1855AC55008C7682 /* Default-568h@2x.png */, BCB5DDD414E86899000AF3C2 /* SimpleVideoFileFilter */, BCB5DDCD14E86899000AF3C2 /* Frameworks */, BCB5DDCB14E86899000AF3C2 /* Products */, @@ -203,7 +206,7 @@ BCB5DDC114E86899000AF3C2 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BCB5DDC414E86899000AF3C2 /* Build configuration list for PBXProject "SimpleVideoFileFilter" */; @@ -254,6 +257,7 @@ BCB5DDD914E86899000AF3C2 /* InfoPlist.strings in Resources */, BCB5DDE914E868C0000AF3C2 /* SimpleVideoFileFilterViewController.xib in Resources */, 466AE00B14F2A196004FE0E5 /* sample_iPod.m4v in Resources */, + E5066F5C1855AC55008C7682 /* Default-568h@2x.png in Resources */, BC11C28315BCBE2300E5BEC7 /* WID-small.jpg in Resources */, BCB3C43A16BCA871003D26B0 /* Icon-72.png in Resources */, BCB3C43B16BCA871003D26B0 /* Icon-72@2x.png in Resources */, @@ -302,7 +306,12 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -314,11 +323,16 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( "-ObjC", "-fobjc-arc", @@ -332,13 +346,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; diff --git a/examples/iOS/SimpleVideoFilter/Default-568h@2x.png b/examples/iOS/SimpleVideoFilter/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj index 240f1461c..e2540da11 100755 --- a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ BCB5DDFF14E87783000AF3C2 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DDFE14E87783000AF3C2 /* QuartzCore.framework */; }; BCB5DE0114E87789000AF3C2 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5DE0014E87789000AF3C2 /* OpenGLES.framework */; }; BCF867511725AB5300912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF8674C1725AB2100912E34 /* libGPUImage.a */; }; + E5066F611855AC78008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F601855AC78008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -77,6 +78,7 @@ BCB5DDFB14E876ED000AF3C2 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; BCB5DDFE14E87783000AF3C2 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BCB5DE0014E87789000AF3C2 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + E5066F601855AC78008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -102,6 +104,7 @@ BCB5DDBF14E86899000AF3C2 = { isa = PBXGroup; children = ( + E5066F601855AC78008C7682 /* Default-568h@2x.png */, BCB5DDD414E86899000AF3C2 /* SimpleVideoFilter */, BCB5DDCD14E86899000AF3C2 /* Frameworks */, BCB5DDCB14E86899000AF3C2 /* Products */, @@ -197,7 +200,7 @@ BCB5DDC114E86899000AF3C2 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BCB5DDC414E86899000AF3C2 /* Build configuration list for PBXProject "SimpleVideoFilter" */; @@ -250,6 +253,7 @@ BCB3C44716BCA8C4003D26B0 /* Icon-72.png in Resources */, BCB3C44816BCA8C4003D26B0 /* Icon-72@2x.png in Resources */, BCB3C44916BCA8C4003D26B0 /* Icon.png in Resources */, + E5066F611855AC78008C7682 /* Default-568h@2x.png in Resources */, BCB3C44A16BCA8C4003D26B0 /* Icon@2x.png in Resources */, BCB3C44B16BCA8C4003D26B0 /* iTunesArtwork.png in Resources */, ); @@ -294,7 +298,12 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -306,11 +315,16 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( "-ObjC", "-fobjc-arc", @@ -324,13 +338,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../../framework/**"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; From 5677fe09a7a09a26934588c3420a00974207a6c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 16:47:33 +0900 Subject: [PATCH 487/695] ES2Renderer: Remove unused variables --- examples/iOS/CubeExample/Classes/ES2Renderer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/iOS/CubeExample/Classes/ES2Renderer.h b/examples/iOS/CubeExample/Classes/ES2Renderer.h index e264914ee..03da2b3f4 100755 --- a/examples/iOS/CubeExample/Classes/ES2Renderer.h +++ b/examples/iOS/CubeExample/Classes/ES2Renderer.h @@ -19,14 +19,14 @@ GLint backingHeight; // The OpenGL ES names for the framebuffer and renderbuffer used to render to this view - GLuint defaultFramebuffer, colorRenderbuffer, depthBuffer; + GLuint defaultFramebuffer, colorRenderbuffer; CATransform3D currentCalculatedMatrix; GLuint program; GPUImageVideoCamera *videoCamera; - GPUImageFilter *inputFilter, *outputFilter; + GPUImageFilter *inputFilter; GPUImageTextureOutput *textureOutput; } From ad0fb9f3f70111728d100645e21b05590ecd6e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 16:47:56 +0900 Subject: [PATCH 488/695] Remove unexistent library path --- .../MultiViewFilterExample.xcodeproj/project.pbxproj | 8 -------- 1 file changed, 8 deletions(-) diff --git a/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj index 5c2935a3d..a4d212eb8 100755 --- a/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj +++ b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj @@ -379,10 +379,6 @@ GCC_PREFIX_HEADER = "MultiViewFilterExample/MultiViewFilterExample-Prefix.pch"; INFOPLIST_FILE = "MultiViewFilterExample/MultiViewFilterExample-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc\"", - ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -395,10 +391,6 @@ GCC_PREFIX_HEADER = "MultiViewFilterExample/MultiViewFilterExample-Prefix.pch"; INFOPLIST_FILE = "MultiViewFilterExample/MultiViewFilterExample-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 4.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc\"", - ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; From ae6337068d981d7c89e69668b73e5202a1ec58f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 16:48:28 +0900 Subject: [PATCH 489/695] Fix "Unsupported Configuration - NSOpenGLView in One Shot memory enabled window" warning --- .../en.lproj/SLSDocument.xib | 98 +++++++++++++++++-- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib index a089258b9..99b5a7a22 100644 --- a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib @@ -3,12 +3,12 @@ 1070 13A598 - 4510 + 4514 1265 695.00 com.apple.InterfaceBuilder.CocoaPlugin - 4510 + 4514 IBNSLayoutConstraint @@ -37,14 +37,14 @@ 15 2 {{133, 235}, {507, 413}} - 1886912512 + 1618477056 Window NSWindow View {94, 86} - + 256 @@ -52,6 +52,7 @@ 268 {{0, 54}, {507, 359}} + _NS:24 @@ -63,8 +64,10 @@ 268 - {{18, 18}, {471, 20}} + {{18, 18}, {471, 21}} + + _NS:9 YES @@ -86,9 +89,11 @@ {507, 413} + + - {{0, 0}, {1440, 878}} + {{0, 0}, {2560, 1418}} {94, 108} {10000000000000, 10000000000000} YES @@ -404,6 +409,87 @@ ./Classes/GPUImageView.h + + NSDocument + + id + id + id + id + id + id + id + id + id + id + id + id + id + id + + + + browseDocumentVersions: + id + + + duplicateDocument: + id + + + lockDocument: + id + + + moveDocument: + id + + + moveDocumentToUbiquityContainer: + id + + + printDocument: + id + + + renameDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + saveDocumentToPDF: + id + + + unlockDocument: + id + + + + IBProjectSource + ./Classes/NSDocument.h + + NSLayoutConstraint NSObject From 62d2a9f25d30d3dadac0d69a0e92eab8517c382a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 16:49:08 +0900 Subject: [PATCH 490/695] Fix memory leaks and blocks' circular retentions --- .../ColorTrackingViewController.m | 38 +++++++++---------- .../Classes/DisplayViewController.m | 2 +- .../FeatureExtractionAppDelegate.m | 7 ++-- .../MultiViewViewController.m | 8 ++-- .../RawDataTest/RawDataTestAppDelegate.m | 5 ++- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index 2c1fa6eef..ec328d47f 100755 --- a/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -69,12 +69,12 @@ - (void)configureVideoFiltering; positionRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize resultsInBGRAFormat:YES]; __unsafe_unretained ColorTrackingViewController *weakSelf = self; [positionRawData setNewFrameAvailableBlock:^{ - GLubyte *bytesForPositionData = positionRawData.rawBytesForImage; - CGPoint currentTrackingLocation = [weakSelf centroidFromTexture:bytesForPositionData ofSize:[positionRawData maximumOutputSize]]; + GLubyte *bytesForPositionData = weakSelf->positionRawData.rawBytesForImage; + CGPoint currentTrackingLocation = [weakSelf centroidFromTexture:bytesForPositionData ofSize:[weakSelf->positionRawData maximumOutputSize]]; // NSLog(@"Centroid from CPU: %f, %f", currentTrackingLocation.x, currentTrackingLocation.y); CGSize currentViewSize = weakSelf.view.bounds.size; dispatch_async(dispatch_get_main_queue(), ^{ - trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); + weakSelf->trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); }); }]; @@ -86,38 +86,38 @@ - (void)configureVideoFiltering; // NSLog(@"Average color: %f, %f, %f, %f", redComponent, greenComponent, blueComponent, alphaComponent); CGSize currentViewSize = weakSelf.view.bounds.size; dispatch_async(dispatch_get_main_queue(), ^{ - trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); + weakSelf->trackingDot.position = CGPointMake(currentTrackingLocation.x * currentViewSize.width, currentTrackingLocation.y * currentViewSize.height); }); }]; videoRawData = [[GPUImageRawDataOutput alloc] initWithImageSize:videoPixelSize resultsInBGRAFormat:YES]; [videoRawData setNewFrameAvailableBlock:^{ - if (shouldReplaceThresholdColor) + if (weakSelf->shouldReplaceThresholdColor) { - CGSize currentViewSize = self.view.bounds.size; - CGSize rawPixelsSize = [videoRawData maximumOutputSize]; + CGSize currentViewSize = weakSelf.view.bounds.size; + CGSize rawPixelsSize = [weakSelf->videoRawData maximumOutputSize]; CGPoint scaledTouchPoint; - scaledTouchPoint.x = (currentTouchPoint.x / currentViewSize.width) * rawPixelsSize.width; - scaledTouchPoint.y = (currentTouchPoint.y / currentViewSize.height) * rawPixelsSize.height; + scaledTouchPoint.x = (weakSelf->currentTouchPoint.x / currentViewSize.width) * rawPixelsSize.width; + scaledTouchPoint.y = (weakSelf->currentTouchPoint.y / currentViewSize.height) * rawPixelsSize.height; - GPUByteColorVector colorAtTouchPoint = [videoRawData colorAtLocation:scaledTouchPoint]; + GPUByteColorVector colorAtTouchPoint = [weakSelf->videoRawData colorAtLocation:scaledTouchPoint]; - thresholdColor.one = (float)colorAtTouchPoint.red / 255.0; - thresholdColor.two = (float)colorAtTouchPoint.green / 255.0; - thresholdColor.three = (float)colorAtTouchPoint.blue / 255.0; + weakSelf->thresholdColor.one = (float)colorAtTouchPoint.red / 255.0; + weakSelf->thresholdColor.two = (float)colorAtTouchPoint.green / 255.0; + weakSelf->thresholdColor.three = (float)colorAtTouchPoint.blue / 255.0; // NSLog(@"Color at touch point: %d, %d, %d, %d", colorAtTouchPoint.red, colorAtTouchPoint.green, colorAtTouchPoint.blue, colorAtTouchPoint.alpha); - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor.one forKey:@"thresholdColorR"]; - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor.two forKey:@"thresholdColorG"]; - [[NSUserDefaults standardUserDefaults] setFloat:thresholdColor.three forKey:@"thresholdColorB"]; + [[NSUserDefaults standardUserDefaults] setFloat:weakSelf->thresholdColor.one forKey:@"thresholdColorR"]; + [[NSUserDefaults standardUserDefaults] setFloat:weakSelf->thresholdColor.two forKey:@"thresholdColorG"]; + [[NSUserDefaults standardUserDefaults] setFloat:weakSelf->thresholdColor.three forKey:@"thresholdColorB"]; - [thresholdFilter setFloatVec3:thresholdColor forUniformName:@"inputColor"]; - [positionFilter setFloatVec3:thresholdColor forUniformName:@"inputColor"]; + [weakSelf->thresholdFilter setFloatVec3:weakSelf->thresholdColor forUniformName:@"inputColor"]; + [weakSelf->positionFilter setFloatVec3:weakSelf->thresholdColor forUniformName:@"inputColor"]; - shouldReplaceThresholdColor = NO; + weakSelf->shouldReplaceThresholdColor = NO; } }]; diff --git a/examples/iOS/CubeExample/Classes/DisplayViewController.m b/examples/iOS/CubeExample/Classes/DisplayViewController.m index ffc82368c..d38bb34f0 100755 --- a/examples/iOS/CubeExample/Classes/DisplayViewController.m +++ b/examples/iOS/CubeExample/Classes/DisplayViewController.m @@ -27,7 +27,7 @@ - (void)dealloc - (void)loadView { CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame]; - GPUImageView *primaryView = [[GPUImageView alloc] initWithFrame:mainScreenFrame]; + GPUImageView *primaryView = [[[GPUImageView alloc] initWithFrame:mainScreenFrame] autorelease]; self.view = primaryView; renderer = [[ES2Renderer alloc] initWithSize:[primaryView sizeInPixels]]; diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index ee3437ef6..c5cc4244e 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -170,6 +170,7 @@ - (void)testHoughTransform:(GPUImageHoughTransformLineDetector *)lineDetector of [pictureInput removeAllTargets]; [pictureInput addTarget:lineDetector]; + __unsafe_unretained GPUImageHoughTransformLineDetector * weakDetector = lineDetector; [lineDetector setLinesDetectedBlock:^(GLfloat* lineArray, NSUInteger linesDetected, CMTime frameTime){ NSLog(@"Number of lines: %d", linesDetected); @@ -191,7 +192,7 @@ - (void)testHoughTransform:(GPUImageHoughTransformLineDetector *)lineDetector of dispatch_async(dispatch_get_main_queue(), ^{ NSUInteger currentImageIndex = 0; - for (UIImage *currentImage in lineDetector.intermediateImages) + for (UIImage *currentImage in weakDetector.intermediateImages) { [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%d.png", detectorName, pictureName, currentImageIndex]]; @@ -216,7 +217,7 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector [pictureInput addTarget:cornerDetector]; - + __unsafe_unretained GPUImageHarrisCornerDetectionFilter * weakDetector = cornerDetector; [cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) { GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; crosshairGenerator.crosshairWidth = 10.0; @@ -237,7 +238,7 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector dispatch_async(dispatch_get_main_queue(), ^{ NSUInteger currentImageIndex = 0; - for (UIImage *currentImage in cornerDetector.intermediateImages) + for (UIImage *currentImage in weakDetector.intermediateImages) { [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%d.png", detectorName, pictureName, currentImageIndex]]; diff --git a/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m index ddd1669aa..1d9da5673 100755 --- a/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m +++ b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m @@ -20,7 +20,7 @@ - (void)didReceiveMemoryWarning - (void)loadView { CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame]; - UIView *primaryView = [[UIView alloc] initWithFrame:mainScreenFrame]; + UIView *primaryView = [[[UIView alloc] initWithFrame:mainScreenFrame] autorelease]; primaryView.backgroundColor = [UIColor blueColor]; self.view = primaryView; @@ -38,9 +38,9 @@ - (void)loadView [self.view addSubview:view3]; [self.view addSubview:view4]; - GPUImageFilter *filter1 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader1"]; - GPUImageFilter *filter2 = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader2"]; - GPUImageSepiaFilter *filter3 = [[GPUImageSepiaFilter alloc] init]; + GPUImageFilter *filter1 = [[[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader1"] autorelease]; + GPUImageFilter *filter2 = [[[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"Shader2"] autorelease]; + GPUImageSepiaFilter *filter3 = [[[GPUImageSepiaFilter alloc] init] autorelease]; // GPUImageBrightnessFilter *filter1 = [[GPUImageBrightnessFilter alloc] init]; // GPUImageBrightnessFilter *filter2 = [[GPUImageBrightnessFilter alloc] init]; diff --git a/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m b/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m index 68a99d555..3a9fbc682 100644 --- a/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m +++ b/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m @@ -30,9 +30,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [rawDataInput addTarget:customFilter]; [customFilter addTarget:rawDataOutput]; + __unsafe_unretained GPUImageRawDataOutput * weakOutput = rawDataOutput; [rawDataOutput setNewFrameAvailableBlock:^{ - GLubyte *outputBytes = [rawDataOutput rawBytesForImage]; - NSInteger bytesPerRow = [rawDataOutput bytesPerRowInOutput]; + GLubyte *outputBytes = [weakOutput rawBytesForImage]; + NSInteger bytesPerRow = [weakOutput bytesPerRowInOutput]; NSLog(@"Bytes per row: %d", bytesPerRow); for (unsigned int yIndex = 0; yIndex < 10; yIndex++) { From 409a423b2a0384fede499376c361bb5b59ced962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 16:52:34 +0900 Subject: [PATCH 491/695] Add Travis configuration --- .travis.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..3884ec156 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,27 @@ + +language: objective-c + +before_install: + - gem install cocoapods --quiet + - pod --version + - pod setup + - pod repo update --silent + +script: + - pod lib lint + - xctool -project framework/GPUImage.xcodeproj -scheme 'GPUImage' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project framework/GPUImageMac.xcodeproj -scheme 'GPUImageMac' + - xctool -project examples/Mac/FilterShowcase/FilterShowcase.xcodeproj -scheme 'FilterShowcase' + - xctool -project examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj -scheme 'MultiViewFilterExample' + - xctool -project examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj -scheme 'SimplePhotoFilter' + - xctool -project examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj -scheme 'BenchmarkSuite' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj -scheme 'ColorObjectTracking' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/CubeExample/CubeExample.xcodeproj -scheme 'CubeExample' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj -scheme 'FeatureExtractionTest' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/FilterShowcase/FilterShowcase.xcodeproj -scheme 'FilterShowcase' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj -scheme 'MultiViewFilterExample' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/RawDataTest/RawDataTest.xcodeproj -scheme 'RawDataTest' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj -scheme 'SimpleImageFilter' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj -scheme 'SimplePhotoFilter' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj -scheme 'SimpleVideoFileFilter' -configuration Release -sdk iphonesimulator -arch i386 build + - xctool -project examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj -scheme 'SimpleVideoFilter' -configuration Release -sdk iphonesimulator -arch i386 build From 31a90c2bf7d68f6217df94a29c818c1492f6ac87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 17:00:13 +0900 Subject: [PATCH 492/695] Share demo schemes to enable Travis --- .../xcschemes/FilterShowcase.xcscheme | 86 +++++++++++++++++++ .../xcschemes/MultiViewFilterExample.xcscheme | 86 +++++++++++++++++++ .../xcschemes/SimplePhotoFilter.xcscheme | 86 +++++++++++++++++++ .../xcschemes/BenchmarkSuite.xcscheme | 86 +++++++++++++++++++ .../xcschemes/ColorObjectTracking.xcscheme | 86 +++++++++++++++++++ .../xcschemes/CubeExample.xcscheme | 86 +++++++++++++++++++ .../xcschemes/FeatureExtractionTest.xcscheme | 86 +++++++++++++++++++ .../xcschemes/FilterShowcase.xcscheme | 86 +++++++++++++++++++ .../xcschemes/MultiViewFilterExample.xcscheme | 86 +++++++++++++++++++ .../xcschemes/RawDataTest.xcscheme | 86 +++++++++++++++++++ .../xcschemes/SimpleImageFilter.xcscheme | 86 +++++++++++++++++++ .../xcschemes/SimplePhotoFilter.xcscheme | 86 +++++++++++++++++++ .../xcschemes/SimpleVideoFileFilter.xcscheme | 86 +++++++++++++++++++ .../xcschemes/SimpleVideoFilter.xcscheme | 86 +++++++++++++++++++ .../xcschemes/Documentation.xcscheme | 59 +++++++++++++ .../xcshareddata/xcschemes/GPUImage.xcscheme | 69 +++++++++++++++ .../xcshareddata/xcschemes/GPUImage.xcscheme | 59 +++++++++++++ 17 files changed, 1391 insertions(+) create mode 100644 examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme create mode 100644 examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme create mode 100644 examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme create mode 100644 examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/xcshareddata/xcschemes/BenchmarkSuite.xcscheme create mode 100644 examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/xcshareddata/xcschemes/ColorObjectTracking.xcscheme create mode 100644 examples/iOS/CubeExample/CubeExample.xcodeproj/xcshareddata/xcschemes/CubeExample.xcscheme create mode 100644 examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/xcshareddata/xcschemes/FeatureExtractionTest.xcscheme create mode 100644 examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme create mode 100644 examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme create mode 100644 examples/iOS/RawDataTest/RawDataTest.xcodeproj/xcshareddata/xcschemes/RawDataTest.xcscheme create mode 100644 examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/xcshareddata/xcschemes/SimpleImageFilter.xcscheme create mode 100644 examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme create mode 100644 examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFileFilter.xcscheme create mode 100644 examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFilter.xcscheme create mode 100644 framework/GPUImage.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme create mode 100644 framework/GPUImage.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme create mode 100644 framework/GPUImageMac.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme new file mode 100644 index 000000000..c62f8e9e0 --- /dev/null +++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme new file mode 100644 index 000000000..89660a933 --- /dev/null +++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme new file mode 100644 index 000000000..d83640cf6 --- /dev/null +++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/xcshareddata/xcschemes/BenchmarkSuite.xcscheme b/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/xcshareddata/xcschemes/BenchmarkSuite.xcscheme new file mode 100644 index 000000000..5127fc0f1 --- /dev/null +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/xcshareddata/xcschemes/BenchmarkSuite.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/xcshareddata/xcschemes/ColorObjectTracking.xcscheme b/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/xcshareddata/xcschemes/ColorObjectTracking.xcscheme new file mode 100644 index 000000000..aa81bd674 --- /dev/null +++ b/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/xcshareddata/xcschemes/ColorObjectTracking.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/CubeExample/CubeExample.xcodeproj/xcshareddata/xcschemes/CubeExample.xcscheme b/examples/iOS/CubeExample/CubeExample.xcodeproj/xcshareddata/xcschemes/CubeExample.xcscheme new file mode 100644 index 000000000..76272731a --- /dev/null +++ b/examples/iOS/CubeExample/CubeExample.xcodeproj/xcshareddata/xcschemes/CubeExample.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/xcshareddata/xcschemes/FeatureExtractionTest.xcscheme b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/xcshareddata/xcschemes/FeatureExtractionTest.xcscheme new file mode 100644 index 000000000..0736424c7 --- /dev/null +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest.xcodeproj/xcshareddata/xcschemes/FeatureExtractionTest.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme new file mode 100644 index 000000000..0f23fff85 --- /dev/null +++ b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme new file mode 100644 index 000000000..04a0ac996 --- /dev/null +++ b/examples/iOS/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/RawDataTest/RawDataTest.xcodeproj/xcshareddata/xcschemes/RawDataTest.xcscheme b/examples/iOS/RawDataTest/RawDataTest.xcodeproj/xcshareddata/xcschemes/RawDataTest.xcscheme new file mode 100644 index 000000000..b3250a360 --- /dev/null +++ b/examples/iOS/RawDataTest/RawDataTest.xcodeproj/xcshareddata/xcschemes/RawDataTest.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/xcshareddata/xcschemes/SimpleImageFilter.xcscheme b/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/xcshareddata/xcschemes/SimpleImageFilter.xcscheme new file mode 100644 index 000000000..ee830db09 --- /dev/null +++ b/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/xcshareddata/xcschemes/SimpleImageFilter.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme new file mode 100644 index 000000000..7ec9c73bf --- /dev/null +++ b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFileFilter.xcscheme b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFileFilter.xcscheme new file mode 100644 index 000000000..8eed28a29 --- /dev/null +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFileFilter.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFilter.xcscheme b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFilter.xcscheme new file mode 100644 index 000000000..57ce194c0 --- /dev/null +++ b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFilter.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme b/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme new file mode 100644 index 000000000..4578f7c0f --- /dev/null +++ b/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme b/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme new file mode 100644 index 000000000..d2d2f6b86 --- /dev/null +++ b/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/GPUImageMac.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme b/framework/GPUImageMac.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme new file mode 100644 index 000000000..57e15105a --- /dev/null +++ b/framework/GPUImageMac.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From 10b01982ac06f003baa45ad8a2b50d2a2f23efa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 17:02:34 +0900 Subject: [PATCH 493/695] Disable `pod lib lint` for now (broken as of CocoaPods 0.28.0) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3884ec156..0b7db4e74 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ before_install: - pod repo update --silent script: - - pod lib lint + #- pod lib lint - xctool -project framework/GPUImage.xcodeproj -scheme 'GPUImage' -configuration Release -sdk iphonesimulator -arch i386 build - xctool -project framework/GPUImageMac.xcodeproj -scheme 'GPUImageMac' - xctool -project examples/Mac/FilterShowcase/FilterShowcase.xcodeproj -scheme 'FilterShowcase' From 0a1e73bc9a4b7d333701cac1c8371902ff951f8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 9 Dec 2013 17:16:39 +0900 Subject: [PATCH 494/695] Fix scheme name --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0b7db4e74..b0e340100 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ before_install: script: #- pod lib lint - xctool -project framework/GPUImage.xcodeproj -scheme 'GPUImage' -configuration Release -sdk iphonesimulator -arch i386 build - - xctool -project framework/GPUImageMac.xcodeproj -scheme 'GPUImageMac' + - xctool -project framework/GPUImageMac.xcodeproj -scheme 'GPUImage' - xctool -project examples/Mac/FilterShowcase/FilterShowcase.xcodeproj -scheme 'FilterShowcase' - xctool -project examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj -scheme 'MultiViewFilterExample' - xctool -project examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj -scheme 'SimplePhotoFilter' From 41bd71149e86634e79187646b0e53c083f27050d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 9 Dec 2013 13:01:49 -0600 Subject: [PATCH 495/695] Added a simple fallback to use the passthrough shader when a Gaussian blur is given a 0 pixel radius. --- .../ShowcaseFilterViewController.m | 2 +- framework/Source/GPUImageBoxBlurFilter.m | 4 ++-- framework/Source/GPUImageGaussianBlurFilter.m | 20 +++++++++++++++---- ...PUImageSingleComponentGaussianBlurFilter.m | 10 ++++++---- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 384a91f33..92e9594e7 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1149,7 +1149,7 @@ - (void)setupFilter; self.title = @"Gaussian Blur"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:1.0]; + [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:24.0]; [self.filterSettingsSlider setValue:2.0]; diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index 02c420509..2bae66ed5 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -49,9 +49,9 @@ void main()\n\ + (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { - if (blurRadius == 0) + if (blurRadius < 1) { - return nil; + return kGPUImagePassthroughFragmentShaderString; } NSUInteger numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), 7); diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index a671f1a55..bee907f16 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -40,6 +40,11 @@ - (id)init; + (NSString *)vertexShaderForStandardBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { + if (blurRadius < 1) + { + return kGPUImageVertexShaderString; + } + // NSLog(@"Max varyings: %d", [GPUImageContext maximumVaryingVectorsForThisDevice]); NSMutableString *shaderString = [[NSMutableString alloc] init]; @@ -85,6 +90,11 @@ void main()\n\ + (NSString *)fragmentShaderForStandardBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { + if (blurRadius < 1) + { + return kGPUImagePassthroughFragmentShaderString; + } + // First, generate the normal Gaussian weights for a given sigma GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); GLfloat sumOfWeights = 0.0; @@ -157,10 +167,11 @@ void main()\n\ + (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { - if (blurRadius == 0) + if (blurRadius < 1) { - return nil; + return kGPUImageVertexShaderString; } + // First, generate the normal Gaussian weights for a given sigma GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); GLfloat sumOfWeights = 0.0; @@ -234,10 +245,11 @@ void main()\n\ + (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { - if (blurRadius == 0) + if (blurRadius < 1) { - return nil; + return kGPUImagePassthroughFragmentShaderString; } + // First, generate the normal Gaussian weights for a given sigma GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); GLfloat sumOfWeights = 0.0; diff --git a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m index 67d82cb63..4ff0d91da 100644 --- a/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m +++ b/framework/Source/GPUImageSingleComponentGaussianBlurFilter.m @@ -4,10 +4,11 @@ @implementation GPUImageSingleComponentGaussianBlurFilter + (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { - if (blurRadius == 0) + if (blurRadius < 1) { - return nil; + return kGPUImageVertexShaderString; } + // First, generate the normal Gaussian weights for a given sigma GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); GLfloat sumOfWeights = 0.0; @@ -81,10 +82,11 @@ void main()\n\ + (NSString *)fragmentShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { - if (blurRadius == 0) + if (blurRadius < 1) { - return nil; + return kGPUImagePassthroughFragmentShaderString; } + // First, generate the normal Gaussian weights for a given sigma GLfloat *standardGaussianWeights = calloc(blurRadius + 1, sizeof(GLfloat)); GLfloat sumOfWeights = 0.0; From 872a022e4d033c7698c3c4a2cf99a9b1c0f1186a Mon Sep 17 00:00:00 2001 From: lyleyang Date: Fri, 3 Jan 2014 14:01:08 +0800 Subject: [PATCH 496/695] GPUImageFilterGroup endProcessing --- framework/Source/GPUImageFilterGroup.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 9f4680525..e3df9d43e 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -186,7 +186,7 @@ - (void)endProcessing; { isEndProcessing = YES; - for (id currentTarget in targets) + for (id currentTarget in _initialFilters) { [currentTarget endProcessing]; } From e4ee46d428b1a74d59c7fa1f8d2ffa2b672abff6 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 4 Feb 2014 11:15:09 -0800 Subject: [PATCH 497/695] Add OS X support to Podspec. --- GPUImage.podspec | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/GPUImage.podspec b/GPUImage.podspec index 239c6aadf..43c9a41ba 100644 --- a/GPUImage.podspec +++ b/GPUImage.podspec @@ -2,15 +2,26 @@ Pod::Spec.new do |s| s.name = 'GPUImage' s.version = '0.1.2' s.license = 'BSD' - s.platform = :ios, '5.0' s.summary = 'An open source iOS framework for GPU-based image and video processing.' s.homepage = 'https://github.com/BradLarson/GPUImage' s.author = { 'Brad Larson' => 'contact@sunsetlakesoftware.com' } s.source = { :git => 'https://github.com/BradLarson/GPUImage.git', :tag => "#{s.version}" } + s.source_files = 'framework/Source/**/*.{h,m}' s.resources = 'framework/Resources/*.png' - s.osx.exclude_files = 'framework/Source/iOS/**/*.{h,m}' - s.ios.exclude_files = 'framework/Source/Mac/**/*.{h,m}' - s.frameworks = ['OpenGLES', 'CoreVideo', 'CoreMedia', 'QuartzCore', 'AVFoundation'] s.requires_arc = true + s.xcconfig = { 'CLANG_MODULES_AUTOLINK' => 'YES' } + + s.ios.deployment_target = '5.0' + s.ios.exclude_files = 'framework/Source/Mac' + + s.osx.deployment_target = '10.6' + s.osx.exclude_files = 'framework/Source/iOS', + 'framework/Source/GPUImageFilterPipeline.*', + 'framework/Source/GPUImageMovie.*', + 'framework/Source/GPUImageMovieComposition.*', + 'framework/Source/GPUImageVideoCamera.*', + 'framework/Source/GPUImageStillCamera.*', + 'framework/Source/GPUImageUIElement.*' + s.osx.xcconfig = { 'GCC_WARN_ABOUT_RETURN_TYPE' => 'YES' } end \ No newline at end of file From a6d99a826e08ab358136af01e0e5fc85ab7a30b8 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Mon, 10 Feb 2014 15:32:14 -0800 Subject: [PATCH 498/695] Expose accessors for GPUImageiOSBlurFilter rangeReductionFactor --- framework/Source/GPUImageiOSBlurFilter.h | 5 +++++ framework/Source/GPUImageiOSBlurFilter.m | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/framework/Source/GPUImageiOSBlurFilter.h b/framework/Source/GPUImageiOSBlurFilter.h index da1c5661d..261d0d7cb 100644 --- a/framework/Source/GPUImageiOSBlurFilter.h +++ b/framework/Source/GPUImageiOSBlurFilter.h @@ -23,4 +23,9 @@ */ @property (readwrite, nonatomic) CGFloat downsampling; + +/** The degree to reduce the luminance range, from 0.0 to 1.0. Default is 0.6. + */ +@property (readwrite, nonatomic) CGFloat rangeReductionFactor; + @end diff --git a/framework/Source/GPUImageiOSBlurFilter.m b/framework/Source/GPUImageiOSBlurFilter.m index ed31e0d65..185332137 100644 --- a/framework/Source/GPUImageiOSBlurFilter.m +++ b/framework/Source/GPUImageiOSBlurFilter.m @@ -40,6 +40,7 @@ - (id)init; self.blurRadiusInPixels = 12.0; self.saturation = 0.8; self.downsampling = 4.0; + self.rangeReductionFactor = 0.6; return self; } @@ -100,4 +101,14 @@ - (void)setDownsampling:(CGFloat)newValue; _downsampling = newValue; } +- (void)setRangeReductionFactor:(CGFloat)rangeReductionFactor +{ + luminanceRangeFilter.rangeReductionFactor = rangeReductionFactor; +} + +- (CGFloat)rangeReductionFactor +{ + return luminanceRangeFilter.rangeReductionFactor; +} + @end From 1b5d75cabedaafc98d67b095c84d63390acdc8a7 Mon Sep 17 00:00:00 2001 From: n1mda Date: Wed, 26 Feb 2014 15:21:07 +0100 Subject: [PATCH 499/695] Added methods for capturing still photos in specific orientation --- framework/Source/GPUImageStillCamera.h | 3 ++ framework/Source/GPUImageStillCamera.m | 54 ++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/framework/Source/GPUImageStillCamera.h b/framework/Source/GPUImageStillCamera.h index a86d93675..e4db59b2b 100755 --- a/framework/Source/GPUImageStillCamera.h +++ b/framework/Source/GPUImageStillCamera.h @@ -15,7 +15,10 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina // Photography controls - (void)capturePhotoAsSampleBufferWithCompletionHandler:(void (^)(CMSampleBufferRef imageSampleBuffer, NSError *error))block; - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; +- (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withOrientation:(UIImageOrientation)orientation withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block; - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; +- (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withOrientation:(UIImageOrientation)orientation withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; +- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withOrientation:(UIImageOrientation)orientation withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; @end diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 3de6939b0..3aaebc972 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -173,6 +173,19 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) }]; } +- (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withOrientation:(UIImageOrientation)orientation withCompletionHandler:(void (^)(UIImage *processedImage, NSError *error))block { + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + UIImage *filteredPhoto = nil; + + if(!error) { + filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutputWithOrientation:orientation]; + } + dispatch_semaphore_signal(frameRenderingSemaphore); + + block(filteredPhoto, error); + }]; +} + - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedJPEG, NSError *error))block; { // reportAvailableMemoryForGPUImage(@"Before Capture"); @@ -199,6 +212,25 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f }]; } +- (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withOrientation:(UIImageOrientation)orientation withCompletionHandler:(void (^)(NSData *processedImage, NSError *error))block { + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + NSData *dataForJPEGFile = nil; + + if(!error) { + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutputWithOrientation:orientation]; + dispatch_semaphore_signal(frameRenderingSemaphore); + + dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, self.jpegCompressionQuality); + } + } else { + dispatch_semaphore_signal(frameRenderingSemaphore); + } + + block(dataForJPEGFile, error); + }]; +} + - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; { @@ -221,6 +253,28 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi return; } +- (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withOrientation:(UIImageOrientation)orientation withCompletionHandler:(void (^)(NSData *processedPNG, NSError *error))block; +{ + + [self capturePhotoProcessedUpToFilter:finalFilterInChain withImageOnGPUHandler:^(NSError *error) { + NSData *dataForPNGFile = nil; + + if(!error){ + @autoreleasepool { + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutputWithOrientation:orientation]; + dispatch_semaphore_signal(frameRenderingSemaphore); + dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); + } + }else{ + dispatch_semaphore_signal(frameRenderingSemaphore); + } + + block(dataForPNGFile, error); + }]; + + return; +} + #pragma mark - Private Methods - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFilterInChain withImageOnGPUHandler:(void (^)(NSError *error))block From 95cf8102bbac25f9ea2605031a810c60a035be0c Mon Sep 17 00:00:00 2001 From: Charlie Williams Date: Thu, 27 Feb 2014 13:56:48 +0000 Subject: [PATCH 500/695] Check for NaN in colorTracking point to avoid crash when setting phone on desk. --- .../ColorObjectTracking/ColorTrackingViewController.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m index ec328d47f..544ce940b 100755 --- a/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m +++ b/examples/iOS/ColorObjectTracking/ColorObjectTracking/ColorTrackingViewController.m @@ -82,6 +82,10 @@ - (void)configureVideoFiltering; [positionAverageColor setColorAverageProcessingFinishedBlock:^(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime) { // NSLog(@"GPU Average R: %f, G: %f, A: %f", redComponent, greenComponent, alphaComponent); CGPoint currentTrackingLocation = CGPointMake(1.0 - (greenComponent / alphaComponent), (redComponent / alphaComponent)); + if (isnan(currentTrackingLocation.x) || isnan(currentTrackingLocation.y)) { +// NSLog(@"NaN in currentTrackingLocation"); + return; + } // NSLog(@"Centroid from GPU: %f, %f", currentTrackingLocation.x, currentTrackingLocation.y); // NSLog(@"Average color: %f, %f, %f, %f", redComponent, greenComponent, blueComponent, alphaComponent); CGSize currentViewSize = weakSelf.view.bounds.size; From c5b8adaeda06b4f38c758a9ae01fc8c10edfb972 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 4 Mar 2014 22:25:53 -0600 Subject: [PATCH 501/695] Beginning migration to new framebuffer cache system. --- .../FilterShowcase.xcodeproj/project.pbxproj | 11 + framework/GPUImage.xcodeproj/project.pbxproj | 16 ++ framework/Source/GPUImage.h | 2 + framework/Source/GPUImageFilter.m | 31 ++- framework/Source/GPUImageFramebuffer.h | 36 +++ framework/Source/GPUImageFramebuffer.m | 212 ++++++++++++++++++ framework/Source/GPUImageFramebufferCache.h | 13 ++ framework/Source/GPUImageFramebufferCache.m | 131 +++++++++++ framework/Source/GPUImageOutput.h | 13 +- framework/Source/GPUImageOutput.m | 4 +- framework/Source/GPUImageVideoCamera.m | 5 + framework/Source/iOS/GPUImageContext.h | 11 +- framework/Source/iOS/GPUImageContext.m | 37 +++ framework/Source/iOS/GPUImageView.m | 1 + 14 files changed, 498 insertions(+), 25 deletions(-) create mode 100644 framework/Source/GPUImageFramebuffer.h create mode 100644 framework/Source/GPUImageFramebuffer.m create mode 100644 framework/Source/GPUImageFramebufferCache.h create mode 100644 framework/Source/GPUImageFramebufferCache.m diff --git a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 7eb8f6cce..4adb5f111 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -248,6 +248,11 @@ CLASSPREFIX = Showcase; LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Cell Phone"; + TargetAttributes = { + BC982B0114F046AC0001FF6F = { + DevelopmentTeam = J2U2U9GBML; + }; + }; }; buildConfigurationList = BC982AFC14F046AC0001FF6F /* Build configuration list for PBXProject "FilterShowcase" */; compatibilityVersion = "Xcode 3.2"; @@ -424,10 +429,13 @@ BC982B1B14F046AC0001FF6F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "FilterShowcase/FilterShowcase-Prefix.pch"; INFOPLIST_FILE = "FilterShowcase/FilterShowcase-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; WRAPPER_EXTENSION = app; }; name = Debug; @@ -435,10 +443,13 @@ BC982B1C14F046AC0001FF6F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "FilterShowcase/FilterShowcase-Prefix.pch"; INFOPLIST_FILE = "FilterShowcase/FilterShowcase-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; WRAPPER_EXTENSION = app; }; name = Release; diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 765b49931..45c04679f 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -291,6 +291,10 @@ BCC46E5F15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */; }; BCC46E6315BA095F005519B9 /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; }; BCC46E6415BA095F005519B9 /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */; }; + BCC887CC18A1CEEB008DB37D /* GPUImageFramebuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC887CA18A1CEEB008DB37D /* GPUImageFramebuffer.h */; }; + BCC887CD18A1CEEB008DB37D /* GPUImageFramebuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC887CB18A1CEEB008DB37D /* GPUImageFramebuffer.m */; }; + BCC887D018A1D3AD008DB37D /* GPUImageFramebufferCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC887CE18A1D3AD008DB37D /* GPUImageFramebufferCache.h */; }; + BCC887D118A1D3AD008DB37D /* GPUImageFramebufferCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC887CF18A1D3AD008DB37D /* GPUImageFramebufferCache.m */; }; BCC93A1E1501E42F00958B26 /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; }; BCC93A1F1501E42F00958B26 /* GPUImageTwoPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */; }; BCC93A301502A90F00958B26 /* GPUImageFilterPipeline.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D69488A1501F58200206FF8 /* GPUImageFilterPipeline.m */; }; @@ -640,6 +644,10 @@ BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHighlightShadowFilter.m; path = Source/GPUImageHighlightShadowFilter.m; sourceTree = SOURCE_ROOT; }; BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFalseColorFilter.h; path = Source/GPUImageFalseColorFilter.h; sourceTree = SOURCE_ROOT; }; BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFalseColorFilter.m; path = Source/GPUImageFalseColorFilter.m; sourceTree = SOURCE_ROOT; }; + BCC887CA18A1CEEB008DB37D /* GPUImageFramebuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFramebuffer.h; path = Source/GPUImageFramebuffer.h; sourceTree = SOURCE_ROOT; }; + BCC887CB18A1CEEB008DB37D /* GPUImageFramebuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFramebuffer.m; path = Source/GPUImageFramebuffer.m; sourceTree = SOURCE_ROOT; }; + BCC887CE18A1D3AD008DB37D /* GPUImageFramebufferCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFramebufferCache.h; path = Source/GPUImageFramebufferCache.h; sourceTree = SOURCE_ROOT; }; + BCC887CF18A1D3AD008DB37D /* GPUImageFramebufferCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFramebufferCache.m; path = Source/GPUImageFramebufferCache.m; sourceTree = SOURCE_ROOT; }; BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageTwoPassFilter.h; path = Source/GPUImageTwoPassFilter.h; sourceTree = SOURCE_ROOT; }; BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageTwoPassFilter.m; path = Source/GPUImageTwoPassFilter.m; sourceTree = SOURCE_ROOT; }; BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminanceThresholdFilter.h; path = Source/GPUImageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; @@ -1145,6 +1153,10 @@ BCB5E79314E3275200701302 /* GLProgram.m */, BCB5E76A14E20AD700701302 /* GPUImageContext.h */, BCB5E76B14E20AD700701302 /* GPUImageContext.m */, + BCC887CA18A1CEEB008DB37D /* GPUImageFramebuffer.h */, + BCC887CB18A1CEEB008DB37D /* GPUImageFramebuffer.m */, + BCC887CE18A1D3AD008DB37D /* GPUImageFramebufferCache.h */, + BCC887CF18A1D3AD008DB37D /* GPUImageFramebufferCache.m */, BCB5E78114E232BC00701302 /* Sources */, 0D6948871501F56600206FF8 /* Pipeline */, BC245DC314DDBE6B009FE7EB /* Filters */, @@ -1348,6 +1360,8 @@ BCBC605716C8527C00B11741 /* GPUImageZoomBlurFilter.h in Headers */, BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */, BCB030BE173400BC001A1A20 /* GPUImageThreeInputFilter.h in Headers */, + BCC887CC18A1CEEB008DB37D /* GPUImageFramebuffer.h in Headers */, + BCC887D018A1D3AD008DB37D /* GPUImageFramebufferCache.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1622,6 +1636,8 @@ BCB030BF173400BC001A1A20 /* GPUImageThreeInputFilter.m in Sources */, D443237B17C81C0C00204484 /* GPUImageMovieComposition.m in Sources */, BC8A583D1813060F00E6B507 /* GPUImageiOSBlurFilter.m in Sources */, + BCC887CD18A1CEEB008DB37D /* GPUImageFramebuffer.m in Sources */, + BCC887D118A1D3AD008DB37D /* GPUImageFramebufferCache.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index fa08e980d..a1f4dabae 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -17,6 +17,8 @@ #import "GPUImageTextureInput.h" #import "GPUImageUIElement.h" #import "GPUImageBuffer.h" +#import "GPUImageFramebuffer.h" +#import "GPUImageFramebufferCache.h" // Filters #import "GPUImageFilter.h" diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 7caf9a706..c3faae248 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -421,11 +421,24 @@ - (void)setFilterFBO; [self createFilterFBOofSize:currentFBOSize]; [self setupFilterForSize:currentFBOSize]; } + + if (framebuffer == nil) + { + CGSize currentFBOSize = [self sizeOfFBO]; + if ((currentFBOSize.width > 1.0) && (currentFBOSize.height > 1.0)) + { + framebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + NSLog(@"Grabbing framebuffer: %@", framebuffer); + } + } - glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); + [framebuffer activateFramebuffer]; + NSLog(@"Activating framebuffer: %@", framebuffer); - CGSize currentFBOSize = [self sizeOfFBO]; - glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); +// glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); +// +// CGSize currentFBOSize = [self sizeOfFBO]; +// glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } - (void)setOutputFBO; @@ -557,11 +570,13 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; - } + + [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; + +// if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) +// { +// [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; +// } [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndex]; diff --git a/framework/Source/GPUImageFramebuffer.h b/framework/Source/GPUImageFramebuffer.h new file mode 100644 index 000000000..bc02f1451 --- /dev/null +++ b/framework/Source/GPUImageFramebuffer.h @@ -0,0 +1,36 @@ +#import +#import +#import +#import +#import +#import + +typedef struct GPUTextureOptions { + GLenum minFilter; + GLenum magFilter; + GLenum wrapS; + GLenum wrapT; + GLenum internalFormat; + GLenum format; + GLenum type; +} GPUTextureOptions; + +@interface GPUImageFramebuffer : NSObject + +@property(readonly) CGSize size; +@property(readonly) GPUTextureOptions textureOptions; +@property(readonly) GLuint texture; + +// Initialization and teardown +- (id)initWithSize:(CGSize)framebufferSize; +- (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fboTextureOptions; + +// Usage +- (void)activateFramebuffer; + +// Reference counting +- (void)lock; +- (void)unlock; +- (void)clearAllLocks; + +@end diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m new file mode 100644 index 000000000..afc92d7d8 --- /dev/null +++ b/framework/Source/GPUImageFramebuffer.m @@ -0,0 +1,212 @@ +#import "GPUImageFramebuffer.h" +#import "GPUImageOutput.h" + +@interface GPUImageFramebuffer() +{ + GLuint framebuffer; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + CVPixelBufferRef renderTarget; + CVOpenGLESTextureRef renderTexture; +#else +#endif + NSUInteger framebufferReferenceCount; +} + +- (void)generateFramebuffer; +- (void)destroyFramebuffer; + +@end + +@implementation GPUImageFramebuffer + +@synthesize size = _size; +@synthesize textureOptions = _textureOptions; +@synthesize texture = _texture; + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fboTextureOptions; +{ + if (!(self = [super init])) + { + return nil; + } + + _textureOptions = fboTextureOptions; + _size = framebufferSize; + framebufferReferenceCount = 0; + + NSLog(@"Creating framebuffer: %@ at size %f, %f", self, _size.width, _size.height); + + [self generateFramebuffer]; + return self; +} + +- (id)initWithSize:(CGSize)framebufferSize; +{ + GPUTextureOptions defaultTextureOptions; + defaultTextureOptions.minFilter = GL_LINEAR; + defaultTextureOptions.magFilter = GL_LINEAR; + defaultTextureOptions.wrapS = GL_CLAMP_TO_EDGE; + defaultTextureOptions.wrapT = GL_CLAMP_TO_EDGE; + defaultTextureOptions.internalFormat = GL_RGBA; + defaultTextureOptions.format = GL_BGRA; + defaultTextureOptions.type = GL_UNSIGNED_BYTE; + + if (!(self = [self initWithSize:framebufferSize textureOptions:defaultTextureOptions])) + { + return nil; + } + + return self; +} + +- (void)dealloc +{ + NSLog(@"Destroying framebuffer: %@ at size %f, %f", self, _size.width, _size.height); + + [self destroyFramebuffer]; +} + +#pragma mark - +#pragma mark Internal + +- (void)generateFramebuffer; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + glActiveTexture(GL_TEXTURE1); + glGenTextures(1, &_texture); + glBindTexture(GL_TEXTURE_2D, _texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _textureOptions.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _textureOptions.magFilter); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, _textureOptions.wrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, _textureOptions.wrapT); + + glGenFramebuffers(1, &framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + + // By default, all framebuffers on iOS 5.0+ devices are backed by texture caches, using one shared cache + if ([GPUImageContext supportsFastTextureUpload]) + { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + CVOpenGLESTextureCacheRef coreVideoTextureCache = [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache]; + // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ + + CFDictionaryRef empty; // empty value for attr value. + CFMutableDictionaryRef attrs; + empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary + attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); + + CVReturn err = CVPixelBufferCreate(kCFAllocatorDefault, (int)_size.width, (int)_size.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + if (err) + { + NSLog(@"FBO size: %f, %f", _size.width, _size.height); + NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); + } + + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, renderTarget, + NULL, // texture attributes + GL_TEXTURE_2D, + _textureOptions.internalFormat, // opengl format + (int)_size.width, + (int)_size.height, + _textureOptions.format, // native iOS format + _textureOptions.type, + 0, + &renderTexture); + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); + } + + CFRelease(attrs); + CFRelease(empty); + + glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); + _texture = CVOpenGLESTextureGetName(renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, _textureOptions.wrapS); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, _textureOptions.wrapT); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); +#endif + } + else + { + glBindTexture(GL_TEXTURE_2D, _texture); + + glTexImage2D(GL_TEXTURE_2D, 0, _textureOptions.internalFormat, (int)_size.width, (int)_size.height, 0, _textureOptions.format, _textureOptions.type, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture, 0); + } + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + NSLog(@"Framebuffer texture: %d", _texture); + + NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + glBindTexture(GL_TEXTURE_2D, 0); + }); +} + +- (void)destroyFramebuffer; +{ + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + glDeleteFramebuffers(1, &framebuffer); + framebuffer = 0; + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + if (renderTarget) + { + CFRelease(renderTarget); + renderTarget = NULL; + } + + if (renderTexture) + { + CFRelease(renderTexture); + renderTexture = NULL; + } + +#endif + }); +} + +#pragma mark - +#pragma mark Usage + +- (void)activateFramebuffer; +{ + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glViewport(0, 0, (int)_size.width, (int)_size.height); +} + +#pragma mark - +#pragma mark Reference counting + +- (void)lock; +{ + framebufferReferenceCount++; +} + +- (void)unlock; +{ + NSAssert(framebufferReferenceCount > 0, @"Tried to overrelease a framebuffer"); + framebufferReferenceCount--; + if (framebufferReferenceCount < 1) + { + [[GPUImageContext sharedFramebufferCache] returnFramebufferToCache:self]; + } +} + +- (void)clearAllLocks; +{ + framebufferReferenceCount = 0; +} + +@end diff --git a/framework/Source/GPUImageFramebufferCache.h b/framework/Source/GPUImageFramebufferCache.h new file mode 100644 index 000000000..da26a33ea --- /dev/null +++ b/framework/Source/GPUImageFramebufferCache.h @@ -0,0 +1,13 @@ +#import +#import +#import "GPUImageFramebuffer.h" + +@interface GPUImageFramebufferCache : NSObject + +// Framebuffer management +- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions; +- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize; +- (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; +- (void)purgeAllUnassignedFramebuffers; + +@end diff --git a/framework/Source/GPUImageFramebufferCache.m b/framework/Source/GPUImageFramebufferCache.m new file mode 100644 index 000000000..da1269476 --- /dev/null +++ b/framework/Source/GPUImageFramebufferCache.m @@ -0,0 +1,131 @@ +#import "GPUImageFramebufferCache.h" + +@interface GPUImageFramebufferCache() +{ + NSCache *framebufferCache; + NSMutableDictionary *framebufferTypeCounts; +} + +- (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions; + +@end + + +@implementation GPUImageFramebufferCache + +#pragma mark - +#pragma mark Initialization and teardown + +- (id)init; +{ + if (!(self = [super init])) + { + return nil; + } + + framebufferCache = [[NSCache alloc] init]; + framebufferTypeCounts = [[NSMutableDictionary alloc] init]; + + return self; +} + +#pragma mark - +#pragma mark Framebuffer management + +- (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions; +{ + return [NSString stringWithFormat:@"%.1fx%.1f-%d:%d:%d:%d:%d:%d:%d", size.width, size.height, textureOptions.minFilter, textureOptions.magFilter, textureOptions.wrapS, textureOptions.wrapT, textureOptions.internalFormat, textureOptions.format, textureOptions.type]; +} + +- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions; +{ + NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:textureOptions]; + NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; + NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; + GPUImageFramebuffer *framebufferFromCache = nil; + + if ([numberOfMatchingTexturesInCache integerValue] < 1) + { + NSLog(@"Nothing found for hash: %@", lookupHash); + // Nothing in the cache, create a new framebuffer to use + framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions]; + } + else + { + NSLog(@"Existing cached textures for hash: %@", lookupHash); + + // Something found, pull the old framebuffer and decrement the count + NSInteger currentTextureID = (numberOfMatchingTextures - 1); + while ((framebufferFromCache == nil) && (currentTextureID >= 0)) + { + NSString *textureHash = [NSString stringWithFormat:@"%@-%d", lookupHash, currentTextureID]; + NSLog(@"Looking up texture hash of %@", textureHash); +// NSLog(@"Cache size: %d", [framebufferCache countLimit]); + framebufferFromCache = [framebufferCache objectForKey:textureHash]; + // Test the values in the cache first, to see if they got invalidated behind our back + if (framebufferFromCache != nil) + { + NSLog(@"Withdrawing texture hash of %@", textureHash); + // Withdraw this from the cache while it's in use + [framebufferCache removeObjectForKey:textureHash]; + } + currentTextureID--; + } + + currentTextureID++; + NSLog(@"Setting new count to %d for hash: %@", currentTextureID, lookupHash); + + [framebufferTypeCounts setObject:[NSNumber numberWithInteger:currentTextureID] forKey:lookupHash]; + + if (framebufferFromCache == nil) + { + NSLog(@"Cached textures were nil for hash: %@", lookupHash); + + framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions]; + + } + } + + [framebufferFromCache lock]; + return framebufferFromCache; +} + +- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize; +{ + GPUTextureOptions defaultTextureOptions; + defaultTextureOptions.minFilter = GL_LINEAR; + defaultTextureOptions.magFilter = GL_LINEAR; + defaultTextureOptions.wrapS = GL_CLAMP_TO_EDGE; + defaultTextureOptions.wrapT = GL_CLAMP_TO_EDGE; + defaultTextureOptions.internalFormat = GL_RGBA; + defaultTextureOptions.format = GL_BGRA; + defaultTextureOptions.type = GL_UNSIGNED_BYTE; + + return [self fetchFramebufferForSize:framebufferSize textureOptions:defaultTextureOptions]; +} + +- (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; +{ + [framebuffer clearAllLocks]; + + CGSize framebufferSize = framebuffer.size; + GPUTextureOptions framebufferTextureOptions = framebuffer.textureOptions; + NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:framebufferTextureOptions]; + NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; + NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; + + NSString *textureHash = [NSString stringWithFormat:@"%@-%d", lookupHash, numberOfMatchingTextures]; + + NSLog(@"Returning framebuffer: %@ with hash: %@", framebuffer, textureHash); + [framebufferCache setObject:framebuffer forKey:textureHash cost:round(framebufferSize.width * framebufferSize.height * 4.0)]; +// [framebufferCache setObject:framebuffer forKey:textureHash]; + [framebufferTypeCounts setObject:[NSNumber numberWithInteger:(numberOfMatchingTextures + 1)] forKey:lookupHash]; +} + +- (void)purgeAllUnassignedFramebuffers; +{ + [framebufferCache removeAllObjects]; + [framebufferTypeCounts removeAllObjects]; +} + +@end diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index ad26e7b76..9a8dffe13 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -1,4 +1,5 @@ #import "GPUImageContext.h" +#import "GPUImageFramebuffer.h" #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #import @@ -16,16 +17,6 @@ typedef NS_ENUM(NSInteger, UIImageOrientation) { }; #endif -typedef struct GPUTextureOptions { - GLenum minFilter; - GLenum magFilter; - GLenum wrapS; - GLenum wrapT; - GLenum internalFormat; - GLenum format; - GLenum type; -} GPUTextureOptions; - void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)); void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)); @@ -46,6 +37,8 @@ void reportAvailableMemoryForGPUImage(NSString *tag); */ @interface GPUImageOutput : NSObject { + GPUImageFramebuffer *framebuffer; + NSMutableArray *targets, *targetTextureIndices; GLuint outputTexture; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 06cba87a7..2ad743af1 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -124,7 +124,9 @@ - (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)in - (GLuint)textureForOutput; { - return outputTexture; + return [framebuffer texture]; +// +// return outputTexture; } - (void)notifyTargetsAboutNewOutputTexture; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index bda9d9fec..f21779880 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -286,6 +286,11 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return self; } +- (GLuint)textureForOutput; +{ + return outputTexture; +} + - (void)dealloc { [self stopCameraCapture]; diff --git a/framework/Source/iOS/GPUImageContext.h b/framework/Source/iOS/GPUImageContext.h index 4491ccf38..23ac13e68 100755 --- a/framework/Source/iOS/GPUImageContext.h +++ b/framework/Source/iOS/GPUImageContext.h @@ -1,10 +1,6 @@ -#import -#import -#import -#import -#import -#import #import "GLProgram.h" +#import "GPUImageFramebuffer.h" +#import "GPUImageFramebufferCache.h" #define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical || (rotation) == kGPUImageRotateRightFlipHorizontal) @@ -15,10 +11,13 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k @property(readonly, nonatomic) dispatch_queue_t contextQueue; @property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram; @property(readonly, retain, nonatomic) EAGLContext *context; +@property(readonly) CVOpenGLESTextureCacheRef coreVideoTextureCache; +@property(readonly) GPUImageFramebufferCache *framebufferCache; + (void *)contextKey; + (GPUImageContext *)sharedImageProcessingContext; + (dispatch_queue_t)sharedContextQueue; ++ (GPUImageFramebufferCache *)sharedFramebufferCache; + (void)useImageProcessingContext; + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; diff --git a/framework/Source/iOS/GPUImageContext.m b/framework/Source/iOS/GPUImageContext.m index 6f1d60840..60425d620 100755 --- a/framework/Source/iOS/GPUImageContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -18,6 +18,8 @@ @implementation GPUImageContext @synthesize context = _context; @synthesize currentShaderProgram = _currentShaderProgram; @synthesize contextQueue = _contextQueue; +@synthesize coreVideoTextureCache = _coreVideoTextureCache; +@synthesize framebufferCache = _framebufferCache; static void *openGLESContextQueueKey; @@ -62,6 +64,11 @@ + (dispatch_queue_t)sharedContextQueue; return [[self sharedImageProcessingContext] contextQueue]; } ++ (GPUImageFramebufferCache *)sharedFramebufferCache; +{ + return [[self sharedImageProcessingContext] framebufferCache]; +} + + (void)useImageProcessingContext; { EAGLContext *imageProcessingContext = [[GPUImageContext sharedImageProcessingContext] context]; @@ -264,4 +271,34 @@ - (EAGLContext *)context; return _context; } +- (CVOpenGLESTextureCacheRef)coreVideoTextureCache; +{ + if (_coreVideoTextureCache == NULL) + { +#if defined(__IPHONE_6_0) + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [self context], NULL, &_coreVideoTextureCache); +#else + CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[self context], NULL, &_coreVideoTextureCache); +#endif + + if (err) + { + NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); + } + + } + + return _coreVideoTextureCache; +} + +- (GPUImageFramebufferCache *)framebufferCache; +{ + if (_framebufferCache == nil) + { + _framebufferCache = [[GPUImageFramebufferCache alloc] init]; + } + + return _framebufferCache; +} + @end diff --git a/framework/Source/iOS/GPUImageView.m b/framework/Source/iOS/GPUImageView.m index d63491916..d69b760e6 100755 --- a/framework/Source/iOS/GPUImageView.m +++ b/framework/Source/iOS/GPUImageView.m @@ -391,6 +391,7 @@ - (NSInteger)nextAvailableTextureIndex; - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; { + NSLog(@"Setting input texture: %d", newInputTexture); inputTextureForDisplay = newInputTexture; } From 6a16323cbe278661f36e70b7ad80020bb746e14b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 4 Mar 2014 22:39:50 -0600 Subject: [PATCH 502/695] Ripped out my failed attempt at memory conservation, in preparation for the caching mechanism. --- framework/Source/GPUImageFilter.h | 1 - framework/Source/GPUImageFilter.m | 29 --------------------- framework/Source/GPUImageFilterGroup.m | 8 ------ framework/Source/GPUImageGrayscaleFilter.m | 2 -- framework/Source/GPUImageOutput.h | 2 -- framework/Source/GPUImageOutput.m | 13 --------- framework/Source/GPUImageRawDataOutput.m | 5 ---- framework/Source/GPUImageStillCamera.m | 2 -- framework/Source/GPUImageTextureOutput.m | 5 ---- framework/Source/GPUImageThreeInputFilter.m | 11 -------- framework/Source/GPUImageTwoInputFilter.m | 10 ------- framework/Source/GPUImageTwoPassFilter.m | 22 ---------------- framework/Source/iOS/GPUImageContext.h | 1 - framework/Source/iOS/GPUImageMovieWriter.m | 5 ---- framework/Source/iOS/GPUImagePicture.m | 8 +----- framework/Source/iOS/GPUImageView.m | 5 ---- 16 files changed, 1 insertion(+), 128 deletions(-) diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index 0084a5240..d2b233ae5 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -120,7 +120,6 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (void)destroyFilterFBO; - (void)setFilterFBO; - (void)setOutputFBO; -- (void)releaseInputTexturesIfNeeded; /// @name Rendering + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index c3faae248..bfa955d90 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -447,15 +447,6 @@ - (void)setOutputFBO; [self setFilterFBO]; } -- (void)releaseInputTexturesIfNeeded; -{ - if (shouldConserveMemoryForNextFrame) - { - [firstTextureDelegate textureNoLongerNeededForTarget:self]; - shouldConserveMemoryForNextFrame = NO; - } -} - #pragma mark - #pragma mark Rendering @@ -562,8 +553,6 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; self.frameProcessingCompletionBlock(self, frameTime); } - [self releaseInputTexturesIfNeeded]; - for (id currentTarget in targets) { if (currentTarget != self.targetToIgnoreForUpdates) @@ -1033,24 +1022,6 @@ - (void)setTextureDelegate:(id)newTextureDelegate atInd firstTextureDelegate = newTextureDelegate; } -- (void)conserveMemoryForNextFrame; -{ - if (overrideInputSize) - { - return; - } - - shouldConserveMemoryForNextFrame = YES; - - for (id currentTarget in targets) - { - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget conserveMemoryForNextFrame]; - } - } -} - - (BOOL)wantsMonochromeInput; { return NO; diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 9f4680525..47eff544c 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -193,14 +193,6 @@ - (void)endProcessing; } } -- (void)conserveMemoryForNextFrame; -{ - for (GPUImageOutput *currentFilter in _initialFilters) - { - [currentFilter conserveMemoryForNextFrame]; - } -} - - (BOOL)wantsMonochromeInput; { BOOL allInputsWantMonochromeInput = YES; diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index 0cdafadc7..ae0bcff0e 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -87,8 +87,6 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; self.frameProcessingCompletionBlock(self, frameTime); } - [self releaseInputTexturesIfNeeded]; - for (id currentTarget in targets) { if (currentTarget != self.targetToIgnoreForUpdates) diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 9a8dffe13..82bac0e03 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -50,7 +50,6 @@ void reportAvailableMemoryForGPUImage(NSString *tag); NSUInteger outputTextureRetainCount; __unsafe_unretained id firstTextureDelegate; - BOOL shouldConserveMemoryForNextFrame; BOOL allTargetsWantMonochromeData; } @@ -131,6 +130,5 @@ void reportAvailableMemoryForGPUImage(NSString *tag); - (BOOL)providesMonochromeOutput; - (void)prepareForImageCapture; -- (void)conserveMemoryForNextFrame; @end diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 2ad743af1..7c733b537 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -310,19 +310,6 @@ - (void)prepareForImageCapture; } -- (void)conserveMemoryForNextFrame; -{ - shouldConserveMemoryForNextFrame = YES; - - for (id currentTarget in targets) - { - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget conserveMemoryForNextFrame]; - } - } -} - #pragma mark - #pragma mark Platform-specific image output methods diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 5377a5144..28a462b98 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -392,11 +392,6 @@ - (void)setTextureDelegate:(id)newTextureDelegate atInd textureDelegate = newTextureDelegate; } -- (void)conserveMemoryForNextFrame; -{ - -} - - (BOOL)wantsMonochromeInput; { return NO; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 3de6939b0..b0d485f77 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -238,8 +238,6 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi return; } - [self conserveMemoryForNextFrame]; - // For now, resize photos to fix within the max texture size of the GPU CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer); diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index ffa7e4f2a..1d65ed1a7 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -66,11 +66,6 @@ - (void)setTextureDelegate:(id)newTextureDelegate atInd textureDelegate = newTextureDelegate; } -- (void)conserveMemoryForNextFrame; -{ - -} - - (BOOL)wantsMonochromeInput; { return NO; diff --git a/framework/Source/GPUImageThreeInputFilter.m b/framework/Source/GPUImageThreeInputFilter.m index db5ccd83f..e06071992 100644 --- a/framework/Source/GPUImageThreeInputFilter.m +++ b/framework/Source/GPUImageThreeInputFilter.m @@ -112,17 +112,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -- (void)releaseInputTexturesIfNeeded; -{ - if (shouldConserveMemoryForNextFrame) - { - [firstTextureDelegate textureNoLongerNeededForTarget:self]; - [secondTextureDelegate textureNoLongerNeededForTarget:self]; - [thirdTextureDelegate textureNoLongerNeededForTarget:self]; - shouldConserveMemoryForNextFrame = NO; - } -} - #pragma mark - #pragma mark GPUImageInput diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 65702774c..cb7047bf4 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -113,16 +113,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -- (void)releaseInputTexturesIfNeeded; -{ - if (shouldConserveMemoryForNextFrame) - { - [firstTextureDelegate textureNoLongerNeededForTarget:self]; - [secondTextureDelegate textureNoLongerNeededForTarget:self]; - shouldConserveMemoryForNextFrame = NO; - } -} - #pragma mark - #pragma mark GPUImageInput diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 899626bc3..753aba953 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -384,28 +384,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - // Release the first FBO early - if (shouldConserveMemoryForNextFrame) - { - [firstTextureDelegate textureNoLongerNeededForTarget:self]; - - glDeleteFramebuffers(1, &filterFramebuffer); - filterFramebuffer = 0; - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } - - shouldConserveMemoryForNextFrame = NO; - } -} - -// Clear this out because I want to release the input texture as soon as the first pass is finished, not just after the whole rendering has completed -- (void)releaseInputTexturesIfNeeded; -{ } - (void)prepareForImageCapture; diff --git a/framework/Source/iOS/GPUImageContext.h b/framework/Source/iOS/GPUImageContext.h index 23ac13e68..58a797601 100755 --- a/framework/Source/iOS/GPUImageContext.h +++ b/framework/Source/iOS/GPUImageContext.h @@ -51,7 +51,6 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (void)endProcessing; - (BOOL)shouldIgnoreUpdatesToThisTarget; - (BOOL)enabled; -- (void)conserveMemoryForNextFrame; - (BOOL)wantsMonochromeInput; - (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; @end diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index fdbbef557..302418094 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -780,11 +780,6 @@ - (void)setTextureDelegate:(id)newTextureDelegate atInd textureDelegate = newTextureDelegate; } -- (void)conserveMemoryForNextFrame; -{ - -} - - (BOOL)wantsMonochromeInput; { return NO; diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index edea1df79..8a25ac9d2 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -245,13 +245,7 @@ - (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; return NO; } - runAsynchronouslyOnVideoProcessingQueue(^{ - - if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) - { - [self conserveMemoryForNextFrame]; - } - + runAsynchronouslyOnVideoProcessingQueue(^{ for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; diff --git a/framework/Source/iOS/GPUImageView.m b/framework/Source/iOS/GPUImageView.m index d69b760e6..f68b18772 100755 --- a/framework/Source/iOS/GPUImageView.m +++ b/framework/Source/iOS/GPUImageView.m @@ -446,11 +446,6 @@ - (void)setTextureDelegate:(id)newTextureDelegate atInd textureDelegate = newTextureDelegate; } -- (void)conserveMemoryForNextFrame; -{ - -} - - (BOOL)wantsMonochromeInput; { return NO; From 49dedb9c6a6e4f4e4797c2c2022bb3ae07df87a4 Mon Sep 17 00:00:00 2001 From: Bradley Ayers Date: Sat, 8 Mar 2014 21:19:58 +1100 Subject: [PATCH 503/695] Fix KVO on frame for GPUImageView, to improve performance and fix iOS 7 support. --- framework/Source/iOS/GPUImageView.m | 38 +++++++++++++++-------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/framework/Source/iOS/GPUImageView.m b/framework/Source/iOS/GPUImageView.m index d63491916..26b95d458 100755 --- a/framework/Source/iOS/GPUImageView.m +++ b/framework/Source/iOS/GPUImageView.m @@ -16,12 +16,16 @@ @interface GPUImageView () GLProgram *displayProgram; GLint displayPositionAttribute, displayTextureCoordinateAttribute; GLint displayInputTextureUniform; - + CGSize inputImageSize; GLfloat imageVertices[8]; GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; + + CGSize boundsSizeAtFrameBufferEpoch; } +@property (assign, nonatomic) NSUInteger aspectRatio; + // Initialization and teardown - (void)commonInit; @@ -36,6 +40,7 @@ - (void)recalculateViewGeometry; @implementation GPUImageView +@synthesize aspectRatio; @synthesize sizeInPixels = _sizeInPixels; @synthesize fillMode = _fillMode; @synthesize enabled; @@ -123,14 +128,12 @@ - (void)commonInit; _fillMode = kGPUImageFillModePreserveAspectRatio; [self createDisplayFramebuffer]; }); - - [self addObserver:self forKeyPath:@"frame" options:0 context:NULL]; } -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context -{ - if (object == self && [keyPath isEqualToString:@"frame"] && (!CGSizeEqualToSize(self.bounds.size, CGSizeZero))) - { +- (void)layoutSubviews { + // The frame buffer needs to be trashed and re-created when the view size changes. + if (!CGSizeEqualToSize(self.bounds.size, boundsSizeAtFrameBufferEpoch) && + !CGSizeEqualToSize(self.bounds.size, CGSizeZero)) { runSynchronouslyOnVideoProcessingQueue(^{ [self destroyDisplayFramebuffer]; [self createDisplayFramebuffer]; @@ -141,8 +144,6 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N - (void)dealloc { - [self removeObserver:self forKeyPath:@"frame"]; - runSynchronouslyOnVideoProcessingQueue(^{ [self destroyDisplayFramebuffer]; }); @@ -155,18 +156,18 @@ - (void)createDisplayFramebuffer; { [GPUImageContext useImageProcessingContext]; - glGenFramebuffers(1, &displayFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, displayFramebuffer); + glGenFramebuffers(1, &displayFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, displayFramebuffer); - glGenRenderbuffers(1, &displayRenderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, displayRenderbuffer); + glGenRenderbuffers(1, &displayRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, displayRenderbuffer); - [[[GPUImageContext sharedImageProcessingContext] context] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; + [[[GPUImageContext sharedImageProcessingContext] context] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; GLint backingWidth, backingHeight; - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); if ( (backingWidth == 0) || (backingHeight == 0) ) { @@ -177,12 +178,13 @@ - (void)createDisplayFramebuffer; _sizeInPixels.width = (CGFloat)backingWidth; _sizeInPixels.height = (CGFloat)backingHeight; -// NSLog(@"Backing width: %d, height: %d", backingWidth, backingHeight); +// NSLog(@"Backing width: %d, height: %d", backingWidth, backingHeight); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, displayRenderbuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, displayRenderbuffer); GLuint framebufferCreationStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); NSAssert(framebufferCreationStatus == GL_FRAMEBUFFER_COMPLETE, @"Failure with display framebuffer generation for display of size: %f, %f", self.bounds.size.width, self.bounds.size.height); + boundsSizeAtFrameBufferEpoch = self.bounds.size; } - (void)destroyDisplayFramebuffer; From 763a11db8f6034f848fdc83c224b2227c49b37bb Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 9 Mar 2014 23:31:18 -0500 Subject: [PATCH 504/695] Completely rewrote FBO management to now use an internal cache of FBOs and textures, should have huge impacts on memory usage. Things are kinda broken right now, though. --- framework/Source/GPUImageAverageColor.m | 14 +- framework/Source/GPUImageBuffer.h | 2 +- framework/Source/GPUImageBuffer.m | 97 ++---- framework/Source/GPUImageCropFilter.m | 5 +- framework/Source/GPUImageCrosshairGenerator.m | 5 +- framework/Source/GPUImageFilter.h | 17 +- framework/Source/GPUImageFilter.m | 294 ++-------------- framework/Source/GPUImageFilterGroup.h | 2 +- framework/Source/GPUImageFilterGroup.m | 28 +- framework/Source/GPUImageFramebuffer.h | 2 + framework/Source/GPUImageFramebuffer.m | 23 +- framework/Source/GPUImageFramebufferCache.m | 8 - framework/Source/GPUImageGaussianBlurFilter.m | 6 +- framework/Source/GPUImageGrayscaleFilter.m | 123 +++---- framework/Source/GPUImageHistogramFilter.m | 13 +- framework/Source/GPUImageJFAVoronoiFilter.m | 178 +--------- .../Source/GPUImageLanczosResamplingFilter.m | 74 ++-- framework/Source/GPUImageLineGenerator.m | 5 +- framework/Source/GPUImageLuminosity.m | 4 +- framework/Source/GPUImageMaskFilter.m | 4 +- framework/Source/GPUImageMovie.h | 2 +- framework/Source/GPUImageMovie.m | 193 ++++------- framework/Source/GPUImageMovieComposition.m | 2 +- framework/Source/GPUImageOutput.h | 17 +- framework/Source/GPUImageOutput.m | 70 +--- ...ageParallelCoordinateLineTransformFilter.m | 10 +- framework/Source/GPUImagePoissonBlendFilter.h | 3 +- framework/Source/GPUImagePoissonBlendFilter.m | 239 +------------ framework/Source/GPUImageRawDataInput.m | 7 +- framework/Source/GPUImageRawDataOutput.h | 10 - framework/Source/GPUImageRawDataOutput.m | 310 ++++------------- framework/Source/GPUImageTextureInput.m | 5 +- framework/Source/GPUImageTextureOutput.h | 2 +- framework/Source/GPUImageTextureOutput.m | 11 +- framework/Source/GPUImageThreeInputFilter.h | 4 +- framework/Source/GPUImageThreeInputFilter.m | 49 +-- framework/Source/GPUImageToneCurveFilter.m | 10 +- framework/Source/GPUImageTransformFilter.m | 10 +- framework/Source/GPUImageTwoInputFilter.h | 5 +- framework/Source/GPUImageTwoInputFilter.m | 36 +- framework/Source/GPUImageTwoPassFilter.h | 8 +- framework/Source/GPUImageTwoPassFilter.m | 327 ++---------------- framework/Source/GPUImageUIElement.m | 6 +- framework/Source/GPUImageVideoCamera.h | 2 - framework/Source/GPUImageVideoCamera.m | 194 ++++------- framework/Source/iOS/GPUImageContext.h | 10 +- framework/Source/iOS/GPUImageMovieWriter.h | 2 - framework/Source/iOS/GPUImageMovieWriter.m | 14 +- framework/Source/iOS/GPUImagePicture.m | 16 +- framework/Source/iOS/GPUImageView.h | 1 - framework/Source/iOS/GPUImageView.m | 17 +- 51 files changed, 579 insertions(+), 1917 deletions(-) diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index 4f3ac74aa..2f25f1c10 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -185,16 +185,6 @@ - (void)deleteOutputTexture; #pragma mark - #pragma mark Managing the display FBOs -- (void)recreateFilterFBO -{ - cachedMaximumOutputSize = CGSizeZero; - [self destroyFilterFBO]; - [self deleteOutputTexture]; - [self initializeOutputTextureIfNeeded]; - - [self setFilterFBO]; -} - - (void)createFilterFBOofSize:(CGSize)currentFBOSize; { // Create framebuffers for each level @@ -255,7 +245,7 @@ - (void)destroyFilterFBO; }); } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) { @@ -267,7 +257,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - GLuint currentTexture = sourceTexture; + GLuint currentTexture = [firstInputFramebuffer texture]; NSUInteger numberOfStageFramebuffers = [stageFramebuffers count]; for (NSUInteger currentStage = 0; currentStage < numberOfStageFramebuffers; currentStage++) diff --git a/framework/Source/GPUImageBuffer.h b/framework/Source/GPUImageBuffer.h index 8a9cd05ee..caf09c8d5 100644 --- a/framework/Source/GPUImageBuffer.h +++ b/framework/Source/GPUImageBuffer.h @@ -2,7 +2,7 @@ @interface GPUImageBuffer : GPUImageFilter { - NSMutableArray *bufferedTextures; + NSMutableArray *bufferedFramebuffers; } @property(readwrite, nonatomic) NSUInteger bufferSize; diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index 84b9d9345..f530f3a64 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -2,10 +2,6 @@ @interface GPUImageBuffer() -//Texture management -- (GLuint)generateTexture; -- (void)removeTexture:(GLuint)textureToRemove; - @end @implementation GPUImageBuffer @@ -22,9 +18,8 @@ - (id)init; return nil; } - bufferedTextures = [[NSMutableArray alloc] init]; - [self initializeOutputTextureIfNeeded]; - [bufferedTextures addObject:[NSNumber numberWithInt:outputTexture]]; + bufferedFramebuffers = [[NSMutableArray alloc] init]; +// [bufferedTextures addObject:[NSNumber numberWithInt:outputTexture]]; _bufferSize = 1; return self; @@ -32,9 +27,9 @@ - (id)init; - (void)dealloc { - for (NSNumber *currentTextureName in bufferedTextures) + for (GPUImageFramebuffer *currentFramebuffer in bufferedFramebuffers) { - [self removeTexture:[currentTextureName intValue]]; + [currentFramebuffer unlock]; } } @@ -43,8 +38,6 @@ - (void)dealloc - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [targets count]; - static const GLfloat imageVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, @@ -60,9 +53,9 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; // Move the last frame to the back of the buffer, if needed if (_bufferSize > 1) { - NSNumber *lastTextureName = [bufferedTextures objectAtIndex:0]; - [bufferedTextures removeObjectAtIndex:0]; - [bufferedTextures addObject:lastTextureName]; + NSNumber *lastFramebuffer = [bufferedFramebuffers objectAtIndex:0]; + [bufferedFramebuffers removeObjectAtIndex:0]; + [bufferedFramebuffers addObject:lastFramebuffer]; } else { @@ -71,10 +64,10 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } // Render the new frame to the back of the buffer - [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) { @@ -82,23 +75,24 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - [self setFilterFBO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; + [bufferedFramebuffers addObject:outputFramebuffer]; + // TODO: Instead of redrawing these into textures, capture the incoming framebuffer and prevent it from returning to the pool - glBindTexture(GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue]); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue], 0); - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, sourceTexture); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); glUniform1i(filterInputTextureUniform, 2); glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + [firstInputFramebuffer unlock]; } - (void)prepareForImageCapture; @@ -109,54 +103,9 @@ - (void)prepareForImageCapture; #pragma mark - #pragma mark Managing targets -- (GLuint)textureForOutput; -{ - return [[bufferedTextures objectAtIndex:0] intValue]; -} - -#pragma mark - -#pragma mark Texture management - -- (GLuint)generateTexture; +- (GPUImageFramebuffer *)framebufferForOutput; { - __block GLuint newTextureName = 0; - - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &newTextureName); - glBindTexture(GL_TEXTURE_2D, newTextureName); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); - // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - - CGSize currentFBOSize = [self sizeOfFBO]; - glTexImage2D(GL_TEXTURE_2D, - 0, - self.outputTextureOptions.internalFormat, - (int)currentFBOSize.width, - (int)currentFBOSize.height, - 0, - self.outputTextureOptions.format, - self.outputTextureOptions.type, - 0); - glBindTexture(GL_TEXTURE_2D, 0); - - }); - - return newTextureName; -} - -- (void)removeTexture:(GLuint)textureToRemove; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - glDeleteTextures(1, &textureToRemove); - }); + return [bufferedFramebuffers objectAtIndex:0]; } #pragma mark - @@ -174,7 +123,7 @@ - (void)setBufferSize:(NSUInteger)newValue; NSUInteger texturesToAdd = newValue - _bufferSize; for (NSUInteger currentTextureIndex = 0; currentTextureIndex < texturesToAdd; currentTextureIndex++) { - [bufferedTextures addObject:[NSNumber numberWithInt:[self generateTexture]]]; + // TODO: Deal with the growth of the size of the buffer by rotating framebuffers, no textures } } else @@ -182,9 +131,11 @@ - (void)setBufferSize:(NSUInteger)newValue; NSUInteger texturesToRemove = _bufferSize - newValue; for (NSUInteger currentTextureIndex = 0; currentTextureIndex < texturesToRemove; currentTextureIndex++) { - NSNumber *lastTextureName = [bufferedTextures lastObject]; - [bufferedTextures removeObjectAtIndex:([bufferedTextures count] - 1)]; - [self removeTexture:[lastTextureName intValue]]; + GPUImageFramebuffer *lastFramebuffer = [bufferedFramebuffers lastObject]; + [bufferedFramebuffers removeObjectAtIndex:([bufferedFramebuffers count] - 1)]; + + [lastFramebuffer unlock]; + lastFramebuffer = nil; } } diff --git a/framework/Source/GPUImageCropFilter.m b/framework/Source/GPUImageCropFilter.m index a783a1c40..22e33c17f 100755 --- a/framework/Source/GPUImageCropFilter.m +++ b/framework/Source/GPUImageCropFilter.m @@ -107,7 +107,6 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; else if (!CGSizeEqualToSize(inputTextureSize, scaledSize)) { inputTextureSize = scaledSize; - [self recreateFilterFBO]; } } @@ -240,8 +239,6 @@ - (void)calculateCropTextureCoordinates; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [targets count]; - static const GLfloat cropSquareVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, @@ -249,7 +246,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; 1.0f, 1.0f, }; - [self renderToTextureWithVertices:cropSquareVertices textureCoordinates:cropTextureCoordinates sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:cropSquareVertices textureCoordinates:cropTextureCoordinates]; [self informTargetsAboutNewFrameAtTime:frameTime]; } diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index f127dac33..bcf20a1d8 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -100,7 +100,8 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); #endif - [self setFilterFBO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); @@ -113,7 +114,7 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte }); } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { // Prevent rendering of the frame by normal means } diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index d2b233ae5..bfd7be675 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -47,10 +47,8 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; */ @interface GPUImageFilter : GPUImageOutput { - GLuint filterSourceTexture; - - GLuint filterFramebuffer; - + GPUImageFramebuffer *firstInputFramebuffer; + GLProgram *filterProgram; GLint filterPositionAttribute, filterTextureCoordinateAttribute; GLint filterInputTextureUniform; @@ -107,23 +105,14 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; - (CGPoint)rotatedPoint:(CGPoint)pointToRotate forRotation:(GPUImageRotationMode)rotation; -- (void)recreateFilterFBO; - /// @name Managing the display FBOs /** Size of the frame buffer object */ - (CGSize)sizeOfFBO; -- (void)createFilterFBOofSize:(CGSize)currentFBOSize; - -/** Destroy the current filter frame buffer object - */ -- (void)destroyFilterFBO; -- (void)setFilterFBO; -- (void)setOutputFBO; /// @name Rendering + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; - (CGSize)outputFrameSize; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index bfa955d90..b44caac74 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -159,7 +159,6 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; - (void)dealloc { - [self destroyFilterFBO]; } #pragma mark - @@ -178,8 +177,8 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) if ([filter renderTarget]) { CFRelease([filter renderTarget]); } - - [filter destroyFilterFBO]; + + // TODO: use outputFramebuffer for this, unlocking here filter.preventRendering = NO; } @@ -217,7 +216,8 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrie } else { - [self setOutputFBO]; + // TODO: Fix this based on the new caching model +// [self setOutputFBO]; rawImagePixels = (GLubyte *)malloc(totalBytesForImage); glReadPixels(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, dataProviderReleaseCallback); @@ -277,176 +277,6 @@ - (CGSize)sizeOfFBO; } } -- (void)createFilterFBOofSize:(CGSize)currentFBOSize; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - glActiveTexture(GL_TEXTURE1); - - glGenFramebuffers(1, &filterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); -#endif - - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) - { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); - } - - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - self.outputTextureOptions.internalFormat, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - self.outputTextureOptions.format, // native iOS format - self.outputTextureOptions.type, - 0, - &renderTexture); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); - } - - CFRelease(attrs); - CFRelease(empty); - - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - outputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); - - [self notifyTargetsAboutNewOutputTexture]; -#endif - } - else - { - [self initializeOutputTextureIfNeeded]; - - glBindTexture(GL_TEXTURE_2D, outputTexture); - -// if ([self providesMonochromeOutput] && [GPUImageContext deviceSupportsRedTextures]) -// { -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); -// } -// else -// { - glTexImage2D(GL_TEXTURE_2D, - 0, - self.outputTextureOptions.internalFormat, - (int)currentFBOSize.width, - (int)currentFBOSize.height, - 0, - self.outputTextureOptions.format, - self.outputTextureOptions.type, - 0); -// } - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); -// glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); -// GLenum att = GL_COLOR_ATTACHMENT0; -// glDrawBuffers(1, &att); - [self notifyTargetsAboutNewOutputTexture]; - } - - // NSLog(@"Filter size: %f, %f for filter: %@", currentFBOSize.width, currentFBOSize.height, self); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - glBindTexture(GL_TEXTURE_2D, 0); - }); -} - -- (void)destroyFilterFBO; -{ - if (filterFramebuffer) - { - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - glDeleteFramebuffers(1, &filterFramebuffer); - filterFramebuffer = 0; - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - if (filterTextureCache != NULL) - { - CFRelease(renderTarget); - renderTarget = NULL; - - if (renderTexture) - { - CFRelease(renderTexture); - renderTexture = NULL; - } - - CVOpenGLESTextureCacheFlush(filterTextureCache, 0); - CFRelease(filterTextureCache); - filterTextureCache = NULL; - } -#endif - }); - } -} - -- (void)setFilterFBO; -{ - if (!filterFramebuffer) - { - CGSize currentFBOSize = [self sizeOfFBO]; - [self createFilterFBOofSize:currentFBOSize]; - [self setupFilterForSize:currentFBOSize]; - } - - if (framebuffer == nil) - { - CGSize currentFBOSize = [self sizeOfFBO]; - if ((currentFBOSize.width > 1.0) && (currentFBOSize.height > 1.0)) - { - framebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; - NSLog(@"Grabbing framebuffer: %@", framebuffer); - } - } - - [framebuffer activateFramebuffer]; - NSLog(@"Activating framebuffer: %@", framebuffer); - -// glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); -// -// CGSize currentFBOSize = [self sizeOfFBO]; -// glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); -} - -- (void)setOutputFBO; -{ - // Override this for filters that have multiple framebuffers - [self setFilterFBO]; -} - #pragma mark - #pragma mark Rendering @@ -521,7 +351,7 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM } } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) { @@ -529,14 +359,17 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - [self setFilterFBO]; + + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; + [self setUniformsForProgramAtIndex:0]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, sourceTexture); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); glUniform1i(filterInputTextureUniform, 2); @@ -544,6 +377,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + [firstInputFramebuffer unlock]; } - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; @@ -553,6 +388,7 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; self.frameProcessingCompletionBlock(self, frameTime); } + // Get all targets the framebuffer so they can grab a lock on it for (id currentTarget in targets) { if (currentTarget != self.targetToIgnoreForUpdates) @@ -560,14 +396,21 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; - -// if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) -// { -// [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; -// } - + [self setInputFramebufferForTarget:currentTarget atIndex:textureIndex]; [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; + } + } + + // Release our hold so it can return to the cache immediately upon processing + [[self framebufferForOutput] unlock]; + + // Trigger processing last, so that our unlock comes first in serial execution, avoiding the need for a callback + for (id currentTarget in targets) + { + if (currentTarget != self.targetToIgnoreForUpdates) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndex]; } } @@ -586,19 +429,6 @@ - (void)prepareForImageCapture; } preparedToCaptureImage = YES; - - if ([GPUImageContext supportsFastTextureUpload]) - { - if (outputTexture) - { - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - }); - } - } } #pragma mark - @@ -777,8 +607,6 @@ - (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [targets count]; - static const GLfloat imageVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, @@ -786,7 +614,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; 1.0f, 1.0f, }; - [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; [self informTargetsAboutNewFrameAtTime:frameTime]; } @@ -796,23 +624,10 @@ - (NSInteger)nextAvailableTextureIndex; return 0; } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; -{ - filterSourceTexture = newInputTexture; -} - -- (void)recreateFilterFBO +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { - cachedMaximumOutputSize = CGSizeZero; - if (!filterFramebuffer) - { - return; - } - - [self destroyFilterFBO]; - [self deleteOutputTexture]; - - [self setFilterFBO]; + firstInputFramebuffer = newInputFramebuffer; + [firstInputFramebuffer lock]; } - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; @@ -904,7 +719,6 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; else if (!CGSizeEqualToSize(inputTextureSize, rotatedSize)) { inputTextureSize = rotatedSize; - [self recreateFilterFBO]; } } @@ -925,15 +739,6 @@ - (void)forceProcessingAtSize:(CGSize)frameSize; inputTextureSize = frameSize; forcedMaximumSize = CGSizeZero; } - - [self destroyFilterFBO]; - - for (id currentTarget in targets) - { - if ([currentTarget respondsToSelector:@selector(destroyFilterFBO)]) { - [currentTarget performSelector:@selector(destroyFilterFBO)]; - } - } } - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; @@ -949,38 +754,6 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; overrideInputSize = YES; forcedMaximumSize = frameSize; } - - [self destroyFilterFBO]; - - for (id currentTarget in targets) - { - if ([currentTarget respondsToSelector:@selector(destroyFilterFBO)]) { - [currentTarget performSelector:@selector(destroyFilterFBO)]; - } - } -} - -- (void)cleanupOutputImage; -{ -// NSLog(@"Cleaning up output filter image: %@", self); - [self destroyFilterFBO]; - [self deleteOutputTexture]; -} - -- (void)deleteOutputTexture; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) - { - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } - } - }); } - (CGSize)maximumOutputSize; @@ -1017,11 +790,6 @@ - (void)endProcessing } } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - firstTextureDelegate = newTextureDelegate; -} - - (BOOL)wantsMonochromeInput; { return NO; diff --git a/framework/Source/GPUImageFilterGroup.h b/framework/Source/GPUImageFilterGroup.h index e18822873..6817cdf0e 100755 --- a/framework/Source/GPUImageFilterGroup.h +++ b/framework/Source/GPUImageFilterGroup.h @@ -1,7 +1,7 @@ #import "GPUImageOutput.h" #import "GPUImageFilter.h" -@interface GPUImageFilterGroup : GPUImageOutput +@interface GPUImageFilterGroup : GPUImageOutput { NSMutableArray *filters; BOOL isEndProcessing; diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 47eff544c..9cd045f1e 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -88,8 +88,6 @@ - (void)setFrameProcessingCompletionBlock:(void (^)(GPUImageOutput *, CMTime))fr - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [_initialFilters count]; - for (GPUImageOutput *currentFilter in _initialFilters) { if (currentFilter != self.inputFilterToIgnoreForUpdates) @@ -99,21 +97,11 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - firstTextureDelegate = newTextureDelegate; - - for (GPUImageOutput *currentFilter in _initialFilters) - { - [currentFilter setTextureDelegate:self atIndex:textureIndex]; - } -} - -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { for (GPUImageOutput *currentFilter in _initialFilters) { - [currentFilter setInputTexture:newInputTexture atIndex:textureIndex]; + [currentFilter setInputFramebuffer:newInputFramebuffer atIndex:textureIndex]; } } @@ -212,16 +200,4 @@ - (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; } } -#pragma mark - -#pragma mark GPUImageTextureDelegate methods - -- (void)textureNoLongerNeededForTarget:(id)textureTarget; -{ - outputTextureRetainCount--; - if (outputTextureRetainCount < 1) - { - [firstTextureDelegate textureNoLongerNeededForTarget:self]; - } -} - @end diff --git a/framework/Source/GPUImageFramebuffer.h b/framework/Source/GPUImageFramebuffer.h index bc02f1451..3decfe9db 100644 --- a/framework/Source/GPUImageFramebuffer.h +++ b/framework/Source/GPUImageFramebuffer.h @@ -32,5 +32,7 @@ typedef struct GPUTextureOptions { - (void)lock; - (void)unlock; - (void)clearAllLocks; +- (void)disableReferenceCounting; +- (void)enableReferenceCounting; @end diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index afc92d7d8..59c290cc6 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -10,6 +10,7 @@ @interface GPUImageFramebuffer() #else #endif NSUInteger framebufferReferenceCount; + BOOL referenceCountingDisabled; } - (void)generateFramebuffer; @@ -36,7 +37,8 @@ - (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fbo _textureOptions = fboTextureOptions; _size = framebufferSize; framebufferReferenceCount = 0; - + referenceCountingDisabled = NO; + NSLog(@"Creating framebuffer: %@ at size %f, %f", self, _size.width, _size.height); [self generateFramebuffer]; @@ -191,11 +193,21 @@ - (void)activateFramebuffer; - (void)lock; { + if (referenceCountingDisabled) + { + return; + } + framebufferReferenceCount++; } - (void)unlock; { + if (referenceCountingDisabled) + { + return; + } + NSAssert(framebufferReferenceCount > 0, @"Tried to overrelease a framebuffer"); framebufferReferenceCount--; if (framebufferReferenceCount < 1) @@ -209,4 +221,13 @@ - (void)clearAllLocks; framebufferReferenceCount = 0; } +- (void)disableReferenceCounting; +{ + referenceCountingDisabled = YES; +} + +- (void)enableReferenceCounting; +{ + referenceCountingDisabled = NO; +} @end diff --git a/framework/Source/GPUImageFramebufferCache.m b/framework/Source/GPUImageFramebufferCache.m index da1269476..bafaeb5b2 100644 --- a/framework/Source/GPUImageFramebufferCache.m +++ b/framework/Source/GPUImageFramebufferCache.m @@ -52,20 +52,15 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture } else { - NSLog(@"Existing cached textures for hash: %@", lookupHash); - // Something found, pull the old framebuffer and decrement the count NSInteger currentTextureID = (numberOfMatchingTextures - 1); while ((framebufferFromCache == nil) && (currentTextureID >= 0)) { NSString *textureHash = [NSString stringWithFormat:@"%@-%d", lookupHash, currentTextureID]; - NSLog(@"Looking up texture hash of %@", textureHash); -// NSLog(@"Cache size: %d", [framebufferCache countLimit]); framebufferFromCache = [framebufferCache objectForKey:textureHash]; // Test the values in the cache first, to see if they got invalidated behind our back if (framebufferFromCache != nil) { - NSLog(@"Withdrawing texture hash of %@", textureHash); // Withdraw this from the cache while it's in use [framebufferCache removeObjectForKey:textureHash]; } @@ -73,7 +68,6 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture } currentTextureID++; - NSLog(@"Setting new count to %d for hash: %@", currentTextureID, lookupHash); [framebufferTypeCounts setObject:[NSNumber numberWithInteger:currentTextureID] forKey:lookupHash]; @@ -82,7 +76,6 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture NSLog(@"Cached textures were nil for hash: %@", lookupHash); framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions]; - } } @@ -116,7 +109,6 @@ - (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; NSString *textureHash = [NSString stringWithFormat:@"%@-%d", lookupHash, numberOfMatchingTextures]; - NSLog(@"Returning framebuffer: %@ with hash: %@", framebuffer, textureHash); [framebufferCache setObject:framebuffer forKey:textureHash cost:round(framebufferSize.width * framebufferSize.height * 4.0)]; // [framebufferCache setObject:framebuffer forKey:textureHash]; [framebufferTypeCounts setObject:[NSNumber numberWithInteger:(numberOfMatchingTextures + 1)] forKey:lookupHash]; diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index bee907f16..7fde186ce 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -361,13 +361,13 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; #pragma mark - #pragma mark Rendering -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates]; for (NSUInteger currentAdditionalBlurPass = 1; currentAdditionalBlurPass < _blurPasses; currentAdditionalBlurPass++) { - [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation] sourceTexture:secondFilterOutputTexture]; + [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation]]; } } diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index ae0bcff0e..58e7fba43 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -41,34 +41,34 @@ void main() #endif -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (!currentlyReceivingMonochromeInput) { - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates]; } } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; -{ - [super setInputTexture:newInputTexture atIndex:textureIndex]; - if (currentlyReceivingMonochromeInput) - { - [self notifyTargetsAboutNewOutputTexture]; - } -} +//- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +//{ +// [super setInputTexture:newInputTexture atIndex:textureIndex]; +// if (currentlyReceivingMonochromeInput) +// { +// [self notifyTargetsAboutNewOutputTexture]; +// } +//} -- (GLuint)textureForOutput; -{ - if (currentlyReceivingMonochromeInput) - { - return filterSourceTexture; - } - else - { - return outputTexture; - } -} +//- (GLuint)textureForOutput; +//{ +// if (currentlyReceivingMonochromeInput) +// { +// return filterSourceTexture; +// } +// else +// { +// return outputTexture; +// } +//} - (BOOL)wantsMonochromeInput; { @@ -80,46 +80,47 @@ - (BOOL)providesMonochromeOutput; return YES; } -- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; -{ - if (self.frameProcessingCompletionBlock != NULL) - { - self.frameProcessingCompletionBlock(self, frameTime); - } - - for (id currentTarget in targets) - { - if (currentTarget != self.targetToIgnoreForUpdates) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; - } - - if (currentlyReceivingMonochromeInput) - { - [currentTarget setInputRotation:inputRotation atIndex:textureIndex]; - - CGSize sizeToRotate = [self outputFrameSize]; - CGSize rotatedSize = sizeToRotate; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - rotatedSize.width = sizeToRotate.height; - rotatedSize.height = sizeToRotate.width; - } - [currentTarget setInputSize:rotatedSize atIndex:textureIndex]; - } - else - { - [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; - } - [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndex]; - } - } -} +// TODO: Rewrite this based on the new GPUImageFilter implementation +//- (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; +//{ +// if (self.frameProcessingCompletionBlock != NULL) +// { +// self.frameProcessingCompletionBlock(self, frameTime); +// } +// +// for (id currentTarget in targets) +// { +// if (currentTarget != self.targetToIgnoreForUpdates) +// { +// NSInteger indexOfObject = [targets indexOfObject:currentTarget]; +// NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; +// +// if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) +// { +// [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; +// } +// +// if (currentlyReceivingMonochromeInput) +// { +// [currentTarget setInputRotation:inputRotation atIndex:textureIndex]; +// +// CGSize sizeToRotate = [self outputFrameSize]; +// CGSize rotatedSize = sizeToRotate; +// if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) +// { +// rotatedSize.width = sizeToRotate.height; +// rotatedSize.height = sizeToRotate.width; +// } +// [currentTarget setInputSize:rotatedSize atIndex:textureIndex]; +// } +// else +// { +// [currentTarget setInputSize:[self outputFrameSize] atIndex:textureIndex]; +// } +// [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndex]; +// } +// } +//} #pragma mark - #pragma mark Initialization and teardown diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 4201e750e..8110c082b 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -229,14 +229,12 @@ - (CGSize)sizeOfFBO; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [targets count]; - if (vertexSamplingCoordinates == NULL) { [self generatePointCoordinates]; } - [self renderToTextureWithVertices:NULL textureCoordinates:NULL sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:NULL textureCoordinates:NULL]; [self informTargetsAboutNewFrameAtTime:frameTime]; } @@ -261,7 +259,7 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg inputRotation = kGPUImageNoRotation; } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { // we need a normal color texture for this filter NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); @@ -275,9 +273,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [GPUImageContext useImageProcessingContext]; glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates); - - [self setFilterFBO]; - + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; + [GPUImageContext setActiveShaderProgram:filterProgram]; glClearColor(0.0, 0.0, 0.0, 1.0); @@ -304,6 +302,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } glDisable(GL_BLEND); + [firstInputFramebuffer unlock]; } #pragma mark - diff --git a/framework/Source/GPUImageJFAVoronoiFilter.m b/framework/Source/GPUImageJFAVoronoiFilter.m index 46efee024..335dc91dc 100644 --- a/framework/Source/GPUImageJFAVoronoiFilter.m +++ b/framework/Source/GPUImageJFAVoronoiFilter.m @@ -362,30 +362,6 @@ -(void)setSizeInPixels:(CGSize)sizeInPixels { #pragma mark - #pragma mark Managing the display FBOs - -- (void)initializeOutputTextureIfNeeded; -{ - [GPUImageContext useImageProcessingContext]; - - glActiveTexture(GL_TEXTURE2); - glGenTextures(1, &outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); - // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - glBindTexture(GL_TEXTURE_2D, 0); - - glGenTextures(1, &secondFilterOutputTexture); - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - glBindTexture(GL_TEXTURE_2D, 0); -} - -(NSUInteger)nextPowerOfTwo:(CGPoint)input { NSUInteger val; if (input.x > input.y) { @@ -404,146 +380,24 @@ -(NSUInteger)nextPowerOfTwo:(CGPoint)input { return val; } -- (void)createFilterFBOofSize:(CGSize)currentFBOSize -{ - - [self prepareForImageCapture]; - numPasses = (int)log2([self nextPowerOfTwo:CGPointMake(currentFBOSize.width, currentFBOSize.height)]); - - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - //preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - //preparedToCaptureImage = YES; - - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - - } - - glGenFramebuffers(1, &secondFilterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); -#endif - - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) - { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); - } - - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - self.outputTextureOptions.internalFormat, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - self.outputTextureOptions.format, // native iOS format - self.outputTextureOptions.type, - 0, - &renderTexture); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); - } - - CFRelease(attrs); - CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapS); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); - - [self notifyTargetsAboutNewOutputTexture]; -#endif - } - else - { - [self initializeOutputTextureIfNeeded]; - - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexImage2D(GL_TEXTURE_2D, - 0, - self.outputTextureOptions.internalFormat, - (int)currentFBOSize.width, - (int)currentFBOSize.height, - 0, - self.outputTextureOptions.format, - self.outputTextureOptions.type, - 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); - - [self notifyTargetsAboutNewOutputTexture]; - } - - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); - - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - - glBindTexture(GL_TEXTURE_2D, 0); -} - - -//we may not need these -- (void)setSecondFilterFBO; -{ - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - // - // CGSize currentFBOSize = [self sizeOfFBO]; - // glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); -} - -- (void)setOutputFBO; -{ - if (currentPass % 2 == 1) { - [self setSecondFilterFBO]; - } else { - [self setFilterFBO]; - } - -} - +//- (void)setOutputFBO; +//{ +// if (currentPass % 2 == 1) { +// [self setSecondFilterFBO]; +// } else { +// [self setFilterFBO]; +// } +// +//} -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { // Run the first stage of the two-pass filter [GPUImageContext setActiveShaderProgram:filterProgram]; currentPass = 0; - [self setFilterFBO]; + + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; glActiveTexture(GL_TEXTURE2); @@ -554,7 +408,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); - glBindTexture(GL_TEXTURE_2D, sourceTexture); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); glUniform1i(filterInputTextureUniform, 2); @@ -565,7 +419,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates for (int pass = 1; pass <= numPasses + 1; pass++) { currentPass = pass; - [self setOutputFBO]; +// [self setOutputFBO]; //glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); @@ -574,7 +428,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (pass % 2 == 0) { glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); } else { - glBindTexture(GL_TEXTURE_2D, outputTexture); + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); } glUniform1i(filterInputTextureUniform, 2); diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m index 54483ef96..01788be31 100644 --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -161,9 +161,16 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; }); } -// The first pass (vertical) of the resampling needs to be shrunk in only one dimension so that the remaining shrinkage can be performed in the horizonal pass -- (void)setFilterFBO; + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { + if (self.preventRendering) + { + return; + } + + [GPUImageContext setActiveShaderProgram:filterProgram]; + CGSize currentFBOSize = [self sizeOfFBO]; if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { @@ -173,30 +180,51 @@ - (void)setFilterFBO; { currentFBOSize.width = self.originalImageSize.width; } - - if (!filterFramebuffer) - { - [super createFilterFBOofSize:currentFBOSize]; - [self setupFilterForSize:currentFBOSize]; - } + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:currentFBOSize textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; - glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); + [self setUniformsForProgramAtIndex:0]; - glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); -} - -- (void)setSecondFilterFBO; -{ - CGSize currentFBOSize = [self sizeOfFBO]; - if (!secondFilterFramebuffer) - { - [self createFilterFBOofSize:currentFBOSize]; - [self setupFilterForSize:currentFBOSize]; - } + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT); - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - - glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); + + glUniform1i(filterInputTextureUniform, 2); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + [firstInputFramebuffer unlock]; + + // Run the second stage of the two-pass filter + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, 0); + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, 0); + secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [secondOutputFramebuffer activateFramebuffer]; + + [self setUniformsForProgramAtIndex:1]; + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); + + glUniform1i(secondFilterInputTextureUniform, 3); + + glVertexAttribPointer(secondFilterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + [outputFramebuffer unlock]; + outputFramebuffer = nil; } @end diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m index 513250e9c..759899542 100644 --- a/framework/Source/GPUImageLineGenerator.m +++ b/framework/Source/GPUImageLineGenerator.m @@ -119,7 +119,8 @@ - (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext setActiveShaderProgram:filterProgram]; - [self setFilterFBO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); @@ -137,7 +138,7 @@ - (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger }); } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { // Prevent rendering of the frame by normal means } diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index 4b6caa0e7..a9ad957b0 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -173,7 +173,7 @@ - (void)initializeSecondaryAttributes; [secondFilterProgram addAttribute:@"inputTextureCoordinate"]; } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) { @@ -196,7 +196,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates #endif glViewport(0, 0, (int)currentStageSize.width, (int)currentStageSize.height); - GLuint currentTexture = sourceTexture; + GLuint currentTexture = [firstInputFramebuffer texture]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageMaskFilter.m b/framework/Source/GPUImageMaskFilter.m index bf3c84d3d..24503b3bf 100755 --- a/framework/Source/GPUImageMaskFilter.m +++ b/framework/Source/GPUImageMaskFilter.m @@ -64,11 +64,11 @@ - (id)init; return self; } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates]; glDisable(GL_BLEND); } diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index 7952e8584..593410a6a 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -42,7 +42,7 @@ - (id)initWithAsset:(AVAsset *)asset; - (id)initWithPlayerItem:(AVPlayerItem *)playerItem; - (id)initWithURL:(NSURL *)url; -- (void)textureCacheSetup; +- (void)yuvConversionSetup; /// @name Movie processing - (void)enableSynchronizedEncodingUsingMovieWriter:(GPUImageMovieWriter *)movieWriter; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 178dd27aa..a0e26166c 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -7,7 +7,6 @@ @interface GPUImageMovie () { BOOL audioEncodingIsFinished, videoEncodingIsFinished; GPUImageMovieWriter *synchronizedMovieWriter; - CVOpenGLESTextureCacheRef coreVideoTextureCache; AVAssetReader *reader; AVPlayerItemVideoOutput *playerItemOutput; CADisplayLink *displayLink; @@ -21,7 +20,6 @@ @interface GPUImageMovie () GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; GLint yuvConversionMatrixUniform; - GLuint yuvConversionFramebuffer; const GLfloat *_preferredConversion; int imageBufferWidth, imageBufferHeight; @@ -50,7 +48,7 @@ - (id)initWithURL:(NSURL *)url; return nil; } - [self textureCacheSetup]; + [self yuvConversionSetup]; self.url = url; self.asset = nil; @@ -65,7 +63,7 @@ - (id)initWithAsset:(AVAsset *)asset; return nil; } - [self textureCacheSetup]; + [self yuvConversionSetup]; self.url = nil; self.asset = asset; @@ -80,7 +78,7 @@ - (id)initWithPlayerItem:(AVPlayerItem *)playerItem; return nil; } - [self textureCacheSetup]; + [self yuvConversionSetup]; self.url = nil; self.asset = nil; @@ -89,7 +87,7 @@ - (id)initWithPlayerItem:(AVPlayerItem *)playerItem; return self; } -- (void)textureCacheSetup; +- (void)yuvConversionSetup; { if ([GPUImageContext supportsFastTextureUpload]) { @@ -127,19 +125,6 @@ - (void)textureCacheSetup; glEnableVertexAttribArray(yuvConversionPositionAttribute); glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); - -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); -#endif - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Need to remove the initially created texture - [self deleteOutputTexture]; }); } } @@ -150,11 +135,6 @@ - (void)dealloc [displayLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; displayLink = nil; }); - if ([GPUImageContext supportsFastTextureUpload]) - { - CFRelease(coreVideoTextureCache); - [self destroyYUVConversionFBO]; - } } #pragma mark - @@ -464,7 +444,6 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu { CVOpenGLESTextureRef luminanceTextureRef = NULL; CVOpenGLESTextureRef chrominanceTextureRef = NULL; - CVOpenGLESTextureRef texture = NULL; // if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) if (CVPixelBufferGetPlaneCount(movieFrame) > 0) // Check for YUV planar inputs to do RGB conversion @@ -474,9 +453,6 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu { imageBufferWidth = bufferWidth; imageBufferHeight = bufferHeight; - - [self destroyYUVConversionFBO]; - [self createYUVConversionFBO]; } CVReturn err; @@ -484,11 +460,11 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu glActiveTexture(GL_TEXTURE4); if ([GPUImageContext deviceSupportsRedTextures]) { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); } else { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); } if (err) { @@ -504,11 +480,11 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu glActiveTexture(GL_TEXTURE5); if ([GPUImageContext deviceSupportsRedTextures]) { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); } else { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); } if (err) { @@ -529,56 +505,60 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; - [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; - [currentTarget setTextureDelegate:self atIndex:targetTextureIndex]; - - [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; - } - - CVPixelBufferUnlockBaseAddress(movieFrame, 0); - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(luminanceTextureRef); - CFRelease(chrominanceTextureRef); - } - else - { - CVPixelBufferLockBaseAddress(movieFrame, 0); - - CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); - - if (!texture || err) { - NSLog(@"Movie CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); - NSAssert(NO, @"Camera failure"); - return; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:targetTextureIndex]; } - - outputTexture = CVOpenGLESTextureGetName(texture); - // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + [outputFramebuffer unlock]; for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; - [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; - [currentTarget setTextureDelegate:self atIndex:targetTextureIndex]; - [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; } CVPixelBufferUnlockBaseAddress(movieFrame, 0); - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(texture); - - outputTexture = 0; + CFRelease(luminanceTextureRef); + CFRelease(chrominanceTextureRef); + } + else + { + // TODO: Mesh this with the new framebuffer cache +// CVPixelBufferLockBaseAddress(movieFrame, 0); +// +// CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, movieFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); +// +// if (!texture || err) { +// NSLog(@"Movie CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); +// NSAssert(NO, @"Camera failure"); +// return; +// } +// +// outputTexture = CVOpenGLESTextureGetName(texture); +// // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); +// glBindTexture(GL_TEXTURE_2D, outputTexture); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +// +// for (id currentTarget in targets) +// { +// NSInteger indexOfObject = [targets indexOfObject:currentTarget]; +// NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; +// +// [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; +// [currentTarget setInputTexture:outputTexture atIndex:targetTextureIndex]; +// +// [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; +// } +// +// CVPixelBufferUnlockBaseAddress(movieFrame, 0); +// CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); +// CFRelease(texture); +// +// outputTexture = 0; } } else @@ -586,7 +566,9 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu // Upload to texture CVPixelBufferLockBaseAddress(movieFrame, 0); - glBindTexture(GL_TEXTURE_2D, outputTexture); + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) textureOptions:self.outputTextureOptions]; + + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); // Using BGRA extension to pull in video frame data directly glTexImage2D(GL_TEXTURE_2D, 0, @@ -598,13 +580,20 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu self.outputTextureOptions.type, CVPixelBufferGetBaseAddress(movieFrame)); - CGSize currentSize = CGSizeMake(bufferWidth, bufferHeight); for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:currentSize atIndex:targetTextureIndex]; + [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:targetTextureIndex]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:targetTextureIndex]; + } + + [outputFramebuffer unlock]; + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex]; } CVPixelBufferUnlockBaseAddress(movieFrame, 0); @@ -650,7 +639,8 @@ - (void)cancelProcessing - (void)convertYUVToRGBOutput; { [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - [self setYUVConversionFBO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight)]; + [outputFramebuffer activateFramebuffer]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -685,57 +675,6 @@ - (void)convertYUVToRGBOutput; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -- (void)setYUVConversionFBO; -{ - if (!yuvConversionFramebuffer) - { - [self createYUVConversionFBO]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); - - glViewport(0, 0, imageBufferWidth, imageBufferHeight); -} - -- (void)createYUVConversionFBO; -{ - [self initializeOutputTextureIfNeeded]; - - glActiveTexture(GL_TEXTURE1); - glGenFramebuffers(1, &yuvConversionFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); - - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageBufferWidth, imageBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - [self notifyTargetsAboutNewOutputTexture]; - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - glBindTexture(GL_TEXTURE_2D, 0); - -} - -- (void)destroyYUVConversionFBO; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (yuvConversionFramebuffer) - { - glDeleteFramebuffers(1, &yuvConversionFramebuffer); - yuvConversionFramebuffer = 0; - } - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } - }); -} - - (AVAssetReader*)assetReader { return reader; } diff --git a/framework/Source/GPUImageMovieComposition.m b/framework/Source/GPUImageMovieComposition.m index c71f7e1d7..6138fffe3 100644 --- a/framework/Source/GPUImageMovieComposition.m +++ b/framework/Source/GPUImageMovieComposition.m @@ -23,7 +23,7 @@ - (id)initWithComposition:(AVComposition*)compositon return nil; } - [self textureCacheSetup]; + [self yuvConversionSetup]; self.compositon = compositon; self.videoComposition = videoComposition; diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 82bac0e03..1a94ddd81 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -35,22 +35,16 @@ void reportAvailableMemoryForGPUImage(NSString *tag); Source objects upload still image frames to OpenGL ES as textures, then hand those textures off to the next objects in the processing chain. */ -@interface GPUImageOutput : NSObject +@interface GPUImageOutput : NSObject { - GPUImageFramebuffer *framebuffer; + GPUImageFramebuffer *outputFramebuffer; NSMutableArray *targets, *targetTextureIndices; - GLuint outputTexture; CGSize inputTextureSize, cachedMaximumOutputSize, forcedMaximumSize; BOOL overrideInputSize; - BOOL processingLargeImage; - NSUInteger outputTextureRetainCount; - - __unsafe_unretained id firstTextureDelegate; - BOOL allTargetsWantMonochromeData; } @@ -63,8 +57,8 @@ void reportAvailableMemoryForGPUImage(NSString *tag); @property(readwrite, nonatomic) GPUTextureOptions outputTextureOptions; /// @name Managing targets -- (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; -- (GLuint)textureForOutput; +- (void)setInputFramebufferForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; +- (GPUImageFramebuffer *)framebufferForOutput; - (void)notifyTargetsAboutNewOutputTexture; /** Returns an array of the current targets. @@ -101,11 +95,8 @@ void reportAvailableMemoryForGPUImage(NSString *tag); /// @name Manage the output texture -- (void)initializeOutputTextureIfNeeded; -- (void)deleteOutputTexture; - (void)forceProcessingAtSize:(CGSize)frameSize; - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; -- (void)cleanupOutputImage; /// @name Still image processing diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 7c733b537..a7c7b1db3 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -111,22 +111,19 @@ - (id)init; - (void)dealloc { [self removeAllTargets]; - [self deleteOutputTexture]; } #pragma mark - #pragma mark Managing targets -- (void)setInputTextureForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; +- (void)setInputFramebufferForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; { - [target setInputTexture:[self textureForOutput] atIndex:inputTextureIndex]; + [target setInputFramebuffer:[self framebufferForOutput] atIndex:inputTextureIndex]; } -- (GLuint)textureForOutput; +- (GPUImageFramebuffer *)framebufferForOutput; { - return [framebuffer texture]; -// -// return outputTexture; + return outputFramebuffer; } - (void)notifyTargetsAboutNewOutputTexture; @@ -136,7 +133,7 @@ - (void)notifyTargetsAboutNewOutputTexture; NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [self setInputTextureForTarget:currentTarget atIndex:textureIndex]; + [self setInputFramebufferForTarget:currentTarget atIndex:textureIndex]; } } @@ -165,8 +162,7 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text cachedMaximumOutputSize = CGSizeZero; runSynchronouslyOnVideoProcessingQueue(^{ - [self setInputTextureForTarget:newTarget atIndex:textureLocation]; - [newTarget setTextureDelegate:self atIndex:textureLocation]; + [self setInputFramebufferForTarget:newTarget atIndex:textureLocation]; [targets addObject:newTarget]; [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; @@ -192,9 +188,7 @@ - (void)removeTarget:(id)targetToRemove; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; runSynchronouslyOnVideoProcessingQueue(^{ - [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; - [targetToRemove setTextureDelegate:nil atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; [targetTextureIndices removeObjectAtIndex:indexOfObject]; @@ -212,9 +206,7 @@ - (void)removeAllTargets; NSInteger indexOfObject = [targets indexOfObject:targetToRemove]; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [targetToRemove setInputTexture:0 atIndex:textureIndexOfTarget]; [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; - [targetToRemove setTextureDelegate:nil atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; } [targets removeAllObjects]; @@ -227,39 +219,6 @@ - (void)removeAllTargets; #pragma mark - #pragma mark Manage the output texture -- (void)initializeOutputTextureIfNeeded; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - if (!outputTexture) - { - [GPUImageContext useImageProcessingContext]; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); - // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - glBindTexture(GL_TEXTURE_2D, 0); - } - }); -} - -- (void)deleteOutputTexture; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } - }); -} - - (void)forceProcessingAtSize:(CGSize)frameSize; { @@ -269,11 +228,6 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; { } -- (void)cleanupOutputImage; -{ - NSLog(@"WARNING: Undefined image cleanup"); -} - #pragma mark - #pragma mark Still image processing @@ -425,18 +379,6 @@ - (CGImageRef)newCGImageByFilteringImage:(NSImage *)imageToFilter #endif -#pragma mark - -#pragma mark GPUImageTextureDelegate methods - -- (void)textureNoLongerNeededForTarget:(id)textureTarget; -{ - outputTextureRetainCount--; - if (outputTextureRetainCount < 1) - { - [self cleanupOutputImage]; - } -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index a50df8cab..7c62bb1f1 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -127,19 +127,17 @@ - (void)generateLineCoordinates; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [targets count]; - if (lineCoordinates == NULL) { [self generateLineCoordinates]; } - [self renderToTextureWithVertices:NULL textureCoordinates:NULL sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:NULL textureCoordinates:NULL]; [self informTargetsAboutNewFrameAtTime:frameTime]; } -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { // we need a normal color texture for this filter NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); @@ -222,7 +220,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); // NSLog(@"Line generation processing time : %f ms", 1000.0 * currentFrameTime); - [self setFilterFBO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; [GPUImageContext setActiveShaderProgram:filterProgram]; @@ -247,6 +246,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { glDisable(GL_BLEND); } + [firstInputFramebuffer unlock]; } @end diff --git a/framework/Source/GPUImagePoissonBlendFilter.h b/framework/Source/GPUImagePoissonBlendFilter.h index da3b63683..58eff2254 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.h +++ b/framework/Source/GPUImagePoissonBlendFilter.h @@ -5,8 +5,7 @@ { GLint mixUniform; - GLuint secondFilterOutputTexture; - GLuint secondFilterFramebuffer; + GPUImageFramebuffer *secondOutputFramebuffer; } // Mix ranges from 0.0 (only image 1) to 1.0 (only image 2 gradients), with 1.0 as the normal level diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m index 105031a68..71104961b 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.m +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -121,228 +121,21 @@ - (void)setMix:(CGFloat)newValue; [self setFloat:_mix forUniform:mixUniform program:filterProgram]; } -- (void)initializeSecondOutputTextureIfNeeded; -{ - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - return; - } - - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (!secondFilterOutputTexture) - { - glGenTextures(1, &secondFilterOutputTexture); - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); - } - }); -} - -- (void)deleteOutputTexture; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } - - if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) - { - if (secondFilterOutputTexture) - { - glDeleteTextures(1, &secondFilterOutputTexture); - secondFilterOutputTexture = 0; - } - } - }); -} - -- (void)createFilterFBOofSize:(CGSize)currentFBOSize -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (!filterFramebuffer) - { - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - } - } - - glGenFramebuffers(1, &secondFilterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); -#endif - - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) - { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); - } - - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - self.outputTextureOptions.internalFormat, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - self.outputTextureOptions.format, // native iOS format - self.outputTextureOptions.type, - 0, - &renderTexture); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); - } - - CFRelease(attrs); - CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); - - [self notifyTargetsAboutNewOutputTexture]; -#endif - } - else - { - [self initializeSecondOutputTextureIfNeeded]; - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - // if ([self providesMonochromeOutput] && [GPUImageContext deviceSupportsRedTextures]) - // { - // glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); - // } - // else - // { - glTexImage2D(GL_TEXTURE_2D, - 0, - self.outputTextureOptions.internalFormat, - (int)currentFBOSize.width, - (int)currentFBOSize.height, - 0, - self.outputTextureOptions.format, - self.outputTextureOptions.type, 0); - // } - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); - - [self notifyTargetsAboutNewOutputTexture]; - } - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - - glBindTexture(GL_TEXTURE_2D, 0); - }); -} - -- (void)recreateFilterFBO -{ - cachedMaximumOutputSize = CGSizeZero; - - [self destroyFilterFBO]; - [self deleteOutputTexture]; -} - -- (void)destroyFilterFBO; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (filterFramebuffer) - { - glDeleteFramebuffers(1, &filterFramebuffer); - filterFramebuffer = 0; - } - - if (secondFilterFramebuffer) - { - glDeleteFramebuffers(1, &secondFilterFramebuffer); - secondFilterFramebuffer = 0; - } - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - if (filterTextureCache != NULL) - { - CFRelease(renderTarget); - renderTarget = NULL; - - if (renderTexture) - { - CFRelease(renderTexture); - renderTexture = NULL; - } - - CVOpenGLESTextureCacheFlush(filterTextureCache, 0); - CFRelease(filterTextureCache); - filterTextureCache = NULL; - } -#endif - }); -} - -- (void)setSecondFilterFBO; -{ - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); -} - -- (void)setOutputFBO; -{ - if (self.numIterations % 2 == 1) { - [self setSecondFilterFBO]; - } else { - [self setFilterFBO]; - } -} - -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +//- (void)setOutputFBO; +//{ +// if (self.numIterations % 2 == 1) { +// [self setSecondFilterFBO]; +// } else { +// [self setFilterFBO]; +// } +//} + +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { // Run the first stage of the two-pass filter [GPUImageContext setActiveShaderProgram:filterProgram]; - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates]; for (int pass = 1; pass < self.numIterations; pass++) { @@ -350,10 +143,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [GPUImageContext setActiveShaderProgram:filterProgram]; - [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation] sourceTexture:secondFilterOutputTexture]; + // TODO: This will over-unlock the incoming framebuffer + [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation]]; } else { // Run the second stage of the two-pass filter - [self setSecondFilterFBO]; + secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [secondOutputFramebuffer activateFramebuffer]; [GPUImageContext setActiveShaderProgram:filterProgram]; @@ -361,11 +156,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, outputTexture); + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); glUniform1i(filterInputTextureUniform, 2); glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + glBindTexture(GL_TEXTURE_2D, [secondInputFramebuffer texture]); glUniform1i(filterInputTextureUniform2, 3); glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 3c0351652..7ee652c0e 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -67,10 +67,11 @@ - (void)dealloc; - (void)uploadBytes:(GLubyte *)bytesToUpload; { [GPUImageContext useImageProcessingContext]; - - [self initializeOutputTextureIfNeeded]; - glBindTexture(GL_TEXTURE_2D, outputTexture); + // TODO: This probably isn't right, and will need to be corrected + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:uploadedImageSize textureOptions:self.outputTextureOptions]; + + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); glTexImage2D(GL_TEXTURE_2D, 0, _pixelFormat==GPUPixelFormatRGB ? GL_RGB : GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, (GLint)_pixelFormat, (GLenum)_pixelType, bytesToUpload); } diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index 762e8eb6b..5b975068e 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -14,24 +14,14 @@ typedef struct GPUByteColorVector GPUByteColorVector; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE @interface GPUImageRawDataOutput : NSObject { CGSize imageSize; - CVOpenGLESTextureCacheRef rawDataTextureCache; - CVPixelBufferRef renderTarget; GPUImageRotationMode inputRotation; BOOL outputBGRA; - CVOpenGLESTextureRef renderTexture; - - __unsafe_unretained id textureDelegate; } #else @interface GPUImageRawDataOutput : NSObject { CGSize imageSize; - CVOpenGLTextureCacheRef rawDataTextureCache; - CVPixelBufferRef renderTarget; GPUImageRotationMode inputRotation; BOOL outputBGRA; - CVOpenGLTextureRef renderTexture; - - __unsafe_unretained id textureDelegate; } #endif diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 28a462b98..676493d20 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -7,13 +7,10 @@ @interface GPUImageRawDataOutput () { + GPUImageFramebuffer *firstInputFramebuffer, *outputFramebuffer; BOOL hasReadFromTheCurrentFrame; - GLuint dataFramebuffer, dataRenderbuffer; - - GLuint inputTextureForDisplay; - GLProgram *dataProgram; GLint dataPositionAttribute, dataTextureCoordinateAttribute; GLint dataInputTextureUniform; @@ -22,10 +19,6 @@ @interface GPUImageRawDataOutput () } // Frame rendering -- (void)createDataFBO; -- (void)destroyDataFBO; -- (void)setFilterFBO; - - (void)renderAtInternalSize; @end @@ -90,191 +83,23 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn - (void)dealloc { - [self destroyDataFBO]; - - if (_rawBytesForImage != NULL && (![GPUImageContext supportsFastTextureUpload])) + if (_rawBytesForImage != NULL && (![GPUImageContext supportsFastTextureUpload])) { free(_rawBytesForImage); _rawBytesForImage = NULL; } } -#pragma mark - -#pragma mark Frame rendering - -- (void)createDataFBO; -{ - glActiveTexture(GL_TEXTURE1); - glGenFramebuffers(1, &dataFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, dataFramebuffer); - - if ([GPUImageContext supportsFastTextureUpload]) - { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &rawDataTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &rawDataTextureCache); -#endif -#else - CGLContextObj context = (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context]; - CVReturn err = CVOpenGLTextureCacheCreate(kCFAllocatorDefault, - NULL, - context, - CGLGetPixelFormat(context), - NULL, - &rawDataTextureCache); -#endif - - if (err) - { - NSAssert(NO, @"Error at CVOpenGL(ES)TextureCacheCreate %d", err); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, // our empty IOSurface properties dictionary - NULL, - NULL, - 0, - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, - 1, - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); - - CFDictionarySetValue(attrs, - kCVPixelBufferIOSurfacePropertiesKey, - empty); - - //CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &renderTarget); - - CVPixelBufferCreate(kCFAllocatorDefault, - (int)imageSize.width, - (int)imageSize.height, - kCVPixelFormatType_32BGRA, - attrs, - &renderTarget); - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - rawDataTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - GL_RGBA, // opengl format - (int)imageSize.width, - (int)imageSize.height, - GL_BGRA, // native iOS format - GL_UNSIGNED_BYTE, - 0, - &renderTexture); -#else - CVOpenGLTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - rawDataTextureCache, renderTarget, - NULL, - &renderTexture); -#endif - - CFRelease(attrs); - CFRelease(empty); - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); -#else - glBindTexture(CVOpenGLTextureGetTarget(renderTexture), CVOpenGLTextureGetName(renderTexture)); -#endif - - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); -#else - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLTextureGetName(renderTexture), 0); -#endif - } - else - { - - glGenRenderbuffers(1, &dataRenderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, dataRenderbuffer); - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, (int)imageSize.width, (int)imageSize.height); -#else - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, (int)imageSize.width, (int)imageSize.height); -#endif - - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, dataRenderbuffer); - } - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); -} - -- (void)destroyDataFBO; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (renderTexture) - { - CFRelease(renderTexture); - renderTexture = NULL; - } - - if (dataFramebuffer) - { - glDeleteFramebuffers(1, &dataFramebuffer); - dataFramebuffer = 0; - } - - if (dataRenderbuffer) - { - glDeleteRenderbuffers(1, &dataRenderbuffer); - dataRenderbuffer = 0; - } - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - if (rawDataTextureCache) - { - CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); - CFRelease(rawDataTextureCache); - rawDataTextureCache = 0; - } -#endif - - if (renderTarget) - { - CVPixelBufferRelease(renderTarget); - renderTarget = 0; - } - }); -} - -- (void)setFilterFBO; -{ - if (!dataFramebuffer) - { - [self createDataFBO]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, dataFramebuffer); - - glViewport(0, 0, (int)imageSize.width, (int)imageSize.height); -} - #pragma mark - #pragma mark Data access - (void)renderAtInternalSize; { [GPUImageContext setActiveShaderProgram:dataProgram]; - [self setFilterFBO]; - + + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:imageSize]; + [outputFramebuffer activateFramebuffer]; + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -293,7 +118,7 @@ - (void)renderAtInternalSize; }; glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); glUniform1i(dataInputTextureUniform, 4); glVertexAttribPointer(dataPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); @@ -303,6 +128,7 @@ - (void)renderAtInternalSize; glEnableVertexAttribArray(dataTextureCoordinateAttribute); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + [firstInputFramebuffer unlock]; } - (GPUByteColorVector)colorAtLocation:(CGPoint)locationInImage; @@ -359,9 +185,10 @@ - (NSInteger)nextAvailableTextureIndex; return 0; } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { - inputTextureForDisplay = newInputTexture; + firstInputFramebuffer = newInputFramebuffer; + [firstInputFramebuffer lock]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -387,11 +214,6 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - textureDelegate = newTextureDelegate; -} - - (BOOL)wantsMonochromeInput; { return NO; @@ -407,66 +229,72 @@ - (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; - (GLubyte *)rawBytesForImage; { - if ( (_rawBytesForImage == NULL) && (![GPUImageContext supportsFastTextureUpload]) ) - { - _rawBytesForImage = (GLubyte *) calloc(imageSize.width * imageSize.height * 4, sizeof(GLubyte)); - hasReadFromTheCurrentFrame = NO; - } - - if (hasReadFromTheCurrentFrame) - { - return _rawBytesForImage; - } - else - { - runSynchronouslyOnVideoProcessingQueue(^{ - // Note: the fast texture caches speed up 640x480 frame reads from 9.6 ms to 3.1 ms on iPhone 4S - - [GPUImageContext useImageProcessingContext]; - if ([GPUImageContext supportsFastTextureUpload]) - { - CVPixelBufferUnlockBaseAddress(renderTarget, 0); - // CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); - } - - [self renderAtInternalSize]; - - if ([GPUImageContext supportsFastTextureUpload]) - { - glFinish(); - CVPixelBufferLockBaseAddress(renderTarget, 0); - _rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); - } - else - { - glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); - // GL_EXT_read_format_bgra - // glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); - } - - hasReadFromTheCurrentFrame = YES; - - }); - - return _rawBytesForImage; - } +// if ( (_rawBytesForImage == NULL) && (![GPUImageContext supportsFastTextureUpload]) ) +// { +// _rawBytesForImage = (GLubyte *) calloc(imageSize.width * imageSize.height * 4, sizeof(GLubyte)); +// hasReadFromTheCurrentFrame = NO; +// } +// +// if (hasReadFromTheCurrentFrame) +// { +// return _rawBytesForImage; +// } +// else +// { +// runSynchronouslyOnVideoProcessingQueue(^{ +// // Note: the fast texture caches speed up 640x480 frame reads from 9.6 ms to 3.1 ms on iPhone 4S +// +// [GPUImageContext useImageProcessingContext]; +// if ([GPUImageContext supportsFastTextureUpload]) +// { +// CVPixelBufferUnlockBaseAddress(renderTarget, 0); +// // CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); +// } +// +// [self renderAtInternalSize]; +// +// if ([GPUImageContext supportsFastTextureUpload]) +// { +// glFinish(); +// CVPixelBufferLockBaseAddress(renderTarget, 0); +// _rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); +// } +// else +// { +// glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); +// // GL_EXT_read_format_bgra +// // glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); +// } +// +// hasReadFromTheCurrentFrame = YES; +// +// }); +// +// return _rawBytesForImage; +// } + + + // TODO: Finish this + return NULL; } - (NSUInteger)bytesPerRowInOutput; { - if ([GPUImageContext supportsFastTextureUpload]) - { - return CVPixelBufferGetBytesPerRow(renderTarget); - } - else - { - return imageSize.width * 4; - } +// if ([GPUImageContext supportsFastTextureUpload]) +// { +// return CVPixelBufferGetBytesPerRow(renderTarget); +// } +// else +// { +// return imageSize.width * 4; +// } + + // TODO: Finish this + return 0; } - (void)setImageSize:(CGSize)newImageSize { imageSize = newImageSize; - [self destroyDataFBO]; if (_rawBytesForImage != NULL && (![GPUImageContext supportsFastTextureUpload])) { free(_rawBytesForImage); diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index d43b379fd..973ad1240 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -14,12 +14,11 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - - [self deleteOutputTexture]; }); - outputTexture = newInputTexture; textureSize = newTextureSize; + + // TODO: mesh this with the new framebuffer structure return self; } diff --git a/framework/Source/GPUImageTextureOutput.h b/framework/Source/GPUImageTextureOutput.h index af8442fbf..3b3f00ce6 100755 --- a/framework/Source/GPUImageTextureOutput.h +++ b/framework/Source/GPUImageTextureOutput.h @@ -5,7 +5,7 @@ @interface GPUImageTextureOutput : NSObject { - __unsafe_unretained id textureDelegate; + GPUImageFramebuffer *firstInputFramebuffer; } @property(readwrite, unsafe_unretained, nonatomic) id delegate; diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index 1d65ed1a7..1655c207a 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -34,9 +34,11 @@ - (NSInteger)nextAvailableTextureIndex; return 0; } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +// TODO: Deal with the fact that the texture changes regularly as a result of the caching +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { - _texture = newInputTexture; + firstInputFramebuffer = newInputFramebuffer; + [firstInputFramebuffer lock]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -61,11 +63,6 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - textureDelegate = newTextureDelegate; -} - - (BOOL)wantsMonochromeInput; { return NO; diff --git a/framework/Source/GPUImageThreeInputFilter.h b/framework/Source/GPUImageThreeInputFilter.h index d0e717879..5ecd53e0a 100644 --- a/framework/Source/GPUImageThreeInputFilter.h +++ b/framework/Source/GPUImageThreeInputFilter.h @@ -4,6 +4,8 @@ extern NSString *const kGPUImageThreeInputTextureVertexShaderString; @interface GPUImageThreeInputFilter : GPUImageTwoInputFilter { + GPUImageFramebuffer *thirdInputFramebuffer; + GLint filterThirdTextureCoordinateAttribute; GLint filterInputTextureUniform3; GPUImageRotationMode inputRotation3; @@ -12,8 +14,6 @@ extern NSString *const kGPUImageThreeInputTextureVertexShaderString; BOOL hasSetSecondTexture, hasReceivedThirdFrame, thirdFrameWasVideo; BOOL thirdFrameCheckDisabled; - - __unsafe_unretained id thirdTextureDelegate; } - (void)disableThirdFrameCheck; diff --git a/framework/Source/GPUImageThreeInputFilter.m b/framework/Source/GPUImageThreeInputFilter.m index e06071992..3b53690af 100644 --- a/framework/Source/GPUImageThreeInputFilter.m +++ b/framework/Source/GPUImageThreeInputFilter.m @@ -78,7 +78,7 @@ - (void)disableThirdFrameCheck; #pragma mark - #pragma mark Rendering -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) { @@ -86,22 +86,23 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - [self setFilterFBO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; [self setUniformsForProgramAtIndex:0]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, sourceTexture); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); glUniform1i(filterInputTextureUniform, 2); glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + glBindTexture(GL_TEXTURE_2D, [secondInputFramebuffer texture]); glUniform1i(filterInputTextureUniform2, 3); glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture3); + glBindTexture(GL_TEXTURE_2D, [thirdInputFramebuffer texture]); glUniform1i(filterInputTextureUniform3, 4); glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); @@ -110,6 +111,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(filterThirdTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation3]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + [firstInputFramebuffer unlock]; + [secondInputFramebuffer unlock]; + [thirdInputFramebuffer unlock]; } #pragma mark - @@ -131,21 +135,23 @@ - (NSInteger)nextAvailableTextureIndex; } } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { if (textureIndex == 0) { - filterSourceTexture = newInputTexture; + firstInputFramebuffer = newInputFramebuffer; hasSetFirstTexture = YES; + [firstInputFramebuffer lock]; } else if (textureIndex == 1) { - filterSourceTexture2 = newInputTexture; - hasSetSecondTexture = YES; + secondInputFramebuffer = newInputFramebuffer; + [secondInputFramebuffer lock]; } else { - filterSourceTexture3 = newInputTexture; + thirdInputFramebuffer = newInputFramebuffer; + [thirdInputFramebuffer lock]; } } @@ -214,8 +220,6 @@ - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [targets count]; - // You can set up infinite update loops, so this helps to short circuit them if (hasReceivedFirstFrame && hasReceivedSecondFrame && hasReceivedThirdFrame) { @@ -291,8 +295,6 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; // || (hasReceivedFirstFrame && secondFrameCheckDisabled) || (hasReceivedSecondFrame && firstFrameCheckDisabled) if ((hasReceivedFirstFrame && hasReceivedSecondFrame && hasReceivedThirdFrame) || updatedMovieFrameOppositeStillImage) { - outputTextureRetainCount = [targets count]; - static const GLfloat imageVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, @@ -300,7 +302,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; 1.0f, 1.0f, }; - [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; [self informTargetsAboutNewFrameAtTime:frameTime]; @@ -310,21 +312,4 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - if (textureIndex == 0) - { - firstTextureDelegate = newTextureDelegate; - } - else if (textureIndex == 1) - { - secondTextureDelegate = newTextureDelegate; - } - else - { - thirdTextureDelegate = newTextureDelegate; - } -} - - @end diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 391cd90a0..e5c2d8df3 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -527,7 +527,7 @@ - (void)updateToneCurveTexture; #pragma mark - #pragma mark Rendering -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) { @@ -535,13 +535,14 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - [self setFilterFBO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, sourceTexture); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); glUniform1i(filterInputTextureUniform, 2); glActiveTexture(GL_TEXTURE3); @@ -551,7 +552,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + [firstInputFramebuffer unlock]; } #pragma mark - diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index 6cbc5eb69..17933092e 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -146,8 +146,6 @@ - (void)convert3DTransform:(CATransform3D *)transform3D toMatrix:(GPUMatrix4x4 * - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [targets count]; - CGSize currentFBOSize = [self sizeOfFBO]; CGFloat normalizedHeight = currentFBOSize.height / currentFBOSize.width; @@ -182,22 +180,22 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { if (_anchorTopLeft) { - [self renderToTextureWithVertices:squareVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:squareVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; } else { - [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:squareVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; } } else { if (_anchorTopLeft) { - [self renderToTextureWithVertices:adjustedVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:adjustedVerticesAnchorTL textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; } else { - [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation] sourceTexture:filterSourceTexture]; + [self renderToTextureWithVertices:adjustedVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; } } diff --git a/framework/Source/GPUImageTwoInputFilter.h b/framework/Source/GPUImageTwoInputFilter.h index c6bb82e2c..da3a1345e 100644 --- a/framework/Source/GPUImageTwoInputFilter.h +++ b/framework/Source/GPUImageTwoInputFilter.h @@ -4,16 +4,15 @@ extern NSString *const kGPUImageTwoInputTextureVertexShaderString; @interface GPUImageTwoInputFilter : GPUImageFilter { + GPUImageFramebuffer *secondInputFramebuffer; + GLint filterSecondTextureCoordinateAttribute; GLint filterInputTextureUniform2; GPUImageRotationMode inputRotation2; - GLuint filterSourceTexture2; CMTime firstFrameTime, secondFrameTime; BOOL hasSetFirstTexture, hasReceivedFirstFrame, hasReceivedSecondFrame, firstFrameWasVideo, secondFrameWasVideo; BOOL firstFrameCheckDisabled, secondFrameCheckDisabled; - - __unsafe_unretained id secondTextureDelegate; } - (void)disableFirstFrameCheck; diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index cb7047bf4..e6b03be96 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -84,7 +84,7 @@ - (void)disableSecondFrameCheck; #pragma mark - #pragma mark Rendering -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) { @@ -92,25 +92,29 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - [self setFilterFBO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; [self setUniformsForProgramAtIndex:0]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, sourceTexture); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); glUniform1i(filterInputTextureUniform, 2); glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); + glBindTexture(GL_TEXTURE_2D, [secondInputFramebuffer texture]); glUniform1i(filterInputTextureUniform2, 3); glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glVertexAttribPointer(filterSecondTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:inputRotation2]); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + [firstInputFramebuffer unlock]; + [secondInputFramebuffer unlock]; } #pragma mark - @@ -128,16 +132,18 @@ - (NSInteger)nextAvailableTextureIndex; } } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { if (textureIndex == 0) { - filterSourceTexture = newInputTexture; + firstInputFramebuffer = newInputFramebuffer; hasSetFirstTexture = YES; + [firstInputFramebuffer lock]; } else { - filterSourceTexture2 = newInputTexture; + secondInputFramebuffer = newInputFramebuffer; + [secondInputFramebuffer lock]; } } @@ -191,8 +197,6 @@ - (CGSize)rotatedSize:(CGSize)sizeToRotate forIndex:(NSInteger)textureIndex; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - outputTextureRetainCount = [targets count]; - // You can set up infinite update loops, so this helps to short circuit them if (hasReceivedFirstFrame && hasReceivedSecondFrame) { @@ -246,16 +250,4 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - if (textureIndex == 0) - { - firstTextureDelegate = newTextureDelegate; - } - else - { - secondTextureDelegate = newTextureDelegate; - } -} - @end diff --git a/framework/Source/GPUImageTwoPassFilter.h b/framework/Source/GPUImageTwoPassFilter.h index b76ab6dbb..23087f35e 100755 --- a/framework/Source/GPUImageTwoPassFilter.h +++ b/framework/Source/GPUImageTwoPassFilter.h @@ -2,14 +2,12 @@ @interface GPUImageTwoPassFilter : GPUImageFilter { - GLuint secondFilterOutputTexture; + GPUImageFramebuffer *secondOutputFramebuffer; GLProgram *secondFilterProgram; GLint secondFilterPositionAttribute, secondFilterTextureCoordinateAttribute; GLint secondFilterInputTextureUniform, secondFilterInputTextureUniform2; - GLuint secondFilterFramebuffer; - NSMutableDictionary *secondProgramUniformStateRestorationBlocks; } @@ -17,9 +15,5 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShaderString firstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageVertexShaderFromString:(NSString *)secondStageVertexShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString; - (id)initWithFirstStageFragmentShaderFromString:(NSString *)firstStageFragmentShaderString secondStageFragmentShaderFromString:(NSString *)secondStageFragmentShaderString; - (void)initializeSecondaryAttributes; -- (void)initializeSecondOutputTextureIfNeeded; - -// Managing the display FBOs -- (void)createSecondFilterFBOofSize:(CGSize)currentFBOSize; @end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 753aba953..172f3bb57 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -69,276 +69,15 @@ - (void)initializeSecondaryAttributes; #pragma mark - #pragma mark Managing targets -- (GLuint)textureForOutput; +- (GPUImageFramebuffer *)framebufferForOutput; { - return secondFilterOutputTexture; -} - -#pragma mark - -#pragma mark Manage the output texture - -- (void)initializeSecondOutputTextureIfNeeded; -{ - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - return; - } - - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (!secondFilterOutputTexture) - { - glGenTextures(1, &secondFilterOutputTexture); - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); - } - }); -} - -- (void)deleteOutputTexture; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } - - if (!([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage)) - { - if (secondFilterOutputTexture) - { - glDeleteTextures(1, &secondFilterOutputTexture); - secondFilterOutputTexture = 0; - } - } - }); -} - -#pragma mark - -#pragma mark Managing the display FBOs - -- (void)createFilterFBOofSize:(CGSize)currentFBOSize; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (!filterFramebuffer) - { - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - } - } - - [self createSecondFilterFBOofSize:[self sizeOfFBO]]; - }); -} - -- (void)createSecondFilterFBOofSize:(CGSize)currentFBOSize; -{ - glGenFramebuffers(1, &secondFilterFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &filterTextureCache); -#endif - - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ - - CFDictionaryRef empty; // empty value for attr value. - CFMutableDictionaryRef attrs; - empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary - attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - - err = CVPixelBufferCreate(kCFAllocatorDefault, (int)currentFBOSize.width, (int)currentFBOSize.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); - if (err) - { - NSLog(@"FBO size: %f, %f", currentFBOSize.width, currentFBOSize.height); - NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); - } - - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, - filterTextureCache, renderTarget, - NULL, // texture attributes - GL_TEXTURE_2D, - self.outputTextureOptions.internalFormat, // opengl format - (int)currentFBOSize.width, - (int)currentFBOSize.height, - self.outputTextureOptions.format, // native iOS format - self.outputTextureOptions.type, - 0, - &renderTexture); - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); - } - - CFRelease(attrs); - CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - secondFilterOutputTexture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); - - [self notifyTargetsAboutNewOutputTexture]; -#endif - } - else - { - [self initializeSecondOutputTextureIfNeeded]; - glBindTexture(GL_TEXTURE_2D, secondFilterOutputTexture); - // if ([self providesMonochromeOutput] && [GPUImageContext deviceSupportsRedTextures]) - // { - // glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RG_EXT, GL_UNSIGNED_BYTE, 0); - // } - // else - // { - glTexImage2D(GL_TEXTURE_2D, - 0, - self.outputTextureOptions.internalFormat, - (int)currentFBOSize.width, - (int)currentFBOSize.height, - 0, - self.outputTextureOptions.format, - self.outputTextureOptions.type, - 0); - // } - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, secondFilterOutputTexture, 0); - - [self notifyTargetsAboutNewOutputTexture]; - } - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - - glBindTexture(GL_TEXTURE_2D, 0); - -} - -- (void)recreateFilterFBO -{ - cachedMaximumOutputSize = CGSizeZero; - - [self destroyFilterFBO]; - [self deleteOutputTexture]; -// -// [self setFilterFBO]; -// [self setSecondFilterFBO]; -} - -- (void)destroyFilterFBO; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (filterFramebuffer) - { - glDeleteFramebuffers(1, &filterFramebuffer); - filterFramebuffer = 0; - } - - if (secondFilterFramebuffer) - { - glDeleteFramebuffers(1, &secondFilterFramebuffer); - secondFilterFramebuffer = 0; - } - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - if (filterTextureCache != NULL) - { - CFRelease(renderTarget); - renderTarget = NULL; - - if (renderTexture) - { - CFRelease(renderTexture); - renderTexture = NULL; - } - - CVOpenGLESTextureCacheFlush(filterTextureCache, 0); - CFRelease(filterTextureCache); - filterTextureCache = NULL; - } -#endif - }); -} - -- (void)setFilterFBO; -{ - CGSize currentFBOSize = [self sizeOfFBO]; - - if (!filterFramebuffer) - { - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - preparedToCaptureImage = NO; - [super createFilterFBOofSize:currentFBOSize]; - preparedToCaptureImage = YES; - } - else - { - [super createFilterFBOofSize:currentFBOSize]; - } - [self setupFilterForSize:currentFBOSize]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - - glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); -} - -- (void)setSecondFilterFBO; -{ - CGSize currentFBOSize = [self sizeOfFBO]; - if (!secondFilterFramebuffer) - { - [self createFilterFBOofSize:currentFBOSize]; - [self setupFilterForSize:currentFBOSize]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); - glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); -} - -- (void)setOutputFBO; -{ - [self setSecondFilterFBO]; + return secondOutputFramebuffer; } #pragma mark - #pragma mark Rendering -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) { @@ -349,32 +88,37 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (!currentlyReceivingMonochromeInput) { // Run the first stage of the two-pass filter - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates sourceTexture:sourceTexture]; + [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates]; } - // Run the second stage of the two-pass filter [GPUImageContext setActiveShaderProgram:secondFilterProgram]; glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, 0); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, 0); - [self setSecondFilterFBO]; + secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + [secondOutputFramebuffer activateFramebuffer]; [self setUniformsForProgramAtIndex:1]; - if (!currentlyReceivingMonochromeInput) - { - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); - } - else - { - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, sourceTexture); - glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - } + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); + glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); + + // TODO: Re-enable this monochrome optimization +// if (!currentlyReceivingMonochromeInput) +// { +// glActiveTexture(GL_TEXTURE3); +// glBindTexture(GL_TEXTURE_2D, outputTexture); +// glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [[self class] textureCoordinatesForRotation:kGPUImageNoRotation]); +// } +// else +// { +// glActiveTexture(GL_TEXTURE3); +// glBindTexture(GL_TEXTURE_2D, sourceTexture); +// glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); +// } glUniform1i(secondFilterInputTextureUniform, 3); @@ -384,29 +128,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); -} - -- (void)prepareForImageCapture; -{ - if (preparedToCaptureImage) - { - return; - } - - runSynchronouslyOnVideoProcessingQueue(^{ - preparedToCaptureImage = YES; - - if ([GPUImageContext supportsFastTextureUpload]) - { - if (secondFilterOutputTexture) - { - [GPUImageContext useImageProcessingContext]; - - glDeleteTextures(1, &secondFilterOutputTexture); - secondFilterOutputTexture = 0; - } - } - }); + [outputFramebuffer unlock]; + outputFramebuffer = nil; } - (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m index 3c154a7e4..643742579 100644 --- a/framework/Source/GPUImageUIElement.m +++ b/framework/Source/GPUImageUIElement.m @@ -61,7 +61,6 @@ - (CGSize)layerSizeInPixels; - (void)update; { [GPUImageContext useImageProcessingContext]; - [self initializeOutputTextureIfNeeded]; if(CMTIME_IS_INVALID(time)) { time = CMTimeMakeWithSeconds(0, 600); @@ -89,7 +88,10 @@ - (void)update; CGContextRelease(imageContext); CGColorSpaceRelease(genericRGBColorspace); - glBindTexture(GL_TEXTURE_2D, outputTexture); + // TODO: This may not work + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:layerPixelSize textureOptions:self.outputTextureOptions]; + + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); // no need to use self.outputTextureOptions here, we always need these texture options glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)layerPixelSize.width, (int)layerPixelSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 3c06edce0..56603b6ed 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -23,8 +23,6 @@ extern NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString */ @interface GPUImageVideoCamera : GPUImageOutput { - CVOpenGLESTextureCacheRef coreVideoTextureCache; - NSUInteger numberOfFramesCaptured; CGFloat totalFrameTimeDuringCapture; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index f21779880..a959a2e00 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -76,9 +76,7 @@ @interface GPUImageVideoCamera () GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; GLint yuvConversionMatrixUniform; - GLuint yuvConversionFramebuffer; const GLfloat *_preferredConversion; - int imageBufferWidth, imageBufferHeight; @@ -87,7 +85,6 @@ @interface GPUImageVideoCamera () - (void)updateOrientationSendToTargets; - (void)convertYUVToRGBOutput; -- (void)setYUVConversionFBO; @end @@ -177,27 +174,6 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD glEnableVertexAttribArray(yuvConversionPositionAttribute); glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); } - - if ([GPUImageContext supportsFastTextureUpload]) - { - [GPUImageContext useImageProcessingContext]; -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); -#endif - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - // Need to remove the initially created texture -// [self deleteOutputTexture]; - } - else - { - [self initializeOutputTextureIfNeeded]; - } }); // Grab the back-facing or front-facing camera @@ -286,9 +262,9 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return self; } -- (GLuint)textureForOutput; +- (GPUImageFramebuffer *)framebufferForOutput; { - return outputTexture; + return outputFramebuffer; } - (void)dealloc @@ -299,11 +275,6 @@ - (void)dealloc [self removeInputsAndOutputs]; - if ([GPUImageContext supportsFastTextureUpload]) - { - CFRelease(coreVideoTextureCache); - } - // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. #if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (frameRenderingSemaphore != NULL) @@ -311,12 +282,6 @@ - (void)dealloc dispatch_release(frameRenderingSemaphore); } #endif - -// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) - if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) - { - [self destroyYUVConversionFBO]; - } } - (BOOL)addAudioInputsAndOutputs @@ -614,6 +579,7 @@ - (AVCaptureConnection *)videoCaptureConnection { - (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth height:(int)bufferHeight time:(CMTime)currentTime; { + // First, update all the framebuffers in the targets for (id currentTarget in targets) { if ([currentTarget enabled]) @@ -629,20 +595,37 @@ - (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth hei if ([currentTarget wantsMonochromeInput] && captureAsYUV) { [currentTarget setCurrentlyReceivingMonochromeInput:YES]; - [currentTarget setInputTexture:luminanceTexture atIndex:textureIndexOfTarget]; + // TODO: Replace optimization for monochrome output + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; } else { [currentTarget setCurrentlyReceivingMonochromeInput:NO]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; } - - [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; } else { [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; + } + } + } + + // Then release our hold on the local framebuffer to send it back to the cache as soon as it's no longer needed + [outputFramebuffer unlock]; + + // Finally, trigger rendering as needed + for (id currentTarget in targets) + { + if ([currentTarget enabled]) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; } } } @@ -675,7 +658,6 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { CVOpenGLESTextureRef luminanceTextureRef = NULL; CVOpenGLESTextureRef chrominanceTextureRef = NULL; - CVOpenGLESTextureRef texture = NULL; // if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) // Check for YUV planar inputs to do RGB conversion @@ -685,9 +667,6 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { imageBufferWidth = bufferWidth; imageBufferHeight = bufferHeight; - - [self destroyYUVConversionFBO]; - [self createYUVConversionFBO]; } CVReturn err; @@ -696,11 +675,11 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; if ([GPUImageContext deviceSupportsRedTextures]) { // err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RED_EXT, bufferWidth, bufferHeight, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); } else { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef); } if (err) { @@ -717,11 +696,11 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; if ([GPUImageContext deviceSupportsRedTextures]) { // err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RG_EXT, bufferWidth/2, bufferHeight/2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); } else { - err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); + err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], cameraFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef); } if (err) { @@ -741,37 +720,37 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; CVPixelBufferUnlockBaseAddress(cameraFrame, 0); - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); CFRelease(luminanceTextureRef); CFRelease(chrominanceTextureRef); } else { - CVPixelBufferLockBaseAddress(cameraFrame, 0); - - CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); + // TODO: Mesh this with the output framebuffer structure - if (!texture || err) { - NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); - NSAssert(NO, @"Camera failure"); - return; - } - - outputTexture = CVOpenGLESTextureGetName(texture); - // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; - - CVPixelBufferUnlockBaseAddress(cameraFrame, 0); - CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); - CFRelease(texture); - - outputTexture = 0; +// CVPixelBufferLockBaseAddress(cameraFrame, 0); +// +// CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); +// +// if (!texture || err) { +// NSLog(@"Camera CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); +// NSAssert(NO, @"Camera failure"); +// return; +// } +// +// outputTexture = CVOpenGLESTextureGetName(texture); +// // glBindTexture(CVOpenGLESTextureGetTarget(texture), outputTexture); +// glBindTexture(GL_TEXTURE_2D, outputTexture); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +// +// [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; +// +// CVPixelBufferUnlockBaseAddress(cameraFrame, 0); +// CFRelease(texture); +// +// outputTexture = 0; } @@ -791,13 +770,16 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { CVPixelBufferLockBaseAddress(cameraFrame, 0); - glBindTexture(GL_TEXTURE_2D, outputTexture); + int bytesPerRow = (int) CVPixelBufferGetBytesPerRow(cameraFrame); + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight)]; + [outputFramebuffer activateFramebuffer]; + + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); // Using BGRA extension to pull in video frame data directly // The use of bytesPerRow / 4 accounts for a display glitch present in preview video frames when using the photo preset on the camera - int bytesPerRow = (int) CVPixelBufferGetBytesPerRow(cameraFrame); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); for (id currentTarget in targets) @@ -837,8 +819,10 @@ - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)convertYUVToRGBOutput; { [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - [self setYUVConversionFBO]; - + + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight) textureOptions:self.outputTextureOptions]; + [outputFramebuffer activateFramebuffer]; + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -872,58 +856,6 @@ - (void)convertYUVToRGBOutput; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -- (void)setYUVConversionFBO; -{ - if (!yuvConversionFramebuffer) - { - [self createYUVConversionFBO]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); - - glViewport(0, 0, imageBufferWidth, imageBufferHeight); -} - -- (void)createYUVConversionFBO; -{ - [self initializeOutputTextureIfNeeded]; - - glActiveTexture(GL_TEXTURE1); - glGenFramebuffers(1, &yuvConversionFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); - - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageBufferWidth, imageBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - [self notifyTargetsAboutNewOutputTexture]; - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - glBindTexture(GL_TEXTURE_2D, 0); - -} - -- (void)destroyYUVConversionFBO; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if (yuvConversionFramebuffer) - { - glDeleteFramebuffers(1, &yuvConversionFramebuffer); - yuvConversionFramebuffer = 0; - } - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } - }); -} - - #pragma mark - #pragma mark Benchmarking diff --git a/framework/Source/iOS/GPUImageContext.h b/framework/Source/iOS/GPUImageContext.h index 58a797601..170931f41 100755 --- a/framework/Source/iOS/GPUImageContext.h +++ b/framework/Source/iOS/GPUImageContext.h @@ -38,12 +38,9 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k @end -@protocol GPUImageTextureDelegate; - @protocol GPUImageInput - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -54,8 +51,3 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (BOOL)wantsMonochromeInput; - (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; @end - -@protocol GPUImageTextureDelegate -- (void)textureNoLongerNeededForTarget:(id)textureTarget; -@end - diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index 9662146ac..5f12204f0 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -30,8 +30,6 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; CGSize videoSize; GPUImageRotationMode inputRotation; - - __unsafe_unretained id textureDelegate; } @property(readwrite, nonatomic) BOOL hasAudioTrack; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 302418094..fba3f6d75 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -25,7 +25,7 @@ @interface GPUImageMovieWriter () GLint colorSwizzlingPositionAttribute, colorSwizzlingTextureCoordinateAttribute; GLint colorSwizzlingInputTextureUniform; - GLuint inputTextureForMovieRendering; + GPUImageFramebuffer *firstInputFramebuffer; CMTime startTime, previousFrameTime, previousAudioTime; @@ -618,7 +618,7 @@ - (void)renderAtInternalSize; const GLfloat *textureCoordinates = [GPUImageFilter textureCoordinatesForRotation:inputRotation]; glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, inputTextureForMovieRendering); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); glUniform1i(colorSwizzlingInputTextureUniform, 4); glVertexAttribPointer(colorSwizzlingPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); @@ -732,9 +732,10 @@ - (NSInteger)nextAvailableTextureIndex; return 0; } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { - inputTextureForMovieRendering = newInputTexture; + firstInputFramebuffer = newInputFramebuffer; + [firstInputFramebuffer lock]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -775,11 +776,6 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - textureDelegate = newTextureDelegate; -} - - (BOOL)wantsMonochromeInput; { return NO; diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 8a25ac9d2..123210167 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -180,9 +180,10 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - [self initializeOutputTextureIfNeeded]; - - glBindTexture(GL_TEXTURE_2D, outputTexture); + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:pixelSizeToUseForTexture textureOptions:self.outputTextureOptions]; + [outputFramebuffer disableReferenceCounting]; + + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); if (self.shouldSmoothlyScaleOutput) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); @@ -210,15 +211,18 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot } // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || (!defined(__IPHONE_7_0)) ) - (void)dealloc; { + [outputFramebuffer enableReferenceCounting]; + [outputFramebuffer unlock]; + +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || (!defined(__IPHONE_7_0)) ) if (imageUpdateSemaphore != NULL) { dispatch_release(imageUpdateSemaphore); } -} #endif +} #pragma mark - #pragma mark Image rendering @@ -253,7 +257,7 @@ - (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; [currentTarget setCurrentlyReceivingMonochromeInput:NO]; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; -// [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; } diff --git a/framework/Source/iOS/GPUImageView.h b/framework/Source/iOS/GPUImageView.h index 7d0465ab4..03e12ee5e 100755 --- a/framework/Source/iOS/GPUImageView.h +++ b/framework/Source/iOS/GPUImageView.h @@ -13,7 +13,6 @@ typedef enum { @interface GPUImageView : UIView { GPUImageRotationMode inputRotation; - __unsafe_unretained id textureDelegate; } /** The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio diff --git a/framework/Source/iOS/GPUImageView.m b/framework/Source/iOS/GPUImageView.m index f68b18772..ef5bf03ba 100755 --- a/framework/Source/iOS/GPUImageView.m +++ b/framework/Source/iOS/GPUImageView.m @@ -10,7 +10,7 @@ @interface GPUImageView () { - GLuint inputTextureForDisplay; + GPUImageFramebuffer *inputFramebufferForDisplay; GLuint displayRenderbuffer, displayFramebuffer; GLProgram *displayProgram; @@ -372,7 +372,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); + glBindTexture(GL_TEXTURE_2D, [inputFramebufferForDisplay texture]); glUniform1i(displayInputTextureUniform, 4); glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); @@ -381,6 +381,8 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [self presentFramebuffer]; + [inputFramebufferForDisplay unlock]; + inputFramebufferForDisplay = nil; }); } @@ -389,10 +391,10 @@ - (NSInteger)nextAvailableTextureIndex; return 0; } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { - NSLog(@"Setting input texture: %d", newInputTexture); - inputTextureForDisplay = newInputTexture; + inputFramebufferForDisplay = newInputFramebuffer; + [inputFramebufferForDisplay lock]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -441,11 +443,6 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - textureDelegate = newTextureDelegate; -} - - (BOOL)wantsMonochromeInput; { return NO; From 3b5b876ce3e5adfb966c90bb343de7ec59ebe86b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 14 Mar 2014 21:14:43 -0500 Subject: [PATCH 505/695] Repaired picture inputs by adding a type of cached framebuffer consisting only of textures. --- .../ShowcaseFilterViewController.m | 3 +- .../SimpleImageViewController.m | 4 +- framework/GPUImage.xcodeproj/project.pbxproj | 1 + framework/Source/GPUImageBuffer.m | 2 +- framework/Source/GPUImageCrosshairGenerator.m | 2 +- framework/Source/GPUImageFilter.m | 26 ++++++----- framework/Source/GPUImageFramebuffer.h | 3 +- framework/Source/GPUImageFramebuffer.m | 44 ++++++++++++++----- framework/Source/GPUImageFramebufferCache.h | 4 +- framework/Source/GPUImageFramebufferCache.m | 31 ++++++++----- framework/Source/GPUImageGrayscaleFilter.m | 6 ++- .../GPUImageHarrisCornerDetectionFilter.m | 3 +- framework/Source/GPUImageHistogramFilter.m | 2 +- .../GPUImageHoughTransformLineDetector.m | 3 +- framework/Source/GPUImageJFAVoronoiFilter.m | 2 +- .../Source/GPUImageLanczosResamplingFilter.m | 4 +- framework/Source/GPUImageLineGenerator.m | 2 +- framework/Source/GPUImageMovie.m | 10 ++--- ...ageParallelCoordinateLineTransformFilter.m | 2 +- framework/Source/GPUImagePoissonBlendFilter.m | 2 +- framework/Source/GPUImageRawDataInput.m | 2 +- framework/Source/GPUImageRawDataOutput.m | 2 +- .../Source/GPUImageSobelEdgeDetectionFilter.m | 6 ++- framework/Source/GPUImageThreeInputFilter.m | 2 +- framework/Source/GPUImageToneCurveFilter.m | 2 +- framework/Source/GPUImageTwoInputFilter.m | 2 +- framework/Source/GPUImageTwoPassFilter.m | 17 +++---- framework/Source/GPUImageUIElement.m | 2 +- framework/Source/GPUImageVideoCamera.m | 10 ++--- framework/Source/iOS/GPUImagePicture.m | 2 +- 30 files changed, 118 insertions(+), 85 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 92e9594e7..93edb63c0 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1323,8 +1323,9 @@ - (void)setupFilter; inputImage = [UIImage imageNamed:@"WID-small.jpg"]; } +// sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:NO]; sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; - [sourcePicture processImage]; + [sourcePicture processImage]; [sourcePicture addTarget:filter]; } diff --git a/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index 5ad9778db..67693bc7e 100755 --- a/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -26,8 +26,8 @@ - (void)loadView [primaryView addSubview:imageSlider]; [self setupDisplayFiltering]; - [self setupImageResampling]; - [self setupImageFilteringToDisk]; +// [self setupImageResampling]; +// [self setupImageFilteringToDisk]; } - (void)viewDidUnload diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 45c04679f..d2f5311bc 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -1410,6 +1410,7 @@ BCF1A32B14DDB1EC00852800 /* Project object */ = { isa = PBXProject; attributes = { + LastTestingUpgradeCheck = 0510; LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Brad Larson"; }; diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index f530f3a64..0529fe58f 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -75,7 +75,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; [bufferedFramebuffers addObject:outputFramebuffer]; // TODO: Instead of redrawing these into textures, capture the incoming framebuffer and prevent it from returning to the pool diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index bcf20a1d8..9e2a29a28 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -100,7 +100,7 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); #endif - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glClearColor(0.0, 0.0, 0.0, 0.0); diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index b44caac74..f74dcf03f 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -360,7 +360,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [GPUImageContext setActiveShaderProgram:filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; [self setUniformsForProgramAtIndex:0]; @@ -700,26 +700,28 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; { if (CGSizeEqualToSize(forcedMaximumSize, CGSizeZero)) { - return; } else { CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(newSize, CGRectMake(0.0, 0.0, forcedMaximumSize.width, forcedMaximumSize.height)); inputTextureSize = insetRect.size; - return; } } - - CGSize rotatedSize = [self rotatedSize:newSize forIndex:textureIndex]; - - if (CGSizeEqualToSize(rotatedSize, CGSizeZero)) - { - inputTextureSize = rotatedSize; - } - else if (!CGSizeEqualToSize(inputTextureSize, rotatedSize)) + else { - inputTextureSize = rotatedSize; + CGSize rotatedSize = [self rotatedSize:newSize forIndex:textureIndex]; + + if (CGSizeEqualToSize(rotatedSize, CGSizeZero)) + { + inputTextureSize = rotatedSize; + } + else if (!CGSizeEqualToSize(inputTextureSize, rotatedSize)) + { + inputTextureSize = rotatedSize; + } } + + [self setupFilterForSize:[self sizeOfFBO]]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; diff --git a/framework/Source/GPUImageFramebuffer.h b/framework/Source/GPUImageFramebuffer.h index 3decfe9db..5a3fe2584 100644 --- a/framework/Source/GPUImageFramebuffer.h +++ b/framework/Source/GPUImageFramebuffer.h @@ -20,10 +20,11 @@ typedef struct GPUTextureOptions { @property(readonly) CGSize size; @property(readonly) GPUTextureOptions textureOptions; @property(readonly) GLuint texture; +@property(readonly) BOOL missingFramebuffer; // Initialization and teardown - (id)initWithSize:(CGSize)framebufferSize; -- (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fboTextureOptions; +- (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fboTextureOptions onlyTexture:(BOOL)onlyGenerateTexture; // Usage - (void)activateFramebuffer; diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index 59c290cc6..a695b5ea2 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -14,6 +14,7 @@ @interface GPUImageFramebuffer() } - (void)generateFramebuffer; +- (void)generateTexture; - (void)destroyFramebuffer; @end @@ -23,11 +24,12 @@ @implementation GPUImageFramebuffer @synthesize size = _size; @synthesize textureOptions = _textureOptions; @synthesize texture = _texture; +@synthesize missingFramebuffer = _missingFramebuffer; #pragma mark - #pragma mark Initialization and teardown -- (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fboTextureOptions; +- (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fboTextureOptions onlyTexture:(BOOL)onlyGenerateTexture; { if (!(self = [super init])) { @@ -38,10 +40,21 @@ - (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fbo _size = framebufferSize; framebufferReferenceCount = 0; referenceCountingDisabled = NO; + _missingFramebuffer = onlyGenerateTexture; NSLog(@"Creating framebuffer: %@ at size %f, %f", self, _size.width, _size.height); - [self generateFramebuffer]; + if (_missingFramebuffer) + { + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + [self generateTexture]; + }); + } + else + { + [self generateFramebuffer]; + } return self; } @@ -56,7 +69,7 @@ - (id)initWithSize:(CGSize)framebufferSize; defaultTextureOptions.format = GL_BGRA; defaultTextureOptions.type = GL_UNSIGNED_BYTE; - if (!(self = [self initWithSize:framebufferSize textureOptions:defaultTextureOptions])) + if (!(self = [self initWithSize:framebufferSize textureOptions:defaultTextureOptions onlyTexture:NO])) { return nil; } @@ -74,19 +87,26 @@ - (void)dealloc #pragma mark - #pragma mark Internal +- (void)generateTexture; +{ + glActiveTexture(GL_TEXTURE1); + glGenTextures(1, &_texture); + glBindTexture(GL_TEXTURE_2D, _texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _textureOptions.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _textureOptions.magFilter); + // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, _textureOptions.wrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, _textureOptions.wrapT); + + // TODO: Handle mipmaps +} + - (void)generateFramebuffer; { runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - - glActiveTexture(GL_TEXTURE1); - glGenTextures(1, &_texture); - glBindTexture(GL_TEXTURE_2D, _texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _textureOptions.minFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _textureOptions.magFilter); - // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, _textureOptions.wrapS); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, _textureOptions.wrapT); + + [self generateTexture]; glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); diff --git a/framework/Source/GPUImageFramebufferCache.h b/framework/Source/GPUImageFramebufferCache.h index da26a33ea..dddfe6583 100644 --- a/framework/Source/GPUImageFramebufferCache.h +++ b/framework/Source/GPUImageFramebufferCache.h @@ -5,8 +5,8 @@ @interface GPUImageFramebufferCache : NSObject // Framebuffer management -- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions; -- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize; +- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture; +- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize onlyTexture:(BOOL)onlyTexture; - (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; - (void)purgeAllUnassignedFramebuffers; diff --git a/framework/Source/GPUImageFramebufferCache.m b/framework/Source/GPUImageFramebufferCache.m index bafaeb5b2..3be3f1c33 100644 --- a/framework/Source/GPUImageFramebufferCache.m +++ b/framework/Source/GPUImageFramebufferCache.m @@ -6,7 +6,7 @@ @interface GPUImageFramebufferCache() NSMutableDictionary *framebufferTypeCounts; } -- (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions; +- (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture; @end @@ -32,14 +32,21 @@ - (id)init; #pragma mark - #pragma mark Framebuffer management -- (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions; +- (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture; { - return [NSString stringWithFormat:@"%.1fx%.1f-%d:%d:%d:%d:%d:%d:%d", size.width, size.height, textureOptions.minFilter, textureOptions.magFilter, textureOptions.wrapS, textureOptions.wrapT, textureOptions.internalFormat, textureOptions.format, textureOptions.type]; + if (onlyTexture) + { + return [NSString stringWithFormat:@"%.1fx%.1f-%d:%d:%d:%d:%d:%d:%d-NOFB", size.width, size.height, textureOptions.minFilter, textureOptions.magFilter, textureOptions.wrapS, textureOptions.wrapT, textureOptions.internalFormat, textureOptions.format, textureOptions.type]; + } + else + { + return [NSString stringWithFormat:@"%.1fx%.1f-%d:%d:%d:%d:%d:%d:%d", size.width, size.height, textureOptions.minFilter, textureOptions.magFilter, textureOptions.wrapS, textureOptions.wrapT, textureOptions.internalFormat, textureOptions.format, textureOptions.type]; + } } -- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions; +- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture; { - NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:textureOptions]; + NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; GPUImageFramebuffer *framebufferFromCache = nil; @@ -48,7 +55,7 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture { NSLog(@"Nothing found for hash: %@", lookupHash); // Nothing in the cache, create a new framebuffer to use - framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions]; + framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; } else { @@ -56,7 +63,7 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture NSInteger currentTextureID = (numberOfMatchingTextures - 1); while ((framebufferFromCache == nil) && (currentTextureID >= 0)) { - NSString *textureHash = [NSString stringWithFormat:@"%@-%d", lookupHash, currentTextureID]; + NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)currentTextureID]; framebufferFromCache = [framebufferCache objectForKey:textureHash]; // Test the values in the cache first, to see if they got invalidated behind our back if (framebufferFromCache != nil) @@ -75,7 +82,7 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture { NSLog(@"Cached textures were nil for hash: %@", lookupHash); - framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions]; + framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; } } @@ -83,7 +90,7 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture return framebufferFromCache; } -- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize; +- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize onlyTexture:(BOOL)onlyTexture; { GPUTextureOptions defaultTextureOptions; defaultTextureOptions.minFilter = GL_LINEAR; @@ -94,7 +101,7 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize; defaultTextureOptions.format = GL_BGRA; defaultTextureOptions.type = GL_UNSIGNED_BYTE; - return [self fetchFramebufferForSize:framebufferSize textureOptions:defaultTextureOptions]; + return [self fetchFramebufferForSize:framebufferSize textureOptions:defaultTextureOptions onlyTexture:onlyTexture]; } - (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; @@ -103,11 +110,11 @@ - (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; CGSize framebufferSize = framebuffer.size; GPUTextureOptions framebufferTextureOptions = framebuffer.textureOptions; - NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:framebufferTextureOptions]; + NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:framebufferTextureOptions onlyTexture:framebuffer.missingFramebuffer]; NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; - NSString *textureHash = [NSString stringWithFormat:@"%@-%d", lookupHash, numberOfMatchingTextures]; + NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)numberOfMatchingTextures]; [framebufferCache setObject:framebuffer forKey:textureHash cost:round(framebufferSize.width * framebufferSize.height * 4.0)]; // [framebufferCache setObject:framebuffer forKey:textureHash]; diff --git a/framework/Source/GPUImageGrayscaleFilter.m b/framework/Source/GPUImageGrayscaleFilter.m index 58e7fba43..0066ca87f 100755 --- a/framework/Source/GPUImageGrayscaleFilter.m +++ b/framework/Source/GPUImageGrayscaleFilter.m @@ -72,12 +72,14 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates - (BOOL)wantsMonochromeInput; { - return YES; +// return YES; + return NO; } - (BOOL)providesMonochromeOutput; { - return YES; +// return YES; + return NO; } // TODO: Rewrite this based on the new GPUImageFilter implementation diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index 1a191fb75..999748ddb 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -256,7 +256,8 @@ - (void)extractCornerLocationsFromImageAtFrameTime:(CMTime)frameTime; - (BOOL)wantsMonochromeInput; { - return YES; +// return YES; + return NO; } #pragma mark - diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 8110c082b..61c00b2e2 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -273,7 +273,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [GPUImageContext useImageProcessingContext]; glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates); - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; [GPUImageContext setActiveShaderProgram:filterProgram]; diff --git a/framework/Source/GPUImageHoughTransformLineDetector.m b/framework/Source/GPUImageHoughTransformLineDetector.m index 4d94d8f1a..58cd63f97 100644 --- a/framework/Source/GPUImageHoughTransformLineDetector.m +++ b/framework/Source/GPUImageHoughTransformLineDetector.m @@ -201,7 +201,8 @@ - (void)extractLineParametersFromImageAtFrameTime:(CMTime)frameTime; - (BOOL)wantsMonochromeInput; { - return YES; +// return YES; + return NO; } #pragma mark - diff --git a/framework/Source/GPUImageJFAVoronoiFilter.m b/framework/Source/GPUImageJFAVoronoiFilter.m index 335dc91dc..15835917c 100644 --- a/framework/Source/GPUImageJFAVoronoiFilter.m +++ b/framework/Source/GPUImageJFAVoronoiFilter.m @@ -396,7 +396,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [GPUImageContext setActiveShaderProgram:filterProgram]; currentPass = 0; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glActiveTexture(GL_TEXTURE2); diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m index 01788be31..8b7502a99 100644 --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -180,7 +180,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { currentFBOSize.width = self.originalImageSize.width; } - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:currentFBOSize textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:currentFBOSize textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; [self setUniformsForProgramAtIndex:0]; @@ -206,7 +206,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glBindTexture(GL_TEXTURE_2D, 0); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, 0); - secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [secondOutputFramebuffer activateFramebuffer]; [self setUniformsForProgramAtIndex:1]; diff --git a/framework/Source/GPUImageLineGenerator.m b/framework/Source/GPUImageLineGenerator.m index 759899542..85d93bee2 100644 --- a/framework/Source/GPUImageLineGenerator.m +++ b/framework/Source/GPUImageLineGenerator.m @@ -119,7 +119,7 @@ - (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext setActiveShaderProgram:filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glClearColor(0.0, 0.0, 0.0, 0.0); diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index a0e26166c..218fceb6f 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -496,10 +496,10 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - if (!allTargetsWantMonochromeData) - { +// if (!allTargetsWantMonochromeData) +// { [self convertYUVToRGBOutput]; - } +// } for (id currentTarget in targets) { @@ -566,7 +566,7 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu // Upload to texture CVPixelBufferLockBaseAddress(movieFrame, 0); - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) textureOptions:self.outputTextureOptions onlyTexture:YES]; glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); // Using BGRA extension to pull in video frame data directly @@ -639,7 +639,7 @@ - (void)cancelProcessing - (void)convertYUVToRGBOutput; { [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight)]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight) onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index 7c62bb1f1..c060cfee3 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -220,7 +220,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); // NSLog(@"Line generation processing time : %f ms", 1000.0 * currentFrameTime); - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; [GPUImageContext setActiveShaderProgram:filterProgram]; diff --git a/framework/Source/GPUImagePoissonBlendFilter.m b/framework/Source/GPUImagePoissonBlendFilter.m index 71104961b..0167e024f 100644 --- a/framework/Source/GPUImagePoissonBlendFilter.m +++ b/framework/Source/GPUImagePoissonBlendFilter.m @@ -147,7 +147,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [super renderToTextureWithVertices:vertices textureCoordinates:[[self class] textureCoordinatesForRotation:kGPUImageNoRotation]]; } else { // Run the second stage of the two-pass filter - secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [secondOutputFramebuffer activateFramebuffer]; [GPUImageContext setActiveShaderProgram:filterProgram]; diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 7ee652c0e..1bd8aa34c 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -69,7 +69,7 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; [GPUImageContext useImageProcessingContext]; // TODO: This probably isn't right, and will need to be corrected - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:uploadedImageSize textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:uploadedImageSize textureOptions:self.outputTextureOptions onlyTexture:YES]; glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); glTexImage2D(GL_TEXTURE_2D, 0, _pixelFormat==GPUPixelFormatRGB ? GL_RGB : GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, (GLint)_pixelFormat, (GLenum)_pixelType, bytesToUpload); diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 676493d20..17ea1181b 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -97,7 +97,7 @@ - (void)renderAtInternalSize; { [GPUImageContext setActiveShaderProgram:dataProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:imageSize]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:imageSize onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index 449129b5f..e193f0274 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -147,12 +147,14 @@ - (void)setUniformsForProgramAtIndex:(NSUInteger)programIndex; - (BOOL)wantsMonochromeInput; { - return YES; +// return YES; + return NO; } - (BOOL)providesMonochromeOutput; { - return YES; +// return YES; + return NO; } #pragma mark - diff --git a/framework/Source/GPUImageThreeInputFilter.m b/framework/Source/GPUImageThreeInputFilter.m index 3b53690af..8b67414ca 100644 --- a/framework/Source/GPUImageThreeInputFilter.m +++ b/framework/Source/GPUImageThreeInputFilter.m @@ -86,7 +86,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; [self setUniformsForProgramAtIndex:0]; diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index e5c2d8df3..8e4758f39 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -535,7 +535,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index e6b03be96..de10b5e07 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -92,7 +92,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext setActiveShaderProgram:filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; [self setUniformsForProgramAtIndex:0]; diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 172f3bb57..642bfe1cc 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -85,20 +85,16 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } // This assumes that any two-pass filter that says it desires monochrome input is using the first pass for a luminance conversion, which can be dropped - if (!currentlyReceivingMonochromeInput) - { +// if (!currentlyReceivingMonochromeInput) +// { // Run the first stage of the two-pass filter [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates]; - } - +// } + // Run the second stage of the two-pass filter - [GPUImageContext setActiveShaderProgram:secondFilterProgram]; - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, 0); - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, 0); - secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions]; + secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [secondOutputFramebuffer activateFramebuffer]; + [GPUImageContext setActiveShaderProgram:secondFilterProgram]; [self setUniformsForProgramAtIndex:1]; @@ -129,7 +125,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [outputFramebuffer unlock]; - outputFramebuffer = nil; } - (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m index 643742579..c89e33b1d 100644 --- a/framework/Source/GPUImageUIElement.m +++ b/framework/Source/GPUImageUIElement.m @@ -89,7 +89,7 @@ - (void)update; CGColorSpaceRelease(genericRGBColorspace); // TODO: This may not work - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:layerPixelSize textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:layerPixelSize textureOptions:self.outputTextureOptions onlyTexture:YES]; glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); // no need to use self.outputTextureOptions here, we always need these texture options diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index a959a2e00..b6a86bf44 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -712,10 +712,10 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - if (!allTargetsWantMonochromeData) - { +// if (!allTargetsWantMonochromeData) +// { [self convertYUVToRGBOutput]; - } +// } [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; @@ -771,7 +771,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVPixelBufferLockBaseAddress(cameraFrame, 0); int bytesPerRow = (int) CVPixelBufferGetBytesPerRow(cameraFrame); - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight)]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); @@ -820,7 +820,7 @@ - (void)convertYUVToRGBOutput; { [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight) textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight) textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 123210167..d6c11a71f 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -180,7 +180,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:pixelSizeToUseForTexture textureOptions:self.outputTextureOptions]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:pixelSizeToUseForTexture onlyTexture:YES]; [outputFramebuffer disableReferenceCounting]; glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); From 30c16fb9ba44fc98e107e03108f80f0e5e389b91 Mon Sep 17 00:00:00 2001 From: Stelios Petrakis Date: Sun, 16 Mar 2014 15:14:43 +0200 Subject: [PATCH 506/695] Fixed the color attachment comparison bug --- framework/Source/GPUImageMovie.m | 2 +- framework/Source/GPUImageVideoCamera.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 178dd27aa..f3456b384 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -451,7 +451,7 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu int bufferWidth = (int) CVPixelBufferGetWidth(movieFrame); #endif CFTypeRef colorAttachments = CVBufferGetAttachment(movieFrame, kCVImageBufferYCbCrMatrixKey, NULL); - if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4) { + if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) { _preferredConversion = kColorConversion601; } else { diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index bda9d9fec..a8e3b9409 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -655,7 +655,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; int bufferWidth = (int) CVPixelBufferGetWidth(cameraFrame); int bufferHeight = (int) CVPixelBufferGetHeight(cameraFrame); CFTypeRef colorAttachments = CVBufferGetAttachment(cameraFrame, kCVImageBufferYCbCrMatrixKey, NULL); - if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4) { + if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) { _preferredConversion = kColorConversion601; } else { From 8280f40212a10eb9670b6f150a88a2c59652d883 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 16 Mar 2014 17:44:48 -0500 Subject: [PATCH 507/695] Altered image capture pathways to account for new framebuffer caching architecture. --- .../SimpleImageViewController.m | 65 +++++---- framework/Source/GPUImageAmatorkaFilter.m | 5 - framework/Source/GPUImageAverageColor.m | 6 +- framework/Source/GPUImageBuffer.m | 6 +- framework/Source/GPUImageFilter.h | 10 +- framework/Source/GPUImageFilter.m | 132 ++++++------------ framework/Source/GPUImageFilterGroup.m | 8 +- framework/Source/GPUImageFilterPipeline.h | 1 - framework/Source/GPUImageFilterPipeline.m | 9 +- framework/Source/GPUImageFramebuffer.h | 4 + framework/Source/GPUImageFramebuffer.m | 92 +++++++++++- framework/Source/GPUImageFramebufferCache.h | 2 + framework/Source/GPUImageFramebufferCache.m | 12 ++ framework/Source/GPUImageHistogramFilter.m | 10 ++ .../Source/GPUImageLanczosResamplingFilter.m | 11 +- framework/Source/GPUImageLuminosity.m | 3 + framework/Source/GPUImageMissEtikateFilter.m | 5 - framework/Source/GPUImageOutput.h | 15 +- framework/Source/GPUImageOutput.m | 62 +++----- ...ageParallelCoordinateLineTransformFilter.m | 1 + framework/Source/GPUImageSoftEleganceFilter.m | 6 - framework/Source/GPUImageStillCamera.m | 8 +- framework/Source/GPUImageThreeInputFilter.m | 12 ++ framework/Source/GPUImageToneCurveFilter.m | 11 +- framework/Source/GPUImageTwoInputFilter.m | 11 ++ framework/Source/GPUImageTwoPassFilter.m | 35 ++++- framework/Source/iOS/GPUImageMovieWriter.m | 4 + framework/Source/iOS/GPUImagePicture.h | 1 + framework/Source/iOS/GPUImagePicture.m | 9 ++ 29 files changed, 326 insertions(+), 230 deletions(-) diff --git a/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index 67693bc7e..e70af4481 100755 --- a/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -26,8 +26,8 @@ - (void)loadView [primaryView addSubview:imageSlider]; [self setupDisplayFiltering]; -// [self setupImageResampling]; -// [self setupImageFilteringToDisk]; + [self setupImageResampling]; + [self setupImageFilteringToDisk]; } - (void)viewDidUnload @@ -49,9 +49,9 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (IBAction)updateSliderValue:(id)sender { -// CGFloat midpoint = [(UISlider *)sender value]; -// [(GPUImageTiltShiftFilter *)sepiaFilter setTopFocusLevel:midpoint - 0.1]; -// [(GPUImageTiltShiftFilter *)sepiaFilter setBottomFocusLevel:midpoint + 0.1]; + CGFloat midpoint = [(UISlider *)sender value]; + [(GPUImageTiltShiftFilter *)sepiaFilter setTopFocusLevel:midpoint - 0.1]; + [(GPUImageTiltShiftFilter *)sepiaFilter setBottomFocusLevel:midpoint + 0.1]; [sourcePicture processImage]; } @@ -64,8 +64,8 @@ - (void)setupDisplayFiltering; UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; // The WID.jpg example is greater than 2048 pixels tall, so it fails on older devices sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; -// sepiaFilter = [[GPUImageTiltShiftFilter alloc] init]; - sepiaFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; + sepiaFilter = [[GPUImageTiltShiftFilter alloc] init]; +// sepiaFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; GPUImageView *imageView = (GPUImageView *)self.view; [sepiaFilter forceProcessingAtSize:imageView.sizeInPixels]; // This is now needed to make the filter run at the smaller output size @@ -80,51 +80,53 @@ - (void)setupImageFilteringToDisk; { // Set up a manual image filtering chain NSURL *inputImageURL = [[NSBundle mainBundle] URLForResource:@"Lambeau" withExtension:@"jpg"]; - UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; // GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; + NSLog(@"First image filtering"); GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithURL:inputImageURL]; - GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; GPUImageVignetteFilter *vignetteImageFilter = [[GPUImageVignetteFilter alloc] init]; vignetteImageFilter.vignetteEnd = 0.6; vignetteImageFilter.vignetteStart = 0.4; - // There's a problem with the Kuwahara filter where it doesn't finish rendering before the image is extracted from it. - // It looks like it only gets through certain tiles before glReadPixels() is called. Odd. -// GPUImageKuwaharaFilter *stillImageFilter = [[GPUImageKuwaharaFilter alloc] init]; -// stillImageFilter.radius = 9; - [stillImageSource addTarget:stillImageFilter]; [stillImageFilter addTarget:vignetteImageFilter]; - [vignetteImageFilter prepareForImageCapture]; + + [vignetteImageFilter useNextFrameForImageCapture]; [stillImageSource processImage]; - - UIImage *currentFilteredImage = [vignetteImageFilter imageFromCurrentlyProcessedOutput]; + + NSError *error = nil; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + @autoreleasepool { + UIImage *currentFilteredImage = [vignetteImageFilter imageFromCurrentFramebuffer]; + NSData *dataForPNGFile = UIImagePNGRepresentation(currentFilteredImage); + if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-filtered1.png"] options:NSAtomicWrite error:&error]) + { + NSLog(@"Error: Couldn't save image 1"); + } + dataForPNGFile = nil; + currentFilteredImage = nil; + } + // Do a simpler image filtering // GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init]; GPUImageSobelEdgeDetectionFilter *stillImageFilter2 = [[GPUImageSobelEdgeDetectionFilter alloc] init]; // GPUImageUnsharpMaskFilter *stillImageFilter2 = [[GPUImageUnsharpMaskFilter alloc] init]; // GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; + NSLog(@"Second image filtering"); + UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; // Write images to disk, as proof - NSData *dataForPNGFile = UIImagePNGRepresentation(currentFilteredImage); NSData *dataForPNGFile2 = UIImagePNGRepresentation(quickFilteredImage); - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - - NSError *error = nil; - if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-filtered1.png"] options:NSAtomicWrite error:&error]) - { - return; - } if (![dataForPNGFile2 writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-filtered2.png"] options:NSAtomicWrite error:&error]) { - return; + NSLog(@"Error: Couldn't save image 2"); } } @@ -137,24 +139,27 @@ - (void)setupImageResampling; GPUImageBrightnessFilter *passthroughFilter = [[GPUImageBrightnessFilter alloc] init]; [passthroughFilter forceProcessingAtSize:CGSizeMake(640.0, 480.0)]; [stillImageSource addTarget:passthroughFilter]; + [passthroughFilter useNextFrameForImageCapture]; [stillImageSource processImage]; - UIImage *nearestNeighborImage = [passthroughFilter imageFromCurrentlyProcessedOutput]; + UIImage *nearestNeighborImage = [passthroughFilter imageFromCurrentFramebuffer]; // Lanczos downsampling [stillImageSource removeAllTargets]; GPUImageLanczosResamplingFilter *lanczosResamplingFilter = [[GPUImageLanczosResamplingFilter alloc] init]; [lanczosResamplingFilter forceProcessingAtSize:CGSizeMake(640.0, 480.0)]; [stillImageSource addTarget:lanczosResamplingFilter]; + [lanczosResamplingFilter useNextFrameForImageCapture]; [stillImageSource processImage]; - UIImage *lanczosImage = [lanczosResamplingFilter imageFromCurrentlyProcessedOutput]; + UIImage *lanczosImage = [lanczosResamplingFilter imageFromCurrentFramebuffer]; // Trilinear downsampling GPUImagePicture *stillImageSource2 = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; GPUImageBrightnessFilter *passthroughFilter2 = [[GPUImageBrightnessFilter alloc] init]; [passthroughFilter2 forceProcessingAtSize:CGSizeMake(640.0, 480.0)]; [stillImageSource2 addTarget:passthroughFilter2]; + [passthroughFilter2 useNextFrameForImageCapture]; [stillImageSource2 processImage]; - UIImage *trilinearImage = [passthroughFilter2 imageFromCurrentlyProcessedOutput]; + UIImage *trilinearImage = [passthroughFilter2 imageFromCurrentFramebuffer]; NSData *dataForPNGFile1 = UIImagePNGRepresentation(nearestNeighborImage); NSData *dataForPNGFile2 = UIImagePNGRepresentation(lanczosImage); diff --git a/framework/Source/GPUImageAmatorkaFilter.m b/framework/Source/GPUImageAmatorkaFilter.m index dbb29f458..1ab3ec4e1 100755 --- a/framework/Source/GPUImageAmatorkaFilter.m +++ b/framework/Source/GPUImageAmatorkaFilter.m @@ -32,11 +32,6 @@ - (id)init; return self; } --(void)prepareForImageCapture { - [lookupImageSource processImage]; - [super prepareForImageCapture]; -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index 2f25f1c10..279b51a40 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -249,6 +249,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } @@ -323,11 +324,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // return; // } } -} -- (void)prepareForImageCapture; -{ - preparedToCaptureImage = YES; + [firstInputFramebuffer unlock]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index 0529fe58f..180873d17 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -71,6 +71,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } @@ -95,11 +96,6 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [firstInputFramebuffer unlock]; } -- (void)prepareForImageCapture; -{ - // Disable this for now, until I figure out how to integrate the texture caches with a buffer like this -} - #pragma mark - #pragma mark Managing targets diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index bfd7be675..0171aa807 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -54,23 +54,15 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; GLint filterInputTextureUniform; GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; - BOOL preparedToCaptureImage; BOOL isEndProcessing; - // Texture caches are an iOS-specific capability -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CVOpenGLESTextureCacheRef filterTextureCache; - CVPixelBufferRef renderTarget; - CVOpenGLESTextureRef renderTexture; -#else -#endif - CGSize currentFilterSize; GPUImageRotationMode inputRotation; BOOL currentlyReceivingMonochromeInput; NSMutableDictionary *uniformStateRestorationBlocks; + dispatch_semaphore_t imageCaptureSemaphore; } @property(readonly) CVPixelBufferRef renderTarget; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index f74dcf03f..1a4630be8 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -47,12 +47,8 @@ void main() #endif -void dataProviderReleaseCallback (void *info, const void *data, size_t size); -void dataProviderUnlockCallback (void *info, const void *data, size_t size); - @implementation GPUImageFilter -@synthesize renderTarget; @synthesize preventRendering = _preventRendering; @synthesize currentlyReceivingMonochromeInput; @@ -67,7 +63,6 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad } uniformStateRestorationBlocks = [NSMutableDictionary dictionaryWithCapacity:10]; - preparedToCaptureImage = NO; _preventRendering = NO; currentlyReceivingMonochromeInput = NO; inputRotation = kGPUImageNoRotation; @@ -75,7 +70,8 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad backgroundColorGreen = 0.0; backgroundColorBlue = 0.0; backgroundColorAlpha = 0.0; - + imageCaptureSemaphore = dispatch_semaphore_create(1); + runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; @@ -159,103 +155,57 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; - (void)dealloc { +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || (!defined(__IPHONE_7_0)) ) + if (imageCaptureSemaphore != NULL) + { + dispatch_release(imageCaptureSemaphore); + } +#endif } #pragma mark - #pragma mark Still image processing -void dataProviderReleaseCallback (void *info, const void *data, size_t size) +- (void)useNextFrameForImageCapture; { - free((void *)data); -} + usingNextFrameForImageCapture = YES; -void dataProviderUnlockCallback (void *info, const void *data, size_t size) -{ - GPUImageFilter *filter = (__bridge_transfer GPUImageFilter*)info; - - CVPixelBufferUnlockBaseAddress([filter renderTarget], 0); - if ([filter renderTarget]) { - CFRelease([filter renderTarget]); + // Set the semaphore high, if it isn't already + if (dispatch_semaphore_wait(imageCaptureSemaphore, DISPATCH_TIME_NOW) != 0) + { + return; } - - // TODO: use outputFramebuffer for this, unlocking here - - filter.preventRendering = NO; } -- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation +- (CGImageRef)newCGImageFromCurrentlyProcessedOutput { - - // a CGImage can only be created from a 'normal' color texture - NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"For conversion to a CGImage the output texture format for this filter must be GL_RGBA."); - NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"For conversion to a CGImage the type of the output texture of this filter must be GL_UNSIGNED_BYTE."); - - __block CGImageRef cgImageFromBytes; + // Give it three seconds to process, then abort if they forgot to set up the image capture properly + double timeoutForImageCapture = 3.0; + dispatch_time_t convertedTimeout = dispatch_time(DISPATCH_TIME_NOW, timeoutForImageCapture * NSEC_PER_SEC); - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - CGSize currentFBOSize = [self sizeOfFBO]; - NSUInteger totalBytesForImage = (int)currentFBOSize.width * (int)currentFBOSize.height * 4; - // It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache - NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; - NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)currentFBOSize.height * 4; - - GLubyte *rawImagePixels; - - CGDataProviderRef dataProvider; - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - // glFlush(); - glFinish(); - CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation - CVPixelBufferLockBaseAddress(renderTarget, 0); - self.preventRendering = YES; // Locks don't seem to work, so prevent any rendering to the filter which might overwrite the pixel buffer data until done processing - rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); - dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, paddedBytesForImage, dataProviderUnlockCallback); - } - else - { - // TODO: Fix this based on the new caching model -// [self setOutputFBO]; - rawImagePixels = (GLubyte *)malloc(totalBytesForImage); - glReadPixels(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); - dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, dataProviderReleaseCallback); - } - - - CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); - - if ([GPUImageContext supportsFastTextureUpload] && preparedToCaptureImage) - { - cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); - } - else - { - cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, 4 * (int)currentFBOSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); - } - - // Capture image with current device orientation - CGDataProviderRelease(dataProvider); - CGColorSpaceRelease(defaultRGBColorSpace); - }); + if (dispatch_semaphore_wait(imageCaptureSemaphore, convertedTimeout) != 0) + { + return NULL; + } - return cgImageFromBytes; -} + NSLog(@"Trying to return from framebuffer: %@", [self framebufferForOutput]); -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter -{ - return [self newCGImageByFilteringCGImage:imageToFilter orientation:UIImageOrientationUp]; + usingNextFrameForImageCapture = NO; + dispatch_semaphore_signal(imageCaptureSemaphore); + + // All image output is now managed by the framebuffer itself + return [[self framebufferForOutput] newCGImageFromFramebufferContents]; } -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; { GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; + [self useNextFrameForImageCapture]; [stillImageSource addTarget:self]; [stillImageSource processImage]; - CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation]; + CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutput]; [stillImageSource removeTarget:self]; return processedImage; @@ -355,6 +305,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } @@ -362,6 +313,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; + if (usingNextFrameForImageCapture) + { + [outputFramebuffer lock]; + } [self setUniformsForProgramAtIndex:0]; @@ -379,6 +334,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [firstInputFramebuffer unlock]; + + if (usingNextFrameForImageCapture) + { + dispatch_semaphore_signal(imageCaptureSemaphore); + } } - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; @@ -421,16 +381,6 @@ - (CGSize)outputFrameSize; return inputTextureSize; } -- (void)prepareForImageCapture; -{ - if (preparedToCaptureImage) - { - return; - } - - preparedToCaptureImage = YES; -} - #pragma mark - #pragma mark Input parameters diff --git a/framework/Source/GPUImageFilterGroup.m b/framework/Source/GPUImageFilterGroup.m index 9cd045f1e..d2fd84144 100755 --- a/framework/Source/GPUImageFilterGroup.m +++ b/framework/Source/GPUImageFilterGroup.m @@ -40,14 +40,14 @@ - (NSUInteger)filterCount; #pragma mark - #pragma mark Still image processing -- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (void)useNextFrameForImageCapture; { - return [self.terminalFilter newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + [self.terminalFilter useNextFrameForImageCapture]; } -- (void)prepareForImageCapture; +- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; { - [self.terminalFilter prepareForImageCapture]; + return [self.terminalFilter newCGImageFromCurrentlyProcessedOutput]; } #pragma mark - diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 90b565f17..08861f685 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -25,6 +25,5 @@ - (UIImage *) currentFilteredFrame; - (UIImage *) currentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation; - (CGImageRef) newCGImageFromCurrentFilteredFrame; -- (CGImageRef) newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation; @end diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index f719c17ee..bc372f743 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -198,20 +198,15 @@ - (void)_refreshFilters { } - (UIImage *)currentFilteredFrame { - return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentlyProcessedOutput]; + return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentFramebuffer]; } - (UIImage *)currentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation { - return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentFramebufferWithOrientation:imageOrientation]; } - (CGImageRef)newCGImageFromCurrentFilteredFrame { return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; } -- (CGImageRef)newCGImageFromCurrentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation { - return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; -} - - @end \ No newline at end of file diff --git a/framework/Source/GPUImageFramebuffer.h b/framework/Source/GPUImageFramebuffer.h index 5a3fe2584..c85313c44 100644 --- a/framework/Source/GPUImageFramebuffer.h +++ b/framework/Source/GPUImageFramebuffer.h @@ -36,4 +36,8 @@ typedef struct GPUTextureOptions { - (void)disableReferenceCounting; - (void)enableReferenceCounting; +// Image capture +- (CGImageRef)newCGImageFromFramebufferContents; +- (void)restoreRenderTarget; + @end diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index a695b5ea2..39f777898 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -19,6 +19,9 @@ - (void)destroyFramebuffer; @end +void dataProviderReleaseCallback (void *info, const void *data, size_t size); +void dataProviderUnlockCallback (void *info, const void *data, size_t size); + @implementation GPUImageFramebuffer @synthesize size = _size; @@ -167,8 +170,6 @@ - (void)generateFramebuffer; GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - NSLog(@"Framebuffer texture: %d", _texture); - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); glBindTexture(GL_TEXTURE_2D, 0); }); @@ -250,4 +251,91 @@ - (void)enableReferenceCounting; { referenceCountingDisabled = NO; } + +#pragma mark - +#pragma mark Image capture + +void dataProviderReleaseCallback (void *info, const void *data, size_t size) +{ + free((void *)data); + NSLog(@"Free callback"); +} + +void dataProviderUnlockCallback (void *info, const void *data, size_t size) +{ + GPUImageFramebuffer *framebuffer = (__bridge_transfer GPUImageFramebuffer*)info; + + [framebuffer restoreRenderTarget]; + [framebuffer unlock]; + [[GPUImageContext sharedFramebufferCache] removeFramebufferFromActiveImageCaptureList:framebuffer]; + NSLog(@"Unlock callback"); +} + +- (CGImageRef)newCGImageFromFramebufferContents; +{ + // a CGImage can only be created from a 'normal' color texture + NSAssert(self.textureOptions.internalFormat == GL_RGBA, @"For conversion to a CGImage the output texture format for this filter must be GL_RGBA."); + NSAssert(self.textureOptions.type == GL_UNSIGNED_BYTE, @"For conversion to a CGImage the type of the output texture of this filter must be GL_UNSIGNED_BYTE."); + + __block CGImageRef cgImageFromBytes; + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + + NSUInteger totalBytesForImage = (int)_size.width * (int)_size.height * 4; + // It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache + + GLubyte *rawImagePixels; + + CGDataProviderRef dataProvider; + if ([GPUImageContext supportsFastTextureUpload]) + { + NSLog(@"Fast texture path"); + NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; + NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)_size.height * 4; + + // glFlush(); + glFinish(); + CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation + CVPixelBufferLockBaseAddress(renderTarget, 0); + rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); + dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, paddedBytesForImage, dataProviderUnlockCallback); + [[GPUImageContext sharedFramebufferCache] addFramebufferToActiveImageCaptureList:self]; // In case the framebuffer is swapped out on the filter, need to have a strong reference to it somewhere for it to hang on while the image is in existence + } + else + { + NSLog(@"Normal path"); + [self activateFramebuffer]; + rawImagePixels = (GLubyte *)malloc(totalBytesForImage); + glReadPixels(0, 0, (int)_size.width, (int)_size.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, dataProviderReleaseCallback); + [self unlock]; // Don't need to keep this around anymore + } + + CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); + + if ([GPUImageContext supportsFastTextureUpload]) + { + cgImageFromBytes = CGImageCreate((int)_size.width, (int)_size.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); + } + else + { + cgImageFromBytes = CGImageCreate((int)_size.width, (int)_size.height, 8, 32, 4 * (int)_size.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); + } + + // Capture image with current device orientation + CGDataProviderRelease(dataProvider); + CGColorSpaceRelease(defaultRGBColorSpace); + + }); + + return cgImageFromBytes; + +} + +- (void)restoreRenderTarget; +{ + CFRelease(renderTarget); + CVPixelBufferUnlockBaseAddress(renderTarget, 0); +} @end diff --git a/framework/Source/GPUImageFramebufferCache.h b/framework/Source/GPUImageFramebufferCache.h index dddfe6583..e56a34566 100644 --- a/framework/Source/GPUImageFramebufferCache.h +++ b/framework/Source/GPUImageFramebufferCache.h @@ -9,5 +9,7 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize onlyTexture:(BOOL)onlyTexture; - (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; - (void)purgeAllUnassignedFramebuffers; +- (void)addFramebufferToActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer; +- (void)removeFramebufferFromActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer; @end diff --git a/framework/Source/GPUImageFramebufferCache.m b/framework/Source/GPUImageFramebufferCache.m index 3be3f1c33..9592f1311 100644 --- a/framework/Source/GPUImageFramebufferCache.m +++ b/framework/Source/GPUImageFramebufferCache.m @@ -4,6 +4,7 @@ @interface GPUImageFramebufferCache() { NSCache *framebufferCache; NSMutableDictionary *framebufferTypeCounts; + NSMutableArray *activeImageCaptureList; // Where framebuffers that may be lost by a filter, but which are still needed for a UIImage, etc., are stored } - (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture; @@ -25,6 +26,7 @@ - (id)init; framebufferCache = [[NSCache alloc] init]; framebufferTypeCounts = [[NSMutableDictionary alloc] init]; + activeImageCaptureList = [[NSMutableArray alloc] init]; return self; } @@ -127,4 +129,14 @@ - (void)purgeAllUnassignedFramebuffers; [framebufferTypeCounts removeAllObjects]; } +- (void)addFramebufferToActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer; +{ + [activeImageCaptureList addObject:framebuffer]; +} + +- (void)removeFramebufferFromActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer; +{ + [activeImageCaptureList removeObject:framebuffer]; +} + @end diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 61c00b2e2..5bc7b1804 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -267,6 +267,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } @@ -275,6 +276,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates); outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; + if (usingNextFrameForImageCapture) + { + [outputFramebuffer lock]; + } [GPUImageContext setActiveShaderProgram:filterProgram]; @@ -303,6 +308,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDisable(GL_BLEND); [firstInputFramebuffer unlock]; + + if (usingNextFrameForImageCapture) + { + dispatch_semaphore_signal(imageCaptureSemaphore); + } } #pragma mark - diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m index 8b7502a99..a655f486e 100644 --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -166,6 +166,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } @@ -208,7 +209,11 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glBindTexture(GL_TEXTURE_2D, 0); secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [secondOutputFramebuffer activateFramebuffer]; - + if (usingNextFrameForImageCapture) + { + [secondOutputFramebuffer lock]; + } + [self setUniformsForProgramAtIndex:1]; glActiveTexture(GL_TEXTURE3); @@ -225,6 +230,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [outputFramebuffer unlock]; outputFramebuffer = nil; + if (usingNextFrameForImageCapture) + { + dispatch_semaphore_signal(imageCaptureSemaphore); + } } @end diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index a9ad957b0..64fa193a2 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -177,6 +177,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } @@ -282,6 +283,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // return; // } } + + [firstInputFramebuffer unlock]; } #pragma mark - diff --git a/framework/Source/GPUImageMissEtikateFilter.m b/framework/Source/GPUImageMissEtikateFilter.m index 9117ad834..1810b707f 100755 --- a/framework/Source/GPUImageMissEtikateFilter.m +++ b/framework/Source/GPUImageMissEtikateFilter.m @@ -32,11 +32,6 @@ - (id)init; return self; } --(void)prepareForImageCapture { - [lookupImageSource processImage]; - [super prepareForImageCapture]; -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 1a94ddd81..1d60eff27 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -46,6 +46,7 @@ void reportAvailableMemoryForGPUImage(NSString *tag); BOOL overrideInputSize; BOOL allTargetsWantMonochromeData; + BOOL usingNextFrameForImageCapture; } @property(readwrite, nonatomic) BOOL shouldSmoothlyScaleOutput; @@ -100,26 +101,24 @@ void reportAvailableMemoryForGPUImage(NSString *tag); /// @name Still image processing +- (void)useNextFrameForImageCapture; - (CGImageRef)newCGImageFromCurrentlyProcessedOutput; -- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; // Platform-specific image output methods +// If you're trying to use these methods, remember that you need to set -useNextFrameForImageCapture before running -processImage or running video and calling any of these methods, or you will get a nil image #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -- (UIImage *)imageFromCurrentlyProcessedOutput; -- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (UIImage *)imageFromCurrentFramebuffer; +- (UIImage *)imageFromCurrentFramebufferWithOrientation:(UIImageOrientation)imageOrientation; - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; - (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter; #else -- (NSImage *)imageFromCurrentlyProcessedOutput; -- (NSImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (NSImage *)imageFromCurrentFramebuffer; +- (NSImage *)imageFromCurrentFramebufferWithOrientation:(UIImageOrientation)imageOrientation; - (NSImage *)imageByFilteringImage:(NSImage *)imageToFilter; - (CGImageRef)newCGImageByFilteringImage:(NSImage *)imageToFilter; #endif - (BOOL)providesMonochromeOutput; -- (void)prepareForImageCapture; - @end diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index a7c7b1db3..7f091221e 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -95,6 +95,7 @@ - (id)init; targetTextureIndices = [[NSMutableArray alloc] init]; _enabled = YES; allTargetsWantMonochromeData = YES; + usingNextFrameForImageCapture = NO; // set default texture options _outputTextureOptions.minFilter = GL_LINEAR; @@ -231,24 +232,24 @@ - (void)forceProcessingAtSizeRespectingAspectRatio:(CGSize)frameSize; #pragma mark - #pragma mark Still image processing -- (CGImageRef)newCGImageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (void)useNextFrameForImageCapture; { - return nil; + } -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter +- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; { - return [self newCGImageByFilteringCGImage:imageToFilter orientation:UIImageOrientationUp]; + return nil; } -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter orientation:(UIImageOrientation)orientation; +- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; { GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; [stillImageSource addTarget:(id)self]; [stillImageSource processImage]; - CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation]; + CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutput]; [stillImageSource removeTarget:(id)self]; return processedImage; @@ -259,43 +260,12 @@ - (BOOL)providesMonochromeOutput; return NO; } -- (void)prepareForImageCapture; -{ - -} - #pragma mark - #pragma mark Platform-specific image output methods #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; -{ - UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; - UIImageOrientation imageOrientation = UIImageOrientationLeft; - switch (deviceOrientation) - { - case UIDeviceOrientationPortrait: - imageOrientation = UIImageOrientationUp; - break; - case UIDeviceOrientationPortraitUpsideDown: - imageOrientation = UIImageOrientationDown; - break; - case UIDeviceOrientationLandscapeLeft: - imageOrientation = UIImageOrientationLeft; - break; - case UIDeviceOrientationLandscapeRight: - imageOrientation = UIImageOrientationRight; - break; - default: - imageOrientation = UIImageOrientationUp; - break; - } - - return [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; -} - -- (UIImage *)imageFromCurrentlyProcessedOutput; +- (UIImage *)imageFromCurrentFramebuffer; { UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; UIImageOrientation imageOrientation = UIImageOrientationLeft; @@ -318,12 +288,12 @@ - (UIImage *)imageFromCurrentlyProcessedOutput; break; } - return [self imageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + return [self imageFromCurrentFramebufferWithOrientation:imageOrientation]; } -- (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; +- (UIImage *)imageFromCurrentFramebufferWithOrientation:(UIImageOrientation)imageOrientation; { - CGImageRef cgImageFromBytes = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + CGImageRef cgImageFromBytes = [self newCGImageFromCurrentlyProcessedOutput]; UIImage *finalImage = [UIImage imageWithCGImage:cgImageFromBytes scale:1.0 orientation:imageOrientation]; CGImageRelease(cgImageFromBytes); @@ -332,7 +302,7 @@ - (UIImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; { - CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; + CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; UIImage *processedImage = [UIImage imageWithCGImage:image scale:[imageToFilter scale] orientation:[imageToFilter imageOrientation]]; CGImageRelease(image); return processedImage; @@ -340,14 +310,14 @@ - (UIImage *)imageByFilteringImage:(UIImage *)imageToFilter; - (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter { - return [self newCGImageByFilteringCGImage:[imageToFilter CGImage] orientation:[imageToFilter imageOrientation]]; + return [self newCGImageByFilteringCGImage:[imageToFilter CGImage]]; } #else - (CGImageRef)newCGImageFromCurrentlyProcessedOutput; { - return [self newCGImageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationLeft]; + return [self newCGImageFromCurrentlyProcessedOutput]; } - (NSImage *)imageFromCurrentlyProcessedOutput; @@ -366,7 +336,7 @@ - (NSImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientatio - (NSImage *)imageByFilteringImage:(NSImage *)imageToFilter; { - CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil] orientation:UIImageOrientationLeft]; + CGImageRef image = [self newCGImageByFilteringCGImage:[imageToFilter CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil]]; NSImage *processedImage = [[NSImage alloc] initWithCGImage:image size:NSZeroSize]; CGImageRelease(image); return processedImage; @@ -374,7 +344,7 @@ - (NSImage *)imageByFilteringImage:(NSImage *)imageToFilter; - (CGImageRef)newCGImageByFilteringImage:(NSImage *)imageToFilter { - return [self newCGImageByFilteringCGImage:[imageToFilter CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil] orientation:UIImageOrientationLeft]; + return [self newCGImageByFilteringCGImage:[imageToFilter CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil]]; } #endif diff --git a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m index c060cfee3..39f9c0dc4 100644 --- a/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m +++ b/framework/Source/GPUImageParallelCoordinateLineTransformFilter.m @@ -145,6 +145,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } diff --git a/framework/Source/GPUImageSoftEleganceFilter.m b/framework/Source/GPUImageSoftEleganceFilter.m index fc643e0be..e1d4e02d0 100755 --- a/framework/Source/GPUImageSoftEleganceFilter.m +++ b/framework/Source/GPUImageSoftEleganceFilter.m @@ -56,12 +56,6 @@ - (id)init; return self; } --(void)prepareForImageCapture { - [lookupImageSource1 processImage]; - [lookupImageSource2 processImage]; - [super prepareForImageCapture]; -} - #pragma mark - #pragma mark Accessors diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index b0d485f77..ea8c09efc 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -165,7 +165,7 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) UIImage *filteredPhoto = nil; if(!error){ - filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + filteredPhoto = [finalFilterInChain imageFromCurrentFramebuffer]; } dispatch_semaphore_signal(frameRenderingSemaphore); @@ -182,7 +182,7 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f if(!error){ @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentFramebuffer]; dispatch_semaphore_signal(frameRenderingSemaphore); // reportAvailableMemoryForGPUImage(@"After UIImage generation"); @@ -207,7 +207,7 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi if(!error){ @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutput]; + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentFramebuffer]; dispatch_semaphore_signal(frameRenderingSemaphore); dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); } @@ -257,6 +257,7 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi } dispatch_semaphore_signal(frameRenderingSemaphore); + [finalFilterInChain useNextFrameForImageCapture]; [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); if (sampleBuffer != NULL) @@ -269,6 +270,7 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageContext supportsFastTextureUpload]) || !requiresFrontCameraTextureCacheCorruptionWorkaround) { dispatch_semaphore_signal(frameRenderingSemaphore); + [finalFilterInChain useNextFrameForImageCapture]; [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); } diff --git a/framework/Source/GPUImageThreeInputFilter.m b/framework/Source/GPUImageThreeInputFilter.m index 8b67414ca..a173241c3 100644 --- a/framework/Source/GPUImageThreeInputFilter.m +++ b/framework/Source/GPUImageThreeInputFilter.m @@ -82,12 +82,20 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; + [secondInputFramebuffer unlock]; + [thirdInputFramebuffer unlock]; return; } [GPUImageContext setActiveShaderProgram:filterProgram]; outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; + if (usingNextFrameForImageCapture) + { + [outputFramebuffer lock]; + } + [self setUniformsForProgramAtIndex:0]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); @@ -114,6 +122,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [firstInputFramebuffer unlock]; [secondInputFramebuffer unlock]; [thirdInputFramebuffer unlock]; + if (usingNextFrameForImageCapture) + { + dispatch_semaphore_signal(imageCaptureSemaphore); + } } #pragma mark - diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index 8e4758f39..18a717e05 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -531,13 +531,18 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } [GPUImageContext setActiveShaderProgram:filterProgram]; outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; - + if (usingNextFrameForImageCapture) + { + [outputFramebuffer lock]; + } + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); @@ -554,6 +559,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [firstInputFramebuffer unlock]; + if (usingNextFrameForImageCapture) + { + dispatch_semaphore_signal(imageCaptureSemaphore); + } } #pragma mark - diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index de10b5e07..cf3187370 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -88,12 +88,19 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; + [secondInputFramebuffer unlock]; return; } [GPUImageContext setActiveShaderProgram:filterProgram]; outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; + if (usingNextFrameForImageCapture) + { + [outputFramebuffer lock]; + } + [self setUniformsForProgramAtIndex:0]; glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); @@ -115,6 +122,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [firstInputFramebuffer unlock]; [secondInputFramebuffer unlock]; + if (usingNextFrameForImageCapture) + { + dispatch_semaphore_signal(imageCaptureSemaphore); + } } #pragma mark - diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 642bfe1cc..cafbc8ea0 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -81,21 +81,48 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates { if (self.preventRendering) { + [firstInputFramebuffer unlock]; return; } + [GPUImageContext setActiveShaderProgram:filterProgram]; + + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; + [outputFramebuffer activateFramebuffer]; + + [self setUniformsForProgramAtIndex:0]; + + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClear(GL_COLOR_BUFFER_BIT); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); + + glUniform1i(filterInputTextureUniform, 2); + + glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); + glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + [firstInputFramebuffer unlock]; + // This assumes that any two-pass filter that says it desires monochrome input is using the first pass for a luminance conversion, which can be dropped // if (!currentlyReceivingMonochromeInput) // { // Run the first stage of the two-pass filter - [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates]; +// [super renderToTextureWithVertices:vertices textureCoordinates:textureCoordinates]; // } // Run the second stage of the two-pass filter secondOutputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [secondOutputFramebuffer activateFramebuffer]; [GPUImageContext setActiveShaderProgram:secondFilterProgram]; - + if (usingNextFrameForImageCapture) + { + [secondOutputFramebuffer lock]; + } + [self setUniformsForProgramAtIndex:1]; glActiveTexture(GL_TEXTURE3); @@ -125,6 +152,10 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [outputFramebuffer unlock]; + if (usingNextFrameForImageCapture) + { + dispatch_semaphore_signal(imageCaptureSemaphore); + } } - (void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index fba3f6d75..1c326bebc 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -627,6 +627,7 @@ - (void)renderAtInternalSize; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glFinish(); + [firstInputFramebuffer unlock]; } #pragma mark - @@ -636,6 +637,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { if (!isRecording) { + [firstInputFramebuffer unlock]; return; } @@ -643,6 +645,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) || (CMTIME_IS_INDEFINITE(frameTime)) ) { + [firstInputFramebuffer unlock]; return; } @@ -661,6 +664,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; if (!assetWriterVideoInput.readyForMoreMediaData && _encodingLiveVideo) { + [firstInputFramebuffer unlock]; NSLog(@"1: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); return; } diff --git a/framework/Source/iOS/GPUImagePicture.h b/framework/Source/iOS/GPUImagePicture.h index 627464284..1ae0ef4a0 100755 --- a/framework/Source/iOS/GPUImagePicture.h +++ b/framework/Source/iOS/GPUImagePicture.h @@ -29,5 +29,6 @@ * @returns NO if resource is blocked and processing is discarded, YES otherwise */ - (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; +- (void)processImageUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage))block; @end diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index d6c11a71f..9be3c135c 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -271,6 +271,15 @@ - (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; return YES; } +- (void)processImageUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(UIImage *processedImage))block; +{ + [finalFilterInChain useNextFrameForImageCapture]; + [self processImageWithCompletionHandler:^{ + UIImage *imageFromFilter = [finalFilterInChain imageFromCurrentFramebuffer]; + block(imageFromFilter); + }]; +} + - (CGSize)outputImageSize; { return pixelSizeOfImage; From ec7981e9cf7715e5615799a6448e9341f03feba4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 17 Mar 2014 11:52:07 -0500 Subject: [PATCH 508/695] Got the Mac side to build under the new framebuffer caching structure. --- .../FeatureExtractionAppDelegate.m | 40 ++-- .../ShowcaseFilterListController.m | 2 +- .../GPUImageMac.xcodeproj/project.pbxproj | 16 ++ framework/Source/GPUImageAverageColor.h | 2 +- framework/Source/GPUImageAverageColor.m | 211 ++---------------- framework/Source/GPUImageBuffer.m | 75 ++----- framework/Source/GPUImageFilter.m | 2 - framework/Source/GPUImageFramebuffer.h | 8 + framework/Source/GPUImageFramebuffer.m | 12 +- framework/Source/GPUImageLuminosity.m | 13 +- framework/Source/GPUImageOutput.m | 13 +- framework/Source/GPUImageVideoCamera.m | 17 +- framework/Source/Mac/GPUImageAVCamera.m | 139 +++++------- framework/Source/Mac/GPUImageContext.h | 17 +- framework/Source/Mac/GPUImageContext.m | 16 ++ framework/Source/Mac/GPUImageMovieWriter.h | 2 - framework/Source/Mac/GPUImageMovieWriter.m | 22 +- framework/Source/Mac/GPUImagePicture.h | 2 + framework/Source/Mac/GPUImagePicture.m | 111 ++++++--- framework/Source/Mac/GPUImageView.h | 1 - framework/Source/Mac/GPUImageView.m | 27 ++- 21 files changed, 295 insertions(+), 453 deletions(-) diff --git a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m index c5cc4244e..db9ce3c18 100644 --- a/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m +++ b/examples/iOS/FeatureExtractionTest/FeatureExtractionTest/FeatureExtractionAppDelegate.m @@ -51,37 +51,42 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( GPUImageErosionFilter *erosionFilter = [[GPUImageErosionFilter alloc] initWithRadius:4]; [blackAndWhiteBoxImage removeAllTargets]; [blackAndWhiteBoxImage addTarget:erosionFilter]; + [erosionFilter useNextFrameForImageCapture]; [blackAndWhiteBoxImage processImage]; - UIImage *erosionImage = [erosionFilter imageFromCurrentlyProcessedOutput]; + UIImage *erosionImage = [erosionFilter imageFromCurrentFramebuffer]; [self saveImage:erosionImage fileName:@"Erosion4.png"]; GPUImageDilationFilter *dilationFilter = [[GPUImageDilationFilter alloc] initWithRadius:4]; [blackAndWhiteBoxImage removeAllTargets]; [blackAndWhiteBoxImage addTarget:dilationFilter]; + [dilationFilter useNextFrameForImageCapture]; [blackAndWhiteBoxImage processImage]; - UIImage *dilationImage = [dilationFilter imageFromCurrentlyProcessedOutput]; + UIImage *dilationImage = [dilationFilter imageFromCurrentFramebuffer]; [self saveImage:dilationImage fileName:@"Dilation4.png"]; GPUImageOpeningFilter *openingFilter = [[GPUImageOpeningFilter alloc] initWithRadius:4]; [blackAndWhiteBoxImage removeAllTargets]; [blackAndWhiteBoxImage addTarget:openingFilter]; + [openingFilter useNextFrameForImageCapture]; [blackAndWhiteBoxImage processImage]; - UIImage *openingImage = [openingFilter imageFromCurrentlyProcessedOutput]; + UIImage *openingImage = [openingFilter imageFromCurrentFramebuffer]; [self saveImage:openingImage fileName:@"Opening4.png"]; GPUImageClosingFilter *closingFilter = [[GPUImageClosingFilter alloc] initWithRadius:4]; [blackAndWhiteBoxImage removeAllTargets]; [blackAndWhiteBoxImage addTarget:closingFilter]; + [closingFilter useNextFrameForImageCapture]; [blackAndWhiteBoxImage processImage]; - UIImage *closingImage = [closingFilter imageFromCurrentlyProcessedOutput]; + UIImage *closingImage = [closingFilter imageFromCurrentFramebuffer]; [self saveImage:closingImage fileName:@"Closing4.png"]; UIImage *compressionInputImage = [UIImage imageNamed:@"8pixeltest.png"]; GPUImagePicture *compressionImage = [[GPUImagePicture alloc] initWithImage:compressionInputImage]; GPUImageColorPackingFilter *packingFilter = [[GPUImageColorPackingFilter alloc] init]; [compressionImage addTarget:packingFilter]; + [packingFilter useNextFrameForImageCapture]; [compressionImage processImage]; - UIImage *compressedImage = [packingFilter imageFromCurrentlyProcessedOutput]; + UIImage *compressedImage = [packingFilter imageFromCurrentFramebuffer]; [self saveImage:compressedImage fileName:@"Compression.png"]; // Testing local binary patterns @@ -91,8 +96,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( GPUImageLocalBinaryPatternFilter *lbpFilter = [[GPUImageLocalBinaryPatternFilter alloc] init]; [lbpImage removeAllTargets]; [lbpImage addTarget:lbpFilter]; + [lbpFilter useNextFrameForImageCapture]; [lbpImage processImage]; - UIImage *lbpOutput = [lbpFilter imageFromCurrentlyProcessedOutput]; + UIImage *lbpOutput = [lbpFilter imageFromCurrentFramebuffer]; [self saveImage:lbpOutput fileName:@"LocalBinaryPatterns.png"]; // Testing image color averaging @@ -112,8 +118,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( GPUImageGaussianBlurFilter *gaussianBlur = [[GPUImageGaussianBlurFilter alloc] init]; gaussianBlur.blurRadiusInPixels = 2.0; [gaussianImage addTarget:gaussianBlur]; + [gaussianBlur useNextFrameForImageCapture]; [gaussianImage processImage]; - UIImage *gaussianOutput = [gaussianBlur imageFromCurrentlyProcessedOutput]; + UIImage *gaussianOutput = [gaussianBlur imageFromCurrentFramebuffer]; [self saveImage:gaussianOutput fileName:@"Gaussian-GPUImage.png"]; CIContext *coreImageContext = [CIContext contextWithEAGLContext:[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]]; @@ -139,8 +146,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( boxBlur.blurRadiusInPixels = 3.0; [gaussianImage removeAllTargets]; [gaussianImage addTarget:boxBlur]; + [boxBlur useNextFrameForImageCapture]; [gaussianImage processImage]; - UIImage *boxOutput = [boxBlur imageFromCurrentlyProcessedOutput]; + UIImage *boxOutput = [boxBlur imageFromCurrentFramebuffer]; [self saveImage:boxOutput fileName:@"BoxBlur-GPUImage.png"]; CIImage *inputCIBoxImage = [[CIImage alloc] initWithCGImage:gaussianBlurInput.CGImage]; @@ -172,7 +180,7 @@ - (void)testHoughTransform:(GPUImageHoughTransformLineDetector *)lineDetector of __unsafe_unretained GPUImageHoughTransformLineDetector * weakDetector = lineDetector; [lineDetector setLinesDetectedBlock:^(GLfloat* lineArray, NSUInteger linesDetected, CMTime frameTime){ - NSLog(@"Number of lines: %d", linesDetected); + NSLog(@"Number of lines: %ld", (unsigned long)linesDetected); GPUImageLineGenerator *lineGenerator = [[GPUImageLineGenerator alloc] init]; // lineGenerator.crosshairWidth = 10.0; @@ -186,7 +194,7 @@ - (void)testHoughTransform:(GPUImageHoughTransformLineDetector *)lineDetector of [lineGenerator addTarget:blendFilter]; - [blendFilter prepareForImageCapture]; + [blendFilter useNextFrameForImageCapture]; [lineGenerator renderLinesFromArray:lineArray count:linesDetected frameTime:frameTime]; @@ -194,12 +202,12 @@ - (void)testHoughTransform:(GPUImageHoughTransformLineDetector *)lineDetector of NSUInteger currentImageIndex = 0; for (UIImage *currentImage in weakDetector.intermediateImages) { - [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%d.png", detectorName, pictureName, currentImageIndex]]; + [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%ld.png", detectorName, pictureName, (unsigned long)currentImageIndex]]; currentImageIndex++; } - UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput]; + UIImage *crosshairResult = [blendFilter imageFromCurrentFramebuffer]; [self saveImage:crosshairResult fileName:[NSString stringWithFormat:@"%@-%@-Lines.png", detectorName, pictureName]]; }); @@ -231,21 +239,21 @@ - (void)testCornerDetector:(GPUImageHarrisCornerDetectionFilter *)cornerDetector [crosshairGenerator addTarget:blendFilter]; - [blendFilter prepareForImageCapture]; + [blendFilter useNextFrameForImageCapture]; - NSLog(@"Number of corners: %d", cornersDetected); + NSLog(@"Number of corners: %ld", (unsigned long)cornersDetected); [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime]; dispatch_async(dispatch_get_main_queue(), ^{ NSUInteger currentImageIndex = 0; for (UIImage *currentImage in weakDetector.intermediateImages) { - [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%d.png", detectorName, pictureName, currentImageIndex]]; + [self saveImage:currentImage fileName:[NSString stringWithFormat:@"%@-%@-%ld.png", detectorName, pictureName, (unsigned long)currentImageIndex]]; currentImageIndex++; } - UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput]; + UIImage *crosshairResult = [blendFilter imageFromCurrentFramebuffer]; [self saveImage:crosshairResult fileName:[NSString stringWithFormat:@"%@-%@-Crosshairs.png", detectorName, pictureName]]; }); diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index d55ecc75b..def89d0dd 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -234,7 +234,7 @@ - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *) - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - ShowcaseFilterViewController *filterViewController = [[ShowcaseFilterViewController alloc] initWithFilterType:indexPath.row]; + ShowcaseFilterViewController *filterViewController = [[ShowcaseFilterViewController alloc] initWithFilterType:(GPUImageShowcaseFilterType)indexPath.row]; [self.navigationController pushViewController:filterViewController animated:YES]; } diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 7d658203f..45fb0a1d0 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -133,6 +133,10 @@ BCC0DF5F173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */; }; BCC0DF6217359F42007C485F /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCC0DF6317359F43007C485F /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */; }; + BCD8EB8C18D6AFC5005ED83C /* GPUImageFramebuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD8EB8818D6AFC5005ED83C /* GPUImageFramebuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD8EB8D18D6AFC5005ED83C /* GPUImageFramebuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD8EB8918D6AFC5005ED83C /* GPUImageFramebuffer.m */; }; + BCD8EB8E18D6AFC5005ED83C /* GPUImageFramebufferCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD8EB8A18D6AFC5005ED83C /* GPUImageFramebufferCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD8EB8F18D6AFC5005ED83C /* GPUImageFramebufferCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD8EB8B18D6AFC5005ED83C /* GPUImageFramebufferCache.m */; }; BCE2EF8817459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF8217459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCE2EF8917459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE2EF8317459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m */; }; BCE2EF8A17459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE2EF8417459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -446,6 +450,10 @@ BCC0DF5D173596B9007C485F /* GPUImageAverageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAverageLuminanceThresholdFilter.m; path = Source/GPUImageAverageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; BCC0DF6017359F42007C485F /* GPUImageLuminanceThresholdFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLuminanceThresholdFilter.h; path = Source/GPUImageLuminanceThresholdFilter.h; sourceTree = SOURCE_ROOT; }; BCC0DF6117359F42007C485F /* GPUImageLuminanceThresholdFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLuminanceThresholdFilter.m; path = Source/GPUImageLuminanceThresholdFilter.m; sourceTree = SOURCE_ROOT; }; + BCD8EB8818D6AFC5005ED83C /* GPUImageFramebuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFramebuffer.h; path = Source/GPUImageFramebuffer.h; sourceTree = SOURCE_ROOT; }; + BCD8EB8918D6AFC5005ED83C /* GPUImageFramebuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFramebuffer.m; path = Source/GPUImageFramebuffer.m; sourceTree = SOURCE_ROOT; }; + BCD8EB8A18D6AFC5005ED83C /* GPUImageFramebufferCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFramebufferCache.h; path = Source/GPUImageFramebufferCache.h; sourceTree = SOURCE_ROOT; }; + BCD8EB8B18D6AFC5005ED83C /* GPUImageFramebufferCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageFramebufferCache.m; path = Source/GPUImageFramebufferCache.m; sourceTree = SOURCE_ROOT; }; BCE2EF8217459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHarrisCornerDetectionFilter.h; path = Source/GPUImageHarrisCornerDetectionFilter.h; sourceTree = SOURCE_ROOT; }; BCE2EF8317459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHarrisCornerDetectionFilter.m; path = Source/GPUImageHarrisCornerDetectionFilter.m; sourceTree = SOURCE_ROOT; }; BCE2EF8417459D5B00C0628C /* GPUImageNobleCornerDetectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageNobleCornerDetectionFilter.h; path = Source/GPUImageNobleCornerDetectionFilter.h; sourceTree = SOURCE_ROOT; }; @@ -690,6 +698,10 @@ BCF40F1517247FD8005AE36A /* GLProgram.m */, BCF40F1017247D68005AE36A /* GPUImageContext.h */, BCF40F1117247D68005AE36A /* GPUImageContext.m */, + BCD8EB8818D6AFC5005ED83C /* GPUImageFramebuffer.h */, + BCD8EB8918D6AFC5005ED83C /* GPUImageFramebuffer.m */, + BCD8EB8A18D6AFC5005ED83C /* GPUImageFramebufferCache.h */, + BCD8EB8B18D6AFC5005ED83C /* GPUImageFramebufferCache.m */, BCF40F1817248286005AE36A /* Sources */, BCF40F1D17248308005AE36A /* Filters */, BCF40F2217248811005AE36A /* Outputs */, @@ -1209,7 +1221,9 @@ BCA20BC517471C4B0097C84A /* GPUImageMosaicFilter.h in Headers */, BCA20BC717471C4B0097C84A /* GPUImagePerlinNoiseFilter.h in Headers */, BC8A583218124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */, + BCD8EB8C18D6AFC5005ED83C /* GPUImageFramebuffer.h in Headers */, BCA20BC917471C4B0097C84A /* GPUImageVoronoiConsumerFilter.h in Headers */, + BCD8EB8E18D6AFC5005ED83C /* GPUImageFramebufferCache.h in Headers */, BC96A4F1176563C300F215A2 /* GPUImageNonMaximumSuppressionFilter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1425,6 +1439,8 @@ A87E5E13177648F3007FD5B1 /* GPUImageRawDataOutput.m in Sources */, A87E5E1717764B16007FD5B1 /* GPUImageRawDataInput.m in Sources */, BC8A583318124ABD00E6B507 /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */, + BCD8EB8D18D6AFC5005ED83C /* GPUImageFramebuffer.m in Sources */, + BCD8EB8F18D6AFC5005ED83C /* GPUImageFramebufferCache.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/framework/Source/GPUImageAverageColor.h b/framework/Source/GPUImageAverageColor.h index 263fd5a47..e3d957d02 100644 --- a/framework/Source/GPUImageAverageColor.h +++ b/framework/Source/GPUImageAverageColor.h @@ -7,9 +7,9 @@ extern NSString *const kGPUImageColorAveragingVertexShaderString; GLint texelWidthUniform, texelHeightUniform; NSUInteger numberOfStages; - NSMutableArray *stageTextures, *stageFramebuffers, *stageSizes; GLubyte *rawImagePixels; + CGSize finalStageSize; } // This block is called on the completion of color averaging for a frame diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index 279b51a40..e8d127573 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -88,10 +88,7 @@ - (id)init; texelWidthUniform = [filterProgram uniformIndex:@"texelWidth"]; texelHeightUniform = [filterProgram uniformIndex:@"texelHeight"]; - - stageTextures = [[NSMutableArray alloc] init]; - stageFramebuffers = [[NSMutableArray alloc] init]; - stageSizes = [[NSMutableArray alloc] init]; + finalStageSize = CGSizeMake(1.0, 1.0); __unsafe_unretained GPUImageAverageColor *weakSelf = self; [self setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { @@ -109,142 +106,9 @@ - (void)dealloc; } } -#pragma mark - -#pragma mark Manage the output texture - -- (void)initializeOutputTextureIfNeeded; -{ - if (inputTextureSize.width < 1.0) - { - return; - } - - // Create textures for each level - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - NSUInteger numberOfReductionsInX = floor(log(inputTextureSize.width) / log(4.0)); - NSUInteger numberOfReductionsInY = floor(log(inputTextureSize.height) / log(4.0)); -// NSLog(@"Reductions in X: %d, y: %d", numberOfReductionsInX, numberOfReductionsInY); - - NSUInteger reductionsToHitSideLimit = MIN(numberOfReductionsInX, numberOfReductionsInY); -// NSLog(@"Total reductions: %d", reductionsToHitSideLimit); - for (NSUInteger currentReduction = 0; currentReduction < reductionsToHitSideLimit; currentReduction++) - { -// CGSize currentStageSize = CGSizeMake(ceil(inputTextureSize.width / pow(4.0, currentReduction + 1.0)), ceil(inputTextureSize.height / pow(4.0, currentReduction + 1.0))); - CGSize currentStageSize = CGSizeMake(floor(inputTextureSize.width / pow(4.0, currentReduction + 1.0)), floor(inputTextureSize.height / pow(4.0, currentReduction + 1.0))); - if ( (currentStageSize.height < 2.0) || (currentStageSize.width < 2.0) ) - { - // A really small last stage seems to cause significant errors in the average, so I abort and leave the rest to the CPU at this point - break; -// currentStageSize.height = 2.0; // TODO: Rotate the image to account for this case, which causes FBO construction to fail - } - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - [stageSizes addObject:[NSValue valueWithCGSize:currentStageSize]]; -#else - [stageSizes addObject:[NSValue valueWithSize:NSSizeFromCGSize(currentStageSize)]]; -#endif - - GLuint textureForStage; - glGenTextures(1, &textureForStage); - glBindTexture(GL_TEXTURE_2D, textureForStage); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.outputTextureOptions.minFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.outputTextureOptions.magFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.outputTextureOptions.wrapS); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.outputTextureOptions.wrapT); - [stageTextures addObject:[NSNumber numberWithInt:textureForStage]]; - -// NSLog(@"At reduction: %d size in X: %f, size in Y:%f", currentReduction, currentStageSize.width, currentStageSize.height); - } - }); -} - -- (void)deleteOutputTexture; -{ - if ([stageTextures count] == 0) - { - return; - } - - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - NSUInteger numberOfStageTextures = [stageTextures count]; - for (NSUInteger currentStage = 0; currentStage < numberOfStageTextures; currentStage++) - { - GLuint currentTexture = [[stageTextures objectAtIndex:currentStage] intValue]; - glDeleteTextures(1, ¤tTexture); - } - - [stageTextures removeAllObjects]; - [stageSizes removeAllObjects]; - }); -} - #pragma mark - #pragma mark Managing the display FBOs -- (void)createFilterFBOofSize:(CGSize)currentFBOSize; -{ - // Create framebuffers for each level - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - glActiveTexture(GL_TEXTURE1); - - NSUInteger numberOfStageFramebuffers = [stageTextures count]; - for (NSUInteger currentStage = 0; currentStage < numberOfStageFramebuffers; currentStage++) - { - GLuint currentFramebuffer; - glGenFramebuffers(1, ¤tFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, currentFramebuffer); - [stageFramebuffers addObject:[NSNumber numberWithInt:currentFramebuffer]]; - - GLuint currentTexture = [[stageTextures objectAtIndex:currentStage] intValue]; - glBindTexture(GL_TEXTURE_2D, currentTexture); - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CGSize currentFramebufferSize = [[stageSizes objectAtIndex:currentStage] CGSizeValue]; -#else - NSSize currentFramebufferSize = [[stageSizes objectAtIndex:currentStage] sizeValue]; -#endif - -// NSLog(@"FBO stage size: %f, %f", currentFramebufferSize.width, currentFramebufferSize.height); - glTexImage2D(GL_TEXTURE_2D, - 0, - self.outputTextureOptions.internalFormat, - (int)currentFramebufferSize.width, - (int)currentFramebufferSize.height, - 0, - self.outputTextureOptions.format, - self.outputTextureOptions.type, - 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, currentTexture, 0); - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - } - }); - -// [self notifyTargetsAboutNewOutputTexture]; -} - -- (void)destroyFilterFBO; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - NSUInteger numberOfStageFramebuffers = [stageFramebuffers count]; - for (NSUInteger currentStage = 0; currentStage < numberOfStageFramebuffers; currentStage++) - { - GLuint currentFramebuffer = [[stageFramebuffers objectAtIndex:currentStage] intValue]; - glDeleteFramebuffers(1, ¤tFramebuffer); - } - - [stageFramebuffers removeAllObjects]; - }); -} - - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) @@ -253,6 +117,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } + outputFramebuffer = nil; [GPUImageContext setActiveShaderProgram:filterProgram]; glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); @@ -260,22 +125,26 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates GLuint currentTexture = [firstInputFramebuffer texture]; - NSUInteger numberOfStageFramebuffers = [stageFramebuffers count]; - for (NSUInteger currentStage = 0; currentStage < numberOfStageFramebuffers; currentStage++) + NSUInteger numberOfReductionsInX = floor(log(inputTextureSize.width) / log(4.0)); + NSUInteger numberOfReductionsInY = floor(log(inputTextureSize.height) / log(4.0)); + NSUInteger reductionsToHitSideLimit = MIN(numberOfReductionsInX, numberOfReductionsInY); + for (NSUInteger currentReduction = 0; currentReduction < reductionsToHitSideLimit; currentReduction++) { - GLuint currentFramebuffer = [[stageFramebuffers objectAtIndex:currentStage] intValue]; - glBindFramebuffer(GL_FRAMEBUFFER, currentFramebuffer); - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CGSize currentStageSize = [[stageSizes objectAtIndex:currentStage] CGSizeValue]; -#else - NSSize currentStageSize = [[stageSizes objectAtIndex:currentStage] sizeValue]; -#endif - glViewport(0, 0, (int)currentStageSize.width, (int)currentStageSize.height); + CGSize currentStageSize = CGSizeMake(floor(inputTextureSize.width / pow(4.0, currentReduction + 1.0)), floor(inputTextureSize.height / pow(4.0, currentReduction + 1.0))); + if ( (currentStageSize.height < 2.0) || (currentStageSize.width < 2.0) ) + { + // A really small last stage seems to cause significant errors in the average, so I abort and leave the rest to the CPU at this point + break; + // currentStageSize.height = 2.0; // TODO: Rotate the image to account for this case, which causes FBO construction to fail + } + + [outputFramebuffer unlock]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:currentStageSize textureOptions:self.outputTextureOptions onlyTexture:NO]; + [outputFramebuffer activateFramebuffer]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - + glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, currentTexture); @@ -286,43 +155,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - currentTexture = [[stageTextures objectAtIndex:currentStage] intValue]; - -// NSUInteger totalBytesForImage = (int)currentStageSize.width * (int)currentStageSize.height * 4; -// GLubyte *rawImagePixels2 = (GLubyte *)malloc(totalBytesForImage); -// glReadPixels(0, 0, (int)currentStageSize.width, (int)currentStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels2); -// CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels2, totalBytesForImage, NULL); -// CGColorSpaceRef defaultRGBColorSpace = CGColorSpaceCreateDeviceRGB(); -// -// CGFloat currentRedTotal = 0.0f, currentGreenTotal = 0.0f, currentBlueTotal = 0.0f, currentAlphaTotal = 0.0f; -// NSUInteger totalNumberOfPixels = totalBytesForImage / 4; -// -// for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) -// { -// currentRedTotal += (CGFloat)rawImagePixels2[(currentPixel * 4)] / 255.0f; -// currentGreenTotal += (CGFloat)rawImagePixels2[(currentPixel * 4) + 1] / 255.0f; -// currentBlueTotal += (CGFloat)rawImagePixels2[(currentPixel * 4 + 2)] / 255.0f; -// currentAlphaTotal += (CGFloat)rawImagePixels2[(currentPixel * 4) + 3] / 255.0f; -// } -// -// NSLog(@"Stage %d average image red: %f, green: %f, blue: %f, alpha: %f", currentStage, currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); -// -// -// CGImageRef cgImageFromBytes = CGImageCreate((int)currentStageSize.width, (int)currentStageSize.height, 8, 32, 4 * (int)currentStageSize.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); -// -// UIImage *imageToSave = [UIImage imageWithCGImage:cgImageFromBytes]; -// -// NSData *dataForPNGFile = UIImagePNGRepresentation(imageToSave); -// -// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -// NSString *documentsDirectory = [paths objectAtIndex:0]; -// -// NSString *imageName = [NSString stringWithFormat:@"AverageLevel%d.png", currentStage]; -// NSError *error = nil; -// if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:imageName] options:NSAtomicWrite error:&error]) -// { -// return; -// } + currentTexture = [outputFramebuffer texture]; + finalStageSize = currentStageSize; } [firstInputFramebuffer unlock]; @@ -339,11 +173,6 @@ - (void)extractAverageColorAtFrameTime:(CMTime)frameTime; NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture internal format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CGSize finalStageSize = [[stageSizes lastObject] CGSizeValue]; -#else - NSSize finalStageSize = [[stageSizes lastObject] sizeValue]; -#endif NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); if (rawImagePixels == NULL) diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index 180873d17..c90d020a9 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -38,70 +38,41 @@ - (void)dealloc - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - static const GLfloat imageVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - - [self notifyTargetsAboutNewOutputTexture]; - - // Let the downstream video elements see the previous frame from the buffer before rendering a new one into place - [self informTargetsAboutNewFrameAtTime:frameTime]; - - // Move the last frame to the back of the buffer, if needed - if (_bufferSize > 1) + if ([bufferedFramebuffers count] >= _bufferSize) { - NSNumber *lastFramebuffer = [bufferedFramebuffers objectAtIndex:0]; + outputFramebuffer = [bufferedFramebuffers objectAtIndex:0]; [bufferedFramebuffers removeObjectAtIndex:0]; - [bufferedFramebuffers addObject:lastFramebuffer]; } else { - // Make sure the previous rendering has finished before enqueuing the current frame when simply delaying by one frame - glFinish(); - } + // Nothing yet in the buffer, so don't process further until the buffer is full + outputFramebuffer = firstInputFramebuffer; + [firstInputFramebuffer lock]; + } - // Render the new frame to the back of the buffer - [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; -} + [bufferedFramebuffers addObject:firstInputFramebuffer]; -- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; -{ - if (self.preventRendering) + // Need to pass along rotation information, as we're just holding on to buffered framebuffers and not rotating them ourselves + for (id currentTarget in targets) { - [firstInputFramebuffer unlock]; - return; + if (currentTarget != self.targetToIgnoreForUpdates) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputRotation:inputRotation atIndex:textureIndex]; + } } - - [GPUImageContext setActiveShaderProgram:filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; - [outputFramebuffer activateFramebuffer]; - [bufferedFramebuffers addObject:outputFramebuffer]; - // TODO: Instead of redrawing these into textures, capture the incoming framebuffer and prevent it from returning to the pool - - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); - glClear(GL_COLOR_BUFFER_BIT); - - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); - - glUniform1i(filterInputTextureUniform, 2); - - glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); - glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - [firstInputFramebuffer unlock]; -} -#pragma mark - -#pragma mark Managing targets + // Let the downstream video elements see the previous frame from the buffer before rendering a new one into place + [self informTargetsAboutNewFrameAtTime:frameTime]; + +// [self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; +} -- (GPUImageFramebuffer *)framebufferForOutput; +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { - return [bufferedFramebuffers objectAtIndex:0]; + // No need to render to another texture anymore, since we'll be hanging on to the textures in our buffer } #pragma mark - diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 1a4630be8..3c0bae337 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -188,8 +188,6 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutput return NULL; } - NSLog(@"Trying to return from framebuffer: %@", [self framebufferForOutput]); - usingNextFrameForImageCapture = NO; dispatch_semaphore_signal(imageCaptureSemaphore); diff --git a/framework/Source/GPUImageFramebuffer.h b/framework/Source/GPUImageFramebuffer.h index c85313c44..4c7e79074 100644 --- a/framework/Source/GPUImageFramebuffer.h +++ b/framework/Source/GPUImageFramebuffer.h @@ -1,10 +1,18 @@ #import + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #import #import #import +#else +#import +#import +#endif + #import #import + typedef struct GPUTextureOptions { GLenum minFilter; GLenum magFilter; diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index 39f777898..bcaa5bf4d 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -287,9 +287,11 @@ - (CGImageRef)newCGImageFromFramebufferContents; GLubyte *rawImagePixels; - CGDataProviderRef dataProvider; + CGDataProviderRef dataProvider = NULL; if ([GPUImageContext supportsFastTextureUpload]) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + NSLog(@"Fast texture path"); NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)_size.height * 4; @@ -301,6 +303,8 @@ - (CGImageRef)newCGImageFromFramebufferContents; rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, paddedBytesForImage, dataProviderUnlockCallback); [[GPUImageContext sharedFramebufferCache] addFramebufferToActiveImageCaptureList:self]; // In case the framebuffer is swapped out on the filter, need to have a strong reference to it somewhere for it to hang on while the image is in existence +#else +#endif } else { @@ -316,7 +320,10 @@ - (CGImageRef)newCGImageFromFramebufferContents; if ([GPUImageContext supportsFastTextureUpload]) { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE cgImageFromBytes = CGImageCreate((int)_size.width, (int)_size.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); +#else +#endif } else { @@ -335,7 +342,10 @@ - (CGImageRef)newCGImageFromFramebufferContents; - (void)restoreRenderTarget; { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CFRelease(renderTarget); CVPixelBufferUnlockBaseAddress(renderTarget, 0); +#else +#endif } @end diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index 64fa193a2..78fbfe63a 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -118,11 +118,7 @@ - (id)init; texelWidthUniform = [filterProgram uniformIndex:@"texelWidth"]; texelHeightUniform = [filterProgram uniformIndex:@"texelHeight"]; - - stageTextures = [[NSMutableArray alloc] init]; - stageFramebuffers = [[NSMutableArray alloc] init]; - stageSizes = [[NSMutableArray alloc] init]; - + __unsafe_unretained GPUImageLuminosity *weakSelf = self; [self setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) { [weakSelf extractLuminosityAtFrameTime:frameTime]; @@ -173,6 +169,7 @@ - (void)initializeSecondaryAttributes; [secondFilterProgram addAttribute:@"inputTextureCoordinate"]; } +/* - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; { if (self.preventRendering) @@ -286,6 +283,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [firstInputFramebuffer unlock]; } + */ #pragma mark - #pragma mark Callbacks @@ -296,11 +294,6 @@ - (void)extractLuminosityAtFrameTime:(CMTime)frameTime; NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CGSize finalStageSize = [[stageSizes lastObject] CGSizeValue]; -#else - NSSize finalStageSize = [[stageSizes lastObject] sizeValue]; -#endif NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); if (rawImagePixels == NULL) diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 7f091221e..a08916d5a 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -315,19 +315,14 @@ - (CGImageRef)newCGImageByFilteringImage:(UIImage *)imageToFilter #else -- (CGImageRef)newCGImageFromCurrentlyProcessedOutput; +- (NSImage *)imageFromCurrentFramebuffer; { - return [self newCGImageFromCurrentlyProcessedOutput]; + return [self imageFromCurrentFramebufferWithOrientation:UIImageOrientationLeft]; } -- (NSImage *)imageFromCurrentlyProcessedOutput; +- (NSImage *)imageFromCurrentFramebufferWithOrientation:(UIImageOrientation)imageOrientation; { - return [self imageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationLeft]; -} - -- (NSImage *)imageFromCurrentlyProcessedOutputWithOrientation:(UIImageOrientation)imageOrientation; -{ - CGImageRef cgImageFromBytes = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:imageOrientation]; + CGImageRef cgImageFromBytes = [self newCGImageFromCurrentlyProcessedOutput]; NSImage *finalImage = [[NSImage alloc] initWithCGImage:cgImageFromBytes size:NSZeroSize]; CGImageRelease(cgImageFromBytes); diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index b6a86bf44..2e70b996c 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -771,7 +771,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVPixelBufferLockBaseAddress(cameraFrame, 0); int bytesPerRow = (int) CVPixelBufferGetBytesPerRow(cameraFrame); - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) onlyTexture:NO]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) onlyTexture:YES]; [outputFramebuffer activateFramebuffer]; glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); @@ -782,20 +782,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; // The use of bytesPerRow / 4 accounts for a display glitch present in preview video frames when using the photo preset on the camera glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); - for (id currentTarget in targets) - { - if ([currentTarget enabled]) - { - if (currentTarget != self.targetToIgnoreForUpdates) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; - } - } - } + [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; CVPixelBufferUnlockBaseAddress(cameraFrame, 0); diff --git a/framework/Source/Mac/GPUImageAVCamera.m b/framework/Source/Mac/GPUImageAVCamera.m index eed7a9148..b18aec66f 100644 --- a/framework/Source/Mac/GPUImageAVCamera.m +++ b/framework/Source/Mac/GPUImageAVCamera.m @@ -81,14 +81,12 @@ @interface GPUImageAVCamera () GLProgram *yuvConversionProgram; GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; - GLuint yuvConversionFramebuffer; int imageBufferWidth, imageBufferHeight; } - (void)updateOrientationSendToTargets; - (void)convertYUVToRGBOutput; -- (void)setYUVConversionFBO; @end @@ -155,7 +153,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDev _runBenchmark = NO; capturePaused = NO; outputRotation = kGPUImageNoRotation; - captureAsYUV = YES; +// captureAsYUV = YES; + captureAsYUV = NO; runSynchronouslyOnVideoProcessingQueue(^{ @@ -199,8 +198,6 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDev glEnableVertexAttribArray(yuvConversionPositionAttribute); glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); } - - [self initializeOutputTextureIfNeeded]; }); // Grab the back-facing or front-facing camera @@ -264,8 +261,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDev else { // Despite returning a longer list of supported pixel formats, only RGB, RGBA, BGRA, and the YUV 4:2:2 variants seem to return cleanly -// [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_422YpCbCr8_yuvs] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; +// [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_422YpCbCr8_yuvs] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; } [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; @@ -321,12 +318,6 @@ - (void)dealloc dispatch_release(frameRenderingSemaphore); } #endif - -// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) - if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) - { - [self destroyYUVConversionFBO]; - } } - (void)removeInputsAndOutputs; @@ -467,7 +458,7 @@ - (void)setFrameRate:(NSInteger)frameRate; for (AVCaptureConnection *connection in videoOutput.connections) { if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) - connection.videoMinFrameDuration = CMTimeMake(1, _frameRate); + connection.videoMinFrameDuration = CMTimeMake(1, (int32_t)_frameRate); } } @@ -502,6 +493,7 @@ - (AVCaptureConnection *)videoCaptureConnection { - (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth height:(int)bufferHeight time:(CMTime)currentTime; { + // First, update all the framebuffers in the targets for (id currentTarget in targets) { if ([currentTarget enabled]) @@ -517,20 +509,37 @@ - (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth hei if ([currentTarget wantsMonochromeInput] && captureAsYUV) { [currentTarget setCurrentlyReceivingMonochromeInput:YES]; - [currentTarget setInputTexture:luminanceTexture atIndex:textureIndexOfTarget]; + // TODO: Replace optimization for monochrome output + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; } else { [currentTarget setCurrentlyReceivingMonochromeInput:NO]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; } - - [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; } else { [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputTexture:outputTexture atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; + } + } + } + + // Then release our hold on the local framebuffer to send it back to the cache as soon as it's no longer needed + [outputFramebuffer unlock]; + + // Finally, trigger rendering as needed + for (id currentTarget in targets) + { + if ([currentTarget enabled]) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + if (currentTarget != self.targetToIgnoreForUpdates) + { + [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; } } } @@ -554,29 +563,33 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVPixelBufferLockBaseAddress(cameraFrame, 0); - glBindTexture(GL_TEXTURE_2D, outputTexture); + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) onlyTexture:YES]; + + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); // Using BGRA extension to pull in video frame data directly // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bytesPerRow / 3, bufferHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, CVPixelBufferGetBaseAddress(cameraFrame)); -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); - - for (id currentTarget in targets) - { - if ([currentTarget enabled]) - { - if (currentTarget != self.targetToIgnoreForUpdates) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; - } - } - } +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, CVPixelBufferGetBaseAddress(cameraFrame)); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); + + [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; + +// for (id currentTarget in targets) +// { +// if ([currentTarget enabled]) +// { +// if (currentTarget != self.targetToIgnoreForUpdates) +// { +// NSInteger indexOfObject = [targets indexOfObject:currentTarget]; +// NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; +// +// [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; +// [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; +// } +// } +// } CVPixelBufferUnlockBaseAddress(cameraFrame, 0); @@ -601,7 +614,9 @@ - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; - (void)convertYUVToRGBOutput; { [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - [self setYUVConversionFBO]; + + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight) textureOptions:self.outputTextureOptions onlyTexture:NO]; + [outputFramebuffer activateFramebuffer]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -634,54 +649,6 @@ - (void)convertYUVToRGBOutput; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -- (void)setYUVConversionFBO; -{ - if (!yuvConversionFramebuffer) - { - [self createYUVConversionFBO]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); - - glViewport(0, 0, imageBufferWidth, imageBufferHeight); -} - -- (void)createYUVConversionFBO; -{ - [self initializeOutputTextureIfNeeded]; - - glActiveTexture(GL_TEXTURE1); - glGenFramebuffers(1, &yuvConversionFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, yuvConversionFramebuffer); - - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageBufferWidth, imageBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - [self notifyTargetsAboutNewOutputTexture]; - - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - glBindTexture(GL_TEXTURE_2D, 0); - -} - -- (void)destroyYUVConversionFBO; -{ - if (yuvConversionFramebuffer) - { - glDeleteFramebuffers(1, &yuvConversionFramebuffer); - yuvConversionFramebuffer = 0; - } - - if (outputTexture) - { - glDeleteTextures(1, &outputTexture); - outputTexture = 0; - } -} - - #pragma mark - #pragma mark Benchmarking diff --git a/framework/Source/Mac/GPUImageContext.h b/framework/Source/Mac/GPUImageContext.h index 8d54ca22d..356b288aa 100755 --- a/framework/Source/Mac/GPUImageContext.h +++ b/framework/Source/Mac/GPUImageContext.h @@ -1,9 +1,9 @@ #import -#import -#import #import #import #import "GLProgram.h" +#import "GPUImageFramebuffer.h" +#import "GPUImageFramebufferCache.h" #define GPUImageRotationSwapsWidthAndHeight(rotation) (((rotation) == kGPUImageRotateLeft) || ((rotation) == kGPUImageRotateRight) || ((rotation) == kGPUImageRotateRightFlipVertical) ) @@ -14,10 +14,12 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k @property(readonly, nonatomic) dispatch_queue_t contextQueue; @property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram; @property(readonly, retain, nonatomic) NSOpenGLContext *context; +@property(readonly) GPUImageFramebufferCache *framebufferCache; + (void *)contextKey; + (GPUImageContext *)sharedImageProcessingContext; + (dispatch_queue_t)sharedContextQueue; ++ (GPUImageFramebufferCache *)sharedFramebufferCache; + (void)useImageProcessingContext; + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; @@ -37,12 +39,9 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k @end -@protocol GPUImageTextureDelegate; - @protocol GPUImageInput - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; - (NSInteger)nextAvailableTextureIndex; - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -50,12 +49,6 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k - (void)endProcessing; - (BOOL)shouldIgnoreUpdatesToThisTarget; - (BOOL)enabled; -- (void)conserveMemoryForNextFrame; - (BOOL)wantsMonochromeInput; - (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; @end - -@protocol GPUImageTextureDelegate -- (void)textureNoLongerNeededForTarget:(id)textureTarget; -@end - diff --git a/framework/Source/Mac/GPUImageContext.m b/framework/Source/Mac/GPUImageContext.m index 31fef7b2d..28523d3f8 100755 --- a/framework/Source/Mac/GPUImageContext.m +++ b/framework/Source/Mac/GPUImageContext.m @@ -14,6 +14,7 @@ @implementation GPUImageContext @synthesize context = _context; @synthesize currentShaderProgram = _currentShaderProgram; @synthesize contextQueue = _contextQueue; +@synthesize framebufferCache = _framebufferCache; static void *openGLESContextQueueKey; @@ -53,6 +54,11 @@ + (dispatch_queue_t)sharedContextQueue; return [[self sharedImageProcessingContext] contextQueue]; } ++ (GPUImageFramebufferCache *)sharedFramebufferCache; +{ + return [[self sharedImageProcessingContext] framebufferCache]; +} + + (void)useImageProcessingContext; { NSOpenGLContext *imageProcessingContext = [[GPUImageContext sharedImageProcessingContext] context]; @@ -230,4 +236,14 @@ - (NSOpenGLContext *)context; return _context; } +- (GPUImageFramebufferCache *)framebufferCache; +{ + if (_framebufferCache == nil) + { + _framebufferCache = [[GPUImageFramebufferCache alloc] init]; + } + + return _framebufferCache; +} + @end diff --git a/framework/Source/Mac/GPUImageMovieWriter.h b/framework/Source/Mac/GPUImageMovieWriter.h index f9edc87c6..530e5a61b 100755 --- a/framework/Source/Mac/GPUImageMovieWriter.h +++ b/framework/Source/Mac/GPUImageMovieWriter.h @@ -27,8 +27,6 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; CGSize videoSize; GPUImageRotationMode inputRotation; - - __unsafe_unretained id textureDelegate; } @property(readwrite, nonatomic) BOOL hasAudioTrack; diff --git a/framework/Source/Mac/GPUImageMovieWriter.m b/framework/Source/Mac/GPUImageMovieWriter.m index e27e32e21..90d311394 100755 --- a/framework/Source/Mac/GPUImageMovieWriter.m +++ b/framework/Source/Mac/GPUImageMovieWriter.m @@ -33,14 +33,14 @@ void main() @interface GPUImageMovieWriter () { + GPUImageFramebuffer *firstInputFramebuffer; + GLuint movieFramebuffer, movieRenderbuffer; GLProgram *colorSwizzlingProgram; GLint colorSwizzlingPositionAttribute, colorSwizzlingTextureCoordinateAttribute; GLint colorSwizzlingInputTextureUniform; - GLuint inputTextureForMovieRendering; - GLubyte *frameData; CMTime startTime, previousFrameTime; @@ -430,8 +430,8 @@ - (void)renderAtInternalSize; }; glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, inputTextureForMovieRendering); - glUniform1i(colorSwizzlingInputTextureUniform, 4); + glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); + glUniform1i(colorSwizzlingInputTextureUniform, 4); glVertexAttribPointer(colorSwizzlingPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); glVertexAttribPointer(colorSwizzlingTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); @@ -439,6 +439,7 @@ - (void)renderAtInternalSize; glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glFinish(); + [firstInputFramebuffer unlock]; } #pragma mark - @@ -448,6 +449,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { if (!isRecording) { + [firstInputFramebuffer unlock]; return; } @@ -455,6 +457,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) || (CMTIME_IS_INDEFINITE(frameTime)) ) { + [firstInputFramebuffer unlock]; return; } @@ -471,6 +474,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; if (!assetWriterVideoInput.readyForMoreMediaData) { + [firstInputFramebuffer unlock]; NSLog(@"Had to drop a video frame"); return; } @@ -518,9 +522,10 @@ - (NSInteger)nextAvailableTextureIndex; return 0; } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { - inputTextureForMovieRendering = newInputTexture; + firstInputFramebuffer = newInputFramebuffer; + [firstInputFramebuffer lock]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -557,11 +562,6 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - textureDelegate = newTextureDelegate; -} - - (void)conserveMemoryForNextFrame; { diff --git a/framework/Source/Mac/GPUImagePicture.h b/framework/Source/Mac/GPUImagePicture.h index fa2584622..659705350 100755 --- a/framework/Source/Mac/GPUImagePicture.h +++ b/framework/Source/Mac/GPUImagePicture.h @@ -18,6 +18,8 @@ // Image rendering - (void)processImage; +- (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; +- (void)processImageUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSImage *processedImage))block; - (CGSize)outputImageSize; @end diff --git a/framework/Source/Mac/GPUImagePicture.m b/framework/Source/Mac/GPUImagePicture.m index 64ed22c36..1ef37bf82 100755 --- a/framework/Source/Mac/GPUImagePicture.m +++ b/framework/Source/Mac/GPUImagePicture.m @@ -67,10 +67,14 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot // TODO: Dispatch this whole thing asynchronously to move image loading off main thread CGFloat widthOfImage = CGImageGetWidth(newImageSource); CGFloat heightOfImage = CGImageGetHeight(newImageSource); + + // If passed an empty image reference, CGContextDrawImage will fail in future versions of the SDK. + NSAssert( widthOfImage > 0 && heightOfImage > 0, @"Passed image must not be empty - it should be at least 1px tall and wide"); + pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); CGSize pixelSizeToUseForTexture = pixelSizeOfImage; - BOOL shouldRedrawUsingCoreGraphics = YES; + BOOL shouldRedrawUsingCoreGraphics = NO; // For now, deal with images larger than the maximum texture size by resizing to be within that limit CGSize scaledImageSizeToFitOnGPU = [GPUImageContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; @@ -94,12 +98,52 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot GLubyte *imageData = NULL; CFDataRef dataFromImageDataProvider; + GLenum format = GL_BGRA; + + if (!shouldRedrawUsingCoreGraphics) { + /* Check that the memory layout is compatible with GL, as we cannot use glPixelStore to + * tell GL about the memory layout with GLES. + */ + if (CGImageGetBytesPerRow(newImageSource) != CGImageGetWidth(newImageSource) * 4 || + CGImageGetBitsPerPixel(newImageSource) != 32 || + CGImageGetBitsPerComponent(newImageSource) != 8) + { + shouldRedrawUsingCoreGraphics = YES; + } else { + /* Check that the bitmap pixel format is compatible with GL */ + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(newImageSource); + if ((bitmapInfo & kCGBitmapFloatComponents) != 0) { + /* We don't support float components for use directly in GL */ + shouldRedrawUsingCoreGraphics = YES; + } else { + CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; + if (byteOrderInfo == kCGBitmapByteOrder32Little) { + /* Little endian, for alpha-first we can use this bitmap directly in GL */ + CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; + if (alphaInfo != kCGImageAlphaPremultipliedFirst && alphaInfo != kCGImageAlphaFirst && + alphaInfo != kCGImageAlphaNoneSkipFirst) { + shouldRedrawUsingCoreGraphics = YES; + } + } else if (byteOrderInfo == kCGBitmapByteOrderDefault || byteOrderInfo == kCGBitmapByteOrder32Big) { + /* Big endian, for alpha-last we can use this bitmap directly in GL */ + CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; + if (alphaInfo != kCGImageAlphaPremultipliedLast && alphaInfo != kCGImageAlphaLast && + alphaInfo != kCGImageAlphaNoneSkipLast) { + shouldRedrawUsingCoreGraphics = YES; + } else { + /* Can access directly using GL_RGBA pixel format */ + format = GL_RGBA; + } + } + } + } + } // CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); if (shouldRedrawUsingCoreGraphics) { - // For resized image, redraw + // For resized or incompatible image: redraw imageData = (GLubyte *) calloc(1, (int)pixelSizeToUseForTexture.width * (int)pixelSizeToUseForTexture.height * 4); CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); @@ -136,19 +180,22 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - [self initializeOutputTextureIfNeeded]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:pixelSizeToUseForTexture onlyTexture:YES]; + [outputFramebuffer disableReferenceCounting]; - glBindTexture(GL_TEXTURE_2D, outputTexture); + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); if (self.shouldSmoothlyScaleOutput) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); + // no need to use self.outputTextureOptions here since pictures need this texture formats and type + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, format, GL_UNSIGNED_BYTE, imageData); if (self.shouldSmoothlyScaleOutput) { glGenerateMipmap(GL_TEXTURE_2D); } + glBindTexture(GL_TEXTURE_2D, 0); }); if (shouldRedrawUsingCoreGraphics) @@ -167,6 +214,9 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot #if ( (MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8) || (!defined(__MAC_10_8)) ) - (void)dealloc; { + [outputFramebuffer enableReferenceCounting]; + [outputFramebuffer unlock]; + if (imageUpdateSemaphore != NULL) { dispatch_release(imageUpdateSemaphore); @@ -177,26 +227,6 @@ - (void)dealloc; #pragma mark - #pragma mark Image rendering -- (void)initializeOutputTextureIfNeeded; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - if (!outputTexture) - { - [GPUImageContext useImageProcessingContext]; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &outputTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); - } - }); -} - - (void)removeAllTargets; { [super removeAllTargets]; @@ -204,6 +234,11 @@ - (void)removeAllTargets; } - (void)processImage; +{ + [self processImageWithCompletionHandler:nil]; +} + +- (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; { hasProcessedImage = YES; @@ -211,28 +246,38 @@ - (void)processImage; if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) { - NSLog(@"Bailing on the image upload semaphore"); - return; + return NO; } runAsynchronouslyOnVideoProcessingQueue(^{ - -// if (MAX(pixelSizeOfImage.width, pixelSizeOfImage.height) > 1000.0) -// { -// [self conserveMemoryForNextFrame]; -// } - for (id currentTarget in targets) { NSInteger indexOfObject = [targets indexOfObject:currentTarget]; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + [currentTarget setCurrentlyReceivingMonochromeInput:NO]; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; } dispatch_semaphore_signal(imageUpdateSemaphore); + + if (completion != nil) { + completion(); + } }); + + return YES; +} + +- (void)processImageUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSImage *processedImage))block; +{ + [finalFilterInChain useNextFrameForImageCapture]; + [self processImageWithCompletionHandler:^{ + NSImage *imageFromFilter = [finalFilterInChain imageFromCurrentFramebuffer]; + block(imageFromFilter); + }]; } - (CGSize)outputImageSize; diff --git a/framework/Source/Mac/GPUImageView.h b/framework/Source/Mac/GPUImageView.h index 8852f31be..029883a10 100755 --- a/framework/Source/Mac/GPUImageView.h +++ b/framework/Source/Mac/GPUImageView.h @@ -13,7 +13,6 @@ typedef enum { @interface GPUImageView : NSOpenGLView { GPUImageRotationMode inputRotation; - __unsafe_unretained id textureDelegate; } /** The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio diff --git a/framework/Source/Mac/GPUImageView.m b/framework/Source/Mac/GPUImageView.m index f48d231eb..2a3b4eac6 100755 --- a/framework/Source/Mac/GPUImageView.m +++ b/framework/Source/Mac/GPUImageView.m @@ -9,8 +9,8 @@ @interface GPUImageView () { - GLuint inputTextureForDisplay; - + GPUImageFramebuffer *inputFramebufferForDisplay; + GLProgram *displayProgram; GLint displayPositionAttribute, displayTextureCoordinateAttribute; GLint displayInputTextureUniform; @@ -301,6 +301,13 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM 0.0f, 1.0f, }; + static const GLfloat rotateRightHorizontalFlipTextureCoordinates[] = { + 1.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 0.0f, 0.0f, + }; + static const GLfloat rotate180TextureCoordinates[] = { 1.0f, 0.0f, 0.0f, 0.0f, @@ -316,6 +323,7 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; + case kGPUImageRotateRightFlipHorizontal: return rotateRightHorizontalFlipTextureCoordinates; case kGPUImageRotate180: return rotate180TextureCoordinates; } } @@ -341,7 +349,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, inputTextureForDisplay); + glBindTexture(GL_TEXTURE_2D, [inputFramebufferForDisplay texture]); glUniform1i(displayInputTextureUniform, 4); glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); @@ -353,6 +361,9 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; [self presentFramebuffer]; glBindTexture(GL_TEXTURE_2D, 0); [self unlockFocus]; + + [inputFramebufferForDisplay unlock]; + inputFramebufferForDisplay = nil; }); } @@ -361,9 +372,10 @@ - (NSInteger)nextAvailableTextureIndex; return 0; } -- (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex; +- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { - inputTextureForDisplay = newInputTexture; + inputFramebufferForDisplay = newInputFramebuffer; + [inputFramebufferForDisplay lock]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; @@ -414,11 +426,6 @@ - (BOOL)shouldIgnoreUpdatesToThisTarget; return NO; } -- (void)setTextureDelegate:(id)newTextureDelegate atIndex:(NSInteger)textureIndex; -{ - textureDelegate = newTextureDelegate; -} - - (void)conserveMemoryForNextFrame; { From 137d59b7f4b6885daa718c8450d03c923444a77c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 17 Mar 2014 20:13:35 -0500 Subject: [PATCH 509/695] Refined cache purging, protected against threading issues, and made the camera rotate itself internally. --- README.md | 5 +- .../iOS/CubeExample/Classes/ES2Renderer.m | 1 + .../ShowcaseFilterViewController.m | 1 - .../project.pbxproj | 4 + .../SimplePhotoFilter/PhotoViewController.h | 2 + .../SimplePhotoFilter/PhotoViewController.m | 11 +- framework/Source/GPUImageAverageColor.m | 68 +++++---- framework/Source/GPUImageFilter.m | 9 ++ framework/Source/GPUImageFramebuffer.h | 1 + framework/Source/GPUImageFramebuffer.m | 80 ++++++---- framework/Source/GPUImageFramebufferCache.m | 139 +++++++++++------- framework/Source/GPUImageLuminosity.m | 60 ++++---- framework/Source/GPUImageOutput.h | 1 + framework/Source/GPUImageOutput.m | 5 + .../Source/GPUImageSolidColorGenerator.m | 25 +++- framework/Source/GPUImageStillCamera.m | 2 +- framework/Source/GPUImageTextureInput.m | 5 +- framework/Source/GPUImageTextureOutput.h | 2 + framework/Source/GPUImageTextureOutput.m | 7 + framework/Source/GPUImageTwoPassFilter.m | 8 + framework/Source/GPUImageVideoCamera.h | 2 +- framework/Source/GPUImageVideoCamera.m | 134 ++++++++++++----- 22 files changed, 389 insertions(+), 183 deletions(-) diff --git a/README.md b/README.md index 7841384d3..9c2ba230e 100755 --- a/README.md +++ b/README.md @@ -588,9 +588,12 @@ There are a couple of ways to process a still image and create a result. The fir GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; [stillImageSource addTarget:stillImageFilter]; + [stillImageFilter useNextFrameForImageCapture] [stillImageSource processImage]; - UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentlyProcessedOutput]; + UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; + +Note that for a manual capture of an image from a filter, you need to set -useNextFrameForImageCapture in order to tell the filter that you'll be needing to capture from it later. By default, GPUImage reuses framebuffers within filters to conserve memory, so if you need to hold on to a filter's framebuffer for manual image capture, you need to let it know ahead of time. For single filters that you wish to apply to an image, you can simply do the following: diff --git a/examples/iOS/CubeExample/Classes/ES2Renderer.m b/examples/iOS/CubeExample/Classes/ES2Renderer.m index af7e52fa0..b237ec26f 100755 --- a/examples/iOS/CubeExample/Classes/ES2Renderer.m +++ b/examples/iOS/CubeExample/Classes/ES2Renderer.m @@ -484,6 +484,7 @@ - (void)newFrameReadyFromTextureOutput:(GPUImageTextureOutput *)callbackTextureO textureForCubeFace = callbackTextureOutput.texture; [self renderByRotatingAroundX:0.0 rotatingAroundY:0.0]; + [callbackTextureOutput doneWithTexture]; }); } diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index 93edb63c0..cbbf4c1f7 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1422,7 +1422,6 @@ - (void)setupFilter; } else if (filterType == GPUIMAGE_BUFFER) { - GPUImageDifferenceBlendFilter *blendFilter = [[GPUImageDifferenceBlendFilter alloc] init]; [videoCamera removeTarget:filter]; diff --git a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj index 102dfbf4b..cb3a85ffa 100755 --- a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ BCC1E6CD1523E3C50006EFA5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6C91523E3C50006EFA5 /* QuartzCore.framework */; }; BCC1E6D01523E4780006EFA5 /* PhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E6CF1523E4780006EFA5 /* PhotoViewController.m */; }; BCC1E6DA1523E9DC0006EFA5 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E6D91523E9DB0006EFA5 /* AVFoundation.framework */; }; + BCC9004B18D7D4F100A5A5C7 /* Lambeau.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCC9004A18D7D4F100A5A5C7 /* Lambeau.jpg */; }; BCF867371725A72000912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867321725A70500912E34 /* libGPUImage.a */; }; E5066F561855AA1A008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F551855AA1A008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ @@ -78,6 +79,7 @@ BCC1E6CE1523E4780006EFA5 /* PhotoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoViewController.h; sourceTree = ""; }; BCC1E6CF1523E4780006EFA5 /* PhotoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoViewController.m; sourceTree = ""; }; BCC1E6D91523E9DB0006EFA5 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + BCC9004A18D7D4F100A5A5C7 /* Lambeau.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = Lambeau.jpg; path = ../../SimpleImageFilter/SimpleImageFilter/Lambeau.jpg; sourceTree = ""; }; E5066F551855AA1A008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -152,6 +154,7 @@ BCC1E6A71523E3620006EFA5 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCC9004A18D7D4F100A5A5C7 /* Lambeau.jpg */, BCB3C42816BCA81D003D26B0 /* Icon-72.png */, BCB3C42916BCA81D003D26B0 /* Icon-72@2x.png */, BCB3C42A16BCA81D003D26B0 /* Icon.png */, @@ -251,6 +254,7 @@ buildActionMask = 2147483647; files = ( BCC1E6AB1523E3620006EFA5 /* InfoPlist.strings in Resources */, + BCC9004B18D7D4F100A5A5C7 /* Lambeau.jpg in Resources */, BCB3C42D16BCA81D003D26B0 /* Icon-72.png in Resources */, BCB3C42E16BCA81D003D26B0 /* Icon-72@2x.png in Resources */, BCB3C42F16BCA81D003D26B0 /* Icon.png in Resources */, diff --git a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h index 126f248e1..73018efd5 100755 --- a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h +++ b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.h @@ -7,6 +7,8 @@ GPUImageOutput *filter, *secondFilter, *terminalFilter; UISlider *filterSettingsSlider; UIButton *photoCaptureButton; + + GPUImagePicture *memoryPressurePicture1, *memoryPressurePicture2; } - (IBAction)updateSliderValue:(id)sender; diff --git a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m index 353589e8d..3435123e5 100755 --- a/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m +++ b/examples/iOS/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m @@ -69,7 +69,9 @@ - (void)viewDidLoad // [terminalFilter prepareForImageCapture]; [stillCamera addTarget:filter]; + GPUImageView *filterView = (GPUImageView *)self.view; +// [filter addTarget:filterView]; [filter addTarget:filterView]; // [terminalFilter addTarget:filterView]; @@ -78,6 +80,11 @@ - (void)viewDidLoad // [stillCamera.inputCamera unlockForConfiguration]; [stillCamera startCameraCapture]; + +// UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; +// memoryPressurePicture1 = [[GPUImagePicture alloc] initWithImage:inputImage]; +// +// memoryPressurePicture2 = [[GPUImagePicture alloc] initWithImage:inputImage]; } - (void)viewDidUnload @@ -101,16 +108,13 @@ - (IBAction)takePhoto:(id)sender; { [photoCaptureButton setEnabled:NO]; -// [stillCamera capturePhotoAsJPEGProcessedUpToFilter:terminalFilter withCompletionHandler:^(NSData *processedJPEG, NSError *error){ [stillCamera capturePhotoAsJPEGProcessedUpToFilter:filter withCompletionHandler:^(NSData *processedJPEG, NSError *error){ // Save to assets library ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; -// report_memory(@"After asset library creation"); [library writeImageDataToSavedPhotosAlbum:processedJPEG metadata:stillCamera.currentCaptureMetadata completionBlock:^(NSURL *assetURL, NSError *error2) { -// report_memory(@"After writing to library"); if (error2) { NSLog(@"ERROR: the image failed to be written"); } @@ -119,7 +123,6 @@ - (IBAction)takePhoto:(id)sender; } runOnMainQueueWithoutDeadlocking(^{ -// report_memory(@"Operation completed"); [photoCaptureButton setEnabled:YES]; }); }]; diff --git a/framework/Source/GPUImageAverageColor.m b/framework/Source/GPUImageAverageColor.m index e8d127573..a768ecb3a 100644 --- a/framework/Source/GPUImageAverageColor.m +++ b/framework/Source/GPUImageAverageColor.m @@ -169,38 +169,42 @@ - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteg - (void)extractAverageColorAtFrameTime:(CMTime)frameTime; { - // we need a normal color texture for averaging the color values - NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture internal format for this filter must be GL_RGBA."); - NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); - - NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); - - if (rawImagePixels == NULL) - { - rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); - } - - glReadPixels(0, 0, (int)finalStageSize.width, (int)finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); - - NSUInteger redTotal = 0, greenTotal = 0, blueTotal = 0, alphaTotal = 0; - NSUInteger byteIndex = 0; - for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) - { - redTotal += rawImagePixels[byteIndex++]; - greenTotal += rawImagePixels[byteIndex++]; - blueTotal += rawImagePixels[byteIndex++]; - alphaTotal += rawImagePixels[byteIndex++]; - } - - CGFloat normalizedRedTotal = (CGFloat)redTotal / (CGFloat)totalNumberOfPixels / 255.0; - CGFloat normalizedGreenTotal = (CGFloat)greenTotal / (CGFloat)totalNumberOfPixels / 255.0; - CGFloat normalizedBlueTotal = (CGFloat)blueTotal / (CGFloat)totalNumberOfPixels / 255.0; - CGFloat normalizedAlphaTotal = (CGFloat)alphaTotal / (CGFloat)totalNumberOfPixels / 255.0; - - if (_colorAverageProcessingFinishedBlock != NULL) - { - _colorAverageProcessingFinishedBlock(normalizedRedTotal, normalizedGreenTotal, normalizedBlueTotal, normalizedAlphaTotal, frameTime); - } + runSynchronouslyOnVideoProcessingQueue(^{ + // we need a normal color texture for averaging the color values + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture internal format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); + + NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); + + if (rawImagePixels == NULL) + { + rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); + } + + [GPUImageContext useImageProcessingContext]; + [outputFramebuffer activateFramebuffer]; + glReadPixels(0, 0, (int)finalStageSize.width, (int)finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + + NSUInteger redTotal = 0, greenTotal = 0, blueTotal = 0, alphaTotal = 0; + NSUInteger byteIndex = 0; + for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) + { + redTotal += rawImagePixels[byteIndex++]; + greenTotal += rawImagePixels[byteIndex++]; + blueTotal += rawImagePixels[byteIndex++]; + alphaTotal += rawImagePixels[byteIndex++]; + } + + CGFloat normalizedRedTotal = (CGFloat)redTotal / (CGFloat)totalNumberOfPixels / 255.0; + CGFloat normalizedGreenTotal = (CGFloat)greenTotal / (CGFloat)totalNumberOfPixels / 255.0; + CGFloat normalizedBlueTotal = (CGFloat)blueTotal / (CGFloat)totalNumberOfPixels / 255.0; + CGFloat normalizedAlphaTotal = (CGFloat)alphaTotal / (CGFloat)totalNumberOfPixels / 255.0; + + if (_colorAverageProcessingFinishedBlock != NULL) + { + _colorAverageProcessingFinishedBlock(normalizedRedTotal, normalizedGreenTotal, normalizedBlueTotal, normalizedAlphaTotal, frameTime); + } + }); } @end diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 3c0bae337..a27b161f0 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -362,6 +362,15 @@ - (void)informTargetsAboutNewFrameAtTime:(CMTime)frameTime; // Release our hold so it can return to the cache immediately upon processing [[self framebufferForOutput] unlock]; + if (usingNextFrameForImageCapture) + { +// usingNextFrameForImageCapture = NO; + } + else + { + [self removeOutputFramebuffer]; + } + // Trigger processing last, so that our unlock comes first in serial execution, avoiding the need for a callback for (id currentTarget in targets) { diff --git a/framework/Source/GPUImageFramebuffer.h b/framework/Source/GPUImageFramebuffer.h index 4c7e79074..4f3d953a5 100644 --- a/framework/Source/GPUImageFramebuffer.h +++ b/framework/Source/GPUImageFramebuffer.h @@ -33,6 +33,7 @@ typedef struct GPUTextureOptions { // Initialization and teardown - (id)initWithSize:(CGSize)framebufferSize; - (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fboTextureOptions onlyTexture:(BOOL)onlyGenerateTexture; +- (id)initWithSize:(CGSize)framebufferSize overriddenTexture:(GLuint)inputTexture; // Usage - (void)activateFramebuffer; diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index bcaa5bf4d..6cd5532f3 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -45,13 +45,12 @@ - (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fbo referenceCountingDisabled = NO; _missingFramebuffer = onlyGenerateTexture; - NSLog(@"Creating framebuffer: %@ at size %f, %f", self, _size.width, _size.height); - if (_missingFramebuffer) { runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; [self generateTexture]; + framebuffer = 0; }); } else @@ -61,6 +60,32 @@ - (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fbo return self; } +- (id)initWithSize:(CGSize)framebufferSize overriddenTexture:(GLuint)inputTexture; +{ + if (!(self = [super init])) + { + return nil; + } + + GPUTextureOptions defaultTextureOptions; + defaultTextureOptions.minFilter = GL_LINEAR; + defaultTextureOptions.magFilter = GL_LINEAR; + defaultTextureOptions.wrapS = GL_CLAMP_TO_EDGE; + defaultTextureOptions.wrapT = GL_CLAMP_TO_EDGE; + defaultTextureOptions.internalFormat = GL_RGBA; + defaultTextureOptions.format = GL_BGRA; + defaultTextureOptions.type = GL_UNSIGNED_BYTE; + + _textureOptions = defaultTextureOptions; + _size = framebufferSize; + framebufferReferenceCount = 0; + referenceCountingDisabled = YES; + + _texture = inputTexture; + + return self; +} + - (id)initWithSize:(CGSize)framebufferSize; { GPUTextureOptions defaultTextureOptions; @@ -82,8 +107,6 @@ - (id)initWithSize:(CGSize)framebufferSize; - (void)dealloc { - NSLog(@"Destroying framebuffer: %@ at size %f, %f", self, _size.width, _size.height); - [self destroyFramebuffer]; } @@ -108,9 +131,7 @@ - (void)generateFramebuffer; { runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - - [self generateTexture]; - + glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); @@ -162,6 +183,8 @@ - (void)generateFramebuffer; } else { + [self generateTexture]; + glBindTexture(GL_TEXTURE_2D, _texture); glTexImage2D(GL_TEXTURE_2D, 0, _textureOptions.internalFormat, (int)_size.width, (int)_size.height, 0, _textureOptions.format, _textureOptions.type, 0); @@ -180,23 +203,34 @@ - (void)destroyFramebuffer; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - glDeleteFramebuffers(1, &framebuffer); - framebuffer = 0; - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - if (renderTarget) + if (framebuffer) { - CFRelease(renderTarget); - renderTarget = NULL; + glDeleteFramebuffers(1, &framebuffer); + framebuffer = 0; } + - if (renderTexture) + if ([GPUImageContext supportsFastTextureUpload] && (!_missingFramebuffer)) { - CFRelease(renderTexture); - renderTexture = NULL; - } - +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + if (renderTarget) + { + CFRelease(renderTarget); + renderTarget = NULL; + } + + if (renderTexture) + { + CFRelease(renderTexture); + renderTexture = NULL; + } #endif + } + else + { + glDeleteTextures(1, &_texture); + } + }); } @@ -229,7 +263,7 @@ - (void)unlock; return; } - NSAssert(framebufferReferenceCount > 0, @"Tried to overrelease a framebuffer"); + NSAssert(framebufferReferenceCount > 0, @"Tried to overrelease a framebuffer, did you forget to call -useNextFrameForImageCapture before using -imageFromCurrentFramebuffer?"); framebufferReferenceCount--; if (framebufferReferenceCount < 1) { @@ -258,7 +292,6 @@ - (void)enableReferenceCounting; void dataProviderReleaseCallback (void *info, const void *data, size_t size) { free((void *)data); - NSLog(@"Free callback"); } void dataProviderUnlockCallback (void *info, const void *data, size_t size) @@ -268,7 +301,6 @@ void dataProviderUnlockCallback (void *info, const void *data, size_t size) [framebuffer restoreRenderTarget]; [framebuffer unlock]; [[GPUImageContext sharedFramebufferCache] removeFramebufferFromActiveImageCaptureList:framebuffer]; - NSLog(@"Unlock callback"); } - (CGImageRef)newCGImageFromFramebufferContents; @@ -291,8 +323,6 @@ - (CGImageRef)newCGImageFromFramebufferContents; if ([GPUImageContext supportsFastTextureUpload]) { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - - NSLog(@"Fast texture path"); NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)_size.height * 4; @@ -308,7 +338,6 @@ - (CGImageRef)newCGImageFromFramebufferContents; } else { - NSLog(@"Normal path"); [self activateFramebuffer]; rawImagePixels = (GLubyte *)malloc(totalBytesForImage); glReadPixels(0, 0, (int)_size.width, (int)_size.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); @@ -337,7 +366,6 @@ - (CGImageRef)newCGImageFromFramebufferContents; }); return cgImageFromBytes; - } - (void)restoreRenderTarget; diff --git a/framework/Source/GPUImageFramebufferCache.m b/framework/Source/GPUImageFramebufferCache.m index 9592f1311..c403f8fc3 100644 --- a/framework/Source/GPUImageFramebufferCache.m +++ b/framework/Source/GPUImageFramebufferCache.m @@ -1,10 +1,21 @@ #import "GPUImageFramebufferCache.h" +#import "GPUImageContext.h" +#import "GPUImageOutput.h" + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#import +#else +#endif @interface GPUImageFramebufferCache() { - NSCache *framebufferCache; +// NSCache *framebufferCache; + NSMutableDictionary *framebufferCache; NSMutableDictionary *framebufferTypeCounts; NSMutableArray *activeImageCaptureList; // Where framebuffers that may be lost by a filter, but which are still needed for a UIImage, etc., are stored + id memoryWarningObserver; + + dispatch_queue_t framebufferCacheQueue; } - (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture; @@ -24,9 +35,19 @@ - (id)init; return nil; } - framebufferCache = [[NSCache alloc] init]; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + memoryWarningObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:nil usingBlock:^(NSNotification *note) { + + [self purgeAllUnassignedFramebuffers]; + }]; +#else +#endif + +// framebufferCache = [[NSCache alloc] init]; + framebufferCache = [[NSMutableDictionary alloc] init]; framebufferTypeCounts = [[NSMutableDictionary alloc] init]; activeImageCaptureList = [[NSMutableArray alloc] init]; + framebufferCacheQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.framebufferCacheQueue", NULL); return self; } @@ -48,45 +69,45 @@ - (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)texture - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture; { - NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; - NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; - NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; - GPUImageFramebuffer *framebufferFromCache = nil; - - if ([numberOfMatchingTexturesInCache integerValue] < 1) - { - NSLog(@"Nothing found for hash: %@", lookupHash); - // Nothing in the cache, create a new framebuffer to use - framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; - } - else - { - // Something found, pull the old framebuffer and decrement the count - NSInteger currentTextureID = (numberOfMatchingTextures - 1); - while ((framebufferFromCache == nil) && (currentTextureID >= 0)) - { - NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)currentTextureID]; - framebufferFromCache = [framebufferCache objectForKey:textureHash]; - // Test the values in the cache first, to see if they got invalidated behind our back - if (framebufferFromCache != nil) - { - // Withdraw this from the cache while it's in use - [framebufferCache removeObjectForKey:textureHash]; - } - currentTextureID--; - } - - currentTextureID++; - - [framebufferTypeCounts setObject:[NSNumber numberWithInteger:currentTextureID] forKey:lookupHash]; + __block GPUImageFramebuffer *framebufferFromCache = nil; +// dispatch_sync(framebufferCacheQueue, ^{ + runSynchronouslyOnVideoProcessingQueue(^{ + NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; + NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; + NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; - if (framebufferFromCache == nil) + if ([numberOfMatchingTexturesInCache integerValue] < 1) { - NSLog(@"Cached textures were nil for hash: %@", lookupHash); - + // Nothing in the cache, create a new framebuffer to use framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; } - } + else + { + // Something found, pull the old framebuffer and decrement the count + NSInteger currentTextureID = (numberOfMatchingTextures - 1); + while ((framebufferFromCache == nil) && (currentTextureID >= 0)) + { + NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)currentTextureID]; + framebufferFromCache = [framebufferCache objectForKey:textureHash]; + // Test the values in the cache first, to see if they got invalidated behind our back + if (framebufferFromCache != nil) + { + // Withdraw this from the cache while it's in use + [framebufferCache removeObjectForKey:textureHash]; + } + currentTextureID--; + } + + currentTextureID++; + + [framebufferTypeCounts setObject:[NSNumber numberWithInteger:currentTextureID] forKey:lookupHash]; + + if (framebufferFromCache == nil) + { + framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; + } + } + }); [framebufferFromCache lock]; return framebufferFromCache; @@ -110,33 +131,47 @@ - (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; { [framebuffer clearAllLocks]; - CGSize framebufferSize = framebuffer.size; - GPUTextureOptions framebufferTextureOptions = framebuffer.textureOptions; - NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:framebufferTextureOptions onlyTexture:framebuffer.missingFramebuffer]; - NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; - NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; - - NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)numberOfMatchingTextures]; - - [framebufferCache setObject:framebuffer forKey:textureHash cost:round(framebufferSize.width * framebufferSize.height * 4.0)]; -// [framebufferCache setObject:framebuffer forKey:textureHash]; - [framebufferTypeCounts setObject:[NSNumber numberWithInteger:(numberOfMatchingTextures + 1)] forKey:lookupHash]; +// dispatch_async(framebufferCacheQueue, ^{ + runAsynchronouslyOnVideoProcessingQueue(^{ + CGSize framebufferSize = framebuffer.size; + GPUTextureOptions framebufferTextureOptions = framebuffer.textureOptions; + NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:framebufferTextureOptions onlyTexture:framebuffer.missingFramebuffer]; + NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; + NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; + + NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)numberOfMatchingTextures]; + +// [framebufferCache setObject:framebuffer forKey:textureHash cost:round(framebufferSize.width * framebufferSize.height * 4.0)]; + [framebufferCache setObject:framebuffer forKey:textureHash]; + [framebufferTypeCounts setObject:[NSNumber numberWithInteger:(numberOfMatchingTextures + 1)] forKey:lookupHash]; + }); } - (void)purgeAllUnassignedFramebuffers; { - [framebufferCache removeAllObjects]; - [framebufferTypeCounts removeAllObjects]; + runAsynchronouslyOnVideoProcessingQueue(^{ +// dispatch_async(framebufferCacheQueue, ^{ + [framebufferCache removeAllObjects]; + [framebufferTypeCounts removeAllObjects]; + + CVOpenGLESTextureCacheFlush([[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], 0); + }); } - (void)addFramebufferToActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer; { - [activeImageCaptureList addObject:framebuffer]; + runAsynchronouslyOnVideoProcessingQueue(^{ +// dispatch_async(framebufferCacheQueue, ^{ + [activeImageCaptureList addObject:framebuffer]; + }); } - (void)removeFramebufferFromActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer; { - [activeImageCaptureList removeObject:framebuffer]; + runAsynchronouslyOnVideoProcessingQueue(^{ +// dispatch_async(framebufferCacheQueue, ^{ + [activeImageCaptureList removeObject:framebuffer]; + }); } @end diff --git a/framework/Source/GPUImageLuminosity.m b/framework/Source/GPUImageLuminosity.m index 78fbfe63a..37f374ab1 100644 --- a/framework/Source/GPUImageLuminosity.m +++ b/framework/Source/GPUImageLuminosity.m @@ -290,33 +290,39 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates - (void)extractLuminosityAtFrameTime:(CMTime)frameTime; { - // we need a normal color texture for this filter - NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); - NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); - - NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); - - if (rawImagePixels == NULL) - { - rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); - } - - glReadPixels(0, 0, (int)finalStageSize.width, (int)finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); - - NSUInteger luminanceTotal = 0; - NSUInteger byteIndex = 0; - for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) - { - luminanceTotal += rawImagePixels[byteIndex]; - byteIndex += 4; - } - - CGFloat normalizedLuminosityTotal = (CGFloat)luminanceTotal / (CGFloat)totalNumberOfPixels / 255.0; - - if (_luminosityProcessingFinishedBlock != NULL) - { - _luminosityProcessingFinishedBlock(normalizedLuminosityTotal, frameTime); - } + runSynchronouslyOnVideoProcessingQueue(^{ + + // we need a normal color texture for this filter + NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); + NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); + + NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); + + if (rawImagePixels == NULL) + { + rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); + } + + [GPUImageContext useImageProcessingContext]; + [outputFramebuffer activateFramebuffer]; + + glReadPixels(0, 0, (int)finalStageSize.width, (int)finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + + NSUInteger luminanceTotal = 0; + NSUInteger byteIndex = 0; + for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) + { + luminanceTotal += rawImagePixels[byteIndex]; + byteIndex += 4; + } + + CGFloat normalizedLuminosityTotal = (CGFloat)luminanceTotal / (CGFloat)totalNumberOfPixels / 255.0; + + if (_luminosityProcessingFinishedBlock != NULL) + { + _luminosityProcessingFinishedBlock(normalizedLuminosityTotal, frameTime); + } + }); } diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 1d60eff27..5af9454d4 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -60,6 +60,7 @@ void reportAvailableMemoryForGPUImage(NSString *tag); /// @name Managing targets - (void)setInputFramebufferForTarget:(id)target atIndex:(NSInteger)inputTextureIndex; - (GPUImageFramebuffer *)framebufferForOutput; +- (void)removeOutputFramebuffer; - (void)notifyTargetsAboutNewOutputTexture; /** Returns an array of the current targets. diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index a08916d5a..e9d01bb6d 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -127,6 +127,11 @@ - (GPUImageFramebuffer *)framebufferForOutput; return outputFramebuffer; } +- (void)removeOutputFramebuffer; +{ + outputFramebuffer = nil; +} + - (void)notifyTargetsAboutNewOutputTexture; { for (id currentTarget in targets) diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m index ee9a18d23..1e65aa9b1 100644 --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -46,12 +46,30 @@ - (id)init; colorUniform = [filterProgram uniformIndex:@"color"]; useExistingAlphaUniform = [filterProgram uniformIndex:@"useExistingAlpha"]; - self.color = (GPUVector4){0.0f, 0.0f, 0.5f, 1.0f}; + _color = (GPUVector4){0.0f, 0.0f, 0.5f, 1.0f}; self.useExistingAlpha = NO; return self; } +- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates; +{ + if (self.preventRendering) + { + return; + } + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext setActiveShaderProgram:filterProgram]; + + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; + [outputFramebuffer activateFramebuffer]; + + glClearColor(_color.one, _color.two, _color.three, _color.four); + glClear(GL_COLOR_BUFFER_BIT); + }); +} + #pragma mark - #pragma mark Accessors @@ -89,7 +107,10 @@ - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GL _color.three = blueComponent; _color.four = alphaComponent; - [self setVec4:_color forUniform:colorUniform program:filterProgram]; +// [self setVec4:_color forUniform:colorUniform program:filterProgram]; + runAsynchronouslyOnVideoProcessingQueue(^{ + [self newFrameReadyAtTime:kCMTimeIndefinite atIndex:0]; + }); } - (void)setUseExistingAlpha:(BOOL)useExistingAlpha; diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index ea8c09efc..b3cd3df80 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -77,7 +77,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // Having a still photo input set to BGRA and video to YUV doesn't work well, so since I don't have YUV resizing for iPhone 4 yet, kick back to BGRA for that device // if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) - if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) + if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) { BOOL supportsFullYUVRange = NO; NSArray *supportedPixelFormats = photoOutput.availableImageDataCVPixelFormatTypes; diff --git a/framework/Source/GPUImageTextureInput.m b/framework/Source/GPUImageTextureInput.m index 973ad1240..ad3ca1d16 100755 --- a/framework/Source/GPUImageTextureInput.m +++ b/framework/Source/GPUImageTextureInput.m @@ -18,7 +18,9 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; textureSize = newTextureSize; - // TODO: mesh this with the new framebuffer structure + runSynchronouslyOnVideoProcessingQueue(^{ + outputFramebuffer = [[GPUImageFramebuffer alloc] initWithSize:newTextureSize overriddenTexture:newInputTexture]; + }); return self; } @@ -35,6 +37,7 @@ - (void)processTextureWithFrameTime:(CMTime)frameTime; NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:textureSize atIndex:targetTextureIndex]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:targetTextureIndex]; [currentTarget newFrameReadyAtTime:frameTime atIndex:targetTextureIndex]; } }); diff --git a/framework/Source/GPUImageTextureOutput.h b/framework/Source/GPUImageTextureOutput.h index 3b3f00ce6..05e1f36e8 100755 --- a/framework/Source/GPUImageTextureOutput.h +++ b/framework/Source/GPUImageTextureOutput.h @@ -12,6 +12,8 @@ @property(readonly) GLuint texture; @property(nonatomic) BOOL enabled; +- (void)doneWithTexture; + @end @protocol GPUImageTextureOutputDelegate diff --git a/framework/Source/GPUImageTextureOutput.m b/framework/Source/GPUImageTextureOutput.m index 1655c207a..1e1f24f28 100755 --- a/framework/Source/GPUImageTextureOutput.m +++ b/framework/Source/GPUImageTextureOutput.m @@ -21,6 +21,11 @@ - (id)init; return self; } +- (void)doneWithTexture; +{ + [firstInputFramebuffer unlock]; +} + #pragma mark - #pragma mark GPUImageInput protocol @@ -39,6 +44,8 @@ - (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:( { firstInputFramebuffer = newInputFramebuffer; [firstInputFramebuffer lock]; + + _texture = [firstInputFramebuffer texture]; } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index cafbc8ea0..9eb292b49 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -74,6 +74,11 @@ - (GPUImageFramebuffer *)framebufferForOutput; return secondOutputFramebuffer; } +- (void)removeOutputFramebuffer; +{ + secondOutputFramebuffer = nil; +} + #pragma mark - #pragma mark Rendering @@ -106,6 +111,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [firstInputFramebuffer unlock]; + firstInputFramebuffer = nil; // This assumes that any two-pass filter that says it desires monochrome input is using the first pass for a luminance conversion, which can be dropped // if (!currentlyReceivingMonochromeInput) @@ -152,6 +158,8 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [outputFramebuffer unlock]; + outputFramebuffer = nil; + if (usingNextFrameForImageCapture) { dispatch_semaphore_signal(imageCaptureSemaphore); diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 56603b6ed..9eeb26b7f 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -33,7 +33,7 @@ extern NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString AVCaptureVideoDataOutput *videoOutput; BOOL capturePaused; - GPUImageRotationMode outputRotation; + GPUImageRotationMode outputRotation, internalRotation; dispatch_semaphore_t frameRenderingSemaphore; BOOL captureAsYUV; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 2e70b996c..afcd32dbf 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -128,6 +128,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD _runBenchmark = NO; capturePaused = NO; outputRotation = kGPUImageNoRotation; + internalRotation = kGPUImageNoRotation; captureAsYUV = YES; _preferredConversion = kColorConversion709; @@ -614,6 +615,7 @@ - (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth hei // Then release our hold on the local framebuffer to send it back to the cache as soon as it's no longer needed [outputFramebuffer unlock]; + outputFramebuffer = nil; // Finally, trigger rendering as needed for (id currentTarget in targets) @@ -717,7 +719,15 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; [self convertYUVToRGBOutput]; // } - [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; + int rotatedImageBufferWidth = bufferWidth, rotatedImageBufferHeight = bufferHeight; + + if (GPUImageRotationSwapsWidthAndHeight(internalRotation)) + { + rotatedImageBufferWidth = bufferHeight; + rotatedImageBufferHeight = bufferWidth; + } + + [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:rotatedImageBufferWidth height:rotatedImageBufferHeight time:currentTime]; CVPixelBufferUnlockBaseAddress(cameraFrame, 0); CFRelease(luminanceTextureRef); @@ -771,7 +781,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CVPixelBufferLockBaseAddress(cameraFrame, 0); int bytesPerRow = (int) CVPixelBufferGetBytesPerRow(cameraFrame); - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) onlyTexture:YES]; + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bytesPerRow / 4, bufferHeight) onlyTexture:YES]; [outputFramebuffer activateFramebuffer]; glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); @@ -782,7 +792,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; // The use of bytesPerRow / 4 accounts for a display glitch present in preview video frames when using the photo preset on the camera glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bytesPerRow / 4, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); - [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; + [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bytesPerRow / 4 height:bufferHeight time:currentTime]; CVPixelBufferUnlockBaseAddress(cameraFrame, 0); @@ -807,7 +817,15 @@ - (void)convertYUVToRGBOutput; { [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight) textureOptions:self.outputTextureOptions onlyTexture:NO]; + int rotatedImageBufferWidth = imageBufferWidth, rotatedImageBufferHeight = imageBufferHeight; + + if (GPUImageRotationSwapsWidthAndHeight(internalRotation)) + { + rotatedImageBufferWidth = imageBufferHeight; + rotatedImageBufferHeight = imageBufferWidth; + } + + outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(rotatedImageBufferWidth, rotatedImageBufferHeight) textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -820,13 +838,6 @@ - (void)convertYUVToRGBOutput; 1.0f, 1.0f, }; - static const GLfloat textureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, luminanceTexture); glUniform1i(yuvConversionLuminanceTextureUniform, 4); @@ -838,7 +849,7 @@ - (void)convertYUVToRGBOutput; glUniformMatrix3fv(yuvConversionMatrixUniform, 1, GL_FALSE, _preferredConversion); glVertexAttribPointer(yuvConversionPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); - glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); + glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageFilter textureCoordinatesForRotation:internalRotation]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -917,49 +928,102 @@ - (void)updateOrientationSendToTargets; // From the iOS 5.0 release notes: // In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight. - if ([self cameraPosition] == AVCaptureDevicePositionBack) + if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) { - if (_horizontallyMirrorRearFacingCamera) + outputRotation = kGPUImageNoRotation; + if ([self cameraPosition] == AVCaptureDevicePositionBack) { - switch(_outputImageOrientation) + if (_horizontallyMirrorRearFacingCamera) + { + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:internalRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:internalRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeLeft:internalRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:internalRotation = kGPUImageFlipVertical; break; + } + } + else { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipHorizonal; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:internalRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:internalRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:internalRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeRight:internalRotation = kGPUImageNoRotation; break; + } } } else { - switch(_outputImageOrientation) + if (_horizontallyMirrorFrontFacingCamera) + { + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:internalRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:internalRotation = kGPUImageRotateRightFlipHorizontal; break; + case UIInterfaceOrientationLandscapeLeft:internalRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:internalRotation = kGPUImageFlipVertical; break; + } + } + else { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:internalRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:internalRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:internalRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationLandscapeRight:internalRotation = kGPUImageRotate180; break; + } } } } else { - if (_horizontallyMirrorFrontFacingCamera) + if ([self cameraPosition] == AVCaptureDevicePositionBack) { - switch(_outputImageOrientation) + if (_horizontallyMirrorRearFacingCamera) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRightFlipHorizontal; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipHorizonal; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; + } + } + else + { + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; + } } } else { - switch(_outputImageOrientation) + if (_horizontallyMirrorFrontFacingCamera) + { + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRightFlipHorizontal; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; + } + } + else { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; + switch(_outputImageOrientation) + { + case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; + } } } } From 8d39590de65824efef8e116516ca1d2e3419b20f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 17 Mar 2014 20:51:05 -0500 Subject: [PATCH 510/695] Migrated raw data input and outputs to work with the new framebuffer cache. --- .../RawDataTest/RawDataTestAppDelegate.m | 4 +- framework/Source/GPUImageFramebuffer.h | 4 + framework/Source/GPUImageFramebuffer.m | 29 +++++ framework/Source/GPUImageFramebufferCache.m | 4 +- framework/Source/GPUImageRawDataInput.m | 3 +- framework/Source/GPUImageRawDataOutput.h | 3 + framework/Source/GPUImageRawDataOutput.m | 117 +++++++++--------- 7 files changed, 102 insertions(+), 62 deletions(-) diff --git a/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m b/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m index 3a9fbc682..ea2902964 100644 --- a/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m +++ b/examples/iOS/RawDataTest/RawDataTest/RawDataTestAppDelegate.m @@ -32,9 +32,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( __unsafe_unretained GPUImageRawDataOutput * weakOutput = rawDataOutput; [rawDataOutput setNewFrameAvailableBlock:^{ + [weakOutput lockFramebufferForReading]; GLubyte *outputBytes = [weakOutput rawBytesForImage]; NSInteger bytesPerRow = [weakOutput bytesPerRowInOutput]; - NSLog(@"Bytes per row: %d", bytesPerRow); + NSLog(@"Bytes per row: %ld", (unsigned long)bytesPerRow); for (unsigned int yIndex = 0; yIndex < 10; yIndex++) { for (unsigned int xIndex = 0; xIndex < 10; xIndex++) @@ -42,6 +43,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( NSLog(@"Byte at (%d, %d): %d, %d, %d, %d", xIndex, yIndex, outputBytes[yIndex * bytesPerRow + xIndex * 4], outputBytes[yIndex * bytesPerRow + xIndex * 4 + 1], outputBytes[yIndex * bytesPerRow + xIndex * 4 + 2], outputBytes[yIndex * bytesPerRow + xIndex * 4 + 3]); } } + [weakOutput unlockFramebufferAfterReading]; }]; [rawDataInput processData]; diff --git a/framework/Source/GPUImageFramebuffer.h b/framework/Source/GPUImageFramebuffer.h index 4f3d953a5..683494df7 100644 --- a/framework/Source/GPUImageFramebuffer.h +++ b/framework/Source/GPUImageFramebuffer.h @@ -49,4 +49,8 @@ typedef struct GPUTextureOptions { - (CGImageRef)newCGImageFromFramebufferContents; - (void)restoreRenderTarget; +// Raw data bytes +- (NSUInteger)bytesPerRow; +- (GLubyte *)byteBuffer; + @end diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index 6cd5532f3..36d89c29d 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -376,4 +376,33 @@ - (void)restoreRenderTarget; #else #endif } + +#pragma mark - +#pragma mark Raw data bytes + +- (NSUInteger)bytesPerRow; +{ + if ([GPUImageContext supportsFastTextureUpload]) + { +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + return CVPixelBufferGetBytesPerRow(renderTarget); +#else + return _size.width * 4; // TODO: do more with this on the non-texture-cache side +#endif + } + else + { + return _size.width * 4; + } +} + +- (GLubyte *)byteBuffer; +{ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + return (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); +#else + return NULL; // TODO: do more with this on the non-texture-cache side +#endif +} + @end diff --git a/framework/Source/GPUImageFramebufferCache.m b/framework/Source/GPUImageFramebufferCache.m index c403f8fc3..21925ad90 100644 --- a/framework/Source/GPUImageFramebufferCache.m +++ b/framework/Source/GPUImageFramebufferCache.m @@ -153,8 +153,10 @@ - (void)purgeAllUnassignedFramebuffers; // dispatch_async(framebufferCacheQueue, ^{ [framebufferCache removeAllObjects]; [framebufferTypeCounts removeAllObjects]; - +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CVOpenGLESTextureCacheFlush([[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], 0); +#else +#endif }); } diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 1bd8aa34c..06f12f528 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -70,7 +70,7 @@ - (void)uploadBytes:(GLubyte *)bytesToUpload; // TODO: This probably isn't right, and will need to be corrected outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:uploadedImageSize textureOptions:self.outputTextureOptions onlyTexture:YES]; - + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); glTexImage2D(GL_TEXTURE_2D, 0, _pixelFormat==GPUPixelFormatRGB ? GL_RGB : GL_RGBA, (int)uploadedImageSize.width, (int)uploadedImageSize.height, 0, (GLint)_pixelFormat, (GLenum)_pixelType, bytesToUpload); } @@ -99,6 +99,7 @@ - (void)processData; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; } diff --git a/framework/Source/GPUImageRawDataOutput.h b/framework/Source/GPUImageRawDataOutput.h index 5b975068e..5a4538c12 100755 --- a/framework/Source/GPUImageRawDataOutput.h +++ b/framework/Source/GPUImageRawDataOutput.h @@ -38,4 +38,7 @@ typedef struct GPUByteColorVector GPUByteColorVector; - (void)setImageSize:(CGSize)newImageSize; +- (void)lockFramebufferForReading; +- (void)unlockFramebufferAfterReading; + @end diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 17ea1181b..f2cdb785b 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -7,7 +7,7 @@ @interface GPUImageRawDataOutput () { - GPUImageFramebuffer *firstInputFramebuffer, *outputFramebuffer; + GPUImageFramebuffer *firstInputFramebuffer, *outputFramebuffer, *retainedFramebuffer; BOOL hasReadFromTheCurrentFrame; @@ -16,6 +16,8 @@ @interface GPUImageRawDataOutput () GLint dataInputTextureUniform; GLubyte *_rawBytesForImage; + + BOOL lockNextFramebuffer; } // Frame rendering @@ -40,6 +42,7 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn } self.enabled = YES; + lockNextFramebuffer = NO; outputBGRA = resultsInBGRAFormat; imageSize = newImageSize; hasReadFromTheCurrentFrame = NO; @@ -100,6 +103,12 @@ - (void)renderAtInternalSize; outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:imageSize onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; + if(lockNextFramebuffer) + { + retainedFramebuffer = outputFramebuffer; + lockNextFramebuffer = NO; + } + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -229,68 +238,47 @@ - (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; - (GLubyte *)rawBytesForImage; { -// if ( (_rawBytesForImage == NULL) && (![GPUImageContext supportsFastTextureUpload]) ) -// { -// _rawBytesForImage = (GLubyte *) calloc(imageSize.width * imageSize.height * 4, sizeof(GLubyte)); -// hasReadFromTheCurrentFrame = NO; -// } -// -// if (hasReadFromTheCurrentFrame) -// { -// return _rawBytesForImage; -// } -// else -// { -// runSynchronouslyOnVideoProcessingQueue(^{ -// // Note: the fast texture caches speed up 640x480 frame reads from 9.6 ms to 3.1 ms on iPhone 4S -// -// [GPUImageContext useImageProcessingContext]; -// if ([GPUImageContext supportsFastTextureUpload]) -// { -// CVPixelBufferUnlockBaseAddress(renderTarget, 0); -// // CVOpenGLESTextureCacheFlush(rawDataTextureCache, 0); -// } -// -// [self renderAtInternalSize]; -// -// if ([GPUImageContext supportsFastTextureUpload]) -// { -// glFinish(); -// CVPixelBufferLockBaseAddress(renderTarget, 0); -// _rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); -// } -// else -// { -// glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); -// // GL_EXT_read_format_bgra -// // glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); -// } -// -// hasReadFromTheCurrentFrame = YES; -// -// }); -// -// return _rawBytesForImage; -// } - - - // TODO: Finish this - return NULL; + if ( (_rawBytesForImage == NULL) && (![GPUImageContext supportsFastTextureUpload]) ) + { + _rawBytesForImage = (GLubyte *) calloc(imageSize.width * imageSize.height * 4, sizeof(GLubyte)); + hasReadFromTheCurrentFrame = NO; + } + + if (hasReadFromTheCurrentFrame) + { + return _rawBytesForImage; + } + else + { + runSynchronouslyOnVideoProcessingQueue(^{ + // Note: the fast texture caches speed up 640x480 frame reads from 9.6 ms to 3.1 ms on iPhone 4S + + [GPUImageContext useImageProcessingContext]; + [self renderAtInternalSize]; + + if ([GPUImageContext supportsFastTextureUpload]) + { + glFinish(); + _rawBytesForImage = [outputFramebuffer byteBuffer]; + } + else + { + glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); + // GL_EXT_read_format_bgra + // glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); + } + + hasReadFromTheCurrentFrame = YES; + + }); + + return _rawBytesForImage; + } } - (NSUInteger)bytesPerRowInOutput; { -// if ([GPUImageContext supportsFastTextureUpload]) -// { -// return CVPixelBufferGetBytesPerRow(renderTarget); -// } -// else -// { -// return imageSize.width * 4; -// } - - // TODO: Finish this - return 0; + return [retainedFramebuffer bytesPerRow]; } - (void)setImageSize:(CGSize)newImageSize { @@ -302,4 +290,15 @@ - (void)setImageSize:(CGSize)newImageSize { } } +- (void)lockFramebufferForReading; +{ + lockNextFramebuffer = YES; +} + +- (void)unlockFramebufferAfterReading; +{ + [retainedFramebuffer unlock]; + retainedFramebuffer = nil; +} + @end From 1666b40d1cfe1e232d1214e9acd641b5606d5fc5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 17 Mar 2014 21:28:59 -0500 Subject: [PATCH 511/695] Manually committed pull request #1453 by cesare-montresor. --- framework/Source/GPUImageMovie.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 218fceb6f..e1340fe8c 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -131,10 +131,11 @@ - (void)yuvConversionSetup; - (void)dealloc { - runSynchronouslyOnVideoProcessingQueue(^{ - [displayLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + if (self.playerItem && (displayLink != nil)) + { + [displayLink invalidate]; // remove from all run loops displayLink = nil; - }); + } } #pragma mark - From 551fc8c2b830eeb4b99e74dbac938f7153feb19a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 17 Mar 2014 21:44:25 -0500 Subject: [PATCH 512/695] Fixed a compilation issue with BenchmarkSuite. --- .../BenchmarkSuite/ImageFilteringBenchmarkController.m | 4 ++-- .../BenchmarkSuite/VideoFilteringDisplayController.m | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m index 43b21ca06..35e55bbac 100755 --- a/examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m @@ -131,12 +131,12 @@ - (UIImage *)imageProcessedUsingGPUImage:(UIImage *)imageToProcess; GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageToProcess]; GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; - [stillImageFilter prepareForImageCapture]; [stillImageSource addTarget:stillImageFilter]; + [stillImageFilter useNextFrameForImageCapture]; [stillImageSource processImage]; - UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentlyProcessedOutput]; + UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; elapsedTime = CFAbsoluteTimeGetCurrent() - startTime; processingTimeForGPUImageRoutine = elapsedTime * 1000.0; diff --git a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m index 53e4a9f90..34ed594ea 100755 --- a/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m +++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m @@ -237,8 +237,8 @@ -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMS unsigned char *data = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer); - int bufferHeight = CVPixelBufferGetHeight(pixelBuffer); - int bufferWidth = CVPixelBufferGetWidth(pixelBuffer); + size_t bufferHeight = CVPixelBufferGetHeight(pixelBuffer); + size_t bufferWidth = CVPixelBufferGetWidth(pixelBuffer); NSInteger myDataLength = bufferWidth * bufferHeight * 4; From d4bfe09d32ce0f8210004e8568ea5978a1630496 Mon Sep 17 00:00:00 2001 From: cesare-montresor Date: Tue, 18 Mar 2014 10:56:45 +0100 Subject: [PATCH 513/695] Update GPUImageMovie.m merge https://github.com/BradLarson/GPUImage/pull/1453 --- framework/Source/GPUImageMovie.m | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 5d10ff121..e84ef475d 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -131,11 +131,12 @@ - (void)yuvConversionSetup; - (void)dealloc { - if (self.playerItem && (displayLink != nil)) - { - [displayLink invalidate]; // remove from all run loops - displayLink = nil; - } + // Moved into endProcessing + //if (self.playerItem && (displayLink != nil)) + //{ + // [displayLink invalidate]; // remove from all run loops + // displayLink = nil; + //} } #pragma mark - @@ -622,6 +623,12 @@ - (void)endProcessing; [synchronizedMovieWriter setVideoInputReadyCallback:^{return NO;}]; [synchronizedMovieWriter setAudioInputReadyCallback:^{return NO;}]; } + + if (self.playerItem && (displayLink != nil)) + { + [displayLink invalidate]; // remove from all run loops + displayLink = nil; + } if ([self.delegate respondsToSelector:@selector(didCompletePlayingMovie)]) { [self.delegate didCompletePlayingMovie]; From 3250d00cbb9cf6968610bca3e54fa59e907d04d9 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 18 Mar 2014 09:46:34 -0500 Subject: [PATCH 514/695] Fixed naming from the last pull request. --- framework/Source/GPUImageStillCamera.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 3ab1cd035..1d0cbc2bb 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -178,7 +178,7 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) UIImage *filteredPhoto = nil; if(!error) { - filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutputWithOrientation:orientation]; + filteredPhoto = [finalFilterInChain imageFromCurrentFramebufferWithOrientation:orientation]; } dispatch_semaphore_signal(frameRenderingSemaphore); @@ -218,7 +218,7 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f if(!error) { @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutputWithOrientation:orientation]; + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentFramebufferWithOrientation:orientation]; dispatch_semaphore_signal(frameRenderingSemaphore); dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, self.jpegCompressionQuality); @@ -261,7 +261,7 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi if(!error){ @autoreleasepool { - UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentlyProcessedOutputWithOrientation:orientation]; + UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentFramebufferWithOrientation:orientation]; dispatch_semaphore_signal(frameRenderingSemaphore); dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); } From b0103a9027d3d66a150799bc678970c7362740a5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 18 Mar 2014 16:04:52 -0500 Subject: [PATCH 515/695] Fixed a crash introduced in pull request #1449. --- framework/Source/GPUImageMovie.m | 14 +++++++++++--- framework/Source/GPUImageVideoCamera.m | 13 ++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index e84ef475d..f9175b5ce 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -433,10 +433,18 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu int bufferWidth = (int) CVPixelBufferGetWidth(movieFrame); #endif CFTypeRef colorAttachments = CVBufferGetAttachment(movieFrame, kCVImageBufferYCbCrMatrixKey, NULL); - if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) { - _preferredConversion = kColorConversion601; + if (colorAttachments != NULL) + { + if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) + { + _preferredConversion = kColorConversion601; + } + else { + _preferredConversion = kColorConversion709; + } } - else { + else + { _preferredConversion = kColorConversion709; } diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 3addf91ab..f248539fc 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -645,10 +645,17 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; int bufferWidth = (int) CVPixelBufferGetWidth(cameraFrame); int bufferHeight = (int) CVPixelBufferGetHeight(cameraFrame); CFTypeRef colorAttachments = CVBufferGetAttachment(cameraFrame, kCVImageBufferYCbCrMatrixKey, NULL); - if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) { - _preferredConversion = kColorConversion601; + if (colorAttachments != NULL) + { + if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) { + _preferredConversion = kColorConversion601; + } + else { + _preferredConversion = kColorConversion709; + } } - else { + else + { _preferredConversion = kColorConversion709; } From a35ed8ef6bef09789bac3d271eb9c5fba88c40c3 Mon Sep 17 00:00:00 2001 From: Tomas Camin Date: Tue, 18 Mar 2014 22:51:30 +0100 Subject: [PATCH 516/695] Fix assertion in GPUImageView when using Autolayout --- framework/Source/iOS/GPUImageView.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/Source/iOS/GPUImageView.m b/framework/Source/iOS/GPUImageView.m index 9f81f238c..5def624cd 100755 --- a/framework/Source/iOS/GPUImageView.m +++ b/framework/Source/iOS/GPUImageView.m @@ -131,6 +131,8 @@ - (void)commonInit; } - (void)layoutSubviews { + [super layoutSubviews]; + // The frame buffer needs to be trashed and re-created when the view size changes. if (!CGSizeEqualToSize(self.bounds.size, boundsSizeAtFrameBufferEpoch) && !CGSizeEqualToSize(self.bounds.size, CGSizeZero)) { From f90592b6bc2e55ceebb423269bd4bcdff7d347c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Wed, 19 Mar 2014 10:12:54 +0900 Subject: [PATCH 517/695] Update podspec --- GPUImage.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPUImage.podspec b/GPUImage.podspec index 43c9a41ba..e265dc621 100644 --- a/GPUImage.podspec +++ b/GPUImage.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'GPUImage' - s.version = '0.1.2' + s.version = '0.1.3' s.license = 'BSD' s.summary = 'An open source iOS framework for GPU-based image and video processing.' s.homepage = 'https://github.com/BradLarson/GPUImage' From 8132e081ef980985092d6d742bf405032d9632ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Wed, 19 Mar 2014 10:29:20 +0900 Subject: [PATCH 518/695] Silence "Variable Unused" warnings when assertions are blocked (Release builds) --- framework/Source/GPUImageFramebuffer.m | 4 +++- framework/Source/Mac/GPUImageMovieWriter.m | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index 36d89c29d..1030ef495 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -191,9 +191,11 @@ - (void)generateFramebuffer; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture, 0); } + #ifndef NS_BLOCK_ASSERTIONS GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + #endif + glBindTexture(GL_TEXTURE_2D, 0); }); } diff --git a/framework/Source/Mac/GPUImageMovieWriter.m b/framework/Source/Mac/GPUImageMovieWriter.m index 90d311394..89f0a37d7 100755 --- a/framework/Source/Mac/GPUImageMovieWriter.m +++ b/framework/Source/Mac/GPUImageMovieWriter.m @@ -197,11 +197,13 @@ - (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; // custom output settings specified else { + #ifndef NS_BLOCK_ASSERTIONS NSString *videoCodec = [outputSettings objectForKey:AVVideoCodecKey]; NSNumber *width = [outputSettings objectForKey:AVVideoWidthKey]; NSNumber *height = [outputSettings objectForKey:AVVideoHeightKey]; NSAssert(videoCodec && width && height, @"OutputSettings is missing required parameters."); + #endif } /* @@ -370,9 +372,10 @@ - (void)createDataFBO; glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, (int)videoSize.width, (int)videoSize.height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, movieRenderbuffer); + #ifndef NS_BLOCK_ASSERTIONS GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); + #endif } - (void)destroyDataFBO; From 769bf6e76a3f6ce88d0c0abb61eabe58f5f3a266 Mon Sep 17 00:00:00 2001 From: Stelios Petrakis Date: Wed, 19 Mar 2014 21:21:16 +0200 Subject: [PATCH 519/695] Added kColorConversion601FullRange conversion table for Still Images --- framework/Source/GPUImageMovie.m | 5 +++-- framework/Source/GPUImageVideoCamera.m | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index f9175b5ce..4d725a925 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -439,13 +439,14 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu { _preferredConversion = kColorConversion601; } - else { + else + { _preferredConversion = kColorConversion709; } } else { - _preferredConversion = kColorConversion709; + _preferredConversion = kColorConversion601; } CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index f248539fc..5dc6326f0 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -18,6 +18,13 @@ 1.793, -0.533, 0.0, }; +// BT.601 full range (ref: http://www.equasys.de/colorconversion.html) +const GLfloat kColorConversion601FullRange[] = { + 1.0, 1.0, 1.0, + 0.0, -0.343, 1.765, + 1.4, -0.711, 0.0, +}; + NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; @@ -647,16 +654,18 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; CFTypeRef colorAttachments = CVBufferGetAttachment(cameraFrame, kCVImageBufferYCbCrMatrixKey, NULL); if (colorAttachments != NULL) { - if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) { + if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) + { _preferredConversion = kColorConversion601; } - else { + else + { _preferredConversion = kColorConversion709; } } else { - _preferredConversion = kColorConversion709; + _preferredConversion = kColorConversion601FullRange; } CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); From 6300fa606e911a06bcd9b4eadd1f18ffa7271173 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 19 Mar 2014 14:37:41 -0500 Subject: [PATCH 520/695] Fixed a bug with filter groups and still image processing. --- .../SimpleImageFilter.xcodeproj/project.pbxproj | 4 ++++ .../SimpleImageFilter/SimpleImageViewController.m | 5 +++-- framework/Source/GPUImageFilter.m | 14 -------------- framework/Source/GPUImageOutput.m | 1 + 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj b/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj index fdb88705b..45d59a7cd 100755 --- a/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleImageFilter/SimpleImageFilter.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ BCB5E82714E62A3C00701302 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E82214E62A3C00701302 /* QuartzCore.framework */; }; BCB5E86314E6F05A00701302 /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E86214E6F05A00701302 /* WID-small.jpg */; }; BCB5E86514E6F1D700701302 /* Lambeau.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCB5E86414E6F1D700701302 /* Lambeau.jpg */; }; + BCC9005F18DA278200A5A5C7 /* lookup_amatorka.png in Resources */ = {isa = PBXBuildFile; fileRef = BCC9005E18DA278200A5A5C7 /* lookup_amatorka.png */; }; BCF8672A1725A6B400912E34 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF867251725A69A00912E34 /* libGPUImage.a */; }; E5066F511855A9F2008C7682 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E5066F501855A9F2008C7682 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ @@ -80,6 +81,7 @@ BCB5E82214E62A3C00701302 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BCB5E86214E6F05A00701302 /* WID-small.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "WID-small.jpg"; sourceTree = ""; }; BCB5E86414E6F1D700701302 /* Lambeau.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Lambeau.jpg; sourceTree = ""; }; + BCC9005E18DA278200A5A5C7 /* lookup_amatorka.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_amatorka.png; path = ../../../../framework/Resources/lookup_amatorka.png; sourceTree = ""; }; E5066F501855A9F2008C7682 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -152,6 +154,7 @@ BCB5E7F314E605A900701302 /* Supporting Files */ = { isa = PBXGroup; children = ( + BCC9005E18DA278200A5A5C7 /* lookup_amatorka.png */, BCB3C41B16BCA7B7003D26B0 /* Icon-72.png */, BCB3C41C16BCA7B7003D26B0 /* Icon-72@2x.png */, BCB3C41D16BCA7B7003D26B0 /* Icon.png */, @@ -256,6 +259,7 @@ E5066F511855A9F2008C7682 /* Default-568h@2x.png in Resources */, BCB5E86514E6F1D700701302 /* Lambeau.jpg in Resources */, BCB3C42016BCA7B7003D26B0 /* Icon-72.png in Resources */, + BCC9005F18DA278200A5A5C7 /* lookup_amatorka.png in Resources */, BCB3C42116BCA7B7003D26B0 /* Icon-72@2x.png in Resources */, BCB3C42216BCA7B7003D26B0 /* Icon.png in Resources */, BCB3C42316BCA7B7003D26B0 /* Icon@2x.png in Resources */, diff --git a/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m index e70af4481..9ee91b411 100755 --- a/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m +++ b/examples/iOS/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m @@ -114,9 +114,10 @@ - (void)setupImageFilteringToDisk; // Do a simpler image filtering // GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init]; - GPUImageSobelEdgeDetectionFilter *stillImageFilter2 = [[GPUImageSobelEdgeDetectionFilter alloc] init]; +// GPUImageSobelEdgeDetectionFilter *stillImageFilter2 = [[GPUImageSobelEdgeDetectionFilter alloc] init]; +// GPUImageAmatorkaFilter *stillImageFilter2 = [[GPUImageAmatorkaFilter alloc] init]; // GPUImageUnsharpMaskFilter *stillImageFilter2 = [[GPUImageUnsharpMaskFilter alloc] init]; -// GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; + GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; NSLog(@"Second image filtering"); UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index a27b161f0..9d3b89e7b 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -195,20 +195,6 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutput return [[self framebufferForOutput] newCGImageFromFramebufferContents]; } -- (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; -{ - GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; - - [self useNextFrameForImageCapture]; - [stillImageSource addTarget:self]; - [stillImageSource processImage]; - - CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutput]; - - [stillImageSource removeTarget:self]; - return processedImage; -} - #pragma mark - #pragma mark Managing the display FBOs diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index e9d01bb6d..5c38e5f34 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -251,6 +251,7 @@ - (CGImageRef)newCGImageByFilteringCGImage:(CGImageRef)imageToFilter; { GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; + [self useNextFrameForImageCapture]; [stillImageSource addTarget:(id)self]; [stillImageSource processImage]; From 6707dcaa7837a5cdb8f625f7e1d3ec1021d23308 Mon Sep 17 00:00:00 2001 From: Petros Douvantzis Date: Fri, 21 Mar 2014 13:10:47 +0200 Subject: [PATCH 521/695] Proper YCbCr to RGB conversion --- framework/Source/GPUImageMovie.m | 27 +++- framework/Source/GPUImageVideoCamera.h | 2 + framework/Source/GPUImageVideoCamera.m | 151 ++++++++++++++------- framework/Source/iOS/GPUImageMovieWriter.m | 9 ++ 4 files changed, 133 insertions(+), 56 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 4d725a925..9c6e07021 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -21,6 +21,8 @@ @interface GPUImageMovie () GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; GLint yuvConversionMatrixUniform; const GLfloat *_preferredConversion; + + BOOL isFullYUVRange; int imageBufferWidth, imageBufferHeight; } @@ -95,7 +97,8 @@ - (void)yuvConversionSetup; [GPUImageContext useImageProcessingContext]; _preferredConversion = kColorConversion709; - yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; + isFullYUVRange = YES; + yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVFullRangeConversionForLAFragmentShaderString]; if (!yuvConversionProgram.initialized) { @@ -191,6 +194,7 @@ - (AVAssetReader*)createAssetReader AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; NSDictionary *outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; + isFullYUVRange = YES; // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; readerVideoTrackOutput.alwaysCopiesSampleData = NO; @@ -437,7 +441,14 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu { if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) { - _preferredConversion = kColorConversion601; + if (isFullYUVRange) + { + _preferredConversion = kColorConversion601FullRange; + } + else + { + _preferredConversion = kColorConversion601; + } } else { @@ -446,9 +457,17 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu } else { - _preferredConversion = kColorConversion601; - } + if (isFullYUVRange) + { + _preferredConversion = kColorConversion601FullRange; + } + else + { + _preferredConversion = kColorConversion601; + } + } + CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); if ([GPUImageContext supportsFastTextureUpload]) diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 9eeb26b7f..22ccb942b 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -5,8 +5,10 @@ #import "GPUImageOutput.h" extern const GLfloat kColorConversion601[]; +extern const GLfloat kColorConversion601FullRange[]; extern const GLfloat kColorConversion709[]; extern NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString; +extern NSString *const kGPUImageYUVFullRangeConversionForLAFragmentShaderString; extern NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 5dc6326f0..9481b8b4d 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -32,7 +32,7 @@ uniform sampler2D luminanceTexture; uniform sampler2D chrominanceTexture; uniform mediump mat3 colorConversionMatrix; - + void main() { mediump vec3 yuv; @@ -44,16 +44,16 @@ void main() gl_FragColor = vec4(rgb, 1); } -); + ); -NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString = SHADER_STRING +NSString *const kGPUImageYUVFullRangeConversionForLAFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; uniform sampler2D luminanceTexture; uniform sampler2D chrominanceTexture; uniform mediump mat3 colorConversionMatrix; - + void main() { mediump vec3 yuv; @@ -62,10 +62,31 @@ void main() yuv.x = texture2D(luminanceTexture, textureCoordinate).r; yuv.yz = texture2D(chrominanceTexture, textureCoordinate).ra - vec2(0.5, 0.5); rgb = colorConversionMatrix * yuv; + + gl_FragColor = vec4(rgb, 1); + } + ); +NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + + uniform sampler2D luminanceTexture; + uniform sampler2D chrominanceTexture; + uniform mediump mat3 colorConversionMatrix; + + void main() + { + mediump vec3 yuv; + lowp vec3 rgb; + + yuv.x = texture2D(luminanceTexture, textureCoordinate).r - (16.0/255.0); + yuv.yz = texture2D(chrominanceTexture, textureCoordinate).ra - vec2(0.5, 0.5); + rgb = colorConversionMatrix * yuv; + gl_FragColor = vec4(rgb, 1); } -); + ); #pragma mark - @@ -85,6 +106,8 @@ @interface GPUImageVideoCamera () GLint yuvConversionMatrixUniform; const GLfloat *_preferredConversion; + BOOL isFullYUVRange; + int imageBufferWidth, imageBufferHeight; BOOL addedAudioInputsDueToEncodingTarget; @@ -138,51 +161,6 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD internalRotation = kGPUImageNoRotation; captureAsYUV = YES; _preferredConversion = kColorConversion709; - - runSynchronouslyOnVideoProcessingQueue(^{ - - if (captureAsYUV) - { - [GPUImageContext useImageProcessingContext]; -// if ([GPUImageContext deviceSupportsRedTextures]) -// { -// yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; -// } -// else -// { - yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; -// } - - if (!yuvConversionProgram.initialized) - { - [yuvConversionProgram addAttribute:@"position"]; - [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; - - if (![yuvConversionProgram link]) - { - NSString *progLog = [yuvConversionProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [yuvConversionProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - yuvConversionProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - } - - yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; - yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; - yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; - yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; - yuvConversionMatrixUniform = [yuvConversionProgram uniformIndex:@"colorConversionMatrix"]; - - [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - - glEnableVertexAttribArray(yuvConversionPositionAttribute); - glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); - } - }); // Grab the back-facing or front-facing camera _inputCamera = nil; @@ -232,10 +210,12 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD if (supportsFullYUVRange) { [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + isFullYUVRange = YES; } else { [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; + isFullYUVRange = NO; } } else @@ -243,6 +223,59 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; } + runSynchronouslyOnVideoProcessingQueue(^{ + + if (captureAsYUV) + { + [GPUImageContext useImageProcessingContext]; + // if ([GPUImageContext deviceSupportsRedTextures]) + // { + // yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; + // } + // else + // { + if (isFullYUVRange) + { + yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVFullRangeConversionForLAFragmentShaderString]; + } + else + { + yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; + } + + // } + + if (!yuvConversionProgram.initialized) + { + [yuvConversionProgram addAttribute:@"position"]; + [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; + + if (![yuvConversionProgram link]) + { + NSString *progLog = [yuvConversionProgram programLog]; + NSLog(@"Program link log: %@", progLog); + NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; + NSLog(@"Fragment shader compile log: %@", fragLog); + NSString *vertLog = [yuvConversionProgram vertexShaderLog]; + NSLog(@"Vertex shader compile log: %@", vertLog); + yuvConversionProgram = nil; + NSAssert(NO, @"Filter shader link failed"); + } + } + + yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; + yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; + yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; + yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; + yuvConversionMatrixUniform = [yuvConversionProgram uniformIndex:@"colorConversionMatrix"]; + + [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; + + glEnableVertexAttribArray(yuvConversionPositionAttribute); + glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); + } + }); + [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; if ([_captureSession canAddOutput:videoOutput]) { @@ -656,7 +689,14 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; { if(CFStringCompare(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4, 0) == kCFCompareEqualTo) { - _preferredConversion = kColorConversion601; + if (isFullYUVRange) + { + _preferredConversion = kColorConversion601FullRange; + } + else + { + _preferredConversion = kColorConversion601; + } } else { @@ -665,7 +705,14 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; } else { - _preferredConversion = kColorConversion601FullRange; + if (isFullYUVRange) + { + _preferredConversion = kColorConversion601FullRange; + } + else + { + _preferredConversion = kColorConversion601; + } } CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 1c326bebc..8ef1664a2 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -517,6 +517,15 @@ - (void)createDataFBO; CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &renderTarget); + /* AVAssetWriter will use BT.601 conversion matrix for RGB to YCbCr conversion + * regardless of the kCVImageBufferYCbCrMatrixKey value. + * Tagging the resulting video file as BT.601, is the best option right now. + * Creating a proper BT.709 video is not possible at the moment. + */ + CVBufferSetAttachment(renderTarget, kCVImageBufferColorPrimariesKey, kCVImageBufferColorPrimaries_ITU_R_709_2, kCVAttachmentMode_ShouldPropagate); + CVBufferSetAttachment(renderTarget, kCVImageBufferYCbCrMatrixKey, kCVImageBufferYCbCrMatrix_ITU_R_601_4, kCVAttachmentMode_ShouldPropagate); + CVBufferSetAttachment(renderTarget, kCVImageBufferTransferFunctionKey, kCVImageBufferTransferFunction_ITU_R_709_2, kCVAttachmentMode_ShouldPropagate); + CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, renderTarget, NULL, // texture attributes GL_TEXTURE_2D, From 6958c2b833e02f49adc0082a2f225261f40ce150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Thu, 27 Mar 2014 16:11:48 +0900 Subject: [PATCH 522/695] Add missing iOS frameworks that were deleted by #1402 `CoreVideo` doesn't seem to be really needed by looking at GPUImage imports. --- GPUImage.podspec | 1 + 1 file changed, 1 insertion(+) diff --git a/GPUImage.podspec b/GPUImage.podspec index e265dc621..32c17f381 100644 --- a/GPUImage.podspec +++ b/GPUImage.podspec @@ -14,6 +14,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '5.0' s.ios.exclude_files = 'framework/Source/Mac' + s.ios.frameworks = ['OpenGLES', 'CoreMedia', 'QuartzCore', 'AVFoundation'] s.osx.deployment_target = '10.6' s.osx.exclude_files = 'framework/Source/iOS', From 83a625d40343af6a581bfe5f0de5c73dfad1e71c Mon Sep 17 00:00:00 2001 From: liaomiao Date: Fri, 28 Mar 2014 11:10:12 -0700 Subject: [PATCH 523/695] added processDataForTimestamp function added - (void)processDataForTimestamp:(CMTime)frameTime; so that we can provide a valid timestamp to the target. The motivation of doing this can be found here: http://stackoverflow.com/questions/22619944/gpuimage-synchronization-of-2-branch-chains/22645701?noredirect=1#comment34620435_22645701 --- framework/Source/GPUImageRawDataInput.m | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 06f12f528..27e3d0f26 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -107,6 +107,30 @@ - (void)processData; }); } +- (void)processDataForTimestamp:(CMTime)frameTime; +{ + if (dispatch_semaphore_wait(dataUpdateSemaphore, DISPATCH_TIME_NOW) != 0) + { + return; + } + + runAsynchronouslyOnVideoProcessingQueue(^{ + + CGSize pixelSizeOfImage = [self outputImageSize]; + + for (id currentTarget in targets) + { + NSInteger indexOfObject = [targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + + [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndexOfTarget]; + } + + dispatch_semaphore_signal(dataUpdateSemaphore); + }); +} + - (CGSize)outputImageSize; { return uploadedImageSize; From 320999273a956a98f3d70ff276870cac58fcfc3c Mon Sep 17 00:00:00 2001 From: liaomiao Date: Fri, 28 Mar 2014 11:12:45 -0700 Subject: [PATCH 524/695] added processDataForTimestamp function added - (void)processDataForTimestamp:(CMTime)frameTime; so that we can provide a valid timestamp to the target. The motivation of doing this can be found here: http://stackoverflow.com/questions/22619944/gpuimage-synchronization-of-2-branch-chains/22645701?noredirect=1#comment34620435_22645701 --- framework/Source/GPUImageRawDataInput.h | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/Source/GPUImageRawDataInput.h b/framework/Source/GPUImageRawDataInput.h index bc24dad30..648581804 100644 --- a/framework/Source/GPUImageRawDataInput.h +++ b/framework/Source/GPUImageRawDataInput.h @@ -36,6 +36,7 @@ typedef enum { // Image rendering - (void)updateDataFromBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize; - (void)processData; +- (void)processDataForTimestamp:(CMTime)frameTime; - (CGSize)outputImageSize; @end From 0e711a80e1eb5057d83e01aed50c8be4be5b63fe Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 31 Mar 2014 22:24:04 -0500 Subject: [PATCH 525/695] Fixed photo capture on iPhone 4. Fixed data acquisition from raw data outputs. --- .../SimpleVideoFilterViewController.m | 7 ++--- framework/Source/GPUImageFramebuffer.m | 7 +++-- framework/Source/GPUImageRawDataOutput.m | 1 + framework/Source/GPUImageStillCamera.m | 13 ++-------- framework/Source/GPUImageVideoCamera.m | 3 ++- framework/Source/iOS/GPUImageMovieWriter.h | 1 - framework/Source/iOS/GPUImageMovieWriter.m | 26 +++++-------------- 7 files changed, 21 insertions(+), 37 deletions(-) diff --git a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index f72e71864..3ce796d82 100755 --- a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -44,7 +44,6 @@ - (void)viewDidLoad [videoCamera addTarget:filter]; GPUImageView *filterView = (GPUImageView *)self.view; - [filter addTarget:filterView]; // filterView.fillMode = kGPUImageFillModeStretch; // filterView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill; @@ -54,10 +53,12 @@ - (void)viewDidLoad unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; + movieWriter.encodingLiveVideo = YES; // movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)]; // movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720.0, 1280.0)]; // movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1080.0, 1920.0)]; [filter addTarget:movieWriter]; + [filter addTarget:filterView]; [videoCamera startCameraCapture]; @@ -66,7 +67,7 @@ - (void)viewDidLoad dispatch_after(startTime, dispatch_get_main_queue(), ^(void){ NSLog(@"Start recording"); - videoCamera.audioEncodingTarget = movieWriter; +// videoCamera.audioEncodingTarget = movieWriter; [movieWriter startRecording]; // NSError *error = nil; @@ -77,7 +78,7 @@ - (void)viewDidLoad // [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOn]; // [videoCamera.inputCamera unlockForConfiguration]; - double delayInSeconds = 30.0; + double delayInSeconds = 10.0; dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index 36d89c29d..3bec9fb95 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -371,8 +371,8 @@ - (CGImageRef)newCGImageFromFramebufferContents; - (void)restoreRenderTarget; { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CFRelease(renderTarget); CVPixelBufferUnlockBaseAddress(renderTarget, 0); + CFRelease(renderTarget); #else #endif } @@ -399,7 +399,10 @@ - (NSUInteger)bytesPerRow; - (GLubyte *)byteBuffer; { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - return (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); + CVPixelBufferLockBaseAddress(renderTarget, 0); + GLubyte * bufferBytes = CVPixelBufferGetBaseAddress(renderTarget); + CVPixelBufferUnlockBaseAddress(renderTarget, 0); + return bufferBytes; #else return NULL; // TODO: do more with this on the non-texture-cache side #endif diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index f2cdb785b..64a324865 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -260,6 +260,7 @@ - (GLubyte *)rawBytesForImage; { glFinish(); _rawBytesForImage = [outputFramebuffer byteBuffer]; + NSLog(@"Output framebuffer: %@", outputFramebuffer); } else { diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 1d0cbc2bb..998aecc9f 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -37,6 +37,7 @@ void GPUImageCreateResizedSampleBuffer(CVPixelBufferRef cameraFrame, CGSize fina CMSampleTimingInfo timing = {frameTime, frameTime, kCMTimeInvalid}; CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixel_buffer, YES, NULL, NULL, videoInfo, &timing, sampleBuffer); + CVPixelBufferUnlockBaseAddress(cameraFrame, 0); CFRelease(videoInfo); CVPixelBufferRelease(pixel_buffer); } @@ -77,7 +78,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // Having a still photo input set to BGRA and video to YUV doesn't work well, so since I don't have YUV resizing for iPhone 4 yet, kick back to BGRA for that device // if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) - if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) + if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) { BOOL supportsFullYUVRange = NO; NSArray *supportedPixelFormats = photoOutput.availableImageDataCVPixelFormatTypes; @@ -105,16 +106,6 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; } -// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) -// { -// // TODO: Check for full range output and use that if available -// [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; -// } -// else -// { -// [photoOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; -// } - [self.captureSession addOutput:photoOutput]; [self.captureSession commitConfiguration]; diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 9481b8b4d..3eeff7ae7 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -719,7 +719,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; [GPUImageContext useImageProcessingContext]; - if ([GPUImageContext supportsFastTextureUpload]) + if ([GPUImageContext supportsFastTextureUpload] && captureAsYUV) { CVOpenGLESTextureRef luminanceTextureRef = NULL; CVOpenGLESTextureRef chrominanceTextureRef = NULL; @@ -727,6 +727,7 @@ - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; // if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) if (CVPixelBufferGetPlaneCount(cameraFrame) > 0) // Check for YUV planar inputs to do RGB conversion { + CVPixelBufferLockBaseAddress(cameraFrame, 0); if ( (imageBufferWidth != bufferWidth) && (imageBufferHeight != bufferHeight) ) { diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index 5f12204f0..dee0bfb76 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -24,7 +24,6 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; AVAssetWriterInputPixelBufferAdaptor *assetWriterPixelBufferInput; dispatch_queue_t movieWritingQueue; - CVOpenGLESTextureCacheRef coreVideoTextureCache; CVPixelBufferRef renderTarget; CVOpenGLESTextureRef renderTexture; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 8ef1664a2..5a3df0051 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -501,17 +501,6 @@ - (void)createDataFBO; if ([GPUImageContext supportsFastTextureUpload]) { -#if defined(__IPHONE_6_0) - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); -#else - CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageContext sharedImageProcessingContext] context], NULL, &coreVideoTextureCache); -#endif - - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - // Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/ @@ -526,7 +515,7 @@ - (void)createDataFBO; CVBufferSetAttachment(renderTarget, kCVImageBufferYCbCrMatrixKey, kCVImageBufferYCbCrMatrix_ITU_R_601_4, kCVAttachmentMode_ShouldPropagate); CVBufferSetAttachment(renderTarget, kCVImageBufferTransferFunctionKey, kCVImageBufferTransferFunction_ITU_R_709_2, kCVAttachmentMode_ShouldPropagate); - CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, renderTarget, + CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], renderTarget, NULL, // texture attributes GL_TEXTURE_2D, GL_RGBA, // opengl format @@ -576,11 +565,6 @@ - (void)destroyDataFBO; if ([GPUImageContext supportsFastTextureUpload]) { - if (coreVideoTextureCache) - { - CFRelease(coreVideoTextureCache); - } - if (renderTexture) { CFRelease(renderTexture); @@ -634,9 +618,9 @@ - (void)renderAtInternalSize; glVertexAttribPointer(colorSwizzlingTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + [firstInputFramebuffer unlock]; glFinish(); - [firstInputFramebuffer unlock]; } #pragma mark - @@ -709,7 +693,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; void(^write)() = ^() { while( ! assetWriterVideoInput.readyForMoreMediaData && ! _encodingLiveVideo && ! videoEncodingIsFinished ) { NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.1]; - //NSLog(@"video waiting..."); +// NSLog(@"video waiting..."); [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; } if (!assetWriterVideoInput.readyForMoreMediaData) @@ -735,9 +719,13 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; }; if( _encodingLiveVideo ) + { dispatch_async(movieWritingQueue, write); + } else + { write(); + } } - (NSInteger)nextAvailableTextureIndex; From 52ec666e2c40228a80842448d0af04eff6c44fc4 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 1 Apr 2014 09:51:00 -0500 Subject: [PATCH 526/695] Removed an extraneous NSLog. --- framework/Source/GPUImageRawDataOutput.m | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 64a324865..f2cdb785b 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -260,7 +260,6 @@ - (GLubyte *)rawBytesForImage; { glFinish(); _rawBytesForImage = [outputFramebuffer byteBuffer]; - NSLog(@"Output framebuffer: %@", outputFramebuffer); } else { From fda94022f447de9150f99232e3ef160f7bf5a1a4 Mon Sep 17 00:00:00 2001 From: "Ben S. Stahlhood II" Date: Wed, 2 Apr 2014 16:39:56 -0400 Subject: [PATCH 527/695] Update version for CocoaPod submission. --- GPUImage.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GPUImage.podspec b/GPUImage.podspec index 32c17f381..219d4174b 100644 --- a/GPUImage.podspec +++ b/GPUImage.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'GPUImage' - s.version = '0.1.3' + s.version = '0.1.4' s.license = 'BSD' s.summary = 'An open source iOS framework for GPU-based image and video processing.' s.homepage = 'https://github.com/BradLarson/GPUImage' @@ -25,4 +25,4 @@ Pod::Spec.new do |s| 'framework/Source/GPUImageStillCamera.*', 'framework/Source/GPUImageUIElement.*' s.osx.xcconfig = { 'GCC_WARN_ABOUT_RETURN_TYPE' => 'YES' } -end \ No newline at end of file +end From 195a30d8c52c16a465381d7d4443c079eae1807e Mon Sep 17 00:00:00 2001 From: marc Date: Sat, 5 Apr 2014 23:56:00 +0200 Subject: [PATCH 528/695] updated iOS version reference to avoid explicit release of semaphores on iOS6 --- framework/Source/GPUImageFilter.m | 2 +- framework/Source/iOS/GPUImagePicture.m | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 9d3b89e7b..982fe1184 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -155,7 +155,7 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; - (void)dealloc { -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || (!defined(__IPHONE_7_0)) ) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (imageCaptureSemaphore != NULL) { dispatch_release(imageCaptureSemaphore); diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 9be3c135c..bc2559377 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -216,7 +216,7 @@ - (void)dealloc; [outputFramebuffer enableReferenceCounting]; [outputFramebuffer unlock]; -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || (!defined(__IPHONE_7_0)) ) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (imageUpdateSemaphore != NULL) { dispatch_release(imageUpdateSemaphore); @@ -296,4 +296,4 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text } } -@end \ No newline at end of file +@end From 86ec94a0f36ffa6ce98a1bc5927ecc55971d4aaf Mon Sep 17 00:00:00 2001 From: marc Date: Sun, 6 Apr 2014 00:03:12 +0200 Subject: [PATCH 529/695] replaced dispatch_semaphore_create(1) with dispatch_semaphore_create(0) + signal --- framework/Source/GPUImageFilter.m | 3 ++- framework/Source/iOS/GPUImagePicture.m | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 982fe1184..f46505682 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -70,7 +70,8 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad backgroundColorGreen = 0.0; backgroundColorBlue = 0.0; backgroundColorAlpha = 0.0; - imageCaptureSemaphore = dispatch_semaphore_create(1); + imageCaptureSemaphore = dispatch_semaphore_create(0); + dispatch_semaphore_signal(imageCaptureSemaphore); runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index bc2559377..1a7ed3d14 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -62,8 +62,10 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot hasProcessedImage = NO; self.shouldSmoothlyScaleOutput = smoothlyScaleOutput; - imageUpdateSemaphore = dispatch_semaphore_create(1); - + imageUpdateSemaphore = dispatch_semaphore_create(0); + dispatch_semaphore_signal(imageUpdateSemaphore); + + // TODO: Dispatch this whole thing asynchronously to move image loading off main thread CGFloat widthOfImage = CGImageGetWidth(newImageSource); CGFloat heightOfImage = CGImageGetHeight(newImageSource); From 3c4a08b199a2bc146ed1049b5577e1bd43e38010 Mon Sep 17 00:00:00 2001 From: Alex Chugunov Date: Tue, 8 Apr 2014 01:11:49 -0700 Subject: [PATCH 530/695] Do not start writing audio frames until at least one video frame has been written. Fixes an issue where first video frame in the movie is occasionally blank --- framework/Source/iOS/GPUImageMovieWriter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 5a3df0051..3b8a8b38c 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -360,7 +360,7 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; return; } - if (_hasAudioTrack) + if (_hasAudioTrack && CMTIME_IS_VALID(startTime)) { CFRetain(audioBuffer); From de50cbaf9b6c50b49be7c2aecdb1907f28251193 Mon Sep 17 00:00:00 2001 From: Alex Chugunov Date: Tue, 8 Apr 2014 01:16:18 -0700 Subject: [PATCH 531/695] Useless checking --- framework/Source/iOS/GPUImageMovieWriter.m | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 3b8a8b38c..6a2ae8ec0 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -366,18 +366,6 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); - if (CMTIME_IS_INVALID(startTime)) - { - dispatch_sync(movieWritingQueue, ^{ - if ((audioInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting)) - { - [assetWriter startWriting]; - } - [assetWriter startSessionAtSourceTime:currentSampleTime]; - startTime = currentSampleTime; - }); - } - if (!assetWriterAudioInput.readyForMoreMediaData && _encodingLiveVideo) { NSLog(@"1: Had to drop an audio frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); From 5e004b8b713cd0fed40c3c3865fbb258472f9971 Mon Sep 17 00:00:00 2001 From: QFish Date: Sun, 20 Apr 2014 07:57:51 +0800 Subject: [PATCH 532/695] Add a `progress` property for `GPUImageMovie` specifying the progress of the process. --- framework/Source/GPUImageMovie.h | 5 +++++ framework/Source/GPUImageMovie.m | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageMovie.h b/framework/Source/GPUImageMovie.h index 593410a6a..f61e56ef5 100755 --- a/framework/Source/GPUImageMovie.h +++ b/framework/Source/GPUImageMovie.h @@ -30,6 +30,11 @@ */ @property(readwrite, nonatomic) BOOL shouldRepeat; +/** This specifies the progress of the process on a scale from 0 to 1.0. A value of 0 means the process has not yet begun, A value of 1.0 means the conversaion is complete. + This property is not key-value observable. + */ +@property(readonly, nonatomic) float progress; + /** This is used to send the delete Movie did complete playing alert */ @property (readwrite, nonatomic, assign) id delegate; diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 9c6e07021..48deeab76 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -10,7 +10,7 @@ @interface GPUImageMovie () AVAssetReader *reader; AVPlayerItemVideoOutput *playerItemOutput; CADisplayLink *displayLink; - CMTime previousFrameTime; + CMTime previousFrameTime, processingFrameTime; CFAbsoluteTime previousActualFrameTime; BOOL keepLooping; @@ -425,9 +425,29 @@ - (void)processMovieFrame:(CMSampleBufferRef)movieSampleBuffer; CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(movieSampleBuffer); CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(movieSampleBuffer); + + processingFrameTime = currentSampleTime; [self processMovieFrame:movieFrame withSampleTime:currentSampleTime]; } +- (float)progress +{ + if ( AVAssetReaderStatusReading == reader.status ) + { + float current = processingFrameTime.value * 1.0f / processingFrameTime.timescale; + float duration = self.asset.duration.value * 1.0f / self.asset.duration.timescale; + return current / duration; + } + else if ( AVAssetReaderStatusCompleted == reader.status ) + { + return 1.f; + } + else + { + return 0.f; + } +} + - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime { int bufferHeight = (int) CVPixelBufferGetHeight(movieFrame); From 16818926831b40f08024a2efa3432c891fdbde29 Mon Sep 17 00:00:00 2001 From: QFish Date: Sun, 20 Apr 2014 09:48:31 +0800 Subject: [PATCH 533/695] Add usage of progress to SimpleVideoFileFilter example. --- .../SimpleVideoFileFilterViewController.h | 2 + .../SimpleVideoFileFilterViewController.m | 21 ++ .../SimpleVideoFileFilterViewController.xib | 196 +++++------------- 3 files changed, 70 insertions(+), 149 deletions(-) diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h index c95318751..81630fb6d 100755 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.h @@ -6,8 +6,10 @@ GPUImageMovie *movieFile; GPUImageOutput *filter; GPUImageMovieWriter *movieWriter; + NSTimer * timer; } +@property (retain, nonatomic) IBOutlet UILabel *progressLabel; - (IBAction)updatePixelWidth:(id)sender; @end \ No newline at end of file diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m index ad4ebef03..efa37cc7a 100755 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m @@ -51,14 +51,31 @@ - (void)viewDidLoad [movieWriter startRecording]; [movieFile startProcessing]; + timer = [NSTimer scheduledTimerWithTimeInterval:0.3f + target:self + selector:@selector(retrievingProgress) + userInfo:nil + repeats:YES]; + [movieWriter setCompletionBlock:^{ [filter removeTarget:movieWriter]; [movieWriter finishRecording]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [timer invalidate]; + self.progressLabel.text = @"100%"; + }); }]; } +- (void)retrievingProgress +{ + self.progressLabel.text = [NSString stringWithFormat:@"%d%%", (int)(movieFile.progress * 100)]; +} + - (void)viewDidUnload { + [self setProgressLabel:nil]; [super viewDidUnload]; } @@ -73,4 +90,8 @@ - (IBAction)updatePixelWidth:(id)sender [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]]; } +- (void)dealloc { + [_progressLabel release]; + [super dealloc]; +} @end diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib index 6dda94cd9..813e39620 100755 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib @@ -1,149 +1,47 @@ - - - - 1024 - 13A510d - 4457.9 - 1242.11 - 683.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 3682.9 - - - IBProxyObject - IBUISlider - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 266 - {{18, 418}, {284, 23}} - - _NS:623 - NO - IBCocoaTouchFramework - 0 - 0 - 0.10000000149011612 - 0.20000000298023224 - - - {{0, 20}, {320, 460}} - - - 3 - MQA - - 2 - - - - IBCocoaTouchFramework - - - - NO - - - - view - - - - 3 - - - - updatePixelWidth: - - - 13 - - 5 - - - - - - 0 - - - - - - 1 - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - - - SimpleVideoFileFilterViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - GPUImageView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 3682.9 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bb112cc46596b1e744203bd0a73dc8af83248626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Mon, 21 Apr 2014 10:49:49 +0900 Subject: [PATCH 534/695] Fix FilterShowcase project OS X-only headers were getting in the way. --- .../FilterShowcase.xcodeproj/project.pbxproj | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj index 4adb5f111..fdfa07a80 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj +++ b/examples/iOS/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj @@ -386,7 +386,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../../framework/**"; + HEADER_SEARCH_PATHS = ( + ../../../framework/Source, + ../../../framework/Source/iOS, + ); IPHONEOS_DEPLOYMENT_TARGET = 4.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; @@ -416,7 +419,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "../../../framework/**"; + HEADER_SEARCH_PATHS = ( + ../../../framework/Source, + ../../../framework/Source/iOS, + ); IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = "-ObjC"; From 64b726fac3732f300fead4d7e8404e57dd737a80 Mon Sep 17 00:00:00 2001 From: Slipp Douglas Thompson Date: Mon, 21 Apr 2014 19:59:19 -0400 Subject: [PATCH 535/695] `dispatch_release` excluded on 6.0+ (instead of 7.0+) Changed `#if` wrapping around `dispatch_release` to check for iOS 6.0 or newer, rather than 7.0 or newer. This fixes errors: * `error: 'release' is unavailable: not available in automatic reference counting mode` * `ARC forbids explicit message send of 'release'` occurring on the `dispatch_release` call when compiling against iOS 6.x (checked on iOS 6.1; assumed the problem is 6.0+-relevant based on https://github.com/ReactiveCocoa/ReactiveCocoa/issues/204 and https://github.com/Nyx0uf/NYXImagesKit/issues/16). Resolves BradLarson/GPUImage#1528 --- framework/Source/GPUImageFilter.m | 2 +- framework/Source/iOS/GPUImagePicture.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 9d3b89e7b..982fe1184 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -155,7 +155,7 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; - (void)dealloc { -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || (!defined(__IPHONE_7_0)) ) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (imageCaptureSemaphore != NULL) { dispatch_release(imageCaptureSemaphore); diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 9be3c135c..78c0472a4 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -216,7 +216,7 @@ - (void)dealloc; [outputFramebuffer enableReferenceCounting]; [outputFramebuffer unlock]; -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || (!defined(__IPHONE_7_0)) ) +#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (imageUpdateSemaphore != NULL) { dispatch_release(imageUpdateSemaphore); From 264598908ae776189add80dfdc086b889ce1dae1 Mon Sep 17 00:00:00 2001 From: Artjoms Haleckis Date: Wed, 23 Apr 2014 10:40:58 +0300 Subject: [PATCH 536/695] Movie processing made more stable * Checking more statuses for GPUImageMovie, as reader can be failed or cancelled, but this is not handled properly * Checking inputs' statuses before appending buffers in GPUImageMovieWriter, also checking blocks before calling them --- framework/Source/GPUImageMovie.m | 3 ++- framework/Source/iOS/GPUImageMovieWriter.m | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 9c6e07021..7f5c023a5 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -410,7 +410,8 @@ - (BOOL)readNextAudioSampleFromOutput:(AVAssetReaderOutput *)readerAudioTrackOut } else if (synchronizedMovieWriter != nil) { - if (reader.status == AVAssetReaderStatusCompleted) + if (reader.status == AVAssetReaderStatusCompleted || reader.status == AVAssetReaderStatusFailed || + reader.status == AVAssetReaderStatusCancelled) { [self endProcessing]; } diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 5a3df0051..dc7eec62d 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -402,9 +402,10 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; { NSLog(@"2: Had to drop an audio frame %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); } - else if( ! [assetWriterAudioInput appendSampleBuffer:audioBuffer] ) + else if(assetWriter.status == AVAssetWriterStatusWriting) { - NSLog(@"Problem appending audio buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); + if (![assetWriterAudioInput appendSampleBuffer:audioBuffer]) + NSLog(@"Problem appending audio buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); } else { @@ -444,7 +445,7 @@ - (void)enableSynchronizationCallbacks; //NSLog(@"video requestMediaDataWhenReadyOnQueue begin"); while( assetWriterVideoInput.readyForMoreMediaData && ! _paused ) { - if( ! videoInputReadyCallback() && ! videoEncodingIsFinished ) + if( videoInputReadyCallback && ! videoInputReadyCallback() && ! videoEncodingIsFinished ) { dispatch_async(movieWritingQueue, ^{ if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) @@ -473,7 +474,7 @@ - (void)enableSynchronizationCallbacks; //NSLog(@"audio requestMediaDataWhenReadyOnQueue begin"); while( assetWriterAudioInput.readyForMoreMediaData && ! _paused ) { - if( ! audioInputReadyCallback() && ! audioEncodingIsFinished ) + if( audioInputReadyCallback && ! audioInputReadyCallback() && ! audioEncodingIsFinished ) { dispatch_async(movieWritingQueue, ^{ if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) @@ -700,9 +701,10 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { NSLog(@"2: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); } - else if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) + else if(self.assetWriter.status == AVAssetWriterStatusWriting) { - NSLog(@"Problem appending pixel buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); + if (![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) + NSLog(@"Problem appending pixel buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); } else { From c267d02a759a1955ee9e3e11874bdf92aa78b6b2 Mon Sep 17 00:00:00 2001 From: Tony DiPasquale Date: Fri, 25 Apr 2014 10:15:18 -0400 Subject: [PATCH 537/695] Add method to remove filter using only the filter --- framework/Source/GPUImageFilterPipeline.h | 1 + framework/Source/GPUImageFilterPipeline.m | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 08861f685..5eedc2751 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -19,6 +19,7 @@ - (void) addFilter:(GPUImageFilter*)filter atIndex:(NSUInteger)insertIndex; - (void) replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageFilter*)filter; - (void) replaceAllFilters:(NSArray*) newFilters; +- (void) removeFilter:(GPUImageFilter*)filter; - (void) removeFilterAtIndex:(NSUInteger)index; - (void) removeAllFilters; diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index bc372f743..14d39dba8 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -163,6 +163,12 @@ - (void)replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageFilter *)filt [self _refreshFilters]; } +- (void)removeFilter:(GPUImageFilter *)filter +{ + [self.filters removeObject:filter]; + [self _refreshFilters]; +} + - (void)removeFilterAtIndex:(NSUInteger)index { [self.filters removeObjectAtIndex:index]; [self _refreshFilters]; From bb60a90379ea926e1681b9b719972f5d24f98567 Mon Sep 17 00:00:00 2001 From: Tony DiPasquale Date: Fri, 25 Apr 2014 10:32:01 -0400 Subject: [PATCH 538/695] Change filter input and outputs to the base class --- framework/Source/GPUImageFilterPipeline.h | 11 +++++++---- framework/Source/GPUImageFilterPipeline.m | 17 +++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index 08861f685..b9cc13301 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -1,5 +1,8 @@ #import -#import "GPUImageFilter.h" +#import + +@class GPUImageOutput; +@protocol GPUImageInput; @interface GPUImageFilterPipeline : NSObject { @@ -15,9 +18,9 @@ - (id) initWithConfiguration:(NSDictionary*) configuration input:(GPUImageOutput*)input output:(id )output; - (id) initWithConfigurationFile:(NSURL*) configuration input:(GPUImageOutput*)input output:(id )output; -- (void) addFilter:(GPUImageFilter*)filter; -- (void) addFilter:(GPUImageFilter*)filter atIndex:(NSUInteger)insertIndex; -- (void) replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageFilter*)filter; +- (void) addFilter:(GPUImageOutput *)filter; +- (void) addFilter:(GPUImageOutput *)filter atIndex:(NSUInteger)insertIndex; +- (void) replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageOutput *)filter; - (void) replaceAllFilters:(NSArray*) newFilters; - (void) removeFilterAtIndex:(NSUInteger)index; - (void) removeAllFilters; diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index bc372f743..f08fff189 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -1,4 +1,5 @@ #import "GPUImageFilterPipeline.h" +#import "GPUImageOutput.h" @interface GPUImageFilterPipeline () @@ -48,7 +49,7 @@ - (BOOL)_parseConfiguration:(NSDictionary *)configuration { for (NSDictionary *filter in filters) { NSString *filterName = [filter objectForKey:@"FilterName"]; Class theClass = NSClassFromString(filterName); - GPUImageFilter *genericFilter = [[theClass alloc] init]; + GPUImageOutput *genericFilter = [[theClass alloc] init]; // Set up the properties NSDictionary *filterAttributes; if ((filterAttributes = [filter objectForKey:@"Attributes"])) { @@ -148,17 +149,17 @@ - (id)initWithOrderedFilters:(NSArray *)filters input:(GPUImageOutput *)input ou return self; } -- (void)addFilter:(GPUImageFilter *)filter atIndex:(NSUInteger)insertIndex { +- (void)addFilter:(GPUImageOutput *)filter atIndex:(NSUInteger)insertIndex { [self.filters insertObject:filter atIndex:insertIndex]; [self _refreshFilters]; } -- (void)addFilter:(GPUImageFilter *)filter { +- (void)addFilter:(GPUImageOutput *)filter { [self.filters addObject:filter]; [self _refreshFilters]; } -- (void)replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageFilter *)filter { +- (void)replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageOutput *)filter { [self.filters replaceObjectAtIndex:index withObject:filter]; [self _refreshFilters]; } @@ -181,7 +182,7 @@ - (void)replaceAllFilters:(NSArray *)newFilters { - (void)_refreshFilters { id prevFilter = self.input; - GPUImageFilter *theFilter = nil; + GPUImageOutput *theFilter = nil; for (int i = 0; i < [self.filters count]; i++) { theFilter = [self.filters objectAtIndex:i]; @@ -198,15 +199,15 @@ - (void)_refreshFilters { } - (UIImage *)currentFilteredFrame { - return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentFramebuffer]; + return [(GPUImageOutput *)[_filters lastObject] imageFromCurrentFramebuffer]; } - (UIImage *)currentFilteredFrameWithOrientation:(UIImageOrientation)imageOrientation { - return [(GPUImageFilter *)[_filters lastObject] imageFromCurrentFramebufferWithOrientation:imageOrientation]; + return [(GPUImageOutput *)[_filters lastObject] imageFromCurrentFramebufferWithOrientation:imageOrientation]; } - (CGImageRef)newCGImageFromCurrentFilteredFrame { - return [(GPUImageFilter *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; + return [(GPUImageOutput *)[_filters lastObject] newCGImageFromCurrentlyProcessedOutput]; } @end \ No newline at end of file From 347d21c79db5c6cabd749bc949a21dc9c9ac2ffc Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 27 Apr 2014 19:40:19 -0500 Subject: [PATCH 539/695] Made the pipeline additions a little more generic, so they wouldn't break on the Mac. --- framework/Source/GPUImageFilterPipeline.h | 9 +++------ framework/Source/GPUImageFilterPipeline.m | 3 +-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/framework/Source/GPUImageFilterPipeline.h b/framework/Source/GPUImageFilterPipeline.h index dc5b1b5ed..dc2baeac8 100755 --- a/framework/Source/GPUImageFilterPipeline.h +++ b/framework/Source/GPUImageFilterPipeline.h @@ -1,8 +1,5 @@ #import -#import - -@class GPUImageOutput; -@protocol GPUImageInput; +#import "GPUImageOutput.h" @interface GPUImageFilterPipeline : NSObject { @@ -21,8 +18,8 @@ - (void) addFilter:(GPUImageOutput *)filter; - (void) addFilter:(GPUImageOutput *)filter atIndex:(NSUInteger)insertIndex; - (void) replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageOutput *)filter; -- (void) replaceAllFilters:(NSArray*) newFilters; -- (void) removeFilter:(GPUImageFilter*)filter; +- (void) replaceAllFilters:(NSArray *) newFilters; +- (void) removeFilter:(GPUImageOutput *)filter; - (void) removeFilterAtIndex:(NSUInteger)index; - (void) removeAllFilters; diff --git a/framework/Source/GPUImageFilterPipeline.m b/framework/Source/GPUImageFilterPipeline.m index 25727f0e1..4fbe5ebb0 100755 --- a/framework/Source/GPUImageFilterPipeline.m +++ b/framework/Source/GPUImageFilterPipeline.m @@ -1,5 +1,4 @@ #import "GPUImageFilterPipeline.h" -#import "GPUImageOutput.h" @interface GPUImageFilterPipeline () @@ -164,7 +163,7 @@ - (void)replaceFilterAtIndex:(NSUInteger)index withFilter:(GPUImageOutput *)filter; { [self.filters removeObject:filter]; [self _refreshFilters]; From 7d66360ea62bfc0354a78f91c784c447ce3be545 Mon Sep 17 00:00:00 2001 From: Eugene Rysaj Date: Tue, 29 Apr 2014 17:29:56 +0300 Subject: [PATCH 540/695] fix GPUImageRawDataOutput memory access issues when working with CVPixelBuffer-backed framebuffer --- framework/Source/GPUImageFramebuffer.h | 2 ++ framework/Source/GPUImageFramebuffer.m | 38 +++++++++++++++++++++--- framework/Source/GPUImageRawDataOutput.m | 3 ++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImageFramebuffer.h b/framework/Source/GPUImageFramebuffer.h index 683494df7..5cf20dd3e 100644 --- a/framework/Source/GPUImageFramebuffer.h +++ b/framework/Source/GPUImageFramebuffer.h @@ -50,6 +50,8 @@ typedef struct GPUTextureOptions { - (void)restoreRenderTarget; // Raw data bytes +- (void)lockForReading; +- (void)unlockAfterReading; - (NSUInteger)bytesPerRow; - (GLubyte *)byteBuffer; diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index 2868c17fe..048a30768 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -7,6 +7,7 @@ @interface GPUImageFramebuffer() #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CVPixelBufferRef renderTarget; CVOpenGLESTextureRef renderTexture; + NSUInteger readLockCount; #else #endif NSUInteger framebufferReferenceCount; @@ -331,7 +332,7 @@ - (CGImageRef)newCGImageFromFramebufferContents; // glFlush(); glFinish(); CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation - CVPixelBufferLockBaseAddress(renderTarget, 0); + [self lockForReading]; rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, paddedBytesForImage, dataProviderUnlockCallback); [[GPUImageContext sharedFramebufferCache] addFramebufferToActiveImageCaptureList:self]; // In case the framebuffer is swapped out on the filter, need to have a strong reference to it somewhere for it to hang on while the image is in existence @@ -373,7 +374,7 @@ - (CGImageRef)newCGImageFromFramebufferContents; - (void)restoreRenderTarget; { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CVPixelBufferUnlockBaseAddress(renderTarget, 0); + [self unlockAfterReading]; CFRelease(renderTarget); #else #endif @@ -382,6 +383,35 @@ - (void)restoreRenderTarget; #pragma mark - #pragma mark Raw data bytes +- (void)lockForReading +{ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + if ([GPUImageContext supportsFastTextureUpload]) + { + if (readLockCount == 0) + { + CVPixelBufferLockBaseAddress(renderTarget, 0); + } + readLockCount++; + } +#endif +} + +- (void)unlockAfterReading +{ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + if ([GPUImageContext supportsFastTextureUpload]) + { + NSAssert(readLockCount > 0, @"Unbalanced call to -[GPUImageFramebuffer unlockAfterReading]"); + readLockCount--; + if (readLockCount == 0) + { + CVPixelBufferUnlockBaseAddress(renderTarget, 0); + } + } +#endif +} + - (NSUInteger)bytesPerRow; { if ([GPUImageContext supportsFastTextureUpload]) @@ -401,9 +431,9 @@ - (NSUInteger)bytesPerRow; - (GLubyte *)byteBuffer; { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - CVPixelBufferLockBaseAddress(renderTarget, 0); + [self lockForReading]; GLubyte * bufferBytes = CVPixelBufferGetBaseAddress(renderTarget); - CVPixelBufferUnlockBaseAddress(renderTarget, 0); + [self unlockAfterReading]; return bufferBytes; #else return NULL; // TODO: do more with this on the non-texture-cache side diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index f2cdb785b..18101e2cd 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -106,6 +106,8 @@ - (void)renderAtInternalSize; if(lockNextFramebuffer) { retainedFramebuffer = outputFramebuffer; + [retainedFramebuffer lock]; + [retainedFramebuffer lockForReading]; lockNextFramebuffer = NO; } @@ -297,6 +299,7 @@ - (void)lockFramebufferForReading; - (void)unlockFramebufferAfterReading; { + [retainedFramebuffer unlockAfterReading]; [retainedFramebuffer unlock]; retainedFramebuffer = nil; } From 429ccbd3a1240fd22163a9202bb01fcccdc03b7a Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 2 May 2014 16:28:19 -0500 Subject: [PATCH 541/695] By default, now send an indefinite frame time with GPUImageUIElement updates to prevent freezing of the output. -updateUsingCurrentTime still lets you record movies from UI elements. --- framework/Source/GPUImageUIElement.h | 2 ++ framework/Source/GPUImageUIElement.m | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/framework/Source/GPUImageUIElement.h b/framework/Source/GPUImageUIElement.h index 09fe9324e..984ff2adc 100644 --- a/framework/Source/GPUImageUIElement.h +++ b/framework/Source/GPUImageUIElement.h @@ -9,5 +9,7 @@ // Layer management - (CGSize)layerSizeInPixels; - (void)update; +- (void)updateUsingCurrentTime; +- (void)updateWithTimestamp:(CMTime)frameTime; @end diff --git a/framework/Source/GPUImageUIElement.m b/framework/Source/GPUImageUIElement.m index c89e33b1d..332089249 100644 --- a/framework/Source/GPUImageUIElement.m +++ b/framework/Source/GPUImageUIElement.m @@ -60,8 +60,11 @@ - (CGSize)layerSizeInPixels; - (void)update; { - [GPUImageContext useImageProcessingContext]; - + [self updateWithTimestamp:kCMTimeIndefinite]; +} + +- (void)updateUsingCurrentTime; +{ if(CMTIME_IS_INVALID(time)) { time = CMTimeMakeWithSeconds(0, 600); actualTimeOfLastUpdate = [NSDate timeIntervalSinceReferenceDate]; @@ -71,6 +74,13 @@ - (void)update; time = CMTimeAdd(time, CMTimeMakeWithSeconds(diff, 600)); actualTimeOfLastUpdate = now; } + + [self updateWithTimestamp:time]; +} + +- (void)updateWithTimestamp:(CMTime)frameTime; +{ + [GPUImageContext useImageProcessingContext]; CGSize layerPixelSize = [self layerSizeInPixels]; @@ -105,7 +115,7 @@ - (void)update; NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:layerPixelSize atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:time atIndex:textureIndexOfTarget]; + [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndexOfTarget]; } } } From db92540802b9e60b29feab4123af9fd0cb0fdf79 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 2 May 2014 16:42:16 -0500 Subject: [PATCH 542/695] Fixed a crash on a 0-radius box blur. --- .../FilterShowcase/ShowcaseFilterViewController.m | 2 +- framework/Source/GPUImageBoxBlurFilter.m | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index cbbf4c1f7..ec97459e2 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1160,7 +1160,7 @@ - (void)setupFilter; self.title = @"Box Blur"; self.filterSettingsSlider.hidden = NO; - [self.filterSettingsSlider setMinimumValue:1.0]; + [self.filterSettingsSlider setMinimumValue:0.0]; [self.filterSettingsSlider setMaximumValue:24.0]; [self.filterSettingsSlider setValue:2.0]; diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index 2bae66ed5..5a49385b5 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -5,9 +5,9 @@ @implementation GPUImageBoxBlurFilter + (NSString *)vertexShaderForOptimizedBlurOfRadius:(NSUInteger)blurRadius sigma:(CGFloat)sigma; { - if (blurRadius == 0) + if (blurRadius < 1) { - return nil; + return kGPUImageVertexShaderString; } // From these weights we calculate the offsets to read interpolated values from From 9f95bc95e2efb62524efbf1d2e65fe682c9757c3 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Fri, 2 May 2014 17:30:04 -0500 Subject: [PATCH 543/695] Fixed a 64-bit crash with a Gaussian blur of 0 pixels. --- framework/Source/GPUImageGaussianBlurFilter.m | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index 7fde186ce..05a4e7173 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -463,10 +463,14 @@ - (void)setBlurRadiusInPixels:(CGFloat)newValue; { _blurRadiusInPixels = round(newValue); // For now, only do integral sigmas - // Calculate the number of pixels to sample from by setting a bottom limit for the contribution of the outermost pixel - CGFloat minimumWeightToFindEdgeOfSamplingArea = 1.0/256.0; - NSUInteger calculatedSampleRadius = floor(sqrt(-2.0 * pow(_blurRadiusInPixels, 2.0) * log(minimumWeightToFindEdgeOfSamplingArea * sqrt(2.0 * M_PI * pow(_blurRadiusInPixels, 2.0))) )); - calculatedSampleRadius += calculatedSampleRadius % 2; // There's nothing to gain from handling odd radius sizes, due to the optimizations I use + NSUInteger calculatedSampleRadius = 0; + if (_blurRadiusInPixels >= 1) // Avoid a divide-by-zero error here + { + // Calculate the number of pixels to sample from by setting a bottom limit for the contribution of the outermost pixel + CGFloat minimumWeightToFindEdgeOfSamplingArea = 1.0/256.0; + calculatedSampleRadius = floor(sqrt(-2.0 * pow(_blurRadiusInPixels, 2.0) * log(minimumWeightToFindEdgeOfSamplingArea * sqrt(2.0 * M_PI * pow(_blurRadiusInPixels, 2.0))) )); + calculatedSampleRadius += calculatedSampleRadius % 2; // There's nothing to gain from handling odd radius sizes, due to the optimizations I use + } // NSLog(@"Blur radius: %f, calculated sample radius: %d", _blurRadiusInPixels, calculatedSampleRadius); // From 437acb0a080a9afc923bef633ad3e9154dd0d1ea Mon Sep 17 00:00:00 2001 From: Andrew Cobb Date: Tue, 13 May 2014 18:32:43 -0600 Subject: [PATCH 544/695] Fix setFloatArray:... so that it copies the data in case it's on the stack The function previously relied on `arrayValue' remaining in place long enough for the async call to read it, which doesn't always happen, especially if it was allocated on the stack. I think this also was the cause of https://github.com/BradLarson/GPUImage/issues/847 --- framework/Source/GPUImageFilter.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index f46505682..3fac78087 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -512,11 +512,14 @@ - (void)setVec4:(GPUVector4)vectorValue forUniform:(GLint)uniform program:(GLPro - (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; { + // Make a copy of the data, so it doesn't get overwritten before async call executes + NSData* arrayData = [NSData dataWithBytes:arrayValue length:arrayLength * sizeof(arrayValue[0])]; + runAsynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext setActiveShaderProgram:shaderProgram]; [self setAndExecuteUniformStateCallbackAtIndex:uniform forProgram:shaderProgram toBlock:^{ - glUniform1fv(uniform, arrayLength, arrayValue); + glUniform1fv(uniform, arrayLength, [arrayData bytes]); }]; }); } From 6e30f33bf3c4d0460a41f8d003fc512497a8bd2b Mon Sep 17 00:00:00 2001 From: Tianhui Huang Date: Thu, 15 May 2014 11:29:08 +0800 Subject: [PATCH 545/695] Fixed a setInputFrameBuffer issue in GPUImageThreeInputFilter --- framework/Source/GPUImageThreeInputFilter.m | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/Source/GPUImageThreeInputFilter.m b/framework/Source/GPUImageThreeInputFilter.m index a173241c3..2f4f113fc 100644 --- a/framework/Source/GPUImageThreeInputFilter.m +++ b/framework/Source/GPUImageThreeInputFilter.m @@ -158,6 +158,7 @@ - (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:( else if (textureIndex == 1) { secondInputFramebuffer = newInputFramebuffer; + hasSetSecondTexture = YES; [secondInputFramebuffer lock]; } else From 833cdd9a6ac42f91c6bb3053d1a0c286ef098b0b Mon Sep 17 00:00:00 2001 From: Rafael Nobre Date: Sun, 18 May 2014 13:38:31 -0300 Subject: [PATCH 546/695] Added audio processing callback for GPUImageMovieWriter --- framework/Source/iOS/GPUImageMovieWriter.h | 1 + framework/Source/iOS/GPUImageMovieWriter.m | 23 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index dee0bfb76..e6113e412 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -40,6 +40,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; @property(readwrite, nonatomic) BOOL encodingLiveVideo; @property(nonatomic, copy) BOOL(^videoInputReadyCallback)(void); @property(nonatomic, copy) BOOL(^audioInputReadyCallback)(void); +@property(nonatomic, copy) void(^audioProcessingCallback)(SInt16 **samplesRef, CMItemCount numSamplesInBuffer); @property(nonatomic) BOOL enabled; @property(nonatomic, readonly) AVAssetWriter *assetWriter; @property(nonatomic, readonly) CMTime duration; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index c6f021ee1..547fcc65d 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -379,6 +379,29 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; previousAudioTime = currentSampleTime; + //if the consumer wants to do something with the audio samples before writing, let him. + if (self.audioProcessingCallback) { + //need to introspect into the opaque CMBlockBuffer structure to find its raw sample buffers. + CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(audioBuffer); + CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(audioBuffer); + AudioBufferList audioBufferList; + + CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(audioBuffer, + NULL, + &audioBufferList, + sizeof(audioBufferList), + NULL, + NULL, + kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, + &buffer + ); + //passing a live pointer to the audio buffers, try to process them in-place or we might have syncing issues. + for (int bufferCount=0; bufferCount < audioBufferList.mNumberBuffers; bufferCount++) { + SInt16 *samples = (SInt16 *)audioBufferList.mBuffers[bufferCount].mData; + self.audioProcessingCallback(&samples, numSamplesInBuffer); + } + } + // NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); void(^write)() = ^() { while( ! assetWriterAudioInput.readyForMoreMediaData && ! _encodingLiveVideo && ! audioEncodingIsFinished ) { From e8aa04e74fcd0b1337d20ea74af877cd608b606d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 26 May 2014 17:37:06 -0500 Subject: [PATCH 547/695] Fixed a bug causing movie recording crashes introduced by a pull request. Experimenting with improving recording performance using a separate movie recording OpenGL ES context. --- .../SimpleVideoFilterViewController.m | 5 +- framework/Source/GPUImageFramebuffer.m | 7 +- framework/Source/GPUImageOutput.h | 2 + framework/Source/GPUImageOutput.m | 33 +++ framework/Source/iOS/GPUImageContext.h | 2 + framework/Source/iOS/GPUImageContext.m | 18 +- framework/Source/iOS/GPUImageMovieWriter.h | 3 +- framework/Source/iOS/GPUImageMovieWriter.m | 274 +++++++++--------- 8 files changed, 207 insertions(+), 137 deletions(-) diff --git a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index 3ce796d82..37b53df27 100755 --- a/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/iOS/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -30,7 +30,7 @@ - (void)viewDidLoad videoCamera.horizontallyMirrorFrontFacingCamera = NO; videoCamera.horizontallyMirrorRearFacingCamera = NO; - filter = [[GPUImageSepiaFilter alloc] init]; +// filter = [[GPUImageSepiaFilter alloc] init]; // filter = [[GPUImageTiltShiftFilter alloc] init]; // [(GPUImageTiltShiftFilter *)filter setTopFocusLevel:0.65]; @@ -39,6 +39,7 @@ - (void)viewDidLoad // [(GPUImageTiltShiftFilter *)filter setFocusFallOffRate:0.2]; // filter = [[GPUImageSketchFilter alloc] init]; + filter = [[GPUImageColorInvertFilter alloc] init]; // filter = [[GPUImageSmoothToonFilter alloc] init]; // GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRightFlipVertical]; @@ -67,7 +68,7 @@ - (void)viewDidLoad dispatch_after(startTime, dispatch_get_main_queue(), ^(void){ NSLog(@"Start recording"); -// videoCamera.audioEncodingTarget = movieWriter; + videoCamera.audioEncodingTarget = movieWriter; [movieWriter startRecording]; // NSError *error = nil; diff --git a/framework/Source/GPUImageFramebuffer.m b/framework/Source/GPUImageFramebuffer.m index 2868c17fe..933434a1a 100644 --- a/framework/Source/GPUImageFramebuffer.m +++ b/framework/Source/GPUImageFramebuffer.m @@ -328,7 +328,6 @@ - (CGImageRef)newCGImageFromFramebufferContents; NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)_size.height * 4; - // glFlush(); glFinish(); CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation CVPixelBufferLockBaseAddress(renderTarget, 0); @@ -410,4 +409,10 @@ - (GLubyte *)byteBuffer; #endif } +- (GLuint)texture; +{ +// NSLog(@"Accessing texture: %d from FB: %@", _texture, self); + return _texture; +} + @end diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index 5af9454d4..a1af54d70 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -20,6 +20,8 @@ typedef NS_ENUM(NSInteger, UIImageOrientation) { void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)); void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)); +void runSynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void)); +void runAsynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void)); void reportAvailableMemoryForGPUImage(NSString *tag); @class GPUImageMovieWriter; diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 5c38e5f34..387c4289e 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -48,6 +48,39 @@ void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)) } } +void runSynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void)) +{ + dispatch_queue_t videoProcessingQueue = [context contextQueue]; +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) + if (dispatch_get_current_queue() == videoProcessingQueue) +#else + if (dispatch_get_specific([GPUImageContext contextKey])) +#endif + { + block(); + }else + { + dispatch_sync(videoProcessingQueue, block); + } +} + +void runAsynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void)) +{ + dispatch_queue_t videoProcessingQueue = [context contextQueue]; + +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) + if (dispatch_get_current_queue() == videoProcessingQueue) +#else + if (dispatch_get_specific([GPUImageContext contextKey])) +#endif + { + block(); + }else + { + dispatch_async(videoProcessingQueue, block); + } +} + void reportAvailableMemoryForGPUImage(NSString *tag) { if (!tag) diff --git a/framework/Source/iOS/GPUImageContext.h b/framework/Source/iOS/GPUImageContext.h index 170931f41..7e4fa0352 100755 --- a/framework/Source/iOS/GPUImageContext.h +++ b/framework/Source/iOS/GPUImageContext.h @@ -19,7 +19,9 @@ typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, k + (dispatch_queue_t)sharedContextQueue; + (GPUImageFramebufferCache *)sharedFramebufferCache; + (void)useImageProcessingContext; +- (void)useAsCurrentContext; + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; +- (void)setContextShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; + (GLint)maximumVaryingVectorsForThisDevice; diff --git a/framework/Source/iOS/GPUImageContext.m b/framework/Source/iOS/GPUImageContext.m index 60425d620..a94264b7f 100755 --- a/framework/Source/iOS/GPUImageContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -71,7 +71,12 @@ + (GPUImageFramebufferCache *)sharedFramebufferCache; + (void)useImageProcessingContext; { - EAGLContext *imageProcessingContext = [[GPUImageContext sharedImageProcessingContext] context]; + [[GPUImageContext sharedImageProcessingContext] useAsCurrentContext]; +} + +- (void)useAsCurrentContext; +{ + EAGLContext *imageProcessingContext = [self context]; if ([EAGLContext currentContext] != imageProcessingContext) { [EAGLContext setCurrentContext:imageProcessingContext]; @@ -81,15 +86,20 @@ + (void)useImageProcessingContext; + (void)setActiveShaderProgram:(GLProgram *)shaderProgram; { GPUImageContext *sharedContext = [GPUImageContext sharedImageProcessingContext]; - EAGLContext *imageProcessingContext = [sharedContext context]; + [sharedContext setContextShaderProgram:shaderProgram]; +} + +- (void)setContextShaderProgram:(GLProgram *)shaderProgram; +{ + EAGLContext *imageProcessingContext = [self context]; if ([EAGLContext currentContext] != imageProcessingContext) { [EAGLContext setCurrentContext:imageProcessingContext]; } - if (sharedContext.currentShaderProgram != shaderProgram) + if (self.currentShaderProgram != shaderProgram) { - sharedContext.currentShaderProgram = shaderProgram; + self.currentShaderProgram = shaderProgram; [shaderProgram use]; } } diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index dee0bfb76..68766e75f 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -22,8 +22,8 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; AVAssetWriterInput *assetWriterAudioInput; AVAssetWriterInput *assetWriterVideoInput; AVAssetWriterInputPixelBufferAdaptor *assetWriterPixelBufferInput; - dispatch_queue_t movieWritingQueue; + GPUImageContext *_movieWriterContext; CVPixelBufferRef renderTarget; CVOpenGLESTextureRef renderTexture; @@ -46,6 +46,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; @property(nonatomic, assign) CGAffineTransform transform; @property(nonatomic, copy) NSArray *metaData; @property(nonatomic, assign, getter = isPaused) BOOL paused; +@property(nonatomic) GPUImageContext *movieWriterContext; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index c6f021ee1..53757f5d3 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -43,7 +43,7 @@ - (void)createDataFBO; - (void)destroyDataFBO; - (void)setFilterFBO; -- (void)renderAtInternalSize; +- (void)renderAtInternalSizeUsingFramebuffer:(GPUImageFramebuffer *)inputFramebufferToUse; @end @@ -59,6 +59,7 @@ @implementation GPUImageMovieWriter @synthesize enabled; @synthesize shouldInvalidateAudioSampleWhenDone = _shouldInvalidateAudioSampleWhenDone; @synthesize paused = _paused; +@synthesize movieWriterContext = _movieWriterContext; @synthesize delegate = _delegate; @@ -84,8 +85,6 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr videoEncodingIsFinished = NO; audioEncodingIsFinished = NO; - movieWritingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.movieWritingQueue", NULL); - videoSize = newSize; movieURL = newMovieURL; fileType = newFileType; @@ -94,17 +93,20 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr previousFrameTime = kCMTimeNegativeInfinity; previousAudioTime = kCMTimeNegativeInfinity; inputRotation = kGPUImageNoRotation; + + _movieWriterContext = [[GPUImageContext alloc] init]; + [_movieWriterContext useSharegroup:[[[GPUImageContext sharedImageProcessingContext] context] sharegroup]]; - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; + runSynchronouslyOnContextQueue(_movieWriterContext, ^{ + [_movieWriterContext useAsCurrentContext]; if ([GPUImageContext supportsFastTextureUpload]) { - colorSwizzlingProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + colorSwizzlingProgram = [_movieWriterContext programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; } else { - colorSwizzlingProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + colorSwizzlingProgram = [_movieWriterContext programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; } if (!colorSwizzlingProgram.initialized) @@ -129,8 +131,7 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; - // REFACTOR: Wrap this in a block for the image processing queue - [GPUImageContext setActiveShaderProgram:colorSwizzlingProgram]; + [_movieWriterContext setContextShaderProgram:colorSwizzlingProgram]; glEnableVertexAttribArray(colorSwizzlingPositionAttribute); glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); @@ -146,10 +147,6 @@ - (void)dealloc; [self destroyDataFBO]; #if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) - if (movieWritingQueue != NULL) - { - dispatch_release(movieWritingQueue); - } if( audioQueue != NULL ) { dispatch_release(audioQueue); @@ -259,7 +256,7 @@ - (void)startRecording; alreadyFinishedRecording = NO; isRecording = YES; startTime = kCMTimeInvalid; - dispatch_sync(movieWritingQueue, ^{ + runSynchronouslyOnContextQueue(_movieWriterContext, ^{ if (audioInputReadyCallback == NULL) { [assetWriter startWriting]; @@ -283,7 +280,7 @@ - (void)cancelRecording; } isRecording = NO; - dispatch_sync(movieWritingQueue, ^{ + runSynchronouslyOnContextQueue(_movieWriterContext, ^{ alreadyFinishedRecording = YES; if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) @@ -307,49 +304,46 @@ - (void)finishRecording; - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; { - runSynchronouslyOnVideoProcessingQueue(^{ + runSynchronouslyOnContextQueue(_movieWriterContext, ^{ + isRecording = NO; - dispatch_sync(movieWritingQueue, ^{ - isRecording = NO; - - if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled || assetWriter.status == AVAssetWriterStatusUnknown) - { - if (handler) - runAsynchronouslyOnVideoProcessingQueue(handler); - return; - } - if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) - { - videoEncodingIsFinished = YES; - [assetWriterVideoInput markAsFinished]; - } - if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) - { - audioEncodingIsFinished = YES; - [assetWriterAudioInput markAsFinished]; - } -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) - // Not iOS 6 SDK - [assetWriter finishWriting]; + if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled || assetWriter.status == AVAssetWriterStatusUnknown) + { if (handler) - runAsynchronouslyOnVideoProcessingQueue(handler); + runAsynchronouslyOnContextQueue(_movieWriterContext, handler); + return; + } + if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) + { + videoEncodingIsFinished = YES; + [assetWriterVideoInput markAsFinished]; + } + if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) + { + audioEncodingIsFinished = YES; + [assetWriterAudioInput markAsFinished]; + } +#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) + // Not iOS 6 SDK + [assetWriter finishWriting]; + if (handler) + runAsynchronouslyOnContextQueue(_movieWriterContext,handler); #else - // iOS 6 SDK - if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { - // Running iOS 6 - [assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; - } - else { - // Not running iOS 6 + // iOS 6 SDK + if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { + // Running iOS 6 + [assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; + } + else { + // Not running iOS 6 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - [assetWriter finishWriting]; + [assetWriter finishWriting]; #pragma clang diagnostic pop - if (handler) - runAsynchronouslyOnVideoProcessingQueue(handler); - } + if (handler) + runAsynchronouslyOnContextQueue(_movieWriterContext, handler); + } #endif - }); }); } @@ -360,12 +354,25 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; return; } - if (_hasAudioTrack && CMTIME_IS_VALID(startTime)) +// if (_hasAudioTrack && CMTIME_IS_VALID(startTime)) + if (_hasAudioTrack) { CFRetain(audioBuffer); CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); + if (CMTIME_IS_INVALID(startTime)) + { + runSynchronouslyOnContextQueue(_movieWriterContext, ^{ + if ((audioInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting)) + { + [assetWriter startWriting]; + } + [assetWriter startSessionAtSourceTime:currentSampleTime]; + startTime = currentSampleTime; + }); + } + if (!assetWriterAudioInput.readyForMoreMediaData && _encodingLiveVideo) { NSLog(@"1: Had to drop an audio frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); @@ -406,10 +413,16 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; } CFRelease(audioBuffer); }; +// runAsynchronouslyOnContextQueue(_movieWriterContext, write); if( _encodingLiveVideo ) - dispatch_async(movieWritingQueue, write); + + { + runAsynchronouslyOnContextQueue(_movieWriterContext, write); + } else + { write(); + } } } @@ -435,7 +448,7 @@ - (void)enableSynchronizationCallbacks; { if( videoInputReadyCallback && ! videoInputReadyCallback() && ! videoEncodingIsFinished ) { - dispatch_async(movieWritingQueue, ^{ + runAsynchronouslyOnContextQueue(_movieWriterContext, ^{ if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) { videoEncodingIsFinished = YES; @@ -464,7 +477,7 @@ - (void)enableSynchronizationCallbacks; { if( audioInputReadyCallback && ! audioInputReadyCallback() && ! audioEncodingIsFinished ) { - dispatch_async(movieWritingQueue, ^{ + runAsynchronouslyOnContextQueue(_movieWriterContext, ^{ if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) { audioEncodingIsFinished = YES; @@ -504,7 +517,7 @@ - (void)createDataFBO; CVBufferSetAttachment(renderTarget, kCVImageBufferYCbCrMatrixKey, kCVImageBufferYCbCrMatrix_ITU_R_601_4, kCVAttachmentMode_ShouldPropagate); CVBufferSetAttachment(renderTarget, kCVImageBufferTransferFunctionKey, kCVImageBufferTransferFunction_ITU_R_709_2, kCVAttachmentMode_ShouldPropagate); - CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], renderTarget, + CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, [_movieWriterContext coreVideoTextureCache], renderTarget, NULL, // texture attributes GL_TEXTURE_2D, GL_RGBA, // opengl format @@ -537,8 +550,8 @@ - (void)createDataFBO; - (void)destroyDataFBO; { - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; + runSynchronouslyOnContextQueue(_movieWriterContext, ^{ + [_movieWriterContext useAsCurrentContext]; if (movieFramebuffer) { @@ -579,12 +592,12 @@ - (void)setFilterFBO; glViewport(0, 0, (int)videoSize.width, (int)videoSize.height); } -- (void)renderAtInternalSize; +- (void)renderAtInternalSizeUsingFramebuffer:(GPUImageFramebuffer *)inputFramebufferToUse; { - [GPUImageContext useImageProcessingContext]; + [_movieWriterContext useAsCurrentContext]; [self setFilterFBO]; - [GPUImageContext setActiveShaderProgram:colorSwizzlingProgram]; + [_movieWriterContext setContextShaderProgram:colorSwizzlingProgram]; glClearColor(1.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -600,15 +613,15 @@ - (void)renderAtInternalSize; const GLfloat *textureCoordinates = [GPUImageFilter textureCoordinatesForRotation:inputRotation]; glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); - glUniform1i(colorSwizzlingInputTextureUniform, 4); + glBindTexture(GL_TEXTURE_2D, [inputFramebufferToUse texture]); + glUniform1i(colorSwizzlingInputTextureUniform, 4); + +// NSLog(@"Movie writer framebuffer: %@", inputFramebufferToUse); glVertexAttribPointer(colorSwizzlingPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); glVertexAttribPointer(colorSwizzlingTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - [firstInputFramebuffer unlock]; - glFinish(); } @@ -633,7 +646,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; if (CMTIME_IS_INVALID(startTime)) { - dispatch_sync(movieWritingQueue, ^{ + runSynchronouslyOnContextQueue(_movieWriterContext, ^{ if ((videoInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting)) { [assetWriter startWriting]; @@ -644,78 +657,79 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; }); } - if (!assetWriterVideoInput.readyForMoreMediaData && _encodingLiveVideo) - { - [firstInputFramebuffer unlock]; - NSLog(@"1: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); - return; - } - - // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames - [GPUImageContext useImageProcessingContext]; - [self renderAtInternalSize]; - - CVPixelBufferRef pixel_buffer = NULL; - - if ([GPUImageContext supportsFastTextureUpload]) - { - pixel_buffer = renderTarget; - CVPixelBufferLockBaseAddress(pixel_buffer, 0); - } - else - { - CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &pixel_buffer); - if ((pixel_buffer == NULL) || (status != kCVReturnSuccess)) + GPUImageFramebuffer *inputFramebufferForBlock = firstInputFramebuffer; + glFinish(); + + runAsynchronouslyOnContextQueue(_movieWriterContext, ^{ + if (!assetWriterVideoInput.readyForMoreMediaData && _encodingLiveVideo) { - CVPixelBufferRelease(pixel_buffer); + [inputFramebufferForBlock unlock]; + NSLog(@"1: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); return; } - else + + // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames + [_movieWriterContext useAsCurrentContext]; + [self renderAtInternalSizeUsingFramebuffer:inputFramebufferForBlock]; + + CVPixelBufferRef pixel_buffer = NULL; + + if ([GPUImageContext supportsFastTextureUpload]) { + pixel_buffer = renderTarget; CVPixelBufferLockBaseAddress(pixel_buffer, 0); - - GLubyte *pixelBufferData = (GLubyte *)CVPixelBufferGetBaseAddress(pixel_buffer); - glReadPixels(0, 0, videoSize.width, videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufferData); - } - } - - void(^write)() = ^() { - while( ! assetWriterVideoInput.readyForMoreMediaData && ! _encodingLiveVideo && ! videoEncodingIsFinished ) { - NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.1]; -// NSLog(@"video waiting..."); - [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; - } - if (!assetWriterVideoInput.readyForMoreMediaData) - { - NSLog(@"2: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); - } - else if(self.assetWriter.status == AVAssetWriterStatusWriting) - { - if (![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) - NSLog(@"Problem appending pixel buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); } else { - //NSLog(@"Wrote a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); + CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &pixel_buffer); + if ((pixel_buffer == NULL) || (status != kCVReturnSuccess)) + { + CVPixelBufferRelease(pixel_buffer); + return; + } + else + { + CVPixelBufferLockBaseAddress(pixel_buffer, 0); + + GLubyte *pixelBufferData = (GLubyte *)CVPixelBufferGetBaseAddress(pixel_buffer); + glReadPixels(0, 0, videoSize.width, videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufferData); + } } - CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); - - previousFrameTime = frameTime; - if (![GPUImageContext supportsFastTextureUpload]) - { - CVPixelBufferRelease(pixel_buffer); - } - }; - - if( _encodingLiveVideo ) - { - dispatch_async(movieWritingQueue, write); - } - else - { + void(^write)() = ^() { + while( ! assetWriterVideoInput.readyForMoreMediaData && ! _encodingLiveVideo && ! videoEncodingIsFinished ) { + NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.1]; + // NSLog(@"video waiting..."); + [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; + } + if (!assetWriterVideoInput.readyForMoreMediaData) + { + NSLog(@"2: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); + } + else if(self.assetWriter.status == AVAssetWriterStatusWriting) + { + if (![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) + NSLog(@"Problem appending pixel buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); + } + else + { + NSLog(@"Couldn't write a frame"); + //NSLog(@"Wrote a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); + } + CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); + + previousFrameTime = frameTime; + + if (![GPUImageContext supportsFastTextureUpload]) + { + CVPixelBufferRelease(pixel_buffer); + } + }; + write(); - } + + [inputFramebufferForBlock unlock]; + }); } - (NSInteger)nextAvailableTextureIndex; @@ -725,8 +739,10 @@ - (NSInteger)nextAvailableTextureIndex; - (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; { - firstInputFramebuffer = newInputFramebuffer; - [firstInputFramebuffer lock]; + [newInputFramebuffer lock]; +// runSynchronouslyOnContextQueue(_movieWriterContext, ^{ + firstInputFramebuffer = newInputFramebuffer; +// }); } - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; From b324839366a2549d340f51c2655541e23ddb5cfb Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 26 May 2014 18:05:13 -0500 Subject: [PATCH 548/695] Fixed a compilation error due to a missing property attribute. --- framework/Source/iOS/GPUImageMovieWriter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.h b/framework/Source/iOS/GPUImageMovieWriter.h index 68766e75f..6985acd40 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.h +++ b/framework/Source/iOS/GPUImageMovieWriter.h @@ -46,7 +46,7 @@ extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; @property(nonatomic, assign) CGAffineTransform transform; @property(nonatomic, copy) NSArray *metaData; @property(nonatomic, assign, getter = isPaused) BOOL paused; -@property(nonatomic) GPUImageContext *movieWriterContext; +@property(nonatomic, retain) GPUImageContext *movieWriterContext; // Initialization and teardown - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; From 9946d6203c583dd402edaae39fb962da227bae19 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 26 May 2014 18:14:06 -0500 Subject: [PATCH 549/695] Removed the synchronous lock around movie processing. I see no reason this needs to be here, and it prevents multiple movies from being blended. --- framework/Source/GPUImageMovie.m | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index b3fba6bc0..86abc4cf8 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -174,17 +174,15 @@ - (void)startProcessing GPUImageMovie __block *blockSelf = self; [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ - runSynchronouslyOnVideoProcessingQueue(^{ - NSError *error = nil; - AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; - if (!tracksStatus == AVKeyValueStatusLoaded) - { - return; - } - blockSelf.asset = inputAsset; - [blockSelf processAsset]; - blockSelf = nil; - }); + NSError *error = nil; + AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; + if (!tracksStatus == AVKeyValueStatusLoaded) + { + return; + } + blockSelf.asset = inputAsset; + [blockSelf processAsset]; + blockSelf = nil; }]; } From 603edb7c6bd37aab36746e26e15ab64e03b8a0dc Mon Sep 17 00:00:00 2001 From: Jack Wu Date: Wed, 28 May 2014 12:23:27 -0400 Subject: [PATCH 550/695] Add category on GPUImage to allow replacing a sub texture of GPUPicture --- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++ .../iOS/GPUImagePicture+TextureSubimage.h | 19 ++++ .../iOS/GPUImagePicture+TextureSubimage.m | 100 ++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 framework/Source/iOS/GPUImagePicture+TextureSubimage.h create mode 100644 framework/Source/iOS/GPUImagePicture+TextureSubimage.m diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index d2f5311bc..72fa40579 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -37,6 +37,8 @@ 83AE9F991540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; 83AE9FCD1540E92800F7FC13 /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; }; 83AE9FCE1540E92800F7FC13 /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; + 84FFC80B1936408F00994258 /* GPUImagePicture+TextureSubimage.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FFC8091936408F00994258 /* GPUImagePicture+TextureSubimage.h */; }; + 84FFC80C1936408F00994258 /* GPUImagePicture+TextureSubimage.m in Sources */ = {isa = PBXBuildFile; fileRef = 84FFC80A1936408F00994258 /* GPUImagePicture+TextureSubimage.m */; }; 96781B2F15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; }; 96781B3015C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */; }; 96781B3415C39E80005FA0D7 /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; }; @@ -393,6 +395,8 @@ 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSubtractBlendFilter.m; path = Source/GPUImageSubtractBlendFilter.m; sourceTree = SOURCE_ROOT; }; 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMaskFilter.h; path = Source/GPUImageMaskFilter.h; sourceTree = SOURCE_ROOT; }; 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageMaskFilter.m; path = Source/GPUImageMaskFilter.m; sourceTree = SOURCE_ROOT; }; + 84FFC8091936408F00994258 /* GPUImagePicture+TextureSubimage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "GPUImagePicture+TextureSubimage.h"; path = "Source/iOS/GPUImagePicture+TextureSubimage.h"; sourceTree = SOURCE_ROOT; }; + 84FFC80A1936408F00994258 /* GPUImagePicture+TextureSubimage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "GPUImagePicture+TextureSubimage.m"; path = "Source/iOS/GPUImagePicture+TextureSubimage.m"; sourceTree = SOURCE_ROOT; }; 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAmatorkaFilter.h; path = Source/GPUImageAmatorkaFilter.h; sourceTree = SOURCE_ROOT; }; 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAmatorkaFilter.m; path = Source/GPUImageAmatorkaFilter.m; sourceTree = SOURCE_ROOT; }; 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMissEtikateFilter.h; path = Source/GPUImageMissEtikateFilter.h; sourceTree = SOURCE_ROOT; }; @@ -979,6 +983,8 @@ BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */, BCB5E7D814E6003400701302 /* GPUImagePicture.h */, BCB5E7D914E6003400701302 /* GPUImagePicture.m */, + 84FFC8091936408F00994258 /* GPUImagePicture+TextureSubimage.h */, + 84FFC80A1936408F00994258 /* GPUImagePicture+TextureSubimage.m */, BC982C6A14F33C290001FF6F /* GPUImageMovie.h */, BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */, D443237817C81C0C00204484 /* GPUImageMovieComposition.h */, @@ -1349,6 +1355,7 @@ BC8A584B18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.h in Headers */, C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */, B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */, + 84FFC80B1936408F00994258 /* GPUImagePicture+TextureSubimage.h in Headers */, B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */, B801722F16313151001C8D16 /* GPUImageLuminosityBlendFilter.h in Headers */, BC185E7A16B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h in Headers */, @@ -1630,6 +1637,7 @@ BC185E8316B866F000EA01AD /* GPUImagePixellatePositionFilter.m in Sources */, 46A8097916B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */, BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */, + 84FFC80C1936408F00994258 /* GPUImagePicture+TextureSubimage.m in Sources */, BCBC604E16C58B0900B11741 /* GPUImageMotionBlurFilter.m in Sources */, BCBC605816C8527C00B11741 /* GPUImageZoomBlurFilter.m in Sources */, BCBF617B16E4F44700E2784A /* GPUImageKuwaharaRadius3Filter.m in Sources */, diff --git a/framework/Source/iOS/GPUImagePicture+TextureSubimage.h b/framework/Source/iOS/GPUImagePicture+TextureSubimage.h new file mode 100644 index 000000000..03c631bc0 --- /dev/null +++ b/framework/Source/iOS/GPUImagePicture+TextureSubimage.h @@ -0,0 +1,19 @@ +// +// GPUImagePicture+TextureSubimage.h +// GPUImage +// +// Created by Jack Wu on 2014-05-28. +// Copyright (c) 2014 Brad Larson. All rights reserved. +// + +#import "GPUImagePicture.h" + +@interface GPUImagePicture (TextureSubimage) + +- (void)replaceTextureWithSubimage:(UIImage*)subimage; +- (void)replaceTextureWithSubCGImage:(CGImageRef)subimageSource; + +- (void)replaceTextureWithSubimage:(UIImage*)subimage inRect:(CGRect)subRect; +- (void)replaceTextureWithSubCGImage:(CGImageRef)subimageSource inRect:(CGRect)subRect; + +@end diff --git a/framework/Source/iOS/GPUImagePicture+TextureSubimage.m b/framework/Source/iOS/GPUImagePicture+TextureSubimage.m new file mode 100644 index 000000000..64ca75207 --- /dev/null +++ b/framework/Source/iOS/GPUImagePicture+TextureSubimage.m @@ -0,0 +1,100 @@ +// +// GPUImagePicture+TextureSubimage.m +// GPUImage +// +// Created by Jack Wu on 2014-05-28. +// Copyright (c) 2014 Brad Larson. All rights reserved. +// + +#import "GPUImagePicture+TextureSubimage.h" + +@implementation GPUImagePicture (TextureSubimage) + +- (void)replaceTextureWithSubimage:(UIImage*)subimage { + return [self replaceTextureWithSubCGImage:[subimage CGImage]]; +} + +- (void)replaceTextureWithSubCGImage:(CGImageRef)subimageSource { + CGRect rect = (CGRect) {.origin = CGPointZero, .size = (CGSize){.width = CGImageGetWidth(subimageSource), .height = CGImageGetHeight(subimageSource)}}; + return [self replaceTextureWithSubCGImage:subimageSource inRect:rect]; +} + +- (void)replaceTextureWithSubimage:(UIImage*)subimage inRect:(CGRect)subRect { + return [self replaceTextureWithSubCGImage:[subimage CGImage] inRect:subRect]; +} + +- (void)replaceTextureWithSubCGImage:(CGImageRef)subimageSource inRect:(CGRect)subRect { + NSAssert(outputFramebuffer, @"Picture must be initialized first before replacing subtexture"); + NSAssert(self.framebufferForOutput.textureOptions.internalFormat == GL_RGBA, @"For replacing subtexture the internal texture format must be GL_RGBA."); + + CGRect subimageRect = (CGRect){.origin = CGPointZero, .size = (CGSize){.width = CGImageGetWidth(subimageSource), .height = CGImageGetHeight(subimageSource)}}; + NSAssert(CGRectIsEmpty(subimageRect), @"Passed sub image must not be empty - it should be at least 1px tall and wide"); + NSAssert(CGRectIsEmpty(subRect), @"Passed sub rect must not be empty"); + + NSAssert(CGSizeEqualToSize(subimageRect.size, subRect.size), @"Subimage size must match the size of sub rect"); + + // We don't have to worry about scaling the subimage or finding a power of two size. + // The initialization has taken care of that for us. + + dispatch_semaphore_signal(imageUpdateSemaphore); + + BOOL shouldRedrawUsingCoreGraphics = NO; + + // Since internal format is always RGBA, we need the input data in RGBA as well. + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(subimageSource); + CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; + if (byteOrderInfo != kCGBitmapByteOrderDefault && byteOrderInfo != kCGBitmapByteOrder32Big) { + CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; + if (alphaInfo != kCGImageAlphaPremultipliedLast && alphaInfo != kCGImageAlphaLast && alphaInfo != kCGImageAlphaNoneSkipLast) { + shouldRedrawUsingCoreGraphics = YES; + } + } + + GLubyte *imageData = NULL; + CFDataRef dataFromImageDataProvider; + if (shouldRedrawUsingCoreGraphics) + { + // For resized or incompatible image: redraw + imageData = (GLubyte *) calloc(1, (int)subimageRect.size.width * (int)subimageRect.size.height * 4); + + CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); + + CGContextRef imageContext = CGBitmapContextCreate(imageData, (size_t)subimageRect.size.width, (size_t)subimageRect.size.height, 8, (size_t)subimageRect.size.width * 4, genericRGBColorspace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast); + + CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, subimageRect.size.width, subimageRect.size.height), subimageSource); + CGContextRelease(imageContext); + CGColorSpaceRelease(genericRGBColorspace); + } + else + { + // Access the raw image bytes directly + dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider(subimageSource)); + imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); + } + + runSynchronouslyOnVideoProcessingQueue(^{ + [GPUImageContext useImageProcessingContext]; + [outputFramebuffer disableReferenceCounting]; + + glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); + + // no need to use self.outputTextureOptions here since pictures need this texture formats and type + glTexSubImage2D(GL_TEXTURE_2D, 0, subRect.origin.x, subRect.origin.y, (GLint)subRect.size.width, subRect.size.height, GL_RGBA, GL_UNSIGNED_BYTE, imageData); + + if (self.shouldSmoothlyScaleOutput) + { + glGenerateMipmap(GL_TEXTURE_2D); + } + glBindTexture(GL_TEXTURE_2D, 0); + }); + + if (shouldRedrawUsingCoreGraphics) + { + free(imageData); + } + else + { + CFRelease(dataFromImageDataProvider); + } +} +@end From 38d0eb14087fee6aab1aa898e32ffbd699c4c37e Mon Sep 17 00:00:00 2001 From: Jack Wu Date: Wed, 28 May 2014 12:31:09 -0400 Subject: [PATCH 551/695] Fix up logic for redraw --- framework/Source/iOS/GPUImagePicture+TextureSubimage.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/Source/iOS/GPUImagePicture+TextureSubimage.m b/framework/Source/iOS/GPUImagePicture+TextureSubimage.m index 64ca75207..63ecc280d 100644 --- a/framework/Source/iOS/GPUImagePicture+TextureSubimage.m +++ b/framework/Source/iOS/GPUImagePicture+TextureSubimage.m @@ -44,6 +44,9 @@ - (void)replaceTextureWithSubCGImage:(CGImageRef)subimageSource inRect:(CGRect)s CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(subimageSource); CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; if (byteOrderInfo != kCGBitmapByteOrderDefault && byteOrderInfo != kCGBitmapByteOrder32Big) { + shouldRedrawUsingCoreGraphics = YES; + } + else { CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; if (alphaInfo != kCGImageAlphaPremultipliedLast && alphaInfo != kCGImageAlphaLast && alphaInfo != kCGImageAlphaNoneSkipLast) { shouldRedrawUsingCoreGraphics = YES; From e3be3ddac5e6c6ac80e82f803cd0662884fd31fd Mon Sep 17 00:00:00 2001 From: Jack Wu Date: Wed, 28 May 2014 12:44:14 -0400 Subject: [PATCH 552/695] Fix assert logic --- framework/Source/iOS/GPUImagePicture+TextureSubimage.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/iOS/GPUImagePicture+TextureSubimage.m b/framework/Source/iOS/GPUImagePicture+TextureSubimage.m index 63ecc280d..71ef8f97f 100644 --- a/framework/Source/iOS/GPUImagePicture+TextureSubimage.m +++ b/framework/Source/iOS/GPUImagePicture+TextureSubimage.m @@ -28,8 +28,8 @@ - (void)replaceTextureWithSubCGImage:(CGImageRef)subimageSource inRect:(CGRect)s NSAssert(self.framebufferForOutput.textureOptions.internalFormat == GL_RGBA, @"For replacing subtexture the internal texture format must be GL_RGBA."); CGRect subimageRect = (CGRect){.origin = CGPointZero, .size = (CGSize){.width = CGImageGetWidth(subimageSource), .height = CGImageGetHeight(subimageSource)}}; - NSAssert(CGRectIsEmpty(subimageRect), @"Passed sub image must not be empty - it should be at least 1px tall and wide"); - NSAssert(CGRectIsEmpty(subRect), @"Passed sub rect must not be empty"); + NSAssert(!CGRectIsEmpty(subimageRect), @"Passed sub image must not be empty - it should be at least 1px tall and wide"); + NSAssert(!CGRectIsEmpty(subRect), @"Passed sub rect must not be empty"); NSAssert(CGSizeEqualToSize(subimageRect.size, subRect.size), @"Subimage size must match the size of sub rect"); From 9c85264e39fcc8c5a2b82d5db68cb991cb18a204 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Wed, 4 Jun 2014 18:31:06 -0500 Subject: [PATCH 553/695] Fixed some Xcode 6 compilation warnings / errors. Mac framework can now build as a module in Xcode 6. --- .../project.pbxproj | 6 +- .../xcschemes/SimpleVideoFileFilter.xcscheme | 2 +- framework/GPUImage.xcodeproj/project.pbxproj | 22 ++++- .../xcschemes/Documentation.xcscheme | 2 +- .../xcshareddata/xcschemes/GPUImage.xcscheme | 2 +- .../GPUImageMac.xcodeproj/project.pbxproj | 6 ++ .../GPUImageFASTCornerDetectionFilter.h | 22 +++++ .../GPUImageFASTCornerDetectionFilter.m | 84 +++++++++++++++++++ framework/Source/GPUImageVideoCamera.m | 10 ++- framework/Source/Mac/GPUImage.h | 3 + 10 files changed, 152 insertions(+), 7 deletions(-) diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj index ef4b7f9c5..a8e1a47ab 100755 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj @@ -206,7 +206,7 @@ BCB5DDC114E86899000AF3C2 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0600; ORGANIZATIONNAME = "Cell Phone"; }; buildConfigurationList = BCB5DDC414E86899000AF3C2 /* Build configuration list for PBXProject "SimpleVideoFileFilter" */; @@ -311,9 +311,11 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -351,9 +353,11 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; diff --git a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFileFilter.xcscheme b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFileFilter.xcscheme index 8eed28a29..fa227814e 100644 --- a/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFileFilter.xcscheme +++ b/examples/iOS/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/xcshareddata/xcschemes/SimpleVideoFileFilter.xcscheme @@ -1,6 +1,6 @@ +#import +#import #import // Base classes From 056447b0288694f282087f8734e6770c67a02081 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 7 Jun 2014 23:04:10 -0500 Subject: [PATCH 554/695] Added iOS module support for Xcode 6, so this can be used in a Swift application. --- README.md | 382 ++++----- framework/GPUImage.xcodeproj/project.pbxproj | 790 +++++++++++++++++- .../xcschemes/GPUImageFramework.xcscheme | 61 ++ framework/Source/Mac/GPUImage.h | 3 - .../Source/iOS/Framework/GPUImageFramework.h | 165 ++++ framework/Source/iOS/Framework/Info.plist | 26 + .../Source/iOS/Framework/module.modulemap | 6 + framework/Source/iOS/GPUImageMovieWriter.m | 15 +- framework/Source/iOS/GPUImagePicture.m | 7 +- 9 files changed, 1252 insertions(+), 203 deletions(-) create mode 100644 framework/GPUImage.xcodeproj/xcshareddata/xcschemes/GPUImageFramework.xcscheme create mode 100644 framework/Source/iOS/Framework/GPUImageFramework.h create mode 100644 framework/Source/iOS/Framework/Info.plist create mode 100644 framework/Source/iOS/Framework/module.modulemap diff --git a/README.md b/README.md index 9c2ba230e..986611c5d 100755 --- a/README.md +++ b/README.md @@ -48,10 +48,199 @@ For example, an application that takes in live video from the camera, converts t GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView -## Documentation ## +## Adding the static library to your iOS project ## + +Once you have the latest source code for the framework, it's fairly straightforward to add it to your application. Start by dragging the GPUImage.xcodeproj file into your application's Xcode project to embed the framework in your project. Next, go to your application's target and add GPUImage as a Target Dependency. Finally, you'll want to drag the libGPUImage.a library from the GPUImage framework's Products folder to the Link Binary With Libraries build phase in your application's target. + +GPUImage needs a few other frameworks to be linked into your application, so you'll need to add the following as linked libraries in your application target: + +- CoreMedia +- CoreVideo +- OpenGLES +- AVFoundation +- QuartzCore + +You'll also need to find the framework headers, so within your project's build settings set the Header Search Paths to the relative path from your application to the framework/ subdirectory within the GPUImage source directory. Make this header search path recursive. + +To use the GPUImage classes within your application, simply include the core framework header using the following: + + #import "GPUImage.h" + +As a note: if you run into the error "Unknown class GPUImageView in Interface Builder" or the like when trying to build an interface with Interface Builder, you may need to add -ObjC to your Other Linker Flags in your project's build settings. + +Also, if you need to deploy this to iOS 4.x, it appears that the current version of Xcode (4.3) requires that you weak-link the Core Video framework in your final application or you see crashes with the message "Symbol not found: _CVOpenGLESTextureCacheCreate" when you create an archive for upload to the App Store or for ad hoc distribution. To do this, go to your project's Build Phases tab, expand the Link Binary With Libraries group, and find CoreVideo.framework in the list. Change the setting for it in the far right of the list from Required to Optional. + +Additionally, this is an ARC-enabled framework, so if you want to use this within a manual reference counted application targeting iOS 4.x, you'll need to add -fobjc-arc to your Other Linker Flags as well. + +### Building static library at the command line ### + +If you don't want to include the project as a dependency in your application's Xcode project, you can build a universal static library for the iOS Simulator or device. To do this, run `build.sh` at the command line. The resulting library and header files will be located at `build/Release-iphone`. You may also change the version of the iOS SDK by changing the `IOSSDK_VER` variable in `build.sh` (all available versions can be found using `xcodebuild -showsdks`). + +### Documentation ### Documentation is generated from header comments using appledoc. To build the documentation, switch to the "Documentation" scheme in Xcode. You should ensure that "APPLEDOC_PATH" (a User-Defined build setting) points to an appledoc binary, available on Github or through Homebrew. It will also build and install a .docset file, which you can view with your favorite documentation tool. +## Performing common tasks ## + +### Filtering live video ### + +To filter live video from an iOS device's camera, you can use code like the following: + + GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + + GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"]; + GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)]; + + // Add the view somewhere so it's visible + + [videoCamera addTarget:customFilter]; + [customFilter addTarget:filteredVideoView]; + + [videoCamera startCameraCapture]; + +This sets up a video source coming from the iOS device's back-facing camera, using a preset that tries to capture at 640x480. This video is captured with the interface being in portrait mode, where the landscape-left-mounted camera needs to have its video frames rotated before display. A custom filter, using code from the file CustomShader.fsh, is then set as the target for the video frames from the camera. These filtered video frames are finally displayed onscreen with the help of a UIView subclass that can present the filtered OpenGL ES texture that results from this pipeline. + +The fill mode of the GPUImageView can be altered by setting its fillMode property, so that if the aspect ratio of the source video is different from that of the view, the video will either be stretched, centered with black bars, or zoomed to fill. + +For blending filters and others that take in more than one image, you can create multiple outputs and add a single filter as a target for both of these outputs. The order with which the outputs are added as targets will affect the order in which the input images are blended or otherwise processed. + +Also, if you wish to enable microphone audio capture for recording to a movie, you'll need to set the audioEncodingTarget of the camera to be your movie writer, like for the following: + + videoCamera.audioEncodingTarget = movieWriter; + + +### Capturing and filtering a still photo ### + +To capture and filter still photos, you can use a process similar to the one for filtering video. Instead of a GPUImageVideoCamera, you use a GPUImageStillCamera: + + stillCamera = [[GPUImageStillCamera alloc] init]; + stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + + filter = [[GPUImageGammaFilter alloc] init]; + [stillCamera addTarget:filter]; + GPUImageView *filterView = (GPUImageView *)self.view; + [filter addTarget:filterView]; + + [stillCamera startCameraCapture]; + +This will give you a live, filtered feed of the still camera's preview video. Note that this preview video is only provided on iOS 4.3 and higher, so you may need to set that as your deployment target if you wish to have this functionality. + +Once you want to capture a photo, you use a callback block like the following: + + [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ + NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSError *error2 = nil; + if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) + { + return; + } + }]; + +The above code captures a full-size photo processed by the same filter chain used in the preview view and saves that photo to disk as a JPEG in the application's documents directory. + +Note that the framework currently can't handle images larger than 2048 pixels wide or high on older devices (those before the iPhone 4S, iPad 2, or Retina iPad) due to texture size limitations. This means that the iPhone 4, whose camera outputs still photos larger than this, won't be able to capture photos like this. A tiling mechanism is being implemented to work around this. All other devices should be able to capture and filter photos using this method. + +### Processing a still image ### + +There are a couple of ways to process a still image and create a result. The first way you can do this is by creating a still image source object and manually creating a filter chain: + + UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; + + GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; + GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; + + [stillImageSource addTarget:stillImageFilter]; + [stillImageFilter useNextFrameForImageCapture] + [stillImageSource processImage]; + + UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; + +Note that for a manual capture of an image from a filter, you need to set -useNextFrameForImageCapture in order to tell the filter that you'll be needing to capture from it later. By default, GPUImage reuses framebuffers within filters to conserve memory, so if you need to hold on to a filter's framebuffer for manual image capture, you need to let it know ahead of time. + +For single filters that you wish to apply to an image, you can simply do the following: + + GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; + UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; + + +### Writing a custom filter ### + +One significant advantage of this framework over Core Image on iOS (as of iOS 5.0) is the ability to write your own custom image and video processing filters. These filters are supplied as OpenGL ES 2.0 fragment shaders, written in the C-like OpenGL Shading Language. + +A custom filter is initialized with code like + + GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"]; + +where the extension used for the fragment shader is .fsh. Additionally, you can use the -initWithFragmentShaderFromString: initializer to provide the fragment shader as a string, if you would not like to ship your fragment shaders in your application bundle. + +Fragment shaders perform their calculations for each pixel to be rendered at that filter stage. They do this using the OpenGL Shading Language (GLSL), a C-like language with additions specific to 2-D and 3-D graphics. An example of a fragment shader is the following sepia-tone filter: + + varying highp vec2 textureCoordinate; + + uniform sampler2D inputImageTexture; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp vec4 outputColor; + outputColor.r = (textureColor.r * 0.393) + (textureColor.g * 0.769) + (textureColor.b * 0.189); + outputColor.g = (textureColor.r * 0.349) + (textureColor.g * 0.686) + (textureColor.b * 0.168); + outputColor.b = (textureColor.r * 0.272) + (textureColor.g * 0.534) + (textureColor.b * 0.131); + outputColor.a = 1.0; + + gl_FragColor = outputColor; + } + +For an image filter to be usable within the GPUImage framework, the first two lines that take in the textureCoordinate varying (for the current coordinate within the texture, normalized to 1.0) and the inputImageTexture uniform (for the actual input image frame texture) are required. + +The remainder of the shader grabs the color of the pixel at this location in the passed-in texture, manipulates it in such a way as to produce a sepia tone, and writes that pixel color out to be used in the next stage of the processing pipeline. + +One thing to note when adding fragment shaders to your Xcode project is that Xcode thinks they are source code files. To work around this, you'll need to manually move your shader from the Compile Sources build phase to the Copy Bundle Resources one in order to get the shader to be included in your application bundle. + + +### Filtering and re-encoding a movie ### + +Movies can be loaded into the framework via the GPUImageMovie class, filtered, and then written out using a GPUImageMovieWriter. GPUImageMovieWriter is also fast enough to record video in realtime from an iPhone 4's camera at 640x480, so a direct filtered video source can be fed into it. Currently, GPUImageMovieWriter is fast enough to record live 720p video at up to 20 FPS on the iPhone 4, and both 720p and 1080p video at 30 FPS on the iPhone 4S (as well as on the new iPad). + +The following is an example of how you would load a sample movie, pass it through a pixellation filter, then record the result to disk as a 480 x 640 h.264 movie: + + movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; + pixellateFilter = [[GPUImagePixellateFilter alloc] init]; + + [movieFile addTarget:pixellateFilter]; + + NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; + unlink([pathToMovie UTF8String]); + NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; + + movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; + [pixellateFilter addTarget:movieWriter]; + + movieWriter.shouldPassthroughAudio = YES; + movieFile.audioEncodingTarget = movieWriter; + [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter]; + + [movieWriter startRecording]; + [movieFile startProcessing]; + +Once recording is finished, you need to remove the movie recorder from the filter chain and close off the recording using code like the following: + + [pixellateFilter removeTarget:movieWriter]; + [movieWriter finishRecording]; + +A movie won't be usable until it has been finished off, so if this is interrupted before this point, the recording will be lost. + +### Interacting with OpenGL ES ### + +GPUImage can both export and import textures from OpenGL ES through the use of its GPUImageTextureOutput and GPUImageTextureInput classes, respectively. This lets you record a movie from an OpenGL ES scene that is rendered to a framebuffer object with a bound texture, or filter video or images and then feed them into OpenGL ES as a texture to be displayed in the scene. + +The one caution with this approach is that the textures used in these processes must be shared between GPUImage's OpenGL ES context and any other context via a share group or something similar. + ## Built-in filters ## There are currently 125 built-in filters, divided into the following categories: @@ -483,196 +672,7 @@ There are currently 125 built-in filters, divided into the following categories: - **GPUImageVoronoiConsumerFilter**: Takes in the Voronoi map, and uses that to filter an incoming image. - *sizeInPixels*: Size of the individual elements -You can also easily write your own custom filters using the C-like OpenGL Shading Language, as described below. - -## Adding the framework to your iOS project ## - -Once you have the latest source code for the framework, it's fairly straightforward to add it to your application. Start by dragging the GPUImage.xcodeproj file into your application's Xcode project to embed the framework in your project. Next, go to your application's target and add GPUImage as a Target Dependency. Finally, you'll want to drag the libGPUImage.a library from the GPUImage framework's Products folder to the Link Binary With Libraries build phase in your application's target. - -GPUImage needs a few other frameworks to be linked into your application, so you'll need to add the following as linked libraries in your application target: - -- CoreMedia -- CoreVideo -- OpenGLES -- AVFoundation -- QuartzCore - -You'll also need to find the framework headers, so within your project's build settings set the Header Search Paths to the relative path from your application to the framework/ subdirectory within the GPUImage source directory. Make this header search path recursive. - -To use the GPUImage classes within your application, simply include the core framework header using the following: - - #import "GPUImage.h" - -As a note: if you run into the error "Unknown class GPUImageView in Interface Builder" or the like when trying to build an interface with Interface Builder, you may need to add -ObjC to your Other Linker Flags in your project's build settings. - -Also, if you need to deploy this to iOS 4.x, it appears that the current version of Xcode (4.3) requires that you weak-link the Core Video framework in your final application or you see crashes with the message "Symbol not found: _CVOpenGLESTextureCacheCreate" when you create an archive for upload to the App Store or for ad hoc distribution. To do this, go to your project's Build Phases tab, expand the Link Binary With Libraries group, and find CoreVideo.framework in the list. Change the setting for it in the far right of the list from Required to Optional. - -Additionally, this is an ARC-enabled framework, so if you want to use this within a manual reference counted application targeting iOS 4.x, you'll need to add -fobjc-arc to your Other Linker Flags as well. - -### Building static library at the command line ### - -If you don't want to include the project as a dependency in your application's Xcode project, you can build a universal static library for the iOS Simulator or device. To do this, run `build.sh` at the command line. The resulting library and header files will be located at `build/Release-iphone`. You may also change the version of the iOS SDK by changing the `IOSSDK_VER` variable in `build.sh` (all available versions can be found using `xcodebuild -showsdks`). - -## Performing common tasks ## - -### Filtering live video ### - -To filter live video from an iOS device's camera, you can use code like the following: - - GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; - videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; - - GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"]; - GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)]; - - // Add the view somewhere so it's visible - - [videoCamera addTarget:customFilter]; - [customFilter addTarget:filteredVideoView]; - - [videoCamera startCameraCapture]; - -This sets up a video source coming from the iOS device's back-facing camera, using a preset that tries to capture at 640x480. This video is captured with the interface being in portrait mode, where the landscape-left-mounted camera needs to have its video frames rotated before display. A custom filter, using code from the file CustomShader.fsh, is then set as the target for the video frames from the camera. These filtered video frames are finally displayed onscreen with the help of a UIView subclass that can present the filtered OpenGL ES texture that results from this pipeline. - -The fill mode of the GPUImageView can be altered by setting its fillMode property, so that if the aspect ratio of the source video is different from that of the view, the video will either be stretched, centered with black bars, or zoomed to fill. - -For blending filters and others that take in more than one image, you can create multiple outputs and add a single filter as a target for both of these outputs. The order with which the outputs are added as targets will affect the order in which the input images are blended or otherwise processed. - -Also, if you wish to enable microphone audio capture for recording to a movie, you'll need to set the audioEncodingTarget of the camera to be your movie writer, like for the following: - - videoCamera.audioEncodingTarget = movieWriter; - - -### Capturing and filtering a still photo ### - -To capture and filter still photos, you can use a process similar to the one for filtering video. Instead of a GPUImageVideoCamera, you use a GPUImageStillCamera: - - stillCamera = [[GPUImageStillCamera alloc] init]; - stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; - - filter = [[GPUImageGammaFilter alloc] init]; - [stillCamera addTarget:filter]; - GPUImageView *filterView = (GPUImageView *)self.view; - [filter addTarget:filterView]; - - [stillCamera startCameraCapture]; - -This will give you a live, filtered feed of the still camera's preview video. Note that this preview video is only provided on iOS 4.3 and higher, so you may need to set that as your deployment target if you wish to have this functionality. - -Once you want to capture a photo, you use a callback block like the following: - - [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ - NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); - - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - - NSError *error2 = nil; - if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) - { - return; - } - }]; - -The above code captures a full-size photo processed by the same filter chain used in the preview view and saves that photo to disk as a JPEG in the application's documents directory. - -Note that the framework currently can't handle images larger than 2048 pixels wide or high on older devices (those before the iPhone 4S, iPad 2, or Retina iPad) due to texture size limitations. This means that the iPhone 4, whose camera outputs still photos larger than this, won't be able to capture photos like this. A tiling mechanism is being implemented to work around this. All other devices should be able to capture and filter photos using this method. - -### Processing a still image ### - -There are a couple of ways to process a still image and create a result. The first way you can do this is by creating a still image source object and manually creating a filter chain: - - UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; - - GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; - GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; - - [stillImageSource addTarget:stillImageFilter]; - [stillImageFilter useNextFrameForImageCapture] - [stillImageSource processImage]; - - UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; - -Note that for a manual capture of an image from a filter, you need to set -useNextFrameForImageCapture in order to tell the filter that you'll be needing to capture from it later. By default, GPUImage reuses framebuffers within filters to conserve memory, so if you need to hold on to a filter's framebuffer for manual image capture, you need to let it know ahead of time. - -For single filters that you wish to apply to an image, you can simply do the following: - - GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init]; - UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage]; - - -### Writing a custom filter ### - -One significant advantage of this framework over Core Image on iOS (as of iOS 5.0) is the ability to write your own custom image and video processing filters. These filters are supplied as OpenGL ES 2.0 fragment shaders, written in the C-like OpenGL Shading Language. - -A custom filter is initialized with code like - - GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"]; - -where the extension used for the fragment shader is .fsh. Additionally, you can use the -initWithFragmentShaderFromString: initializer to provide the fragment shader as a string, if you would not like to ship your fragment shaders in your application bundle. - -Fragment shaders perform their calculations for each pixel to be rendered at that filter stage. They do this using the OpenGL Shading Language (GLSL), a C-like language with additions specific to 2-D and 3-D graphics. An example of a fragment shader is the following sepia-tone filter: - - varying highp vec2 textureCoordinate; - - uniform sampler2D inputImageTexture; - - void main() - { - lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); - lowp vec4 outputColor; - outputColor.r = (textureColor.r * 0.393) + (textureColor.g * 0.769) + (textureColor.b * 0.189); - outputColor.g = (textureColor.r * 0.349) + (textureColor.g * 0.686) + (textureColor.b * 0.168); - outputColor.b = (textureColor.r * 0.272) + (textureColor.g * 0.534) + (textureColor.b * 0.131); - outputColor.a = 1.0; - - gl_FragColor = outputColor; - } - -For an image filter to be usable within the GPUImage framework, the first two lines that take in the textureCoordinate varying (for the current coordinate within the texture, normalized to 1.0) and the inputImageTexture uniform (for the actual input image frame texture) are required. - -The remainder of the shader grabs the color of the pixel at this location in the passed-in texture, manipulates it in such a way as to produce a sepia tone, and writes that pixel color out to be used in the next stage of the processing pipeline. - -One thing to note when adding fragment shaders to your Xcode project is that Xcode thinks they are source code files. To work around this, you'll need to manually move your shader from the Compile Sources build phase to the Copy Bundle Resources one in order to get the shader to be included in your application bundle. - - -### Filtering and re-encoding a movie ### - -Movies can be loaded into the framework via the GPUImageMovie class, filtered, and then written out using a GPUImageMovieWriter. GPUImageMovieWriter is also fast enough to record video in realtime from an iPhone 4's camera at 640x480, so a direct filtered video source can be fed into it. Currently, GPUImageMovieWriter is fast enough to record live 720p video at up to 20 FPS on the iPhone 4, and both 720p and 1080p video at 30 FPS on the iPhone 4S (as well as on the new iPad). - -The following is an example of how you would load a sample movie, pass it through a pixellation filter, then record the result to disk as a 480 x 640 h.264 movie: - - movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; - pixellateFilter = [[GPUImagePixellateFilter alloc] init]; - - [movieFile addTarget:pixellateFilter]; - - NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; - unlink([pathToMovie UTF8String]); - NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; - - movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; - [pixellateFilter addTarget:movieWriter]; - - movieWriter.shouldPassthroughAudio = YES; - movieFile.audioEncodingTarget = movieWriter; - [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter]; - - [movieWriter startRecording]; - [movieFile startProcessing]; - -Once recording is finished, you need to remove the movie recorder from the filter chain and close off the recording using code like the following: - - [pixellateFilter removeTarget:movieWriter]; - [movieWriter finishRecording]; - -A movie won't be usable until it has been finished off, so if this is interrupted before this point, the recording will be lost. - -### Interacting with OpenGL ES ### - -GPUImage can both export and import textures from OpenGL ES through the use of its GPUImageTextureOutput and GPUImageTextureInput classes, respectively. This lets you record a movie from an OpenGL ES scene that is rendered to a framebuffer object with a bound texture, or filter video or images and then feed them into OpenGL ES as a texture to be displayed in the scene. - -The one caution with this approach is that the textures used in these processes must be shared between GPUImage's OpenGL ES context and any other context via a share group or something similar. +You can also easily write your own custom filters using the C-like OpenGL Shading Language, as described above. ## Sample applications ## diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index af06cb981..99b7a1c7a 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -120,6 +120,7 @@ BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */; }; BC6ED9C21549CA0600966798 /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; }; BC6ED9C31549CA0600966798 /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; + BC73FC021944008500671325 /* GPUImageFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = BC73FC011944008500671325 /* GPUImageFramework.h */; }; BC76CE9B15813818008B45D3 /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; }; BC76CE9C15813818008B45D3 /* GPUImageSphereRefractionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */; }; BC7CC63515605A3500468085 /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; }; @@ -307,6 +308,331 @@ BCC94ABC151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */; }; BCC94CFA15101EB3002F9BC5 /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; }; BCC94CFB15101EB3002F9BC5 /* GPUImageTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */; }; + BCD81E8A194403FE007133DB /* GLProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E79214E3275100701302 /* GLProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E8B194403FE007133DB /* GPUImageContext.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76A14E20AD700701302 /* GPUImageContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E8D19440418007133DB /* GPUImageFramebuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC887CA18A1CEEB008DB37D /* GPUImageFramebuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E8E1944041B007133DB /* GPUImageFramebufferCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC887CE18A1D3AD008DB37D /* GPUImageFramebufferCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E8F19440425007133DB /* GPUImageOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E77D14E22E4200701302 /* GPUImageOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9019440428007133DB /* GPUImageVideoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E76314E208D600701302 /* GPUImageVideoCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E911944042B007133DB /* GPUImageStillCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7D95D31523EE67000DF037 /* GPUImageStillCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E921944042E007133DB /* GPUImagePicture.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7D814E6003400701302 /* GPUImagePicture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9319440430007133DB /* GPUImageMovie.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6A14F33C290001FF6F /* GPUImageMovie.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9419440432007133DB /* GPUImageMovieComposition.h in Headers */ = {isa = PBXBuildFile; fileRef = D443237817C81C0C00204484 /* GPUImageMovieComposition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9519440435007133DB /* GPUImageTextureInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D689153CC124009A1FE5 /* GPUImageTextureInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9619440438007133DB /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E640156AB332006B155F /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E971944043A007133DB /* GPUImageUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D8281579779700CC9C1E /* GPUImageUIElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E981944043F007133DB /* GPUImageFilterPipeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6948891501F58200206FF8 /* GPUImageFilterPipeline.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9919440442007133DB /* GPUImageFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DC814DDBED7009FE7EB /* GPUImageFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9A19440444007133DB /* GPUImageTwoInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC114896155AF65400F107AF /* GPUImageTwoInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9B19440453007133DB /* GPUImageThreeInputFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB030BC173400BC001A1A20 /* GPUImageThreeInputFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9C194404EB007133DB /* GPUImageTwoPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC93A1C1501E42E00958B26 /* GPUImageTwoPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9D194404EB007133DB /* GPUImageTwoPassTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690B6157C0C27009274F9 /* GPUImageTwoPassTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9E194404EB007133DB /* GPUImageFilterGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5B6151E83700006EFA5 /* GPUImageFilterGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81E9F194404EB007133DB /* GPUImage3x3TextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E830155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA0194404EB007133DB /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097616B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA1194404EB007133DB /* GPUImageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9D3159944AB00E0ED33 /* GPUImageBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA2194404EB007133DB /* GPUImageBrightnessFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7714F098CC0001FF6F /* GPUImageBrightnessFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA3194404EB007133DB /* GPUImageLevelsFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EF4E93162F85850036E5B3 /* GPUImageLevelsFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA4194404EB007133DB /* GPUImageExposureFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B833150400030041703B /* GPUImageExposureFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA5194404EB007133DB /* GPUImageContrastFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B6514F092EF0001FF6F /* GPUImageContrastFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA6194404EB007133DB /* GPUImageSaturationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B5114F07F790001FF6F /* GPUImageSaturationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA7194404EB007133DB /* GPUImageGammaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B7C14F09F980001FF6F /* GPUImageGammaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA8194404EB007133DB /* GPUImageColorMatrixFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81521A014F1BA6A00F105F8 /* GPUImageColorMatrixFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EA9194404EB007133DB /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EAA194404EB007133DB /* GPUImageHSBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B81F2D731788C95500118374 /* GPUImageHSBFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EAB194404EB007133DB /* GPUImageHueFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C2EDA90415BB136D007CBA0F /* GPUImageHueFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EAC194404EB007133DB /* GPUImageMonochromeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBCE9971595021B00E0ED33 /* GPUImageMonochromeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EAD194404EB007133DB /* GPUImageFalseColorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E6115BA095F005519B9 /* GPUImageFalseColorFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EAE194404EB007133DB /* GPUImageHazeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13DBE4151AA804000B23BA /* GPUImageHazeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EAF194404EB007133DB /* GPUImageSepiaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E7C014E4B6D400701302 /* GPUImageSepiaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB0194404EB007133DB /* GPUImageColorInvertFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B4F14F07F790001FF6F /* GPUImageColorInvertFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB1194404EB007133DB /* GPUImageGrayscaleFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE27491150E8FC50040DDB6 /* GPUImageGrayscaleFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB2194404EB007133DB /* GPUImageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94AB9151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB3194404EB007133DB /* GPUImageAdaptiveThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5CA151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB4194404EB007133DB /* GPUImageAverageLuminanceThresholdFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E7815EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB5194404EB007133DB /* GPUImageHistogramFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB6194404EB007133DB /* GPUImageHistogramGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB7194404EB007133DB /* GPUImageToneCurveFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB8194404EB007133DB /* GPUImageHighlightShadowFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EB9194404EB007133DB /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EBA194404EC007133DB /* GPUImageAmatorkaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B2D15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EBB194404EC007133DB /* GPUImageMissEtikateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B3215C39E80005FA0D7 /* GPUImageMissEtikateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EBC194404EC007133DB /* GPUImageSoftEleganceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96781B4415C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EBD194404EC007133DB /* GPUImageOpacityFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF6B40F15A7849F00FC6F58 /* GPUImageOpacityFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EBE194404EC007133DB /* GPUImageAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3AC8AE15E6F6170065144E /* GPUImageAverageColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EBF194404EC007133DB /* GPUImageLuminosity.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E5D15EC131A00965D92 /* GPUImageLuminosity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC0194404EC007133DB /* GPUImageSolidColorGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB79E0E15EBE1A600965D92 /* GPUImageSolidColorGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC1194404EC007133DB /* GPUImageChromaKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99234C15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC2194404EC007133DB /* GPUImageWhiteBalanceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC99235115EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC3194404EC007133DB /* GPUImageLuminanceRangeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8A584918131E4B00E6B507 /* GPUImageLuminanceRangeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC4194404EC007133DB /* GPUImageTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC94CF815101EB3002F9BC5 /* GPUImageTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC5194404EC007133DB /* GPUImageCropFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B9021507CA8C0041703B /* GPUImageCropFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC6194404EC007133DB /* GPUImageSharpenFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B835150400030041703B /* GPUImageSharpenFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC7194404EC007133DB /* GPUImageUnsharpMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E60E152156620006EFA5 /* GPUImageUnsharpMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC8194404EC007133DB /* GPUImageBoxBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5C5151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EC9194404EC007133DB /* GPUImageGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ECA194404EC007133DB /* GPUImageGaussianSelectiveBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D9D91AD15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ECB194404EC007133DB /* GPUImageGaussianBlurPositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7C16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ECC194404EC007133DB /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D0D15718ACF001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ECD194404EC007133DB /* GPUImageMedianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC01E82B155CA3F1004C75C3 /* GPUImageMedianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ECE194404ED007133DB /* GPUImageBilateralFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ECF194404ED007133DB /* GPUImageTiltShiftFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D6DB153CFF61009A1FE5 /* GPUImageTiltShiftFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED0194404ED007133DB /* GPUImage3x3ConvolutionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D708153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED1194404ED007133DB /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED2194404ED007133DB /* GPUImageSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982B9714F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED3194404ED007133DB /* GPUImageThresholdEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D720153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED4194404ED007133DB /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1215718F9A001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED5194404ED007133DB /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1A1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED6194404ED007133DB /* GPUImageWeakPixelInclusionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4D1E1571CB48001E50E1 /* GPUImageWeakPixelInclusionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED7194404ED007133DB /* GPUImageCannyEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D71B153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED8194404ED007133DB /* GPUImagePrewittEdgeDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0976154F39C900278521 /* GPUImagePrewittEdgeDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81ED9194404ED007133DB /* GPUImageXYDerivativeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097B154F3CAF00278521 /* GPUImageXYDerivativeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EDA194404ED007133DB /* GPUImageHarrisCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD097F154F7B2700278521 /* GPUImageHarrisCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EDB194404ED007133DB /* GPUImageNobleCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4CA1156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EDC194404EE007133DB /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD4C9C156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EDD194404EE007133DB /* GPUImageFASTCornerDetectionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1BBFA6193BC55B0025FC88 /* GPUImageFASTCornerDetectionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EDE194404EE007133DB /* GPUImageNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD099D15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EDF194404EE007133DB /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA6327F1623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE0194404EE007133DB /* GPUImageCrosshairGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7CC69A1562C4BA00468085 /* GPUImageCrosshairGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE1194404EE007133DB /* GPUImageDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D848157ADA4F00CC9C1E /* GPUImageDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE2194404EE007133DB /* GPUImageRGBDilationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690CE157C2EB9009274F9 /* GPUImageRGBDilationFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE3194404EE007133DB /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE4194404EE007133DB /* GPUImageRGBErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D3157C31C9009274F9 /* GPUImageRGBErosionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE5194404EE007133DB /* GPUImageOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BB157C1B37009274F9 /* GPUImageOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE6194404EE007133DB /* GPUImageRGBOpeningFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690D7157C33B8009274F9 /* GPUImageRGBOpeningFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE7194404EE007133DB /* GPUImageClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690BF157C2366009274F9 /* GPUImageClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE8194404EF007133DB /* GPUImageRGBClosingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690DB157C344B009274F9 /* GPUImageRGBClosingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EE9194404EF007133DB /* GPUImageColorPackingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0690F5157C5075009274F9 /* GPUImageColorPackingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EEA194404EF007133DB /* GPUImageLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EEB194404EF007133DB /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EEC194404EF007133DB /* GPUImageLowPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EED194404EF007133DB /* GPUImageHighPassFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B46815F2FD1B00EDA3BE /* GPUImageHighPassFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EEE194404EF007133DB /* GPUImageMotionDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB3B47715F3108700EDA3BE /* GPUImageMotionDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EEF194404EF007133DB /* GPUImageHoughTransformLineDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = BC95C4061622763D002C4BC7 /* GPUImageHoughTransformLineDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF0194404EF007133DB /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632841623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF1194404EF007133DB /* GPUImageLineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA464CA1627C1BC00C0F68E /* GPUImageLineGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF2194404F0007133DB /* GPUImageMotionBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC604B16C58B0900B11741 /* GPUImageMotionBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF3194404F0007133DB /* GPUImageZoomBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBC605516C8527C00B11741 /* GPUImageZoomBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF4194404F0007133DB /* GPUImageiOSBlurFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8A583A1813060F00E6B507 /* GPUImageiOSBlurFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF5194404F0007133DB /* GPUImageSourceOverBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4686952D155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF6194404F0007133DB /* GPUImageColorBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85015041A920041703B /* GPUImageColorBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF7194404F0007133DB /* GPUImageColorDodgeBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85215041A920041703B /* GPUImageColorDodgeBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF8194404F0007133DB /* GPUImageDarkenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7D14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EF9194404F0007133DB /* GPUImageDifferenceBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B868150423490041703B /* GPUImageDifferenceBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EFA194404F0007133DB /* GPUImageDissolveBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE714F1CE600001FF6F /* GPUImageDissolveBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EFB194404F1007133DB /* GPUImageExclusionBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86A1504234A0041703B /* GPUImageExclusionBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EFC194404F1007133DB /* GPUImageHardLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86C1504234A0041703B /* GPUImageHardLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EFD194404F1007133DB /* GPUImageSoftLightBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B86E1504234A0041703B /* GPUImageSoftLightBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EFE194404F1007133DB /* GPUImageLightenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C7F14F34F0C0001FF6F /* GPUImageLightenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81EFF194404F1007133DB /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F00194404F1007133DB /* GPUImageSubtractBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9F961540DFE400F7FC13 /* GPUImageSubtractBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F01194404F1007133DB /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F02194404F1007133DB /* GPUImageMultiplyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982BE914F1CE600001FF6F /* GPUImageMultiplyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F03194404F2007133DB /* GPUImageOverlayBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C6C14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F04194404F2007133DB /* GPUImageScreenBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B85415041A920041703B /* GPUImageScreenBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F05194404F2007133DB /* GPUImageChromaKeyBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC54D561151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F06194404F2007133DB /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAD0983154F931C00278521 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F07194404F2007133DB /* GPUImageNormalBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4308B1D515F7EED10014437A /* GPUImageNormalBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F08194404F2007133DB /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F09194404F2007133DB /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F0A194404F2007133DB /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F0B194404F3007133DB /* GPUImageLuminosityBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B801722D16313151001C8D16 /* GPUImageLuminosityBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F0C194404F3007133DB /* GPUImageLinearBurnBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E7816B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F0D194404F3007133DB /* GPUImagePoissonBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A8097B16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F0E194404F3007133DB /* GPUImageMaskFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AE9FCB1540E92800F7FC13 /* GPUImageMaskFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F0F194404F3007133DB /* GPUImagePerlinNoiseFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC27A3C915654F5A004F2D45 /* GPUImagePerlinNoiseFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F10194404F3007133DB /* GPUImagePixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5DE0B14E87F32000AF3C2 /* GPUImagePixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F11194404F3007133DB /* GPUImagePixellatePositionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC185E8016B866F000EA01AD /* GPUImagePixellatePositionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F12194404F4007133DB /* GPUImagePolkaDotFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF851B815CF29B3000EBC8B /* GPUImagePolkaDotFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F13194404F4007133DB /* GPUImageHalftoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4D03CD160919AE00F64358 /* GPUImageHalftoneFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F14194404F4007133DB /* GPUImagePolarPixellateFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8A15263CF20098A93E /* GPUImagePolarPixellateFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F15194404F4007133DB /* GPUImageCrosshatchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E669152368130006EFA5 /* GPUImageCrosshatchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F16194404F4007133DB /* GPUImageSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B717A14F566E200ACA2AB /* GPUImageSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F17194404F4007133DB /* GPUImageThresholdSketchFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA632881623DD0E00EEB24F /* GPUImageThresholdSketchFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F18194404F4007133DB /* GPUImageEmbossFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D70D153DF9E6009A1FE5 /* GPUImageEmbossFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F19194404F5007133DB /* GPUImageToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C9D14F35C2D0001FF6F /* GPUImageToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F1A194404F5007133DB /* GPUImageSmoothToonFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF3D72E153F0D6E009A1FE5 /* GPUImageSmoothToonFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F1B194404F5007133DB /* GPUImageCGAColorspaceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E667152368130006EFA5 /* GPUImageCGAColorspaceFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F1C194404F5007133DB /* GPUImagePosterizeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E5A6151E74B20006EFA5 /* GPUImagePosterizeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F1D194404F5007133DB /* GPUImageSwirlFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B718C14F56C1D00ACA2AB /* GPUImageSwirlFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F1E194404F5007133DB /* GPUImageBulgeDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E631152239090006EFA5 /* GPUImageBulgeDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F1F194404F6007133DB /* GPUImagePinchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1E636152243620006EFA5 /* GPUImagePinchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F20194404F6007133DB /* GPUImageStretchDistortionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCABED8C15263CF20098A93E /* GPUImageStretchDistortionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F21194404F6007133DB /* GPUImageSphereRefractionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F22194404F6007133DB /* GPUImageGlassSphereFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0147E215BEFE6800FC2B6D /* GPUImageGlassSphereFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F23194404F6007133DB /* GPUImageKuwaharaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC982C4514F29E580001FF6F /* GPUImageKuwaharaFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F24194404F6007133DB /* GPUImageKuwaharaRadius3Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF617816E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F25194404F7007133DB /* GPUImageVignetteFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF3FA2914FA00C9006AF7D9 /* GPUImageVignetteFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F26194404F7007133DB /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F27194404F7007133DB /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F28194404F7007133DB /* GPUImageVoronoiConsumerFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53E15669907006B155F /* GPUImageVoronoiConsumerFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F29194404F7007133DB /* GPUImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5E75A14E2086300701302 /* GPUImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F2A194404F7007133DB /* GPUImageMovieWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B727F14FB16AF00ACA2AB /* GPUImageMovieWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F2B194404F8007133DB /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F2C194404F8007133DB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BCD81F2D19440604007133DB /* GLProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E79314E3275200701302 /* GLProgram.m */; }; + BCD81F2E19440604007133DB /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageContext.m */; }; + BCD81F2F19440604007133DB /* GPUImageFramebuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC887CB18A1CEEB008DB37D /* GPUImageFramebuffer.m */; }; + BCD81F3019440604007133DB /* GPUImageFramebufferCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC887CF18A1D3AD008DB37D /* GPUImageFramebufferCache.m */; }; + BCD81F3119440604007133DB /* GPUImageOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E77E14E22E4200701302 /* GPUImageOutput.m */; }; + BCD81F3219440604007133DB /* GPUImageVideoCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76414E208D600701302 /* GPUImageVideoCamera.m */; }; + BCD81F3319440604007133DB /* GPUImageStillCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7D95D41523EE67000DF037 /* GPUImageStillCamera.m */; }; + BCD81F3419440604007133DB /* GPUImagePicture.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7D914E6003400701302 /* GPUImagePicture.m */; }; + BCD81F3519440604007133DB /* GPUImageMovie.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6B14F33C2A0001FF6F /* GPUImageMovie.m */; }; + BCD81F3619440604007133DB /* GPUImageMovieComposition.m in Sources */ = {isa = PBXBuildFile; fileRef = D443237917C81C0C00204484 /* GPUImageMovieComposition.m */; }; + BCD81F3719440604007133DB /* GPUImageTextureInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D68A153CC124009A1FE5 /* GPUImageTextureInput.m */; }; + BCD81F3819440604007133DB /* GPUImageRawDataInput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E641156AB332006B155F /* GPUImageRawDataInput.m */; }; + BCD81F3919440604007133DB /* GPUImageUIElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D8291579779700CC9C1E /* GPUImageUIElement.m */; }; + BCD81F3A19440604007133DB /* GPUImageFilterPipeline.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D69488A1501F58200206FF8 /* GPUImageFilterPipeline.m */; }; + BCD81F3B19440604007133DB /* GPUImageFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC245DC914DDBED7009FE7EB /* GPUImageFilter.m */; }; + BCD81F3C19440604007133DB /* GPUImageTwoInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC114897155AF65400F107AF /* GPUImageTwoInputFilter.m */; }; + BCD81F3D19440604007133DB /* GPUImageThreeInputFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB030BD173400BC001A1A20 /* GPUImageThreeInputFilter.m */; }; + BCD81F3E19440604007133DB /* GPUImageTwoPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC93A1D1501E42F00958B26 /* GPUImageTwoPassFilter.m */; }; + BCD81F3F19440604007133DB /* GPUImageTwoPassTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690B7157C0C28009274F9 /* GPUImageTwoPassTextureSamplingFilter.m */; }; + BCD81F4019440604007133DB /* GPUImageFilterGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5B7151E83700006EFA5 /* GPUImageFilterGroup.m */; }; + BCD81F4119440604007133DB /* GPUImage3x3TextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E831155CA5E1004C75C3 /* GPUImage3x3TextureSamplingFilter.m */; }; + BCD81F4219440604007133DB /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097716B8A48E000C29ED /* GPUImageTwoInputCrossTextureSamplingFilter.m */; }; + BCD81F4319440604007133DB /* GPUImageBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9D4159944AB00E0ED33 /* GPUImageBuffer.m */; }; + BCD81F4419440604007133DB /* GPUImageBrightnessFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7814F098CC0001FF6F /* GPUImageBrightnessFilter.m */; }; + BCD81F4519440604007133DB /* GPUImageLevelsFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B8EF4E94162F85850036E5B3 /* GPUImageLevelsFilter.m */; }; + BCD81F4619440604007133DB /* GPUImageExposureFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B834150400030041703B /* GPUImageExposureFilter.m */; }; + BCD81F4719440604007133DB /* GPUImageContrastFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B6614F092EF0001FF6F /* GPUImageContrastFilter.m */; }; + BCD81F4819440604007133DB /* GPUImageSaturationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5214F07F790001FF6F /* GPUImageSaturationFilter.m */; }; + BCD81F4919440604007133DB /* GPUImageGammaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B7D14F09F980001FF6F /* GPUImageGammaFilter.m */; }; + BCD81F4A19440604007133DB /* GPUImageColorMatrixFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81521A114F1BA6A00F105F8 /* GPUImageColorMatrixFilter.m */; }; + BCD81F4B19440604007133DB /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; }; + BCD81F4C19440604007133DB /* GPUImageHSBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B81F2D741788C95500118374 /* GPUImageHSBFilter.m */; }; + BCD81F4D19440604007133DB /* GPUImageHueFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C2EDA90515BB136D007CBA0F /* GPUImageHueFilter.m */; }; + BCD81F4E19440604007133DB /* GPUImageMonochromeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBCE9981595021B00E0ED33 /* GPUImageMonochromeFilter.m */; }; + BCD81F4F19440604007133DB /* GPUImageFalseColorFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E6215BA095F005519B9 /* GPUImageFalseColorFilter.m */; }; + BCD81F5019440604007133DB /* GPUImageHazeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D13DBE5151AA804000B23BA /* GPUImageHazeFilter.m */; }; + BCD81F5119440604007133DB /* GPUImageSepiaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E7C114E4B6D400701302 /* GPUImageSepiaFilter.m */; }; + BCD81F5219440604007133DB /* GPUImageColorInvertFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B5014F07F790001FF6F /* GPUImageColorInvertFilter.m */; }; + BCD81F5319440604007133DB /* GPUImageGrayscaleFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EE27492150E8FC50040DDB6 /* GPUImageGrayscaleFilter.m */; }; + BCD81F5419440604007133DB /* GPUImageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94ABA151E4FD6008554B4 /* GPUImageLuminanceThresholdFilter.m */; }; + BCD81F5519440604007133DB /* GPUImageAdaptiveThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5CB151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.m */; }; + BCD81F5619440604007133DB /* GPUImageAverageLuminanceThresholdFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E7915EC2A8300965D92 /* GPUImageAverageLuminanceThresholdFilter.m */; }; + BCD81F5719440604007133DB /* GPUImageHistogramFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */; }; + BCD81F5819440604007133DB /* GPUImageHistogramGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */; }; + BCD81F5919440604007133DB /* GPUImageToneCurveFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */; }; + BCD81F5A19440604007133DB /* GPUImageHighlightShadowFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC46E5D15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.m */; }; + BCD81F5B19440604007133DB /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; + BCD81F5C19440604007133DB /* GPUImageAmatorkaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B2E15C38DCF005FA0D7 /* GPUImageAmatorkaFilter.m */; }; + BCD81F5D19440604007133DB /* GPUImageMissEtikateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B3315C39E80005FA0D7 /* GPUImageMissEtikateFilter.m */; }; + BCD81F5E19440604007133DB /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; + BCD81F5F19440604007133DB /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6B41015A7849F00FC6F58 /* GPUImageOpacityFilter.m */; }; + BCD81F6019440604007133DB /* GPUImageAverageColor.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3AC8AF15E6F6170065144E /* GPUImageAverageColor.m */; }; + BCD81F6119440604007133DB /* GPUImageLuminosity.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E5E15EC131A00965D92 /* GPUImageLuminosity.m */; }; + BCD81F6219440604007133DB /* GPUImageSolidColorGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB79E0F15EBE1A600965D92 /* GPUImageSolidColorGenerator.m */; }; + BCD81F6319440604007133DB /* GPUImageChromaKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99234D15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m */; }; + BCD81F6419440604007133DB /* GPUImageWhiteBalanceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99235215EFFC9700ED2C8C /* GPUImageWhiteBalanceFilter.m */; }; + BCD81F6519440604007133DB /* GPUImageLuminanceRangeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8A584A18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.m */; }; + BCD81F6619440604007133DB /* GPUImageTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC94CF915101EB3002F9BC5 /* GPUImageTransformFilter.m */; }; + BCD81F6719440604007133DB /* GPUImageCropFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B9031507CA8C0041703B /* GPUImageCropFilter.m */; }; + BCD81F6819440604007133DB /* GPUImageSharpenFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B836150400030041703B /* GPUImageSharpenFilter.m */; }; + BCD81F6919440604007133DB /* GPUImageUnsharpMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E60F152156620006EFA5 /* GPUImageUnsharpMaskFilter.m */; }; + BCD81F6A19440604007133DB /* GPUImageBoxBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5C6151EA12B0006EFA5 /* GPUImageBoxBlurFilter.m */; }; + BCD81F6B19440604007133DB /* GPUImageGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */; }; + BCD81F6C19440604007133DB /* GPUImageGaussianSelectiveBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D91AE15011CA200A5BC83 /* GPUImageGaussianSelectiveBlurFilter.m */; }; + BCD81F6D19440604007133DB /* GPUImageGaussianBlurPositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7D16B866CE00EA01AD /* GPUImageGaussianBlurPositionFilter.m */; }; + BCD81F6E19440604007133DB /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D0E15718AD0001E50E1 /* GPUImageSingleComponentGaussianBlurFilter.m */; }; + BCD81F6F19440604007133DB /* GPUImageMedianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC01E82C155CA3F1004C75C3 /* GPUImageMedianFilter.m */; }; + BCD81F7019440604007133DB /* GPUImageBilateralFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC63415605A3500468085 /* GPUImageBilateralFilter.m */; }; + BCD81F7119440604007133DB /* GPUImageTiltShiftFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D6DC153CFF61009A1FE5 /* GPUImageTiltShiftFilter.m */; }; + BCD81F7219440604007133DB /* GPUImage3x3ConvolutionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D709153DCC9A009A1FE5 /* GPUImage3x3ConvolutionFilter.m */; }; + BCD81F7319440604007133DB /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */; }; + BCD81F7419440604007133DB /* GPUImageSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982B9814F0B34E0001FF6F /* GPUImageSobelEdgeDetectionFilter.m */; }; + BCD81F7519440604007133DB /* GPUImageThresholdEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D721153E0E0B009A1FE5 /* GPUImageThresholdEdgeDetectionFilter.m */; }; + BCD81F7619440604007133DB /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1315718F9C001E50E1 /* GPUimageDirectionalSobelEdgeDetectionFilter.m */; }; + BCD81F7719440604007133DB /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1B1571B410001E50E1 /* GPUImageDirectionalNonMaximumSuppressionFilter.m */; }; + BCD81F7819440604007133DB /* GPUImageWeakPixelInclusionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4D1F1571CB4C001E50E1 /* GPUImageWeakPixelInclusionFilter.m */; }; + BCD81F7919440604007133DB /* GPUImageCannyEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D71C153E06C3009A1FE5 /* GPUImageCannyEdgeDetectionFilter.m */; }; + BCD81F7A19440604007133DB /* GPUImagePrewittEdgeDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0977154F39CA00278521 /* GPUImagePrewittEdgeDetectionFilter.m */; }; + BCD81F7B19440604007133DB /* GPUImageXYDerivativeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD097C154F3CB000278521 /* GPUImageXYDerivativeFilter.m */; }; + BCD81F7C19440604007133DB /* GPUImageHarrisCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0980154F7B2800278521 /* GPUImageHarrisCornerDetectionFilter.m */; }; + BCD81F7D19440604007133DB /* GPUImageNobleCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4CA2156F0F35001E50E1 /* GPUImageNobleCornerDetectionFilter.m */; }; + BCD81F7E19440604007133DB /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD4C9D156F0D8E001E50E1 /* GPUImageShiTomasiFeatureDetectionFilter.m */; }; + BCD81F7F19440604007133DB /* GPUImageFASTCornerDetectionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1BBFA7193BC55B0025FC88 /* GPUImageFASTCornerDetectionFilter.m */; }; + BCD81F8019440604007133DB /* GPUImageNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD099E15506F6E00278521 /* GPUImageNonMaximumSuppressionFilter.m */; }; + BCD81F8119440604007133DB /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632801623C80800EEB24F /* GPUImageThresholdedNonMaximumSuppressionFilter.m */; }; + BCD81F8219440604007133DB /* GPUImageCrosshairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CC69B1562C4BA00468085 /* GPUImageCrosshairGenerator.m */; }; + BCD81F8319440604007133DB /* GPUImageDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */; }; + BCD81F8419440604007133DB /* GPUImageRGBDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690CF157C2EBA009274F9 /* GPUImageRGBDilationFilter.m */; }; + BCD81F8519440604007133DB /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; + BCD81F8619440604007133DB /* GPUImageRGBErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D4157C31C9009274F9 /* GPUImageRGBErosionFilter.m */; }; + BCD81F8719440604007133DB /* GPUImageOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690BC157C1B38009274F9 /* GPUImageOpeningFilter.m */; }; + BCD81F8819440604007133DB /* GPUImageRGBOpeningFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690D8157C33B8009274F9 /* GPUImageRGBOpeningFilter.m */; }; + BCD81F8919440604007133DB /* GPUImageClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690C0157C2367009274F9 /* GPUImageClosingFilter.m */; }; + BCD81F8A19440604007133DB /* GPUImageRGBClosingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690DC157C344C009274F9 /* GPUImageRGBClosingFilter.m */; }; + BCD81F8B19440604007133DB /* GPUImageColorPackingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0690F6157C5075009274F9 /* GPUImageColorPackingFilter.m */; }; + BCD81F8C19440605007133DB /* GPUImageLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */; }; + BCD81F8D19440605007133DB /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; }; + BCD81F8E19440605007133DB /* GPUImageLowPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46415F2BA9300EDA3BE /* GPUImageLowPassFilter.m */; }; + BCD81F8F19440605007133DB /* GPUImageHighPassFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B46915F2FD1B00EDA3BE /* GPUImageHighPassFilter.m */; }; + BCD81F9019440605007133DB /* GPUImageMotionDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3B47815F3108700EDA3BE /* GPUImageMotionDetector.m */; }; + BCD81F9119440605007133DB /* GPUImageHoughTransformLineDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = BC95C4071622763D002C4BC7 /* GPUImageHoughTransformLineDetector.m */; }; + BCD81F9219440605007133DB /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632851623D18B00EEB24F /* GPUImageParallelCoordinateLineTransformFilter.m */; }; + BCD81F9319440605007133DB /* GPUImageLineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA464CB1627C1BC00C0F68E /* GPUImageLineGenerator.m */; }; + BCD81F9419440605007133DB /* GPUImageMotionBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC604C16C58B0900B11741 /* GPUImageMotionBlurFilter.m */; }; + BCD81F9519440605007133DB /* GPUImageZoomBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC605616C8527C00B11741 /* GPUImageZoomBlurFilter.m */; }; + BCD81F9619440605007133DB /* GPUImageiOSBlurFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8A583B1813060F00E6B507 /* GPUImageiOSBlurFilter.m */; }; + BCD81F9719440605007133DB /* GPUImageSourceOverBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4686952E155AACAC0060BA43 /* GPUImageSourceOverBlendFilter.m */; }; + BCD81F9819440605007133DB /* GPUImageColorBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85115041A920041703B /* GPUImageColorBurnBlendFilter.m */; }; + BCD81F9919440605007133DB /* GPUImageColorDodgeBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85315041A920041703B /* GPUImageColorDodgeBlendFilter.m */; }; + BCD81F9A19440605007133DB /* GPUImageDarkenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C7E14F34F0B0001FF6F /* GPUImageDarkenBlendFilter.m */; }; + BCD81F9B19440605007133DB /* GPUImageDifferenceBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8691504234A0041703B /* GPUImageDifferenceBlendFilter.m */; }; + BCD81F9C19440605007133DB /* GPUImageDissolveBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BE814F1CE600001FF6F /* GPUImageDissolveBlendFilter.m */; }; + BCD81F9D19440605007133DB /* GPUImageExclusionBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86B1504234A0041703B /* GPUImageExclusionBlendFilter.m */; }; + BCD81F9E19440605007133DB /* GPUImageHardLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86D1504234A0041703B /* GPUImageHardLightBlendFilter.m */; }; + BCD81F9F19440605007133DB /* GPUImageSoftLightBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B86F1504234A0041703B /* GPUImageSoftLightBlendFilter.m */; }; + BCD81FA019440605007133DB /* GPUImageLightenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C8014F34F0C0001FF6F /* GPUImageLightenBlendFilter.m */; }; + BCD81FA119440605007133DB /* GPUImageAddBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */; }; + BCD81FA219440605007133DB /* GPUImageSubtractBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9F971540DFE500F7FC13 /* GPUImageSubtractBlendFilter.m */; }; + BCD81FA319440605007133DB /* GPUImageDivideBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */; }; + BCD81FA419440605007133DB /* GPUImageMultiplyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982BEA14F1CE600001FF6F /* GPUImageMultiplyBlendFilter.m */; }; + BCD81FA519440605007133DB /* GPUImageOverlayBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C6D14F33C2A0001FF6F /* GPUImageOverlayBlendFilter.m */; }; + BCD81FA619440605007133DB /* GPUImageScreenBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B85515041A920041703B /* GPUImageScreenBlendFilter.m */; }; + BCD81FA719440605007133DB /* GPUImageChromaKeyBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC54D562151904FF003F4A41 /* GPUImageChromaKeyBlendFilter.m */; }; + BCD81FA819440605007133DB /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0984154F931C00278521 /* GPUImageAlphaBlendFilter.m */; }; + BCD81FA919440605007133DB /* GPUImageNormalBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4308B1D615F7EED20014437A /* GPUImageNormalBlendFilter.m */; }; + BCD81FAA19440605007133DB /* GPUImageColorBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = C04C8D1615F8059F00449601 /* GPUImageColorBlendFilter.m */; }; + BCD81FAB19440605007133DB /* GPUImageHueBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */; }; + BCD81FAC19440605007133DB /* GPUImageSaturationBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171FD16312800001C8D16 /* GPUImageSaturationBlendFilter.m */; }; + BCD81FAD19440605007133DB /* GPUImageLuminosityBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B801722E16313151001C8D16 /* GPUImageLuminosityBlendFilter.m */; }; + BCD81FAE19440605007133DB /* GPUImageLinearBurnBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E7916B866AD00EA01AD /* GPUImageLinearBurnBlendFilter.m */; }; + BCD81FAF19440605007133DB /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */; }; + BCD81FB019440605007133DB /* GPUImageMaskFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 83AE9FCC1540E92800F7FC13 /* GPUImageMaskFilter.m */; }; + BCD81FB119440605007133DB /* GPUImagePerlinNoiseFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A3CA15654F5A004F2D45 /* GPUImagePerlinNoiseFilter.m */; }; + BCD81FB219440605007133DB /* GPUImagePixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5DE0C14E87F32000AF3C2 /* GPUImagePixellateFilter.m */; }; + BCD81FB319440605007133DB /* GPUImagePixellatePositionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC185E8116B866F000EA01AD /* GPUImagePixellatePositionFilter.m */; }; + BCD81FB419440605007133DB /* GPUImagePolkaDotFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF851B915CF29B3000EBC8B /* GPUImagePolkaDotFilter.m */; }; + BCD81FB519440605007133DB /* GPUImageHalftoneFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4D03CE160919AE00F64358 /* GPUImageHalftoneFilter.m */; }; + BCD81FB619440605007133DB /* GPUImagePolarPixellateFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8B15263CF20098A93E /* GPUImagePolarPixellateFilter.m */; }; + BCD81FB719440605007133DB /* GPUImageCrosshatchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E66A152368130006EFA5 /* GPUImageCrosshatchFilter.m */; }; + BCD81FB819440605007133DB /* GPUImageSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B717B14F566E200ACA2AB /* GPUImageSketchFilter.m */; }; + BCD81FB919440605007133DB /* GPUImageThresholdSketchFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA632891623DD0E00EEB24F /* GPUImageThresholdSketchFilter.m */; }; + BCD81FBA19440605007133DB /* GPUImageEmbossFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D70E153DF9E6009A1FE5 /* GPUImageEmbossFilter.m */; }; + BCD81FBB19440605007133DB /* GPUImageToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C9E14F35C2D0001FF6F /* GPUImageToonFilter.m */; }; + BCD81FBC19440605007133DB /* GPUImageSmoothToonFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF3D72F153F0D6F009A1FE5 /* GPUImageSmoothToonFilter.m */; }; + BCD81FBD19440605007133DB /* GPUImageCGAColorspaceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E67B152368840006EFA5 /* GPUImageCGAColorspaceFilter.m */; }; + BCD81FBE19440605007133DB /* GPUImagePosterizeFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E5A7151E74B20006EFA5 /* GPUImagePosterizeFilter.m */; }; + BCD81FBF19440605007133DB /* GPUImageSwirlFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B718D14F56C1D00ACA2AB /* GPUImageSwirlFilter.m */; }; + BCD81FC019440605007133DB /* GPUImageBulgeDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E632152239090006EFA5 /* GPUImageBulgeDistortionFilter.m */; }; + BCD81FC119440605007133DB /* GPUImagePinchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC1E637152243620006EFA5 /* GPUImagePinchDistortionFilter.m */; }; + BCD81FC219440605007133DB /* GPUImageStretchDistortionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCABED8D15263CF20098A93E /* GPUImageStretchDistortionFilter.m */; }; + BCD81FC319440605007133DB /* GPUImageSphereRefractionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */; }; + BCD81FC419440605007133DB /* GPUImageGlassSphereFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0147E315BEFE6800FC2B6D /* GPUImageGlassSphereFilter.m */; }; + BCD81FC519440606007133DB /* GPUImageKuwaharaFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC982C4614F29E580001FF6F /* GPUImageKuwaharaFilter.m */; }; + BCD81FC619440606007133DB /* GPUImageKuwaharaRadius3Filter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBF617916E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.m */; }; + BCD81FC719440606007133DB /* GPUImageVignetteFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF3FA2A14FA00C9006AF7D9 /* GPUImageVignetteFilter.m */; }; + BCD81FC819440606007133DB /* GPUImageJFAVoronoiFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */; }; + BCD81FC919440606007133DB /* GPUImageMosaicFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53D15669907006B155F /* GPUImageMosaicFilter.m */; }; + BCD81FCA19440606007133DB /* GPUImageVoronoiConsumerFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53F15669907006B155F /* GPUImageVoronoiConsumerFilter.m */; }; + BCD81FCB19440606007133DB /* GPUImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E75B14E2086300701302 /* GPUImageView.m */; }; + BCD81FCC19440606007133DB /* GPUImageMovieWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B728014FB16AF00ACA2AB /* GPUImageMovieWriter.m */; }; + BCD81FCD19440606007133DB /* GPUImageTextureOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6B8BA1505BF940041703B /* GPUImageTextureOutput.m */; }; + BCD81FCE19440606007133DB /* GPUImageRawDataOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1B715614F49DAA00ACA2AB /* GPUImageRawDataOutput.m */; }; + BCD81FD919440A97007133DB /* GPUImageFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = BC73FC011944008500671325 /* GPUImageFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCD907CE15CDEE720019C556 /* GPUImageDivideBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907CC15CDEE720019C556 /* GPUImageDivideBlendFilter.h */; }; BCD907CF15CDEE720019C556 /* GPUImageDivideBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */; }; BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; }; @@ -476,6 +802,7 @@ BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLaplacianFilter.m; path = Source/GPUImageLaplacianFilter.m; sourceTree = SOURCE_ROOT; }; BC6ED9C01549CA0600966798 /* GPUImageHistogramFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramFilter.h; path = Source/GPUImageHistogramFilter.h; sourceTree = SOURCE_ROOT; }; BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramFilter.m; path = Source/GPUImageHistogramFilter.m; sourceTree = SOURCE_ROOT; }; + BC73FC011944008500671325 /* GPUImageFramework.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageFramework.h; path = Source/iOS/Framework/GPUImageFramework.h; sourceTree = SOURCE_ROOT; }; BC76CE9915813818008B45D3 /* GPUImageSphereRefractionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSphereRefractionFilter.h; path = Source/GPUImageSphereRefractionFilter.h; sourceTree = SOURCE_ROOT; }; BC76CE9A15813818008B45D3 /* GPUImageSphereRefractionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSphereRefractionFilter.m; path = Source/GPUImageSphereRefractionFilter.m; sourceTree = SOURCE_ROOT; }; BC7CC63315605A3500468085 /* GPUImageBilateralFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageBilateralFilter.h; path = Source/GPUImageBilateralFilter.h; sourceTree = SOURCE_ROOT; }; @@ -662,6 +989,8 @@ BCD907CD15CDEE720019C556 /* GPUImageDivideBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageDivideBlendFilter.m; path = Source/GPUImageDivideBlendFilter.m; sourceTree = SOURCE_ROOT; }; BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAddBlendFilter.h; path = Source/GPUImageAddBlendFilter.h; sourceTree = SOURCE_ROOT; }; BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAddBlendFilter.m; path = Source/GPUImageAddBlendFilter.m; sourceTree = SOURCE_ROOT; }; + BCE209E51943F20C002FEED8 /* GPUImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GPUImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BCE209E81943F20C002FEED8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = Source/iOS/Framework/Info.plist; sourceTree = ""; }; BCF1A33414DDB1EC00852800 /* libGPUImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGPUImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; BCF1A33714DDB1EC00852800 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; BCF1A33B14DDB1EC00852800 /* GPUImage-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "GPUImage-Prefix.pch"; path = "Source/iOS/GPUImage-Prefix.pch"; sourceTree = ""; }; @@ -714,6 +1043,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + BCE209E11943F20C002FEED8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; BCF1A33114DDB1EC00852800 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1132,6 +1468,7 @@ children = ( BCF1A33414DDB1EC00852800 /* libGPUImage.a */, BCF1A34414DDB1EC00852800 /* GPUImageTests.octest */, + BCE209E51943F20C002FEED8 /* GPUImage.framework */, ); name = Products; sourceTree = ""; @@ -1175,7 +1512,9 @@ BCF1A33A14DDB1EC00852800 /* Supporting Files */ = { isa = PBXGroup; children = ( + BC73FC011944008500671325 /* GPUImageFramework.h */, BCF1A33B14DDB1EC00852800 /* GPUImage-Prefix.pch */, + BCE209E81943F20C002FEED8 /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -1202,6 +1541,176 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + BCE209E21943F20C002FEED8 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BCD81FD919440A97007133DB /* GPUImageFramework.h in Headers */, + BCD81E8A194403FE007133DB /* GLProgram.h in Headers */, + BCD81E8B194403FE007133DB /* GPUImageContext.h in Headers */, + BCD81E8E1944041B007133DB /* GPUImageFramebufferCache.h in Headers */, + BCD81E8D19440418007133DB /* GPUImageFramebuffer.h in Headers */, + BCD81E8F19440425007133DB /* GPUImageOutput.h in Headers */, + BCD81E9019440428007133DB /* GPUImageVideoCamera.h in Headers */, + BCD81E911944042B007133DB /* GPUImageStillCamera.h in Headers */, + BCD81E921944042E007133DB /* GPUImagePicture.h in Headers */, + BCD81E9319440430007133DB /* GPUImageMovie.h in Headers */, + BCD81E9419440432007133DB /* GPUImageMovieComposition.h in Headers */, + BCD81E9519440435007133DB /* GPUImageTextureInput.h in Headers */, + BCD81E9619440438007133DB /* GPUImageRawDataInput.h in Headers */, + BCD81E971944043A007133DB /* GPUImageUIElement.h in Headers */, + BCD81E981944043F007133DB /* GPUImageFilterPipeline.h in Headers */, + BCD81E9919440442007133DB /* GPUImageFilter.h in Headers */, + BCD81E9A19440444007133DB /* GPUImageTwoInputFilter.h in Headers */, + BCD81E9B19440453007133DB /* GPUImageThreeInputFilter.h in Headers */, + BCD81E9C194404EB007133DB /* GPUImageTwoPassFilter.h in Headers */, + BCD81E9D194404EB007133DB /* GPUImageTwoPassTextureSamplingFilter.h in Headers */, + BCD81E9E194404EB007133DB /* GPUImageFilterGroup.h in Headers */, + BCD81E9F194404EB007133DB /* GPUImage3x3TextureSamplingFilter.h in Headers */, + BCD81EA0194404EB007133DB /* GPUImageTwoInputCrossTextureSamplingFilter.h in Headers */, + BCD81EA1194404EB007133DB /* GPUImageBuffer.h in Headers */, + BCD81EA2194404EB007133DB /* GPUImageBrightnessFilter.h in Headers */, + BCD81EA3194404EB007133DB /* GPUImageLevelsFilter.h in Headers */, + BCD81EA4194404EB007133DB /* GPUImageExposureFilter.h in Headers */, + BCD81EA5194404EB007133DB /* GPUImageContrastFilter.h in Headers */, + BCD81EA6194404EB007133DB /* GPUImageSaturationFilter.h in Headers */, + BCD81EA7194404EB007133DB /* GPUImageGammaFilter.h in Headers */, + BCD81EA8194404EB007133DB /* GPUImageColorMatrixFilter.h in Headers */, + BCD81EA9194404EB007133DB /* GPUImageRGBFilter.h in Headers */, + BCD81EAA194404EB007133DB /* GPUImageHSBFilter.h in Headers */, + BCD81EAB194404EB007133DB /* GPUImageHueFilter.h in Headers */, + BCD81EAC194404EB007133DB /* GPUImageMonochromeFilter.h in Headers */, + BCD81EAD194404EB007133DB /* GPUImageFalseColorFilter.h in Headers */, + BCD81EAE194404EB007133DB /* GPUImageHazeFilter.h in Headers */, + BCD81EAF194404EB007133DB /* GPUImageSepiaFilter.h in Headers */, + BCD81EB0194404EB007133DB /* GPUImageColorInvertFilter.h in Headers */, + BCD81EB1194404EB007133DB /* GPUImageGrayscaleFilter.h in Headers */, + BCD81EB2194404EB007133DB /* GPUImageLuminanceThresholdFilter.h in Headers */, + BCD81EB3194404EB007133DB /* GPUImageAdaptiveThresholdFilter.h in Headers */, + BCD81EB4194404EB007133DB /* GPUImageAverageLuminanceThresholdFilter.h in Headers */, + BCD81EB5194404EB007133DB /* GPUImageHistogramFilter.h in Headers */, + BCD81EB6194404EB007133DB /* GPUImageHistogramGenerator.h in Headers */, + BCD81EB7194404EB007133DB /* GPUImageToneCurveFilter.h in Headers */, + BCD81EB8194404EB007133DB /* GPUImageHighlightShadowFilter.h in Headers */, + BCD81EB9194404EB007133DB /* GPUImageLookupFilter.h in Headers */, + BCD81EBA194404EC007133DB /* GPUImageAmatorkaFilter.h in Headers */, + BCD81EBB194404EC007133DB /* GPUImageMissEtikateFilter.h in Headers */, + BCD81EBC194404EC007133DB /* GPUImageSoftEleganceFilter.h in Headers */, + BCD81EBD194404EC007133DB /* GPUImageOpacityFilter.h in Headers */, + BCD81EBE194404EC007133DB /* GPUImageAverageColor.h in Headers */, + BCD81EBF194404EC007133DB /* GPUImageLuminosity.h in Headers */, + BCD81EC0194404EC007133DB /* GPUImageSolidColorGenerator.h in Headers */, + BCD81EC1194404EC007133DB /* GPUImageChromaKeyFilter.h in Headers */, + BCD81EC2194404EC007133DB /* GPUImageWhiteBalanceFilter.h in Headers */, + BCD81EC3194404EC007133DB /* GPUImageLuminanceRangeFilter.h in Headers */, + BCD81EC4194404EC007133DB /* GPUImageTransformFilter.h in Headers */, + BCD81EC5194404EC007133DB /* GPUImageCropFilter.h in Headers */, + BCD81EC6194404EC007133DB /* GPUImageSharpenFilter.h in Headers */, + BCD81EC7194404EC007133DB /* GPUImageUnsharpMaskFilter.h in Headers */, + BCD81EC8194404EC007133DB /* GPUImageBoxBlurFilter.h in Headers */, + BCD81EC9194404EC007133DB /* GPUImageGaussianBlurFilter.h in Headers */, + BCD81ECA194404EC007133DB /* GPUImageGaussianSelectiveBlurFilter.h in Headers */, + BCD81ECB194404EC007133DB /* GPUImageGaussianBlurPositionFilter.h in Headers */, + BCD81ECC194404EC007133DB /* GPUImageSingleComponentGaussianBlurFilter.h in Headers */, + BCD81ECD194404EC007133DB /* GPUImageMedianFilter.h in Headers */, + BCD81ECE194404ED007133DB /* GPUImageBilateralFilter.h in Headers */, + BCD81ECF194404ED007133DB /* GPUImageTiltShiftFilter.h in Headers */, + BCD81ED0194404ED007133DB /* GPUImage3x3ConvolutionFilter.h in Headers */, + BCD81ED1194404ED007133DB /* GPUImageLaplacianFilter.h in Headers */, + BCD81ED2194404ED007133DB /* GPUImageSobelEdgeDetectionFilter.h in Headers */, + BCD81ED3194404ED007133DB /* GPUImageThresholdEdgeDetectionFilter.h in Headers */, + BCD81ED4194404ED007133DB /* GPUimageDirectionalSobelEdgeDetectionFilter.h in Headers */, + BCD81ED5194404ED007133DB /* GPUImageDirectionalNonMaximumSuppressionFilter.h in Headers */, + BCD81ED6194404ED007133DB /* GPUImageWeakPixelInclusionFilter.h in Headers */, + BCD81ED7194404ED007133DB /* GPUImageCannyEdgeDetectionFilter.h in Headers */, + BCD81ED8194404ED007133DB /* GPUImagePrewittEdgeDetectionFilter.h in Headers */, + BCD81ED9194404ED007133DB /* GPUImageXYDerivativeFilter.h in Headers */, + BCD81EDA194404ED007133DB /* GPUImageHarrisCornerDetectionFilter.h in Headers */, + BCD81EDB194404ED007133DB /* GPUImageNobleCornerDetectionFilter.h in Headers */, + BCD81EDC194404EE007133DB /* GPUImageShiTomasiFeatureDetectionFilter.h in Headers */, + BCD81EDD194404EE007133DB /* GPUImageFASTCornerDetectionFilter.h in Headers */, + BCD81EDE194404EE007133DB /* GPUImageNonMaximumSuppressionFilter.h in Headers */, + BCD81EDF194404EE007133DB /* GPUImageThresholdedNonMaximumSuppressionFilter.h in Headers */, + BCD81EE0194404EE007133DB /* GPUImageCrosshairGenerator.h in Headers */, + BCD81EE1194404EE007133DB /* GPUImageDilationFilter.h in Headers */, + BCD81EE2194404EE007133DB /* GPUImageRGBDilationFilter.h in Headers */, + BCD81EE3194404EE007133DB /* GPUImageErosionFilter.h in Headers */, + BCD81EE4194404EE007133DB /* GPUImageRGBErosionFilter.h in Headers */, + BCD81EE5194404EE007133DB /* GPUImageOpeningFilter.h in Headers */, + BCD81EE6194404EE007133DB /* GPUImageRGBOpeningFilter.h in Headers */, + BCD81EE7194404EE007133DB /* GPUImageClosingFilter.h in Headers */, + BCD81EE8194404EF007133DB /* GPUImageRGBClosingFilter.h in Headers */, + BCD81EE9194404EF007133DB /* GPUImageColorPackingFilter.h in Headers */, + BCD81EEA194404EF007133DB /* GPUImageLocalBinaryPatternFilter.h in Headers */, + BCD81EEB194404EF007133DB /* GPUImageLanczosResamplingFilter.h in Headers */, + BCD81EEC194404EF007133DB /* GPUImageLowPassFilter.h in Headers */, + BCD81EED194404EF007133DB /* GPUImageHighPassFilter.h in Headers */, + BCD81EEE194404EF007133DB /* GPUImageMotionDetector.h in Headers */, + BCD81EEF194404EF007133DB /* GPUImageHoughTransformLineDetector.h in Headers */, + BCD81EF0194404EF007133DB /* GPUImageParallelCoordinateLineTransformFilter.h in Headers */, + BCD81EF1194404EF007133DB /* GPUImageLineGenerator.h in Headers */, + BCD81EF2194404F0007133DB /* GPUImageMotionBlurFilter.h in Headers */, + BCD81EF3194404F0007133DB /* GPUImageZoomBlurFilter.h in Headers */, + BCD81EF4194404F0007133DB /* GPUImageiOSBlurFilter.h in Headers */, + BCD81EF5194404F0007133DB /* GPUImageSourceOverBlendFilter.h in Headers */, + BCD81EF6194404F0007133DB /* GPUImageColorBurnBlendFilter.h in Headers */, + BCD81EF7194404F0007133DB /* GPUImageColorDodgeBlendFilter.h in Headers */, + BCD81EF8194404F0007133DB /* GPUImageDarkenBlendFilter.h in Headers */, + BCD81EF9194404F0007133DB /* GPUImageDifferenceBlendFilter.h in Headers */, + BCD81EFA194404F0007133DB /* GPUImageDissolveBlendFilter.h in Headers */, + BCD81EFB194404F1007133DB /* GPUImageExclusionBlendFilter.h in Headers */, + BCD81EFC194404F1007133DB /* GPUImageHardLightBlendFilter.h in Headers */, + BCD81EFD194404F1007133DB /* GPUImageSoftLightBlendFilter.h in Headers */, + BCD81EFE194404F1007133DB /* GPUImageLightenBlendFilter.h in Headers */, + BCD81EFF194404F1007133DB /* GPUImageAddBlendFilter.h in Headers */, + BCD81F00194404F1007133DB /* GPUImageSubtractBlendFilter.h in Headers */, + BCD81F01194404F1007133DB /* GPUImageDivideBlendFilter.h in Headers */, + BCD81F02194404F1007133DB /* GPUImageMultiplyBlendFilter.h in Headers */, + BCD81F03194404F2007133DB /* GPUImageOverlayBlendFilter.h in Headers */, + BCD81F04194404F2007133DB /* GPUImageScreenBlendFilter.h in Headers */, + BCD81F05194404F2007133DB /* GPUImageChromaKeyBlendFilter.h in Headers */, + BCD81F06194404F2007133DB /* GPUImageAlphaBlendFilter.h in Headers */, + BCD81F07194404F2007133DB /* GPUImageNormalBlendFilter.h in Headers */, + BCD81F08194404F2007133DB /* GPUImageColorBlendFilter.h in Headers */, + BCD81F09194404F2007133DB /* GPUImageHueBlendFilter.h in Headers */, + BCD81F0A194404F2007133DB /* GPUImageSaturationBlendFilter.h in Headers */, + BCD81F0B194404F3007133DB /* GPUImageLuminosityBlendFilter.h in Headers */, + BCD81F0C194404F3007133DB /* GPUImageLinearBurnBlendFilter.h in Headers */, + BCD81F0D194404F3007133DB /* GPUImagePoissonBlendFilter.h in Headers */, + BCD81F0E194404F3007133DB /* GPUImageMaskFilter.h in Headers */, + BCD81F0F194404F3007133DB /* GPUImagePerlinNoiseFilter.h in Headers */, + BCD81F10194404F3007133DB /* GPUImagePixellateFilter.h in Headers */, + BCD81F11194404F3007133DB /* GPUImagePixellatePositionFilter.h in Headers */, + BCD81F12194404F4007133DB /* GPUImagePolkaDotFilter.h in Headers */, + BCD81F13194404F4007133DB /* GPUImageHalftoneFilter.h in Headers */, + BCD81F14194404F4007133DB /* GPUImagePolarPixellateFilter.h in Headers */, + BCD81F15194404F4007133DB /* GPUImageCrosshatchFilter.h in Headers */, + BCD81F16194404F4007133DB /* GPUImageSketchFilter.h in Headers */, + BCD81F17194404F4007133DB /* GPUImageThresholdSketchFilter.h in Headers */, + BCD81F18194404F4007133DB /* GPUImageEmbossFilter.h in Headers */, + BCD81F19194404F5007133DB /* GPUImageToonFilter.h in Headers */, + BCD81F1A194404F5007133DB /* GPUImageSmoothToonFilter.h in Headers */, + BCD81F1B194404F5007133DB /* GPUImageCGAColorspaceFilter.h in Headers */, + BCD81F1C194404F5007133DB /* GPUImagePosterizeFilter.h in Headers */, + BCD81F1D194404F5007133DB /* GPUImageSwirlFilter.h in Headers */, + BCD81F1E194404F5007133DB /* GPUImageBulgeDistortionFilter.h in Headers */, + BCD81F1F194404F6007133DB /* GPUImagePinchDistortionFilter.h in Headers */, + BCD81F20194404F6007133DB /* GPUImageStretchDistortionFilter.h in Headers */, + BCD81F21194404F6007133DB /* GPUImageSphereRefractionFilter.h in Headers */, + BCD81F22194404F6007133DB /* GPUImageGlassSphereFilter.h in Headers */, + BCD81F23194404F6007133DB /* GPUImageKuwaharaFilter.h in Headers */, + BCD81F24194404F6007133DB /* GPUImageKuwaharaRadius3Filter.h in Headers */, + BCD81F25194404F7007133DB /* GPUImageVignetteFilter.h in Headers */, + BCD81F26194404F7007133DB /* GPUImageJFAVoronoiFilter.h in Headers */, + BCD81F27194404F7007133DB /* GPUImageMosaicFilter.h in Headers */, + BCD81F28194404F7007133DB /* GPUImageVoronoiConsumerFilter.h in Headers */, + BCD81F29194404F7007133DB /* GPUImageView.h in Headers */, + BCD81F2A194404F7007133DB /* GPUImageMovieWriter.h in Headers */, + BCD81F2B194404F8007133DB /* GPUImageTextureOutput.h in Headers */, + BCD81F2C194404F8007133DB /* GPUImageRawDataOutput.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; BCF1A33214DDB1EC00852800 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1264,6 +1773,7 @@ BCC1E5C7151EA12B0006EFA5 /* GPUImageBoxBlurFilter.h in Headers */, BCC1E5CC151EA6610006EFA5 /* GPUImageAdaptiveThresholdFilter.h in Headers */, BCC1E610152156620006EFA5 /* GPUImageUnsharpMaskFilter.h in Headers */, + BC73FC021944008500671325 /* GPUImageFramework.h in Headers */, BCC1E633152239090006EFA5 /* GPUImageBulgeDistortionFilter.h in Headers */, BCC1E638152243630006EFA5 /* GPUImagePinchDistortionFilter.h in Headers */, BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */, @@ -1375,6 +1885,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + BCE209E41943F20C002FEED8 /* GPUImageFramework */ = { + isa = PBXNativeTarget; + buildConfigurationList = BCE209F81943F20D002FEED8 /* Build configuration list for PBXNativeTarget "GPUImageFramework" */; + buildPhases = ( + BCE209E01943F20C002FEED8 /* Sources */, + BCE209E11943F20C002FEED8 /* Frameworks */, + BCE209E21943F20C002FEED8 /* Headers */, + BCE209E31943F20C002FEED8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GPUImageFramework; + productName = GPUImage; + productReference = BCE209E51943F20C002FEED8 /* GPUImage.framework */; + productType = "com.apple.product-type.framework"; + }; BCF1A33314DDB1EC00852800 /* GPUImage */ = { isa = PBXNativeTarget; buildConfigurationList = BCF1A35814DDB1EC00852800 /* Build configuration list for PBXNativeTarget "GPUImage" */; @@ -1420,6 +1948,11 @@ LastTestingUpgradeCheck = 0510; LastUpgradeCheck = 0600; ORGANIZATIONNAME = "Brad Larson"; + TargetAttributes = { + BCE209E41943F20C002FEED8 = { + CreatedOnToolsVersion = 6.0; + }; + }; }; buildConfigurationList = BCF1A32E14DDB1EC00852800 /* Build configuration list for PBXProject "GPUImage" */; compatibilityVersion = "Xcode 3.2"; @@ -1436,11 +1969,19 @@ BCF1A33314DDB1EC00852800 /* GPUImage */, BCF1A34314DDB1EC00852800 /* GPUImageTests */, BC552B361558C6F4001F3FFA /* Documentation */, + BCE209E41943F20C002FEED8 /* GPUImageFramework */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + BCE209E31943F20C002FEED8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; BCF1A34114DDB1EC00852800 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1481,6 +2022,175 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + BCE209E01943F20C002FEED8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCD81F2D19440604007133DB /* GLProgram.m in Sources */, + BCD81F2E19440604007133DB /* GPUImageContext.m in Sources */, + BCD81F2F19440604007133DB /* GPUImageFramebuffer.m in Sources */, + BCD81F3019440604007133DB /* GPUImageFramebufferCache.m in Sources */, + BCD81F3119440604007133DB /* GPUImageOutput.m in Sources */, + BCD81F3219440604007133DB /* GPUImageVideoCamera.m in Sources */, + BCD81F3319440604007133DB /* GPUImageStillCamera.m in Sources */, + BCD81F3419440604007133DB /* GPUImagePicture.m in Sources */, + BCD81F3519440604007133DB /* GPUImageMovie.m in Sources */, + BCD81F3619440604007133DB /* GPUImageMovieComposition.m in Sources */, + BCD81F3719440604007133DB /* GPUImageTextureInput.m in Sources */, + BCD81F3819440604007133DB /* GPUImageRawDataInput.m in Sources */, + BCD81F3919440604007133DB /* GPUImageUIElement.m in Sources */, + BCD81F3A19440604007133DB /* GPUImageFilterPipeline.m in Sources */, + BCD81F3B19440604007133DB /* GPUImageFilter.m in Sources */, + BCD81F3C19440604007133DB /* GPUImageTwoInputFilter.m in Sources */, + BCD81F3D19440604007133DB /* GPUImageThreeInputFilter.m in Sources */, + BCD81F3E19440604007133DB /* GPUImageTwoPassFilter.m in Sources */, + BCD81F3F19440604007133DB /* GPUImageTwoPassTextureSamplingFilter.m in Sources */, + BCD81F4019440604007133DB /* GPUImageFilterGroup.m in Sources */, + BCD81F4119440604007133DB /* GPUImage3x3TextureSamplingFilter.m in Sources */, + BCD81F4219440604007133DB /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */, + BCD81F4319440604007133DB /* GPUImageBuffer.m in Sources */, + BCD81F4419440604007133DB /* GPUImageBrightnessFilter.m in Sources */, + BCD81F4519440604007133DB /* GPUImageLevelsFilter.m in Sources */, + BCD81F4619440604007133DB /* GPUImageExposureFilter.m in Sources */, + BCD81F4719440604007133DB /* GPUImageContrastFilter.m in Sources */, + BCD81F4819440604007133DB /* GPUImageSaturationFilter.m in Sources */, + BCD81F4919440604007133DB /* GPUImageGammaFilter.m in Sources */, + BCD81F4A19440604007133DB /* GPUImageColorMatrixFilter.m in Sources */, + BCD81F4B19440604007133DB /* GPUImageRGBFilter.m in Sources */, + BCD81F4C19440604007133DB /* GPUImageHSBFilter.m in Sources */, + BCD81F4D19440604007133DB /* GPUImageHueFilter.m in Sources */, + BCD81F4E19440604007133DB /* GPUImageMonochromeFilter.m in Sources */, + BCD81F4F19440604007133DB /* GPUImageFalseColorFilter.m in Sources */, + BCD81F5019440604007133DB /* GPUImageHazeFilter.m in Sources */, + BCD81F5119440604007133DB /* GPUImageSepiaFilter.m in Sources */, + BCD81F5219440604007133DB /* GPUImageColorInvertFilter.m in Sources */, + BCD81F5319440604007133DB /* GPUImageGrayscaleFilter.m in Sources */, + BCD81F5419440604007133DB /* GPUImageLuminanceThresholdFilter.m in Sources */, + BCD81F5519440604007133DB /* GPUImageAdaptiveThresholdFilter.m in Sources */, + BCD81F5619440604007133DB /* GPUImageAverageLuminanceThresholdFilter.m in Sources */, + BCD81F5719440604007133DB /* GPUImageHistogramFilter.m in Sources */, + BCD81F5819440604007133DB /* GPUImageHistogramGenerator.m in Sources */, + BCD81F5919440604007133DB /* GPUImageToneCurveFilter.m in Sources */, + BCD81F5A19440604007133DB /* GPUImageHighlightShadowFilter.m in Sources */, + BCD81F5B19440604007133DB /* GPUImageLookupFilter.m in Sources */, + BCD81F5C19440604007133DB /* GPUImageAmatorkaFilter.m in Sources */, + BCD81F5D19440604007133DB /* GPUImageMissEtikateFilter.m in Sources */, + BCD81F5E19440604007133DB /* GPUImageSoftEleganceFilter.m in Sources */, + BCD81F5F19440604007133DB /* GPUImageOpacityFilter.m in Sources */, + BCD81F6019440604007133DB /* GPUImageAverageColor.m in Sources */, + BCD81F6119440604007133DB /* GPUImageLuminosity.m in Sources */, + BCD81F6219440604007133DB /* GPUImageSolidColorGenerator.m in Sources */, + BCD81F6319440604007133DB /* GPUImageChromaKeyFilter.m in Sources */, + BCD81F6419440604007133DB /* GPUImageWhiteBalanceFilter.m in Sources */, + BCD81F6519440604007133DB /* GPUImageLuminanceRangeFilter.m in Sources */, + BCD81F6619440604007133DB /* GPUImageTransformFilter.m in Sources */, + BCD81F6719440604007133DB /* GPUImageCropFilter.m in Sources */, + BCD81F6819440604007133DB /* GPUImageSharpenFilter.m in Sources */, + BCD81F6919440604007133DB /* GPUImageUnsharpMaskFilter.m in Sources */, + BCD81F6A19440604007133DB /* GPUImageBoxBlurFilter.m in Sources */, + BCD81F6B19440604007133DB /* GPUImageGaussianBlurFilter.m in Sources */, + BCD81F6C19440604007133DB /* GPUImageGaussianSelectiveBlurFilter.m in Sources */, + BCD81F6D19440604007133DB /* GPUImageGaussianBlurPositionFilter.m in Sources */, + BCD81F6E19440604007133DB /* GPUImageSingleComponentGaussianBlurFilter.m in Sources */, + BCD81F6F19440604007133DB /* GPUImageMedianFilter.m in Sources */, + BCD81F7019440604007133DB /* GPUImageBilateralFilter.m in Sources */, + BCD81F7119440604007133DB /* GPUImageTiltShiftFilter.m in Sources */, + BCD81F7219440604007133DB /* GPUImage3x3ConvolutionFilter.m in Sources */, + BCD81F7319440604007133DB /* GPUImageLaplacianFilter.m in Sources */, + BCD81F7419440604007133DB /* GPUImageSobelEdgeDetectionFilter.m in Sources */, + BCD81F7519440604007133DB /* GPUImageThresholdEdgeDetectionFilter.m in Sources */, + BCD81F7619440604007133DB /* GPUimageDirectionalSobelEdgeDetectionFilter.m in Sources */, + BCD81F7719440604007133DB /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */, + BCD81F7819440604007133DB /* GPUImageWeakPixelInclusionFilter.m in Sources */, + BCD81F7919440604007133DB /* GPUImageCannyEdgeDetectionFilter.m in Sources */, + BCD81F7A19440604007133DB /* GPUImagePrewittEdgeDetectionFilter.m in Sources */, + BCD81F7B19440604007133DB /* GPUImageXYDerivativeFilter.m in Sources */, + BCD81F7C19440604007133DB /* GPUImageHarrisCornerDetectionFilter.m in Sources */, + BCD81F7D19440604007133DB /* GPUImageNobleCornerDetectionFilter.m in Sources */, + BCD81F7E19440604007133DB /* GPUImageShiTomasiFeatureDetectionFilter.m in Sources */, + BCD81F7F19440604007133DB /* GPUImageFASTCornerDetectionFilter.m in Sources */, + BCD81F8019440604007133DB /* GPUImageNonMaximumSuppressionFilter.m in Sources */, + BCD81F8119440604007133DB /* GPUImageThresholdedNonMaximumSuppressionFilter.m in Sources */, + BCD81F8219440604007133DB /* GPUImageCrosshairGenerator.m in Sources */, + BCD81F8319440604007133DB /* GPUImageDilationFilter.m in Sources */, + BCD81F8419440604007133DB /* GPUImageRGBDilationFilter.m in Sources */, + BCD81F8519440604007133DB /* GPUImageErosionFilter.m in Sources */, + BCD81F8619440604007133DB /* GPUImageRGBErosionFilter.m in Sources */, + BCD81F8719440604007133DB /* GPUImageOpeningFilter.m in Sources */, + BCD81F8819440604007133DB /* GPUImageRGBOpeningFilter.m in Sources */, + BCD81F8919440604007133DB /* GPUImageClosingFilter.m in Sources */, + BCD81F8A19440604007133DB /* GPUImageRGBClosingFilter.m in Sources */, + BCD81F8B19440604007133DB /* GPUImageColorPackingFilter.m in Sources */, + BCD81F8C19440605007133DB /* GPUImageLocalBinaryPatternFilter.m in Sources */, + BCD81F8D19440605007133DB /* GPUImageLanczosResamplingFilter.m in Sources */, + BCD81F8E19440605007133DB /* GPUImageLowPassFilter.m in Sources */, + BCD81F8F19440605007133DB /* GPUImageHighPassFilter.m in Sources */, + BCD81F9019440605007133DB /* GPUImageMotionDetector.m in Sources */, + BCD81F9119440605007133DB /* GPUImageHoughTransformLineDetector.m in Sources */, + BCD81F9219440605007133DB /* GPUImageParallelCoordinateLineTransformFilter.m in Sources */, + BCD81F9319440605007133DB /* GPUImageLineGenerator.m in Sources */, + BCD81F9419440605007133DB /* GPUImageMotionBlurFilter.m in Sources */, + BCD81F9519440605007133DB /* GPUImageZoomBlurFilter.m in Sources */, + BCD81F9619440605007133DB /* GPUImageiOSBlurFilter.m in Sources */, + BCD81F9719440605007133DB /* GPUImageSourceOverBlendFilter.m in Sources */, + BCD81F9819440605007133DB /* GPUImageColorBurnBlendFilter.m in Sources */, + BCD81F9919440605007133DB /* GPUImageColorDodgeBlendFilter.m in Sources */, + BCD81F9A19440605007133DB /* GPUImageDarkenBlendFilter.m in Sources */, + BCD81F9B19440605007133DB /* GPUImageDifferenceBlendFilter.m in Sources */, + BCD81F9C19440605007133DB /* GPUImageDissolveBlendFilter.m in Sources */, + BCD81F9D19440605007133DB /* GPUImageExclusionBlendFilter.m in Sources */, + BCD81F9E19440605007133DB /* GPUImageHardLightBlendFilter.m in Sources */, + BCD81F9F19440605007133DB /* GPUImageSoftLightBlendFilter.m in Sources */, + BCD81FA019440605007133DB /* GPUImageLightenBlendFilter.m in Sources */, + BCD81FA119440605007133DB /* GPUImageAddBlendFilter.m in Sources */, + BCD81FA219440605007133DB /* GPUImageSubtractBlendFilter.m in Sources */, + BCD81FA319440605007133DB /* GPUImageDivideBlendFilter.m in Sources */, + BCD81FA419440605007133DB /* GPUImageMultiplyBlendFilter.m in Sources */, + BCD81FA519440605007133DB /* GPUImageOverlayBlendFilter.m in Sources */, + BCD81FA619440605007133DB /* GPUImageScreenBlendFilter.m in Sources */, + BCD81FA719440605007133DB /* GPUImageChromaKeyBlendFilter.m in Sources */, + BCD81FA819440605007133DB /* GPUImageAlphaBlendFilter.m in Sources */, + BCD81FA919440605007133DB /* GPUImageNormalBlendFilter.m in Sources */, + BCD81FAA19440605007133DB /* GPUImageColorBlendFilter.m in Sources */, + BCD81FAB19440605007133DB /* GPUImageHueBlendFilter.m in Sources */, + BCD81FAC19440605007133DB /* GPUImageSaturationBlendFilter.m in Sources */, + BCD81FAD19440605007133DB /* GPUImageLuminosityBlendFilter.m in Sources */, + BCD81FAE19440605007133DB /* GPUImageLinearBurnBlendFilter.m in Sources */, + BCD81FAF19440605007133DB /* GPUImagePoissonBlendFilter.m in Sources */, + BCD81FB019440605007133DB /* GPUImageMaskFilter.m in Sources */, + BCD81FB119440605007133DB /* GPUImagePerlinNoiseFilter.m in Sources */, + BCD81FB219440605007133DB /* GPUImagePixellateFilter.m in Sources */, + BCD81FB319440605007133DB /* GPUImagePixellatePositionFilter.m in Sources */, + BCD81FB419440605007133DB /* GPUImagePolkaDotFilter.m in Sources */, + BCD81FB519440605007133DB /* GPUImageHalftoneFilter.m in Sources */, + BCD81FB619440605007133DB /* GPUImagePolarPixellateFilter.m in Sources */, + BCD81FB719440605007133DB /* GPUImageCrosshatchFilter.m in Sources */, + BCD81FB819440605007133DB /* GPUImageSketchFilter.m in Sources */, + BCD81FB919440605007133DB /* GPUImageThresholdSketchFilter.m in Sources */, + BCD81FBA19440605007133DB /* GPUImageEmbossFilter.m in Sources */, + BCD81FBB19440605007133DB /* GPUImageToonFilter.m in Sources */, + BCD81FBC19440605007133DB /* GPUImageSmoothToonFilter.m in Sources */, + BCD81FBD19440605007133DB /* GPUImageCGAColorspaceFilter.m in Sources */, + BCD81FBE19440605007133DB /* GPUImagePosterizeFilter.m in Sources */, + BCD81FBF19440605007133DB /* GPUImageSwirlFilter.m in Sources */, + BCD81FC019440605007133DB /* GPUImageBulgeDistortionFilter.m in Sources */, + BCD81FC119440605007133DB /* GPUImagePinchDistortionFilter.m in Sources */, + BCD81FC219440605007133DB /* GPUImageStretchDistortionFilter.m in Sources */, + BCD81FC319440605007133DB /* GPUImageSphereRefractionFilter.m in Sources */, + BCD81FC419440605007133DB /* GPUImageGlassSphereFilter.m in Sources */, + BCD81FC519440606007133DB /* GPUImageKuwaharaFilter.m in Sources */, + BCD81FC619440606007133DB /* GPUImageKuwaharaRadius3Filter.m in Sources */, + BCD81FC719440606007133DB /* GPUImageVignetteFilter.m in Sources */, + BCD81FC819440606007133DB /* GPUImageJFAVoronoiFilter.m in Sources */, + BCD81FC919440606007133DB /* GPUImageMosaicFilter.m in Sources */, + BCD81FCA19440606007133DB /* GPUImageVoronoiConsumerFilter.m in Sources */, + BCD81FCB19440606007133DB /* GPUImageView.m in Sources */, + BCD81FCC19440606007133DB /* GPUImageMovieWriter.m in Sources */, + BCD81FCD19440606007133DB /* GPUImageTextureOutput.m in Sources */, + BCD81FCE19440606007133DB /* GPUImageRawDataOutput.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; BCF1A33014DDB1EC00852800 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1696,10 +2406,74 @@ }; name = Release; }; + BCE209F91943F20D002FEED8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = Source/iOS/Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = Source/iOS/Framework/module.modulemap; + PRODUCT_MODULE_NAME = GPUImage; + PRODUCT_NAME = GPUImage; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BCE209FA1943F20D002FEED8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = Source/iOS/Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = Source/iOS/Framework/module.modulemap; + PRODUCT_MODULE_NAME = GPUImage; + PRODUCT_NAME = GPUImage; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; BCF1A35614DDB1EC00852800 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; @@ -1709,7 +2483,6 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEFINES_MODULE = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -1729,9 +2502,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 4.0; - MODULEMAP_FILE = ""; ONLY_ACTIVE_ARCH = YES; - PRODUCT_MODULE_NAME = GPUImage; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -1742,6 +2513,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; @@ -1751,7 +2523,6 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; - DEFINES_MODULE = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; @@ -1764,8 +2535,6 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 4.0; - MODULEMAP_FILE = ""; - PRODUCT_MODULE_NAME = GPUImage; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -1845,6 +2614,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + BCE209F81943F20D002FEED8 /* Build configuration list for PBXNativeTarget "GPUImageFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCE209F91943F20D002FEED8 /* Debug */, + BCE209FA1943F20D002FEED8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; BCF1A32E14DDB1EC00852800 /* Build configuration list for PBXProject "GPUImage" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/GPUImageFramework.xcscheme b/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/GPUImageFramework.xcscheme new file mode 100644 index 000000000..14c79eba5 --- /dev/null +++ b/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/GPUImageFramework.xcscheme @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/Source/Mac/GPUImage.h b/framework/Source/Mac/GPUImage.h index 2a056bf08..5a2374aa3 100755 --- a/framework/Source/Mac/GPUImage.h +++ b/framework/Source/Mac/GPUImage.h @@ -1,7 +1,4 @@ -#import -#import #import -#import // Base classes #import diff --git a/framework/Source/iOS/Framework/GPUImageFramework.h b/framework/Source/iOS/Framework/GPUImageFramework.h new file mode 100644 index 000000000..ecef8eaae --- /dev/null +++ b/framework/Source/iOS/Framework/GPUImageFramework.h @@ -0,0 +1,165 @@ +#import + +//! Project version number for GPUImageFramework. +FOUNDATION_EXPORT double GPUImageFrameworkVersionNumber; + +//! Project version string for GPUImageFramework. +FOUNDATION_EXPORT const unsigned char GPUImageFrameworkVersionString[]; + +#import + +// Base classes +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +// Filters +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import \ No newline at end of file diff --git a/framework/Source/iOS/Framework/Info.plist b/framework/Source/iOS/Framework/Info.plist new file mode 100644 index 000000000..8f69573d0 --- /dev/null +++ b/framework/Source/iOS/Framework/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.4 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/framework/Source/iOS/Framework/module.modulemap b/framework/Source/iOS/Framework/module.modulemap new file mode 100644 index 000000000..8b3de2aad --- /dev/null +++ b/framework/Source/iOS/Framework/module.modulemap @@ -0,0 +1,6 @@ +framework module GPUImage { + umbrella header "GPUImageFramework.h" + + export * + module * { export * } +} diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 53757f5d3..2f120efca 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -814,7 +814,20 @@ - (void)setHasAudioTrack:(BOOL)newValue audioSettings:(NSDictionary *)audioOutpu } else if (audioOutputSettings == nil) { - double preferredHardwareSampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; + AVAudioSession *sharedAudioSession = [AVAudioSession sharedInstance]; + double preferredHardwareSampleRate; + + if ([sharedAudioSession respondsToSelector:@selector(sampleRate)]) + { + preferredHardwareSampleRate = [sharedAudioSession sampleRate]; + } + else + { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + preferredHardwareSampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; +#pragma clang diagnostic pop + } AudioChannelLayout acl; bzero( &acl, sizeof(acl)); diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index 1a7ed3d14..d8593d77c 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -99,7 +99,7 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot } GLubyte *imageData = NULL; - CFDataRef dataFromImageDataProvider; + CFDataRef dataFromImageDataProvider = NULL; GLenum format = GL_BGRA; if (!shouldRedrawUsingCoreGraphics) { @@ -206,7 +206,10 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot } else { - CFRelease(dataFromImageDataProvider); + if (dataFromImageDataProvider) + { + CFRelease(dataFromImageDataProvider); + } } return self; From dd3f4dcf7f195456af4a07a9612829a84c41e353 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sat, 7 Jun 2014 23:55:50 -0500 Subject: [PATCH 555/695] Updated documentation to reflect new framework targets. --- README.md | 12 ++++++++++++ framework/GPUImage.xcodeproj/project.pbxproj | 20 +++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 986611c5d..ae9d48c32 100755 --- a/README.md +++ b/README.md @@ -76,6 +76,18 @@ Additionally, this is an ARC-enabled framework, so if you want to use this withi If you don't want to include the project as a dependency in your application's Xcode project, you can build a universal static library for the iOS Simulator or device. To do this, run `build.sh` at the command line. The resulting library and header files will be located at `build/Release-iphone`. You may also change the version of the iOS SDK by changing the `IOSSDK_VER` variable in `build.sh` (all available versions can be found using `xcodebuild -showsdks`). +## Adding this as a framework (module) to your Mac or iOS project ## + +Xcode 6 and iOS 8 support the use of full frameworks, as does the Mac, which simplifies the process of adding this to your application. To add this to your application, I recommend dragging the .xcodeproj project file into your application's project (as you would in the static library target). + +For your application, go to its target build settings and choose the Build Phases tab. Under the Target Dependencies grouping, add GPUImageFramework on iOS (not GPUImage, which builds the static library) or GPUImage on the Mac. Under the Link Binary With Libraries section, add GPUImage.framework. + +This should cause GPUImage to build as a framework. Under Xcode 6, this will also build as a module, which will allow you to use this in Swift projects. When set up as above, you should just need to use + + import GPUImage + +to pull it in. + ### Documentation ### Documentation is generated from header comments using appledoc. To build the documentation, switch to the "Documentation" scheme in Xcode. You should ensure that "APPLEDOC_PATH" (a User-Defined build setting) points to an appledoc binary, available on Github or through Homebrew. It will also build and install a .docset file, which you can view with your favorite documentation tool. diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 99b7a1c7a..ba7e9563a 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -115,6 +115,14 @@ BC56D84B157ADA4F00CC9C1E /* GPUImageDilationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D849157ADA4F00CC9C1E /* GPUImageDilationFilter.m */; }; BC56D84F157ADA6F00CC9C1E /* GPUImageErosionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56D84D157ADA6F00CC9C1E /* GPUImageErosionFilter.h */; }; BC56D850157ADA6F00CC9C1E /* GPUImageErosionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56D84E157ADA6F00CC9C1E /* GPUImageErosionFilter.m */; }; + BC57607919441DD90096FFA5 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77814E20BAF00701302 /* CoreMedia.framework */; }; + BC57607A19441DE00096FFA5 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77614E20BA800701302 /* CoreVideo.framework */; }; + BC57607B19441DE80096FFA5 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77414E20B9700701302 /* OpenGLES.framework */; }; + BC57607C19441DF10096FFA5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77214E20B9100701302 /* QuartzCore.framework */; }; + BC57607D19441DF60096FFA5 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E77014E20B8A00701302 /* AVFoundation.framework */; }; + BC57607E19441E010096FFA5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB5E76E14E20B7F00701302 /* UIKit.framework */; }; + BC57607F19441E060096FFA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; + BC57608019441E610096FFA5 /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageContext.m */; }; BC61F4B116B9CAEB009F6234 /* GPUImagePoissonBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 46A8097C16B8A6A2000C29ED /* GPUImagePoissonBlendFilter.m */; }; BC6C55401730679D00EB222D /* GPUImageLaplacianFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC6C553E1730679D00EB222D /* GPUImageLaplacianFilter.h */; }; BC6C55411730679D00EB222D /* GPUImageLaplacianFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6C553F1730679D00EB222D /* GPUImageLaplacianFilter.m */; }; @@ -471,7 +479,6 @@ BCD81F2B194404F8007133DB /* GPUImageTextureOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB6B8B91505BF940041703B /* GPUImageTextureOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCD81F2C194404F8007133DB /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B715514F49DAA00ACA2AB /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; BCD81F2D19440604007133DB /* GLProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E79314E3275200701302 /* GLProgram.m */; }; - BCD81F2E19440604007133DB /* GPUImageContext.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E76B14E20AD700701302 /* GPUImageContext.m */; }; BCD81F2F19440604007133DB /* GPUImageFramebuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC887CB18A1CEEB008DB37D /* GPUImageFramebuffer.m */; }; BCD81F3019440604007133DB /* GPUImageFramebufferCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC887CF18A1D3AD008DB37D /* GPUImageFramebufferCache.m */; }; BCD81F3119440604007133DB /* GPUImageOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5E77E14E22E4200701302 /* GPUImageOutput.m */; }; @@ -1047,6 +1054,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BC57607F19441E060096FFA5 /* Foundation.framework in Frameworks */, + BC57607E19441E010096FFA5 /* UIKit.framework in Frameworks */, + BC57607D19441DF60096FFA5 /* AVFoundation.framework in Frameworks */, + BC57607C19441DF10096FFA5 /* QuartzCore.framework in Frameworks */, + BC57607B19441DE80096FFA5 /* OpenGLES.framework in Frameworks */, + BC57607A19441DE00096FFA5 /* CoreVideo.framework in Frameworks */, + BC57607919441DD90096FFA5 /* CoreMedia.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2026,8 +2040,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BC57608019441E610096FFA5 /* GPUImageContext.m in Sources */, BCD81F2D19440604007133DB /* GLProgram.m in Sources */, - BCD81F2E19440604007133DB /* GPUImageContext.m in Sources */, BCD81F2F19440604007133DB /* GPUImageFramebuffer.m in Sources */, BCD81F3019440604007133DB /* GPUImageFramebufferCache.m in Sources */, BCD81F3119440604007133DB /* GPUImageOutput.m in Sources */, @@ -2452,7 +2466,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = NO; + ENABLE_NS_ASSERTIONS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = Source/iOS/Framework/Info.plist; From 653c0d721d0460000782b6659356dcb2aab72b88 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Sun, 8 Jun 2014 00:13:30 -0500 Subject: [PATCH 556/695] Minor tweak on framework search paths to get this to compile on iOS as a standalone. --- framework/GPUImage.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index ba7e9563a..590b3db8f 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -2423,6 +2423,7 @@ BCE209F91943F20D002FEED8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; @@ -2456,6 +2457,7 @@ BCE209FA1943F20D002FEED8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; From dc9fc7f5c5ba51c028a849447725cbcc3e19d4c8 Mon Sep 17 00:00:00 2001 From: rehatkathuria Date: Mon, 9 Jun 2014 12:19:29 +0100 Subject: [PATCH 557/695] Update README.md Added a semicolon to suppress the compiler that is my OCD. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae9d48c32..d1cdfa6b7 100755 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ There are a couple of ways to process a still image and create a result. The fir GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; [stillImageSource addTarget:stillImageFilter]; - [stillImageFilter useNextFrameForImageCapture] + [stillImageFilter useNextFrameForImageCapture]; [stillImageSource processImage]; UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; From 25ce90069e7ea9e096a7c3f56ae04dd64de3eb47 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 9 Jun 2014 14:13:39 -0500 Subject: [PATCH 558/695] Updated with a Zenodo citation. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d1cdfa6b7..9bc631277 100755 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@
+ + Brad Larson http://www.sunsetlakesoftware.com From 045d0edcd7aab4b43db41ca6693c63fddfa5b2fb Mon Sep 17 00:00:00 2001 From: mmtootmm Date: Wed, 11 Jun 2014 19:25:26 +0900 Subject: [PATCH 559/695] Fixed realtime recording --- framework/Source/iOS/GPUImageMovieWriter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 2f120efca..d9e8d994f 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -254,7 +254,6 @@ - (void)initializeMovieWithOutputSettings:(NSDictionary *)outputSettings; - (void)startRecording; { alreadyFinishedRecording = NO; - isRecording = YES; startTime = kCMTimeInvalid; runSynchronouslyOnContextQueue(_movieWriterContext, ^{ if (audioInputReadyCallback == NULL) @@ -262,6 +261,7 @@ - (void)startRecording; [assetWriter startWriting]; } }); + isRecording = YES; // [assetWriter startSessionAtSourceTime:kCMTimeZero]; } From 7e77cb0867851b745204677299a9f98991a81e9f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 30 Jun 2014 00:23:55 -0500 Subject: [PATCH 560/695] Created a new Swift-based FilterShowcase example for iOS, exploring new language features. --- README.md | 6 +- .../project.pbxproj | 407 ++++++++++++++++++ .../FilterShowcaseSwift/AppDelegate.swift | 12 + .../Base.lproj/Main.storyboard | 108 +++++ .../FilterDisplayViewController.swift | 100 +++++ .../FilterListViewController.swift | 36 ++ .../FilterOperationTypes.swift | 45 ++ .../FilterOperations.swift | 76 ++++ .../AppIcon.appiconset/Contents.json | 53 +++ .../LaunchImage.launchimage/Contents.json | 51 +++ .../FilterShowcaseSwift/Info.plist | 42 ++ framework/Source/GPUImageStillCamera.m | 3 + 12 files changed, 938 insertions(+), 1 deletion(-) create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/Main.storyboard create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterListViewController.swift create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist diff --git a/README.md b/README.md index 9bc631277..858a919c7 100755 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ For example, an application that takes in live video from the camera, converts t ## Adding the static library to your iOS project ## +Note: if you want to use this in a Swift project, you need to use the steps in the "Adding this as a framework" section instead of the following. Swift needs modules for third-party code. + Once you have the latest source code for the framework, it's fairly straightforward to add it to your application. Start by dragging the GPUImage.xcodeproj file into your application's Xcode project to embed the framework in your project. Next, go to your application's target and add GPUImage as a Target Dependency. Finally, you'll want to drag the libGPUImage.a library from the GPUImage framework's Products folder to the Link Binary With Libraries build phase in your application's target. GPUImage needs a few other frameworks to be linked into your application, so you'll need to add the following as linked libraries in your application target: @@ -74,7 +76,7 @@ Also, if you need to deploy this to iOS 4.x, it appears that the current version Additionally, this is an ARC-enabled framework, so if you want to use this within a manual reference counted application targeting iOS 4.x, you'll need to add -fobjc-arc to your Other Linker Flags as well. -### Building static library at the command line ### +### Building a static library at the command line ### If you don't want to include the project as a dependency in your application's Xcode project, you can build a universal static library for the iOS Simulator or device. To do this, run `build.sh` at the command line. The resulting library and header files will be located at `build/Release-iphone`. You may also change the version of the iOS SDK by changing the `IOSSDK_VER` variable in `build.sh` (all available versions can be found using `xcodebuild -showsdks`). @@ -90,6 +92,8 @@ This should cause GPUImage to build as a framework. Under Xcode 6, this will als to pull it in. +You then need to add a new Copy Files build phase, set the Destination to Frameworks, and add the GPUImage.framework build product to that. This will allow the framework to be bundled with your application (otherwise, you'll see cryptic "dyld: Library not loaded: @rpath/GPUImage.framework/GPUImage" errors on execution). + ### Documentation ### Documentation is generated from header comments using appledoc. To build the documentation, switch to the "Documentation" scheme in Xcode. You should ensure that "APPLEDOC_PATH" (a User-Defined build setting) points to an appledoc binary, available on Github or through Homebrew. It will also build and install a .docset file, which you can view with your favorite documentation tool. diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj new file mode 100644 index 000000000..5135ee0be --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj @@ -0,0 +1,407 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BC0037BD195CA11B00B9D651 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0037BC195CA11B00B9D651 /* AppDelegate.swift */; }; + BC0037BF195CA11B00B9D651 /* FilterListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0037BE195CA11B00B9D651 /* FilterListViewController.swift */; }; + BC0037C1195CA11B00B9D651 /* FilterDisplayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0037C0195CA11B00B9D651 /* FilterDisplayViewController.swift */; }; + BC0037C4195CA11B00B9D651 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BC0037C2195CA11B00B9D651 /* Main.storyboard */; }; + BC0037C6195CA11B00B9D651 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BC0037C5195CA11B00B9D651 /* Images.xcassets */; }; + BC0037EA195CC25D00B9D651 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC0037E7195CC24200B9D651 /* GPUImage.framework */; }; + BC0037ED195CC54D00B9D651 /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BC0037E7195CC24200B9D651 /* GPUImage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + BC0037EF195CC9E200B9D651 /* FilterOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0037EE195CC9E200B9D651 /* FilterOperations.swift */; }; + BCA01891195E503E004BC89E /* FilterOperationTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA01890195E503E004BC89E /* FilterOperationTypes.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BC0037E2195CC24200B9D651 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCF1A33414DDB1EC00852800; + remoteInfo = GPUImage; + }; + BC0037E4195CC24200B9D651 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCF1A34414DDB1EC00852800; + remoteInfo = GPUImageTests; + }; + BC0037E6195CC24200B9D651 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCE209E51943F20C002FEED8; + remoteInfo = GPUImageFramework; + }; + BC0037E8195CC25500B9D651 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BCE209E41943F20C002FEED8; + remoteInfo = GPUImageFramework; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + BC0037EC195CC54100B9D651 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BC0037ED195CC54D00B9D651 /* GPUImage.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + BC0037B7195CA11B00B9D651 /* FilterShowcaseSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FilterShowcaseSwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BC0037BB195CA11B00B9D651 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BC0037BC195CA11B00B9D651 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + BC0037BE195CA11B00B9D651 /* FilterListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterListViewController.swift; sourceTree = ""; }; + BC0037C0195CA11B00B9D651 /* FilterDisplayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterDisplayViewController.swift; sourceTree = ""; }; + BC0037C3195CA11B00B9D651 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + BC0037C5195CA11B00B9D651 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; + BC0037EE195CC9E200B9D651 /* FilterOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterOperations.swift; sourceTree = ""; }; + BCA01890195E503E004BC89E /* FilterOperationTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterOperationTypes.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BC0037B4195CA11B00B9D651 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BC0037EA195CC25D00B9D651 /* GPUImage.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BC0037AE195CA11B00B9D651 = { + isa = PBXGroup; + children = ( + BC0037B9195CA11B00B9D651 /* User interface */, + BCA018951960B031004BC89E /* Data model */, + BC0037BA195CA11B00B9D651 /* Supporting Files */, + BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */, + BC0037B8195CA11B00B9D651 /* Products */, + ); + sourceTree = ""; + }; + BC0037B8195CA11B00B9D651 /* Products */ = { + isa = PBXGroup; + children = ( + BC0037B7195CA11B00B9D651 /* FilterShowcaseSwift.app */, + ); + name = Products; + sourceTree = ""; + }; + BC0037B9195CA11B00B9D651 /* User interface */ = { + isa = PBXGroup; + children = ( + BC0037BC195CA11B00B9D651 /* AppDelegate.swift */, + BC0037BE195CA11B00B9D651 /* FilterListViewController.swift */, + BC0037C0195CA11B00B9D651 /* FilterDisplayViewController.swift */, + BC0037C2195CA11B00B9D651 /* Main.storyboard */, + ); + name = "User interface"; + path = FilterShowcaseSwift; + sourceTree = ""; + }; + BC0037BA195CA11B00B9D651 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BC0037C5195CA11B00B9D651 /* Images.xcassets */, + BC0037BB195CA11B00B9D651 /* Info.plist */, + ); + name = "Supporting Files"; + path = FilterShowcaseSwift; + sourceTree = ""; + }; + BC0037DC195CC24200B9D651 /* Products */ = { + isa = PBXGroup; + children = ( + BC0037E3195CC24200B9D651 /* libGPUImage.a */, + BC0037E5195CC24200B9D651 /* GPUImageTests.octest */, + BC0037E7195CC24200B9D651 /* GPUImage.framework */, + ); + name = Products; + sourceTree = ""; + }; + BCA018951960B031004BC89E /* Data model */ = { + isa = PBXGroup; + children = ( + BC0037EE195CC9E200B9D651 /* FilterOperations.swift */, + BCA01890195E503E004BC89E /* FilterOperationTypes.swift */, + ); + name = "Data model"; + path = FilterShowcaseSwift; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BC0037B6195CA11B00B9D651 /* FilterShowcaseSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = BC0037D5195CA11B00B9D651 /* Build configuration list for PBXNativeTarget "FilterShowcaseSwift" */; + buildPhases = ( + BC0037B3195CA11B00B9D651 /* Sources */, + BC0037B4195CA11B00B9D651 /* Frameworks */, + BC0037B5195CA11B00B9D651 /* Resources */, + BC0037EC195CC54100B9D651 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + BC0037E9195CC25500B9D651 /* PBXTargetDependency */, + ); + name = FilterShowcaseSwift; + productName = FilterShowcaseSwift; + productReference = BC0037B7195CA11B00B9D651 /* FilterShowcaseSwift.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BC0037AF195CA11B00B9D651 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = "Sunset Lake Software"; + TargetAttributes = { + BC0037B6195CA11B00B9D651 = { + CreatedOnToolsVersion = 6.0; + }; + }; + }; + buildConfigurationList = BC0037B2195CA11B00B9D651 /* Build configuration list for PBXProject "FilterShowcaseSwift" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = BC0037AE195CA11B00B9D651; + productRefGroup = BC0037B8195CA11B00B9D651 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BC0037DC195CC24200B9D651 /* Products */; + ProjectRef = BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + BC0037B6195CA11B00B9D651 /* FilterShowcaseSwift */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + BC0037E3195CC24200B9D651 /* libGPUImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libGPUImage.a; + remoteRef = BC0037E2195CC24200B9D651 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BC0037E5195CC24200B9D651 /* GPUImageTests.octest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = GPUImageTests.octest; + remoteRef = BC0037E4195CC24200B9D651 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BC0037E7195CC24200B9D651 /* GPUImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = GPUImage.framework; + remoteRef = BC0037E6195CC24200B9D651 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + BC0037B5195CA11B00B9D651 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC0037C4195CA11B00B9D651 /* Main.storyboard in Resources */, + BC0037C6195CA11B00B9D651 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BC0037B3195CA11B00B9D651 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC0037C1195CA11B00B9D651 /* FilterDisplayViewController.swift in Sources */, + BC0037BF195CA11B00B9D651 /* FilterListViewController.swift in Sources */, + BC0037BD195CA11B00B9D651 /* AppDelegate.swift in Sources */, + BCA01891195E503E004BC89E /* FilterOperationTypes.swift in Sources */, + BC0037EF195CC9E200B9D651 /* FilterOperations.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BC0037E9195CC25500B9D651 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GPUImageFramework; + targetProxy = BC0037E8195CC25500B9D651 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + BC0037C2195CA11B00B9D651 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + BC0037C3195CA11B00B9D651 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BC0037D3195CA11B00B9D651 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + METAL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + BC0037D4195CA11B00B9D651 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + METAL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + BC0037D6195CA11B00B9D651 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + INFOPLIST_FILE = FilterShowcaseSwift/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + BC0037D7195CA11B00B9D651 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + INFOPLIST_FILE = FilterShowcaseSwift/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BC0037B2195CA11B00B9D651 /* Build configuration list for PBXProject "FilterShowcaseSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC0037D3195CA11B00B9D651 /* Debug */, + BC0037D4195CA11B00B9D651 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BC0037D5195CA11B00B9D651 /* Build configuration list for PBXNativeTarget "FilterShowcaseSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC0037D6195CA11B00B9D651 /* Debug */, + BC0037D7195CA11B00B9D651 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BC0037AF195CA11B00B9D651 /* Project object */; +} diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift new file mode 100644 index 000000000..de1407f3b --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift @@ -0,0 +1,12 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { + return true + } +} + diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/Main.storyboard b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/Main.storyboard new file mode 100644 index 000000000..18684c0e7 --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/Main.storyboard @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift new file mode 100644 index 000000000..bb1361f27 --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift @@ -0,0 +1,100 @@ +import UIKit +import GPUImage + +class FilterDisplayViewController: UIViewController, UISplitViewControllerDelegate { + + @IBOutlet var filterSlider: UISlider? + @IBOutlet var filterView: GPUImageView? + + let videoCamera: GPUImageVideoCamera + var filter: GPUImageOutput? + var blendImage: GPUImagePicture? + + init(coder aDecoder: NSCoder!) + { + videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset640x480, cameraPosition: .Back) + videoCamera.outputImageOrientation = .Portrait; + + super.init(coder: aDecoder) + } + + var filterOperation: FilterOperation? { + didSet { + // Update the view. + self.configureView() + } + } + + func configureView() { + if let currentFilter = self.filterOperation { + self.title = currentFilter.titleName + + // Configure the filter chain, ending with the view + if let view = self.filterView { + switch currentFilter.filterOperationType { + case .SingleInput(let filter): + self.filter = filter + videoCamera.addTarget((self.filter! as GPUImageInput)) + self.filter?.addTarget(view) + case .Custom: + if let customFilterSetupFunction = currentFilter.customFilterSetupFunction + { + self.filter = customFilterSetupFunction(camera:videoCamera, outputView:view, blendImage:nil) + } + case .Blend(let filter, let blendImage): + self.filter = filter + videoCamera.addTarget((self.filter! as GPUImageInput)) + self.blendImage = GPUImagePicture(image: blendImage) + self.blendImage?.addTarget((self.filter! as GPUImageInput)) + filter.addTarget(view) + } + + videoCamera.startCameraCapture() + } + + // Hide or display the slider, based on whether the filter needs it + if let slider = self.filterSlider { + switch currentFilter.sliderConfiguration { + case .Disabled: + slider.hidden = true +// case let .Enabled(minimumValue, initialValue, maximumValue, filterSliderCallback): + case let .Enabled(minimumValue, initialValue, maximumValue): + slider.minimumValue = minimumValue + slider.maximumValue = maximumValue + slider.value = initialValue + slider.hidden = false + self.updateSliderValue() + } + } + + } + } + + @IBAction func updateSliderValue() { + if let currentFilter = self.filterOperation { + switch (currentFilter.sliderConfiguration) { + case let .Enabled(minimumValue, initialValue, maximumValue): + if let sliderUpdateCallback = currentFilter.sliderUpdateCallback + { + if let slider = self.filterSlider { + sliderUpdateCallback(filter: self.filter!, sliderValue: slider.value) + } + } + case .Disabled: + break + } + } + } + + override func viewDidLoad() { + super.viewDidLoad() + self.configureView() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + +} + diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterListViewController.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterListViewController.swift new file mode 100644 index 000000000..18c6250b6 --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterListViewController.swift @@ -0,0 +1,36 @@ +import UIKit + +class FilterListViewController: UITableViewController { + + var filterDisplayViewController: FilterDisplayViewController? = nil + var objects = NSMutableArray() + + // #pragma mark - Segues + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + if segue.identifier == "showDetail" { + let indexPath = self.tableView.indexPathForSelectedRow() + let filterInList = filterOperations[indexPath.row] + (segue.destinationViewController as FilterDisplayViewController).filterOperation = filterInList + } + } + + // #pragma mark - Table View + + override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + return 1 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return filterOperations.count + } + + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell + + let filterInList:FilterOperation = filterOperations[indexPath.row] + cell.textLabel.text = filterInList.listName + return cell + } +} + diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift new file mode 100644 index 000000000..25c068cbd --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift @@ -0,0 +1,45 @@ +import Foundation +import GPUImage + +// Use of this causes LLVM to faceplant, so have to split out the closures for now +//enum FilterSliderSetting { +// case Disabled +// case Enabled(minimumValue:Float, initialValue:Float, maximumValue:Float, stringValue:String) +//} + +enum FilterSliderSetting { + case Disabled + case Enabled(minimumValue:Float, initialValue:Float, maximumValue:Float) +} + +// Use of this causes LLVM to faceplant, so have to split out the closures for now +//enum FilterOperationType { +// case SingleInput(filter:GPUImageOutput) +// case Blend(filter:GPUImageOutput, blendImage:UIImage) +// case Custom(setupFunction:(camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput)) +//} + +enum FilterOperationType { + case SingleInput(filter:GPUImageOutput) + case Blend(filter:GPUImageOutput, blendImage:UIImage) + case Custom +} + +class FilterOperation { + let test:FilterSliderSetting = .Enabled(minimumValue:0.0, initialValue:1.0, maximumValue:1.0) + let listName: String + let titleName: String + let sliderConfiguration: FilterSliderSetting + let filterOperationType: FilterOperationType + let sliderUpdateCallback: ((filter:GPUImageOutput, sliderValue:Float) -> ())? + let customFilterSetupFunction: ((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))? + + init(listName: String, titleName: String, sliderConfiguration: FilterSliderSetting, sliderUpdateCallback:((filter:GPUImageOutput, sliderValue:Float) -> ())?, filterOperationType: FilterOperationType, customFilterSetupFunction:((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))?) { + self.listName = listName + self.titleName = titleName + self.sliderConfiguration = sliderConfiguration + self.filterOperationType = filterOperationType + self.sliderUpdateCallback = sliderUpdateCallback + self.customFilterSetupFunction = customFilterSetupFunction + } +} \ No newline at end of file diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift new file mode 100644 index 000000000..e4acaea34 --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift @@ -0,0 +1,76 @@ +import Foundation +import GPUImage +import QuartzCore + +let filterOperations: Array = [ + FilterOperation( + listName:"Sepia tone", + titleName:"Sepia Tone", + sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:1.0, maximumValue:1.0), + sliderUpdateCallback: {(filter:GPUImageOutput, sliderValue:Float) in + (filter as GPUImageSepiaFilter).intensity = CGFloat(sliderValue) // Why do I need to cast this for non-Simulator builds? That seems broken + }, + filterOperationType:.SingleInput(filter:GPUImageSepiaFilter()), + customFilterSetupFunction: nil + ), + FilterOperation( + listName:"Pixellate", + titleName:"Pixellate", + sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.05, maximumValue:0.3), + sliderUpdateCallback: {(filter:GPUImageOutput, sliderValue:Float) in + (filter as GPUImagePixellateFilter).fractionalWidthOfAPixel = CGFloat(sliderValue) + }, + filterOperationType:.SingleInput(filter:GPUImagePixellateFilter()), + customFilterSetupFunction: nil + ), + FilterOperation( + listName:"Color invert", + titleName:"Color Invert", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput(filter:GPUImageColorInvertFilter()), + customFilterSetupFunction: nil + ), + FilterOperation( + listName:"Transform (3-D)", + titleName:"Transform (3-D)", + sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.75, maximumValue:6.28), + sliderUpdateCallback:{(filter:GPUImageOutput, sliderValue:Float) in + var perspectiveTransform = CATransform3DIdentity + perspectiveTransform.m34 = 0.4 + perspectiveTransform.m33 = 0.4 + perspectiveTransform = CATransform3DScale(perspectiveTransform, 0.75, 0.75, 0.75) + perspectiveTransform = CATransform3DRotate(perspectiveTransform, CGFloat(sliderValue), 0.0, 1.0, 0.0) + (filter as GPUImageTransformFilter).transform3D = perspectiveTransform + }, + filterOperationType:.SingleInput(filter:GPUImageTransformFilter()), + customFilterSetupFunction: nil + ), + FilterOperation( + listName:"Sphere refraction", + titleName:"Sphere Refraction", + sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.15, maximumValue:1.0), + sliderUpdateCallback:{(filter:GPUImageOutput, sliderValue:Float) in + (filter as GPUImageSphereRefractionFilter).radius = CGFloat(sliderValue) + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) in + let filter = GPUImageSphereRefractionFilter() + camera.addTarget(filter) + + // Provide a blurred image for a cool-looking background + let gaussianBlur = GPUImageGaussianBlurFilter() + camera.addTarget(gaussianBlur) + gaussianBlur.blurRadiusInPixels = 5.0 + + let blendFilter = GPUImageAlphaBlendFilter() + blendFilter.mix = 1.0 + gaussianBlur.addTarget(blendFilter) + filter.addTarget(blendFilter) + + blendFilter.addTarget(outputView) + + return filter + } + ), +] \ No newline at end of file diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..91bf9c14a --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/LaunchImage.launchimage/Contents.json b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 000000000..6f870a462 --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,51 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist new file mode 100644 index 000000000..a70abd66e --- /dev/null +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist @@ -0,0 +1,42 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + + diff --git a/framework/Source/GPUImageStillCamera.m b/framework/Source/GPUImageStillCamera.m index 998aecc9f..447f79f62 100755 --- a/framework/Source/GPUImageStillCamera.m +++ b/framework/Source/GPUImageStillCamera.m @@ -70,7 +70,10 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD } /* Detect iOS version < 6 which require a texture cache corruption workaround */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" requiresFrontCameraTextureCacheCorruptionWorkaround = [[[UIDevice currentDevice] systemVersion] compare:@"6.0" options:NSNumericSearch] == NSOrderedAscending; +#pragma clang diagnostic pop [self.captureSession beginConfiguration]; From b51b1ca44145def8f6e1785d3614ab73422490fa Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 30 Jun 2014 07:53:05 -0500 Subject: [PATCH 561/695] Added an extremely simple Swift example for how to use the framework to the iOS projects. --- .../project.pbxproj | 427 ++++++++++++++++++ .../AppDelegate.swift | 11 + .../Base.lproj/Main.storyboard | 26 ++ .../AppIcon.appiconset/Contents.json | 53 +++ .../LaunchImage.launchimage/Contents.json | 51 +++ .../SimpleSwiftVideoFilterExample/Info.plist | 36 ++ .../ViewController.swift | 19 + 7 files changed, 623 insertions(+) create mode 100644 examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj create mode 100644 examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/AppDelegate.swift create mode 100644 examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Base.lproj/Main.storyboard create mode 100644 examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Info.plist create mode 100644 examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/ViewController.swift diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj new file mode 100644 index 000000000..d75e5d661 --- /dev/null +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj @@ -0,0 +1,427 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BC73FD2419612C19004A9191 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC73FD2319612C19004A9191 /* AppDelegate.swift */; }; + BC73FD2619612C19004A9191 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC73FD2519612C19004A9191 /* ViewController.swift */; }; + BC73FD2919612C19004A9191 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BC73FD2719612C19004A9191 /* Main.storyboard */; }; + BC73FD2B19612C19004A9191 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BC73FD2A19612C19004A9191 /* Images.xcassets */; }; + BC73FD3719612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC73FD3619612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BC73FD3119612C19004A9191 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC73FD1619612C19004A9191 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BC73FD1D19612C19004A9191; + remoteInfo = SimpleSwiftVideoFilterExample; + }; + BC73FD4019612C23004A9191 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC73FD1619612C19004A9191 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BC73FD1D19612C19004A9191; + remoteInfo = SimpleSwiftVideoFilterExample; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + BC73FD1E19612C19004A9191 /* SimpleSwiftVideoFilterExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleSwiftVideoFilterExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BC73FD2219612C19004A9191 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BC73FD2319612C19004A9191 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + BC73FD2519612C19004A9191 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + BC73FD2819612C19004A9191 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + BC73FD2A19612C19004A9191 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + BC73FD3019612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SimpleSwiftVideoFilterExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + BC73FD3519612C19004A9191 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BC73FD3619612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleSwiftVideoFilterExampleTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BC73FD1B19612C19004A9191 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BC73FD2D19612C19004A9191 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BC73FD1519612C19004A9191 = { + isa = PBXGroup; + children = ( + BC73FD2019612C19004A9191 /* SimpleSwiftVideoFilterExample */, + BC73FD3319612C19004A9191 /* SimpleSwiftVideoFilterExampleTests */, + BC73FD1F19612C19004A9191 /* Products */, + ); + sourceTree = ""; + }; + BC73FD1F19612C19004A9191 /* Products */ = { + isa = PBXGroup; + children = ( + BC73FD1E19612C19004A9191 /* SimpleSwiftVideoFilterExample.app */, + BC73FD3019612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + BC73FD2019612C19004A9191 /* SimpleSwiftVideoFilterExample */ = { + isa = PBXGroup; + children = ( + BC73FD2319612C19004A9191 /* AppDelegate.swift */, + BC73FD2519612C19004A9191 /* ViewController.swift */, + BC73FD2719612C19004A9191 /* Main.storyboard */, + BC73FD2A19612C19004A9191 /* Images.xcassets */, + BC73FD2119612C19004A9191 /* Supporting Files */, + ); + path = SimpleSwiftVideoFilterExample; + sourceTree = ""; + }; + BC73FD2119612C19004A9191 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BC73FD2219612C19004A9191 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BC73FD3319612C19004A9191 /* SimpleSwiftVideoFilterExampleTests */ = { + isa = PBXGroup; + children = ( + BC73FD3619612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift */, + BC73FD3419612C19004A9191 /* Supporting Files */, + ); + path = SimpleSwiftVideoFilterExampleTests; + sourceTree = ""; + }; + BC73FD3419612C19004A9191 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BC73FD3519612C19004A9191 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BC73FD1D19612C19004A9191 /* SimpleSwiftVideoFilterExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = BC73FD3A19612C19004A9191 /* Build configuration list for PBXNativeTarget "SimpleSwiftVideoFilterExample" */; + buildPhases = ( + BC73FD1A19612C19004A9191 /* Sources */, + BC73FD1B19612C19004A9191 /* Frameworks */, + BC73FD1C19612C19004A9191 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SimpleSwiftVideoFilterExample; + productName = SimpleSwiftVideoFilterExample; + productReference = BC73FD1E19612C19004A9191 /* SimpleSwiftVideoFilterExample.app */; + productType = "com.apple.product-type.application"; + }; + BC73FD2F19612C19004A9191 /* SimpleSwiftVideoFilterExampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = BC73FD3D19612C19004A9191 /* Build configuration list for PBXNativeTarget "SimpleSwiftVideoFilterExampleTests" */; + buildPhases = ( + BC73FD2C19612C19004A9191 /* Sources */, + BC73FD2D19612C19004A9191 /* Frameworks */, + BC73FD2E19612C19004A9191 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BC73FD3219612C19004A9191 /* PBXTargetDependency */, + BC73FD4119612C23004A9191 /* PBXTargetDependency */, + ); + name = SimpleSwiftVideoFilterExampleTests; + productName = SimpleSwiftVideoFilterExampleTests; + productReference = BC73FD3019612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BC73FD1619612C19004A9191 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = "Sunset Lake Software"; + TargetAttributes = { + BC73FD1D19612C19004A9191 = { + CreatedOnToolsVersion = 6.0; + }; + BC73FD2F19612C19004A9191 = { + CreatedOnToolsVersion = 6.0; + TestTargetID = BC73FD1D19612C19004A9191; + }; + }; + }; + buildConfigurationList = BC73FD1919612C19004A9191 /* Build configuration list for PBXProject "SimpleSwiftVideoFilterExample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = BC73FD1519612C19004A9191; + productRefGroup = BC73FD1F19612C19004A9191 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + BC73FD1D19612C19004A9191 /* SimpleSwiftVideoFilterExample */, + BC73FD2F19612C19004A9191 /* SimpleSwiftVideoFilterExampleTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + BC73FD1C19612C19004A9191 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC73FD2919612C19004A9191 /* Main.storyboard in Resources */, + BC73FD2B19612C19004A9191 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BC73FD2E19612C19004A9191 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BC73FD1A19612C19004A9191 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC73FD2619612C19004A9191 /* ViewController.swift in Sources */, + BC73FD2419612C19004A9191 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BC73FD2C19612C19004A9191 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC73FD3719612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BC73FD3219612C19004A9191 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BC73FD1D19612C19004A9191 /* SimpleSwiftVideoFilterExample */; + targetProxy = BC73FD3119612C19004A9191 /* PBXContainerItemProxy */; + }; + BC73FD4119612C23004A9191 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BC73FD1D19612C19004A9191 /* SimpleSwiftVideoFilterExample */; + targetProxy = BC73FD4019612C23004A9191 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + BC73FD2719612C19004A9191 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + BC73FD2819612C19004A9191 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BC73FD3819612C19004A9191 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + METAL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + BC73FD3919612C19004A9191 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + METAL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + BC73FD3B19612C19004A9191 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + INFOPLIST_FILE = SimpleSwiftVideoFilterExample/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + BC73FD3C19612C19004A9191 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + INFOPLIST_FILE = SimpleSwiftVideoFilterExample/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + BC73FD3E19612C19004A9191 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SimpleSwiftVideoFilterExample.app/SimpleSwiftVideoFilterExample"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = SimpleSwiftVideoFilterExampleTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + METAL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + }; + name = Debug; + }; + BC73FD3F19612C19004A9191 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SimpleSwiftVideoFilterExample.app/SimpleSwiftVideoFilterExample"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = SimpleSwiftVideoFilterExampleTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + METAL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BC73FD1919612C19004A9191 /* Build configuration list for PBXProject "SimpleSwiftVideoFilterExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC73FD3819612C19004A9191 /* Debug */, + BC73FD3919612C19004A9191 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BC73FD3A19612C19004A9191 /* Build configuration list for PBXNativeTarget "SimpleSwiftVideoFilterExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC73FD3B19612C19004A9191 /* Debug */, + BC73FD3C19612C19004A9191 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BC73FD3D19612C19004A9191 /* Build configuration list for PBXNativeTarget "SimpleSwiftVideoFilterExampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC73FD3E19612C19004A9191 /* Debug */, + BC73FD3F19612C19004A9191 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = BC73FD1619612C19004A9191 /* Project object */; +} diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/AppDelegate.swift b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/AppDelegate.swift new file mode 100644 index 000000000..c9bbc4c59 --- /dev/null +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/AppDelegate.swift @@ -0,0 +1,11 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { + return true + } +} \ No newline at end of file diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Base.lproj/Main.storyboard b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Base.lproj/Main.storyboard new file mode 100644 index 000000000..14772f55e --- /dev/null +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..91bf9c14a --- /dev/null +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Images.xcassets/LaunchImage.launchimage/Contents.json b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 000000000..6f870a462 --- /dev/null +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,51 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Info.plist b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Info.plist new file mode 100644 index 000000000..5b429967f --- /dev/null +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + + diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/ViewController.swift b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/ViewController.swift new file mode 100644 index 000000000..807c07c7d --- /dev/null +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample/ViewController.swift @@ -0,0 +1,19 @@ +import UIKit +import GPUImage + +class ViewController: UIViewController { + + var videoCamera:GPUImageVideoCamera? + var filter:GPUImagePixellateFilter? + + override func viewDidLoad() { + super.viewDidLoad() + + videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset640x480, cameraPosition: .Back) + videoCamera!.outputImageOrientation = .Portrait; + filter = GPUImagePixellateFilter() + videoCamera?.addTarget(filter) + filter?.addTarget(self.view as GPUImageView) + videoCamera?.startCameraCapture() + } +} \ No newline at end of file From bd8a7aa655b3220e6032b1e37afd27c7a858aa1b Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 30 Jun 2014 13:02:06 -0500 Subject: [PATCH 562/695] Tweaks to the sample applications. --- .../FilterOperationTypes.swift | 3 +- .../project.pbxproj | 210 +++++++----------- 2 files changed, 84 insertions(+), 129 deletions(-) diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift index 25c068cbd..cb53c82d6 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift @@ -4,7 +4,7 @@ import GPUImage // Use of this causes LLVM to faceplant, so have to split out the closures for now //enum FilterSliderSetting { // case Disabled -// case Enabled(minimumValue:Float, initialValue:Float, maximumValue:Float, stringValue:String) +// case Enabled(minimumValue:Float, initialValue:Float, maximumValue:Float, sliderUpdateCallback:((filter:GPUImageOutput, sliderValue:Float) -> ())?) //} enum FilterSliderSetting { @@ -26,7 +26,6 @@ enum FilterOperationType { } class FilterOperation { - let test:FilterSliderSetting = .Enabled(minimumValue:0.0, initialValue:1.0, maximumValue:1.0) let listName: String let titleName: String let sliderConfiguration: FilterSliderSetting diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj index d75e5d661..bb03c099e 100644 --- a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj @@ -11,26 +11,54 @@ BC73FD2619612C19004A9191 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC73FD2519612C19004A9191 /* ViewController.swift */; }; BC73FD2919612C19004A9191 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BC73FD2719612C19004A9191 /* Main.storyboard */; }; BC73FD2B19612C19004A9191 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BC73FD2A19612C19004A9191 /* Images.xcassets */; }; - BC73FD3719612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC73FD3619612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift */; }; + BC73FD5519612C75004A9191 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC73FD5419612C75004A9191 /* GPUImage.framework */; }; + BC73FD5719612C8F004A9191 /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BC73FD5419612C75004A9191 /* GPUImage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BC73FD3119612C19004A9191 /* PBXContainerItemProxy */ = { + BC73FD4919612C6F004A9191 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = BC73FD1619612C19004A9191 /* Project object */; + containerPortal = BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */; proxyType = 1; - remoteGlobalIDString = BC73FD1D19612C19004A9191; - remoteInfo = SimpleSwiftVideoFilterExample; + remoteGlobalIDString = BCE209E41943F20C002FEED8; + remoteInfo = GPUImageFramework; }; - BC73FD4019612C23004A9191 /* PBXContainerItemProxy */ = { + BC73FD4F19612C75004A9191 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = BC73FD1619612C19004A9191 /* Project object */; - proxyType = 1; - remoteGlobalIDString = BC73FD1D19612C19004A9191; - remoteInfo = SimpleSwiftVideoFilterExample; + containerPortal = BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCF1A33414DDB1EC00852800; + remoteInfo = GPUImage; + }; + BC73FD5119612C75004A9191 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCF1A34414DDB1EC00852800; + remoteInfo = GPUImageTests; + }; + BC73FD5319612C75004A9191 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCE209E51943F20C002FEED8; + remoteInfo = GPUImageFramework; }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + BC73FD5619612C86004A9191 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BC73FD5719612C8F004A9191 /* GPUImage.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ BC73FD1E19612C19004A9191 /* SimpleSwiftVideoFilterExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleSwiftVideoFilterExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; BC73FD2219612C19004A9191 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -38,9 +66,7 @@ BC73FD2519612C19004A9191 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; BC73FD2819612C19004A9191 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; BC73FD2A19612C19004A9191 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - BC73FD3019612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SimpleSwiftVideoFilterExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - BC73FD3519612C19004A9191 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BC73FD3619612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleSwiftVideoFilterExampleTests.swift; sourceTree = ""; }; + BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -48,13 +74,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BC73FD2D19612C19004A9191 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( + BC73FD5519612C75004A9191 /* GPUImage.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -65,7 +85,7 @@ isa = PBXGroup; children = ( BC73FD2019612C19004A9191 /* SimpleSwiftVideoFilterExample */, - BC73FD3319612C19004A9191 /* SimpleSwiftVideoFilterExampleTests */, + BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */, BC73FD1F19612C19004A9191 /* Products */, ); sourceTree = ""; @@ -74,7 +94,6 @@ isa = PBXGroup; children = ( BC73FD1E19612C19004A9191 /* SimpleSwiftVideoFilterExample.app */, - BC73FD3019612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.xctest */, ); name = Products; sourceTree = ""; @@ -99,21 +118,14 @@ name = "Supporting Files"; sourceTree = ""; }; - BC73FD3319612C19004A9191 /* SimpleSwiftVideoFilterExampleTests */ = { - isa = PBXGroup; - children = ( - BC73FD3619612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift */, - BC73FD3419612C19004A9191 /* Supporting Files */, - ); - path = SimpleSwiftVideoFilterExampleTests; - sourceTree = ""; - }; - BC73FD3419612C19004A9191 /* Supporting Files */ = { + BC73FD4719612C54004A9191 /* Products */ = { isa = PBXGroup; children = ( - BC73FD3519612C19004A9191 /* Info.plist */, + BC73FD5019612C75004A9191 /* libGPUImage.a */, + BC73FD5219612C75004A9191 /* GPUImageTests.octest */, + BC73FD5419612C75004A9191 /* GPUImage.framework */, ); - name = "Supporting Files"; + name = Products; sourceTree = ""; }; /* End PBXGroup section */ @@ -125,36 +137,19 @@ buildPhases = ( BC73FD1A19612C19004A9191 /* Sources */, BC73FD1B19612C19004A9191 /* Frameworks */, + BC73FD5619612C86004A9191 /* CopyFiles */, BC73FD1C19612C19004A9191 /* Resources */, ); buildRules = ( ); dependencies = ( + BC73FD4A19612C6F004A9191 /* PBXTargetDependency */, ); name = SimpleSwiftVideoFilterExample; productName = SimpleSwiftVideoFilterExample; productReference = BC73FD1E19612C19004A9191 /* SimpleSwiftVideoFilterExample.app */; productType = "com.apple.product-type.application"; }; - BC73FD2F19612C19004A9191 /* SimpleSwiftVideoFilterExampleTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = BC73FD3D19612C19004A9191 /* Build configuration list for PBXNativeTarget "SimpleSwiftVideoFilterExampleTests" */; - buildPhases = ( - BC73FD2C19612C19004A9191 /* Sources */, - BC73FD2D19612C19004A9191 /* Frameworks */, - BC73FD2E19612C19004A9191 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - BC73FD3219612C19004A9191 /* PBXTargetDependency */, - BC73FD4119612C23004A9191 /* PBXTargetDependency */, - ); - name = SimpleSwiftVideoFilterExampleTests; - productName = SimpleSwiftVideoFilterExampleTests; - productReference = BC73FD3019612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -167,10 +162,6 @@ BC73FD1D19612C19004A9191 = { CreatedOnToolsVersion = 6.0; }; - BC73FD2F19612C19004A9191 = { - CreatedOnToolsVersion = 6.0; - TestTargetID = BC73FD1D19612C19004A9191; - }; }; }; buildConfigurationList = BC73FD1919612C19004A9191 /* Build configuration list for PBXProject "SimpleSwiftVideoFilterExample" */; @@ -184,14 +175,43 @@ mainGroup = BC73FD1519612C19004A9191; productRefGroup = BC73FD1F19612C19004A9191 /* Products */; projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BC73FD4719612C54004A9191 /* Products */; + ProjectRef = BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */; + }, + ); projectRoot = ""; targets = ( BC73FD1D19612C19004A9191 /* SimpleSwiftVideoFilterExample */, - BC73FD2F19612C19004A9191 /* SimpleSwiftVideoFilterExampleTests */, ); }; /* End PBXProject section */ +/* Begin PBXReferenceProxy section */ + BC73FD5019612C75004A9191 /* libGPUImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libGPUImage.a; + remoteRef = BC73FD4F19612C75004A9191 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BC73FD5219612C75004A9191 /* GPUImageTests.octest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = GPUImageTests.octest; + remoteRef = BC73FD5119612C75004A9191 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BC73FD5419612C75004A9191 /* GPUImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = GPUImage.framework; + remoteRef = BC73FD5319612C75004A9191 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + /* Begin PBXResourcesBuildPhase section */ BC73FD1C19612C19004A9191 /* Resources */ = { isa = PBXResourcesBuildPhase; @@ -202,13 +222,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BC73FD2E19612C19004A9191 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -221,26 +234,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BC73FD2C19612C19004A9191 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BC73FD3719612C19004A9191 /* SimpleSwiftVideoFilterExampleTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - BC73FD3219612C19004A9191 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = BC73FD1D19612C19004A9191 /* SimpleSwiftVideoFilterExample */; - targetProxy = BC73FD3119612C19004A9191 /* PBXContainerItemProxy */; - }; - BC73FD4119612C23004A9191 /* PBXTargetDependency */ = { + BC73FD4A19612C6F004A9191 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = BC73FD1D19612C19004A9191 /* SimpleSwiftVideoFilterExample */; - targetProxy = BC73FD4019612C23004A9191 /* PBXContainerItemProxy */; + name = GPUImageFramework; + targetProxy = BC73FD4919612C6F004A9191 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -290,7 +290,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; METAL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -327,7 +327,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; METAL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -357,42 +357,6 @@ }; name = Release; }; - BC73FD3E19612C19004A9191 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SimpleSwiftVideoFilterExample.app/SimpleSwiftVideoFilterExample"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = SimpleSwiftVideoFilterExampleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - }; - name = Debug; - }; - BC73FD3F19612C19004A9191 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SimpleSwiftVideoFilterExample.app/SimpleSwiftVideoFilterExample"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = SimpleSwiftVideoFilterExampleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -413,14 +377,6 @@ ); defaultConfigurationIsVisible = 0; }; - BC73FD3D19612C19004A9191 /* Build configuration list for PBXNativeTarget "SimpleSwiftVideoFilterExampleTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BC73FD3E19612C19004A9191 /* Debug */, - BC73FD3F19612C19004A9191 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; /* End XCConfigurationList section */ }; rootObject = BC73FD1619612C19004A9191 /* Project object */; From e988aee2fd744592bf578ddc2d5c28bd65eb6d02 Mon Sep 17 00:00:00 2001 From: Laura Skelton Date: Tue, 1 Jul 2014 17:43:37 -0400 Subject: [PATCH 563/695] Fixed incorrectly rotated images in Mosaic Filter. --- .../FilterShowcase/ShowcaseFilterViewController.m | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index ec97459e2..f1acc51b1 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -882,9 +882,7 @@ - (void)setupFilter; [(GPUImageMosaicFilter *)filter setColorOn:NO]; //[(GPUImageMosaicFilter *)filter setTileSet:@"dotletterstiles.png"]; //[(GPUImageMosaicFilter *)filter setTileSet:@"curvies.png"]; - - [filter setInputRotation:kGPUImageRotateRight atIndex:0]; - + }; break; case GPUIMAGE_CHROMAKEY: { From d69d7f5ff893af2824a948a5acb142ddd47f587d Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 8 Jul 2014 12:20:13 -0500 Subject: [PATCH 564/695] Enhanced the Swift FilterShowcase using generics. Updated to new Swift syntax. --- .../project.pbxproj | 4 +- .../FilterDisplayViewController.swift | 47 +++++++---------- .../FilterListViewController.swift | 2 +- .../FilterOperationTypes.swift | 52 ++++++++++++++++--- .../FilterOperations.swift | 42 ++++++++------- .../project.pbxproj | 5 +- 6 files changed, 91 insertions(+), 61 deletions(-) diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj index 5135ee0be..9a4f2dda3 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj @@ -313,7 +313,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; METAL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -350,7 +350,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; METAL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift index bb1361f27..dd9943452 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift @@ -7,7 +7,6 @@ class FilterDisplayViewController: UIViewController, UISplitViewControllerDelega @IBOutlet var filterView: GPUImageView? let videoCamera: GPUImageVideoCamera - var filter: GPUImageOutput? var blendImage: GPUImagePicture? init(coder aDecoder: NSCoder!) @@ -18,35 +17,30 @@ class FilterDisplayViewController: UIViewController, UISplitViewControllerDelega super.init(coder: aDecoder) } - var filterOperation: FilterOperation? { + var filterOperation: FilterOperationInterface? { didSet { - // Update the view. self.configureView() } } func configureView() { - if let currentFilter = self.filterOperation { - self.title = currentFilter.titleName + if let currentFilterConfiguration = self.filterOperation { + self.title = currentFilterConfiguration.titleName // Configure the filter chain, ending with the view if let view = self.filterView { - switch currentFilter.filterOperationType { - case .SingleInput(let filter): - self.filter = filter - videoCamera.addTarget((self.filter! as GPUImageInput)) - self.filter?.addTarget(view) + switch currentFilterConfiguration.filterOperationType { + case .SingleInput: + videoCamera.addTarget((currentFilterConfiguration.filter as GPUImageInput)) + currentFilterConfiguration.filter.addTarget(view) + case .Blend(let blendSource): + videoCamera.addTarget((currentFilterConfiguration.filter as GPUImageInput)) + self.blendImage = GPUImagePicture(image: blendSource) + self.blendImage?.addTarget((currentFilterConfiguration.filter as GPUImageInput)) + currentFilterConfiguration.filter.addTarget(view) case .Custom: - if let customFilterSetupFunction = currentFilter.customFilterSetupFunction - { - self.filter = customFilterSetupFunction(camera:videoCamera, outputView:view, blendImage:nil) - } - case .Blend(let filter, let blendImage): - self.filter = filter - videoCamera.addTarget((self.filter! as GPUImageInput)) - self.blendImage = GPUImagePicture(image: blendImage) - self.blendImage?.addTarget((self.filter! as GPUImageInput)) - filter.addTarget(view) + let setupFunction = currentFilterConfiguration.customFilterSetupFunction! + currentFilterConfiguration.configureCustomFilter(setupFunction(camera:videoCamera, outputView:view, blendImage:nil)) } videoCamera.startCameraCapture() @@ -54,7 +48,7 @@ class FilterDisplayViewController: UIViewController, UISplitViewControllerDelega // Hide or display the slider, based on whether the filter needs it if let slider = self.filterSlider { - switch currentFilter.sliderConfiguration { + switch currentFilterConfiguration.sliderConfiguration { case .Disabled: slider.hidden = true // case let .Enabled(minimumValue, initialValue, maximumValue, filterSliderCallback): @@ -71,15 +65,10 @@ class FilterDisplayViewController: UIViewController, UISplitViewControllerDelega } @IBAction func updateSliderValue() { - if let currentFilter = self.filterOperation { - switch (currentFilter.sliderConfiguration) { + if let currentFilterConfiguration = self.filterOperation { + switch (currentFilterConfiguration.sliderConfiguration) { case let .Enabled(minimumValue, initialValue, maximumValue): - if let sliderUpdateCallback = currentFilter.sliderUpdateCallback - { - if let slider = self.filterSlider { - sliderUpdateCallback(filter: self.filter!, sliderValue: slider.value) - } - } + currentFilterConfiguration.updateBasedOnSliderValue(self.filterSlider!.value) // If the UISlider isn't wired up, I want this to throw a runtime exception case .Disabled: break } diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterListViewController.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterListViewController.swift index 18c6250b6..03fd57206 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterListViewController.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterListViewController.swift @@ -28,7 +28,7 @@ class FilterListViewController: UITableViewController { override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell - let filterInList:FilterOperation = filterOperations[indexPath.row] + let filterInList:FilterOperationInterface = filterOperations[indexPath.row] cell.textLabel.text = filterInList.listName return cell } diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift index cb53c82d6..67066b795 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift @@ -14,31 +14,69 @@ enum FilterSliderSetting { // Use of this causes LLVM to faceplant, so have to split out the closures for now //enum FilterOperationType { -// case SingleInput(filter:GPUImageOutput) -// case Blend(filter:GPUImageOutput, blendImage:UIImage) +// case SingleInput +// case Blend(blendImage:UIImage) // case Custom(setupFunction:(camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput)) //} enum FilterOperationType { - case SingleInput(filter:GPUImageOutput) - case Blend(filter:GPUImageOutput, blendImage:UIImage) + case SingleInput + case Blend(blendImage:UIImage) case Custom } -class FilterOperation { +protocol FilterOperationInterface { + var filter: GPUImageOutput { get } + var listName: String { get } + var titleName: String { get } + var sliderConfiguration: FilterSliderSetting { get } + var filterOperationType: FilterOperationType { get } + var customFilterSetupFunction: ((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))? { get } + + func configureCustomFilter(filter:GPUImageOutput) + func updateBasedOnSliderValue(sliderValue:Float) +} + +class FilterOperation: FilterOperationInterface { + var internalFilter: FilterClass? let listName: String let titleName: String let sliderConfiguration: FilterSliderSetting let filterOperationType: FilterOperationType - let sliderUpdateCallback: ((filter:GPUImageOutput, sliderValue:Float) -> ())? + let sliderUpdateCallback: ((filter:FilterClass, sliderValue:Float) -> ())? let customFilterSetupFunction: ((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))? - init(listName: String, titleName: String, sliderConfiguration: FilterSliderSetting, sliderUpdateCallback:((filter:GPUImageOutput, sliderValue:Float) -> ())?, filterOperationType: FilterOperationType, customFilterSetupFunction:((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))?) { + init(listName: String, titleName: String, sliderConfiguration: FilterSliderSetting, sliderUpdateCallback:((filter:FilterClass, sliderValue:Float) -> ())?, filterOperationType: FilterOperationType, customFilterSetupFunction:((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))?) { self.listName = listName self.titleName = titleName self.sliderConfiguration = sliderConfiguration self.filterOperationType = filterOperationType self.sliderUpdateCallback = sliderUpdateCallback self.customFilterSetupFunction = customFilterSetupFunction + switch (filterOperationType) { + case .Custom: + break + default: + self.internalFilter = FilterClass() + } + +// if (!customFilterSetupFunction) { +// self.internalFilter = FilterClass() +// } + } + + var filter: GPUImageOutput { + return internalFilter! + } + + func configureCustomFilter(filter:GPUImageOutput) { + self.internalFilter = (filter as FilterClass) + } + + func updateBasedOnSliderValue(sliderValue:Float) { + if let updateFunction = sliderUpdateCallback + { + updateFunction(filter:internalFilter!, sliderValue:sliderValue) + } } } \ No newline at end of file diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift index e4acaea34..a84473e09 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift @@ -2,59 +2,59 @@ import Foundation import GPUImage import QuartzCore -let filterOperations: Array = [ - FilterOperation( +let filterOperations: Array = [ + FilterOperation ( listName:"Sepia tone", titleName:"Sepia Tone", sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:1.0, maximumValue:1.0), - sliderUpdateCallback: {(filter:GPUImageOutput, sliderValue:Float) in - (filter as GPUImageSepiaFilter).intensity = CGFloat(sliderValue) // Why do I need to cast this for non-Simulator builds? That seems broken + sliderUpdateCallback: {(filter, sliderValue) in + filter.intensity = CGFloat(sliderValue) // Why do I need to cast this for non-Simulator builds? That seems broken }, - filterOperationType:.SingleInput(filter:GPUImageSepiaFilter()), + filterOperationType:.SingleInput, customFilterSetupFunction: nil ), - FilterOperation( + FilterOperation ( listName:"Pixellate", titleName:"Pixellate", sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.05, maximumValue:0.3), - sliderUpdateCallback: {(filter:GPUImageOutput, sliderValue:Float) in - (filter as GPUImagePixellateFilter).fractionalWidthOfAPixel = CGFloat(sliderValue) + sliderUpdateCallback: {(filter, sliderValue) in + filter.fractionalWidthOfAPixel = CGFloat(sliderValue) }, - filterOperationType:.SingleInput(filter:GPUImagePixellateFilter()), + filterOperationType:.SingleInput, customFilterSetupFunction: nil ), - FilterOperation( + FilterOperation ( listName:"Color invert", titleName:"Color Invert", sliderConfiguration:.Disabled, sliderUpdateCallback: nil, - filterOperationType:.SingleInput(filter:GPUImageColorInvertFilter()), + filterOperationType:.SingleInput, customFilterSetupFunction: nil ), - FilterOperation( + FilterOperation ( listName:"Transform (3-D)", titleName:"Transform (3-D)", sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.75, maximumValue:6.28), - sliderUpdateCallback:{(filter:GPUImageOutput, sliderValue:Float) in + sliderUpdateCallback:{(filter, sliderValue) in var perspectiveTransform = CATransform3DIdentity perspectiveTransform.m34 = 0.4 perspectiveTransform.m33 = 0.4 perspectiveTransform = CATransform3DScale(perspectiveTransform, 0.75, 0.75, 0.75) perspectiveTransform = CATransform3DRotate(perspectiveTransform, CGFloat(sliderValue), 0.0, 1.0, 0.0) - (filter as GPUImageTransformFilter).transform3D = perspectiveTransform + filter.transform3D = perspectiveTransform }, - filterOperationType:.SingleInput(filter:GPUImageTransformFilter()), + filterOperationType:.SingleInput, customFilterSetupFunction: nil ), - FilterOperation( + FilterOperation ( listName:"Sphere refraction", titleName:"Sphere Refraction", sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.15, maximumValue:1.0), - sliderUpdateCallback:{(filter:GPUImageOutput, sliderValue:Float) in - (filter as GPUImageSphereRefractionFilter).radius = CGFloat(sliderValue) + sliderUpdateCallback:{(filter, sliderValue) in + filter.radius = CGFloat(sliderValue) }, filterOperationType:.Custom, - customFilterSetupFunction:{(camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) in + customFilterSetupFunction:{(camera, outputView, blendImage) in let filter = GPUImageSphereRefractionFilter() camera.addTarget(filter) @@ -73,4 +73,6 @@ let filterOperations: Array = [ return filter } ), -] \ No newline at end of file +] + +// Corner detector would use this: http://stackoverflow.com/questions/24051395/how-to-go-from-cmutablepointercgfloat-to-cgfloat-in-swift/24414058#24414058 diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj index bb03c099e..567364b8f 100644 --- a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj @@ -290,7 +290,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; METAL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -327,7 +327,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; METAL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -376,6 +376,7 @@ BC73FD3C19612C19004A9191 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; From 94d937b37a3f11a372702ff33971457fb1a807cf Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 8 Jul 2014 12:21:21 -0500 Subject: [PATCH 565/695] Removed the unused unit tests from the framework. --- framework/GPUImage.xcodeproj/project.pbxproj | 160 ------------------ .../GPUImageTests/GPUImageTests-Info.plist | 22 --- framework/GPUImageTests/GPUImageTests.h | 5 - framework/GPUImageTests/GPUImageTests.m | 24 --- .../GPUImageTests/en.lproj/InfoPlist.strings | 2 - 5 files changed, 213 deletions(-) delete mode 100755 framework/GPUImageTests/GPUImageTests-Info.plist delete mode 100755 framework/GPUImageTests/GPUImageTests.h delete mode 100755 framework/GPUImageTests/GPUImageTests.m delete mode 100755 framework/GPUImageTests/en.lproj/InfoPlist.strings diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index 590b3db8f..7e45d56ae 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -645,11 +645,6 @@ BCD907D315CDEE930019C556 /* GPUImageAddBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD907D115CDEE930019C556 /* GPUImageAddBlendFilter.h */; }; BCD907D415CDEE930019C556 /* GPUImageAddBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD907D215CDEE930019C556 /* GPUImageAddBlendFilter.m */; }; BCF1A33814DDB1EC00852800 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; - BCF1A34614DDB1EC00852800 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A34514DDB1EC00852800 /* SenTestingKit.framework */; }; - BCF1A34914DDB1EC00852800 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33714DDB1EC00852800 /* Foundation.framework */; }; - BCF1A34C14DDB1EC00852800 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF1A33414DDB1EC00852800 /* libGPUImage.a */; }; - BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF1A35014DDB1EC00852800 /* InfoPlist.strings */; }; - BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1A35414DDB1EC00852800 /* GPUImageTests.m */; }; BCF1E54015669907006B155F /* GPUImageJFAVoronoiFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */; }; BCF1E54115669907006B155F /* GPUImageJFAVoronoiFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */; }; BCF1E54215669907006B155F /* GPUImageMosaicFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */; }; @@ -693,16 +688,6 @@ D443237B17C81C0C00204484 /* GPUImageMovieComposition.m in Sources */ = {isa = PBXBuildFile; fileRef = D443237917C81C0C00204484 /* GPUImageMovieComposition.m */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - BCF1A34A14DDB1EC00852800 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BCF1A32B14DDB1EC00852800 /* Project object */; - proxyType = 1; - remoteGlobalIDString = BCF1A33314DDB1EC00852800; - remoteInfo = GPUImage; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ 0D04CB7A14FB2A29001D6733 /* GPUImageGaussianBlurFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageGaussianBlurFilter.h; path = Source/GPUImageGaussianBlurFilter.h; sourceTree = SOURCE_ROOT; }; 0D04CB7B14FB2A29001D6733 /* GPUImageGaussianBlurFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageGaussianBlurFilter.m; path = Source/GPUImageGaussianBlurFilter.m; sourceTree = SOURCE_ROOT; }; @@ -1001,12 +986,7 @@ BCF1A33414DDB1EC00852800 /* libGPUImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGPUImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; BCF1A33714DDB1EC00852800 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; BCF1A33B14DDB1EC00852800 /* GPUImage-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "GPUImage-Prefix.pch"; path = "Source/iOS/GPUImage-Prefix.pch"; sourceTree = ""; }; - BCF1A34414DDB1EC00852800 /* GPUImageTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GPUImageTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; BCF1A34514DDB1EC00852800 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - BCF1A34F14DDB1EC00852800 /* GPUImageTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GPUImageTests-Info.plist"; sourceTree = ""; }; - BCF1A35114DDB1EC00852800 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - BCF1A35314DDB1EC00852800 /* GPUImageTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPUImageTests.h; sourceTree = ""; }; - BCF1A35414DDB1EC00852800 /* GPUImageTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPUImageTests.m; sourceTree = ""; }; BCF1E53A15669907006B155F /* GPUImageJFAVoronoiFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageJFAVoronoiFilter.h; path = Source/GPUImageJFAVoronoiFilter.h; sourceTree = SOURCE_ROOT; }; BCF1E53B15669907006B155F /* GPUImageJFAVoronoiFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageJFAVoronoiFilter.m; path = Source/GPUImageJFAVoronoiFilter.m; sourceTree = SOURCE_ROOT; }; BCF1E53C15669907006B155F /* GPUImageMosaicFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageMosaicFilter.h; path = Source/GPUImageMosaicFilter.h; sourceTree = SOURCE_ROOT; }; @@ -1078,16 +1058,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BCF1A34014DDB1EC00852800 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - BCF1A34614DDB1EC00852800 /* SenTestingKit.framework in Frameworks */, - BCF1A34914DDB1EC00852800 /* Foundation.framework in Frameworks */, - BCF1A34C14DDB1EC00852800 /* libGPUImage.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1471,7 +1441,6 @@ isa = PBXGroup; children = ( BCF1A33914DDB1EC00852800 /* GPUImage */, - BCF1A34D14DDB1EC00852800 /* GPUImageTests */, BCF1A33614DDB1EC00852800 /* Frameworks */, BCF1A33514DDB1EC00852800 /* Products */, ); @@ -1481,7 +1450,6 @@ isa = PBXGroup; children = ( BCF1A33414DDB1EC00852800 /* libGPUImage.a */, - BCF1A34414DDB1EC00852800 /* GPUImageTests.octest */, BCE209E51943F20C002FEED8 /* GPUImage.framework */, ); name = Products; @@ -1533,25 +1501,6 @@ name = "Supporting Files"; sourceTree = ""; }; - BCF1A34D14DDB1EC00852800 /* GPUImageTests */ = { - isa = PBXGroup; - children = ( - BCF1A35314DDB1EC00852800 /* GPUImageTests.h */, - BCF1A35414DDB1EC00852800 /* GPUImageTests.m */, - BCF1A34E14DDB1EC00852800 /* Supporting Files */, - ); - path = GPUImageTests; - sourceTree = ""; - }; - BCF1A34E14DDB1EC00852800 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - BCF1A34F14DDB1EC00852800 /* GPUImageTests-Info.plist */, - BCF1A35014DDB1EC00852800 /* InfoPlist.strings */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -1934,25 +1883,6 @@ productReference = BCF1A33414DDB1EC00852800 /* libGPUImage.a */; productType = "com.apple.product-type.library.static"; }; - BCF1A34314DDB1EC00852800 /* GPUImageTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = BCF1A35B14DDB1EC00852800 /* Build configuration list for PBXNativeTarget "GPUImageTests" */; - buildPhases = ( - BCF1A33F14DDB1EC00852800 /* Sources */, - BCF1A34014DDB1EC00852800 /* Frameworks */, - BCF1A34114DDB1EC00852800 /* Resources */, - BCF1A34214DDB1EC00852800 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - BCF1A34B14DDB1EC00852800 /* PBXTargetDependency */, - ); - name = GPUImageTests; - productName = GPUImageTests; - productReference = BCF1A34414DDB1EC00852800 /* GPUImageTests.octest */; - productType = "com.apple.product-type.bundle.ocunit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -1981,7 +1911,6 @@ projectRoot = ""; targets = ( BCF1A33314DDB1EC00852800 /* GPUImage */, - BCF1A34314DDB1EC00852800 /* GPUImageTests */, BC552B361558C6F4001F3FFA /* Documentation */, BCE209E41943F20C002FEED8 /* GPUImageFramework */, ); @@ -1996,14 +1925,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BCF1A34114DDB1EC00852800 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BCF1A35214DDB1EC00852800 /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -2020,19 +1941,6 @@ shellPath = /bin/sh; shellScript = "# docsetutil was moved in Xcode 4.3\n# if you're using Xcode 4.2 or earlier, remove --docsetutil-path\n\"${APPLEDOC_PATH}\" \\\n--project-name \"GPUImage\" \\\n--project-company \"Sunset Lake Software\" \\\n--company-id \"com.sunsetlakesoftware\" \\\n--output \"${SOURCE_ROOT}/../documentation\" \\\n--keep-undocumented-objects \\\n--keep-undocumented-members \\\n--create-html \\\n--install-docset \\\n--keep-intermediate-files \\\n--no-repeat-first-par \\\n--exit-threshold 9999 \\\n--clean-output \\\n--ignore .m \\\n--logformat xcode \\\n\"${SOURCE_ROOT}\""; }; - BCF1A34214DDB1EC00852800 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -2374,35 +2282,8 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BCF1A33F14DDB1EC00852800 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BCF1A35514DDB1EC00852800 /* GPUImageTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - BCF1A34B14DDB1EC00852800 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = BCF1A33314DDB1EC00852800 /* GPUImage */; - targetProxy = BCF1A34A14DDB1EC00852800 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - BCF1A35014DDB1EC00852800 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - BCF1A35114DDB1EC00852800 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ BC552B381558C6F4001F3FFA /* Debug */ = { isa = XCBuildConfiguration; @@ -2586,38 +2467,6 @@ }; name = Release; }; - BCF1A35C14DDB1EC00852800 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(DEVELOPER_LIBRARY_DIR)/Frameworks", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Source/GPUImage-Prefix.pch"; - INFOPLIST_FILE = "GPUImageTests/GPUImageTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = octest; - }; - name = Debug; - }; - BCF1A35D14DDB1EC00852800 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(DEVELOPER_LIBRARY_DIR)/Frameworks", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Source/GPUImage-Prefix.pch"; - INFOPLIST_FILE = "GPUImageTests/GPUImageTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = octest; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -2657,15 +2506,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - BCF1A35B14DDB1EC00852800 /* Build configuration list for PBXNativeTarget "GPUImageTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BCF1A35C14DDB1EC00852800 /* Debug */, - BCF1A35D14DDB1EC00852800 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = BCF1A32B14DDB1EC00852800 /* Project object */; diff --git a/framework/GPUImageTests/GPUImageTests-Info.plist b/framework/GPUImageTests/GPUImageTests-Info.plist deleted file mode 100755 index d9fb51c3f..000000000 --- a/framework/GPUImageTests/GPUImageTests-Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/framework/GPUImageTests/GPUImageTests.h b/framework/GPUImageTests/GPUImageTests.h deleted file mode 100755 index 0e3cac275..000000000 --- a/framework/GPUImageTests/GPUImageTests.h +++ /dev/null @@ -1,5 +0,0 @@ -#import - -@interface GPUImageTests : SenTestCase - -@end diff --git a/framework/GPUImageTests/GPUImageTests.m b/framework/GPUImageTests/GPUImageTests.m deleted file mode 100755 index 922dc4705..000000000 --- a/framework/GPUImageTests/GPUImageTests.m +++ /dev/null @@ -1,24 +0,0 @@ -#import "GPUImageTests.h" - -@implementation GPUImageTests - -- (void)setUp -{ - [super setUp]; - - // Set-up code here. -} - -- (void)tearDown -{ - // Tear-down code here. - - [super tearDown]; -} - -- (void)testExample -{ - STFail(@"Unit tests are not implemented yet in GPUImageTests"); -} - -@end diff --git a/framework/GPUImageTests/en.lproj/InfoPlist.strings b/framework/GPUImageTests/en.lproj/InfoPlist.strings deleted file mode 100755 index 477b28ff8..000000000 --- a/framework/GPUImageTests/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - From 6154cfce4384991133f9f637eebceb33e8dd6dd9 Mon Sep 17 00:00:00 2001 From: tomatrow Date: Fri, 11 Jul 2014 10:39:56 -0700 Subject: [PATCH 566/695] Fixed small inconsistency in example code --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 858a919c7..a487f368d 100755 --- a/README.md +++ b/README.md @@ -147,13 +147,13 @@ This will give you a live, filtered feed of the still camera's preview video. No Once you want to capture a photo, you use a callback block like the following: [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){ - NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8); + NSData *dataForJPEGFile = UIImageJPEGRepresentation(processedImage, 0.8); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSError *error2 = nil; - if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) + if (![dataForJPEGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2]) { return; } From 345c1f798103e253cc2b0675b7cff9a496aed63d Mon Sep 17 00:00:00 2001 From: Bruce Tsai Date: Sat, 19 Jul 2014 16:50:20 +0800 Subject: [PATCH 567/695] Fix movie playback issue on Simulator. --- framework/Source/GPUImageMovie.m | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 86abc4cf8..8e240aec3 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -191,8 +191,16 @@ - (AVAssetReader*)createAssetReader NSError *error = nil; AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; - NSDictionary *outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; - isFullYUVRange = YES; + NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; + if ([GPUImageContext supportsFastTextureUpload]) { + [outputSettings setObject:@(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; + isFullYUVRange = YES; + } + else { + [outputSettings setObject:@(kCVPixelFormatType_32BGRA) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; + isFullYUVRange = NO; + } + // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; readerVideoTrackOutput.alwaysCopiesSampleData = NO; @@ -292,7 +300,13 @@ - (void)processPlayerItem [displayLink setPaused:YES]; dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; - NSDictionary *pixBuffAttributes = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; + NSMutableDictionary *pixBuffAttributes = [NSMutableDictionary dictionary]; + if ([GPUImageContext supportsFastTextureUpload]) { + [pixBuffAttributes setObject:@(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; + } + else { + [pixBuffAttributes setObject:@(kCVPixelFormatType_32BGRA) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; + } playerItemOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pixBuffAttributes]; [playerItemOutput setDelegate:self queue:videoProcessingQueue]; @@ -450,11 +464,8 @@ - (float)progress - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime { int bufferHeight = (int) CVPixelBufferGetHeight(movieFrame); -#if TARGET_IPHONE_SIMULATOR - int bufferWidth = (int) CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) -#else int bufferWidth = (int) CVPixelBufferGetWidth(movieFrame); -#endif + CFTypeRef colorAttachments = CVBufferGetAttachment(movieFrame, kCVImageBufferYCbCrMatrixKey, NULL); if (colorAttachments != NULL) { From bb5355db6fdc4babc174223def1ed90b0e286879 Mon Sep 17 00:00:00 2001 From: Bruce Tsai Date: Sun, 20 Jul 2014 17:41:37 +0800 Subject: [PATCH 568/695] Revert "Merge branch 'simulator-fix'" This reverts commit fe3f5472b0ee5fececba4d9f1182fff675beae35, reversing changes made to 94d937b37a3f11a372702ff33971457fb1a807cf. --- framework/Source/GPUImageMovie.m | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 8e240aec3..86abc4cf8 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -191,16 +191,8 @@ - (AVAssetReader*)createAssetReader NSError *error = nil; AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; - NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; - if ([GPUImageContext supportsFastTextureUpload]) { - [outputSettings setObject:@(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; - isFullYUVRange = YES; - } - else { - [outputSettings setObject:@(kCVPixelFormatType_32BGRA) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; - isFullYUVRange = NO; - } - + NSDictionary *outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; + isFullYUVRange = YES; // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; readerVideoTrackOutput.alwaysCopiesSampleData = NO; @@ -300,13 +292,7 @@ - (void)processPlayerItem [displayLink setPaused:YES]; dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; - NSMutableDictionary *pixBuffAttributes = [NSMutableDictionary dictionary]; - if ([GPUImageContext supportsFastTextureUpload]) { - [pixBuffAttributes setObject:@(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; - } - else { - [pixBuffAttributes setObject:@(kCVPixelFormatType_32BGRA) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; - } + NSDictionary *pixBuffAttributes = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; playerItemOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pixBuffAttributes]; [playerItemOutput setDelegate:self queue:videoProcessingQueue]; @@ -464,8 +450,11 @@ - (float)progress - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime { int bufferHeight = (int) CVPixelBufferGetHeight(movieFrame); +#if TARGET_IPHONE_SIMULATOR + int bufferWidth = (int) CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) +#else int bufferWidth = (int) CVPixelBufferGetWidth(movieFrame); - +#endif CFTypeRef colorAttachments = CVBufferGetAttachment(movieFrame, kCVImageBufferYCbCrMatrixKey, NULL); if (colorAttachments != NULL) { From de6d918d3085085bf50b846cba6bba0b7a8c2a9e Mon Sep 17 00:00:00 2001 From: Bruce Tsai Date: Sun, 20 Jul 2014 17:45:47 +0800 Subject: [PATCH 569/695] =?UTF-8?q?Fix=20wrong=20statement=20of=20?= =?UTF-8?q?=E2=80=9Cnot=20equal=20to=E2=80=9D=20AVKeyValueStatusLoaded.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/Source/GPUImageMovie.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 86abc4cf8..84600adc7 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -176,7 +176,7 @@ - (void)startProcessing [inputAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ NSError *error = nil; AVKeyValueStatus tracksStatus = [inputAsset statusOfValueForKey:@"tracks" error:&error]; - if (!tracksStatus == AVKeyValueStatusLoaded) + if (tracksStatus != AVKeyValueStatusLoaded) { return; } From e2898fad7d49cf33f98d5564aca634785ff9571f Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 24 Jul 2014 20:41:32 -0500 Subject: [PATCH 570/695] Created a Mac Swift FilterShowcase. Created entries for almost all filter operations in the Swift FilterShowcases. --- .../project.pbxproj | 520 +++++++ .../FilterShowcaseSwift/AppDelegate.swift | 14 + .../Base.lproj/MainMenu.xib | 666 +++++++++ .../FilterShowcaseWindowController.swift | 94 ++ .../FilterShowcaseWindowController.xib | 95 ++ .../AppIcon.appiconset/Contents.json | 58 + .../FilterShowcaseSwift/Info.plist | 34 + .../FilterShowcaseSwift/main.swift | 3 + .../FilterShowcaseSwiftTests.swift | 36 + .../FilterShowcaseSwiftTests/Info.plist | 24 + .../project.pbxproj | 51 +- .../Base.lproj/Main.storyboard | 18 +- .../FilterDisplayViewController.swift | 15 +- .../FilterOperationTypes.swift | 48 +- .../FilterOperations.swift | 1268 ++++++++++++++++- .../GPUImageMac.xcodeproj/project.pbxproj | 2 - .../Source/GPUImageChromaKeyBlendFilter.h | 4 +- .../Source/GPUImageChromaKeyBlendFilter.m | 8 +- framework/Source/GPUImageChromaKeyFilter.h | 4 +- framework/Source/GPUImageChromaKeyFilter.m | 8 +- framework/Source/GPUImageHistogramFilter.m | 10 + framework/Source/GPUImageKuwaharaFilter.h | 2 +- framework/Source/GPUImageKuwaharaFilter.m | 4 +- framework/Source/GPUImageMosaicFilter.h | 7 +- framework/Source/GPUImageMosaicFilter.m | 1 + .../Source/GPUImageSolidColorGenerator.h | 2 +- .../Source/GPUImageSolidColorGenerator.m | 10 +- framework/Source/GPUImageWhiteBalanceFilter.h | 4 +- framework/Source/GPUImageWhiteBalanceFilter.m | 8 +- 29 files changed, 2897 insertions(+), 121 deletions(-) create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/main.swift create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/FilterShowcaseSwiftTests.swift create mode 100644 examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/Info.plist diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj new file mode 100644 index 000000000..1204280d5 --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj @@ -0,0 +1,520 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BC0B247C197DF612009AC707 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0B247B197DF612009AC707 /* main.swift */; }; + BC0B247E197DF612009AC707 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0B247D197DF612009AC707 /* AppDelegate.swift */; }; + BC0B2480197DF612009AC707 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BC0B247F197DF612009AC707 /* Images.xcassets */; }; + BC0B2483197DF612009AC707 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC0B2481197DF612009AC707 /* MainMenu.xib */; }; + BC0B248F197DF612009AC707 /* FilterShowcaseSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0B248E197DF612009AC707 /* FilterShowcaseSwiftTests.swift */; }; + BC0B24A2197DF822009AC707 /* FilterOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0B24A0197DF822009AC707 /* FilterOperations.swift */; }; + BC0B24A3197DF822009AC707 /* FilterOperationTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0B24A1197DF822009AC707 /* FilterOperationTypes.swift */; }; + BC0B24AC197E1372009AC707 /* FilterShowcaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0B24AA197E1372009AC707 /* FilterShowcaseWindowController.swift */; }; + BC0B24AD197E1372009AC707 /* FilterShowcaseWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC0B24AB197E1372009AC707 /* FilterShowcaseWindowController.xib */; }; + BC61173C1981EB2B006121EE /* voroni_points2.png in Resources */ = {isa = PBXBuildFile; fileRef = BC61173B1981EB2B006121EE /* voroni_points2.png */; }; + BCB4C0FD197F4D8A00C373B4 /* lookup_amatorka.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB4C0F9197F4D8A00C373B4 /* lookup_amatorka.png */; }; + BCB4C0FE197F4D8A00C373B4 /* lookup_miss_etikate.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB4C0FA197F4D8A00C373B4 /* lookup_miss_etikate.png */; }; + BCB4C0FF197F4D8A00C373B4 /* lookup_soft_elegance_1.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB4C0FB197F4D8A00C373B4 /* lookup_soft_elegance_1.png */; }; + BCB4C100197F4D8A00C373B4 /* lookup_soft_elegance_2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB4C0FC197F4D8A00C373B4 /* lookup_soft_elegance_2.png */; }; + BCEB92F719809BF900B8E840 /* Lambeau.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BCEB92F619809BF900B8E840 /* Lambeau.jpg */; }; + BCEB92F919809D8000B8E840 /* mask.png in Resources */ = {isa = PBXBuildFile; fileRef = BCEB92F819809D8000B8E840 /* mask.png */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BC0B2489197DF612009AC707 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC0B246E197DF612009AC707 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BC0B2475197DF612009AC707; + remoteInfo = FilterShowcaseSwift; + }; + BC0B249C197DF7F7009AC707 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC0B2498197DF7F7009AC707 /* GPUImageMac.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCA3F31C17239B6500E28AEC; + remoteInfo = GPUImage; + }; + BC0B249E197DF804009AC707 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC0B2498197DF7F7009AC707 /* GPUImageMac.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BCA3F31B17239B6500E28AEC; + remoteInfo = GPUImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + BC0B2476197DF612009AC707 /* FilterShowcaseSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FilterShowcaseSwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BC0B247A197DF612009AC707 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BC0B247B197DF612009AC707 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + BC0B247D197DF612009AC707 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + BC0B247F197DF612009AC707 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + BC0B2482197DF612009AC707 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + BC0B2488197DF612009AC707 /* FilterShowcaseSwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FilterShowcaseSwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + BC0B248D197DF612009AC707 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BC0B248E197DF612009AC707 /* FilterShowcaseSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterShowcaseSwiftTests.swift; sourceTree = ""; }; + BC0B2498197DF7F7009AC707 /* GPUImageMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImageMac.xcodeproj; path = ../../../../framework/GPUImageMac.xcodeproj; sourceTree = ""; }; + BC0B24A0197DF822009AC707 /* FilterOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FilterOperations.swift; path = ../../../iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift; sourceTree = ""; }; + BC0B24A1197DF822009AC707 /* FilterOperationTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FilterOperationTypes.swift; path = ../../../iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift; sourceTree = ""; }; + BC0B24AA197E1372009AC707 /* FilterShowcaseWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterShowcaseWindowController.swift; sourceTree = ""; }; + BC0B24AB197E1372009AC707 /* FilterShowcaseWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FilterShowcaseWindowController.xib; sourceTree = ""; }; + BC61173B1981EB2B006121EE /* voroni_points2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = voroni_points2.png; path = ../../../iOS/FilterShowcase/FilterShowcase/voroni_points2.png; sourceTree = ""; }; + BCB4C0F9197F4D8A00C373B4 /* lookup_amatorka.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_amatorka.png; path = ../../../../framework/Resources/lookup_amatorka.png; sourceTree = ""; }; + BCB4C0FA197F4D8A00C373B4 /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; + BCB4C0FB197F4D8A00C373B4 /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; + BCB4C0FC197F4D8A00C373B4 /* lookup_soft_elegance_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_2.png; path = ../../../../framework/Resources/lookup_soft_elegance_2.png; sourceTree = ""; }; + BCEB92F619809BF900B8E840 /* Lambeau.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = Lambeau.jpg; path = ../../../iOS/SimpleImageFilter/SimpleImageFilter/Lambeau.jpg; sourceTree = ""; }; + BCEB92F819809D8000B8E840 /* mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mask.png; path = ../../../iOS/FilterShowcase/FilterShowcase/mask.png; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BC0B2473197DF612009AC707 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BC0B2485197DF612009AC707 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BC0B246D197DF612009AC707 = { + isa = PBXGroup; + children = ( + BC0B2478197DF612009AC707 /* FilterShowcaseSwift */, + BC0B248B197DF612009AC707 /* FilterShowcaseSwiftTests */, + BC0B2477197DF612009AC707 /* Products */, + ); + sourceTree = ""; + }; + BC0B2477197DF612009AC707 /* Products */ = { + isa = PBXGroup; + children = ( + BC0B2476197DF612009AC707 /* FilterShowcaseSwift.app */, + BC0B2488197DF612009AC707 /* FilterShowcaseSwiftTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + BC0B2478197DF612009AC707 /* FilterShowcaseSwift */ = { + isa = PBXGroup; + children = ( + BC0B24A6197E1018009AC707 /* User interface */, + BC0B24A5197E1004009AC707 /* Data model */, + BC0B2479197DF612009AC707 /* Supporting Files */, + BC0B2498197DF7F7009AC707 /* GPUImageMac.xcodeproj */, + ); + path = FilterShowcaseSwift; + sourceTree = ""; + }; + BC0B2479197DF612009AC707 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BC61173B1981EB2B006121EE /* voroni_points2.png */, + BCEB92F819809D8000B8E840 /* mask.png */, + BCEB92F619809BF900B8E840 /* Lambeau.jpg */, + BC0B247F197DF612009AC707 /* Images.xcassets */, + BCB4C0F9197F4D8A00C373B4 /* lookup_amatorka.png */, + BCB4C0FA197F4D8A00C373B4 /* lookup_miss_etikate.png */, + BCB4C0FB197F4D8A00C373B4 /* lookup_soft_elegance_1.png */, + BCB4C0FC197F4D8A00C373B4 /* lookup_soft_elegance_2.png */, + BC0B247A197DF612009AC707 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BC0B248B197DF612009AC707 /* FilterShowcaseSwiftTests */ = { + isa = PBXGroup; + children = ( + BC0B248E197DF612009AC707 /* FilterShowcaseSwiftTests.swift */, + BC0B248C197DF612009AC707 /* Supporting Files */, + ); + path = FilterShowcaseSwiftTests; + sourceTree = ""; + }; + BC0B248C197DF612009AC707 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + BC0B248D197DF612009AC707 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BC0B2499197DF7F7009AC707 /* Products */ = { + isa = PBXGroup; + children = ( + BC0B249D197DF7F7009AC707 /* GPUImage.framework */, + ); + name = Products; + sourceTree = ""; + }; + BC0B24A5197E1004009AC707 /* Data model */ = { + isa = PBXGroup; + children = ( + BC0B24A0197DF822009AC707 /* FilterOperations.swift */, + BC0B24A1197DF822009AC707 /* FilterOperationTypes.swift */, + ); + name = "Data model"; + sourceTree = ""; + }; + BC0B24A6197E1018009AC707 /* User interface */ = { + isa = PBXGroup; + children = ( + BC0B2481197DF612009AC707 /* MainMenu.xib */, + BC0B247B197DF612009AC707 /* main.swift */, + BC0B247D197DF612009AC707 /* AppDelegate.swift */, + BC0B24AA197E1372009AC707 /* FilterShowcaseWindowController.swift */, + BC0B24AB197E1372009AC707 /* FilterShowcaseWindowController.xib */, + ); + name = "User interface"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BC0B2475197DF612009AC707 /* FilterShowcaseSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = BC0B2492197DF612009AC707 /* Build configuration list for PBXNativeTarget "FilterShowcaseSwift" */; + buildPhases = ( + BC0B2472197DF612009AC707 /* Sources */, + BC0B2473197DF612009AC707 /* Frameworks */, + BC0B2474197DF612009AC707 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BC0B249F197DF804009AC707 /* PBXTargetDependency */, + ); + name = FilterShowcaseSwift; + productName = FilterShowcaseSwift; + productReference = BC0B2476197DF612009AC707 /* FilterShowcaseSwift.app */; + productType = "com.apple.product-type.application"; + }; + BC0B2487197DF612009AC707 /* FilterShowcaseSwiftTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = BC0B2495197DF612009AC707 /* Build configuration list for PBXNativeTarget "FilterShowcaseSwiftTests" */; + buildPhases = ( + BC0B2484197DF612009AC707 /* Sources */, + BC0B2485197DF612009AC707 /* Frameworks */, + BC0B2486197DF612009AC707 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BC0B248A197DF612009AC707 /* PBXTargetDependency */, + ); + name = FilterShowcaseSwiftTests; + productName = FilterShowcaseSwiftTests; + productReference = BC0B2488197DF612009AC707 /* FilterShowcaseSwiftTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BC0B246E197DF612009AC707 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = "Sunset Lake Software"; + TargetAttributes = { + BC0B2475197DF612009AC707 = { + CreatedOnToolsVersion = 6.0; + }; + BC0B2487197DF612009AC707 = { + CreatedOnToolsVersion = 6.0; + TestTargetID = BC0B2475197DF612009AC707; + }; + }; + }; + buildConfigurationList = BC0B2471197DF612009AC707 /* Build configuration list for PBXProject "FilterShowcaseSwift" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = BC0B246D197DF612009AC707; + productRefGroup = BC0B2477197DF612009AC707 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BC0B2499197DF7F7009AC707 /* Products */; + ProjectRef = BC0B2498197DF7F7009AC707 /* GPUImageMac.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + BC0B2475197DF612009AC707 /* FilterShowcaseSwift */, + BC0B2487197DF612009AC707 /* FilterShowcaseSwiftTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + BC0B249D197DF7F7009AC707 /* GPUImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = GPUImage.framework; + remoteRef = BC0B249C197DF7F7009AC707 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + BC0B2474197DF612009AC707 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC0B2480197DF612009AC707 /* Images.xcassets in Resources */, + BCEB92F719809BF900B8E840 /* Lambeau.jpg in Resources */, + BCEB92F919809D8000B8E840 /* mask.png in Resources */, + BC0B24AD197E1372009AC707 /* FilterShowcaseWindowController.xib in Resources */, + BC0B2483197DF612009AC707 /* MainMenu.xib in Resources */, + BCB4C100197F4D8A00C373B4 /* lookup_soft_elegance_2.png in Resources */, + BC61173C1981EB2B006121EE /* voroni_points2.png in Resources */, + BCB4C0FF197F4D8A00C373B4 /* lookup_soft_elegance_1.png in Resources */, + BCB4C0FD197F4D8A00C373B4 /* lookup_amatorka.png in Resources */, + BCB4C0FE197F4D8A00C373B4 /* lookup_miss_etikate.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BC0B2486197DF612009AC707 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BC0B2472197DF612009AC707 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC0B24A2197DF822009AC707 /* FilterOperations.swift in Sources */, + BC0B24A3197DF822009AC707 /* FilterOperationTypes.swift in Sources */, + BC0B24AC197E1372009AC707 /* FilterShowcaseWindowController.swift in Sources */, + BC0B247E197DF612009AC707 /* AppDelegate.swift in Sources */, + BC0B247C197DF612009AC707 /* main.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BC0B2484197DF612009AC707 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC0B248F197DF612009AC707 /* FilterShowcaseSwiftTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BC0B248A197DF612009AC707 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BC0B2475197DF612009AC707 /* FilterShowcaseSwift */; + targetProxy = BC0B2489197DF612009AC707 /* PBXContainerItemProxy */; + }; + BC0B249F197DF804009AC707 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GPUImage; + targetProxy = BC0B249E197DF804009AC707 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + BC0B2481197DF612009AC707 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + BC0B2482197DF612009AC707 /* Base */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BC0B2490197DF612009AC707 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + BC0B2491197DF612009AC707 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + BC0B2493197DF612009AC707 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = FilterShowcaseSwift/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + BC0B2494197DF612009AC707 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = FilterShowcaseSwift/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + BC0B2496197DF612009AC707 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/FilterShowcaseSwift.app/Contents/MacOS/FilterShowcaseSwift"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = FilterShowcaseSwiftTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + }; + name = Debug; + }; + BC0B2497197DF612009AC707 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/FilterShowcaseSwift.app/Contents/MacOS/FilterShowcaseSwift"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + ); + INFOPLIST_FILE = FilterShowcaseSwiftTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BC0B2471197DF612009AC707 /* Build configuration list for PBXProject "FilterShowcaseSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC0B2490197DF612009AC707 /* Debug */, + BC0B2491197DF612009AC707 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BC0B2492197DF612009AC707 /* Build configuration list for PBXNativeTarget "FilterShowcaseSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC0B2493197DF612009AC707 /* Debug */, + BC0B2494197DF612009AC707 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BC0B2495197DF612009AC707 /* Build configuration list for PBXNativeTarget "FilterShowcaseSwiftTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC0B2496197DF612009AC707 /* Debug */, + BC0B2497197DF612009AC707 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BC0B246E197DF612009AC707 /* Project object */; +} diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift new file mode 100644 index 000000000..f653c49c7 --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift @@ -0,0 +1,14 @@ +import Cocoa + +class AppDelegate: NSObject, NSApplicationDelegate { + + var windowController:FilterShowcaseWindowController? + + func applicationDidFinishLaunching(aNotification: NSNotification?) { + self.windowController = FilterShowcaseWindowController(windowNibName:"FilterShowcaseWindowController") + self.windowController?.showWindow(self) + } + + func applicationWillTerminate(aNotification: NSNotification?) { + } +} \ No newline at end of file diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib new file mode 100644 index 000000000..c61bb71f5 --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib @@ -0,0 +1,666 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift new file mode 100644 index 000000000..c767ccf3e --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift @@ -0,0 +1,94 @@ +import Cocoa +import GPUImage + +class FilterShowcaseWindowController: NSWindowController { + + @IBOutlet var filterView: GPUImageView? + + var enableSlider:Bool = false + var minimumSliderValue:CGFloat = 0.0, maximumSliderValue:CGFloat = 1.0 + var currentSliderValue:CGFloat = 0.5 { + willSet(newSliderValue) { + switch (currentFilterOperation!.sliderConfiguration) { + case let .Enabled(_, _, _): + currentFilterOperation!.updateBasedOnSliderValue(newSliderValue) + case .Disabled: + break + } + } + } + + var currentFilterOperation: FilterOperationInterface? + var videoCamera: GPUImageAVCamera? + lazy var blendImage: GPUImagePicture = { + let inputImage = NSImage(named:"Lambeau.jpg") + return GPUImagePicture(image: inputImage) + }() + var currentlySelectedRow = 1 + + override func windowDidLoad() { + super.windowDidLoad() + + videoCamera = GPUImageAVCamera(sessionPreset: AVCaptureSessionPreset640x480, cameraDevice:nil) + self.changeSelectedRow(0) + } + + func changeSelectedRow(row:Int) { + if (currentlySelectedRow == row) + { + return + } + + // Clean up everything from the previous filter selection first + videoCamera!.stopCameraCapture() + videoCamera!.removeAllTargets() +// blendImage?.removeAllTargets() + currentFilterOperation?.filter.removeAllTargets() + + currentFilterOperation = filterOperations[row] + switch currentFilterOperation!.filterOperationType { + case .SingleInput: + videoCamera!.addTarget((currentFilterOperation!.filter as GPUImageInput)) + currentFilterOperation!.filter.addTarget(filterView!) + case .Blend: + videoCamera!.addTarget((currentFilterOperation!.filter as GPUImageInput)) + self.blendImage.addTarget((currentFilterOperation!.filter as GPUImageInput)) + currentFilterOperation!.filter.addTarget(filterView!) + self.blendImage.processImage() + case .Custom: + let setupFunction = currentFilterOperation!.customFilterSetupFunction! + let inputToFunction:(GPUImageOutput, GPUImageOutput?) = setupFunction(camera:videoCamera!, outputView:filterView!) // Type inference falls down, for now needs this hard cast + currentFilterOperation!.configureCustomFilter(inputToFunction) + } + + switch currentFilterOperation!.sliderConfiguration { + case .Disabled: + enableSlider = false + // case let .Enabled(minimumValue, initialValue, maximumValue, filterSliderCallback): + case let .Enabled(minimumValue, maximumValue, initialValue): + minimumSliderValue = CGFloat(minimumValue) + maximumSliderValue = CGFloat(maximumValue) + enableSlider = true + currentSliderValue = CGFloat(initialValue) + } + + videoCamera!.startCameraCapture() + } + +// MARK: - +// MARK: Table view delegate and datasource methods + + func numberOfRowsInTableView(aTableView:NSTableView!) -> Int { + return filterOperations.count + } + + func tableView(aTableView:NSTableView!, objectValueForTableColumn aTableColumn:NSTableColumn!, row rowIndex:Int) -> AnyObject! { + let filterInList:FilterOperationInterface = filterOperations[rowIndex] + return filterInList.listName + } + + func tableViewSelectionDidChange(aNotification: NSNotification!) { + let rowIndex = aNotification.object.selectedRow + self.changeSelectedRow(rowIndex) + } +} \ No newline at end of file diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib new file mode 100644 index 000000000..334815455 --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..2db2b1c7c --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist new file mode 100644 index 000000000..4245fdf47 --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2014 Sunset Lake Software. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/main.swift b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/main.swift new file mode 100644 index 000000000..7ffd27518 --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/main.swift @@ -0,0 +1,3 @@ +import Cocoa + +NSApplicationMain(C_ARGC, C_ARGV) \ No newline at end of file diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/FilterShowcaseSwiftTests.swift b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/FilterShowcaseSwiftTests.swift new file mode 100644 index 000000000..f33523482 --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/FilterShowcaseSwiftTests.swift @@ -0,0 +1,36 @@ +// +// FilterShowcaseSwiftTests.swift +// FilterShowcaseSwiftTests +// +// Created by Brad Larson on 7/21/2014. +// Copyright (c) 2014 Sunset Lake Software. All rights reserved. +// + +import Cocoa +import XCTest + +class FilterShowcaseSwiftTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/Info.plist b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/Info.plist new file mode 100644 index 000000000..9a037bf5c --- /dev/null +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj index 9a4f2dda3..d660d0510 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj @@ -15,6 +15,14 @@ BC0037EA195CC25D00B9D651 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC0037E7195CC24200B9D651 /* GPUImage.framework */; }; BC0037ED195CC54D00B9D651 /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BC0037E7195CC24200B9D651 /* GPUImage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; BC0037EF195CC9E200B9D651 /* FilterOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0037EE195CC9E200B9D651 /* FilterOperations.swift */; }; + BC990323197C79050092A21B /* WID-small.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BC990322197C79050092A21B /* WID-small.jpg */; }; + BC990327197C79160092A21B /* mask.png in Resources */ = {isa = PBXBuildFile; fileRef = BC990326197C79160092A21B /* mask.png */; }; + BC99032A197CCCF80092A21B /* squares.png in Resources */ = {isa = PBXBuildFile; fileRef = BC990328197CCCF80092A21B /* squares.png */; }; + BC99032B197CCCF80092A21B /* voroni_points2.png in Resources */ = {isa = PBXBuildFile; fileRef = BC990329197CCCF80092A21B /* voroni_points2.png */; }; + BC990330197CCD080092A21B /* lookup_amatorka.png in Resources */ = {isa = PBXBuildFile; fileRef = BC99032C197CCD080092A21B /* lookup_amatorka.png */; }; + BC990331197CCD080092A21B /* lookup_miss_etikate.png in Resources */ = {isa = PBXBuildFile; fileRef = BC99032D197CCD080092A21B /* lookup_miss_etikate.png */; }; + BC990332197CCD080092A21B /* lookup_soft_elegance_1.png in Resources */ = {isa = PBXBuildFile; fileRef = BC99032E197CCD080092A21B /* lookup_soft_elegance_1.png */; }; + BC990333197CCD080092A21B /* lookup_soft_elegance_2.png in Resources */ = {isa = PBXBuildFile; fileRef = BC99032F197CCD080092A21B /* lookup_soft_elegance_2.png */; }; BCA01891195E503E004BC89E /* FilterOperationTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA01890195E503E004BC89E /* FilterOperationTypes.swift */; }; /* End PBXBuildFile section */ @@ -26,13 +34,6 @@ remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BC0037E4195CC24200B9D651 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BCF1A34414DDB1EC00852800; - remoteInfo = GPUImageTests; - }; BC0037E6195CC24200B9D651 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */; @@ -72,6 +73,14 @@ BC0037C5195CA11B00B9D651 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; BC0037DB195CC24200B9D651 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = ../../../framework/GPUImage.xcodeproj; sourceTree = ""; }; BC0037EE195CC9E200B9D651 /* FilterOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterOperations.swift; sourceTree = ""; }; + BC990322197C79050092A21B /* WID-small.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = "WID-small.jpg"; path = "../../SimpleImageFilter/SimpleImageFilter/WID-small.jpg"; sourceTree = ""; }; + BC990326197C79160092A21B /* mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mask.png; path = ../../FilterShowcase/FilterShowcase/mask.png; sourceTree = ""; }; + BC990328197CCCF80092A21B /* squares.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = squares.png; path = ../../FilterShowcase/FilterShowcase/squares.png; sourceTree = ""; }; + BC990329197CCCF80092A21B /* voroni_points2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = voroni_points2.png; path = ../../FilterShowcase/FilterShowcase/voroni_points2.png; sourceTree = ""; }; + BC99032C197CCD080092A21B /* lookup_amatorka.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_amatorka.png; path = ../../../../framework/Resources/lookup_amatorka.png; sourceTree = ""; }; + BC99032D197CCD080092A21B /* lookup_miss_etikate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_miss_etikate.png; path = ../../../../framework/Resources/lookup_miss_etikate.png; sourceTree = ""; }; + BC99032E197CCD080092A21B /* lookup_soft_elegance_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_1.png; path = ../../../../framework/Resources/lookup_soft_elegance_1.png; sourceTree = ""; }; + BC99032F197CCD080092A21B /* lookup_soft_elegance_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lookup_soft_elegance_2.png; path = ../../../../framework/Resources/lookup_soft_elegance_2.png; sourceTree = ""; }; BCA01890195E503E004BC89E /* FilterOperationTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterOperationTypes.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -121,6 +130,14 @@ BC0037BA195CA11B00B9D651 /* Supporting Files */ = { isa = PBXGroup; children = ( + BC99032C197CCD080092A21B /* lookup_amatorka.png */, + BC99032D197CCD080092A21B /* lookup_miss_etikate.png */, + BC99032E197CCD080092A21B /* lookup_soft_elegance_1.png */, + BC99032F197CCD080092A21B /* lookup_soft_elegance_2.png */, + BC990328197CCCF80092A21B /* squares.png */, + BC990329197CCCF80092A21B /* voroni_points2.png */, + BC990326197C79160092A21B /* mask.png */, + BC990322197C79050092A21B /* WID-small.jpg */, BC0037C5195CA11B00B9D651 /* Images.xcassets */, BC0037BB195CA11B00B9D651 /* Info.plist */, ); @@ -132,7 +149,6 @@ isa = PBXGroup; children = ( BC0037E3195CC24200B9D651 /* libGPUImage.a */, - BC0037E5195CC24200B9D651 /* GPUImageTests.octest */, BC0037E7195CC24200B9D651 /* GPUImage.framework */, ); name = Products; @@ -216,13 +232,6 @@ remoteRef = BC0037E2195CC24200B9D651 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BC0037E5195CC24200B9D651 /* GPUImageTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = GPUImageTests.octest; - remoteRef = BC0037E4195CC24200B9D651 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; BC0037E7195CC24200B9D651 /* GPUImage.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -237,8 +246,16 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + BC990330197CCD080092A21B /* lookup_amatorka.png in Resources */, + BC99032A197CCCF80092A21B /* squares.png in Resources */, + BC990333197CCD080092A21B /* lookup_soft_elegance_2.png in Resources */, + BC990323197C79050092A21B /* WID-small.jpg in Resources */, + BC990332197CCD080092A21B /* lookup_soft_elegance_1.png in Resources */, BC0037C4195CA11B00B9D651 /* Main.storyboard in Resources */, BC0037C6195CA11B00B9D651 /* Images.xcassets in Resources */, + BC990331197CCD080092A21B /* lookup_miss_etikate.png in Resources */, + BC99032B197CCCF80092A21B /* voroni_points2.png in Resources */, + BC990327197C79160092A21B /* mask.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -313,7 +330,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; METAL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -350,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; METAL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/Main.storyboard b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/Main.storyboard index 18684c0e7..9deef2c4d 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/Main.storyboard +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/Main.storyboard @@ -1,7 +1,8 @@ - + - + + @@ -19,7 +20,7 @@ - + @@ -56,16 +57,16 @@ - + - + - + @@ -103,6 +104,9 @@ - + + + + diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift index dd9943452..1c489f98c 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift @@ -33,14 +33,17 @@ class FilterDisplayViewController: UIViewController, UISplitViewControllerDelega case .SingleInput: videoCamera.addTarget((currentFilterConfiguration.filter as GPUImageInput)) currentFilterConfiguration.filter.addTarget(view) - case .Blend(let blendSource): + case .Blend: videoCamera.addTarget((currentFilterConfiguration.filter as GPUImageInput)) - self.blendImage = GPUImagePicture(image: blendSource) + let inputImage = UIImage(named:"WID-small.jpg") + self.blendImage = GPUImagePicture(image: inputImage) self.blendImage?.addTarget((currentFilterConfiguration.filter as GPUImageInput)) + self.blendImage?.processImage() currentFilterConfiguration.filter.addTarget(view) case .Custom: let setupFunction = currentFilterConfiguration.customFilterSetupFunction! - currentFilterConfiguration.configureCustomFilter(setupFunction(camera:videoCamera, outputView:view, blendImage:nil)) + let inputToFunction:(GPUImageOutput, GPUImageOutput?) = setupFunction(camera:videoCamera, outputView:view) // Type inference falls down, for now needs this hard cast + currentFilterConfiguration.configureCustomFilter(inputToFunction) } videoCamera.startCameraCapture() @@ -52,7 +55,7 @@ class FilterDisplayViewController: UIViewController, UISplitViewControllerDelega case .Disabled: slider.hidden = true // case let .Enabled(minimumValue, initialValue, maximumValue, filterSliderCallback): - case let .Enabled(minimumValue, initialValue, maximumValue): + case let .Enabled(minimumValue, maximumValue, initialValue): slider.minimumValue = minimumValue slider.maximumValue = maximumValue slider.value = initialValue @@ -67,8 +70,8 @@ class FilterDisplayViewController: UIViewController, UISplitViewControllerDelega @IBAction func updateSliderValue() { if let currentFilterConfiguration = self.filterOperation { switch (currentFilterConfiguration.sliderConfiguration) { - case let .Enabled(minimumValue, initialValue, maximumValue): - currentFilterConfiguration.updateBasedOnSliderValue(self.filterSlider!.value) // If the UISlider isn't wired up, I want this to throw a runtime exception + case let .Enabled(minimumValue, maximumValue, initialValue): + currentFilterConfiguration.updateBasedOnSliderValue(CGFloat(self.filterSlider!.value)) // If the UISlider isn't wired up, I want this to throw a runtime exception case .Disabled: break } diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift index 67066b795..907e29390 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperationTypes.swift @@ -1,52 +1,45 @@ import Foundation import GPUImage -// Use of this causes LLVM to faceplant, so have to split out the closures for now -//enum FilterSliderSetting { -// case Disabled -// case Enabled(minimumValue:Float, initialValue:Float, maximumValue:Float, sliderUpdateCallback:((filter:GPUImageOutput, sliderValue:Float) -> ())?) -//} - enum FilterSliderSetting { case Disabled - case Enabled(minimumValue:Float, initialValue:Float, maximumValue:Float) + case Enabled(minimumValue:Float, maximumValue:Float, initialValue:Float) } -// Use of this causes LLVM to faceplant, so have to split out the closures for now -//enum FilterOperationType { -// case SingleInput -// case Blend(blendImage:UIImage) -// case Custom(setupFunction:(camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput)) -//} - enum FilterOperationType { case SingleInput - case Blend(blendImage:UIImage) + case Blend case Custom } +#if os(iOS) +typealias FilterSetupFunction = (camera:GPUImageVideoCamera, outputView:GPUImageView) -> (filter:GPUImageOutput, secondOutput:GPUImageOutput?) +#else +typealias FilterSetupFunction = (camera:GPUImageAVCamera, outputView:GPUImageView) -> (filter:GPUImageOutput, secondOutput:GPUImageOutput?) +#endif + protocol FilterOperationInterface { var filter: GPUImageOutput { get } var listName: String { get } var titleName: String { get } var sliderConfiguration: FilterSliderSetting { get } var filterOperationType: FilterOperationType { get } - var customFilterSetupFunction: ((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))? { get } + var customFilterSetupFunction: FilterSetupFunction? { get } - func configureCustomFilter(filter:GPUImageOutput) - func updateBasedOnSliderValue(sliderValue:Float) + func configureCustomFilter(input:(filter:GPUImageOutput, secondInput:GPUImageOutput?)) + func updateBasedOnSliderValue(sliderValue:CGFloat) } class FilterOperation: FilterOperationInterface { var internalFilter: FilterClass? + var secondInput: GPUImageOutput? let listName: String let titleName: String let sliderConfiguration: FilterSliderSetting let filterOperationType: FilterOperationType - let sliderUpdateCallback: ((filter:FilterClass, sliderValue:Float) -> ())? - let customFilterSetupFunction: ((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))? - - init(listName: String, titleName: String, sliderConfiguration: FilterSliderSetting, sliderUpdateCallback:((filter:FilterClass, sliderValue:Float) -> ())?, filterOperationType: FilterOperationType, customFilterSetupFunction:((camera:GPUImageVideoCamera, outputView:GPUImageView, blendImage:UIImage?) -> (filter:GPUImageOutput))?) { + let sliderUpdateCallback: ((filter:FilterClass, sliderValue:CGFloat) -> ())? + let customFilterSetupFunction: FilterSetupFunction? + init(listName: String, titleName: String, sliderConfiguration: FilterSliderSetting, sliderUpdateCallback:((filter:FilterClass, sliderValue:CGFloat) -> ())?, filterOperationType: FilterOperationType, customFilterSetupFunction:FilterSetupFunction?) { self.listName = listName self.titleName = titleName self.sliderConfiguration = sliderConfiguration @@ -59,21 +52,18 @@ class FilterOperation = [ + FilterOperation ( + listName:"Saturation", + titleName:"Saturation", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:2.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.saturation = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Contrast", + titleName:"Contrast", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:4.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.contrast = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Brightness", + titleName:"Brightness", + sliderConfiguration:.Enabled(minimumValue:-1.0, maximumValue:1.0, initialValue:0.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.brightness = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Levels", + titleName:"Levels", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.setRedMin(sliderValue, gamma:1.0, max:1.0, minOut:0.0, maxOut:1.0) + filter.setGreenMin(sliderValue, gamma:1.0, max:1.0, minOut:0.0, maxOut:1.0) + filter.setBlueMin(sliderValue, gamma:1.0, max:1.0, minOut:0.0, maxOut:1.0) + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Exposure", + titleName:"Exposure", + sliderConfiguration:.Enabled(minimumValue:-4.0, maximumValue:4.0, initialValue:0.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.exposure = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"RGB", + titleName:"RGB", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:2.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.green = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Hue", + titleName:"Hue", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:360.0, initialValue:90.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.hue = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"White balance", + titleName:"White Balance", + sliderConfiguration:.Enabled(minimumValue:2500.0, maximumValue:7500.0, initialValue:5000.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.temperature = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Monochrome", + titleName:"Monochrome", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.intensity = sliderValue + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageMonochromeFilter() + camera.addTarget(filter) + filter.addTarget(outputView) + filter.color = GPUVector4(one:0.0, two:0.0, three:1.0, four:1.0) + return (filter, nil) + } + ), + FilterOperation ( + listName:"False color", + titleName:"False Color", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Sharpen", + titleName:"Sharpen", + sliderConfiguration:.Enabled(minimumValue:-1.0, maximumValue:4.0, initialValue:0.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.sharpness = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Unsharp mask", + titleName:"Unsharp Mask", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:5.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.intensity = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Transform (2-D)", + titleName:"Transform (2-D)", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:6.28, initialValue:0.75), + sliderUpdateCallback:{(filter, sliderValue) in + filter.affineTransform = CGAffineTransformMakeRotation(sliderValue) + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Transform (3-D)", + titleName:"Transform (3-D)", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:6.28, initialValue:0.75), + sliderUpdateCallback:{(filter, sliderValue) in + var perspectiveTransform = CATransform3DIdentity + perspectiveTransform.m34 = 0.4 + perspectiveTransform.m33 = 0.4 + perspectiveTransform = CATransform3DScale(perspectiveTransform, 0.75, 0.75, 0.75) + perspectiveTransform = CATransform3DRotate(perspectiveTransform, sliderValue, 0.0, 1.0, 0.0) + filter.transform3D = perspectiveTransform + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Crop", + titleName:"Crop", + sliderConfiguration:.Enabled(minimumValue:0.2, maximumValue:1.0, initialValue:0.25), + sliderUpdateCallback:{(filter, sliderValue) in + filter.cropRegion = CGRectMake(0.0, 0.0, 1.0, sliderValue) + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Mask", + titleName:"Mask", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageMaskFilter() +#if os(iOS) + let inputImage = UIImage(named:"mask.png") +#else + let inputImage = NSImage(named:"mask.png") +#endif + let inputPicture = GPUImagePicture(image:inputImage) + camera.addTarget(filter) + inputPicture.addTarget(filter) + inputPicture.processImage() + filter.addTarget(outputView) + filter.setBackgroundColorRed(0.0, green:1.0, blue:0.0, alpha:1.0) + return (filter, inputPicture) + } + ), + FilterOperation ( + listName:"Gamma", + titleName:"Gamma", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:3.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.gamma = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Tone curve", + titleName:"Tone Curve", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in +#if os(iOS) + filter.blueControlPoints = ([NSValue(CGPoint:CGPointMake(0.0, 0.0)), NSValue(CGPoint:CGPointMake(0.5, sliderValue)), NSValue(CGPoint:CGPointMake(1.0, 0.75))]) +#else + filter.blueControlPoints = ([NSValue(point:NSMakePoint(0.0, 0.0)), NSValue(point:NSMakePoint(0.5, sliderValue)), NSValue(point:NSMakePoint(1.0, 0.75))]) +#endif + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Highlights and shadows", + titleName:"Highlights and Shadows", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.highlights = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Haze / UV", + titleName:"Haze / UV", + sliderConfiguration:.Enabled(minimumValue:-0.2, maximumValue:0.2, initialValue:0.2), + sliderUpdateCallback: {(filter, sliderValue) in + filter.distance = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), FilterOperation ( listName:"Sepia tone", titleName:"Sepia Tone", - sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:1.0, maximumValue:1.0), + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.intensity = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Amatorka (Lookup)", + titleName:"Amatorka (Lookup)", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Miss Etikate (Lookup)", + titleName:"Miss Etikate (Lookup)", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Soft elegance (Lookup)", + titleName:"Soft Elegance (Lookup)", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Color invert", + titleName:"Color Invert", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Grayscale", + titleName:"Grayscale", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Histogram", + titleName:"Histogram", + sliderConfiguration:.Enabled(minimumValue:4.0, maximumValue:32.0, initialValue:16.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.downsamplingFactor = UInt(round(sliderValue)) + }, + filterOperationType:.Custom, + customFilterSetupFunction: {(camera, outputView) in + let filter = GPUImageHistogramFilter() + let gammaFilter = GPUImageGammaFilter() + let histogramGraph = GPUImageHistogramGenerator() + histogramGraph.forceProcessingAtSize(CGSizeMake(256.0, 330.0)) + let blendFilter = GPUImageAlphaBlendFilter() + blendFilter.mix = 0.75 + blendFilter.forceProcessingAtSize(CGSizeMake(256.0, 330.0)) + + camera.addTarget(gammaFilter) + gammaFilter.addTarget(filter) + camera.addTarget(blendFilter) + filter.addTarget(histogramGraph) + histogramGraph.addTarget(blendFilter) + blendFilter.addTarget(outputView) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Average color", + titleName:"Average Color", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Custom, + customFilterSetupFunction: {(camera, outputView) in + let filter = GPUImageAverageColor() + let colorGenerator = GPUImageSolidColorGenerator() + colorGenerator.forceProcessingAtSize(outputView.sizeInPixels) + + filter.colorAverageProcessingFinishedBlock = {(redComponent, greenComponent, blueComponent, alphaComponent, frameTime) in + colorGenerator.setColorRed(redComponent, green:greenComponent, blue:blueComponent, alpha:alphaComponent) + // NSLog(@"Average color: %f, %f, %f, %f", redComponent, greenComponent, blueComponent, alphaComponent); + } + + camera.addTarget(filter) + colorGenerator.addTarget(outputView) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Average luminosity", + titleName:"Average Luminosity", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Custom, + customFilterSetupFunction: {(camera, outputView) in + let filter = GPUImageLuminosity() + let colorGenerator = GPUImageSolidColorGenerator() + colorGenerator.forceProcessingAtSize(outputView.sizeInPixels) + + filter.luminosityProcessingFinishedBlock = {(luminosity, frameTime) in + colorGenerator.setColorRed(luminosity, green:luminosity, blue:luminosity, alpha:luminosity) + // NSLog(@"Average color: %f, %f, %f, %f", redComponent, greenComponent, blueComponent, alphaComponent); + } + + camera.addTarget(filter) + colorGenerator.addTarget(outputView) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Luminance threshold", + titleName:"Luminance Threshold", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in + filter.threshold = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Adaptive threshold", + titleName:"Adaptive Threshold", + sliderConfiguration:.Enabled(minimumValue:1.0, maximumValue:20.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.blurRadiusInPixels = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Average luminance threshold", + titleName:"Avg. Lum. Threshold", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:2.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.thresholdMultiplier = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Pixellate", + titleName:"Pixellate", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:0.3, initialValue:0.05), + sliderUpdateCallback: {(filter, sliderValue) in + filter.fractionalWidthOfAPixel = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Polar pixellate", + titleName:"Polar Pixellate", + sliderConfiguration:.Enabled(minimumValue:-0.1, maximumValue:0.1, initialValue:0.05), + sliderUpdateCallback: {(filter, sliderValue) in + filter.pixelSize = CGSizeMake(sliderValue, sliderValue) + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Pixellate (position)", + titleName:"Pixellate (position)", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:0.5, initialValue:0.25), + sliderUpdateCallback: {(filter, sliderValue) in + filter.radius = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Polka dot", + titleName:"Polka Dot", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:0.3, initialValue:0.05), + sliderUpdateCallback: {(filter, sliderValue) in + filter.fractionalWidthOfAPixel = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Halftone", + titleName:"Halftone", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:0.05, initialValue:0.01), + sliderUpdateCallback: {(filter, sliderValue) in + filter.fractionalWidthOfAPixel = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Crosshatch", + titleName:"Crosshatch", + sliderConfiguration:.Enabled(minimumValue:0.01, maximumValue:0.06, initialValue:0.03), + sliderUpdateCallback: {(filter, sliderValue) in + filter.crossHatchSpacing = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Sobel edge detection", + titleName:"Sobel Edge Detection", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25), + sliderUpdateCallback: {(filter, sliderValue) in + filter.edgeStrength = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Prewitt edge detection", + titleName:"Prewitt Edge Detection", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.edgeStrength = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Canny edge detection", + titleName:"Canny Edge Detection", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.blurTexelSpacingMultiplier = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Threshold edge detection", + titleName:"Threshold Edge Detection", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25), + sliderUpdateCallback: {(filter, sliderValue) in + filter.threshold = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"XY derivative", + titleName:"XY Derivative", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Harris corner detector", + titleName:"Harris Corner Detector", + sliderConfiguration:.Enabled(minimumValue:0.01, maximumValue:0.70, initialValue:0.20), + sliderUpdateCallback: {(filter, sliderValue) in + filter.threshold = sliderValue + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageHarrisCornerDetectionFilter() + + let crosshairGenerator = GPUImageCrosshairGenerator() + crosshairGenerator.crosshairWidth = 15.0 + crosshairGenerator.forceProcessingAtSize(outputView.sizeInPixels) + + filter.cornersDetectedBlock = { (cornerArray:UnsafePointer, cornersDetected:UInt, frameTime:CMTime) in + crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime) + } + + camera.addTarget(filter) + + let blendFilter = GPUImageAlphaBlendFilter() + blendFilter.forceProcessingAtSize(outputView.sizeInPixels) + let gammaFilter = GPUImageGammaFilter() + camera.addTarget(gammaFilter) + gammaFilter.addTarget(blendFilter) + + crosshairGenerator.addTarget(blendFilter) + + blendFilter.addTarget(outputView) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Noble corner detector", + titleName:"Noble Corner Detector", + sliderConfiguration:.Enabled(minimumValue:0.01, maximumValue:0.70, initialValue:0.20), + sliderUpdateCallback: {(filter, sliderValue) in + filter.threshold = sliderValue + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageNobleCornerDetectionFilter() + + let crosshairGenerator = GPUImageCrosshairGenerator() + crosshairGenerator.crosshairWidth = 15.0 + crosshairGenerator.forceProcessingAtSize(outputView.sizeInPixels) + + filter.cornersDetectedBlock = { (cornerArray:UnsafePointer, cornersDetected:UInt, frameTime:CMTime) in + crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime) + } + + camera.addTarget(filter) + + let blendFilter = GPUImageAlphaBlendFilter() + blendFilter.forceProcessingAtSize(outputView.sizeInPixels) + let gammaFilter = GPUImageGammaFilter() + camera.addTarget(gammaFilter) + gammaFilter.addTarget(blendFilter) + + crosshairGenerator.addTarget(blendFilter) + + blendFilter.addTarget(outputView) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Shi-Tomasi feature detection", + titleName:"Shi-Tomasi Feature Detection", + sliderConfiguration:.Enabled(minimumValue:0.01, maximumValue:0.70, initialValue:0.20), + sliderUpdateCallback: {(filter, sliderValue) in + filter.threshold = sliderValue + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageShiTomasiFeatureDetectionFilter() + + let crosshairGenerator = GPUImageCrosshairGenerator() + crosshairGenerator.crosshairWidth = 15.0 + crosshairGenerator.forceProcessingAtSize(outputView.sizeInPixels) + + filter.cornersDetectedBlock = { (cornerArray:UnsafePointer, cornersDetected:UInt, frameTime:CMTime) in + crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime) + } + + camera.addTarget(filter) + + let blendFilter = GPUImageAlphaBlendFilter() + blendFilter.forceProcessingAtSize(outputView.sizeInPixels) + let gammaFilter = GPUImageGammaFilter() + camera.addTarget(gammaFilter) + gammaFilter.addTarget(blendFilter) + + crosshairGenerator.addTarget(blendFilter) + + blendFilter.addTarget(outputView) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Hough transform line detection", + titleName:"Hough Transform Line Detection", + sliderConfiguration:.Enabled(minimumValue:0.01, maximumValue:0.70, initialValue:0.60), + sliderUpdateCallback: {(filter, sliderValue) in + filter.lineDetectionThreshold = sliderValue + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageHoughTransformLineDetector() + + let lineGenerator = GPUImageLineGenerator() + + lineGenerator.forceProcessingAtSize(outputView.sizeInPixels) + lineGenerator.setLineColorRed(1.0, green:0.0, blue:0.0) + + filter.linesDetectedBlock = { (lineArray:UnsafePointer, linesDetected:UInt, frameTime:CMTime) in + lineGenerator.renderLinesFromArray(lineArray, count:linesDetected, frameTime:frameTime) + } + + camera.addTarget(filter) + + let blendFilter = GPUImageAlphaBlendFilter() + blendFilter.forceProcessingAtSize(outputView.sizeInPixels) + let gammaFilter = GPUImageGammaFilter() + camera.addTarget(gammaFilter) + gammaFilter.addTarget(blendFilter) + + lineGenerator.addTarget(blendFilter) + + blendFilter.addTarget(outputView) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Buffer", + titleName:"Buffer", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageBuffer() + let blendFilter = GPUImageDifferenceBlendFilter() + let gammaFilter = GPUImageGammaFilter() + camera.addTarget(gammaFilter) + gammaFilter.addTarget(blendFilter) + camera.addTarget(filter) + filter.addTarget(blendFilter) + + blendFilter.addTarget(outputView) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Low pass", + titleName:"Low Pass", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in + filter.filterStrength = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"High pass", + titleName:"High Pass", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in + filter.filterStrength = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + +// GPUIMAGE_MOTIONDETECTOR, + + FilterOperation ( + listName:"Sketch", + titleName:"Sketch", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in + filter.edgeStrength = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Threshold Sketch", + titleName:"Threshold Sketch", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25), + sliderUpdateCallback: {(filter, sliderValue) in + filter.threshold = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Toon", + titleName:"Toon", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Smooth toon", + titleName:"Smooth Toon", + sliderConfiguration:.Enabled(minimumValue:1.0, maximumValue:6.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.blurRadiusInPixels = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Tilt shift", + titleName:"Tilt Shift", + sliderConfiguration:.Enabled(minimumValue:0.2, maximumValue:0.8, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in + filter.topFocusLevel = sliderValue - 0.1 + filter.bottomFocusLevel = sliderValue + 0.1 + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"CGA colorspace", + titleName:"CGA Colorspace", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Posterize", + titleName:"Posterize", + sliderConfiguration:.Enabled(minimumValue:1.0, maximumValue:20.0, initialValue:10.0), sliderUpdateCallback: {(filter, sliderValue) in - filter.intensity = CGFloat(sliderValue) // Why do I need to cast this for non-Simulator builds? That seems broken + filter.colorLevels = UInt(round(sliderValue)) }, filterOperationType:.SingleInput, customFilterSetupFunction: nil ), - FilterOperation ( - listName:"Pixellate", - titleName:"Pixellate", - sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.05, maximumValue:0.3), + FilterOperation ( + listName:"3x3 convolution", + titleName:"3x3 Convolution", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImage3x3ConvolutionFilter() + camera.addTarget(filter) + filter.addTarget(outputView) + filter.convolutionKernel = GPUMatrix3x3( + one:GPUVector3(one:-1.0, two:0.0, three:1.0), + two:GPUVector3(one:-2.0, two:0.0, three:2.0), + three:GPUVector3(one:-1.0, two:0.0, three:1.0)) + return (filter, nil) + } + ), + FilterOperation ( + listName:"Emboss", + titleName:"Emboss", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:5.0, initialValue:1.0), sliderUpdateCallback: {(filter, sliderValue) in - filter.fractionalWidthOfAPixel = CGFloat(sliderValue) + filter.intensity = sliderValue }, filterOperationType:.SingleInput, customFilterSetupFunction: nil ), - FilterOperation ( - listName:"Color invert", - titleName:"Color Invert", + FilterOperation ( + listName:"Laplacian", + titleName:"Laplacian", sliderConfiguration:.Disabled, sliderUpdateCallback: nil, filterOperationType:.SingleInput, customFilterSetupFunction: nil ), - FilterOperation ( - listName:"Transform (3-D)", - titleName:"Transform (3-D)", - sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.75, maximumValue:6.28), - sliderUpdateCallback:{(filter, sliderValue) in - var perspectiveTransform = CATransform3DIdentity - perspectiveTransform.m34 = 0.4 - perspectiveTransform.m33 = 0.4 - perspectiveTransform = CATransform3DScale(perspectiveTransform, 0.75, 0.75, 0.75) - perspectiveTransform = CATransform3DRotate(perspectiveTransform, CGFloat(sliderValue), 0.0, 1.0, 0.0) - filter.transform3D = perspectiveTransform + FilterOperation ( + listName:"Chroma key", + titleName:"Chroma Key", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.00, initialValue:0.40), + sliderUpdateCallback: {(filter, sliderValue) in + filter.thresholdSensitivity = sliderValue + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageChromaKeyFilter() + + let blendFilter = GPUImageAlphaBlendFilter() + blendFilter.mix = 1.0 + +#if os(iOS) + let inputImage = UIImage(named:"WID-small.jpg") +#else + let inputImage = NSImage(named:"Lambeau.jpg") +#endif + let blendImage = GPUImagePicture(image: inputImage) + + camera.addTarget(filter) + blendImage.addTarget(blendFilter) + blendImage.processImage() + filter.addTarget(blendFilter) + blendFilter.addTarget(outputView) + return (filter, blendImage) + } + ), + FilterOperation ( + listName:"Kuwahara", + titleName:"Kuwahara", + sliderConfiguration:.Enabled(minimumValue:3.0, maximumValue:8.0, initialValue:3.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.radius = UInt(round(sliderValue)) + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Kuwahara (radius 3)", + titleName:"Kuwahara (Radius 3)", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Vignette", + titleName:"Vignette", + sliderConfiguration:.Enabled(minimumValue:0.5, maximumValue:0.9, initialValue:0.75), + sliderUpdateCallback: {(filter, sliderValue) in + filter.vignetteEnd = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Gaussian blur", + titleName:"Gaussian Blur", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:24.0, initialValue:2.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.blurRadiusInPixels = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Selective Gaussian blur", + titleName:"Selective Blur", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:0.75, initialValue:40.0/320.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.excludeCircleRadius = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Positional Gaussian blur", + titleName:"Circular Blur", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:0.75, initialValue:40.0/320.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.blurRadius = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Box blur", + titleName:"Box Blur", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:24.0, initialValue:2.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.blurRadiusInPixels = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Median", + titleName:"Median", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Bilateral blur", + titleName:"Bilateral Blur", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:10.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.distanceNormalizationFactor = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Motion blur", + titleName:"Motion Blur", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:180.0, initialValue:0.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.blurAngle = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Zoom blur", + titleName:"Zoom Blur", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:2.5, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.blurSize = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + +// GPUIMAGE_IOSBLUR, + + FilterOperation ( + listName:"Swirl", + titleName:"Swirl", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:2.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + filter.angle = sliderValue + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Bulge", + titleName:"Bulge", + sliderConfiguration:.Enabled(minimumValue:-1.0, maximumValue:1.0, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in +// filter.scale = sliderValue + filter.center = CGPoint(x:0.5, y:sliderValue) + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Pinch", + titleName:"Pinch", + sliderConfiguration:.Enabled(minimumValue:-2.0, maximumValue:2.0, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in + filter.scale = sliderValue }, filterOperationType:.SingleInput, customFilterSetupFunction: nil @@ -49,12 +941,12 @@ let filterOperations: Array = [ FilterOperation ( listName:"Sphere refraction", titleName:"Sphere Refraction", - sliderConfiguration:.Enabled(minimumValue:0.0, initialValue:0.15, maximumValue:1.0), + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.15), sliderUpdateCallback:{(filter, sliderValue) in - filter.radius = CGFloat(sliderValue) + filter.radius = sliderValue }, filterOperationType:.Custom, - customFilterSetupFunction:{(camera, outputView, blendImage) in + customFilterSetupFunction:{(camera, outputView) in let filter = GPUImageSphereRefractionFilter() camera.addTarget(filter) @@ -70,9 +962,331 @@ let filterOperations: Array = [ blendFilter.addTarget(outputView) - return filter + return (filter, nil) + } + ), + FilterOperation ( + listName:"Glass sphere", + titleName:"Glass Sphere", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.15), + sliderUpdateCallback:{(filter, sliderValue) in + filter.radius = sliderValue + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageGlassSphereFilter() + camera.addTarget(filter) + + // Provide a blurred image for a cool-looking background + let gaussianBlur = GPUImageGaussianBlurFilter() + camera.addTarget(gaussianBlur) + gaussianBlur.blurRadiusInPixels = 5.0 + + let blendFilter = GPUImageAlphaBlendFilter() + blendFilter.mix = 1.0 + gaussianBlur.addTarget(blendFilter) + filter.addTarget(blendFilter) + + blendFilter.addTarget(outputView) + + return (filter, nil) + } + ), + FilterOperation ( + listName:"Stretch", + titleName:"Stretch", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Dilation", + titleName:"Dilation", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Erosion", + titleName:"Erosion", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Opening", + titleName:"Opening", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Closing", + titleName:"Closing", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + +// GPUIMAGE_PERLINNOISE, + FilterOperation ( + listName:"Voronoi", + titleName:"Voronoi", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageJFAVoronoiFilter() + let consumerFilter = GPUImageVoronoiConsumerFilter() +#if os(iOS) + let voronoiPoints = UIImage(named:"voroni_points2.png") +#else + let voronoiPoints = NSImage(named:"voroni_points2.png") +#endif + let voronoiPointImage = GPUImagePicture(image:voronoiPoints) + + filter.sizeInPixels = CGSizeMake(1024.0, 1024.0) + consumerFilter.sizeInPixels = CGSizeMake(1024.0, 1024.0) + + voronoiPointImage.addTarget(filter) + camera.addTarget(consumerFilter) + filter.addTarget(consumerFilter) + voronoiPointImage.processImage() + + consumerFilter.addTarget(outputView) + return (filter, voronoiPointImage) + } + ), + FilterOperation ( + listName:"Mosaic", + titleName:"Mosaic", + sliderConfiguration:.Enabled(minimumValue:0.002, maximumValue:0.05, initialValue:0.025), + sliderUpdateCallback:{(filter, sliderValue) in + filter.displayTileSize = CGSizeMake(sliderValue, sliderValue) + }, + filterOperationType:.Custom, + customFilterSetupFunction:{(camera, outputView) in + let filter = GPUImageMosaicFilter() + camera.addTarget(filter) + + filter.tileSet = "squares.png" + filter.colorOn = false + + filter.addTarget(outputView) + + return (filter, nil) } ), -] + FilterOperation ( + listName:"Local binary pattern", + titleName:"Local Binary Pattern", + sliderConfiguration:.Enabled(minimumValue:1.0, maximumValue:5.0, initialValue:1.0), + sliderUpdateCallback: {(filter, sliderValue) in + let filterSize = filter.outputFrameSize() + filter.texelWidth = (sliderValue / filterSize.width) + filter.texelHeight = (sliderValue / filterSize.height) + }, + filterOperationType:.SingleInput, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Dissolve blend", + titleName:"Dissolve Blend", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5), + sliderUpdateCallback: {(filter, sliderValue) in + filter.mix = sliderValue + }, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Chroma key blend (green)", + titleName:"Chroma Key (Green)", + sliderConfiguration:.Enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.4), + sliderUpdateCallback: {(filter, sliderValue) in + filter.thresholdSensitivity = sliderValue + }, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Add blend", + titleName:"Add Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Divide blend", + titleName:"Divide Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Multiply blend", + titleName:"Multiply Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Overlay blend", + titleName:"Overlay Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Lighten blend", + titleName:"Lighten Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Darken blend", + titleName:"Darken Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Color burn blend", + titleName:"Color Burn Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Color dodge blend", + titleName:"Color Dodge Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Linear burn blend", + titleName:"Linear Burn Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback: nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Screen blend", + titleName:"Screen Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Difference blend", + titleName:"Difference Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Subtract blend", + titleName:"Subtract Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Exclusion blend", + titleName:"Exclusion Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Hard light blend", + titleName:"Hard Light Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Soft light blend", + titleName:"Soft Light Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Color blend", + titleName:"Color Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Hue blend", + titleName:"Hue Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Saturation blend", + titleName:"Saturation Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Luminosity blend", + titleName:"Luminosity Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Normal blend", + titleName:"Normal Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), + FilterOperation ( + listName:"Poisson blend", + titleName:"Poisson Blend", + sliderConfiguration:.Disabled, + sliderUpdateCallback:nil, + filterOperationType:.Blend, + customFilterSetupFunction: nil + ), -// Corner detector would use this: http://stackoverflow.com/questions/24051395/how-to-go-from-cmutablepointercgfloat-to-cgfloat-in-swift/24414058#24414058 +// GPUIMAGE_OPACITY, +// GPUIMAGE_CUSTOM, +// GPUIMAGE_UIELEMENT, +// GPUIMAGE_FILECONFIG, +// GPUIMAGE_FILTERGROUP, +// GPUIMAGE_FACES, +] \ No newline at end of file diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index 22a72666a..adfc421ad 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -1476,7 +1476,6 @@ GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = "@loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; - MODULEMAP_FILE = ""; ONLY_ACTIVE_ARCH = YES; PRODUCT_MODULE_NAME = GPUImage; SDKROOT = macosx; @@ -1506,7 +1505,6 @@ GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = "@loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; - MODULEMAP_FILE = ""; PRODUCT_MODULE_NAME = GPUImage; SDKROOT = macosx; }; diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.h b/framework/Source/GPUImageChromaKeyBlendFilter.h index 47f5acbc2..00a5aed7f 100755 --- a/framework/Source/GPUImageChromaKeyBlendFilter.h +++ b/framework/Source/GPUImageChromaKeyBlendFilter.h @@ -11,13 +11,13 @@ The default value is 0.3 */ -@property(readwrite, nonatomic) GLfloat thresholdSensitivity; +@property(readwrite, nonatomic) CGFloat thresholdSensitivity; /** The degree of smoothing controls how gradually similar colors are replaced in the image The default value is 0.1 */ -@property(readwrite, nonatomic) GLfloat smoothing; +@property(readwrite, nonatomic) CGFloat smoothing; /** The color to be replaced is specified using individual red, green, and blue components (normalized to 1.0). diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m index d6b2d7286..4e6b4661d 100755 --- a/framework/Source/GPUImageChromaKeyBlendFilter.m +++ b/framework/Source/GPUImageChromaKeyBlendFilter.m @@ -99,18 +99,18 @@ - (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent [self setVec3:colorToReplace forUniform:colorToReplaceUniform program:filterProgram]; } -- (void)setThresholdSensitivity:(GLfloat)newValue; +- (void)setThresholdSensitivity:(CGFloat)newValue; { _thresholdSensitivity = newValue; - [self setFloat:_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; + [self setFloat:(GLfloat)_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; } -- (void)setSmoothing:(GLfloat)newValue; +- (void)setSmoothing:(CGFloat)newValue; { _smoothing = newValue; - [self setFloat:_smoothing forUniform:smoothingUniform program:filterProgram]; + [self setFloat:(GLfloat)_smoothing forUniform:smoothingUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageChromaKeyFilter.h b/framework/Source/GPUImageChromaKeyFilter.h index a3d073c86..5ee7e498a 100644 --- a/framework/Source/GPUImageChromaKeyFilter.h +++ b/framework/Source/GPUImageChromaKeyFilter.h @@ -9,13 +9,13 @@ The default value is 0.3 */ -@property(readwrite, nonatomic) GLfloat thresholdSensitivity; +@property(readwrite, nonatomic) CGFloat thresholdSensitivity; /** The degree of smoothing controls how gradually similar colors are replaced in the image The default value is 0.1 */ -@property(readwrite, nonatomic) GLfloat smoothing; +@property(readwrite, nonatomic) CGFloat smoothing; /** The color to be replaced is specified using individual red, green, and blue components (normalized to 1.0). diff --git a/framework/Source/GPUImageChromaKeyFilter.m b/framework/Source/GPUImageChromaKeyFilter.m index 7ee0d675e..c70ef61db 100644 --- a/framework/Source/GPUImageChromaKeyFilter.m +++ b/framework/Source/GPUImageChromaKeyFilter.m @@ -95,18 +95,18 @@ - (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent [self setVec3:colorToReplace forUniform:colorToReplaceUniform program:filterProgram]; } -- (void)setThresholdSensitivity:(GLfloat)newValue; +- (void)setThresholdSensitivity:(CGFloat)newValue; { _thresholdSensitivity = newValue; - [self setFloat:_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; + [self setFloat:(GLfloat)_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; } -- (void)setSmoothing:(GLfloat)newValue; +- (void)setSmoothing:(CGFloat)newValue; { _smoothing = newValue; - [self setFloat:_smoothing forUniform:smoothingUniform program:filterProgram]; + [self setFloat:(GLfloat)_smoothing forUniform:smoothingUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 5bc7b1804..bc2b6394d 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -200,6 +200,16 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; return self; } +- (id)init; +{ + if (!(self = [self initWithHistogramType:kGPUImageHistogramRGB])) + { + return nil; + } + + return self; +} + - (void)initializeSecondaryAttributes; { [secondFilterProgram addAttribute:@"position"]; diff --git a/framework/Source/GPUImageKuwaharaFilter.h b/framework/Source/GPUImageKuwaharaFilter.h index ef4ff479a..4fb0bce85 100755 --- a/framework/Source/GPUImageKuwaharaFilter.h +++ b/framework/Source/GPUImageKuwaharaFilter.h @@ -8,6 +8,6 @@ } /// The radius to sample from when creating the brush-stroke effect, with a default of 3. The larger the radius, the slower the filter. -@property(readwrite, nonatomic) GLuint radius; +@property(readwrite, nonatomic) NSUInteger radius; @end diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m index 5c8e3968f..9061dbf38 100755 --- a/framework/Source/GPUImageKuwaharaFilter.m +++ b/framework/Source/GPUImageKuwaharaFilter.m @@ -213,11 +213,11 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setRadius:(GLuint)newValue; +- (void)setRadius:(NSUInteger)newValue; { _radius = newValue; - [self setInteger:_radius forUniform:radiusUniform program:filterProgram]; + [self setInteger:(GLint)_radius forUniform:radiusUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h index ae829ec44..0f70808c0 100644 --- a/framework/Source/GPUImageMosaicFilter.h +++ b/framework/Source/GPUImageMosaicFilter.h @@ -17,11 +17,6 @@ @property(readwrite, nonatomic) float numTiles; @property(readwrite, nonatomic) CGSize displayTileSize; @property(readwrite, nonatomic) BOOL colorOn; - -- (void)setNumTiles:(float)numTiles; -- (void)setDisplayTileSize:(CGSize)displayTileSize; -- (void)setInputTileSize:(CGSize)inputTileSize; -- (void)setTileSet:(NSString *)tileSet; -- (void)setColorOn:(BOOL)yes; +@property(readwrite, nonatomic) NSString *tileSet; @end diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m index ebe09974c..b017ca97d 100644 --- a/framework/Source/GPUImageMosaicFilter.m +++ b/framework/Source/GPUImageMosaicFilter.m @@ -95,6 +95,7 @@ void main() @implementation GPUImageMosaicFilter @synthesize inputTileSize = _inputTileSize, numTiles = _numTiles, displayTileSize = _displayTileSize, colorOn = _colorOn; +@synthesize tileSet = _tileSet; - (id)init; { diff --git a/framework/Source/GPUImageSolidColorGenerator.h b/framework/Source/GPUImageSolidColorGenerator.h index 8d7a5ed12..58b1383ee 100644 --- a/framework/Source/GPUImageSolidColorGenerator.h +++ b/framework/Source/GPUImageSolidColorGenerator.h @@ -14,6 +14,6 @@ @property(readwrite, nonatomic) GPUVector4 color; @property(readwrite, nonatomic, assign) BOOL useExistingAlpha; // whether to use the alpha of the existing image or not, default is NO -- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; +- (void)setColorRed:(CGFloat)redComponent green:(CGFloat)greenComponent blue:(CGFloat)blueComponent alpha:(CGFloat)alphaComponent; @end diff --git a/framework/Source/GPUImageSolidColorGenerator.m b/framework/Source/GPUImageSolidColorGenerator.m index 1e65aa9b1..9b555ce04 100644 --- a/framework/Source/GPUImageSolidColorGenerator.m +++ b/framework/Source/GPUImageSolidColorGenerator.m @@ -100,12 +100,12 @@ - (void)setColor:(GPUVector4)newValue; [self setColorRed:newValue.one green:newValue.two blue:newValue.three alpha:newValue.four]; } -- (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; +- (void)setColorRed:(CGFloat)redComponent green:(CGFloat)greenComponent blue:(CGFloat)blueComponent alpha:(CGFloat)alphaComponent; { - _color.one = redComponent; - _color.two = greenComponent; - _color.three = blueComponent; - _color.four = alphaComponent; + _color.one = (GLfloat)redComponent; + _color.two = (GLfloat)greenComponent; + _color.three = (GLfloat)blueComponent; + _color.four = (GLfloat)alphaComponent; // [self setVec4:_color forUniform:colorUniform program:filterProgram]; runAsynchronouslyOnVideoProcessingQueue(^{ diff --git a/framework/Source/GPUImageWhiteBalanceFilter.h b/framework/Source/GPUImageWhiteBalanceFilter.h index eafd65a0b..6b09c33d5 100644 --- a/framework/Source/GPUImageWhiteBalanceFilter.h +++ b/framework/Source/GPUImageWhiteBalanceFilter.h @@ -9,9 +9,9 @@ GLint temperatureUniform, tintUniform; } //choose color temperature, in degrees Kelvin -@property(readwrite, nonatomic) int temperature; +@property(readwrite, nonatomic) CGFloat temperature; //adjust tint to compensate -@property(readwrite, nonatomic) int tint; +@property(readwrite, nonatomic) CGFloat tint; @end diff --git a/framework/Source/GPUImageWhiteBalanceFilter.m b/framework/Source/GPUImageWhiteBalanceFilter.m index af4b4bad1..17c9bce9e 100644 --- a/framework/Source/GPUImageWhiteBalanceFilter.m +++ b/framework/Source/GPUImageWhiteBalanceFilter.m @@ -89,18 +89,18 @@ - (id)init; #pragma mark - #pragma mark Accessors -- (void)setTemperature:(int)newValue; +- (void)setTemperature:(CGFloat)newValue; { _temperature = newValue; - [self setFloat:_temperature < 5000 ? 0.0004 * (float)(_temperature-5000.0) : 0.00006 * (float)(_temperature-5000.0) forUniform:temperatureUniform program:filterProgram]; + [self setFloat:_temperature < 5000 ? 0.0004 * (_temperature-5000.0) : 0.00006 * (_temperature-5000.0) forUniform:temperatureUniform program:filterProgram]; } -- (void)setTint:(int)newValue; +- (void)setTint:(CGFloat)newValue; { _tint = newValue; - [self setFloat:(float)(_tint) / 100.0 forUniform:tintUniform program:filterProgram]; + [self setFloat:_tint / 100.0 forUniform:tintUniform program:filterProgram]; } @end From 557258a80aaa8b498cbb3c64ed9e0ba32cb3c6c7 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 24 Jul 2014 20:50:39 -0500 Subject: [PATCH 571/695] Fixed the bad merge on the movie updates. --- framework/Source/GPUImageMovie.m | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 84600adc7..cdcf706fb 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -191,8 +191,16 @@ - (AVAssetReader*)createAssetReader NSError *error = nil; AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:self.asset error:&error]; - NSDictionary *outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; - isFullYUVRange = YES; + NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; + if ([GPUImageContext supportsFastTextureUpload]) { + [outputSettings setObject:@(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; + isFullYUVRange = YES; + } + else { + [outputSettings setObject:@(kCVPixelFormatType_32BGRA) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; + isFullYUVRange = NO; + } + // Maybe set alwaysCopiesSampleData to NO on iOS 5.0 for faster video decoding AVAssetReaderTrackOutput *readerVideoTrackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; readerVideoTrackOutput.alwaysCopiesSampleData = NO; @@ -292,7 +300,13 @@ - (void)processPlayerItem [displayLink setPaused:YES]; dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; - NSDictionary *pixBuffAttributes = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; + NSMutableDictionary *pixBuffAttributes = [NSMutableDictionary dictionary]; + if ([GPUImageContext supportsFastTextureUpload]) { + [pixBuffAttributes setObject:@(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; + } + else { + [pixBuffAttributes setObject:@(kCVPixelFormatType_32BGRA) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; + } playerItemOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pixBuffAttributes]; [playerItemOutput setDelegate:self queue:videoProcessingQueue]; @@ -450,11 +464,8 @@ - (float)progress - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime { int bufferHeight = (int) CVPixelBufferGetHeight(movieFrame); -#if TARGET_IPHONE_SIMULATOR - int bufferWidth = (int) CVPixelBufferGetBytesPerRow(movieFrame) / 4; // This works around certain movie frame types on the Simulator (see https://github.com/BradLarson/GPUImage/issues/424) -#else int bufferWidth = (int) CVPixelBufferGetWidth(movieFrame); -#endif + CFTypeRef colorAttachments = CVBufferGetAttachment(movieFrame, kCVImageBufferYCbCrMatrixKey, NULL); if (colorAttachments != NULL) { From b2b4b5b5c51a53b331876020f7a5b7e55536942c Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 24 Jul 2014 22:46:49 -0500 Subject: [PATCH 572/695] Added an attribute to prevent warnings about a new property. --- framework/Source/GPUImageMosaicFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageMosaicFilter.h b/framework/Source/GPUImageMosaicFilter.h index 0f70808c0..5f72d3c91 100644 --- a/framework/Source/GPUImageMosaicFilter.h +++ b/framework/Source/GPUImageMosaicFilter.h @@ -17,6 +17,6 @@ @property(readwrite, nonatomic) float numTiles; @property(readwrite, nonatomic) CGSize displayTileSize; @property(readwrite, nonatomic) BOOL colorOn; -@property(readwrite, nonatomic) NSString *tileSet; +@property(readwrite, nonatomic, copy) NSString *tileSet; @end From bda95a3db7548b66efc862145db605a7927f1eba Mon Sep 17 00:00:00 2001 From: Gary <52doho@gmail.com> Date: Tue, 29 Jul 2014 22:45:04 +0800 Subject: [PATCH 573/695] Update GPUImage.podspec --- GPUImage.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPUImage.podspec b/GPUImage.podspec index 219d4174b..1e7d2c027 100644 --- a/GPUImage.podspec +++ b/GPUImage.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'GPUImage' - s.version = '0.1.4' + s.version = '0.1.5' s.license = 'BSD' s.summary = 'An open source iOS framework for GPU-based image and video processing.' s.homepage = 'https://github.com/BradLarson/GPUImage' From 77eb3a5070fc6819a1a4a0b1ffa2052ad56dd8d6 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 5 Aug 2014 10:46:44 -0500 Subject: [PATCH 574/695] Fixed some Swift renaming issues from Xcode beta 5. --- .../FilterDisplayViewController.swift | 2 +- .../FilterOperations.swift | 8 ++++---- .../project.pbxproj | 19 ++----------------- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift index 1c489f98c..747cee1ee 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterDisplayViewController.swift @@ -9,7 +9,7 @@ class FilterDisplayViewController: UIViewController, UISplitViewControllerDelega let videoCamera: GPUImageVideoCamera var blendImage: GPUImagePicture? - init(coder aDecoder: NSCoder!) + required init(coder aDecoder: NSCoder!) { videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset640x480, cameraPosition: .Back) videoCamera.outputImageOrientation = .Portrait; diff --git a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift index dcc38f0b3..c61b78822 100644 --- a/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift +++ b/examples/iOS/FilterShowcaseSwift/FilterShowcaseSwift/FilterOperations.swift @@ -507,7 +507,7 @@ let filterOperations: Array = [ crosshairGenerator.crosshairWidth = 15.0 crosshairGenerator.forceProcessingAtSize(outputView.sizeInPixels) - filter.cornersDetectedBlock = { (cornerArray:UnsafePointer, cornersDetected:UInt, frameTime:CMTime) in + filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer, cornersDetected:UInt, frameTime:CMTime) in crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime) } @@ -540,7 +540,7 @@ let filterOperations: Array = [ crosshairGenerator.crosshairWidth = 15.0 crosshairGenerator.forceProcessingAtSize(outputView.sizeInPixels) - filter.cornersDetectedBlock = { (cornerArray:UnsafePointer, cornersDetected:UInt, frameTime:CMTime) in + filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer, cornersDetected:UInt, frameTime:CMTime) in crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime) } @@ -573,7 +573,7 @@ let filterOperations: Array = [ crosshairGenerator.crosshairWidth = 15.0 crosshairGenerator.forceProcessingAtSize(outputView.sizeInPixels) - filter.cornersDetectedBlock = { (cornerArray:UnsafePointer, cornersDetected:UInt, frameTime:CMTime) in + filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer, cornersDetected:UInt, frameTime:CMTime) in crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime) } @@ -607,7 +607,7 @@ let filterOperations: Array = [ lineGenerator.forceProcessingAtSize(outputView.sizeInPixels) lineGenerator.setLineColorRed(1.0, green:0.0, blue:0.0) - filter.linesDetectedBlock = { (lineArray:UnsafePointer, linesDetected:UInt, frameTime:CMTime) in + filter.linesDetectedBlock = { (lineArray:UnsafeMutablePointer, linesDetected:UInt, frameTime:CMTime) in lineGenerator.renderLinesFromArray(lineArray, count:linesDetected, frameTime:frameTime) } diff --git a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj index 567364b8f..17839f61d 100644 --- a/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj +++ b/examples/iOS/SimpleSwiftVideoFilterExample/SimpleSwiftVideoFilterExample.xcodeproj/project.pbxproj @@ -30,13 +30,6 @@ remoteGlobalIDString = BCF1A33414DDB1EC00852800; remoteInfo = GPUImage; }; - BC73FD5119612C75004A9191 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BCF1A34414DDB1EC00852800; - remoteInfo = GPUImageTests; - }; BC73FD5319612C75004A9191 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BC73FD4419612C4E004A9191 /* GPUImage.xcodeproj */; @@ -122,7 +115,6 @@ isa = PBXGroup; children = ( BC73FD5019612C75004A9191 /* libGPUImage.a */, - BC73FD5219612C75004A9191 /* GPUImageTests.octest */, BC73FD5419612C75004A9191 /* GPUImage.framework */, ); name = Products; @@ -196,13 +188,6 @@ remoteRef = BC73FD4F19612C75004A9191 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - BC73FD5219612C75004A9191 /* GPUImageTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = GPUImageTests.octest; - remoteRef = BC73FD5119612C75004A9191 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; BC73FD5419612C75004A9191 /* GPUImage.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -290,7 +275,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; METAL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -327,7 +312,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; METAL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; From d591db543212b39e9c837d0afc8e13752767006c Mon Sep 17 00:00:00 2001 From: zm Date: Fri, 8 Aug 2014 12:18:21 +0800 Subject: [PATCH 575/695] Fix issue 1580 --- framework/Source/GPUImageMovie.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index cdcf706fb..1f78345ec 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -500,6 +500,9 @@ - (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)cu CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); + // Fix issue 1580 + [GPUImageContext useImageProcessingContext]; + if ([GPUImageContext supportsFastTextureUpload]) { CVOpenGLESTextureRef luminanceTextureRef = NULL; From 8cc5c99239a7a3946f296f032bfff65bd2424394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Tue, 12 Aug 2014 15:20:27 +0900 Subject: [PATCH 576/695] Enable `pod lib lint` in Travis configuration --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b0e340100..6217f2a33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ before_install: - pod repo update --silent script: - #- pod lib lint + - pod lib lint - xctool -project framework/GPUImage.xcodeproj -scheme 'GPUImage' -configuration Release -sdk iphonesimulator -arch i386 build - xctool -project framework/GPUImageMac.xcodeproj -scheme 'GPUImage' - xctool -project examples/Mac/FilterShowcase/FilterShowcase.xcodeproj -scheme 'FilterShowcase' From b847f356779d2c7a7b139e5017336a2c23098a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=A9=E8=BE=BA=E7=BE=85=E3=82=A8=E3=83=AB=E3=83=8D?= =?UTF-8?q?=E3=82=B9=E3=83=88?= Date: Tue, 12 Aug 2014 15:35:45 +0900 Subject: [PATCH 577/695] Silence `pod setup` --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6217f2a33..e757a110a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,9 +2,9 @@ language: objective-c before_install: - - gem install cocoapods --quiet + - gem install cocoapods --pre --quiet - pod --version - - pod setup + - pod setup --silent - pod repo update --silent script: From 917646be582804bc9ba9cb3367afde082274a259 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Tue, 12 Aug 2014 10:41:02 -0500 Subject: [PATCH 578/695] Added an example of how to use Swift playgrounds with GPUImage. --- .../project.pbxproj | 307 ++++++++++++++++++ .../Resources/ChairTest.png | Bin 0 -> 632358 bytes .../Resources/CustomFilter.fsh | 19 ++ .../contents.xcplayground | 7 + .../section-1.swift | 10 + .../timeline.xctimeline | 15 + .../PlaygroundExample/main.swift | 4 + 7 files changed, 362 insertions(+) create mode 100644 examples/Mac/PlaygroundExample/PlaygroundExample.xcodeproj/project.pbxproj create mode 100644 examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/ChairTest.png create mode 100755 examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/CustomFilter.fsh create mode 100644 examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/contents.xcplayground create mode 100644 examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/section-1.swift create mode 100644 examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/timeline.xctimeline create mode 100644 examples/Mac/PlaygroundExample/PlaygroundExample/main.swift diff --git a/examples/Mac/PlaygroundExample/PlaygroundExample.xcodeproj/project.pbxproj b/examples/Mac/PlaygroundExample/PlaygroundExample.xcodeproj/project.pbxproj new file mode 100644 index 000000000..e95be687a --- /dev/null +++ b/examples/Mac/PlaygroundExample/PlaygroundExample.xcodeproj/project.pbxproj @@ -0,0 +1,307 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BCF23F621995710B00877133 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCF23F611995710B00877133 /* main.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BCA7F565199571B200830968 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF23F681995712E00877133 /* GPUImageMac.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BCA3F31B17239B6500E28AEC; + remoteInfo = GPUImage; + }; + BCF23F6C1995712E00877133 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BCF23F681995712E00877133 /* GPUImageMac.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = BCA3F31C17239B6500E28AEC; + remoteInfo = GPUImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + BCF23F5C1995710B00877133 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + BC191C78199A6C94000C9A4A /* ChairTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ChairTest.png; path = GPUImagePlayground.playground/Resources/ChairTest.png; sourceTree = ""; }; + BCC31A581999BD2600DFA879 /* CustomFilter.fsh */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = CustomFilter.fsh; path = GPUImagePlayground.playground/Resources/CustomFilter.fsh; sourceTree = ""; }; + BCF23F5E1995710B00877133 /* PlaygroundExample */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = PlaygroundExample; sourceTree = BUILT_PRODUCTS_DIR; }; + BCF23F611995710B00877133 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + BCF23F681995712E00877133 /* GPUImageMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImageMac.xcodeproj; path = ../../../framework/GPUImageMac.xcodeproj; sourceTree = ""; }; + BCF23F6E1995716700877133 /* GPUImagePlayground.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = GPUImagePlayground.playground; path = PlaygroundExample/GPUImagePlayground.playground; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BCF23F5B1995710B00877133 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BC191C79199A6C9B000C9A4A /* Playground Resources */ = { + isa = PBXGroup; + children = ( + BCC31A581999BD2600DFA879 /* CustomFilter.fsh */, + BC191C78199A6C94000C9A4A /* ChairTest.png */, + ); + name = "Playground Resources"; + sourceTree = ""; + }; + BCF23F551995710B00877133 = { + isa = PBXGroup; + children = ( + BCF23F601995710B00877133 /* PlaygroundExample */, + BCF23F681995712E00877133 /* GPUImageMac.xcodeproj */, + BCF23F5F1995710B00877133 /* Products */, + ); + sourceTree = ""; + }; + BCF23F5F1995710B00877133 /* Products */ = { + isa = PBXGroup; + children = ( + BCF23F5E1995710B00877133 /* PlaygroundExample */, + ); + name = Products; + sourceTree = ""; + }; + BCF23F601995710B00877133 /* PlaygroundExample */ = { + isa = PBXGroup; + children = ( + BCF23F6E1995716700877133 /* GPUImagePlayground.playground */, + BC191C79199A6C9B000C9A4A /* Playground Resources */, + BCF23F611995710B00877133 /* main.swift */, + ); + path = PlaygroundExample; + sourceTree = ""; + }; + BCF23F691995712E00877133 /* Products */ = { + isa = PBXGroup; + children = ( + BCF23F6D1995712E00877133 /* GPUImage.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BCF23F5D1995710B00877133 /* PlaygroundExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = BCF23F651995710B00877133 /* Build configuration list for PBXNativeTarget "PlaygroundExample" */; + buildPhases = ( + BCF23F5A1995710B00877133 /* Sources */, + BCF23F5B1995710B00877133 /* Frameworks */, + BCF23F5C1995710B00877133 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + BCA7F566199571B200830968 /* PBXTargetDependency */, + ); + name = PlaygroundExample; + productName = PlaygroundExample; + productReference = BCF23F5E1995710B00877133 /* PlaygroundExample */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BCF23F561995710B00877133 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = "Sunset Lake Software"; + TargetAttributes = { + BCF23F5D1995710B00877133 = { + CreatedOnToolsVersion = 6.0; + }; + }; + }; + buildConfigurationList = BCF23F591995710B00877133 /* Build configuration list for PBXProject "PlaygroundExample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = BCF23F551995710B00877133; + productRefGroup = BCF23F5F1995710B00877133 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = BCF23F691995712E00877133 /* Products */; + ProjectRef = BCF23F681995712E00877133 /* GPUImageMac.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + BCF23F5D1995710B00877133 /* PlaygroundExample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + BCF23F6D1995712E00877133 /* GPUImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = GPUImage.framework; + remoteRef = BCF23F6C1995712E00877133 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXSourcesBuildPhase section */ + BCF23F5A1995710B00877133 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF23F621995710B00877133 /* main.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BCA7F566199571B200830968 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GPUImage; + targetProxy = BCA7F565199571B200830968 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + BCF23F631995710B00877133 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + BCF23F641995710B00877133 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + BCF23F661995710B00877133 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + BCF23F671995710B00877133 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BCF23F591995710B00877133 /* Build configuration list for PBXProject "PlaygroundExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCF23F631995710B00877133 /* Debug */, + BCF23F641995710B00877133 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BCF23F651995710B00877133 /* Build configuration list for PBXNativeTarget "PlaygroundExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCF23F661995710B00877133 /* Debug */, + BCF23F671995710B00877133 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BCF23F561995710B00877133 /* Project object */; +} diff --git a/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/ChairTest.png b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/ChairTest.png new file mode 100644 index 0000000000000000000000000000000000000000..58f06c8d957cd1da142af6ce7ec99f27185e7380 GIT binary patch literal 632358 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

cAIAES*1F(FT6? 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𝕐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

iws*eG9$vU(ThF%~AT7Twh`f`vOkyZ(c*$(#XV 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 z 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�S4Dsx9{&%ZN%#zgU0!;NEQc&egl+#m7!j zce=Z<+p6>q4iO#D5Hnijfa#CSa$GXPshs|Xp}NA7LCgL$ZDU;1){sRrSa1C!aI%4+ z)QK`Q!BrU}e>#s`n(1~um-Mde`vor!)8^$r*T^GlxT=h>aL*om<$<-$AW#o+m+>r< zY46-hvM7ksAT;7+l*#2H`|?Dm(c>pM8Eul^xaV;BD@$v1dceF zuG9!xVZZm<@(hMB^pO;_Z+!si;+$5ZS`5f}Z^QN@&nO>E_N$45%nyEEVomt*2Tzn= z`o!Na-}v@x;EGW9UDk=AlLbYrRJchrVsiFgxpAW!CZ*h_N5;gTaYv*Tz=4z~Fgmd# zFGRpI2tB_^tjfnfcXrdDUwUyS{whYxTPQd#}%^ zj3lV-*|wfQAmDoygx;e!A)`q+8D620u&A&BXOPP8DX+-=w#831JPfQdqXN}6-gfGA zdhmF>T%V^ui^x0St*WB;x;;-wf(b0a4RfhbY}I~*PMEykPPFcv^!_G3g|mA3+=*}% zPGNCVx|_c()*$nFO*o@`_>4?|QL9j{m~-*oi*=IKe%V3*EGBpv#@*UkViE}-#sR|6 z38S~EQMEt_?(HkL%BMd4hjvu@z`^+OLA*B$m2*M}Yf5!{jBD<;?pSL%HgV-1A2~`Hoqju*1j3(fL;P+vp?JK&-tev~ zuN+PYp0&b__gTJAf!7ZGO|A&U+#K&${_-EcsgULG93!aY;aa?GV0FESVRDVps{Ex5 zfkMZgkT`JKN0tR_oBQH<@k|Z@-@`*85o`rdZXjcX9~f%3fze84JAKC6cJHFg69~mD zQG{>d4c>PM5t~r9jMYvK2qh3Hp+^w`6GGf$=*dahYC-j(Hnx=vvQ9b5(Q3!pTGQLw zk3qtoZg7Hw0iQBn_WtgZ=}9;zXBDfB?#(S^{w9eC&|HF8BGfj=p2^ewdeYS(k!OcE zfAwP@e7Jl7MR@k~c)3IohF0nc-`;E~|LoVlR!)zy=Mn4PZE*?ZF$VMuIAp$HfciR0 zSZ)b}Zi(tqV-rJVpEa?QoUUY2=lY^X0Q-qqCv2mnVRJJ%5D4szNyDl{-y(wHCj_W*u^maP-U~k+tQ!WwZAvQ4N>g4E-ZpfJ5)q@e81iL=)A(;uUjGotqq& zM=088i@50bSWR%zjK{o$muz8}KB`BpVn}tgARn2NOlJ6TmpbrsROFg2J!A@ZVu-5D z-A?J6v*X-YC2xkqTUOnh&K!$u1TSmND}hfwK>~!fD)Sg9!iwHeVYVkl@ij;Pcnk-s0);3J&aT5L^w3cw9l0b$^_+wA!g@! zoVf6wI;8ermkY%sbD!}mTbIdWcwbsrqbwUWi)k>h*^cOz z41it{hT;{CT!X6d8AC{r(e3v9=X}_ z;qQ4D_kah+(2B^o;0WL=3aIdO({ z87(J{t`X`b0)ukxrh*ksvbM++1~xM^O=7Wpphn#W!rgFel7*P?v=+hG zVIh9J181!Q+LK@$59r79WIG2I`x)$V3lEsZtl+)Kn%N1w*lV1b``M?yUB2|q*UBgV z@sF2VB*goA;*s+xD3mW*sPep9I>fsny*^HSGRxnjssSnitr3D&DYtR&doG@2Z1hX9 ze@pwB_;P?JYI4&GGUq!)WLWr%!m6}`2LROhq@YwF*XSBRKny>-Z03xY*W_spSD!Tj z%;><;lc&n@^A{=qxmIpYFP6KU-cyR9L$Ue)eOWble1rof`V4b2UrC-hz<}9>P8tJ- zb?Jc5^4y_=032}^bi2I{K+2Nv4_#z`IymRYbbJ1RGj}OxZ%*j(b!-EMwsPx({7Ek57!pz?E;`c>Qfk zERILHy6mHIHZn;0Mc|pHyy6-Ljy0WWCT{TFQfxc9F&goPlRAzuj zYvG%O8vb;W^GT)Yv-0vT32L6qcLHZ2%QW1flr{XVhwuFMK0WDF@nbG(09(0C<6ckw z|K;jEpft_S!pyf)SI#+yj?-y+a@1&~Q6NfKvXE9_SYucx9WUPFJqy@-#5u-b@A2;1 zGRHPSuq=y?1xG>x1&~HFLYkaAP3K%)UDZ`xIfw3jp7-lQ;D4sN{`&v#yWhR zkTH{y`%Xr{SRzOYCWs*2GTbXuN#@4AsUYxMq>|BbTQLX5_P(@m6X}VI0St*JkB)-j z=pNFF)df>YCUP=fHc`N5T!U*JU!eO~zju=qz9NTnOAB21xG7wukkxu;>iM_L;4?`B znk-%g+%w{cm@v_(h@(ar8#Wqmbx0?HA< ztb(yLY5cz+hBfB~JS(tTbMJ&fF3Ep@RnCL=ch@hBN+D?XQuz3?g(sWEHHBrKm?jyKz=JI&F@bbx+x~o8uiUj^u$0P#m-o3jy-Kil)sl&9ff^?gQWiWs)=%iWb z#h3GMZsBM*JSoC$j^~Wx4&6cGN)5PF1Ji?BGIz#VrbXl`wWwIeIBOHvN>KR4xeT?y zNS$}myGX(F*e0LCTmLJBu-_|)t7+{2ETt)5{HLFa4?eLcdB8HR+&L7t1-e}=;f7wE znkQB`6LhAGTO@`pENsLiy_QdmPQ}}k)aZ}eq~t=}Gtw8eD%y#E1zsc{0;YwM$wZ*N zbaOKk@k>k4NjgW_kbKQQY(P^E?kQjzaGgH!KqI&&tgu>P>?*kK?>Rcq9bM+|gXQNL z=LfGnhYrV~;qJ`x-E+@g6tT5vBL=+8x{NJ~&kEEPa8H=42yF`$%QuCg^r67g`c3N- zoH0|~#J?&8>z+L$@#-7zL#5Lqv*b~_O8SHT#aY0~T)EwOG1qMG$$Pzx8XUTbrRjM}@47+GuW8(yXXFhWju+n6Dl)v!6XzTS2^lfw#CkAFX(M zew1?IFun@+35<~IT)c>EvA(nM5ARjjZ1^0elR}@* z6_gT!1fq44h|hZwO+jZy@7gj-1{+^bd`b?hhFS>zVh+Ya?G_~S&13AiHia(?U6yS< zu|20H8lNMfS^9zZGRJW&+m`88w7$&RJq7kMu^N%ntkA`^dA^&+ZSihgx^yKz_2VC) z{AY*+0(vkv(l{UYm@u;3pqe^8R+cVh0Z@h;(i4Oblfa%O@J^SR?lRrR!a@yLMqr^k zA4CW7xBa_%<0=`gbyz88VA{mrvz$$!*KL*7B7kv!jCtq20xy}khXE+$b=!(miS!Us zIZ`;4k=!HUfdFT0_dz(M2ZZ^gK$Z%at^YetIVu0TsAN{|r$S7EO6CRJwi}d4;3A3^ zpM)%~ZF>4p?g7LNqfhM`i=n|`Ca+d1dvHYz<#ay_~AFBe=6T|(9 zH^!*Fll#R#3EsI?;L_Jk=5c{rtmz!g`kl*{am%)G%FZhLhZU!F&T<=Y7dMgo(Toet zTFmkiltJJlBi0+@+$GixJTj8>ZT3OsO72uj!j$Xq+-H?4%X`4e0#0c8CLiy7}n4OpWtLKJ)vrbEqpucDBa| z$43tIwMIi{YYcKK)FN)nv1=1C+zCxG57#F1wU@7WCof82=h&=IzO((xz2aG3pKes( zE>DR5J<+r|70onhxD7mR7QL6E5atc!!$}EC@gE;SP1jZV0q_HSvc-%wH z*p=~x_?Mskop|@m1$zE=#R`g$f=$|25G3#5SteMe2ZG0{%qa|*4)b7K;GaDR{J?k z)+!8yTPnrCS_3B)VKJQd;-!Ew_U`q?f%hm7(7eWt<#`L>$W4?cdANL7+K}%3@vM3+ zS_QQDEJoViR{@(nsF{cS#pkE7l6$DUF{#vjMAm?3>iXiV3U+>uuw_{ISRtHsNoUCy zvz5A>xBI<8Q<@b7Eg()f%1djZpW842z?<`3Aj#GCtQZzdk53C6aj~*@;~fyb$j;x~ zQM^QKE-Zv@LD&Myza{K?+)TQhtR>Bb=Z14TKt-8PqTCkP#(zrXN`S}9#K&ZKf->(b zG-?qh1uUyc`wpgMTgO}m-{pOb@3_S<#e8$)7)PMH1?6l&T5GITjY~~EttF5}#wDPW zb+E~TQ&&mOhcVntpXapvQ8DphGC2`OcfAB*7oD_7?z%tC81}>ukJi!x&}uTvaGh+* zHeAF9b`F6E#GtWYnmc-_g( zF^lkdwk7v%D%ilxZ6@gYtrPUOF>>9}37kY4VCh(B)oF$DO@0q7gt3-#2`XSFJosEV zj;o|Z1x>e4ERR~UeAn)uw1E>P~vx>m+0EHTDG*%3!xJ9Z_;zWqx4=70FP zs40QL0mkZb3QQSu1M5|0Qbvq<`3&#l7MsPIhJ7thzV zrq!%aabC9_i*aOVUMH>i65cXxiQl9b69UCo8Eb*d!n3&6Oyf=5;#$B78(@~}1a8&9 z)OqPzwnlkq-*9~Yr8mI|#sWr@#3F^I`|3QBhWIyM{JQ%tVJ!UozKZ>PXnCWam+`TybG5mGMN+jJ4gE>Go9pxe92yV&MjqlbJOV>ZeVgYk-+)fKraCl^I7Xs-Pe2p$z@Bzoq)2;aJp+Vw- zW2=OUBl0`(LD#IbJdKy7NT@=YBfhVzdIcBll`9;wK?l6v1NS7)*?r`}=-a(NrY9%| z0=`G?-5V3*H>0PopL2@`DS=vzu`8G3z`YNoF;PRy)YF&7;@xxC=>F7>Le6A>v&tc; zoAfDd7RU1$u44n)#BGmZVc6+WDZC%jy5|nGw$QtKgZu}2E=%``wuzKExXpylNUwNuo`XPb%R9KJ~fV&j9=YT5Y=cTmZ6M-m9=gE?l zSt;Z;$wb}6irt#I7C-UiuIR1)`<$~mL5Toai>bktq0mr10#WJ)F~*qgex7BPX)Wa+ zCT_X;#=z7rUA$SgYPHt=c{sEnuS8oc#d?(?N$g$3B;F+{#dx@5n~5kaJ^4dnm{wX^ zS_-jZ4^x{5$&3?2fq9?$i7<3OQUCxN@f*}{zs5K<>RVgmVqmmQ}SX928i}>kFSg7bZUf##vDj4ce z?3Pg=>u965NZx=J`5ml7EnhRa3l9W9;yy5v(F$fS>=mLuA$bntHv**Q;hNaBQ+((G zU9@ggT4{A?W-{|IIjaQk!xr~4Ywj-SSL@$bGBY=fm;02)1nYDC?jKu}r#$r&uIU}< zirN-Vy)nBj6)JFoYf3$Ritzw(&fBreQ5uaKZ(wC=$(!Llx-gylG1%1$t(#e1R04RL z^r14CVGi-hA814&YB|~_u5Po6nHE1<@!&6bpkm(G(H+;OR^s^GBOMtoU%PPtbnZEr zFjFa$H_FuI&*nHVQqr}dET6qfEN|qOJ_ru;gwnFg_QvEIjwQe2|FXI2%}?>kzy^R)NrhSI}l`7zS1cQhR-s1j9UP z>zg2&W*7(>Qf>&@b!a&fq*hyY=0c#j&YUgJ%XX6@9K@`KrKOx!hwDI4t#Z6p8GU}c z`+MT~Z#)-|Jb0LOK-3U#HB4ShRKk_0a`V)>*m#wcC9L@-VrgcNZozC&Ic zyj7GW85`UpTh}AW+K4&bzke8_nZ^nxhRWRRNMw!O{K8z}V)Fb>zDR8q*dwW=d(V`fl|?t0l8+r zha06JmXSLLK`iYn)H0EgO9iGvJ%P%MRbqJ2S9%zRr z=n~HfF%NoQ0xVq7w5!yUWywt$Om<~{J*KxfGnx42m%s2QF@ALnW?jubN!!JmoU@@A zJt>BXv?Nsqr2oV(*96XGmVd&6HGz+6a>p)?#&7?Ne;f}zu$R-9*5l|qr#Rkm8ai%? zS6(?5&pr1I=J|t{6tt_CJdm2U^bpj5UkzB6Rsu*5o)PU~DxRTx2Y#_Z9>Q%}p5_ZW z(93gh&=y}HF<%QcDK%?sp#cfYkn$9HhY3Wwsz3E_l8v{9{>lhuq!dcUe@iRa3G5Fg! zgTY@=V6OAt=eT#43aM~h!i~Ll?rPk7cyF{3HZq4vevt+Pd!%gh+0v;r?zVZ7k|9Lp z)hrbydLYva#r#26_8dBezu8AxBg$-hK+6|+iAm%WKWtU0XOKoj02#!Qp(ywY7Zn7^ z;5iTg60s$0T^K1mr6T^f34;>f)?2zhwgs@)=JOm+L}WrT7qx)`A%WH1@x4}eM=}L& z^7}%YlysRBf9rPefyEqh-->^78ifUAjCq>?vm8dkWcNEkI~(Pl8N;HBQV$ynU0%c?8kLVSZdOiuo8RMT7#Lux(n3Fqy=*;n371Q;C0P~5QhL=KWoz?!B;4r z_1pxGu@{RFCCw-^#wR_gD#>`gF830~rrRs`C+|TKNTEU4hFU=`ryhmEIB*-{Z zb+)@yV5%6qLKqY4^PRBtWf!7+@0__`1yb0j<j~B`vxKvAQyNscnRVzUB02@hePUJJh0W$y0e1l$8)Bz?&SwiPH_JgS_j zl!_z1oUeNVP{*x!V&*IviA(YrvVwnq9Vo!5J?0RNDLUS$JIe}?<`k8p? z*#qD?IRkCO)asv)GiNR(4o{3-j+2)cV)W=6`8*QJIl=)P;OE{44=>RXTU!W@fN^QFx3B{Az2(9A{CjoS;_1!SlXn`qA0Np$)ta z-r1Sm=wjCp_*;Y{9ZO~S7N-(v1h`MBBr*?$s)mBk%#+<1EOUnh93Zr+Lmn!R^B8iOI*#}u|$s_|cz-5@(Z5V)M9U_A@!p66h~#7(ziq_3H#-3UP@X<}Lh*YIeB2f=k*b(ulOI`dF-*5xjF zjGt@B0^{>AyfcVe0tPJL5L?Ag6DE?&75_a4}v z_o#qahb;5SqvmwO@wah0l_&crt5NCV(K51Gh)Tuw^JNUaWE8c)K^U#$x~xZ$*flg5 z=TDuXVL}_@!GN){GH!)jQ2-|qL9kMrNGMSxLt(6pb+|4*&qOuWR?x>?2I|JT(Yz#n z;bhNQ1-J<8{InEOxB_=IaFJ3RP`DeuNLQOo6##BqJ1RAfTF$y|lf+?vR!^*PeiEk& zfeK1K8jnLVJIR+ZSqAsY@V7rNX6Kri5%Wd!2Cijf1v^J^O|hN=z<-<^zZ7(-pz%8o z8DQMG`4w_@3))yl@N96eG+;@WIRY{pbcmdX_u8dLSZHk+W71VwNp`d_-*zL{KMzAumS7cXaMqp6`01(P}JPO}t={T#b-gZj@! zN~hX0=}e{GFu?)>ZW1N4oi1Fu_4G0+kj$!ANrqR)EQ;|Q9w_-*GBwr%DkuE)WMyw} z>43c{z)~n1W{0c%x&QJCX(H*7xn>I z9r`NZs0SmhVfVyO-6Zf!deHE=b@^D7HnvC4@UB?8ekLw%e_-|i06+jqL_t)Yzycn- z79VJ&-644KL+^Wlkkn1?TaPC``EZofd?+rSI2}jdI2D73_cLN?T$@;rGbfKxGkzyt zed|PwpL!{JcO61;)ctLx2gVYDh0V?VRryiCQjVH@#AG5ZPOUgD;s@RYjY)MGieU{N z=AyNFhrLp1^E!}J%NUs&}+8W@aC21&9B~7=tim3{TVMmizl{>|O z_xdl4uO1)we(WY80lXFKDD}-4Ewdzz=?UoT>y5g`7WhAn zdce=An-g*7+_}Ut`DmZoU5Yv1sk?R~rO>RL+%2$QHeP ztj%lE14F)q%T+FBUJUr}>h-{8cR=Pj(AS-{^Y&YBfIscQBd|cp*!792AK+}N8g zAT#vjFA{-*&jluuJ1Bn$2tLXUNk#|&C1fWfqmwDHKTMWMN(2Z7HQZH%jLgQ#S(D}j z*=v>}yDJ!l>^d_E%@X53V_kWJPj*fKN?~Qg{7o3D8jD%JHYexubjAAH%vBjjc4&Qr_gOlrsN06ii5dEgM z92YdtZNS~r+-zKJ1t3e<#!Nh*K_ z&860x>$VZY_3PIXNr(D+(Hv)@h0}>dI2D-0cHnDGqA!tNH*THTq1?NPa$(J#NGh?| z*u%J%Ox!~twh*Mwv8V-PI0&Jys|C0BFx_=vJTNW=m)-)2z=Wpa;A)>iyi3~TCG1j2 zfS6{6J7|$m!T#}V2~y(K&76h*%rVQ*Bsz#qgvo1|b0PTLM&QP?b)TsTtE8m2h2d3T zjHmdckS@cGC;=y|*-u|8BF0yQBjm#TcnsIxg;ZX{@QJfB2xll`%EFeaMKT)08} zEHzHRD-}^j$)&SMl^(P6-7%R$TJ9)5(#MQFmbu3aXtU}!h<_~;zbwNmVd7CK*H>U| z%A^$z3SQ^Ct*EM;=n3&z<{gM9(vi<9UWPJYOW>IE7Ivb-DqXNLb_}e<6JaS$<<@Yc z%#Fd=H|EWn^%#f?Dg~Z#YV3HPcy3)I&t^>HUc$B&FU^OZJe<9AA3Qt~r%0qZdHQPH zKvA5ya5)C{^ivAg!kVz+I6QzmqZOLkGqNjAU%VE-^zS|wdphdk@V=cK*svUrKJ~tM z?C?c*m~rttW{y;>jOBlqcgx9_n%vS0kxi!r_iZhrOo z1oh$lyW`h?{x{--Kl)B|wO202)@+XtDcWXY2;DW+7k;u_hV#g|HnA-(u>ivXAg=H;VAY!lQ5Z@ z`^%(?c`_^KDo)Gz`72+EpDqL<(ko^Df!(O8$XNi?SmXr`r;t{`0ghJ9$Olyl8ItE9 z7*T@6Bjre8A@U69Hoa!-Qz@EN(N411Kc6p+$}40jMZX6=<J>?rWFVcN%nH+$fyLLfKHY>6MhNDD* z@jZKX!&mOaIjTeI@g_QF_u1ngQ;8GTQn@P>N0oTxnENguRb-?+!;GFv1{Ct(lFrs< zdQB`tH?tgI(t@EinTn9dzLsxLPvt{^R02)yQN&FxSj2X-`0=xXY4REGOyyUTlE~GX z4Nj-qLJ;wPG6(Lf=JRw<@?Iff0u47L|H1iq~ znv?*QJh!uf_$%k*mb2g*Vy`>+QOoi;KcB0M!PbBx#3}@A97+GXom^zhCQ9*1ZmL4O z5@ytlZ@#sqE?)TFbM#aFcs@@7TH=vt+@vcjW2+F5HFP4K!pfJLmV~H_*(9htFwbP{ ztW|5xS94Pn&qLco8Ij>i0nXLT$Q8yGj@fi!xIP)v0?cRwjw0d8eA41&LzAdk19X|| ztky-$e0*>%7VD`66z!DuI!xZ?}#$b0#yfHQwRkSSBOCjTT zX5|6SmMiCFR z-nkU!4F^n5fnq%sAU@J+Vi9*0HIu>$;i=cfv86Ao5yU_D%qB6_(7_y~bL%jn8lMe~ z8uswS9F?R+atTymwKRmEb4}Qzv^alr9gG#)kfjpbagAD^YcMbs7XNcSY#v^sme@DY zO4(XFSE>RlFmr)dElP-(trN7 z`1n8hSFy8uGN!<u1w2z{Cg1r?bfNBOB#1Lyj_?jp7BA_F}t_{9qBW$@d?Xx zD^r+w;!%BlckE27nnWJRXAPX(e{f$s_w{cQR`5l#(Qki=^LjZK``-NsHaa^2e-%dY zF0C_gBE5PJPlBAEi*MVWyluJ=&I%u0=yiQ991=ek@z_r0>@j$Y%x^h5r#fPtxcn4- zvYSx+E4%vR=64v^%v6m29M4emRV2Sif5jPjRL&PT$ltSkQo4f{h2OTKP>pxy+L_~Ves(hk=xTO#dM5U@ zRYm8}&Y0mCMZ;Gb6B;8`D(a=glNm#v;g5#Q*6kv;sz*zqE>$Tsi#!kj4$$Qxp4#PI z@;j4clMaF79r8z9i=%GW_E+Jxw54Yzp7Py1mU1dz(7H#b%9CB6ywBLOGzk&J7%}$A z`7?aCh5`!zBneMLtOMo7Q?M52&oTu?YcY3ePjt!WvPZt0*S3K6yW+jn?VhWs7rc6o zu;e>@vK-tYxUm2iz&B~b!Q7dGu}PTuCkxQUTrdSS7?7Rs zY&|GqIZj$TY5_^mcyuIahT4Rgtf1j(c`2Ceo2zV8u<4GdL+fazZCQOghjCLB-%jCv z^Ia>oo%%_I>=K%>8O1UyU9-kZX3;2?u(oQ^=Iuvn;!?T>a8GCv%uvH-iH=D|GFzKE zNSwL=WT3MgC~axT{ltFT+B>6-y1QgTZUUK|UMnNj+EGxbO}e4EpR6qflbFWKq@3G~ znJpFhTg|)>SbzY8szK1Zp(44rD6kZIy6)8a8=IRcbnhVkGZz=GP7r@?$yE1jpNImY zi@yehGOp}StmCpXepm}*mKjL!Zk6sF1&%Rh1+UqC-e;0RdJfndl^!$mjD;OLt`(2a zfl)hdGBAjt8m20oGd?E=VbQvq-D$58KScCo-8@@nm-|Az+4bp~WHSmOkhcSS#t=R! zU?Grv7FYB16soR4T+#w}IaK^b#=5+zTPEvZ$3Wg8~Ve2eV*(Dv$MO`ty|0 z{Pe&7PCVAVBmU>V`xs1%E?O{bVYUGcd3+(ms*!-_?n{B^;w?Llz=2`0NS|TWsipZ$ zB)3SfQfUoBgezr+_P(`Sm)@Z>qq8*ozsSWApZbXp&|b2ELp*L0?pcZ@^uMw?k`+1s zboT&?CZ3*SxKa-t*dJf`+^@!O{Ig$;{`+>5aD`&EKF5LcEO=#(&R$h?20~@QbsBvQ zcn|PM(GhC=n&-Q^w<@%78{DrlICrFqENO$0sZ*Qvof&llr5cH$G?N&m*r&G4Pa`W?G5AH(+^fxm4=H!Vob2EX{`8*$)~hYIVH zG1pcXVs?&(EcN%q7DA5nPj&?_1!Xvw&z>bAsyCVl#Vq4)ZG;cz3#61cIS<>D=Dc_> zZ6mH;yu3>3Fx-8|lC}@oI?CbBuPyOOQ!CTfEZ@>0(^zYh(BEKH5e*e{Y z;IXG@gSiN=nuV{d#-%sT@aVg3(u!I9t$z>nw~%$b6MRNkqWmUrg_o!0jLg_hEX}#H zZfQ?`V~=ho#!mU3A%!V_OOs3!n6h_(TX(U%G^+&I19`nY45WXR4wKJ>$)zjTShKG0 z+wuI1Z>NE@wlt56m{ym-RQhm_{gGGeRm^+?k;lE{djTY!Bt1JnnFsWniVNSmKk`&# z@fBF&7043HmijpU^7hs!xXL`);k-=i(#gu;#n6nO@VA@gxIWciiE#N>@m{M$Ekhx@ zY?l%UL5Ave3LF`Li8vNaS95I}+G!bDN7ujz6I+YR@1Dx;ID2;uQ76{IhMTD11DaDX z0iT$qV~~fPFQVmHm!(B`eR7PyX;eXv(i&W_(wK8FU@tRT!_9E#jvBJrYG!LYHy93^ zU<|;G+mHdVsB9z;)9vr=j8mu15}QL1dX1aOoJ|+6psXmhvSj2;j|~v`#)5SHG9X3s zW|0az(1f_P)}fY~THp3_L?~D|!URI|9k5bZxX~7lPmE8}yrDAgyLUJ7vKibKGcm;J zL?T|sN+1loDQPt-OaXSn*;8j6+nP8%2O@o{@}&xtF;aIah9EKJJ@HGi`<+qEjxr*9Rt ztlhm`49}j@*H~pHaVWKM$B-e?6rL-5n5V8i1I`L?kc{;z9Ejm_ZMsXvCmEcHd1PSQgF52~ z%-eM)Ojx59%^igL+jL{{^)LS6{}A`k#O3svGgxLtxI?(>-WG>-={6&rpL%p(ym4wg z_LJ1~iC_3geC;cL7R_ycCvK9=b!&Dt_B{1ejGn&|w`uIr14C!xarXGxn7lF?2ksex z=9oVFu!d!?Rbs4i)!om?89mg+>GFJkZ7R#^TncSpp2jDTS?{i>Jwip%p;K zzs!rz4aEs_aZNrbPb_joloS{q2&{&lfw*w&&G_xl|7i^G9*OD|GR-kM&Rrq#Yd6LX ztfgvmA({tA;zvIHQ*rLpskn9ZXbkKeCd0NW9(wXol%3AFcKRe`Ijzw;K+P`rmoJ`S zgO~KI00Z$`rDDq@Q3VmWp^{rD>KG&Jfx@d6oOXgL8=moteV*ra|AU`-f0Tam!MJ{D zf@3VF<8V(Ihc0wSTQ@xnx_eN_X1Iq2LpK-MBX}@PWG2RF_Ct=1`2@>^O5S+mc>M8~ z|1|cKgOfrI$jDda0m>em@1$o6Sfy8s{VHPm!p~U&J7^~N9wkEFsq!En$&enrClw=T zN2S>Imcl%hcCM43d4D~)n>fz+jV-%CHg*hI(%illH_7B)W!+{l`_iK%&biyhdllMg zO-sAVJN8+xsGF~%m@ag#h4OtGpHnI|I~UCuNfXluWA1CfBU+9(iZUb?s*q8b0DRR8 zNRiu(2TBAWp9Bp<&|SQde*J<$n!T$ZyaG!?q^+qYra^1OH5fw&h0>5!SdK-luHA^*(>hFz4}z2!1XLxOqC}xpB_S%HhWfkN3*6PLE&KV( z3;~!8wPnO6Ou4~@)eBOv7+obYHpfrlq(;YcDuJm?-&i5r$UZO@1mO5-O^Zyt6gsIK zFs~Zs?noObB*~Pq?2DublpyABS1S>@8m20o{LymM zYEvuZ%Ob&nL=zP*Pj6|&qByjFD9&HF3|zok@IfJ(9t`%^@`G98btYEqVEw{QScosW zSN&UpP6Px|ji<_x?ojjUXC=UnX{2_|1QJFHAz@?kOyVA}QUiB4wUA|S{%k8f5_T$9 zz}^N1?s1m3cn#M(K4_KKxUPJOFnlO+`do=HU2n`?7ho!nT;M!(mFqPSpM+UzxZcaP z;s{GD1S4;RrHoBjh)WW$34gkv$rUBWGZQ5oo#tv(DijcAjXMX|xCT>qP9_EFX~_~6 zo~dHty2KL&g8L@^XPq;1m|vDzRmA&;P&l{hh~07s1vAhh5bt;h)B&TA>8eQG-Iq)x zVg9beXC+OsPQOn#D#=7k2zV`CW0Ooc?-v#-h{(YB!Z%-zpZ&x~I~|iWEIIh#1F<@O zJ?1e2ra63}38lRLGN<_vqctx=98#!mZc2O5EV#uY;0r2a3QyhA2uNV+?>Us389Ya~ z_?eu;r42pUtH4GG?_TD(zw}SAzPqoTD7u!?cmRo&0p>4Ax4I0C!EfRoNKAtMMI~LS zg>osB*?Hzv2n%t>D}bMHv%LL5(cMhXOZAIt6 za2$PXUz~XT?UF)ydE0D=Io}fILGyOM2&X=_P5E8Owhs zE}v&V+wdZCu#9+&(qB#}Mx)D+g&s5A-dgI?xAM$&mbgExIroEc>Pg(1#f7arkvFLj zTS{3d;>A7+!<+}-OEcTNUwD@Bo%7xR?s6X2bDNxmN$~RqV`-e&LjY(OS?#N z&-1cOMf9u%;Z22aYHTHSd?8NI3}SGgH|rG5;!U?Di0fejxf$H#0m*fl-CGW!%^~b1 zeB4&d*?Li9UINVb2}m~w;8+tWu(beXoOfVO5}BG)3MQ^uk-0P1M#?z4h_76^ej|F& zBDHqRD0W;M4amH;64Vl%moZCwlzLbbk~?rnOnr z;>yU#1!rkxAhtbL+8T- zlGyS+i^;GC-`#A=y+^BG>``>+`)Rg1JhmSd3dFB z3R+;|jGFr$YD_E1#!viVz3IYqe&CpJG6tOV!a8dSp~z^q5X@RJSxyGth~KF&`Eb_k z%llN=wm;W3ttBX)>9KO{g-ahr7`LY}WG#BHQSnk}8;5Qt(MaXgS6^3symRb0wW_bj zfkXFaj)jU#9$!eeDCaAzYfZ}HkG}3kXlXJgCMgr4R`bk-(b)UgQ}JO+Szi6lb8+RB zmpPQ4azDy!hIb9Y2S$_sw3FWNVSI2%JAz7j-FBId6MH{*or5x7J%0BY{=)s9MMu8>L;s0kEUHrAxD(6LT$ZOF z+zCl4WaL-yZg4eAvY=fPs#1yOK50qspk5=_1axzrGVJ78d~66yK7H-NO-{j@0+$&X z9y*IBV_>K+`uYdcd2;6D>DYZ>Uv#wAqxe{AhBZu>V&lYgbochgBxmMUgNJ|b(?1;l z@i+g3EcuRTX(TQWehEkUfiRQi{X6*^cpxq+uEgmzlKBL8dNqKjcqWeAL6JXr+EL9K4u{OR5xTfGuUN4@h ze2D|P?16*#7l>a7TW~}E;tCkpD^mg3Litpgx17pQVJ3C4s`Bw06Fj7aEXakZ!=2U2 z1MBNK)(j?JLA*tcR^e2JOSQpML10946g?|&eTLRy75Ayt&64aRLZus+XX~1=J~Ay+ zn1Kx?*3mv@Z%w89w63)?nO|ikyR?Wu5G1gwV9vS>T>L7+RV0%{Bn;0>O|29JTEewggECNwYpPx=ov}sI zI)rvP#O3$8r)qI6d(w>ME!L;$ZrH@S%hY|oSBQzwc5^X(UICx=zC7RfLt2NxNyIW! zTLCVDSt`Lt{1gHgYE8t-4P^ehV{CFzbh=R}vH2=M2)!LxxY;WidNy%mo$>%(>Be8z zNLFzjYcOs1(#8VfhzO@4W}Ib?W(ldm@tIm>3pg;?*BztRF63IJhHUq!(gNIcXO|Ph zu*9nx?}9H8N+<(auJs*1JSaUMz+__$q3Hd5w#pu&60v@n0*oi`;$Q!k;Q$K{Ah2^+ zx&(Q?u4>`r{1jR;WpTlV=G8QQaSVl{#Hr<&!UZ_1EV(x0`v9#V8m5*Be>__kQ6@s= zzG(qS$WFZw_-sQGrR3w>eXeVB)=6*>Y=#biol2GXy{xMggTIAR3v0^u=xyiw)3=hygo6V9wyO z-l%v9J99WziHBYzOLhZ(RzWY~12nG~dFZ~lcxfv3KlWg}LkF(1kG(hQ2R<7|UwAdf z7dB&tIQzuh8ix-Yi6>Cm%|ySX>uJ zS%7o(nsm8>mm*yXVdlSzH^T%;u)=N1dsT=$I6ki{qe+A`fOo+?OS%F#6a-dml)?vR zImG4q_*G(y2xD;Bn4@%&tv5-6@};6_UWoXo!Y8tjQ_swdi7J7`&X4gLdfWL*=;6!T4L@QytG^m~Zu--sLF zO;=AJ$zr$S$euP@diJ2SuB05%I#lU1LDz;Z&co15TCvPoJaj%HdU})Y@{B^cgg;|A zz4F${`0P)9JbvTf3{u7gj#18c<@_0{5E`kSz8a$!Pe)CAFG}FmcoSPbforCajbvDeR?1V5IUa570B?yi{~Firn*@BWp_B059_$-#K4% zNz6y`&>Qi*{Qi9-Xso!7D~Ve-u&6t{@SsgE3&rOw{^b?_rtsz;$7NvqvWy1rpp)>YScP8h|ZV(&exf1dUf?Msk8id_7&=#jpquelG z2|-trmR4$txbYfD5W6*bBbxZF(vt)Wk#qZ9Vqve?*KH=0!olx=OO?nC!YLr^EuHQr zECC^=Kom*cUmK1T%naP3KGpb*IG0*67n^h>gV5Tw>4@=p@l+}he`Ut*Gt19?Fpjr@ zAY$kwWS?RGX^BBBR4K@WFuw=J-kY&f_AVJG1G#s`s3bNI5ZAgXwC93>Iv;2j^g&xN*wF4Zml8T3L$xLbx-3;HHwc zX5l8^C5-sq(1#Y2%)qf_q`uOn&z_4`se}k!)|O{F^I;=Or!}IB^zB`uvB?-2nG3k~ zjk#ruN&xEKzJ2OS{K@mjIXdluIMUxn4e-^px@~7!M|q#_b8);l3KQDPXW)v*GTOrZ zICf)}y7uPyv;X=V(O9JyfVHeaw~N!!H9X82vMnSLwZ_z?OSCeaBLQXs&lblpq96+M zTr7y2HQR|-z=mg-5uKT-%vVdocA!an;C{W#4L-EcNDP=UJttRYf9ai5(ckenC1N#k z^W+=RRmNGiw{8IE*?4?kb2Rn!6Z@Ntnzn&B@!0OT^5J`;x|8f;_V(1d>$rB;;`cuP zT&%#%hYpOej>1S#fI+;8EAEXj@IMtRtzZ9^_~efgihs)cl1K0n3jxQ$Cur7}pUZ!_ z;x4Z;i~}y9RF~P&3fx2WhkpnStMR z@IcCmTIMl+mF7OQi@gKCX~80Y>3io;-e!nTcM_v7k57E^gYlVv`G3aKj~oJb^>!Bh z0fc5HUGWrdPC_q@iluXx{^Ym5HsMW~XThZ9V+ZTy* zjKh0|lb;%{tAGy*C*fJdmVul939!3AChR(2m8HZ1=`$5E3?pbpoY2@%29%d`knsEz zo7dkBGRo|b%pkbOn;A39_$2@^_UjX@UGzqUl5Q-Smke`*4L3=|dOl5ftuie%5p)H& zvI!@~Im^(LZE`K6G&#v8^IAB=xS&m}Si(;ZhQi=UP~qO(2;z+CasV++pwUtgky6Wt z2^*8mdBFse0AwI&&_#I({YtUojf*O%v-YwAA#m3+)*awpYh7yrdTP-NuN>v1qUCtc z;}6Bi$Ph3=Gv$7ng58)TIIV|727sxHIE4#D=e%rZX7?Y03%NP@8Sj`nmL3d4AOM-@Hn82m*O~%iBy+(^2aY_Jb-&$|6Hp$E9^K(SI&Re&TmGB<^a#N+tFKxV1dr-howjd7pzbl&2Ud#s=pzjQH6 zSR%Dy3>kxiC}h*p;9A|)TGX!1GlYfZ2G29w)oT@S#pzQ35oXB4`CQ?fUo&3@=U$e_ zn1uq9E`I0jgSo|VbUANgQ5jaq_$shBw&uMGEgneO!z>LQNEp0%Gd}%^ALkrdlse(W zoE*~{cxgcwy0oK!%OoxYayg8WWo5k5IV;>1Y|C^vvvsK72^UZfMkVe*gN#?jH7q5S zVCUhnky-=7T&9T%O^Z{;kQw84)q`R@|K{{!#tMgNnBPEc?DF`VBrO)T)+%tWT?TRf z#taPd-gxxhk(juCHN7m>!V5pwoOH$9Tw|8}K~veJ2AakM@uIZ2&7@z%vV8FyuaXT) zGA5b#t?jhrLlImc1G<#`?mF;5oEd*LwqS^|G+`sXncT*^Vl1o&*C0H2eDV-|s1$YW2$4Kjp#1_sHgz+P;)$PpA09B2Dro7)o;d=HBYycG{doNDAAU3b-RFKc9>4FNSSHtn zT}wPtvD7;vuB76|d)IGhuTXqY9Kjoft+bj-6Z<0W-bO(z@C3dleJ~au!v_l?EPs`+ zr56JpXuHqkp}Z9z#B!(M&1yHG6`4azKgMv-Gk_H8bS<|<* z=V!j&~*&pBh?z8cq{_nE*rO*5%@FA=N4$WV`6q{r>w>6eUR|7OyLe@TR z^qoEZabM@2s6ZJ-tdiVzKIUhpqIdVcI8Vm^cmLwK7}&it&Y!;=&;7+Ku?{{}>w#h- zJ~I=G2|qd$Wgxr5Ucg(p0ArW+Xu!e~`CC5Y`&j65(^s{=V~{4^XVb#69LN|5Pr_ru6w66k!R2SNBbzV05a71tpltg=24Jhdb@2;eG&&FFOQ-lLEN z&p=9!4`fbblPknqw8kVJn3AzC#sqXJ97Wd5Bt&DCz}Ha});IB1aIpI_j6@HC7PI@c z*hnzEWn9 zzoj(H37(wvl0`9 zc#cde1vHON{O3BRh$n?-!5C$rCakD9fXbZVJa45aIW{#E)1c`$^#Kp}lzmK(29_cW zScVBtXO9?;F>JP?fV4K<#2AH(IHh7#NphSUtb1{p`d-hqHDS*+tw8LS-&ki~O*_m| zn41dc)hiqc2mK8ld7R{&VH8cCzc3q9Sg$DX&_N09@%SF*vV~Wos;e_v`bP*oOh*4m zXMtb9$2O;J;Qe4%0|_(ZF)=ZXCDRJcfIsjEYmOWEajy-xNT=JSYTK|g>s_$PCv-)( zw0o?c(Xo=aF-pG38kxQ%T$!Bm{BM0Xo_TPX9E^58S8)|aj;W_cno|*i0RxW;g6ZOd z-Vbq4<%&P^Gc8GzC)2A3{F-3A?turUFHhhNBbiY9vYQTYwKS<1_^1CSW6&?Yc#Qt; z!yGvXPE$@+b>R~F^Hv-uM%=>z1U(#F(%rv{x_Nh*N9v|vmd?XHGpqzg74+ny{g9V* zoTV?oO{>!~6lo(fb-5%xHmn2Gh*i9M<#rWBfysUejFAaI{LaKiU}qIbsdcvEB5*Op zJFmVTYZa{#fBv^!_Pcrp;=uhwcpd06#hwiHH^<<965jBh zU72QodHxUm=u`2#pZl$7IoO(B#8j^3T`Jb@D|2&R@(!PwXA3wVX%nI?=v;h2Gv)Qe zPdyUPy?Ha<`{udWx3e=tF-_#~7^|Pg6Hr+>8pHivSiINbTVMG?>_h2mYipvp2`x#R zt5Cj3`rVku+p{AM|Lg~&jIiYV-0s*5t^7~_+y4=d9N1g%FyLS|4tX(maKXKu41?R-rH~ zm<11W1G(1NtxP^kD;R^jlgX*6xv7rnPG+Vj3`Qc933`a}6!BmC8(YV#cA!?PCNA`~ zGPm7|)~4A$aSlXXvIGOdcR4biIkYt`r7{rQwN!xAx;E50tICTujS4_5CatlTl#S_1cKEC_SfCZS~$0~rFq_W6z}u>cVi4&A~$ zoBztt_R|7nm@0@%q)tHqOcH?rjO%3*%-`=VuVGG%>-X5&=|Q-|y{p8UE?ymrPTFLe z4u2ci)TIU|G$mGeS`Nj`k zt$dE$M{%f%qr~BS=`bDaW^T33sSFhssaBp!9e@X~T$9Nc$>>06uW`wp* z1oN{$#0+%X|!PC-A+&z=A(CRI9 zsHuhV!uYCaF5nTBGUBpky09^aEi7jb3NV}V^wG1?f9PPeAG#;L{m0)yG3$;44?mpn zoGb5-x8ArITXT0}R}-EP=&xaT9|GHE3AMNdYhtkc-MISl^RaUCR6O|f(>xPpf~Tmx zGuwoL&E`$$smA4IZiNbhWf|_h?%xJ_i(C4WS+l@SrCD!=b5;2ihT^p$j1odvHsMhj zw>DX8J&((zk%G+>PF@|2iHmeEdggv;y-+^Yij1W>r%e=?q$lxK0RmhBDvz*K1`LF; zB`vvM$(T*TgT@g?wJjV7K=$)1&*MI&&i4MtA7*|S7FdUEZJee0OUcjBF}bHAOt@BLn- z!MVw+JPxsy$_+zVD#GH0IN{aR^)2!CnH}-QiR0WQKM=S7_RG|(K~5!Fx;7py!!6uH zf+z~(4)Sw=D8HM5AK@dO<37n>-4|bpyZl`kG6k;|*A>Qmo4BecK_kLz*Kle3eJY15w`v^o0+$Fl`;GKql`i~YYVsHE8loMe&N$k z)8P=xEF%X1g>nBq&;T6}-KG2RhFrZgKugl+Iacusg805Tc>fVXCrdH*^3hDb+PixQ zW2`g!sb+ZiU{Bn?_h3vd-r^WpjW{SBp)0OB8NlSk@+bKQ^JZ#ku%!&*Z}-Aaf-$N};fdo4Sl9=p7c5U%t%3ZlkeUe`^8~LLMY{C23)aNIci0r~KRa z=w^A5oF$=GaDcY%Ph*2N+;FkFjx)FqV^A9uvDB=#5M+W&3qnSn0tM?=;V^dNCcSE# zul3qWW7=8QAdIv`i)ZSh#sWnUFcG{4x*tjLze`Lt#89JOr)h)i)2tHO2E(KMogSezNL&d+D4SaiV5 zv;yaFuiI$k)Y>s42dmsh%*gNl#oJg_}46Yl-ef7l2=s0q3JpPG~#5bsu?QZkX^~E^*?$v1T?PZNr zLjVWMRkp~(=<1*Y6LcsY$=tNywdTw^PyB`fY1K)msjv%YUM4-t0}P`eBNOix3>mLv zzXY|gHFu(%XW2ymAj$;811p38G+C60u&*jz{3q{8;me*T|G`_}bBqt`O%nlxqkCtJ z-DeoyS{WasIsZ>b2eHQ!FMT%}=o!3g_Xx1}_&dUHv=8m=@1-u2c7bnialY{+RUMVl z+t)>BIg-SnrEz$|UDH3L%U*TVJ%+%tCyk)L7?Gr{Pj2D zwbxEY*F*QmQR0-VC=3OqsP1wg0%sN9ym>2bazalxe-GccH}|Q6@=#{VT#9)MNB2j( zkU#6~V7Bl`5^kLndn|90zo!Mqdkqdx$kRHtBnKepcdkJ?EUGVr0W=_vF!rwdcEvue zQy%W#``lF&yW5mNzWwcI;~M2}hxYB_e#S(gad!$<8|0YW>tG65J%-M=@P5b{zz7nA z_12omsuxr%-t(#luyDWo>|62EfBz?9KeRA@;Ve8A&l;^g%aA|HjW)bk%^b)2u}^YZ z(oLE$fhU{DtC3y9a=dplZ8D&# zF2j})RM(K)LySo6$+I)nfC}rExiF@LnY+oevm}E}&LBNRn#n5=q47~&%o2f!;61up ze2ySlXOl9~fX~$Atr;z09JMxqQ;Sx)gcaUNInt#oH)#8}PF>-AwBkCcML9?dDRD#Q zUI5uSriSAj5k$g9H@%*NiV9n_@l23gM3?dN$Xve&saqKF$h=G(1HQmzi#2GmWf=+X z*x5-Kz+O&qdF*jcOXB1tGN6y0z8HJ4P?i?wfDslJh;9oz-S!H6l@05un>k^{{W3=H zyo}k(s2V{)kL9w_Kr3#T9>Nf}CT_AnHaVHjct>$PF>+#WmXr;4)kgdK?n?sHHJ%7{ z*TrTG)og3$?8{S?WZq`r=2^ACL&c;Bb6^2LJkQ|no|=6C4-5y1gVZ-+#93;<9Noj4 zlk=3ZOvk%;BQWT)4IuhYwD-5tu)z7FNZ`U$sn8WJwaT0m!S5n@GJQ9f`-Qi0Xb+ip z^6nY`^INZv|H&;)>R=zefHg6Uw-)=$9~p9Cqg7OSl$b|2m!>$h&COK|MOiD-BqeQjCqGK}~Z#{u>o z8bMJl!@EP>I81a20n@-_KJwuQaRZYvi~HA%^2^t+lVi|{cK{_2g`trXTRd;tY6C5P zU7#x1GQqT988d4v!6_9|SxVtTEHr&-S7k}TBNG+YHNeC8zM1-dwgX0Jcd7H2r^t}r z2e?&qw4k+e6|@Kk;G@?@uT~~vLTh>?v?z^~UqoH!SM^8b7(9{%BH2qg^Boa0=)`pO&B3PXqBmZzafC)u=xISO0ntraKD zO6&5`$Q}8HOvo5z>eX**4v|@5+KgrkLajynusl^(vHd zLwX%pz8!?JCZ}-sg9q|taY)6+SBCGHgM3Urod5@E#2?|Tz{_|wgZsY7LC^}(N2k?17TfPkfvjF}|q~*Jm)@pC*_5mPnmc{G}sLYUab3mjNj@;_NGCD00 z1)v+20*Q&q&}Ya-?8b^qzc+f0%v<7NJ1GGoVFEWaaxv;Gpaz6)asrvT7|V4tq*ymY z!qZ*hMpRbj>J#a0j3B~WL|ALB_*?rA#X0T8_=%$#4`F2vD;b%_uM5T#iqE^nLOBfAHVX=IY}w{^}i)m*zOf zazBX|q|^g{kF68e6}ZBo6Kivsq!wLy5`0Z%6E60mm|Z4)?!x8V(;YCG^K>PeW1n;Y zaX^m0>*mpcoD8GIZoE%iQ;8`-uvk)an{~=Sv)l;W@R_<7$8Sz&OHAW~#<;Y4D@{5A zF~uEUc7)OGW=*-?j(Xgp6)=0nE$MNWU4#&XoFbAA8MCY^R3TwGUH54duR*zf8>z|IRkeVSdYcYH(#gh1_1~Tr>X(| zXZu6eZNCIC3H=DSEOb4VB98FY0KIJPwkDxUG*`;DO|hWyEp#MlfM+lj=f8~dpJJz zqff*y|J&Q~($}Ajy1h*(v*hIf8~g05oLJ^n0gN(i2mGv0b-&DuQFx|@2lsIbT=q_S zP+?$qlSX$C%82`mP>B5mznD+%D*rg1ih<8ce1cEtee`cVvc6fN>YxF<9zAm^e&sta@MK!!eBrzN z-hLG|)Ex-eo44>BY>r23O;wwl%k=#|h}BLT(9tV+2n-de zJfd_a9v8T(9PuSjC`S&+gDj(R?#e6`O1?qy=6QHXg`vuWISiZ!>>@lyOvc0l`BAWn z?8Xv&FY?Re{9f(SdlW_zm!B&jc{VSg#*bRER+$27jG}n6X|oUQAo50f$I z*7ACVpPQ**a3Yzg1rny4kwa};7V#E*6LYcViskcD_Pb2M{T0U(Uc&R#;WED?vU zCyQLG!qYt@6!Sfdy?4`#^-*dVr*NCJwKb-TY?8A!=SiTef$?{DcIBKlS#J%n*GjW9 zkXB41b(VS`=I2+bx#mc$8wg7Z(oNd9NP`4pd20JIUj72002M$Nklftq|K1p)WN`7NS1=tbXa~77)^U%T zr!dW8T8D@Det%p!b0Mb3ZbauWNprYO?F}p}8W3=kqc@@fMR=o%Dg_eQs_0g?%z@|F7tHfPA22~QbS>ga z;tkh&56il1^_k6oo6dcWRAF?+>9^k|2Y|3#?+{*&=i;%a9?cL`2QHv?_{?QmcdpHm z=}b@UeUwcNl1z5?_|d%Q!ABpCE4Afu>DUYL$kQK;!-K7{{^&vKv0Jm|R`;6rq7vUKb(5`}0Aq?P{XQ2Y=#kA~GJTm+M7ml;Dtw+CU2$zLmDzX5YHz@68mn|O`%+a58P8I3Wgal zV89;@154I?sod+O5f3zi^tM)_$iAt_M!MTolyXmZQB!2HVf1m!)=i=~z-8>$I!9uG-Lz79=l437XE4WROmocf48QW6G7ED0P z*aQ`_xY2-h)rx?n2%HTQR2Wq^_#Clq-8kjUYYppK?MZ8`78rR*!xSBTrp{lCiuL*E z>mli8=V7vwTjHzVd?7j-OlGN#DBr?4h;eY#V)axc?N2C2|+u6*SGNieB+@?MKgW-9{f zfyt&MD2?tHk6|v$@$LfIlX#e$g(-7U3>(IAO^z*-t095IIQ=vN;?+0CsEvFv9{9k= z{|9;G&F!f8_NeYSdxt>OhRJOjQ0}UwpeHVv_tIRI8LqL3ifG=Q=cX{ zVyzrJ9wx?W;{`WM*SvVBGHf#)>A(aqg?Ls)Knup=4O>lNop+)*R>^bFH2FC9PTVvu zn6!>i)_Rr?Y+Ju7*onK+ANwG_r_lfpFyv9K0*aSKmv2?oIz5YNG&9nZxGCRqPWCBK z;B0Ly#0!7+b;@Sy<6GaQ$Mzq5owfh%*H911I7fDa=PNPX*@&{ie1KIZsUqY>Hu*z( zMu1x?5FnOIO?wkp!KEj@%XP$mdbUB5maJ;bxk zgm&FlO2~6mj9EhFwJ5kWcC={4bN6W#V`G&$inq4BT}8=UXMe6-9-}O>Gk*5({dn|| zSKwhCHzsbyrCV!p@iZ>m#i@Af^o<_?k7FuvC&U2Go~|Kqj5*X}42WpLKz?bXA^8je zL|~&5Rq${JF~(~$qDsDdm9)+LRd_r!MP4c{sJ!JmlDVVsKy#}rx8RG`HJjaC7;BEd z!Fv^C?-8Fm=x1GcKuh8Y%FFat%71JdtXJnY@DUH~A1)r|sZorRJI?bpO61{I<@miT z@w420#uow1?O?#93l$ijt9KJ`C=-HEK*L1fYTCP5t7yMr_*OpH$#{7wZdM^+wZdVV0N-&HSZP@bFgJ+#7~iUg;Y+x>05Q3eXiUfw081;n1F+Qj z+cF7zLpLCdEp2gaJ(x60SI6^vE==SwNx?%Wi~(4dQO3zHKHu?FVpb?UNx&z(AxW+m zNz$|6oXC!~dB`&ETm_6uhKhmRW@OZ!^wdPTl-8;YO!w&|1gKVL(%K+(jP-N^J9lxE zL(yN0!C{bEB9WRwROg_7(_X*|j*L|xfbHj7LZVuI9o`7`#Sp?egr#PgB+0cqnmjd$ z#u4nF7JDVa&aPma>v!GO%ufYHrAQ*(0xx8K)xfQZIF(k)ojYyGWQBqCtvvU&J!U*lO2p~qsGnQ@4%J{g9%w`(12!P87npP~iD$eg*gyHy-FpM{+ zHVXH4%`6C%i>PNX1P)OuUz1L0vW(f>Cfv$owsyyD#ZtR zdX`Y$E^>VtZ6Dj&vlj9gYMWa*uCAsyAOdEig?#qq*YGM-au(`Htl0^TMR@4Qz=I!- zm%sR2w9;(DI)2^e#_JYH)EdK@&R8H>v5jpV8ADBF1UQTgcgF*Cml~yJ{{Q>xcjM3h z;Qx(Je(Zg;7^Jj`+yfPBOaG+Ziqd7Q9EBl}fH#TrW?zq!JT@{s=r$$Obg$hxtzT(M zg*g>m_tCvzzh!OirF@2qa_@^%a8$TV%=5c~SsT8wRp2^8i!Kb{uJi`;WV{j-0WB$? zJ#b(T+g?IFY4IHl3S2LgIFJFl+K6}Fd?$~UlYXQDl|K_~vRRFPf%EAVE2?nBA-8ik=JaoG)O?$#1XpPd*jeZ}#s;LxQ@SF^!J%RnCIU85$Q@w#!Zvd4O%m|m_!nyF?z@@hcJ z^@Z}{I^|W;pNgwq%;a4_CJ(;nx|KnMIU4mxe&oH;TnX(F8?SA+H#&FkkMozt<3Ie` z=i*oY_s_%xIS5zJyi0WeIRqX3apvshc;SVY*!T_}com5M?bq(EI&eka0bHTK6pq4? z-4+K-(kaJNrce@Q?wNTrqKdpFD-tM2l!lcThAp%}Z{umI!d;#%j`J=a4?P>F->?Rq zO)z{RZ1TuU##Cum(e^2f!am&0$Cav z+{?`xNQNfUtzSo7rxVTt$nUy*%xeAriFyz4zR&xx^GgE6AT|hafgr)XrzlFY7A4b? z9XlSe<0NgGX7ovu+%@UbB-dQqJm-#FFS%aZ^zx*a)Z=jyr-`jNw!CD?+A^)lA#Q>L z05OP3fB*=PAb|UPzCR-QQxN|6kKgZozk9z5KLxRiDGnfz;P8SVK8Gmy+YqjsRQZWS z?w?9q4?reWIZ9%{hoBt5(86^E`6xWU`BWOT(~wsh#k%Yxm)3|7Gh{76r)5jrU60Ja z%K)Bhk|FGI6C5^-8%os>kdQr#Q!ibMItPNVK8Lcq77Y$V-!gYK*L3|}%V7XHI3K37 zs&0_;OV@7L5Rd-C&&R8;yb_JI9|0*So9YTYd=&|TgbnNY33T_apfH4-3I#>tIvodD zN~qcOiS(sZ!73D{LB7hlf;J+(1aY9JD~6}gmc#T#SKKSsC?jN8LveuNl(Uz5;_H9> z3^}CQ_zA`Xns0T6tVg7&EF>9WZ%8{UR3%>5#(JFevJ}OplJ+okCuG@*AY|m!v4x0-?Q0rF3IRizwRk5MjoH91!F!sJ4{1^_TtVS= z^+57PURSu7XSs_~U4${?jk0ftMY4t0IBP_(&H-O@Uc!IT zqDmC(`FQd84`cl%qBjpc6su`f>bX43$$w)p*4Y)6jA$%j?G(k*w>%sp6yKF$%*{dv zPCwJyx23MWVL3Cl@5b@dmtzsQn;D&ny2aD6i&RQ2bsDBprZ5c8Twb!ytdQ>qZ;nkZhrdUlp)Y*3RsIr^NHEo1U;(Q#IMTFhes)@NaeZYXYlB#)CI>t!&0CXvchnt$`ND= zD~yZcxKZwD$^bkn59GaK4mPqtIl)WPjHF;;V-v@OPFYg{J-U|kZY2}xCjVb3Y$-{8 zR~5Soej-M$ zp3IJs4?MUJ$K_76)iuPg|1Teltr%ue(iX$LtElZkK36bZ54c_W@dM<%8FNf^c}MSP zoH}-%>(cr|e)`3CyJ8OqI*3zmB;JxEfn&kn8UqgA;r)C_^9g)DFQ1b(ovX#zz@m~q|Q3-o3Ws5YGh77-x zT<)#Uk9#lc6SAF-_YFHs*L;KDM0dDHsS}{+2+kJ-_$_j9TB!<6y&Sz?1)=B7YH?Tq zmCA%WsG!}Lo3>a+>qW%LB;20`ApE&W5hBnFrASG)8>Ug{>uE~Z{;dGrxocN^?F)Yy zt^fOPWMya;>u@dM>b(p>C?vf0ZJ1dLI~i5ZH54r{@|Ge(;VF<*Nrp^|u&38ZB>*7i zVQ|CGhNm+G!Poq}IXiec`|Nge63BDsj-?0MNX|^aTZp9Mo}_Zykb}8$;>+w?i>)vO za`Yl=Xfo$URjCGm0(oSF5qX4@K@Dry3nSDD=DIkxYn(mRRM$cDQyDs5jOVHquJBmK z+}zcxnHDx*8!x>5rTFP5wxYPXKRIdhGAc;DO1&4?=tQ$|6rN%E?B5e+{C$_B%@pKN zSrSGi`G19$9?v9}uhqwmcwN$wQG$zS> zu-u@SNJ_}40XTFW<{)K089|}J)1(<`QaUl5rnf;x3*zUy_ttONPU9rKT$E8!Foyt0 z`jug{s9{|0XFn@!l=Q1IpM~yL5K;SIf9l6DFd6Ae)%wUJIsI`WA{c`6a}-D6Y4;A! z#Q7_?Vt8h89ND!7BZkUcV7m42jwnUp{p8R7RGfPIjVQ-+-A(UlU&p2BKhYlZ<<)T$ zW%v5Gzr{d^^)T8@w5;D4%j;{Yq8^QFS2{A(zj^WwWFxIh19-PhWz-u0zkXoW%1*_*up`2Hw35eWo{#U~oMOQB?%43o-*kj?Z(I^o$UBxeg$ifc>CKxrMLq97uxxp}@X~4aOvn|3QP{|z!q;&9+?AHF) zwm@q=gvWI>#&4d3UK--y?$xxsQAD_+G7f!kM?45!3?TPbGV1YK?{NIiFa2)R@7@ZD zdoVKM8M#8C!Z%JW$Fn^*(kNQfns3qmdnrZheH zyh7H&9a*Tug(Vh8*6G1&*}yg2udt%iiv~j?P(#45uK*o(Mk>nRJ^OvHZ`jvx#&TLc zXyJ^buf7)5#O^=*^y7GhtF`p$(lH9g2E?(W}of^eQ#rw zv5%lI`pK1ya9Fqk-PzPCLQhyx0UQ1>s^Fe$$pM+Wkm-b58I^SsfQVhk=(mR+xG(;X zKm00ve~gagzK%%KYAq+ko0E31%mz`MX@vui6jCTyz27uoc+GtaD=S+SMt;`Nm<3=y zml@M?Oq!sy-=X#>9APM&HPFOGPRP;t!dSb3M0QHOM*^_rF`-&FA% zvR2sn!`IR~%_lsU#wPLZOgU)Tdvs-98)IjZf`{+E^e(vYBqZpSN>UA;!oWi~vqn97 zjR12_8hX;FbOY$whxav`1}3<%v@D~lv6Pr19?tusQSdShre(O1ScrN;`^|0#FSi5~I zUiIzx#-Dv9E}c0ZW3)jz&UM44wG<7Rqa`7Yavfv{{tU{ahhEk)@y{OR>vag}8SpcF ztvgL*ov3={hr0KG%nmGFMyA*|WG98I3WQv8F%P6QLygo|5 ztFZ`qPzfrX=cGIoR4N6Tfd53Ef=xk|3Ip6~>?{1z!v)Fajpe0Gzd)0v@P;``d0ZNl zhWLNdXCbXoDq4q%7KsoVQE=z|xUWWhR$=qHbq#;_V4a30{mJEViANI5+P0@5DzjHn zlQ2$y{I#B*Sihl-rDD7j3cuQZ9?P0Obn@~QL=?*xO~uNF^0?SDl)9vuUTNzwDv=M~ zH)R(06z^$_vA*06d&$}n@G6XzW4M`#Tj?Pq8!&K2YJt=HmpGJxPK`eD)jj0MyLty1 zG~}?Mk?3OjnNE-eiB5g%;%A%+{U(MUO_}bRrH~g@XhcSwS*WWL)%*2d(vJA%sqiZd zJf4A9pGzki6{_X}71B8l$W zfOtt2lCn*t`B|~;bHhX`X_2O9-*o%d` zA=XkvbK$I(C1)K&9Kyh`y*b*O5R5roTW~aB#ElOHfCQ2~cYMJjDMxd9e-)H)F6hT% zE9St0Gl!&01LD7^mMqrnzWlU%N`nmIngUZ+tB+`EL@jHI1?+y5 z-DBk4s<>wr-?acpSbBY1E2KMV*m?(r+uGJuv3=(@Ldy{ym(J!XJd086cggQhLieM+ z-SM4gzZZjDm+8%34vk{KFuP|kVy`JZr@)l1p(R@ZbuhfXYqRCXyss$;Jyt)T>HxU8P9OPw3;}`Zd-8)!D4*02 zrE0){GcRkshig&hs_ayPMjb6Zg?7ML*;GX_ zV%vsw~gIe)r2)$y-y<2QSq!t3Y0^gI1j)rZHeWiMqmCl1y*0 z79(@QQD-i330&b^)((AO=%2jU5l=q(Sp4hX`jt3LRrr0|*2ORX>Mz8{KlZ`c$xML{ z9NH64J#{1wKmK@Z-L{2DBdRoZiT!qB4Zi}K9qs}Bn){;_(>wd)<~o;=MD7n}N>3I-N$(b6Dv?Muw+Vqs z*dmY@l3271EoK^LMy&$I8|As62$>X;y7|18)~Yw*euc6v7Lu`Wq*qo(vnr>s;O*lH z(AU_AWe77k9cm#zs$!Ln%|+NVs8>0K&{7b}4Cabmp9)5V6pU-7GR0jeBR$IO!2@wK z5WHas#lMFWG^1Rd@Z|(4Et)a<64$gWOoRH+~)F=Y4HNO6}uf=-$2KVmXmH9P4YjKq!M2|7dJ>Of4qbWNGS9&~Q z1KzB833Dq;D+v#xoD?2<4>F&jf4x`tT8=lD{o8oZsiauT6vm3-e}zPbYk|WeA_X>L$5Uwkn=U9VbE1xSYotz~N z`DY)Mz@P}s7D7J&|?W03yf8epW+w{ze2SVvf|6-Bsa+m5)}F%UcM-yMJc zpZ_R6^r;WWij7++R6$7&or*F9py5C9P)8j`Bc9U~IY|e9C=e|`Q@N*6h7i<(H&081 zFlq?_?`>=3yx>c5j>_zheD)Ku_27Y+=wZaV4!3@1pd_!DUxB^%J$N z?1TIqa75x~n0Jnxy~cAYE)c0gGg4#pMB313(xZ@Pj9f?`DQl1!kO24r6nw4*0X_;Z zm$uv=FCINdfmwHKY}*hwuF+3UQJIfjkZc(}wd0*PqG2ty78F)Gn8%htXVqJ^ukq%Y z#TsMN)_8CO$If!AkCU-dqfyl75T?x<=P!nB6GhUFtzh$wBeSv&u;G z#$GrpmZ852l#j}?nsij&m**DFsXo1q`B;ta!C~h;!~ZC#a^Tr_mcu2+`r+TwSdN^Q zX1%_ASr`bW0HuASK)DS#0$C4^Is~c8Rn696EPv7!Jf@Wub^IG0t0j{Q51Xmkpf_24iMofYX*% z5*@%eL0%j3FL+SH#C;;;VNKHn2_JaPbF7VQ8THT`Ru3rKmE-c*B6#2+QK{~(o_JvY zI>wQ%iFX)KvZ(4da=$TlH}6R!pcFZHrE3^k--5BvNM!UHBM0K>2X+vtD2ui&n`70+ zP1ICe1t8@Z9p~cNul-d#f2=1~G#b_~Ql-jtjYM&t3KyX3L>1sS(ukZvPOGSvz`v!H zc)h?hg_Os>`G&$;L6{Sy0JMTMW9cG=za<0}-5B8`FRV2p(V53dLgR11l}bv)3phRE zas-&lN5)bar?7LuT+{213^Ia`{MFQGb*x%VcopP1Y+iaWneF+E-pdn{a=<|)Rhbm= zEP`PTGiWiEQk5)4DJ*LdN;goTQ+hrq@Cm+O!RN}b_8p+%h(N78d}VTqLsT4IB?QD7 zmb3tzIde9yUAvw+6NOF!7G>n#Q((F5bY1stDZ+9sXUO!X?bb|tMF6? zPN4F=35*Akp|UiLmJtGAq%c=`OYjntR4)uu2|-xP2!Rd~Qme0PihuZX|0vELe>*z6 z6fEmgSd5GgC$WN2n4M}^m@lt`7e2CNG?k$EwztnnhbJz%eD@_DlFNACDrA{cq3iqN zP@_p&FlVTdX#tCtwhGN^Yg@6hKna9N2d>*zH2bAJ1xn9GqsD;`6~L`9k|a*xAPD`( z_r#4MUWIUa;?T;Cu~9xiKkGb^3+|f_)?g*ArvP!$ypDL#07%;6J-_31@^4^LH2Ev2 z`3#>^jGE`l#(4URrF#XCQHva}385!*0~21zHF|yF;k^`6H!$#g%{>1?UZ|;w;`mG7ixY2xbA;R{KJ(*I!3f0;hN!&x-M@*S{?*@zD!k#L%XlY^ zgat7^N4u`ZrqDT079alQUybR$_89gEK9mfl0a3BS6}v6QP&RX_ z4FbZcdwOkpjCLy&hGOwsKIWrD1}Mx#X*W|`^Xv-X3^YO`l`pNjKuRI%%>}icA zra4suk1FU(I-Z=v=%Ao(dZvVMD;568of?!%c0OuT)B7O;+LmgZQr#yX~umhN5!QNm9PbR!b8uQg{0tB z9P7E~m|8wFL1)0SS;y_VL=-ZHr&J|el^x0%Q${LkQ&iHfQL2=|%1P+VM-d@_$GCPH zvcN;dn(#$VL`g;b$?yF^w2>D1rJwzY^bj-Dj)BarQV|Q^V)e)u^8D5!7CrDNX+OmM zqy>N2ja%Y1{stX7J=eN=WB=au%yr&Pku5Tpy_`PN9_{UCGSjD)KXTD5gk3sG@|~Bq3X7 zL_GFHDn1!RftVAQ*lZR#AYf$z^L{EOiNy&wNgyIl$*Lt{z679EB3x9O0z4~8Q9fD< zT^(0r{l>NNvp@Ig_<#P}mpMeaowFlX#g^?mU^c=p%+b|LHS93L$ijM<{jGOTA*d^3 zGyQHV;N_gWF+n(R67R#Dm1FK4(oK031s{wGWG}Zsq&ELa1{lT^T}rbQLm{Guvb=QkRYeQwcdc&_s|YK)Z$bZ zTaIY20$;N<=Ic>QJAT%Phike6ynSvMT*D-VOv1)B7GcN?t8pK#Vg;E3Ljy)*FKw$ zZv5B(^ABVH{+)5(!w<$ot5@TdR#EVBHCC6_q(|LA`yP;q!=L?yIDY0b)6eQ+_m+*} zVFK6avE8+Y5s$26kam_9=*2wwJFmPR8}{sqWjmjUw_ZIKqt|+(l2BaYQ^iJT-C6=G zxNE^_Z7n=YbjV^t%5*ukry@pb^^nQsB6u3|w<9p;;utM4O`EFY@Y5fPW3L{K_D=J! z$7y}q7>mH+(HCDQ9JwqW`N&hTWZ6*s>wos2qKfl%HH4)lab(r02cLjOoB(P~;E9D< z?o%i*XAh*(;ybCN`AY$(u*(8aaZEkQqSCt9MH*>MNnboj0Z<)6_1xLZv3w1MheQ%; z+g3zd<^JgH=#2x1AAv6B@tEi0?3s(m5auJ`4d0^n<61{gjM9qNKQtEazVvL4?v!36 zC-aQ*qt(;t-9Rcnmj>lu-xIF>tru@=*Zk}%_{IGdks)c;G>cBkLO-gxPkF;prA2Db z@H*F`KUX+aaDQi*o3b%NC4G85Ww>&A4(0XmlT1FN4#h%F`M?^JG+2PI)$nL6WRM1p zUq%MO5c00LkU8W9fAYEsT@*I_sC-jM+`LKM2N8x6jyqk$5D}fI8??9G$6*J1pt~+; z&Iw$%D8k&ZWjnBi&uN+4xTTHOVDqX($pB*Kr7KaljG{4)f2~+G5~q*7pXoqbI_=I$ zXAKx?6jbmX<%s;N7|04~qY=Dju^rFYyNjm94qj1?`ThNmKNe@sU5m|a&6&eqw|-OV zF=d(cGR?@wZCkg-d&f>96LAJH(oUa!g-)1_v1QAqXjtADmoYBJNnh5~l@o=fZ3^f0 z!w>I>S6@6DB`r-+fjnA_;!T)>H)Vj{ZW@pPQlo)CQcj7dG&2A3Cm;P>A$&kEM6Xa& zK&p5Pz!RbYaehWZD4wIFv39id6na{mISmQq_&tTZ0@HyH<}Gb^v6#zKRTOB@WFj(= zi83(s=b5Mu=2*XHe_Uz5gn%ojP-+YXS;wfo#`N57P^_hZZe7ztU+6@<{K{*w3E(Vc z@`^b>r=WOB(iBYFOS0WcLuF?YH|w{!%qcS-y?4_pYK#HE1_9VFqUnlxYgqYJn-;PCdqifNI`Bzu);;l zRv5~-dYwMksx5>c#bo4w9MB;i(yBvID}40${fq)#B6HQ16;7n8z#d z2+!oza(6bj)~cRfEyCH6mlnL0fG@u%eZbZjch&(E*Yg*t`$SXLY{s%`u@&dNqG&=vwPp zuU8tE5o}qL8Ed$v?l|jNSHt4J-cVIHdk=e1nsXo_X1cWPasD37;g>vvHM)R}gU7bK@ufBrK;~MAu49us2 z2s4_qV5}#&=I?oWMvosGj9>hvBb>O^NKW!xp4Ge&BfE|%a+fY#i0-q;s3UOVA5pr= zfw+0SGq!JN#%NiGp}~+26vy7p&9S?!K0f-P2V&3Gweihwyi6paH)(T(%4HR`Idj|W z?jl!m7z7ks$XcU7DhZtrc%AjB1aCvzddwQSrO=A7bMChMW6H|3+D!}|4Rj~L*{EF<+W%K{m*{Uc-=b zj%oEqEIN<*6wds}BS0Ux!=GG3zE>IM`M8L`&d#3b#7Hp>X8~3joebCe2Pw9?O4a)s z<|{9c?kksK9dv4yb~m5x?&u)$QXLJ{-564DX;}?yz#FskyE>S?fIK%!We>N5bTkOf z?=Bn&qMot0*&`V}quZiOi&ov65j1s`-72Yj_^h%*r(iK|{$`2>7b0C=!!gOqcx8@! zE!?;4*cr3c%j2)V{3UYkU8GC;W8W@1PjEtv!YpTc+6czQC8h|D5Y3ccHOe(8bS_;V zfU-FT$Uzstm#rjTgtJOn9a8ea5A6M%NLNTI5F`|Zr548DTVD3sA!re(7LzF4bhFKK zSuDPwjk+U|6nYkiFB9uJ+v^LV&_&(8naz z&ehO(#&_QUItW%2 zt$SF}SQt|y7`gJjQH@(D*I5dFJQC64{LH7{2DpQxcPLI71W%j;KFmSp-+v{JeDp}% zw}nC)4C7X4v~BAqDtU=G4Gm^Q>B5z+G=ScE<3#-VOJ`#1y2gSoR95g6WSBf8&U`Kc z<)2KGaL)y=O?p-6c{Z!Hx`%{^;aYVtMoDFiBI7iAlIQLj zbp>a@FWgUgYnWJCH&P+(rc(sHC|lTi(w!qh9l!a5_Xr0c+Krs`v^74<>#oBym*sis zOzyBStB5A}SH8sEeP)pw$}nXff5AgWE>+s|D6=YRcW5$ZX24hsP)R?^sM~gw(v=SO zM7Z$+&ppg$0#CUcC3dZQfPGHkIpaM~Qki`2GRECFFq(^V=dZ+-i&ue>P77;=hm<=y z422<37#!j^BM_{`_jNwhU-FWMfooG1>GWAFtkGTpFKJj$5rHVLSVVj1Dxx5FFrJ4n zo;Yq3ejLF&FQ*{Vc?K8SJ7OopS=P60&Ir}@jw_`9YV))u?`PWRefU;Iy|$$_j{oRr ztY^|%4f4!xfm+%_Yw4S}h|CC*1)0iD<*@Qd-C$(0bk-74wRb8j-DH$VD%HYc5f=*X zENntpB_IHfg(f1ylQXOg)JwZb$l9qlIWKcs1!LtM;N)`xXB3NZ7A9ZT)XcDJX9#ly zAm6J&@C_hXI<5^-(1e1(irT$vQ(9aS*$~#ZRhMP7R*XTYjTB9|nLMnT>v_zfUaksd zDMGRq;9I3#Q0v$S@! zW;>CSy_}qq1x0+eGzi5Nm%-p5EDw{{LzmK)^k$^SO8d++1EWHb z-6euChJd9)f;|Z5B1*G}iu+CR=m&Q3`l9&O_g-VN)jLePY6(Xx%rLCr4m|Sy#r}A5 z?VjlF?4(7bG(Ps}kH<;Eb=S{dj=c}vm$(2@v7VW{%d7V?uCjy5(&qGpoL03Gp)=ms zoqfd~L_Rn;On$D9bfLLLN2p?CLsPX>oEP(m*K+SW)EIQYZ&rL3=@o(siT`=%16GSt zjJB(I!^6Y<(YR@E{MbjHjC}_;#%ZDyZ~e`)aou3(uXDh{Cgx_}CVf-J;wlihcX1wSh@w3hBJT--v&)ezy4&J^hKOa;6qJ>`n|TYgX(`f$jPF!f;y=N3Gy3~+l^(@rAy zs%r}Qvx;6>ho9KQ_z+;IZsBl`t+e{U)73ZY7gPH>ulB^o4eO~{Srq^G|MrjK7k}eF#J~E@e-fw8Ff@dy$cW=% z@!HGb`Nd_V{&3nB^Rs^Q7NRv2MPgLj=UwQU!a1}^OnB(HX~-)p<^P;ZU6q3zuxt@l z9ucTjq;=)64f92YK^0(2S?nxCW*9();AaGgOv{tZTUkg^MG?~g7Un9#4O)BVcGsZ9 z{Ek+Md9j{r-O+#-pgVuH=Q7t;F@batJU35idpE)$u5XUv2&8(VdZmQHURjr+wkuTUts$&e zRpEi^w_-n)qF3A7V==j83#Mu~Ii-=1-7UOS5vj)@kY~A`9%bGu6%2a>ZUS1kNblw@ zGvUtuR2F)CdfiG8m9E61()CB7uGc4tne%o^)8qsUjE?YBDFsghdAC9Gd)E;%7OQ>g zV-Lm2GaZ?0xz4qPV(!m`V7##tC3)C{0hcgyYUU&sjmFLNu(a(6-%5%Ur@U9OL(jBP96_uUXNp z!q$*WBM5KF_N&^OChk?VoB&intG@x%4DSgG1%!%P<3%R$Q3w--Z(#%o8-)n}CBvma zfv#2d3JtF(<7xmXSlp-AmU~^hLbNadxF**SX3}`>llRjL(?CENDP#@Hdf8U!+x;7U zSHS31jd6OFG@rE&C{O8ZfEEU42wRyc{Ct?Isje>+yPn-R_}H<%jWzQ8=5TD?yfS|G z_x``Ir0b{t!BZ)A9H5~{FGmqvzj`4yZ`_pCq}rh1(At zj1?TeckcZQaqWCZ9Dd^A98r0lDOS_8wagHzEUl}`O63CwAH=|`$1@lJ78ELi6XB;E z(5nL&38x8!`shtY&;oO-yrs2La)I@P8{grWzdpR121W~xEn(mXo=_z{mUDQRLmV;5 z;Z3pk@DuT;&%7UtZ?!Y3kXAa4IROIP#g#%*yb51WPZO8QkHmT61%ZoTlRgXl>B)hA z;G7;CgCepx3|=iqIjnAB>}5|kUhi^3pNHez@vM^b3!ApppPOlBw?{$?yVeMpi7;VD(JjgFB!VgpmaaU z>(VLTnWx6Y6b~=v5rV({JHN&di%s;-_H#_*^|*NMO1%AgN3{2KaF4k>G{a)B&G)V4 zkcll{1pLUpYL%DZO_&*PdV!}9hYHe;3)nxN~a=)$L4uW`Kun1uYI1vR(@s8c}gAkk!KB2 z+gD!6{glP(7^7OQZ4F%pi*UXMn3?S{rNYr--Wt*_VSX#SPoisk6DD;L{I zZ(#5caa*~ng+krS@xAXn8^83c|AZQXhvGl}{+EFvsm>b4ud*)pqJGNs88B9F6!NCLc#2OSWCtQhE|kBtaqyrR^TGmv+zeRq>MSShM+A@ zutH8tLbi2{T8CPJvs_w@Sas}q3b+&=Ap0TgSc0W^ zlex);JY0i^Su0#52$@9%Uq?t({P@r#)~a^>=2w#X!H0|}tkQx<*qSR5FAjsqQ%o=* zvLywAH6$aE7>YKkkpdJYGd0cWKPc%Xw7Lxvr2qgx07*naRL3~stGwK(2ZcO5RAR12 zg*AzXr}FYtt~;ztrR@n)DoPDD*I`&zk5Oa57M8pQ_Y|(PRuzKsw9@%op(yZGoQQC) zgN4i&#IV<(G%Wwl5W4r{QwmLCY%7)((4aD}fhbDG(d$!KSg|`Y%HFKv<+(JPa7KuZ z5wf)xdW0OTBlt2j3A~HY69TffAy!eftWvg6E(`3y&!k0j8lYx0x&JnDR6UI9>*?xZ zUo+$-R}l7G67RkEd~9d<$^#5y`O`o7i}?OmzZmOwJrTR^e;|!9bGW5=N`swOV(r%L z8SXp!;tNDT5C&syap>X0RQpdeQ=8M3sPupTt#_jP_?al-J9jvUp@n?$Qh1?*;=>dg zgqnrF29vnO~$B9{_oDT$ZqZ}vd>(n{(iSV%!@DucpUaL+1@EL370E^HwW znSzw%DMy8)vP;@g89J$|wxTv3InWjxTkAO1aymZqv4^9RLZ-VYty$W^E}p*{w@PTO zB6R)Q>nGwz&s~h6`95!%k9`|f!cUC#rNh9{u1j!+_HS;9i+FV&%3#z^!`B}08hf#c zu-X2pA||7i70Tkm9Hp`-l`&gTQC8xB31|1KvJ^+Qfhwbn8f8=w1#6UQ5*=X#%FjtF zhTx0u{e8MigH7=01Zgm7tOzsZh4=GbMh@&OQAYq?954%ZEjpuf1K3+7ehd1PE^0WL zOa4?oc`xfI?vVobQSn2w+|vl=X%3C3W&lok*)=+48lr8}<|v^haA1&A#8%T{ib3H1 z|M5Tn?Kt|%8}X$t{%JgV_``AkeMFy_0rA@FZ^oWoJArX^Jow0?6!i8-Q%hTX_R~+s zpE1etz(MLX*h3*prB~?_`bI3tSME*NDtAg72vba>MBjYtZBDspaV6^ zOb^0PWfg+92zlzU7HvBsPK4Sk>d{nl2wg2vLtq*O#o^#ZJl)NSz)_O^GNGQ#cj+sEEVQ>P%38$wZeO* zVkP1NeT`AQ?n6df4E(ud(y9vERtOCt!%;G(?LNc$FQ-A5si#Z&LR#o&rM1U7=G38i}M%#}D#KXEUE zIzIU`zfSSWia2%ZY`o4m$B%scWAWgTBk}GJp2MqL8M_|5pH{m57$(zE$DHaZjLH4X zmF~TCiF0jFqyVYHAh>#MFt*WWY&zw}@Ib=23>r{EW)uZlk;gRjSaQl0TembY6u$f~ z1-lUwBSIg4@<9x5K8w*eO~go?P0`}@t^fWt=22J0_!4OJ`q$&geOocE?Xv~f5Svr- z#F0u?8iPfWu5ttzs=!>|*lxmxzh{S~RgNS^U`Mou*7_-6`2W#zjn77aIhew`IBKr5J9W(|ma z+>3$7$v3_eHO$}M$v~Csc<4R7UGbp@+G3U>rKZ;P@oT^Ik?1;qfnHS(aUh&~rL!-- z_4V(eydo~1z7ap1ZWoGw_jvrkW?;vubqs77WuFs7{FE`mPy@V%LPo>COBsk^CBG-3 zxd%O4y+RebId^L#Yz;N)XZJ=L$;kbBY6_Is7L4iG%q*6!i)fQMW9Lq5n9EN(9~nJ_ zsgyIy1r73KK(22mjgt+ngIOoF7`YJ1$-9 z;?R&ataTCj-}(5)H=c{bPdr8)PE(vYc`8~)N8+)^J`|@ebjBnjI2)RlrIVLO*Rl-d zZq_UmmVMHSinyevZ2oh4w5titTx{=*9lLe|Vq-7EltOgs0R~;7X7JQxDD8RWydWRAOFJ;?NSA zM0hLk{oDT}2;j(uNVsziuOnj9OXfO;qrFKPLNb*i9;M7-5r&H07=9H3#yp-Dn)ydV ztPXha7&DfgA)MPN%C~;_DrfJmCNIzilh_Vp=+Lu{Ay|ZxVG^qr73vb0!qf^|^CjZn zP?}zi3f3@;54}J?XXwe{5@``D@UiS%pF&s|Nt`No6}2Hwy;_M%1;f|5F3g8AFofSk zL}CKwx=CfM3cYpBnuLwkq)`W9D_%5~oFwDx0y7mZ%w|D}45#sB5r_gsVP?cbhFFHB zSWd1<*t;I<0`g#auA)_~cck%SK3UvoD7cSgLg*z^8Ei_0s9~TW&lV)37%~@oNrnTz z8f*%44U+V5_?9_f>1PqGT}K(>-bIMcQI3Wu#hLr?UgmYBDZP1Noc+H1*84U5lpZ;I zodLH>2YOFI2{1X$dNnt@ys#Kt(_i^hYxOz`ycxN z=bcu>J3l-cD_dIV9d4pn>IJ5H)!_~I$JgID89O$#Kzk?))*zi&Pa(}3(J(5Y5Cvjs zxG6l1@(5GpZ5k}nr#O~oHK6A7Y~*?HY5`0Qsjih9nI*lP6P_5fvtz^Bq%Vb#LJ`tS zp)BExXCJ;N%q;kn?mfUknn$&z0LhdAPxX*JW>Q5WVObD0MUU^(NA||vEvuqw4HdSm zp{t{p9PU`wsNf&P#+}3(&P77<;zO&i!iFUIv4;Zj1OEga5JF*^~P*EYtZ5AWu5BF2}l zsgHm4AAUVP`H{nTziVU9{#|kZp@Y-|T*+vFGEbw}$b(TmyFYx*QIdD~nZ#KcVaQQ0 zvap|&Nmq9t`yQet)55AQqAJ&;kBDZ+wLS`Ehf)03Fk~jP6;1Ek{bk3;Jw>C;0;DNp zN@MVxX3&gi6(F6E8<=Tp5 zwbVt3%xY1XNR;5m*~>T{qY735?K(xG*YYC8+GtC{pfCh(YX)K&?~v-p+vbPOB{5lw zs!0oi{Jw@oZU)%obs!uc3LzOz0#He%pi;1E0PwmNr-p{@R<>%%c%G-JqO;;v2Gk33 z?ap{!Fe+4~WLe$|%zpek#owuGPR0|BDP{xQWsbu|^A2q{ECcRMA*$pw;Tb z>0%Or0>aiM?=3JiDy)tkqC(SovU=Yt2ZewwK{AiwHJQNz3-4iRe^yZPy38|16{nsf zpkRFn7QU-N;`$xbAbIrPnDu^vpG&#FY#oeyr5?)E+B0M@FZa z8#^BTRBfiR#C}@DK3uQ;&;=i0up#iJKch5WSK5}Y+>z=zCit{xMN7+VPdSBP( znxq3GLwX<@aMDLJ{gDmi`8#_F#g)&YB#45{jA0bw;Xd$i^jy76-37;70y_=m3GnTA z>nPlD5J7KOCqkC>qEN11z5;FsV<(~D<#^5($Mm3pzQtVa-J932j-rsz{IrEej*=b6 zm~(IPySYWco%EH8kk_Sag$%n%S)l@QLkf9mQ*V#$p@TF`H9#Q%9{HR%{ER|LIin$M ztwdI!=XLM#8K39v^ccNw8g&5Be}2bxC5@p-l0Uh|UA(*xfAT4cW7g7M)W_j16S02R z_Dq|VK=)mj+T+5h)3Fjm^%2741J|wrn;~Y>H^mTBn%1JUJ<8OBSuQe=<1V!)M?U>i zarSawoO}64jQVU%r7A&-H#h0J6tXH@h5y1@g@=C^=BE%47SdheY-mUb*c;^V+fb_e zx2=Nyi9#|-&7w;UTU&lC6uR6s$PuLLfm=zOYwzMzq`tVx;E*$?PsW;+E9208yBYCG zNVH}#IHhl#!$Cg!p@%uS>MF;V5^`lv_Ep<5Me%s9sfcn|T&WRiN{Q$g5l?y06qO@& zo$j{;BeH_ijHa=|9v z@ldAc=fI=5D)tJ#xK3fTOT%J~oHN&w_q?YtFHsJ`Hx^PV8$9pYV_rSMO^NS86L&~m zPO|q!4C(md7r!6>@sGX`>*=Z2Ggj8i?_4}(ZR!m+W<C zd*Su?mXODClO8L`g3`LvVs*TpOd@s-^IA|PP!z-p0zvpL;m3jkEm-$Ih2qg-G|W81{@jzjYL20F4I)ub7TH?dhe=b;Fg48POkI_iVI2pT zDBPMbda}A1VpS1J03uGpvTC;$L9dm36XEU+Bm@b^eG6BQZk%OEfVs)?+GQzhmtcw7 z9;32QAy^fvkTaAsJ&iRD2*jDn$a^m-qGA<8*&f`%XUZ2Vr)USSZd$T@jk ze>^W(!MKVkM#8}Y3C~FOA&C8-cvlIi%-xswa_{gPp=qsS)dq$O7dI_p0hY!^R?mYg z1=00c?Khp%PK?c{LbS-)qj%pMZ z8YzbTWk^3`L`Q>FWu8$b7snbs#YVo$upHNQTHF2mHc^$ZD-=2Kp z(dg~#MF~(ihg@2>X%l>37jM0JJlydw4OPg^;vjn`YsJxrTXo zg|VD0MlZV*8Ltyz+oU`=fugS<@?#2Y0>jbKvP)bid$I7*$Xhu&MEY}rUkU32J!v49 z(yS|OSxo4$oYGrPHG{^{3@JxUc}Vk=MIg^ntbE=`V#*{wZ=U+;4^da~?#1{z5v%pB zE!kfziE30fuXmxgWU5^*vI31-ha3vnrx^-((fLa(-!s7Jy zZ05F5rWgaqW>}OKiwe~^fAP2Bs=}HUbj}D?kjo$$a$qxVKyO#!s!$Sv3ND4Tr^Xnb zQ3zQvY{<`I0R_K;OaPTZpq~Dtz`w&>SDCIEZ!WzLgtUVl{JwvSB*Rk@xB~n(gUyAi z1ff@`^~|5?(HNTaK!wJd2CAZI!r!qi-X>qxhoz~-s(@KRSWv=%c2k%tpm>)1F%(HB z2nrFw%e^%-ZShi&yMBe2o}R*M!N{=X#x@o$P!Xe&GJL6Eli=#B^o9$;Qc_y9#U%0+ zZW(f=cWwLz#X4)_1(=}p?pS(;s~FCpGBvE`lq}J&LX^4mH1%T5O5H@6OB`7uj|`k3 zjN^Bf@Z-6pMnF6$eF)1|tJPlINfdlJYjr;w6IPOQ1)iH%HXlqH0h*G?4X-ZHiApPr zZ4fAZ2ojBe6`Ve0zP9jAOED6_CwsRi)!s;3K}3*N?Fb&JLoAp{Q4ll&!E4I3?x83a zl8IBSKr6^e;K|}xm#~vYjYe>Ngv|`k_0ANM^R#5yLu?Ll5rSByR6^eD4i<|FLg8;{ zTfF)m4KZ6p?qK{_!7VIge1{eI*-@qfX}z0bkuDbU-mX))7^;(w#J@(V3drvf3rrdp z4hk`a{Ors`eDH~b@fpTaUcKBAFTQ#-e&u)nTl`7`v7Fmw{ z(Y|he*ZpW-m{!Vg9dIZ-J?MlFOT+#aK3-2c*H|@0;kDQ$YvjA!^R*LrD7R?oSrw=M z-50_N;zyr)2*Z|i!4&g;%bR&lw?$u9Y~8sfmNcx4b@0d>xz=IQ4%-jiADx%Fq18cB zJMb-wTnye7#HOGi+*})fCOlHvx*#6H!GCaa!b5l^L$fDwt+6118g*JiQCKyRwjs`5 zo-bzxH-(AaU3~=%ft_arUpjvgz8kq0rCSuuR8X6@yu-D2@7e~faxH$=Zde~n;klPz zeG49*V~W!%LfQ;3>gM9q%fgOM4m%8sj=&Mm7ws zs?u~m#M>PBm}V^T?n4J+<+iO<6c1$KZQlh7NGFK86yS(0DC6Z@I48L4Vooz$Ng))J z%?Q*L&p5vIa34P0bUnql5RC6uAtc|3yY zF)ZVb*vR>xD^^gT1c6%h>z7<~whgHa`JM_)!Q-m6U{sEVyd*>mj8qg7p-krD70d!+ z5@DJIoYo_jb1EGY>j>T3RQ4Loi=$0mvivVDu!G&ID6g(D8Wn4o>dXop{~15UOx<(`3| zN?2Iu_)>)=_g4w~@H2+A8>lW~bDgq5V4KhQ%{D+VN&3q;gYT$2B11;#y${Y%B7s(G# zv|za~PoZKM$M=d9giLLu#pnnjY;d7*YE)n;-c^QPk*|h%y_VrHEp}0@A()qChWT6x zFahQY8X4NCOopMsn~FjH>hCYkirzxl(x z9SpUY!XVhXYissEe&?%ygZI26_EOcm5g~4Vz3bwIc(wgveBh%W%Oazhmq=5r-N<`} z;<*e$N#&6;L3qgCC=rD%XisIAumO*H*9s~Br5Bq#2Ja)lg}-3bPyvJjGE+tphX0f| zUPmFN=PA7}gek35*C@!sE57&lX&sCp6Kw}`*SFt=l=O0xUg8aWh08}WHb_jUQxR^HtyQbQFMe7YcZf!ZOfzf zZZZS793IH~A|G;kTkgwkupjOLw79M`#2>|`(+f^Rf|t^eSde-5)};}mtn#ejD!kdH zbxa`}nTicKFUl(sg5F8 zX{m{7Zfiv5F+i3sK@sCvEdgh)Qo6ni%#0!^yHqM%09j&Revuzd96{I0NS%65@Da8G zQ`wO{?)xOqKlLH_w~o(ScnD7;Cq_s~A+Dpcfm((aUuM4fU&RMM{%MSi8ivXY z0UHh}q4wxDwAXX}R&)%WPkb!=Z8sySLEs>m@>V*-~M2b*7Bo35C z^Dw#mY&0gF6_p;}G3Aub4xd$S%adNq&yJA3nP4R+7jbfk3Pq);tL~UM1y2e&7HIxV zk4iyx+w&|DB6{710|cfMkIZ3NNeUNdpQp{;S_%@9;R;8!c}RreXCn`ik5b(qni-CrQIU1&o8|uAS7qi|%EI9mUg|goTqDKGN7k$QSqEbL=PcvcMxr$N%xrm=Zqz(~EbSjs}u#WZut{xAf9f zXs8MVpYzFKZvM8_ikpM;VurYQH@{>QMh{8&S_J0)S5u{H>(azk@1DBKAtMK96B>A z^|o`qEMp}vT#m-|o02ZvV>zuW(uVnCX;jZ$)0ExQ1%SbW(U8#ql!yY)5UXK+jTs+$ zy|*!vazr3|RNNcdQ?ZK6oSDpLguDBa51oxI3`@AC1~qRMhCN=c5i`&P{4qMgh5|1` z`FvIbtQd*Qn(&ZR;NIVR+HRtJn6Vj}3n*xnSANC{Uq5H0>9MCDD&B{FE%fW9fTo?k z?4|;mLPTkjtHlCmw&0-sPsG3+1RZVv(6GRcFs% z;6RUk)CABvDG$zZ4mCO1Y4}LbZ!3j$i%ZwBD8koE;dv^3(SHmCHF?2>9t4 zi_Zn8iPgf(I8=s_xnDU0M>Lj8oXH@6Q;?YRBB09|aDM*e$*3fmvkT*IMHBM7n)9S_ zR_uys+p;Mh+E^I_AK!;pJRMth?TcQfVkv)@lu}?gdYg1WTSg@^&4_P!mcI4xefvAn z-f@j_r7NK;WGU;L;C^@SaL~dmr#%s-c2CpOr_(91PNW=M)FbotiuKs*DY`XsVqbVQ zgM_3hWtC~Kd8(R01&8(EeM9T&D3F$gommu%E?Y4ECgDvFFS2M?I@Kq)*26YaowbZu zVHAAu(TCzs|N3vEql@84c;fPl^rq36MmRUrQJf~qQS#Xzd+>7>ibx|K^=5wZ`R~6J zTL~4kqRB@XG;hcVTqR;mYD-MgkwQue7VIw{Skb>Vlsm!SNrEq6G zxhOX+Q1s>`U>QX((;TAtQzyD8#9XJLP6dPcPtSMty5>^NG;Gk{XA{qMq` z5R+b(3~0Vp1HqDcnMe;r!iJ^Ni>UyR?xm}%J1)|+Z?RPC+7^&bSe$hlei5k(A-!Nf ztEKN$7Q^NmBPvs^b@w9-Rq}>K5=Q*3Rhcb184mG!vZ^6#Tv~wRx(!=f4BeV@As2C<+ z(AqR!roFfh^Ow#PI9`+gCw=I>rX=JAy_O8OvFFV1;st=3zuS{aT-xxw-#V&^>wv4c zR~TBUtxz&Olf^jq;35p<50#m;;*FC&pi_l%Q4C1F6*@5*<7>jq5Vm1_ANHYYrAxEI zL0WR8s>Yw;ImfS7fR{E>C9`8)w3tv-)zyX2q%{z{_c9}VL)(Td7+XytmlnPUkQ{pG z{@A>I567=vk84zU&H>YOZTTK3%yr*^CKU>vjhtt}vIi?kQ>g$~+q$IJG=fni!l4v+ z0O*8^G?|K;eGC7Eyt!}|4qjVDRwi#73X2L)f>St_#`}BPS z#Q)e!A15=DYXeZae{j*A6zHn{4DqXpoRLu8ayA+u(`xuQ; zmMJ5IvHWMA)~*tfJjq&j(sw*MbRFZeI+}@IojiFqe)Rfl(b;}JQ;{pFMigql6~a zKXy#0kTh^7Ee=CY^x$20(+<>0|MU6wtKs<5PAa(j`}>jU&UU_@gLG_{9fQyEyl%Z@ zuCD>DQZ0V+X>Ll@AM=uWEfc`pao>y zT?~rY0+B^-M`dmD-Q0o7QzlS}sKo3m7HHr;* zYzRt2LV+!u{l05TCRbRfY{din)Z&-13jrsmDKJ%fhNAUwVLIBd`i90KbcQ~_)LLeS zHtok$nWa~eGz&wsru1G>6q%1?zg6Vp#km#L!w%Yq=$64`;@0ry2;ulF9N`*zo(qPE zL{{VmVFi}fNO`{mS&s6ura~Od~6Ytg{Y@Rd_U$ zd!OWll;>Z6k9n(=DF^@;FfI%Shgk?Stx;Z1ycE7Ee<=8Xp>T8`B1`WpLrle=_h6cD zB`zVO6yn0$DLT$~tz$w?EfJ&a9mk+i39EFh@D_g>mbY22(HMKirGcbp$WuYALFByY ztn_6aGO*UL!c8&lnp6%&J5^CF?`DK?@l(*H##t%%-9=yT{@vSRMa#N)m-eiepM9N( z4()B+f94K{pCd%>yKiqQ-)Fx0dhFf1Id*Jn!M~WnTN)vxd6@zD7E;=?e4Ehh2;og; z0I(M$J}f%J>sA9x$MUV~Q0T}5(xG{GY5L9-#yT`Te;Wf~F@`kq!~3hijlxJ%5`b_} zSr)Bgq_ucWIA$b^_v8zECav;c5P;}azEji*7;09b`91Mxsw$N**OY(6vAm!`Buxrm zjUYWpAM&8<&h_&-1>wTfHw{URCv${)*hzzURZI9OWo^#TR!&J_Dj;#A9LXFd>yfsg zLgbOgjK+a_f#kvJ6bd#G0Z3k6PFgwx?|G` zo>2GbqkEVd1)ov{Jw)nk?*j*MT-q><%HxF>UtuoyFcCY(%TfrXf%)1iufQ*J@yH_& zB`$k=dg2D_J@)Q97>Czl_x}6153~8-dnX6QxR&h5z!=n_$aX5^Qx08%zML!JbE~1t z9WsKvw1%aS<@3z07-vY!Efn;PxN!agog?kh#Z2`Jr%%NfzI`;tF;aVauEpi{i)p~$ zA`)~9ndv>1ZOZEkctH5c2hz8+Dos1B(dzbE3U|xVpD&%b7%lX@uO_XLsT95=(aGa~ zN28y9`o7PVAs`)HrhqrDf9?7hqtJSyh9>=b+Kwc)4BzmcR=OC`lhYEhMBPE+=1pBx zp^OM~Le$b;p;%ZPOqw}2ke+j$S-eQo19g_EUg^T9GzFjEQ|Kz_^{T8QE(BbmsC=&V zqXNy=p*iyW_Mim?S`SH)so`Xbq8=I@7@mk9 zym6d-mTgwR%YVQ?u%s9)46Nyv=+_8j*Y8mX~7%e z8UuK_TQ;qWr+@rNOx_rb%cPb{pp{7u`#t&&p*x-rFjVI{-hsKiQ6frC8&lXy>$aaX zQ7E^BaQ5*tSL0p!X75rjU{Rd(U`SmhQ&CUL4>Ol*SFekSyA^ST(~bt1TRnr3H8na& z6o*q|FtnB}<66KkYeY~I8nymp9#Y{X9{ACFl@3*y(xEa)c&Yp~Qt}$f>wuEaX=Dq3 zmE6L^&(3mx>jzYd@~L>zJNMejli+zl(JRAzPsIxndto?@nh0{4z5PQ7Q^qbLbp4!B z8`oISk)M;MRAz;YF`TRMuRL?DK9^QC_FeCS0cb6Zw5I$rs)PvQK!eU0n_Uv8Pre`X zRV`89wj(+&UgSUvisv{vYn(9kuDwiSTHX@dpL{5G>~>hh#f)gRQ9S$ho5wT%I?n)| zCJga)8`sAPs^Tx5WB?1el=}1_jbLQ!7i)4K8pZ`lBI8Me6**H6U?F5`RD?H$Wf6X7 z|KLWQppmR%I6w49=DU;`b%+wQLi%~RC(%wL&_`R=KVyg9R$imQ-0?z(iX~GhP}Hed_;CjZ$>Pw z0Ws~AMPW81+Y2h88tUolp3Jy=>&C6o+NO7jV8!#)(;XRNPzAq5gjI*2B8NW6JXr() z^C%!pjC-?bENZPR!-tE>9nE6tXq9G*2;Tu~ylx&z{)I~UZyM^87#)o6dBjDSl@J-% zNDmeQ$x2@Cy}-ayc+R8+3EURqG%0RgN`+$eY%$7FD_8+ngj@CO5p3++HBKP#Zqjfs z7XhENo@6Me60KX)935Bc;=T6<;(dAt5A55UN2*z>F7bIyxHYXLJ#zbKWoRu(2~@=? zJXEmmaVa4q*I?*U<)79nNYoHf;ORYOiKFdqk5~WLq zuz)9NKqbm+nnW_H_|SqJc0tNYyG~V+FrQH(L2_#lD8FYtfKX2>RpxGwndwS~}Z z(9sJt9BDK`!>EFAmtz{2)mAXksxJ?r-_W`)4jwoFtjDAC+WELWPCq9Rh~?m;hrI9< zO8eoq&C%8d9m1nM69~lX2sj0c0N{Rg2+-Bb8%a5^7kJU4xRw0<(?9V+&MCeYU-{+> zv9^9Or^Bp`nSpcBvgh&m&42UDapwkes&5mXY*^0z=?N!K*na9t%wP~YZ@7=J;K`#u zq7oZis^l;yRXp;dM~VUx?UEF58UXVYO8J^Ju7@m)Rla)SwoQ4AWGTfm(!ZXtxYFPQ zMZ7M&z!lLf;jLkAB(6X$-+@@fBgNgwAalYNjUh`gA{}*`{l$FGYo-GN-ZD}q9?a}= z=z+ZNH8h+T!yibT#H*ojWswG-9+JkTG>c?RI*{j8cIgnXM)#+ZD??8H;G5s3r}kzl zD%X1dV-K*8XJfPjLuxyvi*$3s#E|9YmpATbHOvpB4wm- zD4}RDd5<&H1+qr9iftM`y}`_devS&QU0fZ5$bifYb2yeg2 zh+pbfHg0Ug(;bih@rA#L&wT1B!q@$=e8*0p#Eb&y_t2re)UxyJ%+4MisRWkHVUR z(DbbR&ujXmV7P)n4gIRPJz`BjdO{NH2*6c#+>@|`ZathO9U!=@yp_oeH^?9=b{P=H z1VIWGy`|!Fc;N^;EteE{e9r{%{2o)_e~Ugu&r#S910!07KJO1~)e~@tkTx-m`$su%lj#xJhrF z@A^FpAjFYX;XVLC?p0=5_*;M2F@;uDukE;SYEG++$`1mJ23H>lYg?yIBaz6Id z$FSVri~sar{scVK#)m)tk$Cv<KnO3wdugN>zMdoO zIN_;|NCmv&xz0CeXS#{;bZF1!JY)CIzVHn1QJ>He|36W08eC^~9_YO!2(AFJ5+n!^ zAV6>@yV=dAdQqzvbxXD+Yqe}y<-{I)6ql>wnpCQiN&Y11WGYpz{FsR|KW02uoMh~= zBwL%OrIuQ~@9gHj?*u@Q0Em6(PULysL&Zl4?O-*?Wt?qcq$`@tgr0`z3apgcBae5zqGd&=`X)H+wN}j|a1&hiy zZ>+4)OiMiTJc|;oUoiZ+aKx&fwNW4GM!{|Wt8&lCp32@^W%`3(%ny2RJzwQg8qms2 z*674FP@43sVdgw{m7nrVr=hiLQ&cyMM#t7xo`)eyhCzt0cG(LqKDGcVxTeO+n9D5r#t zQAiD&3|B({8qvZ#4NhUmf5J`0;eHH7d)ktf(H7&X+~%0|VE_D$ThllwXPMHr4?0~G zZ@=>aBXXNLg==kGx_AkkF3+lL(8kGMdr-*C(*~Y@@~7X5bEi(lT83AsltzZHC;!zD z=AK_lK`eezUDXBVoe#%y<|f?ZxynI})1}ZRH_2#|vX7-E-T_C^D_lo$a_+}LM(V0` z%)9`3pzLjAZ0lS9_-fqme}%~jC%IfKaI9+@JRA$bJy-zii{m3f?VI%7r*`0FGN4>Y?prWGAV*}StV}h z+?FMeCnfc;B+rx`qk`5U4Z9xNNix4PzWc*>V&9VjzX*F}kqKxi->{s>@I3{cM4Pi& zIb2-AvN%d1o<&$N8kZ&``QA+!#(x$_kS}F*2y?FC`wDZ{E7HtIL0^1Vrm>*FP{kfi_LUDp>#d-5V5WqsHQUcJjaa~rH7pB&uhANOIh6*ik5^ySQ$G^=H zw$9wBi(vgm4SebSI6TCS3ulc8J(1fSEMWepl8Qu?uO5JVbua#=5OqkvG@-`M)&`XS z_W1b2{mdt(C1dM0@K6~WAKAkQxvSAnXtJw)J^Nz#2B#6(glVli_qT3b-Qxvgle>>=M0UCnrhlxgp0*BMm?4SkK~Jr zn&iz?nDQvlH_D=NQGu%f0YSc`m1P{>APwCFm! zA|{nt{aUM<+fvrr0%v8fsS@ixh8Wdqi_uadSo8BuarQs`glc9YSgl*3F%G(cPVZ7H zP`RiWSi->#JCI3(PkxY%oHSSgJd|y&+3IbBm7q4SS0QJI3wSW{VEXQzcMe1wr^s0_ z*-Ve`x(zKE`C1CTPh+&VZD>w8r13F2Gz6{JL~C!i!VO2HJ*Ev<3wkfEI7L;{^Box7#EIw98DWKVs!9g z%6Fq)72o>OlP?L&b!!`^FSM+KcqK_%kzS;m8X6mQ!6tvM}cPv3wE>L7M4 z-c%lZ{~SZ`-+lQL&Nkg1n;Cjh*R+=W7Xp*;T!wF?0RE+M!fz5MQWZhNdpyqwfF6d! z6_oI<(=}%3na{0wEqimiObI_HBbX<}NYS(L7{g{PuUdx(P$`%>8{p>&Pg|P{7$_H&RfesB#cc$#LnicmZAmhpS%bpR!_I4f ziKzu)mEl>KB9#h)R>LN10f2?AXyW!1;m=P_oX5LnW;GR$(uuEBraTYu=6gU-5=dGU z(MgjC+N@L-@x0@AReDLI3Q3-$F{iT2NP}02Kj_9v?OLAcG$Iw66}yHJHJ(&l8llou z7S~~1X-w*!mT{{JVyak)kU()MT&*#%npt|tJRAbr;Q`g))kuIxQu=*!My}6%lQeEx zLpm8?KChL|8dSMaaG`RN&zzoRF{8B>fAQ!4H@%e%ksvxnj|T^#v_@ZV5A_U3qJM0j zf6&7!s;fC4co{}m4LPtz_Q<00Sy`I_UZqnFp{9D;J1`6{^bRoaV?)lNzDX$WsfRma z<-Iw2jC-Q@{JCg_F2)d|```PJgHlFOgv*${yqmSmMt|>xSVlTQeiswvEL#LVyq0wY z(D5p+ug#ntRs2+)H_~5fID8qCl9nQmG>i=28(Op)+{nljKb;UYfstE*GMbm>p$W$$ zj$b7gIei_$OE@0m*s!s1&8UsEkSi%+YT>SDuJYv9r{IKkumFTXEe zD2t^VKIT~}M-(`+(&&>0o&~EaBMqra9EYa1^*MMY>7Bi&{FDCW4c4;Ir=ECLnF0U+ zKmbWZK~#&BKU{3`1~Q!MeHk@!&GLi%>p%Ib>DTV?puU4Kt6bcv9k3GN^&)LH0mKI&UH#0b^aODpGdn9FU>8otXM zb|WUU6GPB0>6YcS@!F4Hiw>Myb(iNDn_jK>qu+V%C5bQ#8u-9dfz~tnY?jrni-pW& z6iG0Nns5z@&6jOEevo+|{p1T~F zPLq?U1a|j$hM(D+tJm$&^t)Q(ysPCmMP#D_1+G$dsJlvLaBzt0E0fV34XV&zwUV)M zC=#OvS=KU&I$)13g-b8Q5LM81d9S|oIPq*Ix|s4N`oln{}7WF3Z) z#hozKAd*?e>2dX0=01H^dJaZ5_=2N1g}d)7Xf5WdqI$BYe>^@sa+-q#R;N-21cE*V zhH&t2g`7f9T%>gHC-3;5`MCUyXO!y-zBF_St-=%!V8?|i(A>*P*3yXKQb&P_Q3Chj z-eodV2BkPnA%rmI8Ny2Coy9lem46zn!mb(xXEB$GTxOL23{hJxt#{;_b0`2iSSSh; zj{cL7sCv_{mdrmiWz z{RdxX0^68lM4BA}4dqYBLqD&RCt<`tzwPP;b))N9s3^J#W8#H@z~y7vHOKD zP{_24sb(u<22V@*0cXX?z_rASQ7&=n2wL&65&@aGVc!-U-JoiBoRiVoX_=|TV-ug! zhs8sv!W8J4x>D#v_lYNI0itad2wLu zdt8?P{El+Td-;azS6;bq>D!ldua2{BL!zcY%7>2c^7{D2_ z#?Zb8$ee{PhbRDSTi+PlcWxs+GM2R5K)uPCGgsoHcRxn94#i_sR9_fIAKakI9=N0& zS6;I)*S-it#N4}hlrM$35d>w3hK#Z=Wiu;R2BbrjBv>LUH^@1g3fsGv!7HcFKZ zIU0d&VUc+*t#~(U**ALupwrR=|L`o>xcNgvNiv+@6KD$740%9!5}c)N>!+d z5Umo63babcAq1^lb9bw#@Rcb~T^L}1dmEt}EnmjLt!YeHErhL;D|v!B60KQHWEng(+$bljY9RmF)vahB~Bz|!zkJ=K^w6BfbYA?WsR7djB1 zC@*M4A*P{L20M@k=GpGiFuns`E^>6<{v&6|O_uSO8eV$8hL)v;6cF5l|FPbplrqf3 zniSq#o!1n_rNZ{h{EufUOoVxU*UP+8t~Xa#l$zR*NV7=!qDq zzypJpys^CF{j9nyeUu1vzFX*|tVNpTi@?IOoEh-K=jO%D|4WDRhkMZoQtKNC-V=3#^v$A;cm6o(HT z&eNG{;Z^gzO|*|`yw5RneE-MbjzKrd2!NJ?QHAHGgi1yz_$7G}!1XQVKBfKsuQV{las5;_Jt3;(2IRo6zo$iY+ync`7ljc;0MjVt; zsQ|dvSIMU$yZjwMs=TBRJ=1&>IUothAK7k~w4y>N3PQdVk2)Wwo`knD)-U_Jv?@&r z8x@Oln)TLIE8;4nV&G8un`_`=*QZynVVK|LSqrH@FY><9ENU$OGmWF-m%hY>&+(sd zR{(oI=}#r+4YRP2_uc2vFlWM(d%i<>dzjIhgJZYj=*bIl`SRtMrXP8hVlDU5%Tbw5 zQhWTdM`F_!PM{*P=gU58Pl;oJ9E#BtyY}pk&70aV4lAfcpN;|Yt5p zJ3UzQwlcK}ry54Hf>OehwX8%PC#?3l&woCyT)vQnES;V0>CqXAE`z}}I1m;Pf{pze z4d$#3Df53+A`@*`&CFM-164?R8isSLQ10`&7GUR^Vd_*Ibgd(Gb)6!nkB-Oizya^X`L`5oD^%$i`6NHQ&hyP&|@f_w(w(oR1#gNB-iNr#jkrDLx6KNbimrYDYR=EX#6`0qTZY+M(V6>Xu>e(Ky?%3SS zeBYipbL?1r=F49};Wp=N^6rb52{&I&JT-6Hh#@SkvrloszZCAslQbmxyUa{4%2hv2 znUXI)Q{W3jm6-4|Tx(RysaxJpy}%uT8J>Sz3vD@@;u85r+ix1kcaL5;O^@x$SiAI2 z?Cx3{9b0}EZ+2~TZYA_NTN@oKwngWjM}hZp);timsv9Vlyb(QT&t}f=F8nzfClmfY z-=_%&3rdw~?m_xmh_1NK;;GG)dz>6(OsVkCnSQtq|kS`}kd7$_I@oC%vVG1-@0*(wKrgy=v$; zy=Y{mZFI^f2P|oLDU(<@*FL}<^pNX<)^vWfR$-HjoMZ(#v?>OtaRzu`96miv+gqPc zWna{l5N$QhcfNNR`m2d8kL}Gf$#0P(ZNZBi9T|z+W7jyRzKzkU934r1xe9%89~`CO z%)>mQQb)$(F%2Epn1%<>HuQY&9?l;yaLpAIkI9p1SO7oQo_xZ0G=!A>c7AkUor{iZ z1Egd(5cQZ6bd3F+B)6+0S;5hdd*Q*Er1L5wh_|laBCoxc6rU}%%#$YSc;du~*he4t zmdzb8!r22Sj-QHF`n07}mPJIZ)C*MnHiJ0KH;4!qw3fl{TD?8pJ*go2*|f~q+S~$z zxM-2Rgvzk8FpF;tooG$?eP;xVBda@o&(Ne5aw1pYsHlq2FocaK%!*QR10?_UI|@1p zRD$7F$%wW&xj8LlLktQVtCZbP_Jgv1Eq3z=hAan*K!XPiF;t{Frv9!Dmg)< zVLc-NEQ0meO2dAEk#LYf6n@#lgV&?-UyhgLkz-l$3r;M=a5#btwRU}L_N`elIfaKi z#K8zFt7cndJZVb-rlEA9cQ8I7j9IS-%;X)J43y-YT4^Hj#!dWv z;Z=Sw9&plx1nSE#@_WHGkp^i-d?^h1tiaJcAUQ0Q)fz&twi&oDN27XPtO~(?X7i%n zPC=}Dq(Ib=F*m;gMWLd-MOYCj@j$5+L)A)DAG8cQECqVxyLpC#Nu)#9tFUoh@`|*s zH|VHA^Z6RB-a8AxScfncPYd`PMHnE%X(_5Df6F1`P4#)U@y92-WBr;{@#sUlWBc}< z7E7@XezM#{Zrw*7hbs*W{~LSFHd}3~?cK zVfAS>5rdlMRzkrQ@#DY!`&iaMeh`@<9E6wuM2E^t0h%w~P;rR^U&;b$QD)cBu%JnK z<-q~|l%}L(ubHA%<@3Ms6dp=z{NVrneq6uW&5(zuptDe$@D zq`zwz2^bIU6b%jbUyb{-L$ML#WZRb3Xrz^_X~ldz`P9Dn#<#u@-}>_BqMHHo&k?EoQd9^e(F;udb1n=+E&dhJ&6bH6vmxYp-C|19HQn{X<6 z&KFa^A@?awm zcsX{ehtG{7vT$%z@r~bn;w3BS^!oIAbpLGwxIt^er9MNOb2Oh*Y($l&#{~Kk(Cjyb ztVmZtDHIeEsoY>BLnjJitqg@CLk~s5uCL@Wewqx1};QRA&*6VMgaFXYVd+Spid6ytRyq$()qJb49FP zzeChrv(M0o@hHFPX_P+RrmbKaC{87Elv@>o*i&R=GQ*b&T$#y%A67|Qwts^bC0j8x zB2-X%W)hu;M`+RM!LCLKW?wBrJEIBijemOD&X86>h<^J!=>{ zm)j{r=@~++?h|BYF_itt^11m^4;0z9X(NWE#^o}KPp&W$kYn)Ji*RsnDg_NBaW1Zu z19?s|p1>GkxJB$|`{vEDYsc2u^Uzk-T^n=sgwErUHgP}NiOuWVlac}6{be#fuVikp(#ek+NoA)GU`BlEv%avFB-1YE5(!Fvp2bu^Q zK2XtkKaFq@kZW=+dd=3#&a zQVoX`z$yql{|pgwZLv;K^58OMN48ggi zT|xH}skEzt7lzW8w5d?@C7ruJNqC`Xi%Sz;Q$$=0cT3~K!Z2|P7p_%^8nIBQ$RD0a z>p4Y9+BwM>%7MYF&?&Uf`o)>>l$KMO@VCWb z;zSy>hJq!hfbu;HRBEZ9{^YbA~8~2+zc5o$J6~IfEt%@BR zo1$||d+hqm^U-}}I#w^5BVE!O;~0B=gv39gsAuTmj{F<+Y z{rQKu6eh}6jYLE9^0C1h&2OXAQ|1DiSc!uvKd|VHkQs)#o2@e7@*Q4B*_8hZ$ z;`m3gnbDt~2-pD3Ek2wj8tGBA9h^$$0300l7@BNzcyjXE6gvnZ)D0 zN!yW@nbcK{hix%~jA3y{hPHT?(}5f>Cb7F#_b|ylog#Aspel^3VOR-OU~4$&X-G&a z9H$h~Ec)Q=SwbBOaF8aUdao2VELMT0!puA$1SkXRJtcEtS6ZvUa{}YSXYnvvFjg~2V*_nN7OZ)cBGxF+7Zx+@N5O7R(c|6RuY_qx zT#w6&&pekI>rXGpeAI0ebmx}Maqh}61J-Bbi6{2P*>h)06aqL)QyL`Bmv#t<3_pf- zy9`08a@O#ZzrB|QP98a__p8TeMBp|algdXNDjd$ke80O)SUjWxwkXdqxhFUY zD{+*y1FX?hgt*WEEqFpmV&tSk;S+J}8Z;`bTQHRCONB3dRp1IFL%8nW8VB*DN1jJx z0?Rt8uh$Yv)AD<-0i6KVhM8UieVis%Spj5^e<6PLQOf|@o=Xs_-7kEVlCW9{sSB0tT z)04EC`PpY4jqcOO=~W+#*0nXUbL*yThdcQ8yV1G1i^)+fjOpBvg@Ap%J<;0UoCgZX z1H;2a{ZPWSYg^*uL#Jc^Yd;}PR39xJ9eC0Y$C-0|@V$dooS%&`41Xw#>_#YjXi7|c zp*Xol*_X#+0!Q)TKKz%4nuM<>@qpNr0meb3sVW?fPk-b0$#>SpB;!|Gx^_iHO;cQA zJfi$a20YFk=)u6Z_5@h~44kPv*mItVS!Z%Ugr}6v6PYt*kf|ha?<3_2A1myIq4b+p zDt{xP6Cap?z_fVQ8b2wwrDMO#o}_1a+xA1hEG(31zHj}B`*4r!IAN4e<1xxc<$dwQ zEePX2JjaNTixamR_r8pLn(~u3)DP00O8L~4fjst4!zlN|(=-l!Ni%GU^%TXd;RBYC zxz-LCMbTT<7yuByv;pAv%$dt)tXq66p%~8^l+`tirtIv37gojyljNG4nFoObb(Egq zDvB4^x2~hoxfcWO5-FZ4CU(_kJE7e^v$QOI|L^`W4j%X z2~0AF0@{(8YY3}V0Z8+zeb+`gWrI99g*bX5=CMn`f+3`(Sv2L0R0Xea74goc*1I>P z$96#qUO8*lh*%E%Gm?-@YH<#*%61JI ziPzVJ#d8P?g{t_G8JECV-n)dFxQ_p&FaU~}R zG^}rnfAjBt7}u|yV~^YuSowYy`K9nKX$B1k1w#rU_9!BSzku+W3VzollitSbwbI^@ z`+XA4i@4{ROIPuvdMPdrgZ$QrE~K9fD>wXG!`~qaq_#kBXYZrr@v57kw=1!cdBlss)g`L% zEyTs9$`RHpF@j!PR%F&>P%Gw>f9*LloK8x@ch%e z#$CHn5kA|v>c;?y1;&abG9xIn}t}oNY9^3a=eEUzo$v!qvY}SoecrMyIHpY{m zeK8t$J{2FocRVhBcrcbQK;kCe=)l#HIFARvXcck@`VdyiIAw$DF8_csWH0=4t?;?{ z7PiVHm5Se!zS(f{h$%mL(EUos{*!OqoAR>IxVduP=EI^)3+;PPy>#)XnoNU>?#uoLU1~n)oWWmPRz%jHY$!8QfS%ySec-4J%BHllEA&wlsKtQ0qlvTM2u%}5Ed_9!Gy9t z=wgiicKEN6YHn!NRM6IaPe;e*ogBxwn_27QF>&<>JhySFLX*}@8Ntvz#&=3^I8Evb+am>#hu zq1jF$^9eK`s1@cJumU=-Bc3S$BnGWy^Pz@>?Z;AB*qV|Go8NgDg4s5N5;~}_Z_IpR z0#HKWKi4DDlQ?*&_f4-y^m31d+@Xl^XuJ~o1qoiuHLgi-Rm5nG>7AJ;n!x)TpwI1> zZ+#U1>fiq?p4z)JK1Hvgqb03w1%LGnm_os(ap9U+ zF6+gJfGM~jiCTD@H?%m%d?2?-L7JgU;N-d`PL-AL@;(X!jT8wil`QvlHwg>AZ)n-@ zxJp~aP{N{yI{(Sq#TqK`VI9I(g_}&0bb-;pVr4FwpsKc>^GI*fpIpW0%dPQe|MOqQ zi%&dSjzB~(%Rs4=9^5Bs0Yz1gl`~8^gO|qiF+P_$eAx$S+ls2{%`R;zs2EN2T znCT8(s@&74Fh7|_wjuTsMs;8ALp~_Ko3DRRT@AWe-K60XIM3{<69Tx}Qs{N&CRwJ4jdJ-}h|4QK_}H zb2`+XPH;sxL_H%AuMEX0h9*pmU1tPm zV{5CI$Mn!pbkOC{jPgBu;&@ayt&d*XU_8;sl#eMP6__xT&Xr9@2VATB%+uAxA&~-k z-L=Y-?ms*)6sqLe70WRzjrgPpE=4H=ZG7n~zY#Bd>DgF};%;wT6_4!diqHMVbMf3) zJ{N5pyQ2TvP@Fk^8jsAgsY(6tGowt(kaS3jK_&jA9}T#|Ge(kh)9@47qeoIEAF&_5 zXX~XezsCo7z80jGD*Z&cw8Hlnl(6tfJc7Rk$4Va2*^}lq;{U0jOht)v#e2?FKTITI z7dcfO!G$ooc*y4qU+AmUf4CIZ`+&yOJqyNq@$9AHk}mKXJz|U5}zaD>9CL< zPLsOWGe8~}okeQp?3ruv&fAAb<@ClFXB_ulo1)75Qhap0JC1W`$zf8sV>5U1RH#K5 zjz&#-`^TcXaYMF>-r!`xia-A5voHC;R00frVBKi$GRfz1Pd}AkQz+kBm{J#?WdSVK z3DW1%3sM>ReRB{pr_8Ihts+e8o^MHv5@7)jma@zOA>Kye*!q!2M)6>+ZRj=oVXc}K zjD`^5Uijz1ns_Tr;rJ3Ur_M5b`1}O zhX}Sn$iGFZ-ir6)jTA&yFeQLeEeK5~b`U>d@=6=4+|H@=} zfP{?6=Mu9a8$B8S8FtIcLkb8C6&V&bUwQ{6FTtia&fc}^T~7*ih{;gkIM!K)PFSmo zS~&Q*LR@%DbSc4L`MTy|)Z1)8(~( z%4g|8u^ua+6#|k}GAQqrs?pN=VsB|ZA?PZM0MiauZfl&Sw+rr!Oo(H>W1lNMYFrrl z(ohlK3$SzDNqfN2mOQ;-aU=hDKT|u>qqC$H>cUvQQ>d5^)^o5ZDtjeau*R@7Abn*) z7@vz%*QikUJ2~_Lqs;L0hy{8I8vZt=U?HLTZ;N^4UwI_kk+`3G@+HiCZdp6<6;P~I zSXp170!rFv5#j{!B_8?+7j|PbZQj-n-xp6%*&wgavp0#s|6IKLkRPR$A|$=n1Dt}J z^vK}{Rlml2UdKA5T@4v~*&9%@HKfeWA3qJ;t7F%rkCOjw$q@1svPz?Sjh!Au8YZc8 zX=>ldp(RviS2b~(Q(cS?T!|lk??;?NyM+lxReAK^3XHuDhA$j?|6rU2ek-`nNQrn8 zC(0>DB1&5&nu7v<;K`R%7SXl5)`hc2@SZQ$VzHaFP+IQT8SgpO>QlSgQppVvMt5M( zrL)}_pO<6&4jv(`HMWpBS#CMJv2`1{${mlz(8xrbJ$8t>?nI@a*X@MfHGb~UpS^2G z8;W>C)H3I|l5py&qsMb*w7Gbrfp%8ROnXN7?HHx6f64+Q#+c4gJ#O*rZPssuAdL>_ z#%PN#_hQsf{xSk&0hfFA%;Hq4(4jA#3n^HjSa6?$+~Xo z$TX~&R7PY(R{n?PjR=|g(Rg+4gSs&F8(%UKZ2eRf)8ph1ohlSSzJ38r;i?u zLC)nqcIa@N@9AMaJ2ev@eZpQIq?`nr50oL*(B8n8jJBF0i*7Hw`ILS#*`?g93q%LE#`56|V z2R_Kupe_L_kW@rkYyv=`t+4SKDuALhT!UU7-Vw^pYQe?JN>#OrRU<>IUx9QNq-DWV zGJ^t~a2$Cz5tmiDOwg&I0K&c7Dq>ab0OK83QwXrSYf@5PJH zJj`6v0g!6D2|^S2sDva!r%cV=Ku7`GWz{ul!HH-O(#`@D2tlH$V8kAv!5c%Ff)nT9 zE?PX7xzSa?a26|TgmAcwFFslpH)UlW4^75aXqzXlpv+zPE0mI$5R(3FA(PP#XK^bu z^^$$=6g{2d(wV}kOu>^+6Ug3z*3+~dtWgVg18Y4`8AXOxxXIzk_z4vFj%%f<(s$}Ni-Pbs8Q<@LA}m^g=nLh*Iz6v7??ogh z3;Xy}!%W5FJyqU@iM@;C^E4`R8XNTD%c){F*n>t?PG#du!YK^_Xw1BzOKjqJJ7L|= zI8TiLQ#$Y_-|^6Q`GjY}E5%SLM|Mu5w8d)*0$^(!hWz8++=bq!d(MJFghC@nyJ^H4 z%^DuY>SpcIkev-R;Gzn?x5dzBxhQEutl5bV&(yc~?g<8T) z#g*O)Mv)i1h3mzNy zMAvQ&J(j>dr{+=Mw7qnF`)jeUwJoNuU18`#W9)kJ@p%74A9cA83|H174QK$|#-R5Z zDT|;HX;nC=FocPqRrza(EzqlHdy5BUjCoLTC!fu7x`HQ|jWVa(f~r*r_@*_r@WZOu zgh6qe!w=qn|9w1lip}n==fIOSq$Tdg2k#z@Klr1sGt^>xy!Gl^ghj8$6rprg%&B9i zV&LNOc;PF*MJi`S{Oo&cNRQQkUTMa{+meqp8Q@%V<)AXcpSR%c8z^zdh@>KMFt--R=z($y)37K;856oF z9=Jvdw`P5gOEuOrh;gy89pg!z#b-&co?Npu$YXINA4CRtRwa%@9k9@dtS1Ffj4zLX zgeQ^v9i1I17pyg5r^WIYAaa8LX}P;VEl&TID6CeM;Vtkm1m=PDdMR4&r2>x~gA5N7 zkSUzPBXJp;C|&`N2NQ-|%}@EV*hEF5C*g)ws0$XA-!oTfK2a+~C8)=UsAL_SKE!tw z+zJXIm&G>#<388u9j8aY)iVH4p@9tJGJp+$v}RTlN;LGQ;&q)`XbR~`gqs3b1K~Cn zwKI72)I1+~Q&(3K;4CwhS2wJQ?vb0(x_xi_^!uNWmPSso0g(zO75j1x2$)mvOJQU< zGS``mD1#QH8pceaER%Ar&rYw3%OyBlg%m`%3sK*!&~)GkMK|;dQ?5fH$uN*(f2@5K zNVj0F5`j9le^Iiz5CI1~q-mg; zr0sPwq>3w<4_Nq~kjVY>i-J)BBj7Pva*v`-aA}}uV9IC;Qge29;RBVJ-hd%>J>we` zUYK&Y1wF~gdYZr^hqH}GB@aG)|#sk>*H(<*w6MZI2?j#buk+;2I3r!w*s zt#av12#2z8R<4noISK_|e)9wq?~obe^bc=Q zevytN%5#T(i8mGQ9Tcz8F5$0nFK#t}e7VOW=-DUhlHOg1?`w>uNML{Rhm@=wvbuJB zw4e6A+E@*5z4Oao#0C^Kb^qF`!Z3-CnN-N8WO8HSa; zpZK(h^ge}S=E>7AfmZ-eM$AmN_@0Ge_P#rdo!jxZZH!B3r6VnHaWHmlZO6c(xRYyy zeJXb4JusGrHHxLXCG11_nn<@rku~_a#*wt-K1<=21S;Qx3k)p1W%;s}RGTu_>ouxO zRoVT+FTCe>xhMaVUj>=Uc?mGe&^Lc8|FZ>+d*3JG={}`zTJiuWitipjeZbv&9)U-4 z8OE8L9Z$eZ+!p*8x|P8Viz&Spd6EVK!_8(cDwQ+g0yZS$Xn|Idi;-dH5lC7|DpiNN zYo%yWnJ-qs`;v&cIIWhn8hKAR8oE??*+yZto1Ut~suwKtCPA|{y-!1F32>075GZ*m zkeWy-0LomP3Q}vF{dh{p42pI!_gVrmjL}F?55oE|r?8N~Er6(AUB^I>^|@DkbH2y*Sec{4196Y)%*8O7#|GY}Rq8gDp@xZq zTqaA;h;OdKGhfDOIkUiV;q)Z|Et4q(>mfFcAw#EHuhm3CQUG$lyVFcT%c^P%Yr5cNI7>83K8sEmXklMXc)jOtVo=JTGy-8Jdq*dgHe z^{DlJ^qKO325?ptvkt?a z8vL%&>*R5b7w^me_}#h%)&Z|APN7bIFnN(ttQdwG6c&~mRZ5`=EEKBwVtvX3jqH2( z8ZdH6S%I%zJ(~%+zj#?2V!IU`k0{r?ZVkJ zQHf#K(m}r}Es=NT#*rr$+yM*V&B7AaIxg<3f@xFM1UN!gdAgYQ>Q_z6jx_JIw@}FgM@DOu2M9a&p^Q-uipz|)Kw~TE;!tL%k%Byz)`XiLvGgF% z3n%%&qESuwdy6pifWsp8XkA7+f;>-MnRP&Xe@X8UEg^W3%PMW?MkC)VeRlRf>G8c! zHQf|p&jyabf)5k0+yf-Q$o$gZKac`J3ey{Pe(i0PkjM}qX(gjzJe?#%zbYI6A%ZMq z@DwCN)>iB)thB87QW8&wkh!n!z6@i7^cZJgYEe6=LLulHWY&^<72p8Zd^O+mIi4P) z0INjU7XWMF16+VS&Z!m7do>TUWO-ezZfaw+W%TD(X5 z4LM~2d<*a5CQ5G_uW*cGv!-SyFr>-Xu}3Fo`JM;SOOPJ-rXn`ntFW=jUQ64EfL^7H zEK_H`8$!Evmth(lc_=b7AHp8)6IIYN+dvD2M*}WnZ%rs;aaG^E38Eofx|pQ@$Pl9x z5zrGO*aZ|pFsf2TE%8-CWIm(hc}vJkU`-JA6<=DZ`HxhCVMmd!;c$~@m;6uh^s-P2 zg<&{!besVU5W8Vh2byeVO4w(=^yT=^-~ACID4SSUSN4-zxooJ>aF5JnRromhCKi-! z9EKO?vHB-5xU8@?;!#d#BFceaNdXNO@&(>C$^e^Y2+I`VG9AD3ne?T_&c~@7{VfH_ z1G-4h3Y3afg^#pk34{tpCgQEU&wLWSLJDsb_!K5X_(SU|8=3bu`LY#6h-?p$4y8Zw z>iVV>BJA1Gk>=6$hHWu%;T140D@{6B#JR6k2uO>aG%D)|zfWSQR6-M0UmGGcBEiyt zbLk3LwuEV5z-nxGUI zI`8jVRm>uR6({YuISmT0Q*LRz`@7FdZ-~D&p6WSeZSc~$*x9-={^U=-L+WcRy4spa z)!mQUhqlM5bN%tJUiy>x+Sk7h>>{rAPcm4gC3??rLeB~2zay@inc8=bFuMQFQYGy| z@1fj0K%;9bQK~Pmh#!3a)f~*CY~|LurVrBrV9pPh{9rwo^|91-Bd2$Q&(tiI%LEjP#KX)UCuM1|O0%Cl8?$wX{Uiqyvqq1B6BIBPFM_~p+dqMgHiPwEu6W3ljJ&HlF!c26@;v% zd<&D`Fu6)v%fuYF#I2&W7)j4wD|_WCrj<0e#pbq6QA2fO9Vc&8ThWVEuc#r20C50b zK%u`);th|WAje`HrDl_U#XPwZmhY)Uy;p~FMsxSsv$3tMHXh!!RW8RfFQXl6DsF%z zdysEN14Hf?SJ1|_acv4qg@U0c1>WtO4NR`GH`YN3R7WEuZ{INtVsXSQVR1r_ge)g5 zj9?D)M~BbAlmoGhTuePi!rGRN%wQ%IL-?$Pk$PLVGAMjq8}Q=#$?+JudMWRvr&5d$ zA`qNknV}Q~BFv#H4~mJWH7xNaY@Y2f~ylBzkkS3SB)oJ=!`L?divN z#Yb=bGQ-EVd6>6RN1DUG0UjquF%F=HDio81YEhom-jF+1aIw0VGmt<=Fbq^hv4iK5 zPBD)ab&L=%v{fQM2y5w+2k5=Zgh_W0o0fYvQ<7hKU6hjx<$4XaP^-fsW&~s1&@H3O2nC zo-5DP(jLRZF%%RS7S$P+rO*bUZy4+Hm227hwu<5?jaBJUg<+mrT3{>s6#BX+!1fD-|@t3f}Y{Wqt5pVVfCtk%3e+w&#K4HnTeb46zGoPu_ zFqM%851+BH?4+2(V^)szoH-V&X=!=-k&V%J_C%~{VJJjX6Gus&j_>^GzlekTKa5u9 zB=6q3C3<>#;?rOKc8oH5^YH$U<)KgsIM#?LX3c zZ?8u8^4NY`mSSvy#3EC@;oJ(O%Mrv^W zGE&1{lDFA);sji#Qvwd;8@MH}6Hn5Wkqci&x@?a#-8K$CRDgH&oa17RD4BYbcT~da zIqB1=u3$?!k6brGWy;Aa!^hkJ06+jqL_t&tffKrn{>{>cy5z|5Q!Ls-g?g&~=ucf& z6YFl(r}g5Y)XSO?cPcQgK2Chlf>u#zsoiD+3LJ%up*p=3!%RLjtvWX1--{(U1Z)C^ z%Z%+Sh(x6A6~&b=g(Kd39>pP{rtm|EsJOF$1;lzRlmJSr21Z^6@-u`6K+IdrBHRHz z2Z#%NtZ*hT-Q>u$dmv*)ZCh;EMO9?y7N*&>5ymlxrp1f6o=4H)1=?&qHZmB){e3Yy z&`0kV1Hoae+X&H$#do7)Qx|hVcSYm&rl?tZFMf3NK=hwK6_4!vVyvttKZF5bb3DOY z8nrq5cCiz#takM@sgmPVnMm-UgM1RX6A+k9=d1&H7!@cW3EvZt8pvg>t^$V5RUnT7 zGmNCCALUdIrh@j5PBWC^a_m1raOc2*Xs0RMp#jx3_0h3q3!$FQ*s^JJY<}$dm?NA! z)OV4}&&$XJj!wdPB>m^rSi@ly0&5pLpO67N+X zprMX19`rFm-fS^Om-lTXEZeYgXBJIKe1@kR@!F?mnGuXqFeI%2UfW0k2@1=cq(VtW zV3n#<*%XoqGd`0+W|;&u${MRlZIn=*LQ*jaQSr|lOTLrBSDZfh2(_+I&KwVWN@2`L zeoa#H4*q}E5%{*8lNKw26gtiCaiQrCg^KvJCC)j|=GJ94BQ09j3(*++J^kFUl>*lp z(h6KXgGy*z4^ciaYBY_f>ss`{gn>~L!~51H^z>ehfx$8O%${m$Gr)}ziY5%kY-vL< zt|7``t$>AvhPKS(D|pPKt*U|Uf#r2*j&)>MGeL1{qcqj90}uR-D?G#U&mx&?Fn7Crib&(fJF zaHhD3Xq0?rB#%o|XZh1VgqJiRUeX)pO^fh)shpjjqTp!M!%G~2dp+&|`!y}=#vV-3Nc-lwjacOvQE-kPfzDk%IP?Em zyfQyg$^VIG_v2ur3!j{b=Kt!q$wjY>zxucTXKdT?aBO74lr3RLj}FD_ue}?ed-0hV zxNtVwH*b%b(d%*L^r1X!W?k7h;xt{Exr)j~GZZ z%xh*8E)I%%NP`IIW2_rtfTmTh$RwQ&Un)}RL474nsc+32UZk%Q%0?;kePx@q z9(Bk$dDjZ>bPAF4?pYep;PAVqs!Xr=zV}Ey2MncQtGw@{BTMS>ZWc6G)YsO$G=YUQ zMNiUw7B?}Yrbe+cBX)3PGT!>|D8kFiU@8g;OI8sJ2j(E9^s~u8y8FIVwpxrL(Q%V9 zl~$q^$r7*3ETUbU3-Uh?r!R{|*m7gN9siao1d!oeJrfyPWb0iTg3=H$rz6q&ObLDp ziy{Gy5*%hM*wDyGEUjygO?#e;z0ZC%p8D*UW6Q3`sS4cyaggU`&qG%)#>JESu?VNgRLw7jgFBn}lz#Gk%ak9ORv=2_;#au@X-O*yhW=REwjAC-25@eDU)b7q@BH zK20u@JSW$vxD>WtFEJW+m?YFZ2O`~F%92D72xD(r;u#{9P@r%H)*QzOmg!o~#)gqW z^gRT|3XWN;UCp`8YpP>MXG=V~3y-(CGmc!Ch}YgfO#X2Z9{V8So_FKWf%gzRw9w$? zuiLmKmaXRS2tx1oZ6 zGdHbQWr#`(&poegZlMCOjsw}>W#|J(_z|L=#A3CeE-!#VypMuYk5A#1ld)150Wj{t zM=9{Eh?coXV#W7g`6w1q1h<6ig`02d+DKP=gn2LsM!EC@x$r233)e_gzW6)g%;$dB zVhV+-LR*taAI)c_3WjkOLCY)g;Odx&Q$w}Cp<1hcZPn2-mKKGNIa!sg70)VBnG8mP zUsi%EJ$b{gCA^$gH{a3Ywb1PPkevp1C|Iki`hfY(R>dm-@W7#^rCeLfd|UZb z-0At2%2$*CxDhAf%_2#0vEUgh)HIajVbeDXBSVoHf#9ARRFilkCpf-uBi_k66av^z z=xV?$;3d5QkRxW4Bl3(qFPwhuG4r7cJC!Q<_Tn@QSg*KFS^|$6tIj7E9!3N*+5k?a z5eXpk$lzHcLBW{!!I+V56u7>Wd(yMFH5IUcLuDOr<#qCi^yB(8OyzNp5fxt2vbn%Y zydkgWX27P@aOfRcOz3*OZ|03Pl#r7d;^f)NfH{j&S>tUq+`#Z$TpON^V`qD#n`7@T zb3E*&^Yolf-HBl=@S6HH@$_@gM|(X3MDQZtLz#X0iASQVs~rQHNq^*lmx8;?SD~Rj zdpM!z6g3%pW8Wj&IH$Rm2nF+&869ddt&vArNjz%!8ER#*?jq$}8m+8d_}oYNX*^5E zGK%oj;WAHAc#8LgA@nmo%rT{1+tWk6b7xU>?bwld`%~11SZFvkK1{LM5)6wCRsn+3 zh>wsN8kF9{6OqO^hxvmKkI-UuAPys+s~9HoIA``QU&P@-I62Fz8#yH7LVCaACyPGW zk9bU@P5NN%8bNxh8f+?6r}J4bD9yN6_f`gZkncthWsLyoQ`4;)Z+g<=ULLX#QyG!h zv1xfh7-)QGP?=Uy7YRWluF|$qMisJf@-sVDFuHj#U%1U;FLPSRvN6K9^e$G=cXr|O zmAJ()j_X6Cap^L{5CD+X$QeS?dY4hyh(|an{2WAZi*a84ksriP>Qc|GfoDwN*1q}FB~~^Ag0N6 zZQcE3YFJmEypvK8KowFEFe3lYLO?< zN?S=)YfhB`nI%syp_e?L%&k|H-aZL@E4hsz81k&6IKk>sm85z_q_;9su%m5PJo#`J z1sk7^pTB)1e*DJ!@dzivY{mO|{pIh+Yd`r9@!0dXDG=AK=THEPM^I4GoG0$AAbR57J&w_Rq>%-4+(DTynggTIibLofZ6}T$ z-g+32PRPSq*HfftARkkxsTwd2{*Z1IDyC4Zte?j)yE@R1Vz0@RMGb2)T{F(S zXHzUH19zdf>>1V*2=A+X*Q3fJ9$@JH?0a-idh8Zh8oqVx=MBb;I+)=G;}1tk6FA>| zwc&s8q%kecR}<#bJ95gI*1u^KqXJH;(u==)V>0?Kd>n(Ub06nuyPgD2;sm$?5AnYE z!LfX)5M3`wP_Zi~7IQywDoq-F6PJ2uN%JC$>lK{xP~uf($mi0Z3RQt8-|?UnielM& zYdBiCB`+nB01IhJgC$d2(6Mll9+f%nyF3lUjBB`@&+v?V7WCo$+>7v*PBpkvmbrFl zMOxQuTEulKwiLYZv~;P1qD)fpmZ;%<47k$f$;TM~C~xkwh}K07Bx_GD^p3=-GtBQM z`czFtb{&S<)b&0Fi>yl}cb>_7{nP9luX$(@j>k0e<;>cx!l~c9=>3XJO*`5&9V$FlVgkLo_z-V z-J`fsIb6pSs!MSh`rY@)KF*&0GP3q~{QQS6BM0x}Os$Lc_p0JeYJ+NtXi7`MskAkg zLPB{!2SI~>A*CQq8g-L~gulwrXpVo&_bJPGPkod!1R^k+r6YO^cw&xbqEch46ej`+ zHeSYP+5$?d!^jcv%YsAcN_5KuL|~)?=Zsf0)vtcZFo?o019;?vY&V%ih@LxpF>Wce zAacDit0^ZrnA*JLUCPHTC~~t}l@h7t;;fSYu^4_z$P%X;&_nd0-bdz;uv0)vU@(^e zk&#q}UhijmM0}h~C81C8e3gC;xj}Qzc^VLviN{cW*T&{!^S0Gp=-sRaB`34SVXW) zZsC<-U#)hne?wii2|1fu=F?j-1aAS3Fj4vWGFQI>3(hr9;6>emh~q9NS2fner%=St zedbd!ilzJyKYusJ8|oonIkP|Zzx9(CnW7(fO-ppryuWl6eaTZJz}#Z3RTTe}{YtB>6Dl=O=q*}eM;jx+c39U2@2oHz7rzgv^B|ep(4C2r9miU(N zk`B`ghTi6) z5D(Ik(GTC}e_V%h;QbnC({?1+RFs&leK#_tkzsT$RzSYH|3rNBF-0vHk>-cxQw6F< zrHV*;^*rhZgyMQ?KQ_=Rwt*9j*0;0}*1Q*g_p^867{fFMDdzE%t?q*-h$ekHHZhcb z4n?qY$4+Fz4EefiNh`}6TH-;-jq&Um$1%A9@iND_Ip0W zb*mJ3JD<(1xEF>6eA!*{LF~q$6?Udcli-C;q@$rbv`Q$oVYp zbH856{*Ay1YvHlFjzYZ3n&@Nv@Xgyq{s7zI3o zk@e!%k+r7qT!BzimsQlSs(i_+E?sjKjD)EGnZVPW;byiArDebuMo_pTE}4Dq8VYe4CQ$}E}T9R zpS<~#IPv}uWBBqXF*7!p3S)T{L$GNvGE}}`y$fi>0qcnjnQB;A#;-z=$&=V!Pp;`6 z@R>rG%>pZ|Et!aWsf;XWGYsYQ6cuXm`mwq}p2)ST+7PBzmWoToEY%D5S_G>3y=6;4 z7_bsvCix{62}eO-kG8`v3}d+F1%n0M1B1}ZJ4ZedMchv1;XaPjYNulQZ-4RzML0bi zY~4W%QZwGk!T9Kn|0kwz)7Zabcg`ubwd(F1XU7Tvm?sICz2+n^AmgMf1&vBQwb;>g}s6Vqhy}n9mQH-$3z@{TB)qjUs_i=q_kY}O{SeJM=I;3LC@V>qEhC!tnaRZI$u^J9n z;CZl#sTYGH7 z>a97RaYJ)`Y-8NtK6*_RN5fYK5r}JIL&w_aYHf&`6^mkz#XXFetmE9=+YDCO+PN;C zdFs*l=I{M>{J|f7AdFi;%)v0pNS8Y zqE{;P*{d*?C{r;5t2G!q;-VDu5jun>-LDsUPg@St;Nvdt--w-bsF`9!OS-&)95Nc= z^U|Sk0esh&|F1Ilxyk`$l;3e+jWSZ2&~SI%j$HNn%!#u`qes4x1~&I|Ps+Vi3fxaV z7MIEi?_ZQzp+l8kdRNIa8073p5uUVwVz8^hS@atHwJ2v(CVG9+!|?Ty7@fIGD0rM` zBd6RA&%}Wvm*e%1&&T;I%r2&=RGL&CIip@06W1lu!-CxedsB9~UUQ-vH)WOp*K)n< z)-e!=!rAqfV$GtAZ&Q@JqT+7sU~Fdlo+qhMsbNUZT6(G*Ik&kh_vR$7t<2|c*+4A{ zA#T0Hjm){e+;a_&`DmO*emIG$v!j*BKvk@Q=4@>pxZItF@D;{H8m{()GPj^?(hyKK zd+15o2%^!o^PdK+(Gq!0SsrG?lthg{GauzEb884c zL!QS^o{X1Y`!H%ZJ`un5yZ^VQkw3rXlmoEE4<82ZBLGtCeO|oI+QIR2XP*2ttdqxKRq@ z1cqw`D-LU5VYwD7y$#p;QYbhCB!_C;oQjAg^m43XcKykSUV|`qeTH+zQ_166 z-3@^Qvqp-AmVukYhYsP9(E36(w1s;Xw>T+EMukvVuM@sB&Y1c`QIRyGAoT>Ln;1ie zxQ8+RUU~ZfVfZr4MIB;clQM$GC!Q2s=FkC65!C#Wf&n2>mRZ*7=fYZ}EAbB=_(uND zFS*C$WN5aAH93~h9JrAWbD@v|^vZl@_ODl8&&f!(^%y;}y4Vo4IQNvIAqoNQ}-0*!zfLKy7R`R6IaF}z-5ViXp|0*Fw7lAZm!eNxR$x=2Mrlb z@GE+NIrs)R=-r>hbN%rItonggxj?~+56rVe~5sG)NOp0a@V_4+a#%ZB7N|7GhSc(VFAjZpS2 z-t^KIW+*E>Js(>IY(b++M0KFD_gZUIERs?NWucq`mX~r(g{s0(spKIle0Rai(+Kby zWumgt`D zoQVJQ<6olmnxRvsZ^8FE4_O`VD!8!7y#jCVn}!f8R$pW|9r)^eCwzkg41jm{>gQB^u4F_)|4t(%&tgLIo zDInqmuRZnLr(*>$Fzs{d#7XL0MsP4%qP=TVkU5P{UVAU9nJ0p-5 zKe|4N1k!s@uXr)s+d=sfwG4BI{E7Xt<21;7tepZ%g(d@Ph`2ssW1d%IMrG#n z^@y}q71CN~5@t1jD`XraDU;YZuYxPB9rILl4>LSuMeNzJiTSpj92z}CPUS2NIL=8g zYZw{X5vM-*+j#HYgDBw5v4zn6D&ThQ%0-Ge=xeib4`Oy$i5^sr`{Q@>*zQYVpWZ5K z(SY#Z6dtzgKO%m)4;sk(?_Vf3PTMccYk@D_~3QwM=Ho=v-akVRKyz|#egCj_WDnM z8UvH}vQ8tX*a_2=B`Q=ETd8g?bGVCQbAQ6l{mKJkQV%49=^!Z$JKis{N5~eKSRgu! z7j^MMPs*+-;OxY!MOK{>$y!~*027MCqyvwR%uqAmwfb9J>l6t0j9x$wS%^m{Q-j&i zwc$r!dY$s5F9o$qNqj52GJ?T!L!mq&TKWN28Oonm2WI;MCpXkchK!gEY<});-KQ1eMIXe)Md za$kH%9=p1_me$MGj5Ij6`WD9Fp~DwAZk28k;Gf0~3zJTSjZqR|smu~C^15qJS_8K3 z+d@}cjohJlS!iDpXyROhS|01`zC^Teiro8EW=Y^U5c$)C|KNjT@!HGZjd}D{OXIR= z+x-{@26a^9Jv@qoGd4BF6MMEt6|)*{Gv~nbxGTQ%d!Ku$7U8{N!@AhEc@x&PR=!Au zxgU5QhH7&4EI4Q8@-uTUELHL_jOe0OHlQs?8v$^vRNk}wLFH>+#=+iW6I5JJ127bY zLPo1pB`bl6UGJNfl@Qh-vHv&O)PMZDU&QXmo{9hMfB!$?t6%#TLaNEfp(M`7M|csx z`r%*4;Wxe;wFsAWEgKndPz1O@SJ+9E3Mj4MAu3KKCW*)iD(fhRH;1OB=zA(c3EYZO zfBGPaPzCFK(!)d&}cj+3}`Whbg*JGQH1t9!MQ_CC10?-L*i z;y#IkAV2~n`}_T0Lg}Q_kBh~J?|a|peV+gGzprQQ>bOQK{8`TGv?#lk;_`JcQtwp* zGY%qhYE3&Q>)=#!>e1MZ84F)aO40%bwsI#Kum2x8t@HtawDpZHgTZ_pwa;8t%D}iq{GRqwaAL)3q-h^C-iR`FNzENS+|5DY zg$3+-6l|_vJZ&UXxrsi@5~nRyr30-W_shL?Jgs<@EfpdaSoeRN#5dRY*uFiKmDR@I z{M)~Xt-E%j$W})GK!4VDTXy7{q#NVPTF++VDwsC3Zb z{Mz7T{F}ddE!vx??`N%6HrU0e3gKO8RRgg<1+uY9nUm|)va~UQ2Pdp+s)Zj^#hI?Y zgsmN;x-MKM9_PtuFg7gg(v@{_^8I(I`Mwm-{KAXb?EgM7yp~;$#+A`~apmlh^g3no zm_h@3@LAGS3MBs4O`n!1pDS#&IK*++;ogX2Dq(s06rTuxc}=0PtJJeg-1Fk+J{OyI z?V#(^h3MR|oeW?S*qYj-f;@)_T=ByrQ)Fk;A{XJLJ64>VrD4t-`;%c6aK-Yk^zJa8 z!gCoeUgxRRSK>3lSD!15DI~>9s5SRmChmNlTPCXVTa+x^&f=Hh4+W7~wnb8<7if&g zdsNUsi~KPLt`JQHOg!da@g#9wJoZWOBj)BDoRg3hkIe{AdhjY?!)HmO;D9(;%0B4H zJAI}bnybi8YQi-6j^A^=Ygcef?}czLWCBxSEa->pGuF-g63{bZ_>kxfO~ z)~#D|?lV-|w62>T2<8$Rd-t*0(lCC;oSj zm>cBSJ*9h96@n7?p@C$mgU^il;<6<(Q}1Uki$%F%O9C`IOac5k7=%YSS#n`l9<2h; zzV$p@g`5aDiF;FEm=14T)x?ok{_w9s)Vm1X&&5~1{KeS2|1n^PTYI28PQLfuIP>P; z#Pq;vN@KA4*0ja_GK!*cje%}l2NLq^R_a?7v?lxrV6BqEIy4Ez0`0<*O2);;X$>v# zOqrcA0yQR?lJj%}iub?({P(yq>zEb7*RPYAh~{yRp0a(t*RnQKW~b$C>{cs9#5Kkw zQnN5=RK4KvXZypqJH}@e6E;*P@-0Q_V{ zkV#z#I5V49lUQcSoJy6JjBEB9l{{UVzKqeYBDPqG1@r2U-j2cH3BIpLp{yd26$uFQ zx^=BlPFdXflgHvbWg;tAH^g;Hsg9AXRgR!{J%BRz!*O+23iFZ&im*;;6&D%ef3VUD zMkn)iJ{kjjlDtB^NDG!Zrx0iFbWy(e%&yqTF@0M%Hpa(acr-S!Z>=cU>)YF7V|^Kk zK)d7NXP(63S|1%9@C7OsR@F7f`t93OVBVqx)3bne&sH!V6NXRCvDY+-xiv+NY8Q%Q z3wur&jX5uWfTIeoOwbTeK1@F2;WsL0;@KQHs_;y>$K!< z72d=i6#qBhJAub_I?lfPeoU5-p&TpX(&fSE8=8tijH*ryfQGiMG#(<%NnXMY{_OVOsMd>0xRGm zu1W90J@+Qph>?T?QdPe$x~M4XI(v*Zp*!F!rE%nBck}~`vevaVuiQrHpxw92_D!zF%_Bvv550h}QYx|aTS+q1FtZ_@N#v0M;(jv)b6D&zaP-ql|cER4k zut^ZY6=}`!1V`x^FYcq*e2f_K;4s}y%nBvOcb1sdKl$Tt#nCf^@x@?{C3&M0AL6?8#Ng}{##4#$XXcb32sT!}T`wDp(q?Yd_ zC0o9?v}^_eHN$*#xvGe4-L)$YpSnZ_`j6td7hlF*--!EmoOx;KAvnM}EgzYHrC?_0 zD!>$2u9>A!f-w~DAG?4B>|q61X%N4#a?MMO!o79f!YGN05B$9pK9DKc9m|(-MHz+9 z7AbySPT`lyK-n*tY<+cc6k!e8ws&^!+#9nf0NoeQ5i1=6e@EFT@EheroNzvlX&I3M zWEt6z3Ul4+&QoTsb#v`{FEOlUj_TVH{dkH>X^l98g*FDg8Bh0qJq?+KuVul@%=`s1 z|6RKbdmcuS;RxU^oMbvn4EJjPjd<(e$=KRPRzJ#)N}dXjf?ol=QXKPoa7)1e>&={U!cc%xT8 ziutmtSO$XcfS8BRSkq-7|Vkc%CYi4eCy3<#S5^d9iCOs$z&75)Q=*lY3i_NX9ouu zG{i&OTVwB@Em2u^H@@)ezrwk~By%zs_h1bf@GZo;>pC9ekdr~&>xQiq!SpjnP&*Ij zovlRqEj_CM=_PRudK6R+U6%qgtx!IfHd6p6Sna=(h*TL!Pxz?wuEwaZ;?TRZODp*Zv| zNmlToOV|2idVYBvJajI8_TJg(?z@5EHX9y9F@bg4*xngESdRSz!?B!R4vWk|_cK6> zhn{{p?pLmjpZ?j`qiNG7CybJAVlQrGc$A52DtFR`bCmz)8u=|BUQ*=b=X&H+WQwq% zN{(F-jm7KbLm5N?vW#-e=5>@zF2;$I7orqHZezzr4ve8CF?_HD*fbD|TwuSx^S#%> z)BDKF+PHM?OjKgXSet$M;*}_yoSJ>5>*^JfsIK!fkadYe1Ebkpqz?B}b5lLq$(0!3 zM3IejFlnf-%Q)52@6JsdDP3raHMlVANZ2sLHw79%aq()dB2#KXVh+2>$0S>kQA;UP z@6b4hP7lN=t;T-*;psSy&-_J#?ax1ZfPTk~^gpF%G>s>kt4m{Y-~#4;53wEm_~kSZ zU?7ut3fGOAa^c>QAa!e4FRZ30FvVKu;haVMIQzm&FOUCg7Mk=eZ*Yj%NV(ic{b%E<4Fy^a9s~gAhoR_XQ znYTz%xR`hhPql#Gc&Eg08zsk>pVp9qN0>@bj&1B%V&y~D4DkyKz^x!x7?_l0i^RJ6 z24dzT)FGGPj(#Y5iD7y``~Gd~$CmbUwr-h2oX8aKb}id$$E#NDa(;g8YQn-uws!hPHDE_jK8FUttZ&RCp*%7XYeF zF+RKSfO!iqpW)o|$A|O1&q+OB-x|U)86aOtoZ``P6t+g;Dwp8CTaD!&QbQ1 z@*HqyIs4yG>*-Y}ZCJMHUKRGhL8j^NWT^c1ISNIli1j{A=JrtZlfhX>jJO?PcO3_3&5eF!Gui-&0Svl%%@`ifhXhY0Odfm>11j$BgtNeAmYv$}Kl@y3qDk4n06n zZzCK0Vai`lbIAJTv!|$GugRX}lk7!Sf^bUJ6bW_rnC~q45xPPZIJ!R#TNEKK`$OA- zu5fGHaKnRHR0?%9tMla#fLIdNO9E8VPQfjIg}(IyNO$7Ad{4_wMN03UO)LyaaZ4&# zjv;-f8y)z`L#%wUh2jb7fIHUJMiT~=3V`(BIL1kRj-D;O9zH)whW{;<`!N(eKr5GB z;d=%95}%ijEFH8nAj2iTi(j<}A9HRDC+HEVBrMX{M5!M5xDv0K7u!f?x~D6;kG>OK z7klH{z$D80Wc=B`{!6?%BXRWnQ2gKr2jlBs`%Zj-f_bTDG%oa_OkC+9jAFtj^b5|2 zReB9HD#amTR;c5Jq9@DK}W7a1lw1Tm*0!xZfu4;mMCZhC){x z>pMHr%OfrxA+f4dC6{ugSHJmcG}9`y447`+(j1RH|6E)jAa8{Hnkxg-F+y2oSx0;0 zE4J9POUd*!XHcSv8~i>=Y_ONwrW;f9Xu1>hqeau_0PArQPizNx1C3Y)qIRH$rM75X zXf-}=vqrUI%5dL-SGjoMp*F20GRN;*#FMn(M4l3~3Y&dw+tMD-KKrp~A;u*^*~;(A zm2PgN>}imCHr(Me^CdBx4FeEFAhVjK4H|TXsNw6PYryT4b$tA7(v!?bq|2ieb?bn{ zCQfO&iogQg@(bf461<2m@Ff_twoTKAh8k((qFbMvgv(}J4J821eK886gz zSO`Pol?o=A$^;gU2(5-I)A3mz# z5#BM=ns8uVYRY+ZoWvrbLWnh#a%I{*$hybm20Rn*9z7q=lBM|dZ~i3k+{Lp`?4k|a z$8h1Vi+}k0{{qFQJDz#*Q&@jk0mN}j?{j<`HPrTx6_N9~A}RYIvvmy;s0~FF{_`}@ z*s`fL9(wXg>JZYZOUrxYvsc`W=U4akaZRV*Ua~!q?TTo_1%#K8?HDp~k zk|8_&~ufT{|HK-cnHojN6W6n zZ}CshMajMS*i39}wscJ#Kk{yD>}Y3hWmsFiFh;CPg&1&g4XMS$7;jh-h$1BnR?%$5 z{nRT`3DZybbFG&57%se-$pLVvitO?=xR1eU7+vBMT+{U`6jKq&@eyeJ?dNPn3W#xB zfJ4LfP$xNx=Nb3D+S{L+bXVVGob00)HC9IdiTOI!Rc_R?n;44X^95B3>Y=wemjO;;i$) zG|7MX;m4x|#jl1r+(b!O4)d?Xy?Bi{w&hp59@>qUtOk$GLTui#9Ue16Y_2zkuj5?< ztu|7^*M;$6=6TutOx(UXNZmhWFSwu^i09e2y_y^cUHPux#JG$hVpwEM9=>DU^bBQQ zH{c6;|2(oZa~t4&^1`J98{|ob#KdMxn9QjV2NX&v9Du!aVGfRK&ayxRf$(r�$$W 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

h1gc2t2RP%eG+=4eM z3H#bNUd*+XwYTwl8Sk{`gW-lSOKWSbgOlMF#vw6@wFqymV-_RW{&uupaLF66D*yQj`eDTMdkb6;J&?q5Fo{tSwGf~$k2kYqkAuf2Y3dF|-&>6-P8 zZ@s*{QDSO4vEtzWAOAmI80gTUnv!(wcV9pK|8vLQ*0X1C=R>Ew6V8J}t=(P_o~&ay zG&~z43$}Op$z7!$4M;Y+tH3iLuJSU)Un$)V*`aXRd$h=iIluLCipc(qgwE#;7HE$L z1^mTQd9%hK>AqVTHu`ew9?0_*B6r=@<%Jht8lk0|)h^{)?ZdtVF{9>0>$WdjqYsrJ zH*&GIs`xTKg5SYmJPY5Tkgf*egitN0x%%;)>!yS=7re@o%gujRI0P;f{!>}-_jItx zJ>>`ZOgR!-aVpuK;?@)gv^Zn;9AOvUQlzmnqhnLYjb6G`o6ZEY>L7irR}TRiQ0txI z5qzhjrv;!7{Q5$D%frQWLl7j!r9Kfca!uMOruHyHSd6M#TzAZS-%DH)zcXQD0oJW* zt~kT47Z=QM9W6j@?vY0xTmIw^es8)tee}a0TF#fj_{M85B>WCeC!|R#AnUfI(nIUcj*D{w`L(YT2HXl2M|` zcfS4Agt=qODnrS$LGcOn!<-=-CVeigU+l4=8->6K?k-9(;|@ZgP7j*w(k;dE2&F!! zDXO7%JRU1%du1{9)(ew>AKb(C5mOx@+*An(ggFm%ZQpsuz|UH`WpKMO?8AKDhj$qf zFN--0X?MNv{cP&J`2W`M`S#_rG47?K`S#7+Z{FIo+?TUtWFV zonnMpe0V&UeGSfpy!bnYfu76|k(%$u6exR1xdE%#QP&L> zuAZnsBPoo6lWsTb89~hIY5r@hn1D29u($rUbrg(n#WUfD5y4)zI%RYES>J_K`>9i! zxSFwrLq^eQ53bd+mcSx#(VS)w=5jN9w2xrDA=s#RID4U(;O3HEQtV{Aazzs4S5KU7 zK3w;?HKJdbHucfFelX>{T`v#}C1rL4WTh$02NkrnwGmqxZ zTP2Bz=T69ofZo*npas~%M}h}@cGuhlzOk6Nz_;(Lp1QW{pZM?(Od{!bzxVv|`fJCQ z`;VZN&2x04Jw=N=ZF+9sTb-$9L?3$k{yI%{AVYlStaFA-20I;IT#Sjo6Fr{l7&~}# zHo-4nU=l&w2d-czFa6P1UtRw4&-|t3@BZKZgUL|VLF}J>{!g0E!44=nn&;)+MH|j~ zNVfKW`Sn10`tD-lo3_@BBAlZ5QozP74_EpDm)mFwdGt5q2ESqe&`?)p1dn4J;D54s zlL_I{u@ugoDO7}(_LF$t>AW9$53nS~s#(93oAVb=1ed+dgLfjj3>V&b?WJ*x?>TUI zaslKS+_+xySu}IIaNO92HGYQV#5r(*2dXTY23zmDxe)G(<7t=43urxu$9R{X#WcsH;%&9_+i*b9jg%ikkt=YSp3~P(-?|O_Jf^iW{ zPifTM-P$Xf2jS|IQ7*dfe1M-!*?{LbwyCF#NVDNr_d(A?oa2s(Nnsjmus#U1zNs5+ zT%Ley{pQMpEF;t~)HdJqm38QMdh6Edw5K|#SYPY4v8U1+3C2~c6EjL67`r(ko@q_l z-kdlo6SJaqj57_4D;*Q1glubG7Pe}_5-RphdB)psy;*tivEW&M)z+~Qe43|cu*L#u z%q_UI*OR5(hOSCjdl<1yH?+PNBYWrQ8_W6Qua^zGw%HqoUUsM$=-@$XFdpk>$2R-a zA0eEHtvJ)zU5MeZ=)D|f4h|65nlSDunpeNvd?%CEg@)-hLN$2$bHzOhBO-($Jv$r# ze{-W9hqbM3RW{)E-0y~7@MJ8!E*iY=dx8(4VEo>1PFcc?#dK18hUxP}j3%CtxP0;5 z+*rGp{l$`QmJoELGn>z)SY5pENNda^(mI_^b+&lvvA4D5%yk`3&2*av1ednRtVlTFd~MmW<`oo{E5q=kznI#6wGup@@V*qR-#znYLa!R; zyjeU{x^|%_R-E45pfbFo{iMuas&+l>2%fDq5DA6I40bp@rtMhLbK<&JYdX{4PrT=` zI~lK!#U^UY-`*Tw7p z`^NfTZa)#;u{N7$xMiOSa!Sl3&}Fok`?lz4>n1Vox^~6S9@_t-Q)O`O{FBA1->G7u z`di9Qp0kU=^tA-zsVvGr{Nv~I*J}duFTYyqa&TL9{Uxg@hr!ce#I4{0FVH$gYzNse z{3p2(Zn5CdEFnh-U#h+2)w9<|2`9`L76dw)hLgNQ>YMQe7UbDn@o){ixuFl0`-0!7 zdeC)>GXHKcMe7&a`>P4$EjzN7;{}8B;SlK>H(Y5w>zEhP3#~>yeZJD|?dG%6W|&z< zKbny3KNTh68AU`EKF_QCp2LR^Pr~cDI=0>W10RSVIX55!BKT-4>h!214?I#X(@V>H z-~Yjshu3;sVX0uR&F;Q^6t;}L#yofFe9A_3#qkj|d_8)Rq((`Ff5y@^OisjR4C=06 z#h@@<2RdW!D3ry+njPyD5hqAo?^-U=l#T>m+H;J2wDR0htK|^W>wedd)zLjH4X(1o z_dT%u>aYIV@;CqHzq|bOU;Zo0KlrczP8LCv!6=$E!d{tY?$HQvYhx=}k}+vMVwp4& z3uGa!jK6s%_;D-%l~If-O;6~S!X1NA5R9}-bHt3MtyxTnR_J&{jMzLKgNR^l0u2l^ z(jkk*cJo$8zy+i0*H|Za5TLm$`0gPyFEz7VC|ojxETm%Y4YJQFvf^r*lhB zltH<>a-wZqFCpJ*WptTUt{ifnLlAiWhL8kNQmW>6^H2lFl6&Xvmn!QDMlpqJH^p@* zX;}cdk;hVNU0h-ahr64#W8T|y&n+Fg9{5*yZ&}@#jyAcWzz|$Ml|j^!{qFPjq6` zTj4~_Gz!5`e8uY~kt*WkPM*g!(2bZg2BcX&{G9&fF&hFH)AKAbEB8tu(zcRP;d8yk ztw_zJ9i<#k0#5gChF`q~mi=w@6jyu56UHj%843l`?xU>+Ty*k6i(MZQI3N$C{00l?<85m_e~CRY5ri4={pubuN{WyML}>l z!A=6Bd+;@ihnVMdc}rp1o?z3B?K7WzHhR6Z{Mn!U$?~1=et&uIQ;&|dD_+R**2uxp ztKg{RB9|<>I(z2S;NjkVyQj=+Ll1%PAT;GOt(o$U&Nepx{oR)YodYb)Tqh|!?7jr} zt?TFO9JY5k5MJ?^P0xc(_cZ6t%a45IJrlC{U;j_Tt-48Fyj%;|YP{dct^0PT9lcyQ z>2!dGZ{eWk)n4PdXG(~hQ>?1d_@0E2Mu6e-?TnWuyi%+9pbdPVlXgpewr2pWs-&(A`_*VG`jY)CiDZL(@j5j4%uO(2s z+lQSc@j3Y`L#Lhz_uO-DV>1R5w&BJoN#QRS`~FJk^r^nJFImu>DX-k<4;*cKAvXk`I^xkPHtpNH{Z}Mu(0ahy;t;O|%?Ev!LehkN8}8r@>{K4hH2On9!_=V3c2k(8b zdBj8_4BGrC0p`)Yv-vS0i2;}nYmkdWU>>m60&6tA)}paEtp%d-4tN%%pV)8LVh*%$);Yllh@+YJoizQEX+tdT)mmL$#NdWe zVbWZE+)RXo`Dtqwn3m_h|9S#G%sFg1dLpK-j>B0S8_gOrc;2A;KxCHsG zl3uQyJDFyBHf6uKtg4hdkh#>S(S z5^xv_p-vEsgWss{@)!R6Thk+WZ-QO?k>CX|+cjN4Dr-RT;sASN*4avEzhm{3p$kL*`} z55B_bnC+BTmBd0>gL5l`=*i8?-gAY5``y!~`f#SrI-RnT_D{kK8o{6fWv(t|B{8i& zyAX`8`EUS|^%s6{^O_&L_Ds*2aR+}XH8IxU04{ongX;>P=5ZGX`aM~rt%v8N-47oL z^TgC0IJ?JlDYG-}raoh~k6^noMQq&b%@15D+LV3Sxe~gpL)bzYny}2dN`klyxgjZ< z<_(7?X4_h(c}@4RxF~UAjE)awZLrcP>q?8j7>&*xnxEyHBcp=lO{theOPViUFx)H# zz6zt2#t9CY)Og)P_3}MZBbpm|qn>}^`4p~{^YC=4A{twrD0ejPl{^Q+cNCZA0axI) zlAueiZ}5NqUin$zm^lz;6uNUMe%g21Xmq7<%^-CauLE0j)k5RSgp75rBLkg*d#%{) zw#_#?dT;x3e_g~L@BHT@*^L8dii(%&7WF+@#lZK_~n)53t#zOLpT|Jz&~z%IXW76*bA0Dp*ab4!5hq2!;?ro)QP zP%k|9-Q|z}=*!E$^3y-E{P6$a=a#?t)6Zrdzb~UNO}Z-q7Nfe}CQD)w|KZB;8kZ!d zX#;12*Te=zRaP5-;E#!oM-7=r|r}uYXO>>Bn=>yK=@d;;qj&XyV zxxp7gRcl7)!(vpDZsruB7!g8)qwb)zMP9R~_Kn*KljxhCK{H1i;YOdKsbSh%?QK(S zY`8#)@IF2>^cEj#icXE`vXWU}_sCwA*e6?fTT0%x;Kij0DiU3|W#O;!i6bkU zGPK^Z^k(myKi4azQ&?bCz{0fXKuOgk>bY-VxzY#v87AGcR4!Qi%|3$@y&aszbZ2k+ zY{TYoBYFXU3N?Cipt|)st`CiDqZASRa>;SheFVNNmx*QBjn|ut+n@e%{ zRAb1K5EhU_axFmvzG8CbWIPHit7T}r?>5%`i4cGvGfq?3SE7;6lyiae(G;;wou>2f z!w)S#`st4iBYxqfHxjx#raK(k5Fb5r=ERiOPzsdCVE7CZxf1YV>(=nWe1bbg1TdV3 z>og?uli;+`ai!r6jONb0lrYw^^hg#kD^79{7~gx(;Sux{JjxUW_I!qbjPvn)wAQ^@ zT-GZDcVKt4o{jn5_q}J?_zRz@yzYDoX02|Iom#%z0U~!_Pd;=gSTI<`jpMsL%X_f6 zd(N(BcqY2XpV2#hD<|e=$cmQ4i78TW>RihB;luijOF&!?v=Juc(Zfs5bfhKAw6B+U z-b^qT!V38TV=$Q^lP8W6@5l3b4S7RHsqOmvYw>C#Y40XKv7EaCyZgtgj*z(RHWcrqc|Q66$Cuyz?B|w;AAflH z=tn-j9DVKO5xCkO-jGckGvqqDnVT*Oia|85VoZ>sX*7@3HAf@U^Z>IMrq!gm!4Nig zMoWotAh-~{`I;;D%FQyoF(_+kY9sV6M-Y-vMw{wAjc6EG-*acRyCvdqXEtd2wKkkc zkhT$&0arNs(0$x}7^Rr2@)Qz{Ha7^16E+s2d-Ld9oeHy-`hol86J!T=@wbmdBoN&1Jj?YE;O&)bjo4=;lw zsswIzJ^H>DUwYxi*V?noH5Ynt`D?%QuPuM~@BUh?4&Scv0;^T+D`iGpyE@axJzCQb z)|S1}#Dii(z+WsE1RnXJbm%&#*~$45E#cjR4?H*}FEZr`_ItCk)mOjq=3A5b&5&XJ z!)5iX8&gbp=q8CM-m`t{|Cg{od;0Xc4*TAxyMbo-&6(^CLD2`|+A|;X*XA%&IxdHS% zpwZ|C8o>E}*6!EJg{$&wym;T=Gwi+gn%CNE?`^9_ypvXHY&Q4d1VHwUcAtBvv)egT zfAin^mow&_(froc?UlE$ZSPcLa<1Rs{-@txMD72N9IB8gd_53;Ib(1m^1}n1NS>yt zAg8_2C$^}FpB_GaYP+_#?M9Os#~q%p*@NMk z&Dd>+uXrpn&%3u0uz8)nU%`!WIN|C0 zKmPgl)h~W(_-S`LF{%e(=dh(CLj{1AzS0Hn*Or%|Sf3FzqbD#ugUNQ%ucP3)C;FSY zzy^=Vgvj7X=KQ-ST$rALv*#w`_u#1BlA5tffVc|G}FGBFHtz}!we|Wr}RgeNsh(avmrhEuI6ilQN!4+hQ zJbYh;C+2*mN|rNmmxo_p2#V=d(orr1mm|PddI5ltQVgCA8ex=m@=Sz?M`S!CHUfPaT z$Yd^D)JWM7prKXFupBR&5v*v5hbVo1y?M!ZQ=0F!sr>b87q&B}PiG(xHztu9x->6Z zo0!{%2iGe4xE7<@3UH!BZ4`Ccz~4NuBl4VpVlI)RceRvIe>Pr+)35igT)nlu{OViV zE5A6G!b^$X-+iItQnV1Q!YH~?+Qts21n!>8*x$ZGBV&D!|Av1DwY?oq z=N-aJ$u6U;LG8`^(YcLrnx9NTC_K4!wao#ZY01gKF$j)1Takf00T2i6<_SsC--}_b%`AZm(pVFC?*Dp!sR$JUKBG2jN%e4aSX}Lsdj`q z-En>P?LA)MkxleD9wT#&n_@GM$IN7p9R7IL-E358Fox#@GR7ny|MQEtIQpN#WZ?>Rcax_Z|hC{;?vW@Db@<7Qc>YgLKrmRbcjql|5)CZm2i*>FI)Dxy0a?w@`7@gm*BInnKm)$Vb! zI2=yzON*nsDIYa1aLFK&VfZpVaEtSqT+CUzy)%s6c!w9G6NiCLpoeg>cW)#wqRGQm zI9ro?H@+Bp^qyi)y4a3jntLFl%&9p&@@w66D=nHoq6xnL;}<$tyok5=8s@CAf4)=e zzS>mFU;fRu@%&3)?g+?7>SO=*qn9qX1*SF4t=VsVvo+s-?~0H2Ka}pxFr)VaIc^W7 z-=^|dtBpbCN7`0|&gsKvGMgi>A=q{L5g!5iiL6$t5LWNoPF<}o{c1#<9AGc_q zP(4tpN2*0MgMqGIdwKiTx4*l6?XUjU_T^vy`u6Q_{?FUPkA7yN9>)Ccu4R}QbwnED zA3>ze{TP&GIyRB8YZ9bT2fQAJrrX1~6bUbea)2D;5utoQ(0iV-?9%$_S+Ek;yRrfa zm9uIcm~dZC1VkuCP)wj0?fv)bWRy@wCFHC0blxW=hS>w4bOgak0DwS$zsXgcLTTT~ zn-%%-ZbkXGc2(Tf2XpM;b`)s9F`DKFT}Ok_3_WJnP;Ak1|M!e{NWEa z#$lv+DFP6(ytEaMM9g!9s3;X*~| z7~>R)O-)uIU0$PV!V@Qo(pm<=(3f^m=I_OKEB3I(-;E9ezf)0&G4Y&b3;eyu1`A2V z$9N>e&M2AlbRyG&H#lpvM#lIKvwJg~>tOKLIH747#zk-M!W}1rpb@f(mZP=QRooiA zduWUTk9&y+XVG$am9XZ1cc(DO1|?vA>w3o}DmXb`VU_Vq=~FmPmBAybOqT;@{%Ti_ zL`$EOUSi*S$#~B)en>RRJf5E;_JWE7DKp`o0vqP)T2U03EPaZVw~ybsvHkQH z3Tuv4P?IBH!wP903eRL)kF zk{HJ3c8)j0bR$0e#cOXTug%3~fMp9O+u6N?IT3Wj6aYpidV2Q*qW%xIXCFVZJ$CBz z+pqufQ`^7(dtY61^6~QrEfspV==}#jdTIOa58v3XobSNtf6nLO2g`tjUxlyua~v=H zmJl+;7|1V~k=r@@E7)0%?29k_e0$@{&Fzua;_hw7KzKQnqiM>Ad@p-~RE<3cos%=R zA%2ZCLpyc{kM`2=#dN0Ea2R*J8Uj-S)5}P!wW(lTZuRXKnrlLSAP&_Lub!UHcxlyKrYoYRP3Z^oU zx7rXwLBR+LL?w7eF&kgk*;255Pe>qia{fi0mI^S&2bzPz^b|$QCTAdu1t?4&yz6@o zngCxLS778bozwZvfAss?v(G-geeUyL+?~RwgF9t#ssZ2tAf4TWNk%h?!F{-Zj zQXYMk0(GbYC2lTr3NWN+2)#a20MaLRahWt;uoG7At~48Eeop~+Po=b~$go@vKVy(W z90w$#iG*kJzuUGH`=pywOc9e%Knm7GzmyETjt5s?q63>!d|Vpq{rBHZpxPTZ+)P18 za5|2yuIDrB((Z%H;gq?yizi&W@II-$24Gy-#9>fp4xc!5f5QFbR3^Suk=s*`nr~U@ zv>m5|CMN)fzc{pZf_-`JT?!VqOeRFymBGFetlsF=QQFL#b#@N7xOm|mJiZ-1emdu4 zZ|fsZZbzU0Y>aIwgQAw@2vG(%$7u6R*W!NZeO|0+p2A}WA;EY1CR?Hs_5qbAA56ir zmQDpn@8vHJzkwO8plfgw-n|u&{y&b-!fpL@4=y-zJlb_#xBcC?;e}Jjao_;X2`KTh z&Hkl>9V@oH*oQP7M{}H&WM_6=3pZf5z8hUQYvyq&rCHh&gHR9# zb||O9rZL7ynNj@OK2pSV=Jd(!wb$OLfTwAglsPojG%I`}DI< z4cuoRePlaTLC%dF?_*Wlr2>V76+o7g-ti|1r zPr}uaz8jm5v!kWA-zt?Z!j`V5`UNu&^vBtbe*EZIDgSiZzTn!M{{A<={u^Z+uFXkR z*WNAKFWV#Abtf5k_4V`H|4~pCptbJj|Ne8htkV8HYg^x6{`KG5p8mpzoh$$I&TM}D z-pl{|b{@9gIXuQTSYZAq(3!vSVT^1VP(;Sw`n%IL>E!^7|9Bp)if zVY)$4pXbbF3siRtprV1G;^X@8bG=B|N)z=y`0aXC{-;l!D!8z8(J`~4_s$c}4mqxp zzAEF~M1S)uqm(GPm=$4fwbaHu#iW*dMxlk&7zIdZeG-=hI{`I_{#Hhg;3x9_oMdD~ zYxz&}QvtlEf(SzDX@e0dBtaqM98k*B{j zYl9)rdpr&)W$_!qq%9R<$gN8`tQ14)9(+mO6tLvA55j|+hsl$n>}L4{Z#>VNGr+qh zkbL*qi6~;$e7GoTNoa>C-8WY294S7f`=hjbmJ#u;$me!PqDeW8Qxop+#77}tW?@g& zjm{udk;mZG9CD|`c>hHi;eJxywew-`;HptVU<+rA3q|EU+QJyq)ib~P`rDVbzx%iU z?U|SS-~ac2+yg1c494A$*E+vpwj36;n)id*HSEg%Pov`vulFcz7+A_hpRpAp3@+xG z3@;hX111_fljcWL2>E(!uW6n(KYDQ+UjK z9Z9jDZr2?Om9yy7q8-N;AdJgLIl{x!;dnALMM0)-c=uAk`#NWp`J1$9xVCm5ACuQ{ za-)Oi$>&rJ2bZ+h{hi~wF9kWpV2#_n+$;mCjT0$jDZiIreYttyBJ`HrNGnPgTMo#G z&*@&l%&{dWJH?TzV>v5RP&WJ-U&SXPXfo6Ph93|}+S_S5L*r17-(?CI_A!X@pa|p> z(X=+>li3B2p{=cP%E}}N0`7(Z;;7KK9Il2l_tBXQ;|=iRPkg+i$H*RdOat6% zlNC-KC^$l2KRyJt^x`=!4>(;*FC{L<&P-}=j6+y3*v z|G#dB!sQ!pzBx`9$K{ceCxVXierF=yTg|!d=!b(v+tQR$wWF&t6pZG374X zpT^7BUdt$3QK0f0?Iy#MZj{lxnKLgE=YU(Md^1?cw-b_NE+wGOJbHFJb>zYJXMZ>u zsH*!`1*eVja3`l7c<^Ad|F2Jh5<1(W^h!~)XcE0muK@kwQ%9yy?4Nw|n@v6aJl%+f zAGHPNqv7e;_B+4!RBh+P<*Z3tzjx=8?VZxX7aXP9bc1U0Z-3`|+jj1sABD3*$6I-` zr>rZ7CWV-zP!Lo%c$jR5G@KKU8($f>vLVNh9dtQ|!u)*3Gb4QLNEOgMX_|&@#LIWm zZ-TB}Er*iTloh1MEm^#gp68I5r#DTyr@9&0Vo|#wkP}w6Dn$~*F+P-m^ifYF#Bp#B zO20XbeqVyRr^#~jBV8OuVXO&`i0}S{ZiGMYTy$Vg)Yfed7su>IC|cfIROdtKQ^@k> zijIyQJ+b}br5|iBz5K=P>Bk@2jz02i#Bvf)MyvK2H;R1KjMMA;|ftld10*2ZQ*83WR=M^6q4@7&W z{|yXNtyd4VFb)e38RAL5rAMOlPr~=5Pug}ZL8Kfhc>)clUA6ZSW0PMn)qIhn#zs+L z5XxhUo$3>e!#e$KeeIk&;ITDXu>pXFuI_WlIN^@(ucz)!%#@)%2a>pmLz zxHf%z9*u z0zngbUb%W>ikT?U>&-(_5-OLES2Xq5siUJHO;LDp)gh2KnG{n&OBuk;IB3C&hb?s} zm(nwhHyYM$xKAdNONPiY4;MPW$6Do)&2)HsDX9N$vT5p&xYZ`-X(AAq1V&1o64 zs@dnBeQvvOs5PT+o!jo#$K8*TliGq?(JuV2)P7u2zuFjn4EDea9-O(>wlbU)c#OTq z6W$mN%Mjt(ez;CW<3w}RtT&Z8itDEjR5WI~X3@p_bccwZQLn>3XsJe|A>@Ihklcm&0!}8mPI*iLNx!*3$OKDkxNrW`_dT?vE`+H$1lo_)O9pc9Ru3_%-r?62QD@zUK7 zpJ^(~hDV3Dga6ULR}_A^tWxLxo`0*Ul$Hk;$yyVC@ydJKORt;nk+-9z7Y{ zO{XLWWQAPdU;M35^j4M5cQ3V>M(Ok0A2^Vqz$)Bbx|FjA|M3hSvRmPsub*q9qtmr# zD(S;ANhdP0Ib|PQ9Nsd;qabtlo&vde*fQSOe&qRDbIRqQfD~dPdK#z)0kardY5#2J z)iW68zL<%zo|61HeT;^;1AJ0Ky~tw~vh&y;EIne8JmRYYiv z@lctwlnPwo+-WeOc8o6Gvi=(0ZSnbGNRvVmk*Xf_?$ADX@$GyMSN_eFh&fJCcYW|? zua5y9lzPag7p00Q(b*$9gE0KuwfAR@%IPBmQTtZ)=}mI8^WI7E!9J&zevI2EN>^Y}>_ zI5a>XJh5w>nMG$A9ordFpl}K|#yB(&?io>+CZdfBF5H(g5P5$RT^KCUnWZuMfB59_ zF*L8g`NlXE`Zd3Zj@EF(x4CI^j|>~Rz@PI8Hcr9EMJwa@^nKv1e^1~MQ4mLq_@gbf zTSH)ej$Ck1>@G)UEFUt3C6XsocjGxrT+n6=YklbtY}3xjF6S#KwVT{K$9istA8^`d z0KM@kXAl3wMUM~6`+_eJO4%xcN;IS{MC+qd}jNv|DXTw?d9t> z>1dDZc9z@I)T7Mj8|TjD_%}7s)FeWwQMmZ}x$SmQ{@GIWPd)Njyn14$Loa58P4Ddu zuB+j8&HFys0V z;9;u^_T>NwI83qJ%7%Ve>Yx3fcNH|>3=gJ)cBkX++9@miKiE`OFEx#ktQ|jc;2X>O zC%6gN6izibp3HcWy+BxoGcjz)W{@aK^N}KGL}j=kbN=-{fGFwf_o`r58j;W{J1-os z$$cs}YioTnDk1E(*M7Er>e)Z3sKezp9=@`-PlTSX8AeHWE3>2BZ^cE^d;YlCMau|>71;^-Mn}R&| z)Z^RJkDZ-`>4(Z*SWkK&COz;_!k*V`KvJ$!=orwl7VAz4h%rdb;tw67mZ=L483$)P z`+J7YTvtdMs3=Ct1Pv(~iVn?O9|IjNY)z-axDj+2Px$dVX00i|bl7L;>yLZS8NGK# z{r3w_IA-%=|DWjt@7Lfm*eSx4v8_VaTH2IxaGy-by*DTN3 z%NXpASL5IjTJ7K$DOw7Ou!@MME}*em$GbD0iROY+`qdNwL&*E?f5Tsade0e)ult+B z28trc7ozi!(M%gEQh8#?^gOVQW39tir0BAh6o{XZWn`CG%3rK?A;8(iTS= z3OM|5G0t?~Ia2sVs+w`Xzi}~0=2cZvzw+9f_1CqWNb5jLDb8wucQd3{bIfkvR!>p= zM-iIzyt90*=Qb^67@}kR@z&c{wpZS~w7quj;zV~hD_B(Ny(@WtuW1b%+q{=-aY{HJ z970B1wn4^8#)v_IH&MDVcQF~t+3&k4LAaaX2u`AvD06r!IBr*`Fm(jAw<5q5V8D_3 z7`hdL*1BM8b=Q`%^rq>zgm~bPvKJtc{aL0HhUs%ogv`wTj2WHb2*YE|w?6yyV~uCm z_WG-@G%c0W!gvOcb+{)x$S2Ya&DbY}kIwkLSn=cAZ@tlbIZ};8L@u42_?EHA$dxk?QIJ7lA5Nhkkee^cL9{(Q%9PDp z?J)AWFMM_T+VA|v_TA<*zVmU(`6%g z@DPGCXC5C#dFf)tHgC`Sjv74o&ZX_uid=Z0lQ9@L&8;nA7YSJY<8TPxJ&%>(H;jRK z;0;$?BMQd+?zsxBzVe&Dx_$lYzc;Dp|NOuBd!_JC4;?8SG?{|3h)&?98oD+oI!KvN zsFs{PeEi7vXhk@)UNPLd&M**e3(}=K^{I$Rn=%eyQ(QDu10Px$xxaI7!g7hS`XsN{G;yFU+{5=onH2U8FaHE(0h;)-SixE>Bv zcrjJkePd`%)7*#;P)hN}jcDrdbo8C{Rec-#q`!J*G7LGhU>~>xDrjcx20(yKVeE{C z^MnTa-ofb(A4AM+?$PbxbNr{VezFVW+{pBhBe-F#Yz4^lh*UVare|hzgz#<|)#WRf zNA}DKTB}W$qZ=g(iQ@?OePxc;iA0_;Mly-N9d^E)G-Hnr@xfHG*0Q!l@S{}GsPE<^ zIbxJFI2nehJ@6S0V?hqbaQ58*@u%lAxqXlRJ?I$@#9E=D&SNfeW+DrsY=hG3^m|8k>ttikG)|sMY@S6^!=Zu*{CHrK%&VZl38B=&3xEqYD zgUW7!z&p*E9_jA`E#LZ}NQ@3XTHz9hLS?UydHH1w!eQglzLgv1oyo(&cz+_{-kF{E zqN61^re5eK{KjciJuFhZonA2}y7Fdo&eoa3kxYwc(bRMF%(W`K@ywG?Jl?ejwtxJ` z-`;-y;!7=)x-d(qo_gZZ?THTF(2v3=_|rDHI0zR?Ki_Kp)p*$e4hEVkjG`~bHpLe< z#Q3%*3>-P~S#>&hIU@@8wSUwG-2!H54ndWhAL32VM~=xZ8q$)_=J zHt{i?!a0=DB0IKEHC;eHIRpwh?X68_Ogrpk68AiO?BF+W9v~H3^yhfBGiOO5bOB;0 z29cNNFoKOGY|M?>2q|wae9W^_M$7YEfNGO5wriHCO_kk+3sNpN>o1KJ?@v^jGSJVP zO{k0Jj#b(BK|7JzcNOUNjH7Mc*Bs(T*Pu@($^LW~jdx^^EU%yBFg`?g4Gh2bM=EjPVSp$-^LUeO0DPbIyuRp( zB7Ly>yYb;UeFJQqZT03&gqszgkle9sX^>h*2iFD-y+s|KlGu()h%6LQ% z=}X@~K<`!!yjMo)t@E89+*HPgUHh|nBWu7^I;c`>o@;q+ZAqJF>kMaVKyjyknh_`7YyVFiO_a5r17C2L|_ zb~v;@feLK=`)H(jOxy_~nD$+W3U^{zSbbNCA{AVBE{>pECW&7;2Pj~M5 z1KW>&5iY~c)v^?qD_2M%zL;-`4v!*6Mo zq65OY9E*E~xqc@tN&tIqAExhb@2BI&xQOt1_;ZTL2=>PqU1aG~`?8}aq7es+|CKH;j4>boTpdC$^Rln#C}e@Q4OE!8eQb<(4px;hLN z@ZlSZ|L$FiX3e!V;C2{F;S}YJfemI3A^eVPC6m)G#tCc;J~n{ZMQ$3)$UyMmt1(`bP6M(<(LIAJe=lda%YzGigx`GUgs9PQ zRNc_JR&6os#37lzPb#i5)&@5?!bhWj;su#0P9<8(X2BEvHHT3QN9da&S_;>*GBmr& z=Hba2o#(G)Fl=*p=Je6+S9d+T{rM|z419OqZ*6NkX2~ov9$w+J(v#ynHE4XG(mR$4 zM~jXyBY+9K@R44M2h?sbsy8y2E9w)Zqzf}>;C^sl>r8`Firf~Z50Jq^_k9mY`|jJ$ zoxheItG(KmR)?d9+Np~(v(^=_z~sL6VVG$;IPGbC1$J|xqEF*@eBkcg^;=u}A5>Jw zkT0i=EumNND1EWyL@}A~D+5WV&GwAZ=arXVF01+6_VvH^+c^jyY=8Xs{>SZeUw(3X z{oK`b+lOToj#TW_a-WaeiLYf>Xm_GBlMjE=PI~lcQf!ZQaWjCjdw2(AKhtX17nC6>GdNO(0uyQPi?>5p4tD#U;EYQ7Bai1#=3 zc-Q0Q^;=QQgwvwHgxu~d6bNC&(1;-dl8QW7N@SJ>@esSl^CT6#E6NRv`XB=3=Zwjl zDf=Es;1!=ZbX+Cm(e2q!Kb7LTxm|qgjToa6_j?MQqNj8qlW>S){a%~UhXjl|f;85v zHfuMA#Z-jE`{88Z=fO(RQh>%LjUx)@DD+6z2^6+kigBXJUZ$)W&`ITX8{;Fur0z5F zd-BM@hZ&@=mQo<}i;3ZLZAiWx3lshf0iuofnevsckQxUprH1i25Cryon+p89|Nh^e zy{G@^oBw$Glkfgud%EH^h7|4KnJ4d`k9EsnKx2`)WdM$Hlfqf)%f>*u2S4bw4!vMx zjH}_zcvnU9Qb2az8iyt&i?VRV)0B0fbZy=)<%jmeU-5y|9e${{ekhfY*Z12Ars!et zU4$vB7=})y8KU=QIl#OU{Z?P2l)I$0P~G#3+2^S)4z0mX02;t3IW%dU@W2t+d3K`p zo}*T!iucDaQic07c1lUo2?}y(z;b7)T^_#3vF!K{% zPz?A;KdLS%V}po16HSOD6y%8{WD68Xl12Q);FFtWV1pzYQ-T~#xWhyEMB0^Vl_^10 zeR*%%skjoZL@uJ|Q52Mi_rrmR$C4C=Si7#ta@A%i60~G9J4d{#DH)pN_c63Sa8w)teg!c}2K!J89Iu16pm`}Vp{naL1jobt$2Or$@ zC4A!#3R&URu?~Dckb{4;U}JxJu2=8r)Z{NYF;E$kS+<2g3ue&I+1vEd(hbWo029ZG zo)-D-=9v=_Yj>+2oSa8_&D0Z^s{c4leN+#~&T;wi@Pkj#8Lw?zm-V z6{kJi$x~-e9@w5}x$Kket?<<2r?xMB=JD;zpLwz^eDB*{Y*Uu~)zGXdELwNzFZ@X! z@%#N1s0lc2^Ley$;7?WPxaYA)j(>w8kzQWH)NgK41VreSYT@<7fL+7L(gizSxA_VJ z%A*|R&@<*yoFH>3Lk*cWTcDIEV?t6R!%%dvcM*p-!7wZj40Aq^0e(8<-Q8Y&>4iB| zp3>^^Ue6Ioh?asiz{R|ZoJ6jKYf?@rZU&H0Q8qlmNmt)fz!;UVHkc7i%NPvOb>rKC zlk%A*M%_brhJ`WXgapo{p)e%aC^iV^jWa5vyt>Z&VazB|9-~bgb_|r1loac{n?mxw zjTWSpcw1oPMLtw%KZoI!H!p90=kNZlnH&0(Z+~a|<~RR%d+wPhs_bmzkuf35OPw{D zeIMF{6YYEEWZvTG(qjw@hX9OlXq+N|9-Ig@GuNNB*bi8zxTbOX7`OM9GZX%Ev{YZl zfeWXT%IhKR^`Egbc=!o#jS&}PCQ1nIjIS?e?ns@6Kp2p$q8fOfgJDCN1 zRA)mAj)4Brtd0gZ960Y!>MMma2LUvu8Fx>b@5ko~!gh=h*{XrQ$3yXhDpr-EjLG%Z zKZ?FAW6?HRQf6Zu>K{BJaiamZ!HAc3Qq$@Irk~m+$3ANh@ZJwj7}Y-~s5_0J zD6O%A7j`&IYwBR>A^HZ6=X9@dz!=B`z|YXAdzNL|&;0!i-Wrdl@l%SQuBktGA7;;b)c;qNI9x3!eXhGb*a$BIfMD5^V<0V!CL9sE#7=hAca34b z-Pjpa>(&|U>s4Ieik_EBb6>h>XELr!(;(2 zK8cRM^OwK8{rXowzkTbEf0&b-+&yvjLyF5B4c+Fofs=|A{8e``DY*qQD7 zKlsu1KmGpymN)iDcqQ~}p1HvcY`k#&Q_lJjZJugpmQxj6scx2*;XR7bSL!WA6JCr< zThc||AK|Y}?HVhkOd(P(Hm7*Mb%xpyG4bF>$QyIoV(>7|Nqvic2-hf{+O6>(DO#&9 zDv^>#8@xE_s`^olN{PN3zQ%|(j){EnP;DYie-2NeQGa&r-bKH_?b1+i{#dH6cPV(h z?#JK8IZB>z#eX)X*jJ&9f(gd{wmImT7O3IAQ^;Uy2!=XskdetWP^yjbpN%Eqldc+^ z28$};HD4%-W(X+Sc$EOw#!}K8$b}Pv?ZaqKoBcL6_*);wMl{ZREGJ@|lWtoV%HzkQ z(82v3LmSLKG8Fm*d;fKJ=>Yr=E{2~x-l8ngB))=U5xwi<-1HI|B4=ZCYlrNh`Hqnx z7sF@4Y0R9udV;2*KUu_Y1HleFXxv9MeYom!eK9nP2N>Fg7rZC?WOVd`3;=vA+!{|6 z;tXJs9rmCsN9l(@y3RBR!$~G6Sh%=txl`i-pt)hID9~lWy@CiET5xa|?iT#?Dcs}R zk^f-9+xCCA{j43a7`wtmBWm|ziWDJTXoW(+tvb4rEs@-qaE_!w$9q!%BoE$J7PvNrZmI&VYmF%ThX z<`?wQd%R=wZbuR}dm38@_QKC!%&;#303!pX9dl|J+i&v?)_P%H1F>U|s2AXq7VRFP zg=mPK?caKjLgDWcM$0c`0pjZ+43Aj_tTlnlOH!T5^QX8extKNVs=ni05k&39pChD% z-FJ$XLio73gxPA2_nJW8%!9Me^-e@Jp>K=1<3|s4XnULNm!eRy=+q(qu3maOCG_C- zZ~Tpab91lMNJI+JBPQ}ArLQvZQ0b9V?NDZYr>R1_ zcwsd3qOko&W069C^)C=HVxA&=64X`nunH*5nYad5iiPai%lH!JNIAw>yJOU1@>Q&o z!3ZDPrhxQsE)Wjwltrr7We)ITkzn8Kdk3NKqJmqLC zBPDuip0D=iCu2BShWa*bq0OBLfuYv9HW_%SMDjrCsVxbhq4Pk?K-L$0dJfFm8X9XS ztZ;n6C?GJzsWs@HXTXBS3-7@^IwohXzQAqV^Gw&lH9CW_O&{3hi^DL_^c=mUKW+K# zqiwo?j^W6NxER8Zk`KX%cNhr{6o=pTj}*U*kv*&7UR$Hk>6-MW<)8*?%=v@tQ=`*cvVgW94e$vL@Y_yXG8+1pIa8w}tEmr0fAAW<0(%^a38=b?ugQjhiW31w z^qK1GhD$E!ar#fY0K@2v@X~&tryFpTr3E& zM)>l@ixZGs>bnhYq`@7V>9+$*%Eynp(g?{}U6`o!b)G#Rme;~ShZd>;NzRP6O@zx3(tc+(LM@i^OD z_Igs;;O$~fJ zz=*PI3U6Y<7=zcKu)v(uvDpFU!{!>=3ayR#wYfs~dqqGozmNCsYn#kDte{J~Kf#=$ zjurii=oIouN8Gm;k~jhcqhT}jF%Zv{z=(*Io3Co!6|G`$^Bl_FkF@E8HwhG@Wd|Px zUZQA>hydm*7+OY^=X$+G_)av5rjvTvQ=yo2GGUZ{4$!FZQH$-*Z2L2=@bd79LoFn4 zF?)(;lv|8zOSv&T;dP?Qir8jJK*DJ$!mBS{+Wy6_{nqx?ul!mNZ`(ip?svB<7tTe{ zlYMK8$b@1My>Z1n(lKMG5}1kPntL-QW06k%xP5ry!p?D?( zP~Vn@iAePc2aF+uVPk`jiWtCZ41Vmk!w`*w(;K027?!Z!7cVf_oVpUpg8R<_y4#f0*A7T23SfDu6|5ir#K*V|;4spFQt^aV#jfzi0>l`sO36 zfMqCA*8%QXbaOz$6t9&IyB$qUrHBxAEHdS^vJBxg(eobVI;qayg^QW@6hYKJ1wEewyy0g`+wwlkf%M@ZaZU-Cq`}SCTMEW-Qjlm1{Nb7U+)1ArkH~t@o^?8yXB1Y7 zc9@yvXaq-iHRhRe38%%0UBee-chQp~K_d#ElN9+g=KH2-@9p+5-c@FRGH1|6S2SmN zx1t(Esp;-fSnVU+_+*XXTOSk}8ZLgV&+sgj$T@NB-=ubvI|gKE0`kV|`WtV&Iejt2 z_)1?|Ry}J#@G{#Zrek*ctJ4{O4-emh0ldb<;F4qfG`Q*BN6Ca4JpbUOM+Vkqbo)Cv zLf^=lf+kxJ&Te->VuO%Vryriphc0Jy_mVTz827YpR{&x3XvLlc<@V~iQqom; zKl#Md+f$!P zE4>nLJB3UDXp@pz&n=V>-dA3Iy&bLE_q)xY7-P${bbKQk*#`4UmDps~1}SULf^=Hr zx>Nzz?er;F(F4z_2f>eP42zENe4^k=>RJkXUk<}>{_->1egD?q_;&*E)b`)}xBtKG zU;OIxy%=IsN))r|QISy>qS>1Fu=gsYfNl_dD$#gR!$%O_ANM|^fNO`+q2#Ahv6gv$V3ZOfz!V3Mj57BQB_cgx zg92WU^sdNSaSMhTC!yc&*^LH5Z8bM3si+~6y-!d)CWc zzR^Y&Ia&|5R?W=O$&{7N;5i)+gbzFCP?&)|zj@#o+3%5v;J=lYqpypX=T2 zIWYE=|BVvFL%xZ?^@}%+)tCdJ&%JBmUq$;=-crokP(TFaBR#$JJ)&jwl%fAqcxxSc|OJ*ZCqnq?~fTdq>I+!p}rYLj^ZGb?Dt{N`&s)osh>GS~ghSj1Q9 zn8AC_9^RfR_KdsvzEO0XTYb?{U_|)-rwh2A2tKC4`z~^_MC~IFaMhsfjO9-{fRO_` zLp52fWX0zC-qG~PWJb@JK5T13Tf5?&bFI|4*15EgpFY|-zXz&J-d)ksmF-r~nm3<- zAbzqGiDNLuJt=>B=-Bb2MSATc9Q`=;_8@-nK|Ayr^NQ9$IwXb2-~}ss-0FaNL|@h6 z%}J+Y@Qw_TNAI+A(~kaK^e{fgLF$w)hpTX)jb7j+%r?AqsUJ>Q?QshCBuEbD5TtN6 z(GX_G5$rdEvz#e9xjVHv4t%`vNf|#8C4Gagmhs(c%1TDYZdRPM2dbQ=L&y$!u%vIC ztHCj@U=ti<(q<(;d$s8K{eq?Tk8V%>n-|V+ds<3#;flHE`&-I&qr)W*k8H{uIz{T| zFTA#$ed0`!a5^u(6e$ZP4z+s69_&`^IN{8)EtTuebQZKIG+yH^5XrgZAQ(A5wh58! z*s-#-*RTJeWnu4a54XujQa58ETlbiB6IyZ_JjnJ<1JWMfL6XCv=FUht$-666o^fIf;SkjCqAj2@z5fcsMLQF@e# z-22*$zVu7TpE;MJpx7XVozd=HXGflH!)+7$6!Bt^A1;J8xzGG28Z}I z95+lbSi`n!m$Xs_p{v$#2K5LQ>NzxBv<7Cx6mh7$6SXmnl+b0$rg45g4g{1ZOgRGJLh;*`HkTS zyYXSnNq5y2MLXL&b`002pZikt;LqeWKCu1Zhd3QkN9_-qh2GG9i?lYulw<6>ebI(u)-p3c50}<>l#ZLE__=6lGbf91r z?-?vZJTwfJiFB}xeu_lANm0+ogW+Yhma+^AS2O@;KC|PSKeXGAc4}tmMbNZg>vNBR zmpMSYQ8qoxA(JXp3ou5eYYa91H)jPu=J{1JQwF9Ve2kgG^+5~ZOZ|NqPly5^OfWxc z%U2ch`k$0o_t8q)noRNB4Tzk=7x;Z2(P^}3<`PX-xEIYu%;?LxALmvN$pZ&^PC1$i z=$`4rAd0fyDuCp%4<{xfZ(fOmJ-ucZ49Dy-_~ z?Mv6k$X)&Es~P+@6N%qR!_YgN+FSd;fpF69gda5}>gVmZ%4()>IRl&o1z8Pv#suy+ z-Z?*+L{kZu-?+ZLSyi|LGvEuH120@-mcCe$WbAt%+*39D;rftayyx6B{ypd4`0+Os zIDPfker0?1`RBGD{nPjZC`77unDs1j z(p&2Wp~`hx!2TL073G9F`W$KV)O%p;^%O{(D$JmtuZ~CLrh0zJ{niqGPFc*PG{|*{TL)FFM2N?q`#J9 zflk+}Dn6WYmhy!&N(#>nwR;Ed9hWGji$S!9hbB@4bNHjPI9!W|db8`pqce{F4yWE> zguG|k!XC#QVf+M_^fd>wE_$CXOCQuGosIDs^ak2*{1GUB&rtCNy_KLpLE^QvdduiCl zmV+6eqPZ$)^XKqDzrEjh)ZE-?wDzk4@6no`H5q765y<0}(?eo_wAoFvz z?L^O4sCuKR%1$y%pI)|?f5lukvk9-ByU_aX^CgaqLrp=PPv#m%=noD~-O`N@9eQy4 z((|9H0QP9t==uV{Y}=k^KlSW4Uirxn^434xzEJf0xi9}_%MIQx-PI`>2M*6*DIr^& zjiPU$5bKa>LKA;Rlcit@j-rn+ybMHl{z6DF@j^HP@wz5`)Vp_Dn@0Ik<_ycByxh-z z{`rcqK2?hM^7fM-elMZVg|pFg002M$Nkl-m_b{xHf=3(*=qCSl+x zmryb7E@Kd5bX~ZO?!4SGT91d2Yt} z;tMZsfBwSHDr9I&%V;27zOw}zLF0*HR19t}T8e`b7==;$yj2Eq1RyxfK}zE>{xgpo z95Y9rQlY#lHqegn2c(FS0wKKKQ3*^g2m^W1E*j{MVfN28Mr`LFWjAf6Ts%j4FmP+G zUK`P?XJ!dU?T+HWQ#iQ(-S^(?CtV-YetpB?a9;P^cVS_A{f*WnV22kxuwY$nd)9}M z^F9UY8T>*)i3AR|xxzRz;ehjJ_Z#daMavu4t^dg))Y0(p7>0ZJ0;}|(!xq3t@Qj}# zLmRRI*FN~c^OO_booSrs=0yF`|Xjwe*F*XA9D%9q>M$7{gHi;L@&-{wGrs zOr}XF>XG5(WDIb)F)TQNi#THx*Q`+J`WVu1f_9^1b3Wn6k89+TBLKg~E6X#5RP}AI z`mWwf1w7hY^g5$b!!ed9F#OP4M#-Uu&@2qVssMSJ>k@i;@Hm``m+ZPbvdkcl#_ z?&zQA7Je2Thggllbvlilt^&Z7>Lz2b1dl#Li-cSoo^ydt!6TeRdcc!1c8e#%Z`U5k z8F2#-Na1=vlGHqSmOe(mG{)T12AZQGJjhaw^FufE?%=oyL8_E zGJJ4{rYqGS#cTYZ)vSasY{1^&*A?iMEg1V#Wps8&!Po>s_1nm2rHtIdZBANq?(g1g z%CQ2n3zsVJ-}vZ0$JxEvX%pwSr=EPevn{_EKrQKc@6v1w#^W^r%r=o@NQPY1V?0CWyHW!E zIUjSi6c3>vWl=|jS*k$0GcVeGY33DSw98Iw&LH(prRPt7>Z!`kzc8Cjy!6sb+Y3MW zZU+BEeNvVbMg|)Lj}Q|y3M7RAs-j8CLv*LF@oKwA_`GNFxQOpYsf_nBxE9+h5of3z zR(+z0c&C3*4(4(0rpPW-xp%I0a8C2^`*dE+qmP^#LxMpl6nznnb*Ohpr@*?_$cI4* zt2uClX%LfYk!DoH@lX-(=f3pI+q0i}KKwq=E?{qNKmW;3D&03jtE1#oC=7^kk0TNcJW%QAfa@JjPy!G>2odx#3JQm8jzDoUOrr$4 zPtlo*5W$Rq)z?Jzy-0D14#1)91zCzN#kDp(Si&6$OQEM=L||Z(iyVdB%~6_O4)5R^ z<5oYs&-BOe)bQ0kgUQ^3+qmHyANt@Wc*ZY-lfI9GQQI;gl=bZ29Pd!VqxJi{yET_^ z=kOfvJlNS(p*GbHTy7gc_<|o#f_ao(v_>C_)BA8Csvs`|7kC24b-zU(-c`WoGg*fC zjp9MynX?Qpmdz+cL<{3sd|eN9ZrK;Zrhgv>TH8|z+kMWeh{lJr5TS-vqJ220D8Wc+ z!4;+9nVkrVJQ<@t@Yk*6(%d#2dtbjI@Lp{^rE|-y_`r`JW95wEF@LWQ<0gvkd+jW` zEgYhoIqO|B9{jK#;m~+c8*qjrJ7<=CZ7P2rpH>d3T ziYyr)cxkRuTD{M$mb-`w;djT-qldom=!~Q1;NE@MfNSv32~zhQW*b#>Yhaqn?c{5A z91DLle;*72oxxw@_X)er^)H33gE84+Vyc=kbIoJ@UBdO=jGii;W$8oD#5- zHCyBAMVs^`-ki)vqndyK&xH3iHckq9DX?36KBKX|$iYmPHD-K!ut4xYdi&Ma&rOYl ztOSVloeCM+;OqTm3GskpMlj-UI@)L1Dbr}CctrlT5LUpdcvX>Ye3TqIIHb{xtid_? zv;rq`^^R+xMQ|{fHCl}3$1(G-{razNpa1;l=H9p3l>5>w!Fg!z^K3j1 zK|J}Tz*8;|7lRNY!Z#=N)TtD(N;O3ej*3G(1K(XSjWTpz(W8%?s4~0dKgSPNS={>D zhuatQiPL#4r&{uJY1?A zlm(|e~Im)j4u61uYDC@pw>*(IQ z@kG4)P)2rt^EM9JP!0b<0+=J*2UMYI3`;N)IDB0Hqikx1@_{$F(zc)Bh4^zREXLY6 zS7b^liDHbw-|#kyJ6!B2oT;PG&b>A%D{bl1HFJW-N`d%$oU8h94NszzsUomYlzzkQ zicT2h6^(m-$Eku!eB$H2NDS^r>DO;Vzc-$Ex+xb%v4%(XIqXYON-uNFmNPO_6vi7~ zS7B8B2FFyf*QWRN$&t{W9o5FE>)MLMR*@n;hkNiYLx!)GvE?w1QM3r?iIV+KSkhgE^6P&v1P7H}CZ~-m$FCvtYH+j|`H2IZ^O$n_O$U(Mj8b z$9~t`@VjTh3kGo6BiMIF;gdqRs4xbA%$QqlkX>24H2rw5Yhx&bjZz-HSRdmEAE&K8~9njLtj@DE`}BlkP%J7r66GE*hS+y^N76= z+U2WrlVw0wJJaRR@BQq6HsB06j3o!04A5V7880jx!lU;EEpf>3JUp!a);zoh+_&u~ z2O?`W@~{8|WMk_Z18gbn<-q?R($;R?C|@ zJ*dIX(v1jJ<72!>5!^H6?mL1_g<5mz^mmvV#u%)-Fp&9&P^B0nH}bx0>&@^NUR~5a>c{;VxgkxIOXMqf=$M ziqV3xw8$9WlnG|-(b~xo3Kvr3YwukGib<9+bq@^4LZ}^?M;n;K8|B!jjUOJDFZs;GJb$x-{==V+uSPJ7Hhx@80V^fn}v@r)+peDo}( z4G-WC)G-)j=i}zX&0q1@O&7p7<7O=2o(L^iC`gJ@N>X~5$Z>Qmkujbg?0!l#Tw00& zM$09ZV_>Vx+JLLBjgjp;8d4y@Z&>krhN}B`$wi9SZ#Z%K3tn5eT=Sr_ezp7Ba~=P| zM=$l$Q2Kj}^x$YYYUmH&y>X8x!W(|74@Oy={;s*fL0^{fZ#>`{XQTH=SqHOzwa3UA z52LStazg=gUhKs_iXM9VCz~+q)+3th)|H~gPBe;hrTD4Xl`+81vN?=%V~U69ouPYA zam;qEEz;Q=TMm(s-*eV<{->5I^>ftAJbicnNKqMR-l0md}QW3{u=sNr%K3g=U zQ^&x2x4s1;=(BJ?(z7x&UD5v-+32|($5pV3S4S$-+3w>zc%SO%{>F=o-q>q7Lf#=8 z<2>c~Xx)-3Frb@hI@@fHBO0FPQ=9r#H-lEQ3Z(JUcZ#gE?fqo{WeyOwzPr9V9N80F zI{HL)2`b%RdE=d&3NXpmkk`d4;6gQeXyiBe$x)B=VbfM|>|`){X?A?94|pSI=u%6K zEj<}e4vyoW(XD9KZJ5ym}F%KL`(JMwXmt-EDQo(ed)xJ!I@nRH;$(Tpkl-gXz zI>qDf`el^naEfrm5R9UYhTipEd!rz0hmw^>_ufcr4U3#66-f~56Vp!=fA8Iia!HAn zYSfrG1JY#Z$tc+g3!FR3*>m^M0VQ)CUxCF1ieU^$zeSY3r^058V5JNR@Q*?$Ggn~ zq5t5a@1B%QEVOekm90S@AUd4KB+{ z^>t`Bv_P|z2ZzLS_y!4xE=W4Rwi-*a>jLD5YgM&JoshV(yCm2jL@ecaSa*aW6%ybuHN9Gx& zarAq3$z4XhcHNu%@v*sH(^BZo@QPSDBy^<@^l+4{frrbXOXGt8{c8s-981$=rVHPH zzbTL&v5r?2`PG((YMadoBa_LRdG~l`jBjRA5fr^SnWWmlLv=FkFWtdmUofDR`*@3N z!x!hk^TwwiaD!{vlE&6u`+h&#N*}Pw8k-Y#zPe}jww8X+^G~%GbjIfLrAv*k((HCi z;(=T)WotK=Tg{pNq66RGzw=3k`0RH0*r^b_C#8OM`|}_F$#ye^@loe0zWUnh6>)vO z`LTz#AAjqQS`Yj9AS5azlsp}~Kw;GWA{+ga-7%#mS!^Dsg|48NS z+V;MsBqQV*w}}X%$b+Ts&t^m)f9$cT%Cq~`rHkzV)57j|+c%YW4Iec%aG1kZaCG7P zJ1q=96})*)F(W13322q9=jA-T@ro4c02X0$09 z23bF&0Qwsaq0V)MA>LthmXeBAMgH(-309_k=r5bWxR@`sX^+0F^>pq1loCGsAmuiW zSI?s9j6HZcTl&WD>Jvt8;yrlsW6pAlHR}`K&-l8&V_5JYn8@Q~0cw-;A*!IX@e>*^ zrOFVkX(6zY&2H6C^s9f$okF$jgw9(AXE}#!=^XwIZ{a-t`fVcYu4$7j&B}o84gA4m+&B`v)&hHXU<{w;(>+Hf7)^N5$I!25IWBbB)M$jK zk|NV();6# z;+Og&F8b6M!!KyUYxaiTpWeLGnrve=ou$o*b_EsDY{yWd&GZwD-ba(k)@2JxW0yys z@r;hhD>`^q#6Dx|LC?Y2{1HxV839kVExXVeC?2p>FeZy`@eC$YOd>T z|Mm9y%iC+Oy*d$`IbZWSZ?)^qo3FpTeea+A(RQs(wXLB&n=yIr`Oj@ne&)-Sa5G}< z^ZC=CZ+lBUfBuV~t58Ym^n8U=hlg1`m6MyhmPWuJl--W^Jd72rkZK-VN*mJA z*b)o^tdQ!(R~uW~L{6kaI8xFh^t~(9gUOB@Ikr7q=HPU>|8-dX%}J?W>&#EY-y7r3 z;n@i{LBrglT#2z_%Rt6rLQK+>RI@tK*lQ%HjK}#jIdHp@a=lz90S;x zC=lcEZ^x@%k*30s3PfT?0x3!$wL4xrJK=LgWsOv)Zqi)IRuvba0GnF z#lWn++8U*qgV4i+PrR#rv_V_+@x77EIE;${(>eMZHyP-UzBg7;X?kk#(PLd4n61r? z3y0s)r^_P~3-x8U{!IP-r7wL-m-8a4Yz{@EhccdfQmS{_$Qu*wZ4H|AtqnR3m3n>RsVB$4 zy!zT}+Y3MY>300&nfC6yvVHAqe1fu)@@z8I)pjW03105 z(S(HXG3rjcpkQq`HYsbE3n4qH7)E3mE=1Y63&A}y3afD%HP{Y68w zyej0rk(2UgKYlaiOer?Oo{;4$CU_4vPuq?-%{5bOd%_h0tGc_A(N%tqsUJ*HNmXIQ zIa4`i5)q1CY}{ajgNG{eI(_@&=b|iLxMB?^)q?pkBEc7b^=$3O zsOCegPm3eEFQQmWlrRpa!-RGVQ=E0D2#+vm-<%bXdl)vsWDxGF&zgyGEYb4p$_nuG z;A(cg>i!53Mhv&pabSDVJLZDGHGGx=P}V#VJSLBxVghrn(&pZAO&Z?;_iwi!>_iB? z&vAhZ@C-Ni9;M=Ea0ChS_qwhahL9up^3a!JbOl_a6oL(?6g8uJ=H$WcmRF%n9H&?h5f z{OE-aioYnsmG;bGO0f;yJlocoiogtWj8OegG=#2jnIaeYd1i{?;G$8Of^@p*itH{NF{KLn-XFZ}ZEpaXh;c@H&ojm> zvTHO8Uw8-}f`yTwT$kYt57C7ZDY|RXALgM7&;6t;VHbMrBt;n#qf3Q*5uHU{K22iYUp#* zC!C4}uWDoSrW{|-_e_0Ekz(%{XQPX*OTWRh?8w2ECmHkA)>vO{y|2$W=5@5DYZy(= z#BxZ$z`-Ne#!OZ?-rD8_j3d^&_$~Hab|u4a0C-mhVV3fBMTX*mocG61?b|;4+>^on z!1nU%7pL~)XV0KL^)r>i2aHR+A=wfm6os7z>FTXU1 zdFpA)mY$sru7C8CpKd?;;ZL{U{oUW${vZGGf3m&t_QlyKn+FGXl*G{{%J(O%hcn`b zO9w}icDNCJpD!YAU(FkDZI7Mq{{CMN4oJB_XP`B(ZDc(ulp4D8fi3wGzA02lNZPTA z!QheGhK&NX^T~KlwZTi0iW}vVxx^&WgG%FhtatLHK5Y9t#3wj=?OYUbEH}aY6fMOm zqJE&rMOyxy%gdcOdwfr6^DkB<{aAgrRxKeQI9EFHH{tPbj>iiZ{x*L)1y;0Y&pj~bixxq}d}Bm=hp^-e zjuGQEV&-9|#u0Z{+#~YBUduvi%6c{eO37hDzlkKnF$S)OFy*dY;X1*0poWF#Jkquf zTJP5U2ypL+Sj|IIEEEHU6lVK#Mc|Pu_!yKh5{#Ch1X55lC@Ce1EdH}w&Vm(07W$Jx^D+4CZ6zuhgV%^wHr*)1_(Rzz71h;u9g7aDacWx zAnm3UpD~IQZs$17z1lGr_++&4End4tHd5l0lJA_FUhwk#VoXsKX$CF&GGHrJMV-iG|vzhiI6*KRm-jzVRZ1>ol`_+ zT^qhlak(eTU|7t%F2$R2>pA$|iK>hl44e}8Mnd>~ z=;GCn!^N6648Q3s{V~8NPo7MVb{bC(#KE!@H_}_zir|bD*(?L159dr}aNSwPn!GVK zcp5GlKzPTCcWQf_u^5J9LdPlc3~d1gF4DFJIXI4v_f_FMMP=c2mI1~GumBD;fJg1% zB{C#B#9!v5;mvyV`&(t=S-WFRG+q}nS704|()(aU_9Z7o-S88pt* z(0Qec?+@?2o?HZZL>m5W6vj^0I0rH_mL%ax8GQX7psFhyO;C%&h4BNOeb#R_yEO*NZs-Z(b+_4Yu7M zbsTKlU7mUL;oxhfi$PBHSqwng>BQvleXR|~WOpK(c^-lHVc;FJwf{Wq2Q|n)lPsJT(Z%8Y6U#X8OyJzc1Q*^Y!|^)s}D_)mOFe z{=Iiv4pbphhW}8xb7|_k9c9JCa<(vpIU347os9UTzd{6MWAfedqc`7ZPB_J2eHf%t zMwpx8lwz`}#z*#*ZBuYngf=?B6coULwt*ZY0h#qhXmF|dwfCB@y;Wh@t#(m)@~M;C zqi3JkKJ#olo3yse{>J8iFJHMd2Up){{`~#g<~biupmwJi7}VIewvr@_AG4^q#;}CU zQG}-+d2|k;R!xf$z(SE&2Gh$i2(J_85r~K$O+=s+B}Mj7#cIYl6`b9pNN3)?R|w5t z2ms|86Xyxr=XDfPxLU#+TXipR>)TxLDo%hOg)o$bc_bj=hkf@qzMiA}M}Zq7TwW*1jYSHTi-+7Jrpi9_WS}Nyv0j|TXdoA-W%BFf#u;g^l6iz>l+*nPhe!w zWfW`t4VPd>FG@yJGlqMe5n{qi9^h&mobK_S^(r!&`ByO21_#-=#^A@#Ggnrhn$y>+ zwC(+PPCp_9s}*BSMXOm*vvpx3kspj9>v>+w8FIo0k4svto_ylhI2X{5Rczy7s2qrX!7rZ+= zOr^}>n&C^e#kb_5hm0X!GA4>&TgJp;vK8d+j3vct9k=9!ouc$PX@3q(jqGj{{lFP| zGSCiBsH-t>(yFZlExS~--G>obS%n<*^w9@Rg~81pQB$%SVn(*nlhILRhb1O;A8hDm z&ucKx+-&qgv)k38NLAlT$2ed2bk4T`K#`{t%x<<j$&yWoO=*oNH4WJ8d-l z1E;e>pled|iU9?YoIMP}&bU4%xUtTB?mf98LkBayj~w4SOIQy+bZGmnGxr2D(yl*84@AJRHwqcuM_8okjcFE3cP|e!4x2 zTQgjx*P(XKqLj{^duImn&RcJ`Irfohlalb+74j+eNpZ%Z7b-@2|J}>Y00q9qEtzYm-Ca8YY@ZIkYcZmqD&W zUM~GLib4dD5O_{BfJq6adl+fwLuqgb#wdjkp7!1<%rWGoyK8agJHs(SU&7bDXu})- zWHL21-hcXcw4_#cJj*e%#t1uQzLl@v26fjIG)Ij=gim`%W(%P|^9>~zUr_Lq-fr9ztvCJfcre3_{>Dh4YYJp_nGwpl6Ghz3$sL0fy}+R^ z0zcsw^hN(DGPov-WbRz`4dy7PQn!1^eO=MG+o3W+42W&}q^{=xl;9H4qYp(p#||P! zz(`TfbP{3)GaW-F$?6m#C705si!Y^CbF$L|hngP1x5KkRiB_{FH@T8FMW>r(*JSND zfC?jb_o6X=#wTbm>T9r#6g_g%!vlwq^FO*P(7;1CxjsvQf?HH7o5As#6mu}Zv87{V z+yNzUW^VgVg1|74A9~JI)1eIRIMtyptaPo+TSju6o_>4!>8Iy_dqIlnGS$bNtGPS; z?MbIFI_C8`^FNY>jO%1>qDLcg`&?r@=niAy^z94Z@XElt43*WIzm)8Q44R13^~pR%gUJ&1gXu_; zZZ20QCGdhhI3MYzG)T{Jxcea)VYbH!Yb=XKE6vS;zL8D%GW$h7?CtPD2WWiKROeG? z3RVO(_`G-P{LzggvA@2!chc^&c~bl|^ZCI+zbW3e)>WXQ0CuJn>x&HB?qsQBhacOX zZ7&HK4a@jGwBVPcR2#coYa{tZ&j zw7dtFKkWd8H{QCi{nD?!+3)|?)|S=V@A}=py-Dwjo%Hea_O-9Qww?d*tt@}19o2>? zNm^@mrpa6Uv`wtve)Buqwew$WU;k}I(`UXu0s*Hyt(kL3@OWk?^Bj2cb4FuIUV8kg zvz;ta)caXQRf+!0qk8W2sT5!gp(yAGFS1DZ_U*%iI456#L#o)p3fj5$*~RU%BKF5( zz)ROIZl}-vj_urQU*CT7GymfDbSZ?VN(mpck#~&FtCh~aT8aC2zx%`Oo8Nh3`}J@9 z+V=VT7q%x~XrJaMpN@&vJPoFdIzvF7=+Po}cpV{W45ACCZ`{3mD^KZ}2*Vq6DozT4 zQ1rN{igF;__rjUzh|%E<#&^T`=EoT;LTI^>`O}(;SusT3V}eQ9GnSLqi}GEGzUGa) z5q0WgUjj?n5kyLG^+TyLuB)1Qf5%IDy4!o}y~hdh&RBfWat!pNv$|==VH6>SGO6C41tSF=}2k7vIiq!dib6Ft4aYJQV&!%>g6v?s!WfdUHVQA9SQ z@BUq80&ee@svO0R8nusp#(JkTrHswUWH6vh{~x6{ur1^dAES-sVGJUL4FeF32N}@V zBK%Th8PH(HC#EU%=iW(`x)!|n#lxb^nbYbyFi^sn(ejDDZYNH5+#3T?ZG`cm)xtZY z!~nv#n5g!PJZ|3FoBp^J{FGo(W!;GG;g>$ZKT?H*KQst7xWfA~Ghn0T_f>PjkguXP zJR4SIOiE)*T|P{1hF2Tk)Cy#*CY2gaIp)%kWXmBR4C2XBljH-=rwX~YG1u^I_sPuM zD1yhk=)rm747q+=D!Fmcos0^U2D*pomi^@+Q+cX;jbjjk(F6!FH#=oEZX zyA#bmf|1;KIldCkReKKyG%${yLn=n*TK!_GPxg!cJY4qClDhlJkU3<$42SrKT$pFY zGqamiZH;3)xFJu`7yr^JjeFsm6WDmthxkF-93L@wX^_QV!3WotnyyS+e9>?HZ^lLX zwTln$Jt%lf&Sf+4lqtz^bQ{x4FFm`x@Z3||58nJ}`@vfu6ijg@R)jxm++i%3Z#2bN z2E5Ee*+~IPzc;zK$%U|pPEk5wkAV2Ep$z}sjVI``qlw`&t;8{vXs-Ffg|@8h=*3f~ z&NLd%c)K6oveViM1|K)~DMH!b~e z@X1e#l8^Q5=iBx8*IL>y6HbQmI1lkLdw{m(SlhK7&k!P%LKQ~lMDxfhR&S;BtgVz% zwxbM&MUbm)H_6N8#XpFF9u`?%Par6y$McAfhm==-`Zvw;s%P>vZ7{DwaZ=GCTI8&_ zOL5r`i&Q`U=);8I)9tM{-`@V(FMfBkf!x`Xjpfy+XPZc+=9CX+Y>1?*&jiWVhE|9Z{=-kU)16=WT*jB6NCO!&#tYo#2*n)tMj@}c&>BqOMQF<_q!1{327>fZ z;uuIItPR2e-xL$i%{GsY`Je)tLU+F^=nB5!XDL~W4Y9-Xnt z7APPi^!|2A|GuIlr}0c$F?dC1Up^Yoq^0V66i7X<%?%pEy!7Ek zsB5EkC<@A#Aw%ymBHiXY9p%j@;xWWlEj@=2{H%%Ts_D`o_Y^IZupFcrE4Cqf?P5WWcHQ zq?4to4G!mIJu>VJ`V_8&6L186Q!cl*o6&iuc;fp>Uyc*7il^`#9dRhReL@;F#UtA0 zu;>e29%gtN^*99#oiU8!#eXpkh0cKyHOfw*F{SEh^Q5ZE2X<+|p3wxyjzTX^iU0jZ zS+6SF;S+sucBZ}VW7NYRwA@Fpj0>KU(gYJ6-07U$X}6wbMHmALh;Ct+Vbq@kTqtyv z$5Xi3Tr@gLrTd%djmDtenXVHr|gLV!UW89iKc&?Q^oc;K#$p4F7Blx{w1rInxEfAk)P- zsTRTmPQ=5@rmaN80y0xs;N5T9D;^p=KGt};uLt52bqNZbqE~(NR{z1*y8^Gv?d5EX z*{^=(C&obj;CtVl0L^p?e&_6P04!T|$jdp;#Lqer;?s*)ia1;1Q>6FLfMLsoEoiEQ3twuht<3{P^OV zZO-vqw^v?zdAsoDugzNFFB!+1cS`%VHn&2J)1`C2^70Gg)e`0>_DX4_sKe!f{&%VQ z)LUOxtWbogP+`yA4Cg4@Ra|iG(uM6>#8BumNAtzZM~|#^Y4=M}?axzG=ykbr{^O;M zPXxacM-FD3y&uV#GuDpBQjov<>gs0E+V#&AM^9H z{oxqiASJZ~SUPSg1V#@-d5)T2kvLB|BwR4G`d=4VssLo%YI+_WWxs^oSSAtpu=xLnk(tMExtyKf9<*C$FWo1?hoZey?<<3W|sxt4=x(=;Q&lv-`YY@rpcD}ZS{ zj3)WykTGP2vN!k`xT(5s93olOyT(uH%)u*-Rpq=FgE1*T{DW@YDH6VShcl5;d360| zFfau0!}-vl%#=vc5tqC4>X#WAJYtLkQ}@k0Yj`rQnd|_B4px_Qpx?zCKnk{WtQ8QPJn7w8E85YbcueKH z$43sD7k)aONvYdp!cnd=6m}=P+krBBGfqu(j|}58#hr}SOnbyPWMZ7jctFPHzQAjI zFOCoc$JxYx@lyJVfxMIc;;7M&_a4w?a2!Pa$xMJ9zdEW@``|Ptw#2#Dik+MoC)$>k zoC3EguHulZNr4l1l=Z=XrS8o!!-qbTEzjbAjw3zF>7Gq&(750F-#A>e4@Bek6Jw6o z@yz4N2_$l)K5B<7^nLcZ+bt74*;dQX%nB9v%Ovi3tW@#r|1LvlnxM==xRQG3cpYde z!x+pT+bQyUZ@rg+y|lgY!)!sXqn!u+%B#Oe zJ+}AQ_PtWE$4ajrYdx<0K}A7dUc0}&|L#ZIKl$6gz8yIG@^;e!#?6Oaym)E*?i=5Z zu@22ZpFP*EP(`7_@dKqTPoFwgH2T!`%#&xfuPd}_?iABdD)IIRNze`<2<=3Gm;%9L zHtIVvbz?X807e@xbt-Y`(%|bkQS|2_=Y#h@DrJ6kyL|rR=8BrHD(%iABd`u=NON`Q z@{#r#Ju?hr=?G>$8eBi~wXbY{^H;t%-j6iUktW_Pk3#6oUVUNKwOqj5;rUN5&3v>; z`4?VzF(tF+5=BeAN!7UnFJ_bSsSS#Am!g{akc4**6=%>>E|2$|B8J&pJGfM6o3}%F z6a2$0jhB$bgM-IGPG5L+m=&sKKCAw0UOTBN1~deU&eANNjOht%*o_f+bjt{@=#!zD zWjVE0tf?A%`N#2%p&sCOa{PQyE+6*W|o6-Acv9j zgx6JQOMBsQGI1*}ytnP{-sOa(lZO5jDCMy~h45v#yV^7j=ZJCx`&6wr<^vVC95~K_ zu3#zTDD;^KEIw-hqc8$v98=4vz--pITWgx-_ z!CXI#G#P+rdd_`QfEH|QPy?x9yxEw#mmWdWaay8>&*a&j`JCmcb`QTC{L@XznZq@m z@rEx;+3AI6MCCxe17qz7n}b2 ze*D(7P0O&rI)*72O?ylMR6MvRp0Gg@x{TqCe;Qh}=VWznV|_gSFt^KSiV#(9kMSk) z;Y0K|wF7zDQr<6bw)rSurZSUiY+x1Hyj>mkabnL@>XUS!P zytjE#n;;x1Md18Io-!se|FX`n{h}lMK5Gk1g$Z{`57?ek#J+lrfu8_cM9#mi9_3C?F~IqRm2?O$WT*Ul;T7%MLE(pU*3JJ?J{53 ze(+vv9`mvg`)K<~pK7i;kxyaW9xv&!ygmCyUu)~m6UR?>xWiM!q_YD}!U5yl2Pv?B zoTXIx5pt!1R(L^cGEqVgvl$>7Zqi^G(qIWS_lTB)v;x*Lb3=T=%L;j5kT zYQs6XfHQ_g>!fu5jeB`!RjIGjo>R4_3_lV_~2uqG|tj zLPStSLWD>pU&}G)nq$8|&)Rt>diI$&PgyWH+L>3dfC=#Tx9b!A zMbzMwuAT4k`^7RuPoF*$d}vl0vwp}cLjl)tHB^b_9FUb>Y)MT2W{F;~-8Y{GH_;XT z;ML1JMXw2bOTkj~JyIYfTD9SbeW(>mt>Q83_Z{74s>po~J6};s)ya8CWETxo^5gLt zPkas6K2O@WeigYrNPi6U`j1ciMsIQaCerJwwnuS?6YWu`k3ViHQ4vhz0IDhd9)tyqbp;97R^_eK9>dHaM)-_(2|%A4DiAq z0T1VhyrVfjnQ*A<_=3?j<#4Y`#C7?b%bo zT0x~Ciw%IM6}3OsilH-AW1rvti~sJg7TmQA>0sXP)9oa6fTGIDRV~Yyd~{4%Ql1jFfTx{FCkDJD0c5KmB28f@66kYn_||ERm$Nj1ggegt}<$ z?2}LB#oSuC``VM|KNRs4TivYygEx6NqVIXw!t{jTcm-S&8P}Gr^LU|zO!|lMv?U*5 z#$<e@`$RZ; zZW){yiBcW~5@NrMxHpixa`smx2cKLzs8XQ<0(pcMLqn z5}^m_awK|pV1s#{2a~?;Ubi=H^U`<;Ud=&ULID)TAB0!Bd%WZto$)fTwdd%{QSQ^y z5_%6(Vw?xU<;8Qa`B=mM>ob9zWklUua%--Qfoz<-_GEt)7hH@{oOTkw_+yNB&3LEW z$IGuTJjZCe0CPZ$zu#}Wyc<=$1w<2*@V=3Ml)sKYt6sq7>)8? zW0-aAMI!ppHyPtq&osjfD}k;piuHD~2JeRJx_%fBX;DgqoW&+%fS-Hrx#`o~n)yLl z9xp>i8!2Ud^=;s~FXF(b@x>I5&D{(4jHPIjQ5)l!XNFYpF@~T%&`tDcN@rk57Qqcq zdv7bI5q2PObqOPf&jVEKf<{z#756AseOf&{J zTyR2KUm3o0PQo|Y)W-Arj|Tid#lzs>_?I!Y&s2mi$06P->c`fasLbiNla$*`Gr zl!_O)Fy@8l75i1UbhT;LPe0yH9NAyc6_G4C`sOqW=y_I&)lPF8USIE zBDhfGdnoUTdqi>anj-CV{PsKVZ2!!&ziT^p?yK9Izww>zmD08jMxfMg#gqWNUrG8N zlj_Os(Yy}n=rcuElU1Ne z7f6Tka2`$Ram4}B(D&<0;mX5iV_56En}cE61IIsO`#L9 zDH-=*P67)K-kx2%Fv>$~-nv0`CIw9?@SKyH5ek`rRaxj<(W3q6$P@QkhG#ve?NL0@ z;C_rdYi|>jG*iOE)6Q7+6+K0dlndtFo7ZU`$0h)TEKK!}S4zgf~_+}|NbC)%g zAQL!MW>%@a|oPxJadYwLP8cGh7hbwRE8iJs5}sLzmXQ z!8?&#?=u$PYZDx+sqh$$rVwcjwg<^q@Ya~(wYJBlkl$!olElKzUU%0{Bj0e3~i=+4M zwB~t5_|biMh3jX>xB`{NBCDu%*NknlKp`D3!@DdGI!bZFE$3nz%`khqU;C||LyCb zo~q*G<;$IMpvbr{;T}H(VmQU?<5ULI<2ggde(8(*+h<=~E!b~DMZb&YwAR~JLt+yOx`JrAAn zwWuAF0o;H9#7h#Psf0V4$Bp5sV}|ea$s^nO_ut;W{+oWwD56h3_(9t%KAjt;C%K6 zO(EE!h$@jrr-ahOlZr;UhB=-%FI(hD+1SZO>f@QB^jisnqO|drKof&e80IF^RYji_ zZRPP?xYXL)Qrzd7zdqeO`4o9&qzN#^>vg=MHk-bWB27R<%lenXlIo}UC{5ce8vD%Q zCV0Hs*&jB%i@+v*7@QmoOG;GjQ2{myz^w4mBH%=tnGim=3{*`)y z4=JoPYhz`6cLrt{J={@l7{`6ml!;@13y+KzW~EHP00`eFLLQiwV1W&fxQBz_-|Yl= zj1&dlZ|<4rdy|=(x}zB1{YmtpwM-4_Wi~+67C3r%6gTIP4wz!E?(6ct2JS z`eA^Nj~v;~ref3tz@veIGIh8$6KTrR1f>>4nnpDaqk^ z*Q2NC<5qgWa>3<*Hrd(%o}89q_3vz!Wc25oKWd#kx%Q-3$2&2;6~MiA zikz2ZczZG$UJ%-NLc;!;n11i_{aL$avy{tcIRsMF`A4(vkMgpX@lvU6>jhT|sB?2$N`V!R1nYwb9ntvY={e!(^xGFA z-0_wsNdZ+QZ4c*gsRHmp>pw%?q}VYSMmpHC3<_Z1zC<{9_w8Ro)hyNsC2-wmoP_>h zX`cfXOAL%fUj&yTqI7PRjWBPtwe9sWvhcV$i*mr6F;g23C@X{!h6~}~v$4BD~)xLl5?RUb&89~7@DzMsgncXVgeDT-_HB86-E=g6UB0|R4$ulCdj z94hGPt^30_8p03i@(voh)Ia?>JQBYvvZAm(qknW2VGd8#;KQ6Xb9bw#$zA9ktW^c0 z3*$|Jav&#t+cWfl6Jhi%UH?S#al|Ga*IR#?V=PrmN!u|CB@TY{1}++DlVf_Jh>^^5_Q@?CG#5;_jlg}@x&rc9b1m{&Xi1Lmz2J;H;rJ8`NnGhGFVqIxjIM1uoH3{J@|nL*Q$zgUml zEaSm|Ec$`raE`+`S<%+=O5;Xg{4K40>g37No9CKWT#hWqegcxRcLF2)V?6iEC~-U) z&X{0=4Wk*Ol#EP9F(-l!H8_SE2XQ(gb#$jAvK3@GxanWxVdPe}XzfXF7q6K%i09yz zd`tx2QbsxjzoDa}Z1Mf=^t-KXtwvE@JdQ*if=7|vOiRIDFveZks~CGJ8#-O@;g;q-<*soKKb6eA8-G{&;HKspZ~qT zXWRSoxzn$IRuo5R^L}|+fcGcd_o6^|%rqt05!sv`S^%O0?kMhhVn+eEd!-$-$Np3)jakdf)k0A2cXm@oXUgRgI=l=ilMtod>&o``XvWlZ0H``s8ikLSjh<8_{Ha{eGMtn1RQ z=4LS>uT7sAN;_aNuW%qC!9>O(^)Z{O2Q$Xt$&m-=NAkG#CsdT0Bl5I)C?#)Bng{$? z0zt4xVK)~0+Ug6FuXGZ{z9O1cD3nkpn3NEP#k=c&;bG|i$a%rQUBt+Y=-S;WCT?tC z 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¨6VW%vWF=MX*{IgkHk2e}oN-PbijK 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 a2mU`>iJ4_DWrlJ90000 + + + + + + \ No newline at end of file diff --git a/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/section-1.swift b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/section-1.swift new file mode 100644 index 000000000..b505e7b50 --- /dev/null +++ b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/section-1.swift @@ -0,0 +1,10 @@ +import Cocoa +import GPUImage + +let sourceImage = NSImage(named: "ChairTest.png") +let filter = GPUImageSobelEdgeDetectionFilter() +let outputImage = filter.imageByFilteringImage(sourceImage) + +let customFilter = GPUImageFilter(fragmentShaderFromFile: "CustomFilter") + +let outputImage2 = customFilter.imageByFilteringImage(sourceImage) diff --git a/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/timeline.xctimeline b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/timeline.xctimeline new file mode 100644 index 000000000..b24641fb5 --- /dev/null +++ b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/timeline.xctimeline @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/examples/Mac/PlaygroundExample/PlaygroundExample/main.swift b/examples/Mac/PlaygroundExample/PlaygroundExample/main.swift new file mode 100644 index 000000000..9a3490820 --- /dev/null +++ b/examples/Mac/PlaygroundExample/PlaygroundExample/main.swift @@ -0,0 +1,4 @@ +import Foundation + +println("Hello, World!") + From bdf73ee97cd353c0ae7143809aea33beb7abf464 Mon Sep 17 00:00:00 2001 From: Sascha Hameister Date: Sat, 16 Aug 2014 21:47:48 +0200 Subject: [PATCH 579/695] Fixed issue, when camera does not properly started capturing, after viewing the view again in fully glory. --- .../FilterShowcase/ShowcaseFilterViewController.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index f1acc51b1..24f47628c 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -49,6 +49,14 @@ - (void)viewWillDisappear:(BOOL)animated [super viewWillDisappear:animated]; } +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + // Note: I needed to start camera capture after the view went on the screen, when a partially transition of navigation view controller stopped capturing via viewWilDisappear. + [videoCamera startCameraCapture]; +} + - (void)viewDidUnload { [super viewDidUnload]; From 423ff362727bf8a1eb71451b4c26b39bcc9187cb Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 18 Aug 2014 17:58:09 -0500 Subject: [PATCH 580/695] Incorporating the crashing fix by robmaceachern from here: https://github.com/robmaceachern/GPUImage/commit/fd4e39b2079057064f9549a7911ad7ea31e0ad62#diff-d41d8cd98f00b204e9800998ecf8427e --- framework/Source/GPUImageFilter.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 3fac78087..68591febf 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -189,11 +189,13 @@ - (CGImageRef)newCGImageFromCurrentlyProcessedOutput return NULL; } + GPUImageFramebuffer* framebuffer = [self framebufferForOutput]; + usingNextFrameForImageCapture = NO; dispatch_semaphore_signal(imageCaptureSemaphore); - // All image output is now managed by the framebuffer itself - return [[self framebufferForOutput] newCGImageFromFramebufferContents]; + CGImageRef image = [framebuffer newCGImageFromFramebufferContents]; + return image; } #pragma mark - From 36e277aa0529d99d8e33f826cef96093a400df58 Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 19:57:00 +0100 Subject: [PATCH 581/695] Update GPUImageHistogramFilter.h --- framework/Source/GPUImageHistogramFilter.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/framework/Source/GPUImageHistogramFilter.h b/framework/Source/GPUImageHistogramFilter.h index 6016d5e6c..32004bf71 100755 --- a/framework/Source/GPUImageHistogramFilter.h +++ b/framework/Source/GPUImageHistogramFilter.h @@ -19,7 +19,4 @@ typedef enum { kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogra - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; - (void)initializeSecondaryAttributes; -// Rendering -- (void)generatePointCoordinates; - @end From 7d8f303936e3b8a0240a2958265fc048ae681417 Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 19:59:07 +0100 Subject: [PATCH 582/695] Added support for fast texture upload --- framework/Source/GPUImageHistogramFilter.m | 25 +++++++++++----------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index bc2b6394d..bb7acce7e 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -218,7 +218,7 @@ - (void)initializeSecondaryAttributes; - (void)dealloc; { - if (vertexSamplingCoordinates != NULL) + if (vertexSamplingCoordinates != NULL && ![GPUImageContext supportsFastTextureUpload]) { free(vertexSamplingCoordinates); } @@ -227,11 +227,6 @@ - (void)dealloc; #pragma mark - #pragma mark Rendering -- (void)generatePointCoordinates; -{ - vertexSamplingCoordinates = calloc(inputTextureSize.width * inputTextureSize.height * 4, sizeof(GLubyte)); -} - - (CGSize)sizeOfFBO; { return CGSizeMake(256.0, 3.0); @@ -239,11 +234,6 @@ - (CGSize)sizeOfFBO; - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - if (vertexSamplingCoordinates == NULL) - { - [self generatePointCoordinates]; - } - [self renderToTextureWithVertices:NULL textureCoordinates:NULL]; [self informTargetsAboutNewFrameAtTime:frameTime]; @@ -282,8 +272,19 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } [GPUImageContext useImageProcessingContext]; + + if ([GPUImageContext supportsFastTextureUpload]) + { + glFinish(); + vertexSamplingCoordinates = [firstInputFramebuffer byteBuffer]; + } else { + if (vertexSamplingCoordinates == NULL) + { + vertexSamplingCoordinates = calloc(inputTextureSize.width * inputTextureSize.height * 4, sizeof(GLubyte)); + } + glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates); + } - glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates); outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; [outputFramebuffer activateFramebuffer]; if (usingNextFrameForImageCapture) From 3fae1fee6a52384f2cbcf598c0de695a3ceaf22b Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:02:22 +0100 Subject: [PATCH 583/695] Added new histogram equalization filter --- .../GPUImageHistogramEqualizationFilter.h | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 framework/Source/GPUImageHistogramEqualizationFilter.h diff --git a/framework/Source/GPUImageHistogramEqualizationFilter.h b/framework/Source/GPUImageHistogramEqualizationFilter.h new file mode 100644 index 000000000..2b71cda08 --- /dev/null +++ b/framework/Source/GPUImageHistogramEqualizationFilter.h @@ -0,0 +1,26 @@ +// +// GPUImageHistogramEqualizationFilter.h +// FilterShowcase +// +// Created by Adam Marcus on 19/08/2014. +// Copyright (c) 2014 Sunset Lake Software LLC. All rights reserved. +// + +#import "GPUImageFilterGroup.h" +#import "GPUImageHistogramFilter.h" +#import "GPUImageRawDataOutput.h" +#import "GPUImageRawDataInput.h" +#import "GPUImageTwoInputFilter.h" + +@interface GPUImageHistogramEqualizationFilter : GPUImageFilterGroup +{ + GPUImageHistogramFilter *histogramFilter; + GPUImageRawDataOutput *rawDataOutputFilter; + GPUImageRawDataInput *rawDataInputFilter; +} + +@property(readwrite, nonatomic) NSUInteger downsamplingFactor; + +- (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; + +@end From 25707c6170ce1269a51abfc2f893260403c7b56c Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:03:46 +0100 Subject: [PATCH 584/695] Added new histogram equalization filter --- .../GPUImageHistogramEqualizationFilter.m | 306 ++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 framework/Source/GPUImageHistogramEqualizationFilter.m diff --git a/framework/Source/GPUImageHistogramEqualizationFilter.m b/framework/Source/GPUImageHistogramEqualizationFilter.m new file mode 100644 index 000000000..8247caf0d --- /dev/null +++ b/framework/Source/GPUImageHistogramEqualizationFilter.m @@ -0,0 +1,306 @@ +// +// GPUImageHistogramEqualizationFilter.m +// FilterShowcase +// +// Created by Adam Marcus on 19/08/2014. +// Copyright (c) 2014 Sunset Lake Software LLC. All rights reserved. +// + +#import "GPUImageHistogramEqualizationFilter.h" + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageRedHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp float redCurveValue = texture2D(inputImageTexture2, vec2(textureColor.r, 0.0)).r; + + gl_FragColor = vec4(redCurveValue, textureColor.g, textureColor.b, textureColor.a); + } + ); +#else +NSString *const kGPUImageRedHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float redCurveValue = texture2D(inputImageTexture2, vec2(textureColor.r, 0.0)).r; + + gl_FragColor = vec4(redCurveValue, textureColor.g, textureColor.b, textureColor.a); + } + ); +#endif + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageGreenHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp float greenCurveValue = texture2D(inputImageTexture2, vec2(textureColor.g, 0.0)).g; + + gl_FragColor = vec4(textureColor.r, greenCurveValue, textureColor.b, textureColor.a); + } + ); +#else +NSString *const kGPUImageGreenHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float greenCurveValue = texture2D(inputImageTexture2, vec2(textureColor.g, 0.0)).g; + + gl_FragColor = vec4(textureColor.r, greenCurveValue, textureColor.b, textureColor.a); + } + ); +#endif + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageBlueHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp float blueCurveValue = texture2D(inputImageTexture2, vec2(textureColor.b, 0.0)).b; + + gl_FragColor = vec4(textureColor.r, textureColor.g, blueCurveValue, textureColor.a); + } + ); +#else +NSString *const kGPUImageBlueHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float blueCurveValue = texture2D(inputImageTexture2, vec2(textureColor.b, 0.0)).b; + + gl_FragColor = vec4(textureColor.r, textureColor.g, blueCurveValue, textureColor.a); + } + ); +#endif + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageRGBHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp float redCurveValue = texture2D(inputImageTexture2, vec2(textureColor.r, 0.0)).r; + lowp float greenCurveValue = texture2D(inputImageTexture2, vec2(textureColor.g, 0.0)).g; + lowp float blueCurveValue = texture2D(inputImageTexture2, vec2(textureColor.b, 0.0)).b; + + gl_FragColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, textureColor.a); + } + ); +#else +NSString *const kGPUImageRGBHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float redCurveValue = texture2D(inputImageTexture2, vec2(textureColor.r, 0.0)).r; + float greenCurveValue = texture2D(inputImageTexture2, vec2(textureColor.g, 0.0)).g; + float blueCurveValue = texture2D(inputImageTexture2, vec2(textureColor.b, 0.0)).b; + + gl_FragColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, textureColor.a); + } + ); +#endif + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +NSString *const kGPUImageLuminanceHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying highp vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + const lowp vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + lowp float luminance = dot(textureColor.rgb, W); + lowp float newLuminance = texture2D(inputImageTexture2, vec2(luminance, 0.0)).r; + lowp float deltaLuminance = newLuminance - luminance; + + lowp float red = clamp(textureColor.r + deltaLuminance, 0.0, 1.0); + lowp float green = clamp(textureColor.g + deltaLuminance, 0.0, 1.0); + lowp float blue = clamp(textureColor.b + deltaLuminance, 0.0, 1.0); + + gl_FragColor = vec4(red, green, blue, textureColor.a); + } + ); +#else +NSString *const kGPUImageLuminanceHistogramEqualizationFragmentShaderString = SHADER_STRING +( + varying vec2 textureCoordinate; + uniform sampler2D inputImageTexture; + uniform sampler2D inputImageTexture2; + + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + + void main() + { + vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); + float luminance = dot(textureColor.rgb, W); + float newLuminance = texture2D(inputImageTexture2, vec2(luminance, 0.0)).r; + float deltaLuminance = newLuminance - luminance; + + float red = clamp(textureColor.r + deltaLuminance, 0.0, 1.0); + float green = clamp(textureColor.g + deltaLuminance, 0.0, 1.0); + float blue = clamp(textureColor.b + deltaLuminance, 0.0, 1.0); + + gl_FragColor = vec4(red, green, blue, textureColor.a); + } + ); +#endif + +@implementation GPUImageHistogramEqualizationFilter + +@synthesize downsamplingFactor = _downsamplingFactor; + +#pragma mark - +#pragma mark Initialization + +- (id)init; +{ + if (!(self = [self initWithHistogramType:kGPUImageHistogramRGB])) + { + return nil; + } + + return self; +} + +- (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType +{ + if (!(self = [super init])) + { + return nil; + } + + histogramFilter = [[GPUImageHistogramFilter alloc] initWithHistogramType:newHistogramType]; + [self addFilter:histogramFilter]; + + rawDataInputFilter = [[GPUImageRawDataInput alloc] initWithPixelFormat:GPUPixelFormatBGRA type:GPUPixelTypeUByte]; + rawDataOutputFilter = [[GPUImageRawDataOutput alloc] initWithImageSize:CGSizeMake(256.0, 3.0) resultsInBGRAFormat:YES]; + + __unsafe_unretained GPUImageRawDataOutput *_rawDataOutputFilter = rawDataOutputFilter; + __unsafe_unretained GPUImageRawDataInput *_rawDataInputFilter = rawDataInputFilter; + [rawDataOutputFilter setNewFrameAvailableBlock:^{ + + unsigned int histogramBins[3][256]; + + [_rawDataOutputFilter lockFramebufferForReading]; + + GLubyte *data = [_rawDataOutputFilter rawBytesForImage]; + data += [_rawDataOutputFilter bytesPerRowInOutput]; + + histogramBins[0][0] = *data++; + histogramBins[1][0] = *data++; + histogramBins[2][0] = *data++; + data++; + + for (unsigned int x = 1; x < 256; x++) { + histogramBins[0][x] = histogramBins[0][x-1] + *data++; + histogramBins[1][x] = histogramBins[1][x-1] + *data++; + histogramBins[2][x] = histogramBins[2][x-1] + *data++; + data++; + } + + [_rawDataOutputFilter unlockFramebufferAfterReading]; + + GLubyte colorMapping[4 * 256]; + GLubyte *_colorMapping = colorMapping; + + for (unsigned int x = 0; x < 256; x++) { + *_colorMapping++ = (GLubyte) (((histogramBins[0][x] - histogramBins[0][0]) * 255) / histogramBins[0][255]); + *_colorMapping++ = (GLubyte) (((histogramBins[1][x] - histogramBins[1][0]) * 255) / histogramBins[1][255]); + *_colorMapping++ = (GLubyte) (((histogramBins[2][x] - histogramBins[2][0]) * 255) / histogramBins[2][255]); + *_colorMapping++ = 255; + } + + _colorMapping = colorMapping; + [_rawDataInputFilter updateDataFromBytes:_colorMapping size:CGSizeMake(256.0, 1.0)]; + [_rawDataInputFilter processData]; + }]; + [histogramFilter addTarget:rawDataOutputFilter]; + + NSString *fragmentShader = nil; + switch (newHistogramType) { + case kGPUImageHistogramRed: + fragmentShader = kGPUImageRedHistogramEqualizationFragmentShaderString; + break; + case kGPUImageHistogramGreen: + fragmentShader = kGPUImageGreenHistogramEqualizationFragmentShaderString; + break; + case kGPUImageHistogramBlue: + fragmentShader = kGPUImageBlueHistogramEqualizationFragmentShaderString; + break; + default: + case kGPUImageHistogramRGB: + fragmentShader = kGPUImageRGBHistogramEqualizationFragmentShaderString; + break; + case kGPUImageHistogramLuminance: + fragmentShader = kGPUImageLuminanceHistogramEqualizationFragmentShaderString; + break; + } + GPUImageFilter *equalizationFilter = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:fragmentShader]; + [rawDataInputFilter addTarget:equalizationFilter atTextureLocation:1]; + + [self addFilter:equalizationFilter]; + + self.initialFilters = [NSArray arrayWithObjects:histogramFilter, equalizationFilter, nil]; + self.terminalFilter = equalizationFilter; + + self.downsamplingFactor = 16; + + return self; +} + +#pragma mark - +#pragma mark Accessors + +- (void)setDownsamplingFactor:(NSUInteger)newValue; +{ + if (_downsamplingFactor != newValue) + { + _downsamplingFactor = newValue; + histogramFilter.downsamplingFactor = newValue; + } +} + +@end From 556e85777fa66d72b95c26fc1f01f7a5fb693d9f Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:04:46 +0100 Subject: [PATCH 585/695] Added new histogram equalization filter --- framework/Source/GPUImage.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImage.h b/framework/Source/GPUImage.h index a1f4dabae..b715f0a4f 100755 --- a/framework/Source/GPUImage.h +++ b/framework/Source/GPUImage.h @@ -91,6 +91,7 @@ #import "GPUImageMaskFilter.h" #import "GPUImageHistogramFilter.h" #import "GPUImageHistogramGenerator.h" +#import "GPUImageHistogramEqualizationFilter.h" #import "GPUImagePrewittEdgeDetectionFilter.h" #import "GPUImageXYDerivativeFilter.h" #import "GPUImageHarrisCornerDetectionFilter.h" @@ -154,4 +155,4 @@ #import "GPUImageZoomBlurFilter.h" #import "GPUImageLaplacianFilter.h" #import "GPUImageiOSBlurFilter.h" -#import "GPUImageLuminanceRangeFilter.h" \ No newline at end of file +#import "GPUImageLuminanceRangeFilter.h" From 3d92e375994a2c72d5b590e1279962a955395647 Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:06:01 +0100 Subject: [PATCH 586/695] Added example of new histogram equalization filter --- .../FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h index 00966e61d..b3fe2a17a 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h @@ -29,6 +29,7 @@ typedef enum { GPUIMAGE_COLORINVERT, GPUIMAGE_GRAYSCALE, GPUIMAGE_HISTOGRAM, + GPUIMAGE_HISTOGRAM_EQUALIZATION, GPUIMAGE_AVERAGECOLOR, GPUIMAGE_LUMINOSITY, GPUIMAGE_THRESHOLD, From be7898a17276c386e2b7017c5fd8bc2518fc077a Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:07:31 +0100 Subject: [PATCH 587/695] Added example of new histogram equalization filter --- .../FilterShowcase/ShowcaseFilterViewController.m | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index f1acc51b1..2113306d3 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -386,6 +386,17 @@ - (void)setupFilter; [self.filterSettingsSlider setValue:16.0]; filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB]; + }; break; + case GPUIMAGE_HISTOGRAM_EQUALIZATION: + { + self.title = @"Histogram Equalization"; + self.filterSettingsSlider.hidden = NO; + + [self.filterSettingsSlider setMinimumValue:4.0]; + [self.filterSettingsSlider setMaximumValue:32.0]; + [self.filterSettingsSlider setValue:16.0]; + + filter = [[GPUImageHistogramEqualizationFilter alloc] initWithHistogramType:kGPUImageHistogramLuminance]; }; break; case GPUIMAGE_THRESHOLD: { @@ -1568,6 +1579,7 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_WHITEBALANCE: [(GPUImageWhiteBalanceFilter *)filter setTemperature:[(UISlider *)sender value]]; break; case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(UISlider *)sender value]]; break; case GPUIMAGE_HISTOGRAM: [(GPUImageHistogramFilter *)filter setDownsamplingFactor:round([(UISlider *)sender value])]; break; + case GPUIMAGE_HISTOGRAM_EQUALIZATION: [(GPUImageHistogramEqualizationFilter *)filter setDownsamplingFactor:round([(UISlider *)sender value])]; break; case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]]; break; // case GPUIMAGE_UNSHARPMASK: [(GPUImageUnsharpMaskFilter *)filter setBlurSize:[(UISlider *)sender value]]; break; case GPUIMAGE_GAMMA: [(GPUImageGammaFilter *)filter setGamma:[(UISlider *)sender value]]; break; From a3505cf65c24620068d1d9d66183ee5c5fc83065 Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:08:30 +0100 Subject: [PATCH 588/695] Added example of new histogram equalization filter --- .../FilterShowcase/FilterShowcase/ShowcaseFilterListController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m index def89d0dd..33f8c3df6 100755 --- a/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m +++ b/examples/iOS/FilterShowcase/FilterShowcase/ShowcaseFilterListController.m @@ -87,6 +87,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case GPUIMAGE_HAZE: cell.textLabel.text = @"Haze"; break; case GPUIMAGE_CHROMAKEYNONBLEND: cell.textLabel.text = @"Chroma key"; break; case GPUIMAGE_HISTOGRAM: cell.textLabel.text = @"Histogram"; break; + case GPUIMAGE_HISTOGRAM_EQUALIZATION: cell.textLabel.text = @"Histogram Equalization"; break; case GPUIMAGE_AVERAGECOLOR: cell.textLabel.text = @"Average color"; break; case GPUIMAGE_LUMINOSITY: cell.textLabel.text = @"Luminosity"; break; case GPUIMAGE_THRESHOLD: cell.textLabel.text = @"Threshold"; break; From 9101aa6bc79298972c940500835e2f9269810907 Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:11:22 +0100 Subject: [PATCH 589/695] Update GPUImageHistogramEqualizationFilter.m --- framework/Source/GPUImageHistogramEqualizationFilter.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/GPUImageHistogramEqualizationFilter.m b/framework/Source/GPUImageHistogramEqualizationFilter.m index 8247caf0d..7d6b9a2d5 100644 --- a/framework/Source/GPUImageHistogramEqualizationFilter.m +++ b/framework/Source/GPUImageHistogramEqualizationFilter.m @@ -215,7 +215,8 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType histogramFilter = [[GPUImageHistogramFilter alloc] initWithHistogramType:newHistogramType]; [self addFilter:histogramFilter]; - rawDataInputFilter = [[GPUImageRawDataInput alloc] initWithPixelFormat:GPUPixelFormatBGRA type:GPUPixelTypeUByte]; + GLubyte dummyInput[4 * 256]; // NB: No way to initialise GPUImageRawDataInput without providing bytes + rawDataInputFilter = [[GPUImageRawDataInput alloc] initWithBytes:dummyInput size:CGSizeMake(256.0, 1.0) pixelFormat:GPUPixelFormatBGRA type:GPUPixelTypeUByte]; rawDataOutputFilter = [[GPUImageRawDataOutput alloc] initWithImageSize:CGSizeMake(256.0, 3.0) resultsInBGRAFormat:YES]; __unsafe_unretained GPUImageRawDataOutput *_rawDataOutputFilter = rawDataOutputFilter; From 85f4f085f8038d93b1379f49e7c502d2b2ad0055 Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:16:05 +0100 Subject: [PATCH 590/695] Update project.pbxproj --- framework/GPUImage.xcodeproj/project.pbxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/framework/GPUImage.xcodeproj/project.pbxproj b/framework/GPUImage.xcodeproj/project.pbxproj index f3791fc15..d18bfc632 100644 --- a/framework/GPUImage.xcodeproj/project.pbxproj +++ b/framework/GPUImage.xcodeproj/project.pbxproj @@ -47,6 +47,8 @@ 96781B4715C3A6F1005FA0D7 /* GPUImageSoftEleganceFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */; }; 96DD3C1415C2780500DF637E /* GPUImageLookupFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */; }; 96DD3C1515C2780500DF637E /* GPUImageLookupFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */; }; + A4741D5019A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = A4741D4E19A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.h */; }; + A4741D5119A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = A4741D4F19A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.m */; }; B80171E616311FCB001C8D16 /* GPUImageHueBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */; }; B80171E716311FCB001C8D16 /* GPUImageHueBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */; }; B80171FE16312800001C8D16 /* GPUImageSaturationBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */; }; @@ -725,6 +727,8 @@ 96781B4515C3A6F0005FA0D7 /* GPUImageSoftEleganceFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageSoftEleganceFilter.m; path = Source/GPUImageSoftEleganceFilter.m; sourceTree = SOURCE_ROOT; }; 96DD3C1215C2780500DF637E /* GPUImageLookupFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLookupFilter.h; path = Source/GPUImageLookupFilter.h; sourceTree = SOURCE_ROOT; }; 96DD3C1315C2780500DF637E /* GPUImageLookupFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLookupFilter.m; path = Source/GPUImageLookupFilter.m; sourceTree = SOURCE_ROOT; }; + A4741D4E19A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramEqualizationFilter.h; path = Source/GPUImageHistogramEqualizationFilter.h; sourceTree = SOURCE_ROOT; }; + A4741D4F19A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramEqualizationFilter.m; path = Source/GPUImageHistogramEqualizationFilter.m; sourceTree = SOURCE_ROOT; }; B80171E416311FCB001C8D16 /* GPUImageHueBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHueBlendFilter.h; path = Source/GPUImageHueBlendFilter.h; sourceTree = SOURCE_ROOT; }; B80171E516311FCB001C8D16 /* GPUImageHueBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHueBlendFilter.m; path = Source/GPUImageHueBlendFilter.m; sourceTree = SOURCE_ROOT; }; B80171FC16312800001C8D16 /* GPUImageSaturationBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageSaturationBlendFilter.h; path = Source/GPUImageSaturationBlendFilter.h; sourceTree = SOURCE_ROOT; }; @@ -1119,6 +1123,8 @@ BC6ED9C11549CA0600966798 /* GPUImageHistogramFilter.m */, BCC11D70154B44DC0044F5A0 /* GPUImageHistogramGenerator.h */, BCC11D71154B44DC0044F5A0 /* GPUImageHistogramGenerator.m */, + A4741D4E19A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.h */, + A4741D4F19A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.m */, BCF1E57915673599006B155F /* GPUImageToneCurveFilter.h */, BCF1E57A15673599006B155F /* GPUImageToneCurveFilter.m */, BCC46E5C15B9EFE8005519B9 /* GPUImageHighlightShadowFilter.h */, @@ -1722,6 +1728,7 @@ BCC93A331502A92A00958B26 /* GPUImageFilterPipeline.h in Headers */, BCB6B837150400030041703B /* GPUImageExposureFilter.h in Headers */, BCB6B839150400030041703B /* GPUImageSharpenFilter.h in Headers */, + A4741D5019A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.h in Headers */, BCB6B85615041A920041703B /* GPUImageColorBurnBlendFilter.h in Headers */, BCB6B85815041A920041703B /* GPUImageColorDodgeBlendFilter.h in Headers */, BCB6B85A15041A920041703B /* GPUImageScreenBlendFilter.h in Headers */, @@ -2157,6 +2164,7 @@ BCC93A1F1501E42F00958B26 /* GPUImageTwoPassFilter.m in Sources */, BCC93A301502A90F00958B26 /* GPUImageFilterPipeline.m in Sources */, BCC93A311502A91500958B26 /* GPUImageGaussianSelectiveBlurFilter.m in Sources */, + A4741D5119A91F87005EE1A4 /* GPUImageHistogramEqualizationFilter.m in Sources */, BCB6B838150400030041703B /* GPUImageExposureFilter.m in Sources */, BCB6B83A150400030041703B /* GPUImageSharpenFilter.m in Sources */, BC8A584C18131E4B00E6B507 /* GPUImageLuminanceRangeFilter.m in Sources */, From 5040d02c22e5ec30333c6bf1d56b719305490b83 Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 23 Aug 2014 20:19:43 +0100 Subject: [PATCH 591/695] Update project.pbxproj --- framework/GPUImageMac.xcodeproj/project.pbxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/framework/GPUImageMac.xcodeproj/project.pbxproj b/framework/GPUImageMac.xcodeproj/project.pbxproj index adfc421ad..453aef208 100644 --- a/framework/GPUImageMac.xcodeproj/project.pbxproj +++ b/framework/GPUImageMac.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + A4741D5A19A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = A4741D5819A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.h */; }; + A4741D5B19A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = A4741D5919A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.m */; }; A87E5E12177648F3007FD5B1 /* GPUImageRawDataOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = A87E5E10177648F3007FD5B1 /* GPUImageRawDataOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; A87E5E13177648F3007FD5B1 /* GPUImageRawDataOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = A87E5E11177648F3007FD5B1 /* GPUImageRawDataOutput.m */; }; A87E5E1617764B16007FD5B1 /* GPUImageRawDataInput.h in Headers */ = {isa = PBXBuildFile; fileRef = A87E5E1417764B16007FD5B1 /* GPUImageRawDataInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -318,6 +320,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + A4741D5819A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageHistogramEqualizationFilter.h; path = Source/GPUImageHistogramEqualizationFilter.h; sourceTree = SOURCE_ROOT; }; + A4741D5919A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageHistogramEqualizationFilter.m; path = Source/GPUImageHistogramEqualizationFilter.m; sourceTree = SOURCE_ROOT; }; A87E5E10177648F3007FD5B1 /* GPUImageRawDataOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataOutput.h; path = Source/GPUImageRawDataOutput.h; sourceTree = SOURCE_ROOT; }; A87E5E11177648F3007FD5B1 /* GPUImageRawDataOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRawDataOutput.m; path = Source/GPUImageRawDataOutput.m; sourceTree = SOURCE_ROOT; }; A87E5E1417764B16007FD5B1 /* GPUImageRawDataInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRawDataInput.h; path = Source/GPUImageRawDataInput.h; sourceTree = SOURCE_ROOT; }; @@ -825,6 +829,8 @@ BCC0DF4517359529007C485F /* GPUImageHistogramFilter.m */, BCC0DF4617359529007C485F /* GPUImageHistogramGenerator.h */, BCC0DF4717359529007C485F /* GPUImageHistogramGenerator.m */, + A4741D5819A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.h */, + A4741D5919A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.m */, BCC0DF4C173595D3007C485F /* GPUImageAverageColor.h */, BCC0DF4D173595D3007C485F /* GPUImageAverageColor.m */, BCC0DF4E173595D3007C485F /* GPUImageLuminosity.h */, @@ -1089,6 +1095,7 @@ BCF867AF172778D500912E34 /* GPUImageExposureFilter.h in Headers */, BCF867B1172778D500912E34 /* GPUImageHueFilter.h in Headers */, BCF867B3172778D500912E34 /* GPUImageSaturationFilter.h in Headers */, + A4741D5A19A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.h in Headers */, BCF867B5172778D500912E34 /* GPUImageWhiteBalanceFilter.h in Headers */, BCF867B91727791200912E34 /* GPUImageLevelsFilter.h in Headers */, BCF867BF1727794000912E34 /* GPUImageMonochromeFilter.h in Headers */, @@ -1355,6 +1362,7 @@ BCF868861728773900912E34 /* GPUImageTwoInputCrossTextureSamplingFilter.m in Sources */, BCF8689017287ED000912E34 /* GPUImageChromaKeyBlendFilter.m in Sources */, BCF8689217287ED000912E34 /* GPUImageDissolveBlendFilter.m in Sources */, + A4741D5B19A92098005EE1A4 /* GPUImageHistogramEqualizationFilter.m in Sources */, BCF86896172880B800912E34 /* GPUImageSourceOverBlendFilter.m in Sources */, BCF8689A172883A300912E34 /* GPUImageMaskFilter.m in Sources */, BCF8689E1728862100912E34 /* GPUImageOpacityFilter.m in Sources */, From 3e164a165b43a26857db2d417fcdf2ab3d401e52 Mon Sep 17 00:00:00 2001 From: Nicholas Tau Date: Thu, 4 Sep 2014 15:08:17 +0800 Subject: [PATCH 592/695] leak fixed with GCG under iOS 6.0. https://github.com/CocoaPods/Specs/issues/1730 https://github.com/BradLarson/GPUImage/issues/1748 --- GPUImage.podspec | 1 + 1 file changed, 1 insertion(+) diff --git a/GPUImage.podspec b/GPUImage.podspec index 219d4174b..a575aae29 100644 --- a/GPUImage.podspec +++ b/GPUImage.podspec @@ -13,6 +13,7 @@ Pod::Spec.new do |s| s.xcconfig = { 'CLANG_MODULES_AUTOLINK' => 'YES' } s.ios.deployment_target = '5.0' + s.compiler_flags = '-DOS_OBJECT_USE_OBJC=1' s.ios.exclude_files = 'framework/Source/Mac' s.ios.frameworks = ['OpenGLES', 'CoreMedia', 'QuartzCore', 'AVFoundation'] From aab37260042d2d1f5c0761f5a035e15ea393a933 Mon Sep 17 00:00:00 2001 From: Nicholas Tau Date: Thu, 4 Sep 2014 15:21:56 +0800 Subject: [PATCH 593/695] It's not working like what I thought. --- GPUImage.podspec | 1 - 1 file changed, 1 deletion(-) diff --git a/GPUImage.podspec b/GPUImage.podspec index a575aae29..219d4174b 100644 --- a/GPUImage.podspec +++ b/GPUImage.podspec @@ -13,7 +13,6 @@ Pod::Spec.new do |s| s.xcconfig = { 'CLANG_MODULES_AUTOLINK' => 'YES' } s.ios.deployment_target = '5.0' - s.compiler_flags = '-DOS_OBJECT_USE_OBJC=1' s.ios.exclude_files = 'framework/Source/Mac' s.ios.frameworks = ['OpenGLES', 'CoreMedia', 'QuartzCore', 'AVFoundation'] From 2d941916710a04724f6e716a8683721804222218 Mon Sep 17 00:00:00 2001 From: Nicholas Tau Date: Thu, 4 Sep 2014 16:00:27 +0800 Subject: [PATCH 594/695] Leak fixed if worked with cocoapods. https://github.com/BradLarson/GPUImage/issues/1748 https://github.com/CocoaPods/CocoaPods/issues/1001 --- framework/Source/GPUImageFilter.m | 3 ++- framework/Source/GPUImageOutput.m | 8 ++++---- framework/Source/GPUImageRawDataInput.m | 2 +- framework/Source/GPUImageVideoCamera.m | 2 +- framework/Source/iOS/GPUImageContext.m | 3 +-- framework/Source/iOS/GPUImageMovieWriter.m | 2 +- framework/Source/iOS/GPUImagePicture.m | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 68591febf..406d707a0 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -156,12 +156,13 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; - (void)dealloc { -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) +#if !OS_OBJECT_USE_OBJC if (imageCaptureSemaphore != NULL) { dispatch_release(imageCaptureSemaphore); } #endif + } #pragma mark - diff --git a/framework/Source/GPUImageOutput.m b/framework/Source/GPUImageOutput.m index 387c4289e..4a858c1ab 100755 --- a/framework/Source/GPUImageOutput.m +++ b/framework/Source/GPUImageOutput.m @@ -18,7 +18,7 @@ void runOnMainQueueWithoutDeadlocking(void (^block)(void)) void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) +#if !OS_OBJECT_USE_OBJC if (dispatch_get_current_queue() == videoProcessingQueue) #else if (dispatch_get_specific([GPUImageContext contextKey])) @@ -35,7 +35,7 @@ void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) +#if !OS_OBJECT_USE_OBJC if (dispatch_get_current_queue() == videoProcessingQueue) #else if (dispatch_get_specific([GPUImageContext contextKey])) @@ -51,7 +51,7 @@ void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void)) void runSynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [context contextQueue]; -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) +#if !OS_OBJECT_USE_OBJC if (dispatch_get_current_queue() == videoProcessingQueue) #else if (dispatch_get_specific([GPUImageContext contextKey])) @@ -68,7 +68,7 @@ void runAsynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(voi { dispatch_queue_t videoProcessingQueue = [context contextQueue]; -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) +#if !OS_OBJECT_USE_OBJC if (dispatch_get_current_queue() == videoProcessingQueue) #else if (dispatch_get_specific([GPUImageContext contextKey])) diff --git a/framework/Source/GPUImageRawDataInput.m b/framework/Source/GPUImageRawDataInput.m index 27e3d0f26..4b6bfa74a 100644 --- a/framework/Source/GPUImageRawDataInput.m +++ b/framework/Source/GPUImageRawDataInput.m @@ -53,7 +53,7 @@ - (id)initWithBytes:(GLubyte *)bytesToUpload size:(CGSize)imageSize pixelFormat: // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. - (void)dealloc; { -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) +#if !OS_OBJECT_USE_OBJC if (dataUpdateSemaphore != NULL) { dispatch_release(dataUpdateSemaphore); diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index 22dcc61f5..b84f88aad 100644 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -317,7 +317,7 @@ - (void)dealloc [self removeInputsAndOutputs]; // ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) +#if !OS_OBJECT_USE_OBJC if (frameRenderingSemaphore != NULL) { dispatch_release(frameRenderingSemaphore); diff --git a/framework/Source/iOS/GPUImageContext.m b/framework/Source/iOS/GPUImageContext.m index a94264b7f..5bcab5926 100755 --- a/framework/Source/iOS/GPUImageContext.m +++ b/framework/Source/iOS/GPUImageContext.m @@ -33,8 +33,7 @@ - (id)init; openGLESContextQueueKey = &openGLESContextQueueKey; _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) -#else +#if OS_OBJECT_USE_OBJC dispatch_queue_set_specific(_contextQueue, openGLESContextQueueKey, (__bridge void *)self, NULL); #endif shaderProgramCache = [[NSMutableDictionary alloc] init]; diff --git a/framework/Source/iOS/GPUImageMovieWriter.m b/framework/Source/iOS/GPUImageMovieWriter.m index 9b7259a4d..91e241eb1 100755 --- a/framework/Source/iOS/GPUImageMovieWriter.m +++ b/framework/Source/iOS/GPUImageMovieWriter.m @@ -146,7 +146,7 @@ - (void)dealloc; { [self destroyDataFBO]; -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) +#if !OS_OBJECT_USE_OBJC if( audioQueue != NULL ) { dispatch_release(audioQueue); diff --git a/framework/Source/iOS/GPUImagePicture.m b/framework/Source/iOS/GPUImagePicture.m index d8593d77c..97602cf1c 100755 --- a/framework/Source/iOS/GPUImagePicture.m +++ b/framework/Source/iOS/GPUImagePicture.m @@ -221,7 +221,7 @@ - (void)dealloc; [outputFramebuffer enableReferenceCounting]; [outputFramebuffer unlock]; -#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) +#if !OS_OBJECT_USE_OBJC if (imageUpdateSemaphore != NULL) { dispatch_release(imageUpdateSemaphore); From d44445e3a1dcdf97b4d14dcd63851740ac104bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Rajzaa?= Date: Fri, 12 Sep 2014 09:03:18 +0200 Subject: [PATCH 595/695] #1754 fixed problem form this issue. Changed runLoopMode. --- framework/Source/GPUImageMovie.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/GPUImageMovie.m b/framework/Source/GPUImageMovie.m index 1f78345ec..59397f91b 100755 --- a/framework/Source/GPUImageMovie.m +++ b/framework/Source/GPUImageMovie.m @@ -296,7 +296,7 @@ - (void)processPlayerItem { runSynchronouslyOnVideoProcessingQueue(^{ displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkCallback:)]; - [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [displayLink setPaused:YES]; dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue]; From 616519be6b7f52d3e463d8438822283918c59ea5 Mon Sep 17 00:00:00 2001 From: aidenluo Date: Mon, 15 Sep 2014 17:16:51 +0800 Subject: [PATCH 596/695] fix use GPUImageFilterPipeline chain filters will cause GPUImageLowPassFilter not work --- framework/Source/GPUImageLowPassFilter.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/framework/Source/GPUImageLowPassFilter.m b/framework/Source/GPUImageLowPassFilter.m index 541ba75a1..39ca08f67 100644 --- a/framework/Source/GPUImageLowPassFilter.m +++ b/framework/Source/GPUImageLowPassFilter.m @@ -49,4 +49,13 @@ - (CGFloat)filterStrength; return dissolveBlendFilter.mix; } +- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; +{ + [self.terminalFilter addTarget:newTarget atTextureLocation:textureLocation]; + //if use GPUImagePipline,will cause self.termainlFilter removeAllTargets,so need add bufferFilter back + if (self.terminalFilter == dissolveBlendFilter && ![self.terminalFilter.targets containsObject:bufferFilter]) { + [self.terminalFilter addTarget:bufferFilter atTextureLocation:1]; + } +} + @end From bf8030064ef309ae368ebbce32d0003d0fd852a6 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 15 Sep 2014 10:26:28 -0500 Subject: [PATCH 597/695] Fixed a few optional issues with Xcode 6.1 and the Swift projects. --- .../FilterShowcaseSwift/Base.lproj/MainMenu.xib | 4 ++-- .../FilterShowcaseWindowController.swift | 6 ++++-- .../FilterShowcaseWindowController.xib | 12 ++++++------ .../FilterShowcaseSwift.xcodeproj/project.pbxproj | 4 ++-- .../FilterListViewController.swift | 9 +++++---- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib index c61bb71f5..d9840d3e8 100644 --- a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib @@ -1,7 +1,7 @@ - + - + diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift index c767ccf3e..66c6aab75 100644 --- a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift @@ -88,7 +88,9 @@ class FilterShowcaseWindowController: NSWindowController { } func tableViewSelectionDidChange(aNotification: NSNotification!) { - let rowIndex = aNotification.object.selectedRow - self.changeSelectedRow(rowIndex) + if let currentTableView = aNotification.object as? NSTableView { + let rowIndex = currentTableView.selectedRow + self.changeSelectedRow(rowIndex) + } } } \ No newline at end of file diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib index 334815455..da844acf0 100644 --- a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib +++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib @@ -1,7 +1,7 @@ - + - + @@ -17,7 +17,7 @@ - + @@ -30,7 +30,7 @@ - + @@ -62,7 +62,7 @@ -